http://ftp.ksu.edu.tw/FTP/FreeBSD/distfiles/xscreensaver-4.23.tar.gz
authorZygo Blaxell <zblaxell@hungrycats.org>
Mon, 2 Mar 2009 05:43:34 +0000 (00:43 -0500)
committerZygo Blaxell <zblaxell@faye.furryterror.org>
Fri, 8 Feb 2013 17:54:29 +0000 (12:54 -0500)
-rw-r--r-- 1 zblaxell zblaxell 4939070 Oct 22  2005 xscreensaver-4.23.tar.gz
b7d3f0b4a94d879a2450a268ae941b92ca4fc39e  xscreensaver-4.23.tar.gz

93 files changed:
README
configure
configure.in
driver/XScreenSaver.ad.in
driver/XScreenSaver_ad.h
driver/demo-Gtk.c
driver/lock.c
driver/prefs.c
driver/remote.c
driver/setuid.c
driver/subprocs.c
driver/timers.c
driver/windows.c
driver/xscreensaver-command.c
driver/xscreensaver-demo.glade2
driver/xscreensaver-getimage-desktop
driver/xscreensaver-getimage.c
driver/xscreensaver-text
driver/xscreensaver.c
driver/xscreensaver.man
hacks/Makefile.in
hacks/ant.man [deleted file]
hacks/apple2-main.c
hacks/celtic.c [new file with mode: 0644]
hacks/celtic.man [new file with mode: 0644]
hacks/compile_axp.com
hacks/compile_decc.com
hacks/config/README
hacks/config/ant.xml
hacks/config/boxed.xml
hacks/config/celtic.xml [new file with mode: 0644]
hacks/config/cosmos.xml
hacks/config/cube21.xml [new file with mode: 0644]
hacks/config/glhanoi.xml [new file with mode: 0644]
hacks/config/hyperball.xml
hacks/config/hypercube.xml
hacks/config/hypertorus.xml
hacks/config/interaggregate.xml
hacks/config/jigglypuff.xml
hacks/config/juggler3d.xml [new file with mode: 0644]
hacks/config/polyhedra.xml
hacks/config/ripples.xml
hacks/config/squiral.xml
hacks/config/tangram.xml
hacks/config/timetunnel.xml [new file with mode: 0644]
hacks/config/whirlwindwarp.xml
hacks/config/whirlygig.xml
hacks/config/xmountains.xml
hacks/glx/Makefile.in
hacks/glx/antmaze.c
hacks/glx/boxed.c
hacks/glx/crackberg.c
hacks/glx/cube21-tex.h [new file with mode: 0644]
hacks/glx/cube21.c [new file with mode: 0644]
hacks/glx/cube21.man [new file with mode: 0644]
hacks/glx/gears.c
hacks/glx/glhanoi.c [new file with mode: 0644]
hacks/glx/glhanoi.man [new file with mode: 0644]
hacks/glx/gltrackball.c
hacks/glx/gltrackball.h
hacks/glx/grab-ximage.c
hacks/glx/hypertorus.c
hacks/glx/hypertorus.man
hacks/glx/juggler3d.c [new file with mode: 0644]
hacks/glx/juggler3d.man [new file with mode: 0644]
hacks/glx/molecule.c
hacks/glx/polytopes.c
hacks/glx/polytopes.man
hacks/glx/tangram.c
hacks/glx/tangram.man
hacks/glx/tangram_shapes.c
hacks/glx/timetunnel.c [new file with mode: 0644]
hacks/glx/timetunnel.man [new file with mode: 0644]
hacks/glx/xpm-ximage.c
hacks/images/timetunnel0.xpm [new file with mode: 0644]
hacks/images/timetunnel1.xpm [new file with mode: 0644]
hacks/images/timetunnel2.xpm [new file with mode: 0644]
hacks/images/tunnelstar.xpm [new file with mode: 0644]
hacks/interaggregate.c
hacks/noseguy.c
hacks/noseguy.man
hacks/ripples.c
hacks/ripples.man
hacks/sonar.c
hacks/spotlight.c
hacks/webcollage
hacks/webcollage-helper.c
hacks/whirlygig.man
hacks/xlyap.c
po/POTFILES.in
setup.com
utils/version.h
xscreensaver.spec

diff --git a/README b/README
index beac235b174825362409a12ee30eb955eca4e8ed..0df5d6857e5a7e14e7d16cc272f802f72cfc24be 100644 (file)
--- a/README
+++ b/README
@@ -65,7 +65,7 @@ there's no need to recompile or reinstall anything.
 Along with the xscreensaver daemon itself, this package also includes
 numerous graphics hacks for use as screensavers.  There is nothing
 magic about these: they are just programs that draw on the root window.
-More than 190 such programs are included.  For details, see the
+More than 200 such programs are included.  For details, see the
 xscreensaver web page, or the enclosed manual pages.
 
 The latest version of xscreensaver is always available on the web at
@@ -76,6 +76,25 @@ the XScreenSaver FAQ about that: http://www.jwz.org/xscreensaver/faq.html
 
                               ============
 
+Changes since 4.22:   * New hacks, `glhanoi', `cube21', `timetunnel',
+                        `juggler3d', and `celtic'.
+                      * New versions of `tangram', `webcollage', `hypertorus',
+                        `polytopes', and `ripples'.
+                      * `sonar' is now quiet about unresolvable hosts.
+                      * Minor corrections to BASIC code in `apple2'.
+                      * xscreensaver-demo now provides an RPM clue when none
+                        of the hacks seem to be installed.
+                      * Don't install `ant' by default, since there is some
+                        Java tool of that name, which was causing confusion.
+                        And also it's boring.
+                      * Made screen grabbing work again on MacOS 10.4.2.
+                      * No longer prints bogus warnings about ClientMessages
+                        intended for the window manager.
+                      * Ignore unprintable characters in passwd entry field.
+                      * Fixed yet another cross-host-display image-loading
+                        endian problem.
+                      * `xscreensaver-command -watch' and `-time' now work
+                        on 64-bit machines.
 Changes since 4.21:   * Fixed a bug in the new mouse-motion code that caused
                         the screen to never blank on multi-head non-Xinerama
                         systems.  Oops.
index 9873d74b8e52092117cba40d67cda11d34faed23..4238a72e9575c18e03812fddb21f878210ff0f75 100755 (executable)
--- a/configure
+++ b/configure
@@ -7167,6 +7167,15 @@ echo "$as_me:$LINENO: result: $ac_macosx" >&5
 echo "${ECHO_T}$ac_macosx" >&6
 
 
+if test "$ac_macosx" = yes; then
+  if test -n "$GCC"; then
+    # Without these, every link against libGL gets a bunch of useless warnings.
+    osx_crud="-bind_at_load -multiply_defined suppress"
+    echo "$as_me:$LINENO: result: adding \"$osx_crud\" to LDFLAGS" >&5
+echo "${ECHO_T}adding \"$osx_crud\" to LDFLAGS" >&6
+     LDFLAGS="$LDFLAGS $osx_crud"
+  fi
+fi
 
 ###############################################################################
 #
@@ -14387,7 +14396,6 @@ echo $ECHO_N "checking for $login_manager_tmp... $ECHO_C" >&6
       if test -x "$login_manager_tmp" ; then
         echo "$as_me:$LINENO: result: yes" >&5
 echo "${ECHO_T}yes" >&6
-        with_login_manager="$login_manager_tmp"
       else
         echo "$as_me:$LINENO: result: no" >&5
 echo "${ECHO_T}no" >&6
@@ -14695,6 +14703,7 @@ fi
 echo "$as_me:$LINENO: result: $ac_cv_gtk_config_libs" >&5
 echo "${ECHO_T}$ac_cv_gtk_config_libs" >&6
   fi
+
   ac_gtk_config_cflags=$ac_cv_gtk_config_cflags
   ac_gtk_config_libs=$ac_cv_gtk_config_libs
 
@@ -16112,7 +16121,7 @@ if test "${ac_cv_mesagl_version_string+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 16119 "configure"
+#line 16128 "configure"
 #include "confdefs.h"
 #include <GL/gl.h>
 #ifndef MESA_MAJOR_VERSION
@@ -16983,6 +16992,7 @@ fi
 echo "$as_me:$LINENO: result: $ac_cv_gdk_pixbuf_config_libs" >&5
 echo "${ECHO_T}$ac_cv_gdk_pixbuf_config_libs" >&6
   fi
+
   ac_gdk_pixbuf_config_cflags=$ac_cv_gdk_pixbuf_config_cflags
   ac_gdk_pixbuf_config_libs=$ac_cv_gdk_pixbuf_config_libs
 
@@ -18378,6 +18388,7 @@ echo "$as_me:$LINENO: result: $ac_cv_lib_util_forkpty" >&5
 echo "${ECHO_T}$ac_cv_lib_util_forkpty" >&6
 if test $ac_cv_lib_util_forkpty = yes; then
   PTY_LIBS="-lutil"
+                ac_have_forkpty=yes
                 cat >>confdefs.h <<\_ACEOF
 #define HAVE_FORKPTY 1
 _ACEOF
 #  LIBS="$ac_save_LIBS"
 
 
+if test "$ac_have_forkpty" != yes ; then
+  # we don't need (or have) -lutil on MacOS 10.4.2...
+
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  ac_save_LDFLAGS="$LDFLAGS"
+#  ac_save_LIBS="$LIBS"
+
+  if test \! -z "$includedir" ; then
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  # note: $X_CFLAGS includes $x_includes
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+  if test \! -z "$libdir" ; then
+    LDFLAGS="$LDFLAGS -L$libdir"
+  fi
+  # note: $X_LIBS includes $x_libraries
+  LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
+
+  echo "$as_me:$LINENO: checking for forkpty in -lc" >&5
+echo $ECHO_N "checking for forkpty in -lc... $ECHO_C" >&6
+if test "${ac_cv_lib_c_forkpty+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char forkpty ();
+int
+main ()
+{
+forkpty ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_c_forkpty=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_c_forkpty=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_c_forkpty" >&5
+echo "${ECHO_T}$ac_cv_lib_c_forkpty" >&6
+if test $ac_cv_lib_c_forkpty = yes; then
+  PTY_LIBS=""
+                  cat >>confdefs.h <<\_ACEOF
+#define HAVE_FORKPTY 1
+_ACEOF
+
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  LDFLAGS="$ac_save_LDFLAGS"
+#  LIBS="$ac_save_LIBS"
+
+fi
 
 ###############################################################################
 #
index 7889de45e9d4af2f13b630688f2caa84773db59c..fbde9f84753f8824420dd3b979fb0eac0df80b1b 100644 (file)
@@ -1144,6 +1144,14 @@ AC_MSG_CHECKING(whether this is MacOS X)
 AC_MSG_RESULT($ac_macosx)
 
 
+if test "$ac_macosx" = yes; then
+  if test -n "$GCC"; then
+    # Without these, every link against libGL gets a bunch of useless warnings.
+    osx_crud="-bind_at_load -multiply_defined suppress"
+    AC_MSG_RESULT(adding "$osx_crud" to LDFLAGS)
+     LDFLAGS="$LDFLAGS $osx_crud"
+  fi
+fi
 
 ###############################################################################
 #
@@ -2260,7 +2268,6 @@ if test -n "$with_login_manager_req" ; then
       AC_MSG_CHECKING([for $login_manager_tmp])
       if test -x "$login_manager_tmp" ; then
         AC_MSG_RESULT(yes)
-        with_login_manager="$login_manager_tmp"
       else
         AC_MSG_RESULT(no)
         with_login_manager=""
@@ -2420,6 +2427,7 @@ if test "$with_gtk" = yes; then
     AC_CACHE_CHECK([for Gtk libs], ac_cv_gtk_config_libs,
                    [ac_cv_gtk_config_libs=`$pkg_config --libs $pkgs`])
   fi
+
   ac_gtk_config_cflags=$ac_cv_gtk_config_cflags
   ac_gtk_config_libs=$ac_cv_gtk_config_libs
 
@@ -2955,6 +2963,7 @@ if test "$with_gdk_pixbuf" = yes; then
     AC_CACHE_CHECK([for gdk-pixbuf libs], ac_cv_gdk_pixbuf_config_libs,
                [ac_cv_gdk_pixbuf_config_libs=`$pkg_config --libs $pkgs`])
   fi
+
   ac_gdk_pixbuf_config_cflags=$ac_cv_gdk_pixbuf_config_cflags
   ac_gdk_pixbuf_config_libs=$ac_cv_gdk_pixbuf_config_libs
 
@@ -3107,8 +3116,15 @@ PTY_LIBS=
 AC_CHECK_HEADERS(pty.h util.h)
 AC_CHECK_X_LIB(util, forkpty,
                [PTY_LIBS="-lutil"
+                ac_have_forkpty=yes
                 AC_DEFINE(HAVE_FORKPTY)])
 
+if test "$ac_have_forkpty" != yes ; then
+  # we don't need (or have) -lutil on MacOS 10.4.2...
+  AC_CHECK_X_LIB(c, forkpty,
+                 [PTY_LIBS=""
+                  AC_DEFINE(HAVE_FORKPTY)])
+fi
 
 ###############################################################################
 #
index 807892d81afa1407de8b83746f26998cee30a2f3..6f608c30cf78cce8a995a8ff234e8861109addc8 100644 (file)
@@ -4,8 +4,8 @@
 !            a screen saver and locker for the X window system
 !                            by Jamie Zawinski
 !
-!                              version 4.22
-!                              22-Jun-2005
+!                              version 4.23
+!                              21-Oct-2005
 !
 ! See "man xscreensaver" for more info.  The latest version is always
 ! available at http://www.jwz.org/xscreensaver/
@@ -226,7 +226,6 @@ GetViewPortIsFullOfLies: False
                                triangle -root -delay 1                     \n\
 -                              worm -root                                  \n\
 -                              rotor -root                                 \n\
--                              ant -root                                   \n\
 -                              demon -root                                 \n\
 -                              loop -root                                  \n\
 -                              vines -root                                 \n\
@@ -318,6 +317,7 @@ GetViewPortIsFullOfLies: False
                                fireworkx -root                             \n\
                                fiberlamp -root                             \n\
                                boxfit -root                                \n\
+                               celtic -root                                \n\
 - default-n:                   webcollage -root                            \n\
 - default-n:  "WebCollage (whacked)"                                         \
                                webcollage -root -filter                      \
@@ -401,6 +401,10 @@ GetViewPortIsFullOfLies: False
 @GL_KLUDGE@ GL:                        tangram -root                               \n\
 @GL_KLUDGE@ GL:                        crackberg -root -flat -lit -crack             \
                                 -color random                              \n\
+@GL_KLUDGE@ GL:                        glhanoi -root                               \n\
+@GL_KLUDGE@ GL:                        cube21 -root -colormode six                 \n\
+@GL_KLUDGE@ GL:                        timetunnel -root                            \n\
+@GL_KLUDGE@ GL:                        juggler3d -root                             \n\
                                                                              \
 -                              xdaliclock -root -builtin3 -cycle           \n\
 - default-n:                   xearth -nofork -nostars -ncolors 50           \
@@ -543,6 +547,7 @@ XScreenSaver.bourneShell:           /bin/sh
 *hacks.memscroller.name:    MemScroller
 *hacks.boxfit.name:         BoxFit
 *hacks.fliptext.name:       FlipText
+*hacks.glhanoi.name:        GLHanoi
 
 ! obsolete, but still used by xscreensaver-demo-Xm.
 *hacks.documentation.isInstalled: True
index 663c37e0a36f158d0ecedc111aefdaf64e6bbaee..c05ccf843fe278fb53d0437d6d3406f5f672ee57 100644 (file)
                                triangle -root -delay 1                     \\n\
 -                              worm -root                                  \\n\
 -                              rotor -root                                 \\n\
--                              ant -root                                   \\n\
 -                              demon -root                                 \\n\
 -                              loop -root                                  \\n\
 -                              vines -root                                 \\n\
                                fireworkx -root                             \\n\
                                fiberlamp -root                             \\n\
                                boxfit -root                                \\n\
+                               celtic -root                                \\n\
 - default-n:                   webcollage -root                            \\n\
 - default-n:  \"WebCollage (whacked)\"                                       \
                                webcollage -root -filter                      \
           GL:                  tangram -root                               \\n\
           GL:                  crackberg -root -flat -lit -crack             \
                                 -color random                              \\n\
+          GL:                  glhanoi -root                               \\n\
+          GL:                  cube21 -root -colormode six                 \\n\
+          GL:                  timetunnel -root                            \\n\
+          GL:                  juggler3d -root                             \\n\
                                                                              \
 -                              xdaliclock -root -builtin3 -cycle           \\n\
 - default-n:                   xearth -nofork -nostars -ncolors 50           \
 "*hacks.memscroller.name:    MemScroller",
 "*hacks.boxfit.name:         BoxFit",
 "*hacks.fliptext.name:       FlipText",
+"*hacks.glhanoi.name:        GLHanoi",
 "*hacks.documentation.isInstalled: True",
index 7d1ca042db190f04a2fa74c380a88431cd27349d..4a6f3cf169a57630372dfc9b39f1a87727341b56 100644 (file)
@@ -190,6 +190,7 @@ typedef struct {
   int *list_elt_to_hack_number;        /* table for sorting the hack list */
   int *hack_number_to_list_elt;        /* the inverse table */
   Bool *hacks_available_p;     /* whether hacks are on $PATH */
+  int total_available;         /* how many are on $PATH */
   int list_count;              /* how many items are in the list: this may be
                                    less than p->screenhacks_count, if some are
                                    suppressed. */
@@ -645,7 +646,6 @@ run_hack (state *s, int list_elt, Bool report_errors_p)
                 strcpy (buf, "Unknown error!");
               warning_dialog (s->toplevel_widget, buf, False, 100);
             }
-          if (err) free (err);
         }
       else
         {
@@ -845,7 +845,8 @@ doc_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
            p->load_url_command,
            p->help_url, p->help_url, p->help_url, p->help_url);
   strcat (help_command, " ) &");
-  system (help_command);
+  if (system (help_command) < 0)
+    fprintf (stderr, "%s: fork error\n", blurb());
   free (help_command);
 }
 
@@ -889,7 +890,8 @@ restart_menu_cb (GtkWidget *widget, gpointer user_data)
   flush_dialog_changes_and_save (s);
   xscreensaver_command (GDK_DISPLAY(), XA_EXIT, 0, False, NULL);
   sleep (1);
-  system ("xscreensaver -nosplash &");
+  if (system ("xscreensaver -nosplash &") < 0)
+    fprintf (stderr, "%s: fork error\n", blurb());
 
   await_xscreensaver (s);
 }
@@ -1051,7 +1053,8 @@ manual_cb (GtkButton *button, gpointer user_data)
                cmd,
                name2, name2, name2, name2);
       strcat (cmd2, " ) &");
-      system (cmd2);
+      if (system (cmd2) < 0)
+        fprintf (stderr, "%s: fork error\n", blurb());
       free (cmd2);
     }
   else
@@ -1080,9 +1083,11 @@ force_list_select_item (state *s, GtkWidget *list, int list_elt, Bool scroll_p)
 #ifdef HAVE_GTK2
   model = gtk_tree_view_get_model (GTK_TREE_VIEW (list));
   STFU g_assert (model);
-  gtk_tree_model_iter_nth_child (model, &iter, NULL, list_elt);
-  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (list));
-  gtk_tree_selection_select_iter (selection, &iter);
+  if (gtk_tree_model_iter_nth_child (model, &iter, NULL, list_elt))
+    {
+      selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (list));
+      gtk_tree_selection_select_iter (selection, &iter);
+    }
 #else  /* !HAVE_GTK2 */
   gtk_list_select_item (GTK_LIST (list), list_elt);
 #endif /* !HAVE_GTK2 */
@@ -3315,13 +3320,16 @@ initialize_sort_map (state *s)
     calloc (sizeof(int), p->screenhacks_count + 1);
   s->hacks_available_p = (Bool *)
     calloc (sizeof(Bool), p->screenhacks_count + 1);
+  s->total_available = 0;
 
   /* Check which hacks actually exist on $PATH
    */
   for (i = 0; i < p->screenhacks_count; i++)
     {
       screenhack *hack = p->screenhacks[i];
-      s->hacks_available_p[i] = on_path_p (hack->command);
+      int on = on_path_p (hack->command) ? 1 : 0;
+      s->hacks_available_p[i] = on;
+      s->total_available += on;
     }
 
   /* Initialize list->hack table to unsorted mapping, omitting nonexistent
@@ -3473,11 +3481,14 @@ clear_preview_window (state *s)
     Bool available_p = (hack_number >= 0
                         ? s->hacks_available_p [hack_number]
                         : True);
+    Bool nothing_p = (s->total_available < 5);
+
 #ifdef HAVE_GTK2
     GtkWidget *notebook = name_to_widget (s, "preview_notebook");
     gtk_notebook_set_page (GTK_NOTEBOOK (notebook),
                           (s->running_preview_error_p
-                            ? (available_p ? 1 : 2)
+                            ? (available_p ? 1 :
+                               nothing_p ? 3 : 2)
                             : 0));
 #else /* !HAVE_GTK2 */
     if (s->running_preview_error_p)
@@ -3718,7 +3729,8 @@ get_best_gl_visual (state *s)
         close (out);  /* don't need this one */
 
         *buf = 0;
-        fgets (buf, sizeof(buf)-1, f);
+        if (!fgets (buf, sizeof(buf)-1, f))
+          *buf = 0;
         fclose (f);
 
         /* Wait for the child to die. */
index 169880b1b6a993f7ead31e3206406a7150241d00..65162a591a2752214b3b86583fa22aca4d69b4e4 100644 (file)
@@ -17,6 +17,7 @@
 # include "config.h"
 #endif
 
+#include <ctype.h>
 #include <X11/Intrinsic.h>
 #include <X11/cursorfont.h>
 #include <X11/Xos.h>           /* for time() */
@@ -1424,14 +1425,25 @@ handle_passwd_key (saver_info *si, XKeyEvent *event)
       break;
 
     default:
-      i = strlen (typed_passwd);
-      if (i >= pw_size-1)
-       XBell (si->dpy, 0);
+      /* Though technically the only illegal characters in Unix passwords
+         are LF and NUL, most GUI programs (e.g., GDM) use regular text-entry
+         fields that only let you type printable characters.  So, people
+         who use funky characters in their passwords are already broken.
+         We follow that precedent.
+       */
+      if (isprint ((unsigned char) *s))
+        {
+          i = strlen (typed_passwd);
+          if (i >= pw_size-1)
+            XBell (si->dpy, 0);
+          else
+            {
+              typed_passwd [i] = *s;
+              typed_passwd [i+1] = 0;
+            }
+        }
       else
-       {
-         typed_passwd [i] = *s;
-         typed_passwd [i+1] = 0;
-       }
+        XBell (si->dpy, 0);
       break;
     }
 
index d34d2935083470d59a65e78b99ce3c1a178ff819..1ef9a276fee115c8e2c37186c22d18041c14656e 100644 (file)
@@ -86,7 +86,14 @@ chase_symlinks (const char *file)
 # ifdef HAVE_REALPATH
   if (file)
     {
-      char buf [2048];
+# ifndef PATH_MAX
+#  ifdef MAXPATHLEN
+#   define PATH_MAX MAXPATHLEN
+#  else
+#   define PATH_MAX 2048
+#  endif
+# endif
+      char buf[PATH_MAX];
       if (realpath (file, buf))
         return strdup (buf);
 
@@ -1576,11 +1583,15 @@ stop_the_insanity (saver_preferences *p)
       p->dpms_off < 10 * 1000)
     p->dpms_off      = 4 * 60 * 60 * 1000;                      /* 4 hours */
 
-  /* standby may not be greater than suspend.
-     suspend may not be greater than off.
+  /* suspend may not be greater than off, unless off is 0.
+     standby may not be greater than suspend, unless suspend is 0.
    */
-  if (p->dpms_standby > p->dpms_suspend) p->dpms_standby = p->dpms_suspend;
-  if (p->dpms_suspend > p->dpms_off)     p->dpms_suspend = p->dpms_off;
+  if (p->dpms_off != 0 &&
+      p->dpms_suspend > p->dpms_off)
+    p->dpms_suspend = p->dpms_off;
+  if (p->dpms_suspend != 0 &&
+      p->dpms_standby > p->dpms_suspend)
+    p->dpms_standby = p->dpms_suspend;
 
 
   if (p->dpms_standby == 0 &&     /* if *all* are 0, then DPMS is disabled */
@@ -1589,6 +1600,9 @@ stop_the_insanity (saver_preferences *p)
     p->dpms_enabled_p = False;
 
 
+  /* Set watchdog timeout to about half of the cycle timeout, but
+     don't let it be faster than 1/2 minute or slower than 1 minute.
+   */
   p->watchdog_timeout = p->cycle * 0.6;
   if (p->watchdog_timeout < 27000) p->watchdog_timeout = 27000;          /* 27 secs */
   if (p->watchdog_timeout > 57000) p->watchdog_timeout = 57000;   /* 57 secs */
index d56d5e9fd20ff2f5f205a2e29f20f22f841d8c42..6039324f190e870b613508dee91e85667f01c95e 100644 (file)
@@ -1,5 +1,4 @@
-/* xscreensaver-command, Copyright (c) 1991-1998
- *  by Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver-command, Copyright (c) 1991-2005 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -201,7 +200,6 @@ send_xscreensaver_command (Display *dpy, Atom command, long arg,
           else
             fprintf (stderr, "%s: %s\n", progname, err);
 
-          if (v) free (v);
           status = -1;
           goto DONE;
        }
index 74d8318b8ea1860b7119949f5b2b861c77e69592..86d3535afd3f04730c2cb415c99277fdd80ee605 100644 (file)
@@ -97,7 +97,7 @@ setgroups_needed_p (uid_t target_group)
   if (n < 0)
     {
       char buf [1024];
-      sprintf (buf, "%s: getgroups(%d, ...)", blurb(), sizeof(groups)-1);
+      sprintf (buf, "%s: getgroups(%ld, ...)", blurb(), (long)sizeof(groups)-1);
       perror (buf);
       return 1;
     }
index ffabe483f3b2936697e7262dc3749156c39a3ea8..01329d0effb0426a26b27ba3042e5e8e978510c6 100644 (file)
@@ -71,6 +71,59 @@ extern int kill (pid_t, int);                /* signal() is in sys/signal.h... */
 extern saver_info *global_si_kludge;   /* I hate C so much... */
 
 
+/* Used when printing error/debugging messages from signal handlers.
+ */
+static const char *
+no_malloc_number_to_string (long num)
+{
+  static char string[128] = "";
+  int num_digits;
+  Bool negative_p = False;
+
+  num_digits = 0;
+
+  if (num == 0)
+    return "0";
+
+  if (num < 0)
+    {
+      negative_p = True;
+      num = -num;
+    }
+
+  while ((num > 0) && (num_digits < sizeof(string - 1)))
+    {
+      int digit;
+      digit = (int) num % 10;
+      num_digits++;
+      string[sizeof(string) - 1 - num_digits] = digit + '0';
+      num /= 10;
+    }
+
+  if (negative_p)
+    {
+      num_digits++;
+      string[sizeof(string) - 1 - num_digits] = '-';
+    }
+
+  return string + sizeof(string) - 1 - num_digits;
+}
+
+/* Like write(), but runs strlen() on the arg to get the length. */
+static int
+write_string (int fd, const char *str)
+{
+  return write (fd, str, strlen (str));
+}
+
+static int
+write_long (int fd, long n)
+{
+  const char *str = no_malloc_number_to_string (n);
+  return write_string (fd, str);
+}
+
+
 /* RLIMIT_AS (called RLIMIT_VMEM on some systems) controls the maximum size
    of a process's address space, i.e., the maximal brk(2) and mmap(2) values.
    Setting this lets you put a cap on how much memory a process can allocate.
@@ -412,8 +465,19 @@ sigchld_handler (int sig)
   saver_info *si = global_si_kludge;   /* I hate C so much... */
 
   if (si->prefs.debug_p)
-    fprintf(stderr, "%s: got SIGCHLD%s\n", blurb(),
+    {
+      /* Don't call fprintf() from signal handlers, as it might malloc.
+      fprintf(stderr, "%s: got SIGCHLD%s\n", blurb(),
            (block_sigchld_handler ? " (blocked)" : ""));
+      */
+      write_string (STDERR_FILENO, blurb());
+      write_string (STDERR_FILENO, ": got SIGCHLD");
+
+      if (block_sigchld_handler)
+        write_string (STDERR_FILENO, " (blocked)\n");
+      else
+        write_string (STDERR_FILENO, "\n");
+    }
 
   if (block_sigchld_handler < 0)
     abort();
@@ -430,6 +494,7 @@ sigchld_handler (int sig)
 
 
 #ifndef VMS
+
 static void
 await_dying_children (saver_info *si)
 {
@@ -444,11 +509,29 @@ await_dying_children (saver_info *si)
       if (si->prefs.debug_p)
        {
          if (kid < 0 && errno)
-           fprintf (stderr, "%s: waitpid(-1) ==> %ld (%d)\n", blurb(),
-                    (long) kid, errno);
-         else
-           fprintf (stderr, "%s: waitpid(-1) ==> %ld\n", blurb(),
-                    (long) kid);
+            {
+              /* Don't call fprintf() from signal handlers, as it might malloc.
+             fprintf (stderr, "%s: waitpid(-1) ==> %ld (%d)\n", blurb(),
+                      (long) kid, errno);
+               */
+              write_string (STDERR_FILENO, blurb());
+              write_string (STDERR_FILENO, ": waitpid(-1) ==> ");
+              write_long   (STDERR_FILENO, (long) kid);
+              write_string (STDERR_FILENO, " (");
+              write_long   (STDERR_FILENO, (long) errno);
+              write_string (STDERR_FILENO, ")\n");
+            }
+          else
+            {
+              /* Don't call fprintf() from signal handlers, as it might malloc.
+              fprintf (stderr, "%s: waitpid(-1) ==> %ld\n", blurb(),
+                       (long) kid);
+               */
+              write_string (STDERR_FILENO, blurb());
+              write_string (STDERR_FILENO, ": waitpid(-1) ==> ");
+              write_long   (STDERR_FILENO, (long) kid);
+              write_string (STDERR_FILENO, "\n");
+            }
        }
 
       /* 0 means no more children to reap.
@@ -488,12 +571,38 @@ describe_dead_child (saver_info *si, pid_t kid, int wait_status)
       if (!job ||
          (exit_status != 0 &&
           (p->verbose_p || job->status != job_killed)))
-       fprintf (stderr,
-                "%s: %d: child pid %lu (%s) exited abnormally (code %d).\n",
-                blurb(), screen_no, (unsigned long) kid, name, exit_status);
+        {
+          /* Don't call fprintf() from signal handlers, as it might malloc.
+         fprintf (stderr,
+                  "%s: %d: child pid %lu (%s) exited abnormally (code %d).\n",
+                  blurb(), screen_no, (unsigned long) kid, name, exit_status);
+           */
+          write_string (STDERR_FILENO, blurb());
+          write_string (STDERR_FILENO, ": ");
+          write_long   (STDERR_FILENO, (long) screen_no);
+          write_string (STDERR_FILENO, ": child pid ");
+          write_long   (STDERR_FILENO, (long) kid);
+          write_string (STDERR_FILENO, " (");
+          write_string (STDERR_FILENO, name);
+          write_string (STDERR_FILENO, ") exited abnormally (code ");
+          write_long   (STDERR_FILENO, (long) exit_status);
+          write_string (STDERR_FILENO, ").\n"); 
+        }
       else if (p->verbose_p)
-       fprintf (stderr, "%s: %d: child pid %lu (%s) exited normally.\n",
-                blurb(), screen_no, (unsigned long) kid, name);
+        {
+          /* Don't call fprintf() from signal handlers, as it might malloc.
+         fprintf (stderr, "%s: %d: child pid %lu (%s) exited normally.\n",
+                  blurb(), screen_no, (unsigned long) kid, name);
+           */
+          write_string (STDERR_FILENO, blurb());
+          write_string (STDERR_FILENO, ": ");
+          write_long   (STDERR_FILENO, (long) screen_no);
+          write_string (STDERR_FILENO, ": child pid ");
+          write_long   (STDERR_FILENO, (long) kid);
+          write_string (STDERR_FILENO, " (");
+          write_string (STDERR_FILENO, name);
+          write_string (STDERR_FILENO, ") exited normally.\n");
+        }
 
       if (job)
        job->status = job_dead;
@@ -504,9 +613,23 @@ describe_dead_child (saver_info *si, pid_t kid, int wait_status)
          !job ||
          job->status != job_killed ||
          WTERMSIG (wait_status) != SIGTERM)
-       fprintf (stderr, "%s: %d: child pid %lu (%s) terminated with %s.\n",
-                blurb(), screen_no, (unsigned long) kid, name,
-                signal_name (WTERMSIG(wait_status)));
+        {
+          /* Don't call fprintf() from signal handlers, as it might malloc.
+         fprintf (stderr, "%s: %d: child pid %lu (%s) terminated with %s.\n",
+                  blurb(), screen_no, (unsigned long) kid, name,
+                  signal_name (WTERMSIG(wait_status)));
+           */
+          write_string (STDERR_FILENO, blurb());
+          write_string (STDERR_FILENO, ": ");
+          write_long   (STDERR_FILENO, (long) screen_no);
+          write_string (STDERR_FILENO, ": child pid ");
+          write_long   (STDERR_FILENO, (long) kid);
+          write_string (STDERR_FILENO, " (");
+          write_string (STDERR_FILENO, name);
+          write_string (STDERR_FILENO, ") terminated with signal ");
+          write_long   (STDERR_FILENO, WTERMSIG(wait_status));
+          write_string (STDERR_FILENO, ".\n");
+        }
 
       if (job)
        job->status = job_dead;
@@ -514,17 +637,41 @@ describe_dead_child (saver_info *si, pid_t kid, int wait_status)
   else if (WIFSTOPPED (wait_status))
     {
       if (p->verbose_p)
-       fprintf (stderr, "%s: child pid %lu (%s) stopped with %s.\n",
-                blurb(), (unsigned long) kid, name,
-                signal_name (WSTOPSIG (wait_status)));
+        {
+          /* Don't call fprintf() from signal handlers, as it might malloc.
+         fprintf (stderr, "%s: child pid %lu (%s) stopped with %s.\n",
+                  blurb(), (unsigned long) kid, name,
+                  signal_name (WSTOPSIG (wait_status)));
+           */
+          write_string (STDERR_FILENO, blurb());
+          write_string (STDERR_FILENO, ": ");
+          write_long   (STDERR_FILENO, (long) screen_no);
+          write_string (STDERR_FILENO, ": child pid ");
+          write_long   (STDERR_FILENO, (long) kid);
+          write_string (STDERR_FILENO, " (");
+          write_string (STDERR_FILENO, name);
+          write_string (STDERR_FILENO, ") stopped with signal ");
+          write_long   (STDERR_FILENO, WSTOPSIG(wait_status));
+          write_string (STDERR_FILENO, ".\n");
+        }
 
       if (job)
        job->status = job_stopped;
     }
   else
     {
+      /* Don't call fprintf() from signal handlers, as it might malloc.
       fprintf (stderr, "%s: child pid %lu (%s) died in a mysterious way!",
               blurb(), (unsigned long) kid, name);
+       */
+      write_string (STDERR_FILENO, blurb());
+      write_string (STDERR_FILENO, ": ");
+      write_long   (STDERR_FILENO, (long) screen_no);
+      write_string (STDERR_FILENO, ": child pid ");
+      write_long   (STDERR_FILENO, (long) kid);
+      write_string (STDERR_FILENO, " (");
+      write_string (STDERR_FILENO, name);
+      write_string (STDERR_FILENO, ") died in a mysterious way!");
       if (job)
        job->status = job_dead;
     }
@@ -637,7 +784,8 @@ print_path_error (const char *program)
       fprintf (stderr, "\n");
       *path = 0;
 # if defined(HAVE_GETCWD)
-      getcwd (path, sizeof(path));
+      if (! getcwd (path, sizeof(path)))
+        *path = 0;
 # elif defined(HAVE_GETWD)
       getwd (path);
 # endif
@@ -1090,7 +1238,8 @@ get_best_gl_visual (saver_screen_info *ssi)
         close (out);  /* don't need this one */
 
         *buf = 0;
-        fgets (buf, sizeof(buf)-1, f);
+        if (! fgets (buf, sizeof(buf)-1, f))
+          *buf = 0;
         fclose (f);
 
         /* Wait for the child to die. */
index 1f4321425bcc07617aad44f4e025c3dcb4d721d6..f64190bc923580f91856e45320836062902a33f5 100644 (file)
@@ -331,6 +331,16 @@ reset_timers (saver_info *si)
   if (si->cycle_id) abort ();  /* no cycle timer when inactive */
 
   si->last_activity_time = time ((time_t *) 0);
+
+  /* This will (hopefully, supposedly) tell the server to re-set its
+     DPMS timer.  Without this, the -deactivate clientmessage would
+     prevent xscreensaver from blanking, but would not prevent the
+     monitor from powering down. */
+  XForceScreenSaver (si->dpy, ScreenSaverReset);
+
+  /* And if the monitor is already powered off, turn it on.
+     You'd think the above would do that, but apparently not? */
+  monitor_power_on (si);
 }
 
 
index e9891af746c849426db40907da6ea2a8abb03cbb..e6ca0bf53cae9ae0c6668c596e288e97107834dd 100644 (file)
@@ -30,7 +30,7 @@
 #endif /* HAVE_UNAME */
 
 #include <stdio.h>
-#include <X11/Xproto.h>                /* for CARD32 */
+/* #include <X11/Xproto.h>     / * for CARD32 */
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>         /* for XSetClassHint() */
 #include <X11/Xatom.h>
 #include <time.h>
 #include <sys/time.h>
 
+/* You might think that to store an array of 32-bit quantities onto a
+   server-side property, you would pass an array of 32-bit data quantities
+   into XChangeProperty().  You would be wrong.  You have to use an array
+   of longs, even if long is 64 bits (using 32 of each 64.)
+ */
+typedef long PROP32;
+
 #ifdef HAVE_MIT_SAVER_EXTENSION
 # include <X11/extensions/scrnsaver.h>
 #endif /* HAVE_MIT_SAVER_EXTENSION */
@@ -966,16 +973,16 @@ store_saver_id (saver_screen_info *ssi)
 void
 store_saver_status (saver_info *si)
 {
-  CARD32 *status;
+  PROP32 *status;
   int size = si->nscreens + 2;
   int i;
 
-  status = (CARD32 *) calloc (size, sizeof(CARD32));
+  status = (PROP32 *) calloc (size, sizeof(PROP32));
 
-  status[0] = (CARD32) (si->screen_blanked_p
+  status[0] = (PROP32) (si->screen_blanked_p
                         ? (si->locked_p ? XA_LOCK : XA_BLANK)
                         : 0);
-  status[1] = (CARD32) si->blank_time;
+  status[1] = (PROP32) si->blank_time;
 
   for (i = 0; i < si->nscreens; i++)
     {
index 6c039fb27d1c0173bdc2c91f40a4d1af5d6a9653..a74b0c1b86e37fab4431dce7ca8814267b641793 100644 (file)
@@ -23,7 +23,7 @@
 # include <unistd.h>
 #endif
 
-#include <X11/Xproto.h>                /* for CARD32 */
+/* #include <X11/Xproto.h>     / * for CARD32 */
 #include <X11/Xlib.h>
 #include <X11/Xatom.h>
 #include <X11/Xutil.h>         /* for XGetClassHint() */
 
 #include <X11/Intrinsic.h>     /* only needed to get through xscreensaver.h */
 
+
+/* You might think that to read an array of 32-bit quantities out of a
+   server-side property, you would pass an array of 32-bit data quantities
+   into XGetWindowProperty().  You would be wrong.  You have to use an array
+   of longs, even if long is 64 bits (using 32 of each 64.)
+ */
+typedef long PROP32;
+
 #include "remote.h"
 #include "version.h"
 
@@ -325,7 +333,7 @@ watch (Display *dpy)
   Window window = RootWindow (dpy, 0);
   XWindowAttributes xgwa;
   XEvent event;
-  CARD32 *last = 0;
+  PROP32 *last = 0;
 
   if (v) free (v);
   XGetWindowAttributes (dpy, window, &xgwa);
@@ -357,7 +365,7 @@ watch (Display *dpy)
               char *s;
               Bool changed = False;
               Bool running = False;
-              CARD32 *data = (CARD32 *) dataP;
+              PROP32 *data = (PROP32 *) dataP;
 
               if (type != XA_INTEGER || nitems < 3)
                 {
index 07861e586e53fdc92ee02d201e3ffb1382d8652b..92078445ec7e00fbb2b5c0ebbd7e9e8bb44d515d 100644 (file)
@@ -814,6 +814,48 @@ Installed</property>
                              <property name="type">tab</property>
                            </packing>
                          </child>
+
+                         <child>
+                           <widget class="GtkLabel" id="nothing_label">
+                             <property name="visible">True</property>
+                             <property name="label" translatable="yes">Very few (or no) screen savers appear to be available.
+
+This probably means that the &quot;xscreensaver-extras&quot; and
+&quot;xscreensaver-gl-extras&quot; packages are not installed.</property>
+                             <property name="use_underline">False</property>
+                             <property name="use_markup">False</property>
+                             <property name="justify">GTK_JUSTIFY_CENTER</property>
+                             <property name="wrap">False</property>
+                             <property name="selectable">False</property>
+                             <property name="xalign">0.5</property>
+                             <property name="yalign">0.5</property>
+                             <property name="xpad">0</property>
+                             <property name="ypad">0</property>
+                           </widget>
+                           <packing>
+                             <property name="tab_expand">False</property>
+                             <property name="tab_fill">True</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkLabel" id="nothing_tab">
+                             <property name="visible">True</property>
+                             <property name="label" translatable="yes">nothing</property>
+                             <property name="use_underline">False</property>
+                             <property name="use_markup">False</property>
+                             <property name="justify">GTK_JUSTIFY_LEFT</property>
+                             <property name="wrap">False</property>
+                             <property name="selectable">False</property>
+                             <property name="xalign">0.5</property>
+                             <property name="yalign">0.5</property>
+                             <property name="xpad">0</property>
+                             <property name="ypad">0</property>
+                           </widget>
+                           <packing>
+                             <property name="type">tab</property>
+                           </packing>
+                         </child>
                        </widget>
                      </child>
 
index 40c6173cbc46a6c6a45b8e5891413c2642b5477a..158dea0996d276933f93a1677d1965be5ff768bc 100755 (executable)
@@ -1,5 +1,5 @@
 #!/usr/bin/perl -w
-# Copyright Â© 2003 Jamie Zawinski <jwz@jwz.org>.
+# Copyright Â© 2003, 2005 Jamie Zawinski <jwz@jwz.org>.
 #
 # Permission to use, copy, modify, distribute, and sell this software and its
 # documentation for any purpose is hereby granted without fee, provided that
@@ -34,7 +34,7 @@ use diagnostics;
 use strict;
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.2 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my $version = q{ $Revision: 1.3 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
 
 my @grabber   = ("screencapture", "-x");
 my @converter = ("pdf2jpeg");
@@ -101,22 +101,45 @@ sub grab_image {
     }
   }
 
-  # Convert the PDF to a JPEG
+  # On MacOS 10.3, "screencapture -x" always wrote a PDF.
+  # On 10.4.2, it writes a PNG by default, and the output format can be
+  # changed with the new "-t" argument.
+  #
+  # So, for maximal compatibility, we run it without "-t", but look at
+  # the first few bytes to see if it's a PDF, and if it is, convert it
+  # to a JPEG first.  Otherwise, we assume that whatever screencapture
+  # wrote is a file format that xscreensaver-getimage-file can already
+  # cope with (though it will have the extension ".pdf", regardless of
+  # what is actually in the file).
+  #
+  my $pdf_p = 0;
   {
-    my $jpgfile = $tmpfile;
-    $jpgfile =~ s/\.[^.]+$//;
-    $jpgfile .= ".jpg";
-
-    @cmd = (@converter, $tmpfile, $jpgfile);
-    push @cmd, "--verbose" if ($verbose);
-
-    print STDERR "$progname: executing \"" . join(' ', @cmd) . "\"\n"
-      if ($verbose);
-    system (@cmd);
-    unlink $tmpfile;
-    $tmpfile = $jpgfile;
+    local *IN;
+    open (IN, "<$tmpfile") || error ("$tmpfile: $!");
+    my $buf = '';
+    read (IN, $buf, 10);
+    close IN;
+    $pdf_p = ($buf =~ m/^%PDF-/s);
   }
 
+  # If it's a PDF, convert it to a JPEG.
+  #
+  if ($pdf_p)
+    {
+      my $jpgfile = $tmpfile;
+      $jpgfile =~ s/\.[^.]+$//;
+      $jpgfile .= ".jpg";
+
+      @cmd = (@converter, $tmpfile, $jpgfile);
+      push @cmd, "--verbose" if ($verbose);
+
+      print STDERR "$progname: executing \"" . join(' ', @cmd) . "\"\n"
+        if ($verbose);
+      system (@cmd);
+      unlink $tmpfile;
+      $tmpfile = $jpgfile;
+    }
+
   @st = stat($tmpfile);
   $size = (@st ? $st[7] : 0);
   if ($size <= 2048) {
index 174bfd97f9de8636060b59452a94ced2c8ee41e3..24c0246e262d2c1a1214f5e5d666121c5f2f8fd8 100644 (file)
@@ -136,6 +136,7 @@ ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
   return 0;
 }
 
+#ifndef USE_EXTERNAL_SCREEN_GRABBER
 static int
 ignore_badmatch_ehandler (Display *dpy, XErrorEvent *error)
 {
@@ -144,6 +145,7 @@ ignore_badmatch_ehandler (Display *dpy, XErrorEvent *error)
   else
     return x_ehandler (dpy, error);
 }
+#endif /* ! USE_EXTERNAL_SCREEN_GRABBER */
 
 
 /* Returns True if the given Drawable is a Window; False if it's a Pixmap.
@@ -295,6 +297,7 @@ compute_image_scaling (int src_w, int src_h,
    If out of memory, returns False, and the XImage will have been
    destroyed and freed.
  */
+#ifndef USE_EXTERNAL_SCREEN_GRABBER
 static Bool
 scale_ximage (Screen *screen, Visual *visual,
               XImage *ximage, int new_width, int new_height)
@@ -342,6 +345,7 @@ scale_ximage (Screen *screen, Visual *visual,
 
   return True;
 }
+#endif /* ! USE_EXTERNAL_SCREEN_GRABBER */
 
 
 #ifdef HAVE_GDK_PIXBUF
@@ -1197,7 +1201,8 @@ get_filename_1 (Screen *screen, const char *directory, grab_type type,
 
         close (out);  /* don't need this one */
         *buf = 0;
-        fgets (buf, sizeof(buf)-1, f);
+        if (! fgets (buf, sizeof(buf)-1, f))
+          *buf = 0;
         fclose (f);
 
         /* Wait for the child to die. */
index 52f9f577b16562a82321686b6ecee4197f3f11e2..4449f9c934b8db8ce85f559323ebe2313a0863db 100755 (executable)
@@ -24,7 +24,7 @@ use Text::Wrap qw(wrap);
 use bytes;
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.5 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my $version = q{ $Revision: 1.6 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
 
 my $verbose = 0;
 my $http_proxy = undef;
@@ -282,7 +282,8 @@ sub output() {
 
   } elsif ($text_mode eq 'program') {
 
-    $text_program = which ($text_program);
+    my ($prog, $args) = ($text_program =~ m/^([^\s]+)(.*)$/);
+    $text_program = which ($prog) . $args;
     print STDERR "$progname: running $text_program\n" if ($verbose);
 
     if ($wrap_columns && $wrap_columns > 0) {
index 058dd86c091b9c52b84387046785b4778cc9122e..cb41a4942f4351d059971b4562cf6b1871f3df15 100644 (file)
@@ -1598,10 +1598,12 @@ clientmessage_response (saver_info *si, Window w, Bool error,
 static void
 bogus_clientmessage_warning (saver_info *si, XEvent *event)
 {
+  saver_preferences *p = &si->prefs;
   char *str = XGetAtomName_safe (si->dpy, event->xclient.message_type);
   Window w = event->xclient.window;
   char wdesc[255];
   int screen = 0;
+  Bool root_p = False;
 
   *wdesc = 0;
   for (screen = 0; screen < si->nscreens; screen++)
@@ -1613,9 +1615,19 @@ bogus_clientmessage_warning (saver_info *si, XEvent *event)
     else if (w == RootWindow (si->dpy, screen))
       {
         strcpy (wdesc, "root");
+        root_p = True;
         break;
       }
 
+  /* If this ClientMessage was sent to the real root window instead of to the
+     xscreensaver window, then it might be intended for someone else who is
+     listening on the root window (e.g., the window manager).  So only print
+     the warning if: we are in debug mode; or if the bogus message was
+     actually sent to one of the xscreensaver-created windows.
+   */
+  if (root_p && !p->debug_p)
+    return;
+
   if (!*wdesc)
     {
       XErrorHandler old_handler;
index 26e9808a32fbe4cf7f653d918c95593d9c5acf82..9484831f505f3663cb3e4f57c8dd034ae86c8d48 100644 (file)
@@ -796,6 +796,14 @@ Name=XScreensaver
 Type=Application
 X-KDE-StartupNotify=false
 .EE
+.TP 3
+\fB4: Make the various "lock session" buttons call xscreensaver.\fP
+Replace the file \fI/usr/bin/kdesktop_lock\fP with these two lines:
+.EX
+#!/bin/sh
+xscreensaver-command -lock
+.EE
+Make sure the file is executable (chmod a+x).
 .RE
 .PP
 Now use xscreensaver normally, controlling it via the usual
index 18d031b4fe573985c452565418bb0871edefc316..0e5fde9522c6d861c7f2613874c761d0499bed41 100644 (file)
@@ -108,7 +108,7 @@ SRCS                = attraction.c blitspin.c bouboule.c braid.c bubbles.c \
                  mismunch.c pacman.c pacman_ai.c pacman_level.c \
                  fuzzyflakes.c anemotaxis.c memscroller.c substrate.c \
                  intermomentary.c fireworkx.c fireworkx_mmx.S fiberlamp.c \
-                 boxfit.c interaggregate.c
+                 boxfit.c interaggregate.c celtic.c
 SCRIPTS                = vidwhacker webcollage ljlatest
 
 OBJS           = attraction.o blitspin.o bouboule.o braid.o bubbles.o \
@@ -138,7 +138,7 @@ OBJS                = attraction.o blitspin.o bouboule.o braid.o bubbles.o \
                  mismunch.o pacman.o pacman_ai.o pacman_level.o \
                  fuzzyflakes.o anemotaxis.o memscroller.o substrate.o \
                  intermomentary.o fireworkx.o fiberlamp.o boxfit.o \
-                 interaggregate.o
+                 interaggregate.o celtic.o
 
 NEXES          = attraction blitspin bouboule braid bubbles decayscreen deco \
                  drift flag flame forest vines galaxy grav greynetic halo \
@@ -147,7 +147,7 @@ NEXES               = attraction blitspin bouboule braid bubbles decayscreen deco \
                  penrose pyro qix rocks rorschach sierpinski slidescreen \
                  slip sphere spiral strange swirl goop starfish munch \
                  fadeplot rd-bomb coral mountain triangle lissie worm rotor \
-                 ant xjack xlyap jigsaw cynosure moire2 flow epicycle \
+                 xjack xlyap jigsaw cynosure moire2 flow epicycle \
                  interference truchet bsod crystal discrete distort kumppa \
                  demon loop t3d penetrate deluxe compass squiral xflame \
                  wander spotlight critical phosphor xmatrix petri shadebobs \
@@ -159,6 +159,7 @@ NEXES               = attraction blitspin bouboule braid bubbles decayscreen deco \
                  fontglide apple2 xanalogtv pong  wormhole mismunch \
                  pacman fuzzyflakes anemotaxis memscroller substrate \
                  intermomentary fireworkx fiberlamp boxfit interaggregate \
+                 celtic \
                  @JPEG_EXES@
 SEXES          = sonar
 JPEG_EXES      = webcollage-helper
@@ -176,7 +177,7 @@ XDBE_OBJS   = $(UTILS_BIN)/xdbe.o
 HDRS           = bubbles.h screenhack.h xlockmore.h xlockmoreI.h automata.h \
                  bumps.h xpm-pixmap.h apple2.h analogtv.h \
                  pacman.h pacman_ai.h pacman_level.h
-MEN            = anemone.man ant.man apollonian.man attraction.man \
+MEN            = anemone.man apollonian.man attraction.man \
                  blaster.man blitspin.man bouboule.man braid.man bsod.man \
                  bubbles.man bumps.man ccurve.man compass.man coral.man \
                  critical.man crystal.man cynosure.man decayscreen.man \
@@ -206,7 +207,7 @@ MEN         = anemone.man ant.man apollonian.man attraction.man \
                  wormhole.man mismunch.man pacman.man fuzzyflakes.man \
                  anemotaxis.man memscroller.man substrate.man \
                  intermomentary.man fireworkx.man fiberlamp.man boxfit.man \
-                 interaggregate.man
+                 interaggregate.man celtic.man
 STAR           = *
 EXTRAS         = README Makefile.in xlock_23.h xml2man.pl .gdbinit \
                  euler2d.tex \
@@ -842,6 +843,9 @@ boxfit:             boxfit.o        $(HACK_OBJS) $(COL) $(GRAB)
 ifs:           ifs.o           $(HACK_OBJS) $(COL)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
 
+celtic:                celtic.o        $(HACK_OBJS) $(COL) $(ERASE)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
+
 
 # The rules for those hacks which follow the `xlockmore' API.
 #
@@ -1086,6 +1090,8 @@ bumps.o: ../config.h
 bumps.o: $(srcdir)/screenhack.h
 ccurve.o: ../config.h
 ccurve.o: $(srcdir)/screenhack.h
+celtic.o: ../config.h
+celtic.o: $(srcdir)/screenhack.h
 cloudlife.o: ../config.h
 cloudlife.o: $(srcdir)/screenhack.h
 compass.o: ../config.h
diff --git a/hacks/ant.man b/hacks/ant.man
deleted file mode 100644 (file)
index ed25576..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-.TH XScreenSaver 1 "" "X Version 11"
-.SH NAME
-ant - cellular automaton.
-.SH SYNOPSIS
-.B ant
-[\-display \fIhost:display.screen\fP]
-[\-visual \fIvisual\fP]
-[\-window]
-[\-install]
-[\-noinstall]
-[\-root]
-[\-eyes]
-[\-no-eyes]
-[\-truchet]
-[\-no-truchet]
-[\-sharpturn]
-[\-no-sharpturn]
-[\-delay \fInumber\fP]
-[\-cycles \fInumber\fP]
-[\-count \fInumber\fP]
-[\-size \fInumber\fP]
-[\-neighbors 3]
-[\-neighbors 4]
-[\-neighbors 6]
-[\-neighbors 9]
-[\-neighbors 12]
-[\-ncolors \fInumber\fP]
-.SH DESCRIPTION
-A cellular automaton that is really a two-dimensional Turing machine: as
-the heads ("ants") walk along the screen, they change pixel values in
-their path. Then, as they pass over changed pixels, their behavior is
-influenced.
-.SH OPTIONS
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-sharpturns | \-no-sharpturns
-Whether to do sharp turns.
-.TP 8
-.B \-truchet | \-no-truchet
-Whether to use truchet lines.
-.TP 8
-.B \-eyes | \-no-eyes
-Whether to draw eyes on the ants.
-.TP 8
-.B \-delay \fInumber\fP
-Per-frame delay, in microseconds.  Default: 1000 (0.0001 seconds.).
-.TP 8
-.B \-cycles \fInumber\fP
-How long to wait until resetting.  0 - 800000.  Default: 40000.
-.TP 8
-.B \-count \fInumber\fP
-Ants Count.  -20 - 20. Default: -3.
-.TP 8
-.B \-size \fInumber\fP
-Ant Size.  -18 - 18.  Default: -12.
-.TP 8
-.B \-neighbors \fIN\fP
-How many neighbors each cell has.  Legal values are 3, 4, 6, 9, and 12.
-.TP 8
-.B \-ncolors \fInumber\fP
-Number of colors.  Default: 64.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 2002 by David Bagley.  Permission to use, copy, modify, 
-distribute, and sell this software and its documentation for any purpose is 
-hereby granted without fee, provided that the above copyright notice appear 
-in all copies and that both that copyright notice and this permission notice
-appear in supporting documentation.  No representations are made about the 
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-David Bagley.
index 12fe95f3db0553e07b8a9d24e72da3bf26b6a93f..3beeeeea62142ea7b9db5f59b755e494540999d6 100644 (file)
@@ -1507,17 +1507,17 @@ struct basic_controller_data {
  */
 static char *moire_program[]={
   "10 HGR2\n",
-  "20 FOR Y = 0 TO 191 STEP 2\n",
+  "20 FOR Y = 0 TO 190 STEP 2\n",
   "30 HCOLOR=4 : REM BLACK\n",
-  "40 HLINE 0,191-Y TO 279,Y\n",
+  "40 HPLOT 0,191-Y TO 279,Y\n",
   "60 HCOLOR=7 : REM WHITE\n",
-  "80 HLINE 0,190-Y TO 279,Y+1\n",
+  "80 HPLOT 0,190-Y TO 279,Y+1\n",
   "90 NEXT Y\n",
-  "100 FOR X = 0 TO 279 STEP 3\n",
+  "100 FOR X = 0 TO 278 STEP 3\n",
   "110 HCOLOR=4\n",
-  "120 HLINE 279-X,0 TO X,192\n",
+  "120 HPLOT 279-X,0 TO X,191\n",
   "140 HCOLOR=7\n",
-  "150 HLINE 278-X,0 TO X+1,192\n",
+  "150 HPLOT 278-X,0 TO X+1,191\n",
   "160 NEXT X\n",
   NULL
 };
@@ -1527,9 +1527,9 @@ static char *sinewave_program[] = {
   "25 K=0\n",
   "30 FOR X = 0 TO 279\n",
   "32 HCOLOR= 0\n",
-  "35 HLINE X,0 TO X,159\n",
+  "35 HPLOT X,0 TO X,159\n",
   "38 HCOLOR= 3\n",
-  "40 Y = 80 + SIN(15*(X-K)/279)\n",
+  "40 Y = 80 + SIN(15*(X-K)/279) * 40\n",
   "50 HPLOT X,Y\n",
   "60 NEXT X\n",
   "70 K=K+4\n",
@@ -1551,13 +1551,13 @@ static char *random_lores_program[]={
   "100 COLOR= RND(1)*16\n",
 
   "110 X=RND(1)*40\n",
-  "120 Y1=RND(1)*48\n",
-  "130 Y2=RND(1)*48\n",
+  "120 Y1=RND(1)*40\n",
+  "130 Y2=RND(1)*40\n",
   "140 FOR Y = Y1 TO Y2\n",
   "150 PLOT X,Y\n",
   "160 NEXT Y\n",
 
-  "210 Y=RND(1)*48\n",
+  "210 Y=RND(1)*40\n",
   "220 X1=RND(1)*40\n",
   "230 X2=RND(1)*40\n",
   "240 FOR X = X1 TO X2\n",
diff --git a/hacks/celtic.c b/hacks/celtic.c
new file mode 100644 (file)
index 0000000..deb3f33
--- /dev/null
@@ -0,0 +1,1032 @@
+/* celtic, Copyright (c) 2005 Max Froumentin <max@lapin-bleu.net>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#include <math.h>
+#include <assert.h>
+#include "screenhack.h"
+#include "erase.h"
+
+#define SQRT3_2 .86602540378443864676
+
+/*-----------------------------------------*/
+Display *dpy;
+Window window;
+int ncolors;
+XColor *colors;
+GC gc,shadow_gc,gc_graph;
+
+struct params {
+  unsigned long curve_width, shadow_width;
+  double shape1, shape2;
+  unsigned long margin;
+
+  enum graph_type { polar, grid, kennicott, triangle } type;
+  unsigned long edge_size;
+  unsigned long cluster_size; /* only used if type is kennicott */
+  unsigned long delay;        /* controls curve drawing speed (step delay 
+                              * in microsecs) */
+  unsigned long nb_orbits;          /* only used if type is polar */
+  unsigned long nb_nodes_per_orbit; /* only used if type is polar */
+
+  double angle; /* angle of rotation of the graph around the centre */
+} params;
+
+
+/*-----------------------------------------*/
+typedef enum direction {
+  CLOCKWISE=0, ANTICLOCKWISE=1
+} Direction;
+
+
+/*-----------------------------------------*/
+typedef struct array {
+  int nb_elements;
+  int nb_allocated_elements;
+  int increment;
+  void **elements;
+} *Array;
+
+static Array array_new(int increment)
+{
+  Array new;
+  assert(new=(Array)calloc(1,sizeof(struct array)));
+  new->nb_elements=0;
+  new->nb_allocated_elements=0;
+  new->increment=increment;
+  return new;
+}
+
+static void array_del(Array a, void (*free_element)(void*))
+{
+  int i;
+  if (free_element) 
+    for (i=0;i<a->nb_elements;i++) 
+      free_element(a->elements[i]);
+  free(a->elements);
+  free(a);
+}
+
+static void array_add_element(Array a, void *element)
+{
+  if (a->nb_elements == a->nb_allocated_elements) {
+    /* we must allocate more */
+    a->nb_allocated_elements+=a->increment;
+    a->elements=realloc(a->elements,a->nb_allocated_elements*sizeof(void *));
+  }
+  a->elements[a->nb_elements++]=element;
+}
+/*-----------------------------------------*/
+
+typedef struct node {
+  double x,y;
+  Array edges;
+} *Node;
+
+typedef struct edge {
+  Node node1, node2;
+  double angle1, angle2;
+} *Edge;
+
+/*-----------------------------------------*/
+/* Node functions */
+
+static Node node_new(double x, double y)
+{
+  Node new;
+  assert(new = (Node)calloc(1,sizeof(struct node)));
+  new->x=x;
+  new->y=y;
+  new->edges = array_new(10);
+  return new;
+}
+
+static void node_del(void *n) 
+{ /* not Node * because the function is passed to array_del */
+  array_del(((Node)n)->edges,NULL);
+  free(n);
+}
+
+#if 0
+static void node_to_s(Node n, FILE *f) 
+{
+  fprintf(f,"Node: %g %g\n",n->x,n->y);
+}
+#endif
+
+static void node_draw(Node n)
+{
+  XDrawArc(dpy,window,gc_graph,(int)rint(n->x)-5,(int)rint(n->y)-5,10,10,0,360*64);
+}
+  
+static void node_add_edge(Node n, Edge e)
+{
+  array_add_element(n->edges,e);
+}
+
+
+/*-----------------------------------------*/
+/* Edge functions */
+
+static Edge edge_new(Node n1, Node n2)
+{
+  Edge new; 
+  assert(new = (Edge)calloc(1,sizeof(struct edge)));
+  new->node1=n1;
+  new->node2=n2;
+  new->angle1=atan2(new->node2->y - new->node1->y, new->node2->x - new->node1->x);
+  if (new->angle1 < 0) new->angle1+=6.28;
+
+  new->angle2=atan2(new->node1->y - new->node2->y, new->node1->x - new->node2->x);
+  if (new->angle2 < 0) new->angle2+=6.28;
+  return new;
+}
+
+static void edge_del(void *e) /* not Edge * because the function is passed to array_del */
+{
+  free(e);
+}
+
+#if 0
+static void edge_to_s(Edge e, FILE *f)
+{
+  fprintf(f,"Edge: (%g, %g), (%g, %g) angles: %g, %g\n",
+         e->node1->x, e->node1->y, e->node2->x, e->node2->y,
+         e->angle1, e->angle2);
+}
+#endif
+
+static void edge_draw(Edge e)
+{
+  XDrawLine(dpy,window,gc_graph, e->node1->x, e->node1->y, e->node2->x, e->node2->y);
+}
+
+static double edge_angle(Edge e, Node n)
+{
+  /* returns the angle of the edge at Node n */
+  assert(n==e->node1 || n==e->node2);
+  if (n==e->node1) return e->angle1; else return e->angle2;
+}
+
+static Node edge_other_node(Edge e, Node n)
+{
+  assert(n==e->node1 || n==e->node2);
+  if (n==e->node1) return e->node2; else return e->node1;
+}
+
+static double edge_angle_to(Edge e, Edge e2, Node node, Direction direction)
+{
+  /* returns the absolute angle from this edge to "edge2" around
+     "node" following "direction" */
+  double a;
+
+  if (direction==CLOCKWISE)
+    a=edge_angle(e,node) - edge_angle(e2,node);
+  else
+    a=edge_angle(e2,node) - edge_angle(e,node);
+
+  if (a<0) return a+2*M_PI; else return a;
+}
+
+/*-----------------------------------------*/
+
+typedef struct graph {
+  Array nodes;
+  Array edges;
+} *Graph;
+
+static Graph graph_new(void)
+{
+  Graph new;
+  assert(new = (Graph)calloc(1,sizeof(struct graph)));
+  new->nodes = array_new(100);
+  new->edges = array_new(100);
+  return new;
+}
+
+static void graph_del(Graph g)
+{
+  array_del(g->nodes, &node_del);
+  array_del(g->edges, &edge_del);
+  free(g);
+}
+
+
+static void graph_add_node(Graph g, Node n)
+{
+  array_add_element(g->nodes, n);
+}
+
+static void graph_add_edge(Graph g, Edge e)
+{
+  array_add_element(g->edges, e);
+  
+  /* for each node n of e, add n to pointer e */
+  node_add_edge(e->node1, e);
+  node_add_edge(e->node2, e);
+}
+
+static Edge graph_next_edge_around(Graph g, Node n, Edge e, Direction direction)
+{
+  /* return the next edge after e around node n clockwise */
+  double angle, minangle=20;
+  Edge next_edge = e, edge;
+  int i;
+
+  for (i=0;i<n->edges->nb_elements;i++) {
+    edge=n->edges->elements[i];
+    if (edge != e) {
+      angle = edge_angle_to(e,edge,n,direction);
+      if (angle < minangle) {
+       next_edge=edge;
+       minangle=angle;
+      }
+    }
+  }
+  return next_edge;
+}
+  
+#if 0
+static void graph_to_s(Graph g, FILE *f)
+{
+  int i;
+  for (i=0;i<g->nodes->nb_elements;i++) 
+    node_to_s(g->nodes->elements[i],f);
+  for (i=0;i<g->edges->nb_elements;i++)
+    edge_to_s(g->edges->elements[i],f);
+}
+#endif
+
+static void graph_draw(Graph g)
+{
+  int i;
+  
+  for (i=0;i<g->nodes->nb_elements;i++) 
+    node_draw(g->nodes->elements[i]);
+  for (i=0;i<g->edges->nb_elements;i++)
+    edge_draw(g->edges->elements[i]);
+  XSync(dpy,False);
+}
+
+static void graph_rotate(Graph g, double angle, int cx, int cy)
+{
+  /* rotate all the nodes of the graph around the centre */
+  int i; 
+  float c=cos(angle),s=sin(angle),x,y;
+  Node n;
+  for (i=0;i<g->nodes->nb_elements;i++) {
+    n=g->nodes->elements[i];
+    x=n->x; y=n->y;
+    n->x = (x-cx)*c-(y-cy)*s + cx;
+    n->y = (x-cx)*s+(y-cy)*c + cy;
+  }
+}
+
+
+/*---------------------------*/
+
+static Graph make_polar_graph(int xmin, int ymin, int width, int height, 
+                      int nbp, /* number of points on each orbit */
+                      int nbo /* number of orbits */)
+     /* make a simple grid graph, with edges present or absent randomly */
+{
+  int cx = width/2+xmin, cy=height/2+ymin; /* centre */
+  int os = (width<height?width:height)/(2*nbo); /* orbit height */
+  Graph g;
+  Node *grid;
+  int o,p;
+
+  /* generate nodes */
+  assert(grid=(Node*)calloc(1+nbp*nbo,sizeof(Node)));
+  assert(g=graph_new());
+  
+  graph_add_node(g, grid[0]=node_new((double)cx,(double)cy));
+
+  for (o=0;o<nbo;o++)
+    for (p=0;p<nbp;p++)
+      graph_add_node(g,
+                    grid[1+o*nbp+p]=node_new(cx+(o+1)*os*sin(p*2*M_PI/nbp), 
+                                             cy+(o+1)*os*cos(p*2*M_PI/nbp)));
+
+
+  /* generate edges */
+  for (o=0;o<nbo;o++)
+    for (p=0;p<nbp;p++) {
+      if (o==0) /* link first orbit nodes with centre */
+       graph_add_edge(g,edge_new(grid[1+o*nbp+p],grid[0]));
+      else /* liink orbit nodes with lower orbit */
+       graph_add_edge(g,edge_new(grid[1+o*nbp+p],grid[1+(o-1)*nbp+p]));
+      /* link along orbit */
+      graph_add_edge(g,edge_new(grid[1+o*nbp+p],
+                               grid[1+o*nbp+(p+1)%nbp]));
+    }
+
+  free(grid);
+  return g;
+}
+
+
+static Graph make_grid_graph(int xmin, int ymin, int width, int height, int step)
+     /* make a simple grid graph */
+{
+  Graph g;
+  int row,col,x,y;
+  int size=(width<height?height:width);
+
+  /* empirically, it seems there are 2 curves only if both
+     nbcol and nbrow are even, so we round them to even */
+  int nbcol=(2+size/step)/2*2, nbrow=(2+size/step)/2*2;
+
+  Node *grid;
+  assert(grid=(Node*)calloc(nbrow*nbcol,sizeof(Node)));
+  assert(g=graph_new());
+
+
+  /* adjust xmin and xmax so that the grid is centered */
+  xmin+=(width-(nbcol-1)*step)/2; 
+  ymin+=(height-(nbrow-1)*step)/2;
+
+  /* create node grid */
+  for (row=0;row<nbrow;row++)
+    for (col=0;col<nbcol;col++) {
+      x=col*step+xmin;
+      y=row*step+ymin;
+      grid[row+col*nbrow]=node_new((double)x, (double)y);
+      graph_add_node(g, grid[row+col*nbrow]);
+    }
+
+  /* create edges */
+  for (row=0;row<nbrow;row++)
+    for (col=0;col<nbcol;col++) {
+      if (col!=nbcol-1)
+       graph_add_edge(g,edge_new(grid[row+col*nbrow],
+                                 grid[row+(col+1)*nbrow]));
+      if (row!=nbrow-1)
+       graph_add_edge(g,edge_new(grid[row+col*nbrow],grid[row+1+col*nbrow]));
+      if (col!=nbcol-1 && row!=nbrow-1) {
+         graph_add_edge(g,edge_new(grid[row+col*nbrow],
+                                   grid[row+1+(col+1)*nbrow]));
+         graph_add_edge(g,edge_new(grid[row+1+col*nbrow],
+                                   grid[row+(col+1)*nbrow]));
+      }
+    }
+
+  free(grid);
+  
+  return g;
+}
+
+
+
+static Graph make_triangle_graph(int xmin, int ymin, int width, int height, int step)
+     /* make a simple grid graph */
+{
+  Graph g;
+  int row,col,x,y;
+  int size=width<height?width:height;
+  int n=1+size/SQRT3_2/step;
+  Node *grid;
+
+  assert(grid=(Node*)calloc(n*n,sizeof(Node)));
+  assert(g=graph_new());
+
+  /* adjust xmin and xmax so that the grid is centered */
+  xmin+=(width-(n-1)*step)/2; 
+  ymin+=(height-SQRT3_2*(n-3)*step)/2;
+
+  /* create node grid */
+  for (row=0;row<n;row++)
+    for (col=0;col<n;col++) 
+      if (row+col<n) {
+       x=col*step+xmin + row*step/2;
+       y=SQRT3_2*row*step+ymin;
+       grid[row+col*n]=node_new((double)x, (double)y);
+       graph_add_node(g, grid[row+col*n]);
+      }
+
+  /* create edges */
+  for (row=0;row<n;row++)
+    for (col=0;col<n;col++)
+       if (row+col<n-1) { 
+         /* horizontal edges */
+         graph_add_edge(g,edge_new(grid[row+col*n],grid[row+(col+1)*n]));
+         /* vertical edges */
+         graph_add_edge(g,edge_new(grid[row+col*n],grid[row+1+col*n]));
+         /* diagonal edges */
+         graph_add_edge(g,edge_new(grid[row+1+col*n],grid[row+(col+1)*n]));
+      }
+
+  free(grid);
+  return g;
+}
+
+
+static Graph make_kennicott_graph(int xmin, int ymin, int width, int height, int step,
+                          int cluster_size)
+     /* make a graph inspired by one of the motifs from the Kennicott bible */
+     /* square grid of clusters of the shape  /|\
+      *                                       ---
+      *                                       \|/
+      * cluster_size is the length of an edge of a cluster
+      */
+{
+  Graph g;
+  int row,col,x,y;
+  int size=width<height?height:width;
+  int nbcol=(1+size/step)/2*2, nbrow=(1+size/step)/2*2;
+  Node *grid;
+
+  /* there are 5 nodes by for each cluster */
+  assert(grid=(Node*)calloc(5*nbrow*nbcol,sizeof(Node)));
+  assert(g=graph_new());
+
+  /* adjust xmin and xmax so that the grid is centered */
+  xmin+=(width-(nbcol-1)*step)/2; 
+  ymin+=(height-(nbrow-1)*step)/2;
+
+  /* create node grid */
+  for (row=0;row<nbrow;row++)
+    for (col=0;col<nbcol;col++) {
+      int ci=5*(row+col*nbrow);
+      x=col*step+xmin;
+      y=row*step+ymin;
+
+      /* create a cluster centred on x,y */
+      grid[ci  ]=node_new((double)x, (double)y);
+      grid[ci+1]=node_new((double)(x+cluster_size), (double)y);
+      grid[ci+2]=node_new((double)x, (double)(y-cluster_size));
+      grid[ci+3]=node_new((double)(x-cluster_size), (double)y);
+      grid[ci+4]=node_new((double)x, (double)(y+cluster_size));
+
+      graph_add_node(g, grid[ci]);
+      graph_add_node(g, grid[ci+1]);
+      graph_add_node(g, grid[ci+2]);
+      graph_add_node(g, grid[ci+3]);
+      graph_add_node(g, grid[ci+4]);
+
+      /* internal edges */
+      graph_add_edge(g,edge_new(grid[ci], grid[ci+1]));      
+      graph_add_edge(g,edge_new(grid[ci], grid[ci+2]));
+      graph_add_edge(g,edge_new(grid[ci], grid[ci+3]));
+      graph_add_edge(g,edge_new(grid[ci], grid[ci+4]));
+      graph_add_edge(g,edge_new(grid[ci+1], grid[ci+2]));      
+      graph_add_edge(g,edge_new(grid[ci+2], grid[ci+3]));
+      graph_add_edge(g,edge_new(grid[ci+3], grid[ci+4]));
+      graph_add_edge(g,edge_new(grid[ci+4], grid[ci+1]));
+
+    }
+
+  /* create inter-cluster edges */
+  for (row=0;row<nbrow;row++)
+    for (col=0;col<nbcol;col++) {
+      if (col!=nbcol-1)
+       /* horizontal edge from edge 1 of cluster (row, col) to edge 3
+        * of cluster (row,col+1) */
+       graph_add_edge(g,edge_new(grid[5*(row+col*nbrow)+1],grid[5*(row+(col+1)*nbrow)+3]));
+      if (row!=nbrow-1)
+       /* vertical edge from edge 4 of cluster (row, col) to edge 2
+        * of cluster (row+1,col) */
+       graph_add_edge(g,edge_new(grid[5*(row+col*nbrow)+4],
+                                 grid[5*(row+1+col*nbrow)+2]));
+    }
+  free(grid);
+  return g;
+}
+
+/*---------------------------*/
+typedef struct spline_segment {
+  double x1,y1,x2,y2,x3,y3,x4,y4;
+} *SplineSegment;
+
+typedef struct spline {
+  Array segments; /* array of SplineSegment */
+  int color;
+} *Spline;
+
+static Spline spline_new(int color)
+{
+  Spline new=(Spline)calloc(1,sizeof(struct spline));
+  new->segments=array_new(30);
+  new->color=color;
+  return new;
+}
+
+static void spline_del(void *s)
+{
+  array_del(((Spline)s)->segments,&free);
+  free(s);
+}
+
+static void spline_add_segment(Spline s,
+                       double x1, double y1, double x2, double y2, 
+                       double x3, double y3, double x4, double y4)
+{
+  SplineSegment ss=(SplineSegment)calloc(1,sizeof(struct spline_segment));
+  ss->x1=x1;  ss->x2=x2;  ss->x3=x3;  ss->x4=x4;
+  ss->y1=y1;  ss->y2=y2;  ss->y3=y3;  ss->y4=y4;
+  array_add_element(s->segments,ss);
+}
+
+#if 0
+static void spline_to_s(Spline s, FILE *f)
+{
+  int i;
+  SplineSegment ss;
+  fprintf(f,"Spline: \n");
+  for (i=0;i<s->segments->nb_elements;i++) {
+    ss=s->segments->elements[i];
+    fprintf(f," - segment %d: (%g, %g),(%g, %g),(%g, %g),(%g, %g)\n",
+           i,ss->x1,ss->y1,ss->x2,ss->y2,ss->x3,ss->y3,ss->x4,ss->y4);
+  }
+}
+#endif
+
+static void spline_value_at(Spline s, double *x, double *y, double t, int *segment)
+{
+  int si;
+  double tt;
+  SplineSegment ss;
+  si = floor(t*s->segments->nb_elements);
+  tt = t*s->segments->nb_elements - si;
+  assert(tt>=0 && tt<1);
+  ss=s->segments->elements[si];
+
+  *x = ss->x1*(1-tt)*(1-tt)*(1-tt)+3*ss->x2*tt*(1-tt)*(1-tt)+3*ss->x3*tt*tt*(1-tt)+ss->x4*tt*tt*tt;
+  *y = ss->y1*(1-tt)*(1-tt)*(1-tt)+3*ss->y2*tt*(1-tt)*(1-tt)+3*ss->y3*tt*tt*(1-tt)+ss->y4*tt*tt*tt;
+
+  *segment=si;
+}
+
+/*---------------------------*/
+typedef struct edge_couple {
+  int **array;
+  int size;
+} *EdgeCouple;
+
+static EdgeCouple edge_couple_new(int nb_edges) {
+  int i;
+  EdgeCouple new = (EdgeCouple)calloc(1,sizeof(struct edge_couple));
+  new->array = (int **)calloc(nb_edges, sizeof(int*));
+  new->size = nb_edges;
+
+  for (i=0;i<nb_edges;i++) {
+    new->array[i]=(int *)calloc(2,sizeof(int));
+    new->array[i][CLOCKWISE]=0;
+    new->array[i][ANTICLOCKWISE]=0;
+  }
+  return new;
+}
+
+static void edge_couple_del(EdgeCouple e)
+{
+  int i;
+  for (i=0;i<e->size;i++) free(e->array[i]);
+  free(e->array);
+  free(e);
+}
+    
+/*---------------------------*/
+
+typedef struct pattern {
+  double shape1, shape2;
+  EdgeCouple ec;
+  Graph graph;
+  Array splines;
+  int ncolors;
+} *Pattern;
+
+static Pattern pattern_new(Graph g, int ncolors, double shape1, double shape2)
+{
+  Pattern new;
+  assert(new=(Pattern)calloc(1,sizeof(struct pattern)));
+  new->shape1=shape1;
+  new->shape2=shape2;
+  new->graph=g;
+  new->ec=edge_couple_new(g->edges->nb_elements);
+  new->splines=array_new(10);
+  new->ncolors=ncolors;
+  return new;
+}
+
+static void pattern_del(Pattern p)
+{
+  edge_couple_del(p->ec);
+  array_del(p->splines,&spline_del);
+  free(p);
+}
+
+static void pattern_edge_couple_set(Pattern p, Edge e, Direction d, int value) 
+{
+  int i;
+  for (i=0;i<p->graph->edges->nb_elements;i++)
+    if (p->graph->edges->elements[i]==e) {
+      p->ec->array[i][d]=value;
+      return;
+    }
+}
+
+static void pattern_draw_spline_direction(Pattern p, Spline s,
+                                  Node node, Edge edge1, Edge edge2, 
+                                  Direction direction)
+{
+  double x1=(edge1->node1->x+edge1->node2->x)/2.0;
+  double y1=(edge1->node1->y+edge1->node2->y)/2.0;
+
+  /* P2 (x2,y2) is the middle point of edge1 */
+  double x4=(edge2->node1->x+edge2->node2->x)/2.0;
+  double y4=(edge2->node1->y+edge2->node2->y)/2.0;
+  
+  double alpha=edge_angle_to(edge1,edge2,node,direction)*p->shape1;
+  double beta=p->shape2;
+  
+  double i1x,i1y,i2x,i2y,x2,y2,x3,y3;
+  
+  if (direction == ANTICLOCKWISE) {
+    /* I1 must stick out to the left of NP1 and I2 to the right of NP4 */
+    i1x =  alpha*(node->y-y1)+x1;
+    i1y = -alpha*(node->x-x1)+y1;
+    i2x = -alpha*(node->y-y4)+x4;
+    i2y =  alpha*(node->x-x4)+y4;
+    x2 =  beta*(y1-i1y) + i1x;
+    y2 = -beta*(x1-i1x) + i1y;
+    x3 = -beta*(y4-i2y) + i2x;
+    y3 =  beta*(x4-i2x) + i2y;
+  }
+  else {
+    /* I1 must stick out to the left of NP1 and I2 to the right of NP4 */
+    i1x = -alpha*(node->y-y1)+x1;
+    i1y =  alpha*(node->x-x1)+y1;
+    i2x =  alpha*(node->y-y4)+x4;
+    i2y = -alpha*(node->x-x4)+y4;
+    x2 = -beta*(y1-i1y) + i1x;
+    y2 =  beta*(x1-i1x) + i1y;
+    x3 =  beta*(y4-i2y) + i2x;
+    y3 = -beta*(x4-i2x) + i2y;
+  }
+
+  spline_add_segment(s,x1,y1,x2,y2,x3,y3,x4,y4);
+}
+
+static int pattern_next_unfilled_couple(Pattern p, Edge *e, Direction *d)
+{
+  int i;
+  for (i=0;i<p->ec->size;i++) {
+    if (p->ec->array[i][CLOCKWISE]==0) {
+      *e=p->graph->edges->elements[i];
+      *d=CLOCKWISE;
+      return 1;
+    }
+    else if (p->ec->array[i][ANTICLOCKWISE]==0) {
+      *e=p->graph->edges->elements[i];
+      *d=ANTICLOCKWISE;
+      return 1;
+    }
+  }
+  return 0;
+}
+
+static void pattern_make_curves(Pattern p)
+{
+  int i;
+  Edge current_edge, first_edge, next_edge;
+  Node current_node, first_node;
+  Direction current_direction, first_direction;
+  Spline s;
+
+  i=0;
+  while (pattern_next_unfilled_couple(p, &first_edge, &first_direction)) {
+    /* start a new loop */
+    s=spline_new(random()%(p->ncolors-2)+2);
+    array_add_element(p->splines, s);
+
+    current_edge=first_edge;
+    current_node=first_node=current_edge->node1;
+    current_direction=first_direction;
+
+    do {
+      pattern_edge_couple_set(p, current_edge, current_direction, 1);
+      next_edge = graph_next_edge_around(p->graph,current_node,current_edge,current_direction);
+
+      /* add the spline segment to the spline */
+      pattern_draw_spline_direction(p,s,current_node,
+                                   current_edge,next_edge,current_direction);
+      
+      /* cross the edge */
+      current_edge = next_edge;
+      current_node = edge_other_node(next_edge, current_node);
+      current_direction=1-current_direction;
+
+    } while (current_node!=first_node || current_edge!=first_edge || current_direction!=first_direction);
+
+    if (s->segments->nb_elements==2) /* spline is just one point: remove it */
+      p->splines->elements[p->splines->nb_elements-1]=NULL;
+      
+  }
+}
+
+static void pattern_animate(Pattern p, unsigned long delay)
+{
+  double t,t2;
+  double x,y,x2,y2,x3,y3,x4,y4;
+  int i,segment,unused;
+  int ticks = 0;
+  double step=0.0001; /* TODO: set the step (or the delay) as a
+                       * function of the spline length, so that
+                       * drawing speed is constant
+                       */
+  Spline s;
+
+  XSetLineAttributes(dpy,gc,params.curve_width,LineSolid,CapRound,JoinRound);
+  XSetLineAttributes(dpy,shadow_gc,params.shadow_width,LineSolid,CapRound,JoinRound);
+
+  for (t=0.0;t<1;t+=step) {
+    for (i=0;i<p->splines->nb_elements;i++) 
+      if ((s=p->splines->elements[i])) { /* skip if one-point spline */
+       spline_value_at(s, &x, &y, fmod(t,1.0),&segment);
+       spline_value_at(s, &x2, &y2, fmod(t+step,1.0),&unused);
+       
+       /* look ahead for the shadow segment */
+       t2=t+step;
+       if (t2<=1.0) {
+         spline_value_at(s, &x3, &y3, fmod(t2,1.0),&unused);
+         while (t2+step<1.0 && (x3-x2)*(x3-x2)+(y3-y2)*(y3-y2) < params.shadow_width*params.shadow_width) {
+           t2+=step;
+           spline_value_at(s, &x3, &y3, fmod(t2,1.0),&unused);
+         }
+         
+         spline_value_at(s, &x4, &y4, fmod(t2+step,1.0),&unused);
+         
+         /* draw shadow line */
+         XDrawLine(dpy,window,shadow_gc, 
+                   (int)rint(x3),(int)rint(y3), 
+                   (int)rint(x4),(int)rint(y4));
+       } 
+       /* draw line segment */
+       if (p->splines->nb_elements==1)
+         XSetForeground(dpy, gc, colors[segment%(ncolors-3)+2].pixel);
+       else
+         XSetForeground(dpy, gc, colors[s->color].pixel);
+       XDrawLine(dpy,window,gc,
+                 (int)rint(x),(int)rint(y),
+                 (int)rint(x2),(int)rint(y2));
+      }
+
+    if (++ticks > 100) {
+      XSync(dpy,False);
+      usleep(delay);
+      screenhack_handle_events (dpy);
+      ticks = 0;
+    }
+  }
+
+  /* at the end we redraw back to remove shadow spillage */
+  for (i=0;i<p->splines->nb_elements;i++) {
+    if ((s=p->splines->elements[i])) {
+      double offset=step;
+      XSetForeground(dpy, gc, colors[s->color].pixel);
+      spline_value_at(s, &x, &y, fmod(t,1.0),&unused);
+      
+      spline_value_at(s, &x2, &y2, fmod(t-offset,1.0),&unused);
+      
+      while ((x2-x)*(x2-x)+(y2-y)*(y2-y) < params.shadow_width*params.shadow_width) {
+       offset+=step;
+       spline_value_at(s, &x2, &y2, fmod(t-offset,1.0),&unused);
+      }
+      
+      XDrawLine(dpy,window,gc, (int)rint(x),(int)rint(y), (int)rint(x2),(int)rint(y2));
+    }
+  }
+  XSync(dpy,False);
+}
+
+/*======================================================================*/
+
+char *progclass = "Celtic";
+
+char *defaults[] = {
+    ".background: black",
+    ".foreground: grey20",
+    "*ncolors: 20",
+    "*delay: 10000",
+    "*delay2: 5",
+    "*showGraph: False",
+    0
+};
+
+XrmOptionDescRec options[] = {
+    {"-background", ".background", XrmoptionSepArg, 0},
+    {"-foreground", ".foreground", XrmoptionSepArg, 0},
+    {"-ncolors", ".ncolors", XrmoptionSepArg, 0},
+    {"-delay", ".delay", XrmoptionSepArg, 0},
+    {"-delay2", ".delay2", XrmoptionSepArg, 0},
+    {"-graph", ".showGraph", XrmoptionNoArg, "True"},
+    {0, 0, 0, 0}
+};
+
+#if 0
+static void params_to_s(FILE *f)
+{
+  switch (params.type) {
+  case polar: fprintf(f,"type: polar\n"); 
+    fprintf(f,"nb_orbits: %ld\n",params.nb_orbits);
+    fprintf(f,"nb_nodes_per_orbit: %ld\n",params.nb_nodes_per_orbit);
+    break;
+  case grid: fprintf(f,"type: grid\n"); 
+    fprintf(f,"edge_size: %ld\n",params.edge_size);
+    break;
+  case triangle: fprintf(f,"type: triangle\n"); 
+    fprintf(f,"edge_size: %ld\n",params.edge_size);
+    break;
+  case kennicott: 
+    fprintf(f,"type: kennicott\n"); 
+    fprintf(f,"edge_size: %ld\n",params.edge_size);
+    fprintf(f,"cluster_size: %ld\n",params.cluster_size);
+    break;
+  }
+
+  fprintf(f,"curve width: %ld\n",params.curve_width);
+  fprintf(f,"shadow width: %ld\n",params.shadow_width);
+  fprintf(f,"shape1: %g\n",params.shape1);
+  fprintf(f,"shape2: %g\n",params.shape2);
+  fprintf(f,"margin: %ld\n",params.margin);
+  fprintf(f,"angle: %g\n",params.angle);
+  fprintf(f,"delay: %ld\n",params.delay);
+}
+#endif
+
+void screenhack(Display * d, Window w)
+{
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  Bool showGraph=get_boolean_resource ("showGraph", "Boolean");
+  Pattern p;
+  Graph g;
+
+  dpy=d; window=w;
+  ncolors = get_integer_resource ("ncolors", "Integer");
+
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+  assert(colors = (XColor *) calloc (ncolors,sizeof(XColor)));
+
+  if (get_boolean_resource("mono", "Boolean"))
+    {
+    MONO:
+      ncolors = 1;
+      colors[0].pixel = get_pixel_resource("foreground", "Foreground",
+                                           dpy, xgwa.colormap);
+    }
+  else
+    {
+#if 0
+      make_random_colormap (dpy, xgwa.visual, xgwa.colormap,
+                            colors, &ncolors, True, True, 0, True);
+#else
+      make_smooth_colormap (dpy, xgwa.visual, xgwa.colormap,
+                            colors, &ncolors, True, 0, True);
+#endif
+      if (ncolors < 2)
+        goto MONO;
+      else {
+       colors[0].pixel = get_pixel_resource("foreground", "Foreground",
+                                            dpy, xgwa.colormap);
+       colors[1].pixel = get_pixel_resource("background", "Background",
+                                            dpy, xgwa.colormap);
+      }
+    }
+  
+  
+  /* graphic context for curves */
+  gcv.foreground = colors[0].pixel;
+  gcv.background = colors[1].pixel;
+  gcv.line_width = params.curve_width;
+  gcv.cap_style=CapRound;
+  gc = XCreateGC (dpy, window, GCForeground|GCBackground|GCLineWidth|GCCapStyle, &gcv);
+  
+  /* graphic context for graphs */
+  gcv.foreground = colors[0].pixel;
+  gcv.background = colors[1].pixel;
+  gc_graph = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv);
+  
+  /* graphic context for shadows */
+  gcv.foreground = colors[1].pixel;
+  gcv.line_width = params.shadow_width;
+  gcv.cap_style=CapRound;
+  shadow_gc = XCreateGC(dpy, window, GCForeground|GCLineWidth|GCCapStyle, &gcv);
+  
+  /*=======================================================*/
+
+  for (;;) {
+
+    params.curve_width=random()%5+4;
+    params.shadow_width=params.curve_width+4;
+    params.shape1=(random()%20)/10.0 -1.0;
+    params.shape2=(random()%20)/10.0 -1.0;
+    params.edge_size=10*(random()%5)+20;
+    params.delay=get_integer_resource("delay", "Delay");
+    params.angle=random()%360*2*M_PI/360;
+    
+    switch (random()%4) {
+    case 0:
+      params.type=grid;
+      params.margin=(random()%30)*10;
+      break;
+    case 1:
+      params.type=kennicott;
+      params.edge_size=10*(random()%3)+50;
+      params.cluster_size=params.edge_size/(2+random()%3)-1;
+      params.margin=(random()%30)*10;
+      break;
+    case 2:
+      params.type=triangle;
+      params.margin=(random()%10)*10;
+      break;
+    case 3:
+      params.type=polar;
+      params.nb_orbits=2+random()%20;
+      params.nb_nodes_per_orbit=4+random()%20;
+      params.margin=(random()%10)*20-50;
+      break;
+    }
+    
+/*     params_to_s(stdout); */
+    
+    /*=======================================================*/
+    
+    
+    switch (params.type) {
+    case grid:
+      g=make_grid_graph(params.margin,params.margin,
+                       xgwa.width-2*params.margin, 
+                       xgwa.height-2*params.margin, 
+                       params.edge_size);
+      break;
+    case kennicott:
+      g=make_kennicott_graph(params.margin,params.margin,
+                            xgwa.width-2*params.margin, 
+                            xgwa.height-2*params.margin, 
+                            params.edge_size,
+                            params.cluster_size);
+      break;
+    case triangle:
+      g=make_triangle_graph(params.margin,params.margin,
+                           xgwa.width-2*params.margin, 
+                           xgwa.height-2*params.margin, 
+                           params.edge_size);
+      break;
+    case polar:
+      g=make_polar_graph(params.margin,params.margin,
+                        xgwa.width-2*params.margin, 
+                        xgwa.height-2*params.margin, 
+                        params.nb_nodes_per_orbit, 
+                        params.nb_orbits);
+      break;
+    default:
+      g=make_grid_graph(params.margin,params.margin,
+                       xgwa.width-2*params.margin, 
+                       xgwa.height-2*params.margin, 
+                       params.edge_size);
+      break;
+    }
+
+    graph_rotate(g,params.angle,xgwa.width/2,xgwa.height/2);
+    
+    if (showGraph)
+      graph_draw(g);
+    
+    p=pattern_new(g,ncolors, params.shape1, params.shape2);
+    pattern_make_curves(p);
+    pattern_animate(p,params.delay);
+    
+    {
+      int d2 = get_integer_resource("delay2", "Delay2");
+      int i;
+      for (i = 0; i < d2; i++) {
+        XSync (dpy, False);
+        screenhack_handle_events (dpy);
+        sleep(1);
+      }
+    }
+
+    pattern_del(p);
+    graph_del(g);
+
+   erase_full_window(dpy,window);
+
+   /* recolor each time */
+   {
+     int ncolors = get_integer_resource ("ncolors", "Integer");
+     if (ncolors > 2)
+       make_smooth_colormap (dpy, xgwa.visual, xgwa.colormap,
+                             colors, &ncolors, True, 0, True);
+   }
+
+  }
+}
diff --git a/hacks/celtic.man b/hacks/celtic.man
new file mode 100644 (file)
index 0000000..7f564fa
--- /dev/null
@@ -0,0 +1,60 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+celtic - draws celtic cross-stich patterns
+.SH SYNOPSIS
+.B ifs
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-delay2 \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-graph \fImode\fP]
+.SH DESCRIPTION
+The \fIceltic\fP program repeatedly draws random cross-stitch patterns.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 10000.
+.TP 8
+.B \-delay2 \fInumber\fP
+Delay between patterns, in seconds.  Default: 5.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of colours to use. Default: 20.
+.TP 8
+.B \-graph
+Whether to render the underlying graph.  Default: no.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Max Froumentin.  Permission to use, copy, modify, 
+distribute, and sell this software and its documentation for any purpose is 
+hereby granted without fee, provided that the above copyright notice appear 
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Max Froumentin <max@lapin-bleu.net>
index 5c9cdb2ee4b6712e471b093a7b008511fae80a94..87ed98677cb16a3c12c19a5d05b1c4b0a7d19c1d 100644 (file)
@@ -17,6 +17,7 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES-DEFAULT.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUMPS.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CCURVE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CELTIC.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CLOUDLIFE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) COMPASS.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CORAL.C
index 5c9cdb2ee4b6712e471b093a7b008511fae80a94..87ed98677cb16a3c12c19a5d05b1c4b0a7d19c1d 100644 (file)
@@ -17,6 +17,7 @@ $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES-DEFAULT.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUMPS.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CCURVE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CELTIC.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CLOUDLIFE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) COMPASS.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CORAL.C
index ce3626ffec88bd96afb12234e90182dd367fa6b9..955f5c1a35e0ca51f1373315fbdc9a29c06654e4 100644 (file)
@@ -4,8 +4,8 @@
             a screen saver and locker for the X window system
                             by Jamie Zawinski
 
-                              version 4.22
-                               22-Jun-2005
+                              version 4.23
+                               21-Oct-2005
 
                      http://www.jwz.org/xscreensaver/
 
@@ -60,11 +60,11 @@ The tags and parameters used here are:
         into the command line (that's what makes it the default.)
         For example:
 
-           <boolean "foo" arg_set="-foo">
+           <boolean _label="foo" arg-set="-foo" />
 
         or if "foo" is the default, and must be explicity turned off,
 
-           <boolean "foo" arg_unset="-no-foo">
+           <boolean _label="foo" arg-unset="-no-foo" />
 
 -----------------------------------------------------------------------
 
@@ -131,9 +131,9 @@ The tags and parameters used here are:
 
         This creates a selection popup menu.
 
-        Options should have _arg-set (_arg-unset is not used here.)
+        Options should have arg-set (arg-unset is not used here.)
 
-        One of the menu items (the default) should have no _arg-set.
+        One of the menu items (the default) should have no arg-set.
 
 -----------------------------------------------------------------------
 
@@ -154,6 +154,37 @@ The tags and parameters used here are:
         This creates a file entry field (a text field with a "Browse"
         button next to it.)
 
+-----------------------------------------------------------------------
+
+  <hgroup>
+    [ ... <boolean>s ... ]
+    [ ... <number>s ... ]
+    [ ... <select>s ... ]
+    [ ... <string>s ... ]
+    [ ... <file>s ... ]
+    [ ... <vgroup>s ... ]
+  </hgroup>
+
+        A horizontal group of widgets/groups.  No more than 4 widgets 
+        or groups should be used in a row.
+
+-----------------------------------------------------------------------
+
+  <vgroup>
+    [ ... <boolean>s ... ]
+    [ ... <number>s ... ]
+    [ ... <select>s ... ]
+    [ ... <string>s ... ]
+    [ ... <file>s ... ]
+    [ ... <hgroup>s ... ]
+  </vgroup>
+
+        A vertical group of widgets/groups.  No more than 10 widgets 
+        or groups should be used in a column.
+        
+        Since the default alignment of widgets is a column, the 
+        <vgroup> element is only of use inside an <hgroup> element.
+
 -----------------------------------------------------------------------
 
   <_description>
@@ -169,3 +200,8 @@ The tags and parameters used here are:
         entities are allowed; HTML (and other markup) is not.
 
 -----------------------------------------------------------------------
+
+If you are DTD-minded, you may also find the included files "xss.dtd"
+and "xss.xsd" useful.
+
+-----------------------------------------------------------------------
index 36499dfcf838ce91fa52f32a40b1fc9ed67666fb..86a38127f4826f9496824028bd6c5673d616692b 100644 (file)
 
   <select id="neighbors">
     <option id="rand" _label="Random Cell Shape"/>
-    <option id="three" _label="Three Sided Cells" 
+    <option id="three" _label="Three Sided Cells"
             arg-set="-neighbors 3"/>
     <option id="four" _label="Four Sided Cells"
             arg-set="-neighbors 4"/>
-    <option id="six" _label="Six Sided Cells" enable="sharpturn"
+    <option id="six" _label="Six Sided Cells"
             arg-set="-neighbors 6"/>
     <option id="nine" _label="Nine Sided Cells"
             arg-set="-neighbors 9"/>
-    <option id="twelve" _label="Twelve Sided Cells" enable="sharpturn"
+    <option id="twelve" _label="Twelve Sided Cells"
             arg-set="-neighbors 12"/>
   </select>
 
index f3eda0950fb84197a6e81da15f7867df5244a165..f4882e3aae3963f21d01cb61a55cfb9af2cf64a3 100644 (file)
           _label="Motion Speed" _low-label="Slow" _high-label="Fast"
           low="0.001" high="4.0" default="0.5"/>
 
+  <number id="balls" type="slider" arg="-balls %"
+          _label="Number of Balls" _low-label="Few" _high-label="Lots"
+          low="3" high="40" default="10"/>
+
+  <number id="ballsize" type="slider" arg="-ballsize %"
+          _label="Ball Size" _low-label="Tiny" _high-label="Huge"
+          low="1.0" high="5.0" default="3.0"/>
+
+  <number id="explosion" type="slider" arg="-explosion %"
+          _label="Explosion Force" _low-label="Popcorn" _high-label="Nuke"
+          low="1.0" high="50.0" default="25.0"/>
+
   <hgroup>
    <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
    <boolean id="wire"    _label="Wireframe" arg-set="-wireframe"/>
diff --git a/hacks/config/celtic.xml b/hacks/config/celtic.xml
new file mode 100644 (file)
index 0000000..7380d46
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="celtic" _label="Celtic">
+
+  <command arg="-root"/>
+
+  <number id="delay" type="slider" arg="-delay %"
+          _label="Speed" _low-label="Slow" _high-label="Fast"
+          low="0" high="50000" default="10000"
+          convert="invert"/>
+
+  <number id="delay" type="slider" arg="-delay2 %"
+          _label="Pause" _low-label="Short" _high-label="Long"
+          low="0" high="10" default="5"/>
+
+  <boolean id="graph" _label="Draw Graph" arg-set="-graph"/>
+
+  <_description>
+Repeatedly draws random Celtic cross-stitch patterns.
+By Max Froumentin.
+  </_description>
+</screensaver>
index 90954fc3b145203a8b09cc771bbc03e1971a172f..87a45bad569539f64cf90953dbbe61734173a392 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <screensaver name="cosmos" _label="Cosmos">
 
-  <fullcommand arg="-root"/>
+  <command arg="-root"/>
 
   <_description>
 Draws fireworks and zooming, fading flares.  By Tom Campbell. 
diff --git a/hacks/config/cube21.xml b/hacks/config/cube21.xml
new file mode 100644 (file)
index 0000000..0e250f6
--- /dev/null
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="cube21" _label="Cube 21">
+
+  <command arg="-root"/>
+
+  <number id="cubesize" type="slider" arg="-cubesize %"
+    _label="Cube size" _low-label="Small" _high-label="Large"
+    low="0.4" high="1.0" default="0.7"/>  
+
+  <number id="speed" type="slider" arg="-delay %"
+    _label="Global speed" _low-label="Slow" _high-label="Fast"
+    low="0" high="30000" default="20000" convert="invert"/>
+
+  <number id="rotspeed" type="slider" arg="-rotspeed %"
+    _label="Rotation" _low-label="Slow" _high-label="Fast"
+    low="1.0" high="10.0" default="3.0"/>
+
+  <number id="wanderspeed" type="slider" arg="-wanderspeed %"
+    _label="Wandering" _low-label="Slow" _high-label="Fast"
+    low="0.3" high="3.0" default="1.0"/>  
+
+  <number id="spinspeed" type="slider" arg="-spinspeed %"
+    _label="Spinning" _low-label="Slow" _high-label="Fast"
+    low="0.5" high="4.0" default="1.0"/>  
+
+  <number id="wait" type="slider" arg="-wait %"
+    _label="Delay in ending position" _low-label="Short" _high-label="Long"
+    low="10.0" high="100.0" default="40.0"/>
+
+  <select id="render">
+    <option id="solid" _label="Textured"/>
+    <option id="notex" _label="Untextured" arg-set="-no-texture"/>
+    <option id="wire"  _label="Wireframe" arg-set="-wireframe"/>
+  </select>
+
+  <select id="start">
+    <option id="cube"    _label="Start as cube" arg-set="-no-randomize"/>
+    <option id="shuffle" _label="Start as random shape"/>
+  </select>
+
+  <select id="colors">
+    <option id="white" _label="White"/>
+    <option id="one"   _label="Random color" arg-set="-colormode rnd"/>
+    <option id="se"    _label="Silver Edition" arg-set="-colormode se"/>
+    <option id="two"   _label="Two random colors" arg-set="-colormode two"/>
+    <option id="ce"    _label="Classic Edition" arg-set="-colormode ce"/>
+    <option id="six"   _label="Six random colors" arg-set="-colormode six"/>
+  </select>
+  
+  <boolean id="spin" _label="Spin" arg-unset="-no-spin"/>
+
+  <boolean id="wander" _label="Wander on screen" arg-unset="-no-wander"/>
+
+  <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
+
+  <_description>
+Animates a Rubik-like puzzle known as Cube 21 or Square-1.
+The rotations are chosen randomly.  Requires OpenGL.
+
+Written by Vasek Potocek.
+  </_description>
+</screensaver>
diff --git a/hacks/config/glhanoi.xml b/hacks/config/glhanoi.xml
new file mode 100644 (file)
index 0000000..ec3bb83
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+                                                                                
+<screensaver name="glhanoi" _label="GLHanoi">
+
+       <command arg="-root"/>
+       
+       <number id="count" type="spinbutton" arg="-count %"
+         _label="Number of Disks" default="7" low="2" high="200"/>
+       
+       <boolean id="fog" _label="Enable fog" arg-set="-fog"/>
+
+       <boolean id="wire" _label="Wireframe" arg-set="-wire"/>
+
+       <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
+
+       <boolean id="lighting" _label="Enable lighting" arg-unset="-no-light"/>
+
+       <number id="delay" type="slider" arg="-delay %"
+         _label="Frame Delay (us)" _low-label="Slow" _high-label="Fast"
+          low="0" high="80000" default="40000" convert="invert"/>
+       
+       <_description>
+Solves the Towers of Hanoi puzzle. Move N disks from one pole to another, one disk at a time, with no disk ever resting on a disk smaller than itself.
+Written by Dave Atkinson.
+       </_description>
+</screensaver>
index 4dfeb459215fa15c3d923ac4ff7e152eb8c49fae..fad730f9b579f29f787b16795ca649b9626d8bd7 100644 (file)
     <vgroup>
       <number id="xw" type="slider" arg="-xw %"
               _label="XW Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="0"/>
+              low="0" high="20" default="0"/>
       <number id="xy" type="slider" arg="-xy %"
               _label="XY Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="3"/>
+              low="0" high="20" default="3"/>
       <number id="xz" type="slider" arg="-xz %"
               _label="XZ Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="5"/>
+              low="0" high="20" default="5"/>
     </vgroup>
     <vgroup>
       <number id="yw" type="slider" arg="-yw %"
               _label="YW Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="10"/>
+              low="0" high="20" default="10"/>
       <number id="yz" type="slider" arg="-yz %"
               _label="YZ Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="0"/>
+              low="0" high="20" default="0"/>
       <number id="zw" type="slider" arg="-zw %"
               _label="ZW Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="0"/>
+              low="0" high="20" default="0"/>
     </vgroup>
   </hgroup>
 
   <_description>
 Hyperball is to hypercube as dodecahedron is to cube: this displays
 a 2D projection of the sequence of 3D objects which are the projections
-of the 4D analog to the dodecahedron.  Technically, it is a "120 cell 
+of the 4D analog to the dodecahedron.  Technically, it is a "120 cell
 polytope."  Written by Joe Keane.
 
 See also the "polytopes" hack for a more general version of this
index 3bed10940c59b7b3cb6458e25475d4b1573ca026..67a2f55800fec0fcbc384689400f72ab2a84e6d0 100644 (file)
     <vgroup>
       <number id="xw" type="slider" arg="-xw %"
               _label="XW Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="0"/>
+              low="0" high="20" default="0"/>
       <number id="xy" type="slider" arg="-xy %"
               _label="XY Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="3"/>
+              low="0" high="20" default="3"/>
       <number id="xz" type="slider" arg="-xz %"
               _label="XZ Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="5"/>
+              low="0" high="20" default="5"/>
     </vgroup>
     <vgroup>
       <number id="yw" type="slider" arg="-yw %"
               _label="YW Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="10"/>
+              low="0" high="20" default="10"/>
       <number id="yz" type="slider" arg="-yz %"
               _label="YZ Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="0"/>
+              low="0" high="20" default="0"/>
       <number id="zw" type="slider" arg="-zw %"
               _label="ZW Rotation" _low-label="Low" _high-label="High"
-              low="0" high="20" value="0"/>
+              low="0" high="20" default="0"/>
     </vgroup>
   </hgroup>
 
index 1dff4d646d0d55588dbfd2d702a74a5575bee1ad..76789cbe79deb4ba5c28c826f53c31fdb2648fa3 100644 (file)
             arg-set="-solid"/>
     <option id="bands" _label="See-Through Bands"
             arg-set="-bands"/>
+    <option id="bands" _label="See-Through Spirals (1 Spiral)"
+            arg-set="-spirals-1"/>
+    <option id="bands" _label="See-Through Spirals (2 Spirals)"
+            arg-set="-spirals-2"/>
+    <option id="bands" _label="See-Through Spirals (4 Spirals)"
+            arg-set="-spirals-4"/>
+    <option id="bands" _label="See-Through Spirals (8 Spirals)"
+            arg-set="-spirals-8"/>
+    <option id="bands" _label="See-Through Spirals (16 Spirals)"
+            arg-set="-spirals-16"/>
   </select>
 
   <select id="colors">
index 71ace194d25125faf8258d7fa5f5a57e5d45c849..435de3d02bc2990ed5068746935f8c4835f063ff 100644 (file)
@@ -7,7 +7,7 @@
   <number id="init" type="spinbutton" arg="-num-discs %"
           _label="Number of Discs" low="50" high="400" default="85"/>
 
-  <number id="speed" type="slider" arg="-draw-delay %"
+  <number id="speed" type="slider" arg="-growth-delay %"
           _label="Speed" _low-label="Slow" _high-label="Fast"
           low="0" high="60000" default="30000" convert="invert"/>
 
index 9cbab3667e9046c12d8e4377464c59a94152a6e9..4e5a9c82725443f9200cc6094719cfc14004b615 100644 (file)
   <boolean id="wireframe" _label="Wireframe" arg-set="-wireframe"/>
 
   <select id="color">
-   <option id="cycle"     _label="Cycle" arg-set=""/>
+   <option id="cycle"     _label="Cycle" />
    <option id="flowerbox" _label="Flower box" arg-set="-color flowerbox"/>
    <option id="clownbarf" _label="Clown barf" arg-set="-color clownbarf"/>
    <option id="chrome" _label="Chrome" arg-set="-color chrome"/>
   </select>
 
   <select id="start">
-   <option id="sphere" _label="Sphere" arg-set=""/>
+   <option id="sphere" _label="Sphere" />
    <option id="tetrahedron" _label="Tetrahedron" arg-set="-tetra"/>
   </select>
 
diff --git a/hacks/config/juggler3d.xml b/hacks/config/juggler3d.xml
new file mode 100644 (file)
index 0000000..b2822ba
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="juggler3d" _label="Juggler3D">
+  <command arg="-root"/>
+
+       <number id="speed" type="slider" arg="-speed %" _label="Juggling Speed"
+               _low-label="Slow" _high-label="Fast" low="0.5" high="5.0" default="2.2"/>
+                 
+       <number id="trans" type="slider" arg="-trans %" _label="Juggler Horizontal Speed"
+               _low-label="Slow" _high-label="Fast" low="0.05" high="2.0" default="0.1"/>
+
+       <number id="spin" type="slider" arg="-spin %" _label="Juggler Spin Speed"
+               _low-label="Slow" _high-label="Fast" low="3.0" high="50.0" default="20.0"/>
+
+       <number id="minobjs" type="spinbutton" arg="-minobjs %" _label="Min Objects"
+          low="3" high="35" default="8"/>
+
+       <number id="maxobjs" type="spinbutton" arg="-maxobjs %" _label="Max Objects"
+          low="3" high="35" default="8"/>                
+
+       <number id="minhinc" type="spinbutton" arg="-minhinc %" _label="Min Height"
+          low="1" high="31" default="2"/>
+                 
+       <number id="maxhinc" type="spinbutton" arg="-maxhinc %" _label="Max Height"
+          low="1" high="31" default="6"/>                
+
+       <boolean id="wire"   _label="Wireframe" arg-set="-wireframe"/>
+       <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
+
+       <_description>
+3D simulation of a juggler performing with balls, clubs and rings.  Written
+by Brian Apps and partially based on his Win32 Juggle Saver program.
+       </_description>
+</screensaver>
index f6f84961256645fe2d171d75c8901c3d6f99b938..febe66a78c7749c5f3bc92912b6b691f040d96a1 100644 (file)
 
   <select id="object">
 <option id="random" _label="Display Random Polyhedron"/>
-<option id="" _label="Pentagonal Prism" arg-set="-which pentagonal_prism"/>
-<option id="" _label="Pentagonal Dipyramid" arg-set="-which pentagonal_dipyramid"/>
-<option id="" _label="Pentagonal Antiprism" arg-set="-which pentagonal_antiprism"/>
-<option id="" _label="Pentagonal Deltohedron" arg-set="-which pentagonal_deltohedron"/>
-<option id="" _label="Pentagrammic Prism" arg-set="-which pentagrammic_prism"/>
-<option id="" _label="Pentagrammic Dipyramid" arg-set="-which pentagrammic_dipyramid"/>
-<option id="" _label="Pentagrammic Antiprism" arg-set="-which pentagrammic_antiprism"/>
-<option id="" _label="Pentagrammic Deltohedron" arg-set="-which pentagrammic_deltohedron"/>
-<option id="" _label="Pentagrammic Crossed Antiprism" arg-set="-which pentagrammic_crossed_antiprism"/>
-<option id="" _label="Pentagrammic Concave Deltohedron" arg-set="-which pentagrammic_concave_deltohedron"/>
-<option id="" _label="Tetrahedron" arg-set="-which tetrahedron"/>
-<option id="" _label="Truncated Tetrahedron" arg-set="-which truncated_tetrahedron"/>
-<option id="" _label="Triakistetrahedron" arg-set="-which triakistetrahedron"/>
-<option id="" _label="Octahemioctahedron" arg-set="-which octahemioctahedron"/>
-<option id="" _label="Octahemioctacron" arg-set="-which octahemioctacron"/>
-<option id="" _label="Tetrahemihexahedron" arg-set="-which tetrahemihexahedron"/>
-<option id="" _label="Tetrahemihexacron" arg-set="-which tetrahemihexacron"/>
-<option id="" _label="Octahedron" arg-set="-which octahedron"/>
-<option id="" _label="Cube" arg-set="-which cube"/>
-<option id="" _label="Cuboctahedron" arg-set="-which cuboctahedron"/>
-<option id="" _label="Rhombic Dodecahedron" arg-set="-which rhombic_dodecahedron"/>
-<option id="" _label="Truncated Octahedron" arg-set="-which truncated_octahedron"/>
-<option id="" _label="Tetrakishexahedron" arg-set="-which tetrakishexahedron"/>
-<option id="" _label="Truncated Cube" arg-set="-which truncated_cube"/>
-<option id="" _label="Triakisoctahedron" arg-set="-which triakisoctahedron"/>
-<option id="" _label="Rhombicuboctahedron" arg-set="-which rhombicuboctahedron"/>
-<option id="" _label="Deltoidal Icositetrahedron" arg-set="-which deltoidal_icositetrahedron"/>
-<option id="" _label="Truncated Cuboctahedron" arg-set="-which truncated_cuboctahedron"/>
-<option id="" _label="Disdyakisdodecahedron" arg-set="-which disdyakisdodecahedron"/>
-<option id="" _label="Snub Cube" arg-set="-which snub_cube"/>
-<option id="" _label="Pentagonal Icositetrahedron" arg-set="-which pentagonal_icositetrahedron"/>
-<option id="" _label="Small Cubicuboctahedron" arg-set="-which small_cubicuboctahedron"/>
-<option id="" _label="Small Hexacronic Icositetrahedron" arg-set="-which small_hexacronic_icositetrahedron"/>
-<option id="" _label="Great Cubicuboctahedron" arg-set="-which great_cubicuboctahedron"/>
-<option id="" _label="Great Hexacronic Icositetrahedron" arg-set="-which great_hexacronic_icositetrahedron"/>
-<option id="" _label="Cubohemioctahedron" arg-set="-which cubohemioctahedron"/>
-<option id="" _label="Hexahemioctacron" arg-set="-which hexahemioctacron"/>
-<option id="" _label="Cubitruncated Cuboctahedron" arg-set="-which cubitruncated_cuboctahedron"/>
-<option id="" _label="Tetradyakishexahedron" arg-set="-which tetradyakishexahedron"/>
-<option id="" _label="Great Rhombicuboctahedron" arg-set="-which great_rhombicuboctahedron"/>
-<option id="" _label="Great Deltoidal Icositetrahedron" arg-set="-which great_deltoidal_icositetrahedron"/>
-<option id="" _label="Small Rhombihexahedron" arg-set="-which small_rhombihexahedron"/>
-<option id="" _label="Small Rhombihexacron" arg-set="-which small_rhombihexacron"/>
-<option id="" _label="Stellated Truncated Hexahedron" arg-set="-which stellated_truncated_hexahedron"/>
-<option id="" _label="Great Triakisoctahedron" arg-set="-which great_triakisoctahedron"/>
-<option id="" _label="Great Truncated Cuboctahedron" arg-set="-which great_truncated_cuboctahedron"/>
-<option id="" _label="Great Disdyakisdodecahedron" arg-set="-which great_disdyakisdodecahedron"/>
-<option id="" _label="Great Rhombihexahedron" arg-set="-which great_rhombihexahedron"/>
-<option id="" _label="Great Rhombihexacron" arg-set="-which great_rhombihexacron"/>
-<option id="" _label="Icosahedron" arg-set="-which icosahedron"/>
-<option id="" _label="Dodecahedron" arg-set="-which dodecahedron"/>
-<option id="" _label="Icosidodecahedron" arg-set="-which icosidodecahedron"/>
-<option id="" _label="Rhombic Triacontahedron" arg-set="-which rhombic_triacontahedron"/>
-<option id="" _label="Truncated Icosahedron" arg-set="-which truncated_icosahedron"/>
-<option id="" _label="Pentakisdodecahedron" arg-set="-which pentakisdodecahedron"/>
-<option id="" _label="Truncated Dodecahedron" arg-set="-which truncated_dodecahedron"/>
-<option id="" _label="Triakisicosahedron" arg-set="-which triakisicosahedron"/>
-<option id="" _label="Rhombicosidodecahedron" arg-set="-which rhombicosidodecahedron"/>
-<option id="" _label="Deltoidal Hexecontahedron" arg-set="-which deltoidal_hexecontahedron"/>
-<option id="" _label="Truncated Icosidodechedon" arg-set="-which truncated_icosidodechedon"/>
-<option id="" _label="Disdyakistriacontahedron" arg-set="-which disdyakistriacontahedron"/>
-<option id="" _label="Snub Dodecahedron" arg-set="-which snub_dodecahedron"/>
-<option id="" _label="Pentagonal Hexecontahedron" arg-set="-which pentagonal_hexecontahedron"/>
-<option id="" _label="Small Ditrigonal Icosidodecahedron" arg-set="-which small_ditrigonal_icosidodecahedron"/>
-<option id="" _label="Small Triambic Icosahedron" arg-set="-which small_triambic_icosahedron"/>
-<option id="" _label="Small Icosicosidodecahedron" arg-set="-which small_icosicosidodecahedron"/>
-<option id="" _label="Small Icosacronic Hexecontahedron" arg-set="-which small_icosacronic_hexecontahedron"/>
-<option id="" _label="Small Snub Icosicosidodecahedron" arg-set="-which small_snub_icosicosidodecahedron"/>
-<option id="" _label="Small Hexagonal Hexecontahedron" arg-set="-which small_hexagonal_hexecontahedron"/>
-<option id="" _label="Small Dodecicosidodecahedron" arg-set="-which small_dodecicosidodecahedron"/>
-<option id="" _label="Small Dodecacronic Hexecontahedron" arg-set="-which small_dodecacronic_hexecontahedron"/>
-<option id="" _label="Small Stellated Dodecahedron" arg-set="-which small_stellated_dodecahedron"/>
-<option id="" _label="Great Dodecahedron" arg-set="-which great_dodecahedron"/>
-<option id="" _label="Great Dodecadodecahedron" arg-set="-which great_dodecadodecahedron"/>
-<option id="" _label="Medial Rhombic Triacontahedron" arg-set="-which medial_rhombic_triacontahedron"/>
-<option id="" _label="Truncated Great Dodecahedron" arg-set="-which truncated_great_dodecahedron"/>
-<option id="" _label="Small Stellapentakisdodecahedron" arg-set="-which small_stellapentakisdodecahedron"/>
-<option id="" _label="Rhombidodecadodecahedron" arg-set="-which rhombidodecadodecahedron"/>
-<option id="" _label="Medial Deltoidal Hexecontahedron" arg-set="-which medial_deltoidal_hexecontahedron"/>
-<option id="" _label="Small Rhombidodecahedron" arg-set="-which small_rhombidodecahedron"/>
-<option id="" _label="Small Rhombidodecacron" arg-set="-which small_rhombidodecacron"/>
-<option id="" _label="Snub Dodecadodecahedron" arg-set="-which snub_dodecadodecahedron"/>
-<option id="" _label="Medial Pentagonal Hexecontahedron" arg-set="-which medial_pentagonal_hexecontahedron"/>
-<option id="" _label="Ditrigonal Dodecadodecahedron" arg-set="-which ditrigonal_dodecadodecahedron"/>
-<option id="" _label="Medial Triambic Icosahedron" arg-set="-which medial_triambic_icosahedron"/>
-<option id="" _label="Great Ditrigonal Dodecicosidodecahedron" arg-set="-which great_ditrigonal_dodecicosidodecahedron"/>
-<option id="" _label="Great Ditrigonal Dodecacronic Hexecontahedron" arg-set="-which great_ditrigonal_dodecacronic_hexecontahedron"/>
-<option id="" _label="Small Ditrigonal Dodecicosidodecahedron" arg-set="-which small_ditrigonal_dodecicosidodecahedron"/>
-<option id="" _label="Small Ditrigonal Dodecacronic Hexecontahedron" arg-set="-which small_ditrigonal_dodecacronic_hexecontahedron"/>
-<option id="" _label="Icosidodecadodecahedron" arg-set="-which icosidodecadodecahedron"/>
-<option id="" _label="Medial Icosacronic Hexecontahedron" arg-set="-which medial_icosacronic_hexecontahedron"/>
-<option id="" _label="Icositruncated Dodecadodecahedron" arg-set="-which icositruncated_dodecadodecahedron"/>
-<option id="" _label="Tridyakisicosahedron" arg-set="-which tridyakisicosahedron"/>
-<option id="" _label="Snub Icosidodecadodecahedron" arg-set="-which snub_icosidodecadodecahedron"/>
-<option id="" _label="Medial Hexagonal Hexecontahedron" arg-set="-which medial_hexagonal_hexecontahedron"/>
-<option id="" _label="Great Ditrigonal Icosidodecahedron" arg-set="-which great_ditrigonal_icosidodecahedron"/>
-<option id="" _label="Great Triambic Icosahedron" arg-set="-which great_triambic_icosahedron"/>
-<option id="" _label="Great Icosicosidodecahedron" arg-set="-which great_icosicosidodecahedron"/>
-<option id="" _label="Great Icosacronic Hexecontahedron" arg-set="-which great_icosacronic_hexecontahedron"/>
-<option id="" _label="Small Icosihemidodecahedron" arg-set="-which small_icosihemidodecahedron"/>
-<option id="" _label="Small Icosihemidodecacron" arg-set="-which small_icosihemidodecacron"/>
-<option id="" _label="Small Dodecicosahedron" arg-set="-which small_dodecicosahedron"/>
-<option id="" _label="Small Dodecicosacron" arg-set="-which small_dodecicosacron"/>
-<option id="" _label="Small Dodecahemidodecahedron" arg-set="-which small_dodecahemidodecahedron"/>
-<option id="" _label="Small Dodecahemidodecacron" arg-set="-which small_dodecahemidodecacron"/>
-<option id="" _label="Great Stellated Dodecahedron" arg-set="-which great_stellated_dodecahedron"/>
-<option id="" _label="Great Icosahedron" arg-set="-which great_icosahedron"/>
-<option id="" _label="Great Icosidodecahedron" arg-set="-which great_icosidodecahedron"/>
-<option id="" _label="Great Rhombic Triacontahedron" arg-set="-which great_rhombic_triacontahedron"/>
-<option id="" _label="Great Truncated Icosahedron" arg-set="-which great_truncated_icosahedron"/>
-<option id="" _label="Great Stellapentakisdodecahedron" arg-set="-which great_stellapentakisdodecahedron"/>
-<option id="" _label="Rhombicosahedron" arg-set="-which rhombicosahedron"/>
-<option id="" _label="Rhombicosacron" arg-set="-which rhombicosacron"/>
-<option id="" _label="Great Snub Icosidodecahedron" arg-set="-which great_snub_icosidodecahedron"/>
-<option id="" _label="Great Pentagonal Hexecontahedron" arg-set="-which great_pentagonal_hexecontahedron"/>
-<option id="" _label="Small Stellated Truncated Dodecahedron" arg-set="-which small_stellated_truncated_dodecahedron"/>
-<option id="" _label="Great Pentakisdodekahedron" arg-set="-which great_pentakisdodekahedron"/>
-<option id="" _label="Truncated Dodecadodecahedron" arg-set="-which truncated_dodecadodecahedron"/>
-<option id="" _label="Medial Disdyakistriacontahedron" arg-set="-which medial_disdyakistriacontahedron"/>
-<option id="" _label="Inverted Snub Dodecadodecahedron" arg-set="-which inverted_snub_dodecadodecahedron"/>
-<option id="" _label="Medial Inverted Pentagonal Hexecontahedron" arg-set="-which medial_inverted_pentagonal_hexecontahedron"/>
-<option id="" _label="Great Dodecicosidodecahedron" arg-set="-which great_dodecicosidodecahedron"/>
-<option id="" _label="Great Dodecacronic Hexecontahedron" arg-set="-which great_dodecacronic_hexecontahedron"/>
-<option id="" _label="Small Dodecahemicosahedron" arg-set="-which small_dodecahemicosahedron"/>
-<option id="" _label="Small Dodecahemicosacron" arg-set="-which small_dodecahemicosacron"/>
-<option id="" _label="Great Dodecicosahedron" arg-set="-which great_dodecicosahedron"/>
-<option id="" _label="Great Dodecicosacron" arg-set="-which great_dodecicosacron"/>
-<option id="" _label="Great Snub Dodecicosidodecahedron" arg-set="-which great_snub_dodecicosidodecahedron"/>
-<option id="" _label="Great Hexagonal Hexecontahedron" arg-set="-which great_hexagonal_hexecontahedron"/>
-<option id="" _label="Great Dodecahemicosahedron" arg-set="-which great_dodecahemicosahedron"/>
-<option id="" _label="Great Dodecahemicosacron" arg-set="-which great_dodecahemicosacron"/>
-<option id="" _label="Great Stellated Truncated Dodecahedron" arg-set="-which great_stellated_truncated_dodecahedron"/>
-<option id="" _label="Great Triakisicosahedron" arg-set="-which great_triakisicosahedron"/>
-<option id="" _label="Great Rhombicosidodecahedron" arg-set="-which great_rhombicosidodecahedron"/>
-<option id="" _label="Great Deltoidal Hexecontahedron" arg-set="-which great_deltoidal_hexecontahedron"/>
-<option id="" _label="Great Truncated Icosidodecahedron" arg-set="-which great_truncated_icosidodecahedron"/>
-<option id="" _label="Great Disdyakistriacontahedron" arg-set="-which great_disdyakistriacontahedron"/>
-<option id="" _label="Great Inverted Snub Icosidodecahedron" arg-set="-which great_inverted_snub_icosidodecahedron"/>
-<option id="" _label="Great Inverted Pentagonal Hexecontahedron" arg-set="-which great_inverted_pentagonal_hexecontahedron"/>
-<option id="" _label="Great Dodecahemidodecahedron" arg-set="-which great_dodecahemidodecahedron"/>
-<option id="" _label="Great Dodecahemidodecacron" arg-set="-which great_dodecahemidodecacron"/>
-<option id="" _label="Great Icosihemidodecahedron" arg-set="-which great_icosihemidodecahedron"/>
-<option id="" _label="Great Icosihemidodecacron" arg-set="-which great_icosihemidodecacron"/>
-<option id="" _label="Small Retrosnub Icosicosidodecahedron" arg-set="-which small_retrosnub_icosicosidodecahedron"/>
-<option id="" _label="Small Hexagrammic Hexecontahedron" arg-set="-which small_hexagrammic_hexecontahedron"/>
-<option id="" _label="Great Rhombidodecahedron" arg-set="-which great_rhombidodecahedron"/>
-<option id="" _label="Great Rhombidodecacron" arg-set="-which great_rhombidodecacron"/>
-<option id="" _label="Great Retrosnub Icosidodecahedron" arg-set="-which great_retrosnub_icosidodecahedron"/>
-<option id="" _label="Great Pentagrammic Hexecontahedron" arg-set="-which great_pentagrammic_hexecontahedron"/>
-<option id="" _label="Great Dirhombicosidodecahedron" arg-set="-which great_dirhombicosidodecahedron"/>
-<option id="" _label="Great Dirhombicosidodecacron" arg-set="-which great_dirhombicosidodecacron"/>
+<option _label="Pentagonal Prism" arg-set="-which pentagonal_prism"/>
+<option _label="Pentagonal Dipyramid" arg-set="-which pentagonal_dipyramid"/>
+<option _label="Pentagonal Antiprism" arg-set="-which pentagonal_antiprism"/>
+<option _label="Pentagonal Deltohedron" arg-set="-which pentagonal_deltohedron"/>
+<option _label="Pentagrammic Prism" arg-set="-which pentagrammic_prism"/>
+<option _label="Pentagrammic Dipyramid" arg-set="-which pentagrammic_dipyramid"/>
+<option _label="Pentagrammic Antiprism" arg-set="-which pentagrammic_antiprism"/>
+<option _label="Pentagrammic Deltohedron" arg-set="-which pentagrammic_deltohedron"/>
+<option _label="Pentagrammic Crossed Antiprism" arg-set="-which pentagrammic_crossed_antiprism"/>
+<option _label="Pentagrammic Concave Deltohedron" arg-set="-which pentagrammic_concave_deltohedron"/>
+<option _label="Tetrahedron" arg-set="-which tetrahedron"/>
+<option _label="Truncated Tetrahedron" arg-set="-which truncated_tetrahedron"/>
+<option _label="Triakistetrahedron" arg-set="-which triakistetrahedron"/>
+<option _label="Octahemioctahedron" arg-set="-which octahemioctahedron"/>
+<option _label="Octahemioctacron" arg-set="-which octahemioctacron"/>
+<option _label="Tetrahemihexahedron" arg-set="-which tetrahemihexahedron"/>
+<option _label="Tetrahemihexacron" arg-set="-which tetrahemihexacron"/>
+<option _label="Octahedron" arg-set="-which octahedron"/>
+<option _label="Cube" arg-set="-which cube"/>
+<option _label="Cuboctahedron" arg-set="-which cuboctahedron"/>
+<option _label="Rhombic Dodecahedron" arg-set="-which rhombic_dodecahedron"/>
+<option _label="Truncated Octahedron" arg-set="-which truncated_octahedron"/>
+<option _label="Tetrakishexahedron" arg-set="-which tetrakishexahedron"/>
+<option _label="Truncated Cube" arg-set="-which truncated_cube"/>
+<option _label="Triakisoctahedron" arg-set="-which triakisoctahedron"/>
+<option _label="Rhombicuboctahedron" arg-set="-which rhombicuboctahedron"/>
+<option _label="Deltoidal Icositetrahedron" arg-set="-which deltoidal_icositetrahedron"/>
+<option _label="Truncated Cuboctahedron" arg-set="-which truncated_cuboctahedron"/>
+<option _label="Disdyakisdodecahedron" arg-set="-which disdyakisdodecahedron"/>
+<option _label="Snub Cube" arg-set="-which snub_cube"/>
+<option _label="Pentagonal Icositetrahedron" arg-set="-which pentagonal_icositetrahedron"/>
+<option _label="Small Cubicuboctahedron" arg-set="-which small_cubicuboctahedron"/>
+<option _label="Small Hexacronic Icositetrahedron" arg-set="-which small_hexacronic_icositetrahedron"/>
+<option _label="Great Cubicuboctahedron" arg-set="-which great_cubicuboctahedron"/>
+<option _label="Great Hexacronic Icositetrahedron" arg-set="-which great_hexacronic_icositetrahedron"/>
+<option _label="Cubohemioctahedron" arg-set="-which cubohemioctahedron"/>
+<option _label="Hexahemioctacron" arg-set="-which hexahemioctacron"/>
+<option _label="Cubitruncated Cuboctahedron" arg-set="-which cubitruncated_cuboctahedron"/>
+<option _label="Tetradyakishexahedron" arg-set="-which tetradyakishexahedron"/>
+<option _label="Great Rhombicuboctahedron" arg-set="-which great_rhombicuboctahedron"/>
+<option _label="Great Deltoidal Icositetrahedron" arg-set="-which great_deltoidal_icositetrahedron"/>
+<option _label="Small Rhombihexahedron" arg-set="-which small_rhombihexahedron"/>
+<option _label="Small Rhombihexacron" arg-set="-which small_rhombihexacron"/>
+<option _label="Stellated Truncated Hexahedron" arg-set="-which stellated_truncated_hexahedron"/>
+<option _label="Great Triakisoctahedron" arg-set="-which great_triakisoctahedron"/>
+<option _label="Great Truncated Cuboctahedron" arg-set="-which great_truncated_cuboctahedron"/>
+<option _label="Great Disdyakisdodecahedron" arg-set="-which great_disdyakisdodecahedron"/>
+<option _label="Great Rhombihexahedron" arg-set="-which great_rhombihexahedron"/>
+<option _label="Great Rhombihexacron" arg-set="-which great_rhombihexacron"/>
+<option _label="Icosahedron" arg-set="-which icosahedron"/>
+<option _label="Dodecahedron" arg-set="-which dodecahedron"/>
+<option _label="Icosidodecahedron" arg-set="-which icosidodecahedron"/>
+<option _label="Rhombic Triacontahedron" arg-set="-which rhombic_triacontahedron"/>
+<option _label="Truncated Icosahedron" arg-set="-which truncated_icosahedron"/>
+<option _label="Pentakisdodecahedron" arg-set="-which pentakisdodecahedron"/>
+<option _label="Truncated Dodecahedron" arg-set="-which truncated_dodecahedron"/>
+<option _label="Triakisicosahedron" arg-set="-which triakisicosahedron"/>
+<option _label="Rhombicosidodecahedron" arg-set="-which rhombicosidodecahedron"/>
+<option _label="Deltoidal Hexecontahedron" arg-set="-which deltoidal_hexecontahedron"/>
+<option _label="Truncated Icosidodechedon" arg-set="-which truncated_icosidodechedon"/>
+<option _label="Disdyakistriacontahedron" arg-set="-which disdyakistriacontahedron"/>
+<option _label="Snub Dodecahedron" arg-set="-which snub_dodecahedron"/>
+<option _label="Pentagonal Hexecontahedron" arg-set="-which pentagonal_hexecontahedron"/>
+<option _label="Small Ditrigonal Icosidodecahedron" arg-set="-which small_ditrigonal_icosidodecahedron"/>
+<option _label="Small Triambic Icosahedron" arg-set="-which small_triambic_icosahedron"/>
+<option _label="Small Icosicosidodecahedron" arg-set="-which small_icosicosidodecahedron"/>
+<option _label="Small Icosacronic Hexecontahedron" arg-set="-which small_icosacronic_hexecontahedron"/>
+<option _label="Small Snub Icosicosidodecahedron" arg-set="-which small_snub_icosicosidodecahedron"/>
+<option _label="Small Hexagonal Hexecontahedron" arg-set="-which small_hexagonal_hexecontahedron"/>
+<option _label="Small Dodecicosidodecahedron" arg-set="-which small_dodecicosidodecahedron"/>
+<option _label="Small Dodecacronic Hexecontahedron" arg-set="-which small_dodecacronic_hexecontahedron"/>
+<option _label="Small Stellated Dodecahedron" arg-set="-which small_stellated_dodecahedron"/>
+<option _label="Great Dodecahedron" arg-set="-which great_dodecahedron"/>
+<option _label="Great Dodecadodecahedron" arg-set="-which great_dodecadodecahedron"/>
+<option _label="Medial Rhombic Triacontahedron" arg-set="-which medial_rhombic_triacontahedron"/>
+<option _label="Truncated Great Dodecahedron" arg-set="-which truncated_great_dodecahedron"/>
+<option _label="Small Stellapentakisdodecahedron" arg-set="-which small_stellapentakisdodecahedron"/>
+<option _label="Rhombidodecadodecahedron" arg-set="-which rhombidodecadodecahedron"/>
+<option _label="Medial Deltoidal Hexecontahedron" arg-set="-which medial_deltoidal_hexecontahedron"/>
+<option _label="Small Rhombidodecahedron" arg-set="-which small_rhombidodecahedron"/>
+<option _label="Small Rhombidodecacron" arg-set="-which small_rhombidodecacron"/>
+<option _label="Snub Dodecadodecahedron" arg-set="-which snub_dodecadodecahedron"/>
+<option _label="Medial Pentagonal Hexecontahedron" arg-set="-which medial_pentagonal_hexecontahedron"/>
+<option _label="Ditrigonal Dodecadodecahedron" arg-set="-which ditrigonal_dodecadodecahedron"/>
+<option _label="Medial Triambic Icosahedron" arg-set="-which medial_triambic_icosahedron"/>
+<option _label="Great Ditrigonal Dodecicosidodecahedron" arg-set="-which great_ditrigonal_dodecicosidodecahedron"/>
+<option _label="Great Ditrigonal Dodecacronic Hexecontahedron" arg-set="-which great_ditrigonal_dodecacronic_hexecontahedron"/>
+<option _label="Small Ditrigonal Dodecicosidodecahedron" arg-set="-which small_ditrigonal_dodecicosidodecahedron"/>
+<option _label="Small Ditrigonal Dodecacronic Hexecontahedron" arg-set="-which small_ditrigonal_dodecacronic_hexecontahedron"/>
+<option _label="Icosidodecadodecahedron" arg-set="-which icosidodecadodecahedron"/>
+<option _label="Medial Icosacronic Hexecontahedron" arg-set="-which medial_icosacronic_hexecontahedron"/>
+<option _label="Icositruncated Dodecadodecahedron" arg-set="-which icositruncated_dodecadodecahedron"/>
+<option _label="Tridyakisicosahedron" arg-set="-which tridyakisicosahedron"/>
+<option _label="Snub Icosidodecadodecahedron" arg-set="-which snub_icosidodecadodecahedron"/>
+<option _label="Medial Hexagonal Hexecontahedron" arg-set="-which medial_hexagonal_hexecontahedron"/>
+<option _label="Great Ditrigonal Icosidodecahedron" arg-set="-which great_ditrigonal_icosidodecahedron"/>
+<option _label="Great Triambic Icosahedron" arg-set="-which great_triambic_icosahedron"/>
+<option _label="Great Icosicosidodecahedron" arg-set="-which great_icosicosidodecahedron"/>
+<option _label="Great Icosacronic Hexecontahedron" arg-set="-which great_icosacronic_hexecontahedron"/>
+<option _label="Small Icosihemidodecahedron" arg-set="-which small_icosihemidodecahedron"/>
+<option _label="Small Icosihemidodecacron" arg-set="-which small_icosihemidodecacron"/>
+<option _label="Small Dodecicosahedron" arg-set="-which small_dodecicosahedron"/>
+<option _label="Small Dodecicosacron" arg-set="-which small_dodecicosacron"/>
+<option _label="Small Dodecahemidodecahedron" arg-set="-which small_dodecahemidodecahedron"/>
+<option _label="Small Dodecahemidodecacron" arg-set="-which small_dodecahemidodecacron"/>
+<option _label="Great Stellated Dodecahedron" arg-set="-which great_stellated_dodecahedron"/>
+<option _label="Great Icosahedron" arg-set="-which great_icosahedron"/>
+<option _label="Great Icosidodecahedron" arg-set="-which great_icosidodecahedron"/>
+<option _label="Great Rhombic Triacontahedron" arg-set="-which great_rhombic_triacontahedron"/>
+<option _label="Great Truncated Icosahedron" arg-set="-which great_truncated_icosahedron"/>
+<option _label="Great Stellapentakisdodecahedron" arg-set="-which great_stellapentakisdodecahedron"/>
+<option _label="Rhombicosahedron" arg-set="-which rhombicosahedron"/>
+<option _label="Rhombicosacron" arg-set="-which rhombicosacron"/>
+<option _label="Great Snub Icosidodecahedron" arg-set="-which great_snub_icosidodecahedron"/>
+<option _label="Great Pentagonal Hexecontahedron" arg-set="-which great_pentagonal_hexecontahedron"/>
+<option _label="Small Stellated Truncated Dodecahedron" arg-set="-which small_stellated_truncated_dodecahedron"/>
+<option _label="Great Pentakisdodekahedron" arg-set="-which great_pentakisdodekahedron"/>
+<option _label="Truncated Dodecadodecahedron" arg-set="-which truncated_dodecadodecahedron"/>
+<option _label="Medial Disdyakistriacontahedron" arg-set="-which medial_disdyakistriacontahedron"/>
+<option _label="Inverted Snub Dodecadodecahedron" arg-set="-which inverted_snub_dodecadodecahedron"/>
+<option _label="Medial Inverted Pentagonal Hexecontahedron" arg-set="-which medial_inverted_pentagonal_hexecontahedron"/>
+<option _label="Great Dodecicosidodecahedron" arg-set="-which great_dodecicosidodecahedron"/>
+<option _label="Great Dodecacronic Hexecontahedron" arg-set="-which great_dodecacronic_hexecontahedron"/>
+<option _label="Small Dodecahemicosahedron" arg-set="-which small_dodecahemicosahedron"/>
+<option _label="Small Dodecahemicosacron" arg-set="-which small_dodecahemicosacron"/>
+<option _label="Great Dodecicosahedron" arg-set="-which great_dodecicosahedron"/>
+<option _label="Great Dodecicosacron" arg-set="-which great_dodecicosacron"/>
+<option _label="Great Snub Dodecicosidodecahedron" arg-set="-which great_snub_dodecicosidodecahedron"/>
+<option _label="Great Hexagonal Hexecontahedron" arg-set="-which great_hexagonal_hexecontahedron"/>
+<option _label="Great Dodecahemicosahedron" arg-set="-which great_dodecahemicosahedron"/>
+<option _label="Great Dodecahemicosacron" arg-set="-which great_dodecahemicosacron"/>
+<option _label="Great Stellated Truncated Dodecahedron" arg-set="-which great_stellated_truncated_dodecahedron"/>
+<option _label="Great Triakisicosahedron" arg-set="-which great_triakisicosahedron"/>
+<option _label="Great Rhombicosidodecahedron" arg-set="-which great_rhombicosidodecahedron"/>
+<option _label="Great Deltoidal Hexecontahedron" arg-set="-which great_deltoidal_hexecontahedron"/>
+<option _label="Great Truncated Icosidodecahedron" arg-set="-which great_truncated_icosidodecahedron"/>
+<option _label="Great Disdyakistriacontahedron" arg-set="-which great_disdyakistriacontahedron"/>
+<option _label="Great Inverted Snub Icosidodecahedron" arg-set="-which great_inverted_snub_icosidodecahedron"/>
+<option _label="Great Inverted Pentagonal Hexecontahedron" arg-set="-which great_inverted_pentagonal_hexecontahedron"/>
+<option _label="Great Dodecahemidodecahedron" arg-set="-which great_dodecahemidodecahedron"/>
+<option _label="Great Dodecahemidodecacron" arg-set="-which great_dodecahemidodecacron"/>
+<option _label="Great Icosihemidodecahedron" arg-set="-which great_icosihemidodecahedron"/>
+<option _label="Great Icosihemidodecacron" arg-set="-which great_icosihemidodecacron"/>
+<option _label="Small Retrosnub Icosicosidodecahedron" arg-set="-which small_retrosnub_icosicosidodecahedron"/>
+<option _label="Small Hexagrammic Hexecontahedron" arg-set="-which small_hexagrammic_hexecontahedron"/>
+<option _label="Great Rhombidodecahedron" arg-set="-which great_rhombidodecahedron"/>
+<option _label="Great Rhombidodecacron" arg-set="-which great_rhombidodecacron"/>
+<option _label="Great Retrosnub Icosidodecahedron" arg-set="-which great_retrosnub_icosidodecahedron"/>
+<option _label="Great Pentagrammic Hexecontahedron" arg-set="-which great_pentagrammic_hexecontahedron"/>
+<option _label="Great Dirhombicosidodecahedron" arg-set="-which great_dirhombicosidodecahedron"/>
+<option _label="Great Dirhombicosidodecacron" arg-set="-which great_dirhombicosidodecacron"/>
   </select>
 
 
 
   <_description>
 Displays different 3D solids and some information about each.
-A new solid is chosen every few seconds.  There are 75 uniform 
-polyhedra, plus 5 inifite sets of prisms and antiprisms; 
+A new solid is chosen every few seconds.  There are 75 uniform
+polyhedra, plus 5 infinite sets of prisms and antiprisms;
 including their duals brings the total to 160.
 
 Written by Dr. Zvi Har'El and Jamie Zawinski.
index 9efe41e9c061e4d6f57549d6c22e46b1da985ce5..8b39b637f75d73f27bdeb7f475caf45cce82590b 100644 (file)
@@ -30,6 +30,8 @@
 
   <boolean id="oily" _label="Psychedelic Colors" arg-set="-oily"/>
 
+  <boolean id="gray" _label="Grayscale" arg-set="-grayscale"/>
+
   <number id="ncolors" type="slider" arg="-colors %"
             _low-label="Colors    Two" _high-label="Many"
             low="1" high="255" default="200"/>
index a9fc9c3ad83b01924a44385cbda10ca6ba27fa10..58556fdc341e935a21dac8202e8e34e7f7403d85 100644 (file)
@@ -20,9 +20,9 @@
           _label="Handedness" _low-label="Left" _high-label="Right"
           low="0.0" high="1.0" default="0.5"/>
 
-  <number id="fill" type="slider" arg="-density %"
-          _label="Density" _low-label="Sparse" _high-label="Dense"
-          low="10" high="100" default="75"/>
+  <number id="fill" type="slider" arg="-fill %"
+           _label="Density" _low-label="Sparse" _high-label="Dense"
+          low="0" high="100" default="75"/>
 
   <number id="ncolors" type="slider" arg="-ncolors %"
             _label="Number of Colors" _low-label="Two" _high-label="Many"
index da9fc84a8c3ee2ac88647523ce6e0cf6b08e7559..1ff8b5470952ce150531db8f3b909399f6eaced8 100644 (file)
   <number id="viewing_time" type="spinbutton" arg="-viewing_time %"
           _label="Viewing Time" low="0" high="30" default="5" />
 
+  <number id="x_camera_rotate" type="slider" arg="-x_camera_rotate %"
+          _label="X Camera Rotate" _low-label="Slow" _high-label="Fast"
+          low="0" high="1" default="0.2" />
+
+  <number id="y_camera_rotate" type="slider" arg="-y_camera_rotate %"
+          _label="Y Camera Rotate" _low-label="Slow" _high-label="Fast"
+          low="0" high="1" default="0.5" />
+
+  <number id="z_camera_rotate" type="slider" arg="-z_camera_rotate %"
+          _label="Z Camera Rotate" _low-label="Slow" _high-label="Fast"
+          low="0" high="1" default="0" />
+
   <hgroup>
    <boolean id="wire"      _label="Wireframe"  arg-set="-wireframe"/>
+   <boolean id="rotate"    _label="Don't Rotate"     arg-set="-no-rotate"/>
   </hgroup>
 
   <_description>
-Watch the computer solve Tangram puzzles.
+Lets you watch the computer solve Tangram puzzles
 Written by Jeremy English.
   </_description>
 </screensaver>
diff --git a/hacks/config/timetunnel.xml b/hacks/config/timetunnel.xml
new file mode 100644 (file)
index 0000000..6416567
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="timetunnel" _label="Timetunnel">
+
+  <command arg="-root"/>
+
+  <number id="start" type="slider" arg="-start %"
+          _label="Start sequence time" _low-label="0 sec" _high-label="30 sec"
+          low="0.00" high="30.00" default="0.00"/>
+
+  <number id="changetime" type="slider" arg="-changetime %"
+          _label="Color Change Time" _low-label="Short" _high-label="Long"
+          low="0.00" high="30.00" default="30.00"/>
+
+  <boolean id="tunonly" _label="Draw Logo" arg-unset="-tunonly"/>
+  <boolean id="reverse" _label="Run Backward" arg-set="-reverse"/>
+
+  <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
+
+  <_description>
+Draws an animation similar to the opening and closing effects on the
+Dr. Who television show.  Written by Sean P. Brennan.
+  </_description>
+</screensaver>
index 93e013a0b3596f43d8fb83d0c3ebf227c7c052e5..1d52e2bb86cdb3180fe47e3820a8ceb52f7c3874 100644 (file)
@@ -5,11 +5,11 @@
   <command arg="-root"/>
 
   <number id="points" type="slider" arg="-points %"
-          _label="Particles" _label-low="Few" _label-high="Many"
+          _label="Particles" _low-label="Few" _high-label="Many"
           low="10" high="1000" default="400"/>
 
   <number id="tails" type="slider" arg="-tails %"
-          _label="Trail Size" _label-low="Short" _label-high="Long"
+          _label="Trail Size" _low-label="Short" _high-label="Long"
           low="1" high="200" default="10"/>
 
   <_description>
index c9af56d394c8075197c7ac5c2668beafd403215c..d67070ba02a98e27d3f9d3558fc16c81e3af63ff 100644 (file)
@@ -29,7 +29,7 @@
 
   <hgroup>
    <select id="xmode">
-    <option id="random" _label="Random" arg-set=""/>
+    <option id="random" _label="Random" />
     <option id="spin" _label="Spin" arg-set="-xmode spin"/>
     <option id="funky" _label="Funky" arg-set="-xmode funky"/>
     <option id="circle" _label="Circle" arg-set="-xmode circle"/>
    </select>
 
    <select id="ymode">
-    <option id="random" _label="Random" arg-set=""/>
-    <option id="spin" _label="Spin" arg-set="-ymode spin"/>
-    <option id="funky" _label="Funky" arg-set="-ymode funky"/>
-    <option id="circle" _label="Circle" arg-set="-ymode circle"/>
-    <option id="linear" _label="Linear" arg-set="-ymode linear"/>
-    <option id="test" _label="Test" arg-set="-ymode test"/>
-    <option id="fun" _label="Fun" arg-set="-ymode fun"/>
-    <option id="innie" _label="Innie" arg-set="-ymode innie"/>
-    <option id="lissajous" _label="Lissajous" arg-set="-ymode lissajous"/>
+    <option id="randomy" _label="Random" />
+    <option id="spiny" _label="Spin" arg-set="-ymode spin"/>
+    <option id="funkyy" _label="Funky" arg-set="-ymode funky"/>
+    <option id="circley" _label="Circle" arg-set="-ymode circle"/>
+    <option id="lineary" _label="Linear" arg-set="-ymode linear"/>
+    <option id="testy" _label="Test" arg-set="-ymode test"/>
+    <option id="funy" _label="Fun" arg-set="-ymode fun"/>
+    <option id="inniey" _label="Innie" arg-set="-ymode innie"/>
+    <option id="lissajousy" _label="Lissajous" arg-set="-ymode lissajous"/>
    </select>
  </hgroup>
 
   <!-- #### -speed [1] -->
-  <!-- #### -color_modifier [-1] --> 
+  <!-- #### -color_modifier [-1] -->
   <!-- #### -start_time [-1] -->
   <!-- #### -xoffset [1.0] -->
   <!-- #### -yoffset [1.0] -->
index 49b28d19a38422b7b6002e58c033459dbc4f86e7..54737c2ddfe6c2b3f0722cdde544eee9792d66ff 100644 (file)
@@ -11,7 +11,7 @@
       <option id="top"  _label="Top View" arg-set="-m"/>
     </select>
 
-    <boolean id="reflections" _label="Reflections" arg-unset="+M"/>
+    <boolean id="reflections" _label="Reflections" arg-unset="-M"/>
   </hgroup>
 
   <number id="speed" type="slider" arg="-Z %"
@@ -36,7 +36,7 @@
   <number id="alight" type="slider" arg="-e %"
           _label="Light Level" _low-label="Ambient  Low" _high-label="High"
           low="0.0" high="1.0" default="0.3"/>
-  <number id="vlight" type="slider" arg="-v %"
+  <number id="vlight2" type="slider" arg="-v %"
           _low-label="Vertical  Low" _high-label="High"
           low="0.0" high="1.0" default="0.6"/>
   <number id="contrast" type="slider" arg="-c %"
@@ -80,7 +80,7 @@
   <number id="recurs" type="slider" arg="-l %"
           _low-label="Recursion  0" _high-label="14"
           low="0" high="14" default="10"/>
-  <number id="recurs" type="slider" arg="-t %"
+  <number id="iterate" type="slider" arg="-t %"
           _low-label="Iteration  0" _high-label="10"
           low="0" high="10" default="2"/>
 
@@ -95,7 +95,7 @@
           _low-label="Yf  0.0" _high-label="1.0"
           low="0.0" high="1.0" default="0.0"/>
 
-  <boolean id="cross" _label="Cross Update" arg-unset="+x"/>
+  <boolean id="cross" _label="Cross Update" arg-unset="-x"/>
 
   <_description>
 XMountains generates realistic-looking fractal terrains of snow-capped
index ba30f691b7b1c4d47ba655ac64ba23d7e0ae763b..ba7fb51499389b25edb48e424b596fc05213a9c1 100644 (file)
@@ -101,7 +101,7 @@ SRCS                = xscreensaver-gl-helper.c normals.c glxfonts.c \
                  mirrorblob.c blinkbox.c noof.c polyhedra.c polyhedra-gl.c \
                  antinspect.c providence.c pinion.c boing.c texfont.c \
                  carousel.c fliptext.c antmaze.c tangram.c tangram_shapes.c \
-                 crackberg.c
+                 crackberg.c glhanoi.c cube21.c timetunnel.c juggler3d.c
 
 OBJS           = xscreensaver-gl-helper.o normals.o glxfonts.o \
                  atlantis.o b_draw.o b_lockglue.o b_sphere.o bubble3d.o \
@@ -132,7 +132,7 @@ OBJS                = xscreensaver-gl-helper.o normals.o glxfonts.o \
                  mirrorblob.o blinkbox.o noof.o polyhedra.o polyhedra-gl.o \
                  antinspect.o providence.o pinion.o boing.o texfont.o \
                  carousel.o fliptext.o antmaze.o tangram.o tangram_shapes.o \
-                 crackberg.o
+                 crackberg.o glhanoi.o cube21.o timetunnel.o juggler3d.o
 
 GL_EXES                = cage gears moebius pipes sproingies stairs superquadrics \
                  morph3d rubik atlantis lament bubble3d glplanet pulsar \
@@ -144,7 +144,7 @@ GL_EXES             = cage gears moebius pipes sproingies stairs superquadrics \
                  glknots blocktube flipflop antspotlight polytopes \
                  gleidescope mirrorblob blinkbox noof polyhedra \
                  antinspect providence pinion boing carousel fliptext \
-                 antmaze tangram crackberg
+                 antmaze tangram crackberg glhanoi cube21 timetunnel juggler3d
 GLE_EXES       = extrusion
 GL_UTIL_EXES   = xscreensaver-gl-helper
 HACK_EXES      = @GL_EXES@ @GLE_EXES@
@@ -164,7 +164,7 @@ HDRS                = atlantis.h bubble3d.h buildlwo.h e_textures.h xpm-ximage.h \
                  glut_roman.h marching.h rotator.h trackball.h gltrackball.h \
                  chessmodels.h chessgames.h gllist.h flurry.h tunnel_draw.h \
                  ants.h polyhedra.h normals.h glxfonts.h texfont.h \
-                 tangram_shapes.h
+                 tangram_shapes.h cube21-tex.h
 GL_MEN         = atlantis.man boxed.man bubble3d.man cage.man circuit.man \
                  cubenetic.man dangerball.man engine.man extrusion.man \
                  flipscreen3d.man gears.man gflux.man glforestfire.man \
@@ -181,7 +181,8 @@ GL_MEN              = atlantis.man boxed.man bubble3d.man cage.man circuit.man \
                  mirrorblob.man blinkbox.man noof.man polyhedra.man \
                  antinspect.man providence.man pinion.man boing.man \
                  carousel.man fliptext.man antmaze.man tangram.man \
-                 crackberg.man
+                 crackberg.man glhanoi.man cube21.man timetunnel.man \
+                 juggler3d.man
 MEN            = @GL_MEN@
 EXTRAS         = README Makefile.in dxf2gl.pl starwars.txt
 
@@ -586,8 +587,8 @@ jigglypuff: jigglypuff.o    xpm-ximage.o $(HACK_TRACK_OBJS)
 klein:         klein.o         $(HACK_TRACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
-hypertorus:    hypertorus.o    $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+hypertorus:    hypertorus.o    $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 glmatrix:      glmatrix.o      xpm-ximage.o $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   xpm-ximage.o $(HACK_OBJS) $(XPM_LIBS)
@@ -607,8 +608,8 @@ flipflop:   flipflop.o      $(HACK_TRACK_OBJS)
 antspotlight:  antspotlight.o  $(HACK_TRACK_GRAB_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_GRAB_OBJS) $(HACK_LIBS)
 
-polytopes:     polytopes.o     $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+polytopes:     polytopes.o     $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
 # This one works differently (it's not xlock-like.)
 #
@@ -669,12 +670,26 @@ fliptext: fliptext.o      texfont.o $(HACK_OBJS)
 antmaze:       antmaze.o       $(HACK_TRACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
-tangram:       tangram.o       tangram_shapes.o $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   tangram_shapes.o $(HACK_OBJS) $(HACK_LIBS)
+TANGRAM_OBJS=tangram_shapes.o glxfonts.o $(HACK_OBJS)
+tangram:       tangram.o       $(TANGRAM_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(TANGRAM_OBJS) $(HACK_LIBS)
 
 crackberg:     crackberg.o     $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
 
+glhanoi:       glhanoi.o       $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
+cube21:                cube21.o        $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+
+TIMETUNNEL_OBJS = xpm-ximage.o  $(HACK_TRACK_OBJS)
+timetunnel:    timetunnel.o    $(TIMETUNNEL_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(TIMETUNNEL_OBJS) $(XPM_LIBS)
+
+juggler3d:     juggler3d.o     $(HACK_TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_TRACK_OBJS) $(HACK_LIBS)
+
 dnalogo:       dnalogo.o      tube.o normals.o $(HACK_TRACK_OBJS)
        $(CC_HACK) -o $@ $@.o  tube.o normals.o $(HACK_TRACK_OBJS) $(HACK_LIBS)
 
@@ -746,6 +761,8 @@ cow_horns.o: $(srcdir)/gllist.h
 cow_tail.o: $(srcdir)/gllist.h
 cow_udder.o: $(srcdir)/gllist.h
 crackberg.o: ../../config.h
+cube21.o: ../../config.h
+cube21.o: $(srcdir)/cube21-tex.h
 cubenetic.o: ../../config.h
 cubenetic.o: $(srcdir)/gltrackball.h
 cubenetic.o: $(srcdir)/rotator.h
@@ -828,6 +845,8 @@ glforestfire.o: ../../config.h
 glforestfire.o: $(HACK_SRC)/images/ground.xpm
 glforestfire.o: $(HACK_SRC)/images/tree.xpm
 glforestfire.o: $(srcdir)/xpm-ximage.h
+glhanoi.o: ../../config.h
+glhanoi.o: $(srcdir)/rotator.h
 glknots.o: ../../config.h
 glknots.o: $(srcdir)/gltrackball.h
 glknots.o: $(srcdir)/rotator.h
@@ -865,10 +884,13 @@ glxfonts.o: ../../config.h
 glxfonts.o: $(srcdir)/glxfonts.h
 grab-ximage.o: ../../config.h
 hypertorus.o: ../../config.h
+hypertorus.o: $(srcdir)/gltrackball.h
 jigglypuff.o: ../../config.h
 jigglypuff.o: $(srcdir)/gltrackball.h
 jigglypuff.o: $(HACK_SRC)/images/jigglymap.xpm
 jigglypuff.o: $(srcdir)/xpm-ximage.h
+juggler3d.o: ../../config.h
+juggler3d.o: $(srcdir)/gltrackball.h
 klein.o: ../../config.h
 klein.o: $(srcdir)/gltrackball.h
 klein.o: $(srcdir)/rotator.h
@@ -922,6 +944,7 @@ polyhedra-gl.o: $(srcdir)/rotator.h
 polyhedra.o: ../../config.h
 polyhedra.o: $(srcdir)/polyhedra.h
 polytopes.o: ../../config.h
+polytopes.o: $(srcdir)/gltrackball.h
 providence.o: ../../config.h
 providence.o: $(srcdir)/gltrackball.h
 pulsar.o: ../../config.h
@@ -975,9 +998,19 @@ superquadrics.o: ../../config.h
 swim.o: $(srcdir)/atlantis.h
 swim.o: ../../config.h
 tangram.o: ../../config.h
+tangram.o: $(srcdir)/glxfonts.h
 tangram.o: $(srcdir)/tangram_shapes.h
 texfont.o: ../../config.h
 texfont.o: $(srcdir)/texfont.h
+timetunnel.o: ../../config.h
+timetunnel.o: $(srcdir)/gltrackball.h
+timetunnel.o: $(HACK_SRC)/images/timetunnel0.xpm
+timetunnel.o: $(HACK_SRC)/images/timetunnel1.xpm
+timetunnel.o: $(HACK_SRC)/images/timetunnel2.xpm
+timetunnel.o: $(HACK_SRC)/images/tunnelstar.xpm
+timetunnel.o: $(srcdir)/rotator.h
+timetunnel.o: $(UTILS_SRC)/images/logo-180.xpm
+timetunnel.o: $(srcdir)/xpm-ximage.h
 toast2.o: $(srcdir)/gllist.h
 toaster_base.o: $(srcdir)/gllist.h
 toaster_handle2.o: $(srcdir)/gllist.h
index 4ce50878ce0e6e0ad7fb7cc7c04287e115b4407b..8ab835d3f51fe00ab8029335b4a2846151da4993 100644 (file)
@@ -56,21 +56,21 @@ static int  noants;
 
 static XrmOptionDescRec opts[] =
 {
-  {(char *) "-solidmoebius", (char *) ".moebius.solidmoebius", XrmoptionNoArg, (caddr_t) "on"},
-  {(char *) "+solidmoebius", (char *) ".moebius.solidmoebius", XrmoptionNoArg, (caddr_t) "off"},
-  {(char *) "-noants", (char *) ".moebius.noants", XrmoptionNoArg, (caddr_t) "on"},
-  {(char *) "+noants", (char *) ".moebius.noants", XrmoptionNoArg, (caddr_t) "off"}
+  {"-solidmoebius", ".moebius.solidmoebius", XrmoptionNoArg, "on"},
+  {"+solidmoebius", ".moebius.solidmoebius", XrmoptionNoArg, "off"},
+  {"-noants", ".moebius.noants", XrmoptionNoArg, "on"},
+  {"+noants", ".moebius.noants", XrmoptionNoArg, "off"}
 };
 static argtype vars[] =
 {
-  {(caddr_t *) & solidmoebius, (char *) "solidmoebius", (char *) "Solidmoebius", (char *) DEF_SOLIDMOEBIUS, t_Bool},
-  {(caddr_t *) & noants, (char *) "noants", (char *) "Noants", (char *) DEF_NOANTS, t_Bool}
-
+  {&solidmoebius, "solidmoebius", "Solidmoebius", DEF_SOLIDMOEBIUS, t_Bool},
+  {&noants, "noants", "Noants", DEF_NOANTS, t_Bool}
 };
+
 static OptionStruct desc[] =
 {
-       {(char *) "-/+solidmoebius", (char *) "select between a SOLID or a NET Moebius Strip"},
-       {(char *) "-/+noants", (char *) "turn on/off walking ants"}
+       {"-/+solidmoebius", "select between a SOLID or a NET Moebius Strip"},
+       {"-/+noants", "turn on/off walking ants"}
 };
 
 ModeSpecOpt moebius_opts =
@@ -79,7 +79,7 @@ ModeSpecOpt moebius_opts =
 #ifdef USE_MODULES
 ModStruct   moebius_description =
 {"moebius", "init_moebius", "draw_moebius", "release_moebius",
- "draw_moebius", "change_moebius", (char *) NULL, &moebius_opts,
+ "draw_moebius", "change_moebius", NULL, &moebius_opts,
  1000, 1, 1, 1, 4, 1.0, "",
  "draws some ants", 0, NULL};
 
@@ -113,7 +113,7 @@ typedef struct {
 #include "ants.h"
 
 static GLfloat MaterialRed[] = {0.6, 0.0, 0.0, 1.0};
-static GLfloat MaterialMagenta[] = {0.6, 0.2, 0.5, 1.0};
+/*static GLfloat MaterialMagenta[] = {0.6, 0.2, 0.5, 1.0};*/
 static GLfloat MaterialGray8[] = {0.8, 0.8, 0.8, 1.0};
 static GLfloat MaterialGray35[] = {0.30, 0.30, 0.30, 1.0};
 static GLfloat MaterialGray4[] = {0.40, 0.40, 0.40, 1.0};
@@ -150,6 +150,7 @@ static Bool mySphere(float radius) {
   return True;
 }
 
+#if 0
 /* silhouette sphere */
 static Bool mySphere2(float radius) {
   GLUquadricObj *quadObj;
@@ -162,6 +163,7 @@ static Bool mySphere2(float radius) {
 
   return True;
 }
+#endif
 
 /* textured sphere */
 static Bool mySphereTex(float radius) {
@@ -193,7 +195,7 @@ static Bool myCone(float radius) {
 /* no cone */
 static Bool myCone2(float radius) { return True; }
 
-#define ANTCOUNT 4
+#define ANTCOUNT 5
 #define PI 3.14157
 
 static int focus = 0;
@@ -269,11 +271,11 @@ GLuint checktexture, brushedtexture;
 double elevator = 0.0;
 
 void makeCheckImage(void) {
-  int i, j, r, c, k;
+  int i, j;
   
   for (i = 0; i < checkImageWidth; i++) {
     for (j = 0; j < checkImageHeight; j++) {
-      if((((i&0x8)==0)^((j&0x8))==0)) {
+      if(((((i&0x8)==0)^((j&0x8)))==0)) {
        int c = 102 + random()%32;
        checkers[i][j][0] = c;
        checkers[i][j][1] = c;
@@ -302,7 +304,7 @@ void makeCheckImage(void) {
 }
 
 void makeBrushedImage(void) {
-  int i, j, r, c, k;
+  int i, j, c;
 
   for(i = 0; i < checkImageWidth; ++i)
     for(j = 0; j < checkImageHeight; ++j) {
@@ -972,6 +974,9 @@ double fadeoutspeed = 0.0;
 
 void update_ants(void) {
   int i;
+  GLfloat df[4];
+  df[0] = df[1] = df[2] = 0.8*fadeout;
+  df[3] = 1.0;
 
   /* fade out */
   if(fadeoutspeed < -0.00001) {
@@ -985,7 +990,6 @@ void update_ants(void) {
     
     fadeout += fadeoutspeed;
 
-    GLfloat df[4] = {0.8*fadeout, 0.8*fadeout, 0.8*fadeout, 1.0};
     glLightfv(GL_LIGHT0, GL_DIFFUSE, df);
     glLightfv(GL_LIGHT1, GL_DIFFUSE, df);
   }
@@ -998,7 +1002,6 @@ void update_ants(void) {
       fadeoutspeed = 0.0;
       entroducing = 12;
     }
-    GLfloat df[4] = {0.8*fadeout, 0.8*fadeout, 0.8*fadeout, 1.0};
     glLightfv(GL_LIGHT0, GL_DIFFUSE, df);
     glLightfv(GL_LIGHT1, GL_DIFFUSE, df);    
   }
@@ -1171,10 +1174,12 @@ void update_ants(void) {
        ideal += Pi;
 
       /* compute correction */
-      double dt = sign(ideal) * min(fabs(ideal), PI/90.0);
-      antdirection[i] += dt;
-      if(antdirection[i] > 2.0*PI)
-       antdirection[i] = 0.0;
+      {
+        double dt = sign(ideal) * min(fabs(ideal), PI/90.0);
+        antdirection[i] += dt;
+        if(antdirection[i] > 2.0*PI)
+          antdirection[i] = 0.0;
+      }
     }
     
     antposition[i][0] += antvelocity[i] * cos(antdirection[i]);
@@ -1183,7 +1188,6 @@ void update_ants(void) {
 }
 
 static void pinit(void) {
-  int status;
   glClearDepth(1.0);
   glClearColor(0.0, 0.0, 0.0, 1.0);
   
index e875f0fa2a3a43d07e29956ae1efa5137e2e3ba7..9f7706c6c9b03f86fa5b0061262fc94db7c877f7 100644 (file)
@@ -1,4 +1,4 @@
-/* thebox --- 3D bouncing balls that explode */
+/* boxed --- 3D bouncing balls that explode */
 
 #if 0
 static const char sccsid[] = "@(#)boxed.c      0.9 01/09/26 xlockmore";
@@ -23,6 +23,9 @@ static const char sccsid[] = "@(#)boxed.c     0.9 01/09/26 xlockmore";
  *       as an OpenGL screensaver for the xscreensaver package.
  *       Lots of hardcoded values still in place. Also, there are some
  *       copy/paste leftovers from the gears hack. opts don't work.
+ *
+ * 2005: opts work. added options -balls, -ballsize, -explosion
+ *
  */
 
 #include <X11/Intrinsic.h>
@@ -42,6 +45,9 @@ static const char sccsid[] = "@(#)boxed.c     0.9 01/09/26 xlockmore";
 # define boxed_opts    xlockmore_opts
 
 # define DEF_SPEED      "0.5"
+# define DEF_BALLS     "25"
+# define DEF_BALLSIZE   "2.0"
+# define DEF_EXPLOSION "25.0f"
 # define DEFAULTS      "*delay:     20000   \n" \
                        "*showFPS:   False   \n" \
                        "*wireframe: False   \n"
@@ -60,14 +66,23 @@ static const char sccsid[] = "@(#)boxed.c   0.9 01/09/26 xlockmore";
 #define rnd() (frand(1.0))
 
 GLfloat speed;  /* jwz -- overall speed factor applied to all motion */
+int cfg_balls;
+GLfloat cfg_ballsize;
+GLfloat cfg_explosion;
 
 
 static XrmOptionDescRec opts[] = {
     {"-speed", ".boxed.speed", XrmoptionSepArg, 0},
+    {"-balls", ".boxed.balls", XrmoptionSepArg, 0},
+    {"-ballsize", ".boxed.ballsize", XrmoptionSepArg, 0},
+    {"-explosion", ".boxed.explosion", XrmoptionSepArg, 0},
 };
 
 static argtype vars[] = {
     {&speed, "speed", "Speed", DEF_SPEED, t_Float},
+    {&cfg_balls, "balls", "Balls", DEF_BALLS, t_Int},
+    {&cfg_ballsize, "ballsize", "Ball Size", DEF_BALLSIZE, t_Float},
+    {&cfg_explosion, "explosion", "Exlosion", DEF_BALLSIZE, t_Float},
 };
 
 ModeSpecOpt boxed_opts = {countof(opts), opts, countof(vars), vars, NULL};
@@ -86,12 +101,6 @@ ModStruct   boxed_description = {
 #define TRUE 1
 #define FALSE 0
 
-/* rendering defines */
-
-
-/* box size */
-#define BOX_SIZE       20.0f
-
 /* camera */
 #define CAM_HEIGHT     100.0f
 #define CAMDISTANCE_MIN 20.0
@@ -103,11 +112,6 @@ ModStruct   boxed_description = {
 #define SPHERE_VERTICES        (2+MESH_SIZE*MESH_SIZE*2)
 #define SPHERE_INDICES ((MESH_SIZE*4 + MESH_SIZE*4*(MESH_SIZE-1))*3)
 
-#define EXPLOSION 10.0f
-#define MAXBALLS  50;
-#define NUMBALLS 12;
-#define BALLSIZE 3.0f;
-
 /*
 **-----------------------------------------------------------------------------
 **     Typedefs
@@ -169,6 +173,7 @@ typedef struct {
    float          cam_x_speed, cam_z_speed, cam_y_speed;
    boxed_config  config;
    float         tic;
+   float          camtic;
    vectorf        spherev[SPHERE_VERTICES];
    GLint          spherei[SPHERE_INDICES];
    ballman        bman;
@@ -352,8 +357,8 @@ void createball(ball *newball)
    newball->dir.z = (0.5-rnd())  * speed;
    newball->offside = 0;
    newball->bounced = FALSE;
-   newball->radius = BALLSIZE;
-   while (r+g+b < 1.7f ) {
+   newball->radius = cfg_ballsize;
+   while (r+g+b < 1.8f ) {
       newball->color.x = r=rnd();
       newball->color.y = g=rnd();
       newball->color.z = b=rnd();
@@ -371,7 +376,7 @@ void updateballs(ballman *bman)
 
    for (b=0;b<bman->num_balls;b++) {
 
-     GLfloat gravity = 0.15f * speed;
+     GLfloat gravity = 0.30f * speed;
 
       /* apply gravity */
       bman->balls[b].dir.y -= gravity;
@@ -379,10 +384,10 @@ void updateballs(ballman *bman)
       addvectors(&bman->balls[b].loc,&bman->balls[b].loc,&bman->balls[b].dir);
       /* boundary check */
       if (bman->balls[b].loc.y < bman->balls[b].radius) { /* ball onder bodem? (bodem @ y=0) */
-        if ((bman->balls[b].loc.x < -100.0) || 
-            (bman->balls[b].loc.x > 100.0) ||
-            (bman->balls[b].loc.z < -100.0) ||
-            (bman->balls[b].loc.z > 100.0)) {
+        if ((bman->balls[b].loc.x < -95.0) || 
+            (bman->balls[b].loc.x > 95.0) ||
+            (bman->balls[b].loc.z < -95.0) ||
+            (bman->balls[b].loc.z > 95.0)) {
            if (bman->balls[b].loc.y < -1000.0)
              createball(&bman->balls[b]);
         } else {
@@ -513,6 +518,16 @@ void createtrisfromball(triman* tman, vectorf *spherev, GLint *spherei, int ind_
       scalevector(&tman->vertices[pos+1],&tman->vertices[pos+1],scale);
       scalevector(&tman->vertices[pos+2],&tman->vertices[pos+2],scale);
             
+      tman->vertices[pos+0].x += avgdir.x;
+      tman->vertices[pos+0].y += avgdir.y;
+      tman->vertices[pos+0].z += avgdir.z;
+      tman->vertices[pos+1].x += avgdir.x;
+      tman->vertices[pos+1].y += avgdir.y;
+      tman->vertices[pos+1].z += avgdir.z;
+      tman->vertices[pos+2].x += avgdir.x;
+      tman->vertices[pos+2].y += avgdir.y;
+      tman->vertices[pos+2].z += avgdir.z;
+
       /* bereken nieuwe richting */
       scalevector(&tman->tris[i].dir,&avgdir,explosion);
       dvect.x = (0.1f - 0.2f*rnd());
@@ -540,10 +555,10 @@ void updatetris(triman *t)
       /* boundary check */
       if (t->tris[b].far) continue;
       if (t->tris[b].loc.y < 0) { /* onder bodem ? */
-        if ((t->tris[b].loc.x > -100.0f) &
-            (t->tris[b].loc.x < 100.0f) &
-            (t->tris[b].loc.z > -100.0f) &
-            (t->tris[b].loc.z < 100.0f)) {  /* in veld  */
+        if ((t->tris[b].loc.x > -95.0f) &
+            (t->tris[b].loc.x < 95.0f) &
+            (t->tris[b].loc.z > -95.0f) &
+            (t->tris[b].loc.z < 95.0f)) {  /* in veld  */
            t->tris[b].dir.y = -(t->tris[b].dir.y);
            t->tris[b].loc.y = -t->tris[b].loc.y;
            scalevector(&t->tris[b].dir,&t->tris[b].dir,0.80f); /* dampening */
@@ -619,11 +634,14 @@ void freetris(triman *t)
  */
 void setdefaultconfig(boxed_config *config) 
 {
-  config->numballs = NUMBALLS;
+  cfg_balls = MAX(3,MIN(40,cfg_balls));
+  cfg_ballsize = MAX(1.0f,MIN(5.0f,cfg_ballsize));
+  cfg_explosion = MAX(0.0f,MIN(50.0f,cfg_explosion));
+  config->numballs = cfg_balls;
   config->textures = TRUE;
   config->transparent = FALSE;
-  config->explosion = 25.0f;
-  config->ballsize = BALLSIZE;
+  config->explosion = cfg_explosion;
+  config->ballsize = cfg_ballsize;
   config->camspeed = 35.0f;
 }
 
@@ -902,12 +920,13 @@ static void draw(ModeInfo * mi)
    glLoadIdentity();
    
    gp->tic += 0.01f;
-
+   gp->camtic += 0.01f + 0.01f * sin(gp->tic * speed);
+   
    /* rotate camera around (0,0,0), looking at (0,0,0), up is (0,1,0) */
-   dcam = CAMDISTANCE_MIN + (CAMDISTANCE_MAX - CAMDISTANCE_MIN) + (CAMDISTANCE_MAX - CAMDISTANCE_MIN)*cos((gp->tic/CAMDISTANCE_SPEED) * speed);
-   v1.x = dcam * sin((gp->tic/gp->cam_x_speed) * speed);
-   v1.z = dcam * cos((gp->tic/gp->cam_z_speed) * speed);
-   v1.y = CAM_HEIGHT * sin((gp->tic/gp->cam_y_speed) * speed) + 1.02 * CAM_HEIGHT;
+   dcam = CAMDISTANCE_MIN + (CAMDISTANCE_MAX - CAMDISTANCE_MIN) + (CAMDISTANCE_MAX - CAMDISTANCE_MIN)*cos((gp->camtic/CAMDISTANCE_SPEED) * speed);
+   v1.x = dcam * sin((gp->camtic/gp->cam_x_speed) * speed);
+   v1.z = dcam * cos((gp->camtic/gp->cam_z_speed) * speed);
+   v1.y = CAM_HEIGHT * sin((gp->camtic/gp->cam_y_speed) * speed) + 1.02 * CAM_HEIGHT;
    gluLookAt(v1.x,v1.y,v1.z,0.0,0.0,0.0,0.0,1.0,0.0); 
 
    if (!wire) {
@@ -1087,8 +1106,11 @@ pinit(ModeInfo * mi)
    gp->cam_y_speed = 1.0f/((float)gp->config.camspeed/250.0 + rnd()*((float)gp->config.camspeed/250.0));
    if (rnd() < 0.5f) gp->cam_x_speed = -gp->cam_x_speed;
    if (rnd() < 0.5f) gp->cam_z_speed = -gp->cam_z_speed;
+
+   /* define initial cam position */
+   gp->tic = gp->camtic = rnd() * 100.0f;
    
-   
+   /* define tex1 (bottom plate) */
    gp->tex1 = (char *)malloc(3*width*height*sizeof(GLuint));
    texpixels = 256*256; /*width*height;*/
    texpixeldata = header_data;
index 1e86dee5b21e636dcce473036102b0ccd2880cc4..d12f0b3043c2273921b98d362e959e422e38565b 100644 (file)
@@ -719,7 +719,7 @@ static void triles_set_visible(cberg_state *cberg, Trile **root, int x, int y)
 {
     Trile *parent = NULL, 
           *iter = *root;
-    int goleft;
+    int goleft=0;
 
     while (iter != NULL) {
         parent = iter;
@@ -999,7 +999,7 @@ static void find_bounds(double y, double *left, double *right, LS *ls,
 
 static void mark_visible(cberg_state *cberg)
 {
-    double trough, peak, yval, left, right;
+    double trough, peak, yval, left=0, right=0;
     double x1,y1, x2,y2, x3,y3, x4,y4;
     int start, stop, x, y;
     LS ls[4];
diff --git a/hacks/glx/cube21-tex.h b/hacks/glx/cube21-tex.h
new file mode 100644 (file)
index 0000000..2d117d2
--- /dev/null
@@ -0,0 +1,4106 @@
+static const struct {
+  unsigned int          width;
+  unsigned int          height;
+  unsigned int          bytes_per_pixel;
+  unsigned char         pixel_data[128 * 256 * 3];
+} cubetex = {
+  128,256,3,
+  {
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,1,1,1,1,3,3,3,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,
+6,6,6,5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,
+5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,
+3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,3,3,3,
+5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,3,3,3,5,5,5,
+5,5,5,6,6,6,7,7,7,6,6,6,4,4,4,2,2,2,2,2,2,0,0,0,
+0,0,0,2,2,2,5,5,5,4,4,4,3,3,3,5,5,5,5,5,5,6,6,6,
+7,7,7,6,6,6,5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,
+6,6,6,5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,
+5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,
+3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,3,3,3,
+5,5,5,5,5,5,6,6,6,6,6,6,5,5,5,3,3,3,1,1,1,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,8,8,8,36,36,36,54,54,54,66,66,66,67,67,67,71,71,71,75,75,75,
+73,73,73,65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,
+65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,65,65,65,
+60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,65,65,65,60,60,60,
+67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,65,65,65,60,60,60,67,67,67,
+67,67,67,71,71,71,75,75,75,73,73,73,61,61,61,45,45,45,19,19,19,1,1,1,
+1,1,1,20,20,20,54,54,54,61,61,61,60,60,60,67,67,67,67,67,67,71,71,71,
+75,75,75,73,73,73,65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,
+73,73,73,65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,
+65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,65,65,65,
+60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,65,65,65,60,60,60,
+67,67,67,67,67,67,71,71,71,72,72,72,57,57,57,22,22,22,2,2,2,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,24,24,24,112,112,112,169,169,169,186,186,186,190,190,190,191,191,191,194,194,194,
+193,193,193,187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,
+187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,187,187,187,
+184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,187,187,187,184,184,184,
+187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,187,187,187,184,184,184,187,187,187,
+190,190,190,191,191,191,194,194,194,193,193,193,178,178,178,137,137,137,51,51,51,4,4,4,
+4,4,4,53,53,53,143,143,143,178,178,178,184,184,184,187,187,187,190,190,190,191,191,191,
+194,194,194,193,193,193,187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,
+193,193,193,187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,
+187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,187,187,187,
+184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,187,187,187,184,184,184,
+187,187,187,190,190,190,191,191,191,186,186,186,145,145,145,54,54,54,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+4,4,4,53,53,53,166,166,166,227,227,227,242,242,242,244,244,244,244,244,244,245,245,245,
+245,245,245,242,242,242,243,243,243,242,242,242,244,244,244,244,244,244,245,245,245,245,245,245,
+242,242,242,243,243,243,242,242,242,244,244,244,244,244,244,245,245,245,245,245,245,242,242,242,
+243,243,243,242,242,242,244,244,244,244,244,244,245,245,245,245,245,245,242,242,242,243,243,243,
+242,242,242,244,244,244,244,244,244,245,245,245,245,245,245,242,242,242,243,243,243,242,242,242,
+244,244,244,244,244,244,245,245,245,245,245,245,233,233,233,181,181,181,62,62,62,4,4,4,
+4,4,4,63,63,63,183,183,183,233,233,233,243,243,243,242,242,242,244,244,244,244,244,244,
+245,245,245,245,245,245,242,242,242,243,243,243,242,242,242,244,244,244,244,244,244,245,245,245,
+245,245,245,242,242,242,243,243,243,242,242,242,244,244,244,244,244,244,245,245,245,245,245,245,
+242,242,242,243,243,243,242,242,242,244,244,244,244,244,244,245,245,245,245,245,245,242,242,242,
+243,243,243,242,242,242,244,244,244,244,244,244,245,245,245,245,245,245,242,242,242,243,243,243,
+242,242,242,244,244,244,244,244,244,236,236,236,187,187,187,71,71,71,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+6,6,6,77,77,77,196,196,196,247,247,247,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+20,20,20,120,120,120,216,216,216,250,250,250,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+35,35,35,153,153,153,231,231,231,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,
+58,58,58,180,180,180,242,242,242,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,
+96,96,96,203,203,203,248,248,248,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,23,23,
+136,136,136,225,225,225,253,253,253,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,45,45,45,
+169,169,169,237,237,237,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,73,73,73,
+190,190,190,246,246,246,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,13,13,106,106,106,
+212,212,212,248,248,248,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,31,31,144,144,144,
+224,224,224,252,252,252,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,56,56,56,175,175,175,
+240,240,240,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,80,80,80,199,199,199,
+247,247,247,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,18,18,120,120,120,219,219,219,
+252,252,252,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,37,37,37,153,153,153,233,233,233,
+253,253,253,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,49,49,49,168,168,168,237,237,237,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,1,1,1,4,4,4,64,64,64,184,184,184,243,243,243,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,20,20,20,112,112,112,208,208,208,249,249,249,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,1,1,1,38,38,38,155,155,155,231,231,231,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,5,5,5,60,60,60,181,181,181,241,241,241,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,10,10,10,90,90,90,198,198,198,248,248,248,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,18,18,18,126,126,126,220,220,220,251,251,251,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,1,1,42,42,42,162,162,162,232,232,232,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,5,5,5,72,72,72,191,191,191,247,247,247,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,16,16,16,112,112,112,216,216,216,250,250,250,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,31,31,31,151,151,151,231,231,231,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,3,3,3,55,55,55,177,177,177,242,242,242,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,6,6,6,77,77,77,196,196,196,246,246,246,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,13,13,13,106,106,106,214,214,214,250,250,250,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,1,32,32,32,144,144,144,227,227,227,252,252,252,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+4,4,4,56,56,56,173,173,173,239,239,239,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+7,7,7,84,84,84,201,201,201,247,247,247,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+23,23,23,129,129,129,219,219,219,252,252,252,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+34,34,34,155,155,155,234,234,234,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,
+55,55,55,177,177,177,239,239,239,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,13,13,
+94,94,94,201,201,201,248,248,248,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,27,27,
+132,132,132,223,223,223,251,251,251,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,35,35,35,
+157,157,157,232,232,232,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,54,54,54,
+177,177,177,242,242,242,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,97,97,97,
+204,204,204,249,249,249,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,31,31,148,148,148,
+230,230,230,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,66,66,66,4,4,4,
+5,5,5,65,65,65,181,181,181,233,233,233,243,243,243,245,245,245,245,245,245,244,244,244,
+244,244,244,243,243,243,243,243,243,243,243,243,245,245,245,245,245,245,244,244,244,244,244,244,
+243,243,243,243,243,243,243,243,243,245,245,245,245,245,245,244,244,244,244,244,244,243,243,243,
+243,243,243,243,243,243,245,245,245,245,245,245,244,244,244,244,244,244,243,243,243,243,243,243,
+243,243,243,245,245,245,245,245,245,244,244,244,244,244,244,243,243,243,243,243,243,243,243,243,
+245,245,245,245,245,245,244,244,244,234,234,234,182,182,182,65,65,65,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,61,61,61,181,181,181,
+243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,253,253,253,248,248,248,231,231,231,169,169,169,57,57,57,4,4,4,
+4,4,4,51,51,51,138,138,138,177,177,177,187,187,187,193,193,193,194,194,194,191,191,191,
+190,190,190,187,187,187,184,184,184,187,187,187,193,193,193,194,194,194,191,191,191,190,190,190,
+187,187,187,184,184,184,187,187,187,193,193,193,194,194,194,191,191,191,190,190,190,187,187,187,
+184,184,184,187,187,187,193,193,193,194,194,194,191,191,191,190,190,190,187,187,187,184,184,184,
+187,187,187,193,193,193,194,194,194,191,191,191,190,190,190,187,187,187,184,184,184,187,187,187,
+193,193,193,194,194,194,191,191,191,181,181,181,140,140,140,50,50,50,4,4,4,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,76,76,76,194,194,194,
+246,246,246,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,252,252,252,248,248,248,
+246,246,246,237,237,237,225,225,225,202,202,202,173,173,173,111,111,111,27,27,27,1,1,1,
+1,1,1,17,17,17,50,50,50,58,58,58,65,65,65,73,73,73,75,75,75,71,71,71,
+67,67,67,67,67,67,60,60,60,65,65,65,73,73,73,75,75,75,71,71,71,67,67,67,
+67,67,67,60,60,60,65,65,65,73,73,73,75,75,75,71,71,71,67,67,67,67,67,67,
+60,60,60,65,65,65,73,73,73,75,75,75,71,71,71,67,67,67,67,67,67,60,60,60,
+65,65,65,73,73,73,75,75,75,71,71,71,67,67,67,67,67,67,60,60,60,65,65,65,
+73,73,73,75,75,75,71,71,71,65,65,65,50,50,50,17,17,17,2,2,2,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,11,11,102,102,102,210,210,210,
+248,248,248,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,253,253,253,252,252,252,245,245,245,236,236,236,221,221,221,210,210,210,
+190,190,190,170,170,170,134,134,134,86,86,86,55,55,55,24,24,24,4,4,4,0,0,0,
+0,0,0,1,1,1,4,4,4,3,3,3,5,5,5,6,6,6,7,7,7,6,6,6,
+5,5,5,5,5,5,3,3,3,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,
+5,5,5,3,3,3,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,5,5,5,
+3,3,3,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,5,5,5,3,3,3,
+5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,5,5,5,3,3,3,5,5,5,
+6,6,6,7,7,7,6,6,6,5,5,5,4,4,4,1,1,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,36,36,36,146,146,146,224,224,224,
+252,252,252,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,249,249,249,
+245,245,245,238,238,238,232,232,232,214,214,214,193,193,193,163,163,163,135,135,135,101,101,101,
+72,72,72,45,45,45,21,21,21,8,8,8,4,4,4,1,1,1,0,0,0,0,0,0,
+0,0,0,2,2,2,4,4,4,3,3,3,5,5,5,6,6,6,7,7,7,6,6,6,
+5,5,5,5,5,5,3,3,3,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,
+5,5,5,3,3,3,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,5,5,5,
+3,3,3,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,5,5,5,3,3,3,
+5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,5,5,5,3,3,3,5,5,5,
+6,6,6,7,7,7,6,6,6,5,5,5,4,4,4,1,1,1,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,65,65,65,182,182,182,242,242,242,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,251,251,251,248,248,248,243,243,243,229,229,229,210,210,210,
+189,189,189,172,172,172,149,149,149,115,115,115,72,72,72,40,40,40,25,25,25,12,12,12,
+5,5,5,1,1,1,0,0,0,3,3,3,5,5,5,11,11,11,9,9,9,1,1,1,
+2,2,2,21,21,21,53,53,53,58,58,58,65,65,65,73,73,73,75,75,75,71,71,71,
+67,67,67,67,67,67,60,60,60,65,65,65,73,73,73,75,75,75,71,71,71,67,67,67,
+67,67,67,60,60,60,65,65,65,73,73,73,75,75,75,71,71,71,67,67,67,67,67,67,
+60,60,60,65,65,65,73,73,73,75,75,75,71,71,71,67,67,67,67,67,67,60,60,60,
+65,65,65,73,73,73,75,75,75,71,71,71,67,67,67,67,67,67,60,60,60,65,65,65,
+73,73,73,75,75,75,71,71,71,64,64,64,49,49,49,14,14,14,1,1,1,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,8,8,8,88,88,88,205,205,205,248,248,248,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,253,253,253,252,252,252,
+248,248,248,246,246,246,232,232,232,220,220,220,200,200,200,185,185,185,151,151,151,105,105,105,
+66,66,66,53,53,53,31,31,31,16,16,16,6,6,6,1,1,1,0,0,0,1,1,1,
+4,4,4,11,11,11,21,21,21,44,44,44,64,64,64,79,79,79,39,39,39,3,3,3,
+3,3,3,50,50,50,139,139,139,176,176,176,187,187,187,193,193,193,194,194,194,191,191,191,
+190,190,190,187,187,187,184,184,184,187,187,187,193,193,193,194,194,194,191,191,191,190,190,190,
+187,187,187,184,184,184,187,187,187,193,193,193,194,194,194,191,191,191,190,190,190,187,187,187,
+184,184,184,187,187,187,193,193,193,194,194,194,191,191,191,190,190,190,187,187,187,184,184,184,
+187,187,187,193,193,193,194,194,194,191,191,191,190,190,190,187,187,187,184,184,184,187,187,187,
+193,193,193,194,194,194,191,191,191,184,184,184,140,140,140,51,51,51,4,4,4,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,20,20,20,127,127,127,219,219,219,252,252,252,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,252,252,252,250,250,250,244,244,244,236,236,236,221,221,221,
+207,207,207,187,187,187,162,162,162,125,125,125,82,82,82,64,64,64,35,35,35,13,13,13,
+4,4,4,4,4,4,0,0,0,1,1,1,4,4,4,11,11,11,23,23,23,36,36,36,
+60,60,60,91,91,91,128,128,128,159,159,159,178,178,178,154,154,154,54,54,54,3,3,3,
+3,3,3,58,58,58,176,176,176,232,232,232,242,242,242,245,245,245,245,245,245,244,244,244,
+244,244,244,242,242,242,243,243,243,242,242,242,245,245,245,245,245,245,244,244,244,244,244,244,
+242,242,242,243,243,243,242,242,242,245,245,245,245,245,245,244,244,244,244,244,244,242,242,242,
+243,243,243,242,242,242,245,245,245,245,245,245,244,244,244,244,244,244,242,242,242,243,243,243,
+242,242,242,245,245,245,245,245,245,244,244,244,244,244,244,242,242,242,243,243,243,242,242,242,
+245,245,245,245,245,245,244,244,244,234,234,234,181,181,181,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,1,1,1,33,33,33,150,150,150,232,232,232,253,253,253,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,253,253,253,
+248,248,248,243,243,243,237,237,237,227,227,227,213,213,213,193,193,193,168,168,168,135,135,135,
+100,100,100,68,68,68,41,41,41,17,17,17,7,7,7,5,5,5,1,1,1,1,1,1,
+3,3,3,8,8,8,18,18,18,35,35,35,57,57,57,91,91,91,128,128,128,156,156,156,
+181,181,181,198,198,198,220,220,220,231,231,231,234,234,234,183,183,183,67,67,67,5,5,5,
+5,5,5,67,67,67,187,187,187,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,4,4,4,52,52,52,170,170,170,237,237,237,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,251,251,251,248,248,248,239,239,239,227,227,227,
+206,206,206,186,186,186,165,165,165,142,142,142,106,106,106,75,75,75,47,47,47,26,26,26,
+13,13,13,5,5,5,1,1,1,0,0,0,3,3,3,7,7,7,19,19,19,33,33,33,
+53,53,53,82,82,82,121,121,121,150,150,150,174,174,174,199,199,199,219,219,219,234,234,234,
+241,241,241,248,248,248,251,251,251,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,
+5,5,5,67,67,67,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,66,66,66,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,8,8,8,81,81,81,192,192,192,245,245,245,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,253,253,253,
+252,252,252,247,247,247,244,244,244,232,232,232,222,222,222,199,199,199,178,178,178,144,144,144,
+101,101,101,65,65,65,48,48,48,28,28,28,13,13,13,6,6,6,1,1,1,0,0,0,
+1,1,1,4,4,4,13,13,13,21,21,21,47,47,47,80,80,80,122,122,122,155,155,155,
+176,176,176,197,197,197,217,217,217,229,229,229,239,239,239,247,247,247,252,252,252,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5,
+5,5,5,70,70,70,191,191,191,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,24,24,24,126,126,126,215,215,215,250,250,250,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,252,252,252,248,248,248,244,244,244,237,237,237,
+220,220,220,200,200,200,180,180,180,160,160,160,128,128,128,82,82,82,58,58,58,33,33,33,
+14,14,14,4,4,4,3,3,3,0,0,0,1,1,1,4,4,4,8,8,8,24,24,24,
+42,42,42,65,65,65,99,99,99,134,134,134,166,166,166,195,195,195,222,222,222,230,230,230,
+241,241,241,246,246,246,251,251,251,252,252,252,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7,
+7,7,7,75,75,75,194,194,194,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,1,1,42,42,42,159,159,159,232,232,232,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+251,251,251,248,248,248,241,241,241,236,236,236,222,222,222,208,208,208,191,191,191,171,171,171,
+135,135,135,93,93,93,59,59,59,39,39,39,20,20,20,7,7,7,4,4,4,1,1,1,
+1,1,1,4,4,4,8,8,8,20,20,20,33,33,33,52,52,52,81,81,81,126,126,126,
+159,159,159,186,186,186,204,204,204,224,224,224,235,235,235,248,248,248,251,251,251,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,
+6,6,6,73,73,73,193,193,193,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,4,4,4,65,65,65,186,186,186,243,243,243,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,250,250,250,247,247,247,234,234,234,
+223,223,223,200,200,200,184,184,184,161,161,161,135,135,135,100,100,100,74,74,74,52,52,52,
+28,28,28,11,11,11,3,3,3,1,1,1,0,0,0,4,4,4,6,6,6,13,13,13,
+33,33,33,59,59,59,85,85,85,126,126,126,150,150,150,170,170,170,192,192,192,215,215,215,
+232,232,232,243,243,243,248,248,248,253,253,253,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,
+5,5,5,65,65,65,187,187,187,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,13,13,13,99,99,99,204,204,204,248,248,248,254,254,254,254,254,254,
+254,254,254,253,253,253,248,248,248,242,242,242,230,230,230,216,216,216,194,194,194,169,169,169,
+132,132,132,93,93,93,63,63,63,45,45,45,26,26,26,10,10,10,5,5,5,2,2,2,
+0,0,0,1,1,1,3,3,3,14,14,14,27,27,27,53,53,53,74,74,74,104,104,104,
+144,144,144,176,176,176,202,202,202,219,219,219,232,232,232,237,237,237,245,245,245,250,250,250,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,
+3,3,3,60,60,60,184,184,184,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,71,71,71,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,21,21,21,134,134,134,224,224,224,251,251,251,248,248,248,246,246,246,
+237,237,237,225,225,225,202,202,202,181,181,181,153,153,153,120,120,120,77,77,77,54,54,54,
+27,27,27,11,11,11,5,5,5,2,2,2,0,0,0,0,0,0,4,4,4,14,14,14,
+31,31,31,43,43,43,60,60,60,102,102,102,145,145,145,174,174,174,191,191,191,211,211,211,
+224,224,224,240,240,240,248,248,248,252,252,252,253,253,253,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,
+5,5,5,67,67,67,187,187,187,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,2,2,2,45,45,45,160,160,160,218,218,218,221,221,221,212,212,212,190,190,190,
+170,170,170,136,136,136,96,96,96,59,59,59,35,35,35,20,20,20,6,6,6,4,4,4,
+0,0,0,1,1,1,5,5,5,8,8,8,23,23,23,34,34,34,55,55,55,96,96,96,
+139,139,139,164,164,164,183,183,183,205,205,205,229,229,229,239,239,239,246,246,246,248,248,248,
+252,252,252,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,
+5,5,5,67,67,67,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,66,66,66,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,6,6,6,64,64,64,142,142,142,156,156,156,137,137,137,103,103,103,73,73,73,
+45,45,45,23,23,23,12,12,12,4,4,4,1,1,1,0,0,0,3,3,3,7,7,7,
+12,12,12,34,34,34,67,67,67,91,91,91,133,133,133,154,154,154,176,176,176,201,201,201,
+224,224,224,233,233,233,243,243,243,248,248,248,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5,
+5,5,5,70,70,70,191,191,191,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,8,8,8,47,47,47,56,56,56,40,40,40,26,26,26,13,13,13,5,5,5,
+1,1,1,0,0,0,1,1,1,4,4,4,15,15,15,31,31,31,57,57,57,80,80,80,
+109,109,109,149,149,149,182,182,182,210,210,210,222,222,222,234,234,234,239,239,239,248,248,248,
+251,251,251,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7,
+7,7,7,75,75,75,194,194,194,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,3,3,3,7,7,7,3,3,3,1,1,1,0,0,0,1,1,1,5,5,5,
+11,11,11,21,21,21,39,39,39,66,66,66,108,108,108,150,150,150,179,179,179,196,196,196,
+214,214,214,227,227,227,242,242,242,248,248,248,252,252,252,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,
+6,6,6,73,73,73,193,193,193,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,1,1,1,2,2,2,11,11,11,25,25,25,43,43,43,
+74,74,74,112,112,112,148,148,148,180,180,180,209,209,209,228,228,228,241,241,241,246,246,246,
+250,250,250,252,252,252,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,
+5,5,5,65,65,65,187,187,187,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,1,1,1,2,2,2,10,10,10,24,24,24,45,45,45,
+76,76,76,117,117,117,152,152,152,185,185,185,210,210,210,227,227,227,237,237,237,243,243,243,
+248,248,248,253,253,253,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,
+3,3,3,60,60,60,184,184,184,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,71,71,71,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,4,4,4,
+13,13,13,25,25,25,47,47,47,75,75,75,106,106,106,142,142,142,165,165,165,187,187,187,
+206,206,206,227,227,227,237,237,237,248,248,248,251,251,251,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,
+5,5,5,67,67,67,187,187,187,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,1,1,1,6,6,6,13,13,13,28,28,28,49,49,49,67,67,67,
+104,104,104,143,143,143,173,173,173,199,199,199,223,223,223,232,232,232,242,242,242,249,249,249,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,
+5,5,5,67,67,67,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,66,66,66,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,5,5,5,
+15,15,15,30,30,30,54,54,54,84,84,84,130,130,130,157,157,157,179,179,179,204,204,204,
+229,229,229,239,239,239,246,246,246,248,248,248,252,252,252,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5,
+5,5,5,70,70,70,191,191,191,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,1,0,0,0,4,4,4,8,8,8,24,24,24,35,35,35,57,57,57,100,100,100,
+144,144,144,174,174,174,191,191,191,210,210,210,221,221,221,236,236,236,245,245,245,252,252,252,
+253,253,253,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7,
+7,7,7,75,75,75,194,194,194,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,3,3,3,14,14,14,
+26,26,26,47,47,47,73,73,73,101,101,101,135,135,135,163,163,163,193,193,193,214,214,214,
+231,231,231,237,237,237,245,245,245,250,250,250,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,
+6,6,6,73,73,73,193,193,193,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,1,1,1,5,5,5,12,12,12,25,25,25,45,45,45,74,74,74,114,114,114,
+146,146,146,171,171,171,191,191,191,213,213,213,230,230,230,242,242,242,248,248,248,253,253,253,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,
+5,5,5,65,65,65,187,187,187,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,6,6,6,16,16,16,
+32,32,32,51,51,51,71,71,71,117,117,117,152,152,152,182,182,182,203,203,203,224,224,224,
+235,235,235,247,247,247,249,249,249,252,252,252,253,253,253,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,
+3,3,3,60,60,60,184,184,184,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,71,71,71,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,1,4,4,4,5,5,5,19,19,19,36,36,36,60,60,60,98,98,98,133,133,133,
+165,165,165,191,191,191,214,214,214,223,223,223,236,236,236,245,245,245,251,251,251,252,252,252,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,67,67,67,5,5,5,
+5,5,5,67,67,67,187,187,187,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,4,4,4,13,13,13,20,20,20,
+41,41,41,75,75,75,110,110,110,138,138,138,167,167,167,194,194,194,217,217,217,229,229,229,
+236,236,236,243,243,243,249,249,249,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,67,67,67,5,5,5,
+5,5,5,67,67,67,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,66,66,66,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1,1,1,6,6,6,16,16,16,26,26,26,51,51,51,80,80,80,113,113,113,144,144,144,
+162,162,162,184,184,184,208,208,208,230,230,230,241,241,241,248,248,248,251,251,251,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,191,191,191,70,70,70,5,5,5,
+5,5,5,70,70,70,191,191,191,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,184,184,184,60,60,60,3,3,3,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,7,7,7,14,14,14,31,31,31,
+47,47,47,63,63,63,113,113,113,155,155,155,182,182,182,200,200,200,221,221,221,231,231,231,
+245,245,245,250,250,250,254,254,254,254,254,254,245,245,245,194,194,194,75,75,75,7,7,7,
+7,7,7,75,75,75,194,194,194,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,243,243,243,187,187,187,65,65,65,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+3,3,3,4,4,4,20,20,20,39,39,39,62,62,62,92,92,92,128,128,128,159,159,159,
+186,186,186,212,212,212,230,230,230,242,242,242,237,237,237,190,190,190,73,73,73,6,6,6,
+6,6,6,73,73,73,193,193,193,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,245,245,245,193,193,193,73,73,73,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,1,1,1,5,5,5,11,11,11,21,21,21,39,39,39,
+67,67,67,108,108,108,150,150,150,179,179,179,188,188,188,157,157,157,57,57,57,4,4,4,
+5,5,5,62,62,62,181,181,181,232,232,232,243,243,243,243,243,243,244,244,244,244,244,244,
+245,245,245,245,245,245,243,243,243,243,243,243,243,243,243,244,244,244,244,244,244,245,245,245,
+245,245,245,243,243,243,243,243,243,243,243,243,244,244,244,244,244,244,245,245,245,245,245,245,
+243,243,243,243,243,243,243,243,243,244,244,244,244,244,244,245,245,245,245,245,245,243,243,243,
+243,243,243,243,243,243,244,244,244,244,244,244,245,245,245,245,245,245,243,243,243,243,243,243,
+243,243,243,244,244,244,244,244,244,236,236,236,187,187,187,71,71,71,6,6,6,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,
+4,4,4,15,15,15,31,31,31,58,58,58,76,76,76,76,76,76,33,33,33,2,2,2,
+3,3,3,47,47,47,139,139,139,178,178,178,184,184,184,187,187,187,190,190,190,191,191,191,
+194,194,194,193,193,193,187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,
+193,193,193,187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,
+187,187,187,184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,187,187,187,
+184,184,184,187,187,187,190,190,190,191,191,191,194,194,194,193,193,193,187,187,187,184,184,184,
+187,187,187,190,190,190,191,191,191,186,186,186,145,145,145,54,54,54,5,5,5,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,2,2,2,6,6,6,8,8,8,8,8,8,1,1,1,
+2,2,2,22,22,22,55,55,55,61,61,61,60,60,60,67,67,67,67,67,67,71,71,71,
+75,75,75,73,73,73,65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,
+73,73,73,65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,
+65,65,65,60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,65,65,65,
+60,60,60,67,67,67,67,67,67,71,71,71,75,75,75,73,73,73,65,65,65,60,60,60,
+67,67,67,67,67,67,71,71,71,72,72,72,57,57,57,21,21,21,2,2,2,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,2,2,2,5,5,5,4,4,4,3,3,3,5,5,5,5,5,5,6,6,6,
+7,7,7,6,6,6,5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,
+6,6,6,5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,
+5,5,5,3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,
+3,3,3,5,5,5,5,5,5,6,6,6,7,7,7,6,6,6,5,5,5,3,3,3,
+5,5,5,5,5,5,6,6,6,6,6,6,5,5,5,2,2,2,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2,2,2,2,2,2,5,5,5,4,4,4,5,5,5,5,5,5,5,5,5,6,6,6,
+4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,
+6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,
+5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,
+5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,
+5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,
+5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,
+6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,
+4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,
+6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,
+5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,
+5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,
+5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,
+5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,
+6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,
+4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,4,4,4,4,4,4,1,1,1,
+3,3,3,23,23,23,54,54,54,65,65,65,68,68,68,68,68,68,68,68,68,69,69,69,
+65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,
+69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,
+68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,
+68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,
+68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,
+68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,
+69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,
+65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,
+69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,
+68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,
+68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,
+68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,
+68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,
+69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,
+65,65,65,69,69,69,68,68,68,68,68,68,65,65,65,53,53,53,23,23,23,2,2,2,
+5,5,5,54,54,54,141,141,141,181,181,181,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,
+190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,
+190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,188,188,188,190,190,190,189,189,189,182,182,182,140,140,140,51,51,51,4,4,4,
+5,5,5,66,66,66,182,182,182,234,234,234,244,244,244,244,244,244,244,244,244,242,242,242,
+245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,
+242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,
+244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,
+244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,
+244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,
+244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,
+242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,
+245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,
+242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,
+244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,
+244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,
+244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,
+244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,
+242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,
+245,245,245,242,242,242,244,244,244,244,244,244,234,234,234,181,181,181,65,65,65,5,5,5,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,65,65,65,181,181,181,234,234,234,244,244,244,244,244,244,244,244,244,243,243,243,
+245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,
+243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,
+244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,
+244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,
+244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,
+244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,
+243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,
+245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,
+243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,242,242,242,
+242,242,242,242,242,242,243,243,243,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,
+244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,
+244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,
+244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,
+243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,
+245,245,245,243,243,243,244,244,244,244,244,244,234,234,234,182,182,182,65,65,65,5,5,5,
+3,3,3,50,50,50,139,139,139,183,183,183,189,189,189,189,189,189,190,190,190,188,188,188,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,
+188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,188,188,188,181,181,181,
+173,173,173,173,173,173,181,181,181,189,189,189,188,188,188,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,
+188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,
+189,189,189,189,189,189,189,189,189,189,189,189,181,181,181,141,141,141,51,51,51,4,4,4,
+2,2,2,17,17,17,50,50,50,64,64,64,68,68,68,68,68,68,68,68,68,69,69,69,
+65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,
+69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,
+68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,
+68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,
+68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,
+68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,
+69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,
+65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,
+69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,61,61,61,56,56,56,
+46,46,46,46,46,46,54,54,54,64,64,64,69,69,69,65,65,65,69,69,69,68,68,68,
+68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,
+68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,
+68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,
+69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,
+65,65,65,69,69,69,68,68,68,68,68,68,65,65,65,52,52,52,21,21,21,2,2,2,
+0,0,0,1,1,1,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,6,6,6,
+4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,
+6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,
+5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,
+5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,
+5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,
+5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,
+6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,
+4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,
+6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,3,3,3,
+1,1,1,1,1,1,3,3,3,4,4,4,5,5,5,4,4,4,6,6,6,5,5,5,
+5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,
+5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,
+5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,
+6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,
+4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,4,4,4,2,2,2,0,0,0,
+0,0,0,1,1,1,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,6,6,6,
+4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,
+6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,
+5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,
+5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,
+5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,
+5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,
+6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,
+4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,
+6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,3,3,3,2,2,2,
+0,0,0,0,0,0,2,2,2,4,4,4,5,5,5,4,4,4,6,6,6,5,5,5,
+5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,
+5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,
+5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,
+6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,
+4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,3,3,3,2,2,2,0,0,0,
+1,1,1,16,16,16,50,50,50,65,65,65,68,68,68,68,68,68,68,68,68,69,69,69,
+65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,
+69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,
+68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,
+68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,
+68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,
+68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,
+69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,
+65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,
+69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,67,67,67,49,49,49,19,19,19,
+1,1,1,1,1,1,19,19,19,50,50,50,67,67,67,65,65,65,69,69,69,68,68,68,
+68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,
+68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,
+68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,
+69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,
+65,65,65,69,69,69,68,68,68,68,68,68,65,65,65,51,51,51,21,21,21,2,2,2,
+4,4,4,50,50,50,138,138,138,183,183,183,189,189,189,189,189,189,190,190,190,188,188,188,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,
+188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,181,181,181,140,140,140,51,51,51,
+4,4,4,4,4,4,51,51,51,141,141,141,181,181,181,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,
+188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,
+189,189,189,189,189,189,189,189,189,189,189,189,182,182,182,142,142,142,50,50,50,4,4,4,
+5,5,5,65,65,65,181,181,181,234,234,234,244,244,244,244,244,244,244,244,244,242,242,242,
+245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,
+242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,
+244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,
+244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,
+244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,
+244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,
+242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,
+245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,
+242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,232,232,232,183,183,183,65,65,65,
+4,4,4,4,4,4,65,65,65,183,183,183,232,232,232,245,245,245,242,242,242,244,244,244,
+244,244,244,244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,
+244,244,244,244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,
+244,244,244,242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,
+242,242,242,245,245,245,242,242,242,244,244,244,244,244,244,244,244,244,244,244,244,242,242,242,
+245,245,245,242,242,242,244,244,244,244,244,244,233,233,233,180,180,180,66,66,66,5,5,5,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,
+6,6,6,6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,
+4,4,4,4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,
+6,6,6,6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,
+5,5,5,5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,
+5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,
+5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,
+5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,
+6,6,6,6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,
+4,4,4,4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,
+6,6,6,6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,
+5,5,5,5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,
+5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,
+5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,
+5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,
+6,6,6,6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,
+4,4,4,4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,
+6,6,6,6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,
+5,5,5,5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,
+5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,
+5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,
+5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,6,6,6,
+5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,
+6,6,6,6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,4,4,4,
+6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,245,245,245,189,189,189,65,65,65,
+4,4,4,4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,189,189,189,69,69,69,6,6,6,
+4,4,4,65,65,65,189,189,189,245,245,245,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,243,243,243,188,188,188,69,69,69,
+6,6,6,6,6,6,69,69,69,188,188,188,243,243,243,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+6,6,6,69,69,69,189,189,189,243,243,243,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,190,190,190,68,68,68,
+5,5,5,5,5,5,68,68,68,190,190,190,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,
+5,5,5,5,5,5,68,68,68,189,189,189,244,244,244,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+254,254,254,254,254,254,254,254,254,254,254,254,244,244,244,189,189,189,68,68,68,5,5,5,
+5,5,5,65,65,65,181,181,181,234,234,234,244,244,244,244,244,244,243,243,243,245,245,245,
+243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,
+244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,
+244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,
+244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,
+244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,
+243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,
+245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,
+243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,
+244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,235,235,235,181,181,181,65,65,65,
+5,5,5,5,5,5,65,65,65,182,182,182,234,234,234,244,244,244,243,243,243,245,245,245,
+243,243,243,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,
+244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,
+244,244,244,244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,
+244,244,244,244,244,244,243,243,243,245,245,245,243,243,243,244,244,244,244,244,244,244,244,244,
+244,244,244,243,243,243,245,245,245,243,243,243,234,234,234,181,181,181,65,65,65,4,4,4,
+4,4,4,51,51,51,140,140,140,182,182,182,189,189,189,190,190,190,188,188,188,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,
+189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,
+189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+190,190,190,188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,
+188,188,188,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,190,190,190,188,188,188,182,182,182,141,141,141,50,50,50,
+3,3,3,3,3,3,49,49,49,138,138,138,181,181,181,189,189,189,189,189,189,189,189,189,
+188,188,188,190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,
+190,190,190,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,
+189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,
+189,189,189,189,189,189,189,189,189,189,189,189,188,188,188,190,190,190,189,189,189,189,189,189,
+189,189,189,189,189,189,189,189,189,188,188,188,182,182,182,141,141,141,54,54,54,5,5,5,
+2,2,2,22,22,22,53,53,53,65,65,65,68,68,68,68,68,68,69,69,69,65,65,65,
+69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,
+68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,
+68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,
+68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,
+68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,
+69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,
+65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,
+69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,
+68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,62,62,62,52,52,52,19,19,19,
+2,2,2,2,2,2,17,17,17,48,48,48,64,64,64,68,68,68,69,69,69,65,65,65,
+69,69,69,68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,
+68,68,68,68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,
+68,68,68,68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,
+68,68,68,68,68,68,69,69,69,65,65,65,69,69,69,68,68,68,68,68,68,68,68,68,
+68,68,68,69,69,69,65,65,65,69,69,69,66,66,66,54,54,54,22,22,22,2,2,2,
+1,1,1,3,3,3,4,4,4,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,
+6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,
+5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,
+5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,
+5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,
+5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,
+6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,
+4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,
+6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,
+5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,5,5,5,1,1,1,
+0,0,0,0,0,0,1,1,1,4,4,4,5,5,5,5,5,5,6,6,6,4,4,4,
+6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,
+5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,
+5,5,5,5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,
+5,5,5,5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,5,5,5,
+5,5,5,6,6,6,4,4,4,6,6,6,5,5,5,5,5,5,3,3,3,1,1,1,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,
+100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100
+}
+};
diff --git a/hacks/glx/cube21.c b/hacks/glx/cube21.c
new file mode 100644 (file)
index 0000000..79423e6
--- /dev/null
@@ -0,0 +1,788 @@
+/*-
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Cube 21 - a Rubik-like puzzle.  It changes its shape and has more than
+ * 200 configurations.  It is known better as Square-1, but it is called
+ * Cube 21 in the Czech republic, where it was invented in 1992.
+ * 
+ * This file is derived from cage.c,
+ * "cage --- the Impossible Cage, an Escher like scene",
+ * by Marcelo F. Vienna,
+ * parts from gltext.c by Jamie Zawinski
+ *
+ * Vaclav (Vasek) Potocek
+ * vasek.potocek@post.cz
+ */
+
+/* TODO:
+ *  Future: some simple "solve mode"
+ *  Future: new light model, less ambient light
+ *  Maybe: use rotator and trackball
+ *  Maybe: display lists - seem impossible with colors
+ */
+
+/*-
+ * Texture mapping is only available on RGBA contexts, Mono and color index
+ * visuals DO NOT support texture mapping in OpenGL.
+ *
+ * BUT Mesa do implements RGBA contexts in pseudo color visuals, so texture
+ * mapping should work on PseudoColor, DirectColor, TrueColor using Mesa. Mono
+ * is not officially supported for both OpenGL and Mesa, but seems to not crash
+ * Mesa.
+ *
+ * In real OpenGL, PseudoColor DO NOT support texture map (as far as I know).
+ */
+
+#define PROGCLASS     "Cube21"
+#define HACK_INIT     init_cube21
+#define HACK_DRAW     draw_cube21
+#define HACK_RESHAPE  reshape_cube21
+#define cube21_opts   xlockmore_opts
+
+#define DEF_XYSPEED   "1.0"
+#define DEF_TSPEED    "3.0"
+#define DEF_WSPEED    "1.0"
+#define DEF_TWAIT     "40.0"
+#define DEF_SIZE      "0.7"
+#define DEF_COLMODE   "(none)"
+
+#define DEFAULTS   "*delay:         20000         \n" \
+                   "*showFPS:       False         \n" \
+                   "*wireframe:     False         \n"
+
+#include "xlockmore.h"
+
+#ifdef USE_GL
+
+#include <GL/glu.h>
+#include "cube21-tex.h"
+
+#ifdef Pi
+#undef Pi
+#endif
+#define Pi      M_PI
+
+#define SHUFFLE 100
+
+#define COS15   0.9659258263
+#define SIN15   0.2588190451
+#define COS30   0.8660254038
+#define SIN30   0.5000000000
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define rnd01() (random()%2)
+#define rndcolor() (frand(0.5)+0.3)
+
+/*************************************************************************/
+
+static Bool wander, spin, wire, tex, rndstart, cmat;
+static float spinspeed, tspeed, wspeed, twait, size;
+static char *colmode_s;
+static int colmode;
+
+static argtype vars[] = {
+  { &spin,      "spin",        "Spin",        "True",      t_Bool},
+  { &wander,    "wander",      "Wander",      "True",      t_Bool},
+  { &rndstart,  "randomize",   "Randomize",   "True",      t_Bool},
+  { &tex,       "texture",     "Texture",     "True",      t_Bool},
+  { &spinspeed, "spinspeed",   "SpinSpeed",   DEF_XYSPEED, t_Float},
+  { &tspeed,    "rotspeed",    "RotSpeed",    DEF_TSPEED,  t_Float},
+  { &wspeed,    "wanderspeed", "WanderSpeed", DEF_WSPEED,  t_Float},
+  { &twait,     "wait",        "Wait",        DEF_TWAIT,   t_Float},
+  { &size,      "cubesize",    "CubeSize",    DEF_SIZE,    t_Float},
+  { &colmode_s, "colormode",   "ColorMode",   DEF_COLMODE, t_String}
+};
+
+static XrmOptionDescRec opts[] = {
+  { "-spin",        ".spin",        XrmoptionNoArg,  "True" },
+  { "+spin",        ".spin",        XrmoptionNoArg,  "False" },
+  { "-wander",      ".wander",      XrmoptionNoArg,  "True" },
+  { "+wander",      ".wander",      XrmoptionNoArg,  "False" },
+  { "-randomize",   ".randomize",   XrmoptionNoArg,  "True" },
+  { "+randomize",   ".randomize",   XrmoptionNoArg,  "False" },
+  { "-texture",     ".texture",     XrmoptionNoArg,  "True" },
+  { "+texture",     ".texture",     XrmoptionNoArg,  "False" },
+  { "-spinspeed",   ".spinspeed",   XrmoptionSepArg, 0 },
+  { "-wanderspeed", ".wanderspeed", XrmoptionSepArg, 0 },
+  { "-rotspeed",    ".rotspeed",    XrmoptionSepArg, 0 },
+  { "-wait",        ".wait",        XrmoptionSepArg, 0 },
+  { "-cubesize",    ".cubesize",    XrmoptionSepArg, 0 },
+  { "-colormode",   ".colormode",   XrmoptionSepArg, DEF_COLMODE }
+};
+
+ModeSpecOpt cube21_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct   cube21_description =
+{ "cube21", "init_cube21", "draw_cube21", "release_cube21",
+  "draw_cube21", "change_cube21", NULL, &cube21_opts,
+  25000, 1, 1, 1, 1.0, 4, "",
+  "Shows randomly shuffling Cube 21", 0, NULL
+};
+#endif
+
+typedef enum {
+  CUBE21_STATE_BASIC,
+  CUBE21_PAUSE1 = CUBE21_STATE_BASIC,
+  CUBE21_ROT_BASE,
+  CUBE21_ROT_TOP = CUBE21_ROT_BASE,
+  CUBE21_ROT_BOTTOM,
+  CUBE21_PAUSE2,
+  CUBE21_HALF_BASE,
+  CUBE21_HALF1 = CUBE21_HALF_BASE,
+  CUBE21_HALF2
+} cube21_state;
+
+typedef enum {
+  CUBE21_COLOR_WHITE,
+  CUBE21_COLOR_RANDOM,
+  CUBE21_COLOR_SILVER,
+  CUBE21_COLOR_TWORND,
+  CUBE21_COLOR_CLASSIC,
+  CUBE21_COLOR_SIXRND
+} cube21_cmode;
+
+typedef int pieces_t[2][13];
+typedef int cind_t[5][12];
+typedef GLfloat col_t[6][3];
+
+typedef struct {
+  GLXContext    *glx_context;
+  GLfloat       ratio;
+  cube21_state  state;          /* type of "rotation" - shuffling */
+  GLfloat       xrot, yrot;     /* "spin" - object rotation around axis */
+  GLfloat       posarg;         /* position argument (for sine function) */
+  GLfloat       t, tmax;        /* rotation clock */
+  int           hf[2], fr[2];   /* half flipped / face rotated flags */
+  int           rface, ramount; /* selected face and amount of rotation in multiplies of 30deg */
+  int           pieces[2][13];  /* locations of "narrow" and "wide" pieces */
+  int           cind[5][12];    /* color indices */
+  GLfloat       colors[6][3];   /* color map */
+} cube21_conf;
+
+static cube21_conf *cube21 = NULL;
+
+static GLfloat shininess = 20.0;
+static GLfloat ambient[] = {0.0, 0.0, 0.0, 1.0};
+static GLfloat diffuse[] = {1.0, 1.0, 1.0, 1.0};
+static GLfloat position0[] = {1.0, 1.0, 1.0, 0.0};
+static GLfloat position1[] = {-1.0, -1.0, 1.0, 0.0};
+static GLfloat lmodel_ambient[] = {0.1, 0.1, 0.1, 1.0};
+static GLfloat material_ambient[] = {0.7, 0.7, 0.7, 1.0};
+static GLfloat material_diffuse[] = {0.7, 0.7, 0.7, 1.0};
+static GLfloat material_specular[] = {0.2, 0.2, 0.2, 1.0};
+static GLfloat color_inner[] = {1.0, 1.0, 1.0};
+static GLfloat texc[8] = {0.0}, posc[6];
+static GLfloat zpos = -18.0;
+
+/*************************************************************************/
+
+static void find_matches(pieces_t pieces, int matches[12], int s) {
+  int i, j = 1;
+  for(i = 1; i<6; i++) {
+    if(pieces[s][i] && pieces[s][i+6]) {
+      matches[j++] = i;
+    }
+  }
+  matches[0] = j;
+  for(i = 1; i<matches[0]; i++) {
+    matches[j++] = matches[i]-6;
+  }
+  matches[j++] = 6;
+  matches[0] = j;
+}
+
+static void rot_face(pieces_t pieces, cind_t colors, int s, int o) {
+  int i;
+  int tmp[12], tmpc[2][12];
+  int c0 = 2*s, c1 = c0+1;
+  for(i = 0; i<12; i++) {
+    tmp[i] = pieces[s][i];
+    tmpc[0][i] = colors[c0][i];
+    tmpc[1][i] = colors[c1][i];
+  }
+  if(o<0) o += 12;
+  for(i = 0; i<12; i++, o++) {
+    if(o==12) o = 0;
+    pieces[s][i] = tmp[o];
+    colors[c0][i] = tmpc[0][o];
+    colors[c1][i] = tmpc[1][o];
+  }
+}
+
+static void rot_halves(pieces_t pieces, cind_t colors, int hf[2], int s) {
+  int ss = 6*s, i, j, k, t;
+  for(i = 0; i<6; i++) {
+    j = ss+i; k = ss+6-i;
+    t = pieces[0][j];
+    pieces[0][j] = pieces[1][k];
+    pieces[1][k] = t;
+    k--;
+    t = colors[0][j];
+    colors[0][j] = colors[2][k];
+    colors[2][k] = t;
+    t = colors[1][j];
+    colors[1][j] = colors[3][k];
+    colors[3][k] = t;
+  }
+  hf[s] ^= 1;
+}
+
+static void randomize(cube21_conf *cp) {
+  int i, j, s;
+  int matches[12];
+  for(i = 0; i<SHUFFLE; i++) {
+    s = rnd01();
+    find_matches(cp->pieces, matches, s);
+    j = matches[0]-1;
+    j = random()%j;
+    j = matches[j+1];
+    rot_face(cp->pieces, cp->cind, s, j);
+    s = rnd01();
+    rot_halves(cp->pieces, cp->cind, cp->hf, s);
+  }
+}
+
+static void finish(cube21_conf *cp) {
+  int j, s;
+  int matches[12];
+  switch(cp->state) {
+    case CUBE21_PAUSE1:
+      s = rnd01();
+      find_matches(cp->pieces, matches, s);
+      j = matches[0]-1;
+      j = random()%j;
+      j = matches[j+1];
+      if(j==6 && rnd01()) j = -6;
+      cp->state = CUBE21_ROT_BASE+s;
+      cp->tmax = 30.0*abs(j);
+      cp->fr[0] = cp->fr[1] = 0;
+      cp->rface = s;
+      cp->ramount = j;
+      break;
+    case CUBE21_ROT_TOP:
+    case CUBE21_ROT_BOTTOM:
+      rot_face(cp->pieces, cp->cind, s = cp->rface, cp->ramount);
+      cp->fr[s] = 1;
+      s ^= 1;
+      if(!cp->fr[s] && rnd01()) {
+        find_matches(cp->pieces, matches, s);
+        j = matches[0]-1;
+        j = random()%j;
+        j = matches[j+1];
+        if(j==6 && rnd01()) j = -6;
+        cp->state = CUBE21_ROT_BASE+s;
+        cp->tmax = 30.0*abs(j);
+        cp->rface = s;
+        cp->ramount = j;        
+        break;
+      } else {
+        cp->state = CUBE21_PAUSE2;
+        cp->tmax = twait;
+        break;
+      }
+    case CUBE21_PAUSE2:
+      s = rnd01();
+      cp->ramount = -rnd01();       /* 0 or -1, only sign is significant in this case */
+      cp->state = CUBE21_HALF_BASE+s;
+      cp->tmax = 180.0;
+      cp->rface = s;
+      break;
+    case CUBE21_HALF1:
+    case CUBE21_HALF2:
+      rot_halves(cp->pieces, cp->cind, cp->hf, cp->rface);
+      cp->state = CUBE21_PAUSE1;
+      cp->tmax = twait;
+      break;
+  }
+  cp->t = 0;
+}
+
+static void draw_narrow_piece(GLfloat s, int c1, int c2, col_t colors) {
+  GLfloat s1 = posc[0]*s;
+  glBegin(GL_TRIANGLES);
+  glNormal3f(0.0, 0.0, s);
+  if(cmat) glColor3fv(colors[c1]);
+  glTexCoord2f(0.0, 0.25);     glVertex3f(0.0, 0.0, s);
+  glTexCoord2f(0.5, texc[1]);  glVertex3f(posc[1], 0.0, s);
+  glTexCoord2f(0.5, texc[2]);  glVertex3f(posc[2], posc[3], s);
+  glNormal3f(0.0, 0.0, -s);
+  if(cmat) glColor3fv(color_inner);
+  glTexCoord2f(1.0, 1.0);
+  glVertex3f(0.0, 0.0, s1);
+  glVertex3f(posc[1], 0.0, s1);
+  glVertex3f(posc[2], posc[3], s1);
+  glEnd();
+  glBegin(GL_QUADS);
+  glNormal3f(0.0, -1.0, 0.0);
+  if(cmat) glColor3fv(color_inner);
+  glTexCoord2f(1.0, 1.0);
+  glVertex3f(0.0, 0.0, s);
+  glVertex3f(posc[1], 0.0, s);
+  glVertex3f(posc[1], 0.0, s1);
+  glVertex3f(0.0, 0.0, s1);
+  glNormal3f(COS15, SIN15, 0.0);
+  if(cmat) glColor3fv(colors[c2]);
+  glTexCoord2f(0.5, texc[1]);      glVertex3f(posc[1], 0.0, s);
+  glTexCoord2f(0.5, texc[2]);      glVertex3f(posc[2], posc[3], s);
+  glTexCoord2f(texc[4], texc[2]);  glVertex3f(posc[2], posc[3], s1);
+  glTexCoord2f(texc[4], texc[1]);  glVertex3f(posc[1], 0.0, s1);
+  glNormal3f(-SIN30, COS30, 0.0);
+  if(cmat) glColor3fv(color_inner);
+  glTexCoord2f(1.0, 1.0);
+  glVertex3f(0.0, 0.0, s);
+  glVertex3f(posc[2], posc[3], s);
+  glVertex3f(posc[2], posc[3], s1);
+  glVertex3f(0.0, 0.0, s1);
+  glEnd();
+  glRotatef(30.0, 0.0, 0.0, 1.0);
+}
+
+static void draw_wide_piece(GLfloat s, int c1, int c2, int c3, col_t colors) {
+  GLfloat s1 = posc[0]*s;
+  glBegin(GL_TRIANGLES);
+  glNormal3f(0.0, 0.0, s);
+  if(cmat) glColor3fv(colors[c1]);
+  glTexCoord2f(0.0, 0.25);     glVertex3f(0.0, 0.0, s);
+  glTexCoord2f(0.5, texc[1]);  glVertex3f(posc[1], 0.0, s);
+  glTexCoord2f(0.5, 0.0);      glVertex3f(posc[4], posc[5], s);
+  glTexCoord2f(0.5, 0.0);      glVertex3f(posc[4], posc[5], s);
+  glTexCoord2f(texc[3], 0.0);  glVertex3f(posc[3], posc[2], s);
+  glTexCoord2f(0.0, 0.25);     glVertex3f(0.0, 0.0, s);
+  glNormal3f(0.0, 0.0, -s);
+  if(cmat) glColor3fv(color_inner);
+  glTexCoord2f(1.0, 1.0);
+  glVertex3f(0.0, 0.0, s1);
+  glVertex3f(posc[1], 0.0, s1);
+  glVertex3f(posc[4], posc[5], s1);
+  glVertex3f(posc[4], posc[5], s1);
+  glVertex3f(posc[3], posc[2], s1);
+  glVertex3f(0.0, 0.0, s1);
+  glEnd();
+  glBegin(GL_QUADS);
+  glNormal3f(0.0, -1.0, 0);
+  if(cmat) glColor3fv(color_inner);
+  glTexCoord2f(1.0, 1.0);
+  glVertex3f(0.0, 0.0, s);
+  glVertex3f(posc[1], 0.0, s);
+  glVertex3f(posc[1], 0.0, s1);
+  glVertex3f(0.0, 0.0, s1);
+  glNormal3f(COS15, -SIN15, 0.0);
+  if(cmat) glColor3fv(colors[c2]);
+  glTexCoord2f(0.5, texc[1]);      glVertex3f(posc[1], 0.0, s);
+  glTexCoord2f(0.5, 0.0);          glVertex3f(posc[4], posc[5], s);
+  glTexCoord2f(texc[4], 0.0);      glVertex3f(posc[4], posc[5], s1);
+  glTexCoord2f(texc[4], texc[1]);  glVertex3f(posc[1], 0.0, s1);
+  glNormal3f(SIN15, COS15, 0.0);
+  if(cmat) glColor3fv(colors[c3]);
+  glTexCoord2f(0.5, texc[1]);      glVertex3f(posc[4], posc[5], s);
+  glTexCoord2f(0.5, 0.0);          glVertex3f(posc[3], posc[2], s);
+  glTexCoord2f(texc[4], 0.0);      glVertex3f(posc[3], posc[2], s1);
+  glTexCoord2f(texc[4], texc[1]);  glVertex3f(posc[4], posc[5], s1);
+  glNormal3f(-COS30, SIN30, 0.0);
+  if(cmat) glColor3fv(color_inner);
+  glTexCoord2f(1.0, 1.0);
+  glVertex3f(0.0, 0.0, s);
+  glVertex3f(posc[3], posc[2], s);
+  glVertex3f(posc[3], posc[2], s1);
+  glVertex3f(0.0, 0.0, s1);
+  glEnd();
+  glRotatef(60.0, 0.0, 0.0, 1.0);
+}
+
+static void draw_middle_piece(int s, cind_t cind, col_t colors) {
+  s *= 6;
+  glBegin(GL_QUADS);
+  if(cmat) glColor3fv(color_inner);
+  glNormal3f(0.0, 0.0, 1.0);
+  glTexCoord2f(1.0, 1.0);
+  glVertex3f(posc[1], 0.0, posc[0]);
+  glVertex3f(posc[4], posc[5], posc[0]);
+  glVertex3f(-posc[5], posc[4], posc[0]);
+  glVertex3f(-posc[1], 0.0, posc[0]);
+  glNormal3f(0.0, 0.0, -1.0);
+  glTexCoord2f(1.0, 1.0);
+  glVertex3f(posc[1], 0.0, -posc[0]);
+  glVertex3f(posc[4], posc[5], -posc[0]);
+  glVertex3f(-posc[5], posc[4], -posc[0]);
+  glVertex3f(-posc[1], 0.0, -posc[0]);
+  glNormal3f(0.0, -1.0, 0.0);
+  glTexCoord2f(1.0, 1.0);
+  glVertex3f(-posc[1], 0.0, posc[0]);
+  glVertex3f(posc[1], 0.0, posc[0]);
+  glVertex3f(posc[1], 0.0, -posc[0]);
+  glVertex3f(-posc[1], 0.0, -posc[0]);
+  glNormal3f(COS15, -SIN15, 0.0);
+  if(cmat) glColor3fv(colors[cind[4][s]]);
+  glTexCoord2f(texc[5], 0.5);      glVertex3f(posc[1], 0.0, posc[0]);
+  glTexCoord2f(1.0, 0.5);          glVertex3f(posc[4], posc[5], posc[0]);
+  glTexCoord2f(1.0, texc[7]);      glVertex3f(posc[4], posc[5], -posc[0]);
+  glTexCoord2f(texc[5], texc[7]);  glVertex3f(posc[1], 0.0, -posc[0]);
+  glNormal3f(SIN15, COS15, 0.0);
+  if(cmat) glColor3fv(colors[cind[4][s+1]]);
+  glTexCoord2f(0.0, 0.5);      glVertex3f(posc[4], posc[5], posc[0]);
+  glTexCoord2f(1.0, 0.5);      glVertex3f(-posc[5], posc[4], posc[0]);
+  glTexCoord2f(1.0, texc[6]);  glVertex3f(-posc[5], posc[4], -posc[0]);
+  glTexCoord2f(0.0, texc[6]);  glVertex3f(posc[4], posc[5], -posc[0]);
+  glNormal3f(-COS15, SIN15, 0.0);
+  if(cmat) glColor3fv(colors[cind[4][s+4]]);
+  glTexCoord2f(0.0, 0.5);          glVertex3f(-posc[5], posc[4], posc[0]);
+  glTexCoord2f(texc[5], 0.5);      glVertex3f(-posc[1], 0.0, posc[0]);
+  glTexCoord2f(texc[5], texc[7]);  glVertex3f(-posc[1], 0.0, -posc[0]);
+  glTexCoord2f(0.0, texc[7]);      glVertex3f(-posc[5], posc[4], -posc[0]);
+  glEnd();
+}
+
+static void draw_middle(cube21_conf *cp) {
+  if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0);
+  draw_middle_piece(0, cp->cind, cp->colors);
+  if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0);
+  glRotatef(180.0, 0.0, 0.0, 1.0);
+  if(cp->hf[1]) glRotatef(180.0, 0.0, 1.0, 0.0);
+  draw_middle_piece(1, cp->cind, cp->colors);
+  if(cp->hf[1]) glRotatef(180.0, 0.0, 1.0, 0.0);
+}
+
+static void draw_half_face(cube21_conf *cp, int s, int o) {
+  int i, s1 = 1-s*2, s2 = s*2;
+  for(i = o; i<o+6; i++) {
+    if(cp->pieces[s][i+1])
+      draw_narrow_piece(s1, cp->cind[s2][i], cp->cind[s2+1][i], cp->colors);
+    else {
+      draw_wide_piece(s1, cp->cind[s2][i], cp->cind[s2+1][i], cp->cind[s2+1][i+1], cp->colors);
+      i++;
+    }
+  }
+}
+
+static void draw_top_face(cube21_conf *cp) {
+  draw_half_face(cp, 0, 0);
+  draw_half_face(cp, 0, 6);
+}
+
+static void draw_bottom_face(cube21_conf *cp) {
+  draw_half_face(cp, 1, 0);
+  draw_half_face(cp, 1, 6);
+}
+
+static Bool draw_main(cube21_conf *cp) {
+  GLfloat theta = cp->ramount<0?cp->t:-cp->t;
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+  glLoadIdentity();
+  if(wander)
+    glTranslatef(3.0*cp->ratio*sin(13.0*cp->posarg), 3.0*sin(17.0*cp->posarg), zpos);
+  else
+    glTranslatef(0, 0, zpos);
+  glScalef(size, size, size);
+  glRotatef(cp->xrot, 1.0, 0.0, 0.0);
+  glRotatef(cp->yrot, 0.0, 1.0, 0.0);
+  if(wire) glColor3f(0.7, 0.7, 0.7);
+  switch(cp->state) {
+    case CUBE21_PAUSE1:
+    case CUBE21_PAUSE2:
+      draw_top_face(cp);
+      draw_bottom_face(cp);
+      draw_middle(cp);
+      break;
+    case CUBE21_ROT_TOP:
+      glRotatef(theta, 0.0, 0.0, 1.0);
+      draw_top_face(cp);
+      glRotatef(-theta, 0.0, 0.0, 1.0);
+      draw_bottom_face(cp);
+      draw_middle(cp);
+      break;
+    case CUBE21_ROT_BOTTOM:
+      draw_top_face(cp);
+      glRotatef(theta, 0.0, 0.0, 1.0);
+      draw_bottom_face(cp);
+      glRotatef(-theta, 0.0, 0.0, 1.0);
+      draw_middle(cp);
+      break;
+    case CUBE21_HALF1:
+      glRotatef(theta, 0.0, 1.0, 0.0);
+    case CUBE21_HALF2:
+      draw_half_face(cp, 0, 0);
+      glRotatef(-180.0, 0.0, 0.0, 1.0);
+      draw_half_face(cp, 1, 0);
+      glRotatef(-180.0, 0.0, 0.0, 1.0);
+      if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0);
+      draw_middle_piece(0, cp->cind, cp->colors);
+      if(cp->hf[0]) glRotatef(180.0, 0.0, 1.0, 0.0);
+      if(cp->state==CUBE21_HALF1)
+        glRotatef(-theta, 0.0, 1.0, 0.0);
+      else
+        glRotatef(theta, 0.0, 1.0, 0.0);
+      glRotatef(180.0, 0.0, 0.0, 1.0);
+      draw_half_face(cp, 0, 6);
+      glRotatef(-180.0, 0.0, 0.0, 1.0);
+      draw_half_face(cp, 1, 6);
+      glRotatef(-180.0, 0.0, 0.0, 1.0);
+      if(cp->hf[1]) glRotatef(180.0, 0.0, 1.0, 0.0);
+      draw_middle_piece(1, cp->cind, cp->colors);
+      break;
+  }
+  if(spin) {
+    if((cp->xrot += spinspeed)>360.0) cp->xrot -= 360.0;
+    if((cp->yrot += spinspeed)>360.0) cp->yrot -= 360.0;
+  }
+  if(wander)
+    if((cp->posarg += wspeed/1000.0)>360.0) cp->posarg -= 360.0;
+  if((cp->t += tspeed)>cp->tmax) finish(cp);
+  return True;
+}
+
+void parse_colmode(void) {
+  if(!colmode_s) {
+    colmode = CUBE21_COLOR_WHITE;
+    return;
+  }
+  if(strstr(colmode_s, "se") || strstr(colmode_s, "sil")) colmode = CUBE21_COLOR_SILVER;
+  else if(strstr(colmode_s, "ce") || strstr(colmode_s, "cla")) colmode = CUBE21_COLOR_CLASSIC;
+  else if(strstr(colmode_s, "2") || strstr(colmode_s, "two")) colmode = CUBE21_COLOR_TWORND;
+  else if(strstr(colmode_s, "6") || strstr(colmode_s, "six")) colmode = CUBE21_COLOR_SIXRND;
+  else if(strstr(colmode_s, "1") || strstr(colmode_s, "ran") || strstr(colmode_s, "rnd")) colmode = CUBE21_COLOR_RANDOM;
+  else colmode = CUBE21_COLOR_WHITE;
+}
+
+static void init_texc(void) {
+  GLfloat p = tan(Pi/12);
+  if(texc[0]) return;
+  /* Some significant non-trivial coordinates of the texture... */
+  texc[0] = p;                     /* 0.268 */
+  texc[1] = (1.0-p)/4;             /* 0.183 */
+  texc[2] = (1.0+p)/4;             /* 0.317 */
+  texc[3] = p/2;                   /* 0.134 */
+  texc[4] = 1.0-p/2;               /* 0.866 = sqrt(3)/2 */
+  texc[5] = (1.0+p)/2;             /* 0.634 */
+  texc[6] = (1.0-p)/2;             /* 0.366 */
+  texc[7] = (1.0+p)/2;             /* = texc[5], but has different purpose */
+  /* ...and of the object. We need them exactly at GLfloat precision
+   * for the edges to line up perfectly. */
+  posc[0] = p;                     /* 0.268 */
+  posc[1] = 1.0/cos(Pi/12);        /* 1.035 */
+  posc[2] = cos(Pi/6)/cos(Pi/12);  /* 0.897 */
+  posc[3] = sin(Pi/6)/cos(Pi/12);  /* 0.518 */
+  posc[4] = sqrt(2)*cos(Pi/6);     /* 1.225 */
+  posc[5] = sqrt(2)*sin(Pi/6);     /* 0.707 = 1/sqrt(2) */
+}
+
+/* It doesn't look good */
+/*#define MIPMAP*/
+
+static void init_gl(ModeInfo *mi) {
+#ifdef MIPMAP
+  int status;
+#endif
+  parse_colmode();
+  wire = MI_IS_WIREFRAME(mi);
+  cmat = !wire && (colmode != CUBE21_COLOR_WHITE);
+  if(MI_IS_MONO(mi)) {
+    tex = False;
+    cmat = False;
+  }
+  if(wire) {
+    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+    return;
+  }
+  if(!tex) color_inner[0] = color_inner[1] = color_inner[2] = 0.4;
+  glClearDepth(1.0);
+  glClearColor(0.0, 0.0, 0.0, 1.0);
+  glDrawBuffer(GL_BACK);
+  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+  glShadeModel(GL_FLAT);
+  glDepthFunc(GL_LESS);
+  glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+  glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+  glLightfv(GL_LIGHT0, GL_POSITION, position0);
+  glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+  glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+  glLightfv(GL_LIGHT1, GL_POSITION, position1);
+  glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+  glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
+  glEnable(GL_DEPTH_TEST);
+  glEnable(GL_LIGHT0);
+  glEnable(GL_LIGHT1);
+  glEnable(GL_LIGHTING);
+  glEnable(GL_NORMALIZE);
+  glEnable(GL_COLOR_MATERIAL);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, material_ambient);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material_diffuse);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material_specular);
+  glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
+  if(!tex) return;
+  glEnable(GL_TEXTURE_2D);
+#ifdef MIPMAP
+  clear_gl_error();
+  status = gluBuild2DMipmaps(GL_TEXTURE_2D, 3, cubetex.width, cubetex.height,
+      GL_RGB, GL_UNSIGNED_BYTE, cubetex.pixel_data);
+  if (status) {
+    const char *s = gluErrorString(status);
+    fprintf (stderr, "%s: error mipmapping texture: %s\n", progname, (s?s:"(unknown)"));
+    exit (1);
+  }
+  check_gl_error("mipmapping");
+#else    
+  glTexImage2D(GL_TEXTURE_2D, 0, cubetex.bytes_per_pixel, cubetex.width, cubetex.height,
+      0, GL_RGB, GL_UNSIGNED_BYTE, cubetex.pixel_data);
+#endif  
+  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+#ifdef MIPMAP
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+#else
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+#endif
+}
+
+static void init_cp(cube21_conf *cp) {
+  int i, j;
+  GLfloat ce_colors[6][3] = {
+    {1.0, 1.0, 1.0},
+    {1.0, 0.5, 0.0},
+    {0.0, 0.9, 0.0},
+    {0.8, 0.0, 0.0},
+    {0.1, 0.1, 1.0},
+    {0.9, 0.9, 0.0}
+  };
+  cp->state = CUBE21_STATE_BASIC;
+  cp->xrot = -65.0; cp->yrot = 185.0;
+  cp->posarg = (wspeed?random()%360:0.0);
+  cp->t = 0.0; cp->tmax = twait;
+  cp->hf[0] = cp->hf[1] = 0;
+  cp->fr[0] = cp->fr[1] = 0;
+  for(i=0;i<13;i++)
+    cp->pieces[0][i] = cp->pieces[1][i] = (i%3==1?0:1);
+  switch(colmode) {
+    case CUBE21_COLOR_RANDOM:
+    case CUBE21_COLOR_TWORND:
+    case CUBE21_COLOR_SIXRND:
+      for(i=0; i<6; i++)
+        for(j=0; j<3; j++)
+          cp->colors[i][j] = rndcolor();
+      break;
+    case CUBE21_COLOR_SILVER:
+      cp->colors[0][0] = 1.0;
+      cp->colors[0][1] = 1.0;
+      cp->colors[0][2] = 1.0;
+      cp->colors[1][0] = rndcolor();
+      cp->colors[1][1] = rndcolor();
+      cp->colors[1][2] = rndcolor();
+      break;
+    case CUBE21_COLOR_CLASSIC:
+      for(i=0; i<6; i++)
+        for(j=0; j<3; j++)
+          cp->colors[i][j] = 0.2+0.7*ce_colors[i][j];
+      break;
+  }
+  switch(colmode) {
+    case CUBE21_COLOR_SILVER:
+    case CUBE21_COLOR_TWORND:
+      for(i=0; i<5; i++)
+        for(j=0; j<12; j++)
+          if(i==0) cp->cind[i][j] = 0;
+          else if(i==2) cp->cind[i][j] = 1;
+          else cp->cind[i][j] = ((j+5)%12)>=6?1:0;
+      break;
+    case CUBE21_COLOR_CLASSIC:
+    case CUBE21_COLOR_SIXRND:
+      for(i=0; i<5; i++)
+        for(j=0; j<12; j++)
+          if(i==0) cp->cind[i][j] = 4;
+          else if(i==2) cp->cind[i][j] = 5;
+          else cp->cind[i][j] = ((j+5)%12)/3;
+      break;
+    case CUBE21_COLOR_RANDOM:
+      for(i=0; i<5; i++)
+        for(j=0; j<12; j++)
+          cp->cind[i][j] = 0;
+      break;
+  }
+  if(rndstart) randomize(cp);
+}
+
+/*************************************************************************/
+
+void reshape_cube21(ModeInfo *mi, int width, int height) {
+  cube21_conf *cp = &cube21[MI_SCREEN(mi)];
+  if(!height) height = 1;
+  cp->ratio = (GLfloat)width/(GLfloat)height;
+  glViewport(0, 0, (GLint) width, (GLint) height);
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  gluPerspective(30.0, cp->ratio, 1.0, 100.0);
+  glMatrixMode(GL_MODELVIEW);
+  glClear(GL_COLOR_BUFFER_BIT);
+}
+
+void release_cube21(ModeInfo *mi) {
+  if (cube21 != NULL) {
+    int screen;
+    for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+      cube21_conf *cp = &cube21[screen];
+      if (cp->glx_context) {
+        cp->glx_context = NULL;
+      }
+    }
+    free((void *)cube21);
+    cube21 = NULL;
+  }
+  FreeAllGL(mi);
+}
+
+void init_cube21(ModeInfo *mi) {
+  cube21_conf *cp;
+  if(!cube21) {
+    cube21 = (cube21_conf *)calloc(MI_NUM_SCREENS(mi), sizeof(cube21_conf));
+    if(!cube21) return;
+  }
+  init_texc();
+  cp = &cube21[MI_SCREEN(mi)];
+  if ((cp->glx_context = init_GL(mi)) != NULL) {
+    init_gl(mi);
+    init_cp(cp);
+    reshape_cube21(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+  } else {
+    MI_CLEARWINDOW(mi);
+  }
+}
+
+void draw_cube21(ModeInfo * mi) {
+  Display *display = MI_DISPLAY(mi);
+  Window window = MI_WINDOW(mi);
+  cube21_conf *cp;
+  if (!cube21) return;
+  cp = &cube21[MI_SCREEN(mi)];
+  MI_IS_DRAWN(mi) = True;
+  if (!cp->glx_context) return;
+  glXMakeCurrent(display, window, *(cp->glx_context));
+  if (!draw_main(cp)) {
+    release_cube21(mi);
+    return;
+  }
+  if (MI_IS_FPS(mi)) do_fps (mi);
+  glFlush();
+  glXSwapBuffers(display, window);
+}
+
+void change_cube21(ModeInfo * mi) {
+  cube21_conf *cp = &cube21[MI_SCREEN(mi)];
+  if (!cp->glx_context) return;
+  glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(cp->glx_context));
+  init_gl(mi);
+}
+
+#endif
diff --git a/hacks/glx/cube21.man b/hacks/glx/cube21.man
new file mode 100644 (file)
index 0000000..4f93582
--- /dev/null
@@ -0,0 +1,149 @@
+.TH XScreenSaver 1 "30-Aug-05" "X Version 11"
+.SH NAME
+cube21 - animates the Cube 21 puzzle
+.SH SYNOPSIS
+.B cube21
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-install]
+[\-delay \fImicroseconds\fP]
+[\-texture] [\-no\-texture]
+[\-mono]
+[\-wireframe]
+[\-spin] [\-no\-spin]
+[\-wander] [\-no\-wander]
+[\-randomize] [\-no\-randomize]
+[\-spinspeed \fInumber\fP]
+[\-rotspeed \fInumber\fP]
+[\-wanderspeed \fInumber\fP]
+[\-wait \fInumber\fP]
+[\-cubesize \fInumber\fP]
+[\-colormode \fIarg\fP]
+[\-fps]
+.SH DESCRIPTION
+This program animates a puzzle known as Cube 21 or Square-1.
+Its moves are chosen randomly.
+.P
+Cube 21 is a Rubik-like puzzle invented in 1992.  Its specialities are that
+it can change its shape and even the number of possible moves.  It can have
+more than 200 different shapes and the total number of configurations
+(assuming colors) is several tens of billions.
+.SH OPTIONS
+.I cube21
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How long to pause between frames.  Default is 20000, or 0.02 second.
+.TP 8
+.B \-texture
+Use texture maps.  This is the default.
+.TP 8
+.B \-no\-texture
+Use solid colors.
+.TP 8
+.B \-mono
+Disable both texture maps and colors.
+.TP 8
+.B \-wireframe
+Only draw outlines.  Outlines of all pieces, not only the whole object, are drawn.
+.TP 8
+.B \-spin
+Spin the whole object around X, Y and Z axes.  This is the default.
+.TP 8
+.B \-no\-spin
+Do not spin, showing the same three faces all the time.
+.TP 8
+.B \-wander
+Move the object around the screen.  This is the default.
+.TP 8
+.B \-no\-wander
+Keep the object centered on the screen.
+.TP 8
+.B \-randomize
+Shuffle the puzzle randomly at startup.  This is the default.
+.TP 8
+.B \-no\-randomize
+Do not shuffle at startup, begin at the shape of cube.
+.TP 8
+.B \-spinspeed \fInumber\fP
+The relative speed of spinning.  Default is 1.0.
+.TP 8
+.B \-rotspeed \fInumber\fP
+The relative speed of the moves.  Default is 3.0.  Setting to \(<= 0.0
+makes the object stay at one configuration.
+.TP 8
+.B \-wanderspeed \fInumber\fP
+The relative speed of wandering around the screen.  Default is 1.0.
+.TP 8
+.B \-wait \fInumber\fP
+How long to stay at ending position after each move.  The meaning of
+the argument is again relative.  Default is 40.0.
+.TP 8
+.B \-cubesize \fInumber\fP
+Size of the object.  Value of 3.0 fills roughly all the screen (its height).  Default is 0.7.
+.TP 8
+.B \-colormode \fIargument\fP
+How many and which colors should the object have.  The colors are put on the piece
+faces so that the puzzle is solvable.  The inner faces are not influenced.
+.RS
+.TP 8
+.BR se " or " silver
+Simulate the "Silver Edition" \- white and one random color.
+.TP 8
+.BR 2 " or " two
+Two random colors.
+.TP 8
+.BR ce " or " classic
+Simulate the "Classic Edition" \- white, yellow, orange, red, green and blue.
+.TP 8
+.BR 6 " or " six
+Six random colors.
+.TP 8
+.BR 1 " or " random " or " rnd
+One random color.
+.TP 8
+Anything else
+All faces white.
+.RE
+.TP 8
+.B \-fps
+Display a running tally of how many frames per second are being rendered.
+In conjunction with \fB\-delay 0\fP, this can be a useful benchmark of 
+your GL performance.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Vaclav Potocek.  Permission to use, copy, modify, 
+distribute, and sell this software and its documentation for any purpose is 
+hereby granted without fee, provided that the above copyright notice appear 
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Vaclav (Vasek) Potocek <vasek.potocek@post.cz>, 30-Aug-05.
index 2f27ba0c3fcc5e98a5201b418801313c33d6769d..bd055982f237508dd386f6ac326d9af44fcfe1f9 100644 (file)
@@ -61,16 +61,21 @@ static const char sccsid[] = "@(#)gears.c   4.07 97/11/24 xlockmore";
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
 #define DEF_PLANETARY "False"
+#define DEF_SPIN "True"
 
 static int planetary;
+static int spin;
 
 static XrmOptionDescRec opts[] = {
   {"-planetary", ".gears.planetary", XrmoptionNoArg, "true" },
   {"+planetary", ".gears.planetary", XrmoptionNoArg, "false" },
+  {"-spin", ".gears.spin", XrmoptionNoArg, "true" },
+  {"+spin", ".gears.spin", XrmoptionNoArg, "false" },
 };
 
 static argtype vars[] = {
   {&planetary, "planetary", "Planetary", DEF_PLANETARY, t_Bool},
+  {&spin, "spin", "Spin", DEF_SPIN, t_Bool},
 };
 
 ModeSpecOpt gears_opts = {countof(opts), opts, countof(vars), vars, NULL};
@@ -535,13 +540,14 @@ draw(ModeInfo * mi)
 
     gltrackball_rotate (gp->trackball);
 
-    {
-      double x, y, z;
-      get_rotation (gp->rot, &x, &y, &z, !gp->button_down_p);
-      glRotatef (x * 360, 1.0, 0.0, 0.0);
-      glRotatef (y * 360, 0.0, 1.0, 0.0);
-      glRotatef (z * 360, 0.0, 0.0, 1.0);
-    }
+    if (spin)
+         {
+               double x, y, z;
+               get_rotation (gp->rot, &x, &y, &z, !gp->button_down_p);
+               glRotatef (x * 360, 1.0, 0.0, 0.0);
+               glRotatef (y * 360, 0.0, 1.0, 0.0);
+               glRotatef (z * 360, 0.0, 0.0, 1.0);
+         }
 
     if (!planetary) {
       glPushMatrix();
diff --git a/hacks/glx/glhanoi.c b/hacks/glx/glhanoi.c
new file mode 100644 (file)
index 0000000..b0f91ca
--- /dev/null
@@ -0,0 +1,1484 @@
+/* glhanoi, Copyright (c) 2005 Dave Atkinson <dave.atkinson@uwe.ac.uk>
+ * except noise function code Copyright (c) 2002 Ken Perlin
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#include <assert.h>
+#include <X11/Intrinsic.h>
+
+#include <rotator.h>
+
+#define PROGCLASS         "glhanoi"
+#define HACK_INIT         init_glhanoi
+#define HACK_DRAW         draw_glhanoi
+#define HACK_RESHAPE      reshape_glhanoi
+#define HACK_HANDLE_EVENT glhanoi_handle_event
+#define EVENT_MASK        PointerMotionMask
+#define glh_opts          xlockmore_opts
+
+#define DEF_DELAY     "15000"
+#define DEF_DISKS     "7"
+#define DEF_WIRE      "False"
+#define DEF_LIGHT     "True"
+#define DEF_FPS       "False"
+#define DEF_FOG       "False"
+#define DEF_TEXTURE   "True"
+
+#define DEFAULTS "*delay:     " DEF_DELAY     "\n" \
+                                "*count:     " DEF_DISKS     "\n" \
+                                "*showFPS:   " DEF_FPS       "\n" \
+                                "*wireframe: " DEF_WIRE      "\n"
+
+#define NSLICE 32
+#define NLOOPS 1
+#define START_DURATION 1.0
+#define FINISH_DURATION 1.0
+#define BASE_LENGTH 30.0
+#define BOARD_SQUARES 8
+
+#define MAX_CAMERA_RADIUS 250.0
+#define MIN_CAMERA_RADIUS 75.0
+
+#define MARBLE_SCALE 1.01
+
+enum {
+       MARBLE_TEXURE,
+       N_TEXTURES
+};
+
+#define MARBLE_TEXTURE_SIZE 256
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include <math.h>
+#include "xlockmore.h"
+
+#ifdef USE_GL                                  /* whole file */
+
+#include <GL/glu.h>
+
+#ifdef HAVE_GETTIMEOFDAY
+#ifdef GETTIMEOFDAY_TWO_ARGS
+# include <sys/time.h>
+# include <time.h>
+typedef struct timeval glhtime;
+#else                                                  /* GETTIMEOFDAY_TWO_ARGS */
+# include <sys/time.h>
+# include <time.h>
+typedef struct timeval glhtime;
+#endif
+#else                                                  /* HAVE_GETTIMEOFDAY */
+#ifdef HAVE_FTIME
+# include <sys/timeb.h>
+typedef struct timeb glhtime;
+#endif                                                 /* HAVE_FTIME */
+#endif                                                 /* HAVE_GETTIMEOFDAY */
+
+double getTime(void)
+{
+#ifdef HAVE_GETTIMEOFDAY
+       struct timeval t;
+#ifdef GETTIMEOFDAY_TWO_ARGS
+       gettimeofday(&t, NULL);
+#else                                                  /* !GETTIMEOFDAY_TWO_ARGS */
+       gettimeofday(&t);
+#endif                                                 /* !GETTIMEOFDAY_TWO_ARGS */
+#else                                                  /* !HAVE_GETTIMEOFDAY */
+#ifdef HAVE_FTIME
+       ftime(&t);
+#endif                                                 /* HAVE_FTIME */
+#endif                                                 /* !HAVE_GETTIMEOFDAY */
+       return t.tv_sec + t.tv_usec / 1000000.0;
+}
+
+typedef enum {
+       START,
+       MOVE_DISK,
+       MOVE_FINISHED,
+       FINISHED,
+       MONEY_SHOT,
+       INVALID = -1
+} State;
+
+typedef struct {
+       int id;
+       GLuint displayList;
+       GLfloat position[3];
+       GLfloat rotation[3];
+       GLfloat color[4];
+       GLfloat base0;
+       GLfloat base1;
+       GLfloat height;
+       GLfloat xmin, xmax, ymin;
+       GLfloat u1, u2;
+       GLfloat t1, t2;
+       GLfloat ucostheta, usintheta;
+       GLdouble rotAngle;
+} Disk;
+
+typedef struct {
+       Disk **data;
+       int count;
+       int size;
+} Stack;
+
+typedef struct {
+       GLXContext *glx_context;
+       State state;
+       Bool wire;
+       Bool fog;
+       Bool light;
+       double startTime;
+       double lastTime;
+       double duration;
+       int numberOfDisks;
+       int numberOfMoves;
+       int maxDiskIdx;
+       int magicNumber;
+       Disk *currentDisk;
+       int move;
+       int src;
+       int tmp;
+       int dst;
+       int oldsrc;
+       int oldtmp;
+       int olddst;
+       Stack pole[3];
+       float boardSize;
+       float baseLength;
+       float baseWidth;
+       float baseHeight;
+       float poleRadius;
+       float poleHeight;
+       float poleOffset;
+       float diskHeight;
+       float *diskPos;                         /* pre-computed disk positions on rods */
+       Disk *disk;
+       float speed;
+       GLint floorList;
+       GLint baseList;
+       GLint poleList;
+       GLfloat camera[3];
+       GLfloat centre[3];
+       rotator *the_rotator;
+       Bool button_down_p;
+       Bool texture;
+       GLuint textureNames[N_TEXTURES];
+       int drag_x;
+       int drag_y;
+} glhcfg;
+
+static glhcfg *glhanoi_cfg = NULL;
+static glhcfg *glhanoi = NULL;
+static Bool fog;
+static Bool light;
+static Bool texture;
+
+static XrmOptionDescRec opts[] = {
+       {"-light", ".glhanoi.light", XrmoptionNoArg, (caddr_t) "true"},
+       {"+light", ".glhanoi.light", XrmoptionNoArg, (caddr_t) "false"},
+       {"-fog", ".glhanoi.fog", XrmoptionNoArg, (caddr_t) "true"},
+       {"+fog", ".glhanoi.fog", XrmoptionNoArg, (caddr_t) "false"},
+       {"-texture", ".glhanoi.texture", XrmoptionNoArg, (caddr_t) "true"},
+       {"+texture", ".glhanoi.texture", XrmoptionNoArg, (caddr_t) "false"}
+};
+
+static argtype vars[] = {
+       {(caddr_t *) (void *)&light, "light", "Light", DEF_LIGHT, t_Bool},
+       {(caddr_t *) (void *)&fog, "fog", "Fog", DEF_FOG, t_Bool},
+       {(caddr_t *) (void *)&texture, "texture", "Texture", DEF_TEXTURE,
+        t_Bool}
+};
+
+static OptionStruct desc[] = {
+       {"+/-light", "whether to light the scene"},
+       {"+/-fog", "whether to apply fog to the scene"},
+       {"+/-texture", "whether to apply texture to the scene"}
+};
+
+ModeSpecOpt glh_opts = { countof(opts), opts, countof(vars), vars, desc };
+
+#ifdef USE_MODULES
+
+ModStruct glhanoi_description = {
+       "glhanoi", "init_glhanoi", "draw_glhanoi", "release_glhanoi",
+       "draw_glhanoi", "init_glhanoi", NULL, &glhanoi_opts,
+       1000, 1, 2, 1, 4, 1.0, "",
+       "Towers of Hanoi", 0, NULL
+};
+
+#endif
+
+static GLfloat cBlack[] = { 0.0, 0.0, 0.0, 1.0 };
+static GLfloat cWhite[] = { 1.0, 1.0, 1.0, 1.0 };
+static GLfloat poleColor[] = { 0.545, 0.137, 0.137 };
+static GLfloat baseColor[] = { 0.34, 0.34, 0.48 };
+static GLfloat fogcolor[] = { 0.5, 0.5, 0.5 };
+
+static float left[] = { 1.0, 0.0, 0.0 };
+static float up[] = { 0.0, 1.0, 0.0 };
+static float front[] = { 0.0, 0.0, 1.0 };
+static float right[] = { -1.0, 0.0, 0.0 };
+static float down[] = { 0.0, -1.0, 0.0 };
+static float back[] = { 0.0, 0.0, -1.0 };
+
+GLfloat pos0[4] = { 50.0, 50.0, 50.0, 0.0 };
+GLfloat amb0[4] = { 0.0, 0.0, 0.0, 1.0 };
+GLfloat dif0[4] = { 1.0, 1.0, 1.0, 1.0 };
+GLfloat spc0[4] = { 0.0, 1.0, 1.0, 1.0 };
+
+GLfloat pos1[4] = { -50.0, 50.0, -50.0, 0.0 };
+GLfloat amb1[4] = { 0.0, 0.0, 0.0, 1.0 };
+GLfloat dif1[4] = { 1.0, 1.0, 1.0, 1.0 };
+GLfloat spc1[4] = { 1.0, 1.0, 1.0, 1.0 };
+
+float g = 3.0 * 9.80665;               /* hmm, looks like we need more gravity, Scotty... */
+
+#define DOPUSH(X, Y)   (((X)->count) >= ((X)->size)) ? NULL : ((X)->data[(X)->count++] = (Y))
+#define DOPOP(X)       (X)->count <= 0 ? NULL : ((X)->data[--((X)->count)])
+
+Disk *push(int idx, Disk * d)
+{
+       return DOPUSH(&glhanoi->pole[idx], d);
+}
+
+Disk *pop(int idx)
+{
+       return DOPOP(&glhanoi->pole[idx]);
+}
+
+inline void swap(int *x, int *y)
+{
+       *x = *x ^ *y;
+       *y = *x ^ *y;
+       *x = *x ^ *y;
+}
+
+/*
+ * magic - it's magic...
+ */
+int magic(int i)
+{
+       int count = 0;
+       if(i <= 1)
+               return 0;
+       while((i & 0x01) == 0) {
+               i >>= 1;
+               count++;
+       }
+       return count % 2 == 0;
+}
+
+float distance(float *p0, float *p1)
+{
+       float x, y, z;
+       x = p1[0] - p0[0];
+       y = p1[1] - p0[1];
+       z = p1[2] - p0[2];
+       return (float)sqrt(x * x + y * y + z * z);
+}
+
+GLfloat A(GLfloat a, GLfloat b, GLfloat c)
+{
+       GLfloat sum = a + b;
+       return c / (a * b - 0.25 * sum * sum);
+}
+
+void moveSetup(Disk * disk)
+{
+       float h, ymax;
+       float u;
+       int src = glhanoi->src;
+       int dst = glhanoi->dst;
+       GLfloat theta;
+       GLfloat sintheta, costheta;
+
+       if(glhanoi->state != FINISHED && random() % 6 == 0) {
+               disk->rotAngle =
+                       -180.0 * (2 - 2 * random() % 2) * (random() % 3 + 1);
+       } else {
+               disk->rotAngle = -180.0;
+       }
+
+       disk->base0 = glhanoi->diskPos[glhanoi->pole[src].count];
+       disk->base1 =
+               glhanoi->state ==
+               FINISHED ? disk->base0 : glhanoi->diskPos[glhanoi->pole[dst].
+                                                                                                 count];
+
+       disk->xmin = glhanoi->poleOffset * (src - 1);
+       disk->xmax = glhanoi->poleOffset * (dst - 1);
+       disk->ymin = glhanoi->poleHeight;
+       ymax =
+               glhanoi->poleHeight + fabs(disk->xmax -
+                                                                  disk->xmin) * (glhanoi->state ==
+                                                                                                 FINISHED ? 1.0 +
+                                                                                                 (double)(glhanoi->
+                                                                                                                  numberOfDisks -
+                                                                                                                  disk->id) /
+                                                                                                 (double)glhanoi->
+                                                                                                 numberOfDisks : 1.0);
+
+       h = ymax - disk->ymin;
+       theta = atan((disk->xmin - disk->xmax) * A(disk->xmin, disk->xmax, h));
+       if(theta < 0.0)
+               theta += M_PI;
+       costheta = cos(theta);
+       sintheta = sin(theta);
+       u = (float)
+               sqrt(fabs
+                        (-g /
+                         (2.0 * A(disk->xmin, disk->xmax, h) * costheta * costheta)));
+       disk->usintheta = u * sintheta;
+       disk->ucostheta = u * costheta;
+       disk->t1 =
+               (-u + sqrt(u * u + 2.0 * g * fabs(disk->ymin - disk->base0))) / g;
+       disk->u1 = u + g * disk->t1;
+       disk->t2 = 2.0 * disk->usintheta / g;
+       disk->u2 = disk->usintheta - g * disk->t2;
+}
+
+void makeMove(void)
+{
+       int fudge = glhanoi->move + 2;
+       int magicNumber = magic(fudge);
+
+       glhanoi->currentDisk = pop(glhanoi->src);
+       moveSetup(glhanoi->currentDisk);
+       push(glhanoi->dst, glhanoi->currentDisk);
+       fudge = fudge % 2;
+
+       if(fudge == 1 || magicNumber) {
+               swap(&glhanoi->src, &glhanoi->tmp);
+       }
+       if(fudge == 0 || glhanoi->magicNumber) {
+               swap(&glhanoi->dst, &glhanoi->tmp);
+       }
+       glhanoi->magicNumber = magicNumber;
+}
+
+double lerp(double alpha, double start, double end)
+{
+       return start + alpha * (end - start);
+}
+
+void upfunc(GLdouble t, Disk * d)
+{
+       d->position[0] = d->xmin;
+       d->position[1] = d->base0 + (d->u1 - 0.5 * g * t) * t;
+
+       d->rotation[1] = 0.0;
+}
+
+void parafunc(GLdouble t, Disk * d)
+{
+       d->position[0] = d->xmin + d->ucostheta * t;
+       d->position[1] = d->ymin + (d->usintheta - 0.5 * g * t) * t;
+
+       d->rotation[1] =
+               d->rotAngle * (d->position[0] - d->xmin) / (d->xmax - d->xmin);
+}
+
+void downfunc(GLdouble t, Disk * d)
+{
+       d->position[0] = d->xmax;
+       d->position[1] = d->ymin + (d->u2 - 0.5 * g * t) * t;
+
+       d->rotation[1] = 0.0;
+}
+
+Bool computePosition(GLfloat t, Disk * d)
+{
+       Bool finished = FALSE;
+
+       if(t < d->t1) {
+               upfunc(t, d);
+       } else if(t < d->t1 + d->t2) {
+               parafunc(t - d->t1, d);
+       } else {
+               downfunc(t - d->t1 - d->t2, d);
+               if(d->position[1] <= d->base1) {
+                       d->position[1] = d->base1;
+                       finished = TRUE;
+               }
+       }
+       return finished;
+}
+
+void updateView(void)
+{
+       double longitude, latitude, radius;
+       double a, b, c, A, B;
+
+       get_position(glhanoi->the_rotator, NULL, NULL, &radius,
+                                !glhanoi->button_down_p);
+       get_rotation(glhanoi->the_rotator, &longitude, &latitude, NULL,
+                                !glhanoi->button_down_p);
+       longitude += glhanoi->camera[0];
+       latitude += glhanoi->camera[1];
+       radius += glhanoi->camera[2];
+       longitude = longitude - floor(longitude);
+       latitude = latitude - floor(latitude);
+       radius = radius - floor(radius);
+       if(latitude > 0.5) {
+               latitude = 1.0 - latitude;
+       }
+       if(radius > 0.5) {
+               radius = 1.0 - radius;
+       }
+
+       b = glhanoi->centre[1];
+       c = (MIN_CAMERA_RADIUS +
+                radius * (MAX_CAMERA_RADIUS - MIN_CAMERA_RADIUS));
+       A = M_PI / 4.0 * (1.0 - latitude);
+       a = sqrt(b * b + c * c - 2.0 * b * c * cos(A));
+       B = asin(sin(A) * b / a);
+       glRotatef(-B * 180 / M_PI, 1.0, 0.0, 0.0);
+
+       glTranslatef(0.0f, 0.0f,
+                                -(MIN_CAMERA_RADIUS +
+                                  radius * (MAX_CAMERA_RADIUS - MIN_CAMERA_RADIUS)));
+       glRotatef(longitude * 360.0, 0.0f, 1.0f, 0.0f);
+       glRotatef(latitude * 180.0, cos(longitude * 2.0 * M_PI), 0.0,
+                         sin(longitude * 2.0 * M_PI));
+}
+
+void changeState(State state)
+{
+       glhanoi->state = state;
+       glhanoi->startTime = getTime();
+}
+
+void update_glhanoi(void)
+{
+       double t = getTime() - glhanoi->startTime;
+       int i;
+       Bool done;
+
+       switch (glhanoi->state) {
+       case START:
+               if(t < glhanoi->duration) {
+                       break;
+               }
+               glhanoi->move = 0;
+               if(glhanoi->numberOfDisks % 2 == 0) {
+                       swap(&glhanoi->tmp, &glhanoi->dst);
+               }
+               glhanoi->magicNumber = 1;
+               makeMove();
+               changeState(MOVE_DISK);
+               break;
+
+       case MOVE_DISK:
+               if(computePosition(t, glhanoi->currentDisk)) {
+                       changeState(MOVE_FINISHED);
+               }
+               break;
+
+       case MOVE_FINISHED:
+               if(++glhanoi->move < glhanoi->numberOfMoves) {
+                       makeMove();
+                       changeState(MOVE_DISK);
+               } else {
+                       glhanoi->duration = FINISH_DURATION;
+                       changeState(FINISHED);
+               }
+               break;
+
+       case FINISHED:
+               while(t < glhanoi->duration) {
+                       break;
+               }
+               glhanoi->src = glhanoi->olddst;
+               glhanoi->dst = glhanoi->oldsrc;
+               for(i = 0; i < glhanoi->numberOfDisks; ++i) {
+                       Disk *disk = pop(glhanoi->src);
+                       assert(disk != NULL);
+                       moveSetup(disk);
+               }
+               for(i = glhanoi->maxDiskIdx; i >= 0; --i) {
+                       push(glhanoi->dst, &glhanoi->disk[i]);
+               }
+               changeState(MONEY_SHOT);
+               break;
+
+       case MONEY_SHOT:
+               done = True;
+               for(i = glhanoi->maxDiskIdx; i >= 0; --i) {
+                       double delay = 0.25 * i;
+                       int finished;
+
+                       if(t - delay < 0) {
+                               done = False;
+                               continue;
+                       }
+
+                       finished = computePosition(t - delay, &glhanoi->disk[i]);
+                       glhanoi->disk[i].rotation[1] = 0.0;
+
+                       if(!finished) {
+                               done = False;
+                       }
+               }
+               if(done) {
+                       glhanoi->src = glhanoi->oldsrc;
+                       glhanoi->tmp = glhanoi->oldtmp;
+                       glhanoi->dst = glhanoi->olddst;
+                       changeState(START);
+               }
+               break;
+
+       case INVALID:
+       default:
+               fprintf(stderr, "Invalid state\n");
+               break;
+       }
+}
+
+void HSVtoRGBf(GLfloat h, GLfloat s, GLfloat v,
+                          GLfloat * r, GLfloat * g, GLfloat * b)
+{
+       if(s == 0.0) {
+               *r = v;
+               *g = v;
+               *b = v;
+       } else {
+               GLfloat i, f, p, q, t;
+               if(h >= 360.0) {
+                       h = 0.0;
+               }
+               h /= 60.0;                              /* h now in [0,6). */
+               i = floor((double)h);   /* i now largest integer <= h */
+               f = h - i;                              /* f is no fractional part of h */
+               p = v * (1.0 - s);
+               q = v * (1.0 - (s * f));
+               t = v * (1.0 - (s * (1.0 - f)));
+               switch ((int)i) {
+               case 0:
+                       *r = v;
+                       *g = t;
+                       *b = p;
+                       break;
+               case 1:
+                       *r = q;
+                       *g = v;
+                       *b = p;
+                       break;
+               case 2:
+                       *r = p;
+                       *g = v;
+                       *b = t;
+                       break;
+               case 3:
+                       *r = p;
+                       *g = q;
+                       *b = v;
+                       break;
+               case 4:
+                       *r = t;
+                       *g = p;
+                       *b = v;
+                       break;
+               case 5:
+                       *r = v;
+                       *g = p;
+                       *b = q;
+                       break;
+               }
+       }
+}
+
+void HSVtoRGBv(GLfloat * hsv, GLfloat * rgb)
+{
+       HSVtoRGBf(hsv[0], hsv[1], hsv[2], &rgb[0], &rgb[1], &rgb[2]);
+}
+
+void setMaterial(GLfloat color[3], GLfloat hlite[3], int shininess)
+{
+       glColor3fv(color);
+       glMaterialfv(GL_FRONT, GL_SPECULAR, hlite);
+       glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+       glMateriali(GL_FRONT, GL_SHININESS, shininess); /* [0,128] */
+}
+
+/*
+ * drawTube: I know all this stuff is available in gluQuadrics
+ * but I'd originally intended to texture the poles with a 3D wood
+ * texture, but I was having difficulty getting wood... what? Why
+ * are all you Amercians laughing..? Anyway, I don't know if enough
+ * people's hardware supports 3D textures, so I didn't bother (xorg
+ * ATI server doesn't :-( )
+ */
+void drawTube(GLdouble bottomRadius, GLdouble topRadius,
+                         GLdouble bottomThickness, GLdouble topThickness,
+                         GLdouble height, GLuint nSlice, GLuint nLoop)
+{
+       GLfloat y;
+       GLfloat *cosCache = malloc(sizeof(GLfloat) * nSlice);
+       GLfloat *sinCache = malloc(sizeof(GLfloat) * nSlice);
+       GLint slice;
+       GLuint loop;
+       GLint lastSlice = nSlice - 1;
+       GLfloat radius;
+       GLfloat innerRadius;
+       GLfloat maxRadius;
+
+       if(bottomThickness > bottomRadius) {
+               bottomThickness = bottomRadius;
+       }
+       if(topThickness > topRadius) {
+               topThickness = topRadius;
+       }
+       if(bottomThickness < 0.0) {
+               bottomThickness = 0.0;
+       }
+       if(topThickness < 0.0) {
+               topThickness = 0.0;
+       }
+       if(topRadius >= bottomRadius) {
+               maxRadius = topRadius;
+       } else {
+               maxRadius = bottomRadius;
+       }
+
+       /* bottom */
+       y = 0.0;
+       radius = bottomRadius;
+       innerRadius = bottomRadius - bottomThickness;
+       /* innerTexCoordSize = texCoordSize * innerRadius / maxRadius; */
+       /* outerTexCoordSize = texCoordSize * radius / maxRadius; */
+       /* yTexCoord = minTexCoord; */
+
+       glBegin(GL_QUAD_STRIP);
+
+       glNormal3f(0.0, -1.0, 0.0);
+
+       /* glTexCoord3f(midTexCoord, yTexCoord, midTexCoord + innerTexCoordSize); */
+       glVertex3f(0.0, y, innerRadius);
+
+       /* glTexCoord3f(midTexCoord, yTexCoord, midTexCoord + outerTexCoordSize); */
+       glVertex3f(0.0, y, radius);
+
+       for(slice = lastSlice; slice >= 0; --slice) {
+               GLfloat theta = 2.0 * M_PI * (double)slice / nSlice;
+
+               cosCache[slice] = cos(theta);
+               sinCache[slice] = sin(theta);
+
+               /* glTexCoord3f(midTexCoord + sinCache[slice] * innerTexCoordSize, */
+               /* yTexCoord, */
+               /* midTexCoord + cosCache[slice] * innerTexCoordSize); */
+               glVertex3f(innerRadius * sinCache[slice], y,
+                                  innerRadius * cosCache[slice]);
+               /* glTexCoord3f(midTexCoord + sinCache[slice] * outerTexCoordSize, */
+               /* yTexCoord, */
+               /* midTexCoord + cosCache[slice] * outerTexCoordSize); */
+               glVertex3f(radius * sinCache[slice], y, radius * cosCache[slice]);
+       }
+       glEnd();
+
+       /* middle */
+       for(loop = 0; loop < nLoop; ++loop) {
+               GLfloat lowerRadius =
+                       bottomRadius + (topRadius -
+                                                       bottomRadius) * (float)loop / (nLoop);
+               GLfloat upperRadius =
+                       bottomRadius + (topRadius - bottomRadius) * (float)(loop +
+                                                                                                                               1) /
+                       (nLoop);
+               GLfloat lowerY = height * (float)loop / (nLoop);
+               GLfloat upperY = height * (float)(loop + 1) / (nLoop);
+               GLfloat factor = (topRadius - topThickness) -
+                       (bottomRadius - bottomThickness);
+
+               /* outside */
+               glBegin(GL_QUAD_STRIP);
+               for(slice = 0; slice < nSlice; ++slice) {
+                       glNormal3f(sinCache[slice], 0.0, cosCache[slice]);
+                       glVertex3f(upperRadius * sinCache[slice], upperY,
+                                          upperRadius * cosCache[slice]);
+                       glVertex3f(lowerRadius * sinCache[slice], lowerY,
+                                          lowerRadius * cosCache[slice]);
+               }
+               glNormal3f(0.0, 0.0, 1.0);
+               glVertex3f(0.0, upperY, upperRadius);
+               glVertex3f(0.0, lowerY, lowerRadius);
+               glEnd();
+
+               /* inside */
+               lowerRadius = bottomRadius - bottomThickness +
+                       factor * (float)loop / (nLoop);
+               upperRadius = bottomRadius - bottomThickness +
+                       factor * (float)(loop + 1) / (nLoop);
+
+               glBegin(GL_QUAD_STRIP);
+               glNormal3f(0.0, 0.0, -1.0);
+               glVertex3f(0.0, upperY, upperRadius);
+               glVertex3f(0.0, lowerY, lowerRadius);
+               for(slice = lastSlice; slice >= 0; --slice) {
+                       glNormal3f(-sinCache[slice], 0.0, -cosCache[slice]);
+                       glVertex3f(upperRadius * sinCache[slice], upperY,
+                                          upperRadius * cosCache[slice]);
+                       glVertex3f(lowerRadius * sinCache[slice], lowerY,
+                                          lowerRadius * cosCache[slice]);
+               }
+               glEnd();
+       }
+
+       /* top */
+       y = height;
+       radius = topRadius;
+       innerRadius = topRadius - topThickness;
+
+       glBegin(GL_QUAD_STRIP);
+       glNormal3f(0.0, 1.0, 0.0);
+       for(slice = 0; slice < nSlice; ++slice) {
+               glVertex3f(innerRadius * sinCache[slice], y,
+                                  innerRadius * cosCache[slice]);
+
+               glVertex3f(radius * sinCache[slice], y, radius * cosCache[slice]);
+       }
+       glVertex3f(0.0, y, innerRadius);
+       glVertex3f(0.0, y, radius);
+       glEnd();
+}
+
+void drawPole(GLfloat radius, GLfloat length)
+{
+       drawTube(radius, radius, radius, radius, length, NSLICE, NLOOPS);
+}
+
+void drawDisk3D(GLdouble inner_radius, GLdouble outer_radius,
+                               GLdouble height)
+{
+       drawTube(outer_radius, outer_radius, outer_radius - inner_radius,
+                        outer_radius - inner_radius, height, NSLICE, NLOOPS);
+}
+
+void drawCuboid(GLfloat length, GLfloat width, GLfloat height)
+{
+       GLfloat xmin = -length / 2.0f;
+       GLfloat xmax = length / 2.0f;
+       GLfloat zmin = -width / 2.0f;
+       GLfloat zmax = width / 2.0f;
+       GLfloat ymin = 0.0f;
+       GLfloat ymax = height;
+
+       glBegin(GL_QUADS);
+       /* front */
+       glNormal3fv(front);
+       glVertex3f(xmin, ymin, zmax);   /* 0 */
+       glVertex3f(xmax, ymin, zmax);   /* 1 */
+       glVertex3f(xmax, ymax, zmax);   /* 2 */
+       glVertex3f(xmin, ymax, zmax);   /* 3 */
+       /* right */
+       glNormal3fv(right);
+       glVertex3f(xmax, ymin, zmax);   /* 1 */
+       glVertex3f(xmax, ymin, zmin);   /* 5 */
+       glVertex3f(xmax, ymax, zmin);   /* 6 */
+       glVertex3f(xmax, ymax, zmax);   /* 2 */
+       /* back */
+       glNormal3fv(back);
+       glVertex3f(xmax, ymin, zmin);   /* 5 */
+       glVertex3f(xmin, ymin, zmin);   /* 4 */
+       glVertex3f(xmin, ymax, zmin);   /* 7 */
+       glVertex3f(xmax, ymax, zmin);   /* 6 */
+       /* left */
+       glNormal3fv(left);
+       glVertex3f(xmin, ymin, zmin);   /* 4 */
+       glVertex3f(xmin, ymin, zmax);   /* 0 */
+       glVertex3f(xmin, ymax, zmax);   /* 3 */
+       glVertex3f(xmin, ymax, zmin);   /* 7 */
+       /* top */
+       glNormal3fv(up);
+       glVertex3f(xmin, ymax, zmax);   /* 3 */
+       glVertex3f(xmax, ymax, zmax);   /* 2 */
+       glVertex3f(xmax, ymax, zmin);   /* 6 */
+       glVertex3f(xmin, ymax, zmin);   /* 7 */
+       /* bottom */
+       glNormal3fv(down);
+       glVertex3f(xmin, ymin, zmin);   /* 4 */
+       glVertex3f(xmax, ymin, zmin);   /* 5 */
+       glVertex3f(xmax, ymin, zmax);   /* 1 */
+       glVertex3f(xmin, ymin, zmax);   /* 0 */
+       glEnd();
+}
+
+void drawDisks(void)
+{
+       int i;
+
+       glPushMatrix();
+       glTranslatef(0.0f, glhanoi->baseHeight, 0.0f);
+       for(i = glhanoi->maxDiskIdx; i >= 0; i--) {
+               Disk *disk = &glhanoi->disk[i];
+               GLfloat *pos = disk->position;
+               GLfloat *rot = disk->rotation;
+
+               glPushMatrix();
+               glTranslatef(pos[0], pos[1], pos[2]);
+               if(rot[1] != 0.0) {
+                       glTranslatef(0.0, glhanoi->diskHeight / 2.0, 0.0);
+                       glRotatef(rot[1], 0.0, 0.0, 1.0);
+                       glTranslatef(0.0, -glhanoi->diskHeight / 2.0, 0.0);
+               }
+               glCallList(disk->displayList);
+               glPopMatrix();
+       }
+       glPopMatrix();
+}
+
+GLfloat getDiskRadius(int i)
+{
+       return ((GLfloat) i + 3.0) * glhanoi->poleRadius;
+}
+
+void initData(void)
+{
+       GLfloat maxDiskRadius;
+       int i;
+
+       glhanoi->baseLength = BASE_LENGTH;
+       glhanoi->poleRadius = glhanoi->baseLength /
+               (2.0 * (3 * glhanoi->numberOfDisks + 7.0));
+       maxDiskRadius = getDiskRadius(glhanoi->numberOfDisks);
+       glhanoi->baseWidth = 2.0 * maxDiskRadius;
+       glhanoi->poleOffset = 2.0 * getDiskRadius(glhanoi->maxDiskIdx);
+       glhanoi->diskHeight = 2.0 * glhanoi->poleRadius;
+       glhanoi->baseHeight = 2.0 * glhanoi->poleRadius;
+       glhanoi->poleHeight = glhanoi->numberOfDisks *
+               glhanoi->diskHeight + glhanoi->poleRadius;
+       glhanoi->numberOfMoves = (1 << glhanoi->numberOfDisks) - 1;
+       glhanoi->boardSize = glhanoi->baseLength * 0.5 * (1.0 + sqrt(5.0));
+
+       for(i = 0; i < 3; i++) {
+               if((glhanoi->pole[i].data =
+                       calloc(glhanoi->numberOfDisks, sizeof(Disk *))) == NULL) {
+                       fprintf(stderr, "%s: out of memory creating stack %d\n",
+                                       progname, i);
+                       exit(1);
+               }
+               glhanoi->pole[i].size = glhanoi->numberOfDisks;
+       }
+       if((glhanoi->diskPos =
+               calloc(glhanoi->numberOfDisks, sizeof(double))) == NULL) {
+               fprintf(stderr, "%s: out of memory creating diskPos\n", progname);
+               exit(1);
+       }
+
+       glhanoi->the_rotator = make_rotator(0.1, 0.025, 0, 1, 0.005, False);
+       glhanoi->button_down_p = False;
+
+       glhanoi->src = glhanoi->oldsrc = 0;
+       glhanoi->tmp = glhanoi->oldtmp = 1;
+       glhanoi->dst = glhanoi->olddst = 2;
+}
+
+void initView(void)
+{
+       glhanoi->camera[0] = 0.0;
+       glhanoi->camera[1] = 0.0;
+       glhanoi->camera[2] = 0.0;
+       glhanoi->centre[0] = 0.0;
+       glhanoi->centre[1] = glhanoi->poleHeight * 3.0;
+       glhanoi->centre[2] = 0.0;
+}
+
+/*
+ * noise_improved.c - based on ImprovedNoise.java
+ * JAVA REFERENCE IMPLEMENTATION OF IMPROVED NOISE - COPYRIGHT 2002 KEN PERLIN.
+ */
+static double fade(double t)
+{
+       return t * t * t * (t * (t * 6 - 15) + 10);
+}
+
+static double grad(int hash, double x, double y, double z)
+{
+       int h = hash & 15;                      /* CONVERT LO 4 BITS OF HASH CODE */
+       double u = h < 8 ? x : y,       /* INTO 12 GRADIENT DIRECTIONS. */
+               v = h < 4 ? y : h == 12 || h == 14 ? x : z;
+       return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v);
+}
+
+static int p[512], permutation[] = { 151, 160, 137, 91, 90, 15,
+       131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142,
+       8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26,
+       197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237,
+       149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71,
+       134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60,
+       211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143,
+       54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89,
+       18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198,
+       173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118,
+       126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189,
+       28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70,
+       221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108,
+       110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251,
+       34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145,
+       235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184,
+       84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205,
+       93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61,
+       156, 180
+};
+
+static void initNoise(void)
+{
+       int i;
+       for(i = 0; i < 256; i++)
+               p[256 + i] = p[i] = permutation[i];
+}
+
+double improved_noise(double x, double y, double z)
+{
+       double u, v, w;
+       int A, AA, AB, B, BA, BB;
+       int X = (int)floor(x) & 255,    /* FIND UNIT CUBE THAT */
+               Y = (int)floor(y) & 255,        /* CONTAINS POINT. */
+               Z = (int)floor(z) & 255;
+       static int start = 0;
+       if(start == 0) {
+               initNoise();
+               start = 1;
+       }
+       x -= floor(x);                          /* FIND RELATIVE X,Y,Z */
+       y -= floor(y);                          /* OF POINT IN CUBE. */
+       z -= floor(z);
+       u = fade(x),                            /* COMPUTE FADE CURVES */
+               v = fade(y),                    /* FOR EACH OF X,Y,Z. */
+               w = fade(z);
+       A = p[X] + Y, AA = p[A] + Z, AB = p[A + 1] + Z, /* HASH COORDINATES OF */
+               B = p[X + 1] + Y, BA = p[B] + Z, BB = p[B + 1] + Z;     /* THE 8 CUBE CORNERS, */
+       return lerp(w, lerp(v, lerp(u, grad(p[AA], x, y, z),    /* AND ADD */
+                                                               grad(p[BA], x - 1, y, z)),      /* BLENDED */
+                                               lerp(u, grad(p[AB], x, y - 1, z),       /* RESULTS */
+                                                        grad(p[BB], x - 1, y - 1, z))),        /* FROM 8 CORNERS */
+                               lerp(v, lerp(u, grad(p[AA + 1], x, y, z - 1), grad(p[BA + 1], x - 1, y, z - 1)),        /* OF CUBE */
+                                        lerp(u, grad(p[AB + 1], x, y - 1, z - 1),
+                                                 grad(p[BB + 1], x - 1, y - 1, z - 1))));
+}
+
+/*
+ * end noise_improved.c - based on ImprovedNoise.java
+ */
+
+struct tex_col_t {
+       GLuint *colours;
+       /* GLfloat *points; */
+       unsigned int ncols;
+};
+typedef struct tex_col_t tex_col_t;
+
+GLubyte *makeTexture(int x_size, int y_size, int z_size,
+                                        GLuint(*texFunc) (double, double, double,
+                                                                          tex_col_t *), tex_col_t * colours)
+{
+       int i, j, k;
+       GLubyte *textureData;
+       GLuint *texturePtr;
+       double x, y, z;
+       double xi, yi, zi;
+
+       if((textureData =
+               calloc(x_size * y_size * z_size, sizeof(GLuint))) == NULL) {
+               return NULL;
+       }
+
+       xi = 1.0 / x_size;
+       yi = 1.0 / y_size;
+       zi = 1.0 / z_size;
+
+       z = 0.0;
+       texturePtr = (void *)textureData;
+       for(k = 0; k < z_size; k++, z += zi) {
+               y = 0.0;
+               for(j = 0; j < y_size; j++, y += yi) {
+                       x = 0.0;
+                       for(i = 0; i < x_size; i++, x += xi) {
+                               *texturePtr = texFunc(x, y, z, colours);
+                               ++texturePtr;
+                       }
+               }
+       }
+       return textureData;
+}
+
+tex_col_t makeMarbleColours(void)
+{
+       tex_col_t marbleColours;
+       int ncols = 2;
+
+       marbleColours.colours = calloc(sizeof(GLuint), ncols);
+       marbleColours.ncols = ncols;
+
+       marbleColours.colours[0] = 0x3f3f3f3f;
+       marbleColours.colours[1] = 0xffffffff;
+
+       return marbleColours;
+}
+
+double turb(double x, double y, double z, int octaves)
+{
+       int oct, freq = 1;
+       double r = 0.0;
+
+       for(oct = 0; oct < octaves; ++oct) {
+               r += fabs(improved_noise(freq * x, freq * y, freq * z)) / freq;
+               freq <<= 1;
+       }
+       return r / 2.0;
+}
+
+void perturb(double *x, double *y, double *z, double scale)
+{
+       double t = scale * turb(*x, *y, *z, 4);
+       *x += t;
+       *y += t;
+       *z += t;
+}
+
+double f_m(double x, double y, double z)
+{
+       return sin(3.0 * M_PI * x);
+}
+
+GLuint C_m(double x, const tex_col_t * tex_cols)
+{
+       int r = tex_cols->colours[0] & 0xff;
+       int g = tex_cols->colours[0] >> 8 & 0xff;
+       int b = tex_cols->colours[0] >> 16 & 0xff;
+       double factor;
+       int r1, g1, b1;
+       x = x - floor(x);
+
+       factor = (1.0 + sin(2.0 * M_PI * x)) / 2.0;
+
+       r1 = (tex_cols->colours[1] & 0xff);
+       g1 = (tex_cols->colours[1] >> 8 & 0xff);
+       b1 = (tex_cols->colours[1] >> 16 & 0xff);
+
+       r += (int)(factor * (r1 - r));
+       g += (int)(factor * (g1 - g));
+       b += (int)(factor * (b1 - b));
+
+       return 0xff000000 | (b << 16) | (g << 8) | r;
+}
+
+
+GLuint makeMarbleTexture(double x, double y, double z, tex_col_t * colours)
+{
+       perturb(&x, &y, &z, MARBLE_SCALE);
+       return C_m(f_m(x, y, z), colours);
+}
+
+void setTexture(int n)
+{
+       glBindTexture(GL_TEXTURE_2D, glhanoi->textureNames[n]);
+}
+
+int makeTextures(void)
+{
+       GLubyte *marbleTexture;
+       tex_col_t marbleColours;
+
+       glGenTextures(N_TEXTURES, glhanoi->textureNames);
+
+       marbleColours = makeMarbleColours();
+       if((marbleTexture =
+               makeTexture(MARBLE_TEXTURE_SIZE, MARBLE_TEXTURE_SIZE, 1,
+                                       makeMarbleTexture, &marbleColours)) == NULL) {
+               return 1;
+       }
+
+       glBindTexture(GL_TEXTURE_2D, glhanoi->textureNames[0]);
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+       glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+                                MARBLE_TEXTURE_SIZE, MARBLE_TEXTURE_SIZE, 0,
+                                GL_RGBA, GL_UNSIGNED_BYTE, marbleTexture);
+       free(marbleTexture);
+
+       return 0;
+}
+
+void initFloor(void)
+{
+       int i, j;
+       float tileSize = glhanoi->boardSize / BOARD_SQUARES;
+       float x0, x1, z0, z1;
+       float tx0, tx1, tz0, tz1;
+       float *col = cWhite;
+       float texIncr = 1.0 / BOARD_SQUARES;
+
+       if((glhanoi->floorList = glGenLists(1)) == 0) {
+               fprintf(stderr, "can't allocate memory for floor display list\n");
+               exit(EXIT_FAILURE);
+       }
+       glNewList(glhanoi->floorList, GL_COMPILE);
+       x0 = -glhanoi->boardSize / 2.0;
+       tx0 = 0.0f;
+       setMaterial(col, cWhite, 128);
+       setTexture(0);
+       glNormal3fv(up);
+       for(i = 0; i < BOARD_SQUARES; i++, x0 += tileSize, tx0 += texIncr) {
+               x1 = x0 + tileSize;
+               tx1 = tx0 + texIncr;
+               z0 = -glhanoi->boardSize / 2.0;
+               tz0 = 0.0f;
+               for(j = 0; j < BOARD_SQUARES; j++, z0 += tileSize, tz0 += texIncr) {
+                       int colIndex = (i + j) & 0x1;
+
+                       z1 = z0 + tileSize;
+                       tz1 = tz0 + texIncr;
+
+                       if(colIndex)
+                               col = cWhite;
+                       else
+                               col = cBlack;
+
+                       setMaterial(col, cWhite, 100);
+
+                       glBegin(GL_QUADS);
+
+                       glTexCoord2d(tx0, tz0);
+                       glVertex3f(x0, 0.0, z0);
+
+                       glTexCoord2d(tx0, tz1);
+                       glVertex3f(x0, 0.0, z1);
+
+                       glTexCoord2d(tx1, tz1);
+                       glVertex3f(x1, 0.0, z1);
+
+                       glTexCoord2d(tx1, tz0);
+                       glVertex3f(x1, 0.0, z0);
+                       glEnd();
+               }
+       }
+       glEndList();
+}
+
+void initTowers(void)
+{
+       if((glhanoi->baseList = glGenLists(1)) == 0) {
+               fprintf(stderr, "can't allocate memory for towers display list\n");
+               exit(EXIT_FAILURE);
+       }
+       glNewList(glhanoi->baseList, GL_COMPILE);
+       setMaterial(baseColor, cWhite, 50);
+       drawCuboid(glhanoi->baseLength, glhanoi->baseWidth,
+                          glhanoi->baseHeight);
+       glEndList();
+
+
+       if((glhanoi->poleList = glGenLists(1)) == 0) {
+               fprintf(stderr, "can't allocate memory for towers display list\n");
+               exit(EXIT_FAILURE);
+       }
+       glNewList(glhanoi->poleList, GL_COMPILE);
+       glPushMatrix();
+       glTranslatef(0.0f, glhanoi->baseHeight, 0.0f);
+       setMaterial(poleColor, cWhite, 50);
+       drawPole(glhanoi->poleRadius, glhanoi->poleHeight);
+       glPushMatrix();
+       glTranslatef(-glhanoi->poleOffset, 0.0, 0.0);
+       drawPole(glhanoi->poleRadius, glhanoi->poleHeight);
+       glPopMatrix();
+       glTranslatef(glhanoi->poleOffset, 0.0, 0.0);
+       drawPole(glhanoi->poleRadius, glhanoi->poleHeight);
+       glPopMatrix();
+       glEndList();
+}
+
+double cfunc(double x)
+{
+#define COMP <
+       if(x < 2.0 / 7.0) {
+               return (1.0 / 12.0) / (1.0 / 7.0) * x;
+       }
+       if(x < 3.0 / 7.0) {
+               return (1.0 + 1.0 / 6.0) * x - 1.0 / 6.0;
+       }
+       if(x < 4.0 / 7.0) {
+               return (2.0 + 1.0 / 3.0) * x - 2.0 / 3.0;
+       }
+       if(x < 5.0 / 7.0) {
+               return (1.0 / 12.0) / (1.0 / 7.0) * x + 1.0 / 3.0;
+       }
+       return (1.0 / 12.0) / (1.0 / 7.0) * x + 1.0 / 3.0;
+}
+
+void initDisks(void)
+{
+       int i;
+       if((glhanoi->disk =
+               (Disk *) calloc(glhanoi->numberOfDisks, sizeof(Disk))) == NULL) {
+               perror("initDisks");
+               exit(EXIT_FAILURE);
+       }
+
+       for(i = glhanoi->maxDiskIdx; i >= 0; i--) {
+               GLfloat height = (GLfloat) (glhanoi->maxDiskIdx - i);
+               double f = cfunc((GLfloat) i / (GLfloat) glhanoi->numberOfDisks);
+               GLfloat diskColor = f * 360.0;
+               GLfloat color[3];
+               Disk *disk = &glhanoi->disk[i];
+
+               disk->id = i;
+               disk->position[0] = -glhanoi->poleOffset;
+               disk->position[1] = glhanoi->diskHeight * height;
+               disk->position[2] = 0.0;
+               disk->rotation[0] = 0.0;
+               disk->rotation[1] = 0.0;
+               disk->rotation[2] = 0.0;
+
+               color[0] = diskColor;
+               color[1] = 1.0f;
+               color[2] = 1.0f;
+               HSVtoRGBv(color, color);
+
+               if((disk->displayList = glGenLists(1)) == 0) {
+                       fprintf(stderr,
+                                       "can't allocate memory for disk %d display list\n", i);
+                       exit(EXIT_FAILURE);
+               }
+               glNewList(disk->displayList, GL_COMPILE);
+               setMaterial(color, cWhite, 100.0);
+               drawDisk3D(glhanoi->poleRadius, getDiskRadius(i),
+                                  glhanoi->diskHeight);
+               glEndList();
+       }
+       for(i = glhanoi->maxDiskIdx; i >= 0; --i) {
+               GLfloat height = (GLfloat) (glhanoi->maxDiskIdx - i);
+               int h = glhanoi->maxDiskIdx - i;
+               glhanoi->diskPos[h] = glhanoi->diskHeight * height;
+               push(glhanoi->src, &glhanoi->disk[i]);
+       }
+}
+
+void initLights(Bool state)
+{
+       if(state) {
+               glLightfv(GL_LIGHT0, GL_POSITION, pos0);
+               glLightfv(GL_LIGHT0, GL_AMBIENT, amb0);
+               glLightfv(GL_LIGHT0, GL_DIFFUSE, dif0);
+               glLightfv(GL_LIGHT0, GL_SPECULAR, spc0);
+
+               glLightfv(GL_LIGHT1, GL_POSITION, pos1);
+               glLightfv(GL_LIGHT1, GL_AMBIENT, amb1);
+               glLightfv(GL_LIGHT1, GL_DIFFUSE, dif1);
+               glLightfv(GL_LIGHT1, GL_SPECULAR, spc1);
+
+               glEnable(GL_LIGHTING);
+               glEnable(GL_LIGHT0);
+               glEnable(GL_LIGHT1);
+       } else {
+               glDisable(GL_LIGHTING);
+       }
+}
+
+void drawFloor(void)
+{
+       glCallList(glhanoi->floorList);
+}
+
+void drawTowers(void)
+{
+       glCallList(glhanoi->baseList);
+       glCallList(glhanoi->poleList);
+}
+
+/* Window management, etc
+ */
+void reshape_glhanoi(ModeInfo * mi, int width, int height)
+{
+       glViewport(0, 0, (GLint) width, (GLint) height);
+
+       glMatrixMode(GL_PROJECTION);
+       glLoadIdentity();
+       gluPerspective(30.0, (GLdouble) width / (GLdouble) height, 1.0,
+                                  2 * MAX_CAMERA_RADIUS);
+
+       glMatrixMode(GL_MODELVIEW);
+       glLoadIdentity();
+
+       glClear(GL_COLOR_BUFFER_BIT);
+}
+
+void init_glhanoi(ModeInfo * mi)
+{
+       if(!glhanoi_cfg) {
+               glhanoi_cfg =
+                       (glhcfg *) calloc(MI_NUM_SCREENS(mi), sizeof(glhcfg));
+               if(!glhanoi_cfg) {
+                       fprintf(stderr, "%s: out of memory creating configs\n",
+                                       progname);
+                       exit(1);
+               }
+               glhanoi = &glhanoi_cfg[MI_SCREEN(mi)];
+       }
+
+       glhanoi = &glhanoi_cfg[MI_SCREEN(mi)];
+       glhanoi->glx_context = init_GL(mi);
+       glhanoi->numberOfDisks = MI_BATCHCOUNT(mi);
+       glhanoi->maxDiskIdx = glhanoi->numberOfDisks - 1;
+       glhanoi->wire = MI_IS_WIREFRAME(mi);
+       glhanoi->light = light;
+       glhanoi->fog = fog;
+       glhanoi->texture = texture;
+
+       reshape_glhanoi(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+       if(glhanoi->wire) {
+               glhanoi->light = FALSE;
+               glhanoi->fog = FALSE;
+               glhanoi->texture = FALSE;
+       }
+
+       initLights(!glhanoi->wire && glhanoi->light);
+       if(makeTextures() != 0) {
+               fprintf(stderr, "can't allocate memory for marble texture\n");
+               exit(EXIT_FAILURE);
+       }
+
+       initData();
+       initView();
+       initFloor();
+       initTowers();
+       initDisks();
+
+       glEnable(GL_DEPTH_TEST);
+       glEnable(GL_NORMALIZE);
+       glEnable(GL_CULL_FACE);
+       glShadeModel(GL_SMOOTH);
+       if(glhanoi->fog) {
+               glClearColor(fogcolor[0], fogcolor[1], fogcolor[2], 1.0);
+               glFogi(GL_FOG_MODE, GL_LINEAR);
+               glFogfv(GL_FOG_COLOR, fogcolor);
+               glFogf(GL_FOG_DENSITY, 0.35f);
+               glHint(GL_FOG_HINT, GL_NICEST);
+               glFogf(GL_FOG_START, MIN_CAMERA_RADIUS);
+               glFogf(GL_FOG_END, MAX_CAMERA_RADIUS / 1.9);
+               glEnable(GL_FOG);
+       }
+
+
+       glhanoi->duration = START_DURATION;
+       changeState(START);
+}
+
+void draw_glhanoi(ModeInfo * mi)
+{
+       Display *dpy = MI_DISPLAY(mi);
+       Window window = MI_WINDOW(mi);
+
+       glhanoi = &glhanoi_cfg[MI_SCREEN(mi)];
+
+       if(!glhanoi->glx_context)
+               return;
+       glPolygonMode(GL_FRONT, glhanoi->wire ? GL_LINE : GL_FILL);
+
+       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+       glLoadIdentity();
+
+       update_glhanoi();
+       updateView();
+
+       if(!glhanoi->wire && glhanoi->texture) {
+               glEnable(GL_TEXTURE_2D);
+       }
+       drawFloor();
+       glDisable(GL_TEXTURE_2D);
+
+       drawTowers();
+       drawDisks();
+
+       if(mi->fps_p) {
+               do_fps(mi);
+       }
+       glFinish();
+
+       glXSwapBuffers(dpy, window);
+}
+
+Bool glhanoi_handle_event(ModeInfo * mi, XEvent * event)
+{
+       glhcfg *glhanoi = &glhanoi_cfg[MI_SCREEN(mi)];
+
+       if(event->xany.type == ButtonPress && event->xbutton.button == Button1) {
+               glhanoi->button_down_p = True;
+               glhanoi->drag_x = event->xbutton.x;
+               glhanoi->drag_y = event->xbutton.y;
+               return True;
+       } else if(event->xany.type == ButtonRelease
+                         && event->xbutton.button == Button1) {
+               glhanoi->button_down_p = False;
+               return True;
+       } else if(event->xany.type == ButtonPress &&
+                         (event->xbutton.button == Button4
+                          || event->xbutton.button == Button5)) {
+               switch (event->xbutton.button) {
+               case Button4:
+                       glhanoi->camera[2] += 0.01;
+                       break;
+               case Button5:
+                       glhanoi->camera[2] -= 0.01;
+                       break;
+               default:
+                       fprintf(stderr,
+                                       "glhanoi: unknown button in mousewheel handler\n");
+               }
+               return True;
+       } else if(event->xany.type == MotionNotify
+                         && glhanoi_cfg->button_down_p) {
+               int x_diff, y_diff;
+
+               x_diff = event->xbutton.x - glhanoi->drag_x;
+               y_diff = event->xbutton.y - glhanoi->drag_y;
+
+               glhanoi->camera[0] = (float)x_diff / (float)MI_WIDTH(mi);
+               glhanoi->camera[1] = (float)y_diff / (float)MI_HEIGHT(mi);
+
+               return True;
+       }
+       return False;
+}
+
+void release_glhanoi(ModeInfo * mi)
+{
+       if(glhanoi_cfg != NULL) {
+               int screen;
+               for(screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       int i;
+                       int j;
+                       glhcfg *glh = &glhanoi_cfg[screen];
+                       glDeleteLists(glh->floorList, 1);
+                       glDeleteLists(glh->baseList, 1);
+                       glDeleteLists(glh->poleList, 1);
+                       for(j = 0; j < glh->numberOfDisks; ++j) {
+                               glDeleteLists(glh->disk[j].displayList, 1);
+                       }
+                       free(glh->disk);
+                       for(i = 0; i < 3; i++) {
+                               if(glh->pole[i].data != NULL) {
+                                       free(glh->pole[i].data);
+                               }
+                       }
+               }
+       }
+       free(glhanoi_cfg);
+       glhanoi_cfg = NULL;
+       glDeleteLists(glhanoi->textureNames[0], 2);
+}
+
+#endif                                                 /* USE_GL */
diff --git a/hacks/glx/glhanoi.man b/hacks/glx/glhanoi.man
new file mode 100644 (file)
index 0000000..789b03a
--- /dev/null
@@ -0,0 +1,80 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+glhanoi - OpenGL Towers of Hanoi
+.SH SYNOPSIS
+.B glhanoi
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-count \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-rotspeed \fInumber\fP]
+[\-wireframe]
+[\-light]
+[\-texture]
+[\-fog]
+[\-fps]
+.SH DESCRIPTION
+Implementation of Towers of Hanoi in OpenGL
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Speed of disk animation. Default: 12.0 er, units per second. Let's call them metres.
+.TP 8
+.B \-rotspeed \fInumber\fP
+Speed of disk animation. Default: 0.1 rads per second.
+.TP 8
+.B \-count \fInumber\fP
+Number of disks.  Default: 7.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fog | \-no-fog
+Render in fog.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.TP 8
+.B \-light | -no-light
+Whether the scene is lit.
+.TP 8
+.B \-texture | \-no-texture
+Render with textures instead of solid.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2004 by Dave Atkinson.  Permission to use, copy, modify, 
+distribute, and sell this software and its documentation for any purpose is 
+hereby granted without fee, provided that the above copyright notice appear 
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Dave Atkinson.
index 42b4c296b213efbe10ff9171433048c6f29f4ee1..712288fc6eb7d250bd899e5fccfdfe96d636a527 100644 (file)
@@ -107,3 +107,11 @@ gltrackball_mousewheel (trackball_state *ts,
   else
     gltrackball_track (ts, 50, 50*move, 100, 100);
 }
+
+void
+gltrackball_get_quaternion (trackball_state *ts, float q[4])
+{
+  int i;
+  for (i=0; i<4; i++)
+    q[i] = ts->q[i];
+}
index 3d8ef667bca1a3bd9948308f7ad7f5faafa43b24..966db04a688a8a8f469a2112b416119d76641351 100644 (file)
@@ -45,5 +45,9 @@ extern void gltrackball_rotate (trackball_state *);
 void gltrackball_mousewheel (trackball_state *ts,
                              int button, int percent, int horizontal_p);
 
+/* Return the quaternion encapsulated by the trackball state.
+ */
+extern void gltrackball_get_quaternion (trackball_state *ts, float q[4]);
+
 #endif /* __GLTRACKBALL_H__ */
 
index f7e44873266ef9ff37119ceae2af722b4f5786c5..b1c1cf45a6fdeb28ae691658659feb9874fbbad3 100644 (file)
@@ -141,6 +141,13 @@ convert_ximage_to_rgba32 (Screen *screen, XImage *image)
                              0);
   to->data = (char *) calloc (to->height, to->bytes_per_line);
 
+  /* Set the bit order in the XImage structure to whatever the
+     local host's native bit order is.
+   */
+  to->bitmap_bit_order =
+    to->byte_order =
+    (bigendian() ? MSBFirst : LSBFirst);
+
   if (visual_class (screen, visual) == PseudoColor ||
       visual_class (screen, visual) == GrayScale)
     {
index 931d24ccfa9e0610d007d216f91b6658f7a9138e..465b261f74e52f8bae46f57759ece98e027e0870 100644 (file)
@@ -1,10 +1,10 @@
 /* hypertorus --- Shows a hypertorus that rotates in 4d */
 
 #if 0
-static const char sccsid[] = "@(#)hypertorus.c  1.1 03/05/18 xlockmore";
+static const char sccsid[] = "@(#)hypertorus.c  1.2 05/09/28 xlockmore";
 #endif
 
-/* Copyright (c) 2003 Carsten Steger <carsten@mirsanmir.org>. */
+/* Copyright (c) 2003-2005 Carsten Steger <carsten@mirsanmir.org>. */
 
 /*
  * Permission to use, copy, modify, and distribute this software and its
@@ -21,6 +21,8 @@ static const char sccsid[] = "@(#)hypertorus.c  1.1 03/05/18 xlockmore";
  *
  * REVISION HISTORY:
  * C. Steger - 03/05/18: Initial version
+ * C. Steger - 05/09/28: Added the spirals appearance mode
+ *                       and trackball support
  */
 
 /*
@@ -33,83 +35,98 @@ static const char sccsid[] = "@(#)hypertorus.c  1.1 03/05/18 xlockmore";
  * projected 3d torus can then be projected to the screen either perspectively
  * or orthographically.  There are three display modes for the torus: mesh
  * (wireframe), solid, or transparent.  Furthermore, the appearance of the
- * torus can be as a solid object or as a set of see-through bands.  Finally,
- * the colors with with the torus is drawn can be set to either two-sided or
- * to colorwheel.  In the first case, the torus is drawn with red on the
- * outside and green on the inside.  This mode enables you to see that the
- * torus turns inside-out as it rotates in 4d.  The second mode draws the
- * torus in a fully saturated color wheel.  This gives a very nice effect
- * when combined with the see-through bands mode.  The rotation speed for
- * each of the six planes around which the torus rotates can be chosen.
- * This program is very much inspired by Thomas Banchoff's book "Beyond the
- * Third Dimension: Geometry, Computer Graphics, and Higher Dimensions",
- * Scientific American Library, 1990.
+ * torus can be as a solid object or as a set of see-through bands or
+ * see-through spirals.  Finally, the colors with with the torus is drawn can
+ * be set to either two-sided or to colorwheel.  In the first case, the torus
+ * is drawn with red on the outside and green on the inside.  This mode
+ * enables you to see that the torus turns inside-out as it rotates in 4d.
+ * The second mode draws the torus in a fully saturated color wheel.  This
+ * gives a very nice effect when combined with the see-through bands or
+ * see-through spirals mode.  The rotation speed for each of the six planes
+ * around which the torus rotates can be chosen.  This program is very much
+ * inspired by Thomas Banchoff's book "Beyond the Third Dimension: Geometry,
+ * Computer Graphics, and Higher Dimensions", Scientific American Library,
+ * 1990.
  */
 
 #ifndef M_PI
 #define M_PI 3.14159265358979323846
 #endif
 
-#define DISP_WIREFRAME            0
-#define DISP_WIREFRAME_STR       "0"
-#define DISP_SURFACE              1
-#define DISP_SURFACE_STR         "1"
-#define DISP_TRANSPARENT          2
-#define DISP_TRANSPARENT_STR     "2"
-
-#define APPEARANCE_SOLID          0
-#define APPEARANCE_SOLID_STR     "0"
-#define APPEARANCE_BANDS          1
-#define APPEARANCE_BANDS_STR     "1"
-
-#define COLORS_TWOSIDED           0
-#define COLORS_TWOSIDED_STR      "0"
-#define COLORS_COLORWHEEL         1
-#define COLORS_COLORWHEEL_STR    "1"
-
-#define DISP_3D_PERSPECTIVE       0
-#define DISP_3D_PERSPECTIVE_STR  "0"
-#define DISP_3D_ORTHOGRAPHIC      1
-#define DISP_3D_ORTHOGRAPHIC_STR "1"
-
-#define DISP_4D_PERSPECTIVE       0
-#define DISP_4D_PERSPECTIVE_STR  "0"
-#define DISP_4D_ORTHOGRAPHIC      1
-#define DISP_4D_ORTHOGRAPHIC_STR "1"
-
-#define DALPHA                    1.1
-#define DALPHA_STR               "1.1"
-#define DBETA                     1.3
-#define DBETA_STR                "1.3"
-#define DDELTA                    1.5
-#define DDELTA_STR               "1.5"
-#define DZETA                     1.7
-#define DZETA_STR                "1.7"
-#define DETA                      1.9
-#define DETA_STR                 "1.9"
-#define DTHETA                    2.1
-#define DTHETA_STR               "2.1"
-
-#define DEF_DISPLAY_MODE          DISP_SURFACE_STR   
-#define DEF_APPEARANCE            APPEARANCE_BANDS_STR
-#define DEF_COLORS                COLORS_COLORWHEEL_STR
-#define DEF_3D_PROJECTION         DISP_3D_PERSPECTIVE_STR
-#define DEF_4D_PROJECTION         DISP_4D_PERSPECTIVE_STR
-#define DEF_DALPHA                DALPHA_STR
-#define DEF_DBETA                 DBETA_STR
-#define DEF_DDELTA                DDELTA_STR
-#define DEF_DZETA                 DZETA_STR
-#define DEF_DETA                  DETA_STR
-#define DEF_DTHETA                DTHETA_STR
+#define DISP_WIREFRAME             0
+#define DISP_WIREFRAME_STR        "0"
+#define DISP_SURFACE               1
+#define DISP_SURFACE_STR          "1"
+#define DISP_TRANSPARENT           2
+#define DISP_TRANSPARENT_STR      "2"
+
+#define APPEARANCE_SOLID           0
+#define APPEARANCE_SOLID_STR      "0"
+#define APPEARANCE_BANDS           1
+#define APPEARANCE_BANDS_STR      "1"
+#define APPEARANCE_SPIRALS         2
+#define APPEARANCE_SPIRALS_STR    "2"
+#define APPEARANCE_SPIRALS_1       3
+#define APPEARANCE_SPIRALS_1_STR  "3"
+#define APPEARANCE_SPIRALS_2       4
+#define APPEARANCE_SPIRALS_2_STR  "4"
+#define APPEARANCE_SPIRALS_4       5
+#define APPEARANCE_SPIRALS_4_STR  "5"
+#define APPEARANCE_SPIRALS_8       6
+#define APPEARANCE_SPIRALS_8_STR  "6"
+#define APPEARANCE_SPIRALS_16      7
+#define APPEARANCE_SPIRALS_16_STR "7"
+
+#define COLORS_TWOSIDED            0
+#define COLORS_TWOSIDED_STR       "0"
+#define COLORS_COLORWHEEL          1
+#define COLORS_COLORWHEEL_STR     "1"
+
+#define DISP_3D_PERSPECTIVE        0
+#define DISP_3D_PERSPECTIVE_STR   "0"
+#define DISP_3D_ORTHOGRAPHIC       1
+#define DISP_3D_ORTHOGRAPHIC_STR  "1"
+
+#define DISP_4D_PERSPECTIVE        0
+#define DISP_4D_PERSPECTIVE_STR   "0"
+#define DISP_4D_ORTHOGRAPHIC       1
+#define DISP_4D_ORTHOGRAPHIC_STR  "1"
+
+#define DALPHA                     1.1
+#define DALPHA_STR                "1.1"
+#define DBETA                      1.3
+#define DBETA_STR                 "1.3"
+#define DDELTA                     1.5
+#define DDELTA_STR                "1.5"
+#define DZETA                      1.7
+#define DZETA_STR                 "1.7"
+#define DETA                       1.9
+#define DETA_STR                  "1.9"
+#define DTHETA                     2.1
+#define DTHETA_STR                "2.1"
+
+#define DEF_DISPLAY_MODE           DISP_SURFACE_STR   
+#define DEF_APPEARANCE             APPEARANCE_BANDS_STR
+#define DEF_COLORS                 COLORS_COLORWHEEL_STR
+#define DEF_3D_PROJECTION          DISP_3D_PERSPECTIVE_STR
+#define DEF_4D_PROJECTION          DISP_4D_PERSPECTIVE_STR
+#define DEF_DALPHA                 DALPHA_STR
+#define DEF_DBETA                  DBETA_STR
+#define DEF_DDELTA                 DDELTA_STR
+#define DEF_DZETA                  DZETA_STR
+#define DEF_DETA                   DETA_STR
+#define DEF_DTHETA                 DTHETA_STR
 
 #ifdef STANDALONE
-# define PROGCLASS       "Hypertorus"
-# define HACK_INIT       init_hypertorus
-# define HACK_DRAW       draw_hypertorus
-# define HACK_RESHAPE    reshape_hypertorus
-# define hypertorus_opts xlockmore_opts
-# define DEFAULTS        "*delay:      25000 \n" \
-                         "*showFPS:    False \n" \
+# define PROGCLASS          "Hypertorus"
+# define HACK_INIT          init_hypertorus
+# define HACK_DRAW          draw_hypertorus
+# define HACK_RESHAPE       reshape_hypertorus
+# define HACK_HANDLE_EVENT  hypertorus_handle_event
+# define EVENT_MASK         PointerMotionMask|KeyReleaseMask
+# define hypertorus_opts    xlockmore_opts
+# define DEFAULTS           "*delay:      25000 \n" \
+                            "*showFPS:    False \n" \
 
 # include "xlockmore.h"         /* from the xscreensaver distribution */
 #else  /* !STANDALONE */
@@ -118,8 +135,10 @@ static const char sccsid[] = "@(#)hypertorus.c  1.1 03/05/18 xlockmore";
 
 #ifdef USE_GL
 
+#include <X11/keysym.h>
 #include <GL/gl.h>
 #include <GL/glu.h>
+#include "gltrackball.h"
 
 
 #ifdef USE_MODULES
@@ -134,6 +153,7 @@ ModStruct   hypertorus_description =
 
 static int display_mode;
 static int appearance;
+static int num_spirals;
 static int colors;
 static int projection_3d;
 static int projection_4d;
@@ -148,13 +168,13 @@ static float speed_yz;
 static float alpha, beta, delta, zeta, eta, theta;
 static float aspect;
 
-static const float offset4d[4] = {
-  0.0, 0.0, 0.0, 2.0
-};
+/* Trackball states */
+trackball_state *trackballs[2];
+int current_trackball;
+Bool button_pressed;
 
-static const float offset3d[4] = {
-  0.0, 0.0, -2.0, 0.0
-};
+static const float offset4d[4] = {  0.0,  0.0,  0.0,  2.0 };
+static const float offset3d[4] = {  0.0,  0.0, -2.0,  0.0 };
 
 
 static XrmOptionDescRec opts[] =
@@ -169,6 +189,16 @@ static XrmOptionDescRec opts[] =
                        APPEARANCE_SOLID_STR },
   {"-bands",           ".hypertorus.appearance",   XrmoptionNoArg,
                        APPEARANCE_BANDS_STR },
+  {"-spirals-1",       ".hypertorus.appearance",   XrmoptionNoArg,
+                       APPEARANCE_SPIRALS_1_STR },
+  {"-spirals-2",       ".hypertorus.appearance",   XrmoptionNoArg,
+                       APPEARANCE_SPIRALS_2_STR },
+  {"-spirals-4",       ".hypertorus.appearance",   XrmoptionNoArg,
+                       APPEARANCE_SPIRALS_4_STR },
+  {"-spirals-8",       ".hypertorus.appearance",   XrmoptionNoArg,
+                       APPEARANCE_SPIRALS_8_STR },
+  {"-spirals-16",      ".hypertorus.appearance",   XrmoptionNoArg,
+                       APPEARANCE_SPIRALS_16_STR },
   {"-twosided",        ".hypertorus.colors",       XrmoptionNoArg,
                        COLORS_TWOSIDED_STR },
   {"-colorwheel",      ".hypertorus.colors",       XrmoptionNoArg,
@@ -222,6 +252,7 @@ static OptionStruct desc[] =
   { "-transparent",     "display the torus as a transparent surface" },
   { "-solid",           "display the torus as a solid object" },
   { "-bands",           "display the torus as see-through bands" },
+  { "-spirals-{1,2,4,8,16}", "display the torus as see-through spirals" },
   { "-twosided",        "display the torus with two colors" },
   { "-colorwheel",      "display the torus with a smooth color wheel" },
   { "-perspective-3d",  "project the torus perspectively from 3d to 2d" },
@@ -362,6 +393,71 @@ static void rotateyz(float m[4][4], float phi)
 }
 
 
+/* Compute the rotation matrix m from the rotation angles. */
+static void rotateall(float al, float be, float de, float ze, float et,
+                      float th, float m[4][4])
+{
+  int i, j;
+
+  for (i=0; i<4; i++)
+    for (j=0; j<4; j++)
+      m[i][j] = (i==j);
+  rotatewx(m,al);
+  rotatewy(m,be);
+  rotatewz(m,de);
+  rotatexy(m,ze);
+  rotatexz(m,et);
+  rotateyz(m,th);
+}
+
+
+/* Multiply two rotation matrices: o=m*n. */
+static void mult_rotmat(float m[4][4], float n[4][4], float o[4][4])
+{
+  int i, j, k;
+
+  for (i=0; i<4; i++)
+  {
+    for (j=0; j<4; j++)
+    {
+      o[i][j] = 0.0;
+      for (k=0; k<4; k++)
+        o[i][j] += m[i][k]*n[k][j];
+    }
+  }
+}
+
+
+/* Compute a 4D rotation matrix from two unit quaternions. */
+static void quats_to_rotmat(float p[4], float q[4], float m[4][4])
+{
+  double al, be, de, ze, et, th;
+  double r00, r01, r02, r12, r22;
+
+  r00 = 1.0-2.0*(p[1]*p[1]+p[2]*p[2]);
+  r01 = 2.0*(p[0]*p[1]+p[2]*p[3]);
+  r02 = 2.0*(p[2]*p[0]-p[1]*p[3]);
+  r12 = 2.0*(p[1]*p[2]+p[0]*p[3]);
+  r22 = 1.0-2.0*(p[1]*p[1]+p[0]*p[0]);
+
+  al = atan2(-r12,r22)*180.0/M_PI;
+  be = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
+  de = atan2(-r01,r00)*180.0/M_PI;
+
+  r00 = 1.0-2.0*(q[1]*q[1]+q[2]*q[2]);
+  r01 = 2.0*(q[0]*q[1]+q[2]*q[3]);
+  r02 = 2.0*(q[2]*q[0]-q[1]*q[3]);
+  r12 = 2.0*(q[1]*q[2]+q[0]*q[3]);
+  r22 = 1.0-2.0*(q[1]*q[1]+q[0]*q[0]);
+
+  ze = atan2(-r12,r22)*180.0/M_PI;
+  et = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
+  th = atan2(-r01,r00)*180.0/M_PI;
+
+  rotateall(al,be,de,ze,et,th,m);
+}
+
+
 /* Compute a fully saturated and bright color based on an angle. */
 static void color(double angle)
 {
@@ -414,7 +510,7 @@ static void color(double angle)
       break;
   }
   if (display_mode == DISP_TRANSPARENT)
-    color[3] = 0.5;
+    color[3] = 0.7;
   else
     color[3] = 1.0;
   glColor3fv(color);
@@ -422,31 +518,32 @@ static void color(double angle)
 }
 
 
-/* Draw a hyperturus projected into 3D. */
+/* Draw a hypertorus projected into 3D.  Note that the spirals appearance
+   will only work correctly if numu and numv are set to 64 or any higher
+   power of 2.  Similarly, the banded appearance will only work correctly
+   if numu and numv are divisible by 4. */
 static void hypertorus(double umin, double umax, double vmin, double vmax,
                        int numu, int numv)
 {
   static GLfloat mat_diff_red[] = { 1.0, 0.0, 0.0, 1.0 };
   static GLfloat mat_diff_green[] = { 0.0, 1.0, 0.0, 1.0 };
-  static GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.5 };
-  static GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.5 };
+  static GLfloat mat_diff_trans_red[] = { 1.0, 0.0, 0.0, 0.7 };
+  static GLfloat mat_diff_trans_green[] = { 0.0, 1.0, 0.0, 0.7 };
   float p[3], pu[3], pv[3], n[3], mat[4][4];
-  int i, j, k, l, m;
+  int i, j, k, l, m, b, skew;
   double u, v, ur, vr;
   double cu, su, cv, sv;
   double xx[4], xxu[4], xxv[4], x[4], xu[4], xv[4];
   double r, s, t;
+  float q1[4], q2[4], r1[4][4], r2[4][4];
 
-  /* Compute the rotation that rotates the hypercube in 4D. */
-  for (i=0; i<4; i++)
-    for (j=0; j<4; j++)
-      mat[i][j] = (i==j);
-  rotatewx(mat,alpha);
-  rotatewy(mat,beta);
-  rotatewz(mat,delta);
-  rotatexy(mat,zeta);
-  rotatexz(mat,eta);
-  rotateyz(mat,theta);
+  rotateall(alpha,beta,delta,zeta,eta,theta,r1);
+
+  gltrackball_get_quaternion(trackballs[0],q1);
+  gltrackball_get_quaternion(trackballs[1],q2);
+  quats_to_rotmat(q1,q2,r2);
+
+  mult_rotmat(r2,r1,mat);
 
   if (colors != COLORS_COLORWHEEL)
   {
@@ -463,11 +560,13 @@ static void hypertorus(double umin, double umax, double vmin, double vmax,
     }
   }
 
+  skew = num_spirals;
   ur = umax-umin;
   vr = vmax-vmin;
   for (i=0; i<numu; i++)
   {
-    if (appearance == APPEARANCE_BANDS && ((i & 3) >= 2))
+    if ((appearance == APPEARANCE_BANDS ||
+         appearance == APPEARANCE_SPIRALS) && ((i & 3) >= 2))
       continue;
     if (display_mode == DISP_WIREFRAME)
       glBegin(GL_QUAD_STRIP);
@@ -481,7 +580,16 @@ static void hypertorus(double umin, double umax, double vmin, double vmax,
         m = j;
         u = ur*l/numu+umin;
         v = vr*m/numv+vmin;
-        color(u);
+        if (appearance == APPEARANCE_SPIRALS)
+        {
+          u += 4.0*skew/numv*v;
+          b = ((i/4)&(skew-1))*(numu/(4*skew));
+          color(ur*4*b/numu+umin);
+        }
+        else
+        {
+          color(u);
+        }
         cu = cos(u);
         su = sin(u);
         cv = cos(v);
@@ -558,6 +666,16 @@ static void init(ModeInfo *mi)
   static GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
   static GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
 
+  if (appearance >= APPEARANCE_SPIRALS_1)
+  {
+    num_spirals = 1<<(appearance-APPEARANCE_SPIRALS_1);
+    appearance = APPEARANCE_SPIRALS;
+  }
+  else
+  {
+    num_spirals = 0;
+  }
+
   alpha = 0.0;
   beta = 0.0;
   delta = 0.0;
@@ -634,24 +752,27 @@ static void init(ModeInfo *mi)
 /* Redisplay the hypertorus. */
 static void display_hypertorus(void)
 {
-  alpha += speed_wx;
-  if (alpha >= 360.0)
-    alpha -= 360.0;
-  beta += speed_wy;
-  if (beta >= 360.0)
-    beta -= 360.0;
-  delta += speed_wz;
-  if (delta >= 360.0)
-    delta -= 360.0;
-  zeta += speed_xy;
-  if (zeta >= 360.0)
-    zeta -= 360.0;
-  eta += speed_xz;
-  if (eta >= 360.0)
-    eta -= 360.0;
-  theta += speed_yz;
-  if (theta >= 360.0)
-    theta -= 360.0;
+  if (!button_pressed)
+  {
+    alpha += speed_wx;
+    if (alpha >= 360.0)
+      alpha -= 360.0;
+    beta += speed_wy;
+    if (beta >= 360.0)
+      beta -= 360.0;
+    delta += speed_wz;
+    if (delta >= 360.0)
+      delta -= 360.0;
+    zeta += speed_xy;
+    if (zeta >= 360.0)
+      zeta -= 360.0;
+    eta += speed_xz;
+    if (eta >= 360.0)
+      eta -= 360.0;
+    theta += speed_yz;
+    if (theta >= 360.0)
+      theta -= 360.0;
+  }
 
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
@@ -669,10 +790,7 @@ static void display_hypertorus(void)
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
 
-  if (display_mode == DISP_WIREFRAME)
-    hypertorus(0.0,2.0*M_PI,0.0,2.0*M_PI,40,40);
-  else
-    hypertorus(0.0,2.0*M_PI,0.0,2.0*M_PI,60,60);
+  hypertorus(0.0,2.0*M_PI,0.0,2.0*M_PI,64,64);
 }
 
 
@@ -687,6 +805,64 @@ void reshape_hypertorus(ModeInfo * mi, int width, int height)
 }
 
 
+Bool hypertorus_handle_event(ModeInfo *mi, XEvent *event)
+{
+  Display *display = MI_DISPLAY(mi);
+  KeySym  sym;
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button == Button1)
+  {
+    button_pressed = True;
+    gltrackball_start(trackballs[current_trackball],
+                      event->xbutton.x, event->xbutton.y,
+                      MI_WIDTH(mi), MI_HEIGHT(mi));
+    return True;
+  }
+  else if (event->xany.type == ButtonRelease &&
+           event->xbutton.button == Button1)
+  {
+    button_pressed = False;
+    return True;
+  }
+  else if (event->xany.type == KeyPress)
+  {
+    sym = XKeycodeToKeysym(display,event->xkey.keycode,0);
+    if (sym == XK_Shift_L || sym == XK_Shift_R)
+    {
+      current_trackball = 1;
+      if (button_pressed)
+        gltrackball_start(trackballs[current_trackball],
+                          event->xbutton.x, event->xbutton.y,
+                          MI_WIDTH(mi), MI_HEIGHT(mi));
+      return True;
+    }
+  }
+  else if (event->xany.type == KeyRelease)
+  {
+    sym = XKeycodeToKeysym(display,event->xkey.keycode,0);
+    if (sym == XK_Shift_L || sym == XK_Shift_R)
+    {
+      current_trackball = 0;
+      if (button_pressed)
+        gltrackball_start(trackballs[current_trackball],
+                          event->xbutton.x, event->xbutton.y,
+                          MI_WIDTH(mi), MI_HEIGHT(mi));
+      return True;
+    }
+  }
+  else if (event->xany.type == MotionNotify && button_pressed)
+  {
+    gltrackball_track(trackballs[current_trackball],
+                      event->xmotion.x, event->xmotion.y,
+                      MI_WIDTH(mi), MI_HEIGHT(mi));
+    return True;
+  }
+
+  return False;
+}
+
+
 /*
  *-----------------------------------------------------------------------------
  *-----------------------------------------------------------------------------
@@ -714,6 +890,11 @@ void init_hypertorus(ModeInfo * mi)
   }
   hp = &hyper[MI_SCREEN(mi)];
 
+  trackballs[0] = gltrackball_init();
+  trackballs[1] = gltrackball_init();
+  current_trackball = 0;
+  button_pressed = False;
+
   if ((hp->glx_context = init_GL(mi)) != NULL)
   {
     reshape_hypertorus(mi,MI_WIDTH(mi),MI_HEIGHT(mi));
index 8342f6dcd90481f15076c43e96340508d00e9981..2d0b64703d6b9cde26f94098a53dc79d2f4fe91a 100644 (file)
@@ -15,6 +15,7 @@ hypertorus - Draws a hypertorus that rotates in 4d
 [\-transparent]
 [\-solid]
 [\-bands]
+[\-spirals-{1,2,4,8,16}]
 [\-twosided]
 [\-colorwheel]
 [\-perspective-3d]
@@ -38,17 +39,18 @@ covered cylinder for some angles.  The projected 3d torus can then be
 projected to the screen either perspectively or orthographically.
 There are three display modes for the torus: mesh (wireframe), solid,
 or transparent.  Furthermore, the appearance of the torus can be as a
-solid object or as a set of see-through bands.  Finally, the colors
-with with the torus is drawn can be set to either two-sided or to a
-color wheel.  In the first case, the torus is drawn with red on the
-outside and green on the inside.  This mode enables you to see that
-the torus turns inside-out as it rotates in 4d.  The second mode draws
-the torus with a fully saturated color wheel.  This gives a very nice
-effect when combined with the see-through bands mode.  The rotation
-speed for each of the six planes around which the torus rotates can be
-chosen.  This program is very much inspired by Thomas Banchoff's book
-"Beyond the Third Dimension: Geometry, Computer Graphics, and Higher
-Dimensions", Scientific American Library, 1990.
+solid object or as a set of see-through bands or see-through spirals.
+Finally, the colors with with the torus is drawn can be set to either
+two-sided or to a color wheel.  In the first case, the torus is drawn
+with red on the outside and green on the inside.  This mode enables
+you to see that the torus turns inside-out as it rotates in 4d.  The
+second mode draws the torus with a fully saturated color wheel.  This
+gives a very nice effect when combined with the see-through bands or
+see-through spirals mode.  The rotation speed for each of the six
+planes around which the torus rotates can be chosen.  This program is
+very much inspired by Thomas Banchoff's book "Beyond the Third
+Dimension: Geometry, Computer Graphics, and Higher Dimensions",
+Scientific American Library, 1990.
 .SH OPTIONS
 .I hypertorus
 accepts the following options:
@@ -82,7 +84,7 @@ Display the torus as a solid surface (default).
 .B \-transparent
 Display the torus as a transparent surface.
 .PP
-The following two options are mutually exclusive.  They determine the
+The following seven options are mutually exclusive.  They determine the
 appearance of the torus.
 .TP 8
 .B \-solid
@@ -90,6 +92,10 @@ Display the torus as a solid object.
 .TP 8
 .B \-bands
 Display the torus as see-through bands (default).
+.TP 8
+.B \-spirals-1, \-spirals-2, \-spirals-4, \-spirals-8, \-spirals-16
+Display the torus as see-through spirals with the indicated number of
+spirals.
 .PP
 The following two options are mutually exclusive.  They determine how
 to color the torus.
@@ -99,7 +105,10 @@ Display the torus with two colors: red on the outside and green on
 the inside.
 .TP 8
 .B \-colorwheel
-Display the torus with a fully saturated color wheel (default).
+Display the torus with a fully saturated color wheel (default).  If
+the torus is displayed as see-through bands each band will be
+displayed with a different color.  Likewise, if the torus is displayed
+as see-through spirals each spiral will receive a different color.
 .PP
 The following two options are mutually exclusive.  They determine how
 the torus is projected from 3d to 2d (i.e., to the screen).
@@ -143,6 +152,15 @@ Rotation speed around the xz plane (default: 1.9).
 .TP 8
 .B \-speed-yz \fIfloat\fP
 Rotation speed around the yz plane (default: 2.1).
+.SH INTERACTION
+If you run this program in standalone mode you can rotate the
+hypertorus by dragging the mouse while pressing the left mouse button.
+This rotates the hypertorus in 3D, i.e., around the wx, wy, and wz
+planes.  If you press the shift key while dragging the mouse with the
+left button pressed the hypertorus is rotated in 4D, i.e., around the
+xy, xz, and yz planes.  To examine the hypertorus at your leisure, it
+is best to set all speeds to 0.  Otherwise, the hypertorus will rotate
+while the left mouse button is not pressed.
 .SH ENVIRONMENT
 .PP
 .TP 8
@@ -156,7 +174,7 @@ stored in the RESOURCE_MANAGER property.
 .BR X (1),
 .BR xscreensaver (1)
 .SH COPYRIGHT
-Copyright \(co 2003 by Carsten Steger.  Permission to use, copy, modify, 
+Copyright \(co 2003-2005 by Carsten Steger.  Permission to use, copy, modify, 
 distribute, and sell this software and its documentation for any purpose is 
 hereby granted without fee, provided that the above copyright notice appear 
 in all copies and that both that copyright notice and this permission notice
@@ -164,4 +182,4 @@ appear in supporting documentation.  No representations are made about the
 suitability of this software for any purpose.  It is provided "as is" without
 express or implied warranty.
 .SH AUTHOR
-Carsten Steger <carsten@mirsanmir.org>, 27-may-2003.
+Carsten Steger <carsten@mirsanmir.org>, 28-sep-2005.
diff --git a/hacks/glx/juggler3d.c b/hacks/glx/juggler3d.c
new file mode 100644 (file)
index 0000000..56e9707
--- /dev/null
@@ -0,0 +1,2143 @@
+/* Juggler3D, Copyright (c) 2005 Brian Apps <brian@jugglesaver.co.uk>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation.  No
+ * representations are made about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty. */
+
+#include <X11/Intrinsic.h>
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define PROGCLASS          "Juggler3D"
+#define HACK_INIT          Juggler3D_HackInitEvent
+#define HACK_DRAW          Juggler3D_HackDrawEvent
+#define HACK_RESHAPE       Juggler3D_HackReshapeEvent
+#define HACK_HANDLE_EVENT  Juggler3D_HackHandleEvent
+#define EVENT_MASK         PointerMotionMask
+#define SWITCH_OPTS        xlockmore_opts
+
+#define DEFAULTS    \
+    "*JuggleSpeed: 0.15\n*delay: 20000\n*showFPS: False\n*wireframe: False\n"
+
+#include "xlockmore.h"
+#include "gltrackball.h"
+
+#ifdef USE_GL /* whole file */
+#include <GL/glu.h>
+
+/* A selection of macros to make functions from math.h return single precision
+ * numbers.  Arguably it's better to work at a higher precision and cast it
+ * back but littering the code with casts makes it less readable -- without
+ * the casts you can get tons of warnings from the compiler (particularily
+ * MSVC which enables loss of precision warnings by default) */
+#define cosf(a) (float)(cos((a)))
+#define sinf(a) (float)(sin((a)))
+#define tanf(a) (float)(tan((a)))
+#define sqrtf(a) (float)(sqrt((a)))
+#define powf(a, b) (float)(pow((a), (b)))
+
+#undef max
+#undef min
+
+#define max(a, b) ((a) > (b) ? (a) : (b))
+#define min(a, b) ((a) < (b) ? (a) : (b))
+
+
+/******************************************************************************
+ *
+ * The code is broadly split into the following parts:
+ *
+ *  - Engine.  The process of determining the position of the juggler and 
+ *        objects being juggled at an arbitrary point in time.  This is
+ *        independent from any drawing code.
+ *  - Sites.  The process of creating a random site swap pattern or parsing
+ *        a Juggle Saver compatible siteswap for use by the engine.  For an
+ *        introduction to juggling site swaps check out
+ *         http://www.jugglingdb.com/
+ *  - Rendering.  OpenGL drawing code that animates the juggler.
+ *  - XScreenSaver.  Interface code to get thing working as a GLX hack.
+ *  
+ *****************************************************************************/
+
+
+/*****************************************************************************
+ *
+ * Data structures
+ *
+ *****************************************************************************/
+
+/* POS is used to represent the position of a hand when it catches or throws
+ * an object; as well as the orientation of the object.  The rotation and
+ * elevation are specified in degrees.  These angles are not normalised so that
+ * it is possible to specify how the object spins and rotates as it is thrown
+ * from the 'From' position to the 'To' position.
+ * 
+ * Because this is the position of the hand some translation is required with
+ * rings and clubs to get the centre of rotation position. */
+
+typedef struct
+{
+    float x;
+    float y;
+    float z;
+    float Rot;
+    float Elev;
+} POS;
+
+
+/* An array of THROW_INFOs are configured with each entry corresponding to the
+ * position in the site swap (In fact we double up odd length patterns to ensure
+ * there is left/right symmetry).  It allows us to quickly determine where an
+ * object and the hands are at a given time.  The information is specified in
+ * terms of throws, and positions where throws aren't present (0's and 2's) are
+ * simply ignored.
+ * 
+ * TotalTime - The count of beats before this object is thrown again.  Typically
+ *    this is the same as the weight of the throw but where an object is held it
+ *    is longer.  e.g. the first throw of the site 64242.7. will be 10, 6 for
+ *    throw and 4 (two 2's) for the carry.
+ * TimeInAir - The weight of the throw.
+ * PrevThrow - zero based index into array of THROW_INFOs of the previous throw.
+ *     e.g. for the throw '8' in the site 345678..... the PrevThrow is 1
+ *    (i.e. the 4)
+ * FromPos, FromVelocity, ToPos, ToVelocity - The position and speeds at the
+ *    start and end of the throw.  These are used to generate a spline while
+ *    carrying an object and while moving the hand from a throw to a catch.
+ * NextForHand - Number of beats before the hand that throws this object will
+ *    throw another object.  This is always going to be at least 2.  When there
+ *    are gaps in the pattern (0's) or holds (2's) NextForHand increases. */
+
+typedef struct
+{
+    int TotalTime;
+    int TimeInAir;
+    int PrevThrow;
+
+    POS FromPos;
+    POS FromVelocity;
+    POS ToPos;
+    POS ToVelocity;
+
+    int NextForHand;
+} THROW_INFO;
+
+
+/* OBJECT_POSITION works with the array of THROW_INFOs to allow us to determine
+ * exactly where an object or hand is.
+ *
+ * TimeOffset - The total number of beats expired when the object was thrown.
+ * ThrowIndex - The zero based index into the THROW_INFO array for the current
+ *     throw.
+ * ObjectType - One of the OBJECT_XX defines.
+ * TotalTwist - Only relevant for OBJECT_BALL, this is the total amount the ball
+ *     has twisted while in the air.  When segmented balls are drawn you see a 
+ *     spinning effect similar to what happens when you juggle beanbags.  */
+
+#define OBJECT_DEFAULT 0
+#define OBJECT_BALL 1
+#define OBJECT_CLUB 2
+#define OBJECT_RING 3
+
+typedef struct
+{
+    int TimeOffset;
+    int ThrowIndex;
+    float TotalTwist;
+    int ObjectType;
+} OBJECT_POSITION;
+
+
+/* PATTERN_INFO is the main structure that holds the information about a 
+ * juggling pattern. 
+ *
+ * pThrowInfo is an array of ThrowLen elements that describes each throw in the
+ *     pattern.
+ * pObjectInfo gives the current position of all objects at a given instant.
+ *     These values are updated as the pattern is animated.
+ * LeftHand and RightHand describe the current positions of each of the 
+ *     juggler's hands.
+ * MaxWeight is the maximum weight of the all throws in pThrowInfo.
+ * Height and Alpha are parameters that describe how objects fall under the
+ *     influence of gravity.  See SetHeightAndAlpha() for the gory details. */
+
+typedef struct
+{
+    THROW_INFO* pThrowInfo;
+    int ThrowLen;
+    
+    OBJECT_POSITION* pObjectInfo;
+    int Objects;
+
+    OBJECT_POSITION LeftHand;
+    OBJECT_POSITION RightHand;
+    
+    int MaxWeight;
+
+    float Height;
+    float Alpha;
+} PATTERN_INFO;
+
+
+/* EXT_SITE_INFO is used to initialise a PATTERN_INFO object using a Juggle
+ * Saver compatible site swap.  These contain additional information about the
+ * type of object thrown, the positions of throw and catch etc. */
+
+#define HAS_FROM_POS 1
+#define HAS_TO_POS 2
+#define HAS_SNATCH 4
+#define HAS_SPINS 8
+
+typedef struct
+{
+    unsigned Flags;
+    int Weight;
+    int ObjectType;
+    POS FromPos;
+    POS ToPos;
+    float SnatchX;
+    float SnatchY;
+    int Spins;
+} EXT_SITE_INFO;
+
+
+/* RENDER_STATE is used to co-ordinate the OpenGL rendering of the juggler and
+ * objects:
+ * pPattern - The pattern to be juggled
+ * CameraElev - The elevation angle (in degrees) that the camera is looking
+ *    along.  0 is horizontal and a +ve angle is looking down.  This value
+ *    should be between -90 and +90.
+ * AspectRatio - Window width to height ratio.
+ * DLStart - The number for the first display list created, any others directly
+ *    follow this.
+ * Time - Animation time (in beats)
+ * TranslateAngle - Cumulative translation (in degrees) for the juggling figure.
+ * SpinAngle- Cumulative spin (in degrees) for the juggling figure.
+ */
+
+typedef struct
+{
+    PATTERN_INFO* pPattern;
+    float CameraElev;
+    float AspectRatio;
+    int DLStart;
+    
+    float Time;
+    float TranslateAngle;
+    float SpinAngle;
+    
+    trackball_state *trackball;
+    Bool button_down_p;
+
+} RENDER_STATE;
+
+
+/*****************************************************************************
+ *
+ * Engine
+ *
+ ****************************************************************************
+ *
+ * The main purpose of the engine is to work out the exact position of all the
+ * juggling objects and the juggler's hands at any point in time.  The motion
+ * of the objects can be split into two parts: in the air and and being carried.
+ *
+ * While in the air, the motion is governed by a standard parabolic trajectory.
+ * The only minor complication is that the engine has no fixed concept of
+ * gravity, instead it using a term called Alpha that varies according to the
+ * pattern (see SetHeightAndAlpha). 
+ *
+ * The motion while an object is carried comes from fitting a spline through the
+ * catch and throw points and maintaining the catch and throw velocities at
+ * each end.  In the simplest case this boils down to cubic Bezier spline.  The
+ * only wrinkle occurs when a ball is being carried for a long time.  The simple 
+ * cubic spline maths produces a curve that goes miles away -- here we do a
+ * bit of reparameterisation so things stay within sensible bounds.
+ * (On a related note, this scheme is _much_ simpler than the Juggle Saver
+ * one.  Juggle Saver achieves 2nd order continuity and much care is taken
+ * to avoid spline ringing.)
+ * 
+ * The motion of the hands is identical to the ball carrying code. It uses two
+ * splines: one while an object is being carried; and another when it moves from
+ * the previous throw to the next catch.
+ */
+const float CARRY_TIME = 0.56f;
+const float PI = 3.14159265358979f;
+
+
+/* While a ball is thrown it twists slighty about an axis, this routine gives
+ * the total about of twist for a given ball throw. */
+static float GetBallTwistAmount(const THROW_INFO* pThrow)
+{
+    if (pThrow->FromPos.x > pThrow->ToPos.x)
+        return 18.0f * powf(pThrow->TimeInAir, 1.5);
+    else
+        return -18.0f * powf(pThrow->TimeInAir, 1.5);
+}
+
+
+float NormaliseAngle(float Ang)
+{
+    if (Ang >= 0.0f)
+    {
+        int i = (int) (Ang + 180.0f) / 360;
+        return Ang - 360.0f * i;
+    }
+    else
+    {
+        int i = (int)(180.0f - Ang) / 360;
+        return Ang + i * 360.0f;
+    }
+}
+
+
+/* The interpolate routine for ball carrying and hand motion.  We are given the
+ * start (P0) and end (P1) points and the velocities at these points, the task
+ * is to form a function P(t) such that:
+ *    P(0) = P0
+ *    P(TLen) = P1
+ *    P'(0) = V0
+ *    P'(TLen) = V1
+ */
+
+static POS InterpolatePosition(
+    const POS* pP0, const POS* pV0, const POS* pP1, const POS* pV1,
+    float TLen, float t)
+{
+    POS p;
+    float a, b, c, d, tt, tc;
+    
+    /* The interpolation is based on a simple cubic that achieves 1st order
+     * continuity at the end points.  However the spline can become too long if
+     * the TLen parameter is large.  In this case we cap the curve's length (fix
+     * the shape) and then reparameterise time to achieve the continuity
+     * conditions. */
+
+    tc = CARRY_TIME;
+    
+    if (TLen > tc)
+    {
+        /* The reparameterisation tt(t) gives:
+         *  tt(0) = 0, tt(TLen) = tc, tt'(0) = 1, tt'(TLen) = 1
+         * and means we can set t = tt(t), TLen = tc and then fall through
+         * to use the normal cubic spline fit.
+         *    
+         * The reparameterisation is based on two piecewise quadratics, one
+         * that goes from t = 0 to t = TLen / 2 and the other, mirrored in
+         * tt and t that goes from t = TLen / 2 to t = TLen.
+         * Because TLen > tc we can arrange for tt to be unique in the range if
+         * we specify the quadratic in tt.  i.e. t = A * tt ^ 2 + B * tt + C.
+         *
+         * Considering the first piece and applying initial conditions.
+         *   tt = 0 when t = 0   =>  C = 0
+         *   tt' = 1 when t = 0   =>  B = 1
+         *   tt = tc / 2 when t = TLen / 2  =>  A = 2 * (TLen - tc) / tc^2
+         *
+         * writing in terms of t
+         *   tt = (-B + (B ^ 2 + 4At) ^ 0.5) / 2A
+         * or
+         *   tt = ((1 + 4At) ^ 0.5 - 1) / 2A */
+        
+        float A = 2.0f * (TLen - tc) / (tc * tc);
+        
+        if (t > TLen / 2.0f)
+            t = tc - (sqrtf(1.0f + 4.0f * A * (TLen - t)) - 1.0f) / (2.0f * A);
+        else
+            t = (sqrtf(1.0f + 4.0f * A * t) - 1.0f) / (2.0f * A);
+        
+        TLen = tc;
+    }
+    
+    /* The cubic spline takes the form:
+     *   P(t) = p0 * a(t) + v0 * b(t) + p1 * c(t) + v1 * d(t)
+     * where p0 is the start point, v0 the start velocity, p1 the end point and
+     * v1 the end velocity.  a(t), b(t), c(t) and d(t) are cubics in t.
+     * We can show that:
+     *
+     *  a(t) = 2 * (t / TLen) ^ 3 - 3 * (t / TLen) ^ 2 + 1
+     *  b(t) = t ^ 3 / TLen ^ 2 - 2 * t ^ 2 / TLen + t
+     *  c(t) = -2 * (t / TLen) ^ 3 + 3 * (t / TLen) ^ 2
+     *  d(t) = t ^ 3 / TLen ^ 2 - t ^ 2 / TLen
+     *
+     * statisfy the boundary conditions:
+     *    P(0) = p0, P(TLen) = p1, P'(0) = v0 and P'(TLen) = v1  */
+    
+    tt = t / TLen;
+    
+    a = tt * tt * (2.0f * tt - 3.0f) + 1.0f;
+    b = t * tt * (tt - 2.0f) + t;
+    c = tt * tt * (3.0f - 2.0f * tt);
+    d = t * tt * (tt - 1.0f);
+
+    p.x = a * pP0->x + b * pV0->x + c * pP1->x + d * pV1->x;
+    p.y = a * pP0->y + b * pV0->y + c * pP1->y + d * pV1->y;
+    p.z = a * pP0->z + b * pV0->z + c * pP1->z + d * pV1->z;
+
+    p.Rot = a * NormaliseAngle(pP0->Rot) + b * pV0->Rot + 
+        c * NormaliseAngle(pP1->Rot) + d * pV1->Rot;
+    p.Elev = a * NormaliseAngle(pP0->Elev) + b * pV0->Elev + 
+        c * NormaliseAngle(pP1->Elev) + d * pV1->Elev;
+
+    return p;
+}
+
+
+static POS InterpolateCarry(
+    const THROW_INFO* pThrow, const THROW_INFO* pNext, float t)
+{
+    float CT = CARRY_TIME + pThrow->TotalTime - pThrow->TimeInAir;
+    return InterpolatePosition(&pThrow->ToPos, &pThrow->ToVelocity,
+        &pNext->FromPos, &pNext->FromVelocity, CT, t);
+}
+
+
+/* Determine the position of the hand at a point in time. */
+
+void GetHandPosition(
+    PATTERN_INFO* pPattern, int RightHand, float Time, POS* pPos)
+{
+    OBJECT_POSITION* pObj = 
+        RightHand == 0 ? &pPattern->LeftHand : &pPattern->RightHand;
+    THROW_INFO* pLastThrow;
+    
+    /* Upon entry, the throw information for the relevant hand may be out of
+     * sync.  Therefore we advance through the pattern if required. */
+
+    while (pPattern->pThrowInfo[pObj->ThrowIndex].NextForHand + pObj->TimeOffset 
+        <= (int) Time)
+    {
+        int w = pPattern->pThrowInfo[pObj->ThrowIndex].NextForHand;
+        pObj->TimeOffset += w;
+        pObj->ThrowIndex = (pObj->ThrowIndex + w) % pPattern->ThrowLen;
+    }
+
+    pLastThrow = &pPattern->pThrowInfo[pObj->ThrowIndex];
+
+    /* The TimeInAir will only ever be 2 or 0 if no object is ever thrown by
+     * this hand.  In normal circumstances, 2's in the site swap are coalesced
+     * and added to TotalTime of the previous throw.  0 is a hole and means that
+     * an object isn't there.  In this case we just hold the hand still. */
+    if (pLastThrow->TimeInAir == 2 || pLastThrow->TimeInAir == 0)
+    {
+        pPos->x = pLastThrow->FromPos.x;
+        pPos->y = pLastThrow->FromPos.y;
+    }
+    else
+    {
+        /* The hand is either moving to catch the next object or carrying the
+         * next object to its next throw position.  The way THROW_INFO is
+         * structured means the relevant information for the object we're going
+         * to catch is held at the point at which it was thrown 
+         * (pNextThrownFrom).  We can't go straight for it and instead have to
+         * look at the object we've about to throw next and work out where it
+         * came from. */
+        
+        THROW_INFO* pNextThrow = &pPattern->pThrowInfo[
+            (pObj->ThrowIndex + pLastThrow->NextForHand) % pPattern->ThrowLen];
+        
+        THROW_INFO* pNextThrownFrom = 
+            &pPattern->pThrowInfo[pNextThrow->PrevThrow];
+        
+        /* tc is a measure of how long the object we're due to catch is being
+         * carried for.  We use this to work out if we've actually caught it at
+         * this moment in time. */
+        
+        float tc = CARRY_TIME + 
+            pNextThrownFrom->TotalTime - pNextThrownFrom->TimeInAir;
+        
+        Time -= pObj->TimeOffset;
+
+        if (Time > pLastThrow->NextForHand - tc)
+        {
+            /* carrying this ball to it's new location */
+            *pPos = InterpolateCarry(pNextThrownFrom,
+                pNextThrow, (Time - (pLastThrow->NextForHand - tc)));
+        }
+        else
+        {
+            /* going for next catch */
+            *pPos = InterpolatePosition(
+                &pLastThrow->FromPos, &pLastThrow->FromVelocity, 
+                &pNextThrownFrom->ToPos, &pNextThrownFrom->ToVelocity,
+                pLastThrow->NextForHand - tc, Time);
+        }
+    }
+}
+
+
+static float SinDeg(float AngInDegrees)
+{
+    return sinf(AngInDegrees * PI / 180.0f);
+}
+
+
+static float CosDeg(float AngInDegrees)
+{
+    return cosf(AngInDegrees * PI / 180.0f);
+}
+
+
+/* Offset the specified position to get the centre of the object based on the
+ * the handle length and the current orientation */
+
+static void OffsetHandlePosition(const POS* pPos, float HandleLen, POS* pResult)
+{
+    pResult->x = pPos->x + HandleLen * SinDeg(pPos->Rot) * CosDeg(pPos->Elev);
+    pResult->y = pPos->y + HandleLen * SinDeg(pPos->Elev);
+    pResult->z = pPos->z + HandleLen * CosDeg(pPos->Rot) * CosDeg(pPos->Elev);
+    pResult->Elev = pPos->Elev;
+    pResult->Rot = pPos->Rot;
+}
+
+
+static void GetObjectPosition(
+    PATTERN_INFO* pPattern, int Obj, float Time, float HandleLen, POS* pPos)
+{
+    OBJECT_POSITION* pObj = &pPattern->pObjectInfo[Obj];
+    THROW_INFO* pThrow;
+    
+    /* Move through the pattern, if required, such that pThrow corresponds to
+     * the current throw for this object. */
+
+    while (pPattern->pThrowInfo[pObj->ThrowIndex].TotalTime + pObj->TimeOffset
+        <= (int) Time)
+    {
+        int w = pPattern->pThrowInfo[pObj->ThrowIndex].TotalTime;
+        pObj->TimeOffset += w;
+        pObj->TotalTwist = NormaliseAngle(pObj->TotalTwist + 
+            GetBallTwistAmount(&pPattern->pThrowInfo[pObj->ThrowIndex]));
+        
+        pObj->ThrowIndex = (pObj->ThrowIndex + w) % pPattern->ThrowLen;
+    }
+
+    pThrow = &pPattern->pThrowInfo[pObj->ThrowIndex];
+
+    if (pThrow->TimeInAir == 2 || pThrow->TimeInAir == 0)
+    {
+        *pPos = pThrow->FromPos;
+        OffsetHandlePosition(pPos, HandleLen, pPos);
+    }
+    else
+    {
+        float tc = pThrow->TimeInAir - CARRY_TIME;
+        float BallTwist = GetBallTwistAmount(pThrow);
+        Time -= pObj->TimeOffset;
+        if (Time < tc)
+        {
+            /* object in air */
+            POS From, To;
+            float t, b;
+
+            t = Time / tc;
+            
+            OffsetHandlePosition(&pThrow->FromPos, HandleLen, &From);
+            OffsetHandlePosition(&pThrow->ToPos, HandleLen, &To);
+
+            b = (To.y - From.y) / tc + pPattern->Alpha * tc;
+            
+            pPos->x = (1.0f - t) * From.x + t * To.x;
+            pPos->z = (1.0f - t) * From.z + t * To.z;
+            pPos->y = -pPattern->Alpha * Time * Time + b * Time + From.y;
+            
+            if (pObj->ObjectType == OBJECT_BALL)
+                pPos->Rot = pObj->TotalTwist + t * BallTwist;
+            else
+            {
+                /* We describe the rotation of a club (or ring) with an
+                 * elevation and rotation but don't include a twist.
+                 * If we ignore twist for the moment, the orientation at a
+                 * rotation of r and an elevation of e can be also be expressed
+                 * by rotating the object a further 180 degrees and sort of
+                 * mirroring the rotation, e.g.:
+                 *    rot = r + 180 and elev = 180 - e
+                 * We can easily show that the maths holds, consider the
+                 * x, y ,z position of the end of a unit length club.
+                 *    y = sin(180 - e) = sin(e)
+                 *    x = cos(180 - e) * sin(r + 180) = -cos(e) * - sin(r)
+                 *    z = cos(180 - e) * cos(r + 180) = -cos(e) * - cos(r)
+                 * When a club is thrown these two potential interpretations
+                 * can produce unexpected results.
+                 * The approach we adopt is that we try and minimise the amount
+                 * of rotation we give a club -- normally this is what happens
+                 * when juggling since it's much easier to spin the club.
+                 *
+                 * When we come to drawing the object the two interpretations
+                 * aren't identical, one causes the object to twist a further
+                 * 180 about its axis.  We avoid the issue by ensuring our
+                 * objects have rotational symmetry of order 2 (e.g. we make
+                 * sure clubs have an even number of stripes) this makes the two
+                 * interpretations appear identical. */
+
+                float RotAmt = NormaliseAngle(To.Rot - From.Rot);
+
+                if (RotAmt < -90.0f)
+                {
+                    To.Elev += 180  - 2 * NormaliseAngle(To.Elev);
+                    RotAmt += 180.0f;
+                }
+                else if (RotAmt > 90.0f)
+                {
+                    To.Elev += 180 - 2 * NormaliseAngle(To.Elev);
+                    RotAmt -= 180.0f;
+                }
+
+                pPos->Rot = From.Rot + t * RotAmt;
+            }
+
+            pPos->Elev = (1.0f - t) * From.Elev + t * To.Elev;
+
+        }
+        else
+        {
+            THROW_INFO* pNextThrow = &pPattern->pThrowInfo[
+                   (pObj->ThrowIndex + pThrow->TotalTime) % pPattern->ThrowLen];
+
+            *pPos = InterpolateCarry(pThrow, pNextThrow, Time - tc);
+
+            if (pObj->ObjectType == OBJECT_BALL)
+                pPos->Rot = pObj->TotalTwist + BallTwist;
+
+            OffsetHandlePosition(pPos, HandleLen, pPos);
+        }
+    }
+}
+
+
+/* Alpha is used to represent the acceleration due to gravity (in fact
+ * 2 * Alpha is the acceleration).  Alpha is adjusted according to the pattern
+ * being juggled.  My preference is to slow down patterns with lots of objects
+ * -- they move too fast in realtime.  Also I prefer to see a balance between
+ * the size of the figure and the height of objects thrown -- juggling patterns
+ * with large numbers of objects under real gravity can mean balls are lobbed
+ * severe heights.  Adjusting Alpha achieves both these goals.
+ *
+ * Basically we pick a height we'd like to see the biggest throw reach and then
+ * adjust Alpha to meet this. */
+
+static void SetHeightAndAlpha(PATTERN_INFO* pPattern, 
+    const int* Site, const EXT_SITE_INFO* pExtInfo, int Len)
+{
+    float H;
+    int MaxW = 5;
+    int i;
+    
+    if (Site != NULL)
+    {
+        for (i = 0; i < Len; i++)
+            MaxW = max(MaxW, Site[i]);
+    }
+    else
+    {
+        for (i = 0; i < Len; i++)
+            MaxW = max(MaxW, pExtInfo[i].Weight);
+    }
+    
+    /* H is the ideal max height we'd like our objects to reach.  The formula
+     * was developed by trial and error and was simply stolen from Juggle Saver.
+     * Alpha is then calculated from the classic displacement formula:
+     *   s = 0.5at^2 + ut  (where a = 2 * Alpha)
+     * We know u (the velocity) is zero at the peak, and the object should fall
+     * H units in half the time of biggest throw weight.
+     * Finally we determine the proper height the max throw reaches since this
+     * may not be H because capping may be applied (e.g. for max weights less
+     * than 5). */
+    
+    H = 8.0f * powf(MaxW / 2.0f, 0.8f) + 5.0f;
+    pPattern->Alpha = (2.0f * H) / powf(max(5, MaxW) - CARRY_TIME, 2.0f);
+    pPattern->Height = pPattern->Alpha * powf((MaxW - CARRY_TIME) * 0.5f, 2);
+}
+
+
+/* Where positions and spin info is not specified, generate suitable default
+ * values. */
+
+static int GetDefaultSpins(int Weight)
+{
+    if (Weight < 3)
+        return 0;
+    else if (Weight < 4)
+        return 1;
+    else if (Weight < 7)
+        return 2;
+    else
+        return 3;
+}
+
+
+static void GetDefaultFromPosition(unsigned char Side, int Weight, POS* pPos)
+{
+    if (Weight > 4 && Weight % 2 != 0)
+        pPos->x = Side ?  -0.06f : 0.06f;
+    else if (Weight == 0 || Weight == 2)
+        pPos->x = Side ? 1.6f :  -1.6f;
+    else
+        pPos->x = Side? 0.24f :  -0.24f;
+
+    pPos->y = (Weight == 2 || Weight == 0) ? -0.25f : 0.0f;
+
+    pPos->Rot = (Weight % 2 == 0 ? -23.5f : 27.0f) * (Side ? -1.0f : 1.0f);
+
+    pPos->Elev = Weight == 1 ? -30.0f : 0.0f;
+    pPos->z = 0.0f;
+}
+
+
+static void GetDefaultToPosition(unsigned char Side, int Weight, POS* pPos)
+{
+    if (Weight == 1)
+        pPos->x = Side ?  -1.0f : 1.0f;
+    else if (Weight % 2 == 0)
+        pPos->x = Side ? 2.8f :  -2.8f;
+    else
+        pPos->x = Side?  -3.1f : 3.1f;
+
+    pPos->y = -0.5f;
+
+    pPos->Rot = (Side ? -35.0f : 35.0f) * (Weight % 2 == 0 ? -1.0f : 1.0f);
+    
+    if (Weight < 2)
+        pPos->Elev = -30.0f;
+
+    else if (Weight < 4)
+        pPos->Elev = 360.0f - 50.0f;
+    else if (Weight < 7)
+        pPos->Elev = 720.0f - 50.0f;
+    else
+        pPos->Elev = 360.0f * GetDefaultSpins(Weight) - 50.0f;
+    pPos->z = 0.0f;
+}
+
+
+/* Update the members of PATTERN_INFO for a given juggling pattern.  The pattern
+ * can come from an ordinary siteswap (Site != NULL) or from a Juggle Saver
+ * compatible pattern that contains, position and object info etc. 
+ * We assume that patterns are valid and have at least one object (a site of
+ * zeros is invalid).  The ones we generate randomly are safe. */
+
+static void InitPatternInfo(PATTERN_INFO* pPattern,
+    const int* Site, const EXT_SITE_INFO* pExtInfo, int Len)
+{
+    /* Double up on the length of the site if it's of an odd length. 
+     * This way we can store position information: even indices are on one
+     * side and odds are on the other. */
+    int InfoLen = Len % 2 == 1 ? Len * 2 : Len;
+    int i;
+    THROW_INFO* pInfo = (THROW_INFO*) calloc(InfoLen, sizeof(THROW_INFO));
+    int Objects = 0;
+    unsigned char* pUsed;
+    
+    pPattern->MaxWeight = 0;
+    pPattern->ThrowLen = InfoLen;
+    pPattern->pThrowInfo = pInfo;
+    
+    SetHeightAndAlpha(pPattern, Site, pExtInfo, Len);
+
+    /* First pass through we assign the things we know about for sure just by
+     * looking at the throw weight at this position.  This includes TimeInAir;
+     * the throw and catch positions; and throw and catch velocities.
+     * Other information, like the total time for the throw (i.e. when the
+     * object is thrown again) relies on how the rest of the pattern is 
+     * structured and we defer this task for successive passes and just make
+     * guesses at this stage. */
+    
+    for (i = 0; i < InfoLen; i++)
+    {
+        float t1;
+        int w = pExtInfo != NULL ? pExtInfo[i % Len].Weight : Site[i % Len];
+
+        pInfo[i].TotalTime = pInfo[i].TimeInAir = w;
+        pInfo[(w + i) % Len].PrevThrow = i;
+
+        /* work out where we are throwing this object from and where it's going
+         * to land. */
+
+        if (pExtInfo == NULL || (pExtInfo[i % Len].Flags & HAS_FROM_POS) == 0)
+            GetDefaultFromPosition(i % 2, w, &pInfo[i].FromPos);
+        else
+            pInfo[i].FromPos = pExtInfo[i % Len].FromPos;
+
+        if (pExtInfo == NULL || (pExtInfo[i % Len].Flags & HAS_TO_POS) == 0)
+            GetDefaultToPosition(i % 2, w, &pInfo[i].ToPos);
+        else
+            pInfo[i].ToPos = pExtInfo[i % Len].ToPos;
+
+        /* calculate the velocity the object is moving at the start and end
+         * points -- this information is used to interpolate the hand position
+         * and to determine how the object is moved while it's carried to the 
+         * next throw position.
+         *
+         * The throw motion is governed by a parabola of the form:
+         *   y(t) = a * t ^ 2 + b * t + c
+         * Assuming at the start of the throw y(0) = y0; when it's caught
+         * y(t1) = y1; and the accelation is -2.0 * alpha the equation can be
+         * rewritten as:
+         *   y(t) = -alpha * t ^ 2 + (alpha * t1 + (y1 - y0) / t1) * t + y0
+         * making the velocity:
+         *   y'(t) = -2.0 * alpha * t + (alpha * t1 + (y1 - y0) / t1)
+         * To get the y component of velocity first we determine t1, which is
+         * the throw weight minus the time spent carrying the object.  Then
+         * perform the relevant substitutions into the above.
+         * (note: y'(t) = y'(0) - 2.0 * alpha * t)
+         * 
+         * The velocity in the x direction is constant and can be simply
+         * obtained from:
+         *   x' = (x1 - x0) / t1
+         * where x0 and x1 are the start and end x-positions respectively.
+         */
+
+        t1 = w - CARRY_TIME;
+
+        pInfo[i].FromVelocity.y = pPattern->Alpha * t1 + 
+            (pInfo[i].ToPos.y - pInfo[i].FromPos.y) / t1;
+        pInfo[i].ToVelocity.y = 
+            pInfo[i].FromVelocity.y - 2.0f * pPattern->Alpha * t1;
+        pInfo[i].FromVelocity.x = pInfo[i].ToVelocity.x = 
+            (pInfo[i].ToPos.x - pInfo[i].FromPos.x) / t1;
+        pInfo[i].FromVelocity.z = pInfo[i].ToVelocity.z = 
+            (pInfo[i].ToPos.z - pInfo[i].FromPos.z) / t1;
+        pInfo[i].FromVelocity.Rot = pInfo[i].ToVelocity.Rot =
+            (pInfo[i].ToPos.Rot - pInfo[i].FromPos.Rot) / t1;
+        pInfo[i].FromVelocity.Elev = pInfo[i].ToVelocity.Elev =
+            (pInfo[i].ToPos.Elev - pInfo[i].FromPos.Elev) / t1;
+
+
+        if (pExtInfo != NULL && (pExtInfo[i % Len].Flags & HAS_SNATCH) != 0)
+        {
+            pInfo[i].ToVelocity.x = pExtInfo[i % Len].SnatchX;
+            pInfo[i].ToVelocity.y = pExtInfo[i % Len].SnatchY;
+        }
+
+        if (pExtInfo != NULL && (pExtInfo[i % Len].Flags & HAS_SPINS) != 0)
+        {
+            pInfo[i].ToPos.Elev = 360.0f * pExtInfo[i % Len].Spins +
+                NormaliseAngle(pInfo[i].ToPos.Elev);
+        }
+
+        Objects += w;
+        if (w > pPattern->MaxWeight)
+            pPattern->MaxWeight = w;
+    }
+
+    Objects /= InfoLen;
+
+    /* Now we go through again and work out exactly how long it is before the
+     * object is thrown again (ie. the TotalTime) typically this is the same
+     * as the time in air, however when we have a throw weight of '2' it's
+     * treated as a hold and we increase the total time accordingly. */
+
+    for (i = 0; i < InfoLen; i++)
+    {
+        if (pInfo[i].TimeInAir != 2)
+        {
+            int Next = pInfo[i].TimeInAir + i;
+            while (pInfo[Next % InfoLen].TimeInAir == 2)
+            {
+                Next += 2;
+                pInfo[i].TotalTime += 2;
+            }
+
+            /* patch up the Prev index.  We don't bother to see if this
+             * is different from before since it's always safe to reassign it */
+            pInfo[Next % InfoLen].PrevThrow = i;
+        }
+    }
+
+    /* then we work our way through again figuring out where the hand goes to
+     * catch something as soon as it has thrown the current object. */
+
+    for (i = 0; i < InfoLen; i++)
+    {
+        if (pInfo[i].TimeInAir != 0 && pInfo[i].TimeInAir != 2)
+        {
+            /* what we're trying to calculate is how long the hand that threw
+             * the current object has to wait before it throws another.
+             * Typically this is two beats later.  However '0' in the site swap
+             * represents a gap in a catch, and '2' represents a hold.  We skip
+             * over these until we reach the point where a ball is actually
+             * thrown. */
+            int Wait = 2;
+            while (pInfo[(i + Wait) % InfoLen].TimeInAir == 2 || 
+                pInfo[(i + Wait) % InfoLen].TimeInAir == 0)
+            {
+                Wait += 2;
+            }
+            pInfo[i].NextForHand = Wait;
+        }
+        else
+        {
+            /* Be careful to ensure the current weight isn't one we're trying
+             * to step over; otherwise we could potentially end up in an 
+             * infinite loop.  The value we assign may end up being used
+             * in patterns with infinite gaps (e.g. 60) or infinite holds
+             * (e.g. 62) in both cases, setting a wait of 2 ensures things
+             * are well behaved. */
+            pInfo[i].NextForHand = 2;
+        }
+    }
+
+    /* Now work out the starting positions for the objects.  To do this we
+     * unweave the initial throws so we can pick out the individual threads. */
+
+    pUsed = (unsigned char*) 
+        malloc(sizeof(unsigned char) * pPattern->MaxWeight);
+    pPattern->Objects = Objects;
+    pPattern->pObjectInfo = (OBJECT_POSITION*) calloc(
+        Objects, sizeof(OBJECT_POSITION));
+
+    for (i = 0; i < pPattern->MaxWeight; i++)
+        pUsed[i] = 0;
+
+    for (i = 0; i < pPattern->MaxWeight; i++)
+    {
+        int w = pInfo[i % InfoLen].TimeInAir;
+        if (pUsed[i] == 0 &&  w != 0)
+        {
+            Objects--;
+            pPattern->pObjectInfo[Objects].TimeOffset = i;
+            pPattern->pObjectInfo[Objects].ThrowIndex = i % InfoLen;
+            pPattern->pObjectInfo[Objects].TotalTwist = 0.0f;
+
+            if (pExtInfo != NULL && 
+                pExtInfo[i % Len].ObjectType != OBJECT_DEFAULT)
+            {
+                pPattern->pObjectInfo[Objects].ObjectType =
+                    pExtInfo[i % Len].ObjectType;
+            }
+            else
+            {
+                pPattern->pObjectInfo[Objects].ObjectType = (1 + random() % 3);
+            }
+        }
+
+        if (w + i < pPattern->MaxWeight)
+            pUsed[w + i] = 1;
+        
+    }
+
+    pPattern->LeftHand.TimeOffset = pPattern->LeftHand.ThrowIndex = 0;
+    pPattern->RightHand.TimeOffset = pPattern->RightHand.ThrowIndex = 1;
+    
+    free(pUsed);
+}
+
+
+static void ReleasePatternInfo(PATTERN_INFO* pPattern)
+{
+    free(pPattern->pObjectInfo);
+    free(pPattern->pThrowInfo);
+}
+
+
+/*****************************************************************************
+ *
+ * Sites
+ *
+ ****************************************************************************/
+
+/* Generate a random site swap.  We assume that MaxWeight >= ObjCount and
+ * Len >= MaxWeight. */
+static int* Generate(int Len, int MaxWeight, int ObjCount)
+{
+    int* Weight = (int*) calloc(Len, sizeof(int));
+    int* Used = (int*) calloc(Len, sizeof(int));
+    int* Options = (int*) calloc(MaxWeight + 1, sizeof(int));
+    int nOpts;
+    int i, j;
+
+    for (i = 0; i < Len; i++)
+        Weight[i] = Used[i] = -1;
+    
+    /* Pick out a unique the starting position for each object.  -2 is put in
+     * the Used array to signify this is a starting position. */
+
+    while (ObjCount > 0)
+    {
+        nOpts = 0;
+        for (j = 0; j < MaxWeight; j++)
+        {
+            if (Used[j] == -1)
+                Options[nOpts++] = j;
+        }
+
+        Used[Options[random() % nOpts]] = -2;
+        ObjCount--;
+    }
+    
+    /* Now work our way through the pattern moving throws into an available
+     * landing positions. */
+    for (i = 0; i < Len; i++)
+    {
+        if (Used[i] == -1)
+        {
+            /* patch up holes in the pattern to zeros */
+            Used[i] = 1;
+            Weight[i] = 0;
+        }
+        else
+        {
+            /* Work out the possible places where a throw can land and pick a 
+             * weight at random. */
+            int w;
+            nOpts = 0;
+
+            for (j = 0 ; j <= MaxWeight; j++)
+            {
+                if (Used[(i + j) % Len] == -1)
+                    Options[nOpts++] = j;
+            }
+            
+            w = Options[random() % nOpts];
+            Weight[i] = w;
+            
+            /* For starting throws make position available for a throw to land.
+             * Because Len >= MaxWeight these positions will only be filled when
+             * a throw wraps around the end of the site swap and therefore we
+             * can guarantee the all the object threads will be tied up. */
+            if (Used[i] == -2)
+                Used[i] = -1;
+            
+            Used[(i + w) % Len] = 1;
+        }
+    }
+
+    free(Options);
+    free(Used);
+    return Weight;
+}
+
+
+/* Routines to parse the Juggle Saver patterns.  These routines are a bit yucky
+ * and make the big assumption that the patterns are well formed.  This is fine
+ * as it stands because only 'good' ones are used but if the code is ever
+ * extended to read arbitrary patterns (say from a file) then these routines
+ * need to be beefed up. */
+
+/* The position text looks something like (x,y,z[,rot[,elev]])
+ * where the stuff in square brackets is optional */
+
+static unsigned char ParsePositionText(const char** ppch, POS* pPos)
+{
+    const char* pch = *ppch;
+    unsigned char OK;
+    char szTemp[32];
+    char* pOut;
+    float* Nums[4];
+    int i;
+    
+    Nums[0] = &pPos->x;
+    Nums[1] = &pPos->y;
+    Nums[2] = &pPos->Rot;
+    Nums[3] = &pPos->Elev;
+
+
+    while (*pch == ' ')
+        pch++;
+    
+    OK = *pch == '(';
+    
+    if (OK)
+        pch++;
+
+    for (i = 0; OK && i < 4; i++)
+    {
+        pOut = szTemp;
+        while (*pch == ' ')
+            pch++;
+        while (*pch != ',' && *pch != '\0' && *pch != ')' && *pch != ' ')
+            *pOut++ = *pch++;
+        *pOut = '\0';
+
+        if (szTemp[0] != '\0')
+            *Nums[i] = (float) atof(szTemp);
+
+        while (*pch == ' ')
+            pch++;
+
+        if (i < 3)
+        {
+            if (*pch == ',')
+                pch++;
+            else if (*pch == ')')
+                break;
+            else
+                OK = 0;
+        }
+    }
+
+    if (OK)
+    {
+        while (*pch == ' ')
+            pch++;        
+        if (*pch == ')')
+            pch++;
+        else
+            OK = 0;
+    }
+
+    *ppch = pch;
+
+    return OK;
+}
+
+
+static EXT_SITE_INFO* ParsePattern(const char* Site, int* pLen)
+{
+    const char* pch = Site;
+    int Len = 0;
+    EXT_SITE_INFO* pInfo = NULL;
+    unsigned char OK = 1;
+
+    while (OK && *pch != 0)
+    {
+        EXT_SITE_INFO Info;
+        Info.Flags = 0;
+
+        while (*pch == ' ') pch++;
+
+        OK = *pch != '\0';
+
+        if (OK)
+            Info.Weight = *pch >= 'A' ? *pch + 10 - 'A' : *pch - '0';
+
+        /* parse object type */
+        if (OK)
+        {
+            pch++;
+            while (*pch == ' ') pch++;
+
+            if (*pch == 'b' || *pch == 'B')
+            {
+                Info.ObjectType = OBJECT_BALL;
+                pch++;
+            }
+            else if (*pch == 'c' || *pch == 'C')
+            {
+                Info.ObjectType = OBJECT_CLUB;
+                pch++;
+            }
+            else if (*pch == 'r' || *pch == 'R')
+            {
+                Info.ObjectType = OBJECT_RING;
+                pch++;
+            }
+            else if (*pch == 'd' || *pch == 'D')
+            {
+                Info.ObjectType = OBJECT_DEFAULT;
+                pch++;
+            }
+            else
+            {
+                Info.ObjectType = OBJECT_DEFAULT;
+            }
+        }
+
+        /* Parse from position */
+        if (OK)
+        {
+            while (*pch == ' ') pch++;
+            if (*pch == '@')
+            {
+                pch++;
+                GetDefaultFromPosition(Len % 2, Info.Weight, &Info.FromPos);
+                Info.Flags |= HAS_FROM_POS;
+                OK = ParsePositionText(&pch, &Info.FromPos);
+            }
+        }
+
+        /* Parse to position */
+        if (OK)
+        {
+            while (*pch == ' ') pch++;
+            if (*pch == '>')
+            {
+                pch++;
+                GetDefaultToPosition(Len % 2, Info.Weight, &Info.ToPos);
+                Info.Flags |= HAS_TO_POS;
+                OK = ParsePositionText(&pch, &Info.ToPos);
+            }
+        }
+
+        /* Parse snatch */
+        if (OK)
+        {
+            while (*pch == ' ') pch++;
+            if (*pch == '/')
+            {
+                POS Snatch;
+                pch++;
+                Info.Flags |= HAS_SNATCH;
+                OK = ParsePositionText(&pch, &Snatch);
+                Info.SnatchX = Snatch.x;
+                Info.SnatchY = Snatch.y;
+            }
+        }
+
+        /* Parse Spins */
+        if (OK)
+        {
+            while (*pch == ' ') pch++;
+            if (*pch == '*')
+            {
+                pch++;
+                OK = 0;
+                Info.Spins = 0;
+                while (*pch >= '0' && *pch <= '9')
+                {
+                    OK = 1;
+                    Info.Spins = Info.Spins * 10 + *pch - '0';
+                    pch++;
+                }
+            }
+            else
+                Info.Spins = GetDefaultSpins(Info.Weight);
+
+            Info.Flags |= HAS_SPINS;
+        }
+
+        if (OK)
+        {
+            if (pInfo == NULL)
+                pInfo = (EXT_SITE_INFO*) malloc(sizeof(EXT_SITE_INFO));
+            else
+                pInfo = (EXT_SITE_INFO*) realloc(pInfo, (Len + 1) * sizeof(EXT_SITE_INFO));
+
+            pInfo[Len] = Info;
+            Len++;
+        }
+    }
+
+    if (!OK && pInfo != NULL)
+    {
+        free(pInfo);
+        pInfo = NULL;
+    }
+
+    *pLen = Len;
+
+    return pInfo;
+}
+
+
+/*****************************************************************************
+ *
+ *  Juggle Saver Patterns
+ *
+ *****************************************************************************
+ *
+ * This is a selection of some of the more interesting patterns from taken
+ * from the Juggle Saver sites.txt file.  I've only used patterns that I
+ * originally created.
+ */
+
+const char* PatternText[] =
+{
+    "9b@(-2.5,0,-70,40)>(2.5,0,70)*2 1b@(1,0,10)>(-1,0,-10)",
+    
+    "3B@(1,-0.4)>(2,4.2)/(-2,1)3B@(-1.8,4.4)>(-2.1,0)",
+    
+    "7c@(-2,0,-20)>(1.2,0,-5)7c@(2,0,20)>(-1.2,0,5)",
+    
+    "3b@(-0.5,0)>(1.5,0) 3b@(0.5,0)>(-1.5,0) 3r@(-2.5,3,-90,80)>(2,1,90,30)"
+    "3b@(0.5,0)>(-1.5,0) 3b@(-0.5,0)>(1.5,0) 3r@(2.5,3,90,80)>(-2,1,-90,30)",
+    
+    "5c@(2,1.9,10)>(-1,1,10)5c@(2,1.8,10)>(-0.5,1.6,10)/(5,-1)"
+    "5c@(1.6,0.2,10)>(0,-1,10)/(9,-2)5c@(-2,1.9,-10)>(1,1,-10)"
+    "5c@(-2,1.8,-10)>(0.5,1.6,-10)/(-5,-1)5@(-1.6,0.2,-10)>(0,-1,-10)/(-9,-2)",
+    
+    "3c@(-1.5,0,0)>(-1.5,1,0)3c@(1.5,-0.2,0)>(1.5,-0.1,0)3c@(0,-0.5,0)>(0,1,0)"
+    "3@(-1.5,2,0)>(-1.5,-1,0)3@(1.5,0,0)>(1.5,1,0)3@(0,0,0)>(0,-0.5,0)",
+    
+    "9c@(-2.5,0,-70,40)>(2.5,0,70)*2 1c@(1,0,10)>(-1,0,-10)*0",
+    
+    "3c@(2,0.5,60,0)>(1.5,4,60,80)/(-6,-12)"
+    "3c@(-2,0.5,-60,0)>(-1.5,4,-60,80)/(6,-12)",
+    
+    "3c@(-0.2,0)>(1,0)3c@(0.2,0)>(-1,0)3c@(-2.5,2,-85,30)>(2.5,2,85,40)*2 "
+    "3@(0.2,0)>(-1,0) 3@(-0.2,0)>(1,0) 3@(2.5,2,85,30)>(-2.5,2,-85,40)*2",
+    
+    "3c@(-0.5,-0.5,20,-30)>(2.6,4.3,60,60)/(0,1)*1 "
+    "3c@(1.6,5.6,60,80)>(-2.6,0,-80)*0",
+    
+    "5c@(-0.3,0,10)>(1.2,0,10) 5c@(0.3,0,-10)>(-1.2,0,-10)"
+    "5c@(-0.3,0,10)>(1.2,0,10) 5c@(0.3,0,-10)>(-1.2,0,-10)"
+    "5c@(-3,3.5,-65,80)>(3,2.5,65) 5c@(0.3,0,-10)>(-1.2,0,-10)"
+    "5@(-0.3,0,10)>(1.2,0,10) 5@(0.3,0,-10)>(-1.2,0,-10)"
+    "5@(-0.3,0,10)>(1.2,0,10)5@(3,3.5,65,80)>(-3,2.5,-65)"
+};
+
+
+/*****************************************************************************
+ *
+ * Rendering
+ *
+ *****************************************************************************/
+
+static const float FOV = 70.0f;
+static const float BodyCol[] = {0.6f, 0.6f, 0.45f, 1.0f};
+static const float HandleCol[] = {0.45f, 0.45f, 0.45f, 1.0f};
+static const float LightPos[] = {0.0f, 200.0f, 400.0f, 1.0f};
+static const float LightDiff[] = {1.0f, 1.0f, 1.0f, 0.0f};
+static const float LightAmb[] = {0.02f, 0.02f, 0.02f, 0.0f};
+static const float ShoulderPos[3] = {0.95f, 2.1f, 1.7f};
+static const float DiffCol[] = {1.0f, 0.0f, 0.0f, 1.0f};
+static const float SpecCol[] = {1.0f, 1.0f, 1.0f, 1.0f};
+
+static const float BallRad = 0.34f;
+static const float UArmLen = 1.9f;
+static const float LArmLen = 2.3f;
+
+#define DL_BALL 0
+#define DL_CLUB 1
+#define DL_RING 2
+#define DL_TORSO 3
+#define DL_FOREARM 4
+#define DL_UPPERARM 5
+
+static const float AltCols[][4] =
+{
+    {0.0f, 0.7f, 0.0f, 1.0f},
+    {0.0f, 0.0f, 0.9f, 1.0f},
+    {0.0f, 0.9f, 0.9f, 1.0f},
+    {0.45f, 0.0f, 0.9f, 1.0f},
+    {0.9f, 0.45f, 0.0f, 1.0f},
+    {0.0f, 0.45f, 0.9f, 1.0f},
+    {0.9f, 0.0f, 0.9f, 1.0f},
+    {0.9f, 0.9f, 0.0f, 1.0f},
+    {0.9f, 0.0f, 0.45f, 1.0f},
+    {0.45f, 0.15f, 0.6f, 1.0f}, 
+    {0.9f, 0.0f, 0.0f, 1.0f},
+    {0.0f, 0.9f, 0.45f, 1.0f},
+};
+
+static const float Cols[][4] =
+{
+    {0.9f, 0.0f, 0.0f, 1.0f},  /*  0 */
+    {0.0f, 0.7f, 0.0f, 1.0f},  /*  1 */
+    {0.0f, 0.0f, 0.9f, 1.0f},  /*  2 */
+    {0.0f, 0.9f, 0.9f, 1.0f},  /*  3 */
+    {0.9f, 0.0f, 0.9f, 1.0f},  /*  4 */
+    {0.9f, 0.9f, 0.0f, 1.0f},  /*  5 */
+    {0.9f, 0.45f, 0.0f, 1.0f}, /*  6 */
+    {0.9f, 0.0f, 0.45f, 1.0f}, /*  7 */
+    {0.45f, 0.9f, 0.0f, 1.0f}, /*  8 */
+    {0.0f, 0.9f, 0.45f, 1.0f}, /*  9 */
+    {0.45f, 0.0f, 0.9f, 1.0f}, /* 10 */
+    {0.0f, 0.45f, 0.9f, 1.0f}, /* 11 */
+};
+
+static int InitGLDisplayLists(void);
+
+
+void InitGLSettings(RENDER_STATE* pState, int WireFrame)
+{
+    memset(pState, 0, sizeof(RENDER_STATE));
+    
+    pState->trackball = gltrackball_init ();
+
+    if (WireFrame)
+        glPolygonMode(GL_FRONT, GL_LINE);
+    
+    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+    glLightfv(GL_LIGHT0, GL_POSITION, LightPos);
+    glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiff);
+    glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmb);
+    
+    glEnable(GL_SMOOTH);
+    glEnable(GL_LIGHTING);
+    glEnable(GL_LIGHT0);
+
+    glDepthFunc(GL_LESS);
+    glEnable(GL_DEPTH_TEST);
+
+    glCullFace(GL_BACK);
+    glEnable(GL_CULL_FACE);
+    
+    pState->DLStart = InitGLDisplayLists();
+}
+
+
+static void SetCamera(RENDER_STATE* pState)
+{
+    /* Try to work out a sensible place to put the camera so that more or less
+     * the whole juggling pattern fits into the screen. We assume that the
+        * pattern is height limited (i.e. if we get the height right then the width
+        * will be OK).  This is a pretty good assumption given that the screen
+        * tends to wider than high, and that a juggling pattern is normally much
+        * higher than wide.
+     *
+     * If I could draw a diagram here then it would be much easier to
+     * understand but my ASCII-art skills just aren't up to it.  
+     *
+     * Basically we estimate a bounding volume for the juggler and objects 
+     * throughout the pattern.  We don't fully account for the fact that the
+     * juggler moves across the stage in an epicyclic-like motion and instead
+     * use the near and far planes in x-y (with z = +/- w).  We also
+     * assume that the scene is centred at x=0, this reduces our task to finding
+     * a bounding rectangle.  Finally we need to make an estimate of the
+     * height - for this we work out the max height of a standard throw or max
+     * weight from the pattern; we then do a bit of adjustment to account for
+     * a throw occurring at non-zero y values.
+     *
+     * Next we work out the best way to fit this rectangle into the perspective
+     * transform.  Based on the angle of elevation (+ve angle looks down) and
+     * the FOV we can work out whether it's the near or far corners that are
+     * the extreme points.  And then trace back from them to find the eye
+     * point.
+     *
+     */
+     
+    float ElevRad = pState->CameraElev * PI / 180.0f;
+    float w = 3.0f;
+    float cy, cz;
+    float ey, ez;
+    float d;
+    float H = 0.0f;
+    int i;
+    float a;
+    
+    float tz, ty, ta;
+    float bz, by, ba;
+    const PATTERN_INFO* pPattern = pState->pPattern;
+
+    glMatrixMode(GL_PROJECTION);
+    glLoadIdentity();
+        
+    for (i = 0; i < pPattern->ThrowLen; i++)
+        H = max(H, pPattern->pThrowInfo[i].FromPos.y);
+        
+    H += pPattern->Height;
+    
+    ElevRad = pState->CameraElev * PI / 180.0f;
+    
+    /* ta is the angle from a point on the top of the bounding area to the eye
+     * similarly ba is the angle from a point on the bottom. */
+    ta = (pState->CameraElev  - (FOV - 10.0f) / 2.0f) * PI / 180.0f;
+    ba = (pState->CameraElev  + (FOV - 10.0f) / 2.0f) * PI / 180.0f;
+
+    /* tz and bz hold the z location of the top and bottom extreme points.
+     * For the top, if the angle to the eye location is positive then the
+     * extreme point is with far z corner (the camera looks in -ve z).
+     * The logic is reserved for the bottom. */
+    tz = ta >= 0.0f ? -w : w;
+    bz = ba >= 0.0f ? w : -w;
+    
+    ty = H;
+    by = -1.0f;
+    
+    /* Solve of the eye location by using a bit of geometry.
+     * We know the eye lies on intersection of two lines.  One comes from the
+     * top and other from the bottom. Giving two equations:
+     *   ez = tz + a * cos(ta) = bz + b * cos(ba)
+     *   ey = ty + a * sin(ta) = by + b * sin(ba)
+     * We don't bother to solve for b and use Crammer's rule to get
+     *         | bz-tz  -cos(ba) |
+     *         | by-ty  -sin(ba) |     
+     *   a =  ----------------------
+     *        | cos(ta)   -cos(ba) |
+     *        | sin(ta)   -sin(ba) |
+     */
+    d = cosf(ba) * sinf(ta) - cosf(ta) * sinf(ba);
+    a = (cosf(ba) * (by - ty) - sinf(ba) * (bz - tz)) / d;
+    
+    ey = ty + a * sinf(ta);
+    ez = tz + a * cosf(ta);
+    
+    /* now work back from the eye point to get the lookat location */
+    cz = 0.0;
+    cy = ey - ez * tanf(ElevRad);
+    
+    /* use the distance from the eye to the scene centre to get a measure
+     * of what the far clipping should be.  We then add on a bit more to be 
+     * comfortable */
+    d = sqrtf(ez * ez + (cy - ey) * (cy - ey));
+    
+    gluPerspective(FOV, pState->AspectRatio, 0.1f, d + 20.0f);
+    gluLookAt(0.0, ey, ez, 0.0, cy, cz, 0.0, 1.0, 0.0);
+
+    glMatrixMode(GL_MODELVIEW);
+}
+
+
+void ResizeGL(RENDER_STATE* pState, int w, int h)
+{
+    glViewport(0, 0, w, h);
+    pState->AspectRatio = (float) w / h;
+    SetCamera(pState);
+}
+
+
+/* Determine the angle at the vertex of a triangle given the length of the
+ * three sides. */
+
+static double CosineRule(double a, double b, double c)
+{
+    double cosang = (a * a + b * b - c * c) / (2 * a * b);
+    /* If lengths don't form a proper triangle return something sensible.
+     * This typically happens with patterns where the juggler reaches too 
+     * far to get hold of an object. */
+    if (cosang < -1.0 || cosang > 1.0)
+        return 0;
+    else
+        return 180.0 * acos(cosang) / PI;
+}
+
+
+/* Spheres for the balls are generated by subdividing each triangle face into
+ * four smaller triangles.  We start with an octahedron (8 sides) and repeat the
+ * process a number of times.  The result is a mesh that can be split into four
+ * panels (like beanbags) and is smoother than the normal stacks and slices
+ * approach. */
+
+static void InterpolateVertex(
+    const float* v1, const float* v2, float t, float* result)
+{
+    result[0] = v1[0] * (1.0f - t) + v2[0] * t;
+    result[1] = v1[1] * (1.0f - t) + v2[1] * t;
+    result[2] = v1[2] * (1.0f - t) + v2[2] * t;
+}
+
+
+static void SetGLVertex(const float* v, float rad)
+{
+    float Len = sqrtf(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
+
+    if (Len >= 1.0e-10f)
+    {
+        glNormal3f(v[0] / Len, v[1] / Len, v[2] / Len);
+        glVertex3f(rad * v[0] / Len, rad * v[1] / Len, rad * v[2] / Len);
+    }
+    else
+        glVertex3fv(v);
+}
+
+
+static void SphereSegment(
+    const float* v1, const float* v2, const float* v3, float r, int Levels)
+{
+    int i, j;
+
+    for (i = 0; i < Levels; i++)
+    {
+        float A[3], B[3], C[3], D[3];
+        
+        InterpolateVertex(v3, v1, (float) i / Levels, D);
+        InterpolateVertex(v3, v1, (float)(i + 1) / Levels, A);
+        InterpolateVertex(v3, v2, (float)(i + 1) / Levels, B);
+        InterpolateVertex(v3, v2, (float) i / Levels, C);
+
+        glBegin(GL_TRIANGLE_STRIP);
+
+        SetGLVertex(B, r);
+        SetGLVertex(C, r);
+        
+        for (j = 1; j <= i; j++)
+        {
+            float v[3];
+
+            InterpolateVertex(B, A, (float) j / (i + 1), v);
+            SetGLVertex(v, r);
+
+            InterpolateVertex(C, D, (float) j / i, v);
+            SetGLVertex(v, r);
+        }
+
+        SetGLVertex(A, r);
+        
+        glEnd();
+    }
+}
+
+
+/* OK, this function is a bit of misnomer, it only draws half a sphere.  Indeed
+ * it draws two panels and allows us to colour this one way,  then draw the
+ * same shape again rotated 90 degrees in a different colour.  Resulting in what
+ * looks like a four-panel beanbag in two complementary colours. */
+static void DrawSphere(float rad)
+{
+    int Levels = 4;
+    float v1[3], v2[3], v3[3];
+    
+    v1[0] = 1.0f, v1[1] = 0.0f; v1[2] = 0.0f;
+    v2[0] = 0.0f, v2[1] = 1.0f; v2[2] = 0.0f;
+    v3[0] = 0.0f, v3[1] = 0.0f; v3[2] = 1.0f;
+    SphereSegment(v1, v2, v3, rad, Levels);
+    
+    v2[1] = -1.0f;
+    SphereSegment(v2, v1, v3, rad, Levels);
+    
+    v1[0] = v3[2] = -1.0f;
+    SphereSegment(v2, v1, v3, rad, Levels);
+
+    v2[1] = 1.0f;
+    SphereSegment(v1, v2, v3, rad, Levels);
+}
+
+
+static void DrawRing(void)
+{
+    const int Facets = 22;
+    const float w = 0.1f;
+    GLUquadric* pQuad = gluNewQuadric();
+    glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
+    glTranslatef(0.0f, 0.0f, -w / 2.0f);
+
+    gluCylinder(pQuad, 1.0f, 1.0f, w, Facets, 1);
+    gluQuadricOrientation(pQuad, GLU_INSIDE);
+
+    gluCylinder(pQuad, 0.7f, 0.7f, w, Facets, 1);
+    gluQuadricOrientation(pQuad, GLU_OUTSIDE);
+
+    glTranslatef(0.0f, 0.0f, w);
+    gluDisk(pQuad, 0.7, 1.0f, Facets, 1);
+
+    glRotatef(180.0f, 0.0f, 1.0f, 0.0f);
+    glTranslatef(0.0f, 0.0f, w);
+    gluDisk(pQuad, 0.7, 1.0f, Facets, 1);
+
+    gluDeleteQuadric(pQuad);
+}
+
+
+/* The club follows a 'circus club' design i.e. it has stripes running down the
+ * body.  The club is draw such that the one stripe uses the current material
+ * and the second stripe the standard silver colour. */
+
+void DrawClub(void)
+{
+    const float r[4] = {0.06f, 0.1f, 0.34f, 0.34f / 2.0f};
+    const float z[4] = {-0.4f, 0.6f, 1.35f, 2.1f};
+    float na[4];
+    const int n = 18;
+    int i, j;
+    GLUquadric* pQuad;
+
+    na[0] = (float) atan((r[1] - r[0]) / (z[1] - z[0]));
+    na[1] = (float) atan((r[2] - r[1]) / (z[2] - z[1]));
+    na[2] = (float) atan((r[3] - r[1]) / (z[3] - z[1]));
+    na[3] = (float) atan((r[3] - r[2]) / (z[3] - z[2]));
+
+    for (i = 0; i < n; i += 2)
+    {
+        float a1 = i * PI * 2.0f / n;
+        float a2 = (i + 1) * PI * 2.0f / n;
+
+        glBegin(GL_TRIANGLE_STRIP);
+            for (j = 1; j < 4; j++)
+            {
+                glNormal3f(cosf(na[j]) * cosf(a1),
+                    cosf(na[j]) * sinf(a1), sinf(na[j]));
+
+                glVertex3f(r[j] * cosf(a1), r[j] * sinf(a1), z[j]);
+
+                glNormal3f(cosf(na[j]) * cosf(a2),
+                    cosf(na[j]) * sinf(a2),    sinf(na[j]));
+
+                glVertex3f(r[j] * cosf(a2), r[j] * sinf(a2), z[j]);
+            }
+        glEnd();
+    }
+
+    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, HandleCol);
+
+    for (i = 1; i < n; i += 2)
+    {
+        float a1 = i * PI * 2.0f / n;
+        float a2 = (i + 1) * PI * 2.0f / n;
+
+        glBegin(GL_TRIANGLE_STRIP);
+            for (j = 1; j < 4; j++)
+            {
+                glNormal3f(cosf(na[j]) * cosf(a1),
+                    cosf(na[j]) * sinf(a1),    sinf(na[j]));
+
+                glVertex3f(r[j] * cosf(a1), r[j] * sinf(a1), z[j]);
+
+                glNormal3f(cosf(na[j]) * cosf(a2),
+                    cosf(na[j]) * sinf(a2), sinf(na[j]));
+
+                glVertex3f(r[j] * cosf(a2), r[j] * sinf(a2), z[j]);
+            }
+        glEnd();
+    }
+
+    pQuad = gluNewQuadric();
+    glTranslatef(0.0f, 0.0f, z[0]);
+    gluCylinder(pQuad, r[0], r[1], z[1] - z[0], n, 1);
+
+    glTranslatef(0.0f, 0.0f, z[3] - z[0]);
+    gluDisk(pQuad, 0.0, r[3], n, 1);
+    glRotatef(180.0f, 0.0f, 1.0f, 0.0f);
+    glTranslatef(0.0f, 0.0f, z[3] - z[0]);
+    gluDisk(pQuad, 0.0, r[0], n, 1);
+    gluDeleteQuadric(pQuad);
+}
+
+
+/* In total 6 display lists are used.  There are created based on the DL_
+ * constants defined earlier.  The function returns the index of the first
+ * display list, all others can be calculated based on an offset from there. */
+
+static int InitGLDisplayLists(void)
+{
+    int s = glGenLists(6);
+    GLUquadric* pQuad;
+
+    glNewList(s + DL_BALL, GL_COMPILE);
+    DrawSphere(BallRad);
+    glEndList();
+
+    glNewList(s + DL_CLUB, GL_COMPILE);
+    DrawClub();
+    glEndList();
+
+    glNewList(s + DL_RING, GL_COMPILE);
+    DrawRing();
+    glEndList();
+    
+    pQuad =  gluNewQuadric();
+    gluQuadricNormals(pQuad, GLU_SMOOTH);    
+    
+    glNewList(s + DL_TORSO, GL_COMPILE);
+        glPushMatrix();
+            glTranslatef(ShoulderPos[0], ShoulderPos[1], -ShoulderPos[2]);
+            glRotatef(-90.0f, 0.0f, 1.0f, 0.0f);
+            gluCylinder(pQuad, 0.3, 0.3, ShoulderPos[0] * 2, 18, 1);
+        glPopMatrix();
+
+        glPushMatrix();
+            glTranslatef(0.0f, -1.0f, -ShoulderPos[2]);
+            glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
+            gluCylinder(pQuad, 0.3, 0.3, ShoulderPos[1] + 1.0f, 18, 1);
+            glRotatef(180.0f, 1.0f, 0.0f, 0.0f);
+            gluDisk(pQuad, 0.0, 0.3, 18, 1);
+        glPopMatrix();
+        
+        /* draw the head */
+        glPushMatrix();
+            glTranslatef(0.0f, ShoulderPos[1] + 1.0f, -ShoulderPos[2]);
+            glRotatef(-30.0f, 1.0f, 0.0f, 0.0f);
+            gluCylinder(pQuad, 0.5, 0.5, 0.3, 15, 1);
+            
+            glPushMatrix();
+                glRotatef(180.0f, 1.0f, 0.0f, 0.0f);
+                glRotatef(180.0f, 0.0f, 0.0f, 1.0f);
+                gluDisk(pQuad, 0.0, 0.5, 15, 1);
+            glPopMatrix(); 
+                
+            glTranslatef(0.0f, 0.0f, .3f);
+            gluDisk(pQuad, 0.0, 0.5, 15, 1);
+        glPopMatrix();        
+    glEndList();
+    
+    glNewList(s + DL_UPPERARM, GL_COMPILE);
+        gluQuadricNormals(pQuad, GLU_SMOOTH);
+        gluQuadricDrawStyle(pQuad, GLU_FILL);
+        gluSphere(pQuad, 0.3, 12, 8);
+
+        gluCylinder(pQuad, 0.3, 0.3, UArmLen, 12, 1); 
+        glTranslatef(0.0f, 0.0f, UArmLen);
+        gluSphere(pQuad, 0.3, 12, 8);
+    glEndList();
+
+    glNewList(s + DL_FOREARM, GL_COMPILE);
+        gluCylinder(pQuad, 0.3, 0.3 / 2.0f, LArmLen, 12, 1);
+        glTranslatef(0.0f, 0.0f, LArmLen);
+        gluDisk(pQuad, 0, 0.3 / 2.0f, 18, 1);
+    glEndList();
+
+    gluDeleteQuadric(pQuad);
+    return s;
+}
+
+
+/* Drawing the arm requires connecting the upper and fore arm between the
+ * shoulder and hand position.  Thinking about things kinematically by treating
+ * the shoulder and elbow as ball joints then, provided the arm can stretch far
+ * enough, there's a infnite number of ways to position the elbow.  Basically
+ * it's possible to fix and hand and shoulder and then rotate the elbow a full
+ * 360 degrees.  Clearly human anatomy isn't like this and picking a natural
+ * elbow position can be complex.  We chicken out and assume that poking the
+ * elbow out by 20 degrees from the lowest position gives a reasonably looking
+ * orientation. */
+
+void DrawArm(RENDER_STATE* pState, float TimePos, int Left)
+{
+    POS Pos;
+    float x, y, len, len2, ang, ang2;
+    
+    GetHandPosition(pState->pPattern, Left, TimePos, &Pos);
+
+    x = Pos.x + (Left ? -ShoulderPos[0] : ShoulderPos[0]);
+    y = Pos.y - ShoulderPos[1];
+
+
+    len = sqrtf(x * x + y * y + ShoulderPos[2] * ShoulderPos[2]);
+    len2 = sqrtf(x * x + ShoulderPos[2] * ShoulderPos[2]);
+
+    ang = (float) CosineRule(UArmLen, len, LArmLen);
+    ang2 = (float) CosineRule(UArmLen, LArmLen, len);
+
+    if (ang == 0.0 && ang2 == 0)
+        ang2 = 180.0;
+
+
+    glPushMatrix();
+        glTranslatef(Left ? ShoulderPos[0] : -ShoulderPos[0], ShoulderPos[1],
+            -ShoulderPos[2]);
+        glRotatef((float)(180.0f * asin(x / len2) / 3.14f), 0.0f, 1.0f, 0.0f);
+        glRotatef((float)(-180.f * asin(y / len) / 3.14), 1.0f, 0.0f, 0.0f);
+        glRotatef(Left ? 20.0f : -20.0f, 0.0f, 0.0f, 1.0f);
+        glRotatef((float) ang, 1.0f, 0.0f, 0.0f);
+        glCallList(DL_UPPERARM + pState->DLStart);
+
+        glRotatef((float)(ang2 - 180.0), 1.0f, 0.0f, 0.f);
+        glCallList(DL_FOREARM + pState->DLStart);
+    glPopMatrix();
+}
+
+
+void DrawGLScene(RENDER_STATE* pState)
+{
+    float Time = pState->Time;
+    int nCols = sizeof(Cols) / sizeof(Cols[0]);
+    int i;
+
+    PATTERN_INFO* pPattern = pState->pPattern;
+
+    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
+
+    glMatrixMode(GL_MODELVIEW);
+    glLoadIdentity();
+    glTranslatef(5.0f * sinf(pState->TranslateAngle), 0.0f, 0.0f);
+
+    gltrackball_rotate (pState->trackball);
+
+    glRotatef(pState->SpinAngle, 0.0f, 1.0f, 0.0f);
+    glTranslatef(0.0, 0.0, -1.0f);
+
+    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, DiffCol);
+    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, SpecCol);
+    glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 60.0f);
+
+    for (i = 0; i < pPattern->Objects; i++)
+    {
+        POS ObjPos;
+        
+        glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Cols[i % nCols]);
+        glPushMatrix();
+
+        switch (pPattern->pObjectInfo[i].ObjectType)
+        {
+            case OBJECT_CLUB:
+                GetObjectPosition(pPattern, i, Time, 1.0f, &ObjPos);
+                glTranslatef(ObjPos.x, ObjPos.y, ObjPos.z);
+                glRotatef(ObjPos.Rot, 0.0f, 1.0f, 0.0f);
+                glRotatef(ObjPos.Elev, -1.0f, 0.0f, 0.0f);
+                glTranslatef(0.0f, 0.0f, -1.0f);
+                glCallList(DL_CLUB + pState->DLStart);
+                break;
+
+            case OBJECT_RING:
+                GetObjectPosition(pPattern, i, Time, 1.0f, &ObjPos);
+                glTranslatef(ObjPos.x, ObjPos.y, ObjPos.z);
+                glRotatef(ObjPos.Rot, 0.0f, 1.0f, 0.0f);
+                glRotatef(ObjPos.Elev, -1.0f, 0.0f, 0.0f);
+                glCallList(DL_RING + pState->DLStart);
+                break;
+
+            default:
+                GetObjectPosition(pPattern, i, Time, 0.0f, &ObjPos);
+                glTranslatef(ObjPos.x, ObjPos.y, ObjPos.z);        
+                glRotatef(ObjPos.Rot, 0.6963f, 0.6963f, 0.1742f);
+                glCallList(DL_BALL + pState->DLStart);
+                glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
+                glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, 
+                    AltCols[i % nCols]);
+                glCallList(DL_BALL + pState->DLStart);
+                break;
+        }
+
+        glPopMatrix();
+    }
+
+    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, BodyCol);
+    glCallList(DL_TORSO + pState->DLStart);
+    DrawArm(pState, Time, 1);
+    DrawArm(pState, Time, 0);
+}
+
+
+static int RandInRange(int Min, int Max)
+{
+    return Min + random() % (1 + Max - Min);
+}
+
+
+extern void UpdatePattern(
+    RENDER_STATE* pState, int MinBalls, int MaxBalls, 
+    int MinHeightInc, int MaxHeightInc)
+{
+    if (pState->pPattern != NULL)
+        ReleasePatternInfo(pState->pPattern);
+    
+    pState->pPattern = (PATTERN_INFO*) malloc(sizeof(PATTERN_INFO));
+    
+    if ((random() % 3) == 1)
+    {    
+        int ExtSiteLen;
+        int n = random() % (sizeof(PatternText) / sizeof(PatternText[0]));
+        EXT_SITE_INFO* pExtInfo = ParsePattern(PatternText[n], &ExtSiteLen);
+        InitPatternInfo(pState->pPattern, NULL, pExtInfo, ExtSiteLen);
+        free(pExtInfo);
+    }
+    else
+    {
+        int* pRand;
+        int ballcount, maxweight;
+        const int RandPatternLen = 1500;
+        
+        ballcount = RandInRange(MinBalls, MaxBalls);
+        maxweight = ballcount  + RandInRange(MinHeightInc, MaxHeightInc);
+        
+        pRand = Generate(RandPatternLen, maxweight, ballcount);
+        InitPatternInfo(pState->pPattern, pRand, NULL, RandPatternLen);
+        free(pRand);
+    }
+    
+    pState->CameraElev = 50.0f - random() % 90;
+    pState->TranslateAngle = random() % 360;
+    pState->SpinAngle = random() % 360;
+    pState->Time = 50.0f;
+    SetCamera(pState);
+}
+
+
+/*******************************************************************************
+ *
+ *  XScreenSaver Configuration
+ *
+ ******************************************************************************/
+
+extern XtAppContext app;
+
+typedef struct
+{
+    GLXContext* glxContext;
+    RENDER_STATE RenderState;
+    float CurrentFrameRate;
+    unsigned FramesSinceSync;
+    unsigned LastSyncTime;
+} JUGGLER3D_CONFIG;
+
+
+static JUGGLER3D_CONFIG* pConfigInfo = NULL;
+static int MaxObjects;
+static int MinObjects;
+static int MaxHeightInc;
+static int MinHeightInc;
+static float SpinSpeed;
+static float TranslateSpeed;
+static float JuggleSpeed;
+
+static XrmOptionDescRec Options[] =
+{
+    {"-spin", ".spin", XrmoptionSepArg, 0},
+    {"-trans", ".trans", XrmoptionSepArg, 0},
+    {"-speed", ".speed", XrmoptionSepArg, 0},
+    {"-maxobjs", ".maxobjs", XrmoptionSepArg, 0},
+    {"-minobjs", ".minobjs", XrmoptionSepArg, 0},
+    {"-maxhinc", ".maxhinc", XrmoptionSepArg, 0},
+    {"-minhinc", ".minhinc", XrmoptionSepArg, 0},
+};
+
+
+static argtype Vars[] = 
+{
+    {&MaxObjects, "maxobjs", "MaxObjs", "8", t_Int},
+    {&MinObjects, "minobjs", "MinObjs", "3", t_Int},
+    {&MaxHeightInc, "maxhinc", "MaxHInc", "6", t_Int},
+    {&MinHeightInc, "minhinc", "MaxHInc", "2", t_Int},
+    {&JuggleSpeed, "speed", "JuggleSpeed", "2.2", t_Float},
+    {&TranslateSpeed, "trans", "TranslateSpeed", "0.1", t_Float},
+    {&SpinSpeed, "spin", "SpinSpeed", "20.0", t_Float},
+};
+
+
+ModeSpecOpt SWITCH_OPTS = {countof(Options), Options, countof(Vars), Vars};
+
+
+void Juggler3D_HackReshapeEvent(ModeInfo *mi, int width, int height)
+{
+    JUGGLER3D_CONFIG* pConfig = &pConfigInfo[MI_SCREEN(mi)];
+    ResizeGL(&pConfig->RenderState, width, height);
+}
+
+
+void Juggler3D_HackInitEvent(ModeInfo* mi)
+{
+    JUGGLER3D_CONFIG* pConfig;
+    
+    if (pConfigInfo == NULL)
+    {
+        /* Apply suitable bounds checks to the input parameters */
+        MaxObjects = max(3, min(MaxObjects, 36));
+        MinObjects = max(3, min(MinObjects, MaxObjects));
+
+        MaxHeightInc = max(1, min(MaxHeightInc, 32));
+        MinHeightInc = max(1, min(MinHeightInc, MaxHeightInc));
+            
+        pConfigInfo = (JUGGLER3D_CONFIG*) calloc(
+            MI_NUM_SCREENS(mi), sizeof(JUGGLER3D_CONFIG));
+        if (pConfigInfo == NULL)
+        {
+            fprintf(stderr, "%s: out of memory\n", progname);
+            exit(1);
+        }
+    }
+    
+    pConfig = &pConfigInfo[MI_SCREEN(mi)];
+    pConfig->glxContext = init_GL(mi);
+    pConfig->CurrentFrameRate = 0.0f;
+    pConfig->FramesSinceSync = 0;
+    pConfig->LastSyncTime = 0;
+    InitGLSettings(&pConfig->RenderState, MI_IS_WIREFRAME(mi));
+
+    UpdatePattern(&pConfig->RenderState, MinObjects, MaxObjects, 
+        MinHeightInc, MaxHeightInc);
+    
+    Juggler3D_HackReshapeEvent(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+}
+
+
+void Juggler3D_HackDrawEvent(ModeInfo* mi)
+{
+    JUGGLER3D_CONFIG* pConfig = &pConfigInfo[MI_SCREEN(mi)];
+    Display* pDisplay = MI_DISPLAY(mi);
+    Window hwnd = MI_WINDOW(mi);
+
+    if (pConfig->glxContext == NULL)
+        return;
+    
+    /* While drawing, keep track of the rendering speed so we can adjust the
+     * animation speed so things appear consistent.  The basis of the this
+     * code comes from the frame rate counter (fps.c) but has been modified
+     * so that it reports the initial frame rate earlier (after 0.02 secs
+     * instead of 1 sec). */
+    
+    if (pConfig->FramesSinceSync >=  1 * (int) pConfig->CurrentFrameRate)
+    {
+        struct timeval tvnow;
+        unsigned now;
+            
+        # ifdef GETTIMEOFDAY_TWO_ARGS
+            struct timezone tzp;
+            gettimeofday(&tvnow, &tzp);
+        # else
+            gettimeofday(&tvnow);
+        # endif
+        
+        now = (unsigned) (tvnow.tv_sec * 1000000 + tvnow.tv_usec);
+        if (pConfig->FramesSinceSync == 0)
+        {
+            pConfig->LastSyncTime = now;
+        }
+        else
+        {
+            unsigned Delta = now - pConfig->LastSyncTime;
+            if (Delta > 20000)
+            {
+                pConfig->LastSyncTime = now;
+                pConfig->CurrentFrameRate = 
+                    (pConfig->FramesSinceSync * 1.0e6f) / Delta;
+                pConfig->FramesSinceSync = 0;
+            }
+        }
+    }
+    
+    pConfig->FramesSinceSync++;
+    
+    if (pConfig->RenderState.Time > 150.0f)
+    {
+        UpdatePattern(&pConfig->RenderState, MinObjects, MaxObjects, 
+            MinHeightInc, MaxHeightInc);
+    }
+    DrawGLScene(&pConfig->RenderState);
+    
+    if (pConfig->CurrentFrameRate > 1.0e-6f)
+    {
+        pConfig->RenderState.Time += JuggleSpeed / pConfig->CurrentFrameRate;
+        pConfig->RenderState.SpinAngle += SpinSpeed / pConfig->CurrentFrameRate;
+        pConfig->RenderState.TranslateAngle += 
+            TranslateSpeed / pConfig->CurrentFrameRate;
+    }
+    
+    if (mi->fps_p)
+        do_fps(mi);
+  
+    glFinish();
+    glXSwapBuffers(pDisplay, hwnd);
+}
+
+
+Bool Juggler3D_HackHandleEvent(ModeInfo* mi, XEvent* pEvent)
+{
+  JUGGLER3D_CONFIG* pConfig = &pConfigInfo[MI_SCREEN(mi)];
+  RENDER_STATE* pState = &pConfig->RenderState;
+
+    if (pEvent->xany.type == ButtonPress &&
+        pEvent->xbutton.button == Button1)
+    {
+      pState->button_down_p = True;
+      gltrackball_start (pState->trackball,
+                         pEvent->xbutton.x, pEvent->xbutton.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+    else if (pEvent->xany.type == ButtonRelease &&
+             pEvent->xbutton.button == Button1)
+    {
+      pState->button_down_p = False;
+      return True;
+    }
+    else if (pEvent->xany.type == ButtonPress &&
+             (pEvent->xbutton.button == Button4 ||
+              pEvent->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (pState->trackball, pEvent->xbutton.button, 2,
+                              !pEvent->xbutton.state);
+      return True;
+    }
+    else if (pEvent->xany.type == MotionNotify &&
+             pState->button_down_p)
+    {
+      gltrackball_track (pState->trackball,
+                         pEvent->xmotion.x, pEvent->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+    else if (pEvent->xany.type == KeyPress)
+    {
+        char str[20];
+        KeySym Key = 0;
+        int count = XLookupString(&pEvent->xkey, str, 20, &Key, 0);
+        str[count] = '\0';
+        if (*str == ' ')
+        {
+            UpdatePattern(&pConfig->RenderState, MinObjects, MaxObjects, 
+                MinHeightInc, MaxHeightInc);
+        }
+    }
+    
+    return False;
+}
+
+#endif
diff --git a/hacks/glx/juggler3d.man b/hacks/glx/juggler3d.man
new file mode 100644 (file)
index 0000000..a07d890
--- /dev/null
@@ -0,0 +1,88 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+Juggler3D - a 3D juggling simulation.
+.SH SYNOPSIS
+.B juggler3d
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-trans \fInumber\fP]
+[\-spin \fInumber\fP]
+[\-maxobjs \fInumber\fP]
+[\-minobjs \fInumber\fP]
+[\-maxhinc \fInumber\fP]
+[\-minhinc \fInumber\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Displays a 3D simulation of a juggler performing with balls, clubs and rings. 
+Juggling patterns are either created randomly using siteswaps or from a 
+small library of predefined patterns.  \fBjuggler3d\fP is partially based on the
+Win32 screensaver Juggle Saver (www.jugglesaver.co.uk) by the same author.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Speed of objects being juggled in beats per seconds.  Default: 2.2.
+.TP 8
+.B \-trans \fInumber\fP
+Speed of horizontal juggler movement (translational) across the screen in
+degrees/seconds.  Default: 0.1
+.TP 8
+.B \-spin \fInumber\fP
+Speed of juggler rotation in degrees/seconds.  Default: 20
+.TP 8
+.B \-maxobj \fInumber\fP
+Maximum number of objects used in a random juggling pattern. 3 - 36.
+.TP 8
+.B \-minobj \fInumber\fP
+Minimum number of objects used in a random juggling pattern. 3 - \fBmaxobj\fP.
+.TP 8
+.B \-minhinc \fInumber\fP | -maxhinc \fInumber\fP
+Used to determine maximum throw weight in random siteswap.  Options refer to
+minimum height increment and maximum height increment.  Maximum weight chosen
+will lie between \fBmaxobj\fP + \fBminhinc\fP and \fBmaxobj\fP + \fBmaxhinc\fP.
+Defaults: \fBminhinc\fP=1 and \fBmaxhinc\fP=6.
+.TP 8
+.B \-wireframe | \-no-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Brian Apps.  Permission to use, copy, modify, 
+distribute, and sell this software and its documentation for any purpose is 
+hereby granted without fee, provided that the above copyright notice appear 
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Brian Apps <brian@jugglesaver.co.uk>
index a787b0117445be7debcd0d59ce67488246c9aef4..a68302860965508aa7908dcd5950db40cc792732 100644 (file)
@@ -665,6 +665,14 @@ push_bond (molecule *m, int from, int to)
 }
 
 
+static void
+parse_error (const char *file, int lineno, const char *line)
+{
+  fprintf (stderr, "%s: %s: parse error, line %d: %s\n",
+           progname, file, lineno, line);
+  exit (1);
+}
+
 
 /* This function is crap.
  */
@@ -749,7 +757,8 @@ parse_pdb_data (molecule *m, const char *data, const char *filename, int line)
           char *name = (char *) calloc (1, 4);
           GLfloat x = -999, y = -999, z = -999;
 
-          sscanf (s+7, " %d ", &id);
+          if (1 != sscanf (s+7, " %d ", &id))
+            parse_error (filename, line, s);
 
           strncpy (name, s+12, 3);
           while (isspace(*name)) name++;
@@ -762,7 +771,9 @@ parse_pdb_data (molecule *m, const char *data, const char *filename, int line)
            *ss = tolower(*ss);
             ss++;
           }
-          sscanf (s + 32, " %f %f %f ", &x, &y, &z);
+          if (3 != sscanf (s + 32, " %f %f %f ", &x, &y, &z))
+            parse_error (filename, line, s);
+
 /*
           fprintf (stderr, "%s: %s: %d: atom: %d \"%s\" %9.4f %9.4f %9.4f\n",
                    progname, filename, line,
@@ -776,14 +787,16 @@ parse_pdb_data (molecule *m, const char *data, const char *filename, int line)
           char *name = (char *) calloc (1, 4);
           GLfloat x = -999, y = -999, z = -999;
 
-          sscanf (s+7, " %d ", &id);
+          if (1 != sscanf (s+7, " %d ", &id))
+            parse_error (filename, line, s);
 
           strncpy (name, s+12, 3);
           while (isspace(*name)) name++;
           ss = name + strlen(name)-1;
           while (isspace(*ss) && ss > name)
             *ss-- = 0;
-          sscanf (s + 30, " %f %f %f ", &x, &y, &z);
+          if (3 != sscanf (s + 30, " %f %f %f ", &x, &y, &z))
+            parse_error (filename, line, s);
 /*
           fprintf (stderr, "%s: %s: %d: atom: %d \"%s\" %9.4f %9.4f %9.4f\n",
                    progname, filename, line,
index f4043dcaa78cef7e110f8025cc092082bb790a99..781cf5acd7de8d7008afe06ce932f93888ede3fd 100644 (file)
@@ -1,10 +1,10 @@
 /* polytopes --- Shows one of the six regular polytopes rotating in 4d */
 
 #if 0
-static const char sccsid[] = "@(#)polytopes.c  1.1 03/05/18 xlockmore";
+static const char sccsid[] = "@(#)polytopes.c  1.2 05/09/28 xlockmore";
 #endif
 
-/* Copyright (c) 2003 Carsten Steger <carsten@mirsanmir.org>. */
+/* Copyright (c) 2003-2005 Carsten Steger <carsten@mirsanmir.org>. */
 
 /*
  * Permission to use, copy, modify, and distribute this software and its
@@ -21,6 +21,7 @@ static const char sccsid[] = "@(#)polytopes.c  1.1 03/05/18 xlockmore";
  *
  * REVISION HISTORY:
  * C. Steger - 03/08/10: Initial version
+ * C. Steger - 05/09/28: Added trackball support
  */
 
 /*
@@ -113,13 +114,15 @@ static const char sccsid[] = "@(#)polytopes.c  1.1 03/05/18 xlockmore";
 #define DEF_DTHETA                DTHETA_STR
 
 #ifdef STANDALONE
-# define PROGCLASS       "Polytopes"
-# define HACK_INIT       init_polytopes
-# define HACK_DRAW       draw_polytopes
-# define HACK_RESHAPE    reshape_polytopes
-# define polytopes_opts xlockmore_opts
-# define DEFAULTS        "*delay:      25000 \n" \
-                         "*showFPS:    False \n"
+# define PROGCLASS          "Polytopes"
+# define HACK_INIT          init_polytopes
+# define HACK_DRAW          draw_polytopes
+# define HACK_RESHAPE       reshape_polytopes
+# define HACK_HANDLE_EVENT  polytopes_handle_event
+# define EVENT_MASK         PointerMotionMask|KeyReleaseMask
+# define polytopes_opts     xlockmore_opts
+# define DEFAULTS           "*delay:      25000 \n" \
+                            "*showFPS:    False \n"
 
 # include "xlockmore.h"         /* from the xscreensaver distribution */
 #else  /* !STANDALONE */
@@ -128,8 +131,10 @@ static const char sccsid[] = "@(#)polytopes.c  1.1 03/05/18 xlockmore";
 
 #ifdef USE_GL
 
+#include <X11/keysym.h>
 #include <GL/gl.h>
 #include <GL/glu.h>
+#include "gltrackball.h"
 
 
 #ifdef USE_MODULES
@@ -158,6 +163,11 @@ static float speed_yz;
 static float alpha, beta, delta, zeta, eta, theta;
 static float aspect;
 
+/* Trackball states */
+trackball_state *trackballs[2];
+int current_trackball;
+Bool button_pressed;
+
 static const float offset4d[4] = {  0.0,  0.0,  0.0,  3.0 };
 static const float offset3d[4] = {  0.0,  0.0, -2.0,  0.0 };
 
@@ -2382,19 +2392,67 @@ static void rotateyz(float m[4][4], float phi)
 
 
 /* Compute the rotation matrix m from the rotation angles. */
-static void rotateall(float m[4][4])
+static void rotateall(float al, float be, float de, float ze, float et,
+                      float th, float m[4][4])
 {
   int i, j;
 
   for (i=0; i<4; i++)
     for (j=0; j<4; j++)
       m[i][j] = (i==j);
-  rotatewx(m,alpha);
-  rotatewy(m,beta);
-  rotatewz(m,delta);
-  rotatexy(m,zeta);
-  rotatexz(m,eta);
-  rotateyz(m,theta);
+  rotatewx(m,al);
+  rotatewy(m,be);
+  rotatewz(m,de);
+  rotatexy(m,ze);
+  rotatexz(m,et);
+  rotateyz(m,th);
+}
+
+
+/* Multiply two rotation matrices: o=m*n. */
+static void mult_rotmat(float m[4][4], float n[4][4], float o[4][4])
+{
+  int i, j, k;
+
+  for (i=0; i<4; i++)
+  {
+    for (j=0; j<4; j++)
+    {
+      o[i][j] = 0.0;
+      for (k=0; k<4; k++)
+        o[i][j] += m[i][k]*n[k][j];
+    }
+  }
+}
+
+
+/* Compute a 4D rotation matrix from two unit quaternions. */
+static void quats_to_rotmat(float p[4], float q[4], float m[4][4])
+{
+  double al, be, de, ze, et, th;
+  double r00, r01, r02, r12, r22;
+
+  r00 = 1.0-2.0*(p[1]*p[1]+p[2]*p[2]);
+  r01 = 2.0*(p[0]*p[1]+p[2]*p[3]);
+  r02 = 2.0*(p[2]*p[0]-p[1]*p[3]);
+  r12 = 2.0*(p[1]*p[2]+p[0]*p[3]);
+  r22 = 1.0-2.0*(p[1]*p[1]+p[0]*p[0]);
+
+  al = atan2(-r12,r22)*180.0/M_PI;
+  be = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
+  de = atan2(-r01,r00)*180.0/M_PI;
+
+  r00 = 1.0-2.0*(q[1]*q[1]+q[2]*q[2]);
+  r01 = 2.0*(q[0]*q[1]+q[2]*q[3]);
+  r02 = 2.0*(q[2]*q[0]-q[1]*q[3]);
+  r12 = 2.0*(q[1]*q[2]+q[0]*q[3]);
+  r22 = 1.0-2.0*(q[1]*q[1]+q[0]*q[0]);
+
+  ze = atan2(-r12,r22)*180.0/M_PI;
+  et = atan2(r02,sqrt(r00*r00+r01*r01))*180.0/M_PI;
+  th = atan2(-r01,r00)*180.0/M_PI;
+
+  rotateall(al,be,de,ze,et,th,m);
 }
 
 
@@ -2422,10 +2480,16 @@ static void normal(float *p, float *q, float *r, float *n)
 /* Project an array of vertices from 4d to 3d. */
 static void project(float vert[][4], float v[][4], int num)
 {
-  float m[4][4], s;
+  float s, q1[4], q2[4], r1[4][4], r2[4][4], m[4][4];
   int i, j, k;
 
-  rotateall(m);
+  rotateall(alpha,beta,delta,zeta,eta,theta,r1);
+
+  gltrackball_get_quaternion(trackballs[0],q1);
+  gltrackball_get_quaternion(trackballs[1],q2);
+  quats_to_rotmat(q1,q2,r2);
+
+  mult_rotmat(r2,r1,m);
 
   /* Project the vertices from 4d to 3d. */
   for (i=0; i<num; i++)
@@ -2786,24 +2850,27 @@ static void init(ModeInfo *mi)
 /* Redisplay the polytopes. */
 static void display_polytopes(ModeInfo *mi)
 {
-  alpha += speed_wx;
-  if (alpha >= 360.0)
-    alpha -= 360.0;
-  beta += speed_wy;
-  if (beta >= 360.0)
-    beta -= 360.0;
-  delta += speed_wz;
-  if (delta >= 360.0)
-    delta -= 360.0;
-  zeta += speed_xy;
-  if (zeta >= 360.0)
-    zeta -= 360.0;
-  eta += speed_xz;
-  if (eta >= 360.0)
-    eta -= 360.0;
-  theta += speed_yz;
-  if (theta >= 360.0)
-    theta -= 360.0;
+  if (!button_pressed)
+  {
+    alpha += speed_wx;
+    if (alpha >= 360.0)
+      alpha -= 360.0;
+    beta += speed_wy;
+    if (beta >= 360.0)
+      beta -= 360.0;
+    delta += speed_wz;
+    if (delta >= 360.0)
+      delta -= 360.0;
+    zeta += speed_xy;
+    if (zeta >= 360.0)
+      zeta -= 360.0;
+    eta += speed_xz;
+    if (eta >= 360.0)
+      eta -= 360.0;
+    theta += speed_yz;
+    if (theta >= 360.0)
+      theta -= 360.0;
+  }
 
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
@@ -2863,6 +2930,64 @@ void reshape_polytopes(ModeInfo * mi, int width, int height)
 }
 
 
+Bool polytopes_handle_event(ModeInfo *mi, XEvent *event)
+{
+  Display *display = MI_DISPLAY(mi);
+  KeySym  sym;
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button == Button1)
+  {
+    button_pressed = True;
+    gltrackball_start(trackballs[current_trackball],
+                      event->xbutton.x, event->xbutton.y,
+                      MI_WIDTH(mi), MI_HEIGHT(mi));
+    return True;
+  }
+  else if (event->xany.type == ButtonRelease &&
+           event->xbutton.button == Button1)
+  {
+    button_pressed = False;
+    return True;
+  }
+  else if (event->xany.type == KeyPress)
+  {
+    sym = XKeycodeToKeysym(display,event->xkey.keycode,0);
+    if (sym == XK_Shift_L || sym == XK_Shift_R)
+    {
+      current_trackball = 1;
+      if (button_pressed)
+        gltrackball_start(trackballs[current_trackball],
+                          event->xbutton.x, event->xbutton.y,
+                          MI_WIDTH(mi), MI_HEIGHT(mi));
+      return True;
+    }
+  }
+  else if (event->xany.type == KeyRelease)
+  {
+    sym = XKeycodeToKeysym(display,event->xkey.keycode,0);
+    if (sym == XK_Shift_L || sym == XK_Shift_R)
+    {
+      current_trackball = 0;
+      if (button_pressed)
+        gltrackball_start(trackballs[current_trackball],
+                          event->xbutton.x, event->xbutton.y,
+                          MI_WIDTH(mi), MI_HEIGHT(mi));
+      return True;
+    }
+  }
+  else if (event->xany.type == MotionNotify && button_pressed)
+  {
+    gltrackball_track(trackballs[current_trackball],
+                      event->xmotion.x, event->xmotion.y,
+                      MI_WIDTH(mi), MI_HEIGHT(mi));
+    return True;
+  }
+
+  return False;
+}
+
+
 /*
  *-----------------------------------------------------------------------------
  *-----------------------------------------------------------------------------
@@ -2890,6 +3015,11 @@ void init_polytopes(ModeInfo * mi)
   }
   hp = &poly[MI_SCREEN(mi)];
 
+  trackballs[0] = gltrackball_init();
+  trackballs[1] = gltrackball_init();
+  current_trackball = 0;
+  button_pressed = False;
+
   if ((hp->glx_context = init_GL(mi)) != NULL)
   {
     reshape_polytopes(mi,MI_WIDTH(mi),MI_HEIGHT(mi));
index 8e423ab1ac2812b7aa861f10f8a3d25626e61b82..76bf983f89ce0983cb832cf71e71760d511343fb 100644 (file)
@@ -171,6 +171,15 @@ Rotation speed around the xz plane (default: 1.9).
 .TP 8
 .B \-speed-yz \fIfloat\fP
 Rotation speed around the yz plane (default: 2.1).
+.SH INTERACTION
+If you run this program in standalone mode you can rotate the polytope
+by dragging the mouse while pressing the left mouse button.  This
+rotates the polytope in 3D, i.e., around the wx, wy, and wz planes.
+If you press the shift key while dragging the mouse with the left
+button pressed the polytope is rotated in 4D, i.e., around the xy, xz,
+and yz planes.  To examine the polytope at your leisure, it is best to
+set all speeds to 0.  Otherwise, the polytope will rotate while the
+left mouse button is not pressed.
 .SH ENVIRONMENT
 .PP
 .TP 8
@@ -184,7 +193,7 @@ stored in the RESOURCE_MANAGER property.
 .BR X (1),
 .BR xscreensaver (1)
 .SH COPYRIGHT
-Copyright \(co 2003 by Carsten Steger.  Permission to use, copy,
+Copyright \(co 2003-2005 by Carsten Steger.  Permission to use, copy,
 modify, distribute, and sell this software and its documentation for
 any purpose is hereby granted without fee, provided that the above
 copyright notice appear in all copies and that both that copyright
@@ -193,4 +202,4 @@ No representations are made about the suitability of this software for
 any purpose.  It is provided "as is" without express or implied
 warranty.
 .SH AUTHOR
-Carsten Steger <carsten@mirsanmir.org>, 10-aug-2003.
+Carsten Steger <carsten@mirsanmir.org>, 28-sep-2005.
index 2c4e4db5dbaaacbf4f2f92921f754d3aae2a26d4..a5aa8a9d3bba1656b5d32366338b77180f1243f9 100644 (file)
@@ -1,12 +1,18 @@
 /* tangram, Copyright (c) 2005 Jeremy English <jhe@jeremyenglish.org>
  *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation.  No representations are made about the suitability of this
- * software for any purpose.  It is provided "as is" without express or
- * implied warranty.
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation.  No representations are made
+ * about the suitability of this software for any purpose.  It is
+ * provided "as is" without express or implied warranty.
+ *
+ * Sun 10 July 2005 Changed the code that solves the puzzles.
+ *                  Also, limited the palette and added names. 
+ *
+ * Wed 13 July 2005 Added option to turn off rotation.
+ *                  Changed color and materials
  */
 
 
 
 extern XtAppContext app;
 
-#define PROGCLASS        "TANGRAM"
+#define PROGCLASS        "Tangram"
 #define HACK_INIT        init_tangram
 #define HACK_DRAW        draw_tangram
 #define HACK_RESHAPE  reshape_tangram
 #define sws_opts         xlockmore_opts
 
 
-#define DEFAULTS       "*delay:        30000            \n" \
-                       "*wireframe:    False            \n" \
+#define DEFAULTS       "*delay:        10000            \n" \
+  "*wireframe: False            \n" \
 
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
@@ -39,11 +45,7 @@ extern XtAppContext app;
 #include <time.h>
 #include <math.h>
 #include "tangram_shapes.h"
-
-typedef enum {
-    true = 1,
-    false = 0
-} bool;
+#include "glxfonts.h"
 
 typedef struct {
     GLubyte r;
@@ -62,9 +64,17 @@ typedef struct {
     GLint r;                    /* rotation */
     GLint fr;                   /* flip Rotate. Used to keep track during animation */
     GLint dl;                   /* display List */
-
+    GLfloat dz;                 /* velocity */
+    GLfloat ddz;                /* Acceleration */
+    GLfloat solved;             /* shapes state */
+    Bool up;                    /* Move up the z axis? */
 } tangram_shape;
 
+typedef struct {
+    char *name;
+    tangram_shape ts[7];
+} puzzle;
+
 typedef enum {
     no_shape = -1,
     small_triangle1 = 0,
@@ -76,763 +86,545 @@ typedef enum {
     rhomboid = 6
 } shape_type;
 
-typedef enum {
-    state_exploding,
-    state_solving,
-    state_solved
-} tangram_state;
-
-tangram_shape solved[][7] = {
-    {
-     {{-1.664000, -1.552000, 0}, 135, 0, 0},
-     {{-1.696000, 0.944000, 0}, 315, 0, 0},
-     {{0.064000, -2.128000, 0}, 135, 0, 0},
-     {{-0.960000, -1.056000, 0}, 90, 0, 0},
-     {{1.104000, 0.960000, 0}, 270, 0, 0},
-     {{-1.376000, -0.800000, 0}, 180, 0, 0},
-     {{1.152000, 0.736000, 0}, 360, 0, 0},
-     },
-    {
-     {{-0.096000, 1.552000, 0}, 135, 180, 0},
-     {{-0.064000, 2.336000, 0}, 315, 0, 0},
-     {{-0.080000, -0.224000, 0}, 135, 180, 0},
-     {{-2.096000, 1.584000, 0}, 90, 180, 0},
-     {{1.920000, 1.584000, 0}, 270, 0, 0},
-     {{0.416000, -0.192000, 0}, 180, 0, 0},
-     {{-0.096000, -1.296000, 0}, 335, 0, 0},
-     },
-    {
-     {{-0.144000, -0.720000, 0}, 225, 0, 0},
-     {{0.608000, 0.032000, 0}, 135, 0, 0},
-     {{-1.584000, 0.720000, 0}, 0, 0, 0},
-     {{-0.112000, -0.720000, 0}, 315, 0, 0},
-     {{-0.096000, -0.704000, 0}, 45, 0, 0},
-     {{0.592000, 0.016000, 0}, 225, 0, 0},
-     {{-0.880000, -0.032000, 0}, 315, 0, 0},
-     },
-    {
-     {{1.472000, 2.176000, 0}, 225, 0, 0},
-     {{1.248000, 3.488000, 0}, 270, 0, 0},
-     {{-0.752000, -1.680000, 0}, 270, 0, 0},
-     {{0.704000, -1.552000, 0}, 135, 0, 0},
-     {{1.280000, -0.080000, 0}, 180, 0, 0},
-     {{-0.016000, -0.896000, 0}, 225, 0, 0},
-     {{-0.000000, -0.944000, 0}, 315, 0, 0},
-     },
-    {
-     {{0.320000, 1.360000, 0}, 90, 0, 0},
-     {{0.704000, 3.072000, 0}, 270, 0, 0},
-     {{-1.200000, -3.392000, 0}, 135, 0, 0},
-     {{0.688000, -1.184000, 0}, 135, 0, 0},
-     {{-0.768000, 0.192000, 0}, 315, 0, 0},
-     {{-1.168000, -2.304000, 0}, 180, 0, 0},
-     {{1.312000, 1.296000, 0}, 270, 0, 0},
-     },
-    {
-     {{-2.064000, 0.848000, 0}, 65, 0, 0},
-     {{0.096000, 1.424000, 0}, 99, 180, 0},
-     {{2.016000, -2.448000, 0}, 270, 180, 0},
-     {{-2.016000, 0.368000, 0}, 315, 0, 0},
-     {{-0.560000, -1.040000, 0}, 135, 0, 0},
-     {{1.312000, -1.696000, 0}, 225, 0, 0},
-     {{0.864000, 0.336000, 0}, 180, 180, 0},
-     },
-    {
-     {{0.560000, -0.208000, 0}, 135, 0, 0},
-     {{0.336000, -1.552000, 0}, 90, 180, 0},
-     {{-2.336000, 1.248000, 0}, 90, 180, 0},
-     {{1.296000, -1.504000, 0}, 180, 0, 0},
-     {{-0.896000, 1.200000, 0}, 135, 180, 0},
-     {{0.304000, -2.544000, 0}, 180, 0, 0},
-     {{1.248000, 0.544000, 0}, 225, 0, 0},
-     },
-    {
-     {{-0.480000, -2.832000, 0}, 45, 0, 0},
-     {{-0.544000, -2.832000, 0}, 225, 180, 0},
-     {{-0.064000, -0.880000, 0}, 225, 180, 0},
-     {{-2.528000, 2.656000, 0}, 0, 0, 0},
-     {{-2.512000, 0.640000, 0}, 45, 180, 0},
-     {{0.192000, -2.096000, 0}, 225, 0, 0},
-     {{-0.064000, -0.832000, 0}, 180, 0, 0},
-     },
-    {
-     {{0.880000, -1.456000, 0}, 45, 0, 0},
-     {{0.832000, 0.592000, 0}, 180, 180, 0},
-     {{-2.016000, 1.648000, 0}, 135, 180, 0},
-     {{0.448000, 2.064000, 0}, 315, 0, 0},
-     {{-0.992000, 0.688000, 0}, 315, 180, 0},
-     {{1.856000, -0.400000, 0}, 180, 0, 0},
-     {{-0.128000, -1.424000, 0}, 90, 0, 0},
-     },
-    {
-     {{2.208000, 2.000000, 0}, 180, 0, 0},
-     {{-0.640000, 3.072000, 0}, 180, 180, 0},
-     {{1.360000, -3.312000, 0}, 180, 0, 0},
-     {{-0.592000, 2.256000, 0}, 360, 0, 0},
-     {{-0.960000, -0.160000, 0}, 45, 180, 0},
-     {{0.288000, -2.896000, 0}, 135, 0, 0},
-     {{0.496000, -0.128000, 0}, 135, 0, 0},
-     },
-    {
-     {{-0.480000, 0.864000, 0}, 58, 180, 0},
-     {{0.624000, -0.752000, 0}, 90, 180, 0},
-     {{0.576000, -0.560000, 0}, 180, 180, 0},
-     {{-0.192000, -1.264000, 0}, 225, 0, 0},
-     {{-0.176000, -1.280000, 0}, 135, 180, 0},
-     {{-0.816000, -0.528000, 0}, 123, 0, 0},
-     {{-0.416000, -0.528000, 0}, 90, 0, 0},
-     },
-    {
-     {{0.688000, -0.144000, 0}, 45, 180, 0},
-     {{-0.080000, 0.592000, 0}, 225, 0, 0},
-     {{-0.048000, 0.592000, 0}, 315, 180, 0},
-     {{-1.488000, -0.848000, 0}, 45, 0, 0},
-     {{1.376000, -0.864000, 0}, 225, 180, 0},
-     {{0.688000, -0.128000, 0}, 135, 0, 0},
-     {{-1.504000, -0.832000, 0}, 135, 0, 0},
-     },
-    {
-     {{0.624000, -1.776000, 0}, 225, 180, 0},
-     {{-0.144000, 0.432000, 0}, 225, 0, 0},
-     {{-0.800000, -0.272000, 0}, 45, 180, 0},
-     {{-2.320000, -0.304000, 0}, 45, 0, 0},
-     {{2.048000, -0.320000, 0}, 225, 180, 0},
-     {{-0.112000, 0.480000, 0}, 135, 0, 0},
-     {{-0.832000, -0.320000, 0}, 135, 180, 0},
-     },
-    {
-     {{-1.744000, -0.400000, 0}, 45, 180, 0},
-     {{0.416000, 1.776000, 0}, 315, 0, 0},
-     {{-1.008000, 0.272000, 0}, 90, 180, 0},
-     {{0.800000, 1.488000, 0}, 135, 0, 0},
-     {{0.832000, 1.440000, 0}, 45, 180, 0},
-     {{-1.744000, -1.872000, 0}, 135, 0, 0},
-     {{-1.008000, 0.320000, 0}, 45, 180, 0},
-     },
-    {
-     {{-0.720000, 3.440000, 0}, 180, 180, 0},
-     {{0.912000, -1.072000, 0}, 225, 0, 0},
-     {{0.736000, 3.440000, 0}, 180, 180, 0},
-     {{0.720000, 1.984000, 0}, 225, 0, 0},
-     {{-0.672000, 0.544000, 0}, 45, 180, 0},
-     {{-0.192000, -3.840000, 0}, 135, 0, 0},
-     {{-0.528000, -2.480000, 0}, 135, 0, 0},
-     },
-    {
-     {{1.184000, 1.904000, 0}, 90, 180, 0},
-     {{-2.256000, 0.960000, 0}, 90, 0, 0},
-     {{-0.208000, -0.528000, 0}, 45, 180, 0},
-     {{-0.256000, -0.512000, 0}, 135, 0, 0},
-     {{0.144000, -0.944000, 0}, 135, 180, 0},
-     {{-0.608000, -3.648000, 0}, 105, 0, 0},
-     {{0.832000, -0.912000, 0}, 135, 0, 0},
-     },
-    {
-     {{-1.056000, -2.272000, 0}, 90, 0, 0},
-     {{0.960000, -1.264000, 0}, 180, 0, 0},
-     {{-0.000000, -2.288000, 0}, 135, 0, 0},
-     {{-1.088000, -2.256000, 0}, 180, 0, 0},
-     {{0.992000, 0.736000, 0}, 0, 0, 0},
-     {{0.960000, -0.256000, 0}, 180, 0, 0},
-     {{-0.064000, 0.752000, 0}, 180, 180, 0},
-     },
-    {
-     {{-1.360000, -0.224000, 0}, 0, 0, 0},
-     {{-0.336000, -0.176000, 0}, 90, 0, 0},
-     {{0.688000, -0.192000, 0}, 45, 0, 0},
-     {{-1.424000, -1.168000, 0}, 180, 0, 0},
-     {{1.744000, 0.816000, 0}, 0, 0, 0},
-     {{-0.384000, -0.176000, 0}, 180, 0, 0},
-     {{1.648000, -1.216000, 0}, 270, 180, 0},
-     },
-    {
-     {{2.112000, 1.504000, 0}, 0, 0, 0},
-     {{-1.040000, 1.472000, 0}, 180, 180, 0},
-     {{0.032000, -1.600000, 0}, 135, 0, 0},
-     {{1.056000, 1.504000, 0}, 270, 0, 0},
-     {{-0.992000, -0.528000, 0}, 0, 180, 0},
-     {{2.080000, 0.512000, 0}, 180, 0, 0},
-     {{-1.104000, 0.480000, 0}, 270, 180, 0},
-     },
-    {
-     {{0.608000, 1.184000, 0}, 135, 0, 0},
-     {{-2.928000, -1.584000, 0}, 135, 0, 0},
-     {{0.688000, 0.560000, 0}, 90, 180, 0},
-     {{0.640000, -0.832000, 0}, 180, 0, 0},
-     {{-0.752000, -2.304000, 0}, 315, 180, 0},
-     {{-2.192000, -0.912000, 0}, 315, 0, 0},
-     {{2.704000, 1.616000, 0}, 270, 0, 0},
-     },
-    {
-     {{0.880000, 0.960000, 0}, 45, 0, 0},
-     {{0.832000, -0.960000, 0}, 0, 0, 0},
-     {{1.536000, 1.712000, 0}, 225, 180, 0},
-     {{-0.992000, 2.096000, 0}, 315, 0, 0},
-     {{0.480000, 2.704000, 0}, 180, 180, 0},
-     {{0.816000, 0.912000, 0}, 315, 0, 0},
-     {{0.784000, -1.952000, 0}, 315, 180, 0},
-     },
-    {
-     {{0.176000, 3.584000, 0}, 270, 0, 0},
-     {{2.016000, -1.424000, 0}, 90, 0, 0},
-     {{2.496000, 0.608000, 0}, 180, 180, 0},
-     {{-0.304000, 0.496000, 0}, 270, 0, 0},
-     {{-0.256000, -0.144000, 0}, 0, 180, 0},
-     {{-1.600000, -0.368000, 0}, 303, 0, 0},
-     {{0.768000, 0.912000, 0}, 180, 0, 0},
-     },
-    {
-     {{-2.096000, 1.696000, 0}, 315, 0, 0},
-     {{-1.632000, -1.440000, 0}, 45, 0, 0},
-     {{-1.232000, -0.064000, 0}, 315, 180, 0},
-     {{0.304000, 2.416000, 0}, 315, 0, 0},
-     {{1.776000, -0.496000, 0}, 315, 180, 0},
-     {{1.168000, -0.240000, 0}, 332, 0, 0},
-     {{-0.880000, -1.216000, 0}, 135, 0, 0},
-     },
-    {
-     {{-0.432000, -0.496000, 0}, 259, 0, 0},
-     {{0.176000, -1.488000, 0}, 105, 0, 0},
-     {{1.184000, -1.168000, 0}, 300, 180, 0},
-     {{1.824000, 0.096000, 0}, 195, 0, 0},
-     {{-2.400000, -0.048000, 0}, 11, 180, 0},
-     {{-0.240000, -1.200000, 0}, 315, 0, 0},
-     {{-0.688000, -1.488000, 0}, 281, 180, 0},
-     },
-    {
-     {{0.096000, 2.000000, 0}, 315, 0, 0},
-     {{0.432000, 0.160000, 0}, 360, 0, 0},
-     {{0.208000, -1.504000, 0}, 220, 180, 0},
-     {{-1.104000, -0.336000, 0}, 50, 0, 0},
-     {{-1.136000, -0.288000, 0}, 310, 180, 0},
-     {{0.416000, 1.232000, 0}, 360, 0, 0},
-     {{0.048000, 2.016000, 0}, 225, 180, 0},
-     },
-    {
-     {{-2.128000, 2.112000, 0}, 45, 0, 0},
-     {{0.128000, 1.856000, 0}, 360, 0, 0},
-     {{2.128000, -0.720000, 0}, 180, 180, 0},
-     {{-1.376000, 2.816000, 0}, 360, 0, 0},
-     {{-1.360000, 0.768000, 0}, 45, 180, 0},
-     {{0.128000, 0.336000, 0}, 360, 0, 0},
-     {{0.432000, -2.944000, 0}, 149, 0, 0},
-     },
-    {
-     {{1.952000, -0.800000, 0}, 225, 0, 0},
-     {{2.064000, -0.816000, 0}, 45, 0, 0},
-     {{0.928000, 0.688000, 0}, 225, 0, 0},
-     {{-1.568000, 3.152000, 0}, 0, 0, 0},
-     {{-1.520000, 1.104000, 0}, 45, 0, 0},
-     {{2.720000, -0.064000, 0}, 225, 0, 0},
-     {{1.968000, 0.672000, 0}, 270, 0, 0},
-     },
-    {
-     {{2.480000, -0.912000, 0}, 225, 0, 0},
-     {{2.592000, -0.928000, 0}, 45, 0, 0},
-     {{0.352000, 1.280000, 0}, 315, 0, 0},
-     {{-0.688000, 0.336000, 0}, 135, 0, 0},
-     {{1.808000, -0.112000, 0}, 135, 0, 0},
-     {{3.248000, -0.176000, 0}, 225, 0, 0},
-     {{-1.472000, 1.024000, 0}, 225, 0, 0},
-     },
-    {
-     {{-0.400000, -1.232000, 0}, 270, 0, 0},
-     {{0.400000, -0.640000, 0}, 270, 0, 0},
-     {{1.904000, -3.232000, 0}, 180, 0, 0},
-     {{1.872000, -1.776000, 0}, 225, 0, 0},
-     {{1.552000, 0.656000, 0}, 270, 0, 0},
-     {{1.056000, 1.760000, 0}, 270, 0, 0},
-     {{-0.320000, -1.024000, 0}, 135, 180, 0},
-     },
-    {
-     {{0.896000, -0.480000, 0}, 0, 0, 0},
-     {{0.128000, -0.720000, 0}, 45, 0, 0},
-     {{0.960000, -1.728000, 0}, 270, 0, 0},
-     {{-1.040000, -1.648000, 0}, 90, 0, 0},
-     {{-0.848000, 2.304000, 0}, 0, 0, 0},
-     {{-0.096000, 0.944000, 0}, 315, 0, 0},
-     {{-1.568000, -1.728000, 0}, 90, 180, 0},
-     },
-    {
-     {{0.416000, 3.648000, 0}, 270, 0, 0},
-     {{-0.000000, -1.072000, 0}, 331, 0, 0},
-     {{1.360000, 0.528000, 0}, 180, 0, 0},
-     {{0.880000, 0.464000, 0}, 270, 0, 0},
-     {{0.576000, -3.184000, 0}, 151, 0, 0},
-     {{0.864000, 2.576000, 0}, 270, 0, 0},
-     {{-1.120000, 0.528000, 0}, 90, 0, 0},
-     },
-    {
-     {{-1.056000, -3.456000, 0}, 90, 0, 0},
-     {{0.736000, 2.000000, 0}, 135, 0, 0},
-     {{-1.488000, 1.760000, 0}, 45, 0, 0},
-     {{-0.432000, 0.016000, 0}, 0, 180, 0},
-     {{-0.432000, -0.064000, 0}, 0, 0, 0},
-     {{0.560000, -2.576000, 0}, 225, 0, 0},
-     {{0.032000, 2.656000, 0}, 0, 0, 0},
-     },
-    {
-     {{-2.800000, -2.304000, 0}, 101, 0, 0},
-     {{1.888000, 2.032000, 0}, 135, 180, 0},
-     {{-1.856000, 2.016000, 0}, 315, 0, 0},
-     {{0.352000, -0.144000, 0}, 315, 180, 0},
-     {{-2.848000, 0.976000, 0}, 0, 0, 0},
-     {{-1.424000, -1.104000, 0}, 236, 0, 0},
-     {{-1.792000, 2.016000, 0}, 45, 0, 0},
-     },
-    {
-     {{0.864000, 0.880000, 0}, 180, 0, 0},
-     {{0.912000, -2.288000, 0}, 180, 180, 0},
-     {{-1.136000, -0.144000, 0}, 45, 0, 0},
-     {{-1.136000, -3.312000, 0}, 360, 180, 0},
-     {{-1.168000, 1.920000, 0}, 0, 0, 0},
-     {{-1.184000, -1.248000, 0}, 180, 0, 0},
-     {{-1.136000, -0.224000, 0}, 0, 0, 0},
-     },
-    {
-     {{0.592000, 0.704000, 0}, 90, 0, 0},
-     {{0.576000, -2.496000, 0}, 90, 180, 0},
-     {{2.624000, -1.440000, 0}, 225, 0, 0},
-     {{2.640000, -3.504000, 0}, 270, 180, 0},
-     {{2.656000, 1.712000, 0}, 270, 0, 0},
-     {{0.544000, 0.704000, 0}, 180, 0, 0},
-     {{1.648000, 0.640000, 0}, 0, 0, 0},
-     },
-    {
-     {{0.448000, -3.344000, 0}, 90, 0, 0},
-     {{-1.616000, 1.984000, 0}, 90, 180, 0},
-     {{-1.584000, 0.928000, 0}, 45, 0, 0},
-     {{-1.600000, -2.288000, 0}, 0, 180, 0},
-     {{1.536000, -1.328000, 0}, 270, 0, 0},
-     {{2.592000, -3.328000, 0}, 180, 0, 0},
-     {{-1.600000, 0.832000, 0}, 0, 0, 0},
-     },
-    {
-     {{0.608000, 0.880000, 0}, 180, 0, 0},
-     {{0.576000, -2.304000, 0}, 180, 180, 0},
-     {{-1.456000, -0.176000, 0}, 45, 0, 0},
-     {{-1.472000, -3.344000, 0}, 0, 180, 0},
-     {{-1.472000, 1.888000, 0}, 0, 0, 0},
-     {{0.640000, -1.168000, 0}, 180, 0, 0},
-     {{-1.456000, -0.256000, 0}, 0, 0, 0},
-     },
-    {
-     {{-0.208000, -0.352000, 0}, 225, 0, 0},
-     {{0.528000, 1.856000, 0}, 225, 180, 0},
-     {{-0.176000, -3.904000, 0}, 135, 0, 0},
-     {{-0.880000, 0.384000, 0}, 45, 180, 0},
-     {{-0.192000, -0.384000, 0}, 315, 0, 0},
-     {{0.304000, -2.864000, 0}, 180, 0, 0},
-     {{-0.224000, 2.528000, 0}, 315, 0, 0},
-     },
-    {
-     {{-0.032000, 0.704000, 0}, 315, 0, 0},
-     {{2.208000, -1.504000, 0}, 225, 180, 0},
-     {{-0.720000, -0.064000, 0}, 0, 0, 0},
-     {{-0.720000, -1.536000, 0}, 45, 180, 0},
-     {{-0.016000, 1.744000, 0}, 315, 180, 0},
-     {{0.464000, 0.736000, 0}, 180, 0, 0},
-     {{1.456000, -0.816000, 0}, 315, 0, 0},
-     },
-    {
-     {{-0.944000, 1.040000, 0}, 360, 0, 0},
-     {{1.120000, 0.000000, 0}, 180, 180, 0},
-     {{0.080000, -0.048000, 0}, 315, 0, 0},
-     {{0.080000, -1.104000, 0}, 135, 180, 0},
-     {{0.080000, 1.120000, 0}, 315, 180, 0},
-     {{1.120000, 0.048000, 0}, 180, 0, 0},
-     {{0.064000, 0.992000, 0}, 180, 180, 0},
-     },
-    {
-     {{-0.688000, 0.784000, 0}, 135, 0, 0},
-     {{0.800000, 0.784000, 0}, 135, 0, 0},
-     {{0.512000, -2.512000, 0}, 315, 0, 0},
-     {{1.488000, 0.000000, 0}, 225, 0, 0},
-     {{-1.392000, 0.000000, 0}, 45, 0, 0},
-     {{0.496000, -2.432000, 0}, 180, 0, 0},
-     {{0.480000, -2.496000, 0}, 270, 0, 0},
-     },
-    {
-     {{-0.992000, -2.160000, 0}, 90, 0, 0},
-     {{-1.040000, -1.152000, 0}, 270, 0, 0},
-     {{0.064000, -2.144000, 0}, 135, 0, 0},
-     {{0.080000, -1.088000, 0}, 90, 0, 0},
-     {{0.032000, -1.072000, 0}, 180, 0, 0},
-     {{0.544000, -3.216000, 0}, 180, 0, 0},
-     {{2.160000, -1.136000, 0}, 270, 0, 0},
-     },
-    {
-     {{-2.896000, -0.128000, 0}, 45, 0, 0},
-     {{-0.800000, 0.992000, 0}, 135, 0, 0},
-     {{-1.152000, -0.416000, 0}, 225, 0, 0},
-     {{-0.016000, 0.656000, 0}, 315, 0, 0},
-     {{1.456000, -0.736000, 0}, 135, 0, 0},
-     {{2.864000, 0.736000, 0}, 180, 0, 0},
-     {{-0.048000, 1.664000, 0}, 180, 180, 0},
-     },
-    {
-     {{2.960000, -1.376000, 0}, 270, 0, 0},
-     {{1.952000, -1.312000, 0}, 90, 0, 0},
-     {{-0.096000, 0.720000, 0}, 315, 0, 0},
-     {{-2.112000, -0.320000, 0}, 90, 180, 0},
-     {{1.904000, -0.320000, 0}, 180, 180, 0},
-     {{-0.096000, -1.776000, 0}, 135, 0, 0},
-     {{-3.168000, -2.304000, 0}, 360, 180, 0},
-     },
-    {
-     {{-1.600000, -1.232000, 0}, 270, 0, 0},
-     {{-1.600000, -0.128000, 0}, 180, 0, 0},
-     {{2.272000, -0.128000, 0}, 225, 0, 0},
-     {{-0.160000, -3.648000, 0}, 315, 180, 0},
-     {{-0.176000, 2.336000, 0}, 135, 180, 0},
-     {{-2.608000, -1.184000, 0}, 90, 0, 0},
-     {{1.280000, -2.208000, 0}, 360, 180, 0}
-     }
+#define SPEED 0.03
+enum {
+    BOTTOM = 0,
+    DEF_WAIT = 500,
+    INIT_DZ = 2,
+    NUM_SHAPES = 7
 };
 
+typedef struct {
+    GLXContext *glx_context;
+    tangram_shape tsm1, tsm2, tm, tlg1, tlg2, sq, rh;
+    tangram_shape n_tsm1, n_tsm2, n_tm, n_tlg1, n_tlg2, n_sq, n_rh;
+    char *puzzle_name;
+    int csi;
 
-/* Dream */
-color palette[] = {
-    {22, 26, 28},
-    {122, 142, 139},
-    {72, 82, 76},
-    {94, 115, 108},
-    {194, 202, 195},
-    {165, 175, 171},
-    {132, 117, 107},
-    {49, 54, 48},
-    {111, 84, 78},
-    {155, 144, 137},
-    {82, 99, 100},
-    {87, 57, 52},
-    {131, 132, 125},
-    {110, 130, 125},
-    {62, 70, 68},
-    {156, 160, 153},
-    {182, 190, 184},
-    {112, 116, 111},
-    {56, 37, 35},
-    {226, 230, 226},
-    {146, 158, 154},
-    {111, 101, 91},
-    {96, 99, 96},
-    {158, 130, 115},
-    {147, 117, 105},
-    {90, 85, 83},
-    {112, 124, 121},
-    {140, 144, 136},
-    {176, 162, 156},
-    {69, 56, 52},
-    {183, 177, 169},
-    {34, 38, 33},
-    {213, 219, 212},
-    {96, 108, 107},
-    {143, 132, 121},
-    {159, 166, 156},
-    {132, 124, 113},
-    {141, 151, 149},
-    {132, 100, 94},
-    {75, 73, 68},
-    {57, 62, 57},
-    {78, 90, 83},
-    {210, 205, 207},
-    {155, 152, 143},
-    {42, 47, 40},
-    {94, 70, 64},
-    {195, 193, 188},
-    {124, 116, 106},
-    {123, 124, 117},
-    {173, 182, 172},
-    {133, 138, 135},
-    {183, 185, 178},
-    {120, 130, 120},
-    {96, 100, 110},
-    {127, 88, 78},
-    {166, 161, 154},
-    {91, 92, 98},
-    {132, 124, 136},
-    {101, 122, 117},
-    {112, 108, 99},
-    {140, 144, 151},
-    {98, 109, 116},
-    {58, 58, 51},
-    {84, 84, 82},
-    {132, 132, 142},
-    {112, 116, 127},
-    {58, 48, 48},
-    {66, 66, 58},
-    {205, 210, 205},
-    {70, 78, 80},
-    {246, 246, 244},
-    {167, 168, 159},
-    {147, 152, 145},
-    {166, 154, 148},
-    {107, 73, 67},
-    {175, 177, 168},
-    {132, 117, 126},
-    {86, 106, 101},
-    {78, 78, 75},
-    {123, 138, 135},
-    {112, 92, 83},
-    {143, 138, 127},
-    {133, 109, 95},
-    {38, 34, 44},
-    {150, 134, 147},
-    {147, 123, 115},
-    {46, 48, 54},
-    {195, 198, 195},
-    {194, 186, 188},
-    {122, 110, 100},
-    {105, 116, 106},
-    {42, 42, 42},
-    {223, 221, 220},
-    {68, 71, 65},
-    {156, 160, 164},
-    {114, 124, 132},
-    {155, 152, 163},
-    {103, 94, 89},
-    {58, 63, 70},
-    {132, 143, 137},
-    {168, 143, 128},
-    {190, 198, 190},
-    {239, 237, 237},
-    {103, 101, 94},
-    {84, 90, 84},
-    {211, 213, 210},
-    {183, 185, 188},
-    {94, 94, 108},
-    {203, 204, 196},
-    {123, 125, 135},
-    {120, 132, 133},
-    {111, 110, 125},
-    {28, 32, 28},
-    {53, 56, 62},
-    {88, 63, 59},
-    {104, 108, 103},
-    {140, 124, 115},
-    {147, 126, 137},
-    {155, 144, 157},
-    {87, 98, 92},
-    {188, 192, 189},
-    {162, 133, 115},
-    {148, 144, 134},
-    {175, 169, 162},
-    {138, 131, 120},
-    {118, 124, 118},
-    {139, 125, 135},
-    {148, 144, 154},
-    {72, 47, 44},
-    {100, 72, 66},
-    {66, 42, 39},
-    {105, 84, 73},
-    {86, 78, 82},
-    {234, 238, 236},
-    {108, 78, 73},
-    {130, 110, 121},
-    {134, 150, 146},
-    {254, 254, 252},
-    {151, 138, 130},
-    {125, 99, 88},
-    {80, 56, 52},
-    {98, 63, 60},
-    {114, 138, 132},
-    {61, 42, 37},
-    {150, 166, 164},
-    {127, 94, 87},
-    {225, 226, 223},
-    {64, 47, 44},
-    {218, 226, 220},
-    {242, 242, 242},
-    {150, 138, 150},
-    {166, 138, 122},
-    {102, 78, 71},
-    {124, 118, 131},
-    {74, 65, 66},
-    {49, 33, 28},
-    {182, 170, 175},
-    {139, 117, 107},
-    {120, 84, 76},
-    {232, 232, 231},
-    {46, 50, 41},
-    {102, 102, 115},
-    {104, 108, 119},
-    {140, 118, 123},
-    {120, 92, 84},
-    {139, 108, 97},
-    {156, 125, 107},
-    {218, 214, 215},
-    {144, 133, 143},
-    {168, 161, 172},
-    {58, 58, 68},
-    {167, 169, 173},
-    {148, 152, 158},
-    {175, 177, 180},
-    {67, 73, 77},
-    {134, 143, 148},
-    {79, 50, 45},
-    {74, 83, 86},
-    {150, 134, 124},
-    {90, 86, 95},
-    {184, 176, 186},
-    {38, 39, 45},
-    {160, 168, 166},
-    {78, 73, 78},
-    {195, 193, 196},
-    {177, 184, 181},
-    {43, 41, 52},
-    {32, 33, 39},
-    {135, 138, 148},
-    {203, 198, 201},
-    {26, 26, 28},
-    {98, 116, 113},
-    {198, 202, 199},
-    {170, 176, 172},
-    {54, 57, 48},
-    {162, 146, 140},
-    {114, 131, 130},
-    {162, 160, 150},
-    {118, 116, 108},
-    {150, 159, 156},
-    {118, 99, 84},
-    {74, 54, 51},
-    {138, 102, 100},
-    {62, 64, 55},
-    {162, 154, 146},
-    {190, 185, 179},
-    {98, 94, 94},
-    {106, 124, 121},
-    {118, 110, 100},
-    {118, 117, 131},
-    {50, 50, 60},
-    {162, 152, 164},
-    {94, 63, 58},
-    {62, 70, 77},
-    {174, 162, 172},
-    {78, 91, 92},
-    {85, 85, 93},
-    {54, 50, 61},
-    {67, 66, 74},
-    {166, 154, 167},
-    {126, 109, 119},
-    {104, 116, 118},
-    {83, 92, 95},
-    {203, 205, 204},
-    {88, 100, 101},
-    {176, 169, 179},
-    {145, 138, 148},
-    {116, 78, 68},
-    {78, 78, 84},
-    {126, 142, 137},
-    {78, 83, 76},
-    {94, 58, 52},
-    {62, 38, 36},
-    {98, 86, 76},
-    {38, 42, 34},
-    {218, 220, 217},
-    {82, 70, 60},
-    {202, 194, 188},
-    {178, 183, 172},
-    {126, 131, 120},
-    {138, 132, 143},
-    {250, 250, 250},
-    {114, 74, 68},
-    {90, 108, 106},
-    {50, 38, 36},
-    {162, 161, 168},
-    {118, 124, 132},
-    {62, 65, 71},
-    {190, 185, 193},
-    {98, 94, 109},
-    {126, 132, 138},
-    {34, 34, 28},
-    {162, 146, 163},
-    {78, 85, 88},
-    {158, 134, 124},
-    {190, 178, 188}
-};
+    int ncolors;
+    XColor *colors;
+    int ccolor;
 
-static tangram_shape tsm1 = { {-0.144, -0.72, 0}, 225, false, 0 };
-static tangram_shape tsm2 = { {0.608, 0.032, 0}, 135, false, 0 };
-static tangram_shape tm = { {-1.584, 0.72, 0}, 0, false, 0 };
-static tangram_shape tlg1 = { {-0.112, -0.72, 0}, 315, false, 0 };
-static tangram_shape tlg2 = { {-0.096, -0.704, 0}, 45, false, 0 };
-static tangram_shape sq = { {0.592, 0.016, 0}, 225, false, 0 };
-static tangram_shape rh = { {-0.88, -0.032, 0}, 315, false, 0 };
+    XFontStruct *xfont1;
+    XFontStruct *xfont2;
+    XFontStruct *xfont3;
+    GLuint font1_dlist, font2_dlist, font3_dlist;
+    GLuint name_list;
+} tangram_configuration;
 
+static tangram_configuration *tps = NULL;
 
 #define DEF_VIEWING_TIME "5"
+#define DEF_ROTATE_CAMERA "True"
+#define DEF_X_CAMERA_ROTATE "0.2"
+#define DEF_Y_CAMERA_ROTATE "0.5"
+#define DEF_Z_CAMERA_ROTATE "0"
+
+
 static GLuint viewing_time = 0;
+static Bool do_rotate = True;
+static GLfloat x_camera_rotate = 0.3;
+static GLfloat y_camera_rotate = 0.75;
+static GLfloat z_camera_rotate = 0;
+static int wire;
 
 static XrmOptionDescRec opts[] = {
-    {"-viewing_time", ".viewing_time", XrmoptionSepArg, 0}
+    {"-viewing_time", ".viewing_time", XrmoptionSepArg, 0},
+    {"-rotate", ".rotate", XrmoptionNoArg, "True"},
+    {"+rotate", ".rotate", XrmoptionNoArg, "False"},
+    {"-x_camera_rotate", ".x_camera_rotate", XrmoptionSepArg, 0},
+    {"-y_camera_rotate", ".y_camera_rotate", XrmoptionSepArg, 0},
+    {"-z_camera_rotate", ".z_camera_rotate", XrmoptionSepArg, 0}
 };
 
 static argtype vars[] = {
-    {&viewing_time, "viewing_time", "Viewing Time", DEF_VIEWING_TIME, t_Int}
+    {&viewing_time, "viewing_time", "Viewing Time", DEF_VIEWING_TIME, t_Int},
+    {&do_rotate, "rotate", "Rotate", DEF_ROTATE_CAMERA, t_Bool},
+    {&x_camera_rotate, "x_camera_rotate", "X Camera Rotate", DEF_X_CAMERA_ROTATE, t_Float},
+    {&y_camera_rotate, "y_camera_rotate", "Y Camera Rotate", DEF_Y_CAMERA_ROTATE, t_Float},
+    {&z_camera_rotate, "z_camera_rotate", "Z Camera Rotate", DEF_Z_CAMERA_ROTATE, t_Float}
 };
 
 ModeSpecOpt sws_opts = { countof(opts), opts, countof(vars), vars, NULL };
 
-static int wire;
-static int csi = -1;            /* Current Shape index */
+static puzzle solved[] = {
+  {"Teapot", {
+      {{-1.664000, -1.552000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.696000, 0.944000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0,  False},
+      {{0.064000, -2.128000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0,  True},
+      {{-0.960000, -1.056000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.104000, 0.960000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.376000, -0.800000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.152000, 0.736000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Candle", {
+      {{-0.016000, 2.176001, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.016000, 2.960001, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.000000, 0.400000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-2.015998, 2.208001, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{2.000001, 2.208001, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.496000, 0.432000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.016000, -0.672000, 0}, 335, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Square", {
+      {{-0.048000, -0.016000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.704000, 0.736000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.488000, 1.424001, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.016000, -0.016000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.000000, 0.000000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.688000, 0.720000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.784000, 0.672000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Crane", {
+      {{1.248001, 1.759999, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.024000, 3.071999, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.975999, -2.096001, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.480000, -1.968001, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.056000, -0.496000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.239999, -1.312001, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.223999, -1.360001, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Crane", {
+      {{0.320000, 1.360000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.704000, 3.072000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.200000, -3.392000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.688000, -1.184000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.768000, 0.192000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.168000, -2.304000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.312000, 1.296000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Duck", {
+      {{-1.391999, 1.424000, 0}, 65, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.768000, 2.000000, 0}, 99, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{2.688001, -1.872000, 0}, 270, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.343999, 0.944000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.112000, -0.464000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.984001, -1.120000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.536001, 0.912000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Pelican", {
+      {{1.088000, 0.064001, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.864000, -1.279999, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.807999, 1.520000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.824001, -1.231998, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.368000, 1.472000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.832000, -2.271998, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.776001, 0.816000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Cat", {
+      {{0.416000, -2.432000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.352000, -2.432000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.832000, -0.480000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.632000, 3.056000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.616000, 1.040000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.088000, -1.696000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.832000, -0.432000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Coi", {
+      {{1.264000, -1.232000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.216000, 0.816000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.631999, 1.872000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.832000, 2.287999, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.608000, 0.912000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{2.240001, -0.176000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.256000, -1.200000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Man Skipping", {
+      {{1.727998, 2.303998, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.120000, 3.376001, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.879998, -3.008001, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.072000, 2.559999, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.440000, 0.144000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.192001, -2.592001, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.015999, 0.176000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Old Man", {
+      {{-0.400000, 1.744000, 0}, 58, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.704000, 0.128000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.656000, 0.320000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.112000, -0.384000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.096000, -0.399999, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.736000, 0.352000, 0}, 123, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.336000, 0.352000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Spear Head", {
+      {{0.688000, -0.144000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.080000, 0.592000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.048000, 0.592000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.488000, -0.848000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.376000, -0.864000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.688000, -0.128000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.504000, -0.832000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Diamond", {
+      {{0.624000, -1.776000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.144000, 0.432000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.800000, -0.272000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-2.320000, -0.304000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{2.048000, -0.320000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.112000, 0.480000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.832000, -0.320000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Arrow", {
+      {{-2.048001, -1.232000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.112000, 0.943999, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.312001, -0.560000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.496000, 0.656000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.528000, 0.608000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-2.048001, -2.704000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.312001, -0.512000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Lady", {
+      {{-0.720000, 3.440000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.912000, -1.072000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.736000, 3.440000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.720000, 1.984000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.672000, 0.544000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.192000, -3.840000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.528000, -2.480000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Running Man", {
+      {{1.136000, 2.720000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-2.304001, 1.776000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.256000, 0.288000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.304000, 0.304000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.096000, -0.128000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.656000, -2.832000, 0}, 105, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.784000, -0.096000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Parallelogram", {
+      {{-1.104000, -1.455999, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.912000, -0.447999, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.048000, -1.471999, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.136000, -1.439999, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.944000, 1.552000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.912000, 0.560000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.112000, 1.568000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"N", {
+      {{-1.615999, 0.064000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.592000, 0.112000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.432000, 0.096000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.679999, -0.880000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.488001, 1.103999, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.640000, 0.112000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.392001, -0.928000, 0}, 270, 180, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Farm House", {
+      {{2.112000, 1.504000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.040000, 1.472000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.032000, -1.600000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.056000, 1.504000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.992000, -0.528000, 0}, 0, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{2.080000, 0.512000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.104000, 0.480000, 0}, 270, 180, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Vulture", {
+      {{0.912000, 1.728000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-2.623998, -1.040000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.992000, 1.104000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.944000, -0.288000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.448000, -1.760000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.887998, -0.368000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{3.008002, 2.160000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Swan", {
+      {{0.720000, 0.352000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.672000, -1.568000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.376000, 1.104000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.151999, 1.488000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.320000, 2.096000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.656000, 0.304000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.624000, -2.559999, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"High Karate", {
+      {{-0.144000, 2.576000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.696001, -2.432000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{2.176001, -0.400000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.624000, -0.512000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.576000, -1.152000, 0}, 0, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.919999, -1.376000, 0}, 303, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.448000, -0.096001, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Lazy", {
+      {{-2.416000, 1.120000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.952000, -2.016000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.552000, -0.640000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.016000, 1.840000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.456000, -1.072000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.848000, -0.816000, 0}, 332, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.200000, -1.792000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Bat", {
+      {{-0.304000, -0.352000, 0}, 259, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.304000, -1.344000, 0}, 105, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.312000, -1.024000, 0}, 300, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.952000, 0.240000, 0}, 195, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-2.272000, 0.096000, 0}, 11, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.112000, -1.056000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.560000, -1.344000, 0}, 281, 180, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Sail Boat", {
+      {{0.544000, 2.000000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.880000, 0.160000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.656000, -1.503999, 0}, 220, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.656000, -0.336000, 0}, 50, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.688000, -0.288000, 0}, 310, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.864000, 1.232000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.496000, 2.016001, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Glenda", {
+      {{-2.016000, 2.080000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.240001, 1.824000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{2.239999, -0.752000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.264000, 2.784000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.248000, 0.736000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.240001, 0.304000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.544000, -2.976001, 0}, 149, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Cat", {
+      {{1.376000, -1.536001, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.488000, -1.552001, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.352000, -0.048000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-2.144000, 2.415999, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-2.096000, 0.368000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{2.144000, -0.800000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.392000, -0.064000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Lying Cat", {
+      {{2.480000, -0.912000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{2.592000, -0.928000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.352000, 1.280000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.688000, 0.336000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.808000, -0.112000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{3.248000, -0.176000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.472000, 1.024000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Witch", {
+      {{-0.943999, -0.304000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.144000, 0.288000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.360000, -2.304000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.328000, -0.848000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.008000, 1.584000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.512000, 2.688000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.863999, -0.096000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Laugh", {
+      {{0.703999, -0.160000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.064000, -0.400000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.767999, -1.408000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.232000, -1.328000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.040000, 2.624000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.288000, 1.264000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.760001, -1.408000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Standing Man", {
+      {{0.272000, 3.392000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.144000, -1.328000, 0}, 331, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.216001, 0.272000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.736000, 0.208000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.432000, -3.440000, 0}, 151, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.720000, 2.320000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.263998, 0.272000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Walking Man", {
+      {{-1.056000, -3.456000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.736000, 2.000000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.488000, 1.760000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.432000, 0.016000, 0}, 0, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.432000, -0.064000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.560000, -2.576000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.032000, 2.656000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Repose", {
+      {{-2.800000, -2.304000, 0}, 101, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.888000, 2.032000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.856000, 2.016000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.352000, -0.144000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-2.848000, 0.976000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.424000, -1.104000, 0}, 236, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.792000, 2.016000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Shape", {
+      {{1.263999, 1.600001, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.311999, -1.568000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.736000, 0.576000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.736000, -2.591999, 0}, 360, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.768000, 2.640001, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.784000, -0.528000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.736000, 0.496000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Shape", {
+      {{-0.816000, 1.392000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.832000, -1.807999, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.216000, -0.752000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.232000, -2.815999, 0}, 270, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.248000, 2.400000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.864000, 1.392000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.240000, 1.328000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Lightning", {
+      {{0.176000, -2.448000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.888000, 2.880000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.856000, 1.824000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.872000, -1.392000, 0}, 0, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.264000, -0.432000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{2.320001, -2.432000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.872000, 1.728000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"E", {
+      {{0.928000, 1.664000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.896000, -1.519998, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.136000, 0.608000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.152000, -2.559998, 0}, 0, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.152000, 2.672002, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.960000, -0.384000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.136000, 0.528000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Dagger", {
+      {{-0.096000, 0.448000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.640000, 2.656000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.064000, -3.104000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.767999, 1.184000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.080000, 0.416000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.416000, -2.064000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.112000, 3.328001, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Knight", {
+      {{-0.368000, 0.400000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.871998, -1.808000, 0}, 225, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.056000, -0.368000, 0}, 0, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.056000, -1.840000, 0}, 45, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.352000, 1.440000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.128000, 0.432000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.119999, -1.120000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Candy", {
+      {{-1.039999, 1.136000, 0}, 360, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.024000, 0.096000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.016000, 0.048000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.016000, -1.008000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.016000, 1.216000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.024000, 0.144000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.032000, 1.088000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"King", {
+      {{-0.688000, 1.904000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.800000, 1.904000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.512000, -1.392000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.488000, 1.120000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.392000, 1.120000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.496000, -1.312000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.480000, -1.376000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Top", {
+      {{-1.055999, -0.800000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.103999, 0.208000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{0.000000, -0.784000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.016000, 0.272000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.032000, 0.288000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{0.480000, -1.855999, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{2.096001, 0.224000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Dog", {
+      {{-2.896000, -0.128000, 0}, 45, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.800000, 0.992000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-1.152000, -0.416000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.016000, 0.656000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.456000, -0.736000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{2.864000, 0.736000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.048000, 1.664000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, True},
+    },
+  },
+  {"Moose Head", {
+      {{2.944000, -0.288000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.936000, -0.224000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.112000, 1.808000, 0}, 315, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{-2.128000, 0.768000, 0}, 90, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{1.888000, 0.768000, 0}, 180, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.112000, -0.688000, 0}, 135, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-3.184000, -1.216000, 0}, 360, 180, 0, INIT_DZ, -SPEED, 0, False},
+    },
+  },
+  {"Negative Square", {
+      {{-1.520000, -0.624000, 0}, 270, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-1.520000, 0.480000, 0}, 180, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{2.352000, 0.480000, 0}, 225, 0, 0, INIT_DZ, -SPEED, 0, True},
+      {{-0.080000, -3.040000, 0}, 315, 180, 0, INIT_DZ, -SPEED, 0, False},
+      {{-0.096000, 2.944000, 0}, 135, 180, 0, INIT_DZ, -SPEED, 0, True},
+      {{-2.528000, -0.576000, 0}, 90, 0, 0, INIT_DZ, -SPEED, 0, False},
+      {{1.360000, -1.600000, 0}, 360, 180, INIT_DZ, -SPEED, 0, True},
+    }}
+};
+\f
 
-static void get_solved_puzzle(tangram_shape * tsm1, tangram_shape * tsm2,
+static void get_solved_puzzle(ModeInfo * mi,
+                              tangram_shape * tsm1, tangram_shape * tsm2,
                               tangram_shape * tm, tangram_shape * tlg1,
                               tangram_shape * tlg2, tangram_shape * sq,
                               tangram_shape * rh)
 {
+    tangram_configuration *tp = &tps[MI_SCREEN(mi)];
     int sz = sizeof(solved) / sizeof(solved[0]);
     int r;
-    GLuint t_dl;
 
+    /* we don't want to see the same puzzle twice */
     do {
         r = random() % sz;
-    } while (r == csi);
-    csi = r;
-
-    t_dl = tsm1->dl;
-    *tsm1 = solved[r][small_triangle1];
-    tsm1->dl = t_dl;
-
-    t_dl = tsm2->dl;
-    *tsm2 = solved[r][small_triangle2];
-    tsm2->dl = t_dl;
-
-    t_dl = tm->dl;
-    *tm = solved[r][medium_triangle];
-    tm->dl = t_dl;
-
-    t_dl = tlg1->dl;
-    *tlg1 = solved[r][large_triangle1];
-    tlg1->dl = t_dl;
-
-    t_dl = tlg2->dl;
-    *tlg2 = solved[r][large_triangle2];
-    tlg2->dl = t_dl;
-
-    t_dl = sq->dl;
-    *sq = solved[r][square];
-    sq->dl = t_dl;
-
-    t_dl = rh->dl;
-    *rh = solved[r][rhomboid];
-    rh->dl = t_dl;
-
-}
-
-static bool colors_match(color c1, color c2)
-{
-    bool res = false;
-    if (c1.r == c2.r && c1.g == c2.g && c1.b == c2.b)
-        res = true;
-    return res;
-}
-
-static color rand_palette(void)
-{
-    int l = sizeof(palette) / sizeof(color);
-    int r = random() % l;
-    return palette[r];
+    } while (r == tp->csi);
+    tp->csi = r;
+
+    *tsm1 = solved[r].ts[small_triangle1];
+    *tsm2 = solved[r].ts[small_triangle2];
+    *tm = solved[r].ts[medium_triangle];
+    *tlg1 = solved[r].ts[large_triangle1];
+    *tlg2 = solved[r].ts[large_triangle2];
+    *sq = solved[r].ts[square];
+    *rh = solved[r].ts[rhomboid];
+
+    tp->puzzle_name = solved[r].name;
 }
 
 static int approach_number(int goal, int current, int step)
@@ -860,64 +652,37 @@ static int approach_number(int goal, int current, int step)
 }
 
 /* gt - floating point greater than comparison */
-static bool gt(GLfloat x1, GLfloat x2, GLfloat per)
+static Bool gt(GLfloat x1, GLfloat x2, GLfloat per)
 {
     if ((x1 > x2) && (fabs(x1 - x2) > per))
-        return true;
+        return True;
     else
-        return false;
+        return False;
 }
 
 /* lt - floating point less than comparison */
-static bool lt(GLfloat x1, GLfloat x2, GLfloat per)
+static Bool lt(GLfloat x1, GLfloat x2, GLfloat per)
 {
     if ((x1 < x2) && (fabs(x1 - x2) > per))
-        return true;
+        return True;
     else
-        return false;
+        return False;
 }
 
-/* eq - Check the equality of a pair of floating point numbers to a certain perscision */
-static bool eq(GLfloat x1, GLfloat x2, GLfloat per)
-{
-    if (fabs(x1 - x2) < per)
-        return true;
-    else
-        return false;
-}
-
-
 static GLfloat approach_float(GLfloat goal, GLfloat current,
-                              bool * changed, GLfloat per)
+                              Bool * changed, GLfloat per)
 {
-    *changed = false;
+    *changed = False;
     if (gt(goal, current, per)) {
         current += per;
-        *changed = true;
+        *changed = True;
     } else if (lt(goal, current, per)) {
         current -= per;
-        *changed = true;
+        *changed = True;
     }
     return current;
 }
 
-static bool coords_match(coord c1, coord c2, GLfloat per)
-{
-    if (eq(c1.x, c2.x, per) && eq(c1.y, c2.y, per) && eq(c1.z, c2.z, per))
-        return true;
-    else
-        return false;
-}
-
-static bool xy_coords_match(coord c1, coord c2, GLfloat per)
-{
-    if (eq(c1.x, c2.x, per) && eq(c1.y, c2.y, per))
-        return true;
-    else
-        return false;
-}
-
-
 #if 0
 static void print_shape(char *s, tangram_shape sh)
 {
@@ -928,117 +693,38 @@ static void print_shape(char *s, tangram_shape sh)
     fprintf(stderr, "\n");
 }
 #endif
+\f
 
-/* approach_shape - bring use on step closer to the new shape */
-static tangram_shape approach_shape(tangram_shape old, tangram_shape new,
-                                    bool * b, char *name)
+void reset_shape(tangram_shape * ts)
 {
-
-    GLuint dl;
-    bool changed;
-    *b = false;
-
-    old.fr = approach_number(new.fr, old.fr, 2);
-    if (old.fr != new.fr) {
-        return old;
-    }
-
-    old.r = approach_number(new.r, old.r, 2);
-    if (old.r != new.r) {
-        return old;
-    }
-
-    old.crd.x = approach_float(new.crd.x, old.crd.x, &changed, 0.1);
-    if (!changed)
-        old.crd.x = approach_float(new.crd.x, old.crd.x, &changed, 0.01);
-    if (!changed)
-        old.crd.x = approach_float(new.crd.x, old.crd.x, &changed, 0.001);
-    if (!changed)
-        old.crd.x = approach_float(new.crd.x, old.crd.x, &changed, 0.0001);
-
-    old.crd.y = approach_float(new.crd.y, old.crd.y, &changed, 0.1);
-    if (!changed)
-        old.crd.y = approach_float(new.crd.y, old.crd.y, &changed, 0.01);
-    if (!changed)
-        old.crd.y = approach_float(new.crd.y, old.crd.y, &changed, 0.001);
-    if (!changed)
-        old.crd.y = approach_float(new.crd.y, old.crd.y, &changed, 0.0001);
-
-    if (xy_coords_match(new.crd, old.crd, 0.0001)) {
-        old.crd.z = approach_float(new.crd.z, old.crd.z, &changed, 0.1);
-        if (!changed)
-            old.crd.z =
-                approach_float(new.crd.z, old.crd.z, &changed, 0.01);
-        if (!changed)
-            old.crd.z =
-                approach_float(new.crd.z, old.crd.z, &changed, 0.001);
-        if (!changed)
-            old.crd.z =
-                approach_float(new.crd.z, old.crd.z, &changed, 0.0001);
-    }
-
-
-    if (coords_match(new.crd, old.crd, 0.0001)) {
-        dl = old.dl;
-#if 0
-        fprintf(stderr, "%s\n", name);
-        print_shape("old", old);
-        print_shape("new", new);
-#endif
-        old = new;              /* pick up the rest of the settings; */
-        old.dl = dl;
-        *b = true;
-    }
-
-    return old;
+    GLfloat r = random() % 10;
+    GLfloat f = r / 10;
+    ts->crd.z = BOTTOM;
+    ts->dz = INIT_DZ + f;
+    ts->ddz = -SPEED;
 }
 
-static color get_color(void)
+void bounce(tangram_shape * ts)
 {
-    static color new_color = { 100, 100, 100 };
-    static color old_color = { 100, 100, 100 };
-
-    if (colors_match(old_color, new_color)) {
-        old_color = new_color;
-        new_color = rand_palette();
+    ts->crd.z *= -1;            /* ignore this */
+    ts->dz += ts->ddz;
+    ts->crd.z += ts->dz * SPEED;
+    if (ts->crd.z < BOTTOM) {
+        reset_shape(ts);
     }
 
-    if ((random() % 10) == 0) { /* slow down the cycle */
-        old_color.r = approach_number(new_color.r, old_color.r, 1);
-        old_color.g = approach_number(new_color.g, old_color.g, 1);
-        old_color.b = approach_number(new_color.b, old_color.b, 1);
-    }
-
-    return old_color;
-}
-
-static void explode(tangram_shape * tsm1, tangram_shape * tsm2,
-                    tangram_shape * tm, tangram_shape * tlg1,
-                    tangram_shape * tlg2, tangram_shape * sq,
-                    tangram_shape * rh)
-{
-    tsm1->crd.z = 1;
-    tsm1->r = 0;
-    tsm2->crd.z = -1;
-    tsm2->r = 0;
-    tm->crd.z = 2;
-    tm->r = 0;
-    tlg1->crd.z = -2;
-    tlg1->r = 0;
-    tlg2->crd.z = 3;
-    tlg2->r = 0;
-    sq->crd.z = -3;
-    sq->r = 0;
-    rh->crd.z = 4;
-    rh->r = 0;
+    ts->crd.z *= -1;            /* ignore this */
 }
 
-
 static void draw_tangram_shape(tangram_shape ts)
 {
     glPushMatrix();
 
-    glTranslatef(ts.crd.x, ts.crd.y, ts.crd.z);
+    if (!do_rotate) {
+        ts.up = True;
+    }
+
+    glTranslatef(ts.crd.x, ts.crd.y, ts.up ? ts.crd.z : -ts.crd.z);
     glRotated(90, 1, 0, 0);
     glRotated(ts.fr, 1, 0, 0);
     glRotated(ts.r, 0, 1, 0);
@@ -1046,25 +732,29 @@ static void draw_tangram_shape(tangram_shape ts)
     glPopMatrix();
 }
 
-static void draw_shapes(void)
+static void load_fonts(ModeInfo * mi)
 {
+    tangram_configuration *tp = &tps[MI_SCREEN(mi)];
+    load_font(mi->dpy, "titleFont", &tp->xfont1, &tp->font1_dlist);
+    load_font(mi->dpy, "titleFont2", &tp->xfont2, &tp->font2_dlist);
+    load_font(mi->dpy, "titleFont3", &tp->xfont3, &tp->font3_dlist);
+}
 
-    if (!wire) {
-        color c = get_color();
-        glColor3ub(c.r, c.g, c.b);
-    }
-
-    draw_tangram_shape(tsm1);
-
-    draw_tangram_shape(tsm2);
-    draw_tangram_shape(tm);
-    draw_tangram_shape(tlg1);
-    draw_tangram_shape(tlg2);
-    draw_tangram_shape(sq);
-    draw_tangram_shape(rh);
+static void draw_shapes(ModeInfo * mi)
+{
+    tangram_configuration *tp = &tps[MI_SCREEN(mi)];
 
+    draw_tangram_shape(tp->tsm1);
 
+    draw_tangram_shape(tp->tsm2);
+    draw_tangram_shape(tp->tm);
+    draw_tangram_shape(tp->tlg1);
+    draw_tangram_shape(tp->tlg2);
+    draw_tangram_shape(tp->sq);
+    draw_tangram_shape(tp->rh);
+    glCallList(tp->name_list);
 }
+
 static void set_perspective(void)
 {
     glPushMatrix();
@@ -1084,11 +774,10 @@ void reshape_tangram(ModeInfo * mi, int w, int h)
     glLoadIdentity();
 }
 
-static void rotate_camera(void)
+static void set_camera(void)
 {
     static GLfloat theta[3] = { 1, 1, 1 };
-    static bool going_down[3] = { false, false, false };
-
+    static Bool going_down[3] = { False, False, False };
 
     glPushMatrix();
     glMatrixMode(GL_PROJECTION);
@@ -1098,9 +787,11 @@ static void rotate_camera(void)
 
     gluLookAt(0, 5, -5, 0, 0, 0, 0, -1, 0);
 
-    glRotatef(theta[0], 1, 0, 0);
-    glRotatef(theta[1], 0, 1, 0);
-    glRotatef(theta[2], 0, 0, 1);
+    if (do_rotate) {
+        glRotatef(theta[0], 1, 0, 0);
+        glRotatef(theta[1], 0, 1, 0);
+        glRotatef(theta[2], 0, 0, 1);
+    }
 
     glMatrixMode(GL_MODELVIEW);
     glPopMatrix();
@@ -1108,138 +799,253 @@ static void rotate_camera(void)
 
     if (going_down[0] && theta[0] < 0) {
 
-        going_down[0] = false;
+        going_down[0] = False;
     } else if ((!going_down[0]) && theta[0] > 90) {
 
-        going_down[0] = true;
+        going_down[0] = True;
     }
 
     if (theta[1] > 360.0)
         theta[1] -= 360.0;
 
+    if (theta[2] > 360.0)
+        theta[2] -= 360.0;
+
     if (going_down[0])
-        theta[0] -= 0.5;
+      theta[0] -= x_camera_rotate;
     else
-        theta[0] += 0.5;
-    theta[1] += 1;
+      theta[0] += x_camera_rotate;
+
+    theta[1] += y_camera_rotate;
+    theta[2] += z_camera_rotate;
 }
 
-static void init_shapes(void)
+static void init_shapes(ModeInfo * mi)
 {
-    get_solved_puzzle(&tsm1, &tsm2, &tm, &tlg1, &tlg2, &sq, &rh);
-    tsm1.dl = get_sm_tri_dl(wire);
-    tsm2.dl = get_sm_tri_dl(wire);
-    tm.dl = get_md_tri_dl(wire);
-    tlg1.dl = get_lg_tri_dl(wire);
-    tlg2.dl = get_lg_tri_dl(wire);
-    sq.dl = get_square_dl(wire);
-    rh.dl = get_rhomboid_dl(wire);
+    int wire = MI_IS_WIREFRAME(mi);
+    tangram_configuration *tp = &tps[MI_SCREEN(mi)];
+    get_solved_puzzle(mi, &tp->tsm1, &tp->tsm2, &tp->tm, &tp->tlg1,
+                      &tp->tlg2, &tp->sq, &tp->rh);
+    get_solved_puzzle(mi, &tp->n_tsm1, &tp->n_tsm2, &tp->n_tm, &tp->n_tlg1,
+                      &tp->n_tlg2, &tp->n_sq, &tp->n_rh);
+    tp->tsm1.dl = get_sm_tri_dl(wire);
+    tp->tsm2.dl = get_sm_tri_dl(wire);
+    tp->tm.dl = get_md_tri_dl(wire);
+    tp->tlg1.dl = get_lg_tri_dl(wire);
+    tp->tlg2.dl = get_lg_tri_dl(wire);
+    tp->sq.dl = get_square_dl(wire);
+    tp->rh.dl = get_rhomboid_dl(wire);
 }
 
-void init_tangram(ModeInfo * mi)
+static void gl_init(ModeInfo * mi)
 {
-    GLfloat pos[4] = { 1, 1, -5, 1.00 };
-    GLfloat pos2[4] = { 1, 1, 5, 1.00 };
-    GLfloat lKa[4] = { 0, 0, 0, 1 };
-    GLfloat lKd[4] = { 1, 1, 1, 1 };
-    GLfloat lKs[4] = { 1, 1, 1, 1 };
 
-    wire = MI_IS_WIREFRAME(mi);
-    init_GL(mi);
+    int wire = MI_IS_WIREFRAME(mi);
 
-    if (!wire) {
-        glLightfv(GL_LIGHT0, GL_POSITION, pos);
-        glLightfv(GL_LIGHT0, GL_AMBIENT, lKa);
-        glLightfv(GL_LIGHT0, GL_DIFFUSE, lKd);
-        glLightfv(GL_LIGHT0, GL_SPECULAR, lKs);
+    GLfloat y = do_rotate ? -10 : 3;
+    GLfloat x = do_rotate ? 5 : 10;
+    GLfloat pos[4] = { 0, 0, -5, 1.00 };
+    GLfloat pos2[4] = { 0, 0, 5, 1.00 };
+    GLfloat dif2[4] = { 1, 1, 1, 1 };
 
-        glLightfv(GL_LIGHT1, GL_POSITION, pos2);
-        glLightfv(GL_LIGHT1, GL_AMBIENT, lKa);
-        glLightfv(GL_LIGHT1, GL_DIFFUSE, lKd);
-        glLightfv(GL_LIGHT1, GL_SPECULAR, lKs);
+    pos[0] = -x;
+    pos[1] = y;
 
-        glEnable(GL_DEPTH_TEST);
+    pos2[1] = x;
+    pos2[1] = y;
 
+    if (!wire) {
         glEnable(GL_LIGHTING);
+        glLightfv(GL_LIGHT0, GL_POSITION, pos);
         glEnable(GL_LIGHT0);
-        glEnable(GL_LIGHT1);
+        if (do_rotate) {
+            glLightfv(GL_LIGHT1, GL_POSITION, pos2);
+            glLightfv(GL_LIGHT1, GL_DIFFUSE, dif2);
+            glEnable(GL_LIGHT1);
+        }
+        glEnable(GL_DEPTH_TEST);
+    }
+
+}
+
+void init_tangram(ModeInfo * mi)
+{
+    tangram_configuration *tp;
+
+    if (!tps) {
+        tps = (tangram_configuration *)
+            calloc(MI_NUM_SCREENS(mi), sizeof(tangram_configuration));
+        if (!tps) {
+            fprintf(stderr, "%s: out of memory\n", progname);
+            exit(1);
+        }
 
-        glEnable(GL_COLOR_MATERIAL);
+        tp = &tps[MI_SCREEN(mi)];
     }
-    init_shapes();
 
+    tp = &tps[MI_SCREEN(mi)];
+
+    if ((tp->glx_context = init_GL(mi)) != NULL) {
+        gl_init(mi);
+    }
+
+    wire = MI_IS_WIREFRAME(mi);
+
+    load_fonts(mi);
+    init_shapes(mi);
 }
 
-static tangram_shape explode_step(tangram_shape old, tangram_shape new,
-                                  bool * b, GLfloat per)
+static Bool all_solved(tangram_shape * ls[])
 {
-    old.crd.z = approach_float(new.crd.z, old.crd.z, b, per);
-    if (eq(new.crd.z, old.crd.z, per))
-        *b = true;
-    else
-        *b = false;
+    int i;
+    Bool b = True;
+    for (i = 0; i < NUM_SHAPES; i++) {
+        b = (b && ls[i]->solved);
+    }
+    return b;
+}
+
+static void solve(tangram_shape * new_s, tangram_shape * old_s)
+{
+    Bool moved_x, moved_y, moved_r, moved_fr, z_ok;
 
-    return old;
+    old_s->fr = approach_number(new_s->fr, old_s->fr, 2);
+    moved_fr = (old_s->fr != new_s->fr);
+
+    old_s->r = approach_number(new_s->r, old_s->r, 2);
+    moved_r = (old_s->r != new_s->r);
+
+    old_s->crd.x =
+        approach_float(new_s->crd.x, old_s->crd.x, &moved_x, 0.1);
+    if (!moved_x)
+        old_s->crd.x = new_s->crd.x;
+
+    old_s->crd.y =
+        approach_float(new_s->crd.y, old_s->crd.y, &moved_y, 0.1);
+    if (!moved_y)
+        old_s->crd.y = new_s->crd.y;
+
+    z_ok = (-old_s->crd.z <= BOTTOM);
+
+    old_s->solved = (moved_x == False && moved_y == False &&
+                     moved_r == False && moved_fr == False &&
+                     z_ok == True);
 }
 
+static void set_not_solved(tangram_shape * ls[])
+{
+    int i;
+    for (i = 0; i < NUM_SHAPES; i++)
+        ls[i]->solved = False;
+}
+\f
+
 void draw_tangram(ModeInfo * mi)
 {
     Display *dpy = MI_DISPLAY(mi);
     Window window = MI_WINDOW(mi);
-    static tangram_state state = state_solved;
-    static tangram_shape n_tsm1, n_tsm2, n_tm, n_tlg1, n_tlg2, n_sq, n_rh;
-    static bool b_tsm1, b_tsm2, b_tm, b_tlg1, b_tlg2, b_sq, b_rh;
-    static time_t s_tm = 0;
-    static time_t c_tm;
-    rotate_camera();
-
-    switch (state) {
-    case state_exploding:
-        tsm1 = explode_step(tsm1, n_tsm1, &b_tsm1, 0.1);
-        tsm2 = explode_step(tsm2, n_tsm2, &b_tsm2, 0.1);
-        tm = explode_step(tm, n_tm, &b_tm, 0.1);
-        tlg1 = explode_step(tlg1, n_tlg1, &b_tlg1, 0.1);
-        tlg2 = explode_step(tlg2, n_tlg2, &b_tlg2, 0.1);
-        sq = explode_step(sq, n_sq, &b_sq, 0.1);
-        rh = explode_step(rh, n_rh, &b_rh, 0.1);
-        if (b_tsm1 && b_tsm2 && b_tm && b_tlg1 && b_tlg2 && b_sq && b_rh) {
-            get_solved_puzzle(&n_tsm1, &n_tsm2, &n_tm, &n_tlg1, &n_tlg2,
-                              &n_sq, &n_rh);
-            state = state_solving;
+    tangram_configuration *tp = &tps[MI_SCREEN(mi)];
+
+    tangram_shape *ls[NUM_SHAPES];
+    tangram_shape *nls[NUM_SHAPES];
+
+
+    int i;
+    int MAX_DISPLAY;
+    static char *pn = "";
+    static int display_counter = 0;
+
+    static GLfloat color[4] = { 0.0, 0.0, 0.0, 1.0 };
+    static GLfloat white[4] = { 1.0, 1.0, 1.0, 1.0 };
+    MAX_DISPLAY = viewing_time * 100;
+
+    ls[small_triangle1] = &tp->tsm1;
+    ls[small_triangle2] = &tp->tsm2;
+    ls[medium_triangle] = &tp->tm;
+    ls[large_triangle1] = &tp->tlg1;
+    ls[large_triangle2] = &tp->tlg2;
+    ls[square] = &tp->sq;
+    ls[rhomboid] = &tp->rh;
+
+    nls[small_triangle1] = &tp->n_tsm1;
+    nls[small_triangle2] = &tp->n_tsm2;
+    nls[medium_triangle] = &tp->n_tm;
+    nls[large_triangle1] = &tp->n_tlg1;
+    nls[large_triangle2] = &tp->n_tlg2;
+    nls[square] = &tp->n_sq;
+    nls[rhomboid] = &tp->n_rh;
+
+    set_camera();
+
+    if (display_counter <= 0) {
+        for (i = 0; i < NUM_SHAPES; i++) {
+            if (ls[i]->solved) {
+                if (all_solved(ls)) {
+                    display_counter = MAX_DISPLAY;
+                    pn = tp->puzzle_name;
+                    get_solved_puzzle(mi, nls[small_triangle1],
+                                      nls[small_triangle2],
+                                      nls[medium_triangle],
+                                      nls[large_triangle1],
+                                      nls[large_triangle2], nls[square],
+                                      nls[rhomboid]);
+                    tp->ncolors = 128;
+                    tp->colors =
+                        (XColor *) calloc(tp->ncolors, sizeof(XColor));
+
+                    make_random_colormap(0, 0, 0,
+                                         tp->colors, &tp->ncolors,
+                                         True, False, 0, False);
+
+
+                    color[0] = tp->colors[0].red / 65536.0;
+                    color[1] = tp->colors[1].green / 65536.0;
+                    color[2] = tp->colors[2].blue / 65536.0;
+
+
+                    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE,
+                                 color);
+
+                    set_not_solved(ls);
+                    break;
+                }
+            } else {
+                pn = "";
+                bounce(ls[i]);
+                solve(nls[i], ls[i]);
+            }
         }
-
-        break;
-    case state_solving:
-
-        tsm1 = approach_shape(tsm1, n_tsm1, &b_tsm1, "small 1");
-        tsm2 = approach_shape(tsm2, n_tsm2, &b_tsm2, "small 2");
-        tm = approach_shape(tm, n_tm, &b_tm, "medium");
-        tlg1 = approach_shape(tlg1, n_tlg1, &b_tlg1, "large 1");
-        tlg2 = approach_shape(tlg2, n_tlg2, &b_tlg2, "large 2");
-        sq = approach_shape(sq, n_sq, &b_sq, "square");
-        rh = approach_shape(rh, n_rh, &b_rh, "rhomboid");
-        if (b_tsm1 && b_tsm2 && b_tm && b_tlg1 && b_tlg2 && b_sq && b_rh) {
-            state = state_solved;
-            s_tm = time(0);
-        }
-        break;
-    case state_solved:
-        c_tm = time(0);
-        if (floor(difftime(c_tm, s_tm)) >= viewing_time) {
-            /*if ((random() % 100) == 0) { */
-            explode(&n_tsm1, &n_tsm2, &n_tm, &n_tlg1, &n_tlg2, &n_sq,
-                    &n_rh);
-
-            state = state_exploding;
-
-        }
-        break;
+    } else {
+        display_counter--;
     }
-    glPushMatrix();
+
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+    glPushMatrix();
+
     glLoadIdentity();
+    glNewList(tp->name_list, GL_COMPILE);
+    {
+        XFontStruct *f;
+        GLuint fl;
+        if (MI_WIDTH(mi) >= 500 && MI_HEIGHT(mi) >= 375)
+            f = tp->xfont1, fl = tp->font1_dlist;
+        else if (MI_WIDTH(mi) >= 350 && MI_HEIGHT(mi) >= 260)
+            f = tp->xfont2, fl = tp->font2_dlist;
+        else
+            f = tp->xfont3, fl = tp->font3_dlist;
+
+        glColor3f(0.8, 0.8, 0);
+        print_gl_string(mi->dpy, f, fl,
+                        mi->xgwa.width, mi->xgwa.height,
+                        10, mi->xgwa.height - 10, pn);
+    }
+    glEndList();
+
+    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, white);
+    glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 128);
+
+    draw_shapes(mi);
 
-    draw_shapes();
     glFlush();
     glPopMatrix();
     glXSwapBuffers(dpy, window);
index 1c69306ec190308a76e6dc7842772fb4f91a0469..dcf5cd9b359e48081725bc82056c34ff543730b1 100644 (file)
@@ -10,6 +10,7 @@ tangram - watch the computer solve tangram puzzles.
 [\-delay \fInumber\fP]
 [\-wireframe]
 [\-viewing_time \fInumber\fP]
+[\-rotate]
 .SH DESCRIPTION
 The \fItangram\fP program uses a view basic shapes to build silhouettes of recognizable objects.
 .SH OPTIONS
@@ -34,7 +35,9 @@ Render in wireframe instead of solid.
 .TP 8
 .B \-viewing_time \fInumber\fP 
 Specify the length of time, in seconds, that the finished puzzle
-should be displayed. Default: 5 
+.TP 8
+.B \-rotate | \-no-rotate
+Rotate the camera around the puzzle.
 .SH ENVIRONMENT
 .PP
 .TP 8
index 25dec5b21f5f3defd8b3ff8c09485988f0185adb..283c2ba40dda58b98a856d625d0c5ae9937bd314 100644 (file)
@@ -32,33 +32,46 @@ static void tri_45_90(int wire)
 
     glNormal3f(0, 1, 0);
     glVertex3fv(vertices[0]);
+    glNormal3f(0, 1, 0);
     glVertex3fv(vertices[2]);
+    glNormal3f(0, 1, 0);
     glVertex3fv(vertices[1]);
 
     glNormal3f(0, -1, 0);
     glVertex3fv(vertices[3]);
+    glNormal3f(0, -1, 0);
     glVertex3fv(vertices[4]);
+    glNormal3f(0, -1, 0);
     glVertex3fv(vertices[5]);
     glEnd();
 
     glBegin((wire) ? GL_LINE_LOOP : GL_QUADS);
     glNormal3f(1, 0, 1);
     glVertex3fv(vertices[2]);
+    glNormal3f(1, 0, 1);
     glVertex3fv(vertices[5]);
+    glNormal3f(1, 0, 1);
     glVertex3fv(vertices[4]);
+    glNormal3f(1, 0, 1);
     glVertex3fv(vertices[1]);
 
     glNormal3f(-1, 0, 0);
     glVertex3fv(vertices[0]);
+    glNormal3f(-1, 0, 0);
     glVertex3fv(vertices[1]);
+    glNormal3f(-1, 0, 0);
     glVertex3fv(vertices[4]);
+    glNormal3f(-1, 0, 0);
     glVertex3fv(vertices[3]);
 
     glNormal3f(0, 0, -1);
-    glVertex3fv(vertices[2]);
-    glVertex3fv(vertices[5]);
-    glVertex3fv(vertices[3]);
     glVertex3fv(vertices[0]);
+    glNormal3f(0, 0, -1);
+    glVertex3fv(vertices[3]);
+    glNormal3f(0, 0, -1);
+    glVertex3fv(vertices[5]);
+    glNormal3f(0, 0, -1);
+    glVertex3fv(vertices[2]);
     glEnd();
 }
 
@@ -66,11 +79,12 @@ void unit_cube(int wire)
 {
     glBegin((wire) ? GL_LINE_LOOP : GL_QUADS);
 
-    glNormal3f(0.0f, -1.0f, 0.0f);
-    glVertex3f(0.0f, -alpha, 0.0f);
-    glVertex3f(1.0f, -alpha, 0.0f);
-    glVertex3f(1.0f, -alpha, 1.0f);
-    glVertex3f(0.0f, -alpha, 1.0f);
+
+    glNormal3f(0.0f, 1.0f, 0.0f);
+    glVertex3f(0.0f, alpha, 0.0f);
+    glVertex3f(0.0f, alpha, 1.0f);
+    glVertex3f(1.0f, alpha, 1.0f);
+    glVertex3f(1.0f, alpha, 0.0f);
 
     glNormal3f(0.0f, 0.0f, 1.0f);
     glVertex3f(0.0f, -alpha, 1.0f);
@@ -96,11 +110,12 @@ void unit_cube(int wire)
     glVertex3f(0.0f, alpha, 1.0f);
     glVertex3f(0.0f, alpha, 0.0f);
 
-    glNormal3f(0.0f, 1.0f, 0.0f);
-    glVertex3f(0.0f, alpha, 0.0f);
-    glVertex3f(0.0f, alpha, 1.0f);
-    glVertex3f(1.0f, alpha, 1.0f);
-    glVertex3f(1.0f, alpha, 0.0f);
+    glNormal3f(0.0f, -1.0f, 0.0f);
+    glVertex3f(0.0f, -alpha, 0.0f);
+    glVertex3f(1.0f, -alpha, 0.0f);
+    glVertex3f(1.0f, -alpha, 1.0f);
+    glVertex3f(0.0f, -alpha, 1.0f);
+
     glEnd();
 }
 
diff --git a/hacks/glx/timetunnel.c b/hacks/glx/timetunnel.c
new file mode 100644 (file)
index 0000000..abf0e13
--- /dev/null
@@ -0,0 +1,1234 @@
+/* timetunnel. Based on dangerball.c, hack by Sean Brennan <zettix@yahoo.com>*/
+/* dangerball, Copyright (c) 2001-2004 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#include <X11/Intrinsic.h>
+#include <math.h> /* for log2 */
+
+extern XtAppContext app;
+
+#define PROGCLASS      "TimeTunnel"
+#define HACK_INIT      init_tunnel
+#define HACK_DRAW      draw_tunnel
+#define HACK_RESHAPE   reshape_tunnel
+#define HACK_HANDLE_EVENT tunnel_handle_event
+#define EVENT_MASK      PointerMotionMask
+#define sws_opts       xlockmore_opts
+
+#define DEF_START      "0.00"
+#define DEF_DILATE     "1.00"
+#define DEF_END                "27.79"
+#define DEF_LOCKLOGO   "False"
+#define DEF_TUNONLY    "False"
+#define DEF_REVERSE    "False"
+#define DEF_FOG                "True"
+#define DEF_TEXTURE     "True"
+#define MAX_TEXTURE 10
+#define CYL_LEN                14.0
+#define DIAMOND_LEN    10.0
+
+#define DEFAULTS       "*delay:        30000       \n" \
+                       "*count:        30          \n" \
+                       "*showFPS:      False       \n" \
+                       "*timeStart:     0.0       \n" \
+                       "*timeEnd:       27.79       \n" \
+                       "*wireframe:    False       \n" \
+
+
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#include "xlockmore.h"
+#include "colors.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <ctype.h>
+#include <sys/time.h> /* for time based animations */
+
+static float start, end, dilate;
+static Bool do_texture, tunonly, wire, reverse, do_fog;
+#ifdef GET_SUED_BY_THE_BBC
+static Bool locklogo;
+#endif
+
+static XrmOptionDescRec opts[] = {
+  {"-texture"  , ".texture",   XrmoptionNoArg, "true" },
+  {"-start"    , ".start",     XrmoptionSepArg, 0 },
+  {"-end"      , ".end",       XrmoptionSepArg, 0 },
+  {"-dilate"   , ".dilate",   XrmoptionSepArg, 0 },
+#ifdef GET_SUED_BY_THE_BBC
+  {"-locklogo" , ".locklogo",  XrmoptionNoArg, "true" },
+#endif
+  {"-tunonly"  , ".tunonly",   XrmoptionNoArg, "true" },
+  {"-reverse"  , ".reverse",   XrmoptionNoArg, "true" },
+  {"-fog"      , ".fog",       XrmoptionNoArg, "false" },
+};
+
+static argtype vars[] = {
+  {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+  {&start, "start", "Start", DEF_START, t_Float},
+  {&end,     "end",   "End", DEF_END  , t_Float},
+  {&dilate,     "dilate",   "Dilate", DEF_DILATE  , t_Float},
+#ifdef GET_SUED_BY_THE_BBC
+  {&locklogo,     "locklogo",   "LockLogo", DEF_LOCKLOGO  , t_Bool},
+#endif
+  {&tunonly,     "tunonly",   "TunnelOnly", DEF_TUNONLY  , t_Bool},
+  {&reverse,     "reverse",   "Reverse", DEF_REVERSE  , t_Bool},
+  {&do_fog,     "fog",   "Fog", DEF_FOG  , t_Bool},
+};
+
+ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
+#include "xpm-ximage.h"
+#include "../../utils/images/logo-180.xpm"
+#include "../images/tunnelstar.xpm"
+#include "../images/timetunnel0.xpm"
+#include "../images/timetunnel1.xpm"
+#include "../images/timetunnel2.xpm"
+#ifdef GET_SUED_BY_THE_BBC
+# include "../images/tardis.xpm"
+# include "../images/whologo.xpm"
+# include "../images/whohead1.xpm"
+/* #include "../images/whohead_psy.xpm" */
+# endif /* GET_SUED_BY_THE_BBC */
+
+
+#ifdef USE_GL /* whole file */
+
+#include <GL/glu.h>
+
+/* ANIMATION CONTROLS */
+/* an effect is a collection of floating point variables that vary with time.
+A knot is a timestamp with an array of floats.  State is the current values of the floats.
+State is set by linearly interpolating between knots */
+typedef struct {
+       float *knots, *state;
+       int numknots, knotwidth;
+       float direction;
+} effect_t;
+
+typedef struct {
+  GLXContext *glx_context;
+  rotator *rot;
+  trackball_state *trackball;
+  Bool button_down_p;
+
+  int time_oldusec, time_oldsec;
+
+  int num_texshifts; /* animates tunnels. Not an effect. */
+  GLfloat pos, *texshift;
+
+  GLuint texture_binds[MAX_TEXTURE], cyllist, diamondlist;
+
+  float effect_time, effect_maxsecs; /* global time controls */
+  float start_time, end_time;
+
+  int num_effects;
+  effect_t *effects; /* array of all effects */
+
+} tunnel_configuration;
+
+static tunnel_configuration *tconf = NULL;
+
+/* allocate memory and populate effect with knot data */
+void init_effect(effect_t *e, int numk, int kwidth, 
+       float dir, float *data ) {
+       int i, j;
+
+       e->numknots = numk;     
+       e->knotwidth = kwidth;  
+       e->direction = dir;
+       e->knots = calloc(numk * kwidth, sizeof(float));
+       e->state = calloc(numk, sizeof(float));
+       for ( i = 0 ; i < e->numknots ; i++)
+               for ( j = 0 ; j < e->knotwidth; j++)
+                       e->knots[i * kwidth + j] = data[i * kwidth + j];
+}
+
+/* static knot data. each effect is listed and knot data is hard coded. 
+   Knots are linerally interpolated to yield float values, depending on
+   knot width.  knot format is [time, data, data, data...].
+   Data can be alpha, zvalue, etc. */
+void init_effects(effect_t *e, int effectnum)
+{
+       /* effect 1: wall tunnel. percent closed */
+       float e1d[6][2] = 
+               {{0.0, 0.055}, 
+                {2.77, 0.055}, 
+                {3.07,1.0}, 
+                {8.08, 1.0},
+                {8.08, 0.0}, 
+                {10.0, 0.0}};
+       /* effect 2: tardis. distance and alpha */
+       float e2d[8][3] = 
+       {       {0.0, 0.0 , 0.0}, 
+               {3.44, 0.0 , 0.0},
+               {3.36, 5.4 , 0.0},
+               {4.24, 3.66, 1.0},
+               {6.51, 2.4,  0.94},
+               {8.08, 0.75 , 0.0}, 
+               {8.08, 0.0 , 0.0},
+               {10.0, 0.0, 0.0}};
+       /* effect 3: cylender. alpha  */
+       float e3d[5][2] = 
+               {{0.0, 0.0}, 
+                {6.41, 0.00},
+                {8.08, 1.0}, 
+                {14.81, 1.0},
+                {15.65, 0.0}};
+
+       /* effect 4: fog. color, density,  start, end  */
+       float e4d[9][5] = 
+               {{0.0 , 1.0, 0.45, 3.0, 15.0},
+                {6.40, 1.0, 0.45, 3.0, 14.0},
+                {8.08, 1.0, 0.95, 1.0, 14.0},
+                {15.17, 1.0, 0.95, 1.0, 6.0},
+                {15.51, 1.0, 0.95, 3.0, 8.0},
+                {23.35, 1.0, 0.95, 3.0, 8.0},
+                {24.02, 0.0, 0.95, 2.3, 5.0},
+                {26.02, 0.0, 0.95, 2.3, 5.0},
+                {27.72, 0.0, 1.00, 0.3, 0.9}
+                };
+
+       /* effect 5: logo. dist, alpha  */
+       float e5d[7][3] = 
+               {{0.0, 0.0, 0.0}, 
+               {16.52, 0.00, 0.0}, 
+               {16.52, 0.80, 0.01}, 
+               {17.18, 1.15, 1.0}, 
+               {22.36, 5.3, 1.0}, 
+               {22.69, 5.7, 0.0},
+               {22.69, 0.0, 0.0}
+               };
+       /* effect 6: diamond tunnel. alpha */
+       float e6d[3][2] = 
+               {{0.0, 0.00}, 
+               {15.17, 0.00},
+               {15.51,1.0}};
+
+       /* effect 7: tardis cap draw . positive draws cap*/
+       float e7d[3][2] = 
+               {{0.0, -1.00}, 
+               {4.24, -1.00},
+               {4.24, 1.00}};
+
+       /* effect 8: star/asterisk: alpha */
+       float e8d[5][2] = 
+               {{0.0,    .00}, 
+               {10.77,   .00},
+               {11.48,  1.00},
+               {15.35,  1.00},
+               {16.12,  0.00}};
+
+       /* effect 9: whohead 1  alpha */
+       float e9d[5][2] = 
+               {{0.0,    .00}, 
+               {13.35,   .00},
+               {14.48,  1.00},
+               {15.17,  1.00},
+               {15.97,  0.00}};
+               /* {14.87,  1.00},
+               {15.17,  0.00}}; */
+
+       /* effect 10: whohead-brite  alpha */
+       float e10d[5][2] = 
+               {{0.0,    .00}, 
+               {11.34,   .00},
+               {12.34,   .20},
+               {13.35,  0.60},
+               {14.48,  0.00}}; 
+               /* {13.95,  0.00}}; */
+
+       /* effect 11: whohead-psy  alpha */
+       float e11d[5][2] = 
+               {{0.0,    .00}, 
+               {14.87,   .00},
+               {15.17,  1.00},
+               {15.91,  0.00},
+               {16.12,  0.00}};
+
+       /* effect 12: whohead-silhouette pos-z,  alpha */
+       float e12d[6][3] = 
+               {{0.0,   1.0,  .00}, 
+               {15.07,  1.0, 0.00},
+               {15.07,  1.0, 1.00},
+               {16.01,  1.0, 1.00},
+               {16.78,  0.5, 1.00},
+               {16.78,  0.1, 0.00} };
+
+       /* effect 1: wall tunnel */
+       if (effectnum == 1)
+               init_effect(e, 6, 2,  -0.2, (float *) e1d);
+
+       /* effect 2: tardisl */
+       if (effectnum == 2)
+               init_effect(e, 8, 3, 1.0,  (float *) e2d);
+
+       /* effect 3: cylender tunnel  */
+       if (effectnum == 3)
+               init_effect(e, 5, 2, 0.889  ,  (float *) e3d);
+
+       /* effect 4: fog color */
+       if (effectnum == 4)
+               init_effect(e, 9, 5, 1.0,  (float *) e4d);
+       /* effect 5: logo distance, alpha*/
+       if (effectnum == 5)
+               init_effect(e, 7, 3, 1.0,  (float *) e5d);
+       /* effect 6: diamond tunnel, alpha*/
+       if (effectnum == 6)
+               init_effect(e, 3, 2, 0.24 ,  (float *) e6d);
+
+       /* effect 7: cap wall tunnel*/
+       if (effectnum == 7)
+               init_effect(e, 3, 2, 1.0,  (float *) e7d);
+
+       /* effect 8: asterisk */
+       if (effectnum == 8)
+               init_effect(e, 5, 2, 1.0,  (float *) e8d);
+
+       /* effect 9, 10, 11, 12: whoheads */
+       if (effectnum == 9 )
+               init_effect(e, 5, 2, 1.0,  (float *) e9d);
+       if (effectnum == 10 )
+               init_effect(e, 5, 2, 1.0,  (float *) e10d);
+       if (effectnum == 11 )
+               init_effect(e, 5, 2, 1.0,  (float *) e11d);
+       if (effectnum == 12 )
+               init_effect(e, 6, 3, 1.0,  (float *) e12d);
+}
+
+
+/* set fog parameters, controlled by effect */
+void update_fog(float color, float density, float start, float end) {
+               GLfloat col[4];
+       
+               col[0] = col[1] = col[2] = color;
+               col[3] = 1.0;
+
+               glFogi(GL_FOG_MODE, GL_LINEAR);
+               glFogfv(GL_FOG_COLOR, col);
+               glFogf(GL_FOG_DENSITY, density);
+               glFogf(GL_FOG_START, start);
+               glFogf(GL_FOG_END, end);
+}
+
+/* set effect's floating point data values by linearally interpolating
+between two knots whose times bound the current time: eff_time */
+
+void update_knots(effect_t *e, float eff_time) {
+       int i, j;
+       float timedelta, lowknot, highknot, *curknot, *nextknot;
+
+       for ( i = 0 ; i < e->numknots ; i++)
+               if (e->knots[i * e->knotwidth] <= eff_time) {
+                       if ( i < e->numknots - 1) 
+                               nextknot = e->knots + (i + 1) * e->knotwidth;
+                       else
+                               /*repeat last knot to carry knot data forward*/
+                               nextknot = e->knots + (i) * e->knotwidth;
+                       curknot = e->knots + i * e->knotwidth;
+                       if (*nextknot - *curknot <= 0.0) timedelta = 1.0;
+                       else
+                               timedelta = (eff_time-*curknot)/(*nextknot-*curknot);
+                       if (timedelta > 1.0) timedelta = 1.0;
+                       for (j = 1 ; j < e->knotwidth ; j++) {
+                               highknot = (float) *(nextknot + j);
+                               lowknot  = (float) *(curknot  + j);
+                               e->state[j - 1 ] = lowknot+(highknot-lowknot)*timedelta;
+                       }
+               }
+       
+}
+
+
+/* Window management, etc
+ */
+void
+reshape_tunnel (ModeInfo *mi, int width, int height)
+{
+  GLfloat h = (GLfloat) height / (GLfloat) width;
+
+  glViewport (0, 0, (GLint) width, (GLint) height);
+
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  gluPerspective (90.0, 1/h, 0.2, 50.0); 
+
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+  gluLookAt( 0.0, 0.0, 0.3,
+             0.0, 0.0, 1.0,
+             0.0, 1.0, 0.0);
+
+  glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+
+
+Bool
+tunnel_handle_event (ModeInfo *mi, XEvent *event)
+{
+  tunnel_configuration *tc = &tconf[MI_SCREEN(mi)];
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button == Button1)
+    {
+      tc->button_down_p = True;
+      gltrackball_start (tc->trackball,
+                         event->xbutton.x, event->xbutton.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+  else if (event->xany.type == ButtonRelease &&
+           event->xbutton.button == Button1)
+    {
+      tc->button_down_p = False;
+      return True;
+    }
+  else if (event->xany.type == ButtonPress &&
+           (event->xbutton.button == Button4 ||
+            event->xbutton.button == Button5))
+    {
+      gltrackball_mousewheel (tc->trackball, event->xbutton.button, 10,
+                              !!event->xbutton.state);
+      return True;
+    }
+  else if (event->xany.type == MotionNotify &&
+           tc->button_down_p)
+    {
+      gltrackball_track (tc->trackball,
+                         event->xmotion.x, event->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+
+  return False;
+}
+
+void setTexParams(void)
+{
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+}
+
+void update_animation(tunnel_configuration *tc) {
+
+       /* time based, of course*/
+       /* shift texture based on elapsed time since previous call*/
+       static struct timeval tv;
+       static struct timezone tz;
+       static int elapsed_usecs, elapsed_secs, i;
+       float computed_timeshift;
+
+       /* get new animation time */
+       gettimeofday(&tv, &tz);
+       elapsed_secs = tv.tv_sec - tc->time_oldsec;
+       elapsed_usecs = tv.tv_usec - tc->time_oldusec;
+       /* store current time */
+       tc->time_oldsec = tv.tv_sec ;
+       tc->time_oldusec = tv.tv_usec;
+       /* elaped time. computed timeshift is tenths of a second */
+       computed_timeshift = (float) (elapsed_secs * 1000000. + elapsed_usecs)/ 
+                                                     100000.0;
+
+       /* calibrate effect time to lie between start and end times */
+       /* loop if time exceeds end time */
+       if (reverse)
+               tc->effect_time -= computed_timeshift / 10.0 * dilate;
+       else
+               tc->effect_time += computed_timeshift / 10.0 * dilate;
+       if ( tc->effect_time >= tc->end_time)
+               tc->effect_time = tc->start_time;
+       if ( tc->effect_time < tc->start_time)
+               tc->effect_time = tc->end_time;;
+
+       /* move texture shifters in effect's direction, e.g. tardis
+          tunnel moves backward, effect 1's direction */
+        if (reverse) { 
+               tc->texshift[0] -= tc->effects[1].direction * computed_timeshift/ 10.0; 
+               tc->texshift[1] -= tc->effects[3].direction * computed_timeshift/ 10.0; 
+               tc->texshift[2] -= tc->effects[6].direction * computed_timeshift/ 10.0; 
+
+       } else {
+               tc->texshift[0] += tc->effects[1].direction * computed_timeshift/ 10.0; 
+               tc->texshift[1] += tc->effects[3].direction * computed_timeshift/ 10.0; 
+               tc->texshift[2] += tc->effects[6].direction * computed_timeshift/ 10.0; 
+       }
+
+       /* loop texture shifters if necessary */
+       for ( i = 0 ; i < tc->num_texshifts; i++) {
+               if (tc->texshift[i] > 1.0)
+                       tc->texshift[i] -= (int) tc->texshift[i];
+               if (tc->texshift[i]< -1.0)
+                       tc->texshift[i] -= (int) tc->texshift[i];
+       }
+
+       /* update effect data with current time. Uses linear interpolation */   
+       for ( i = 1 ; i <= tc->num_effects ; i++)
+               update_knots(&tc->effects[i], tc->effect_time);
+
+} /*update_animation*/
+
+/* draw a textured(tex) quad at a certain depth (z), and certain alpha (alpha), 
+with aspect ratio (aspect), and blending mode (blend_mode) of either adding
+or subtracting.  if alpha is zero or less, nothing happens */
+void draw_sign(ModeInfo *mi, tunnel_configuration *tc, float z,  float alpha, float aspect,
+               GLuint tex, int blend_mode)
+{
+
+       if (alpha > 0.0) {
+               mi->polygon_count ++;
+               /* glEnable(GL_BLEND); */
+               glBlendColor(0.0, 0.0, 0.0, alpha);
+               /*glBlendColor(0.0, 0.0, 0.0, 0.0); */
+               if (blend_mode == 1) {
+                       glBlendFunc(GL_CONSTANT_ALPHA,
+                                   GL_ONE);
+                       glBlendEquation(GL_FUNC_REVERSE_SUBTRACT);
+               } else if (blend_mode == 2) {
+                       glBlendFunc(GL_CONSTANT_ALPHA,
+                                   GL_ONE);
+                       glBlendEquation(GL_FUNC_ADD);
+               } else {
+                       glBlendFunc(GL_CONSTANT_ALPHA,
+                                   GL_ONE_MINUS_CONSTANT_ALPHA);
+                       glBlendEquation(GL_FUNC_ADD);
+               } /* blend mode switch */
+
+#ifdef HAVE_GLBINDTEXTURE
+               if (do_texture)
+                       glBindTexture(GL_TEXTURE_2D, tc->texture_binds[tex]);
+#endif
+               glBegin(GL_QUADS);
+               glTexCoord2f(1.0, 0.0);
+               glVertex3f(-1.0 , -1.0 * aspect , z);
+               glTexCoord2f(1.0, 1.0);
+               glVertex3f(-1.0 , 1.0 * aspect , z);
+               glTexCoord2f(0.0, 1.0);
+               glVertex3f(1.0 , 1.0 * aspect , z);
+               glTexCoord2f(0.0, 0.0);
+               glVertex3f(1.0 , -1.0 * aspect , z); 
+               glEnd();
+               if (blend_mode != 0) {
+                       glBlendFunc(GL_CONSTANT_ALPHA,
+                                   GL_ONE_MINUS_CONSTANT_ALPHA);
+                       glBlendEquation(GL_FUNC_ADD);
+               }
+               /* glDisable(GL_BLEND); */
+
+       }
+} /* draw sign */
+
+
+/* draw a time tunnel.  used for both cylender and diamond tunnels.
+   uses texture shifter (indexed by shiftnum) to simulate motion.
+   tunnel does not move, and is acutally a display list.  if alpha = 0, skip */
+void draw_cyl(ModeInfo *mi, tunnel_configuration *tc, float alpha, int texnum, int listnum, int shiftnum)
+{
+       if (alpha > 0.0) {
+               if (listnum  ==  tc->diamondlist)
+                       mi->polygon_count += 4;
+               if (listnum  ==  tc->cyllist)
+                       mi->polygon_count += 30;
+               glMatrixMode(GL_TEXTURE);
+               glLoadIdentity();
+               glTranslatef(tc->texshift[shiftnum], 0.0, 0.0);
+               glMatrixMode(GL_MODELVIEW);
+               /* glEnable(GL_BLEND); */
+               glBlendColor(0.0, 0.0, 0.0, alpha);
+               glBlendFunc(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA);
+       
+#ifdef HAVE_GLBINDTEXTURE
+               if (do_texture)
+                       glBindTexture(GL_TEXTURE_2D, tc->texture_binds[texnum]);
+#endif
+               glCallList(listnum);
+
+               glMatrixMode(GL_TEXTURE);
+               glLoadIdentity();
+               glMatrixMode(GL_MODELVIEW); 
+               /* glDisable(GL_BLEND); */
+       }
+}
+
+
+/* make tardis type tunnel.  Starts as walls and then
+grows to outline of tardis.  percent is how complete
+tardis outline is.  cap is to draw cap for nice fog effects */
+
+void make_wall_tunnel(ModeInfo *mi, tunnel_configuration *tc, float percent, float cap)
+{
+       /* tardis is about 2x1, so wrap tex around, starting at the base*/
+       /* tex coords are:
+
+ _tl__tr_
+ |      |
+l|      |r
+ |      |
+ -bl__br_  
+       that's br=bottom right, etc. ttr is top-top-right */
+
+       float   half_floor= 0.08333333333333333,
+               full_wall = 0.33333333333333333;
+       float   br1,
+               r0 , r1 ,
+               tr0, tr1,
+               tl0, tl1,
+               l0 , l1 ,
+               bl0, depth=0.3, zdepth=15.0;
+       /* zdepth is how far back tunnel goes */
+       /* depth is tex coord scale.  low number = fast texture shifting */
+
+       float textop, texbot;   
+       float height;
+
+       br1 = half_floor;
+       r0 = br1 ;
+       r1 = r0 + full_wall;
+       tr0 = r1;
+       tr1 = r1 + half_floor;
+       tl0 = tr1;
+       tl1 = tl0 + half_floor;
+       l0 = tr1;
+       l1 = l0 + full_wall;
+       bl0 = l1;
+
+       glMatrixMode(GL_TEXTURE);
+       glLoadIdentity();
+       glRotatef(90.0, 0.0, 0.0, 1.0);
+       glTranslatef(tc->texshift[0], 0.0, 0.0);
+       glMatrixMode(GL_MODELVIEW);
+
+#ifdef HAVE_GLBINDTEXTURE
+       if (do_texture)
+               glBindTexture(GL_TEXTURE_2D, tc->texture_binds[0]);
+#endif
+       glColor3f(1.0, 1.0, 0.0);
+       if (cap > 0.0 && percent > 0.0 && ! tunonly && do_fog) {
+               mi->polygon_count += 6;
+               glBegin(GL_TRIANGLE_FAN);
+               glVertex3f(0.0, 0.0, zdepth);
+               glVertex3f(-1.0, -2.0, zdepth);
+               glVertex3f(1.0, -2.0, zdepth);
+               glVertex3f(1.0, 2.0, zdepth);
+               glVertex3f(0.2, 2.0, zdepth);
+               glVertex3f(0.2, 2.2, zdepth);
+               glVertex3f(-0.2, 2.2, zdepth);
+               glVertex3f(-0.2, 2.0, zdepth);
+               glVertex3f(-1.0, 2.0, zdepth);
+               glVertex3f(-1.0, -2.0, zdepth);
+               glEnd();
+       }
+       if (percent > ( full_wall * 2.0)) {
+               glBegin(GL_QUADS);
+
+               height = (percent  - full_wall * 2.0) /( 1.0 - full_wall * 2.0);
+               if (height > 1.0) height = 1.0;
+
+
+               if ( height > 0.8) {
+                       mi->polygon_count += 2;
+                       if ( height > 0.90) {
+                               mi->polygon_count += 2;
+                               /* TTTR */
+                               texbot = tr0;
+                               textop = tr0 + half_floor * height;
+                               glTexCoord2f(0.0, texbot);
+                               glVertex3f(0.2, 2.2, 0.0);
+               
+                               glTexCoord2f(0.0, textop);
+                               glVertex3f(2.0 - height * 2.0, 2.2, 0.0);
+               
+                               glTexCoord2f(depth, textop);
+                               glVertex3f(2.0 - height * 2.0, 2.2, zdepth);
+       
+                               glTexCoord2f(depth, texbot);
+                               glVertex3f(0.2, 2.2, zdepth);
+       
+                               /* TTTL */
+                               texbot = tl1 - half_floor * height;
+                               textop = tl1;
+                               glTexCoord2f(0.0, texbot);
+                               glVertex3f(-2.0 + height * 2.0, 2.2, 0.0);
+               
+                               glTexCoord2f(0.0, textop);
+                               glVertex3f(-0.2, 2.2, 0.0);
+               
+                               glTexCoord2f(depth, textop);
+                               glVertex3f(-0.2, 2.2, zdepth);
+               
+                               glTexCoord2f(depth, texbot);
+                               glVertex3f(-2.0 + height * 2.0, 2.2, zdepth);
+                       }
+                       if (height > 0.90) height = 0.90;
+
+                       /* TTR */
+                       texbot = tr0;
+                       textop = tr0 + half_floor * height;
+                       glTexCoord2f(0.0, texbot);
+                       glVertex3f(0.2, 2.0, 0.0);
+       
+                       glTexCoord2f(0.0, textop);
+                       glVertex3f(0.2, 0.4 + height * 2.0, 0.0);
+       
+                       glTexCoord2f(depth, textop);
+                       glVertex3f(0.2, 0.4 + height * 2.0, zdepth);
+       
+                       glTexCoord2f(depth, texbot);
+                       glVertex3f(0.2, 2.0, zdepth);
+
+                       /* TTL */
+                       texbot = tl1 - half_floor * height;
+                       textop = tl1;
+                       glTexCoord2f(0.0, texbot);
+                       /*glVertex3f(-.2, 2.0 + (0.9 - height) * 2.0, 0.0); */
+                       glVertex3f(-.2,  0.4 + height * 2.0, 0.0);
+       
+                       glTexCoord2f(0.0, textop);
+                       glVertex3f(-.2, 2.0, 0.0);
+       
+                       glTexCoord2f(depth, textop);
+                       glVertex3f(-.2, 2.0, zdepth);
+       
+                       glTexCoord2f(depth, texbot);
+                       glVertex3f(-.2, 0.4 + height * 2.0, zdepth);
+               }
+       
+               height = (percent  - full_wall * 2.0) /( 1.0 - full_wall * 2.0);
+               if (height > 0.8) height = 0.8;
+
+
+               mi->polygon_count += 2;
+               /* TR */
+               texbot = tr0;
+               textop = tr0 + half_floor * height;
+               glTexCoord2f(0.0, texbot);
+               glVertex3f(1.0, 2.0, 0.0);
+
+               glTexCoord2f(0.0, textop);
+               glVertex3f(1.0 - height, 2.0, 0.0);
+
+               glTexCoord2f(depth, textop);
+               glVertex3f(1.0 - height, 2.0, zdepth);
+
+               glTexCoord2f(depth, texbot);
+               glVertex3f(1.0, 2.0, zdepth);
+
+               /* TL */
+               texbot = tl1 - half_floor * height;
+               textop = tl1;
+               glTexCoord2f(0.0, texbot);
+               glVertex3f(-1.0 + height, 2.0, 0.0);
+
+               glTexCoord2f(0.0, textop);
+               glVertex3f(-1.0, 2.0, 0.0);
+
+               glTexCoord2f(depth, textop);
+               glVertex3f(-1.0, 2.0, zdepth);
+
+               glTexCoord2f(depth, texbot);
+               glVertex3f(-1.0 + height, 2.0, zdepth);
+
+               height = (percent  - full_wall * 2.0) /( 1.0 - full_wall * 2.0);
+
+               if (height > 1.0) height = 1.0;
+
+
+               mi->polygon_count += 2;
+               /* BR */
+               texbot = tr0;
+               textop = tr0 + half_floor * height;
+               glTexCoord2f(0.0, texbot);
+               glVertex3f(1.0, -2.0, 0.0);
+
+               glTexCoord2f(0.0, textop);
+               glVertex3f(1.0 - height, -2.0, 0.0);
+
+               glTexCoord2f(depth, textop);
+               glVertex3f(1.0 - height, -2.0, zdepth);
+
+               glTexCoord2f(depth, texbot);
+               glVertex3f(1.0, -2.0, zdepth);
+
+               /* BL */
+               texbot = tl1 - half_floor * height;
+               textop = tl1;
+               glTexCoord2f(0.0, texbot);
+               glVertex3f(-1.0 + height, -2.0, 0.0);
+
+               glTexCoord2f(0.0, textop);
+               glVertex3f(-1.0, -2.0, 0.0);
+
+               glTexCoord2f(depth, textop);
+               glVertex3f(-1.0, -2.0, zdepth);
+
+               glTexCoord2f(depth, texbot);
+               glVertex3f(-1.0 + height, -2.0, zdepth);
+
+               
+               glEnd();
+       }
+       
+       if (percent > 0.0) {
+               mi->polygon_count += 2;
+               glBegin(GL_QUADS);
+               height = percent / ( full_wall * 2.0);
+               if (height > 1.0) height = 1.0;
+               textop = (l0 + l1) / 2.0 - full_wall * 0.5 * height;
+               texbot = (l0 + l1) / 2.0 + full_wall * 0.5 * height;
+
+               glTexCoord2f(0.0, textop);
+               glVertex3f(-1.0, height * 2, 0.0);
+
+               glTexCoord2f(0.0, texbot);
+               glVertex3f(-1.0, -height * 2, 0.0);
+
+               glTexCoord2f(depth, texbot);
+               glVertex3f(-1.0, -height * 2, zdepth);
+
+               glTexCoord2f(depth, textop);
+               glVertex3f(-1.0, height * 2, zdepth);
+
+               textop = (r0 + r1) / 2.0 - full_wall * 0.5 * height;
+               texbot = (r0 + r1) / 2.0 + full_wall * 0.5 * height;
+
+               glTexCoord2f(0.0, texbot);
+               glVertex3f(1.0, height * 2, 0.0);
+
+               glTexCoord2f(0.0, textop);
+               glVertex3f(1.0, -height * 2, 0.0);
+
+               glTexCoord2f(depth, textop);
+               glVertex3f(1.0, -height * 2, zdepth);
+
+               glTexCoord2f(depth, texbot);
+               glVertex3f(1.0, height * 2, zdepth);
+               glEnd();
+       }
+
+
+       glMatrixMode(GL_TEXTURE);
+       glLoadIdentity();
+       glMatrixMode(GL_MODELVIEW);
+} /* make_wall_tunnel */
+
+/* wraps an int to between min and max.
+   Kind of like the remainder when devided by (max - min).
+   Used to create torus mapping on square array */
+int wrapVal(int val, int min, int max)
+{
+       int ret;
+
+       ret = val;
+       if (val >= max)
+               ret = min + (val - max ) % (max - min);
+       if (val < min)
+               ret = max - (min - val) % (max - min);
+       return(ret);
+}
+
+/*=================== Load Texture =========================================*/
+/* ripped from atunnel.c,  Copyright (c) E. Lassauge, 2003-2004. */
+/* modified like so by Sean Brennan:
+  take texture object for glbind
+  removed xlock stuff
+  Added filters:
+    blur color / alpha channel [3x3 box filter, done [blur] times
+    anegative : create b/w image from zero alpha. zero alpha gets bw_color,
+               nonzero alpha gets 1.0 - bwcolor, then alpha flipped to 1-alpha.
+
+*/
+
+float mylog2(float x) { return ( log(x) / log(2));}
+
+static void LoadTexture(ModeInfo * mi, char **fn, unsigned int texbind, int blur, float bw_color, Bool anegative, Bool onealpha)
+{
+       /* looping and temporary array index variables */
+       int ix, iy, bx, by, indx, indy, boxsize, cchan, tmpidx, dtaidx;
+
+       float boxdiv, tmpfa, blursum ;
+       unsigned char *tmpbuf, tmpa;
+       Bool rescale;
+
+
+        XImage *teximage;    /* Texture data */
+
+       rescale = FALSE;
+
+       boxsize = 2;
+       boxdiv = 1.0 / ( boxsize * 2.0 + 1.0) / ( boxsize * 2.0 + 1.0);
+
+        if ((teximage = xpm_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi),
+                         MI_COLORMAP(mi), fn)) == None) {
+            fprintf(stderr, "%s: error reading the texture.\n", progname);
+            glDeleteTextures(1, &texbind);
+            do_texture = False;
+            exit(0);
+        }
+
+       /* check if image is 2^kumquat, where kumquat is an integer between 1 and 10. Recale to
+          nearest power of 2. */
+       tmpfa = mylog2((float) teximage->width);
+       bx = 2 << (int) (tmpfa -1);
+       if (bx != teximage->width) {
+               rescale = TRUE;
+               if ((tmpfa - (int) tmpfa) >  0.5849)
+                       bx = bx * 2;
+       }
+       tmpfa = mylog2((float) teximage->height);
+       by = 2 << (int) (tmpfa - 1);
+       if (by != teximage->height) {
+               rescale = TRUE;
+               if ((tmpfa - (int) tmpfa) >  0.5849)
+                       by = by * 2;
+       }
+
+       if (rescale) {
+               tmpbuf = calloc(bx * by * 4, sizeof(unsigned char));
+               if (gluScaleImage(GL_RGBA, teximage->width, teximage->height, GL_UNSIGNED_BYTE, teximage->data,
+                               bx, by, GL_UNSIGNED_BYTE, tmpbuf))
+                       check_gl_error("scale image");
+               
+               free(teximage->data);
+               teximage->data = (char *) tmpbuf;
+               teximage->width = bx;
+               teximage->height= by;
+       }
+       /* end rescale code */
+               
+       if (anegative ) {
+               for (ix = 0 ; ix < teximage->height * teximage->width; ix++)
+                       {
+                               if (!teximage->data[ ix * 4 + 3]) {
+                                       teximage->data[ ix * 4 + 3]  = (unsigned char) 0xff;
+                                       tmpa = (unsigned char) (bw_color * 0xff);
+                               } else  {
+                                       if (onealpha)
+                                               teximage->data[ ix * 4 + 3]  = (unsigned char) 0xff;
+                                       else
+                                               teximage->data[ ix * 4 + 3]  = (unsigned char)  0xff - 
+                                                               teximage->data[ ix * 4 + 3];
+                                       tmpa = (unsigned char) ((1.0 - bw_color) * 0xff);
+                               }
+                               /* make texture uniform b/w color */
+                               teximage->data[ ix * 4 + 0]  =
+                                       (unsigned char) ( tmpa);
+                               teximage->data[ ix * 4 + 1]  =
+                                       (unsigned char) ( tmpa);
+                               teximage->data[ ix * 4 + 2]  =
+                                       (unsigned char) ( tmpa);
+                               /* negate alpha */
+                       }
+       }
+               
+       if (blur > 0) {
+               if (! anegative ) /* anegative alread b/w's the whole image */
+                       for (ix = 0 ; ix < teximage->height * teximage->width; ix++)
+                               if (!teximage->data[ ix * 4 + 3])
+                               {
+                                       teximage->data[ ix * 4 + 0]  =
+                                               (unsigned char) ( 255.0 * bw_color);
+                                       teximage->data[ ix * 4 + 1]  =
+                                               (unsigned char) ( 255.0 * bw_color);
+                                       teximage->data[ ix * 4 + 2]  =
+                                               (unsigned char) ( 255.0 * bw_color);
+                               }
+               ;
+               tmpbuf = calloc(teximage->height * teximage->width * 4, sizeof(unsigned char)  )        ;
+               while (blur--) {
+                       /* zero out tmp alpha buffer */
+                       for (iy = 0 ; iy <teximage->height * teximage->width * 4 ; iy++)
+                               tmpbuf[iy] = 0;
+                       for (cchan = 0; cchan < 4 ; cchan++) {
+                               for (iy = 0 ; iy < teximage->height ; iy++) {
+                                       for (ix = 0 ; ix < teximage->width ; ix++) {
+                                               dtaidx = (teximage->width * iy + ix) * 4;
+                                               tmpa =  teximage->data[dtaidx + cchan];
+                                               tmpfa = (float) tmpa * boxdiv;
+                                               /* box filter */
+                                               blursum = 0.0;
+                                               for (by = -boxsize ; by <= boxsize; by++) {
+                                                       for (bx = -boxsize ; bx <= boxsize; bx++) {
+                                                               indx = wrapVal(ix + bx, 0, teximage->width);
+                                                               indy = wrapVal(iy + by, 0, teximage->height);
+                                                               tmpidx = (teximage->width * indy + indx) * 4;
+                                                               blursum = tmpfa;
+                                                               tmpbuf[tmpidx + cchan] += (unsigned char) blursum;
+                                                       } /* for bx */
+                                               } /* for by  */
+                                       } /* for ix  */
+                               } /* for iy */
+                       } /* for cchan */
+                       /* copy back buffer */
+                       for (ix = 0 ; ix < teximage->height * teximage->width * 4; ix++)
+                               teximage->data[ix] = tmpbuf[ix];
+               } /*while blur */
+               free(tmpbuf); /*tidy*/
+       } /* if blur */
+
+                       
+       
+
+        clear_gl_error();
+#ifdef HAVE_GLBINDTEXTURE
+        glBindTexture(GL_TEXTURE_2D, texbind);
+#endif
+        glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, teximage->width, teximage->height,
+                        0, GL_RGBA, GL_UNSIGNED_BYTE, teximage->data);
+        check_gl_error("texture");
+       setTexParams(); 
+        XDestroyImage(teximage);
+}
+
+/* creates cylender for time tunnel. sides, zmin, zmax, rad(ius) obvious.
+   stretch scales texture coords; makes tunnel go slower the larger it is.
+   not drawn, but put into display list. */
+void makecyl(int sides, float zmin, float zmax, float rad, float stretch) {
+       int i;
+       float theta;
+
+       /* cap */
+       if (do_fog) {
+               glBegin(GL_TRIANGLE_FAN);
+               glTexCoord2f(1.0, 0.0);
+               glVertex3f(0.0 , 0.0 , zmax); 
+               for (i = 0 ; i <= sides; i++) {  
+                       theta = 2.0 * M_PI * ((float) i / (float) sides);
+                       glVertex3f(cos(theta) * rad, sin(theta) * rad, zmax);
+               }
+               glVertex3f(cos(0.0) * rad, sin(0.0) * rad, zmax);
+               glEnd(); 
+       }
+       
+       glBegin(GL_QUAD_STRIP);
+       for (i = 0 ; i <= sides; i++)
+       {
+               if ( i != sides) {
+                       theta = 2.0 * M_PI * ((float) i / (float) sides);
+                       glTexCoord2f(0.0, 1.0 * (float) i / (float) sides); 
+                       glVertex3f(cos(theta) * rad, sin(theta) * rad, zmin);
+                       glTexCoord2f(stretch, 1.0 * (float) i / (float) sides); 
+                       glVertex3f(cos(theta) * rad, sin(theta) * rad, zmax);
+               } else {
+                       theta = 0.0;
+                       glTexCoord2f(0.0, 1.0);
+                       glVertex3f(cos(theta) * rad, sin(theta) * rad, zmin);
+                       glTexCoord2f(stretch, 1.0);
+                       glVertex3f(cos(theta) * rad, sin(theta) * rad, zmax);
+               }
+       }
+       glEnd();
+}
+
+void 
+init_tunnel (ModeInfo *mi)
+{
+  int i;
+
+  tunnel_configuration *tc;
+  
+  wire = MI_IS_WIREFRAME(mi);
+
+  if (!tconf) {
+    tconf = (tunnel_configuration *)
+      calloc (MI_NUM_SCREENS(mi), sizeof (tunnel_configuration));
+    if (!tconf) {
+      fprintf(stderr, "%s: out of memory\n", progname);
+      exit(1);
+    }
+
+    tc = &tconf[MI_SCREEN(mi)];
+  }
+
+  tc = &tconf[MI_SCREEN(mi)];
+
+  tc->glx_context = init_GL(mi);
+
+  tc->cyllist = glGenLists(1);
+  tc->diamondlist = glGenLists(1);
+  tc->num_effects = 12;
+  tc->num_texshifts = 3;
+  tc->effect_time = 0.0;
+  tc->effect_maxsecs = 30.00;
+  /* check bounds on cmd line opts */
+  if (start > tc->effect_maxsecs) start = tc->effect_maxsecs;
+  if (end > tc->effect_maxsecs) end = tc->effect_maxsecs;
+  if (start < tc->effect_time) start = tc->effect_time;
+  if (end < tc->effect_time) end = tc->effect_time;
+
+  /* set loop times, in seconds */
+  tc->start_time = start;
+  tc->end_time = end;
+
+  /* reset animation knots, effect 0 not defined. */
+  tc->effects = malloc(sizeof(effect_t) * ( tc->num_effects + 1));
+  for ( i = 1; i <= tc->num_effects ; i++)
+       init_effects(&tc->effects[i], i);
+
+  if (wire) {
+       glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+       do_texture = FALSE;
+  }
+
+  if (do_texture)
+  {
+          glGenTextures(MAX_TEXTURE, tc->texture_binds);
+         
+         /*LoadTexture(*mi, **fn, texbind, bluralpha, bw_color,  anegative, onealpha)*/
+          LoadTexture(mi, timetunnel0_xpm, tc->texture_binds[0], 0, 0.0, FALSE, FALSE);
+          LoadTexture(mi, timetunnel1_xpm, tc->texture_binds[2], 0, 0.0, FALSE, FALSE);
+          LoadTexture(mi, timetunnel2_xpm, tc->texture_binds[5], 0, 0.0, FALSE, FALSE);
+          LoadTexture(mi, tunnelstar_xpm, tc->texture_binds[4], 0, 0.0, FALSE, FALSE);
+# ifdef GET_SUED_BY_THE_BBC
+         if (locklogo) {
+# endif /* GET_SUED_BY_THE_BBC */
+               LoadTexture(mi, (char **) logo_180_xpm, tc->texture_binds[3],  0,0.0, FALSE, FALSE);
+               tc->texture_binds[1] = tc->texture_binds[3];
+               tc->texture_binds[6] = tc->texture_binds[3];
+               tc->texture_binds[8] = tc->texture_binds[3];
+               /* negative */
+               LoadTexture(mi, (char **) logo_180_xpm, tc->texture_binds[9],  2,1.0, TRUE, TRUE);
+# ifdef GET_SUED_BY_THE_BBC
+        } else {
+               LoadTexture(mi, whologo_xpm, tc->texture_binds[3],  0,0.0, FALSE, FALSE);
+               LoadTexture(mi, tardis_xpm, tc->texture_binds[1], 0, 0.0 ,FALSE, FALSE);
+               LoadTexture(mi, whohead1_xpm, tc->texture_binds[6], 0, 1.0, FALSE, FALSE);
+               /* LoadTexture(mi, whohead_psy_xpm, tc->texture_binds[8], 1, 0.7, FALSE, FALSE); */
+               /* negative */
+               LoadTexture(mi, whohead1_xpm, tc->texture_binds[9], 2, 1.0, TRUE, TRUE);
+         }
+# endif /* GET_SUED_BY_THE_BBC */
+          glEnable(GL_TEXTURE_2D);
+         check_gl_error("tex");
+  }
+
+  reshape_tunnel (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+  glDisable(GL_DEPTH_TEST);  /* who needs it? ;-) */
+
+  if (do_fog)
+       glEnable(GL_FOG);
+
+  if (!wire)
+    {
+      glEnable(GL_ALPHA_TEST);
+      glAlphaFunc(GL_GREATER, 0.5);
+    }
+
+    tc->trackball = gltrackball_init ();
+
+
+  tc->texshift = calloc(tc->num_texshifts, sizeof(GLfloat));
+  for ( i = 0 ; i < tc->num_texshifts; i++)
+       tc->texshift[i] = 0.0;
+
+  glNewList(tc->cyllist, GL_COMPILE);
+  makecyl(30, -0.1, CYL_LEN, 1., 10. / 40.0 * CYL_LEN);  
+  /*makecyl(30, -0.5, DIAMOND_LEN, 1., 4. / 40 * DIAMOND_LEN); */
+  glEndList();
+
+  glNewList(tc->diamondlist, GL_COMPILE);
+  makecyl(4, -0.5, DIAMOND_LEN, 1., 4. / 40 * DIAMOND_LEN);
+  glEndList();
+}
+
+
+void
+draw_tunnel (ModeInfo *mi)
+{
+  tunnel_configuration *tc = &tconf[MI_SCREEN(mi)];
+  Display *dpy = MI_DISPLAY(mi);
+  Window window = MI_WINDOW(mi);
+
+
+  if (!tc->glx_context)
+    return;
+
+  glShadeModel(GL_SMOOTH);
+
+  glEnable(GL_NORMALIZE);
+  /* glEnable(GL_CULL_FACE); */
+
+  glClear(GL_COLOR_BUFFER_BIT );
+
+  update_animation(tc);
+
+
+  glPushMatrix ();
+
+       glRotatef(180., 0., 1., 0.);
+    gltrackball_rotate (tc->trackball);
+       glRotatef(180., 0., 1., 0.);
+
+
+
+  mi->polygon_count = 0;
+
+  update_fog(tc->effects[4].state[0],  /*color*/
+            tc->effects[4].state[1],  /*density*/
+            tc->effects[4].state[2],  /*start*/
+            tc->effects[4].state[3]); /*end*/
+
+  /* --- begin composite image assembly --- */
+
+  /* head mask and draw diamond tunnel */
+
+  glEnable(GL_BLEND);
+  draw_cyl(mi, tc, tc->effects[6].state[0], 5, tc->diamondlist, 2); 
+  if (! tunonly)
+       draw_sign(mi, tc,tc->effects[12].state[0], tc->effects[12].state[1],  1.0 / 1.33, 9, 1); 
+  glDisable(GL_BLEND);
+  /* then tardis tunnel */
+  make_wall_tunnel(mi, tc, tc->effects[1].state[0], tc->effects[7].state[0]);
+
+  /* then cylender tunnel */
+  glEnable(GL_BLEND);
+  draw_cyl(mi, tc, tc->effects[3].state[0], 2, tc->cyllist, 1); 
+
+       /*void draw_sign(mi, tc,z,alpha,aspect,tex,blendmode)*/
+  /* tardis */
+  if (! tunonly)
+       draw_sign(mi, tc, tc->effects[2].state[0], tc->effects[2].state[1], 2.0, 1, 0);
+  /* logo */
+  if (! tunonly)
+       draw_sign(mi, tc, tc->effects[5].state[0], tc->effects[5].state[1], 1.0, 3, 0);
+  /*who head brite*/
+  if (! tunonly)
+       draw_sign(mi, tc,1.0, tc->effects[10].state[0],  1.0 / 1.33, 6, 2);
+  /*who head psychadelic REMOVED*/
+  /* draw_sign(mi, tc,1.0, tc->effects[11].state[0],  1.0 / 1.33, 8, 0); */
+
+  /* star */
+  /* draw_sign(mi, tc, tc->effects[8].state[0]tc->effects[8].state[0], 1.0 , 1.0, 4, 1); */
+  draw_sign(mi, tc,  tc->effects[8].state[0],  tc->effects[8].state[0],  1.0, 4, 1);
+  /* normal head */
+  if (! tunonly)
+       draw_sign(mi, tc,1.0, tc->effects[9].state[0], 1.0 /  1.33, 6, 0);
+
+  /* --- end composite image assembly --- */
+
+
+  glPopMatrix ();
+
+  if (mi->fps_p) do_fps (mi);
+  glFinish();
+
+  check_gl_error("drawing done, calling swap buffers");
+  glXSwapBuffers(dpy, window);
+}
+
+#endif /* USE_GL */
diff --git a/hacks/glx/timetunnel.man b/hacks/glx/timetunnel.man
new file mode 100644 (file)
index 0000000..76aaeea
--- /dev/null
@@ -0,0 +1,81 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+timetunnel - Plasma tunnels fade in and out
+.SH SYNOPSIS
+.B timetunnel
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-start \fInumber\fP]
+[\-end \fInumber\fP]
+[\-dialate \fInumber\fP]
+[\-tunonly]
+[\-reverse]
+[\-fog]
+[\-no-texture]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Draws an animation similar to the opening and closing effects on the
+Dr. Who television show.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-start \fInumber\fP
+Start time of loop, 0.0 - 30.00. Default 0.0.  May be identical to end time.
+.TP 8
+.B \-end \fInumber\fP
+End time of loop, 0.0 - 30.00. Default 27.79.  May be identical to start time.
+.TP 8
+.B \-dialate \fInumber\fP
+Scale time to speed or slow simulation.  Numbers less than one slow it down.
+.TP 8
+.B \-tunonly
+Show only tunnels, no logos, etc.
+.TP 8
+.B \-reverse
+Play in reverse, including tunnels.
+.TP 8
+.B \-fog
+Turn off fog.
+.TP 8
+.B \-no-texture
+Turn off textures.
+.TP 8
+.B \-wireframe
+Show as wire frame
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2005 by Sean Brennan.  Permission to use, copy, modify, 
+distribute, and sell this software and its documentation for any purpose is 
+hereby granted without fee, provided that the above copyright notice appear 
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Sean Brennan <zettix@yahoo.com>
index 7d67728b117c5bad5b7d73a38d4f885ae528bc59..c32250a4b9d9af6a14b252844674803e716013ad 100644 (file)
 extern char *progname;
 
 
+static Bool
+bigendian (void)
+{
+  union { int i; char c[sizeof(int)]; } u;
+  u.i = 1;
+  return !u.c[0];
+}
+
+
 #if defined(HAVE_GDK_PIXBUF)
 
 # include <gdk-pixbuf/gdk-pixbuf.h>
@@ -86,6 +95,15 @@ xpm_to_ximage_1 (Display *dpy, Visual *visual, Colormap cmap,
 
       image = XCreateImage (dpy, visual, 32, ZPixmap, 0, 0, w, h, 32, 0);
       image->data = (char *) malloc(h * image->bytes_per_line);
+
+      /* Set the bit order in the XImage structure to whatever the
+         local host's native bit order is.
+       */
+      image->bitmap_bit_order =
+        image->byte_order =
+          (bigendian() ? MSBFirst : LSBFirst);
+
+
       if (!image->data)
         {
           fprintf (stderr, "%s: out of memory (%d x %d)\n", progname, w, h);
@@ -165,15 +183,6 @@ xpm_to_ximage_1 (Display *dpy, Visual *visual, Colormap cmap,
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
-#if 0
-static Bool
-bigendian (void)
-{
-  union { int i; char c[sizeof(int)]; } u;
-  u.i = 1;
-  return !u.c[0];
-}
-#endif
 
 
 /* The libxpm version of this function...
@@ -269,6 +278,11 @@ xpm_to_ximage_1 (Display *dpy, Visual *visual, Colormap cmap,
        things as necessary) OpenGL pretends everything is client-side, so
        we need to pack things in the right order for the client machine.
      */
+
+    ximage->bitmap_bit_order =
+      ximage->byte_order =
+        (bigendian() ? MSBFirst : LSBFirst);
+
 #if 0
     /* #### Cherub says that the little-endian case must be taken on MacOSX,
             or else the colors/alpha are the wrong way around.  How can
diff --git a/hacks/images/timetunnel0.xpm b/hacks/images/timetunnel0.xpm
new file mode 100644 (file)
index 0000000..65a6e8b
--- /dev/null
@@ -0,0 +1,343 @@
+/* XPM */
+static char * timetunnel0_xpm[] = {
+"256 256 84 1",
+"      c #5D699C",
+".     c #5A6EC7",
+"+     c #596FD1",
+"@     c #576FD7",
+"#     c #566FDE",
+"$     c #6172B3",
+"%     c #5670E6",
+"&     c #6477BF",
+"*     c #6076D2",
+"=     c #6377C6",
+"-     c #6277CC",
+";     c #5876F6",
+">     c #607AE7",
+",     c #5D7AF0",
+"'     c #627BDE",
+")     c #6982D1",
+"!     c #6582DE",
+"~     c #6882D8",
+"{     c #6D7FDC",
+"]     c #6284FD",
+"^     c #7088D1",
+"/     c #6886F6",
+"(     c #738ACC",
+"_     c #7185EF",
+":     c #6C89EC",
+"<     c #698AF4",
+"[     c #648DFD",
+"}     c #6C8EE7",
+"|     c #748BE7",
+"1     c #738FDE",
+"2     c #6D94FF",
+"3     c #6B9BFD",
+"4     c #7796FA",
+"5     c #709DF5",
+"6     c #7A9EDD",
+"7     c #7C9BEB",
+"8     c #8A99D1",
+"9     c #73A1E8",
+"0     c #8198F6",
+"a     c #8895F3",
+"b     c #819CE6",
+"c     c #7D9DF7",
+"d     c #89A0E3",
+"e     c #78A6FE",
+"f     c #76ACFD",
+"g     c #83AAE9",
+"h     c #72B3FF",
+"i     c #89ABFC",
+"j     c #80B6FD",
+"k     c #92AEF9",
+"l     c #7DBFFE",
+"m     c #8DBCEE",
+"n     c #9BB7EC",
+"o     c #8DBCFA",
+"p     c #9FB4F8",
+"q     c #97B8F9",
+"r     c #7AC7FF",
+"s     c #AEB7EF",
+"t     c #80D5FF",
+"u     c #8DD1FD",
+"v     c #99CCFD",
+"w     c #89DDFF",
+"x     c #B1CAFB",
+"y     c #A8D3FB",
+"z     c #82E6FF",
+"A     c #9AE1FE",
+"B     c #CCCCFA",
+"C     c #B3D9FC",
+"D     c #87F4FF",
+"E     c #93EFFF",
+"F     c #A8EAFE",
+"G     c #B6E6FD",
+"H     c #C5E0FC",
+"I     c #99FDFF",
+"J     c #AEFCFF",
+"K     c #BDF7FF",
+"L     c #E7E9FA",
+"M     c #E4F0FD",
+"N     c #D9F6FF",
+"O     c #C9FFFE",
+"P     c #D7FDF8",
+"Q     c #D5FFFF",
+"R     c #ECFFFE",
+"S     c #FCFFFD",
+";%%;,,,;,,,#,,,,,,/>++#@@#+.+++@+@@+@#++..++.+@+++':|1gAAFAv9e}32<::||01|44cc111e777iikc77ibGSSRRRRRRQOJIIIIIDIEEwwttwwzztj&   ^$     iJEIDDIIIJIIOOIOROJEEJKKOQQMSBqqddb(bb^b1^^^&=~~:!<'{!!!!~|{::<::|{:{'{'''''*'''*''+'*++.'++++@+++@@#@@@@#>@####%%%%,#@###",
+"%##%%%,,,>#>###,//#@+@@@@@@++@++.+#@+@+#+++++++....*}55jAAttvAvomf71}:~~|~!~~)1~))1117c|}c1dHSSSSROOJJJEIDDEztrllhjjrrjjju2=  $)=     GulEEwwEIIIIIJOJJORQJJFKKQNSSBndd(((((((^^&&====~~!{{:<'{!:::::':!{:{:{:''''''''{'''*'@@+++.+*++++@@@#%#>>>##%###%#%#%####",
+"%#%%%%%,##%#,,,/,,#@@++###@++++.+@++@.+@+..+.+++++..*!5ehturrhjlvvvvvvmmoobbb7^^^(((d8d88CHLLSSSNKKFFEEEEDDDztwtrljheeeffj/-  $)&$    AjflEttwzIIIIIJJOJIORRQKKGHLSssd(((^^((^(^&&&&)====~-'*''{<'{<<{!'''~'''<:{'*''''''>''''''>>@@+@@+#@#,;%%#,,%%%%%%%###%#%%",
+"%%%%,%%,%%,,]/,###,##++#@@@+++.+@@++.++++++.....++***-!}5erwljfhfffjhjjjjooommmomyCHNNRRRLLLSSSSSNKFFFFEEEEEwrllhrhhhffjef[-$$$)^$$   j32eEEEzwIEEIIIIIJOQJOPRRMMLSBs8(((^^(&$&$&&&&&=&&===--**_'_'_/_<_'''////__'''_'*'''''''''''>>>@@@####;%;%,>%%%;%%##%%#%%;",
+"%%#%#%%%%,,/#%%#####%@@+@@@@@+.++++++..+.......*.***-!}!:43jrleffe553c5e5b7igovvGKKQQQKCvmnCLSSSSSNFAutAwtwturjjhlfefeee33[-$$&=)$$$ $4342lzEEEIEwtwEIIIIJOQPQRRSSSB88(((^)&$&&&&&&&&=&&&====--*{'{'>>/_'_><'''<<<<<<<<<<<<<[<<_</__/>>#,###,%%,>,%%###%@##%##%%",
+"%#%,,##,,>###%%#######@@#@###@++.+@..++...+......**--!!!:::<elfe3e5335e57cikqqovAAAACmqqqqmCLSSSSSSNFtwtwuAturjjhhfeeefee2/-$$&=1&($ $<::43twwwEwwtutEIIIIIJKQRRSSSB8((((^&&)&&&&&&&&&=&=======-=-**''*'>>,>>>>''>''<:::__//////]]/242[//]>>,>,>,,###@####%##%;;",
+"#,,,/>>##@#####%%########@@##@+@+++.+.........-*****!!!!:_/<<2hh55efefjfeiiivvvvoii7pbbbdgnySSSSSSSSRKAuuuuurlhhfe55e3333[[-$$==1(($$$_{!!:fztzwhhoruAEIJIJJFGGNSSSLd88(((^^&&)&&&&&&&=&&=&====-==--****+@>>@>>_>>___'<<<</__//__>>__2</>,,,,,>,,],###,%##%,##%%",
+",,/>@#%%###%%%%###%###@#%@#@#@+##++.+++.+....+***'''|!!!</''/:|ojjfffjjovvovicccc7bbdb^^(dgxSLMMQQRSRRKturrrojhff55332322/[-$$&=)^$$$$''--=-mzDrhf9jlmAEJJJFFKQRSSSL88d((^(^^&&$)&)&&&&&=======-==---*..*+++@>>,>>>>/>>/////_'_'__/__/<2/>],,,],,,;>%,%,%,,,#,%,",
+",##%####%@#%#####%%#@##%%@@#@@@@@@@++@+.+..+***''*'!~!!|::<42cc3hrrtturje3:|~||~}177^^^^((8xCxMNNKKQROJJFrglo99f55}34322</[!&&&=)1$$$${---=)~rtlhffhjmtEJEJQQNNMSSSL8((((^^^(^^)========--=--==-==-******++.+@>>>,>//>/>'_>_'>_/'<_<__/<32/>,,>,,],,,,,%,#%,##,]",
+"%%%##%%@%#####@@###@@@###+@@#+@++#@.@++>+++****''*!|7eeie43ceie33fffee2<2<:|~~~~~|77)1^^(((sdnHHCGKJORJIJErlj9iee5}344<<<<[)&&===&&$$$!---===1oh5efjjvEzAAAJJKGNSSSB8(((^^^^^^)^&==----=----=--=-=-*-***+.++@'*'_>]]]/////////<//__<<2<_[<32/>,,,]]],],;%,,,],,#",
+"#####%%%%%%%####@##@#####@+@@@.+@>.*++'*+''*'*!!|cfjfi333233[/]_'':[22232<<4|~|||1c)~1^^((dd66xnvyAJIOOJIIIurjb55534:<<<<_/!&&=-=&&$$$-==---==1e551b9rtuuuwAAAKRSSSBs((((^^^^(^(&&&=----=---==&=--*--**''''>_'_<__>>///////_<<//////_</[</<22[]]]],]]]],>]],#%%%",
+"%#%;;;;;%%%%#@##@++##@@@@@@##+++@+**''''''{!}9ei33e5222/[//]/'=-&==!<<<2222:34|}17|~)1^(sxsddgxnoouAEIQOIIIIwof555332<:::_/~&$&~==$$$$=-====&&&~33177luuuvmuvyCNSSSB8d8((^^^^^^&&)&=======**--*-*--****''*'_''///'_/////,//2</////]//>>]///[<22[/]]]]]//];%%%%%%",
+";;%%%%%%%@#%%###@@##%%@@+@@@+++++**'''':}5e5e3::<[2<[[[//_>>*-==&===!<_<242444}c7c~)~^b(dxnddxLCymvvvFJQQOIEEu9b75344<'{__/!$&=)~=&$$$&-==&=&=&&~}1}5jommmvvmmvNSSSLss((((^^^)^^&&)=&==-*''___'**'!'*''_'''>_///_'__////[2[////]>>>],,,,,//<[[/[3[[]]];;];;;;;;;",
+";%%#%%%#%%#%###@@#@@###@@++++++''{'':4ce3342<<<'<</2[/__'{-*-==&=&&&=~<<[<224c17i}~~)^b7dddqxMHxvvyyyvAFQRKEEEvb1}|:::''_//{&)){)=&$$$$-====&=&=&)~}1hjogmmmmmyNHMSSB88((($(^^^^&)&&=*:<__'__'{*!-{'__''_''____'>__/[[2ce2///>>#,>>>,,,,,,//2[22]//]]];;;;;;;;;;",
+";;%%%%%##%%##%#@#%@@@@##@@@@+@@':|||44:4::<<//<//2[<<'{-{-{**=&&&&=&&=-:<_<24eck7:|~))1^^^^dyMHymvvvuAuuFQQOEEAo71}|:::{_//{)~~{{))&)&$=-=&&&&&$&&&~1f99ggoogmyCyCMSSs8(((^(^^^((^^)://'''{{*{!{{{-'''''''__'__'_/2[<35fc//>'_>>>>>>>>,,,,,,/3e2]];;;;]/]];;;;;;",
+";;;;%%;%%%%%########@@@@@@@+'''{044|::!:<<'>////[<<::!!-~-{--===&&&&&&==!:::4eij3::!~)))^^^(xxvyAuvrmlrlrEJOKwtAj771||:::_2{===-~)))^&$$-=&&$&$&&&$&^99966gggovvnxLLLSB8((^(^^&^&^&~!:{'{!~!~-!~{'''_''''{'''<<<<<222522[[/''_>>>>>>>>>,>,,,][//]//;;;;;;]/];;;;",
+";;;;;;;;;%;%#%########@@@@>>'':244:::<<<<<//]/>'::::'!!-=--===&&&&&$&&&&&)::4eqc2<:!!~~)))^ds86ovwEEulllruDIJKwwAmjiccccc42{===--=&&&$$$=-&&&&$$$&$$^969bbbbggmngnLBBLLL8(((^^^^&^)~~{!!!!~'{!{{!{{_<'!'::'<<<<<<242<<<<</____>>/_'_>>>,>>>/>,;,///;];;;;;;]]]]]",
+"]]]];;;;;;;;%%%%#@@###@@>>_/__<<<:<<<<<<///]>_!!!:!!{'~=--!====&=&=&&&&&&&)|0qc2<<::!!|!))^dd((66guAEEwrruEIIJAtwu77c7eieci~)&)--==&&&&&===&&$$$$$$$(b996bbb6goqqdBBBBBLBs8(^^^^^&)~~~!!~!~{{'{!!!{''':<<<<<<<<<<__<_<<_<<<_<___///_//_>'>,#,,>]]]//]]]];;;;;;;;",
+";;;;;]]];;;;;;;;%#%#%@+___/_</<<::<<<</>]]>_'*!!:|!!!!~~~{!~==&===&&&&&&&&&(de::3<:::|!~~}7bb^(bbb9jrtuuutAIIIOurwf}}55335511c|||~))&&&$&)=&)1^^^^^$(b666bbbbgo8gdssssBBBBsd(^^)))~)~~!~~)~!!!~!~!:{!::<<<:<<<<::<<:_<<::':'______/__///_,,,,,%,,;;]]]]]]];];;;;",
+"]];;;;;;;]//]]];;;;%;@____''_/<<<<///,]/>>''!!!:}}}::|~-!:~~)&&====&==&&&&(8():<<2<<:!}|}171b^^^^11b9jruljlzzDJFrtr7333533:}}11cicc1^^&$$&&&^^($(((((og66bbbbgonq8sssssssssspbb^))))~~~~~)~~!!!!~|4:::!'<<<cei4<<::::'::''''':_'''____>@>,,>,/>>,],]];;;;;;;;;;;",
+";;]]/]]];;;;]]////]]/3///_<<<<<<<<[///>'>+*''!!:}:::|!!!||~~=)=====&=&&&&(d(&&&!<<2[<!!}77c11177111755jrurrrrtwFhltwhe53354}111}}111b771^&^))&^($&$$$gvmog9bbgooqnsssssssssspkkb11)&))~))~~~|||}}||!::253344c4c::::::{::{:{::<'{<'___'>+.@@@#,/,,///]]]]];;;;;;;",
+";;;;;];]/][/];]]]][3e33222[[/<<//<///_>>>'*'*<44::!!!!:!~!~~))~)===&&&$(d8$$)&&$~<<222!|771771111177775hjllrutrJe35fljllj5~~==~~}~~)))^^^111^^&&^$$$$(og6666dgoqqqxssspsBBpppdkbb711)))~~~~||||||}c:2:4<<<:::{{:{::::<:::::{{{'::_''>@@@+@++@@@@>@>/<332[/]];;;;",
+";;;;;;;;;;;]//[[/[422223eff33232//[_/__''*>''<2:<:!~!|:{!~~~~~)))==&&^(n8$&&=&&&==:<<20acc111111111177555hhjjruAr552[<<<''!!!~~}}}!~~))^&&^^11^(&^($&$66g66666ggddxsppppssssdkbbbb7b1111||~bb7c4|c044::::4:::{{~!:{:'::{*:':{::{'**+++@+++++@+@@@##>@>,;,//2[//]",
+";;;;;;;;;;];;]]/[2e333333333eeee3324[//<'>@'<<<<<'!:!:{:!|!~~~~)~|11bkd(&&&&=&&&&&=!:4c4011111111111}1715efhlruEwf322<//>*--~~!|}}1~~))&&&$(^^^^^^(($$(6gg66(6g6dsBspppppssssdpdb7717cccc7oyxCi0|}||:<||:_:<::{!!!|:{::{!:{::{'-**'+'++++.@++@+@@@##%#%%;;;;;;;;",
+";%;;%;;;;;;]]]//2222233fhlhlfe33eehlfe532<>_/<<_'''::<'<:||!!|~~~)1171==&&===&&=&&&&7c04401111171111}}5115efhjrAte332[//***--!!!}}~~)))=)&&$$^)^^^((($(66gg666g6bnxppddppdpdpddpkiiecc7e77oi7bpcc||{|:||!:<{:::|{:{~{{::{::{*''**'*''.++++++@++@@@@#@###%;;;;;;;",
+";;;;;%%%;;;;//[222[23e3ehhfflhheeeeehfhhjl53<<_'''{'{<<<:::!~||~))17)==--====&&&&$$11^14244}71111}51}}}5}55ffhrEuee32<<'*****!!!:!!~~}~))&&&$$)))^&$^^(666gggjggbnppppdddpdpdkpkkqkii7cc77j77cp7c||!|:{{{::::{::!|{!!:{|!!**'****''''.+++@+++.+@@+@#####%%;%;%%;",
+";;;;;;;;;%,]]//<33333eef33eeeefefejjfjheejtuhh3::'!!'<:24:::!|||)11)---=-=-==&=&&&11^^^1c5e577751}}}}55}}}5ehhlEhfee32/'*+'**'!!!!~~~~====)=&&^&)&)&&&((oogjoogoggspppddddppppkkkppki7cc7ij7c1pkic1||:!|!::::{::::!!!::!*-*'{*-**'>'>++++++++++@@+@@#@#%%#%%;;%;",
+";;;;;;;;;]],/23flffeeee3223333e3e3ee5fjljjrumhhjje554|::::{!|||cc~---=----!~==))11ki77777efjfeeee55}555}}}3flhrIe333e3<''.''*!!!!!~~!-===&&=)&^^&=)))=))brvvoggoggnnpppddddpppiikpkkkkieiiji77kiiccc||||!{:::|{::!{!{!**-!'!*{{{**'''@+++++@+.+@@@@##%%%###%%%%;",
+";;%;;;;;/33efjhhfee33ee33322[[2233e3335efhrrmvjfffljjfe}|4:!:|0||!!---=---!!|}75c7eb7171117fffee7555eee533fljhzw33223[[<''***!!::!!~!~=~~====^^)1)~~154}~9momvmmmgnndddddddppp77kkkbkkk7i7k77dpkiccac0:|~||:|:{{{|~!'*''--!*'{'{{:::'@+++@@@+@+@@@@@###%%@#%%%;;",
+";%#,;,:jjrrhrllje333e3333322[2[[23e5333cefeeefvujheffjomjee10c~~!{------!-!}33ccc17b5bbb7bberttrof55fe533hlllrEr3333[[//>''**!!!!!!!!~!!|}}}15ehjjlhe}~~^^9mvvmmmmnnqdddddkkppbiikbiikkpkbkbiqqjkii77|||||44:|||!!!!<:'-*!*-{'{***|:+@@+@@+@++@@@@@@###%###%#%;%",
+";%,,}hrhfefhfhlhff33333[[22222[[22332[223jfeceeooojihifffomvj7}!!{!-!---!24c5cc3355ff99999hjjtEurlrrlfeehflllrJeehh3322/'''-.-'<!-!!!!!:}:}}555fe}~11)^&&$$9lmmmmCnnnqnppgqppqkikkkkikkdddpdbnqkb7b7777ca|||::~~!{:</:{!{-{!!{*-*{!-''+@@@@++@++@@##@#@@##%;%%%;",
+",/3fhffefefeefl33e3f33[///[//[[2[2332222ifiii3eeijofi5ifjjof9hh7}~!-!=!::3355535}}5jjrljh599jolrjhlrlltwuurlltAhll333322:<_!-!'<<'<:::::|}|~~~1}1~)))^^^)&&(9ommmmCxnnnngqqqqxqikiibbbdpddqqdqjkbbb7777777a0|{{{{:<__-!--{{!~{!!''*'-**.+@+++@@++#@@@########%%%",
+"5fehlfe33333et323[33333[//[//<//[23333223eeffecccciijieejoic757fefb1~!:433355cc55eojjfb11117717ejlhfflrjlwzwzEttr32333222[<:::<::<[<::!!!~!~)~)))~1^)))&$$$$(9ouvmvnnnnnnooooxokkibbkkddpqddqqkbb7bb777777a00|:::<<:{-*{*-{{!!!--*'***'-.+++@#+++@@@@@@###@@%#%,",
+"33rlf3323323hf[2[22[2[222[[/[////<22222e3344efie3ccijqooic3}~}5c5befjjf533e5}5555ee559111^1}}}1effjjlljjruttwJDwfee533333[[35333222<:::!!!!~)~))~)))))&&&&$&^^9mvmvvnnvvnxovvnoqkbbbkppdggddqgpdb7bbb77c1||||aa0|{::--!-!-!-!{********'.+..++@@++@@@###@####@#:3",
+"ful333[3333ee[/22222[3322[222[[/<22[223e3e424ciiecccioqjjc4|||}}}7efloomoe5}c5555e7}5e5511}}~5fe55rtllrwDDDtAElfefeffeff3325he3333322:::!:!~~~~)~~^)))))&)&&&$^guvyvooxyxvvovovqkbikkdbbdddgqdddddbb7711111||0c7a00~---{{{'!---.-*.*****..++++++@@@#@###@#%#>232",
+"th322[22233e2[//2//]//[[22////[//<<<<[3eie22cecijecciic0ccc4|||||}eifjjoAroh555551}~19h55155ejjjjurrrruEDzzDJwhhfhhfhlhjfe5235fff5332:::!!!!-!~=~~~=))))))=))=&^gAGuyuoyvvvvvvxxqkkdddddddgoqdddgkkb^77111c}|0a||ac|))~-!:{----*---*---**.++++@@+@+@@##@@@#<323f",
+"f3322[2/[2[2///////]][//[[[////<[2<<<<222ec4443ciooic33ceccc|}||ceeeeefolruvllf5}~~~~5ff5fefjhltwurruwEEzutDArlrrrlhhhlflfeee3333e33}}:!!!!!!!!!!}~~~=)))))=)&&&^GRNAAvvvCxvvyyxxpdddddgdggogddbbbdbb7717c11cc|||a1|1|a~~-----*'--****-'...+@@+.@@@+@###%>3223hu",
+"3[////[/222///[/,//]]]///[/////<<2<<<<22<234:444ciiie44c0c0cc00ciieeefjffhojmuwj1:!!}}jheehjhrAwtuutrtEEwzwwrhffhhllllfefhhff3333333333:!:!!!!!~!~)~)))~))))))~))nGQRJEAmmyxxCCyvvqgdddddggogbbbdbbbb77777c7c11ccc1)|aaa~-==--*-*-*****''....@@@+@@#+@@#<323frll",
+"/]/]]]/[[2/]]///]]]]]/],//[[////<<<<<3322434400cc0:4cicc40cc00ciiifefjhjjhffjofiff1}:3jlhlrrtAwtwwuruzwzEwuAhfe3353fhllllhhfhff33223::}2:}}::!}~!~)~))))))^~~~~~)oCyFQKEAvmHCyyGyvnggbkd6dgojkbbbbbbbb77777711cc71|||||a|{{-=--=--*--*******+@@@+@+@++@}233htle[",
+"]];]]///[[;]/]]],]]/,>],/],/////2<[<43332224ccc}::24|0eicccciiiiiiifolroffehfcc5eifj55flurwEwuwwurrrzzzwrrAtjeefe3e3efhlrllhhhefe332<:335535}}}}}~}}~~~}~~}}~}}}}oGxowKQFAAvGCyyCGvnqbddgdqo9bg6dbdbbbb7b7b111ci1||||~)||~~~===-*=------'*+>@@>++++.+#533hrlf32[",
+"2[[[/////]];]]]]]]/,,,/]/>,/////<:</2433433efc|!:|:4400ipki7ciqiicijovuvvjjf3443eefoorrzDEDwwwtrtrrwzDrlrtElffefffefhhfffhhllrhffef33333335555}}}}}}}}}:}}}}|:}}}oCqdgmFQKEFAKHCGGCxggggggooqbggkbddbb77bb^^1c7b11)|)~))~||{~~~~=---=-=--'+>'>>++@+@/lfhwzrhee33",
+"//233333[[/]]]]]/],]>,]>//]/>////:<234::44eof44!!{|:|00acikkiceiifvvoohf5hh444343fifotEJIIEDtrrrttDIElrlltujfhfeeffjlrfeffhfflllhjlhhffee3533}3}333}333}3}::::}1^6xndddguKOJEFQGGFGGymgggooogggg6gdddb777b1117o71)1~~~)~~~~|||~~=-------!'*'*_>+,,/3rhrwrhff3[22",
+"//[22[22/2[[[[//]//,,,/>,>>////>/_<4444444ie344|{:||||0cccckojiiiovurojhjf34:333ei5hrEJJOJEturtttDEurljfjAhffeehhhhhllhhlhfflrrrrrrrljrhheeee3535353333}::}}}1^^^(xndgdd8gFOKEFQKKKKGCmoomogqggggd68dbbb^b777gd111))~)~~||~||||1)~---!---{**'>.@/2errrrhf3e322[]",
+";]][//[[/];]]]///[[[[//////'_>>///<34::|434434|||||00||acciijovovuAFvjjlh33335eefhrwIIIJJJJEwtutDAlejlhhturtwwwzwwzwzDrrrrrwzzzzzzwtrrrhljfffeeeee3ee533c}1111^^((xndg66d66uKOJFOOKKKFyxmvooggggggggdddb^bbbbg^^1^11c11}1|11||c7||1~==-!!:':<>>[[errrhfee33[//];",
+"]]]]]/]][[]];],]],]//////////>>//<34224334444344||0|||10cciffjouFEFAAuAve3eeeeehrwIIIIIIIIJJEwwArhloAEEDOIDDDIIDDDzDDIDDDDDIIIIIDDzwwruurlrljhjhfeefe5555b7^^^^^^dxnd6666666mFOJKOOKOKKCCCngogggg86ggddbbbbbgb11711111111}}11}17c1c1|~~~!:<_/<[/3wwlfffee[/]]]/;",
+"]]/]/]]]]],]]]]]],,,],/]]////////222:c34:<44444400|||||ccejvvvvAEJJEFFAvvjjhfhltDIJJJJJJIIJEJEtruFJOJJJQOOJJIIIJJIJIJOJJJJJIIIIIDDzzztutttrurlllhhef55517999^^^^(6xndddd666666uFOOROOQOKFGvnogogonggggdbdbbgg^)^1111111)1111111111cc111}!:/4j3[2tzrlhffe3/]]]];]",
+"]]]//]];;;]]]/]]]],/]]],,>>>///[[e33344::::4404c||||||0ioGGCyuFOQOEJJJJKKKFEEEJOQOOOORJJIEzEFEJKJIIIIIIOIIJOOQRSRRRQNQNMNNGKKOOQOOOJJJIIIIIDEAzwtrhhh999999^^^(((6npddd66dd6d66gyKQRQOOQQKGCvmnggooggg6dbddvb^^11111111111111111}1177cc1c7ehl35wztlfee3e[]]]]];]",
+"]]//]]];;;,,]]]]]],]]]]/]>,>>///[335e2<<<<444cccc||00ciCGAvuurEJEwttAAFFJEJOOOOOOJJJJOIIEEEEJORJIIIIIIOOOOOQOKJEAzurrtlefe3eflrtrwwzDIDzwwtttwtutwtuwtrml69((^(66oyngg6gd(ddd6666mGQRROOROKKGymmmmmgg66bd6mgbbbb1^111111111111111111c77eovoujfwIIDzulle3/]]/]]]/",
+"]//]]];;;]],//,//],,],/]]]/,>///2232222244424333c400cjFFvvuuAAIwAtuuvlAFJOQQRRQOJIIIIIIIIEEIIOJJEEIEDIQIIJEwturrllhlltte332333hhffffhjlruurrrhh9h99jjllgjjgj9gg66oynggg6d6666d66666mNRRQRRQKKKGvnmgg6gggggC6bb77^bb7711^1111111111177cjvyvFtuFwhflrtzrf3/]]]]]//",
+"/[///,,;;],],,]]/]],]]///,,,///23322222<<<4223ieecccjEAvvAyuFEEEwuurjlwJOORSRRRQOJJIIIJJEEDIIEJJEIDIIOJzztrllfffflluuzDre33e5lrrllffeeehe5eehlhhh999999b999996696vGymmm66666d8666666nyMRQQRROKKGymgggooggymbbbbb7bbbb77b7)11)1111177iovvuAJEJEle2[2fuwuf/]]]]]//",
+"[/]/];,]],>/>]],>,]]]///>/]>/[/e332<4222<<<[23hooi4fJwvuFAFAEEDElrrrrwIJQRQQOQQQQOOJOKEzEEIIJIJKOOJJIJttrjjhefhfjlruzEDIttwzwEzwrljfefe323335}115f9997711999999((6Cxmggoogg66666ddd6gqmGRRQQRRKOKymogggomGndbdbb7bbbb7^771111111^b9ovooeiAJIJwlh3<[[<rzl3///]///",
+"[]//]]]]],]]>,,,>],]/,//>/////3e242<<22<<<2233eruhjJEtAJFAKFEJAllrtAJJQRJOJJJJOOOQRRJJJEIEIIIEEJROEEJwurjfefhflrrrwEDJOOOOOOQJDrlffe3333::}}}~}}~11151117^^^^^^^^6nnqg6g66b6gg6gg66666gxmGQQRRROJKCvmmvmCCgqggkbbb^bbbb1b^1779gjgfecc4cefjAJAuofi53</]hzhe/////]",
+"[[[]];,,,,],>,],>>,,/]>/////23i3[<<222[2<2233eeefrEIIJJIEFKFJFjlrAKJQRJIIIJJJIJJRROJOQJJEJIIIIJJOJEIEuullhhhjtIurzJJOJIDIIIIOQzrle5f23::::!!}}|~}~)~))^~^^^^^^^^^byqd66gg666666g6ggg66nnnnCGQQQOOOJFCvyyNxqggggdbbbdbkbbggoooq9i70|:4444ijFErooiiec52<[rwhe2[[[/",
+"/[]]]]]],,,]>,,>>,,>>/////223e3<[[<2223222323333etIDIIIIIEKKJvuAJJQQJIIIIIIIIIOQFEJOOROOOJJJJJJEKOIJwuurrrrttzwEKJEIIDDDDDIJQthhf325c334|:}:}}}}~}~~=))=&&&&^1^^^gngb66666ggggg666g6ggmoxxnxyGQRRROJKKGGMynnoooymqgggomomomoogia000cicccioAFmojfjjcic[22utfe[//2",
+"2[//_/]]]>/>>/>>>>>]>_/<2242e32<2<2222333243542elEEzEIIEJJJOKKKJQQJIIIDIDIIIJKEEAFFJOROOQQQOJEEEOQJJwzuttwEzEJJJIDDIDDEEJOQArffh523:c3}:44}:|}|}~)~=====)&)&&&&&^6ngbbbd6d66666gggggggonnCHCHGCKRRRROOKQRGCyyyxCHCGGCvnxnddb77ccccc0c00ijAvuAvooqvvqqqieiAtmf343",
+"iccccc4424422<<<::<_|a44442352:2422233efe33e322fzEzAAIIIIIORRRRQJIIIIIEEIIJKAutwFEEJOQOQRRQQOKEKRRJDEzzIIIJOJDDDEDDIEEJEFwrffe3e333:}c3}||}|}!!!~)))==~==&&&&&&&^^kd^((dd(dd((68666666gggnxnnnyyCGQRSRQRSNQQNNQRRRNMMMLLLLCxxssssppppppxyAvvGGyyxqxCxxxoqvKAvoji",
+"jiiiccc0c4c0cc4000iiiiiiiijjiceccciiiiiojfffeefuIzDtwEJJJQQRSROJIIIIIIIJOKurlrutwJJIJJJOOQQOQQQRSRJIIDDIOJJIDIEDDDDEwrurlllfe35e222:43c4|}}|!:!~}~~~)===)&&&&)))^^dd^((((((((66666666d666dnssdnnnmCGRRSSSSSSSSSSSSSSSMRSSMnppppqpppppppxCGvoyyyyyyxxxCxqxvyFFAyo",
+"iii44444222444ac0a0a0ciicckc0ccciiiiqqooovyvyyAKJKJKJJKRSSSSSRQJJIIJJJJFAvmomvuwwEEIIJJFEJJOQRSSSRJIIJOOIIIIIDEzDzwwrrrlhhfe3333<:::::::}}::|!!!~~}~~~==))&&^&))^bdd(((((((((666((((((((666nnnnnnvvvAKRSSSSSRSRRSSSSRMRRRMCvoqkkki7cccikoooqqqoqqxxppqxCHCxGGyyo",
+"kkkiccc00000c44442444444ce44:440cciiiiiijooovFOQOOJJORRSSSSSSSSOOOOOQKAAAvvyvyttAJJJJIEEIEEJQSSSSRRQROIIIEzzzDDzzttrlrrlfe332[2<'<:2:!::}}::|!!!~}!~)~~~~)=^))&)^bdg(^^((((((((((((((bd6666gnxvvvvvvvyCNRSSSRRMSMMMMRRRRRSGyvxvvoqjjieeijfiiiiiiiikkpkoxyxxyNGAy",
+"occccc00iciic0044404444cc3442:4cc43cc4ciiiijjvKQOJQRSSRRRSSSSSSRRQRQKGGGGKNNKKKQQROOJJJJJIKRRRSSSSSSRQJIEDEEzEzzwrrlhfhhf33223[///':::!::}||:!!!!|!!~)~=&==&&)&)^bdg(((((((((((((((^(9999jjjovxvmmnxnnnxCCNSSSSRNGCGHNRRRRMyvvmnvvyvoojjfiii5eeiic00ccqxqqxCCNKG",
+"Gxicc40cc4404440404ccccic34000ci00ccccciccijoAJJRRRSSRRRSSSSSSSSROKKOOOOQQQQQQQRRQQRQQQQRRSSRRSSSQRRRRRQJEzwzwwturhfffefee32[3///<::4::22::::}!!!:!~~~)&))^111^^^^d(b((((((((((((((99jf999966gnnn888psnssBLSSSSSRQKFGvNRRRQCvooooqnvCCuvjiie77iii0cceiiiiiiipCGG",
+"CGoccckii000c424244c444cc0c0ciiqkkpkpqqxxxyGKRSSSSSSSRRRRSSSSSSSSRRRQRRQRRRSSSSSSSSSSSSSSSSSSSSSRJJORROQRQKFAwtwrlfeee5333e332[[2<<[:3}}}}:!}|!!!~))~~~)^^&&&))^&^b(^(((^(((^^^9999e9969b^^(((888d888pssBSLLLHGNRRRRQNQQRRQGmoooqqvvoCAAmifee7eiiceeeiiiiiiickyG",
+"GGyqicc04cicicc44444c40cikpppxxxxxCHCyxxqxCNSSSSSRRRRRRRRRSSSSSSSSRQQOOORRRRQQRRRSRSSSSSSSSSSSSSQOOJOQKOOQQQKAtwuhffe33233e332[[[<22/<:!}!:!}}}}1}5}1~)&=)&=)))^^(bbb9b6^(99b77b9^^71^(($$$$$$(8d8dd88dsLLLLHxpqvFKQRRQRSSRSNGxoijjvvmFKuoee7eiceicikqckiicic0iC",
+"yCKyoqc0424c4ccciickqxxxxxxppkkkppppqppxHNRSSSSSRRRRRRRRRQQSSSSSSSSSRQQOOOOOOOOOORSSSSSSSSSSSSSSROKFwuuvyGKKQQKFuffee3ee3ff2222[[</////<}}}}cc1~)))~)))))^1~~1111b99b979bb1(9b1^^($$$$$$$$$$$$$(888d(((dBLBBBCqpkimGKOOORSRRNNNGxoqqooFGuljeejecccciieikkiiiaiik",
+"vyyGGxqqi0iiciiijcpHMHxxqkkiiiiiikpqpxHNSSSSSSSSRRRRRQKKOOQRRRRSSSSSSSSRROQOOOOQRSSSSSSSSSSSSSSSQKAAjjfjfoovGKNRNCoohf3e3e32<:[2<22[33<:332:}}}~}}}~1}111}}}}7111b9b177b571^^($$$$$$&$$$$$$$$$$$(8888(((sBsBsBxqicciovFJORRRNFGCvvxvCAuAAojfiecceeieeeeciipppkii",
+"kyvyGGxxxqiicciiicHLHkckpqkqpkqqqxvyGRRSSSSSSSSSSRQKKJFKOJOOOORRSSSSSSSRRRRRRRRSSSSSSSSSSSSSSSSRKGuvofiiieeiovFKKNQNyjff35333333323::<::223333}4}}}55}55}}})~1))1biff551^&$$$$$$$$$$&$$$$$$$$$$$$(888((^dBssBsnokccc7cboAKQQRKFAvvvvyAvAyjomjccceiieeecckpppppki",
+"pxCCyyyyxxvoicieccCMCqkpiiikqqqvvGNRSSSSRRRSSSRQKJJFFKKKOORRRRQRSSSSSSSRRRQRSSSSSSSSSSRRSSSSSSSSyyvoofefeeeeifjumvGNRNyvjhf33333222<<22223e3feh3535}}}~1)==~!}~}7vo9^&$$$$$$$$$$$$$$&$$$$$$$$$$$$$(ddb111sspBBxxqicaccc17oyQQKJFFAvvyGAFGmvAi7eiieijiikxHBBBxxsp",
+"xpHGKGGCCHxxvqi33ciCMqxqqqqpkovHNSSSSRRRRRSRQOOKKFAJJJJJORSRRRRRSSSSSSRROQRSSSSSSSSSRRRRRRSSSSSNvvvvvoffhe3e5eheefjvCNNNCoi533e3532333323ehrjjje3[:!!=~~~!:|}5f576$$$$$$$$$$$$$$$$$&&$$$$$&$$$$$$$$(77b77pBsBBBxoo717711|7bmGKFAFFKGFKGFKCKAoiikoooooxHpc2247psB",
+"ixGNNNQQGCHCxqqic44cHLHyxxxvyNRSSSRRRRRROOQJJJJKJJFEJJJOQRRRRQRRSSSSSSSSSSSSSSSSSSSSRRRRRSSSSSRCoooooojiiefffjrjfff5fovGNMGyrofeeeeeff5333}jvqi<<///>'!!!}5f91)$=&$$$$$$$$$$$$$$$$$$&&&&$$$$$$$$$$$&^k7bbbBsBBsxyvo7c11|17ikxHgmyAFFKKFKKQKGCqqqqqjvHn02<22[2224",
+"2ccvKRRRNHGCCCxxqiiiiBMHyGNRSSSSSSRQOJFEJOQJIIJEFJJJJQOQRRRRSRRRRSSSSSSSSSSSSSSSSSSRSRRSSSSSSNRyfiefffffhjojjolifhhfe5eovGQRNGAmjhf333:[<<<:1oc<''>>//2551~&=$$$=$$$$$$$&$$$$$$$$$$&&&$$$$$$$$$$&&))&^kkb7dBBBsspyvo771117kbnNd7iomwJJJQRNKKCkkkjoHH7<//<<22//2/",
+"2222ivHRSRQKNNHHxCypiiMSSSSSSSSQKJJFAuAAJOOJIJJJJJJJOORSRSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRSRMMHRvfeeeffffhfijloojfijhheeefjvGHMRNoi54<:''''''!~c!**:235}_>>-&&&&=$&&&$$$$$$$$$$$$$$$$&$$$$$$$$&$$$=)==)^pdbbsBspskkyvq77771i7kNp77c7jtFJOROOJCojovNvc2<<__<<<2[//",
+"e3322floGNRRHCHMSMHHKNRSSSSSRJJFKKAvlolwORJJIJJJIJQRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRQNRSNNRGHGe35e5533e55fhmlvflvlofie52<2<cixHRHqc|::{!!!'--!::{***''@>>,_-=$=$&&$$$$$$$$$$$ $$$$$&&&$$$$&&$&&=&===-=^pbbdLspsp7kCvk71^17bbyC7i7ceooAKOOJJKAAGK94:4c4:_//[[/24",
+"ee3323jljvvoxHMSMMRSSSSSSSROOOGGGyoojjvJRROOJJOQRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRNNyojv533333efe35ehjljfficccc4<<:<::!:ciCMMCq}:::!!!!!-{!{***-*++*+>>*-&$$$&$$$$$$$$$$$$$$$&&&&&&&&$&=====&===&(pddsLssxk7jyvkxd1^i7gH7kioojjmruNOJJKKyjic444444_/_///2",
+"c433c43jhfejjiiyMSSSSSSSSRSRNKQNyxvxvCKRSSOOQRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSNQGCvffov55efeeeff5ee33323c_<<<44_4_2::||::|cxHMHqc|!:|!!!!{:--***'***+>>>@.&&$$&$$$$$$$$$$&$$&&&&&&&&&&====&&===&&^pddLBssp77jyvCGb1i77Gkkiijfmuj7jvHxm97ccicc044c42_///4",
+"2e3444ciffhevoHRSRSRRSSSSSSSSSSMHHHHNORSSSRQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSMNCyAujiffjove5ef533<<2[[<][[<>____<44::::::::::{{|pxMHxb|~|!|!!!---*********+>,+-=$& $$$$$$$$$&$$&==&&&&)=&=&&&=&&==&&&bpdsLspxk7ioCKQm177iCgi7jooug777fj!|0440444ci000044223",
+"e2222243fjuGRSRQQQQOJFGHMMSSSSSSSSSSRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSQNCqfhjuffffjfij2<2<<<<[/<<[[/[[>@*>@>>/<__/_:_:4:__|:{|7nHMCq7~~~!!!~-!*'**-*{**'++>@*=$$$$$$$$&&&$&&=&&&=&&&&&&&&=&&&&&&&&1kpLBsspii7vGNKg77kyoiijvto}}75j5~{{:444::440icciqooe",
+"i33e323jyMSRQOOQOJJAwvjjjppxLMSSMLRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRKGvrjffhuhe5c3340c<<_/>__//<<<22<_*''*@@@>/_>>_____4_a____|~|pxMMxd1~~!~!!-!***---***'**+>*-&$$$$$&$&$&&=&===&=&&&&&&&&&&&&&&=&bksBBspkk7bCGQGbijmyiilwu7}11bj1'*{{'_:::<<4eiijjoyv",
+"voiffvMSRQOOQRROEEAwlic44cjoqqxMMSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRSSSRNGAlolfe3je<<<<<::|:{<__'''>>//,//>@'*>+@>'+>>@+++_*_____4aaa__||bsHMHqb~!!~~~!!*----*****+++>'-=$$$$$&&&&&=====&&&&&&=&&=&&&&&&)&bdBBBsbi779AQQvjojHjjwwe7111f9:''''/>>'_4<<24ciivyy",
+"vvyHMSROJJQRQJIIDFufc4|4443iovvoxyHRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRQOQQNGvljjfii423f[_<<<::|0|:{'!'''>/////@+++++.+>@@'>#@++@+'>'''_{_|_aa_|{1pCMMyd~!!-----!-------'-*+''''=$$$&&&&===&==&&&&&$&&&&&&$&&&=&^bsBLBpk777vKQKojgGjuE971}579e''___/_>_'>>_2223ifvv",
+"NMSRQOJORROIIIIEIAicc0004cecijvyCCGRSSSSSSSSSSSSSSSSSSRRRRRSSSSSSRRQKFArof35333442<f<_:<::{|||4!'***''>////++..@*@++@@+@>>@++@@'>++@+''____aa_aaabnHMHq1~!~=---~---=---.'**'>>*-=&&&=====&&$&&&&&&$&&&&$&&&=&&^bBBLxkk779AQRGjoGjFo}57}}555{*_///>_>_'>'__4i5efj",
+"SQOJORRROJDIIAwuuueic004ciiiiijvFKRSSSSSSSSSSSSSSSSSROOJJJJJIJJOJFAvjjjee3222222</e4_<{{:{{|!||!!**'''_>>/'*.+*@@++@@@@@+@@>>>@+@@@+++.*''{__{{|aaa7dxMNnb1}~)===-!~!{---**-**'__*===&&=&&$&&&&&&&&&&&&&&&&=&)&^dBLLpik7ivQRQvgFmm1}77}}5e}'''>>'_>>>'>>>/23eyHM",
+"OJORRQOIDIEurtlhejfcccciiiiiiifjmKSSSSSSSSSSSSSSSSRRQOOJOJIIIIIEwrheeie332<//<<_/2e_<'!:{{{|{~!'*'''''''_+.+.+.++++++@@>@@@@@@@@+++++.+...**+*{{{||aaabsHNyk1~)))=---!||1---*'**_/>'*==&=&&&&&&&&&&&&&=&&==&)~~^bnBMBkki7oKSRGoKr7|}e55555~*+>>*'_/>>>>//3fyMSRR",
+"SSSSSOIEErjojovjeeoeiiijjifiifijAQSSSSSSSSSSSRRRQJJJOOOOJIEJEwtrre323e24[///_//_/i<<':{:{!!~--~!*''!''<''.*....+.+@@@++'>@@@>@@>@++@+.+@++..++**{'{|||aa7pxNHob})=~=-~-~~|~----*'///<:*===&&&&$&&&&=&&&=&&)))~)))bxLSsiqiiyRSMvFf5|c7fe55e!'>''_>_/<[33fyMSSSRRR",
+"RQOOOSJtliec4covofjofiifjjjiqjouQSSSSSSSSSSSSROJIIIIIJIJJJAtvjjfe32/2322[/__////c<_'{!!!{{!!={!--'!!''<'*.-..++.++++++@@@@@@@@@>>>@.++.@++.+....**-~{{|{)a7knHNyk1~~~~!!-))~---*''':<<//'==&&&&&&=&=&&&==&&&)~)))^psLLpqkioQRSGGjc}:5jh557'>_''_'<<25oHSSRROOORR",
+"KIDIORAlj3e44c5oojovyojjiiijjoAKSSSSSRRRSRRROJJIIIIIIAwtwvooojef54/[<2[[///___/5c{'{:{!~!-{!-!!--{-'''**..*+..@+@@@@@+++@#++#@#@>@>+++++..++++.....***--{|||7kpxMCq7}~~~~~))-!!!*{!:'__/>_--&&&===&&&&=&)&&))~~)))1sBSspxqoGRRNye7}}7ff5e:>>'_<<25jHRSROOJOJOQRO",
+"zEIIIGeiiiicccefmvmmuyoqqfjjvAKSSSSRQOJJKQRQOJJIIIIIwurlfeeiiiif42//_</</_>___<3:<!!-!!!--~-!~~!!-*!!'*--++++++@+@@@+@@+++++@++@@+@@>@+..++..+.........**-{{{aa7dxHHxg1}~~~~~!~!:!!{'{''_''_{-=&&=&&&&====)=)~~~)~~bBLMpyvoyRSSv7i}cefh5h<''<<3fyMRRQOJOOJJOQOKE",
+"IIDEw32<<44eecccoAuvmvvovvvvAFQSSSROJJEFFJORQKJEEzttulfe52<3cecc42//<<//___'_<5:!{-~!-!~{---~~-*!-'!!'*.*.+@@+'+@+++@@@#@+++@@+@@@@@@>@+.++.++.+........-.---{{|1bksCHHmb71}}~~|:!!!!{{'''''__'*=&&=&=======~)~~~~~)xBSxxCvyRSSm7e}ifjhjh<<:5qHNRQOJOJJJJOQOEzwD",
+"zrffe/:<[<2<4cefoAtrjrAAuvAFJQSSROOOJFAFFJJJKQQKAuullhe32<2444c42___<<__<<''_3}{~!-*!------~!~!!!'!!--**'**++++@++++++++#@++@@+@#@##@@@@++..++.+..........=-.-=-{{|1bsxHHyok71}}}}~~!!!'!!'{'____*==&&===)))~~~)~~~-^HLMqCvyNSSC7f5efljl5}qHNQOQOJJJIIORQJEEwDDI",
+"3e33[/<<<[<<[<3ejoAAmovwuAEJOSSROJJJJJJFJJJAAFNRQAvjjf2</_<422222<_<:_<<<<{'2c:!!~--*------~~-~~!!!!--****'*+++''+++++@@@@@#@+##@@@+@@@>#@+.....+..+.......-.*=----~|1bsBHNGvoi771}}}~!!!{!-!'<___/*-&&===~~|~)=~)~~-nxSCyCoCSRMefeejurAyMQJOQOJIIIJOROJwrjruzzr",
+"222[<<<<<<[/[2ee5eoAAruAFEEJRSRQQOKKFJJJOOJFAuvCRRKof3<__<422<22<<<<:<<:|:_<3:{!!!:{**------~-~~!!!!!!!*'*'***+@'+++@@@@++@@+@@##@@+@@@#>>>@...+.++++...-....---==-==~)17pBMNGGv9757}}|!!!!!!!'**''_<'-==)))|!~=~~-!!)HLMCxqxSSM7oouEFNQOJQQJIIIJOQQJEtlhhrutth3",
+"2[2<<<<[<[[<3332323ltrlvEIJQSROJJJKOKJJJOKFKGyvGGGMMC4<:<<:<<<<2<<<:::<:{!<3<:!!!!-{{*-===--=~)~115}}}5:'.'*+@@.+.++@@@@@@#@#@@#@@@+++@+#@@>++...+@...+...-.-..==-*----=)17dBHMGGvmf7c13}~!!:!!{{**'''/<~~))~!!~~~-~~~dBSxxqvRSMfFFNRRQOQOIIIIOQOJIErh5hhlffhre2",
+"[32/<'<[//23ee333333rhfjtIOSROJJJJJFKOQQOKGGNKQKyyyRRxa||:<<<<_<<<:<<<<<:_3<'{{{-{:!-----~==~}77}}~!15!:'**+.++.+@@@@@@@+@+@+@+@#@#@@@@@@@@#>@....++.......-.--===---.--===~17sLMCvvuo917~}}}:!!''{-'''<_<~~--~~!{{{!~~HLBxxoMSRGSRRRRRJIIIJQKIIDzlfefef32233233",
+"/2[><'</<[3ffee3[[[/3rulwIROIIEEFEJKJKQQQQNNMNNNNNSSSRMsppk00|:<<<::::<{_32<:-{****-*-!-||}}~~})~||}}}!!''++.+@+@+@+#@@@+#@@@@@##@#@@@#@++@@>@+@.+.+.........------*------=--=~akBMCoomvje71}}::<:!{{''{'</_{~~!!{:::::bHSCKGRSSRSSSSSQRSSKEDJEwj53ee3<2<<<[2223",
+"[2/_'<'/[3f3ee3[222[3hwzIQQJIDwuuuttwEKFAAyGGNHNMMMMNQNkiiiki044::::::4:23<:::{{{{*-!{!~|0|}1~!!}||!!!*'''+@+++@#@+@@@@@%%##@##@+@@@+@#@#@@@+@+@@..+.............-==.----=------=)dBMHxqjmmof73}}:!:!<<:<<<_/_{!~!{:::4}HMNRSSSSSSSSSSMHyuEIEu9153}::2<!<<[2223[",
+"[<>/<</[2eff333[223ehfzIOQJIEtrutttwzzEuurjfeeeie5c}7ovece44||444:::::4<e<:::!!!!||}|!||||~!|!!|:!!!'!'*'>'++.+@@@@++@@@######@#@@+@##+@@@@++#@+@@+..++.......*-----.----=-=.--=-==)|sLLCofjjhhhe5}}|:::<<<//[[:{{{::45jGSSSSSSSSSRSQvjrzEzrj5e5::<:2:!'<<<<2233",
+"[//[[[/2e3e322[233ffllEORJIzwwrrrtzzzEwjwwre33eee33:<:3cec44|:<<4:::<<<5<<'''*!!~||~~~|||~~~~~!!!!!''!*+.++++++@+@++++@@@@##+#@#@@@@@@@@@@@++@+++@@@+++..+....-*-=.--=-=---=--=---==-)^pHMHnjbfjhffe3334:::<<[2244ceftFEJRSSSSSSSRJOAuzEwr9555}!:{<2<!'<<<<[2[[3",
+"3[[[[[[f33ee323335hjtEIOOIDwwwturttwEEujuEh333e3353:<:4:cec444<<_<:<<<5<<':!-{{!|~|||}|!:|||~!!!!*-'*'+*++++..+..++@@@@#@##@#@#@#@@@@+@@+++@@@@@@@@@++.+..+.....*-.*--*.---=----!}}~---=)dHMMxjbbeee5e5334444ciijjuAEJKRSSSSRSSSSOQJzztr95}5}~!!{<!'''<<<<<<2[33",
+"3[////ef23e52223ehhfKJOOIIztrtzzwutwzwrlErfe5eee355:4432:44c42<<<<::<32<::!||!~!|~!~~~~:!}7}--*----*'+++**@++++++@#@@@@@@####@#@%@@@#@@@@##@@#@#@>@@@@++......*....--.**....--!!~!|}~-----)dBMMyoi755555efeifjjvAKJJQRNKOGMSRSSSSQREul97}}}~=-!'!!-{{<'<<<[[[/23",
+"[////[f33e353333eeerOQQIwuDtrrDDtrutEzljhjmhfhfee553}4332444c3:<:::4c4<:{|c|||~!|}!!~~~!|}}|---***-''+.++++++++.+@@@@++@@@##%##%#%#@@#####@@@@@+@@##@@@@+**+*.****...**....**!!!-*!~!-----=-)(nMMCofjfeeeifjlAFKKFwEFFKJumHSSSSSSSKm91}}~~---!!!!--!!'<<</<2[/2h",
+"[////2f5effe32[2eefAQRJzrhtEtwzEwzEIIJreeijujhf75eeb7cc54444434:42454<4|||||!}}!!~!!!!!!!!!!-----.*''*...+++..+.@#@@++@@#@%@+@%##@##@@#@@+@@@++@@@##>@@@>+..+.******..*-..-*!!-!-*--!--**-----~bnLRGyoiifjrFJFFtAAFFJJwtwwySSSSSSRm1~~-==---'{!-----''''''<2[2eh",
+"2[2[[2fehf32[[2eefrIRQItlhhAJuwAJJEAEEGyxnqvNGoojjfiec3c444<::4343i4440}||}}|||!!!{!!!}!!!-!*-**-.*.*..+.+@+..@@###@@@#@@###@####%###@@@@#@#+@#@+@+#@@+@+@+.+++'**++*+.-*'''!!-*-***!***''{{!~!~~^nMRNGyGKFArmmAFEJEwutEzEJMSSSSSC~~====---'------'''''{'<<22335",
+"233333je332[[23eflEJSOItlouvFJEJEEEwwEJOvyoqvFAvfieiee5c444::::4ce4:2:}}}|:|~!!:!!~!!!!!''!-_'''+**++++@##@>%%;;;;;;;;];,,,,%%#%%%@@##@###@@@@+@@@@@@@++++>_+.*'**'''>>_/<<<'<'''''*'**-**{{{~!~~-~^xMSRQAutuAEFKJAuwAEEIIOSSSSSS)-===-==*'*=---**'''<':<<223333",
+"3e3422fje2ceiiijvJORROJwuAvolKJEFEEAtwIRyvofjoAumjiffecc2232::4e54c44:}|}4!!:}!!}}:!:''''*-'>****++++++++#>,;%;;;;%%;;%;;,],;;;;;;;;;;,,;,,#+@+.@@@+@++.++++''@'_<<<<:<<<<2<<<<'/__<<<___'_:<:::!|7orvCMSRKNKJJJJwrrttAwAJRRSSSSH===-----------'*'>'<<42<<225333",
+"yxppccoyyovoqjjjFJQROJIEtmlrAuGJAzEzAwEOOAmhjfgtulrojhfe534:ceoe44c44}4::::::||}3}:!*****--***-**..+*+@#,;%;;;%##%%%%%%%;%;;;;;;;;%;;;,%,;;],,,>>>,@@#++++@+''.+..-**-!'!!'!'!!!<<<::{<<<:<444cejuurommuNSSSSROJJFEAAFFJJQNGMSSSd-----------******'<:cca|0cijovC",
+"qki77cqjovofoovAJJSOJIIErlurhhlFEztAEEJJJOwjjjf9ttrtwwrojefoule33cc33:::::!::!}}!:!-'*-*-*-**.*...++@>,;;;%#%##%#@#%###%%##%%%%%%%#;%%%%%;;%%,,,,,],,,,>>>@>@'''++++++.******-***********-*!!:5jj9b5eijmuFQSSRQQQKEAEJJJQGyxMSSSi:'**--!---'--*'*-!7xCHBLSMMHHHC",
+"oiij7ivojottvruJJQQJIIIEutujefjjAJzzDIQJOOOAumjjjutwEAuvvvvjec5544}!!|:!!|!::}!!!-'!-****-.**+*+*.+>>>,%###@############%%#%%%%;%%#%%##%@#%%%#%@##,,%,,,,,<//<//'>@+*.+**''''****..**'--.*-!}}}}~~11119orwuyMSRRSSQKJJQNyyvxMSSM3332<<''*--***-~}bovoojjoGGCvvyy",
+"ooojffrjhjluwwEJOROIIIIIIzrljrlhltJIIONKFKJKug99b9bjomoji71|}}}~~~~!!!!!|}}}!~!~!'*!********..*..+@>>>@##,,###@#@###%##@#%%%##%%%%%%#%%##%%%%%%%%%%%%,,,,>>>>>///</<>''@>*''+''**+*''*---'<:|!~~~~^1bjojj9996yRRRSRQRRyvoHHMRSSM33333<'<<<<':}7jfjojfhjjoojyyvvv",
+"olfbe9ljlllruIOORRJIIIJJDzwttrujhhjvAvrrrAAKKmbbb^^b^^^^^~)~)}|~~~!!~!~}}}!!!!!!**'!-**-.*...++*+>>>@@@#@,####@####@#######%%#%%%#%%%%%@##%%###%%#%%,,#,>>>>>>>>>/]//////<:/>+'*+''+'!!!:::!!!~~~~19holf5559fbmHRRQNHHGxqoxCxSSMnoe3332:}}7ijojluttullrrjejoCvmu",
+"wwrllltrruuruEOOROJIIIIJztutulje5b5bbb966oovKNn(bd(bb^^^^)~~})~~)~~!~}~~}!:~!!!-*!*-***..*.*'+*>>@@@@@@@+@@#@#@@@+@###@#@######%;%%%%%#%%%%%%%%%%#%,%>@#,>>>>>>@#>>>,>,,>>>],>@'''--:::!!!!!!!~~~59fhh577eee579jCSSGmvvGHyCxxMSMCGAytwAAFEEEzwEEEEzwzzAwtllfvwAE",
+"wujj9jjejjffjEJOOIIJIIIOvjhfe557717bb66(dggqnCMn(8dd(^^^^11)~~~-=~~}~~~~~!!-!!-!--**+'**.*.-'@>>>+*@@@+++@+@##@@@#@@###@####%%%%%%#%#%%%#%#@#%%##%#%,#>,>,,>>,>>,#>>#,,;,>>],@*''*!:!<!~~!!:}~^1eehfe555efeeefjvynHSMyooyNMGCNSRCAAAEJIIEDEzEDIEwtwwDDwtutwuuEDI",
+"j91^&^22433elIIRJJIEFFJEuljhjjf9999966666dggnxMLdddb^^^171)))~~~~)~}~~~~---!------*-*'*.*'*'_'+@@@++*@@#+@++##@@#@#####@##@#%#%%%%%@%#%#%%#%,;%##%%%,##>,#>>>@@@>,>@,>,]]>>,,'''''!:!!!~!!~=}}7ifff77}55eefjvvvoijqCSNGGAGRSRSSSROJJEEEIIDEzzEEzwuturjrrrllhflut",
+"1~)&&^<<2455tEJQIArrrlrrutulojoruuuvrmmmmnCCLLLBd(^^1b71^^1)^~=)~1~~-~~~---------=---**..'-'*+++@+@+@@@@+@@@##@@@@%%###%##%%%###%%%#%#%%#%;%#%%##%#>,,,,,###>####,@>,,>;],]>>*'!''!!-!-!!!!~}55eee7}}5c}}5hoCv7ijojjnMRRKFFGRSSQQOJJEEztututrjfhhfh95555555}~bfh",
+"!&$$$&<':<<3zEJJEujjhjjhhhjuwumgggmmogggggpsss8d((bbb111711~^11~~))~=--~~-=---!----*+-.-'-**..+@@@+@@*+@@@@@@#@+@#####%%%##%##@#%%;%;%%%%;%%%#%#@,,>##>;#>>>#,,###>>,]]]]/>>'''''!!!!!!-!~!}c3e5571}3c}3eioo7bikiiiekjHRRKAvCNSROJJJEFzwtwwEtrhhfhe}4<::'''*=&c3",
+"$$$  &<':2<fEEQIEtrlhhfee5hgormAumggggogggpnddddd9ibbbb111^~}1^)))~=-=----------**-**''******-*+++@@@++.@+@@@@@@@#@##%%%%####%#%%#%%%#%%%;%%%#;%#,,##>####,###@##>@>>,,///'*{-'*-*'*!!!!-~}}c35}}:}533ceii5}|1iki7cejeioNRQFFFRNKJEtrurltwtrrrjhje2:<<::<</'&$^1",
+"$    &<'<23lIIOIztrjfffhff99jggggvvymgg6dgnnod66g999971(117}})))~~~!==--*--*-*{!**-***'**'**.*++.+@@++@+++++@@@@+@@@@@##%%@#%#@#%%%%%%%%%%%%#%,,,%%%#######,,,,###,,;,2f/****''''*-!!!!:}4}3555c}235ciicc|}}e1ccii7cjeiejGQRQuNNyAEAtuutrhfjhhhe::<'--!-!->*  $(",
+"$    &<<<23tDIQIzrjjffhhfh99googgggmnnxxnxnnggggoo9bb117^111~~))==~--------****!'--**-'*..**--...+@@@@++++@+++@###@@+##@%#%##%%;%###%##%%%%%%%,,%%%%,,%#%#@#,,,,@>,,,2h<>*'****---*'!!::|}:3}5}}}2244ce3}4cie5cccikivjiiekvKOKNSNAAEJJDtrrlrhhe32:'{!--=---&  $(",
+"$$$  &[/<2hzIIQIwrljhhjhffffgoooooggggqxxBBddgggoggbbbbb1^^^)~~=--!~-==-----.---*!!*****-**......++++@@@++@+@#@+###@+@####%###%;%%%%###%%%;;%%;###%##,,#,,##,##,,,,,25''@'''-'--'''<{:<<442334}444c4c4333c777cccc4cqvoiiiikyCAQSSNJJAEIzwwurf35322<'!-=-==-=   (",
+"$$   &2[23jDIIRDwrllhjhjjjjjoooooggoooqnBxnnxyvgg6dbbbbb11^))~~~-{----=-!----!!!*{!-*-****+.+...+++++++@++@@@@#@#@##@####%%##%%%;%;;%%%%%%%,,#;,%>#,########%%,,,,/2}>@'>''*****''<<<22433eeec3343fc3<:!|))1)))))}}7poiiiikxvFNSSSOJEAAAAtrljhf3322{!!!!-*'-   $",
+"$$   $4325lIIIRIztrrljjhljojjhjjogooovxCxoqovGmoj9bbbbb^^7^))))==--------=-!!!---'-{-*-*.***+..+...@+@++@@@@++#@@+#######%%#%#%%%%%%#%%;;%%,,%;%,,%;,>#%%;;,;,,>/[2++@+.**++.-***-!!:|:<<<</<':<<[<:!!!!~~|))))))~1^1pqkkkpoovNSSSROJFwuutturuheee3<<<'{''>*   $",
+"$    $:e23rIIIQIEturrlllloggjjmojjooqoxCggggjoqii9b1111^^11)))))==--**--~|~~!{**{***'*-**.*.+....+.++++++@@#++#@++@####%##%###%%%%%#%#,;;%%;%,%####%,##%#,%,>,,/2:@++++.++++*-''--!!<:::!-!~}7|~!---))))))))))))~~}}1bxppnxokgMSSRQOJJJEzEzwzulhfe522<<!<_>*   $",
+"(     <h5ftIIIRJIEtrtutrrmmmojjooovonxHqgoo69bbb9bk711}^^1^)&)))==----!~--********-*******'*....++++@@+@++@##@####@%%%%%%;%%%##%#####%%#%%%#%#%#####@@#%##,,>>/2'@+@#@@++@@>'!-'':!!!!~}}1~~--=-===&&&))&)))))~~~)}~}cqxxyxqqqCMSSROJEEEDEEztwturjhee2<</>,*    ",
+"(     'eljuIIIOOIEztruuuurmmmogomonnxHx9jj996ljgjf7c111111)}~)~)-===)|---****-...*--..-.''***.+.++++@,@@@+#@@#@>####%#%###%%%%%%%#%%##%%######,%##@#@>####>,><:'+@@+@+#++@>_''''{'*-~c7~=--==&===&==&&&)==))))))))))11bxyxxdgdBMMSSRROJEEzDEEwuuurljf32[<[[!    ",
+"$     ~etEDIIIORJDzEtuuttuuvmoommxyyHHki77ijoug9ieb1111711~))=)=-~-~~=-***--**..-.*.+....-.'*..++++++@#@@+@++#@@@@@######%%%;%%%;%%%##%##%#######@####,%#>>/['@@@@+@@++++@>>/_''{*~71~----=-==&=&====)=&&&)))~))^))1c77dxMxpqnLLHQRQQQROJDDztwrrrrtuuhh3233!    ",
+"$     ~elwzDIIJOOIIDEwwwwwAuvmmmmmxnxpb7e7efeibbie777111|c}~~~~)-~!~~-=-----**'***.**.*....-'*-*++++.+@@@++++@@>@@@#@@#%%%%%;#%#;%%%%#%##%###@#######,,,>><<@@+++@@@@+++@@++_'''*{k|--{---=--====&)))&))~~))~~~~)~)1c17kqNHxqnMMGKOQOOJJOOOJEwtrrlhlrulh332{    ",
+"$     *hjwDIIIIJQOIIDzzwwwwAAAAGKNMLHdbbbbbee71771771111|}1|~~~~~~~)~~~-***--.*.**.*.-.......+*'@++++@+@@+++@+@#@@#@##%###%%%%%%;###%%%,#%####@#####>,>>>::++@+@+++@#+@+#@++_'{{-{p~{{---==^^(^^11777bb999bc<::||~|1117kpGKynnLMHGFKJJJIIIIIDEIFwtuljhurh22|    ",
+"$     =hutDIIIIJJROIIJEEEFAAAFKQQRSSxgd66bb17cc5}c1c}1}~}}~~c}|||!|~~~{-{---****'*.........*++.....@+@@#@@+@+@@@@+@@@#%###%#@%#%%#%%%%%,#%#@,#>,%@>,>>'</@++++@++++@+++++++.+'{{*-ds1~||a0ciiqqojjijmrjihe34223<2404|17bkgKNyxHNyCGFEJDDDIIDIzwtwwtAwwuwEfrm    ",
+"$     =5zwEIJJJJQJRQJIOJIJJFFKGKGMSMng69ddbb^^1~||4c||}~)}}|11}1::|~~!!!!!{*********.**.......+.++..+@++#@+@@+++@@@@@###,#%#@##%%%%%%,#,%,%,#@##,#>>>><<+@@++@+@@@+++.+..+.+..*''{{bxxk|~~~~}1cciiiic5c77c433<42444000cii7mGHxMNHyAKEJEIDIEDDEEttutttzDDJFt}    ",
+"      'uJIIIJJJOOQJORJIIIEJJKKKNNRSHqoggb(bbbb^)1|||{:::|~~~}~}|:::::::'*{{{'{'*''''*+.*+++++....+.+@@+.@#@++++@>@@######%%#%#%%%%##%##%%%,,,>#>@%>></@@@+++@##@+@@+++++++@..+@+*'{{7xGmg1)~1cc0444c0ccc0c}c50ccciii0cikk7bvNMMMHGGFKJJJIIIIIIDEDzwzzEDDIJw!    ",
+"     $qJJIIIIJIJIJOJJRQJEEEJKKONNMSxqqddb(bbbb1^^))~~{:{<'{!!!|||:::<<:{{{{'''''>'*'''*''+'*++.+++++@+++@##@@@@#>@#%##%%#%######%%%%;,,;;,%,,,,#;,>,@@@@@#@++@+@+#@+@@@++.++++@@.+'::1oFyAuoi5}422<::|0c|44cccccce7iiikkieijCSSSNQNQQQOJJIIIIIIEEzzwAzzEEwr!   $",
+"$    $GuuIEwEDIIIIIOOIOQRKJJFKKQMSSnpdd(^(((((^^&&===-~~:'!::'!!::::::{!{:':{'''*''''''''+*+>@**.*+*+++++@@##@##>@#%##%##,#%####%%#%%%,,,,,##,#>,/>@+@@@@@@.+@++.+#@@@+@++++++++.+.*|55jAEAAuvvjje}|::!~||||~)}1}111177a|cc7xSSSSRQQOJKJIIIDEztrljlhrrrrruf!   $",
+"$$   8AleAwttwEIIIIIJOOIJQRQOKKGMMLss8(((^(((^(^&&&====~~{-'*''!<'{<':!!''~:{'{{{''_''''''''+'''@++++>+@@@#%;,,#,,%%###%%%@%%##%%#%%%%%,##%,>,,//,,@@++###@++++.+@@++++@@..+.++.+...*}57hwtrrolmuvvvmoogg6b1)}~))^^)^^1((8nxHSSSNQKKFEEEIEDEEtwtrllhfeefhj3'  $&",
+"$$   8j33lJzzwAIEIIIJIJOOOJORRNNMLSB8((((^^(&&&$&&&&&&&====*-*'_<_'_<<<<'''///___**'''***'''''+''>>>>@@@##,#;%;%,>%;%%%%##%,#%%%%#%%%%%%#%%,,/,##%,%#@+#@@@+++.+@@++..+++++.....++****!}5frwrjffjfjoooovomomvmmomvyyHMMSSMLMSSSSSNKGEFFEzDDEEurrjrhjhffhef3'$$$&",
+"^$$  &3342FEEIEEEwzEIIIIJOQRQKRSSSSB8(((^)&&$&&&&&&&&=&&&===---'{''_>>//'__'''_<<<<<//<<<<<<<<<':_>>>>##,###,%%,>,%%#%##@##%@%%%;%#%#,%%%,>],#%#####,@@@@+@+@+..+@++++.++......*.***-!!~|35julfhfee5}55ee9bibqooyGKQNQOKyxnxLSSSSRNFAttAzwwttrljjlfehfeeee['$$&=",
+"1&$$ &_:24eAwwEEzAurwIIIIIJJKQRSSSSB8((($^&&&&&$&&&&&&=&&===-==---*+'''>>>,>/_>'''''{!::<////]//]/<42<///>>>,#,#,,,##########%;;%#%%,,#,,],##%%#######@@@#%#@@++.+@+.+............**-!~!::::eree5e533c57c17iqnvvAAAFKyogoooyLSSSSSSNGuwwAwAtrljhhjfeeeffe3/'$$&=",
+"1(&$$&_{!:4uwuztjjruAEEIJIJFFFKNSSSB88(((^^&&&)&&&&&&&=&=======-=---***'@>>>>>>_>></_<<<_____///_]>__2//>,],,,>,,],###%%%#%%#%%%%,,,,>/>>@######%#@#@@#@#@@##@@++++.+.........-*****{!!~:</<<3hf35e55efjiiiikjoyuoqikbbbbggCMSSSSSSSRKtuuuuuurjjffe5ee53322'$$==",
+"1^$$$&{!-~)1AzElffhgmmEIJJEFFKNMSSSBd8d((^(^^^&&)&&&&&&========-==---*.*'++@@>>>>>_>>>///____<_'<____<2</,],,]],,];#%%,,%%%,#%,;,,]/>@#%####%%%%######@#%@#@#@+##++.+++....-..*'****!!!!:_/>/_:jjjfjfjfjjoovvqkccc7bpdbbbd6nLMMSNQSSRRQuuururjjff55353332[[{$$&=",
+"))$$$$!!--=-9twlhf9jorAEJJJKQNSSSSSB8((((^^^(^&==========-=-===-==.****.*+.*+@>,,,>//>/>'>/'''__<____/_<3<,,,,,,]],,,,%;,##,#,,],>#%####%###%@%#%#%%@###%#@##@+@@@@++++.++.+*******'!!!|<<<444c3fvjvuruvjfc0|||}117bb1^1((8nHxLRNKKRROOKFrlll999e5cc34322[[:&$$=",
+"=)&$$$!---===9lfeefjjuzEEEFKKGGNSSSB8(((^^^^(^))&==--=-=-----=-=-=-*****'.++>''>>>]]]/////////</___<<<//[32/>,>,,],,],,;%,,,,>,#%%%##%%###########@#@@###@@##@@@+##.@++++++****''*{|}cc7c443eei3ehjlhf322<<||)|~~|77)1)^(((snnCMGGKJQRJIJErgo99fe5}}4322<<<|&&&=",
+"=&&$$$~=----==9e55b99rtuuuAFAGQMSSSB8(((^^^^^^^^&&=-----=---=-==-----**''++'>'{'__,]///////_<<//////<<<[</232/],]],/],,,,,,,#%%%######%##%%%%###@####@###@++@@+++>+.+++'+*'*'**!:|7iffeee23322//<':[23242<<4|~||||71)1^^(((d66nxxyFJJOOJIIIur99555c44<<<<</|&&=-",
+"&&$$$$=-====&&&}35179ruuumuuuyGRSSSB88(((^^^(^(&&&&=====--------*-*-'*'''*'>''//_'_/]///]//<<///////>///[//[[2[//,,]]]//],;%%%%%%##;;%;;%%%%####@@@@#@#@@@@@#@+++@+.++'''''!|15eccei33222[///>*-==-!</[2222<30|}||a~~)1(8xsdddxnnvuAJJOOIIIJwo9b57c32<:::_/:&&&~",
+")=&$$$=-==&=&=&&}}15bjlrmmuvmmyRSSSBs8((((^^^)^^&&)=&==--*'_'_**{'****'''''__///_'__////[2/////]>,>/>,,,///<[[[22//]]]];;;;;;%;;;;;;;%%%%###%###@+@%%%@@+@@#@+++@+*'''':|}c7e7}}2<22<[<///>>>-==&===!<<<24<444|17c})~)b(dsnddnHxmommvFJQQJIIEu9be5c442<::</:&&&)",
+")=&$$$&-=&==&&&&=~}1bjoogmmmmmyNHMSLs8(((((^&^^^&&&&&-'___>__'**--{'__>__'___>_'___/[/2232[//>>>,>>,,,,,,,/<2[[</[[]];;;;;;;;;;;;%%#%#%%%%#%####@#@@###@@++@@+.+''''::4cccc42<<'<<[2[///_'*'.==&&==&=-<[[<244c}ci7~~~)^kdpqqxHHyyvyCvvwFQRKEEEu711}:::'''_/:&)){",
+"~=&&&&$~==&&&=&&&&=~bh9ggogommGCyHSSL88(((^(^^((()&)<//'''''{'!{'-*'''''''____>'//2222ejc///>>>>>>>>>,,,,,,]2ce[];;;]]]];];;;];;;;%%%%%##%%###%@@##@@@###@@+@++'::{|44432::<<////<[[<<'{*-{*-=&&=&&&&=-:<_<22ecei:|~)^^1^^(dmNGymvvvAAyuFQOQEEwm71}|:::{_//:)|~|",
+"{|)^^&$&-=&&&&$&&&$&79996gggomyyxBLLSL8(((^(^^^&(^&~'_{''!~--!!!{{'*'''''{<''':<<2[23f22[//''_>@>_>>>>,,>,,]/[<[]/];;;;;][];;;;;;;;;%%;%%##%%#####%#@#@@@@@++>>{|044|:!:'<<'/////<<<:'{-{!{**-==&&==&&==!<<<4ceje:||~)^)^^^(nCvCAvvvmrrmmEJOQzwto71c||::://_=~&{",
+"-=&&$$$&==&&&&$$$$$&1999bb96gmvnnxLBLLLn((((^^^&^^)~|:!!!~~{!~{!'''_<''':{'<<<<_<232<<<<_</____>__>>/>>,>>>/>,]][//;];;;;;;/]]];;;;;;;;;;%%%##@%##@##@@@#@>>'':<44:::<:<<'//]]/<::::!!{-=---==&&&=&&&&&&&~:::5ji4<:!!~)))&^(pdgovwFwulllrrDJJKwtAoq77c00042:====",
+"===&&&&&=-&&$$$$$$$$^996bbbdggoggsBBBBLLB8(^^^^&&&))~!|!~~-{{!{{!:{_''{:<<<<<<<<<_[<<<<<<<<_<___//__//>>>>]>,%,]]]/]]]];;;;;;;;]]]];;;;;;;;;%%%##@@####@+>____<<4:<:<<<<///]>>'!~::!!'-==-{====&=&&$&&&&$&)|4ii4<<<:!~|~))^dd((66muEEAurrrzIIJFtAAb7cc7eecc|=&=~",
+"~~=&&&&&&==&)^(^$$&$(9966bbbdgogddssBBBBBxpd(^)^))~)~~!~)~~!!!!~!!!{'<<<_<:<<<<::_<<__<<:'{___'__//_/>_/_>,,,,%,,,]]];]]]];;;;;;;;;]]]]];;;;;;;%%#####@>___/<<<<<:<<<<///]/>_'!!|:!!!!~~~{!~~====&=&&&&&&&(^bq::3<<:!|!~~~1bb^(bbb9outwwttwIIIKwuwh7}c55c5ec1c|~",
+"c111^&&$$&)&)((&^^(((g666bbbbqnngssssssBsBspkb^^)~~)~~~~~=~~~!!!!|4:::!{__24c7<<<2<:'{::'_'''<<'''____>>>,,,],,>,;;]]];;;;;;;;;;;;;;;;;;]]]]];];;%;%;@____<'<//<2<<////,>>>''!!!}}}::|!~~!!!)=&&===&&&=&&&(8d):<<<<<:|}!~177b^^^^71b9lruljlEDIIGutr53535333~~11c",
+"c1777b1^&&)=)&(&$&$$(mvmggbbbqoqpnsssssssssspkb11)))))~~~~~~|!||}||!:::c333ci00:::<::':{:'{{:_'*{'___+>++@@@,,/,///,]]]];;;;;;;;;];]]];;;;];/]//]]]]]2<_/_<<<<<<<<[////>>>*''!!:}:::!|!!!:~~))=====&=&&&&(d8$))!<<2<<!~|17c11171111755jrrlrrrtzFrrtuf53333:}1117",
+"~~))))^^^^1)^&^($$&$$6m6gggdbqoqqnssssssBBpppdkbb11)))~)~~~||||||}4:<<42<<:4||:|:::::<::{::{:{'::'_>>@@+.@+@@@>>>>//[32[/]];;;;;;;;;]]]]]]]]];]]]//3c332[[[<<<<</[///>>>'>*'*':}:::!!|:!~{~~))~===&=&&&$(8($&&$$~<<222!|771771111177775jlrlrutuEo5fjuljjhf}~~)~~",
+"~}~)~))&&^^111^(^^$$&(gg66666gggpsxsppppsssdkkbdbb7^1))}:|~}10}||c00::::<4::::||{:{:::{{{:''{::{'+'+++@+.@++@@@@#>@@@>>]//[3]//;;;;;;;;;];]]//[///[223233fe3222[//[</_<@'*'''<<:::|~!|::|~~~~))))==&$&(8n(&&=&&&=~:<<2:ccc111111111177577hhjlrutu5532<35}:!!~~~!",
+"}}~~~))&&&(^^^^^^^((&$66gg66(6gdbsxspppdpsssddkdb77b7cccc7oCyxc||0||:<||:<:<:{!!!||:{:{{!{:::_'-***+'+++.++++++@@@##%#%%;;;;;;;;;;;;;;;;;;;;]]//[2e533233333eee32222/_/_'>@''<<<''::!:!:!|!~~~~))|1117kd$$&&==&&&&=!:<i401111111111111715eehlluwFf332<</>**!~~~}",
+"}}}})=)=&&&$&))^^^(($$(6ggg666g6bxxppddppdsspddpkciccc7e7eoi7gkcc||!|:||{<<{:::|{:{!{:::{:::{''**'*+++++.++@@+++#@##@###;;;;;;;;;%;;%;;;;;;]]]]/[322233effhhfe3efffjf332<'>'_<:_'''':<{<:!|!!|~~~)1^77^&&&===&&=&&&&)c044|1111171111}}51155hhlutFf333[//'*----!!",
+"!!~~~~~)&=&&$&))^^((^^(666gg69ogbxpppppddppdpdkkpqii7ecc7bi77cp7c||||::{'::::{:{!|{!!:!|||***''****''.+.+@+++.+@@@@###@#%%%;;%;;;;;;;%%;;;;;]/[/[3[[233ellhfllhe3e3fhjhjff3[<<<''''{!:<<::|!!||~~)171&=--&===&&&&$$(b^14440|c111115}}}}5155efhlwFfe32<</**-*-'!!",
+"!!~~=~==))=&&&^&)&&&&$(doggooggo6npppdpdddppdpqkkqpii7c77ii7ccpk71~~!:!|{::::::::|!!!::|--*''*-*'''''++++++++++#+@@@##%%%#%%;%%;;;;;;;%;;%;,]/]232333eeff3ffeeffffhjfffeemuuff2:''{!{::24:::!|||)}c)=--===-==&&=&&^b^^^}43c}15111}1}}}}}}}5efhlArfff3[<'**'**'!!",
+"!:~~!-===&=&^&^&&)))&&)1jvvoooooggnpppddpdpppkikkpkkkkieikj777k7iccc|:||!::::|:::~{!{{*{**'**{'{*''_+@++.++++.@@@@@###%%###%%;%;;;;%;;;;;;],]<23feefeef32[33e3e3e3effhllhflurhhhf53|::::<:{:||:cc1)---------===))1b777777ehjffee555}}55}5}3ejllEl33533<@'*''*-{!",
+"!!~~!======&)^)))~))~}}}1jmmvmgoognndddddddppp7ikkkkpkiiiik77pki7cc0c|:|~||:||::{|!!**'*!-{{'{{{''{'>@.++@@++++@@@@###%%#@%%%%%;;;;%%%%;][[23hfllff33ee333[2223333e3333fhjuumrhf9hljfe7}|4:|||0c}-!---=----!~|77c7ii7711115fffee55555fe5c:5hlhrEf32232[<'''**!!!",
+"!!!!!~~~}!~~115f9jghe}}})1omvmvmmmnngdddddkpppb7kkbiikkkbkkbbopki777c|||||4::~|!~!~!<'{-!{--{'{{{{a''@@+@@+@+@@+@@@#%######%#%;;;;%%;;,3hrrlrljhe3333e333322[[2223e52333eiiffjuujfefhooof75}|0c~!!------!--|43cccc7b51bb17bejtulh555eeec3ellllzA33332[/<_''**!!!",
+"'-!!!!!:}:}55e5he1111))^&&(grmmmvynnngqppdppppbikikikkkdddkbbxqdbbb777ac0||::|~~{{{</:{!*-*!{{***{!*>@++@@@++@++@@####@###%;%%%%%%%,>}rrffhhhhllff333332[2232[[[[23332422ffeceeovojffiifjooof7|!!!!-----!::3cccc3c7fiibbbb9jjuzurllljfe5fhllllzlefh32[[<_''-**'<",
+"'<!!:!::::}~~}117~)))^^^^&$(gmvmmxCnnnn8gqqpqqkikiibbbddddqgpojbbbb777777aa0:{{{{:<_<-!!*{{{!{-{'{-'**.++@+++@@++#@@@#######%%%%;,:efhfffeeee3reeeee322///[[/[[2[23322223ffiec3ifoofi5ifffoooje5}!!-!--!:44ce53c}}59jlmjj99hjruulhrrulrtrlrrlrFhhrf33222<<'!--''",
+"<<[:::!!!!!~)~)^1~1)))&&&($$(jmvmmxnnnnnnqooqxqkkibbbkddpdpqqgkbbbb7777777a0||:{{<<<{--{--{{!!!-*'*****..+++@@@++#@@@@#@#@@#%#%%<fefrfe353333rh22233333[//[//[//[23333223eefjcccceiijieiioj7755ffe51)~!43333555555hjjj9771^75bbehlhhfhrlltzwwwArre3233322[<{!:<<",
+"2[[::::!!~!~)))~~^^^&)&&&$$&^^jvvmvmnnvmmvovvxopk7bbkpddqgddqqkbb7bb7b771|||0a00|'::--!*---*{{--*****''-+..+@@@.+#@@#@#@####@#<333fuh5333323hl[2[[2222222[[//////<2232233343efeic3ciiqqjjic}}}5c5bff9fe5335e}5575eff5f111111}115fhjhlrlhlrttwJDEle5533333<[:5323",
+"233::::::!}~~~~~~)))^))^&&&=&(9muvyvooxyxvmomoxpbbikkdddgdgqggdkdbbb77111})||0cca0|~--!{{{{!!-**-*-***'*...++++++#@#@##@##%#@3322lrf3232333ee3/2223323322[322[[/[<2[22253e4245iicccciooojc4||~}}}7eeomomf553c5555e5}5e9511}~~}7fe5htlhruzzEtrIwhffeeeeee5323hf33",
+"f3334:::!!!!~~)~~~)=))))&)=)=&&^vACuvvvCvxxvvvvqpkbkddddddgogdd8dpkb1771101}|ac|0cc1)=-~!{{-------**---**+++++@@++@@###@#@#<333euue3222233ee3[//[[[]]/[2[2[/[/[//<2<223iee443ccejc0ciji0eic0:||||}efhjjjArje5555551~}bj551}55hjhflrrrlrwIDDEJEfeefffhrflf33233ff",
+"ee32}::!!<!!-!~~!!~)~=)))&=))&)&(KNCAwvvyyxvvyxxqpkddddgddgogddbbdd7b711cc11cc|||caa|a~~~~--*-**---**--*...+@+++#@@+######3323htl3333[2[[2[3///[[///]//][[[//////2<<_/222ec4443iiooiiccccicc|}||c5eeeiiorvvulh555!~)~1hhfeeejhjrwtrlrwzEDtrDJuruullhfhlhhfeee33e",
+"33323}:::!!!!!!!}~)~))))))))))))^yNQOFAvovyxxHCvxngpdddddggogbbbbbbbb7777cccc111cc)||aaa~==-=-*.*-***'''+..++@@@+@@@@@#%<323elrl33[///2/[22[////]//]]//////////<<2<<<<22<2e4:244cijoc44c0i000000eiii5ihjfhmlotAj~::!}}hhfefjhjtAAtrutuzDwwEwthffhlllhlheflhfe333",
+"3323:}3:}:}::|}~~~~~))~~)^^~~~~~^xCGQOJFumxHyyCCyxoggkpd6dgojkbbdbbbbb77777c111c71|||||||~--=--=--*-***'*++.+@@@+++@++@}223hule[/]/]]/][2[[]]][/]]]]/,]],/[[////<<<2<23222344400cc44cicc440c00ciiiiefhjfjhffjmjffi}}}:frffrrrwzttwtrrwzzzErAlfe5333fhlljhhhhjfe3",
+"323:::335}3}::}}}~~~)1~~~~}}~}~~}vGvvFQKAAvyGyyCCymogbdggdoojb6dbbbbbbb7b77111c71|||1)~||~{==-=------***'*++@@@++++.@>332flrh32/]];]],/[/2]]/]]],,]],,],////////[<2<<33322244ccc|:<440eicacciciieiifjoloffifjec57iff53erlruzzttwwrrrtzzztuuAlffee333efhjrllffhff",
+"fee2233333535c3}}~}}}}}}}}|}!}}}}vyogguQQJEAAGCCGGynggggggoo9bggbbbbbb77bb^1117b|}1|~~)~~|~{~~=----------'+>'>@@@@+@'fffrwlh3333[///////[]];]]]]]]]],,],/>,>////<2<[2343434ei7}||:|4400cpkic7kjiicefoouyvmfje4435efjoohtEzDztwwuurruzEwrruErhfeffeeffhffhlhllrff",
+"fhhffffe53533}3}}}}}}33}}}::::}11nxgd86mFQJEEGNGGFGCmngggmoogkggggdddb177bb117qb1))~~~)~~~|||~~~=------*''*''/@+#>>3llrwtlfe3222[[233333[//]]]]/]],]>,/]////>///<:<<34:4433fjc4!|{::|00ackqkiceiiijvoojh5ej544333eihjvAJIIEDzuurtuzIEtlrlrAlfhfeeffhllheeehfflll",
+"rrrllhlff5ee53355333333}:::}}1^^^dxqdddd6uKOJFGQGFKGCynoqmogqggggdddbbb7^b777qb11)))~)|~||)||||)~~=--!---'*-'>.@/[errrulfee322[///223233[22[[///]/],,,/>/>>////>/_<234:444ei544|{:{|||0acccjojiiijvvvojffj54:433eieelAJJJJDwuruttzIEtllhhArhffffhhhhllhhlhffhlll",
+"wtturllhlhef55e5ee5e5333}}}1^^(^$dxn6g6dd6mFOJEFOKKOFGvmmmoggdgggg66ddbb^bb7bg^^1^1111)}}||}||c1||~--=-!!:-<<@><[3rruhhf3e3[//];;]]/[/[[/]]]////[[[////>]//__/>////32:::43343<4||||00||acceijovoovvAujhjle4343eeffhrEIIJJJJzttutzEufflhflwhlrrrututttzrlllrrtwzz",
+"DDztwurrrlljhhjhf55ffe55551^1^^^^gxqg666g866uKOJKOOKOKGyCvgogg6gggggdddbbb7bgb1b71^11c111}111}17c1c}~~~~!<<_/</[3zwlffffe2]]]//;]]]]]/]]/[]];],,/]/[//[[///_>>>///222<4334444344||||||1acciiffovAAFAAvvvf335eeefjrzIIIIIIIJJEwtEwlhfrzwzKIDDDIIDDzDDDIDzEDDDDDII",
+"Dzwtwrrrrrhrlhhhffef55511999^^^^(gxgddd666666mFKOQQOOQOFGymgogogng6gg6dbdbbgg^^11111111111)111111cc11}~~!:_2i2<[wzrlhhee2/]]/;]]]]]]]]]]]]]]]]]]/,,,],/]////[/>//[2223334<4:44440|0||||00cijjoouAEJEFAFvofhfifhlzIJJJJJJIIIJJEArltFKQOOOROJIIIIIIIIIIIIIIIIIIIII",
+"OOOJJJJJIDDDwtwtrrhff999999^^((^(gnddd(66d66666mFORQOOOQKFGvmmngogogggddbdgv^^1111^111111111111a}1777c11}}cjl33wwtlfef3e[]]/]];]]]]]/]]];;;,]]]]]],]/]],,>>>]/[/[3334:4::::440400||||||7ivCKHCKOQQJJJJJFKFAAwwFJOOJJQQJJIIEwEEAFJIIIIIIOIIIOOQRSSRRSSSSSRRQOOOOQ",
+"AIDDIDDDwEwAFEzAzwuuurlgg69(^^(66mxq6666dd66d6666uKRRQOQROKGCmnmmmgg66bbb6ggbb^1111111111111}1)11111c7c7oojrhfwIIzwlhh32/]]]];]/]]][]]];;;,]]/]]]],]]]]//,>>>////3eee4<:<<442cccc|||00coGGuvrrwJJFtwAFFFKJKJJOOQOJJJJOJIDEEEEJROIIIIIIJOJOJQRQOKFEAwttthlhehhttA",
+"3effrutwttlrrjh9h9jllrrmojj9g966gmyggg66(d66666666gGRRQQRROKKGymmogg6g66ggydbb77^b111^1^111111111177ccjvvvFtrAAlrwtwtle2]]]/]]/]]]//]]];,]],]/,/],],],]]/,/,>///<223222224422333c400c7vKuvvAAwEzAwutrvuFJJOQRRROJJJIIJIIIJEIIOOJIEIDIIOJJJJEzwttrllhltue333333hh",
+"hlfeeefh5hfhllh9h999999999996669gvGvmmg66666dd666666yNRRQRRQKKKymngggogggymbbbbbbb^b7777111111111117iovyyAJEJAh32[5lwrr3/]]]]/////[]]];;;]]],,,,//,,,,///]>,>//[3232222<<24223eeeccceyFuvuAuAEEzwtrrlouFJORRSRRQOJIIIJIJEEEIIJJJJEIEIJOEEwullhfhfjhrrwEr33333fll",
+"ljhfefe33333515b9f9995777999999(6gCmmmoog66668668dddqnCNRRQRRQKOGmgggggomG6bbbbb7bbbb1b77111^111bbiovoofjFJJJwje2/[[ewth2/]]]///////];,]],>]>]]],]]]]]//>/]/>//333222222<<<2[3fjji35AEurwAFAFEIEurtuluEJORRRRQQQQOOJJOEEEEIIJIJJOJJJIJztullhhfhfhjrrtEDIrlrurwzw",
+"lffe5333::}}}}}}1117b5111b^^^^^^(6xngg6g669gg66666d66gnyCNRQRRRKKGvmmmxmCyggggbbbbbbbb11b1177b69qfi7e4eefrEJAroje32[]3ttf2////]][/]/]]]]],]]>]],>],]////>>////2e442<<22<:<<[23eluhitJttFEAFAFJEulrutFJJQQOOJJOOQOORROJEEEEIIIDEJQOJEEEuulhffhfhlrrtzEIJJOOOOOJIt",
+"heee34::::!!}}}}}))~~)1^1^^^^(^^(6ygdgggg666666ggggg66nnnxGQQQQOOJKCvmyyMnqggqgbbbdbbb7bbdgggjji7c|:4433flKFrvoiie33[[5zrf3[/[/]/[[]],],,],,>>],>>,,//>//>//[2ee2<<222<2<22333eejlwJIEKJJFKFJJvoluFJOQOJIIJJJJJJORQOOQJJJEIIIIJJQJEEJtujlhfhhrEwruEJOOIIIIIIJRDr",
+"e33e334:|:}:}}}}}~)~=~)=^^^^^1(^(gndb6666ggg66666666ggmnxnnyGNRRRQJKKGCGMmoqqonxodgddqoomovomgic0000ic0cevEFojjfjicc4[[eAlf3[/[2[//]],]],,,]>,,>>,,,>>/////22ee<2[<<223222322e333lEDIIIIIEFKJAmtFJOROJIIIIIIIIJQKJJOOROOJJIIIJJEKOJIFuurlrrrutzwEKKIIIDDIIIIOKll",
+"323}}3}:43}:}}|}~)~)====&))&&&^^bgng6d(b6d6666gggnggqgonxHHCHGGQRRROOKKRMCyxxmnyyyCCyvmmqggbb7acacccc0cjjAvFuvooovoqqicclArj3222[[]]>,,]],>>>>>>>,,,>_//<2243e3<2<22223332423323fADAEIIEIJJOKFKJOROIIIIIDIIIIOKEAFFJOROOQOOOJEEEKQJJzwuurrwzzIJJIDDDIDDzDJOKwhff",
+"333:cc3}:|}|~|~!~)))=~===&=&&$&&^^dd^bb(6d6d6d66666666gggnxnnCyCGNRRRRQRSNNQNNNQQNNMMLHBHxxxsppppkkkkkpvyAvyGyvoqqyxqqoqiyFuoiice4444022222_2________:<42442e22<442232eee53ee225uDwzwIJIIIJORRRROJIIIIEEIIJJFtAwFEFJORORQRRQOKEFQRJEEztEDDIJOJDDDEDIJIJJKFtlff35",
+"22::43c4}|c|!:!~}~~~)====&&&&)))^(d(^((^((((((66666666668gns88nnnyFNRSRSSSRRRSSSSSSSSSSSSMnnxpxxxspppppxGCovCCHCyxxxHCxqxvGFFFvookkkiiccc0c0cc0400cikiiiiiijiccc4ccceeeffeee3cehEEDwwEJJIOQRSSQJIIIIIIIIJOGtlrutAEJJJJJOOQQOQQOQRROIDDEIIJOIDDEIIIDDzuttrllfe35f",
+"::4::4}:}}:!!!!!!~}~~~=))&&&)))&^bd(((((((((6666(((((b((66gnnnnnnmvuFQSSSSSSSSSRSSSSMMRRRMxqkkeiiiccccjovoooooooxyxqqxCCCxxGyuvoicc424044222444000c00ciki0jicccciiiiqooovvCvvovFJFJFFEJQSRRSSRQJJIIIIIJJFtvomvuwwEEIIJJEEJJQQQRSSSJIIIIOOIIIIDDzDzzDrrrlhhff3233",
+"<<::::::}}||}!!~~}!==~)~~)&^^^)&^bdd((((((((((((((((6bd(666gxxmvmvyyvAGRSSSRRRMSMMRMSSSRRSCvyvvmqkkkicifjfiiiijikkkkpkxxCxyHKGAvqpkiccc40444044aa44444c3cce44440ciciikiqjooovFKQOOJJJQRRSSSSSSSOOOOOOOFwyvvvvvutAEJIJJEEEJEJORSSSSROOQJIIDzEEDEzzttrrrrrffe3322[",
+"/'<:::!:}}!!|!:!!}!~~~~===&&&^&^^dgo(((((((((((((((^(999699gvxyvvmmvmmnCHNRSSSSRNHCHGNRRRRHyvvvvvyvoojfjiiji5eiik400cioxqxxyHNGGoiiiic0cciiii044444440444c44<:44c4ccccciiifjjoKROJOQSRSRRSSSSSSRRQOQKGGGGGGGGKFGKOOJJJEEIIJQRRSSSRSSSOJIIDEzzDDzzuurjhlhe332222/",
+"/'<2::!2:}:}|}!!}!!~~~~&)))^1)^^1bddb(((((((((((((^99j999996gqnnn6d8qnnxnxHSSSSRQKFGCCNRRRNvvoqqoovvyymmjiee7eiie00cciikiikpxNGKGvic044000400000400000cci34044ccc04cc4eiicijovJJQRRSSRQRSSSSSSSSRROKOOOQQQQQOQQRRQQRRROQRQRSRRSSSRRRRRRQJJEzzzwwurlfffefef32[3[]",
+"2<<[23:}4}}|}}~!!!))~~)^1^))))&&^^b(^((^((((^^^99b9999999b^(((8888888psxBMLLMLNRRRQQKGQRQRQyoooooovovAAujiieceiiiceciiiiiiicioCGGGoicckii0440424244c04ccccc0ccciiikiikkqqpoyCQRRSSSSSRRRRSSSSSSSSRQQQQRQRRRRSSSSSSRSRRRRSSSSSSSSSJJORRQRRQKAAwtwtrffeeee33e323[[",
+"[<2['::}}::!}}}~1}5111))=&&))))^^(bbbbb(^(9977b9991b1^((($$$$$(8d8d88ddsLLLLHxqvGKORRRQRSSRMHyoqijoxvvFFvfee7ei7eieikkikicii00oGGGyqi0cc0iiiic0444444444cckkkpxxxxCHCyyxxxyGRSSSSRRRRRRRRRSSSSSSSSRROOOOQRRRRRRRSSSSSSSSSSSSSSSSRJOOOQOOOQQQKAtwtrhfe53233e332[[",
+"2<<///<:}!}35511^~~~))))^^)~)^1^1bb9991997b99b1^^(($^$$$$$$$$$$(8888((8sLLBBHxppkoCKOOOORSRSQQNyoqkqooKKvlfeejececciiiikiic00iioyGGCqpi0024c0ccciiccippqxxxqxpqpppppqppqyGNRSSSSSRRRRRRRRRQRSSSSSSSSRQQOOOOOJOOOQRSSSSSSSSSSSSSSROOJFAtAAFKKQQGFAhffe3e53ef32222",
+"<22<22<2352:}}~~}~~1}1^^1}}115511b9b11bb5711^^$$$$$$&$$$$$$$$$$$(888d((8BBsBBCxpiiejvFJOQRRRNGGyyvxvCyuAuoheiecceeiiiiiiiipkkkikvyCGGvqki4cicciiqecxMMHxxkkiiiiiikpkpkxGRSSSSSSSSRQRRRQQQQQRRRRSSSSSSSRRQOOOOOOORSSSSSSSSSSSSSSSRKFAvjfjjovyGKNRNyjhhf3ee332<:[2",
+"2332:<<<<23334|}}}55}555}3}^11))1iifee51^^$$$$$$$$$$&$$$$$$$$$($$(88((((sBsxxsxqiccci7gyKORQRKGyvvvvyAvFvoooi500ejiccecikppkppiikyvvGGyoxkiccciijcxHLpikqqqqpkpkkqxvyNRRSSSSSSSSSSRQOJFFOKOOOORRSSSSSSSSRRRRRRRSSSSSSSSSSSSSSSSSQKuvohffeeeivvFOKQNGvjeee3333223",
+"22<<<2222333fee3}57}}}11)==)~!~}5rof1^$$$$$$$$$$$$$$&$$$$$$$$$$$$$(d8(1^dBssBBxqk70cccccjuGORJJFCCvvvAAKClmye7ciceijieixBLBBpppppxyCyyyyxxxoiciie4xHHqkkkiciqqqxxyHNRSSSRRRSSSSRQJJFFKKKOOQRRRQRRSSSSSSRRRQRRSSSSSSSSSSRSSSSSSSSGAuvjjeieefeffjAvvGNQNvjffe33333",
+"3223233235lhhjjf53:!~=~~~!:!}}eeeg&$$$$$$$$$$$$$$$$&&$$$$$$$$$$$$$$(d7b7bsBsBBBxqjc17111akbGNKEFFFGAFFGKFyFyiiikjjjojxBBi2<0sxBxppHGGGGCCCxvvoi33iiCMxxqpkoqkqovGRSSSSRRRRRSRQOJKFFKFEJJOQSRRRRRSSSSSSRRQORSSSSSSSSSSRRRRSSSSSSRCvyvoofffe5eeefhehjvGNRNCoe33253",
+"eeefef33333ujje<<//_'!!!:}5ef5^$)&$$$$$$$$$$$$$$$$$&&&&&$&$$$$$$$$$$bkbb7dBsBBBxvvj771|||77kyCmtAFFKKKFKKKGGxqpovojnHxc222<<42_cpxHNNNQKGHCCxooic44cHLHCxxqqoyNRSSSSRRRRROROJJOJKJFFJJJOORRRRRRRSSSSSSSSRSSSSSSSSSSSRRRRRRSSSSSMoooooojifeefefljfhfejvyGRNComjh3",
+"jhf3e332<<::gq0{''>,]<:}551^&$$$)$$$$$$$&$$$$$$$$$$&&&$$$$$$$$$$&&&)&bkbbbsBBBspxyvkc1111ikkyH77ovuFJJOOQNKKxqkijjCGe</2<222/[2[24ixKRRNQHHCCyxqqicciHMHxCGNRSSSSSRRROKJIJQJIIJJFJJJJOOOQRRRSRRRRSSSSSSSSSSSSSSSSSSRSRRRSSSSSRQHjiijjjfffjjjjjrhifffe5eoyNRRNyuj",
+"fe52::<<'<''!1c!'''<353:<*=&&&$)$$&$$$$$$$$$$$$$$$$&&$$$$$$$$$$$&))==)dpbbbBBsspknyok77777k7qN7c7cimFEJOROOKvqjovNyc2<[__<<<[///[442fyGRRRQNHGHCxxxpccHSMRSSSSSRQOOJFAAAJOOJIJJJEJJJJORRSRSSSSSSSSSSSSSSSSSSSSSSSSSSRRRSSSRNRHNCje55fhhfhffjjlojffhhfee5fjyGNMQG",
+"Mvic|::'!'!'-!|:{{'!!'>>>>>*=&&=$&&$$$$$$$$$$$$$$$$$&&$$$$$&&$&&=====-&dpbbsBspsp7oAm77111kbdGo7ec7iovFOQOJJGvvGKq4243<:__</[222333[[ilvNNRQNHHMMMCCHCNSSSSSRQKEJJFurovuJQOJIIJJJJOOQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRMRRNMMHNo5ee3e335eeehovrjjmmloiee534ciqCM",
+"xMMCqc|:::!!!!!{{{'*****>>+>>'-=&$$$&$$$ $$$$$$$$$$&&&&&&$&&$&=====&===$dpbdBBpss77mCobnb117byy7iiqoojvwGQJIEKQCo704444:_//_///2ee3323jjouyyHHHMMMRRRSSSSSSQOOFGGGvojfoEOROJJJJOOQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRNRSNNNvove53355efe33ehjrojjjiiec42<<_<{{}i",
+"|bpHMHx7|:':!!!-!{:-****'*++>>>>.=$&$$$$$$$$$$$$$&$$&&&&$&&&&=====&&===&&bkdsLssxp77oymNn11i7dH7kkkojmu9bvGGGug7ceicc444c2__][/ee433c33jjhijjipyMSSSSSSSSRSRQQKQHvovvvFORSOOOQRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRQNGyoijve55e35effeef5e33352<:<44__22:::|:",
+":{{|kxHMCk|!!!!:!!!---*'*****''+>>.&$$$ $$$$$$$$$&$$===&&&&)=&=&&&&&&==&&&kkdBBssq77kvCQKd1k7kGi77jjjwj77ej9}}c04040ccc400022/<32333444ifffejfxNSSSSSSSSSSSSSSRMHCCyGKQSSSQORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRMHyFvjifjovfeehe3332222[/<2[/__<_<44:::2::::",
+"_::{{~7pCNHqc~|~~!!!--**********'@>>+=$$$$$$$$$&&&$&&==&&=&&=&&&&&=&&==&&&^kksBBpskii9CGQGb779Cbiilrto155ej7!{|4444::4ccic0iqif3c22222c3ihlvGMSRQORQJKNMSSSSSSSSSMRMRRSSSSSRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRNNyojhAfifjjjjo52242<<[//<[<<[[/@'>>>/_2____:__4",
+"4_a__{_{|kxMNxb1~!!!~!!-***----****++@@*&$$$$$$&$&$&=&&===&=&&&$&&&=&&&&&&&^bkBBBpkk77oGNOvbioymiirwv5}11fj~'*{{'<4::<<3iiijkvyoi3433223jHRSRQOOOOJEztmooqxHSSSSMLMSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSNNGvjifhruffec5cce:</>>>_//<[<[2[<@@'*@>@>>/>>_::__",
+"___:a_a__:{7pHNHn1)|!~=~!-*--*-******+*@>*&&$$$&$&&&&&=====&&&&&&&&&=&&&=&&&^bsBLspki77vFQK9joqx9jAt55111he:''''>>':<44243effyyyvoii5iyMSRQOOQRQJEEtuji44ckokqCMSSSRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSNAmorof5fl2<<<<::44:<_/>''>>//,///>'*>@+>>*>>+@@+_'_",
+">____{{|a_aa|~dxMNHd)~!!-~-!!-------*'.*''>*-&$$$&&&&======&&&&&&&$&=&&&&&&=&1dBBLsdi77byOQCojoyjuF97}}7597''___//>_>___<223fovvvvovHSSROIORRQJIEEtre4|0443ioovoxHHSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSROQRRNGrrmjff342h2_<<<::|0|:<_''''>>////>+@+*+++@@@@>#@++++>",
+">*+@''____|aaaa|7sHNHn7~~~==---~------**'**'>'=&&&&&=====&&$&&&&&&&&&&&&&&&=&)1dBLBsik77oFQQujmCjFj157}55e5**_//_>>>>>''<4ce5efvyHSSRQJJORROIIIJIJjcc0004ccciovyyCCNSSSSSSSSSSSSSSSSSSSRRRRSSSSSSSRRQKFCvjee5e3332<e3_<<{::||||!{---''_////@+*.*+@++@@@+>>>@+@+'",
+"@+@+++*'''___{aaaaadxMMyb1~~~~==--~--!--****'''_*-&==&&=&&$&&&&$&&&&&&&&&&&=&=&bnBMBbki7iFQRKjoFmm1}55}}55}''>,___>>>'>_>/4efmCMSRQOJORRRJIDIEEtwwfcicc4ceeiiejvGFQSSSSSSSSSSSSSSSSSSROOJJJOOOOOQKGCmoofi33222442<4e/<{{::{{~||!!**''>>>>>'+...@@+++@@@@@@@@@>@.",
+"+@++++.+..*''{_{||aaabsHMCq7~~~==---!!||)---*'*'_>>*-====&&&&&&&&&&&&&&&&==&)~)^bxLMsikiivQSRvoFo7}5e75}55!*'>>*'_>>>_>//3eoMSSROJJORRQOJIEAtwujijjccccciiiiiifjvFSSSSSSSSSSSSSSSSSRQOOJJJJJIIIIztlfeff3322</<<<_/e<<:!'{{{|:~|!!*'''''_>'.'-++++++++@@@@@@@@@@@",
+"@++@+.@+....++*'{_{|aaa7pxHGnb1~)=-=~~-~||=-*--*_///<{====&&&&$&&&&&&&=&&))))~))1pBMLpkkijGSSGvFic|cfe5557-'>''>>_//<225oMMSSRQRRRSSSQIIEwvvvovjeeoieiijiiiiiiijvKSSSSSSSSSSSSSRROJOOQOOJJIEIEAtuje43e332////_/</53<:{{:'{!{~-~!{''!'''''......+++@@@+@'>@@@@@@@",
+">@+++.+@.+.+....**{{{||||7bpHMCq1)~~~~~~-)~~!--*>'<:2__'-=&&&&&&&=&=&&&==&&))~)))bxBSBkqiiyRRSCyic}}ejf5e5'>_'_/'<<<3jyMSRRQQQRRSRRQQROzuhii3covoijjfiifjjiijjjvGRSSSSSSSSSSSRQOJIJIIJJJJJEAwlohfe3/2322<//_///_<c<:{{{{{{!!=!!~-'*!''<''...-++.++++*+@@@@@@@@@#",
+">@>+++.@..+++.....-**--{~||77pxHHni1~~~~=~))-!!**'::'_//_'-=&&&=&=&&&&=&)&&))~))))kBLLpqqjoQRSNv77}}efe5e!_>>_'<23fyMSSQOOOOOQRQOJDIJRKro3e340cmojovyojjiiijjovFRSSSSRRSSRRSROOIIIIIIEAAAAvvojiie3</22<[///___/<e<'':{!~{~!!~~{!-!-''''-*..*..+++@@+@+++@#@+@@#@",
+"@+@>>+...+++.+....-..**-*{{{~akppHNyg7})~))~~!-{!!!!'''__'''-=&=&==&&&===&=)~~~))~1sBMCqxvoGRSRo77}ceff5f'''<<25mHRSROJJOJJOQQOEzzDIJOlfjiiccceioooovCoqjiijoyFQSSSSRQOJKQRQOOJIIIIIEuurleiijiij32//<<<</_/___/3:_'!!!!!~-~-~!~-!!-!''*-.++'.++'@+@@++@++@++@+@@",
+"@@@@>>@..++.++...........---{||a1ppxMHn971~~~~~::!{!{*'''''___*==&&&====)===~~~~)~~^BBMxyyvGSSMj77cefjfhe<<::fCSRROJOJJJIOQQJAtEIIIIIl2<24ciecccfAwvmvvoovvvvwKSSSRQJKJEEJQRRJIIDEzwtrjee32cecci42</_<</____'<44'{-~!--!*---!~~{!--!!'***.+@>*+>@++++@+@@+++@@++",
+"#@@@@+@+.+.+++.+.....+.-..=.-=={||1bpsHNCok77}}~||!!!!{'!{{'__/_*-&=&&=&))=)~~~~~|~)sBMCoyxyRSSo7i5ejlhr::5yNQOQOJJOIIJQQOJDzDIIIzlfh[22[<2<4ccijAtromtAyvyFKORSRROOJFAFAEJJKRQJAtulrjfe22<443c32<<_<<<_<<_'_<e:~!-*-~!--=-~~~!-!!'!!--*'**.@+++*+++@+@+@@++@@@+",
+"@#@@@@@>#++..+.++.........-...=---{|a7pBHNGyqi7c1}~}!!!!!!!!'<____'-=&&===~~~~)=~)~~)BBMxHyoNSSyeieeorrumHROOQOJJIIIJQQJEtlrrzzuff333/{:<[[2<<4ijowtvovwutFEORSSOJJJJJFKEJJFFFNROAvljh52//<422244_/_<<<<<<{'_e<{!~--{------!!--!!'!!--*'**'*@++'@@++++@+@@@@@+@#",
+"#@+++@#@>#@+.+.+.+++....--..-.-=====~~17pBHMNGvjbc71}||!!{!!!{'*'___'-=&=)~~|~==~)~!!dHLHCvqHSSCcjjrwFQROJOOOIIIIJOQOJzrhlltwzhe3222/<<<<<[/[2eeeeoAwmrAAzEEOSSRQOJJEJJJJOJFAAvCRRGvhi2_/<:42<<2<<<<:<<:::<<3:{!!!!{*-----~-~~~)!-!!!-!-*'+*++@@>++@@@@+@+@@++##",
+"@@@+++@@>@>@.+...+@.......--...==------=117sHMNGCofb1c}}|~!!!!{{{**'__'{~~)~~{!~~~~~~~xBMxxqCSSCjAFQRRQJOQJIIIJOOOJDthehhllllr332[22<<[<[<2/2332333jwurvAIJKSRQOOKOKKKJJOOKKGyvyFNMGyc<<:<:<<<<2<<<<::<::!<24:{!!!!!!{-===-!--~~~1}}}}3:'.*'+@'++.+@@@@@@+#@#@@#",
+"#@@+++@@@@@>>+...+++.......----==-------==~|7pHMHCvuof771}}:|:!!'{{{''_<<!))~-!!!{!!~~dHLsxqxSSNGRRRRRQKIIIIOOJJIErh5feh5323e332223//'<[//[[5e333333rjhjtIJRRQOJIJJKKOOOOKGGGGKKyyyMRx0|:<:<<<<</<{<4<_<::22'{{{{{{{----=--=~)1717}}}7}}'*'+.*+.+++@@@@@@@@@@@+@",
+"#@#+#@@+@+@#>@++...+.........-------------=-=~1kBLHvmmmof7}1}}:::{!!'''{{<_{~~~~!{::::|xLLCGySSRRSRRSSOQRRQJJIIAl55ee322[<[2[[33/[2/<'<</[2efe35222[3lrhuIQRJIJEEEJFFKQROQNNNNQQNGMSSRHppci0||:<<<::::<:_<5/'-{{*{{-{-!-!!~}~~})~!}}}3:!!'++.+++++@+@@@@+@@@+@@@",
+"@@@@+@@@#@@@+@@@+..+...........---=---=--=-----~)7sHMyooomlj5}:|!:!:!:<:<<___:!!!!:::44bLSNRRSSSSSSSSRRMGtEIEtl15333}2<<<<2<223[/2<>'<</[2eeeee2222[2fttDJRJIIztuutAAJKKFKGNMMMRSRRRRRRxpkpkk044::::::::<3<<::''{{{-!{!~~0|}1}!!~:}|!!-'''*@+++@@@++@#@@#%#@@@##",
+"@@+@#@@@@+#+@@@@@+....+.......*-----.---==-=-.-=-=)1dLLCmjjojhf55}||!:<:<<<//[<{!!{:::}9MSSSSSSSSSSSNvolwEzul5e5}:<:2:!'/[<:2232[[/>/'<<23ff533[2233fftIIROIDwrrwutwzzEuuujhjfifiiibkvCiccc0||444::::<4:e:<:::{{!!!||!:~||~~||!|:!!!!!**'''++.++@@+@+@#@#%######",
+"@@@@@@@#@@+++@+++@@+.++......---=----------=--=--===-^dBMHxjibhjffe534::<::</[22<<:5evFFOSSSSSSSSQKOurwEzr9559}!:!<2<!'<<<<22[23[[/[<[//5eee32[[32efjhtJROIDzwrrutzzwzEruwrf33eie53::|ceee44||4<4::::<<33<<''!{!!||~|~|||!~~~!!!!!!''!*+.*+++++@+@@@+@+@+@##@#@@",
+"@@@++@@@@+@+@@@@+@@@+++...+....**-.---.----=----~}}-===)bBMMCjfb5eee55e4344<<2cijhrtEJJQSSSSRSSRROQJwEwrj5}5}!!!<:<''{<<<<<<[[3332[2[[/3e3ee333233ehvwIJRJDwwwwrruwtEDwjlEr333e5353:<:4:cic4442<<<:<<<34<':{*{{!||||||||:|||~!!!!--**-*+++++..+..+++@+@#@##@@@#@",
+"#@@@#@@@@@@@>#@#@>+++@.+.....-*.*..--***-...=.!!!!}}---=-~^xLMCofi775e537eeijjjouEJJQRRNQNSSRSSSRQREtlj153}~=-!'!!-!'<'<'<<[[[3332////2f32ee32333fjfAJJOIIDtutzzttuwzwtlAwjee3ee335:2432:40c42:<<<::<23<::{!!!!!|~~~|}~::!}1-!{-!--*'+++*@++++++++#@@@#@@#%##@@#",
+"#,@@@###%#@@@@@@@@@@#@@@+.+...***-.-*.*..*..*!!!!*!!------=)^nLRHofffeeeiffjjuAKOEFJKFFJwmMSSSSSSRKmg1}}!----!:!!--!'''</<[2//3h3//][]f52eee3333eeejFRQJEtIwrrzDzruuzzrjrjjfefiie55344:3444:33<<:<:<43<<{!}|||~!!}:|~~~!|}5}!--**-!*'+++++*@.+++++@@@++@@@##%##%",
+"@@##@@@#@++@@+@+@##,@+@@>***+.*-****.**-.-**!!!!-*-!*---!-----)nLRNyvfeeiflwFKFAwwFAJJAwuvHSSSSSSNm1}!-==---!!!----!'''<_'<[[2eh[////[h3eeee33[[eeerKROEultDttzDwwwEIErf3ioujhhf55771c3544444c444<233<44||||!~}~|!-!!!~|!:!:----.-.''*...++++++.+##@@+@@#@#@@@##",
+"####@@@@@#@#+@@#@@@#>@@@@@*.+.+'*++++*.-*'*!!!**.**--***{{{{{~!~)8LRNGvvyFKAurvuFEJJAuuAzEFSSSSSSm~~-===---'!-----''''<''<2[23e3[[[[[/h3hfe3[[[3eelEORJwrjfwJwtzEJEEEIKvqpkoHGjjjjjfic55}44<4:4432e34:4}|||}|}}|!!!!!!|!-!!!****-.+.**.+.+@@..++@@@@@@@#@@##@###",
+"#%@##@@##@#@@@@@++@#@@+++@>'+.*'**+''>>'_<<'''''*'*''***'*!{{-!~~~~8LRRROAtuvuFFKJAutwEEIIOSSSSSM1=-==-=-'**=-----''!<':<<22233322333[jfee2/[[4eifwIRQIwrjluFEEEJJEwwEJQHCxovFAvfiiie5534444:::44e5:24|}}|||~!::!!!!!!!!''!!''''*.*++*+@@#@@##%;;;;;;;,;%##%%##%",
+";;;,;;,%,#%@+@+++@@+@++++++''>+':<<<<<<<<<<<</<_/__<<_>_'''{::{|~|79myMSRNFGKJJJJtrutwwwEJRRSSSSx===-----*----***'''<:22<222533335532<ehe243cciioAJQRQJAuwvmmKJEAEEAttDQCvofjoAumjiffi5c4444:4:3e3c34:}}}3:!:||!}}:::''!'**'>'''*''++@+++##,;;;;;;%;;;;;;]/];;;;",
+";;%;;,,;,;,,,,%@#@#@@@+.++@+'@...**-!!:'!{:::{{'<<<:<{<<<<<:443cfruvlooGRSRSRQOJJAAwAAFEJRRNSSSM(-----------*'*'*''<:34::24efjoooqkkc0oyyqooqqjjuJOROJIEwvmoAwFEEAEzEtEOQAvfjfgwullojff5334::3ff34c43::::::::|||}3:!{**-**-*'*-**...+++@#;,;;;%%%%%%%%;%%;;;;;;;",
+"%%%;%%%%;;;%,,]],/],,,>@@@@@'''+++++*+**.****-****-*{*'*'*!|||emoofffjmvuKRSSRQOOJzAEJJJQKyxSSSMc'*----!---'-**'**'cnxHBLLMMGGGHxqki7aioovjfjoolJJRRJJIIulrrljlGEwwzEwEOJOwojjf9uuruwtljf55imrj33354c}::::!::!|}}::!''**.*-**.**.*.+@@#,;;%#,#%%###%%##%%#%%%%%%",
+"%##%%#%%##%%%###>,,,,,],]/<//<>'>>++**.'.''*'.***.*'**-..**!}}}}1}1111fluAAMSRRRSNKJJJQNCyxxSSSH233<'''*---*****~boyxokkvKNyvvyvvkii77oofouurrrEJOROIIIIrrwjffjlwJzwEDJOJOOtrmjjjutwAFwvvvvrje5544c|||::!|!:}4!~!!!{-*-*..--***+*..@>>,,%##@###%##@####%%%#%%%%;",
+"%%%%%%%##%%%%%%%%%%%#>,>,>>>>>////>_''*+'+>*+''**+*''*-**'<:}!~~~^11bfojlg96nMRRSSRQQNHvvGHMSSSC23332<'<<{'''!1iijoiffjomovCvvvvoooofivmjomtAuwJJROJIIIIDzrjfjjhjtJIIJROKQJOAoj9999mvulofe9}c}}}~!~~!|!~!}}}|!!!!'*!!**-*'.*..+...+>>#@#####@#@%@@%#%#@##%%%##%%",
+"%#%%%%%@##%%%###%%;,;#>,>>>>>>>>>/]//[///:<'*'**+*'+'-'!:::!!-~~~159jmlfb1b999ySRRORMNCoooyHHSSHie3333<:::}7fjjovuurojolfejvGvvuoofb57lhhjhjrDIJQROIIIIOIEwttutljhltKCuuuAFJKmbbb^^^^^b^^~)~~}||~~!|~!!|}}}!!!!!!{'-!-'-..**.++..>,>@@@##,,%#@@#@##@######%%%#%%",
+";%%%%##%%#%%%#%%%#%%%>@#,>>>>>>>#>#>,,,,>/,]/@@*''*'::!:!!!~!~~~~19fjh977eee759mMSRymvHNyxyxxSSMNGyvvuuuuAAAwtAEEzAwwAttujffvutAtwuoofwururuuzQORQJIIIIJDttwwulfeb59eb99gvoyKQndbb(^bb^^^)~)}~~~)~~!~~~~}!|!-!--*{*-***.-*-**++>>>>@>@@@+@@#@###@@@@####@#%####%",
+";%#%%%%%%%##%%,,#%%,,>>,>>>>>,##,#,>>,,;>>>],@***'!:::!~~!!}}~)15fhfe555ife55fhmGxSRGvovGMHCHRSMvvuuFJIIEIDEEDIDwtwtDDEwtuwlAJIDEwllofuhjljhlAJIRJIJIIIJAlhfe557577bb6(6d6ooxHMnd8dp(^)^^11~~)~~=~~~~~~~~!!~!!*---**'+**.**-*@>>>@*@@@@++@+@@#@@@@@###@###@###%%",
+"%%%#%%%%%%##,%##%######,,>>>#@>>,#>>,,;]]>>;>''''!!!!!~~!!~~}~7eff971}55eefjovyo7knMRNyyyKRMNSSRQOJJEEDIDEzzEIEzztwwtlurrrujltwwrlb^^^3<333ehEIOOIIIJJJJulhffe999b7b96666d6gqxLLddbd^^(^71)))~~~)=~}}~~~-=~!*--!--***'******>>@@@@+++@+@+@++##@@#@#@######@###%%",
+"%%%#%#%##;%%#;%##%#,,,,>#####>#@#,>>,>,],,]>'''''!!!!!~!!!!~15eeef71}555}efoCokijojoHSROJKQMSSSRQOJEEEzwttwtrljlhhlhe5fheff57foh71~)&&3<235erEDQIEwtrrruuwulljlmvummmgmgg6nnBBLLdd(^^b711^^})))~~11~~~~~=------------***.*'*'*+@++++@>+@+@@@#@@@@##%#######%%%##",
+"%%;%%%%#%;%%%%,##,,>#,,,#>>>##,##,>>,]];]/>>'''''!'!!!!!!~~}cc55771}3c3}efjoqiikiiiijxMRKFuvGRSQOJJJEEzttutwrjffeh5}::::'''-&)c4|=$$$$2'::<2uEJQItljjjjlhllrtrmgmmmmmoomooxxBBs8((bbb71^1^11^1^~~)~~---==~=--------.*-.-*--***++@@@+@@+@+@@@@#@+@#####%%%##%##@#",
+"%#%%%%%%%;%,%%;%#,,#>>####,#,#@##>>>>,]///'-'-''--'{!!!!-!}}335}}}}c3}ceiiec17kki7cijiqCRRKyFGSQOJEwuturwzwtrrjjlf:2<<!<<</*&&1}=$$  $<':<<3wzJODtrlhhhfeejjrvutumggggggggdnsddd(6bbbbb711^^~11)))~)-----!----*-****+*'*****..*++@@@@+++@@+@@@@@@#@#####%####%#%",
+"%%%%%%%%%%%%#%%,,;%,#>####,,,,>###,,,,23/'***''''-*{!!!|}3}5c55}}:55ceicc}}cc1cii7c7jeeivQQQKuRNAEEtrrrtrhhjjhje}:<!!!!!:'>-  $($$   $2'<22fEIOIEwrlhffhf999jggmmvuymggg6ggnnpd66j9bbb1^111}}1))~~)--------{--!!**-***'*''****++.++@++++++@+@@@@+@@@@@##%%@#%#@#",
+"%##%%%#%,;%%%%,%%%%%,,%#,@@#,,,#@>,,,3h<'*'*'*--*--'!!::}}}}c5}}}22c4ce4::c55ccccikioiiiioGQKGRSGyAEEEEurljlhh52<!''---=---&  $$$    $2<<<3lEDOIEtljfffhfh99jogggggmmxxnnnnnnqgggo9bbb11^111~~)))=~---------.*-!'--**-'***.*..*..+@@@@++++++@+@@@#@@+@#@##%##%#%",
+"%%%%###%%#;;%%%%##%#,,%#,,#####,>>,,2e'>'''*-*-*!{''!:<:::43}:}:<444c4333eeeeeecc0kqvoiiiioGGFRSRFJEEIEwwtulf5e32:{!!-=-==-&  $($$$  $2/<<etIIRIEujjffjjf9f99glggoggggqnBBB8dg6gog9bbb^7b111^~~)=-!!-==-----.**-!!!**-**-**..-...++++@@@++#+@@#@@#@@+@####%%##%;",
+";%;;%%%%%%%,%#;,##>,#,,#####%,#,,,/35@>>>''****-''<<<<2233eeee353ife3<:||1)})))~}|1ivoiiiijxAKRSSROEEAEEwullhfe322<!!!-!-**&  $$$$$$ $<[22hEIIRIzulhhhhjhjjjlllooogggoqnxBxnnxvgggddbbbb1^)))~~)={!---==!-----**!!!-*-****+.+...++.++++@+++@@##@@###@@###%%#@#%%",
+"%%;%#%%;;%;%,;%%,#,,,##%%;;,;,,>,/2'@@++*'+***-*'':::|:222</_':<<<<:!!!!~~|)&))&)~1^bqkikbkqoyRSSRQJJAuruwtrrrfee33<'''{'>>=   $$$   $:323hEIIRIztrrlljhjjjjjhjjogooooxxCqqoxGyoo99bbbbb^11))))~=--*-=-----*!!---''{-*.*.***+..+...@+@++@@@+@+@#@@###%##%%%#%#%%",
+"%%%%%%,;%%%;%%%#%#,%,#%%%;;,,,]/22@+++++++++-*'''-!!<:<<!'!!}}::{{!-~)))~)))~~~~~~})1pxppqvq9nSSSRQOJJEAAztzwrhffe32<<'!<_>=   $$     |e23hEIIQIEturrljjlogjjjlojjooqoxCnooojookibb1^b1^^^1))))))=---*---~~~!!!*{***''=****-*+...+.++++++@+#@+@@++@#####%#%#@%%%",
+"%####%##,%%#%######@#@###,,,@,/2'@+@##@++++''!*!!!:!!!!}~11}~-======))))&))))))~~)1|}7xxxxxqjqMSSSQOJEEEDEzzwwurjhf33<<<<_>=   $(     !ee5rDIIQJIEtrurtrrlmmojjojoovonCxgoog99bbb9k7c11^1^1^))))==)----~~!!*******-***'**.***......++@++++@##@###@@#%%;%%%%%##%%",
+"##%##%#,######,%###@#,####,>><:'+@@+@@#++>__''*'''*~~}71~-=-=====&=&&&))&)))))~)~)))17dxCxndgqHMSSSROJEEDEDEwwrtrrjhe32[<[/=   $(     !3hhrEIIJQIIzuurtuurrmmoggmoooxCHp9j969gf9jjb7111111)~~)))=====~!---*-*-.*.*-*..****'**++.@+++@#@+@+@@##@>####%%%#%#%%%%#%",
+";%%%#%###%#,###%#@#@##,%#>,/<<++@+@@@+@+@>>>//''{*~c7|----=-=====&=&=&=&&))))))^)))1c7bqCHndgnLLNRRQRQOJEEEztwurrutulfe2233~    $     =3rzzIIIJRJIzzwuuutuummooomvxxHMqiibb9juojiib7111111))))))-~--~~---*-***..----...-.-***..+++++@@#@@+@@+@@@@@@@##%###%%%%%%",
+";%%%#%%##%########>>#%#>#>/<'#+++@@@@.+++@+>_'*'{{k)-----==-=====&==)&=))))))~~))))1c1ikyNyqqxSMGKQQOOJOOJJEzwrlrllrurjf232-    $$    &5lwwDIIIOQIDDEtwtwtwummmmmmxnxxbbe7e9fj9bbe77711c}11~~~~~=~~~~~---*--**'.**.****.....**..++@+.+@#@++++@@#@@@##@#%%#%%;%%#",
+";#%%%%%,,%#,########>%>>>2:++@+@+++@@+@+#@++_'**-a7{{{---===&&)))^11}1117b1|:|!~|~1111bkqKKxoxMMHGKKJJIIIIIIIEEwtrlhhrrl322-    $$    =5jtDDIIIJOOIIDzzwwwAwAACGGGMLLpbbb5bie771777711}1|1c|~~~~~~~~~~----{--.*.**.**..-...-.+*'>++++++@@+++@+@@@@@@#@%###%%%#%%",
+"%@%%%%;,#,#@,#>,##>,>,></'++++@++++@@++++@.++_{{{{sd{~~||1cikojjjjijmrjfjec2222<:|0|117bkyKGxxLGyCFKEJIIIIIDDzwtzzAAwurwuel6          =5uuDIIIIJJROIIJEzAAwwwGGKQRSSLdb(6bb777c5c}c7}1})}}~~1}||~!|~~~!-{-*-****'*.....-...*++....+++@@@@@+++@@@@@@@@#%#@######;",
+"%%%%%%,%%;%#####%##>>>[<@#+++@+@@+++++...+.+..'*{{~sxpc||~|}1777ijiiee575c3344424440aa7ikbCNCCMGyyGKJJEIDIDDEEzturrttEEJJtt)    $     =}wwwIIIJIQJRQJJOOIJJJAFFKGMSSn666ddb^7111|||c||}~)}~|}111|||~!~!{-!!-*{*-'***.**-.+....+.++..++++##+@@+@+@@@@@@#@##%#@###",
+",%##%##;#,%,###>##>></@#@+++@#@@+@@++++++@+...+**{{!nHyb1)~~17c034cecccccc}5c444cccc00iki7gAMHMHHGGKFJIIIIEIIDDEDzzEzzDDJJr=          -5JIIIJJJOORJORIIIIIJKKKKKNNSLngggdbbb^1^)||||:::||~~~~}~~::::!::'*{!{'{{*'*''+...+.++.....+..+++.+@@+++++#@@##@####%###%%"};
diff --git a/hacks/images/timetunnel1.xpm b/hacks/images/timetunnel1.xpm
new file mode 100644 (file)
index 0000000..362cef8
--- /dev/null
@@ -0,0 +1,1111 @@
+/* XPM */
+static char * timetunnel1_xpm[] = {
+"256 1024 84 1",
+"      c #1D1918",
+".     c #262221",
+"+     c #2E2928",
+"@     c #352F2D",
+"#     c #3A3433",
+"$     c #403938",
+"%     c #443F3D",
+"&     c #483E3E",
+"*     c #4A4543",
+"=     c #4E4444",
+"-     c #4F4A49",
+";     c #564B4B",
+">     c #544F4E",
+",     c #5A5553",
+"'     c #5F5353",
+")     c #605B59",
+"!     c #655A59",
+"~     c #666160",
+"{     c #6A5F60",
+"]     c #6B635D",
+"^     c #6F615D",
+"/     c #6B6665",
+"(     c #706465",
+"_     c #756A6A",
+":     c #736C65",
+"<     c #716C6B",
+"[     c #786A66",
+"}     c #7B716B",
+"|     c #777271",
+"1     c #7C7071",
+"2     c #807771",
+"3     c #7D7877",
+"4     c #827677",
+"5     c #827D7C",
+"6     c #867D77",
+"7     c #877C7C",
+"8     c #8B837C",
+"9     c #898482",
+"0     c #8E8282",
+"a     c #90827D",
+"b     c #938983",
+"c     c #8F8A89",
+"d     c #948889",
+"e     c #978F89",
+"f     c #95908F",
+"g     c #9A8E8F",
+"h     c #9E908B",
+"i     c #9B9694",
+"j     c #9D968F",
+"k     c #A09495",
+"l     c #9F9A99",
+"m     c #A69A9A",
+"n     c #A49C95",
+"o     c #A39E9D",
+"p     c #A8A3A1",
+"q     c #ADA1A1",
+"r     c #ABA39C",
+"s     c #AFA7A1",
+"t     c #AEA9A8",
+"u     c #B4A7A8",
+"v     c #B9AAA5",
+"w     c #B4AFAD",
+"x     c #BAADAE",
+"y     c #B9B4B2",
+"z     c #C0B3B3",
+"A     c #BDB7B6",
+"B     c #C1BCBA",
+"C     c #C6BABA",
+"D     c #C4BCB5",
+"E     c #C6C0BF",
+"F     c #C9C1BA",
+"G     c #CCBFC0",
+"H     c #C9C4C2",
+"I     c #CDC7C6",
+"J     c #D2C5C6",
+"K     c #D2CCCB",
+"L     c #D7CBCB",
+"M     c #D6D0CF",
+"N     c #DAD4D3",
+"O     c #E0DAD9",
+"P     c #E6E0DF",
+"Q     c #ECE7E5",
+"R     c #F3EEEC",
+"S     c #F9F4F3",
+"li93::|9ic|{>-%%%$+.  .@%-*%*,),,>-%*>~3gquqmmikuupc3|3cg95coAIMMIKKKIEABEIIIKKKHEBEHIKMIEHEIMNMNNKKIHEEEHIKIEEEKKKIKNOOPQQPQQQRRQOOOOLLLKFFEzzxvvvssssmmmmmmmssssssssssvvvvvvzzzCFFILLLLOOOOPPPQPOOLLFFzvstqqllkgggddgdehquuuwyAAxzyyzAwwplf777225foolifffifcci",
+"fi953}<3fl9<,>%#$#+.   .#**%%-)),,>%$*,_0kqqqmkkqupi1(/|0c59itEKMKIIIHHEEIIIIHIIHBwwAAEIHEEEKNNNOOONMKHEBEIKIGEAAHEGHFKMMOOOPPQRRQOOOOLLKFIHBzzvvvvsrrrmmmmmmmrrrrrrrrrrrvvvvvzzzCDFHLLLMNNOOPPQQPONLLFDzvspmmjjkkggddddhehqquuyAyuxzwxywwpoi9576329ioliffffc99c",
+"b0c955|<5ff3~>*###@+....@%*%%%>,,,,-%%-)_cmquqmkkuuo9<)~|9550iwEKKIIIHHEEIIKIHEEEBwwAwABEBBEIKKMOOOOONKHEEHKMIBBAEEEGEFKMNOOPPPRRQPOONMLKKIHzzvvvvsssrrmmmmmmmmrrrrrrrrrrvvvvvzzzCDFHLLLNNNOPPPQQPONLHFCzvrrmmjjkkkggddddeejquuuAyuuxwwyAwwpof950059iooifcifd098",
+"799dc9|(/|99<,-%#@@#@+++@$**%%*>>,,,-%*>~3gmqumkkmuul3/!/35379iwEIIHEEEBBEHIHEEBBBAAAAyAAAAAABEHMNOOOONKIHIKNNKEHEIIIHKMNNOOOPPQRPPOONMMKKHEzzvvvsssssrmmmmmmmmmrrrrrrrrrrvvvvxxzDDFHLLMNNOOPPQQQPONLHFCzvrmmmedggkkkggddeeemquxxAxqutwwywwpolf00cdcciiiccffc988",
+"99ccc9|(!)|95/>*$@#$$##@#$*-*%%*->>,,>->)/0kmqqkgluuuf1!)_7||39lAHHEEAwwtyABEBAyAAAABBywyyAywAABEKNNNNMKIIIIMONMKKIKKIIMMNNOOOPPQPPOOMNNKLFEzzvvvsssssrmmmmmmmmmhrrrrrrrrrvvvvxxzDDFHLLMNNOPPPQQQPONLHFzzvrmmeeddggffkggddeemmuxyxwqqxtwwywwpoif99cd999cccfff995",
+"9955553_),~393)-%##%*--%%%->>-%%*->>)~)>,~|fmqumkkquxm7{)(3|<13ctBEEByppttwyyytolpwyAAwtppwwwyAAAEKKKKKHEEEEHKMKHHHIIEEHIKKMMNOPPPPOONNNMFFCzzvvssssssmmmmmhhmmmmmrrrrrrrrrvvvxxzDDFHLLNNOOPPQQQPPONLHFzzvrmmeeddddbhhkgggeeemqtAyutqqpwxzwwpoif9500d079cffiicc9",
+"92||333|/),~39|,-%%*>,>-**>)),-%%*->)/~,,)/7imuqkmmuxug<){|3<_19mAEEEypoptwtttpidfltyAwpoioppttwwAHIHHHBAAAyBEHEzyAAEBCCEEFIKLNOPPPPONNMKIFCzxvvssssmmmmmmmmmmmmmmmmrrrrrrrvvvxxzDFHLLMNNOPPPQQQPPONLHDzzvrmmeeddddbbbgkkgjeemmuzAuqmqupwxwwwpif9569d0779fillif9",
+"2|:::|||<~,,~35<,-->,>>-*%-,~~,-%%*->)~,>,~<cmquqmmuuuo7{~<4|_(1cwEECAtllptpppplg9fpyytpoilllomptxBHHEGByyyzAEEEzxuyzBzzzEFFILNOPPPPPONMKHHzzvvxsssmmmmmmmmmmmmmmmmmmmrrrrqvvvxxzDFHLLNNOOPPQQQQPPONLHDzzvrmmeedddd88bbgkkgjeemqwzxqtmquttwwwwofc645d07|5coppof9",
+"3}:_//<||<~',/33/,,,,-*%$#$*)(~,-%%*->),->)~3gquqmqqtuqc_~{|4<~/5lAEEByoilpppppoicclwAwtollloomrqqwBBABAwswwyAEEBxuwwyAzzzEFFLLOOOOPOONMKFFzzyvtussmmmmmmmmmmhmhmmmmmmmrrrrvvvxxzDFHLLNNOOPPQQQQPPNNLHDzzvrmmmeeddd888dggkkjjjmquzzuqsmqptuwywtlfaaa507479lttoi9",
+"221<<//<<|/~))/||/~~,*#@@@+#*)(~,*%%--,>**,)(9kuqmmqpuuo7/(<|1{{<5pBEBAtiiotpopppi9ftAAytoolooqqmqtyyyAAtpsttwABAyuqtxzzzzCEHILMOOOOOONMKHECzAyttsmmmmmmmmmmmkkkkkkhmmmmrrrrvvxxzDFHLLNOOPPQQQQQPONMLHDzzvrrmmeedddd88dddgknjjjquxxxuqmmqptuwwwpic8a634439iptof9",
+"59553<(//<<<~))/|33<)*#+....+*~//,-%*->,-*>)~|fqumopuuuuk3_/<|/){_fyBCBypfgoolopqoifowBAwppqppttppwAywwyupoooqtAAwxuqtwxwzADFFILONNOOONMLIGCzzztusmmmmmmmmmhmkkkkkkkkhmmrrrruvxvzDFHLLNOOPPQQQQQPONMLHDzzvrrmmeeddddddddddgjjjjquxuuuqmmquutxwwtpica666859cilof9",
+"9cff93|(~~/</~)~<353~-#.  ...@-~//,*%*-,>--,)(9kqqomquuuqc|((__~)<5oABCAwmcfigkooppllpyEAwwttuuwwyAywtwytlinllpxywxuqtxzwwzCBFFLLLNNOONMKFGCCzAttsmmmmmmhmmkeebbbkkkkkkmmrrrvvxxzDFHLMNOPPQQQQQQPONMLHDzzvrrmmeeeddddddddddjjjlouxuquuqmmqotuxwwtpfa6aa9cc99ciic",
+"ffiic731/))~~/~/<|59<-$@.  ...#>~<~,**->,,->,~|gmqmmquuuuk5<~/_({(5fpABAAtg9ccglmptpoouAABByyyyAEEAAwtwAwojjiiouwwsuqrtwxwxzABFILLNNOONMKIGCCAztutmmmmmmhmmeebbbbbbkkkkhmrrrvvxxzDFEJKMNPPPQQQQPPONMLHFCzvrrmmmeeddddddddddeejnopxuqquuqmmqptuxwttofc9ccc9575cff",
+"filic541<~),,)~<<<39|,%#@..  .+%,~/~--*>,,>>>!/9kqqmmtuuuqc|/~///(49iwAAAypc90dioppwpolpwEEEEEBEHEBAytwAyplliinuwxtpqqttyxxzzAFFILLNNNNMLFGCCzztttmmmmmeeeeeebbbbbbbkkkkkrrrvvvxzDEJJMMNPPPPQQQPPONMLHFzzvvrrmmeeeddddddddeeeejoptuqqqqqqmquutuwwttplie98655379c",
+"cilic5||</),->>)~~<3|~-%$#@...+#-)~),---,,,>,)~|gmqolquuuuk7_((///<7ftyAyyti059floqppogioyEHIHEEHEBAyttwypooihjpttwpqqqtuzxyzDzFFILMNNMKFIHCCAzuttmmmmeeeeeeebbbbbbbbkkkkkrrvvxxDDEJJMMNPPPPPPQPPONMLHFDzvvrrmmmeeeedddddeeeeejnptxuqmqqqqmquttutwwwtlf866444426",
+"3clic54<<<~'-**--,~||~,>--*$+++#*,)),,;-,,))))~{5kpmllquuuq0|<(((~/3gpyAywwpf70fiiiioplcfpyEIIEHHEBAwolptpookfeotttsommqtxxyxAzzFHKMLLMKKHHCzzAtttmmmmeeeeeeebbbbbbbbbhkkkrrvvxxDDEJJMNOOOPPPPPPPONMLHFDxvvrrrmmmeeeeeeeeeeeeeejotpuqqqqqqmmqutwwyBBypc662|11[}}",
+"<3fif93|</~)>*%%%-~||/))),>*%#+@%>)),>,>,,)//~~~<dmmlimuuuui3||_<{~<9ltyywwtoc9ckgccilofcipAHHHHHEEAtlflpooolffiptttpmmmrpwuxxzzzFIKMLLKKIHCzzvtttqmmmheeeeeebbbbbbbbbkkkkrrvvxxDDEJJMNOOOOPPPPPPONMLHFDzxvvrrmmmmmeeeeeeeeeeeejoppouqqqqqqmquxwxABAypf96221__[:",
+"(<5cf953</~),;%$#%,|3<~~~),--*$##*,),>,,>,)/<</~~7kmmgkquuuqc733|(!~|cpwywwtulffli96dioloiipwBEEEEEEtiflpoillheipttuplmmqrstuttvzzHIKLLKKIHCzAysstmmmmjeeeebeeddddbbbbbkhkrrsvxxDDEJKMNOOOOOPPPPPONNLLHDzxxvvrrmmmmmmeeeeeeeeeejnponqqqqqqqqqquzAzAwtppf8a21__[:",
+"/(<359953|/{),*$@#*~<///~~)),>-%%%>))>>,>,)~/</~~|domkfkuuupl9905|{'/9owAywtppllol979fiotoiilpwyABBAtiflppllmiffltttponmrruruqtsvzCHIILLKIHCCzvttsmmmmjeeeeebddddddbbbbkkkrrvvxxDDEJKMNOOOOOOPPPPONNKLHFDzxvvrrrmmmmmmmmmmmmmmmmqunjqqqqqqqqqquzAAwtppplfa6|_([[",
+"((/_<|5993<{))>%##$-))~//~/<|</)>*-)~,>>>,)~{/<(~(7kmmfgmquuqi9995<{)|fpyAyppqpppof059cittrififiopttpiiptpllljifisttqomljmmrnqmssvCCHILLIIHEzzyytsmmmmjeeeedbdddddddbbbkkkrrvvxxADEJMMNNOOOOOOPOPNMNLLHFDzxxvvvrrrmmmmmmmmmmmmmmquqmmmqqqquuquxABywurpppic6|1(][",
+"/~~(~~<5953<~),-$##%-->)~~<39c93/)>,),>->,~/<<||(~|gmmgckpquuog9997<~/5ityywpoppolic76acottpf9889fiiilouwtooleiiiottppjjhnmqrnmmstzCCIIKIIHGzzyxuvmmmmjeeeddddddadadbbbkkhrrvvxxADJJMMNNNOOOOOOOONMMMLLHFDAxxvvvrrrrmmmmmmmmmmmmquqmmmmqqloppppttttsqolpli86|_^[",
+"{~~{{))<|55|/~),*$#%*%%*>)<3cff93<~)),>-->~/|353<~<cmmkcdmquuqmc5597_~<5iwyytooolifd960bioptpi96659cilpyAwpliffjilppppmjhjnmmmjmmtwCCGJIHFIFAzyvussmmmhjhedddddddadabbbkkkrrwvvzDEIIMNNNNNOOOOOOONNMKLLHFFDzxxvvvvrrrrrrmmmmmmmmquqmmmmjjlopttpnopttqmlloic84<^]",
+"({){{,,,~<33|<~)>*%%*$##%>~|355955|</~,-=*,/|9dd3/(7imlg9gmquumg53993(/|5iwAypmmigc998a69fiptplf989cipwAAyoicccjiloppqnkhhjnmmjemqwzBCGHFHFFAzxxusvmmmhhhhbdddddddaddbbhkkrrsvxzDEJJMMMNNNNOOOOOONNMMILLHFDDzxxxvvvvrrrrrrrmmmmmquqmmmmmjnptwwpnjoptqmifiifc5|^]",
+"({!!!,'>>)/|3|/~)>**-%@+#*,///<39fc9|</,*$*)|9ii9|/|dmom00kqupql047d9|//<5oyAwolf905888668ciottpoiiipwyAAtlc9cccflpppolmhhhhjkgeeqqzzCCGJFFFCzzxvsvmmmmhhheddddddddadbbkkmrpvvxDDEJJMMMMNNNNOOOOOONMLKJLLHFFDzzxxxvvvvvrrrrrrrmmquqmmmmmjlptwtpnjjrqqqmififcc7|:",
+":/!!!';-->,~<|<~~),>>-$@@%>,,)/|9fiif93/>$$-/9ili5||0gmmg7dkquumg517c7</(|9tAAwogc00a88666a9fopwttptwyAyypg99ccceiopooojhhjhhhhdejquzzCGGEFFFzzxvsssmmmhhheeddddddddbbbhhhrrvxvDDGJIMMMMMMNNNOOOOONNMMKJLLHFFDDzzxxxvvvvvvrrrrruquqmmmmmjnpppppojgkmqqqjfifcc93}",
+"}</!!'>;--->,~///~~)),%#@$*--,~<359cili9/-%%,|ioli515gmqk75gmquqmd1|5c3/{/3iwAytlgf9566862259dflptwwwwywtpicbc999fnppooihdehehebdjnuxzBGGEEFFzzvvvssmmmmheeeeeddddddbbbkkmrpvxxDDEJIMMMMMMMNNNOOOONNMMMJJJLHFFFDDAzxxxxvvvvvrrqswyqmmmmmqnoolnppkggmquqqific953}",
+"3|1/{';-*--**;>)/////~>%#%***,~|||||3cooc/-*-~9lpoi59giqmg40mmppqi3<|00|{~19pyAytif9566762223099dimopppppolfcc988biooolihhhbgbabbgnrxzBCGGCBBzzvvvsrmmmmeeeeeeedddddbbbkmmrvvxxDDFIIIIMMMMMMNNNOONNNNMMMKJJLLFHFFDDDzzxxxxvvvvstwywmmmmquonjjjnmmkgkmqunjefd967}",
+"253|_{';**-*&%*-,~<<||~>%*-->)/<33|</|cll9/,>)3lppof9fkqpi77fmqpumc|<5d3_/<5itAAypid76266|}1|1|4509d9cdgklkiif9669flomligbhbbhb8bbkrszzzCCBBBBzvvvvrrmmkheeeeeeddddbbbemmrrvvxxDDIJJJJIIMMMMMMNNONNNNNMMMMJJLLLHHFFFDDDzxxxxvvvyyywummqquujeehjmmmkkkqppoieb963|",
+"}55531/)>--*=%&%*-~<35|~>>,,)~/|5995|/|9fc|~))|iptpidflqqmd7dkouuum9|7dc3<~|dowAAwoi9311||1__(__37777750ciillf9268cjlollihcabaa86ejmqxzzzCCBBDzvxvvrrrkkhheeeeeeddbbbbkmmqrvvvzDEJIJJJJJIMMMMMMNNNNNNNNNMMMMKLLLLKHHFFFDDzzxxxvyBAwtsqquuqheeedgmmmkkipppmiida31",
+"2359993<~,>-=***%*>)|99|~)~/<<|59fff9|<|59|~))<ftwtoiflqqqk99gmquuqi55dfd|/_7dpyAAtog0341_<__(((<1341144359fig6268bfilmlifcbaaa88bjnquwzzzCADBDzxvvvrrkkkhheeeeeeeebbemmmprvsxDDEJJJJJHJJIIMMMMMNNNNNNNNNNMMMMMLLLLLHHHFFDDzzxzyBEAtuwuuqjheeeddgmmmjjmpplllifc3",
+"1}|3595|/)>-=*&%%%%>)|c9|<|335cfc9cfic5|373~,>~3pwwtpllqqpmicgkquuuof0cif9</<5gtyAwpod731_((]:]]^[:__(___140f964269ciiilihb88a622aehnuxzzzzAADDzxxvvqrrkkkhheeeeeeeeehhmmrrvxxDDEJJJJJJHJJJMMMMMMNNNNNOOONNNNMMMNMLLLLLHHFFDDCzzCEBwwAuumheeeddddkmljimptpoooif0",
+"3::_|595|/)>=%$####%%,|95559cfllifffilf9355<,--)9ptwtppuutpmgilqquuulddiif5<_|0qwAytplf91^]^^^[::(]]!{!{{(159a2}26abfgiiigbaaa2226hhlruxzxzzADBDwuuvvrrrkkkhhhheeeeeehhhrrvvxxDDFJJJJJJJHJJIMMMMMMNNNOOOOOOONNNNNNNNMLLLLHHFFDCzCEEAAAuqmeeeeddddgklonoppppomif0",
+"d56359cfc9|<~,=%$####%>/||9flpttpoollllf5593/>*-~9opttuuxxwumikmmqqpplfioic3<<4ipyyytog92[{!!^^]::^]!!!{{(|462}}228cffiiifc9aa2}}68hnouxxyzzCADDAuuvvsrrrkkhhhhheeeekmmmrrvvvzDDEJJJJJHJJHJJIMMMMMMNOOOOOOOOOOOONNONNNNLLLLHFFFCCHIHEAqmmeeedddddgklooompppomiii",
+"pigfccfiifcc5|/)>*%%%$*,))/5lwyywttttpoid955|~>-,<9iotutxzywtmmmmmqqpploqof951|9lwyywoi93[^^!!!^](^]]^{{(_1||2}2268bffkgigc0082}}6ablnrtxzyzCABADxuuvvvrrrkkhhhhhmmmkmmrrrvxxDDEJHDEDEEHJJHJJMMMMMMNNOOOOOPOOOOOPPOOOONNNLLLHFFECIIIAwmmmeeeddddggkinonmptwwttpt",
+"tpllc99cccffc03<~))>>->,),,/9oyAAyyAywtpli953<)>,/39copqtxxzxuomqqmmqqopqplg9547fpwAytlc6}:^^!!!]]^]^(____||<}22270dfiiiifc9071}}28bhnqsxzxzzCADDyxuuvsrrrrkkhhhhmmmmmmrquvxxDDEEEEEEEEEJJJHJIMMMMMNOOOOOPPPPPPPOPPPPOOONNLKHFFFCJIHztmmmeeeddgggggeiopptABAAywt",
+"tolic57555555953</~))))~//)~|ftwABBBBAAwtpi953<~)/355fppquxyxuqmqqppqppppppid9730ipAAztlc641_{!^^^^]^::_<<<__}22669cfiiiifc9071_}2aahjpqpwxzzCABAyyxvuvvrrrrrrhhmmmmmmrprvuxxDDEEEEEEEEEEJJJHJKMMMMNOOOOPPPQQQQQQPPPPPOONNMLKHFFEGEBtsmmmeeedgggggghlpttwAEEAwpp",
+"poigc7311<<<|3|3||/~)),~<<<|3copwAAABBBAAwpifc5<~/|539oupuuxwupoquqpqttutxwpid0559lwAAAulc03|/{{]^]]]]](_(___}|7699cilliigc9741__268hinqqttxzzCBBDyxvuusvvrrrrrhmmmmmrrrvvxxzDDEEEDDDDEEEEJJJHIKMMMNOOOOPPQQQQQQQQQPPPPOONNKLHFFECCzwspmmmejgggggkknotwttwABAwtp",
+"lmkc95|__///~//<<<//),,,~/<|5foptwtptyBEEBytpof9|/|559iuutuxxxtqmqppqtutwwywpifc99fpABBApif97|/({^]{]]((_(<<_}3559ccfiliid9074___1aabhkrrquxxzCCBAAyxvuvsvvsrrrrvmmqrrrvvvvxABEEDDDDDDDDEEEJJJHKLMMNOOOPPPQQQQQQQQQQPPPPONNMKLIHHBzvvsrmmmjjggggkmqppptpppwAAyto",
+"iik987|/{{)))))))~~~~,,>,~~<3copttofflpABEEAywpi933999fpwuuyAAyuppqppqppuwyywoigfdflwEEEAwoic93<<:[::::<__11|23559ccfilifdc954_(_128bhgmrqsuxzzCGADAvxuuvvvvsvrvvvqqssvvwxxADDEDDDDDDDDDDDEJJJJKKLMMOOOPPPPQQQQQQQQQPPPPOONNLLIFFBzxvrrmmmjjggkmpppqnoooooptyyto",
+"ifgd52_~!!,,>;>--->,)),,,))~<5fqttogccfltAEEBAypic99fiiptwuwzAzxpqpuqqppppwywpiffifgpAHHEAwoif954}|}<<<|1_|__}|3659cfgiiffc951_({}47bhhjnruuwxACCAzADvwuvvvvvvvrvvvqsvvvvxzDDDDBDDDDDDDDDEDEJJJIKKMMOOOPPPPPQQQQQQPPPPPPPOONLLIFFFzzvvpmmqjjgkmpqpqmlnlollilpwwp",
+"lfdd961(!!';;=*&%&%*->>,,)~)~|clppofc99cfpwABBAytlfcfllltwwxzCzyuqpputpppptyywojfifcitBHHEAplfc953}:<<__<_<<}123559cfiiifgc95}_{{_47ahhjmnrpsxwACCzAAyvwuvuuvvvvvvvvvvvvvxzDDDDDDDDDDDDDDDEDJJJIKKMMOOOPPPPOOOOPPPPPPPPPPOONNLKIFFAzvvsuqqjjoqppqmmmmiiiiifhipwt",
+"oifdd94_{!'>;-*&$$$$$$%*-,~~/|ciopi953359fptwAAyytoilpolpwyyCGCzwtputppppoqwyywmmlifflwEHHBypiffc93|}:<_||||2355599cfiifgff92:^{{(120hhhjnrrstxvAzCAADyvvtvuxxvvvuuvvvvvvzDDEDADDDDDDDDDDDEEJJJJKKMMNOOOOOOOOOOOOOOOPPPPPPOONKLHFECzvvstqqqppqqqmmmmkeeehhebhltt",
+"tlgdd56_~!'';=**&$$$#####%>)/|clpoi5|<<<|9iptwwwtollottttyAABEHEAwtttupmqpptyAytoiiffipAEHHEAtoiikf953|1||4355555cccffiigfd52[^!![1700hejnnrrstvzAACAzADvywzxxxxvvuvvvxxzzBDEDDDDDzzDDDDDDDEEJJJKKMMNOOOONONNNNNNOOOPPPPPOOONNKLHFEzzytuqquttqqmmmkkggbbbfebbfot",
+"poid055_/!'';;*%&%$$##@@@@%->/5lppi9|/~)~<5ipwwwti9cipwwwyABEHIIGAywwwuopxwwyAAyumifilotBEHHEEypppolf905755599090cccfifffc96}[^!!(1400behjnrrstvyyzAAzAADADDAzxxxxwxxxxxADDEDDDzzzxzzyDDDDDDEJJJKKKMNONMMMNNMMMMMNNNOOOOOOOONNLLHFECzzvtwuxtpmmmmkggggdbbbhbbafo",
+"polfd071_{'';;%&%&$####@+@#$%><cpplf5|~,,)/5itwAxm5|9fotwwwAEGKKIGCAAAyptyAAABAAypliloptwBEHHHEAwwttplifccc9cc99999cdff9c952}[^!!^_270deejnnrrssvyyAzAAAADADAAzxxxxxxxzzBDFDDDzzzxwxxzyDDDDEEJJJIKKMMMMMLMMMMMMMMMMMNNOOOOOOONMLLHFFzyywyxxppomkkgggddddbbehbabi",
+"lpiicd74_/)';;=%$$$###@@+@##$%>|gifc93<),,)/3itzAtg3|5foppotyBJKKHEEAAzywACEEEBBBAtooppttyBEHHHEBAAwtppoliiffcc95559cd990962}[^!!^_1700eejjjrrssswyDzACCCAAADAAzyvxvxzADBFDDDzzxxxxxxxzDDDDDEJJJIMKMMMMMMLJJJJJJJIJKMMNOOOOOONOMLHFFBzAyAxxuookgggddeddddbbeehae",
+"flligd541({!';;%&$$####@@@@#$$*!59953|<~~~~~<5itxxtf430floiitxAEJEEBAAAAtwAEEEBBBAytpoopptABEEEEEBAwtpoolifffc9955550d050762}[^!!]_1700deejjnrrssvwyAAACGGACBDADAzzzzADBFDDDzzxxxxxxxxxyDDDDEIJJIKMMLMMKJJJJJJEEJIJJLLLNNLLNOOOMLKFFCCBEAAuunjjgddddeedddddbhhbb",
+"biiiid061/{!''-=%&%$$####@@@#$%'|95</)),)~~//|9owAAtf99ciiffmtwAGEBAywwwpopAABAAyywtoicfilpwyABBBAywpliifc9c99995999fd900532}:^!!]_17709eejjnnrqsvwvDAAzCGGGGBBDDADDDADFBDDzzzxxxxxxxxxzDDDDEIJJJKLMMKIJJJEEEDDDDEEHILLMNNLNNNNNLLIHFCEEAyuqqjjedddeeeeeddddgfeh",
+"hfligd095_({!'>;%&$$&$$$##@##$%;_57_!>-=-,)~/<3ftxBAuifiomigipwABGBzwtttmfimwyywtppoic5590cipwwwwywttoiifdc957590cfiifc9d95|[[]!!^^176adeejjnnrqsxwvyADACGGGGEEDDDDDDBDDDBzzzzvxxxxxxxxwDDDDEEIJJMKMIJJJEEDDDDDDDDFFFHLKLNNNNNNNKMIIIEGCyyqqmjheeeeeeeeeedddgkhe",
+"eciiid999|</{!,;*%&$$%%$#####&&=!351{-**->>,,)/3iwACAwptttpoiluyBECywtppmg0dipuupmomkc953459iutttttttpoliigc9009cffffcccc9531[^!!^^1470abeehhnhqqsxDvAAAzCGGHJEEBDDDDBDADzxxzzzxxxxxxxxxzDDDEEJIJMIJIIEEDDDDzzxyzAzDDEFHKKNNNNNNMMMKIIGCAxummmeeeeeeemmeeeedggkk",
+"kehffd99971({!'';&%&$$$%$###$&&&,|77(;*-,,;--;;)|fwABAwwyAywpmpxAEEAxwtpok05cimliiiiigc05337doutpptttttpppoifcccccc99599905531:]]]_177a0behhhhhmqsxDvyADzGGHHJHEEBDDDDDAAxxxxzvvvvuxxxxxzDDDEEJJIJJIJEEDDDzxxxvxxxvxzDFHHLLMNNNNOMMKKICCAtummmmeeeeemmmmmeeejgkk",
+"mhccffd5903_({!,;***$%&&$$$#$%**>/77<,;,{,*%%%%*>|iwAAtptyAAywtwCGJCzzwtpog59fkkkgikgfffc959cipttppppttpppplifd9995537535433||1}:}|45799aeehhhhmqvuyDyAACBHJHGGGEEEDDADzzxxxxvvvvvuvxxxxzDDDEFJJJJJJEDDDzxvxvsvvsvvvvzCDFHLLMNNOOLMMLIECyyusmmmmeeemmmmmmmhjhjnm",
+"mlfdgfd06873<{!',;**&%%&&$$$%%---)104),~_!*$$&$$*,|owAwlltyCBAwyACJJEzAwwtoc0dkmqmiiiffkifcccfmptwtpolooppolifcc955333|||1<__<<}}35509dbeehhhhhmqvuyDDyDCEHGHGGEEEBDDAzxxxxxvvvvvvvuxxxxzDDDDEJJJJFEDDDzvxvvvvvvvsvvxzzzDFHLKMOOONNNKIEzvvspmmmmmmmmmmmmmmqqqnno",
+"policfd02505|_{'';--*=%%&&&%%=;;-,<75()~<_'=%$$$%*{5pwxofityAAyzAAGHEAAAwtui75gquumkkfccffgcd0diopppliiilooliiffc95531_<</({{{{):}79ccffjjhhhhhmqvuxyDDBEEEGGBEEEAADDzxxxxxvvvvvvvvvuxxxxDDDDEIJJEEDDDxxxvvvrrrrrrrrvwwzzDFHKKNOOONNMIFzzvrrrmmmmmmmmmtwwqqssuup",
+"ppoicdf0659531(!';;*-;==%%&&=;;;>>{45<~~(||~>=&**%>{9pxtifowyyyyyABEEAyzwtum0|5gquqggd73570d0579fiilllilloolliifc995|1|<//~~!!,'':}59cfijjjjjmhmqvuxyADDEEBBBBBBDDAAzxxxxuuvvvvvvvvvuxxxwDDDDEEIEEDDDxxxvsrrrrrhmrrrrpwvzzDFHMMNOPNNKIFAzvvrrrmmmmmmqwwyyyuuuuuu",
+"pupiccigd9d9531(!';----;;%%**=;'>>!|7|/~~_33(),>-%=;/cuuiffotxwxxzBGGzwxwttti415iomdd051<14507770ddgfiilolollliiic953||<_{~)!'';'{:|0dcfjnlolnnqqvuxyDABDABBBDDAADAxwvuuvvuuvvvvvvvvvxxxxzDBDEEEFDDDxxvvvrrrkkhhmmmmrsswvzxDFIMMOOONKFFCzvvrrsmmmqqqxwyCAABAxuuu",
+"xupoffiikccgc541_)'-;--;>=%%*=;'>>,/44_~!{390|<{>;=*,|lpofciuwutwzABGBxttuutp9<<39c90901_(_|3777590099cfilllooooolif953|<(~~)';;;'^[400eejllqmruquuxyzBAAABDADDAADwuuvvvvvuuvvvvvvvvvuxxxzDDBDEDDDDzxxvvrrrmmkkhhmmmmmptvvzzFFIMNOOMMIFDzzvvspstqqqwwwwABEEBAAxx",
+"wtpooiiiliiiif997</!'>,,,>*%%&=;>>'{451~~/7mpi9|)>**>(9opkdfpwtutwyAEGAuppptuo5</1500993<(~_1|47500099580dgloooooollifc53|/~),';;'{[}0bbehjjnnquuuxxzzBDADDDAyDDxuvuuuvsvvvuuvvvvvvvvvxxxxADBDDDDDzxxsvrrrmmkkeeeeemmmmspwvzzFIKNNOMMIFFzzvvwstwwwwwuuyABEHBBAAx",
+"urmolfcilliiiiffc93_~~~!';*%%&&=->,!|7|/~|dqtpoc|!;->{3kppfciutttxwzAEBypooptug4{~_47007|_({(_1359000077670cfiiffffffffcc93|/),';!{_}70bbejnnnmqvxxzCCCBBBBADyywtuuuuvvvuvvrvvvssvvvvvxxxxDDDBDDDzxxvsvrrmmkeeeeeeeeemmmpsxwzAHKKNMMLIFFCzzvvuuwwwwwwuACHHIHEAAA",
+"qlkllicfkmiiiigccc95|</{''-*%&&=*-;'/34/~|coqpog0|!,>!<9ouodfotwwxxwyCEAwpommpqf|~/<3555|_{{!{<|35999d97243230995595555599995|/~){{<}20beejnjjmqvuuzCCCDBBDAyxtvuuuvvrvvurrrrvvqsvvvvvuxxzzDDBDDyxxxvvrrmmkeeeebdddeeemmmptyyzEIFKMKKHFFEzzzyzwutttwxABEIIHEECyw",
+"qqomloiffilkifgc9553|<//~)>-*&&%%*-'~|3<~<3dlf09d9|~!!~|dpukciptwxxwwzCCywpmioppc|<_|1353_]~)){_|359cdd06||2122|3||||<||||459553|||||60dejnnnmmmquuxzzzCDDAzxuvuuvrvvvvnnrqrrrvvssvvvvvxxxyDDDDzxxxvvrrhhmkeebbbbddddeeemmttyAEEHIIKLLHHFAzzzAyststwCEHJIJGCAzAw",
+"wqomolifffkifdfd0743|<////~)>;=%%*->!/4|~/<507||499|{!)(3mtpfdltwwxuwxzCAwtpiiopm91____471(~]))~/<159dgd967321|||<<<_((/(((<<|3359999d9dfhjnnnqqquwwzzAAADzxuuuurvqqqqnnnnmrrrvvvsqvvvvxxxzzDDzxxxvuvrrhhheedbbbbbddddeeemmstzCEEFFLLLHFFCzCzAvvwvzCEHHHGECzzzzA",
+"wqomlilfc9dggddfd0333|</////~''-**-;'~11(~/|7|13|155_~)~_dutmggptwwwuwyzAxupoimqqi01_/(174_{!'''!~]<79cgd9056332}|<<_((~~~))~{~~<39fiiiilljnnrqruuxxzxywyxxvvuuvsvrvnnnnnnnrrrrvvqqvvvvxxxxyDzxxxvvurrkhheeddbb88888dddeeemqxyBCCBDHHHHFFFCCzyxxyzBEHEGCEFBzzzvA",
+"Awunkefd990ddd09cc9533|_<<<<<(~,>-;'')<|/~/|4|7d03354<{~_5muukdiqutuutxyzwtpollqupf3<//_75<~!'''',']_39ccc006573|||<<((~~~)),,'>,~|5cflopppprrrqvuuxwxxxxuuvuvssssnnnnnnnnnmrrrvvvqvvvvvxxxzzxxxxvvqqrkhheeddd88888888ddeeqquyyAyzzFFHJHFEEzzxyvzBEHECCzCFFBzzzz",
+"Awqnkhb9aa3589575093|||||||||<<~~)',))/||~~|449mqf5573_/_4gtwpgflpututuxyxupomlqppoc|<<|75|/)'>>''''~_|0900765342||||<_/~~)),>;=->)<|5clopttttppqvxuxwxuuvvvvqvqrornnnnnnnnnrrrvvvqqvvvsxxvvxxxxvvvqqmkkeeddd8886666888ddhjquuywywxDFEEFHFEzzzvABEHEBCCzCFFFBzzC",
+"Axqqkhab9644307||774_//<_|||3||///({{{/|4</<79dqupld051__40luxodfmpuuttuxxupmiilppqm9||3707_{,,>>'>'!{_3a9006332}<<<_<<<</~)>>-==>'~_25dioptwwvwuutuuuuuvvqqqrrnnjlnnnnkkhhknrrrvvvqvvvsxxxvvxxssvrrqmmkeedd888666666688dgjnuusstwxxDDEHHFDCzzzGEHHGCCzCHFFFFCCC",
+"zzwqjkhb88634704|4751~~~~~/<|33||<</<<<|73<<49glpttod971117gpxpgcgmquuuttxwpmkdfipuql9779dd7_!';,,>>')/:77657633|}__<(<<<</~,>-*=>,](<|7cfiostywyxxwxxussqqqqnjnjjjjghhkkkkkkrqrqvvqvvvvsxxvvxxvsvrrmmmeeddd886666666668bggopwuqurvxzDEFEFDEAzCGHHHGCCBCFFFIFFBC",
+"CAwsnkie999535873|703_)),)))/_1333<//135093130dfptwtoc95447fmxwlddglqtttutwupmd99ippqld00dkg4{!''',,',!(14a732334|_</((~~~)),,>-->,)/<|35bginpswwyzxxztvuvqqjjjjjjhhghhhkkhmmmrrrrqvvvvvsxxxvvvvvrrrmmmeedd8886666666666bbgmppummpvvxzACFDDDCCCGHGGCCzCFFFKFFHEE",
+"GEAwxtqijfd0539d73799|~),,,,),{_|53</<|9fgc5509glpuutlc9770fmuxpg0dklquuqpttqmic59iqqqmf9gmmc1{!,''>,'!{_|22322|4|__//{),,>>>>>--'']/<|25dcfinnpttwxxzzxusvnnnjjjhhghgghkhhhmnrrqrrrvvvvvvuuxvvvvrrrmmmeedd886666666666a8bhmqpommhrvvzzzzzDFHHHGGCCzzCEFFFKKIFII",
+"NMMKIBzytpolgccfd97905<~,'>,,>'')<||<<<|0iic00dfiikmtpi9900imuxwpfcgkmptqqqqupoi539iqppoikmmk9_{',',,',{:|42732|1<_(]{~),>-;*=&%*>'~_<|279cfijjoppqsxxzzwwsnnjjghgghhgghkkmnnnutpsurvvvvuvvuvvvvrrrmmmeeedd886666666666688ilomnjmmppvzzzzzAFIIIECzzzBEIIIFKMMMMN",
+"POPPONIIHEAwtoillidcc93/~',>,,;;>>)/||<<3clkfgiif95cimoicddioptwtmfcfmppqooqqqold3|9fmppppmqmg9</,,'''!!(:}275221__(]]),,>;;=&&$$*;)(<3359ffginnoporvuxwtupppohgghgghghhhkhjknrputttutttvvvvvvvrrrrmmmeeddd886666666666688ellmgjemmstwwvxzzBIIIHBACBEIIILMNOOOOO",
+"PPQQOMIIIIEBAtooppliifd3<{'>,,,;--->)<1||5fliilol9459gmolmklmquxwulggippuqomqqoom91|0imqpppupof7|~~!)!]{][:}652641_(]]'>,>;==%$##%=,)]<35cfffilnoonmnrsrrspppmmkkggggggghghkhkrrqtuutwwvvvvvvvvrrrmmmmeedd88666666666666aafiifhgehmmtwvvvzzCHIIHECEEIIFMNOOPPPPP",
+"QPOOKEAzAAwttpiiloolilof5<~',,)''-*--)/|359fiiotpi9339fmppppommtwxtidfkoqqqmmmmomm0|40gmquttupi97|//~!!]]]:}473a71|:]]''>--=%%$##%=;,]/|29cijlloonnqqqqnqnnojmmmmmkkgggkkjkjkhrrrusuwywvvvuvvvqrrrmmmmeedd886666666}}}}68bfihebddejmmsvvvyzCGHHFFFFFFKMNOOPQQQQQ",
+"POMKEzAwuppligf9cfiiilptl9|/),)))'-**>)/|55cfiotwpf5459iptutqplqxwwqgdgmqqpmmmmlmmk5159imptuupmg77|<(({{{[_[}26672}:({]'>-*=%$$##%=->!~_170dijlororoqrrnmjjjgkkmmommmmmlmnmmmkrqrrptwyywxvuvvurrrrmmmeeedd886666666}}}}28biih8b8dgjmmrprvAACGCHFFFFFKMNNOOQQQQQP",
+"NNMIHEAwtpoifiid9cgiilptpi9|(~~~/{,;;->)/|5cfikpxwofc09cmtttqqolqwwui9dfopppmmmkkmmc||5cgoqputqic5311<_((_:[1a5a731<]{{''>-*&$#@#%=;,!~::479hfioprrrpqqnnjhhhggkkmmqpppoomqqmrrrrrpvxwwvvwvvvrrrrkmmmeeeddb8666666}}}22268iiba68bggjmmrptzCCCzAFFIIKNNNNOPQQQQPO",
+"NNNKIHBAxwtoooooliiopoppplc5||//<</!,;'!)/|0gkiltwwpifffmuwtpuqmqxxwqg0cimqpmlmmkklf5|7ddfmqqupoc77713111}_}}2777731_({)'>>-*&#@@$=;>!]_<435dbgilnnrprrnjjihhggggklmpppqpqpprrpqrrsuvwtvvvvvrrrrqmmmmeeeddbb666666}}}2226bccc8666bggemmstwyBAzzEFKMNNNOOOPPPPPOO",
+"OOONNMMKIHEEAywwwttttwtppof053|||33|{'')~/_3cillotutpommmuwtqptpqtxxumd9ckmpqqmligki91|7ddgkoppoi97733377742}2677a311_{!'>--*%$#$%==>'{/:4750cbginnnmnnniijggggggkkkklmqqutttrqprruvwutvvvvvrrrqmmmnmeeeddbbb666662}}226acc9666668egehmnwwyzyyzBFMMNNOOOOPPOOPPP",
+"QQPPOONMMKMKIHHEEAwtwyxtppl0533|3553|////(<<3flloptwwtpquwzxppuuttxwxqf90dkpqqmmkgggd7<|0dgglmolic077|335066aa65723|1<({)'>-*%$#$%=>>'~~_4790bbgginnihnnjihhggggggggggkmmptttprprpsvvsvvvuvrrrrrmmmmmeeeddbbb6666622}22aacc862}6a8hbdemqquwwvyzCIMMMNOPOPOOPQQQQ",
+"QQQPOONMKIKKIIIIIIEAABAywwtl53||3|33|<<<||</<5flmptwwwtttyAAxttxwuuxwtld750ipqommkddg0|<39fgikiffcc0731|470d8a6a7aa11_{~),;;**%#$==>,')]_1359dddfhjjkhjhhjgggkgggggggggkmqqtttttprxuvvvvvvrrqrrmmmmmeedddb888a6222}2}}}26cc662}2688bdgjquuwtsyCGIKMNOOOOOOPPQRQQ",
+"QQQQPOONKIIIIIIIKIIIHHHEAAAyo9333<</<<|||4<(~<5iopwywttuwAAzzyyyyywwxwuf535clqqookgdd03<_40fikgcc999997||47acb9a9074|_(~),>;;=%&&&->''{/_1457bhbggijikhjejdfgkgggggkkkgkkmpprtstswvvvuvvvrrrrqqmmmmeeggbb888222}}}[[[[}26bc62}[22866bgjnuuqstzBJHKNOOONOPPPQQQQQ",
+"PQQQQOONMKIIIHKMKKKKKKKIHEEEAtig9|/{~<|353</~{|9iptyytpptyBCAAAAAzyxuwwm9437gmqqmmkd005|<<39iiic975579033247dbccddaa|1_/~'>>==&&&*--']~(_1375abcfikjhhejefddgggggkkmkkkkkrrnrrrwwwvwxvvvrrrrrrkkkmeeddb88aa2}}}}}}_____16b96}}}}22666bkoouqmsyEEHKNOOOOPPPPQQQQQ",
+"PPQQPOONKIHEEEHIKMKMMKKMKIIIIEypi5</{~/|553</(_3clpwyytpotABBBEEEBzywxxug7439imqpmmkd7741<|5dfff9005579967276abccd9a4|<(/),>-*&$%*-;,)](<1357acdgfinhjhjgfddddggggkkkkkkkmooopstxwxyywxrrrrqqmkkkeeddb888222}}___(((((([79562[[}2226aekmooqquABEIKOOOOPPPPPPQQQQ",
+"PPPPPONKIIEBAAAAEIIIIIKKMKKKKIEApg5|/~{_|7974|<19gltyAyplltEEEHHHGEzyxywqc3379mqqqmmg05731147dcgfcc03790d05a7888ab07241_{~,;;*%$$%->,)(/1|350ddcgfinjjnnfgddddddddggkkkkoonnnssvvwvyywtttpprmmmmeedbb88a2222__(({^^^!^^(|774_[[}}2}28bimonqquAAEIMNNOPPPPOPQQQQQ",
+"QPPPOOMMIEAzwtppwwwtyEHIKKKKKMKHBpic3({!(<7907770diowBBwoipyHIIHHHHEzzyxum0445cmqqqmkd033113500diiic5750d998008a8aa722</({!,>*&&&&->,{(_11550cbbgfgjhnnqiigddddd0ddggkkooonovsvvuvvvttutttsmmmmmeeddb6622}}___^^^^^^^^^[}32|(_[}}}}26bflmniuwxAEKKMNOPPOOPQQQQQQ",
+"PPPONMKIHEAwwttpplikipwEHIKKKMMKIEwoc|(!!{_7999ccfiipAAypootBIIHHHHECAyzwug7345gqqqqmk0744|43570diif97570dcdcdc8bac0522_({!'>-*%%=-'']{_|450acbggghjhjlmllgggddd0dddggmonmnrvsssttvsussttqmmmmmghggb882}}}_((^^^''''''!]12}:{{_:}}}26bfimklpxwBIKKKOOOOOPQQQQQQP",
+"PPPOOMIIEBEyywwtpogc9flpwEIIIKKMMIEwl93/{)~<59cfilllowAwpoopwEIIIJHGEBAAAxqd3439mqqpqmg74414409779cfcc090dhcfegbb0a857}}({{'';*%%=;'!{{_<159abcggiijhhfiiilggdddddddgiljnlqvrsstusrsspummqmqqmmjegbb886}}_(^^]!!''','''{<||]^!(::_[269eeikmpwxBIKKMNNNOPQQQQPQPP",
+"PPPOONKIIHEAzywppolf09ccflyEIIKKKKHApi93<{{/<39ciopptyAAtollpwEHIHHEEAAAzAum0775cmqqqqld741347007359dgddddd9figgbbb8a53}:({!';;===;'!{{_<1789cfggggjhhggfiigggddddddikiljnrqrsvvrrrusmmmmmmmqqmjggb88622_(^^{'','''''''{_|_{]^^(:__26c9fimqtpzEIHKMMMNOPQQQPPPPP",
+"QPPPONMHHEAyxwttpllfd99999iwBHIKKIIEwplf92:::269ciptwAABypiiopwEHHHHECAAzAzumc075iqqqqpkc743479093379fffidbdhejkjhhbaa7|[[{]'';;;;''!{(_12a8a9ggiijjhgggfggigggdddgiilkinmmqvvsrrqrmmmmmmmmmmmjjggb88621_^^{!''';>;;>;'!<_/]'^^((__<69cfciqptBHIIKKIMNOPQPPPPPPP",
+"QPPONKFCCAuwttppollicdccdcfmtyEHIIIEAtpoic5}:}268clpwyABAukfiopwEEHJJECzAzAzukd57dmqqqqqm0333570d07359fgighgbejkkjehbaa74[[(!';;;;'!{(__22669dgggfjhhgggggffddddggkkmlnmnmmrrrnrqrmmmmmmmmmmmmjjgea8622_(^^!'';;--;;--,)<<('''^]({(1688chnqqwBHEIKIIMOPPPPPPPPPQ",
+"QPPOMLFBzwqqnmlloiiffcccfiilptwAEIIIEAywtpi9714370fltwyABymfflptyBEEHHEAzAAAxpfd00goqqqqqk055670dd95770gflkggeejkmjjhbaa74[[^'';;''{([[}2260cdfggjjhjgggffgfgfhhhiilloqnnnrrvnnokkmmmqmqmmmmmmjkkebba21_^]!!'''--===*;>)/</'''!]^{(_3a8ciioqyEHEIIIKNOOOOPPPPPQQ",
+"QOOONLFCzvsmjghbffccfffffilloptwyHIKIHBAyytof05770dfluyABApkgiptwyAEHIHCAzzAzwoddddkoqqqumgd90070dc0570dcimmkjjjjkmnjha884}[^^^!!^^^[[[}2799cffghejigggiiggggggffhilorrnnqqqnllhkkhmmmqqoqqqqqnmkjh8661_^{!''';-*****->,]<~';'){{!{[3389cnnqAEHHIHHMNONNOPPPPPQQ",
+"QPOOOLIFzvsmedgbab989cfiifiilptwwAEKMKIEBAAwoi9550dfimwAEEyqiiotwAAAEHIHEAyAAwtlcddgmppquumkcd999dggd00dggomnmjjjkmmjjjb864<_^^!!^^^:<13779cdgiheeehhggggffdhheijjjnrrqrvrrrnnhhkkmejnrprppqppqqmkidaa4[:{''';;--=&&&=;,/<~>;''!^^^_|388fllpAEEIEEIMOONMOPPPPPQQ",
+"QPPOOLHEzvsmmedb886868cfffiiilptwyAHKMMKHEAwtplfbbcffiqwBHEytppptyAAAEHHHBAAzzwuifgilqqquuupigd9dddgggddhhomqpnknkmmmljeb8621(({{((_|17790cfhhghheeheeehjjeheeheihjnonmrqppnnhkkkejjorpspppppppqoikfb05}_/!,>;--==%%%%;'{<{>;''!!^^:<158cfltBEHIGEKNNMMMNOPPPQPQ",
+"QPPONLHFzvssmed8a662a689bccfiilptyABIKMNMIBywwtpibdfiiipyEKEAwpppwAAzAEHHGBAAAzwuiiilopuuuuupkcddcdgggggjkmmmqnnnnmmmmnjea662__((__14479acefffhhfeehhhehhheehhehjjnnnmmqrrorkhkhhhjnqqqqppprpppmokjgcd06|<~!,--=%%%%$%*>{/);-;,''^^[:159cfltBEEHBHMNMIKMNNOPQPPQ",
+"QPPPNLLFzzvsmeeda666268b988fiiilpwyAEKMMMKHByyywplfffiiowAEIHBwpopyAAyAEEHGAAAACytolmmpuxtxxtuidddgggggjjloomnqnnnmmmmmjefa622}[[}2266a8cbffffhhhehhghehehehhhhjhjnnnmmnqnnhmmmjjknmqqmmmmpprppmmijcc0763|<~,>=*%%%&&%*>)()-->'''!^[[:40cciwBEEECINNKHIKNNOOPPPQ",
+"QPPPNMLHCzvsmmedbb66886a9668fppptwyAEIMMNNMIEAAytplifiilowAEHHBwttyAAyyAEEHBAAACBzwqlmqxxxwxxxpkgggiggkkgilljmmloommmnmmjhbba6}[[}22a6abcfffffhhheehhghhhehhehjjjhmnqnnnjnkhkjjkmmooollllmmnnlnmifea90221||<~'>*%&&&&&&-)~'-=-''''{:::40c9iyEEByBIMMHGIKMMOOPPPQ",
+"RQPPOMLFFzvsmmeddb6668abbbadiptwwyAABHKMMNNMIEAwtpoiiiijiptyEHHEAyAAAyyyAEHECAyABBAyuqquxzyxxzxumkkkijkkkjjjkkmjnommmmmmmhbbba2}}226a89bhffhffheeeehhhheeehhhjjjjnnrrmmmlnhheegklpolijhhjjkkknnkhhh8a3}1___(/{,>*&&&&&&-)~'-=;''''{_:1250clABEAwEKKKEGIKKLOOPPQQ",
+"RQQPONLIFzvssmeedbb6666a88bciopwyAAABEKNNNNNNKBytpillllifipwAEEEEEBAAywwyAEHHAAzABCAxpmpxAAzAzzxxqmmkjjkkkjjjhmmnnpmmnmmmmhha886688bbhfjieffhffeeehhhhheeehehjjjjhmmmnrlnhhbhdbiiolliieeehhkkkjkeb666|[_(({{~{~,>-&$$&&;)~!=*-'''){(_}250coyAAzyHKIIEGFFKMOOPPQQ",
+"RQQPONLIEzvssmmhddbbb666889jloopwyyAABIMNNNNONKEypoiopoiffipwyABEHEEAwtwwABGIHAAAzCCzwuquyzACzAzzxuqnmmllljnhhkmhnrmmmmmmmkkeb86688bbbejiffefhheeejhhhhhhhheehhjjmmqmrnnghhbdbbhiiffc9ahbbbeegggeb6661[{{!)!)!)),'-%$$&;)~);*=-;''{/(}437cpyAAwAIIIIEGGIILNOOPQR",
+"RQQPONLHFzvvsmmeeddb88bbbbhimmmmqttyAABHMNNNOONKEypplptoiffotwAAAABBAwttwABEIIGBAAAzzzxtwwyACAzzzAyuqpqoonkjkkhmjnnmmmmmmmkkggb88bbehhfhifhehfehehhfhhhhhehhhhhhhmqqmmnnhhba88bebcbd8aaa8bbbeghgebb62_[{!'''>,,,',>-*&%-'~);*=>''')//_227cpwywwBKIEHEGGFILNOOPQR",
+"RQQPONKIFzzvummhjgdddbbbbhgkmmkjnpptwyyyEMNNNOONMEytppttpigjowyyyyAAywtptyBEEIIHEBBAAAzAyyAABAAAzzzzxtppppmmnmmqqnnnmmmmmmkkjggddgggechfjihfhgeehehhhhhheehhjhhmmrqmnjjhhba888bc9098aa66aa8bbhkgebb62_^{!',>;--->>,,-**;'~);-;;'''!((<227ftwtttBKHEEEGEIILNOOPQR",
+"RQQPOOLIFBCAwwqqjjgggdddddgknnijjqptwwwuwBKMNNOONKHBwwwwwoifotwwwwwwwttttwABEEIKIEEBAAAAAzBBBCCzzzAAAytppmqqqqqqqnnnmmmmmmkkjjjedgggejeehihfhhheeehehhhhhhhjhhmmnmqnnjhgba8aa8aa8aa4316666a8cbekhba62[^{!'';;**==;>>>>->,~)>-;>'''!~/<126fpwttwEIEEEEGHIIMNOOPQR",
+"RQQPOOMKKHCByyuuornkkgggddfjnjmmmqpttwwwuxAHKMNNONMIEBABAwolmptAAAwttpttttyAEEHKKIHEBBBAAACCEGGEECAAAAwttpqpqqononnnonmmmkkkjjjeehggejeejhhhfeheeeghhhhehhhhhhmmmmmnjjgb0a68a8a86531_111266aabbheba62}^{!'>;-=%%&%*->>,'~/~'-->'''!{(<<26ittppwEHEEHEGGFILNOOPQR",
+"RQQQPONMKECAwyuuuppprmmnjjhjqqnmmqupwwwywtuABIKMNONMKIHEBAtolnpyAAwwtppttptyBBEHKKIHEEEBAAABEEHIIEECBAywuuptuprprnnnrmmmmkknjjjeehggejhehihhfefhehhhhhhhhhhhhjmmmmmnjhgb086266873}[[:[__112aa8bhebb861^^!'>;-=*&&&%%=>,)/</,-;>,''!{((|39ittptwHHEEHECEFIMNOOPQR",
+"RRQQPONKFCzzwwuuqnnnnnooonqqqqmmmmqppttwAwutyAEIMNNNMKKIEBAtoopyABAwtpooppptyABEHIIIEEEBAAAAEHIIKIHEEAAAxutuptttpprnrnmmmkknjjjedggghhbhehieffehehehhhhhhhhhjhkhhnnljhba8662aa53}:[]^^^^__12aa8bbhbaa1_^{!';-=*%&&$$%=;)(||)>;>'''!{(/|39iptppAIEAyBEGIFILNOOPQR",
+"RRQQPOLIFCzyzwyqqqjjjjnnouuquqtmmmqloppwxAyttwABHMNNMIHHEEByppptAAAywtpooppptwAEEHIIGEBAyAABEHIKKIIHEBEBywwttttttuqmmmmmmmknjjgddgbebbbhhehheheechhhhhhhhhhhkhkhhjnjhhba6622634}[:^]^^^^^(_12288bhba64_[{!'>-=*%&&&$$%*'~|3(,>>'''!{{(<39lppppAIEwxAEGIIILOOOPQR",
+"RRQQOOLIFFzyAyyqqmmmmmmmqquuyywqmmqnlotwwyywttwABIKMMIBABEEBwpoptyABAytpnoppptwBHHIIIEBAyyAEEHIKIIIIIEEAAAAwtttutuqqpqqmmmkkgggd8b88bbbhaabbbbcbbhhhdhhhhhhhhhhjjhjjhba8662244}[[{!]!]{^^^(_1228bbbaa41[{!';-=*%&$&##$&=,<3<~,,'''){((<49lppopAHAwxAEGIIILOOOPQR",
+"RRQPOOLLFFzzzwwqrnmmmmmmmmqtwyyuqqqqnpwyxyAyvtwABBEIKKHAAAAEAwpoppyABAytppoppptAEIIIKIHCAyyBEIIIKIIIIHHEECAywttutuqquupqqmmkkbb8668aa888aaa8bbbbbdddddddddddgghkjkjggb8662224}[[]]!!!!!!{^^(_122abba64|[{!'>-=%%$&&###&&>~|_/))!''!~((<39lpploAEAtxABGIIIMOOOPQR",
+"RQQPONLLFFEGCCAyqqqrqqqmmmpuuwyuuupupwyAAAAAAwwwABBEKKKEywwyBytpootyBEAytpqppptwAHKKKKIHEByABHHHIHIIKIIHHEBAxwttuqpopoppnoljhe8666a6aaaaaa880999dc9000aa0dddggggghhh8a862}221[[({,,',,'!!{]^__222ab8631:{!'>-=%%$&&###$%*)/</~~~',){(_|3coppooABytxACCHIKLNOPQQR",
+"QQPPOOLMKKIIEEBBAuxxupqmtpppwuwwuttwywyyAAAAAAywwAEEHKKIAwtwyywpomotABEAwppppttwyEIKMMMMIHEAABEEEEHIKKKIIHEBAzwtttppqljjjiiihba86222666a85667700000a6a6a8a0dddddhgdd86662211}[:{!'''''',!!!^^(_}26baa4|[{!',-=*%&&&###$&*>~/~{/(~'){(_|5coppooAAwtxyCCEIKMNOPQRR",
+"QQPPOOONMMKIEEAAAAzywuwttpqwvwttquwyABywyyyAABAwwyEEEIKKIytptttppoopxAAAAtpmpptwAABHKMNNMKIEBABEBGHHHIHIHEEEEBAyvwpponijjiffefb66222264434244226aaaaaaaaaaaaaaabddda066}}2}:::(]'''>;''','!^^(_}22aa6|1:{!',>-*%%$&###$&&>){)'~(/{~~(_|5coppooAywtxyCCCIKMNOPQRR",
+"QQQQQOPOMMLHHEEAAABBAAyywtxwvxptmqtyBEAwuttwAEEBwwBEHHIKKHytppopppopuwAAAytpoptwyyABHKMOONMKIEBBEEHHEEEEEEBBEEEBAywtppllijgeb8886626|14111}}}}222644477770aaaaab800a722}2}_[_<]!'>>>;;>''''!^^(_}26a24_[{!',>=*%&&$####$&-){)',{/((((/|5copplpwwptxuyABFKMOOPQQQ",
+"QQQQPPPONNMKKIIIEEEEBAAyyAAywwqttmqwAEEypolptwEEBAAEHHIKKKHAtppopporpuwzAAypprtwwwyAEHKMNOONMIHEEEHEBBAABAAABBEEEBAwwtpniec8662226434||::[}}}1|11111444377770008aa67a2}[}[[[:({'';;;;;;;;','^^^[}}2221:[{]!'--*%&&$$###$&=,)'->){{(___|3coppopttpsxuyABFIMOPQQQQ",
+"QQQPPPPOPOOOOOONMKKIHEBEBBACywpttmmuzEEyplfilpwBHEBBEIIKMMMIBwtptrpopqtwABzwsqppwwwyAEHKNOOONMMKHEEEBAzAAyyAAAABEEBBAtpoljca662}2|3||}}}}____<|:_1111}42277700067a622}}[_[:_:(!''-;;=-;;;;''!]^(_}2221_[{{''-=*%&&$$$##$&=>),>>''!(_11|39oppoptpoqxuyzzFIMOPQQQQ",
+"RRQQQPQPQQQQQQPPPOOONNKIEEBCAAytttqqwBBAtofcffowEHHEEHKKMNNMKEywttppputwAEEAyuqutwtwyEEIMNOOONNNKHEEEEAAAyyxywyyAEEEAywtolfc862<_((:[}21<:<((_______11144777776777a2}}[[[^[([{!,---===-;;;;''^^^[}2}21^[{!''-=*&%&$$$$#$$%>),>;>''!_34350ltppoppoqxuyzzFIMNPQRRR",
+"RRRQQQQQQQQQQPPPOOOPPOOMKIECCAAwwwwtwAAAwpjiccfltBHHBEIKMMNNNKEAwwtptuwwCEEBAwtuutwtwAEKMNOOOONMKKIHHHEEBAAwxwttwAAAAAywtpoib531_(^^[_<|<<___(((__::[1}1227777767342}[[[^][(({'>;;===**=;;;''^^^__}}}_^{!!,;>;*%&$$$$$$#&%-,)>;>'''{1459dotpppppppxuyAzFKNOQQRRR",
+"RRRRRRRRRQQPONMMKMMNNNNOONKHEAABAAAyyBAAwtpoifffltAEEAEIKMNNNMIBywtptwwwABEHHEzwvwyywyEKMNOOOONMMKKKIIHEHEEAAwtttwtwwwyyywtpic53::^(]{{/___<<__///____<1}}244734733}}[[(^^((^{'>-=====*=;;;;''^^][}}}[^{!'';;**&%$$$$$$#&%-,),;;'''!_|59iptpppttpuxuyAzFKNOQQRRR",
+"RRRRRSSRQQONMIGGGEHIIIKMNONMIEEEBBBAAEBAwtptpliffltAEBBEKMNNNMKEAwwtstwwyACEHHEAyAABBBBIKMMNNOONNMMMMKIIIIIHEBAwwtppppttwywtpic5|}_/(~{{{{(/<<<<((((__<:1}}24421144}1[^(^^]{]!,;===%=====;;;''^^{_}}}_^!!''>;**%%$$$####&&*,{);>,''!(_|9ipwtpptttttuyAzFKOOQQQQR",
+"RRRRSRRQQPNKIHBCCCCGGGHIKNOOMKHEEEEEBEEAtppttpoifiipAEEBEKNNNNKHAwywwwttxAEHIKHEEBEEEHEIMNNNNNOONNNNNNKKKKKMKKHEBytpooooptttpoif95|<_((~~)~~((_<<<(/<_<<<:111|}1}12|:[[{^^{({!';==*%%==*=;;;;'!^{[}}__^!''>-=**&%$$######&=>~)>>'''!{<|5ipywppttswtuyAzHFOOQQPQQ",
+"RRSSRRQPPONMKFFBCCCCCCGGIKNNNNMKIIIIHHHEAtptwwwplifipAEBBEKNNNMIBwyyyzutuyABEIIHHHEEEHIIMNONNNNOONONNONNNMNNONNMKIBytollilopppoolf933|__~~~~~~/</</(<__<<:}}}}_<:1|1::^{]{](]!'==**%%%&&=;;;;'!!^[[[_^^]'';-=*&%$$$######&%>))>>''''~/<3coyytptttwwuwzzFKOOPPPPQ",
+"QRSRRQQPOOOMMKKHEGGGGGGEHKKMMNOONNMKKIIIEwpwAEEAwoiiltBEEEIKMNNKEAAwAAwtuyyEEHHIHHEEEHHIMNOOONNNNNNNNNOOOOOOOONONNMHBwpiffiiloppplif953|<<<</{~{(((<</______<::___|<:](^^~](])';**%%%%&&**=;;>'!^{[[[^^!',;-=%&&$$$######&&-)),;;''')(<|9lwAwtwwwywxyAzFLOOPPPPQ",
+"QRRRQQPOOOOONNMMKIKIIIHHIILKKMOPPPOMKIIIIBwyBHEBAwpllpyEHHHIKMNMKEAyyyxtwyABEEEHHEEEHEHIMNOONNNNMMMMMMNNOQQPONMMNONKIBwoic9cffiiiillifc53||</{)]]~~//<<<//___<:](_:<]^{^^{^[/]';***%%%%&=*=;;>'!!^[[^^{''>;-*%&&$$########&*,));>'''!(/19ftyywAywywxyACIKMOPOOOP",
+"QRRQQPOOOOOOOOOOOOONNMKKIKIIKKNOPQPOMIEIMIBBEEBBEBAtppyEIKIIKMNNNKEAAAyyzAABEBEEEEEEEHIKKMNNNNNNMMMMMKMKNOPQPNMKKMMKKHBtlf63333359ciiiic953|/~)))))~{/<<<<<_<__](:::]]!!!!(_:{';**%%%%%&%==;;>'!!^{^^^''>;-=*%&$$#########&&>))'>'''!((|6cpwwwBAAAwxyACFKMONNNOP",
+"RRRQPPOOPPPQQQQQQQQPPOONMKKKKMMMNPPPOKIIMMHEEEEIKIHBwtyEIMMKIKNOONMEBAyyAAyACCCBEEEEGEHIKMMNNMMMNNNNMKKKIMNOOONMKIIKKIEAtlc6}/~~(<|59fffc953<~))!!!!!!{((<|<<(_(:::(]^!'!'{(:~'--**%%%%&&%=;;>'!!^^^^^'';;-=%&%$########$#$&-)~'>,''!(_}29ottwABBByxyCGFKNONNOPQ",
+"RRQQPOOOPQQRRQQQQQQQQPOOONNMMMMKKNOPOMIHIIHEEEHIKIIIEBBBHMMMIIMOPPONHBAyABABACzzEEEEEHEHKMMMMNMNOOOONNKKIKKMNNNONMKKIHEBAwof9<~)')~/|599c9953<//~~)!)'!{(___</::(<_(]]''!'!{]!'---**%%%&&*=;;;>!!{^{^^'';=*=%&&$#########$&&*)),;'',!//}29ltttyBHHAxyCGKKNONMOPQ",
+"QQQOOOPQQQRRRQQQQQQQQQPPOPOOONNMKKMNNOMHEHHEEEEHEBEHIIIEHKNNMIKNOQQPNHBABEEHEEBCBEEEEHHIKMMNNNNNPPPPOOMMKIKIIIKNNNNMIEAAABAti9<{',,))/|3599995|<///~)!)){{(__<<]((<_/{!'',!]~);***&&**%&===;;;>!!{^!!!';-=*%%&$$#########$&&*,))>''')~_}29lttpwBIIByACHKLNNNOOPQ",
+"QQONNNOQQRRQQQQQQQQQQQQQPPPPPOONMKIIKMMKHEHHEHHEAwwAHKMKKKNOOMKMOPPPONIEHHIIKIIHEEEEHIIKMNOOOOPPPPPPPOONNMMKEEEIIIMMKIBwwABByo9|/~))!)~(<|59cc953|</~~))!{{((_</(]//(/{!'''!{';**%&&%*%===;;;;'!!!!!!'>;;*&%$&$##########$$%*>))'>''){_}29ltwtwAEHBAAEGKKNNNOOOP",
+"PPNKKMOPQQQQQQQQPPPQQQPQQQQQPPOONKHEHHIMKIHEEHIHBwwAEKNNOOOOONKKMOPPPPOKKIKMNMKKIIHEHHIKMOOPPPPPPPPPPPPOOONMIEBAAAEEIKIAtptAAwpf5|/~~~!)~/|59ccc93|</~){~~~~(((/(((//{{!',!{]);**%&&%%%*=-;;>''!!!!!!';;=*&%$$#####@##@@@$$&%>)~'>'')![:}5iwwtwyEEBABEJKLMNNNNNO",
+"ONKKKNOPQQQQQQQQPPOOOOOOOPQQPPOONKHBBABIKKIHHHIIIEBBEKMNOOOOONMIINOPQQQPOKKNNONNMKKIIIIKNOOOOOOOONONOPPPOONMKHBywtwAAEEAwppptwywl9|/~~!)))~<39ccc953|</~~)~{{(]{//(/]~!,'!!//!;-%%%%%%%&*=;;>'']]!!!!';;=*&$$##@####@#@##@#&&-,~)'''!{::}0itywwwBBAzAEIKKKNNMKLN",
+"OMHCHMOPPOPQQQPQQOOOOOOOOOPPPPOONKIBAyBEHKMKIHIMMKIEHIKMOONNNMKIEINOPQQQQOOOPPPPOOONMMMNNNNONNONNNNNNOOPOONNMKHBywtttwwyyywtpptwwo9|/~)),,,)~<39ccc995|<//~~~~{{]](<:~!'',!{~{'-*%%%%%%&%&=;;''!^]]]!,;-=*%$$#@@@##@@@##@@#$$*'~~''''{^:[5fpywwwBBAyAEJKKLMKIHIN",
+"NKECGINPOOPQQPPPPPNNMMNNOOOOOOOONMKEBBBEEIKMMKKMNMKBAAEIMNMMKKKIEEHMNOOPPPPPQQQQQQPPOONNNNNNNNNNNNNNMMNNNNNNNNKIEAwttppptyAAwpllopl9|/~),'>->,~<|59ccc53|<//((({{]]]</{!',,)~~'>-**%%%%&%%=;;;'!!]^!'';-*&%$$#@###@@@@@@@@#$&%>~{)'''!]::4dpwwwwBEAzAEHKIIKKHEIM",
+"NKHEHMNPOOPQQPOONOOOMMMNNOOOOOONNNMKHHEHIIKMNMMKKIEwpptAEIKMKKKKKEBHKNOOOOPPPQQQRRRQQPOONNNNNMNNNNNNNMMMMMNNMMMKHEBwtolootwBEApfciolc3<~),,-;=-,)/|5999953|<<<<(]~]]/_/^''''!)'>---***&%%===;;''!!!',;;-*=*&%$###@@+@@@@#@#$$%;)~~'''!^[:39ltwwwBHBAyBGIHIKIEEIM",
+"MIEIKNOOOOPQPONMMNOONNNNNOOOOOOOONNNKKIIKMMMNNMIEAwpliotwAHKKKKKMKEEIMOOOOOPPPPQQQRRQQPPOONNONNNNNNMNNMKMMMKMKKKIHEBAwpooptAHIEtiilifc9|~)',-==;-,)<3599953|<<<_/~]{]//]!)!!)]'-*********=*;;;,',!'';;;=*&%&$$####@@@@#####$$%='~~!'']^^|39ipwwwBHEAACGGGHKIEEEK",
+"MKIHINOOOOPPONMMMMNNNNNNNOOOPPOOOOOOONMMMMMMMMMIEytpliklopwEIIIIKKKKKNOOPOOOOOOPPPPQQQQQQPPPOONONNNNNONMKKKKIKIKIIIHEEAAwptyEKMKHApf9cc9|(~)>-**=*>,~<3599971|<<<///]({{{!]]{~'-*%%%%%=**--;;;!!,';;;;=&%$$#######@@######$$&%*>)/{!!!^]|39ipwywAHHBACCCAEKIBAEI",
+"KKEHIKNNMMNNMKMMMMKMMMNNNOOOPPOOOOOOONNNMMKKIIKKIEwpoikiilpwEIIHIIIIKMNOPPOOOOOOOOOOOOOOPPPPPPPOOOOONOONMKKIIEHHIIIIIIIIEBABEHKOPOEl539c93</)>;==**->)~|359953||<]]]](/!!'!)~~)'-*%%%%&*=;;;;'!]!'';;=*%$$###@@@@+@@@##$$$%%&**;~</{{~][|39fowywAEHBACCzACEEEBAH",
+"NKEABKMNMIKIIIKMKMMMMMMNNNNOPPPONNNNONONMMKKEEIKMKHwploollopwEHHHHHHIKMNOOONNNNOOONNNNNNOOOOPPQQQPPPOPOOONMKIHEHEEEHHIIIIIHHEEBIOQNAi9555953<)>--****->)/|559553|//]](/{!'',)~),-**%%&%&%*=;''!]]'',;-*%&###@+++++++++@###%&%**;)<<_/([:|79fowAyAEHEBBBAwAEHzAEK",
+"OMEABHNNIHEGGHEHKKKKMKKMNNOOOOPONNNNOOONMMKIEBEIKMKEwpttppootAEHIIIHHHIKKKMMKMMNNONNMMNNNNOOOPQQQQQQPQPPOONNMKKHEEBEEEHHHHHEEAAAEKONEpf5|3599|~,>-****->,~<359905|<]{(/]!'''))!'-**%%&&%===-;',!'''';-=*&$#@@++++++++++@##$$%%*;,(<_//::179flwBAAEIHEAAyyAEBAAGM",
+"NKAwAEKKHAzCBGCCEIKMKMKMMNNOOOOONNNNNNNNMKIHEBBEIKMKEywwwwtppwAIIIIHEEEEEEEHEEEIKMMMNNONOOOPPPPPPQQQQQQQQQQPONMIIEEBBEEBEAAAAywyyBKNNHwi5||5cc5<),>----->,)<|599933<(//]{''')!)'>*%%&&**==;;>'''''>;;-=&%$$#@@@++++++++@@@##$%%=-)<_(~:[_|5cipwAABHIBBAyyxzzyzAI",
+"KIAwwAIIEAzABCzzCHIKMNNMMNOOOOOONNNNMMMNMKIHHEEBEIKMKBywwywtttwEIKIHBAAAAAAAAABBEIKKMNNOOOOPPPPQPQQQQQQQRRRRQPONKKIHEEEBBAABAywyABEHKMHwi5<|3cfc3/),>>>>>>,~<|599993<</(^,>',)),>-=*&&%%==;;;','';;;=*%&$#$#@@#@@@++@+@#@@##$%%=-,/_({]^_|38cltyyzEIBxuuuuyzrrwE",
+"IIBwwAEIAAyBBCCCGHIKNOOOOOOOOOOOONONMKKMMKKIIHHHHIKMMKEAwtwwtpwAHKKIEAwyyAyAABBBBEEIKNNOOOPPQQQQQQQRQQRRRRSSSRQPOOOMMKKKKKIIKIEEIKIEEKNKAo9|<|9ff5<~,,>>>>,)~/|599953||<],'>>,),,>--***%*==;-''';;;;=%$$###@+@@+++@@@###$#&&%%==-,{_</^^_<38bipywAEIExuuuuxtrouA",
+"EHByyAHHBAAAyCEEGHIKMNOPPPOOOOOOOOOOMKIIIKKKKIIKKKKMNNKEwppttoptyEIIIEAywyyAABBEBBBEHKMNOOPQQQQQQQQRRRRRRRSSSSRQQQQQOOOOPOOPQPPOPPOHAHOPOEtf5|3ciic|~,,>>>>,,)(|3599555|:),';',,,>>>;>---;;>;'''>;;=%&$$##@@++++++@@@@###$%==-->>)/11_::_1379fpyyAzEBtpruuttqmuA",
+"EEByAEHIAyxAAAHEEGGHKMNOPQPPOOOPPPPONMKHHIIKKKMMMKKKMMMIypoopoolotBEHHEAwtwwAAABBBEBEIKMNOOPPQPPPQQRRRRRRSSSSSRRRRRRQQQQQQQQQRRQQQOHAEOPPOKAti99fopi9|/~)),,!!~<|3555953|~,,>,,,>--->>>,;>>>'','>-==%&$$##@@++++@@@+++@###$&&*;>')(|33}::|35cfoyyAAAAtpprpttqqpy",
+"ABAwyEIIAxuyABEBEEHIKKMNPQQQQPPPPPPOOONIIEEIIKKMKKKIIKKKEtllloliiotABEEBwtptwyyAABEHHHIIKMNOOOPPPQQRRRRRRSSSSSSSRRRRRRRRQRRRRRRQQPOIBEIOPPOKBwl9cflppi9|</////<<1|5559955|~'>,,,>****->,,,,,'!!,;;;=%$$#@#@++++@##@+@++@##$&%*;-;,{<|72[[||59clwAAzAzwqqmpqtpnpw",
+"yBAwwBKKEwxwzEEEEIIIHKMNOOPQQQQQQPPPPONKHAyABHIIIIIIHHIKIApolooolopwABEBAtpptwwwwyEKKIIKKMNNOOOOPQQQQQRRRSSSSSSSSRRRRRRRRRSSSSSRQQQOMHHIOQQOHAti999iptoc5|<<<<||||33599995|/)))),>****->,,,){]]!'>;=&$$##@+++++@#@@+++@###%*->',,)/_3952}|159cityAAAywrqqqutpoot",
+"yBEAyAIMIBwAzAyEEEEECEIKMOPPPQQQQPPOOONKEAwtwyAEHIKKIHHIKIAtoopoooptyBEBAywttttttwAHIKKMMNNNNNNOOOPQQQQQRRRSSSSSSSSRSSRRSSSSSSSSRRRQQPNNOQQQMBwti955fotof5|<<<<||<|||355c95|<///~)>>-;;;'',))]]{),;-*%$###@++++++++++++##$%-,~)){/|35fc94335bcipyAAAytppppwwtrot",
+"yABAwyBIIByAAyzAEAyAABEIKNNOOPQQQPPPOOMKEBytttwyBIIKKIIIIIHAtpooooopwBEEBAwtttppopwyBEIKMNNNNMMMMNOOOOPPQQQRRSSSSSSSSSSSSSSSSSSSSRRQQQQQQQRQOHAAwof99fptpi93<<<<|<<<<1||555||<<//~,,>>>>'')!{{]))),>>-=$##@++++......+++@$&=>!)~/<|35ff953799fiowABBAwtpppwytppt",
+"tyBAwwAEEAAywyAzyywAACzEFKMOOPQQQQPPPPNMHBAwwwwwwBHIKKIIIIHEAtpooollpwAEEByttpolloptyABEIKMMMMMMMMNNNNNNOPPQQQQQRRRRRRRSSSSSSSSSSRQPOQQQQQQONEwAEyof99fpwwof53||11<</]//<|3||<<</~),,>,>'',){]])'',,'>-*=*%###@++....++++#$&*->,)/(_|5cc52459fiopyAAywtppptwwppp",
+"twBAwwABEBzyyyBAwuyyzyzAEKMMOPQQQQQQPPNKIBBAwtppptAEHIKIHHHEBypoopoilptABBAwpolffilptwyAABHIIKKKKMMMNMMMMNOOPPPPQPPPPPQRRRSRRRRRRQPOKMNPQPOIyoipBBti933cowwpf95|33||<(/~/<|||<<<</~,,'>;',,)!{]),',>--;*=**%%%$##@@+++@@+#$$$&*;;,'!/|7952|70filpwBBAAwpoptwwtop",
+"ptyAwtyABBAxzBEAzxwywyzzFKMNOPQQQQPPPOMIHAAywpoiilptBHIHHEEEBAtppttoiiopwAAytpliffilptwyyABEHIIIIMNNMNNMMNNOOOOOPOOOOOOPPQQQQQQQPPPOMKKMNNKAoc9iyHyi5<<|5fpplc53333|<(~))~/<<<<|||/),',''''',){)''>--*=%%%%$%%%%$$########$$%&*=;;''!{122}:457filtABBBAtolowwoop",
+"opwAwttyBEBAzAEAwxxuwwzBEKMNOOPPQQPPPOMIHAAwupokiilptAEHHEEEEBAwtwwtoiiloptwwtplifdgioptwyBEEHHIIMMNNNNOOOOOOOOOOOOOONNNNOOOPPQQQQPONMMMNNMIAoioAIAi9|/~/|9ili933||<<~)>;'))~~/<|||/)),,,'',,,,'',>-*&%%$####$$$$$$$$%$$%%&***---;'!!!{13}[_1|85cipwAywpiijopoll",
+"iopwwtptyABwtwzywtwuqwAAEKKNMOOPPPPPPONMIEAyutpolllootAHHHHHHEEBAAAytpliiilptttplifdfilotwABEEEHIKMMNOPPQPPOOOOOOOOONONMMMMKNOPQRQQPOMKMNNNNNHAwAAti93/~~~<9iiic53|</],;*;->>,)~/<</~),'''',,,',''>;*&$$$##@@@@@@@@#$$$$*=*->->,''!!{){<43:^_1|439iptppifccgiifi",
+"filpwpootyAtppwxptpuqwxABEIKMOOPPQPPPOOMKICAywtqpppppptBIKIIIIIIHEBAwtpoiiilptwtpolifiilmpwABEEHIKKKMNPQQQQPPPPPOONMMMMMMMNMKKMOPQQQOMIKMKIKNNHApof993</~)~<5fiic93</~,>**%**=->)////)),>;;;;>>';;>-*&%$##@+@@@++++@@@##$%*->>,)~{//~(/<|52:<<__|29looli9589cfcc",
+"cfiottllpwAtlltpqqpoqqwAyzEIKMNOOPPPOONMKKEBywttqpppoppwEIIHEHIIIIEAwwwtplilotwAAywwtppoopwyBEHHIHKKKMOQQQQPQQQQQPONMMMKMNNNNKIKMNOPPONMMHBBEHEypf953|||/~))/5iolc5|/~)>**%%*&*->)///~),>>-;;;>>;;--*&&$###@+++++++++++##$$%*->,'{{////||5832}:}269ioolic977cc99",
+"fiiowwpoopAwpopplmmlqqwuxzBFKKMNOPOOOONKKKHEyttpppooolotwBEEBBEEHHEBwtttpoiilowAEEEEAAyyyyABEHIIKKIIKKNPRQQPPQRRRRQQONMKKMMNNMMMMMMNOOOOOKEAyyAwtof5|<<|3<),~<9lpi9|</)>-*%%*&%*-,~//~~),,>>;;;>;;*=%%&$##@+++++++++++@###$&&*-;''''!!~~_|593321359fptpoic90dcfc",
+"illpwAwpotwywtpolikinuuwxzAEIKNNOOOOOONKKIEBytuoolololooptwBBAABBBAAwpllllifcflpwyAAAAABBABEEIIKMMMMKMNPQRQQPQQRSSSSRQPONNMMNMMMNNMKKKNOOONKEAwtttpi93|353/))/3cilf5|<~,-=*%%&%&*-,~///~)),,>;;;;;-*%%%$##@@+++++.++++@@##$&*=-;'';''''')/|3|<<<<|39ipppoic9cfif",
+"iilpyEBwttyEEywpiikgjquwtxzFIKMNOOONONMKHEBAytplkilllollloptyAywwwywwtoifiif999cilptttttwwwAABEIIKKMKKNOQQRQQQQRSSSSSSSRQPPONKKKMMMIIEEHINOPPNHyttwwpi9995|///|39ilf5|/)-*%%*%$$$%-,~~~)~)),,>>;;;-*%%%%$#@@@++++...++@###$&%=*;;;;;;;''''/<<~~!){/|5ioolifc9cff",
+"cciltAEAwtwEIHAyoiigjiqqtwzDEKKMMONNNNKIEBAxwtqplkllllliililpwwwtptttpplififc55599floooppppwyyAABEEEIIIMNOQQQQQQSSSSSSSSSSRQQONMKKIHHHBBABIMOPOIBAABAwoc53|<<<<|39ilc3<~,*%%%%$###%*,,)))))),'>--;-*=%&%%$$#@@+++++++@@###&%%*;;;;;;;;;;;')/({''''!{_5fifc95599c",
+"59cciwBBwptAIIEAtligdemmtwzAEIIMMMNNNNKIEAyuuppqollifeffiiiiiptwtppppppoliffc955555cilloppptwwyAyyAAAEEHIKMOPPPPQSSSSSSSSSSSRRQPOMKHHIEEBABEIMMMMIHHEBwoc5|<<<<|35fiic|/)>%$%*%####&=>>>,)))),,>>--*=%&%$$$##@+++..+@@####&%&*;;;;;;;;;;;;'!~{';;;''{<0cc953|359",
+"95359lyBypptBIEAtiebdemmquxAEHIMMMMMMMKIEAAuqomqpomiicccfffgilpttppopppooifffc9553359filooppptvwywyyyABEHHIMOPPPPQRRRSSSSSSSSSRRQPNKIIHIIEEEEEEHIKMMKIEyoc53|||5559fol9|/)-%%%%$#@@#%*-->,,))),,>>>-*%&$#####@+++..+++##@#&%&*;*;;;;;;;;;;;')),---->,~|9995||||5",
+"95259fpAypopyEBypicedeempvuAEHIKMMKMKMKIECAwuqmmoppoifccccffiilpttppoooooiifffc9533599fillopptwwwwwwxwyAAEEHKNOOOPQQQQQQQPPPPQQRRQPNIHEHHEEEEBAyAEIMNMMKApic5339c95cotl9|/,-%%*%#@@##%***-,)))),,>>-*%$########+++++++@#@$&%*******;=;;;;;;->),;===->,~39995||<3",
+"35359flwytolpwwppifeggjmpqvxDHIIKKKKKKKIECAysrnjoppuplfccccfilllppppooollliifffc9555559cilopttwwwwwwwxwwyyCEIIMNOOPQQQQPONMMMNNOPPPOMIIEBAwAAywwttyEKMNNNIAtlc9cfc9cltti5<)>*%%*%#@@#$%%%*-,))),,,;=*%%$###@###@+@+@+@###$%&***=*&%&**==;=*==',>-*%*=>)<5c905||3",
+"5559ccfowwoifooppofffgjmmrsuDFHIIIKKKIIICCAvurnkmnpppolfcccfloolloppplllliiifffcc9557550cfipptttwwwwwyywwyABBHIMNNPPQQQPOMKKKKKKNNNONNMKHAwwttttpoopwBIMNNNMHAtppoolotwo9|~,-***%$#@@#%%%%*>,,,,,,>=*%%$$###@##@@@@@@##@#$%&***%%%%%%&*=**&%%-,,>****->{3cc99953",
+"5555599fopofdilptpihhgjmmruuDDEEIIIIIIIHCByvqqmnmolilllifccfioooooooooliiiffffcc9955333599fiopppptttwwyyyyyAAEEIKMOPPPPPONMKKIHEHEHIMNOONKEAytpoliiffipBKMOOOOMIHEAywAytf5/)>>**%%##@#$%$$%*->,,,,>-*%&%$$$#@@@#@@@@+###$&%&****%%%%%%**%&%%&&;'>==&&->,<9ffffc5",
+"333||425fomgc9ipwtibegemmrtuxDBFEIIHHHIHEAyvuqqnmoifgiiifffffioppolooooliifffcc95595533335afilooooppppwwxwyAAAEHIKNOPPPPONNMKKHEBAAABHMOOONKIEwoifcc99cltBINOOONMKIHBBAyo9|~),-*%%$###$%$$$%*->,,,,>-*&%%$$#@@@@##@@####&&%%******%%%**&%%%&&=*>,,-;;->)<5iiiif9",
+"1<<|_<139ipld0fowwocfgjmmrsuuxDBEEEHHHIHHBDvtqropomfddgfifcccfiopololloliifcc9955555553337adfjilllllppptwwwwzzBBEIINOOOOOONMKIIIBAwwwyAIMNOOOMHwof999599flpwEKNMKIHHBBAyti5|/~)>-*%%$$%%%%$%*->,)),,>=*%%$#@@@@########$&%%****%******&%%&==***>)~),>,'!/|ciffc5",
+"_(<<<<122cloidcitypffhhmmrvvsuxDBEEEHHHIIEDyuusppmlfc0cdfffc99cioooolllliifc99553355557735a0behiikilooooputwAyAAEEJMNNNOOONMKIKICytqpptABHIKMMKEwof953599ccfowBEEAwwwwwwti953</)>-*%%%%**%%%*=->))),>-;*%$$####$##$$$$$$&%&****===*===**=;--**->)//)>>>,)/|9c995",
+"<((<</(_25foofcfowtihkjmmrnorquwDDEBEGHIIEEAwuutppolcb0ddffcc99cfilliiiiiifcc95533559957756d0c9hhiilionopupwAAyAECGIMMNNOOOMKIIEBuuomorpwwwyABEEBypf5||39999cipwytpoooooi9355|<~)>-%%%%***%%%=->,))),,>-*%&$$$%%%$$&&&$%%*=*--*=--=-;-*=;--*=**=-,)'-*-->,~|9995",
+"|_(__<(_}39loifciopifkljmmponrruuABBBBEHHHEBywxttpoofb99cffifc9059cffffififfc955333599990999ddcchgeiijonlrqptxxzECCHIMNNNNNOMKIHAuqjjkhinloooptyBBypf5||35559clpwwplifc99|<|3|/~~)>-*%****%%$&*=>>,,,,>>-*%%%%%%%$$&&&%%&*****=*==*=**&&*%%&&%%&%=>';%%**>)/3999",
+"5|_(<</_}}6foliccioiifkljmmkonvuuxABBBEEEEEEAwwwwppolfccdffffc9533399cfffiiiffc9955599c90ccccc9gdhggijomnrqqpxxABCCEIKNNMNNNNMKIByqmjggeebbcccipwyAytof5553335clpwwtof95|</<||~))))>*%%*-*=&%%%**->>>>---=&$$$$$$$#$$$$%&%&*%%&&&&&&%$$$$$#$&$###$*;;*&%%=;,<599",
+"93<_<<</}}29iplfccffcfilonqmmppssxwABABEEEEEzyywwwtpolfffcccdc99533359ccfiiiiffc995355999c988090cciiilnoorqqpxxAACCHFIKNNMMNNNMKHAuqjhgba663239flpttyAwoic5|||5citBBypf93|<<|<~',,,>-*%*---*&%%%**---;-***&$#######$###$$$%%%%$$$&&$$#@####$####@@#%=*%$#$&>)<55",
+"953:_<|<}}}5fooic9c9bcijmolqmmppuwxAABABEEEEAyywwwttpoieccdcc999997333599ffffffcc99535599ccc88a99cdhfilonorqpxxAACEHIKMMMNMMNNMMKEAuqjjg8664}||59fiopyBBytl93||39iwBBtlf953|3|/),,,>-*%%=>,>-*******--**=%%$############&%&%%%$$$$#$###@#######@@@@#%=&$#$&=>)|5",
+"5954||3|22239ipoicc9acfiooolqpqttwwyAABABEEEAyywwttpplkicccfc99999553|3559ccffiiiffc99cccjiiffcccdchiklooorqtxwyyBCEKKNNMMNMMNNMKIEAuqjg8a24:<<<|359ipyBEEAti93339ipwtplic533|</~)>>-**%*-,,>=*-*==**=***=%$$##########$$%&%&%$$$$###@@#####@@@+++@@$&=%$$&&->~|",
+"35553|3352226fotoifccciioooolpmmttwyAABEEEEEAyxtttqoooiiifcfc995999955559cffiloooooliiiiilloliiifiilloopppttwyxAABCHIKNNNNMNMMMNMKKEwuigaa21:_(///<|9ipwAEIHAof5535ciptpoic533|</)>>--*%&=>,,---*=***=*****%$##@@######$$%%%%%&$$####@@@####@+++..+@#$==&$$&*-'<",
+"|599955555559cittoieciilioomlnmopttwyABEEEEBAwtprrppoookggf9c999999cccfcciiiilppppppoollliiiiiiiiillooopttwyyAAEEEHIFMNNONMMNMMNMMMIExuke861[_(~////|9fowAEIHAtf95559ipttpif953||~)>-*****-,,,-*=&%%%=***--*%$$#@@#######$&=&%%$$###@@@#####@@++..+@@#%;*%%&*-'~",
+"<59ff99999599cfowtlfffiiilooonlomttpxwAAEBBBAytpqqpqplllgccdfcccffiiioliiiiilillloooolllliicddccfgiillloppswyAAEEIIKMNOOPPONNNMMNKMMIEymib64_[]{//(/||5iptyBEHBtic999cipttpiffc95|/)>**%%%*-,,>**%%%$&%**---**%$#######$#$&**=%&$###@@@@@##@@@@++++++#$=;-*==-')",
+"/39fifcc999599cipwplfifffilooolimmoouutwyADAAAywtrrmmmiiiggdgiiilpptpppliiiiiiifiilllllooolic9099cfigiiknopuwzzBEHIKMNOOPPPPOONNMKKMMKEwoia61[]/<||||||9fiopyBEBwoicccflppoiffffc95<)--***=-,),-*%%$$&%%**----*%$###$####$&%%**%$$#@@@@#@#####@+++++@#$*;,>>;>,)",
+"~|5fiifc9999559fottpliiffcilllkikkglnrpuuyAAAAywwpqrnliiiilikllmopwAywtplliifififiilllloooolic0899dffiijnlrutxxAEEGKMMNOPPPPPOOOONKMMKIBwof94}<_|33|</<|59cfipwAAytpicfilolfcccccc9|~,>>>>>>,~~>-=%%&$$%%*->->--*%$$&%$$$$$%****%&&####@###$$###@@@@@$$=>)))>,,)",
+")<3ciiiifccc999ciottoifc988fffgdhgggmlrquwAAABAwturpqomoploollllopwyyttptplliiffffffiiillliiifd99999fiijnloqtxwABEGILMNNOPPPPPOPOONMMMKIEtic62<_|33</~)~<|5999fotyAAtlilopoi95999553<)>>>,,>,)~)>-*%&%%%%-->>>>>-;**&**&&%%*;**=*&&%%$&$$$%%%%$######$%%=,~{),,,",
+"~/|0ioooiiffc95559iolfc986a9cfegfbggijmmquyAAAAwuqquuttttpoooiiiilopttttttpplic99999ccfiiifcfccdc800cffilloqtxxACBCIKKNOOPPPOPOOONMKKKMMKEtl92__<|3</~))~/<35599iotAAwtppttoc5555555|~>->,,,,,)~,-**&%%%%*->->>>>>------=*=--*****&%%&&$%$%**%%$#####$%&&-)//),)",
+"/<|5cioolic995|||19fic999626bcfgdbgggiinmqwyAyyytpquttwttuppllifffiloopttwttplf955599ccffffc9c9cc990dccfjjmqsuuyCEEHFMMOOPPQPOPOONMKJHHIKIEyoc3|/_|<</{~~~~/|5999cipwAAAyywti53555555|~,,)),,,)~)>-&&%%$$%**;->>>>>-----------***==%%&&$$$%***%%$$$$$%*=*-,/</~~",
+"/~(_|5cffc54|41_<||9cc95762aaccfghdggnlqqqpwwyyyywwututpppppolliiccfiilopttttpofc599ccfffccccc99cccccecfijoqrusyCCBFIMMOOOQQQPOPOOMKHEEEEEHEypf93|||</~~/////|5999ciotwBEEBwo9||333333|/~~~),,,~~)>-==%%%&&&*-->>>>>--->>>>>>-;--=*%%&$%$$%*---=%%%%%*--->,)<<</",
+")!!{{/|9c953||1____|7cc977626bcfgdfkkkmrrqqtwyyAAAywtuqpmmloooliifcccfffilopptttplfcccfffcccccc9ccddgfeiliqqpuyyBBGHILMOOOPQQPPONNMMHEBAwABBAwoi9343|<///|||<|359cciloptBIIBwl9||||||||</)~),>>,~~,>==*%%%%*-->>,,,,,>>>;,,>>>>>---***%*%%*-->--**&%%**=**->,~/~",
+")'''')/|9993|<<<((/(<7c9056266dcfghgkkooqrqtwyABBAAywtpommlkiiiiffcc99ccfiiiiopwyytlfccfccc99ccccccfiiiiloqppxAEEGFFIMMNOOPPPPOONMKKHEAywwwyAywoc53353|<|553|3359fflliiltBHHEyo933333||</)),,;*-,),>=&%%%%%%*-->>,,,,,,,>>>>>>>---**=*%%%$$%**%%%%####$&&%%&-,)~",
+"!!''>,){|553|<<<_({~(|9c90566689ffgfkknlqrqtyBEEBBAywwpolkkfggccfcfccc9cffffffipwAAwpiffc9999c9cccfgifilloqpxwBHHHIFILNNOPPPQPOOOLIFCBAxtpptwAAtl9533533599533359fiiliiopyAEEBApc99993||</),,;**>,,>&$######$%**-->-----;--*=-***&%%%&$$#####$$#$###@##$$$&&*;>!",
+"!!';-;''~|553|<<__{{{(|9cc0866889fgikklinnqtABEEEEAAywtrllidd90999cfiiifffcc9cffiotwwtoif9999c9ccccfiiilinmpuwAEIIKKMMONOPPPQPPOOLIFAAyurmmoptAytof5||||59fccc99cciiloopptABAABApifff53||<~),>**-,,>*$$#@@####%%**=------=*%**%%%&$##$###@@@#######@@#####&%%&*>",
+"'!!>;;;-,~|553|<__({]{_49cc066aa0fkifkglnrptyABEEBBBAAwpolif9999099ccffffffc99c9ccfiotttoi999c9dccffiiilnnmruuAEHIMMNMOOOPPQQPPOOLLFBvwqrmieiiptwwplc5|||39fiopppiiiloopppwBAAABAplii9533|/))>--;>>>-&#@#@@@@@#$%**-----;=&%%&%%%$######@++++@@##@@++@@#@#$$&%%-",
+";'!,';--;,~|5531<_</{](/38cc966a8fkkikkmrputwyyABBEEBAywpoiffc9c9995559cffiffcc99599cipwtpicc9ccccgiiiioooqpuuzBEGKMNOOOPPPQQQPOOMLFFzvqnmebb9ciotttoi953359itHMHwtpollollpAEBBEBwoif95595<~))>>-->>-&#@@+++++@#$$%*----*=&%$$&$##@@@@@@@.+++++@@@@+@@##@##$&%==",
+";;'),'-=->,~|553|<|<_(~][20cc969afgkimioptuuwwwyzAAAAAwwtpoifffc995573559cfiiifc955599flppoliccccgfiiiooopqppuyyBGFKNNOOPPPQQQPOOOLIFzvtqkeb96259iopoic99599ftINIAwwtpoollowBEHEEAtlf955993<//~),->>-*$#@@@++++@##$%******&&$$$####@+++++....+++@@@++@##@##$&%==",
+";;;,',>--=;,(|5353|1<_]/_}29cc98ccfiommpptuuwwwxwyxwxwwwttpolifcc9533333559ciilic953599cfloollicccfiiiiolpqqpuuyACHKNNOOPPQQQQPPOOMKFzzwqkij96}||5ciif93359cipEKEtooppttpoopwAEEEBwpif99cf93|<</),>>--&$#@@@++++@##%%*****=&$$#$$##@@++++++.+.++@@@@#@##@$#$%%=;",
+";;;;,,,>===;,(|35533|1_/(:}5cffccbfipppupsuuwwwywwwwtpptttppolifc99533333559cfilli955559cfiilooliiiiiiillloqrwuyCCEKMNOPQPQQQQPPOONMKCByumjjc9}<_|39cc9|<<39flAIBpc9cipwwtppttwyAAytoifffi93|<<//))>--*&##@@+++++@#$$%**%%%*&$$$$##@@++++.+++++++@@@#####$$&%==;",
+";;;=>>,,-==*-,~|35577|1</[:49fiffbcgouutppqqswwywwwwttppppqpolliifc953333355599fllifc979cdffiopppoiiiiiilloqpwuyAACIKNOOQQQQQQQPOOOOKHByxrljc921_/_|5993<//|5cpBEtc335cltwtttppoptwwtoiiff93|<////~,-***$##@+++++@##$%%**%%*&&$$$###@@+++.+++++++++@#####$$&%==;",
+";;==;->,';***-,~|555733||}:15ciilfffltutppqptvwwttttttpppoomoliiiifc955333355559fillif9909ccflottpoolnlmlloqqpuyyACFKMNOPQRQQQQPPOOOKHBAupojeb52<(/<<399|<~/|9iwEAl9599cilptwwtliiottpifc95||</~/</)-=***$#@++++++@#$%%**%%%=&%$#$##@@@++++++++++++@#$###$$&%=;;",
+";;===*->,'-***-,/|55557552}|38dfllikipqqppqpttttttttttppppollliiiiiffc953333353359filiic9009cflpttpppppppoooppxuyBCFLNNOOQQRQQQPQOONMICwurmjeb564|(]{<355|/~~3fpABtfcffiiilopwwtiffiptoic93<//(~)~/)>-****$#@++++++#$$%%%%%%&&%$$##@@@@++++++++++++#####&%$%==;;",
+";;===**->>>-***-,/|59599c96|458ciloooqmpoqqpsttttttttttpppooliiiffiiifcc955333333559fiilic909cloptwtwwwwtpppptwwABGHKMNOPQQQRQQQPOONMICzqlkfa85434_~{~<355|~~/5iwAwicfltwpolipwwtlffiptpof5|/~/~,,)~)>*&**%##@+++.+@#$$%%%%%%&&%$##@@@@+++++++++++@@@#$$&%&&=;;;",
+";;;===**=->>-***-,~|5599cfc556a8flpttpmooqqpppputttttttpppooomiffccfffiic995553335599cflolifcdiotwABEEEAwwtwwwAABEHIMMOPPQQQRRRQQOONMICAwqkbb67}<1|</~~/|33|//<9lttoffoyBAwtpopwywplilptwpi9<~~~),')~,-*&=*%#@+++..+#$$$%%%*%***%$###@@@++++++++++@@###$&%&*=;;;",
+";;;;==**=*->>--*-;,/|599cfid9a66cipwwwppopqqprpuuttttpttpppoollifcccccffiiffc955755999cfloppollotyBHIKIEAywwyAEBHIIIMNOPPQQQRRRQQPOONLEztqjhb64[_/(/</~~/|53|//|9iopifitABEEBwtwyywtolopwwti5<~~),,,)),**&=%$#@++..+@#$$$%%%%&&*%%###@##+++++++++@@@###$&%*;=;;;",
+";;;;==***==->>>-*;;,(|599cfifc66bfopwwtttuqmopppoppttptttppoooliiifcccfffiillfc99999cccfilppttpppwAEIIIHEAyyyAAEHHIKNNOOQQRRRRRRQQPOOMIBxqjhb62_[{{{~//~~/|53|<<|5cooiipyEIKIHAywywwtpllpttof3/~)),>,))>*%%*%#@++..+@#$$$$%***&**%$#@###@++.+++++@@@###&*=-;;;;;",
+";;;;;-=**&==->>>;;>>)/|55ccggf99ccimpwwywtpmmmponoppptpttpppoooiiiifffiiiiloolifcdf9ccffiiilpttttwwABEEEEEBAAyAEHHIKNNOOQQRRRRSSRQQPONMJAulkb861[({'!)~~~~<|33|<||5fiiilwBHHBAAAAAywwtplllopoc|/~/~,,'~)>*%%%&@++..++#$$#$%%*=&***%#@@##@@@+++++@@@####&%=-;';';",
+";;;;;-=***===->,';-;''(|59ccgffcfehklptywtppopmmnnoooppttpppppolliiiiiiilllooooliiiffcdcff9bfltwyyyyyAABBEEEECAEBHKKMNOOQQRRRRSSRRQPOONKHzrmf861[({!,,,)))~<3553|||5cfiltAAwppttyBAywwwplilptpf3|</{))~~)-*%%&$@++++@####$$%**=****&#@###@@++++@@@@##@#$%=*;''''",
+"';;;;;=;***===>',';-''!{|99cfefilifgjmqttwtppoomlnoopopppttppppoooooliiiiiiopppooolifc999d99ciotwAAywyAAAEEIIHEGBEIIIMNOPPQRRRSSSRQQOOOMKHAulia7}_({),,,,))~<3995|||39fopwyplillpwBAyyyypliowwtic53|//~/~,-&%&%#@++@@@####$%**=****%#@@##@@@+++@@@@##@#$%*;;''!!",
+"!'';;;=;;***===;',,',''{_26cifiopplkiimoppppololkinoopoppppttpppppoliifffffoptpopmlic97759a99cfiotyyyywwyABBEEHHEEHEHKMNOPPQQRRSSRRQQONMKIBysric0a|_~)',',,,)<3995|||3clptwtoiffiptwAyyAytllpwywpi953|<//~>*%&%%#@@@@@@##$$%*-*****&&####@@@@++@@@###@$%%*=;''^^",
+"^!'';;;;;****--;>,,!'''!{:29fiipptpojiiimmopooiiikiolooppppptttttpoliififfiottplifcc99079909099dioptwttttyAABEEIHHHEGKKNNOPQQRRRRRQQPONMKIEywpolfc93|(~))',),~<3999|||5fllopplc99foptwwyAytpopwwwtof99|<<<)-%$$%$#@@@++@##$$%*=-***=&$@##@@@@@@@@@####$%&*=;;'^^",
+"^^!,';;;;;;**----;,!{!!)^]16bflppwwplkifhfllmlliiggilloppppttwwwtpoiiiiiiilpwtlfc055999c05508888cfilpppptwAABEEIIKIIHKMMNOPQQQRRRRQPPOMLIIEAwtolffc953|<~))))){<59c93<|9fffillc559fioptwyAywwwwwwwwpic53||/,*%$$%$#@@++@##$$%==--=*=*$####@@@@@@@@####$%&*=;;'!]",
+"!^^!''';;;;;*----;>'{]{{^]_16cipptwtpokddccfililfffgfilmopttwwwttpoliiiiloottoic933375599009d909ccfflopttwyABEHHIKKMKKMMNOOPQQRRRRQQONMFGEEAwppigcdc9953</~~/~~/|5cc9||39c9cfif9539ciilptyAABBAywtttplfc5|<~,*&&%%%#+++@#$$%%&=---*&=%####@@@@@@@@####$$%*-;'>!!",
+"{!]^!'''';;;;;;;;;;'!~]:^(:228ioopptpplgcd09ciiiiffddfilmptwwwtttpolliilppptpic9553|433599ccccccccfcilptwyyAEHKIKKNNNMMNOOPPQRRRRRQQPONLEBAxtplfifcc99554|<</<//<|5cc93|39999fif53359fiilpwAEEEAywttppooi9|/)>%&%%%$@++@##$%%&*---*&=%$###@@@@@@@@@####$%&*=;;!!",
+"{!!^{{!!''';;;;;;;'',!{[::_}26biopppppolgd00a9fffiffddfilpttwwtttpooolopttttoic9554|}1|35dfcfffeffgilopwAEEEIMNOOOOPOOPOOPQQRQRRRRRQPONMHCAxtnied9999555543||||<</|5ccc533599cii93||59fffiotAEHEBAywtpppof3/~,-&%%%$#@+@##$%&&*;>--&&%%###@@@@@@@+@@####$%*=;;'!",
+"!{{!^^{!)''''';;'''''']^:11}26bbeiloooooifd0786ddgfffddiiopppptttppppopttttpofc95511<|13559cfilliloptwyBEKMNOPQQQQQRQQQQQQQQRRRSSRRQQPNMKECxsqib8967575555533333|<<|59fc53599ciof5|||5cfiffioyEEEEBywtpoli9</)>**%$$$#@@#$$&&**----=&%%$##@@@@++++@@@###$%&%=;;!",
+"!!{{{]^^!!!''''''''''!^^_162668abcfilllliic9776500dfifgillliopptttttpptppttplfc953|||3543559ilptttttwAAEIKNOPQQQQQQRRRRRRRQRRRRSSSRRQQOONIHBytpkb85633755555337553|<|3cc9559ccili93<|5cfili99itAEHIBAwtplic5|~,--%%$$$###$$&&**-;--=&%%&##@@@+++++++@@###$%&==;;",
+"'!!{{(^^^{!{{!)'''''^^^(_}2aaab888bffiiiiiic9725500cfiiiiifiiloppttwwwtppppoic9555333555559fiottwttwyBEHIKKNOPPPPOPPPPQQQQQQQRRRSSRRRQPONKIEAywplf9a4773334333335553||599559cfiiic3<<3ciilic59fowBEEAywtoic95<~,;*%$%%%%$$&$%%*----==%%%$#@@+++++++++@@#@#$%%=;;",
+";!!{{{({^^^^({{!!'!^^^^(_}}26cba8aa99cfjffffc9732357ciiiiifffiilpptwywtpptplf995555595999ffiiloptwwyAEHHEEEEIKMMMKMNOOPPQQQQQQRRSSRRQQQOONKHBAAwtoi995573||||33||3555359c95559fiif9|<3ciloif9559fpyBBAwtplc95|/~,>*%%***%&&$%%*=----=%%%$##++++++.++++@@#@#%&%=;",
+";;!!{{((({^^^[[[^^^{^{(_}}}28bb98aa868accffccc9743570ciifffffiiloppwwttttwpic953559999cfiiiffioptABBBBAywyyyAEHKKMKNOPPPQQRQQQRRSSRRQQQPONKKEAywytqlf9053<<_<<||||335359cc95359fiif9339ciolic54|39ltAAyytpi95|</~)>*%*->>*&%%***-->>==%%&#@++++....++++@##@#$&%=",
+"=;;!{{((_(((^^^^^[^_[(__}}2268ca698a6a6689cccfc976357ccccfffffiilptttpptwwpic95359cffiiifccciotwAAAywwwwtwyABEIMNOOPPQQQRRSSSRSSSSSSRRQQPOMMIBwwtttplc997|<<(//<<|||33359ffc5339ilif9559ciiif951<|9ityyywtpi93<//~)>**->>-*%%%***;>>;=%$$#++++.+.....+++@##@#$%=",
+"=;;'!{{(____(((__1111122}}}66866a6aa2}}}65999cc9d959999999cfffiilptpooptwwpic9559cfilifc99flpwyAywtppwyAAABEHIMNOPQQQQQQRSSSSSSSSSSSSSSRQPONKHAwpppoifd0554|_/(/~/<||33359fic535cilifc959cccfc9|<<|5fptywtplf93</~),>--;>>-****=*->>;=%#$#@++..+++....+++@#@@#$%",
+"%=;'!!{___}}__[___1122222266a22226662}[:[2355999cc99d95559ccffiioppollpttplifc9ccfiiic999ipwAytppppttyEHIIHEEEIKMOOPQQPQQRSSSSSSSSSSSSSSRQPONKHBwtpoifc9577553<<{//<||33|39iif959fiiffc99959cc93<</<3cottpplif93<~','>;-;>>>-;;***->>;%$#@@@...++++....++++@@#$&",
+"&%=;'!{___}}}}}}}}}2226a686a222222662}}:[:}225799cccd9955799cfilopplilpppliifffiillc535clwAAypllotwyyBEIIHEAAyBEKMNOPPPPQRRSSSSSSSSSSSSSRQQQPONKHEAyplifd5559553|<///<||||39iif999cfiiccc9559995|///<3clopoiiif9|~,>>>--;-->>>>*=*;>>;%$#@@+............+.++@@#$",
+"$&%=;'!(__}}}}2}}}}}}2268aa86622}22222}[:[[}}32399dff99555599cflppolilopliffffiopof5|3fpABBytooptyAAyAAyAABAAAEIMNOOPPPPPQQRSSSSSSSSRRRRRQQQQQQPPNKKEAwtlf95555953||<</|||||9flic99ciiffcc553555|<</<<|9iooliffc5<{,;>-->>>->,,>**->>;*$#@@@+..............+@@@#",
+"#$&=;>'!(}}}}2222222226866626662222}1}}}1::}}[}|300c9999955999fipolliiooiffffiiooi935cpAEAywtttwwyyytppptAEHIIMMNNNNNOPPPPQQRRSSSSSSRRQQQQQQQQQQQQPOOMIEypic53|33|33||<|3|||39ilfc9cfiiffc553553|<<<///|9iloifc995|~,>->>>>>>),,--->>-*&#@@+++..............+@+@",
+"@#$%=;'!^:}}22886666666666626662222}}}}:_:::__::|3795999c9999cfloliiilooiffifillf999coAEBwtwwwwwwwtoiiopAEKMNNNMKIIIKKNOOPPQQQRRRRRRRQQPPPPPPQQQQQQQPOOMIEwpic53|<<|33335955|39fifccfiliic93|333|<<//~~/|9iooi955993/),>,,'>,,),,--;>-*%#@@+++...............++@",
+"@@#$%=;']{_}}2866666666666}222222222}}::::<:}[::}|3335799999cciiiiifiioliiiiiiic559coAHEAttwwwttpliffotAHKMNNMMIHBEEEHKMNOPPPQQRRQQQQQPOONNNMNNOPPPPOOOOOMIEAwpi9|/<||3335993335cfccfiooli953|<|<//~~~~~/|9ioic535cc5<~)))),)!!)'>--;-=%#@+++.................++",
+"+@#$&*=;'^]_}}866666666666}}22222221}1[_::_:}}:_||11|439999cffiliiiffilliiilllf559ciwEHBwwwtttplfcciowBHIKKIHEHEBABAAEEIMNOPPQQQQQQQQQPNNMKKIHIKMMMKMKMOONNMKKIApc3<<<|||35555335cfccflopoic9|//~~~)))~//<39iif9335995|/~~{)){!)),>---*%$@++++.......... .. ...+",
+"++@#$&*;;'](_}266666666666}}222}22}}[:[::[[/}||:|}1<<||55999filliifffilifiloplc59fltAEAwtwtpptlc79itAHKHHEByyABABABAABEIKMOPPQQQQQQPPPONNMKIIHHHHIEBBABIMMMMNNNMEti93<///<<|333||5cfcfioppoic3/~)))))))/<<|39cfc93335995|<//({~{)),>;--%$#++++...... .  . .  ..+",
+"++@@#%*;;'!^(_}26666666666}}222}22}[::::]]]:<<||334_|||33559filliifcfiiifioppicciopAAyttptpttof50fpBIMKEEAwptwyyAACBABBHIKNOPQQQQPPOOOMMMKKIIHHEEHEAAwtwABBEIMNNMHyoc5|////<<||||59cfffloppoi93/!,,)),,)<<<<|59c953||5cc93|<</{~{)),'>-*$#++++......     . . ...",
+".+@@@$%*;;'^^(}}2666666662}}222}}2}[::^^]]]::::}363||||1|355cilliifffiiiilopiccipwAEytppppptpi99itBHKMKHAwpoppwwyAEEBEBEHHKNOPPQOOOONKKIIHEEBBCBAEBAAwttppptwBHKKIEwpi93|///<<|3359ffffiloppoi9|/))))),,)/(//<35995335cffc95|</{{{))',-*$$@+++..... .    .     .",
+"..+@@#$&*;;'^^_}}266666662}}222}22}[[::^^]::_<:<3331|311|3379iiliifffllilooofcclwBHEwppoloppiccitEHHKKHAwpoooutwyyECBEBEGCILMOOPOONNNKIHBByAwwwwwwwwwwwtpllllotAEHHBytoic5|<<<|||35fiiffiiopplf5|/~)))),>,)~~~/<|595559fiifc93</{{)))),-%$@@++....          .  .",
+"..++#@&%&=;',^{_}}26666a62}}222222}[[::^:::[<:::||1|}33|35359fiiifffioooppplfcitBHIBtpollpoid9kwEEEEEAwppoooptwwwwyABHEECCFIKNOPPONMKKIHBAxxtqpoolooooptpolliiiotABEEAywpoi93|<|||59iiliiiilllic5|<~))),>-',))))~<359999fllif93</~)''),>*%@@++...               ",
+" ..+@##&%=;''!^(_[}66666666226222a642}}}<<::_::}|1_<:|1|3557cfiiffffioopptplffoAHIHypollppi95fpEHBywtpolproppwywttuzEHIECCFFKNOOOONMHIIEBxxppmlhjffffgfloomlliffiotwAABAAwtpf53||350ciopifcfiiiic5|</~),>---,,),,)/|59555fioif93</~),),,-*#@++...               ",
+"....+###&%*;''^](_}26666666889886067222}}::::]]:}<(/:_<||3559fffccccioopptpiioyIKKEtoliotpf59lAIBytploloprpwyytpnquzEEHHEEFIKNOONNMIGEHEEyzsqmleebbc9909gfiiliiffiilopwABBAyplf9597559iolc99fiillf5|</~)>>-;->,,,,)~|55559fillf95_/!)),>>-$#++...             ..",
+" ....+#@#%=*;''^^_}}}6a6a99899889b99652|}1:_:]:<<_(//<_|||359fffcc99flopppliltEMMKApifipti95iwHIAtpopptwwwwAzwpnnquAEAEEJHIFKNNOMMMIHEEEAAAtqqlgeba87976809cgiifffiffilpwBEBAtplic95439cfc99cfioolc5|</~,>>>---,,,,)/|3559cfiolic5<{~),>--*$@+....              ",
+"  ...+@##&%=;;''^(_[26a688aa99cccfg99522|||<:<:||<__/__|<||59cfc9999floppoiioAKNMEwlfclto939oAIEwpppwBBBAABAwppnquwEBAABGKKKKLNMKIHHHHBBAAwtpooiica8774263779ccccfcffccfltAABAwtof9533|599ccciiopoi95|</),>>>>>',)),)/|399cfioooic5|<~,>--*%$@+++...            ",
+"  ..++@##$&%*;;'^^{[}}6689aaabbcfif9956333|||||4|||<|_<|<||79ccc9959flopoiilpEMNIApiffpti53fpAHEwppwEIIEBAytuprrtxAEACzCCKMMNMMKKICEHHBByAwwqroolfda573}24347759999cc989ciowyAAwplf957||359ciiloooic93||/),>>,>>>>,)))/<59cilooolic93<),>-**%$@++..             ",
+"  ..+@+@##$%=*;',^{_[26688a98999cif995532533}||||<|<1__|||359ccc9959flopoiiowHMIBtliflwwf90ltwBEAttAEEEAywtpqtttwyABAAAzBFLMNNKFFECBEEEAyywtupoooigca74}}1|14335355999999dgltwyAwpoif973359cffilooic9533<~!,>,,>-->,))~/|9cflllliiif9|/'>-*%%%#@+..             ",
+"  ...++#@##&%*;;,!](}}2aaa66809a9fic9966333}:1<|1:<___||||3599999559flopliotBIIBwoffipAtf9foptABAywwywttttptpttwuuAAEBCCGHKMOOMKIBCCCBEAAwwuupppplifc77}}211114|33369909999ciptyAywtoof95599999filif9533|</~,,,,>-->)///<39ciiiiifffc5<),>*%$$##@+..            ",
+"   ...++##$$&=-;'!^[_[266622aa86dcec9965334|1_<|}:<___|<||3399995559flopllpAEIEypifflwApcclooptyywtpojnoptttpspuuxyAEEGEIKMOOOONKCCBEBEBEAywwwtppoiie97322|1||1|||||7589999cfiotyAAAwtpic55555359ffc53||||<<~~),>>->)/<||359fiiffcccc9|<~,>%$#$###+...          ",
+"    ..+@@$%%=-;','^^(_}6662269989bb900077574|||||<|1__|<||1399995559fopplowBIIEwofcfowwlcflolloopligceiopptqttwxuAAEHIJIKMMOOOOOMIJEEEHEIHEAAAwwtpollc9722|1|11<||_<|2695099cfiopyABAytof953333|39c953||||||</),>>--,~/|35999cfcc9955553<~,-*%$#$$$#@@..        ",
+"   ..+@#$&&**=;-;>'!{[[26622a8888dd0076777734333341|<||<|14599995555flooiowEIIEwl99fpwti9fiiiififcc9cellopqqpzyzBBEEEHHKMMNOONOONMKKKKIKMMKIEEBAwtppplic96733|11<|_<<|||23350ccilpwyAAwpic53|33|||5553|<<<|||</),>->,)~<399999c99953||555|/,>*%$$$%%$@+.        ",
+" ..++@@###$&%=*-;;,!!([[226aa88d00d077424633333574||||||||4599955339flolipyEHHBti99fpwoc5cff999ccdccffijoomptAAABBEBCCILLMNOONNOOOOONMKKMMNMIEBAypppppolie0955|1|||||<<:<<|379dggilpwAAwpi933353|<|33||<//<||||/)>>>,)~<|59c99c99553||3595|/,>-%$####@+.        ",
+"....+++@@+##$%*=*;'!!([[286660dd000a666224233355531|3||3||3999975359flolipAEEBAoc59fpwoc59c03439cddchfiloqqpxwyBAEEGCEFFKNNNONOONOONKIHHIIMNKHAAypolloollfe9090334|||<<_<::|25ciiifiptyAytlc55995|<|||<<~~~<|33|/),>>,)/<|3599c995553|||555|/)-%$#@@@@+..     ..",
+".......+++@##$&*-;>'!([[286000ddbbca6622}}}43435311|||3|||3999995359flolltABAyti959itwl939c931409999cfiioqrpwwBEHEEHIKKMNOOOPOOONNNMHEAAABHKMKEBAwpoiliiifc999099953||<|<<|<}39fifffiptyAAyof9ccc9|</<</~))~/|33|/),,,)~<|||359955533|<<||33|/,*%$#@@@@@++++....",
+"    ....++@@##&%-;;'!{[[28a0a0dccceba60a6744444331||||||||3999995555flplltAAwtof539lwwi937905337675dfiimmopuxyEEIIKKMNNOOOPPPPONMMMMIHAyzyAEKMMKIEAtooilifc955709995533|||<|||59cc99cfipwAAAtlfcff5<~~//~),,)/|33|/~),,)/<||13675334||<<(//<|3<)-*%$$$$$$#@+..  ",
+"     ...++@@##&%&;;'!{[[26000abbchkgd00a64441114||||<||<||3599955335flployAytplc559oywi533553|1|246cilkjmmouxBEIIKKNNNNOOPPPPNMKIIIKKKEEBABEHMNNNMKEytppoiic9577790c99953|}}||35553755cfotyAAwoiiic|/~~{~,>>,,{<|||</~)!~/||466373|1|<<<//))<|33/)>-*%$$##@+.   ",
+"     ...+++@##$%&*;'^{[[260088bbggkkgd07744411355||<|||_<|3599995335flolpBEytoi955coAwf3|3|||<||279fiigikopxAEHIIHIKMMOOPPPONKIHCGEIIKIHHEEHIKMOOOONIBywttolfc909999cccc963||2|433||||359ipwABAwpoi9|{]~)'>,>>,~/|3||<//~/<|5632|}|1|<<|<<~)~<355|~>*%$#++++..  ",
+"     ....++@##$&&*;']{([28088bbkggkkgd07a46662553|||||<<_|3599995333clolwEEwpif535coAtc||31_<13769fffffjmpwAEBEBBEHIKNOOPPOONIFECGEHEIHIHEEEIIMOPPPPOMHEAwwtpliilifcccffcc86532||4|<_<<||3dotABBAtoic|~!)),,,,>,)/|33||</(_|5962|<333333||<~)))/|3|~>%$#@+..... ",
+".    ....++@##$&%*;;!{^[280b8ggkgggklifd98676265334||||_<|3599995333clllyIEwlfc5|3coyt9||3|</_4769fhbejmtwAyAAzzAEFIMNOOPOOONKKIHIIIEEEHHEEEIKNOQQQQQPONKEBAwtppttplifgffc999a5||||1_/(/<<|9ftAEBytoi9|/~))),,>--'/|3331|<||39c97|555553|<<~,>->)<||~>%$#@+.....",
+"........+++@##$&%==;!!([28abghggggmlligfd866533952||||1_||3599995333ciloyIEwlc9||3coyp93334</_|429cfjilpwAwywvzzDEHKMNPPPPPOONNNMMKIEHEIMKKKMMNOPQQQQQQPPONMIAywyywtpliifc999985|1||_(/<<|<15fpyAAwtpi9|/~~),,>-=;,/|35533559cgf953333||<//~,>-%*,~||/,*$#++....",
+".++.....+++@##$&%==;!!([280hhggglljmliffd9668a6952||||1|||35999953339ioowEEwic9||5cpyp93334|<<|769fillpxwwutwvxzDFIMNPPPPPOOONOONKIIHIMNOOOOONNNOPQQQQQQPPPPPNIHEBywtpollf99999553|1|_/_<|3|359ipwywtpic|/~~),>;-=-)<39c9c99cfffc72|<<<///~{)>;*%%-)/|<)-%#@+...",
+"..+++...+++@###&%*=;'!(:2a0ghhgllllmliffcd95607055|4|1||||3599c953339ioowBBtic9||5cpwo931|4555099filopttuqsrvxzDHILNPPPOOOONONOOKIIIKMNNOPPPONMKKMNOOOOPOPPQPPPOMKEBAtpoolif97565533|<<<<<|353|5citwwtpl93<//),>>>>,/|59ccccc9c99931</~~~~~~),>>-%%*>~<|/,*%#@+.",
+"+..++++++++@###&%*=;!!([280gghilllplmifdcd997868554|1|||||3599c953|39ioptAApfc5|39ftwo93||49filliiiottuommrtvxCFILMOPOOONOONOOONKKKNNNONOOOONMIEEEEEHHHIKMMOOPPPPONMIEwpppoic85555753|1<<<|5333|49iptwwtlc5|<~,,,>>>)~|359cc9999053|<_())!~~~),>>-*%%*,/||~>*$@+",
+"@+..+@##@+@####&%*;;!!(:2abkgjjjopqlmkfcd90870600541||||||35999953339ioopywoc95||5fpwoc53|4cioppoioptpmhmqrvxBEFKKNOOOONNOONONNMKMOPPOOOOONMKEAywwwwAAAABBEEHIKNONNOONIEywtoic9975355573|||33|33435cotwwtof9|/,>>>>->)~<359dcc999572_(/),',,!)),,>>-%$%-~<|<)-%#",
+"##@+@@#########&&*;;!!([28bknjjnrrrmlifcb90990850541||3|3|35999953|39foopwwi953||5fpwofc535copppoopwpmjmmrswzEHILKNOOOOOOOOOONMMNOPQPPPPONIHEAwwpppttAAAAAAABABEIIIKNNNMKEAtpiiif955559053|||||333339lpttoif5<)>>>>>-')/||7ccfcc99721<(~]!'>,')),,,>-%$$%>/||/>%",
+"-%$##@@@##$$$#$&&*;'!{[[26bknmjmrrrmllggc9009d09055533333|35999953335flopwti953<|5ftypic9|3clppootwpnkjmrpxzBHHLKNOOOOOOOOOOOMMNOPQPPPQPNKHBAAAwpooptyEHEEEEBBBBEHEEEHIKMMKEAtoolf995590953|||1437|||9ilpoli93/,>>>>;;,):<359iifcc964|</~)''>,',)),,>-*%$%-~|3|)",
+"~,*%$##@@#$%%$&%&;;'!{[[2abknlrmqrqmllkgc9089dddd055553333359ccc53335floptti553<<3ftytif9330lpplpwtlhghmrwyzFEILMNOOOOOOPOOOOMMOPQPPPQPOMIEAAABAwptttyEIKKKIIHHHIKKEBAAEHIKKIEytplf953335555||11273||35ciooif5|/)'>>';'']_|30fiigc95241<~!)',>;'',),,>--%$$*,/||",
+"|<~>*%%$$#$&%%=*=;;'!{[}20bkorqrqrrrlmifgc988cgfcd59555553559fff95559floptwl553/<3ftAwoif530lppotwpfggmmszzBFEIKNOOOOOOPPOOOONOPQQPPQQPOKHEABBEBAywwywAEKMMNMMKMNOONKEAAAyABHIEBwpic953||35553345993||35ciiif95|/)>;',,!]/|26bcfiff9631|</))',>;>,,,,,,>>=%$%-)/",
+"/||<~>-*%&&$%%*->;''!{[}60bkosrquusromliifc9cdggigc999955599ciiic9559foptwyo993/<3ftAytpi95cmoopwpihgemmtAzDEIIMNOPOOPPPPPPOOOOQQPPQQPNMIEEBBAEEEAywyyAEKNOPPPOOOPQQPNIBytpppwBEBytlf953|1|35555dfg9933359fifc95|/),,))]!(}269ccecfc9534|_(~!,>>>;>'>,,,,,>-**-,",
+">)<||/)>-=&%%=*;;''!^_[}a0bhutsuussuooolifd9dddfkigc99999599fiilic999fptwABpcc5||5iwAAAwofciooowtlhhgemqwzzBCHIMNPPPPPPPQPPOOOPQQPPQPNKHEABBAACEEAyyAAEKOPPPPPPOOOPQQQPMEypliiowABAtoic931||359ccfiic953339cfc953|/!))~]{([}0accbcc999053|<<~!',>>>--;''!),,>-**",
+";>)/|||(!'>-*=-;>'){]<}a6dkovtuuuusuroolifcccccdgiicc9995999filiic999fptwBEtic5||5iyBBBBwliopptwplehgjmqwyzDCHILOPPPPPPPQPPOOPQQPOOPOKHBEAzzwyAAyyABEHKNOOPPOONMMMNOQQQPNKBtlffiotyAwplf931||359dfiif9993||5ccc93||</~]^(_:}abcccb85090973|<//{!,,>>;;;-',,),,;;",
+"'',,~<1|</),'>>>,'!]_126adknvtxuuusqqqoiifgc900ddiifc9955559cfiif9959clptAEtic5||5iwByAByoopptwwolfegjqwwyzBEJIMOPPPPPPPQPPOPPQQPOONKHBBzwxptwxwwAEHKMNMMMMKIIHHIIIMNPPPPONKApiccfltyywoic73|359cgiliic953|35ccc5|||||:<_}}}6bbebc8a5269977||</{!,,,>-=*;->,)))'",
+"~~),,)/<|||(!)),'!!^_228bbknruuuuuuqpqpokgga90009iifc95555559cfff95359iptyBti95|<3ftytpppopppwwpolhhknuywzzDEJKMOPPPPPQPPPPOPQQPONMIHBBywuurpttutyEKNOMIIKIHEBBEEEEHMOPPPPOONIyoiccfltwwtlf055559dillifcc93|55ccc53333|1|21668bheca97424375541<<({),>>-==%*->,)!",
+"~~~~))~/<|3|<//~{{(]:226bhknvuvutqqqrmmlkfha80009cffc85535339cccc53339fotwBwi95</|cpwpliioolotpolihjmpwywyzDEIMNOOPPPPQPPPPOPQQPOMIHBEEzxuonpuupotAKOOMIKMIEBBBEEBABIOPQQPPOOOMEwpiccfowwwoic99559gioif99953|59cc9533537222a6dbbhba874111355553|<</~),--*=%%%;''",
+",{{(((__1||||||<__[[}2268ekoruuuuqqqomolkfd900099cccc955353359ccc53335cltAEwi93/~<9lpplillfiopoiiifjmpwwzyADEIMOOOOPPPPPPOPOQQQPNKIHEHBwurnnmuqmjpwHNNNMNNIBBEEEEEEBBIOPQQPPPOONMHyoffflpwwtlfc9990cilf555553359cfc955555669bddghbb8a7}}<<|45555||</~)>;=*=%&&=;",
+"->)~{(<|55||<|34||}|4268dbhnvuuttuqqqnlnkhdda0999ccc9995353359ccc93335citBHyi93/~<9iooooofcilifggeeknrtwwyyEEINOPOOPPPPPPPOPPQPOMKHEHEAxprnnmpmkiopAKNMMNMHAABHHHHEBABEKOPONOOOOOONHwoifiotwtoicc990ciid3|355335cffc909c99dchgggghb8877}2__<|35554|<((),--==&&&%",
+"*=>,)~/<|7|<<|14376786bbhhknquvtvvqqqqmmmkgd09b9cccc8995353359ccc953359itEHAi95/~<5floooicflifddfchkruqtwxzDEINOOOOOPPPOOPOPQQOOMIEHHHApprnkmqmhkjltEKKKKIByyAEHIHEAyyyBHKKIIMNOOOONMEtlffipttpifc9599fc9|<355559cfcfc9cccffkllkkeeb985321_<__|7555||_~)'>;==&&%",
+"*=>;','{/<<(_<|436509cffgjmnrvvtvwwtuqmmmkfdccbccccc9599553359ccc953359itEHAoc5<~/3fiopliiloicabbbhknqqptxzDILNNOOOOPPOOPOPPQPOONIIKKHtppnkkmqmkkjiotBHKKHBAyyAEHIEBAwwwAEEEBEHKMNNNONHwoicflppoifc955cfc3<<|3595cfiiiiffcfimppnmmffb953}}1_<(__|333|_</~)'-=&%%",
+"=-;>,,,,)~(/__|36709cfgiknnstssuwvvvttqmmmiifcbbcccc9999995599cffc9555citEHEpf5<//3cipttpttoiba8bbjmommpsuyDJIMNONNOPPOOOOOPQPOPNKMNNEtpqlkkkmqmkeihlpwEIIHEBBBEHIIEBAwwyBEAywyBHIKMNONIApf9dioplifc90cgf92_:|5999fillliiiiimopppmljfc954}}1<//(<_<|||1</~),;=**",
+";>>''',,'!{((<|589cfcfiloqttxtutvvwvwwuppoliifbcbccc9999cd999cfiiic999fltEKIwi9|<<5fipwABAtlcb88bcimlmprsuDDJIMMONNOOONONOOPQOOPNMMOMEvqqmkkkmmmmhefhiopyAAyyyAAEHIIEAwtwyAytpptwABEINNMIAof09cilliffc9cfc92||359ccilllliiiiloopppqiif9953}}<__/({(/(<_1<</~),--",
+"',,)!{!!!!!{/_125ddfeiimopswxxwwxyvtvwtttpplifcccbccccffgfc9ccillif959cipEKIwl93<<5cfitAEApifcbhhjomjmpsvtDBHKMMNNNNONNNNMNOPONOOMMNMEwtpmnkejmpmmhbheiioppolooopwBEBAwttttwtollooptwEIKKIypg009flollifcfic953|35ccfilloolommnqopppoiibb953}[:((({))))~_||<</))!",
+"/~)){~{{{)]{~:[[70cchilmopwyyyxyyywtswwtttpnifcc9cbcccccfddcccilolf9559ipEMIwi5|//309cfptpicc99bflpommquuxDEHKMMNNNOONNMMMNOOMMOONNMIAwwtolnijjqqmjbbbhehloiec9dciptwtttpppwwtoiiiiiotwBIIEypi959foppoiiilic95|||59cfioopoomnqqroppqolec9553}::(({{),,,'{_||</((",
+"<(/_/_((/{([[[:13669fhloptwyyyyAAAywsvwtttpolieeccbbc999dcdcccfiloic999ioEMIAl5<~~|95559dc89898ccnoonmrsuDDHHKMMNNNONMNMKKNNNKINPPNKEzwwtponljjnuuonebbehfiif9969fiopppoooopwytoiifcfilpwABBAtld99ipttpolllf9953|359cilppppqpuqmqmpqnlngd99531[[{!!',>;>''{<<11<",
+"1|44322}[[[[:_12|226bekopuwyyyyABBAyvwywtttrliffccccc8990999999fiifc99cioBMMEp9</~|753557957a8bbbmmimrsvtDEHIKMNNNNONNKMKKNNNKHKPPNKEwpttpnnllloutwplhjijejif98cfilpttpoliiipwwtoiiffffioptwAytofcfltwwwqolif9956269cfoppttppuuqrqopmollifc9741[:])''>;;->;'{_<|",
+"|35599652}[1142a6268abhiottwzyyyAABAyyAywwwpolifeccfcc990509999cffc9559ciyKMIwc|</|55599995688bbjlomknvuxDBGIKMNNNNONNKMIKKNOKHIOONMEtpppoinlnnpttwttponihflliiliiiloppoiiffiptwtoliif9cfiimtyAwpliipwyytpolifcc98259jilotttpuuuqmnmnmnlniieb53_[])'''-;;-->>,~<",
+"~|49cccdd0755766aa8abhhjmpuxxxxwyAAAAABBAAywpoiifffffcc90999999ccfc93335ftHMIwc3|<|9959fgb968bbcioomkoruyDGGIKMNNNNNMMKKIIKNOKCEMOONHtoioonilnoptuuptttpollpttpoffccfiolfcccfiotwtpooic99cffmtyAwtpoppwAytpooifcccc9cfjioptwtuuuqqqnnmmjiliifc0|[:!'';;------->,",
+"'!_49ciifdefc898abbbbgehmptxwxxxxyAAAABEEBBAwpolieffiffcc909999cffc95335coBKIyf|</_5550dgccb9bbelolmosvtyBEHIKMNNNONMKKIIEINOMBBINONHpjkloliinonmmmqrtwwwttwyytlc9909cfif9999ciptttppoic9999flpwyAAwtppwwyuopoifciifccfloptwzxyuuqqnonkjjiliifc5}:(!'';;*-=-==--",
+";'!/20filiiiiffcffcegjemqrutuuuuuwwyyzAEEEEEAwpliifffffcc99c9ccfiifc9555clAKIAi3//_33||5b9c9ffejmppmpsvwABGIKKMNOOOMMILIHBHMNMBwAHMKApjjloliionikkmmjoopppwtttpic97755cffc99999flptppolifcc9dfipyBEEytppwwxtoomiioolecfilqpwAyAwuuuqnokmjejfiffc52[{!',;;**-**-;",
+";'!^[|9giioollolinikjjmnpususuuvuuwwywyAAAAAAwtplliiiifgd9cc99cciifc9555clAKKBo5|<<73||36988bcikmpqtptuAAEEIKKNOOOOMMJKFEzGKMKEwtABBwpjiioolnlojkkkkkjijiloolliig973359fiifcc959ciopooollifc9cflwAEEBwtttwyttopoooppoiijloptAABAwuuuunnmjjhjcchd972}{~'';;;;;-;;",
+";''^(16acilppppooqoolqqppsuuuuussuwwwywyAAyAAwttpolllliifcccccffiiic9555clAKKEp9|||5553599899bikouptwxwDEEIKKMOOOONMMJLHFzAHKKHyttwtpolgfioonlpqmmkkhhbhcfgcccfiif95359iooifff9959ippolllolfccclptyABAAwtttwttpppopollmmloptyABAywuuuoommjehfc999573}/{!'';;==;;",
+";'^^_22abchilrtttpppuuwtwwwxuuuuuuxwxwxwyyyyywtpplllllliififffffilifc555clAMMIwc3|15990ccdcecjimppputuABHEIKMNNOOONNMJHFHzAAKMMEtoppppoieekllloptpqmmjh8ab07659foic059fippliffc999fopoiiiloofdfioptwyBEBytppwttpppoomppmmopwwyBBAyuuuuprmjjhe988857321_/)'';;;;;",
+";!!{_268aehfkmquwwwwxwwAyzzwxxxuuuutuwwwwyywywtpoliiillliiiifffiillic999ciyKNKyf3319cfgffiefhjorptwwwxABEHIKNNOOOOONMJHFFzyyHKNKApilopoibbeiljnottwtqnjeh95}}||9iic559fiillifc99559iooiffiloliilloptwEHHBwpppttupppoqqpppppwwwBBBAyuuurpmmjeee98aa3342||({!,';';",
+"!!!{}}28bggkknopswzzAAyAAzAyxxxuuuuquuuutwwwwwtpoliiiiiiififffffiiif95559fpHMKAi5339ciiiiifefkopwtwyzABEGIKMNNNOOOONMKHHECywAINOIynilrojhhheilnjmpwwwtplif7}<:<|9fc559cffilifc995559illfcfiloppoloptAEEEEAwutttttpppptttpruwwAAEBBAyuuuppmmihffaa6a|1|[|}[_{!'''",
+"^!{_}}88gjkjjnqqruuyABBBCCzAxwuuuuqqquuqquutwwtpoliiiiiigfffcfccfiif953359lBMKAi3|15diokifchekppwwwyyBEHIKKNNNOOPOONMKHHECAwxEMPOIwollolifhbeinjmmrsttwtpl82_(]_|09555999ciliicc9955ciolifcflpwpooptABEEEBAwtpttuwwttttttuuwxAAEEBBAuuuurrmmjhff8622|1<__:}}:[^^",
+"___}}28bgjmmmmqmttttyAAAEBAAzwxttuuqqqqqquuutttpoiifffigffffccc9cfff95||39iAKIyi3||39iliiefhgkrttwyAADEHIKNNOOOPPOONMKHHEGBwuAIOQPKypololifeehoommoprotttoc6__(_<455735335cillicc9959flppicciptwpoptyABBBBAAwtpttwxxwttxwuxwxAABEEBAAuuuurrmmiffb86222|1__[:[:[[",
+"436268abgmmmmpspppwwwxzABzAAywwwtttpqqqqqruuuttpoiifffiigfgfcccc9cfc953|39iwIIyi5||49gfkgcbbgjotwwyABDGHIKNNOOOPPOONNKHHECByuxAKOQPMBtoooolijinpqmnkjiilllf93|:_<159533|||5cillifc959ciptoifilpttpptwyBEEBBAAwttwwwwwwwwutxxAAACCEEBAAuuuprrmmhhbc8a2222____<1||",
+"a889cbhghmsqrprvttuxxxyDAyxzyxxwtttuqqppqqptuttpojifffiiiiffffccccff953||9itEIAl53479cgfcbabgiqttwyABEHKKKNNOOOPPPOONKIFECEyqqpyHNPPNHwpppproopuutmkjfbefdcd531|3339953|<<|5ciiifcc99ciptpiiiliottttwyAEEEEEEAywwywywwywttuxAAAEBBEEAAAuuuponmkjbcbbaa2}}}}__114",
+"2a89ehkkjmpxvtvvtuvuyDADAwuutuuuuttpppquppputtttpoliiikkliiiifffffffc933|5fpBIBp95509ccfdcahjjpttwxABHHIIKNNOOOPPPONNMIFGEEAuqnqtAKNOOMHBywtptttwwumjhaad099953353359953<<<|3cfffcccccipttpppoikopwwwwAEEBBEHEBAAyAByyyyxuuAAAEEECCEEAAAxuuurokkeebaa86222}}}}}2",
+"228bhimoqquvxxxxuwxyDDDDyxtuuqqqqqqqpppttqptuwwwtpoliiillliiifffccffc93||5coAEBtc579ccfbbhhkjptywwzBEHGIIKNNNOOPPOONNMKFHCEBwuomlotAHIKMKKHBywttutuoehaa5657555505555955|_<<|5ccccccccipwyyywoliiotyyAAEEEEEIHEEBBABEEAAAAAABBEEEGCBEEAAAxuuuonkkkeha8882222}}}}",
+"6aa8bknqqxAzzAzDDDDDDAADvwuqqqqqqmmmqpqtttptwwwwwpoliiiilliiiffccccfc95||39lwBEtc7379c900bhkjqtyzyAEEIHKKKNNNOOOPONMKKKFECBBywsqlilopwAEIKKIHEAzwtpoifa642a73555995345955|__<35ccc9999fowAEEAtollmpwzAABBBBEHIHHEEEBEEEEEBAABHHHHHGGEEEAAAAuuuonnkkkeha8a88662}6",
+"668agjjquwAzFEFBDDAAACAywwuqqqqqnnmmmomqpppptwwwwtpolliiliiiifffcccfc954139iwBEwf7509db8bagjmqwwwxEFEIIMKMNOOOOOOONKKKIHFzAyxxtpoollllopwyABEHHEBywpnfa73}4333355553355553<__|59cc9555cipyEHEwpoolptABBAEEEEHIIIIHEHEEEEEEEBBHHHHHJGGEEEEAAAuuuqnnnkkkebb8a66a66",
+"88ddeemmsvwzFHHEEHGGCCDywvtqqqqqmmnnmkkkmolopttwywpolliillliliifccccfc54|39ipAEyl550ddb8bbgjnpwywzDEEIIMMNOOOOOOOONKLKIHDzvwwxtqqollliillooptwACEEAywoi932||143555553559531<_|39cc95559cipAIHAwtppttAEEEEHHHHKKKKKIIIIEEEEEEHHHHIIHJGEEEEEAAyyuuqqnnljgggbbbb888",
+"dddeemhrrvxzEGIIJIHEECBAywvuqqmmmmhkkkkgkkkkmptwwwtpolllllollkiffcccfc95|35fpwBAo968cfcbbhgjmtwyxyAEEHIMMNOOOOONOOMKKIIFFzvvtqpmmoinlilllliinlqutwAAAwpld6||}|||33599559953<__159cc95599ciwEHBAwtptyAEHIKKKIIKKMKKKIIIIIIIIHHEHHIIIIHGEEEEEByyyyqqqqqjjjhggddddd",
+"eeemmmrrsxxDDJJILKIIHEEAAywtqqmmhmkkkggggkkgiopttwtppolloooolliiffccff95345cowBApc70ffhfekjmmtAyxyBEEHHKKMOOOOONNOMKHIHFFzzxtqnlmijiiiiilllijmmjnloppttplf93|<|||359c999995||__|5cfc99909ipBBAAAwwwyBEHIKMMKMKKKKKKKIIIIIIHHEEEHIIIKKIHGGGEBBCCywwwqqqqmmjheehee",
+"mmmmmrrvvxDDEJIKKIKIIEGAAAvvqrmmhkkkgggggggggiopptppoollooooolliiffcffc9335cotAAtf9ciffejjmmmtAzxAEEEHHKKMNOOOMMNMMIHFHFFCzytqqjgeebbceffiinnnjihhfifillooif53|<||55cffcfc94||<|49cfffc99foyAwAyywwAABEHIKMKKKKKIKIKKIIIIIHEEEGEHJIKKKKIHEGGGCAAAxwuttmmmmmmmmmm",
+"mmmsrrvvxzABJHKKKKKIIECBAywwtpqmmkkkgggdggggfilppppoomlllooooolliifffff9735cotABwicciiiiillmttAzyDFHEHHKKMNOOOMMMMMIFFEFEAzytqmjggb8889abbhijmifgef9b880ciiiic5|||359ffiiif53||||5cfiifccfowytwyywwAADEEHKKKKKKKIIIIIIIHHHHHEGGEGHKKKMKKKIHGGCCCAAAyvsuusssmmmmm",
+"ssssvvvxzDDEJIKMNMKIHHCCyvvwsuprmmlkggggdddfffloppppolkillopopoliffffiid055cotAEwoffiiijmnrqtyzAADEHHIJKKMMNOMMMKMKIFEFEECzyssmjggbba8888bhfkeebbbaaa854239ciiic53||59cilolc53||170ciifdciowwwtwywyyAAEEHKKKKKKKIIKIIIIHHHIIJGGGGHIKKMMMKKFKHEECCzzzzvvvvsssssss",
+"vvvvvvxzDFEIJKMMNMKIHEAzzwvtsppppoliifgddddfffjooppplmjklmoppooliigfffic955cotAEypiflolimnqqtAzzABEHKIHKKMMOONMKKMMKFDACCCzwvsmeedgbbb88bbbghebba68a6a4|}||35cfiic7|135ciopoc5|1||5cilidciowywttyAAyAABEHKKKMMMMKKIKKIIHHHIIIHEEHIKKMMMMKLKKIIIIEBBzzzzzwxwvvvvv",
+"vvvzzxzDFHIJKMMNNMMIHEBzzxtsspppppolkiffcddfggilopppomjmlmpppppolificfic9559otyEBtlglpomnmmsuACzDDFIKKIIKKMONNMILKKKHAzzCCzzvsmmeggbbbbeeehkeebaa66aaa1[}<<}|35cilf9|||5cipwpc5|1339fllifiowwtttwABBBAAEEIKKKMMNNKKIKKIHHHHIIIJHHIKKMMNMMMMMKKKKIFFEECzzzzzzzzvv",
+"zzzzzDDFHHJJMMMNNMMKHEEzzwwsrrprppoliiifcccgiiilopppolmimoopppppolfffiigd08bipyEEwojoppmmqqsyACzEEEIMKJIKKMNNMKJHIMKHCzzzzzzytmmjjggbehehkkkjehca866a31:}<<_<<<39fii93||5coyAo933355cllliiowwwttwABEBBEGEHHIKMOONMKHIIIKIIIIKKIIIKKKMMMOOONNMMKKKFFHEFDDEFCCzzzz",
+"FDDDDFFHHLIMMMNMMMMKHEEzzzussrrrponllgfffccgllijoopppomkmopppppppliiffifc86aipyBEyplotppoqutABCBEFFIMKIIKKMMNMJJHIKKHCzzvvyzAttqqjgkkkkkkkmnnjjifb98a73}1<(((_/<|79ffc9335fpAwl93350dioollpwywtwyABEEBBEEEHJKNOONMKIIIKMMKKKKKKMKKKMLMMOOONNNNNMMMIIHFFEFFFFFDDF",
+"FFFFFHHLLLMMMNMKKIKIHHEAzztsssrnooolijifcccdiiiilopppommoqpptpppooiiggffca9dfpwABApljpqmqmutzBCEEEHIMMKKMMMNMMJIHFKKIGzwxwvvvvuqqjjkkmmmmqqoonollijfcd76|<:_(~/<<<359fc9559itAwi0559dilpoopyAwxtwyBEEEBCCEEGIMNNNKKIIIIKMMMMMMMMKKKMLMOOOOOONNNMMLMLHHHHFIIIIFFF",
+"IHHHHKLLLMMNMMMKKIIIHHEBzzxtssroonoliifecc0dfgfiiooptpomoopptptppooiikkig99cfpwAEAwnlqpoqqpwzCADFFHIMMKKMMMMMKJEFEHIJEAyvvwvvvssmqjnmmptttwtpppliiififc953||<///(/_<35cfc99fowAti970dfiopptyAAywwAAEIHEGEGEGIIKKMMKKIIIKMMMMMMMMMKMMMMNOOPPOOOOOOMMLLLHHIIILKLHI",
+"LLLLLLKMNMNNMMMKKIIIHHEBAzxsssrponooijfc9900dffdfiopppoooppptwwtpponkiiigcdbjrwAEBwpnqpumprtzzADEFEKKKIIKKMMMJJEEEEIIEBzvvvvvvstqurrtwwwyttponfebcc0dd9c99053|<<//(<<|9cfc99fpyAti99dgilptwABAAyyABEIIKHCGHHHJHIIKIIIIIIMNNNMMNNNMMMMMNOOPPPOOOOOOLMMLLKKLLLLLLL",
+"MLLLMMNNMNNNMMMKKIIIHHEBCxxxtsrroooliigc90000cdddjlopppolqpuwwwttpollilllhebeowAEEypmpxuursuAADDDFEIKMIIKKLMKJIDDBCEHHEBzAvvyAAyuwywwwwwtqlief866643||233755553|<////<|5cifccitBBticciiipwAEEAAABBEHIKKIIIIHEGEEHIIHIIIFKMNNNNNNNMMMMNNNOPOPPPOOONNMLLLLLMLLLNNM",
+"ONNNNNNONNNMMMLIIIHHGHECCAxxupprrnlnigcc0008999ddciloppmlpppwwwwttpollmmlhebeowBEEAuopxuurvxzBDDEEGJKKKKKKKIJIEDDACEEHHEECAACBEBEABAwtsppmiba86222}1_[[(]__||3553|//~/<|5ciifflyEBpifiiiowAEEBAEEEHIKMMKKKIGGCCGEJJIIIIKKMNNNNNNNNMMMNNNOOOPPQPOOONNONMLMMLMNNNO",
+"OOOOOOONOONNMKKKIIHHGEEBBAxxpsprnnliigcc0070999ddcfilooomoqpwwywwtppmlmllihhjpwAEEEuruuwtwtxAEBDEEIIKMKKLKKIIJFDDAzAEEHHEBEEEHIIHBAyxxpomkebba6222}__^^{{{{((<|333|</~(_|39iiiipyBAtllilotAEEEEEIIIKKMMMMMIHCCECGGIKKKKKKKMNNNNNNNNMNNNNOOPPQPPPOONNNOOOOOOONNOO",
+"POOOOOOOONNMMKKKIIHHGEEBByxxsrronliigfcdd0009099d0cilloolpqpwwyyywppppnoolijjowBEHEyuuwyzvwvCFFDEIIIKMKKMKHIIEEEBzAACEHEEEHIIIIKEEyxxuunkeecb62221}_^^({{!!)))/(||3||/~~/<3cilllpABAtploppyEEHEHIMNNMKMNNMJHECCCCGIKKKKKKKMNNNNNNNNONNNNOOPPQPPPPOONNNOOOOOOOOOP",
+"PPPPPPPOONNMMKKKIIEECzzzzxxssrponljgfgddd0899989d0ciiloomoqptwyyywtppnppppnijnwBHHHAwuAAzwzAFHEEEJIIKMMMMMHIEEDDzxzzAEEEEEHKIIIHHBAxxuungbbbea2221::^^{{{!!,))){~/<|33<///<3ciloowBEAwopptyBIIIHIMNNNMMNNMIEEECCCGKKKKKKKKMNOOONNNOONNMOOOOPQPPPPPOOONNOOOOOOOPP",
+"QPPPPPPOONNMMKKIGGCCCzzzzxxpprronlggfdddd0999660c09filoomoppwwyAAwutpmnqppnjjosBEHHEwwABzzzAEFHGJJKKKMMMMIJIHDDDzxzyzBEEEEHIIHEEEAAAxxplgb8ba62211::^^{!!!!)))))))~/|33|<//<39ioptAHHAtptwyBIKKKKNNNNNNNNKIHGGBCCHIKKKLKLKMMNOOOOOOOONNONOOPPPPPPPOOOOOOOOOOPPPP",
+"RQQQQPPOONMMKIGGGEEDDyywtttprrnlliggddddd0885560dd9dfilpoopptwyAyyuuqrnoqpnnnnuAEHIExwyECzzCHHHJIIKKKNNNLJJEFEDBzxzyAAAEHEEHEEEEEBywuuokgb886222_1:^^{{!!!,,,,))))))~<||||_<|3ciotAHKHytptyBIKMMNNNNONNMMKIHGGBCGIIJIKKKKMMMMNOOOOOOOOOONNOOPPPPOPPPPOOOOOPPPPPQ",
+"RQQQQPOONNMMJJGGDADDyvvsssrrrooniigdddddd0665566c989filopmpptwyABywuuprppprnmmuAEIHEAwABBzzCHFHJJJLLMOONMJJHEDBzxzzAAAABBBAEBBACBBwwuungb8a822221_(^^{!!!!,)''')))))))/<|||<<|3cipwEKKEAwwyBHKMNNMNNNNNMIIIIHEGCCHHGIJILLMMMMNOOOOOOOPOOOONOOOPOOOPPPPPOOPPPPPQR",
+"RQQQQPONNMMJJJEBDDyvvvssrrrrnolkkigddddd00566255cd99cilopopptwzABzwwuuuuuuuqnmtAEHIHAzABEAzEEHEJJJKMMNONKJIEFDzxxzyABBBAAABCAAzACzzwqqjgb88262211__^^{!!!,,'',))))),)))~/||||||5clpyHKKEAwyAEIMNONNNNNNIIIIIIGGBGEEEGHJLKMMMMNNOOOOOOPOOOOONOOOOOOOPPPPPPPPPPQQR",
+"RQQQPPONMMJJEEDDDyxwtqqqmmmllmkkkigddd09007672600d979floppputwxBBCwwwuquuuuqrrsAEHKIEAzBEEAEHEEIJKMMMNONLJEFDBzxzxvzABBCBCAAAAzzzAwxqiggb88622211_^^{{!'!,',,,)))))!,),)~/<||||39fltAIKIEAAABHMOOOONNNKIIIIIIHECGEGCGJJIKMMNNNNOOOOOPPPPOOONNOOOOOOOPPPPPPPQQQQR",
+"RQQQPONMLJJEBDDAxuvuuqmmmmkkkkgggggddd089007666599809fioptpptwxBBAzwwttquuturrxAEKKIHAABEEEEFFGJJMMLMNONKIEDBzzzvvzAAABECCAAzyzzzAwqqjgb8a8622}___^^)!!',,,,,,)))))))))))~/|34||59ipwEIIIEBBEEKOOOOONNKIIIHHIIHEGEGGGGHIIKKMNNNNOOPPPPPOONONNOOOOOOOPPPPPQQQQQQR",
+"RQQPPNMMJIFEDDzxuuvrqrmhhjkggghhggfgdd9a9086775559090cioptpptwyCCAzzwttttwutrutABIKKHBABEGEEHFEJJMMMMNONKIFFDAzzyyAAAAAzAAvyxyyzAAwqjhgc8a2222_|__^({{!!)',,,,,)))))),))))~/|33|35citAHIHEEEEEINOOOOOKKKIHEEHIHHEGEGGJGIKKKKMNNNNNOPPPPPOONNNOOOOOOOOPOPPPQQQQQR",
+"RQPPONMKJJEDDxuuvvrvqqmhkkkhhhghhhhhd08a89967767880909inptpptxyCCCAAzztttwwxuuxzEHKKHCACEHEEEEEJJMMMNNOOMIHFFAzzzAzztttutvvvvyvAAummjgbb8822}21|}|}</_/~/{~~))',))))))!!))~{/|35337fowEHIHEEEEIMNOOOMKKKIHGGGHIIHEEGJGHIKKKKMMNNNNOPPPPPOONMNNOOOOOOOPOOPPPQQQQR",
+"QQPPOMMJJEDDzvuvvsvmnkjhhfcccdd09a0aaaa0a8905775895900flpptpuxyCBCAzzzzxxzzxxuuCEIKKICzCGHEHEEEJJMMNNNOOMKHEFAzzzyyutttttttvvyzAztmmjgb882222333322|1<<<</<///~~~~~)))!!!{~~/<|59779ipAEHIIIHIIMNNOOMKKIIIHEEEIKHHEJHHJIKKMKKKKMMMNOPPPPOONMMNNOOOOOOOOOOPPPPPPQ",
+"PPPOOMJJEDDDuvsvsnolljjhd00cbaa00a99058a7a895236905600cjpttttxyACBAzAzzxxzzzxzyAJIKMIGCCCHIIEEEIJMMMNNOONMHFFBzzzvvsssttttttxzAzwtmhggb886668095321|_(~{~~~/(////</(~~~)!~~~~(|39999coyEHKKKKIIKKMNMKKKIIHHEGGGKKHEHHHIKKMMMKKKMMMMNOPPPOONMMMMOOOOOOONNNOOPPPPP",
+"PPPOLMJJEDDxvvsvnnnggggdd000777777777a6aa6659656586700djptwwwxwAzCAEzzzzxzzzzzzBHIKMKGCCEGIIHEEEJKMMOOOONMHFEEAzyvvuustutuwwwwwwxqqjgb8868a99053}}/]{{),,',!))~(/<<<</~~~~~((<<|7dcccltAEIMMMKKKKKKMKKKIEEGGGECHKIIJIIIKKKMKMKKKMMMMOPPOOOONMMMNOOOONNMNNNOOOPPP",
+"OPPOLKJEDDzvussnnnkggggdd0007777777774657a3599559556a0ahotwwxxzAzACEBBzzxxBAAAACHKKMKGCACEIIHFFEJKMMOOOOOMIHHGAzvvwstssttwwwwwwwwqjggbbc9ccc954|[:{!,,,>>;;>>,,)~~/<<<<</(((<<|139cfgltyEEIKKKKKKHIKKKKHECGEHGEHIIIJJIIIFIKMKKKKMMLMNOPOOOONMMMMNOOOONMMMMNNOOOO",
+"OOONLIJEDDwvsvnnhkkggb88aaa222222222274132259999953700adoswywxzzzAAAEBAAAACBABCCHKMMKHCzCGIIHEFGJIMMOOOOONMIHEzzwwytsuuttwwwwwwtqmjghbfbccc05||<[{)!,>;>;;->->>,,)~/<|||||<<<11375cfiiowABHIKKMKIHHKKIHHECGEHGEHIIKIKIIIFIKKMMKKMLKKMOOOOOOMKKIIJKMMMKKMKNNNNNNO",
+"ONNNMIJEDzxvvnnnhggbbbaa7744411111112}411423599cc52200adiptwywzAzzzAEEBAABCBECCCGMMMMJCzCEEHEBFGIIMNNOOOONMKIEAzwwwttstttxwwwwttmhgghbiec8833|_[^{)!',>>;>>>>>>>,!!~/<|||33111|3779cioopwAEIKMMIHHIIIHHHEGEGGGGHHIKKKIIIFIIIKKKIKLLKKMNNNNNNMKKIJIKLMLLLLLLLMMNO",
+"LMNNLIEEDxxvvnnkhgbbb0a7774441}[[[}111}11134459cc5220dadjpwwzwywzzAAzEBBAAEEECCCHMNNMIGBBEEEEDFGIJMMNNOOONMKFFzxzvwvssssuwwwwtummegbcfb906|1_(^^^!!',;>;;>->->>>,'!~~/_||3373||376acglpttzEIKMKIIHHHGEEHHHGGCCHHIIKKMKIFFHFIFKKKIIKKKKMNNNNNMMKKIJJKMMLKLLLLLLLL",
+"LLLLLJEEDvuvrnkggaaba0aa222}}}}[[:}}[1_:1112239995345badiowwyzwwwzAAzBBEEEEHGGCGIMNNMKHCCGBEDDFEIJMMNNOOONMIFDzxzxwxsssstxwwussmedgebe8622_(((]]{'''>;>;-*-=---->>,))~/__1137337aa9dilptwzAHKKKKIHEEGEGHIHEECCHHIKIKMMKIHHHFFFKIHIIIIIKMMKKMKKIHHEEHIIIIHHHHLLLL",
+"ILLLLHDDzvvvrnghbab00a6a6}}[[[[[[::[[_1_:11211|441247adhhmtwyzwwwvzzAzBBEEEHHGEIIMNNMKIFCCEEEDEEIIKMMMNOOOMLHFDzzwwxssstwwwtsummegecba62}__({^^^'''>;--=**======->',)){(__<|4508600chkptyACEKKKKIECCEECHIIHEEEHHKKIKLMMKFHFFFFFHHHFFIIIKMKKLKKIFFFDFFHFHHFEFHHHI",
+"FFHHHHDDwvvvrkghba0066622}}[[[::[::[:[[__[11|1|111135a0henpwyxwwxwwzzzBBEEHJHHIFKMNONMIHFHEEDDDEEIIMMMNNOOMKHFDzxzvvvsstwwwtmmmeggccaa2}_({{!!^^'';-=*=***&=====->>,,!){_<_|4609ddhbflowyAzEHIKKIECCCBzBHIHEEGHHIKKKKMMKFFFFFFHHFFFHHHHIKKIKKKHEEDBBBFFFFDDDFFFF",
+"FDFFEFDDxvvrnkgbb00662222}}[[]]^]^^][[::__[1111111112a0hhjrwywxuwwwwzzBBEEGJIKFFKMOONNKHEHFEFBFEEIIMKKNNOOMKHEDDxzxvvsstwwwsmmmeghfb62}[(^{!!!^!';;-=*&%%&&&=====->',!){(<1}2269cfhehjruABAEBHIKIECzAzzAEHHHHIIIIKKIKMMKFFHEEEBEFEEEEEEEIIIIIIIFBCAAzzAACCCzDDDF",
+"CCDDDDDzxvvrnkgbb00a22222:[[[]^]^^]^^^:^[__:|111111124abhjqwyyxuuxwwyyzBEEJIKKKFKNOOONKIHHHFEFFEHJKKKIKMMMKKJHFDzzzvvwtwwwttmmegkbb62}[(({{!!!!'';;-**&%%%&&&====->','){(_}}2770bhfinjnqyCBBEEHIIHCAzyAzBEEHIKKIIKKIKIKKIIHECCCCCBBFEEEEHIIEHHEBzzzxxzzzzzzzzzzz",
+"zzxxxzzxxvvrhkgb006a2222[[:[:]]]^]]]^^^]^:_[:1111114277bhjnuwwxuuuwwwzzBBEJIKMKKMNOOONKIHEFHEFFEHKKKKIKMMMMKIEDDzzzvvvtwwwummmjkicb2}[(({{!!!!!'';-=*&&%%&&&&====->','){(_}}7559bchlmrqszCECAAEHIIEAAzAAzAEHIKKKKKKHJIKKIHCCCCCCCzAzBEEEBEECCECCzzzzxxwzyyvzzzzz",
+"vvvxxvxxxvrrhkbb00a2222}}:::]]^^^!^]]^{]]^:_[111[[124770hhnptwvuuuutwzzBBEGIKMMMMNOPONMIHFFHFEEEHKKKKKLMMMMKIJEFDzzzvwywwusmmjgkeb6}[[({{!!!!!'';;==*&%%&%&%%%===--;,'){(_}270aabhjnpqtxzEECAzzEHHEEAAAzzzAGIKKKKKIJJHIIHGCCGGCCCzzzzCCCCCGCCCCCAzyxwvwwyvwvvvvv",
+"vvxvvvvvvvrrhhbba66222}}[[[:]]{!!!!!^]^{^]]__:_[_:}}47a0hhnpuwwtuuuwwzyzBEEJKMNMMOOOOOMKHFHFEFDHHKKKHHHKKKIHHEFEFBzzvxzwwtsmejkjb82}[(({!!!!!''';;==*&%%&$%$%%===*-;,'){(_}27aaabjhnqqtxAEEBBxzCEEHEBAzAyAzEIKKIIKIJGEHHEGCGEEEBAzzzzCCCCCCGCACBCzyzwwwvsttsssvv",
+"srrrrrvvvvrrhkb0a6222}[}[[[:{{{!!!''!!^^^^]]_[[[[:}}26aahhhnttwtpuuuttzzBEEJLMLMNOOPOOOKIIHEEFEHHKHIHHHIKIFEFEFDFFzzzvAAttmmhkjcb2}[[({!!!!!''';;;==%&%%$&&$$%&==*-;,'!{(<}478bbhjjmmqxxABBBBCzzBEEEEEAzyyzEHIIIIKIIHEFECCCEEEEEAAzzxzBGCzCBBzCBCAAutusstuusssss",
+"srrrrrrrrrrkhbb0a6222[::[:(^]{!!!''''!!^^{^^:_}[:}}}466ahhjiputspuuuttxzBAEGKMMMOOOPPOONIIIFEFEHHHFHHFFFFIFDBDDCAzzzvvAwtmmejkhc82:[({!!!!!'''';;;=%%&%$$$$$$%&==*-;,'!{(_}45abhhjmmruxzAEBBBCCzBEHIIHBzyAAEEHIIIKIIHEECCCCBEEEEBBzxwwzBBABBBCAAyywtttsspmmmmmmm",
+"mmmmmmmkkkkkhbb08622[[[[:((^{{!!''',''!!^^^^[_1__}}4a666hheipputrrruutxzBAEGIMMNOOPPPPONMIIHHHEHIHFFHEEHIIHEBAACCzvvvtwtmmjjkic92}[[({!!!!''>'';;==%&&$$$$&$&%%&=*-;,'){(_}47abhjmmruuyzAEEBCCAAAEHIIIEBAAACEEHIKKIIHFEAzzzCBBEEEBBzwwyBEBCBBByyyywwtqmmmmmmmmmm",
+"mmmmmmmkkkhkkbb08222}[[:::(^{!!!''','''!^^^^^:111}}47666bghhlptpppquuttxxAEGIMMNOOPPPPONMLIHHGHHHHFHEEFHIIEAzzCCBzvvtwwqmjjgkjb82[[({!!!!'''''';==&%&&$$$$&$$$%&=*-;,'){(_}47abhjmruuwxzABEBCAAADBEHIIHEBAABCGEEIKKKHFEzzzzzAyAAABBBywzAEBBBAAyyyywqqqmmmmmmmmmm",
+"eeeeeeeeebbbbba08222[[[[__^]^^!!''',,','!^]]^]11}}}47a68bhghjppqpnppustxxAEGHKMLNOPPPPPNMKLLHHHIHIHHFEEHHECzzzCBAzvsuwqmmhggeca2}[[({!!!!;''''';=*&%&&$$#$&$$$&%&*-;>',{(_}47abhjmuuwwzzCABBAAAAADEHIHHEEBzBECEEHIIKHEECzzzywyyAAyBBzzyAEEAAAAyyyuuqqqqmmejjjeee",
+"eeeeeeeeebbbbb006222[[[[__({^^!!';;;'>,''!^]^^:1}}}78aa68bhgjnpppopqqqtxxAEGGKMLMOOPPPPOMKLLLLLLIIHFEDEEECCzzzzAAtstqqqmeeghcba2[[({!!!!';>'';;;==&%&&$$$$$&&&%%&*-;>',{{([4aahhmnuuxzzACzBBAAAAAABHHEEEEBAACECGGJIIHEGzAAzwwwyAAwyywytwAAAAAAAuuuuuqqjjjjjjjgdd",
+"dddddddddddaaa00822}}[[[_({^^^^',';;;''''!^^^]_}}}3666a6a88hhoppqoopqqtxxAAGGKMNNOOPPPPOOMKLLKLKIIHFEDAACCCyAzzywusmqqmjhggfba2}[[({!!!';;;;;;;;=*&%&&$$$#$$&%&&&*-;>'!{{_[4aahemnuxzzzAzAAAAAADAABEEEEEEEBACCEGGGHHHHBCAzAuwwyyAyywwuutwAAAAAxuuuuunnljjggggddd",
+"8888888888888888822}}[[(_((^]]!,'';;;;',,!!^^([}}2a66666aa8ahlpppnnpqqppxAACHIMMNOOPPPPOONMKLLKKIIHFFCAzCCCAzAzywumqqjjjggebb82[[((!!!!';;;;;;;;=*&%&&$$##$$$%&&%*;;>'!{]_:78ahjmnuxzCzzzCAzyzAAABBDEEEEEEBBBBGGGGGGEEBCAzwuxwyAAAAywwtttyAAAwxwuuuoonnkgggdbbb8",
+"8888888866666666622}[[[[[(^^^{!''>;;;;;,,'!^^^[[}26a6666aa8abhopqnnppqssxxAEGIMMNOPPPPPPOONMLLKKIIHEFCzzBBCAAyAysmmqnjjghecb82}[[({!!!';;;;;;;;;=*&%$&$#$#$$$&&%%*;>>,!{([[788hjmnuxzCCzzBAAyyAABEBDBEFBEEEBCCGGGGGCABzzAAwxwwyAAAAyywuutwyAxwxxuuonllkkggbbbbb8",
+"6666666666666666662}[[:[({]^^!!',>;;;>''!!!{^^[:}46aa226aaaabhoppoorrqssxxACGHKMNOOPPQPPOONMMMKKIIFEFBzzCBBAyyAuqmmjnjggbebc82[[[({!!!';>;;;;;;;=&&%$&$####$$&$%**=>''!{([1468hjmvqwzzzzzCzAyyyABEBAABEEEEEEEHGGGGGBADxzAAyywywAAAAAyywtttwuwxwxuroolkkkebba6666",
+"66666a666666622}}}}}[[[[((]^^!{!'',''''']{{^[[[}25a66a6668abbeottppprqupxwACCGKMNNOPPQPPOONNMMKKKIFEEAzzABCyyywtqmjnngdbebcb22[[((!!!!;;>;;;;;;;=%&%%&#$####$%%%*=;-',!{([1488ejnvwwAzzzzCCAyyyyAEEAABEEEEEJGJHJGGGADDxxyAAyywyyBBBAAywwttqutxxwupnokkkeeb888666",
+"66666a22222222222}}2}}}__:^^{]]!!''',,''!]^^^^[}44a6666666a0cemtwtpppuuuxwAGCGKLNNOPPQQPPOOOMMMKLIFFFAzzABByyytuqjjnggabbhca2}[[({!!!!;;>;;;;;;;=%&%%$&$$#$$$%%*=;-;,'!{_[168bbknvwAAAzzzABAyyyAADBBAAEHHEHJGGJIIHEAAxxxxzyyywyAABBBAyywttquuxxxppomkkhfa8888666",
+"}}}}22}2}}}}}}}}}}}}}}}__(]^{~{]'''''','']^^^^[[}2222222266abckpttqpruuuxxABEHKMNNOPPQQPPOOONLNLLIIFFBAzBEAywquuqjjkggb8ceb22[[[({!!!';;;;;;;;;==%&%%$$$$%$$%%%%==-;,'!{[[266bjhnqwAAAzzzAAAyyyADAADAABHIHHHGGIIKIEBxxuusptwywAAAAEEBAyywqquuxwxpppmkfheb888822}",
+"}}}2}}}}}}}}}}}}}}}}}}}_:]]]{{!!!'''',',!{]^^[[1122222622260abkotprrrqqtxxAAGJKMMNOPPQQPPOOONNLLLIKHECAABEAwtquujjkkgbb8cf62}[[(({!!!';;;;;;;;;==%&&%%&&$%%%%%&==-;'''{{[_468bjhnvwAAAzzzyAAAyyAAyyABBBHIIJIHJIIKKHByxurspstuuyAAAEEEBAAuuquuuxpprmmmjfbbaa8222}",
+"[[}}}[[}}}}}}[___[[[_}}::]^]({{{!'',,!!]]]:[_122aaa66aaaaaabfhlpttpppquuxxAzBGIMMNOPPQQQPPPOONLMLMKHEEzCBEAwqqunjjkkbbabfb62[[[(({!!!';;;;;;;;;==%&&%%&&&&%&&&&&**;>'!{{[1468benqvwAAAAwwzzCAyAAxuuAABCEJIIIIIHHIIIBzxxsspquqquAAAAEEEBAxuuuuuxpppmmijbccb8222}[",
+"[[[[[}}}}__[_:_:([(__[[___[:_//(({!!]{{((<1|1356988999a9cccfjiotyywttxuuzzAAEGHKMNOOPQQQQPPPPONNLMKFEHAAEEAwqqunikkkbb8bf62}[[[(({!!!';;;;;;;;;==%&&%%%&&&%&&&***;-',!{[[166bbknqsyAAAwwyAAAzAAwwuutACEEJKKIIJJHIIKEEAxwwuutquuyAAyABEEAyxuuuuxpspmmjjbbbb62}}}[",
+"[[[[[}}____(([((((((:_1:|1:}1____({{{{(((_1|}34688a8abda9ecchmptAAyyyAAACAEEHJIMMLNOPQQQQQPPOOOOMMMKIHBBEEAwqqunjjkeb88bc62}[[[(({!!!';;;;;;;;;==%%&&%*%%%&%%%**=;;''!{^_166bhknqsyyAwwwxAACAAzxutuuxBEEIKKIIKIKIKHHEAAywtttuuxyAAwwABEAyxxuuupppqomiicbb6a2}[[[",
+"[[[[[____((((^^^^:[:[[[1|}[[_<<__({{{{{((_<11|366a68899a8bbdflouwAAyyAAACCCEIIKNNOOPQQQQQQPPOOONONMKIHCCEEAxqqunjkkbb8acc62[[[[(({!!!';;;;;;;;;===%%&=%%%%%%%%==;;;''!{^_166aekvqwyyAwwwxzCBCBzxxuxxxAEHHKKKKMMMKIEEEAAwxtuuquuyAzxwyAyAyyxpprpppqqmjfbcba62}[[[",
+"[[[(___]]((^^^^[[[:[[[:[[1:[_<___{{!!{{(((_}_|266a6668668aa9filotyAyzzAACCCHIIKNOOOPQQQQQQPPOOONOMMKIIEEEHAyuuunjjkb88bb822[[[[(({!!!!;;;;;;;;;===&%*&&&&%%&&=*-=;;''!^^126bagjrtvyywwwxxzCEEAzxuuuxxCCHHKMMMMNNKIEBDyyxxuupqquwyAwtwuwyztprppprrqqlifbb6622}}[[",
+"((((__(](^^^^^^[(((((:[[:[:[}__<</~{{{{{((_|}}}22226aa66a8abhhiltwywwwyyzCAEIILMOOOPQQRRQQQPPOOOOOMMIIHEIHAyuuunnjhb88cc622[[[[(({!!!!';;;;;;;;;===%***&&&&&=***;;''!{^_126bhgjqtvyywwwxxzBEBAxxuuuxxzEHIMNONMMMKHBByxxuxtspqrquwyxtuuttwtqmmmommmmljfbb662}}}[(",
+"(((__(((^^^^^{{{{{{(((]([[[:}_<<__{{{{{{((:_[:[12222226aa6abbejlpyywtuwwzzzBHHJMNNOOQQRRQQQQPOOOOOMMIIHHIHEyuxxpnkkb8abb622[[[[(({!!!!';;;;;;;;;====***=******;;;'''!^^_266bhgjqtvvywwwxxzBEBzxuuuxxzzEHKNOOONMKIEBAwuuuspppmqruwwwuqqrpttpmiinlllmlifba6622}}((",
+"(((_(((^^^^^{{{{{{{((((((_:[:<<<<_]{!]]]^]]][[[[}}}2}222268a8bhipwwxuwwwzzBBEGJKMMOOPQRRQQQQPPPPPOONMKIIIHBwzwzppmkeabcc62}[[[[[({{!!!!;;;;;;;;;=======**%===;;;;>,'^^_122bbgjmstvvywwwxxzAEzxxxuxxzzzEIKMNOOMMKIECvvqqqronppoqtxywuqlnmptpoiiijjllliecba222}}((",
+"((((({^^^^^!{{{{{{{{]{{]{(([:_((:<]]!!!!]^{]:[^[:[:_2}2}266a8ahimpwxustwzxAAEEGIMMMOPQQQQQQQPPPPPPPOOMMMKIEyyxxppmmjbbhba2}[[[[[(({!!!!';;;;;;;;;===;=-=====;;;;'''^^(_2268hgjmvvvvywwwwyzABzxxxxxzzzBIIIMMNNMMKIGzvtqqqmnnnonquwyxuqnkklppoifiifiiifecb622}}_((",
+"(({(({^^^^{{{!!]!]]{^{{{{{(](_((__]]!!!!^^]^(^^_[[1[[}}2226668gelqwttupwxxAACBGGKMMNOPQQQQQQQPPPPPPPONNNNKHAAxwpomkiififa22}[[[[(({{!!!!;;;;;;;;;==*=;====;;;;;;,'^^^(_2288bgmmsvvvvwwxwyzzAxxxxxzzzCEHIIKKMMMKIEGCvsqqmnnnnnhmquwwuonkjiiooliiijiiiief86222}_((",
+"({{({^^^^{!{!!!!!!!!{{{{]{](]((](<(!!]!]^^^]]^^[[[[[[122226668bgkqtwsrtuuuyyBCGGILKMOPQQQQQQPPOOPPPPOOOOONKIEAyxokkhjhifb622}[[[[(({!!!!';;;;;;;;;;;;;;;;;;;;;','!^^(_}228bgjmvvvvvvywwwyzAAAxxxxzzCEEHHHIIKMMKKEEAwuqqmnjnnnjhmqtuunkkjfiloiffffccbife8622}}_((",
+"{{{({^^^^!!!!!!!!!!!{!!!{{{]]//(/_(]]!]!{^^]^[[[[[_[[222222888hghmwwsruuuuyxzACCHFIMNPPQQQQQPPOOOPPPOOOOONNMIIBAtpkkeffbb8622}}[[[(({!!!!';;;;;;;;;;;;;;;;;;;''!!!^(_}}2aabgjmvvvvvvywwwyzzAzxxxzzCEGHHHEIIIKMKIEEAvuqmmmjjjnhjjmuuonkheheiiifcfccc9bb98622}__((",
+"{{{({^^^{!!!!!!!!!!!{{!]!{^]{]:<:::]{]^]^^]]]][^[[[}2}2222668adghottsuuuuzyxzzACHIFKNOPQQQQQPPOOPPPPPOOOOOMMKIECwtqmiifbaa866a22}[(({{!!!';;;;;;;;;;;;;;;;;;>!!!!!{__}}28bdjmmvvvvvvyzwwwyAAzAxzzzCEEHHEHIIIJKKHEBAvuqmnmjjjjjjhmqunkkhbb8bfffbccc999988a62}__({",
+"{{{({^^^{!!!!!!'!!!'!!{]]!{^]]:::::(]]]]^^]^]^[^[}}}}}2}2666a0dhjotxxuuuuwxxAzzCEIFILNPQQPQPPPPOOPPPPOOOOOMKKIHBBywtponc888826a22}[(({!!!!';;;;;;;;;;;;;;;'!!!!!{{([[}2a8bdhmsvzzvvvvzzwwzAAzAzzABEEHHEEHHIIHHIHGEDvuqmnnjjjjjhhmquokfbbb888ffc9cc998866662}__({",
+"{{{(^^^^{!!!!!''!'''!!!!]]{{{(:_:::({]^]^^^]:[[[[}}}}}}266aaaaeejnuwxuuuwwwwzzACGIIKMNOPPPPPPPOOOOPPOOOOONMMKHHCAwwxwwplhba8a226222}_({!!!!';;;;;;;;;;;;;;'!!!!{{^([[26aabhmmsvzzzvvvzzzwzAAAAABEEHHEEEEHHHIHEIHHEDwuqmnnjjjjjhhmqomkjcb8a68bc99995555866222__({",
+"{{{({^^^{]!!!!'!]'!'!!!!{]]{{(:_:_<_]]]^{^^^[[[[[}}}}}226aaabbehmquywuuwwwwwzzzCGFHFKNOPPPPOPPPOOOOOOOOOOOOMKIEEAytwwxtpoheb888222222_{!!!!';;;;;;;;;;;;;;',!^^(([[[}266ademvvxzzzzvvzzzABzAACBEHHHEEEEHGHHIHEHEEBDwuqmnhjjjjjhkkmomjeh888a85095555335544222__({",
+"{{{({^^^{!!!!!'!'')!!]{!{{]{{(_<<<1_(]]^{^^^::_[[[}}2227aaa8bbhkmquxxvwwvwwzAzACGHHFKNOPPPPOOOPOPOOOOOPOOOOMKIEEzxxtwwtppplifba8222}2<(]^!!';;;;;;;;;;;;';'!,^(([[[[}668bhhhvuxzzzzzvvzzzCCzzBEHHHEEEEHHHHGHECBCEBAyuqnnnjjjjjhkkmomifea6aa475534224443||||2__({",
+"{{{({^^^{!!]!!!!'!!!]{{{{{{]](__|_1__]^]^^]::::[[[}2227778888hhkmquyAxwwwwxzzzACGHFFKNOOOOPOOOOPPOOOOOOOOOONIHHBBwxxwwuqqppolihha22}__(^^^^';;;;-;;;;;;;'''!,{([[[[}668abekrvuzDzzzzzzzzAABBABEHHEEEEHHHHHHHEEzBEBDyturnnjjjjhkkmnnmkjjc8a744432}22}}}}|1<_<<_((",
+"({{({^^^{!{]^!]!')!]!!]~{({((:[<}|11_]]]^^^:::_[[22277777888bgkkmpuyyyxxwDAzyACCGHHFKMOOOOOOOOOOPPOOOOOPOOOMIHEEAAxxttpqqqnopllih8a2__(^^]^!'';>;;;;;;>;'''!!{([[}}6668abkkqvxDDDzzzzzzzACBCCEHHIEEHHHHHJEHBEEzCGBDAxurmmjjjjkkkmmnmkhheba541}22}}22}}}::^(_((((",
+"{{{({^^^{{]!^!]!!]]!]!{]{/(((_1|}}111:::_([_::}222277777a888bghkqptyAywzyDAAyyCCGHFFFKMOOOONONOOOPOOOOOPOPONKGCByyuxyyppmmmmooplmfc61_{!^]^!!!!''>;;;;;;;;'!!{([[[2228abkhrvvxAADDzzzzzzzACABEEEHHHHHHHIHGHBCAAzAAAAxuqrnjjjmkkknmlmlfcfec74[}2221111_}:::]^]{{{",
+"!!{{(^^^^{{!!!!]!!]{{!{{(/(_<_143|||1<::__[[}22222777770a888bghmmrtzCBAzAAAAAzzCGHFFFKMNOOONNNNOOOOOOOPPPPPNKHCzzwwuxxupormmmmoolifc9|_^]!!^{~{{'';;;--;;;'!!{(:[222600bkknvuDBBBDDDzzzzzAzABEEEEGEEHHHIHGEBEACCAAAAxxsqmjmnkkkmmmlmlifiic04}}}1_<<<<<//(:]^]^!!",
+"!!!^^]^^^{{{{!]{!]{{{]{(/(/_||144|33411_:}1}}337a7788a00bbbbbbhmmptABCzAzzDAAzzCGHFFFKMNOOONMNNNOOPOOOPPQQPOMFBzzxtwuuuunorommmligffc03:^^^^^]^]!'';;;;;;;,'!{{[_22600bhhnvvxDEEBDDBzzyvzwAAEEEBBGEEHHHHHGEEzCCCAAAyxxuqnnnmkkhhmmjmlifiif07}}1||<<<<<//{~){^^!!",
+"'!!^^^^]^{{{{{{{]]{{{{((</__<|1143|2411_11}14347a78a99dbcbbhefjmmpsyBCzAzzAzzAzCHHHFFFMNNNONMLNNOOOOOOPPQQQPNKHzzvvtwwqqqquoppmefc0c00722|:(]^^^^''''>;-;;'''!{[[2260bagnnvuDDBECDBCzzyADzAAEEBAAAEEHHHHHEEECBBAADAyxxuummnmkkkkkmjmmifiic92}}_<|</////~~{)','''",
+";''!^^^^]({{{{{{{{~{{{]](____}11|4|221____1114446aaaa0adbeffehmmmqtwEECCAzzzzzzCEHIFFIMNNNNNMKLNOOOOOOPQQQQOMKFBzzwytusmmmqqurmfea8877759952:^^!!!,),,';>',''!{[[2260bhgmvutyCGEBDBzzzyDxyABBBAzAAAEEHHIHHHCBCAAADAAzzxupmnmmhkkkmjklifffd922}_<<<(((/{{{)),''>;",
+";;'''{^^^:{({{{{{{{{({]((__:__|114414}_____111226666aaaa9behjilqqqtyEECCCzCAzzzCEHEFFIKNNNNMMKLMOOOOOOPQQQQONKHFAzzyywprssmqqlife9aa7445cd95}<]^]!'''''';',''!{[:22a0ahnnvvvDBGBBDBzzwyzyDBEzxxAzAABHIIHHIHGCEABAAAAAAAzturmnhhkkkjkiidccd5221_<<__((({{{!'',;;;",
+";;;'''{^:[{]{{{{{{{{{{{^(__::<|11442|}[[[_[}}222aaaa0898abbbejlquuwyBEEEEEEEBBBEEHEEFIKNNNNMIKLKNOOOOOPQQQPONMIFDAzzzvvvrrsmhgfbe8a85375955743}:^]!''''''',''!]^[22608gnjvuvDAGBBDzzzwvwyABAzxxxzAABHIHHHHHEEBAAAAABAAAAwuqmnmhkkhkkiicccd963|<<<<_(~~~)),''';;;",
+"=;;;'']{:[(({]^]{{~{{{(((_::<1|4443332}[[}}1222000aa9c9aaaabejoquuuyBEECHFIHHEGEEHEEEHKMNNNMKLKLMOOOOOPQQQPPNMIHFDAzzzvvvvrmegbabaa777753}}}3437}_]!'''''!!!'!{^[2260agljqqwDADBBDzzzwywzAzzxxxxxABBEEEEBHHHBAAzyyAAAAAzwtqrqnmhhhkkiifcccc654|____~{~~))''>;;;=",
+"==;;'''{([[((]((]]{/(((((__<:11|4353552}}}42770ddabbdccccdhgiopptxwABEGEIHIFIFFFEHECEHIMNNNMKIKLMOOOOOPQQQPPOMKHHEEEAzxxvvrmedaa222|7572[<[:|1|742|[!)'''!]!!{]][22678gjjqqwDDDDDDxzwxvxzAzxuuuxxzBEEEEBEHHBAAwxyyyAAAAwttqrqqljkhkkkiiecdc954|___//{~)),>>>;-==",
+"%==;;''!](:((](((]]/(((((_<_<1|435575955775700ddihhggfffikimopptwwxABHEEHIKKKIFFEIEECEIMNNNMFILMMNPOOOPQQQQPONKLHHHEFzzxxxrmed862}}1774[[:[::[|4443|:{!''!!]^{([[}}6a8gjjqquDAADDDxzwwuwzwxuuuuxxxBEEEEEHHBAyyxxzyyyzAzwwtpqpooljjjkkiifcdc993|<__//)))),>>--*%%",
+"%%*;;;,!{{(_((:(((:(/<:__<_1|4377590990775000ddijifikfiiimmmmpqppwwABHHHHIKKKIIIHIHECEIKNNNMIIIMMOOOOOPQQQQPOOMLKHIFHDDzxvrmed862}}131_^]:^::_14|1233}({'!!!](__:}2778gjjrquDAADDDxxwwwwzxusuuuxxzzBBBEHHByyxxxxxywwyyAwwupuqnoomkkkmiieffc995|<__//~))),>;--*%%",
+"&&**-;'!]]([(__:_::/_<<<<|11|4355599900557909ciiiigggkfiikkkkmnnrtxxBHHHIKKLLKIIKKIEEEIKMNNKIFILMOOOOPPQQQPPPOOMKLKIHFDzxvrmed862}}1|_{^^]^_<_1111:}334<^]!!!{(:}22778dikmquwADDADxxwwwyyuuqvvuxzzzBzEEEAAwuuuuxxwwuxxxwwtrqooopmmmmmllffffc97||<//~~),,,>;-=%&&",
+"$&&=--'']{]_______<<<<||||3||47579999990099ccgiiiijgggcfghhgggijjquuyBEEEIKMKKKKKKIHEHIKNNNMIHIIMOOOOOPQQPPPPOONMLLMLHDzxvrmed862}2__{{{{{((__111<_[}323|:]!!{{[}62088djjmqtwAADAxxxxzwyuuqvvvuxzzzzBEEAywuuuuuupstpuxxtwuqqlnnmmmmmmoliffc9673|_//~~),,,>-**%$$",
+"$$%==-''!{((1<_<1<<|<||||||33347799ccffdccccfgjkkggddggcdbbdhheehmqqwAEECGIKFFLKKKKIHIKMNNNMKFIILOOOOPQQQPPPPOONNNMMLHDzxvrmed86222_({{!!{((_11311_[<:}2|11:({/:[220agdjmmqtvAADDyvxxywyuqqvvuuxxxzBEEAywutuxuspppsqutxuwtrnmlkmomliloonifc9663|1</~~),>>>-**%$$",
+"#$%%==>''{(_1<|<|111||||||33357709cccffcc99cghhhhjghddgdbbhbdgeehmmqwABBCBHIKIFIIKKIHIKMNNONKFFIMNOOPPQQQQQPPOOONLNMLHDzxvrmed8622}[(({{{{{{__2221__](:<11|||1_::220bghjmmquvyADDyuxwzyyvqqqqrruxxzGEAywxuxxtpprrppquuxtwtqqnjkjjillnilolif9a63||</~~),>>>-*&&##",
+"##$%*=>>'!{(__1_111||11||33355900ddccfgc99ddhehhhhhhddddbbbabheeemmmtyCBCCHIFIFIIKIHEHKMNNOOMKFKKOOOPPPQQQQPOOOOOONMLHFzxvrmed8a22}[(({{{{((([}}2|__^](::<||752}}2609gglmnqtvyADDxvxwAyxqqqqsrquxzBEBAyxxuuxtutsssppstxtwtummkhkehijiilolij9aa3|1</~~),>>>==&&##",
+"##$&**;>,!{(_|||||1||1|33335599990dccfffddhhhghhhhhghdddabbbhheeehmmqyABBCEHFKIIIKIEEHKMNNOONKKKMOOOPPQQQPPPOOPPOONMKHFzxvrmed88a}[[(((((({{[[[}}_1<<]^]^[_1459556678gglqqqtvyADyAvxxAwwqqqqvrruxzBEAywxwxxttwwyvvwwtxywyutpmmkheehhiiloilic9673|_<~~),>>;==&&##",
+"@@$&&*-;'){{(_|11|||11133555569990cccghfebhhhghkkhjfgdgggbbehhhjjhmqqyABCCEFIIFIIKKIHIKMNNOONMKMNOPOPQQQPPPPOOPPPONNKHFzxvrmedb8a2[[[(((((([:[[}[}<__]^^]^]_|3999990adgjqqquwAADDDwxwzwwmmqqunruzACyyywxwxwyAEEEEBAAAAAAAwwsomkhhbbbejliiiif9673|_</~),>;===%$@@",
+"@@#&%=*>>'!)(__1<1||43347555599999ddghfifghggklnjmmmiigghhfhghggjjqquyAEBCCHFKKIFKKIHIKNNOOONNMMNPPOPQQQQPQPOOPPPONNLLFDxvrmmhb88}[[[[((([[[::1}}}_|__]/](^<<1599cfdbggkqpqwyAAADDxxyAwtsmqqquoxzzywwxwyAABEHKMKIIHEEBAAAAAwpmmjjbbbfiiiiiifc953||</~),>-==%%$#@",
+"@@#$%%=;;,,!~(__|_|||33555550999cccdggiiijkjlooommmollkkkffghghkjjnquAAEBCEFIKKKKKKHHIKMNOOONNMNNOPOPQQQQQQPPOPPPPONLLFDxvrmmjga6}[[[[[[[[::}22}}}}_<_<_:/(__137ccfgfigimmqvyACADDzzzAztsmqqqquxAAvtwwABEEHIKMMIEEBAAywwyABytqnjjgbhhhgiiiifd99531</~),>;==%%$@@",
+"@@##$%%*;;,!{/_<<||1|145559709cccffiillllllopprpppppoommiiikkkkkknmuuAAEECEFIKKKKFKFHHKMNNOONNNNNOOOPQQQQQQPPPPPPPONLLHDxvrrmhgba6}[[[[[::[}22662}}(//<_<__<_}|580fiimomrqqwyAEADDAzAywusmqqqvxzAwtwxyBEHIKKKKEBAwwwxwtwyyAywqmoijijhfhfiijif8853|<<~)),;=%%%#@@",
+"@@##$&&**-')){/<_<<|||3755999dcfffiilooooooooppppqppppopllommmpmmpptwABEEGCIFKKKKLKIHIKMNNOONNMNNOOOOPQQQQQQPPPPPOONMLHFzxvrmjgb66}}[[[[[}}2288864}}({{(1||1_}|298fgiopprqqvvACADDDzzvvsssqqquxzzttwyAEIIMKIHBAywtttxwwwyyAywtpmlmihehcfiiiff9973||</)),-=%%$#@@",
+"+@##$&&==->'!~/_<<|||3355999ccdgfgiillllollnoorrpmoqoommoloompqpqttyyEHIHGHKKKKKLKKFFIKMNMNONNMNNOOOOPQQQQPPPPPOOOOONLHFzxvsmhdd666}}[[}}266ccff996}(({/<||1_|2269dfmotttutvyACEBBBBzxvvstqqqtwzxtwyAEHIKKIEBAyAAyyyyAyAAAAywtpmlnlgfhfeeifgfc8953|</~),-=%%$#@+",
+"+@###$&==;>,!~/<<<<||3335599ccggfiijllnnlloooopppqqpoomomlmmmopqqttyAEIKKIIMMMMMKKLKIKKMMMMNMMMNOOOOPPQQQQPPPPOOOPPOOKLFBxvsmmed8666}222a6bbfeifif92[((/_|<_}}2269dfmmpwwwwwyABEBDEEzxvvtutqqxwxxwyABHIIHHHEEEEEHEEEEEBBABAAytpoliiiighceffgcc8953|</~),>;%%$#@+",
+"+@@##$%%*;>,){//<<||||355599ccggfiijllonpppppttwwtxwttpttpppppputtwAAEIKKKKNOOONNMMKKKLNNNNNNMMNOOOOPPPQQQPPPOOOOPPPOMLIDzvssmed86666226bbbccjjefc6|[(((((/(::2669dckkptwwAAAACEGEHEAxxxwstuuxxxxwAEEIIHEHIKIKIIIHIIHIEEBEBAAwppojhfiffcddddc88653|</~),>;*%$#@+",
+"+@@#@#$%*->,,)//<<<||||35599ccfiiillooppttwwwwyyyyAAyywwywwwtxzzyyABCHIMKKMNOOOOOOOMMMMNNNNNNMMNOOOOPPPQQPPPPOOOOPPPOOMIFBzytmmed86688abcbccehgif86}}[(({{{^:[}659dekoouuwABEBEEEEHEEzxvvwswyDuxzBBEHIHHIKMMMKKIIEHIHIIIHHEBBAwponijijfcccccc98655||<~),>;*%$#@+",
+"++@@@#$$*--,,)~//<<||||35599ccfiiloppttwwywwwwyyywyyywwtwwtttwAAAAEEEIKMMMNNOOPPOOOOOOOOONNNNMNNOOOOPPPPPPPPPOOOPPPOOONNIHzztmmeddba88bbcciikggfc82}[:[{{^]^^::27dffkooptwABEHHGHIEEBAxzvvwwzyuxABBHHHHIKMKKKMKIIHHIHIIKIHHEEBAtpnjffefffcd9c996533|</)),;*%$#@+",
+"++@+@#$$%*->,)~///<|||335599cfiilopppttwwwwwwwwywwwwywwuppppptwwyzABEHMNNMOOOPPPPPPPOPPPPPOOONNOPPPPPPPPPPPOPOOOPPPOOOONMIEAzsmmeggbehchfilokkkf962}::::::[][:}2a0ckkmrpuwAAEJIIIKIEBCAzzyyAzyAzCEIHHIIKKKIIKMKIIEEHHIIKIHHEEBBypljfbeffcc9cc95333||</),,-=%$#@+",
+"++++##$%%*->,)~//<<||3355599cffillppptwwwwywwwyyyywyywwwutttttwwwyyABEIMMMNOOPPQPQQQPPQQQQPPOOOPPPOPOOOPPPPOOOOOPPPOOOONMMKGAwtqjjkkkhfhgkmmonkg6a6[::[:[[[:::2}60agkoupuwyABHIKMKIHBDDzzzACAyACEHIKHIIIIIHIIIIHHEBBAEEEEEHEEEBytoifbhcfdcccc9533|||</~),-=%$#@+",
+"+++@@#$%%*--,)~/(<||||355999ccfiilopptttwwwwwwyyyyyAAAyywwwyyyAAAAzEEIKMMMNNOOPPOPQQQPQQQQQQQPPPQPPPOOOPPPPOOOOOOPPOOOOONMKGEBwqqnokkkggggillqjg862[}[[:::[[[222788glouuuyAAEGGKNNKIEBBDzzBBAABEEIIKIIIKKIHHEHHEEAAyyAyyAAEEBEBAwpljeedcc9ccc953||||<<~),>;%$#@+",
+"+++@@##$%*-->)~/<<<|||355599ccffiiloptwwwwywwwyyAAAyyywwywyyAAAAACEHHKMNNNNOOOOOOOPPPPQQQQQQQQQQQQQPOOOPPPPOOOOOOOPOOOOOOMMKGEAAxuronljeejjjqmhd8666}:[:[::[[22608ggjppuwyAAEEEKMNMIIEBDEBEEBEEHIIKKKIIKKHEEBBBBBAzyywtwwwAEBBBAwpoijedd99cc9953|||<<<~),>;%%#@+",
+"+++@@@#$%*->,,~/<<<||||335599ccfiiloppwwwwyAyyyyyyywwwwwwwtwwxyyAEEEKKNOOOOOOPOOOOOOOOPQQQQQQQQRQQQQPOOOPPPOOOOOOOOOOOOOOONKHHHEEywuoljeemmqmmed8aaa}}[[:[:[422a08ggioqqwyAAEEHKMMMKKIEEEEEGGHIIKMKKKKMKIEBAAAAAAAAAywttpuwAABAAwtolifdda8c995531|<<<<~~,>;=%#@+",
+"+.+@+@#$%%->,)~//<<<|||3355999cfiilopptwwyyywwwyvwwuutttpstquuuxAAAEHIMOOOOPPPPPPOPPOOOPQQQQQQQQQQQQQPPOPPPOOOOOOOOOONOOONMMMJIIHHAyuqqmmqqqpmhdd8662}:[:[:2226788glinqqwAAEEEIKMMMMKKKHHHFHHFKKKMKIKMKIEBAABzAAABAAAwxupqtwyAAAwtpoljgd890999541<<<<//~,>;=%$@+",
+"+.+@+@#$%*->,))~//<<<||335599ccfiillopptwwwwwwwywwwvxxwwwwwwwwyAAACEGHKNOOOOOPPPPQPPPPPPQPPPOPPQQQQQQQQPPPPPOOOOOOONNNNOONNMNNMKKHHEwuuqqqwtpkked82222[:[:22}267agglrrqtwyAEEHKKMMMMMMKKKIIIHKMNNMKMMKIHGEABBAAyyDyyyyuupttwwyyAywtpoifd09999953|1<//~~~,>>=%$@+",
+"+.++@##$%*-->))~//<<|||355599ccffiilllpptwwyyyyAAABBAABBEBABBBBEEHGIIKMOOOOOOPOOPPPQQQQQQQPOOOOPQQQQQQQQQQQPOOOOOOOONNNOOOMNNNNNMKEEEBAyyywtpkmeda82222222222607aggkqrqvvAACEIKKMMMMMMMMMMKKKMNNNNMMMKEEEECAywwstsstzwuuutwwwwwyywtpplic98999953|<<//~~~),>=&$#+",
+"+.++@##$%*-->,)~~//<<<||35599cccgffiloptwwAABBBEEEEEEEEEHHHHGHHKKKMMNOOOPPPOPPPOPPPPPQQQQQQQPOOPQQPPQQQQQQQQPOOOOOOOONNOOOOMMMNNMKIEEEBBABzypmkb0082266689889909ggkjmquvvABBEIKMMMNMMMMNMMMMMMNNNNONKIHIBBzzzxssrrruuuuuputwwwwwywwtolifcb955553|<//~~))),>=&$#+",
+"+.++@##%%*-->,,~~/<<<|||335599ccfiiloppwyABBBBBEEEEHHHHHHEEHHHIKKMMNOOOPQQPQQQQPPPPPPPQQQQQQQPPQQQPPPPPQQQQQQPPPPPPOOOOOOOONMMMMKKKHHEHIIEAAtmme0088688cccfjiigfkglmnqtvwyBBIIKMMNNNNMNMNNONOONNNOONMIHEEAzxxuuuuuuqusuuttuwtwtwwwwtooiib9955553|<</~~))),>-&&#+",
+"++++@##%%*-->,,~~//<<|||333599ccfilopttwwyAABBEEEEEEEEIHEEEEEEHHIIKMNOOPQQQQQQQQQQQQPPQQQQQQQQQQQQPPPPPPQQQQQPQPQPPPOOOOOOOOMNMLKIJIKIIIIIHBwtmefd9ccffccfiilklqmporqqwvyCAEHIMMNNNNNNMNNOOOOOONOONNKKJEBzAxuuuuuvvqqqqtuspttttwwywwpoliec957533|<</~))),,>-&&#+",
+"+++@@##%%*-->,,~///<<<||335599cfilloppptwwyyAABBBBEBBEEEEAACCBCCEIKMNNOOPQPQPQQPPPQQQQQQQQQQQPQQQQQPPPPPPPOOPPPQQQQPPPPOOOOOONMKFIIIKMKIIIHECwmmigkilifccffkkllpptupqtvvyCBHHIMMNNNOONONNOOPPPPOPOMMMIHHGAzAxuvuuuvqqqsttqutttwwwyywppliec95733||</~{),,,,>-*&#+",
+"+++@@##%%*->>,))~//<<<||335599cfiloooppptwwwAAAAAAAAAADBBBAAAAEEHIKMMNNOPPPPPPPPPPPQPPQQQQQQPPQQQQQQQQQQQPOOOOOPQQQQPPPPPOOOOOMMKIIILMNNMKEEEAupnomoijfeccgggjomttxxuvyAyCBBHIKMMNNOOOOOOOOPPPPPPONMKIJGECzyxywvuvuqqvsuupuwwwwwwyywtplif9997731<<({~!),,>>-*&$@",
+"+++@@##%%*->>,)~~///<<||355599cfiloooppptwwwyAABBBBBBAAABEDBDEEHHIKMNNOOPPPPPPPPOOPPPPPQQQQQPPQQQQQQQQQQQPOONNOOPQQQQQPPPPPPPOOMMLIKKMNNNKHCBAxxttqoifbc9dddeekmpuwwyAAyAACBIIKMMMNOOPOOOOPPPPQQPONMKIJJECBzxwwwwwtttvstqstuwwwwwyywwtoifc9973||<//~)),,,>--**$@",
+"+++@@#$%%*->,,)~~~/<<|||355559cfiioooopptwyAAEEEBEEBEEEBEEEEEHFIKKMMMOOOPPPPOPPOOOOOOOPQQQQQPPPQQQQQQQQQQQPOONNOPPQQQQQQQQPPPPOOLMMMKKMMMKIGCAyBywpokgddd00bbggoostxAAADyABEEIIKMMNNOPPPOPPPPPQQPONMKKIGGGCzzzvvwttttsvsuvttttwywyyywtplicc053|||</~),,,>>-=**$@",
+"+++@@#$%%*->,,))~~/<<<|||35559cfiilooopptwyAABEEEEEEEEEEHEHHHIIKMMMNOOOPQQPPOPPOOOOOOOPPQQPPPPPQQQQQQQQQQQQPPOOOPQQQQQQQQQQPPPPOONMMMMMMKKHEEABABywmkgdd00bbgggmlpuwAAAADAAEHIIIKMNOOOPPPPQQPQPQPPONKKIIGGCCCzDytuutssvtvusuutvwwwwywttoicc973||<</~),,>>--;=*$@",
+"++@@##$%*-->,,))~//<<<<||35559ccfiillmopptwwyBBEEEEHIEHHHIIIIKKKMMNNNOOQQQPPPOPPOOOOOOOPPPPPPOPPQQQQQQQQQQQQPPPOPQQQQQQQQQRQQQQPPOOONLMLIIEEEEEAzwtpmgdd0bbbggllqruwAAAAAAAEHHIIIMMNOOOPPPQQQQQPPPOOMKLKIHGCCAAAxvvvvvvtwuusuttvvwwwwttplic973||<//~'',>--**=*%@",
+"@#@@##$%*-->,,)~~//<<<<||355559cffiikllopppwwAABBBEHHHIHEGJHJJIIMMNNOOPQQQPPPOOOOOOOOOOPPPPPOOOPQQPPPPQQQQQQPPQQQQQQQQQQQQQQQQQQPPOOOOOMIFECEEHAytpppligecbgggnmrqquwwADDAABHHHIKKMNOOOPPQQQQQPPPPOOONKKKIIGCBAAzvvvvvvtwxxvutwwwwwwwwtpoifc95||<</)),,>-;**%&%#",
+"@##@#$$%*-->,,)~~///<<<||335559cffiiiillooptwyAzAAzEEHHHIIJIIIMMMLNOOPPPQQPPOOOOOOOOOOOPPPPOOOOOPPOPPPQQQQPPPPPQQQQQQQQQQQQQQQQQQQPPPOOLIFBCEEEAywppppoljekggnlrvqttttxDABDEEHGIIKMNNOOPPQQQQQQPPPPOOONKKKIIHGGCCzzzzxwvxxxuuwwwyytwwwtpoifc95|1<</~!,,>--=*%&$#",
+"@##@#$$%**->,,)~~///<<<||3355599fffiiillopptwwyAAzABEHHIJIIIKKMMOOOPPPPQQQPPOOOOOOLNNOOPPPPPOOOOPPOOOPPQQPPPPPPPQQQRRRRRRQQQQQRRQQQQPPOMIHECBEAwwwpooppolmmkknnquutuutuwDDEEEHEHIKKNNOPPPQQQQQQPPPOOPOONNMKKKKHGCCCCzzzxxxxxvwvyyywtttwtoifc9531</({!,>--;=%%$$#",
+"@####$$%*-->,,)~~///<<|||3355599ffiffiiloppptwyyAAzBHHHIIKIKMMNOOOPPPPPPQQPOOOOOONMNNNOOPPOOOOOPPPNNOOPPPPPOPPPPQQQRRRRRRRRRRRRRRQQQQPOMKIHCCAwwuuuoooppuqmmqmrruttqqqutwDBEEBGEIIKNNOOPPQQQQQQQPPPPOPOOOOMMFIIHGCzzzAAzzxxxvwyyAAywwtttolfc9531<//{),>>-*=%&$$#",
+"@@#$#$%%*->>,))~~///<<<|||355599ffifgiiloooppwwyAAABEHHIIKKMMNNOOOOPPPPPQQPOOONNONMMMMNOOOOOOOOPPPNNNNOPPPOOOOPPPQQQRRRRRRRRRRSRRRRQQPONMKKCzytuqqtuoooutuqtqqvvutuuuqqquwBEEBGEEIIKNOOPPQQQQQQQQQPPOOPPOOOMKIIHFECzzzAAAzzyyyyAAAywwtttplfc953|<//~),>>-*%&&$##",
+"#@#$#$%%*->>,))~////<<<||335599cfffgfiiloloopwwyAAABEGEIIKMNNOOOOOPPPPPPQQPOOONNNNMMMMNOOOOONNOOPPONNNNOOOONOOOPPPQQQRRRRRRRRRSSRRRQQPPOOMKEAxutmqqutuuquuuwtxuuuuqquqqquwAEEBAECHIKMNOOPPQQQQQQQQQQPPPPPOOMLIFFHEEzAzzzABAAzAAABBAyywttpoic953|<//~),>--*%%&#@#",
+"#@#$$$%%*->>,,)~////<<|||335999cffifiiililopptyyAABEEEHIIKMNNOOOPPPPPPPPPQPOOONOONMMMLNNOONONNNOOONNNNNNNNNNNNNOPPQQQQRRRSSRRRSSSRRQQPPOONNHCyputmqquuutupwywyxxwuuqqqquuuyEEEBAEEIKKNOOPPPQQQQQQQQQQQPPOPNNMMKIHHEEDDDDABBBBABEEEBAywwtpoic9531<//~),>-**%%&#@@",
+"###$%$%**->>,,)~//<<<<||3335599cfffffiililooptyyAABEHHHIKMMNOOOOPPPOOOOPPQPOOONNONNNNMMNOONMMMNOOOMMNMMMNNNMKMMNOPPQQQQRRRSSSSSSSSRQQPPOOONKEAyttmmqquuuupwwAAyxwuuuuqqquuyAEEBBGEHIMNOOOPPPPQQQQQQQQQPOPOOONNMKIIIHEDAAABBEEEEEEEEBAAwwpoic953|<//~),>-**%%$#@@",
+"###&%$%**->>,,)~//<<<|||3335599ccfcffiiiilopppwyyAAEEEHIKMNNOOOOOOOOOOOPPPPOOONNONNNLMMNONNMMKNOOOMMMKKKKMMMMKKMNOOPQQQRRRRSSSSSSSSQQPPOPONKJEAttmmqmqquuwwwAAAzyxuuuqqqquxyDDEEBEHHKNNOOOPPPPPPQQQQQQQPPPPPPONMKKIHHEDAABBEEEEEBEEBBAwwtplf953|<//~),>-*%%%$##@",
+"#$$&%%%**->>,))~~/<<||||||3359cccfcffiiiloopptwAAAAEEEEIIKMNNOOOOOOOOOOOOPPOOONNOMMMMKKMNNMMKKKNOOMMMKIHHKKMKKKKMNNOOPQQRRRRSSSSSSSQQPPOOOMKIHEwutqqqmqqwwwwyAAAAyxxuuqquuwyyABEEEHIKNNNOOOOOPPPQQQQQQQQQPPPPOONMKKIHHBBACBDEIHBBABEBAywtpoic95|<</~),>-*%%%$##@",
+"@#$&%%%*-->,,)~~//<<||33333559cfffffiillloopttwyAAAEHEEEIIKMNOOOOPOONNOOOOPOOONNMMMLMIKMNNKKKKKMNMMMMKIEEJHIKKIKKNNNOOPQQRRRSSSSSSSRQQPOONMIIHHAwwwqqqqttwwAyzAABAxxxuuuuuwwwyABEEEIKMNNNNOOOOPPQQQQQQQQQQPPPPOONMMIIHEEBCCBEIHBAAAABBywwppif953|<//),>-**%$$##@",
+"@#$&&*%*->>,))~~//<|||3333559cffiffiiilllopptwxAABBCEHHHHIKKKMMNOOOOOOOOOPPOOONNMMMMKIKKMMKKKIFMNMKKKKIHEECGHHIIKMNNOOOPPQRRSSSSSSSRRQQOOMKKHHEEywwwyywtttwAAzzABAzxxuuuuuxwwyyAEEHIMNMMNNNOONOOPPQPQQQQQQQQQQQPOOMKIHHEGBAEEHEBAAAABAAywtplfc53|<//)),--*%$$##@",
+"@@$&&**-->>,))~~/<<|||3335599cffffffiiiillooptwyABBEEHHIIIIKKMMNNNNNNNNOOPPPONNNMLLMKIIKMMKKIFKMNMKKMKFHEECCCEGHIKMNNOOOPPQRRRSSSSSSRRQQPMKFEGCByywwwywtppzAAzzDEBAzxxuuuxxwwwyABEHIKNMMMNNNNNOOPQQQQQQQRRRRRQQQPPONMIHEEEEEEEEEAAyyAAyyywpoic95||//~),--*%$$##@",
+"@@$%%*--->>,,)~~/<<||333355599ccfccfgfiiiiloopptwAABEGHIIKKKKMMNMNNNNNNOOOPOOONNMKLMKKIKMMKKIIIMMKIKMKFEEEzzzzCGGIKMNNOOPPQPQRRSSSSSRRRQPOMMIGAzAyyywwwtuxwxzAAEDAAAzyxxxxywtuwDBEHIKMMMMMNNLNOOPQQQQQQRRRRRQQQQPPPONKIIIHHEEEGBBAyywwywwwtpif993|<//),>-*%%$##+",
+"@@#%&---->,,,)~~/<<||3|3335559ccc9ccffifiiiloopptwyABCEHHIKKMMMNNNNNONOOOPPPOOOONLMMKKKKMMKIIHFKMKIKKKFFFEzzzzzzEEHHKNNOOPPPPQQRRSRSRRRQQPONMICAAzyAywwtxtttzABEEEAAAAxxxzyxuttxBEIKKKKMMMMMNNOPQQQQQQRRRRRQQPPOOOOPONKIHIIIHHEEAAyytwwttttplfc953|</~),>**%$##+",
+"@#$&==--->,)))~~//<<||33333559ccccccdfffiiiilnrptwyyAEEHHHIKMMNNOOOOOOOOOOPPOOONNNMMKKKMMMKIHHFKMKIFKKIFHEzzzzzzCCCGGINNOOPPPPQQRRRRRRRRQPPONKHBzAzyAyzywttxxAEEEEEAAAAyzAyxutuxAEIMMKKKMMKKKNPPPPQQQRRRQQQQPPONNONOONMKIIKIIHEEBBAwttwttppplfc953|<</~),>--%$#@",
+"#$&&*-->>>,))~~~~//<<||3333599ccfdcffcfffiinnrpttwyAABEHHHHIIIKMMNNNNNNOOOOOOOOOOOOOMKKMNNKIIHIKKFFHIIIIHEBzzvxxzCCCCGHKNOOOPPPQQQQRRRRQQQPONMIEAzAzBBBzywxxuzBEHDEDAAzAAAAxuuxyABIMMKKKMKKKKMOOOOPQRRQQQQPPPPOONNNMNNNMKKKKKIHEEEBywtttpppolfc953|<//~)),>>-%%#",
+"$&**;>,,,,))))~~~//<<||335559ccfccfffffiilnlnpptwyyAABEEHHEEHHIIKKKMMMNNNNOONNNNOOOOONMNOOMIIEEHIIEEIIIHIIBzzzxwxyzzCCCEKMNOPQPPPPQQQRQQQQQPONKHEAzAABEBAzxxwDAEEHEDAAAAEBAxxuxxzEIMMMKKKKLKMMOOOPQQRQQPPPPPPPPOONMMKMNNMKIIKIIHHHBAytwtppoolic953|</~~),>>-*%%$",
+"##%=;>,)))))~~~~//<<|||355999cccccffffeiiiloppttwwwAAAABEEHGEGGJIIJIKKMNNNONMMKKMMNOOOOOOONKIEEHIHBEHIIHIICzzzwwvvvvyzzCCIKMOPQPPOPPQQQQQQPPPONKHEAAyAABBCAxwyAAEDEAAyzAEECzxxxzAEIMMMMKKIKKMNNOOPQQQQPPPPPQPQQPONMMKMNNNMIIIIEHEHEBAwwttpoolif953|</~),>>-*%%$#",
+"+@#%*-,,))))~~///<<||33559cccffccffcfeiiilloopppptwwwAABBEEEHJHHIIJIIKKMNNOOMKIIKKMNOOOOOONMKIIIKIGCGIIEIIEzzzxvvvvvvxyzCCELNOPPPOPPOOOPPPPPPPONMKHAzxzzBBCzzyADEDDBAyAzBEEAzxxzAEKMMMMKIIIKMNNOOQQQQPOOPQQQQQQPPONMKKNNNNKIIIEHEEBAyywtwppoolic933|<~))>--*%$#+",
+"+@#$%=->,,,,))~//<||335599ccfffcfffffiiiillllmmooqssvyADBEHIIHIIILIIKLKLMNNNNMKFIIIKMNOOPONKKIKKMKHGGHEEHIECzzvvwvvwwvxyAzCHMNOOPOOONNMNOOOPPPPOONMHAxxyzAACAzADDDEBAzAABCCBAzzzAEKMMNNKIIKKKMMOPQQPPPPPQQRRRRQQPPONMMMMNMMKIHHHHBAAywtttpooolif955||/~),>-*%#@+",
+"++#$%%;>>>,,,))~/<<||335559cccccffffiiiijliiiiillmqtwwDABEHIKKKIIMKKKKKKMMNNMMKKKIIKMMNOPPNKIIIKMIHEGHECEHECzzxxwvvwvvwzyyzCIMMNOOOOOMKIKNOOOOPPONNKBwxwxzABCzAABBAAAzAACEBBBAAzBHKMMNNMIIKKMMOOPQPOOPQQRRRRRRRQQPPOOMKKKMMKIHHHEBAAAywtpoolllifc9953|/~),>-%#@+",
+"++@#%&=;>'>,)))~/<<<||33555999ccfffiiiffffgfggkkmmqptwyDBEHIIIIIIIIIKKKKIKMNMMKKKLKKKMMNPPOMKHEIIIEEGJHHHHICCzwwvvrrrppwyzzCGHKKNNOONKIHIKMOOOOOOONMIBwxwwyACCCBBEAyzAzAEEAABBBBEIKKMNMMKIFKMNOPPPONOPQRRQRRRRRQQQQPONKIIKMKKIHIEEBBByywtpoiiiffc9553|</~),-*%@+",
+"+@#$%**;>'',){~~//<|||33355999ccfffffccfccccggkkmoqqutwyABBEEHHIHHHIIIKKKKMMKKKKKKKMMMMNOPONMIHIIHBCBEIJIIIECzxwvqrrrrrssxzzGGEIMNONKIHJEHIMONNOONNMKEAAxxwzACBCBBAzzAzBEEBAABEHIKMMMMMMKKKKMNOOOOMNOPQQQQQQQQQQQQQPPOMKIKMMKIIIHEBAAAyttpoiiifc9953|<</~),>-%#+",
+"@#$%%*->''){~{///<<||||3555999cfcccccccccccgggimmpquutuwyABBEHHIIIIIIKMKMMMMMKKIHIKKMMMNOPPOOMKKIHDzABEEIIIHGCyvvqrrrrrsssvzBCCEKMMMIIHEEEHKKNNNNNNNKHEAzwxwyCBCBBAAyABBEECAAAEIKNMMMMKIMMMMNNNOOMMNOPQQQQQQQPQPPQQPPONMKKMMMKKKIEBAAywttpoiiifc995|<</~),>*%$@+",
+"+@#$%*>>)!~{/(/(<<|||3355599ccfccccc9cccccgggkkmmqqqqutuwyBEEHIKKKKKKMMMNNNNNMKKIIIKMMMNOPPOOONNKIDzzzACEIHHHEAAussrrrrssstzBAzCEHIIIIHEEHHEHKNNNNNNKIEEAAwwwyACBCBBzCCGEBzACAEINONNNMIIKMNNNNOONKMOOPPQQQPPPPPPPPPPPOONMMNNNMMKIEAyywwtppoiiffc9953|<~),>*%$#+.",
+".+##$&*>,){~//<__|||335559ccfccccccccfcccfggilmoomqquuxwyAEHIKKMMMMMMMMMNNNONNMMMKKMNNNOOPPOOOOOOMEBAzAzBHEEGEEBwtsummmmssswCAvzCHHGCEHHHHEEEEIMNNNNMKIEBBzwwwyABCBBBCEHHBzzCEEIMOONNMIHKMNNNOOOMMNOOPQQPPPOPOOPPPPPPOOONMNNNNMKIEAywwwtppoliffc953||/~),-*%$#+.",
+"+@#$%&*>>,!)]~(((<|2335999ccfffffffffffffkilooooppptwxzACEEHIKMMMNNNNNNMMNNONNNNNMMNNOOOPPPPOOOOONIEABAABGEEEEEBwwummqqmmmtwwzvzCEECCBEEBBBEEEEHKNNNNMKIEBBAwwwyAACBEEHIIEAAAEHINOOOOMIFIMNNNOOONNOPPPPPOOOOOPOOPPPPPPOONNNNNMMKIHBywwwttpoliifc953|</~)>-*%$#@+",
+"+#%%=*=>>,!~{](/__<|335999cccfccffffffffiiloloppptwzAABEEEEEHIKKMNNNNNMMMMNNNNNMNMMMNNNOPQQPPPPOOOMHEBEEEHGCCEBzxxwuuuqqmmqwwtwvABBAzCABBAABBBBBEINNNNMKIHEEAwxwxzzzBEHIKHBBBEKMNOOOOMIIIMNNNOPOOOOOOPOONNOOOPOOPPPPOPOOOONMMMMKIHEAywwwwtpliffc933|</~,>-*%$#@+",
+"+@$%**->,'!!~]/<__135999ccccccccfccfccdfiilllopptwyAAAABEEEEHIKMMNNNNMMMKMMMMMKKKKMMNNNOPPQPPPPOOONKIHHHHHGCCBAwttquuuuqmmqquspvAAAzwwyABAAAABBBBEIMNNNMMKIEEAxwwwzzyBGHIHEEAEIMNOOOONKIKMNNOOPOOOONNNNNNNNNOPPPPPPPOOOOOONNMKMKIEEAywwwwwtplic9553|</),>-*%$@+.",
+".+@$&%=->,,']/<<<1|5cfffccccffffffffcdfiililoptwwyyAAAAAEEEHHIKMMNMMMMKIIKIIIIIHHHIKMMMNOPPPPPPPPOONMKHIIKIECBBwtuqquuuuqqqqqssuwwusuwyAABAAAAAAAAEIMNNNMMMKIEAzxwzzyyAEHEEEAzEKNOOOONMKKMMNOPONNOOMKKKMMMMNNOPPPPPOOOPOOONNMKKKIEEAywwtwwtpoifc993|</~),>*$#+. ",
+" .+#$%&->,')]]_1||79filiffffiiiiiiiiiiilllopttwwwyyyyyAEEEEEEEIKKMMKKKKIIHHHHHEEEEEHIKKKNOPOOPPOPPOONNKKKMKIHEEwtumqquuuuuuuqtswwwssstwyABBAAAAAABBEIMNNNNNMKIEAAyzAyyAEEEEECABHMNOOONMMMMMNOPONNONKIKKIKMMONOPPPPPOOOPOOONNMKMKIHEBAwtpttpoliffcc93|</~,-*$#+. ",
+" .+##&%*;>,')]_<1359dfifcfiilllliiiiiilloopwwwwwwwwyyAABBAAAABEIIKKKKKIIIHEHHGEBBACBEHEEIMNMNOOOOOOOOONNMNMKIHEAwtmqquuuutxxqmtwwwtssttwyAAAAAAAABBBEIMNNNNMMKHByzyAAAAEEEBBAACHKMNNNMMMNMMNOPOMNNMKIIKFKMNOOOPPPPOOOOOOOOONNMMMIHEBAwtpppplifcc99953|</~,-%$@. ",
+"..+#$&%*;>,')]_<|359900009dfiiiiiiiiiilooptwwwwwwwwwwyywwxxxzzAEEIKKKKIIIIHIIHEBAAzzCABEHKMKIKNNOOOOOOOOOONMKIIByuquuuomnpzyuqquuqmmmmstwyyyyABAAAAABEIMNNNMMKKHEywwwyyAABBBBBBHKMNNMKKNNMMOOOONNMKIKKKKMNOPPPPPPPPOOOOOOOONNNMMMIEAAwtpppplfc99553333|</~,>*$@.",
+"@@#$%&**-''')~(<}357527755799ccffffilloppttttwwttppttwtttutxxxABEEIIKIIIIIIKKIEEBAAAyAABHKMIHIIKMNNNOOOOPPONMKKEEzyyAtrnnrtzxuuuuqmmmmmmswwtwwAAAAAABEHKMNNNMKKKIEAwwyABAyyABEHIKMMMKKKMONNOOOONNMIJIKMMMNOPQQQPPQPPPONOOOOONNMMKIEAywtpppolif955||<<<</~~),>*%#",
+"#$%*;>>,,))!~](<|35772447777709cccfiiopptptttttptppppuwwwwwxwyyAEEEHHHIIHHIKKKHEEEEAABBBHMNMIIIIKMMMNOOOPPPPOMMIHEEGEytnlopxxuuxuqmmmmmmmsttuuwAAAAABEHHIKNNMMKKKIEAAABEBAyAEHIKMMKKKKKMNOOPOOOONKIIKMMNNNOPQQQQQPQPPOONNOOONNMMKIHAAwwpppplifc95||<</~),,>-*%$#",
+"+#%*>,,~~~~///<|2552243277777090ccgiloppopttttppppppptwyywwwwxxADBFFHHIIIHHIKKIEEEEABEEEHMONMKKIIKKKKNNNOPPPPOOMKEEHHEwprptxuuxzxqmmmmmmmssssstyAAABBEHHHIMNNMKIHHHEBABEEAAAEIKNMMMKKKMMMOPPOOOONKIIKMMNNNNOPQRQQQQPPOOMMNNONNNMKKIEAwwttppoifc953|</~),>-*%$#@+",
+".+@$=-,)~//<<11555575a7657509099cgfiooolopppppoloppptttwxttuuuuyAEEEEEHHHEEHIIIHEEEBEEEEHIMNMMKKKKIIIKKKNOPPPOOONIHEEEAtpptpuuxyxuqmmmmmmsssssswyABBABEHIIKNNNMKHEEEAwwAAywwAEMNONMKIKMNMNPQPOOPOKIIKMMMNMNOOPQQQQPPPONMKKMMONNNMMIHBywwttpolic953|</~),>-%$#+. ",
+" .@#$*->,!~]<149999909a888999ddcffilollloppooooopptttppprqpuuuuwDEFEEEEEEEGHIKIIIHHEHIIIIIMMMMMKKMKIIKKIKNPPPOOOOMKHEEBwtttpppptsuuqqmmmmpspssutwABEBAAEHIKMNNNMIEACAwwwwwwwyBINOONKIKMNNNOPPOOONMIIIIIKMMNNNOPQQQPPPONMMKKMNNNNMMKIEAywttpplic953|</~),>*%$#+. ",
+" .@#$%-->,)~/<|56596999cdccffggiilooliloppooloptttutpollqrqruquwAEBBDBDDABEIKMMKKKKIKKMMKMNNNMNNMMMKKKKMKMNOOOOOONNMIHAwwwwtpppppnuuqqmmmrssusttyABEEBAABHIKMNNNMHEEEBywwtttwAEMOOOKIIKMNOOPPPPONMKKIIHIMMNNOOPQQQPPOONMKKIKMNNNNMMKHEAwttppoif953|<//),>-%$#+. ",
+" +@#$%-;;'!](_||322565599gfffiiloppolllppplooptwwtpollllprprqquwABAAADDAABEIMNNNMMMKKMMNMNOONNNNNNNMKMMNNMOONMNNONOONMEwtwwwtpppnjnquuqmmsssupuwBCEEHHHAABHIKNNNMKIHHHEAwtuttwBINNMIIIIMNOOOPPPOMMMMIHGHIMNOOOPPPPPPOONMKIIIKMNNNMMKIEBywppooifc53|<//),>-%$#+. ",
+".+@#$*=;>,!](_<}}|346769099cfiiooppoilpttppoptwwtpplllooprrmqquyBADyDxxyAAEIMNNNNMMMKKMMKMNOONNNNNNMMMOOOOPPOMIIIMNONNKAwwwwupppnjhqqquqqssspuwACBBBEEHEAAEHKKNMMMKIIIIEypopptyEKKIEEHIINOOOOOPONMMMIGEEHKMOOOOOPPPPOONKKKIHIKNNNNMKKHEAwtpollic953<</~,>*%$#+. ",
+".+@#%=-;',](_<|:|||776599989fiilooliiotwtttptwwttpooooollqrqquuABADxtuxxzAEIMNNNNMKKKMMMIIMNNNNNNNNMNNNOOPPQPOKIEHKNNNMIEBwutwtqnhjjmqquwttpsvwzABAwwyABAABEIKMMMMKIHEHEBwtptwAEEEHEEEHIMNOONNPPNMMKIGCCEFKMNNOOOPPOONNMKKIIHKMNNMMKKIEAwtpollif993|</~)>-%$#@..",
+".+@#&=;>,)](_<1:}|4114700099filoolffiotttppttttppoopooolnqqvvuxABDxuuuxxxzGKMNNMNNMMKMMMHHKMKIIKKKMMKNNOOPQQQPNKGEEIKMMKKIBxuwxupjhemmqqwwwuvxwtwywtutxAAAABHKMKMMKKHEAABywptwAEHEEHHIIIKNOONNOONMKIHGCCBHIKKMNOOOOOOONMKKKIIIMNNNMMKKEAywpollifc953</~),-*%#@+.",
+".+@$&--')]((<<_1}|114770799cfilolfffiopttpppopoooopoolmllrvrruxEBzuxuutwwxBIMNMMMNNNMMMKEHKKKHEEHHIIIMNNOOPQQQOMHEEHHHIIKMKBywxxqnjhmmmqwwwwypsuwywtpqtwyAAAEIKKKMMMKEAAAtpptwAEEEEEIKMKMNOONNOONMKHEECCBGHIIKNNOOOOOONMMKKKIIKMNNMMMKHEAwtplliifc93|</~,>-%$#+.",
+".+#&%;;,]((<<:<||1114770770fioollffgkpppqppooigllooolikilrprruxEBwuxvstwwxzEKNNMKMMMNKIIEHKMKIHEHHHHEHKMNOPQQQPOKHHEEBAAHKMKGCAxuppnqqmmtwwwxtsmquuqmmmmwyyyAEIKKKMMMIEBxqoputyBBAABEKMMNOPONOPOONKIEEEBCGHHIIKMNNNOOOMMMKKKKKKMNNMMMKKEAywpoliifc953</~),-*$#+.",
+".@#&=;>,]((_::<|_114470770dflooiifcgmppppqpoiigglmolikjiimmnruwAAxussvvupptyHMNNMKKKKIIHHEIMMKIIIIHEABIKMOOPQPPONKEEEAtuwEIKKKHAutttxuquttxwqqqmquqqmmmmmwywwyEIMKMMMKIHAqmmuuAAAwxwAEIKNPPPOOPPONMIEGGECBHFFIIMNNNNNNMMKMKMMKKKNNNMMMKIEAytpliiifc93|/~),>*$#+.",
+"+@#&=->){((___<|__14770070cilpliggdflpppppplggggkoolikikjnmmqqwAAxsstunqqpptyEKNMMKIIIHEEEIMNMKIIIIEAAEIMOPPPPOOOMIHEAumotAEKMMHAwwyAAxwwuqqquuqlnnjmhmmmqwwwwyAIMMMMMKKEumlptABywttyAAHMOPPOOPPONKIJECCCEHIIIKKKKMMMMMMMMKKKMKKMONNMMKIHBywpoiiffc953|/),>*%#@.",
+"+#&&->'!{(((___|__1477770dgimoliiddglloppoigggggkkolikjkkmmnqqtwyzutvoonoppttyEIIKKKIIEEEBEKNMKKKKKIEABIMOPPPOOONMKKKHwolootAIMMHBAABAzAyqqqqnorooonjemmmqqwwwwuAIMMMMNMKApopwBEAwtttyyBINPOOOPPOMIIHGECCEGIIIKIKKKMMKMMMMKKKKKMMNONNMMKHEAytpoiffc953|<~),-%$@+",
+"+#&*->!{{(((__<_[_1}23246dklopmliddfiilllifc9agkkiollillknqpuuuwxxwunnoookkmqwABBAEHHIHIHHEIMMMKKIIIHEEIKOOPOOONNMKMMKEwpojipyIKKHEBCAyxuuunnlmmmmmkifjjqqpwywwquCIMKMNNMHytpwBIHAtttwyAEMOONNNONKHHHJGBBGEIIKIIIIIIIIMNNMMKKKMMMNOONMMKIHBAwpoiifc955|</),>*$#+",
+"+#%*>'!{{((::___[_1}34226bkmppoliddciiigifc9a8akmkkollllmprsuuuuxwzxrnnkkkkmmqtwywwyyEHHIIHKMMMMKIHHEEEIKMOOOOONMMMKMMKAwpiiipyGIIIHEAzxxrookkmmqqqmkgjjjqquAyywqwBIKMNONMHAwtBKMHytuwyyEINNKKMMMIJEEEGBCEHHHIIIIIIIIIKMNNNMMMNNNNOONNMMIHEAytplifc995|</),>*&#+",
+"@#%-''{{({](<:<__:<}3222adjouuqligd9fiddddd9aaakmkglolmomrqpuuuuuuyttqkkmmmmmmtwuqtutuAAEEEKMNMMKIHIHEEEIKKNOOONNMMMMMKIEApfhlpxzEIMICztppmkkfjiloppmkkjjquwAAAyuuyEHMNOONMIBAEMNKBttttwyHKKIKMMKJHEBEEECCEHHHHIIHHIIIKMNNNMNMOOOOOOONNMKIEBywpoifc9953|/~)>-%#+",
+"@$=;,){(~/]<:<:___:}422269iotwtmig9acgddgdd0788cmkgloooomqqqqsuvuswtwtmmmmkjmmuwuqmmppuwwyABIMMMMKIIHEEEIEIMNONNMMMNMMMKIIAoooopuyEMMJAwqqmjeecbcfopomkgjnwwwAAAuutABHMNOONKIHIMNNHwppptwEIIEHMMIHHEBCBCEEEEHEHIIHHHIIIKMNMMMNOOPOPOOONNKIEEAwtolicc953|<~),;*$@",
+"#&=>,!~(](/(:<::__<}211179iotxwpmg9a0ggggfd07a8cmkggoooooqrmqquurrtpwtuqmmmmhjuwwuqmmmutuwwxCIKKKKIIEEEEEEIIMKKKIKKMNNMKKKIAttpmmpwHIKHzuomiec9abbfiolkggluuuwyAAtuuyAHMOONMKKKKMMHypqptwEIEEEMNIEBEEAABEGEBEHHIHHHHIIIIIKMMMNNOPPPPOOONMIHEBywpolfc955|</),-*$@",
+"#%->))~(]//<</<(::}|111147fmtyywqkc90dgfgd0077ackkgglopppqqrqquuqvnrtqpupqijloptwwuqqqqwwwwyzEEEJHHHHBBEEBHKKIHHEBEKNNNMMMKIEBwummpwBHIEApmkifba88beinikglnqquwyAwuuutyEMNNNKKKMMMIBtomqtEIEEEMMIEABEBzAEHEBBHHIIHHIIFIHHIKMMMNOPPPPPOOOMKHEEBytpolfc953|<~)>;&#",
+"%*;,){/]/</_<<<(_:}1|11147dltwzAwnfd0dggca00009dfmkhnlppppurquuussopqmmquppppptyAwtxuuuuuAAAAEEBCBBEEEBBAABIIHEBAAAEKNNMMMMMKMHAtmpmuACHEwpmlgcaaa89fiokkkoqqqwyABwuqptzHMNNKKMNNNKHypmmtAIEEEKIECAABBAABHHEBEIFHIIIKIIFFHKMMMMMOPPPOPOOMKHEEBAwtplifc995|<~,>*%",
+"*;,)~((/::<<<<<_::11211147dipwAAztlgdddccca0008aemkklooputxussuuuuorpkmmqoppptwyAyttpuuuxxxxCEEEBBAABBBAAwAEHEywwwyAEKMMMMMMMNMIBwqmoptAEEyolifca668ciilmmonqqwyAAyxuoptzIKMMMMNONMKBwqotAIEEEHEEEBABBBADEIHEEIIIIIKKKKIIIKKMMKKMNOOOOPONKHEBBAwtpoifc9953|<~)>*",
+"-,)~/_|<||||1__<}|2|4411470gmtyCBypkgbdfgfdd008bbmmkkonpptywwttusuvookkmmlnoopptwwprolluutuuzEHEEEAzAwtwwwwBHEypppptwBHIIMKKMNNNKGzpooptAEBwpiif9a6aceiinqpnuuxAAAByxtopxEIKMMMNOONMIAwqtyHHEBEEEEEBABEEEHIIHEHKKIIKKMKKIIKKKMKKKMNNOOOOOMIEEAywwtoigc9953|</),-",
+";>)~/(_||||1||__}|14434}470dkpyzEAzulfhffffgdddabmmmkkorppwyyxwuustprmmmmiikillmptplnjinqqqquAEEBEAwwwptttwAIHAtlilptwyAEIKKMNOONKEwpoolpyEEyplifd866fiioqqpxzAEEEByxwppuAEIMNNNOOONKHAttyHHHBEEEEEByAAEHHIKIHHIIIIKKKKKFIIKKMKKKKKMNOOPONKIEAyywtplid995||/~)>-",
+"*-,)~/_<|}|||<__:<|2442}}470dlpwABAAtoifcffggdhbbkmmmkgoopuxyzywwuuppummmeefefgkopmkijhijijquyBAAywttuuuppowHIAwpliloppptBEIIMNONMIBwpiiiowEEAtliff98biilotwwAEIKIHEAywptyBEKNNNOOOOMKEywAIKIEHEEEEAAyAEEIIKKKIIIIIIFFKIIHIIIKMMKKKKMNOOPOMKEEyywtpoifc0531</!'*",
+"=-,!~/__|||___(__:_1442}}2770diqtyAzytplffcgggifkkmmmkklmoptwyAAAyxtttmmkkehbhgkmpplkgheehjjnpwwwwwqquppollpAEBytoliloliitABBIMNNMKIBtoifipyEEApliifeciijotwAEHIKKKIBAytwyBEIMNOOOOONNKHBEKKIEHIHHBAAyAAEHKKKMKIIHIHHIFIHHHHFIKMMLIKKMNOOOOMIHByywtplif9771<({'=",
+"=>,!~/<_|}|___<_<:_<1422}}2770cilpuxwwwtplifggikmmmmomkoloouuwAABAAAwtmkkkbbbcdgmtplggddeijjnpwwvttqmoollllltABAwpoiillfflttyBIKMMKIEAtoffipyEEypliiifiiilpwBIKKKKKKIECwwAEEHKNOOOONNNNKEHKMKEIIHEEBAyyAAEHIIKMIHEEEHIIFFHHHIIKMMKKIKMNOOOONKIHByytpolic054|(~';",
+"=;,)~/_<|}|<1<<__((<14222227770bhkmoptttupolkgjimmqqqqmkllmmppwAABBBwupkkkbbbbdglpumgddddgkknpxzwwwqlolnlifipyAAAwpolllifioopyBHIKKIEAwpicccmwBBxpllliillootBIMMKKKKHHEAyABEEHKOPPONNNNNIIKMMHEHHEEBAywwyAEIIIKKHFEFFEIIFHIIKKMNNMKIKMNNOOOOMKIHBAwtpolid571_/';",
+"=;,~/<<||||11<|__::_1}222227777abdgekloptttpqmlimmqpqqqknnnorppwyAABwtpkkkkbbb0glppmgdddggmmmuwAAywtolnllecclwAAAywpoopoiiiiltyABHHHEEAtof57dipyypoiiillllotzHMNKKKKKKEEABBBEEINPPPONONNMIKMKEBEEBBAwwtttwAHIIKKHBBEEEFIIIIIMMOONMMKIKMNOOOONMKHHBAytpoifc96}_!;",
+";'!~/<<|||21|1|__:___}}22227777880888bfioopputpoqmmmpqqmomnnrppuwyAzAtpmkgkhcb0dkoqmgdddgkmmmqtAAyywooooif98fotyywwtpopplifciowwtwBEEEByti0730gmutpiiiillilotCKMKIIIKIIEEBBAABEKOPPONMNNMIKKEEDAABAywttpptyEIIIKHEABAFGHIIIKKNOONNNMKKKMNOOOONMIHBAAytpoif952_!-",
+";')~/<|1||3114|<1:[_[1}12267000a0aaa66aadfloqutttppommmmprnoopqpwxwyywtpkkkfehddkmqmggggkkkkkmqtwwwpolollic89ilotwwwtqptpoiccippoptyBEBAxqf5347dltwoiiiiliifowEKKHEAEEHHEEAyyAAHMOPONKKIIIIIEBAAyABAwtuuqutAIIIKIHBAzACFHIIKKNNOOOOONKKMOOPOOONMIHBAywtpoif97:);",
+";'~/<1|1453442|11::___:[}227000bdaaaaaa6a8cfkmutwxtuqmmmqprnnopptwxxzzwtmmmmheedgmpmkbcfffbbbeipttopllillif99fcipyywtpopmpof9flpoilpwABAAuld3||7dlutoiiiififioyEIJAwwABEHEBywwwAINOPNIEHHHIIEAyAyABAwqprpptyEIIIIHECzAABEGHIKMNNOOOOOONNOPPPPOONKIHBAywttlif5}{'",
+"'!~<<|347555333311:___1:[}47770008a6aaa66a0adglowwyxuupmpppronpppwxxwywwtmmqjjedgmoojeeehbbbbhfoooooljfiiifccddcowywpilommplccilliilptAAAyuid7|47dmwtoiifffbilwAEEAtppxAEEEAwpwAHKOOOMHCBEIIIBAwwAEEwqmprptwEHHHJHHBzzzzABEEIKNOOOOOPPPONOOOOOONMKIEEAywtpol92[,",
+"!~(||355055957|211}}__1}[}447787066aaaa8668a0degmuwwxwwuttppqrqppwwwxxywwqqpllidgkmpjffhfb9bhbfiopooofccffcb50ccitAypiglllppiffiiifilptyAAytmf0770itzwpliiifcipwBEypolqtwBHEwppyEKNOONKBABHIIEyywxAEwumpqqtwAEHHEHHECzzzzzCCGKNOONNOPPQPONOOOOOONMKIEEAywtpof7}!",
+"~/1435990999577314}}1111}44247a76222666a6868ddbkkmquuwwwywttpprrqxxxzxwtwpqqqonggkmqljfeea8bbb8elponifccccc770dcfpywoffiiklpoliififiioqtyAAzwpmd77dmwAwmgiiiffotAAwtoiilpyEIBtotAIMOONMHyABEHHAtwwyBytqppruwAEHHHHHHECzzzzzCCGKNONNNNOOOONONOOOONNMKHEBAAwtpi93:",
+"~<|7599cddcc099544}22114244477776}22226a66a8ddekkkkmmquwAzywwupqqwwxzyxttwuutlliggmqoiiheb8ba88clpoolibcccc5750dfltwofdfifimpppliffiiimptwAAAyulc0dkuAAwoimoilotwwtplifcipAEIAtpyHKNOONKBwyzEEBxwwwAxwutrpptyEHIIHHHHECCACzCCBHMNNNMKKKMNOONOOONONNMKIEBAywplc|:",
+"]<|5559ccdfcc9a90772244444477776622222226268ddekkkkkkmmqwAAAywttpwwxzzzytwquuojigkmooljieb8a888ciopoli999cc95|399fowpf9cfdglotwticcfffgouwABEEBwpifipwAAwpppqppwyytpplffeioyHIAttBIMNONNIywAAEAzxtuwwwuwsrpuwBEIIHEEEEGBCCCAABEIMNNMIIHHIKNNNOOONNNMKKHEBywpid3]",
+":|35099dfdgbc0d9975224477777787a2222[}22622a00bkkkkkkkmmtwyAAAywtwwvxzzzwuwqtuljkkmmoliifb678889fopliic88c097||59clwwofcfccilqwwofcfiiiotAAEEHHEApliipwAAyttttpwAytpppliccipAIIytyHMNOONMEwyAEBAwwwzwxuytprptyBEHIEEEEEEBAAzAABHKMNKHHHEEGIMNNONNMNMMKKIEBypli5:",
+"}6599ccfffgfc0dd9706657777777776222}1}16666800bkkkkkkkmmpputAAAAyAwwxzzyytuquuoojkmmooiihc666888elpllic9999951|45clwywpif99cgipwwlfiopootyAABEHHEwpiiiowAAytututyytolopoiiiltHKHzwEKNOOONKAwAEEAyyAzwtuwwtrrpwABEEEEEEHEBAzAzABEEMOMIEEEBGGKMNONNMKKKKIHHEAwpic4",
+"|609cgiiiliiecdd0000675777708066266}2226a66800bkkkkkkkmmqpuqwwAAABAzzxywyttqquppoklmqoljheaa68aabjplllic99055|||5fotyAwoi9599glwBypopppoptwyyAEEEAtmifglwAAtpqptwAwlcfiooifflwIIEABKNOOOONIAABEEwyyAwuuwywpppswzAEEEBEEHEAzyzzAAEKNNKEFEBCCIKMNNNMMKKKHHEEAtoib5",
+"_}599fgiklliifgd9c006665500cb0aa6a4242228aa8dehkkkkkkkkprqrsstwyACBAAzzvxxttquxppmmoppojifb666aabfolloic99575|1|5iptyAtoic509clwEEypoppplotwwyAEEAwplf99itzypompwAwofcfqoliffoAIIEAHNOOOPOMHABHHBvxwuuutxwtppptwwAEEEBEHECyyvwwzBHMMMIEECCCHIKMMNNMMKIIIHBAwpi81",
+"_|290cggiiiiifdcdc90d0899bcfdgc9807a666a8a8bghemkkkkkkkrrrqpuuutwBEEEEAzvxtwquxttpmppppniee866a88elllllf997553115iptwAtliiccfilpAEAwpoppootwAAABEBAyulf99iwzwpllpyAtf9ioolkdfipAEByBKOOPPPOMHBHKHytwtuquttwtqqtwwyAEEBBEHEAytwwyAEIIKIEECCGIIKMMMMMMMMIIHEAwpj82",
+"}478dcggfiiiifdchd00d09cdfffggeff9b99999fccfhjmmmmmmkkkprrrpruptyAAGEHEzxwttquutttqqttpojfeb668a8ciillif885553335fpwABApoooliigipyAAtooppopyEEEEBEBAwpf979iuxulgipyti9ciolffcdipABAwENOOPPONMIHKKBwppuqqutuqmmpswwyBBEBEEHEwxwwwyzABHHEEEEHKMNNMMMMMKKKIEEAwpj9}",
+"[458ccfgiiiliifhfffdggcfffiigffffcc9dcccffhimnqqmmmmmmprqrrrrrqqwvzCGIIECzwttquupttttxwplfehb6a88bfllliic885557339lwABEAwwtoic9fotwwwpoppptAHIEBAAAzwpg5413guuogditwlc9cillfc0cipyAyAINOOPOONKIKKIAtppopttupqmmqqwyABDBBEHEzxxwyuxzAAEEEHHIKNOONMMMMKKIIHHBwpj8}",
+"[659cffiiilllikiiiigkkfffiiigc9cc8956aa9bfgimouuqqqqmmpprpprrrrrxxzzBIKHGAzttqqupptuwwwtnifhbb6a8aclloiic9959994}6ftwAEIHAticccfloppxwtpptwyEHEyxwwwwpk0|<_4gqpicfpwticcktttld9dltAAAEKNOOOONMKIKIEwttppppptqmmmquuyABABEEEByxxzuxyzzAABHHIIMNONNNNNMKKKHHBwulb}",
+"}6addfgiillolllmlilikikffffdd96622|2327689ahknqquuuuqttutrrrrprtvwxzAEIHHEAttuqquppuxAzypjfhbbb888bioollfc909954[3cpwAHKHyof9cccfilotAAtpwwwAEEAwwpppqmd4_/<9kqofcmyApifoAAAwof9iqwBAAHMOOOONMKIHKHAwuttttttpolmquuuwABAABEEAywsuxxyxwAAFEGHKMNNNOONNMKKKIEAtqc6",
+"669ddfiilmmpooollilffffg9bc0d056}}:}[}2}a68dhhmnmqpswwwwtttuprrvvxxAEDEEGGEBwtmqqopstABCyoifbbbb88bfllollfcfd95333cpAEIHBtlfccc9ciiopyAAwtttwBEEAwpoomif5|<_49mqkfiwytiipAAAAtlfcfpwBABKNOOONMKIHIIBwwwtutwwwtooouttuxBBABEEEAuuuuxzxuyyyCBGKKMNNOOONNMKIIEAtqh6",
+"6abfiikllmpqppomlmiigffgf9906622}}[[::[}66addbkmmmmtttxvwwwttuwvvxxzBFEEBCEEAwqmqqnotyEIEwmhbbbb888cipopoiff995756cpEHEytpliif959clpptAEAwttyEEEAwpmkmmg93<<<|9mmgfmwwoiotwttwplccfqyAyBKNOOONKHHHIHAwtpttwyywttppttuxAEEEEEEExxxxxzzxywwAzCEIKMNNNNNNMKIIHEzrk8",
+"6bhilllomppppppmllilgggig997a222}}}_[[:[22adbbkkkkrrquttwwwwvyxvxxyDBEFEBzCEAAwqqqooptBIICtlgbbaba8biooptofcb90799ftEEypopplifc55cloptyEHyttyBEywpoomlmld7|_((|dolcfqupllliilptpicfipyyyEMOOONKIEEHIEwtppptwwwwwwyywwyzEEEEEHBAzxxxzzyxywAAzCHIMMNMNNMMKKIHEzxk8",
+"8bjilooopppppppmloiifgkkica76222}}2}}[[[2280bkkkrrqrrrrpttwwzzzyzxzDDEFEEzzAEBAuqqqoppxEKHymkggbdb88fltttof990900flwBAtiiopoifc569iotwwEIEwtwyAtpooomopplc51_(/3goicippliiiflpttpfciowAyAIMOOOMIBABIIBwoilpttttyAEEBAACEIHHEHBBAxwyzzAyAyAzzCFIKMMKMMMMMMMIHBxnd",
+"dhinommppqppprrmloiigggkkf00a222}}22}}[22280bkkppprrrrvqrqvxzAACzAEEFEEFDzzzAAByuqqnprtAHIBtmgggbbb8cltwtpiccc90cipwywpfcippifc959fopwwAHKBwtwwplmllmoptpod7|</|9kmggoolllllpwwwtoiflpAAyEKNOONKEyyEIIApiiipppwABIKIIEHIIIHEHEEAzxwwyAADAAzCCEHLKMIKKKKMKKKHBAqe",
+"eklopopppqtppprmmoiiiggike006222}}}}[[[22280bkhrprppqvvvtvwvwwzzCEFHHHEDDzzwzwAByxuqoptwEIHzqkgggbhhbjtwtoieccc9ipttppof9copifd9999iptwwBKIBywytoiikikotttpg93147gmmklmklppopwwwwplfipwBBBKMOOONIywyEIHwlfflptwyBHKMMMMMMMKIIGGEAxuxxzzEBBCCCEHKLKIIKKKKKKKHEAqm",
+"enmpupptttutpprommokiggggc006222[}[:[[:22800bkrrrrrprtuvvvvvxvzzBHIHILHFBzxzzyxAAAxuqoptAHIExqkgggbejiptpoliccdflttpllic99lpoifcc95clpppwBEHEEEBwooliilptttpi000ddkoomikottpptwwwtoiiowBEEHKNOOOKBwtyEHAoffipwyyABEIIKMNNNONKIIHCAxxxwyBBACCzEFHKIHIIKIKKKKFGCwm",
+"mnmuttttuuuutppomoollgggg800a222[[[[[[[2260bbkrqrrrrvvvwxvvsvxxzDEHIMMKHFDyzwytxAAAxuuptwBIIEwpggggfjilppoolfdfiottofccc99ipplfff969ffiilpyEHHHEEyttpopttuttpiddkkkqpqoilptttpopttpiiowEEHEIMOOONIAwtyBBtlffltywtttwAEIKNOPOMMKKIEzxxxxxABECCFFJLHHHIKKKKKKKHBws",
+"sqquwwwtuxxwtsppqqrmllggg807a222:[[[[}222a0bkkrrrrrttvvvvsvxxxyADEHIMMMIHDzxvwxuwxAzzxupwAHIHAtnggkmlefllppoifiotwtoc99955clppiiic579cfcfiotABAABAywtwtwwxywuuoilpmmquupoqtttlfcippllpwBEHEEKNOOOMHyttyBypieipwwtoolpwCHINOPNMMMMKEzzwxwAAEEGFHHKHHHIKKKKKMMICzs",
+"squuxyyyxxxxtwtpqqrlmjggg8006222[[[}}}2268dbkkrrrrvvvvvwvvxxxxzDFEHKKMMKIFCxxxwttwxzzyxtxyBIIEypnjkmlebciopplilpwwtof965335fppliif929d9c99gipttptwwttttpwyyAzyxppupmquxtpptwwpf99fopptwyBEEBEKNOOOMEwttyAwpliotwpoiiitABEKOPOMMMMMIEEBAxDAEEHIKKKIIIIKKKKKKMKHCv",
+"vwuzyzAyzxzzxwssqrqjjjgggbb06222}}}}}26680dbkkqrpvvwvvvxxxxxxzDFFHLLLLKKIIHzzxxsutqxAzyxxyBHKKBtonmmlcc9flpppppttpolf9555439lplfff950cd9599fiopolottppoiltxzAAzywxwuquxxtpuwwwoc99itwwwtyEEBAEKNOOOKAtptwAytpptwtlliiptwyBKNNMKKKMMIHHEBEBHHIKMMKKKKKKKMMKKLKFCz",
+"vzzzCzCBAyAzAywuuqqjlngggab066222[[[[22280bbkrrrvvvvvzxxxxxzzDDFHLLKNMLKIIHBzxwxstuuxzzyxxzCIKIBtrmmibb8cippttpppoili95553|5folc9c9999c0735cfkloilpptplffipwzzAzyyywttxAwttwywtlfcityywttAEEyyBKNPONHwpopwAAwttwpliiioppuwEKMKIIKKMMIHHEHEHHIKMNNMMMMMMMMMMNLKFz",
+"zACBCCCCEBAACAvtqrqmnngggbb06a2222[}222280bkkrrvvvvvxxxxvzAzDDFHHLLMNMLKIFHECzwvsttwuxzAzxzAEIKHBtqmibc68foottpppliiic99993|9lof999550d0||2559ciiilptpplfcitxyyxwywyyyzBCAwyAywtolowAAywtyEEAtwEMOPOMEtoopwAywwtollinllopwAINKIIIKMMKIHHIHIIIKMNNNNNNMMMNNOONMFF",
+"FCCBEGEGHECBCAwtuvrnmlnggga00622226666a8ddhkkrvvvvvwxxvzzzADDFFHLLMNNNLLHFFFCCzwwsttwuxzAzzAEIKKJApmhbc68cioptppoifiiic999539iplfc963595}:(<437giilotwtpmccmtwxwwyyAAAACIIEABBAwtpwABBAAAAEEEtotHNOPOMBtoopwAAwwpooliiilmtAIMNKKKKMMKIEEIIHIIKMNOONNNNNNOOOOONKF",
+"FGGEGHHHHHEEGADwuvvnnnmgggb00a866688888bgghmpuvwxvvxxxzzzCDDFFHLLLLNNNKLHHFFBCzAtssstuwxAAAACIKKKEymhbb889flppppoicfilic9cc9cippoic65552}_~/137flpptwAywpiccotttwwwyywtyCGEAAEEBytyAEEEEEEEHHAolwINOONKwpoopwABAwtpliihilpBKMNNKIIIIIHEBBHEHHIMNNONNNNNNOOPPPOLI",
+"IFEIIIIIIIIGGDDxxsvnonnkkkbeddc9bbcbbchekjqqttzzyzyzzzzADDEFEHLLLNNONNMLKHFFzzAAwusmmmquABBEEKKMMHAqjbb9889iptpppiccioplifffilptwpf973}32<<<39cflppptttpoi95cmputppppplpxBCywyBBytwBEHIKKKIIIHwllwINOONIwpoptwyBBwtoiceenpAHMNOMHEABEEAzxAAEBGHKNNNNMMNMOOPPOONL",
+"LIIJLKKIKILHHDDxxturprrkknmhggfiffchcffkkjqqwzAzAACCBCBFFFFFHHLKMNNONNMLLHDzzyzwwwqmmmmquABBEHMNNKEwocb8987cotppplfcfotwtooollotwtlc9525553355999fiiiiiiif9539loplllolffotAwpotwtllwBEIMNNMMMKEploAKNOOMHwpppptwyywtlf8eeoxEKMNMHAzAEEAxuyyzACEIKMMMMMMMNOOPPOOL",
+"LLKKKKMKKLKJJDAyxuvpqqummqqlokkifbbbeeggjiqqtyyyAzCCBHFHHFFIILKLLNOOONNLLFDxzvstwuqqmmmqqyABBEKNNMEzpib9b830iopptpliiltABytpollpwywoifcc995|<||<<|7555559553||0klliikkc7cmtxtliii99fpAEKMNNNNNMEppwHKNONMHytpoppptwwplfifltAHKMNKBzABCAxqwwzACCIMNNMMMMMOOOPPPOO",
+"OLMMMMMMMLKIJBAyxtvqutuquutuomkhfebdbbgghmmppwwxyzzzEFFFIIKKMMLNNOOOONNLHFzxvvqtquuqqmmmqqyABEHMNMHAwof89875ciopptpooopyEAtppoopwAAypif553|/)))'))/|||||444|<<|dilmiiig79guxtpifc5|3cpAEIMNMMNNKBwtAIKNNNKHBwpppmlpwytpniopyBIKNMHBzABBxutwxACGIKNNMMMMMNNOOOPPO",
+"ONNMNMNNMMJIEDDzxvvtuwwuuuuunokkhebbbddehmmqwwvwzzzzEFFFFKKMMMOOOOPPONLKHDzxvrrsmqquqqmmmqwyABEIMMICyplc99575floppppoootwytpptttwyAypf93|_/),>>>->!<1<(_||||/~/4cilkggiddfoxAtpic7||3fpAEIKMMKMKIAwyHKMNMMKIBAywoilpwwwtpotAHKKNNKHBABBAxwuwACEIKKMMKKKMNNNOOPPO",
+"OOLNNNNNLKIIEDDzxxwtwwwuuqqqqnigggggggeemmrrvvvwxxzzDFFFIIMMMNOOOPPPONLHFDzvvprmmmqquuqmmmqwyAIIKKIBypof997735illooliiiloptpptttppwwof5|(~~),>>-=='!<_{)///~~,,{3gklkgiigfotyytpi95335fpwBIKIIKKIBwyEKMNMMKKIIHEyplloptwywyBKNNNNNKIEEEEzuwwzCGGKKKKIIIMLMNOOPPP",
+"POOOOOOMMJIJEEDzzwywwwwqqqmmmjhjhggggiijmmtsvvvvzzzDDFFHHLLMMOOOOQQQOOLIFCzvpsmmmmmjnuuqmmmtwAHHIHEEztpic99542cllopoiiiiilpppppollptof3<())))'>;=&*>~<~,)~~)),>,~5ilkiliiiopuyywpf95599kowEIIHHIIEwwAIKMNNMKIKMMIAtolllpwAyEKNNMNNMKKIKIEzAwwCBEHIKKKIILLLMNOPPP",
+"POOOOOONKLLHFFDzzyAwwttmmmmmmmeeedgghjjmmsswxyzzzzzEFHFIIKMMOOOOQQQPONLIEzzvppmmmmejjnruqmmtuyBHIEHEBwpofc95439iopttpolliiopolliffilli5|~),,'-*==%%;~11(~//~)~),)<floqommlmppxAAwic9cc9fipAIIIHIIHytwBIKMMMKIKMNNKEypllnptwEKNONMNMKKKMMKHEAyCCCEIKKKKKLMMMNOPPQ",
+"PPOOOONNLLLHFDFzzyzuutummmmmmmmehheeeemmmsuxwwyzzzBFFFIIMMMNOOOPQQQPOMMFHzwvsmmmmeeejjnruqmmtxAEIEEBBAtplfc5313clptwwtpolilllifffcffloc|/);-;*%=-*-,/|3</<<<<<<~)/5iopupomooquAAwpfccc959itEKKIIIIBtpwEIKIIKIIKNNNNKAtpllopAHMOONNNIHIKMNMIHEEEGCEIFKKKMMMLOOPQR",
+"QPPPOONNLLHFFFCzzAzssssmmmmmmmmmeeeeemmmssvvvwxzzzFFFIIMMMMOOOOPQQQPOMKKECAtummmjjjjhjjouuqquwAEIEBABBywplf00725fotwywtollliliffiifcfol9<)>;**=-,)),)~<<~~/<<<|<))<5fluqqoommuxAyticcf9335itEKIIKKIAttyHIHHHHHIKMNOOMBwoliowBHKOOOOMIHIIMNMKIHIIHHIKKKKMMMNOOPQR",
+"RQPPOONLLLIFFFECCyvtsrrmmmmmmrmmmmmmmmmpssvvvvvzzAEFFIILLLMOOOPPPPQOOLKFECAwwqqjjjjjjjjnpxuqqwyBHEEEEEEAtpic0975cipwwwtplililllllif99flf3~,>***-,),-*-)~~),)~~~~)>)<3clqqmmikmtyytlfffc5|39lAIIIIKKIAtwEIIHEEEEHKMOONMEwpoptABEMNOOOKHIHIMMIIHKMMKKMMMMNNNNOPPQR",
+"RQQOOONLLIFFFGCzyxvsrrrmmmmmmmrmmmmmmmmrrvvvwvzzzzFFFIKKKLOOOOPPQPPOOLIFCAzwuqqjjjggggjjnuuuqwyAEBCBBEEAytof009669ipttplifiioloolid3}5fi9/)>*&*-->*#@#*>,>-->,',,>>)/|dlqqmkggmtxuiccffc559itEIIIIKKHytyEIIHHHHEHKMNNMIEywwyBEEIKMNMKIHIIKMKIHHMMMMOOOOPPPPPQQQR",
+"RQPOOOMLLIFHFECzvvvssssmmmmmmmssmmmmmsssvvvvvxzzzCFFIILLLMOOOPPPQPPOMMFFzyzxuuljjggggggjjjuuuqwABEAAyABAwtpi0097269lppoifffiliilii93:<5ff|~,-=***%#+.+@%--*%-),,,---,{|foqqmkgkqtul959fif99fpEKKKKKKKEwwBEIIIKKIHHIKKMMKEBEBEIKIMKKKKIHEIIKKIHHKMMMNOOPQQQQQQQRR",
+"RQOOOOLLLKFFEzzxvvvssssmmmmmmmssssssssssvvvvvvzzzCFFILLLLOOOOPPPQPOOLLFFzvstqqllkgggddgdehquuuwyAAxzyyzAwwplf777225foolifffifccili93::|9ic|{>-%%%$+.  .@%-*%*,),,>-%*>~3gquqmmikuupc3|3cg95coAIMMIKKKIEABEIIIKKKHEBEHIKMIEHEIMNMNNKKIHEEEHIKIEEEKKKIKNOOPQQPQQQR",
+"RQOOOOLLKFIHBzzvvvvsrrrmmmmmmmrrrrrrrrrrrvvvvvzzzCDFHLLLMNNOOPPQQPONLLFDzvspmmjjkkggddddhehqquuyAyuxzwxywwpoi9576329ioliffffc99cfi953}<3fl9<,>%#$#+.   .#**%%-)),,>%$*,_0kqqqmkkqupi1(/|0c59itEKMKIIIHHEEIIIIHIIHBwwAAEIHEEEKNNNOOONMKHEBEIKIGEAAHEGHFKMMOOOPPQR",
+"RQPOONMLKKIHzzvvvvsssrrmmmmmmmmrrrrrrrrrrvvvvvzzzCDFHLLLNNNOPPPQQPONLHFCzvrrmmjjkkkggddddeejquuuAyuuxwwyAwwpof950059iooifcifd098b0c955|<5ff3~>*###@+....@%*%%%>,,,,-%%-)_cmquqmkkuuo9<)~|9550iwEKKIIIHHEEIIKIHEEEBwwAwABEBBEIKKMOOOOONKHEEHKMIBBAEEEGEFKMNOOPPPR",
+"RPPOONMMKKHEzzvvvsssssrmmmmmmmmmrrrrrrrrrrvvvvxxzDDFHLLMNNOOPPQQQPONLHFCzvrmmmedggkkkggddeeemquxxAxqutwwywwpolf00cdcciiiccffc988799dc9|(/|99<,-%#@@#@+++@$**%%*>>,,,-%*>~3gmqumkkmuul3/!/35379iwEIIHEEEBBEHIHEEBBBAAAAyAAAAAABEHMNOOOONKIHIKNNKEHEIIIHKMNNOOOPPQ",
+"QPPOOMNNKLFEzzvvvsssssrmmmmmmmmmhrrrrrrrrrvvvvxxzDDFHLLMNNOPPPQQQPONLHFzzvrmmeeddggffkggddeemmuxyxwqqxtwwywwpoif99cd999cccfff99599ccc9|(!)|95/>*$@#$$##@#$*-*%%*->>,,>->)/0kmqqkgluuuf1!)_7||39lAHHEEAwwtyABEBAyAAAABBywyyAywAABEKNNNNMKIIIIMONMKKIKKIIMMNNOOOPP",
+"PPPOONNNMFFCzzvvssssssmmmmmhhmmmmmrrrrrrrrrvvvxxzDDFHLLNNOOPPQQQPPONLHFzzvrmmeeddddbhhkgggeeemqtAyutqqpwxzwwpoif9500d079cffiicc99955553_),~393)-%##%*--%%%->>-%%*->>)~)>,~|fmqumkkquxm7{)(3|<13ctBEEByppttwyyytolpwyAAwtppwwwyAAAEKKKKKHEEEEHKMKHHHIIEEHIKKMMNOP",
+"PPPPONNMKIFCzxvvssssmmmmmmmmmmmmmmmmrrrrrrrvvvxxzDFHLLMNNOPPPQQQPPONLHDzzvrmmeeddddbbbgkkgjeemmuzAuqmqupwxwwwpif9569d0779fillif992||333|/),~39|,-%%*>,>-**>)),-%%*->)/~,,)/7imuqkmmuxug<){|3<_19mAEEEypoptwtttpidfltyAwpoioppttwwAHIHHHBAAAyBEHEzyAAEBCCEEFIKLNO",
+"PPPPPONMKHHzzvvxsssmmmmmmmmmmmmmmmmmmmrrrrqvvvxxzDFHLLNNOOPPQQQQPPONLHDzzvrmmeedddd88bbgkkgjeemqwzxqtmquttwwwwofc645d07|5coppof92|:::|||<~,,~35<,-->,>>-*%-,~~,-%%*->)~,>,~<cmquqmmuuuo7{~<4|_(1cwEECAtllptpppplg9fpyytpoilllomptxBHHEGByyyzAEEEzxuyzBzzzEFFILNO",
+"OOOPOONMKFFzzyvtussmmmmmmmmmmhmhmmmmmmmrrrrvvvxxzDFHLLNNOOPPQQQQPPNNLHDzzvrmmmeeddd888dggkkjjjmquzzuqsmqptuwywtlfaaa507479lttoi93}:_//<||<~',/33/,,,,-*%$#$*)(~,-%%*->),->)~3gquqmqqtuqc_~{|4<~/5lAEEByoilpppppoicclwAwtollloomrqqwBBABAwswwyAEEBxuwwyAzzzEFFLLO",
+"OOOOOONMKHECzAyttsmmmmmmmmmmmkkkkkkhmmmmrrrrvvxxzDFHLLNOOPPQQQQQPONMLHDzzvrrmmeedddd88dddgknjjjquxxxuqmmqptuwwwpic8a634439iptof9221<<//<<|/~))/||/~~,*#@@@+#*)(~,*%%--,>**,)(9kuqmmqpuuo7/(<|1{{<5pBEBAtiiotpopppi9ftAAytoolooqqmqtyyyAAtpsttwABAyuqtxzzzzCEHILM",
+"ONNOOONMLIGCzzztusmmmmmmmmmhmkkkkkkkkhmmrrrruvxvzDFHLLNOOPPQQQQQPONMLHDzzvrrmmeeddddddddddgjjjjquxuuuqmmquutxwwtpica666859cilof959553<(//<<<~))/|33<)*#+....+*~//,-%*->,-*>)~|fqumopuuuuk3_/<|/){_fyBCBypfgoolopqoifowBAwppqppttppwAywwyupoooqtAAwxuqtwxwzADFFIL",
+"LLNNOONMKFGCCzAttsmmmmmmhmmkeebbbkkkkkkmmrrrvvxxzDFHLMNOPPQQQQQQPONMLHDzzvrrmmeeeddddddddddjjjlouxuquuqmmqotuxwwtpfa6aa9cc99ciic9cff93|(~~/</~)~<353~-#.  ...@-~//,*%*-,>--,)(9kqqomquuuqc|((__~)<5oABCAwmcfigkooppllpyEAwwttuuwwyAywtwytlinllpxywxuqtxzwwzCBFFL",
+"LLNNOONMKIGCCAztutmmmmmmhmmeebbbbbbkkkkhmrrrvvxxzDFEJKMNPPPQQQQPPONMLHFCzvrrmmmeeddddddddddeejnopxuqquuqmmqptuxwttofc9ccc9575cffffiic731/))~~/~/<|59<-$@.  ...#>~<~,**->,,->,~|gmqmmquuuuk5<~/_({(5fpABAAtg9ccglmptpoouAABByyyyAEEAAwtwAwojjiiouwwsuqrtwxwxzABFI",
+"ILLNNNNMLFGCCzztttmmmmmeeeeeebbbbbbbkkkkkrrrvvvxzDEJJMMNPPPPQQQPPONMLHFzzvvrrmmeeeddddddddeeeejoptuqqqqqqmquutuwwttplie98655379cfilic541<~),,)~<<<39|,%#@..  .+%,~/~--*>,,>>>!/9kqqmmtuuuqc|/~///(49iwAAAypc90dioppwpolpwEEEEEBEHEBAytwAyplliinuwxtpqqttyxxzzAFF",
+"FILMNNMKFIHCCAzuttmmmmeeeeeeebbbbbbbbkkkkkrrvvxxDDEJJMMNPPPPPPQPPONMLHFDzvvrrmmmeeeedddddeeeeejnptxuqmqqqqmquttutwwwtlf866444426cilic5||</),->>)~~<3|~-%$#@...+#-)~),---,,,>,)~|gmqolquuuuk7_((///<7ftyAyyti059floqppogioyEHIHEEHEBAyttwypooihjpttwpqqqtuzxyzDzF",
+"FHKMLLMKKHHCzzAtttmmmmeeeeeeebbbbbbbbbhkkkrrvvxxDDEJJMNOOOPPPPPPPONMLHFDxvvrrrmmmeeeeeeeeeeeeeejotpuqqqqqqmmqutwwyBBypc662|11[}}3clic54<<<~'-**--,~||~,>--*$+++#*,)),,;-,,))))~{5kpmllquuuq0|<(((~/3gpyAywwpf70fiiiioplcfpyEIIEHHEBAwolptpookfeotttsommqtxxyxAzz",
+"zFIKMLLKKIHCzzvtttqmmmheeeeeebbbbbbbbbkkkkrrvvxxDDEJJMNOOOOPPPPPPONMLHFDzxvvrrmmmmmeeeeeeeeeeeejoppouqqqqqqmquxwxABAypf96221__[:<3fif93|</~)>*%%%-~||/))),>*%#+@%>)),>,>,,)//~~~<dmmlimuuuui3||_<{~<9ltyywwtoc9ckgccilofcipAHHHHHEEAtlflpooolffiptttpmmmrpwuxxzz",
+"zzHIKLLKKIHCzAysstmmmmjeeeebeeddddbbbbbkhkrrsvxxDDEJKMNOOOOOPPPPPONNLLHDzxxvvrrmmmmmmeeeeeeeeeejnponqqqqqqqqqquzAzAwtppf8a21__[:(<5cf953</~),;%$#%,|3<~~~),--*$##*,),>,,>,)/<</~~7kmmgkquuuqc733|(!~|cpwywwtulffli96dioloiipwBEEEEEEtiflpoillheipttuplmmqrstuttv",
+"vzCHIILLKIHCCzvttsmmmmjeeeeebddddddbbbbkkkrrvvxxDDEJKMNOOOOOOPPPPONNKLHFDzxvvrrrmmmmmmmmmmmmmmmmqunjqqqqqqqqqquzAAwtppplfa6|_([[/(<359953|/{),*$@#*~<///~~)),>-%%%>))>>,>,)~/</~~|domkfkuuupl9905|{'/9owAywtppllol979fiotoiilpwyABBAtiflppllmiffltttponmrruruqts",
+"svCCHILLIIHEzzyytsmmmmjeeeedbdddddddbbbkkkrrvvxxADEJMMNNOOOOOOPOPNMNLLHFDzxxvvvrrrmmmmmmmmmmmmmmquqmmmqqqquuquxABywurpppic6|1(][((/_<|5993<{))>%##$-))~//~/<|</)>*-)~,>>>,)~{/<(~(7kmmfgmquuqi9995<{)|fpyAyppqpppof059cittrififiopttpiiptpllljifisttqomljmmrnqms",
+"stzCCIIKIIHGzzyxuvmmmmjeeeddddddadadbbbkkhrrvvxxADJJMMNNNOOOOOOOONMMMLLHFDAxxvvvrrrrmmmmmmmmmmmmquqmmmmqqloppppttttsqolpli86|_^[/~~(~~<5953<~),-$##%-->)~~<39c93/)>,),>->,~/<<||(~|gmmgckpquuog9997<~/5ityywpoppolic76acottpf9889fiiilouwtooleiiiottppjjhnmqrnmm",
+"mtwCCGJIHFIFAzyvussmmmhjhedddddddadabbbkkkrrwvvzDEIIMNNNNNOOOOOOONNMKLLHFFDzxxvvvvrrrrrrmmmmmmmmquqmmmmjjlopttpnopttqmlloic84<^]{~~{{))<|55|/~),*$#%*%%*>)<3cff93<~)),>-->~/|353<~<cmmkcdmquuqmc5597_~<5iwyytooolifd960bioptpi96659cilpyAwpliffjilppppmjhjnmmmjm",
+"mqwzBCGHFHFFAzxxusvmmmhhhhbdddddddaddbbhkkrrsvxzDEJJMMMNNNNOOOOOONNMMILLHFDDzxxxvvvvrrrrrrrmmmmmquqmmmmmjnptwwpnjoptqmifiifc5|^]({){{,,,~<33|<~)>*%%*$##%>~|355955|</~,-=*,/|9dd3/(7imlg9gmquumg53993(/|5iwAypmmigc998a69fiptplf989cipwAAyoicccjiloppqnkhhjnmmje",
+"eqqzzCCGJFFFCzzxvsvmmmmhhheddddddddadbbkkmrpvvxDDEJJMMMMNNNNOOOOOONMLKJLLHFFDzzxxxvvvvvrrrrrrrmmquqmmmmmjlptwtpnjjrqqqmififcc7|:({!!!,'>>)/|3|/~)>**-%@+#*,///<39fc9|</,*$*)|9ii9|/|dmom00kqupql047d9|//<5oyAwolf905888668ciottpoiiipwyAAtlc9cccflpppolmhhhhjkge",
+"ejquzzCGGEFFFzzxvsssmmmhhheeddddddddbbbhhhrrvxvDDGJIMMMMMMNNNOOOOONNMMKJLLHFFDDzzxxxvvvvvvrrrrruquqmmmmmjnpppppojgkmqqqjfifcc93}:/!!!';-->,~<|<~~),>>-$@@%>,,)/|9fiif93/>$$-/9ili5||0gmmg7dkquumg517c7</(|9tAAwogc00a88666a9fopwttptwyAyypg99ccceiopooojhhjhhhhd",
+"djnuxzBGGEEFFzzvvvssmmmmheeeeeddddddbbbkkmrpvxxDDEJIMMMMMMMNNNOOOONNMMMJJJLHFFFDDAzxxxxvvvvvrrqswyqmmmmmqnoolnppkggmquqqific953}}</!!'>;--->,~///~~)),%#@$*--,~<359cili9/-%%,|ioli515gmqk75gmquqmd1|5c3/{/3iwAytlgf9566862259dflptwwwwywtpicbc999fnppooihdeheheb",
+"bgnrxzBCGGCBBzzvvvsrmmmmeeeeeeedddddbbbkmmrvvxxDDFIIIIMMMMMMNNNOONNNNMMMKJJLLFHFFDDDzzxxxxvvvvstwywmmmmquonjjjnmmkgkmqunjefd967}3|1/{';-*--**;>)/////~>%#%***,~|||||3cooc/-*-~9lpoi59giqmg40mmppqi3<|00|{~19pyAytif9566762223099dimopppppolfcc988biooolihhhbgbab",
+"bbkrszzzCCBBBBzvvvvrrmmkheeeeeeddddbbbemmrrvvxxDDIJJJJIIMMMMMMNNONNNNNMMMMJJLLLHHFFFDDDzxxxxvvvyyywummqquujeehjmmmkkkqppoieb963|253|_{';**-*&%*-,~<<||~>%*-->)/<33|</|cll9/,>)3lppof9fkqpi77fmqpumc|<5d3_/<5itAAypid76266|}1|1|4509d9cdgklkiif9669flomligbhbbhb8",
+"6ejmqxzzzCCBBDzvxvvrrrkkhheeeeeeddbbbbkmmqrvvvzDEJIJJJJJIMMMMMMNNNNNNNNNMMMMKLLLLKHHFFFDDzzxxxvyBAwtsqquuqheeedgmmmkkipppmiida31}55531/)>--*=%&%*-~<35|~>>,,)~/|5995|/|9fc|~))|iptpidflqqmd7dkouuum9|7dc3<~|dowAAwoi9311||1__(__37777750ciillf9268cjlollihcabaa8",
+"8bjnquwzzzCADBDzxvvvrrkkkhheeeeeeeebbemmmprvsxDDEJJJJJHJJIIMMMMMNNNNNNNNNNMMMMMLLLLLHHHFFDDzzxzyBEAtuwuuqjheeeddgmmmjjmpplllifc32359993<~,>-=***%*>)|99|~)~/<<|59fff9|<|59|~))<ftwtoiflqqqk99gmquuqi55dfd|/_7dpyAAtog0341_<__(((<1341144359fig6268bfilmlifcbaaa8",
+"2aehnuxzzzzAADDzxxvvqrrkkkhheeeeeeeeehhmmrrvxxDDEJJJJJJHJJJMMMMMMNNNNNOOONNNNMMMNMLLLLLHHFFDDCzzCEBwwAuumheeeddddkmljimptpoooif01}|3595|/)>-=*&%%%%>)|c9|<|335cfc9cfic5|373~,>~3pwwtpllqqpmicgkquuuof0cif9</<5gtyAwpod731_((]:]]^[:__(___140f964269ciiilihb88a62",
+"26hhlruxzxzzADBDwuuvvrrrkkkhhhheeeeeehhhrrvvxxDDFJJJJJJJHJJIMMMMMMNNNOOOOOOONNNNNNNNMLLLLHHFFDCzCEEAAAuqmeeeeddddgklonoppppomif03::_|595|/)>=%$####%%,|95559cfllifffilf9355<,--)9ptwtppuutpmgilqquuulddiif5<_|0qwAytplf91^]^^^[::(]]!{!{{(159a2}26abfgiiigbaaa22",
+"}68hnouxxyzzCADDAuuvvsrrrkkhhhhheeeekmmmrrvvvzDDEJJJJJHJJHJJIMMMMMMNOOOOOOOOOOOONNONNNNLLLLHFFFCCHIHEAqmmeeedddddgklooompppomiiid56359cfc9|<~,=%$####%>/||9flpttpoollllf5593/>*-~9opttuuxxwumikmmqqpplfioic3<<4ipyyytog92[{!!^^]::^]!!!{{(|462}}228cffiiifc9aa2}",
+"}6ablnrtxzyzCABADxuuvvvrrrkkhhhhhmmmkmmrrrvxxDDEJHDEDEEHJJHJJMMMMMMNNOOOOOPOOOOOPPOOOONNNLLLHFFECIIIAwmmmeeeddddggkinonmptwwttptpigfccfiifcc5|/)>*%%%$*,))/5lwyywttttpoid955|~>-,<9iotutxzywtmmmmmqqpploqof951|9lwyywoi93[^^!!!^](^]]^{{(_1||2}2268bffkgigc0082}",
+"}28bhnqsxzxzzCADDyxuuvsrrrrkkhhhhmmmmmmrquvxxDDEEEEEEEEEJJJHJIMMMMMNOOOOOPPPPPPPOPPPPOOONNLKHFFFCJIHztmmmeeeddgggggeiopptABAAywttpllc99cccffc03<~))>>->,),,/9oyAAyyAywtpli953<)>,/39copqtxxzxuomqqmmqqopqplg9547fpwAytlc6}:^^!!!]]^]^(____||<}22270dfiiiifc9071}",
+"}2aahjpqpwxzzCABAyyxvuvvrrrrrrhhmmmmmmrprvuxxDDEEEEEEEEEEJJJHJKMMMMNOOOOPPPQQQQQQPPPPPOONNMLKHFFEGEBtsmmmeeedgggggghlpttwAEEAwpptolic57555555953</~))))~//)~|ftwABBBBAAwtpi953<~)/355fppquxyxuqmqqppqppppppid9730ipAAztlc641_{!^^^^]^::_<<<__}22669cfiiiifc9071_",
+"_268hinqqttxzzCBBDyxvuusvvrrrrrhmmmmmrrrvvxxzDDEEEDDDDEEEEJJJHIKMMMNOOOOPPQQQQQQQQQPPPPOONNKLHFFECCzwspmmmejgggggkknotwttwABAwtppoigc7311<<<|3|3||/~)),~<<<|3copwAAABBBAAwpifc5<~/|539oupuuxwupoquqpqttutxwpid0559lwAAAulc03|/{{]^]]]]](_(___}|7699cilliigc9741_",
+"_1aabhkrrquxxzCCBAAyxvuvsvvsrrrrvmmqrrrvvvvxABEEDDDDDDDDEEEJJJHKLMMNOOOPPPQQQQQQQQQQPPPPONNMKLIHHBzvvsrmmmjjggggkmqppptpppwAAytolmkc95|__///~//<<<//),,,~/<|5foptwtptyBEEBytpof9|/|559iuutuxxxtqmqppqtutwwywpifc99fpABBApif97|/({^]{]]((_(<<_}3559ccfiliid9074__",
+"_128bhgmrqsuxzzCGADAvxuuvvvvsvrvvvqqssvvwxxADDEDDDDDDDDDDDEJJJJKKLMMOOOPPPPQQQQQQQQQPPPPOONNLLIFFBzxvrrmmmjjggkmpppqnoooooptyytoiik987|/{{)))))))~~~~,,>,~~<3copttofflpABEEAywpi933999fpwuuyAAyuppqppqppuwyywoigfdflwEEEAwoic93<<:[::::<__11|23559ccfilifdc954_(",
+"{}47bhhjnruuwxACCAzADvwuvvvvvvvrvvvqsvvvvxzDDDDBDDDDDDDDDEDEJJJIKKMMOOOPPPPPQQQQQQPPPPPPPOONLLIFFFzzvvpmmqjjgkmpqpqmlnlollilpwwpifgd52_~!!,,>;>--->,)),,,))~<5fqttogccfltAEEBAypic99fiiptwuwzAzxpqpuqqppppwywpiffifgpAHHEAwoif954}|}<<<|1_|__}|3659cfgiiffc951_(",
+"{_47ahhjmnrpsxwACCzAAyvwuvuuvvvvvvvvvvvvvxzDDDDDDDDDDDDDDDEDJJJIKKMMOOOPPPPOOOOPPPPPPPPPPOONNLKIFFAzvvsuqqjjoqppqmmmmiiiiifhipwtlfdd961(!!';;=*&%&%*->>,,)~)~|clppofc99cfpwABBAytlfcfllltwwxzCzyuqpputpppptyywojfifcitBHHEAplfc953}:<<__<_<<}123559cfiiifgc95}_{",
+"{(120hhhjnrrstxvAzCAADyvvtvuxxvvvuuvvvvvvzDDEDADDDDDDDDDDDEEJJJJKKMMNOOOOOOOOOOOOOOOPPPPPPOONKLHFECzvvstqqqppqqqmmmmkeeehhebhlttoifdd94_{!'>;-*&$$$$$$%*-,~~/|ciopi953359fptwAAyytoilpolpwyyCGCzwtputppppoqwyywmmlifflwEHHBypiffc93|}:<_||||2355599cfiifgff92:^{",
+"![1700hejnnrrstvzAACAzADvywzxxxxvvuvvvxxzzBDEDDDDDzzDDDDDDDEEJJJKKMMNOOOONONNNNNNOOOPPPPPOOONNKLHFEzzytuqquttqqmmmkkggbbbfebbfottlgdd56_~!'';=**&$$$#####%>)/|clpoi5|<<<|9iptwwwtollottttyAABEHEAwtttupmqpptyAytoiiffipAEHHEAtoiikf953|1||4355555cccffiigfd52[^!",
+"!(1400behjnrrstvyyzAAzAADADDAzxxxxwxxxxxADDEDDDzzzxzzyDDDDDDEJJJKKKMNONMMMNNMMMMMNNNOOOOOOOONNLLHFECzzvtwuxtpmmmmkggggdbbbhbbafopoid055_/!'';;*%&%$$##@@@@%->/5lppi9|/~)~<5ipwwwti9cipwwwyABEHIIGAywwwuopxwwyAAyumifilotBEHHEEypppolf905755599090cccfifffc96}[^!",
+"!^_270deejnnrrssvyyAzAAAADADAAzxxxxxxxzzBDFDDDzzzxwxxzyDDDDEEJJJIKKMMMMMLMMMMMMMMMMMNNOOOOOOONMLLHFFzyywyxxppomkkgggddddbbehbabipolfd071_{'';;%&%&$####@+@#$%><cpplf5|~,,)/5itwAxm5|9fotwwwAEGKKIGCAAAyptyAAABAAypliloptwBEHHHEAwwttplifccc9cc99999cdff9c952}[^!",
+"!^_1700eejjjrrssswyDzACCCAAADAAzyvxvxzADBFDDDzzxxxxxxxzDDDDDEJJJIMKMMMMMMLJJJJJJJIJKMMNOOOOOONOMLHFFBzAyAxxuookgggddeddddbbeehaelpiicd74_/)';;=%$$$###@@+@##$%>|gifc93<),,)/3itzAtg3|5foppotyBJKKHEEAAzywACEEEBBBAtooppttyBEHHHEBAAwtppoliiffcc95559cd990962}[^!",
+"!]_1700deejjnrrssvwyAAACGGACBDADAzzzzADBFDDDzzxxxxxxxxxyDDDDEIJJIKMMLMMKJJJJJJEEJIJJLLLNNLLNOOOMLKFFCCBEAAuunjjgddddeedddddbhhbbflligd541({!';;%&$$####@@@@#$$*!59953|<~~~~~<5itxxtf430floiitxAEJEEBAAAAtwAEEEBBBAytpoopptABEEEEEBAwtpoolifffc9955550d050762}[^!",
+"!]_17709eejjnnrqsvwvDAAzCGGGGBBDDADDDADFBDDzzzxxxxxxxxxzDDDDEIJJJKLMMKIJJJEEEDDDDEEHILLMNNLNNNNNLLIHFCEEAyuqqjjedddeeeeeddddgfehbiiiid061/{!''-=%&%$$####@@@#$%'|95</)),)~~//|9owAAtf99ciiffmtwAGEBAywwwpopAABAAyywtoicfilpwyABBBAywpliifc9c99995999fd900532}:^!",
+"!^^176adeejjnnrqsxwvyADACGGGGEEDDDDDDBDDDBzzzzvxxxxxxxxwDDDDEEIJJMKMIJJJEEDDDDDDDDFFFHLKLNNNNNNNKMIIIEGCyyqqmjheeeeeeeeeedddgkhehfligd095_({!'>;%&$$&$$$##@##$%;_57_!>-=-,)~/<3ftxBAuifiomigipwABGBzwtttmfimwyywtppoic5590cipwwwwywttoiifdc957590cfiifc9d95|[[]!",
+"!^^1470abeehhnhqqsxDvAAAzCGGHJEEBDDDDBDADzxxzzzxxxxxxxxxzDDDEEJIJMIJIIEEDDDDzzxyzAzDDEFHKKNNNNNNMMMKIIGCAxummmeeeeeeemmeeeedggkkeciiid999|</{!,;*%&$$%%$#####&&=!351{-**->>,,)/3iwACAwptttpoiluyBECywtppmg0dipuupmomkc953459iutttttttpoliigc9009cffffcccc9531[^!",
+"]]_177a0behhhhhmqsxDvyADzGGHHJHEEBDDDDDAAxxxxzvvvvuxxxxxzDDDEEJJIJJIJEEDDDzxxxvxxxvxzDFHHLLMNNNNOMMKKICCAtummmmeeeeemmmmmeeejgkkkehffd99971({!'';&%&$$$%$###$&&&,|77(;*-,,;--;;)|fwABAwwyAywpmpxAEEAxwtpok05cimliiiiigc05337doutpptttttpppoifcccccc99599905531:]",
+":}|45799aeehhhhmqvuyDyAACBHJHGGGEEEDDADzzxxxxvvvvvuvxxxxzDDDEFJJJJJJEDDDzxvxvsvvsvvvvzCDFHLLMNNOOLMMLIECyyusmmmmeeemmmmmmmhjhjnmmhccffd5903_({!,;***$%&&$$$#$%**>/77<,;,{,*%%%%*>|iwAAtptyAAywtwCGJCzzwtpog59fkkkgikgfffc959cipttppppttpppplifd9995537535433||1}",
+"}35509dbeehhhhhmqvuyDDyDCEHGHGGEEEBDDAzxxxxxvvvvvvvuxxxxzDDDDEJJJJFEDDDzvxvvvvvvvsvvxzzzDFHLKMOOONNNKIEzvvspmmmmmmmmmmmmmmqqqnnomlfdgfd06873<{!',;**&%%&&$$$%%---)104),~_!*$$&$$*,|owAwlltyCBAwyACJJEzAwwtoc0dkmqmiiiffkifcccfmptwtpolooppolifcc955333|||1<__<<}",
+":}79ccffjjhhhhhmqvuxyDDBEEEGGBEEEAADDzxxxxxvvvvvvvvvuxxxxDDDDEIJJEEDDDxxxvvvrrrrrrrrvwwzzDFHKKNOOONNMIFzzvrrrmmmmmmmmmtwwqqssuuppolicfd02505|_{'';--*=%%&&&%%=;;-,<75()~<_'=%$$$%*{5pwxofityAAyzAAGHEAAAwtui75gquumkkfccffgcd0diopppliiilooliiffc95531_<</({{{{)",
+"':}59cfijjjjjmhmqvuxyADDEEBBBBBBDDAAzxxxxuuvvvvvvvvvuxxxwDDDDEEIEEDDDxxxvsrrrrrhmrrrrpwvzzDFHMMNOPNNKIFAzvvrrrmmmmmmqwwyyyuuuuuuppoicdf0659531(!';;*-;==%%&&=;;;>>{45<~~(||~>=&**%>{9pxtifowyyyyyABEEAyzwtum0|5gquqggd73570d0579fiilllilloolliifc995|1|<//~~!!,'",
+"'{:|0dcfjnlolnnqqvuxyDABDABBBDDAADAxwvuuvvuuvvvvvvvvvxxxxzDBDEEEFDDDxxvvvrrrkkhhmmmmrsswvzxDFIMMOOONKFFCzvvrrsmmmqqqxwyCAABAxuuupupiccigd9d9531(!';----;;%%**=;'>>!|7|/~~_33(),>-%=;/cuuiffotxwxxzBGGzwxwttti415iomdd051<14507770ddgfiilolollliiic953||<_{~)!'';",
+";'^[400eejllqmruquuxyzBAAABDADDAADwuuvvvvvuuvvvvvvvvvuxxxzDDBDEDDDDzxxvvrrrmmkkhhmmmmmptvvzzFFIMNOOMMIFDzzvvspstqqqwwwwABEEBAAxxxupoffiikccgc541_)'-;--;>=%%*=;'>>,/44_~!{390|<{>;=*,|lpofciuwutwzABGBxttuutp9<<39c90901_(_|3777590099cfilllooooolif953|<(~~)';;",
+";'{[}0bbehjjnnquuuxxzzBDADDDAyDDxuvuuuvsvvvuuvvvvvvvvvxxxxADBDDDDDzxxsvrrrmmkkeeeeemmmmspwvzzFIKNNOMMIFFzzvvwstwwwwwuuyABEHBBAAxwtpooiiiliiiif997</!'>,,,>*%%&=;>>'{451~~/7mpi9|)>**>(9opkdfpwtutwyAEGAuppptuo5</1500993<(~_1|47500099580dgloooooollifc53|/~),';",
+";!{_}70bbejnnnmqvxxzCCCBBBBADyywtuuuuvvvuvvrvvvssvvvvvxxxxDDDBDDDzxxvsvrrmmkeeeeeeeeemmmpsxwzAHKKNMMLIFFCzzvvuuwwwwwwuACHHIHEAAAurmolfcilliiiiffc93_~~~!';*%%&&=->,!|7|/~|dqtpoc|!;->{3kppfciutttxwzAEBypooptug4{~_47007|_({(_1359000077670cfiiffffffffcc93|/),'",
+"){{<}20beejnjjmqvuuzCCCDBBDAyxtvuuuvvrvvurrrrvvqsvvvvvuxxzzDDBDDyxxxvvrrmmkeeeebdddeeemmmptyyzEIFKMKKHFFEzzzyzwutttwxABEIIHEECywqlkllicfkmiiiigccc95|</{''-*%&&=*-;'/34/~|coqpog0|!,>!<9ouodfotwwxxwyCEAwpommpqf|~/<3555|_{{!{<|35999d97243230995595555599995|/~",
+"|||||60dejnnnmmmquuxzzzCDDAzxuvuuvrvvvvnnrqrrrvvssvvvvvxxxyDDDDzxxxvvrrhhmkeebbbbddddeeemmttyAEEHIIKLLHHFAzzzAyststwCEHJIJGCAzAwqqomloiffilkifgc9553|<//~)>-*&&%%*-'~|3<~<3dlf09d9|~!!~|dpukciptwxxwwzCCywpmioppc|<_|1353_]~)){_|359cdd06||2122|3||||<||||459553",
+"59999d9dfhjnnnqqquwwzzAAADzxuuuurvqqqqnnnnmrrrvvvsqvvvvxxxzzDDzxxxvuvrrhhheedbbbbbddddeeemmstzCEEFFLLLHFFCzCzAvvwvzCEHHHGECzzzzAwqomolifffkifdfd0743|<////~)>;=%%*->!/4|~/<507||499|{!)(3mtpfdltwwxuwxzCAwtpiiopm91____471(~]))~/<159dgd967321|||<<<_((/(((<<|33",
+"<39fiiiilljnnrqruuxxzxywyxxvvuuvsvrvnnnnnnnrrrrvvqqvvvvxxxxyDzxxxvvurrkhheeddbb88888dddeeemqxyBCCBDHHHHFFFCCzyxxyzBEHEGCEFBzzzvAwqomlilfc9dggddfd0333|</////~''-**-;'~11(~/|7|13|155_~)~_dutmggptwwwuwyzAxupoimqqi01_/(174_{!'''!~]<79cgd9056332}|<<_((~~~))~{~~",
+",~|5cflopppprrrqvuuxwxxxxuuvuvssssnnnnnnnnnmrrrvvvqvvvvvxxxzzxxxxvvqqrkhheeddd88888888ddeeqquyyAyzzFFHJHFEEzzxyvzBEHECCzCFFBzzzzAwunkefd990ddd09cc9533|_<<<<<(~,>-;'')<|/~/|4|7d03354<{~_5muukdiqutuutxyzwtpollqupf3<//_75<~!'''',']_39ccc006573|||<<((~~~)),,'>",
+"->)<|5clopttttppqvxuxwxuuvvvvqvqrornnnnnnnnnrrrvvvqqvvvsxxvvxxxxvvvqqmkkeeddd8886666888ddhjquuywywxDFEEFHFEzzzvABEHEBCCzCFFFBzzCAwqnkhb9aa3589575093|||||||||<<~~)',))/||~~|449mqf5573_/_4gtwpgflpututuxyxupomlqppoc|<<|75|/)'>>''''~_|0900765342||||<_/~~)),>;=",
+"=>'~_25dioptwwvwuutuuuuuvvqqqrrnnjlnnnnkkhhknrrrvvvqvvvsxxxvvxxssvrrqmmkeedd888666666688dgjnuusstwxxDDEHHFDCzzzGEHHGCCzCHFFFFCCCAxqqkhab9644307||774_//<_|||3||///({{{/|4</<79dqupld051__40luxodfmpuuttuxxupmiilppqm9||3707_{,,>>'>'!{_3a9006332}<<<_<<<</~)>>-=",
+"=>,](<|7cfiostywyxxwxxussqqqqnjnjjjjghhkkkkkkrqrqvvqvvvvsxxvvxxvsvrrmmmeeddd886666666668bggopwuqurvxzDEFEFDEAzCGHHHGCCBCFFFIFFBCzzwqjkhb88634704|4751~~~~~/<|33||<</<<<|73<<49glpttod971117gpxpgcgmquuuttxwpmkdfipuql9779dd7_!';,,>>')/:77657633|}__<(<<<</~,>-*",
+"->,)/<|35bginpswwyzxxztvuvqqjjjjjjhhghhhkkhmmmrrrrqvvvvvsxxxvvvvvrrrmmmeedd8886666666666bbgmppummpvvxzACFDDDCCCGHGGCCzCFFFKFFHEECAwsnkie999535873|703_)),)))/_1333<//135093130dfptwtoc95447fmxwlddglqtttutwupmd99ippqld00dkg4{!''',,',!(14a732334|_</((~~~)),,>-",
+"-'']/<|25dcfinnpttwxxzzxusvnnnjjjhhghgghkhhhmnrrqrrrvvvvvvuuxvvvvrrrmmmeedd886666666666a8bhmqpommhrvvzzzzzDFHHHGGCCzzCEFFFKKIFIIGEAwxtqijfd0539d73799|~),,,,),{_|53</<|9fgc5509glpuutlc9770fmuxpg0dklquuqpttqmic59iqqqmf9gmmc1{!,''>,'!{_|22322|4|__//{),,>>>>>-",
+"*>'~_<|279cfijjoppqsxxzzwwsnnjjghgghhgghkkmnnnutpsurvvvvuvvuvvvvrrrmmmeeedd886666666666688ilomnjmmppvzzzzzAFIIIECzzzBEIIIFKMMMMNNMMKIBzytpolgccfd97905<~,'>,,>'')<||<<<|0iic00dfiikmtpi9900imuxwpfcgkmptqqqqupoi539iqppoikmmk9_{',',,',{:|42732|1<_(]{~),>-;*=&%",
+"$*;)(<3359ffginnoporvuxwtupppohgghgghghhhkhjknrputttutttvvvvvvvrrrrmmmeeddd886666666666688ellmgjemmstwwvxzzBIIIHBACBEIIILMNOOOOOPOPPONIIHEAwtoillidcc93/~',>,,;;>>)/||<<3clkfgiif95cimoicddioptwtmfcfmppqooqqqold3|9fmppppmqmg9</,,'''!!(:}275221__(]]),,>;;=&&$",
+"#%=,)]<35cfffilnoonmnrsrrspppmmkkggggggghghkhkrrqtuutwwvvvvvvvvrrrmmmmeedd88666666666666aafiifhgehmmtwvvvzzCHIIHECEEIIFMNOOPPPPPPPQQOMIIIIEBAtooppliifd3<{'>,,,;--->)<1||5fliilol9459gmolmklmquxwulggippuqomqqoom91|0imqpppupof7|~~!)!]{][:}652641_(]]'>,>;==%$#",
+"#%=;,]/|29cijlloonnqqqqnqnnojmmmmmkkgggkkjkjkhrrrusuwywvvvuvvvqrrrmmmmeedd886666666}}}}68bfihebddejmmsvvvyzCGHHFFFFFFKMNOOPQQQQQQPOOKEAzAAwttpiiloolilof5<~',,)''-*--)/|359fiiotpi9339fmppppommtwxtidfkoqqqmmmmomm0|40gmquttupi97|//~!!]]]:}473a71|:]]''>--=%%$#",
+"#%=->!~_170dijlororoqrrnmjjjgkkmmommmmmlmnmmmkrqrrptwyywxvuvvurrrrmmmeeedd886666666}}}}28biih8b8dgjmmrprvAACGCHFFFFFKMNNOOQQQQQPPOMKEzAwuppligf9cfiiilptl9|/),)))'-**>)/|55cfiotwpf5459iptutqplqxwwqgdgmqqpmmmmlmmk5159imptuupmg77|<(({{{[_[}26672}:({]'>-*=%$$#",
+"#%=;,!~::479hfioprrrpqqnnjhhhggkkmmqpppoomqqmrrrrrpvxwwvvwvvvrrrrkmmmeeeddb8666666}}}22268iiba68bggjmmrptzCCCzAFFIIKNNNNOPQQQQPONNMIHEAwtpoifiid9cgiilptpi9|(~~~/{,;;->)/|5cfikpxwofc09cmtttqqolqwwui9dfopppmmmkkmmc||5cgoqputqic5311<_((_:[1a5a731<]{{''>-*&$#@",
+"@$=;>!]_<435dbgilnnrprrnjjihhggggklmpppqpqpprrpqrrsuvwtvvvvvrrrrqmmmmeeeddbb666666}}}2226bccc8666bggemmstwyBAzzEFKMNNNOOOPPPPPOONNNKIHBAxwtoooooliiopoppplc5||//<</!,;'!)/|0gkiltwwpifffmuwtpuqmqxxwqg0cimqpmlmmkklf5|7ddfmqqupoc77713111}_}}2777731_({)'>>-*&#@",
+"$%==>'{/:4750cbginnnmnnniijggggggkkkklmqqutttrqprruvwutvvvvvrrrqmmmnmeeeddbbb666662}}226acc9666668egehmnwwyzyyzBFMMNNOOOOPPOOPPPOOONNMMKIHEEAywwwttttwtppof053|||33|{'')~/_3cillotutpommmuwtqptpqtxxumd9ckmpqqmligki91|7ddgkoppoi97733377742}2677a311_{!'>--*%$#",
+"$%=>>'~~_4790bbgginnihnnjihhggggggggggkmmptttprprpsvvsvvvuvrrrrrmmmmmeeeddbbb6666622}22aacc862}6a8hbdemqquwwvyzCIMMMNOPOPOOPQQQQQQPPOONMMKMKIHHEEAwtwyxtppl0533|3553|////(<<3flloptwwtpquwzxppuuttxwxqf90dkpqqmmkgggd7<|0dgglmolic077|335066aa65723|1<({)'>-*%$#",
+"$==>,')]_1359dddfhjjkhjhhjgggkgggggggggkmqqtttttprxuvvvvvvrrqrrmmmmmeedddb888a6222}2}}}26cc662}2688bdgjquuwtsyCGIKMNOOOOOOPPQRQQQQQPOONMKIKKIIIIIIEAABAywwtl53||3|33|<<<||</<5flmptwwwtttyAAxttxwuuxwtld750ipqommkddg0|<39fgikiffcc0731|470d8a6a7aa11_{~),;;**%#",
+"&&->''{/_1457bhbggijikhjejdfgkgggggkkkgkkmpprtstswvvvuvvvrrrrqqmmmmeeggbb888222}}}[[[[}26bc62}[22866bgjnuuqstzBJHKNOOONOPPPQQQQQQQQQPOONKIIIIIIIKIIIHHHEAAAyo9333<</<<|||4<(~<5iopwywttuwAAzzyyyyywwxwuf535clqqookgdd03<_40fikgcc999997||47acb9a9074|_(~),>;;=%&",
+"&*--']~(_1375abcfikjhhejefddgggggkkmkkkkkrrnrrrwwwvwxvvvrrrrrrkkkmeeddb88aa2}}}}}}_____16b96}}}}22666bkoouqmsyEEHKNOOOOPPPPQQQQQPQQQQOONMKIIIHKMKKKKKKKIHEEEAtig9|/{~<|353</~{|9iptyytpptyBCAAAAAzyxuwwm9437gmqqmmkd005|<<39iiic975579033247dbccddaa|1_/~'>>==&&",
+"%*-;,)](<1357acdgfinhjhjgfddddggggkkkkkkkmooopstxwxyywxrrrrqqmkkkeeddb888222}}___(((((([79562[[}2226aekmooqquABEIKOOOOPPPPPPQQQQPPQQPOONKIHEEEHIKMKMMKKMKIIIIEypi5</{~/|553</(_3clpwyytpotABBBEEEBzywxxug7439imqpmmkd7741<|5dfff9005579967276abccd9a4|<(/),>-*&$",
+"$%->,)(/1|350ddcgfinjjnnfgddddddddggkkkkoonnnssvvwvyywtttpprmmmmeedbb88a2222__(({^^^!^^(|774_[[}}2}28bimonqquAAEIMNNOPPPPOPQQQQQPPPPPONKIIEBAAAAEIIIIIKKMKKKKIEApg5|/~{_|7974|<19gltyAyplltEEEHHHGEzyxywqc3379mqqqmmg05731147dcgfcc03790d05a7888ab07241_{~,;;*%$",
+"&&->,{(_11550cbbgfgjhnnqiigddddd0ddggkkooonovsvvuvvvttutttsmmmmmeeddb6622}}___^^^^^^^^^[}32|(_[}}}}26bflmniuwxAEKKMNOPPOOPQQQQQQQPPPOOMMIEAzwtppwwwtyEHIKKKKKMKHBpic3({!(<7907770diowBBwoipyHIIHHHHEzzyxum0445cmqqqmkd033113500diiic5750d998008a8aa722</({!,>*&&",
+"%=-'']{_|450acbggghjhjlmllgggddd0dddggmonmnrvsssttvsussttqmmmmmghggb882}}}_((^^^''''''!]12}:{{_:}}}26bfimklpxwBIKKKOOOOOPQQQQQQPPPPONMKIHEAwwttpplikipwEHIKKKMMKIEwoc|(!!{_7999ccfiipAAypootBIIHHHHECAyzwug7345gqqqqmk0744|43570diif97570dcdcdc8bac0522_({!'>-*%",
+"%=;'!{{_<159abcggiijhhfiiilggdddddddgiljnlqvrsstusrsspummqmqqmmjegbb886}}_(^^]!!''','''{<||]^!(::_[269eeikmpwxBIKKMNNNOPQQQQPQPPPPPOOMIIEBEyywwtpogc9flpwEIIIKKMMIEwl93/{)~<59cfilllowAwpoopwEIIIJHGEBAAAxqd3439mqqpqmg74414409779cfcc090dhcfegbb0a857}}({{'';*%",
+"==;'!{{_<1789cfggggjhhggfiigggddddddikiljnrqrsvvrrrusmmmmmmmqqmjggb88622_(^^{'','''''''{_|_{]^^(:__26c9fimqtpzEIHKMMMNOPQQQPPPPPPPPOONKIIHEAzywppolf09ccflyEIIKKKKHApi93<{{/<39ciopptyAAtollpwEHIHHEEAAAzAum0775cmqqqqld741347007359dgddddd9figgbbb8a53}:({!';;=",
+";;''!{(_12a8a9ggiijjhgggfggigggdddgiilkinmmqvvsrrqrmmmmmmmmmmmjjggb88621_^^{!''';>;;>;'!<_/]'^^((__<69cfciqptBHIIKKIMNOPQPPPPPPPQPPPONMHHEAyxwttpllfd99999iwBHIKKIIEwplf92:::269ciptwAABypiiopwEHHHHECAAzAzumc075iqqqqpkc743479093379fffidbdhejkjhhbaa7|[[{]'';;",
+";;'!{(__22669dgggfjhhgggggffddddggkkmlnmnmmrrrnrqrmmmmmmmmmmmmjjgea8622_(^^!'';;--;;--,)<<('''^]({(1688chnqqwBHEIKIIMOPPPPPPPPPQQPPONKFCCAuwttppollicdccdcfmtyEHIIIEAtpoic5}:}268clpwyABAukfiopwEEHJJECzAzAzukd57dmqqqqqm0333570d07359fgighgbejkkjehbaa74[[(!';;",
+";''{([[}2260cdfggjjhjgggffgfgfhhhiilloqnnnrrvnnokkmmmqmqmmmmmmjkkebba21_^]!!'''--===*;>)/</'''!]^{(_3a8ciioqyEHEIIIKNOOOOPPPPPQQQPPOMLFBzwqqnmlloiiffcccfiilptwAEIIIEAywtpi9714370fltwyABymfflptyBEEHHEAzAAAxpfd00goqqqqqk055670dd95770gflkggeejkmjjhbaa74[[^'';",
+"!^^^[[[}2799cffghejigggiiggggggffhilorrnnqqqnllhkkhmmmqqoqqqqqnmkjh8661_^{!''';-*****->,]<~';'){{!{[3389cnnqAEHHIHHMNONNOPPPPPQQQOOONLFCzvsmjghbffccfffffilloptwyHIKIHBAyytof05770dfluyABApkgiptwyAEHIHCAzzAzwoddddkoqqqumgd90070dc0570dcimmkjjjjkmnjha884}[^^^!",
+"!^^^:<13779cdgiheeehhggggffdhheijjjnrrqrvrrrnnhhkkmejnrprppqppqqmkidaa4[:{''';;--=&&&=;,/<~>;''!^^^_|388fllpAEEIEEIMOONMOPPPPPQQQPOOOLIFzvsmedgbab989cfiifiilptwwAEKMKIEBAAwoi9550dfimwAEEyqiiotwAAAEHIHEAyAAwtlcddgmppquumkcd999dggd00dggomnmjjjkmmjjjb864<_^^!",
+"{((_|17790cfhhghheeheeehjjeheeheihjnonmrqppnnhkkkejjorpspppppppqoikfb05}_/!,>;--==%%%%;'{<{>;''!!^^:<158cfltBEHIGEKNNMMMNOPPPQPQQPPOOLHEzvsmmedb886868cfffiiilptwyAHKMMKHEAwtplfbbcffiqwBHEytppptyAAAEHHHBAAzzwuifgilqqquuupigd9dddgggddhhomqpnknkmmmljeb8621(({",
+"(__14479acefffhhfeehhhehhheehhehjjnnnmmqrrorkhkhhhjnqqqqppprpppmokjgcd06|<~!,--=%%%%$%*>{/);-;,''^^[:159cfltBEEHBHMNMIKMNNOPQPPQQPPONLHFzvssmed8a662a689bccfiilptyABIKMNMIBywwtpibdfiiipyEKEAwpppwAAzAEHHGBAAAzwuiiilopuuuuupkcddcdgggggjkmmmqnnnnmmmmnjea662__(",
+"[}2266a8cbffffhhhehhghehehehhhhjhjnnnmmnqnnhmmmjjknmqqmmmmpprppmmijcc0763|<~,>=*%%%&&%*>)()-->'''!^[[:40cciwBEEECINNKHIKNNOOPPPQQPPPNLLFzzvsmeeda666268b988fiiilpwyAEKMMMKHByyywplfffiiowAEIHBwpopyAAyAEEHGAAAACytolmmpuxtxxtuidddgggggjjloomnqnnnmmmmmjefa622}[",
+"[}22a6abcfffffhhheehhghhhehhehjjjhmnqnnnjnkhkjjkmmooollllmmnnlnmifea90221||<~'>*%&&&&&&-)~'-=-''''{:::40c9iyEEByBIMMHGIKMMOOPPPQQPPPNMLHCzvsmmedbb66886a9668fppptwyAEIMMNNMIEAAytplifiilowAEHHBwttyAAyyAEEHBAAACBzwqlmqxxxwxxxpkgggiggkkgilljmmloommmnmmjhbba6}[",
+"}226a89bhffhffheeeehhhheeehhhjjjjnnrrmmmlnhheegklpolijhhjjkkknnkhhh8a3}1___(/{,>*&&&&&&-)~'-=;''''{_:1250clABEAwEKKKEGIKKLOOPPQQRQPPOMLFFzvsmmeddb6668abbbadiptwwyAABHKMMNNMIEAwtpoiiiijiptyEHHEAyAAAyyyAEHECAyABBAyuqquxzyxxzxumkkkijkkkjjjkkmjnommmmmmmhbbba2}",
+"688bbhfjieffhffeeehhhhheeehehjjjjhmmmnrlnhhbhdbiiolliieeehhkkkjkeb666|[_(({{~{~,>-&$$&&;)~!=*-'''){(_}250coyAAzyHKIIEGFFKMOOPPQQRQQPONLIFzvssmeedbb6666a88bciopwyAAABEKNNNNNNKBytpillllifipwAEEEEEBAAywwyAEHHAAzABCAxpmpxAAzAzzxxqmmkjjkkkjjjhmmnnpmmnmmmmhha886",
+"688bbbejiffefhheeejhhhhhhhheehhjjmmqmrnnghhbdbbhiiffc9ahbbbeegggeb6661[{{!)!)!)),'-%$$&;)~);*=-;''{/(}437cpyAAwAIIIIEGGIILNOOPQRRQQPONLIEzvssmmhddbbb666889jloopwyyAABIMNNNNONKEypoiopoiffipwyABEHEEAwtwwABGIHAAAzCCzwuquyzACzAzzxuqnmmllljnhhkmhnrmmmmmmmkkeb86",
+"8bbehhfhifhehfehehhfhhhhhehhhhhhhmqqmmnnhhba88bebcbd8aaa8bbbeghgebb62_[{!'''>,,,',>-*&%-'~);*=>''')//_227cpwywwBKIEHEGGFILNOOPQRRQQPONLHFzvvsmmeeddb88bbbbhimmmmqttyAABHMNNNOONKEypplptoiffotwAAAABBAwttwABEIIGBAAAzzzxtwwyACAzzzAyuqpqoonkjkkhmjnnmmmmmmmkkggb8",
+"dgggechfjihfhgeehehhhhhheehhjhhmmrqmnjjhhba888bc9098aa66aa8bbhkgebb62_^{!',>;--->>,,-**;'~);-;;'''!((<227ftwtttBKHEEEGEIILNOOPQRRQQPONKIFzzvummhjgdddbbbbhgkmmkjnpptwyyyEMNNNOONMEytppttpigjowyyyyAAywtptyBEEIIHEBBAAAzAyyAABAAAzzzzxtppppmmnmmqqnnnmmmmmmkkjggd",
+"dgggejeehihfhhheeehehhhhhhhjhhmmnmqnnjhgba8aa8aa8aa4316666a8cbekhba62[^{!'';;**==;>>>>->,~)>-;>'''!~/<126fpwttwEIEEEEGHIIMNOOPQRRQQPOOLIFBCAwwqqjjgggdddddgknnijjqptwwwuwBKMNNOONKHBwwwwwoifotwwwwwwwttttwABEEIKIEEBAAAAAzBBBCCzzzAAAytppmqqqqqqqnnnmmmmmmkkjjje",
+"ehggejeejhhhfeheeeghhhhehhhhhhmmmmmnjjgb0a68a8a86531_111266aabbheba62}^{!'>;-=%%&%*->>,'~/~'-->'''!{(<<26ittppwEHEEHEGGFILNOOPQRRQQPOOMKKHCByyuuornkkgggddfjnjmmmqpttwwwuxAHKMNNONMIEBABAwolmptAAAwttpttttyAEEHKKIHEBBBAAACCEGGEECAAAAwttpqpqqononnnonmmmkkkjjje",
+"ehggejhehihhfefhehhhhhhhhhhhhjmmmmmnjhgb086266873}[[:[__112aa8bhebb861^^!'>;-=*&&&%%=>,)/</,-;>,''!{((|39ittptwHHEEHECEFIMNOOPQRRQQQPONMKECAwyuuuppprmmnjjhjqqnmmqupwwwywtuABIKMNONMKIHEBAtolnpyAAwwtppttptyBBEHKKIHEEEBAAABEEHIIEECBAywuuptuprprnnnrmmmmkknjjje",
+"dggghhbhehieffehehehhhhhhhhhjhkhhnnljhba8662aa53}:[]^^^^__12aa8bbhbaa1_^{!';-=*%&&$$%=;)(||)>;>'''!{(/|39iptppAIEAyBEGIFILNOOPQRRRQQPONKFCzzwwuuqnnnnnooonqqqqmmmmqppttwAwutyAEIMNNNMKKIEBAtoopyABAwtpooppptyABEHIIIEEEBAAAAEHIIKIHEEAAAxutuptttpprnrnmmmkknjjje",
+"dgbebbbhhehheheechhhhhhhhhhhkhkhhjnjhhba6622634}[:^]^^^^^(_12288bhba64_[{!'>-=*%&&&$$%*'~|3(,>>'''!{{(<39lppppAIEwxAEGIIILOOOPQRRRQQPOLIFCzyzwyqqqjjjjnnouuquqtmmmqloppwxAyttwABHMNNMIHHEEByppptAAAywtpooppptwAEEHIIGEBAyAABEHIKKIIHEBEBywwttttttuqmmmmmmmknjjgd",
+"8b88bbbhaabbbbcbbhhhdhhhhhhhhhhjjhjjhba8662244}[[{!]!]{^^^(_1228bbbaa41[{!';-=*%&$&##$&=,<3<~,,'''){((<49lppopAHAwxAEGIIILOOOPQRRRQQOOLIFFzyAyyqqmmmmmmmqquuyywqmmqnlotwwyywttwABIKMMIBABEEBwpoptyABAytpnoppptwBHHIIIEBAyyAEEHIKIIIIIEEAAAAwtttutuqqpqqmmmkkgggd",
+"668aa888aaa8bbbbbdddddddddddgghkjkjggb8662224}[[]]!!!!!!{^^(_122abba64|[{!'>-=%%$&&###&&>~|_/))!''!~((<39lpploAEAtxABGIIIMOOOPQRRRQPOOLLFFzzzwwqrnmmmmmmmmqtwyyuqqqqnpwyxyAyvtwABBEIKKHAAAAEAwpoppyABAytppoppptAEIIIKIHCAyyBEIIIKIIIIHHEECAywttutuqquupqqmmkkbb8",
+"66a6aaaaaa880999dc9000aa0dddggggghhh8a862}221[[({,,',,'!!{]^__222ab8631:{!'>-=%%$&&###$%*)/</~~~',){(_|3coppooABytxACCHIKLNOPQQRRQQPONLLFFEGCCAyqqqrqqqmmmpuuwyuuupupwyAAAAAAwwwABBEKKKEywwyBytpootyBEAytpqppptwAHKKKKIHEByABHHHIHIIKIIHHEBAxwttuqpopoppnoljhe86",
+"6222666a85667700000a6a6a8a0dddddhgdd86662211}[:{!'''''',!!!^^(_}26baa4|[{!',-=*%&&&###$&*>~/~{/(~'){(_|5coppooAAwtxyCCEIKMNOPQRRQQPPOOLMKKIIEEBBAuxxupqmtpppwuwwuttwywyyAAAAAAywwAEEHKKIAwtwyywpomotABEAwppppttwyEIKMMMMIHEAABEEEEHIKKKIIHEBAzwtttppqljjjiiihba8",
+"6222264434244226aaaaaaaaaaaaaaabddda066}}2}:::(]'''>;''','!^^(_}22aa6|1:{!',>-*%%$&###$&&>){)'~(/{~~(_|5coppooAywtxyCCCIKMNOPQRRQQPPOOONMMKIEEAAAAzywuwttpqwvwttquwyABywyyyAABAwwyEEEIKKIytptttppoopxAAAAtpmpptwAABHKMNNMKIEBABEBGHHHIHIHEEEEBAyvwpponijjiffefb6",
+"6626|14111}}}}222644477770aaaaab800a722}2}_[_<]!'>>>;;>''''!^^(_}26a24_[{!',>=*%&&$####$&-){)',{/((((/|5copplpwwptxuyABFKMOOPQQQQQQQQOPOMMLHHEEAAABBAAyywtxwvxptmqtyBEAwuttwAEEBwwBEHHIKKHytppopppopuwAAAytpoptwyyABHKMOONMKIEBBEEHHEEEEEEBBEEEBAywtppllijgeb888",
+"26434||::[}}}1|11111444377770008aa67a2}[}[[[:({'';;;;;;;;','^^^[}}2221:[{]!'--*%&&$$###$&=,)'->){{(___|3coppopttpsxuyABFIMOPQQQQQQQQPPPONNMKKIIIEEEEBAAyyAAywwqttmqwAEEypolptwEEBAAEHHIKKKHAtppopporpuwzAAypprtwwwyAEHKMNOONMIHEEEHEBBAABAAABBEEEBAwwtpniec86622",
+"2|3||}}}}____<|:_1111}42277700067a622}}[_[:_:(!''-;;=-;;;;''!]^(_}2221_[{{''-=*%&&$$$##$&=>),>>''!(_11|39oppoptpoqxuyzzFIMOPQQQQQQQPPPPOPOOOOOONMKKIHEBEBBACywpttmmuzEEyplfilpwBHEBBEIIKMMMIBwtptrpopqtwABzwsqppwwwyAEHKNOOONMMKHEEEBAzAAyyAAAABEEBBAtpoljca662}",
+"_((:[}21<:<((_______11144777776777a2}}[[[^[([{!,---===-;;;;''^^^[}2}21^[{!''-=*&%&$$$$#$$%>),>;>''!_34350ltppoppoqxuyzzFIMNPQRRRRRQQQPQPQQQQQQPPPOOONNKIEEBCAAytttqqwBBAtofcffowEHHEEHKKMNNMKEywttppputwAEEAyuqutwtwyEEIMNOOONNNKHEEEEAAAyyxywyyAEEEAywtolfc862<",
+"_(^^[_<|<<___(((__::[1}1227777767342}[[[^][(({'>;;===**=;;;''^^^__}}}_^{!!,;>;*%&$$$$$$#&%-,)>;>'''{1459dotpppppppxuyAzFKNOQQRRRRRRQQQQQQQQQQPPPOOOPPOOMKIECCAAwwwwtwAAAwpjiccfltBHHBEIKMMNNNKEAwwtptuwwCEEBAwtuutwtwAEKMNOOOONMKKIHHHEEBAAwxwttwAAAAAywtpoib531",
+"::^(]{{/___<<__///____<1}}244734733}}[[(^^((^{'>-=====*=;;;;''^^][}}}[^{!'';;**&%$$$$$$#&%-,),;;'''!_|59iptpppttpuxuyAzFKNOQQRRRRRRRRRRRRQQPONMMKMMNNNNOONKHEAABAAAyyBAAwtpoifffltAEEAEIKMNNNMIBywtptwwwABEHHEzwvwyywyEKMNOOOONMMKKKIIHEHEEAAwtttwtwwwyyywtpic53",
+"|}_/(~{{{{(/<<<<((((__<:1}}24421144}1[^(^^]{]!,;===%=====;;;''^^{_}}}_^!!''>;**%%$$$####&&*,{);>,''!(_|9ipwtpptttttuyAzFKOOQQQQRRRRRRSSRQQONMIGGGEHIIIKMNONMIEEEBBBAAEBAwtptpliffltAEBBEKMNNNMKEAwwtstwwyACEHHEAyAABBBBIKMMNNOONNMMMMKIIIIIHEBAwwtppppttwywtpic5",
+"95|<_((~~)~~((_<<<(/<_<<<:111|}1}12|:[[{^^{({!';==*%%==*=;;;;'!^{[}}__^!''>-=**&%$$######&=>~)>>'''!{<|5ipywppttswtuyAzHFOOQQPQQRRRRSRRQQPNKIHBCCCCGGGHIKNOOMKHEEEEEBEEAtppttpoifiipAEEBEKNNNNKHAwywwwttxAEHIKHEEBEEEHEIMNNNNNOONNNNNNKKKKKMKKHEBytpooooptttpoif",
+"lf933|__~~~~~~/</</(<__<<:}}}}_<:1|1::^{]{](]!'==**%%%&&=;;;;'!!^[[[_^^]'';-=*&%$$$######&%>))>>''''~/<3coyytptttwwuwzzFKOOPPPPQRRSSRRQPPONMKFFBCCCCCCGGIKNNNNMKIIIIHHHEAtptwwwplifipAEBBEKNNNMIBwyyyzutuyABEIIHHHEEEHIIMNONNNNOONONNONNNMNNONNMKIBytollilopppoo",
+"plif953|<<<</{~{(((<</______<::___|<:](^^~](])';**%%%%&&**=;;>'!^{[[[^^!',;-=%&&$$$######&&-)),;;''')(<|9lwAwtwwwywxyAzFLOOPPPPQQRSRRQQPOOOMMKKHEGGGGGGEHKKMMNOONNMKKIIIEwpwAEEAwoiiltBEEEIKMNNKEAAwAAwtuyyEEHHIHHEEEHHIMNOOONNNNNNNNNOOOOOOOONONNMHBwpiffiilopp",
+"iillifc53||</{)]]~~//<<<//___<:](_:<]^{^^{^[/]';***%%%%&=*=;;>'!!^[[^^{''>;-*%&&$$########&*,));>'''!(/19ftyywAywywxyACIKMOPOOOPQRRRQQPOOOOONNMMKIKIIIHHIILKKMOPPPOMKIIIIBwyBHEBAwpllpyEHHHIKMNMKEAyyyxtwyABEEEHHEEEHEHIMNOONNNNMMMMMMNNOQQPONMMNONKIBwoic9cffii",
+"59ciiiic953|/~)))))~{/<<<<<_<__](:::]]!!!!(_:{';**%%%%%&%==;;>'!!^{^^^''>;-=*%&$$#########&&>))'>'''!((|6cpwwwBAAAwxyACFKMONNNOPQRRQQPOOOOOOOOOOOOONNMKKIKIIKKNOPQPOMIEIMIBBEEBBEBAtppyEIKIIKMNNNKEAAAyyzAABEBEEEEEEEHIKKMNNNNNNMMMMMKMKNOPQPNMKKMMKKHBtlf633333",
+"(<|59fffc953<~))!!!!!!{((<|<<(_(:::(]^!'!'{(:~'--**%%%%&&%=;;>'!!^^^^^'';;-=%&%$########$#$&-)~'>,''!(_}29ottwABBByxyCGFKNONNOPQRRRQPPOOPPPQQQQQQQQPPOONMKKKKMMMNPPPOKIIMMHEEEEIKIHBwtyEIMMKIKNOONMEBAyyAAyACCCBEEEEGEHIKMMNNMMMNNNNMKKKIMNOOONMKIIKKIEAtlc6}/~~",
+"')~/|599c9953<//~~)!)'!{(___</::(<_(]]''!'!{]!'---**%%%&&*=;;;>!!{^{^^'';=*=%&&$#########$&&*)),;'',!//}29ltttyBHHAxyCGKKNONMOPQRRQQPOOOPQQRRQQQQQQQQPOOONNMMMMKKNOPOMIHIIHEEEHIKIIIEBBBHMMMIIMOPPONHBAyABABACzzEEEEEHEHKMMMMNMNOOOONNKKIKKMNNNONMKKIHEBAwof9<~)",
+"',,))/|3599995|<///~)!)){{(__<<]((<_/{!'',!]~);***&&**%&===;;;>!!{^!!!';-=*%%&$$#########$&&*,))>''')~_}29lttpwBIIByACHKLNNNOOPQQQQOOOPQQQRRRQQQQQQQQQPPOPOOONNMKKMNNOMHEHHEEEEHEBEHIIIEHKNNMIKNOQQPNHBABEEHEEBCBEEEEHHIKMMNNNNNPPPPOOMMKIKIIIKNNNNMIEAAABAti9<{",
+"/~))!)~(<|59cc953|</~~))!{{((_</(]//(/{!'''!{';**%&&%*%===;;;;'!!!!!!'>;;*&%$&$##########$$%*>))'>''){_}29ltwtwAEHBAAEGKKNNNOOOPQQONNNOQQRRQQQQQQQQQQQQQPPPPPOONMKIIKMMKHEHHEHHEAwwAHKMKKKNOOMKMOPPPONIEHHIIKIIHEEEEHIIKMNOOOOPPPPPPPOONNMMKEEEIIIMMKIBwwABByo9|",
+"5|/~~~!)~/|59ccc93|</~){~~~~(((/(((//{{!',!{]);**%&&%%%*=-;;>''!!!!!!';;=*&%$$#####@##@@@$$&%>)~'>'')![:}5iwwtwyEEBABEJKLMNNNNNOPPNKKMOPQQQQQQQQPPPQQQPQQQQQPPOONKHEHHIMKIHEEHIHBwwAEKNNOOOOONKKMOPPPPOKKIKMNMKKIIHEHHIKMOOPPPPPPPPPPPPOOONMIEBAAAEEIKIAtptAAwpf",
+"l9|/~~!)))~<39ccc953|</~~)~{{(]{//(/]~!,'!!//!;-%%%%%%%&*=;;>'']]!!!!';;=*&$$##@####@#@##@#&&-,~)'''!{::}0itywwwBBAzAEIKKKNNMKLNONKKKNOPQQQQQQQQPPOOOOOOOPQQPPOONKHBBABIKKIHHHIIIEBBEKMNOOOOONMIINOPQQQPOKKNNONNMKKIIIIKNOOOOOOOONONOPPPOONMKHBywtwAAEEAwppptwyw",
+"wo9|/~)),,,)~<39ccc995|<//~~~~{{]](<:~!'',!{~{'-*%%%%%%&%&=;;''!^]]]!,;-=*%$$#@@@##@@@##@@#$$*'~~''''{^:[5fpywwwBBAyAEJKKLMKIHINOMHCHMOPPOPQQQPQQOOOOOOOOOPPPPOONKIBAyBEHKMKIHIMMKIEHIKMOONNNMKIEINOPQQQQOOOPPPPOOONMMMNNNNONNONNNNNNOOPOONNMKHBywtttwwyyywtpptw",
+"opl9|/~),'>->,~<|59ccc53|<//((({{]]]</{!',,)~~'>-**%%%%&%%=;;;'!!]^!'';-*&%$$#@###@@@@@@@@#$&%>~{)'''!]::4dpwwwwBEAzAEHKIIKKHEIMNKECGINPOOPQQPPPPPNNMMNNOOOOOOOONMKEBBBEEIKMMKKMNMKBAAEIMNMMKKKIEEHMNOOPPPPPQQQQQQPPOONNNNNNNNNNNNNNMMNNNNNNNNKIEAwttppptyAAwpll",
+"ciolc3<~),,-;=-,)/|5999953|<<<<(]~]]/_/^''''!)'>---***&%%===;;''!!!',;;-*=*&%$###@@+@@@@#@#$$%;)~~'''!^[:39ltwwwBHBAyBGIHIKIEEIMNKHEHMNPOOPQQPOONOOOMMMNNOOOOOONNNMKHHEHIIKMNMMKKIEwpptAEIKMKKKKKEBHKNOOOOPPPQQQRRRQQPOONNNNNMNNNNNNNMMMMMNNMMMKHEBwtolootwBEApf",
+"iilifc9|~)',-==;-,)<3599953|<<<_/~]{]//]!)!!)]'-*********=*;;;,',!'';;;=*&%&$$####@@@@#####$$%='~~!'']^^|39ipwwwBHEAACGGGHKIEEEKMIEIKNOOOOPQPONMMNOONNNNNOOOOOOOONNNKKIIKMMMNNMIEAwpliotwAHKKKKKMKEEIMOOOOOPPPPQQQRRQQPPOONNONNNNNNMNNMKMMMKMKKKIHEBAwpooptAHIEt",
+"HApf9cc9|(~)>-**=*>,~<3599971|<<<///]({{{!]]{~'-*%%%%%=**--;;;!!,';;;;=&%$$#######@@######$$&%*>)/{!!!^]|39ipwywAHHBACCCAEKIBAEIMKIHINOOOOPPONMMMMNNNNNNNOOOPPOOOOOOONMMMMMMMMMIEytpliklopwEIIIIKKKKKNOOPOOOOOOPPPPQQQQQQPPPOONONNNNNONMKKKKIKIKIIIHEEAAwptyEKMK",
+"POEl539c93</)>;==**->)~|359953||<]]]](/!!'!)~~)'-*%%%%&*=;;;;'!]!'';;=*%$$###@@@@+@@@##$$$%%&**;~</{{~][|39fowywAEHBACCzACEEEBAHKKEHIKNNMMNNMKMMMMKMMMNNNOOOPPOOOOOOONNNMMKKIIKKIEwpoikiilpwEIIHIIIIKMNOPPOOOOOOOOOOOOOOPPPPPPPOOOOONOONMKKIIEHHIIIIIIIIEBABEHKO",
+"OQNAi9555953<)>--****->)/|559553|//]](/{!'',)~),-**%%&%&%*=;''!]]'',;-*%&###@+++++++++@###%&%**;)<<_/([:|79fowAyAEHEBBBAwAEHzAEKNKEABKMNMIKIIIKMKMMMMMMNNNNOPPPONNNNONONMMKKEEIKMKHwploollopwEHHHHHHIKMNOOONNNNOOONNNNNNOOOOPPQQQPPPOPOOONMKIHEHEEEHHIIIIIHHEEBI",
+"EKONEpf5|3599|~,>-****->,~<359905|<]{(/]!'''))!'-**%%&&%===-;',!'''';-=*&$#@@++++++++++@##$$%%*;,(<_//::179flwBAAEIHEAAyyAEBAAGMOMEABHNNIHEGGHEHKKKKMKKMNNOOOOPONNNNOOONMMKIEBEIKMKEwpttppootAEHIIIHHHIKKKMMKMMNNONNMMNNNNOOOPQQQQQQPQPPOONNMKKHEEBEEEHHHHHEEAAA",
+"yBKNNHwi5||5cc5<),>----->,)<|599933<(//]{''')!)'>*%%&&**==;;>'''''>;;-=&%$$#@@@++++++++@@@##$%%=-)<_(~:[_|5cipwAABHIBBAyyxzzyzAINKAwAEKKHAzCBGCCEIKMKMKMMNNOOOOONNNNNNNNMKIHEBBEIKMKEywwwwtppwAIIIIHEEEEEEEHEEEIKMMMNNONOOOPPPPPPQQQQQQQQQQPONMIIEEBBEEBEAAAAywy",
+"ABEHKMHwi5<|3cfc3/),>>>>>>,~<|599993<</(^,>',)),>-=*&&%%==;;;','';;;=*%&$#$#@@#@@@++@+@#@@##$%%=-,/_({]^_|38cltyyzEIBxuuuuyzrrwEKIAwwAIIEAzABCzzCHIKMNNMMNOOOOOONNNNMMMNMKIHHEEBEIKMKBywwywtttwEIKIHBAAAAAAAAABBEIKKMNNOOOOPPPPQPQQQQQQQRRRRQPONKKIHEEEBBAABAywy",
+"IKIEEKNKAo9|<|9ff5<~,,>>>>,)~/|599953||<],'>>,),,>--***%*==;-''';;;;=%$$###@+@@+++@@@###$#&&%%==-,{_</^^_<38bipywAEIExuuuuxtrouAIIBwwAEIAAyBBCCCGHIKNOOOOOOOOOOOONONMKKMMKKIIHHHHIKMMKEAwtwwtpwAHKKIEAwyyAyAABBBBEEIKNNOOOPPQQQQQQQRQQRRRRSSSRQPOOOMMKKKKKIIKIEE",
+"PPOHAHOPOEtf5|3ciic|~,,>>>>,,)(|3599555|:),';',,,>>>;>---;;>;'''>;;=%&$$##@@++++++@@@@###$%==-->>)/11_::_1379fpyyAzEBtpruuttqmuAEHByyAHHBAAAyCEEGHIKMNOPPPOOOOOOOOOOMKIIIKKKKIIKKKKMNNKEwppttoptyEIIIEAywyyAABBEBBBEHKMNOOPQQQQQQQQRRRRRRRSSSSRQQQQQOOOOPOOPQPPO",
+"QQOHAEOPPOKAti99fopi9|/~)),,!!~<|3555953|~,,>,,,>--->>>,;>>>'','>-==%&$$##@@++++@@@+++@###$&&*;>')(|33}::|35cfoyyAAAAtpprpttqqpyEEByAEHIAyxAAAHEEGGHKMNOPQPPOOOPPPPONMKHHIIKKKMMMKKKMMMIypoopoolotBEHHEAwtwwAAABBBEBEIKMNOOPPQPPPQQRRRRRRSSSSSRRRRRRQQQQQQQQQRRQ",
+"QPOIBEIOPPOKBwl9cflppi9|</////<<1|5559955|~'>,,,>****->,,,,,'!!,;;;=%$$#@#@++++@##@+@++@##$&%*;-;,{<|72[[||59clwAAzAzwqqmpqtpnpwABAwyEIIAxuyABEBEEHIKKMNPQQQQPPPPPPOOONIIEEIIKKMKKKIIKKKEtllloliiotABEEBwtptwyyAABEHHHIIKMNOOOPPPQQRRRRRRSSSSSSSRRRRRRRRQRRRRRRQ",
+"QQQOMHHIOQQOHAti999iptoc5|<<<<||||33599995|/)))),>****->,,,){]]!'>;=&$$##@+++++@#@@+++@###%*->',,)/_3952}|159cityAAAywrqqqutpootyBAwwBKKEwxwzEEEEIIIHKMNOOPQQQQQQPPPPONKHAyABHIIIIIIHHIKIApolooolopwABEBAtpptwwwwyEKKIIKKMNNOOOOPQQQQQRRRSSSSSSSSRRRRRRRRRSSSSSR",
+"RRRQQPNNOQQQMBwti955fotof5|<<<<||<|||355c95|<///~)>>-;;;'',))]]{),;-*%$###@++++++++++++##$%-,~)){/|35fc94335bcipyAAAytppppwwtrotyBEAyAIMIBwAzAyEEEEECEIKMOPPPQQQQPPOOONKEAwtwyAEHIKKIHHIKIAtoopoooptyBEBAywttttttwAHIKKMMNNNNNNOOOPQQQQQRRRSSSSSSSSRSSRRSSSSSSSS",
+"SRRQQQQQQQRQOHAAwof99fptpi93<<<<|<<<<1||555||<<//~,,>>>>'')!{{]))),>>-=$##@++++......+++@$&=>!)~/<|35ff953799fiowABBAwtpppwytpptyABAwyBIIByAAyzAEAyAABEIKNNOOPQQQPPPOOMKEBytttwyBIIKKIIIIIHAtpooooopwBEEBAwtttppopwyBEIKMNNNNMMMMNOOOOPPQQQRRSSSSSSSSSSSSSSSSSSS",
+"SRQPOQQQQQQONEwAEyof99fpwwof53||11<</]//<|3||<<</~),,>,>'',){]])'',,'>-*=*%###@++....++++#$&*->,)/(_|5cc52459fiopyAAywtppptwwppptyBAwwAEEAAywyAzyywAACzEFKMOOPQQQQPPPPNMHBAwwwwwwBHIKKIIIIHEAtpooollpwAEEByttpolloptyABEIKMMMMMMMMNNNNNNOPPQQQQQRRRRRRRSSSSSSSSS",
+"RQPOKMNPQPOIyoipBBti933cowwpf95|33||<(/~/<|||<<<</~,,'>;',,)!{]),',>--;*=**%%%$##@@+++@@+#$$$&*;;,'!/|7952|70filpwBBAAwpoptwwtoptwBAwwABEBzyyyBAwuyyzyzAEKMMOPQQQQQQPPNKIBBAwtppptAEHIKIHHHEBypoopoilptABBAwpolffilptwyAABHIIKKKKMMMNMMMMNOOPPPPQPPPPPQRRRSRRRRR",
+"PPPOMKKMNNKAoc9iyHyi5<<|5fpplc53333|<(~))~/<<<<|||/),',''''',){)''>--*=%%%%$%%%%$$########$$%&*=;;''!{122}:457filtABBBAtolowwoopptyAwtyABBAxzBEAzxwywyzzFKMNOPQQQQPPPOMIHAAywpoiilptBHIHHEEEBAtppttoiiopwAAytpliffilptwyyABEHIIIIMNNMNNMMNNOOOOOPOOOOOOPPQQQQQQQ",
+"QQPONMMMNNMIAoioAIAi9|/~/|9ili933||<<~)>;'))~~/<|||/)),,,'',,,,'',>-*&%%$####$$$$$$$$%$$%%&***---;'!!!{13}[_1|85cipwAywpiijopollopwAwttyBEBAzAEAwxxuwwzBEKMNOOPPQQPPPOMIHAAwupokiilptAEHHEEEEBAwtwwtoiiloptwwtplifdgioptwyBEEHHIIMMNNNNOOOOOOOOOOOOOONNNNOOOPPQQ",
+"RQQPOMKMNNNNNHAwAAti93/~~~<9iiic53|</],;*;->>,)~/<</~),'''',,,',''>;*&$$$##@@@@@@@@#$$$$*=*->->,''!!{){<43:^_1|439iptppifccgiifiiopwwtptyABwtwzywtwuqwAAEKKNMOOPPPPPPONMIEAyutpolllootAHHHHHHEEBAAAytpliiilptttplifdfilotwABEEEHIKMMNOPPQPPOOOOOOOOONONMMMMKNOPQ",
+"PQQQOMIKMKIKNNHApof993</~)~<5fiic93</~,>**%**=->)////)),>;;;;>>';;>-*&%$##@+@@@++++@@@##$%*->>,)~{//~(/<|52:<<__|29looli9589cfccfilpwpootyAtppwxptpuqwxABEIKMOOPPQPPPOOMKICAywtqpppppptBIKIIIIIIHEBAwtpoiiilptwtpolifiilmpwABEEHIKKKMNPQQQQPPPPPOONMMMMMMMNMKKMO",
+"MNOPPONMMHBBEHEypf953|||/~))/5iolc5|/~)>**%%*&*->)///~),>>-;;;>>;;--*&&$###@+++++++++++##$$%*->,'{{////||5832}:}269ioolic977cc99cfiottllpwAtlltpqqpoqqwAyzEIKMNOOPPPOONMKKEBywttqpppoppwEIIHEHIIIIEAwwwtplilotwAAywwtppoopwyBEHHIHKKKMOQQQQPQQQQQPONMMMKMNNNNKIK",
+"MMMNOOOOOKEAyyAwtof5|<<|3<),~<9lpi9|</)>-*%%*&%*-,~//~~),,>>;;;>;;*=%%&$##@+++++++++++@###$&&*-;''''!!~~_|593321359fptpoic90dcfcfiiowwpoopAwpopplmmlqqwuxzBFKKMNOPOOOONKKKHEyttpppooolotwBEEBBEEHHEBwtttpoiilowAEEEEAAyyyyABEHIIKKIIKKNPRQQPPQRRRRQQONMKKMMNNMMM",
+"NNMKKKNOOONKEAwtttpi93|353/))/3cilf5|<~,-=*%%&%&*-,~///~)),,>;;;;;-*%%%$##@@+++++.++++@@##$&*=-;'';''''')/|3|<<<<|39ipppoic9cfifillpwAwpotwywtpolikinuuwxzAEIKNNOOOOOONKKIEBytuoolololooptwBBAABBBAAwpllllifcflpwyAAAAABBABEEIIKMMMMKMNPQRQQPQQRSSSSRQPONNMMNMMM",
+"MMMIIEEHINOPPNHyttwwpi9995|///|39ilf5|/)-*%%*%$$$%-,~~~)~)),,>>;;;-*%%%%$#@@@++++...++@###$&%=*;;;;;;;''''/<<~~!){/|5ioolifc9cffiilpyEBwttyEEywpiikgjquwtxzFIKMNOOONONMKHEBAytplkilllollloptyAywwwywwtoifiif999cilptttttwwwAABEIIKKMKKNOQQRQQQQRSSSSSSSRQPPONKKK",
+"KKIHHHBBABIMOPOIBAABAwoc53|<<<<|39ilc3<~,*%%%%$###%*,,)))))),'>--;-*=%&%%$$#@@+++++++@@###&%%*;;;;;;;;;;;')/({''''!{_5fifc95599ccciltAEAwtwEIHAyoiigjiqqtwzDEKKMMONNNNKIEBAxwtqplkllllliililpwwwtptttpplififc55599floooppppwyyAABEEEIIIMNOQQQQQQSSSSSSSSSSRQQONM",
+"OMKHHIEEBABEIMMMMIHHEBwoc5|<<<<|35fiic|/)>%$%*%####&=>>>,)))),,>>--*=%&%$$$##@+++..+@@####&%&*;;;;;;;;;;;;'!~{';;;''{<0cc953|35959cciwBBwptAIIEAtligdemmtwzAEIIMMMNNNNKIEAyuuppqollifeffiiiiiptwtppppppoliffc955555cilloppptwwyAyyAAAEEHIKMOPPPPQSSSSSSSSSSSRRQP",
+"QPNKIIHIIEEEEEEHIKMMKIEyoc53|||5559fol9|/)-%%%%$#@@#%*-->,,))),,>>>-*%&$#####@+++..+++##@#&%&*;*;;;;;;;;;;;')),---->,~|9995||||595359lyBypptBIEAtiebdemmquxAEHIMMMMMMMKIEAAuqomqpomiicccfffgilpttppopppooifffc9553359filooppptvwywyyyABEHHIMOPPPPQRRRSSSSSSSSSRR",
+"RQPNIHEHHEEEEBAyAEIMNMMKApic5339c95cotl9|/,-%%*%#@@##%***-,)))),,>>-*%$########+++++++@#@$&%*******;=;;;;;;->),;===->,~39995||<395259fpAypopyEBypicedeempvuAEHIKMMKMKMKIECAwuqmmoppoifccccffiilpttppoooooiifffc9533599fillopptwwwwwwxwyAAEEHKNOOOPQQQQQQQPPPPQQR",
+"PPPOMIIEBAwAAywwttyEKMNNNIAtlc9cfc9cltti5<)>*%%*%#@@#$%%%*-,))),,,;=*%%$###@###@+@+@+@###$%&***=*&%&**==;=*==',>-*%*=>)<5c905||335359flwytolpwwppifeggjmpqvxDHIIKKKKKKKIECAysrnjoppuplfccccfilllppppooollliifffc9555559cilopttwwwwwwwxwwyyCEIIMNOOPQQQQPONMMMNNO",
+"NNNONNMKHAwwttttpoopwBIMNNNMHAtppoolotwo9|~,-***%$#@@#%%%%*>,,,,,,>=*%%$$###@##@@@@@@##@#$%&***%%%%%%&*=**&%%-,,>****->{3cc999535559ccfowwoifooppofffgjmmrsuDFHIIIKKKIIICCAvurnkmnpppolfcccfloolloppplllliiifffcc9557550cfipptttwwwwwyywwyABBHIMNNPPQQQPOMKKKKKK",
+"HEHIMNOONKEAytpoliiffipBKMOOOOMIHEAywAytf5/)>>**%%##@#$%$$%*->,,,,>-*%&%$$$#@@@#@@@@+###$&%&****%%%%%%**%&%%&&;'>==&&->,<9ffffc55555599fopofdilptpihhgjmmruuDDEEIIIIIIIHCByvqqmnmolilllifccfioooooooooliiiffffcc9955333599fiopppptttwwyyyyyAAEEIKMOPPPPPONMKKIHE",
+"BAAABHMOOONKIEwoifcc99cltBINOOONMKIHBBAyo9|~),-*%%$###$%$$$%*->,,,,>-*&%%$$#@@@@##@@####&&%%******%%%**&%%%&&=*>,,-;;->)<5iiiif9333||425fomgc9ipwtibegemmrtuxDBFEIIHHHIHEAyvuqqnmoifgiiifffffioppolooooliifffcc95595533335afilooooppppwwxwyAAAEHIKNOPPPPONNMKKHE",
+"BAwwwyAIMNOOOMHwof999599flpwEKNMKIHHBBAyti5|/~)>-*%%$$%%%%$%*->,)),,>=*%%$#@@@@########$&%%****%******&%%&==***>)~),>,'!/|ciffc51<<|_<139ipld0fowwocfgjmmrsuuxDBEEEHHHIHHBDvtqropomfddgfifcccfiopololloliifcc9955555553337adfjilllllppptwwwwzzBBEIINOOOOOONMKIII",
+"CytqpptABHIKMMKEwof953599ccfowBEEAwwwwwwti953</)>-*%%%%**%%%*=->))),>-;*%$$####$##$$$$$$&%&****===*===**=;--**->)//)>>>,)/|9c995_(<<<<122cloidcitypffhhmmrvvsuxDBEEEHHHIIEDyuusppmlfc0cdfffc99cioooolllliifc99553355557735a0behiikilooooputwAyAAEEJMNNNOOONMKIKI",
+"BuuomorpwwwyABEEBypf5||39999cipwytpoooooi9355|<~)>-%%%%***%%%=->,))),,>-*%&$$$%%%$$&&&$%%*=*--*=--=-;-*=;--*=**=-,)'-*-->,~|9995<((<</(_25foofcfowtihkjmmrnorquwDDEBEGHIIEEAwuutppolcb0ddffcc99cfilliiiiiifcc95533559957756d0c9hhiilionopupwAAyAECGIMMNNOOOMKIIE",
+"AuqjjkhinloooptyBBypf5||35559clpwwplifc99|<|3|/~~)>-*%****%%$&*=>>,,,,>>-*%%%%%%%$$&&&%%&*****=*==*=**&&*%%&&%%&%=>';%%**>)/3999|_(__<(_}39loifciopifkljmmponrruuABBBBEHHHEBywxttpoofb99cffifc9059cffffififfc955333599990999ddcchgeiijonlrqptxxzECCHIMNNNNNOMKIH",
+"ByqmjggeebbcccipwyAytof5553335clpwwtof95|</<||~))))>*%%*-*=&%%%**->>>>---=&$$$$$$$#$$$$%&%&*%%&&&&&&%$$$$$#$&$###$*;;*&%%=;,<5995|_(<</_}}6foliccioiifkljmmkonvuuxABBBEEEEEEAwwwwppolfccdffffc9533399cfffiiiffc9955599c90ccccc9gdhggijomnrqqpxxABCCEIKNNMNNNNMKI",
+"HAuqjhgba663239flpttyAwoic5|||5citBBypf93|<<|<~',,,>-*%*---*&%%%**---;-***&$#######$###$$$%%%%$$$&&$$#@####$####@@#%=*%$#$&>)<5593<_<<</}}29iplfccffcfilonqmmppssxwABABEEEEEzyywwwtpolfffcccdc99533359ccfiiiiffc995355999c988090cciiilnoorqqpxxAACCHFIKNNMMNNNMK",
+"KEAuqjjg8664}||59fiopyBBytl93||39iwBBtlf953|3|/),,,>-*%%=>,>-*******--**=%%$############&%&%%%$$$$#$###@#######@@@@#%=&$#$&=>)|5953:_<|<}}}5fooic9c9bcijmolqmmppuwxAABABEEEEAyywwwttpoieccdcc999997333599ffffffcc99535599ccc88a99cdhfilonorqpxxAACEHIKMMMNMMNNMM",
+"KIEAuqjg8a24:<<<|359ipyBEEAti93339ipwtplic533|</~)>>-**%*-,,>=*-*==**=***=%$$##########$$%&%&%$$$$###@@#####@@@+++@@$&=%$$&&->~|5954||3|22239ipoicc9acfiooolqpqttwwyAABABEEEAyywwttpplkicccfc99999553|3559ccffiiiffc99cccjiiffcccdchiklooorqtxwyyBCEKKNNMMNMMNNM",
+"MKKEwuigaa21:_(///<|9ipwAEIHAof5535ciptpoic533|</)>>--*%&=>,,---*=***=*****%$##@@######$$%%%%%&$$####@@@####@+++..+@#$==&$$&*-'<35553|3352226fotoifccciioooolpmmttwyAABEEEEEAyxtttqoooiiifcfc995999955559cffiloooooliiiiilloliiifiilloopppttwyxAABCHIKNNNNMNMMMN",
+"MMMIExuke861[_(~////|9fowAEIHAtf95559ipttpif953||~)>-*****-,,,-*=&%%%=***--*%$$#@@#######$&=&%%$$###@@@#####@@++..+@@#%;*%%&*-'~|599955555559cittoieciilioomlnmopttwyABEEEEBAwtprrppoookggf9c999999cccfcciiiilppppppoollliiiiiiiiillooopttwyyAAEEEHIFMNNONMMNMMN",
+"NKMMIEymib64_[]{//(/||5iptyBEHBtic999cipttpiffc95|/)>**%%%*-,,>**%%%$&%**---**%$#######$#$&**=%&$###@@@@@##@@@@++++++#$=;-*==-')<59ff99999599cfowtlfffiiilooonlomttpxwAAEBBBAytpqqpqplllgccdfcccffiiioliiiiilillloooolllliicddccfgiillloppswyAAEEIIKMNOOPPONNNMM",
+"MKKMMKEwoia61[]/<||||||9fiopyBEBwoicccflppoiffffc95<)--***=-,),-*%%$$&%%**----*%$###$####$&%%**%$$#@@@@#@#####@+++++@#$*;,>>;>,)/39fifcc999599cipwplfifffilooolimmoouutwyADAAAywtrrmmmiiiggdgiiilpptpppliiiiiiifiilllllooolic9099cfigiiknopuwzzBEHIKMNOOPPPPOONN",
+"ONKMMKIBwof94}<_|33|</<|59cfipwAAytpicfilolfcccccc9|~,>>>>>>,~~>-=%%&$$%%*->->--*%$$&%$$$$$%****%&&####@###$$###@@@@@$$=>)))>,,)~|5fiifc9999559fottpliiffcilllkikkglnrpuuyAAAAywwpqrnliiiilikllmopwAywtplliifififiilllloooolic0899dffiijnlrutxxAEEGKMMNOPPPPPOOO",
+"OONMMMKIEtic62<_|33</~)~<|5999fotyAAtlilopoi95999553<)>>>,,>,)~)>-*%&%%%%-->>>>>-;**&**&&%%*;**=*&&%%$&$$$%%%%$######$%%=,~{),,,)<3ciiiifccc999ciottoifc988fffgdhgggmlrquwAAABAwturpqomoploollllopwyyttptplliiffffffiiillliiifd99999fiijnloqtxwABEGILMNNOPPPPPOP",
+"ONMKKKMMKEtl92__<|3</~))~/<35599iotAAwtppttoc5555555|~>->,,,,,)~,-**&%%%%*->->>>>>------=*=--*****&%%&&$%$%**%%$#####$%&&-)//),)~/|0ioooiiffc95559iolfc986a9cfegfbggijmmquyAAAAwuqquuttttpoooiiiilopttttttpplic99999ccfiiifcfccdc800cffilloqtxxACBCIKKNOOPPPOPOO",
+"ONMKJHHIKIEyoc3|/_|<</{~~~~/|5999cipwAAAyywti53555555|~,,)),,,)~)>-&&%%$$%**;->>>>>-----------***==%%&&$$$%***%%$$$$$%*=*-,/</~~/<|5cioolic995|||19fic999626bcfgdbgggiinmqwyAyyytpquttwttuppllifffiloopttwttplf955599ccffffc9c9cc990dccfjjmqsuuyCEEHFMMOOPPQPOPO",
+"OOMKHEEEEEHEypf93|||</~~/////|5999ciotwBEEBwo9||333333|/~~~),,,~~)>-==%%%&&&*-->>>>>--->>>>>>-;--=*%%&$%$$%*---=%%%%%*--->,)<<<//~(_|5cffc54|41_<||9cc95762aaccfghdggnlqqqpwwyyyywwututpppppolliiccfiilopttttpofc599ccfffccccc99cccccecfijoqrusyCCBFIMMOOOQQQPOP",
+"NNMMHEBAwABBAwoi9343|<///|||<|359cciloptBIIBwl9||||||||</)~),>>,~~,>==*%%%%*-->>,,,,,>>>;,,>>>>>---***%*%%*-->--**&%%**=**->,~/~)!!{{/|9c953||1____|7cc977626bcfgdfkkkmrrqqtwyyAAAywtuqpmmloooliifcccfffilopptttplfcccfffcccccc9ccddgfeiliqqpuyyBBGHILMOOOPQQPPO",
+"NMKKHEAywwwyAywoc53353|<|553|3359fflliiltBHHEyo933333||</)),,;*-,),>=&%%%%%%*-->>,,,,,,,>>>>>>>---**=*%%%$$%**%%%%####$&&%%&-,)~)'''')/|9993|<<<((/(<7c9056266dcfghgkkooqrqtwyABBAAywtpommlkiiiiffcc99ccfiiiiopwyytlfccfccc99ccccccfiiiiloqppxAEEGFFIMMNOOPPPPOO",
+"OLIFCBAxtpptwAAtl9533533599533359fiiliiopyAEEBApc99993||</),,;**>,,>&$######$%**-->-----;--*=-***&%%%&$$#####$$#$###@##$$$&&*;>!!!''>,){|553|<<<_({~(|9c90566689ffgfkknlqrqtyBEEBBAywwpolkkfggccfcfccc9cffffffipwAAwpiffc9999c9cccfgifilloqpxwBHHHIFILNNOPPPQPOO",
+"OLIFAAyurmmoptAytof5||||59fccc99cciiloopptABAABApifff53||<~),>**-,,>*$$#@@####%%**=------=*%**%%%&$##$###@@@#######@@#####&%%&*>!!';-;''~|553|<<__{{{(|9cc0866889fgikklinnqtABEEEEAAywtrllidd90999cfiiifffcc9cffiotwwtoif9999c9ccccfiiilinmpuwAEIIKKMMONOPPPQPPO",
+"OLLFBvwqrmieiiptwwplc5|||39fiopppiiiloopppwBAAABAplii9533|/))>--;>>>-&#@#@@@@@#$%**-----;=&%%&%%%$######@++++@@##@@++@@#@#$$&%%-'!!>;;;-,~|553|<__({]{_49cc066aa0fkifkglnrptyABEEBBBAAwpolif9999099ccffffffc99c9ccfiotttoi999c9dccffiiilnnmruuAEHIMMNMOOOPPQQPPO",
+"OMLFFzvqnmebb9ciotttoi953359itHMHwtpollollpAEBBEBwoif95595<~))>>-->>-&#@@+++++@#$$%*----*=&%$$&$##@@@@@@@.+++++@@@@+@@##@##$&%==;'!,';--;,~|5531<_</{](/38cc966a8fkkikkmrputwyyABBEEBAywpoiffc9c9995559cffiffcc99599cipwtpicc9ccccgiiiioooqpuuzBEGKMNOOOPPPQQQPO",
+"OOLIFzvtqkeb96259iopoic99599ftINIAwwtpoollowBEHEEAtlf955993<//~),->>-*$#@@@++++@##$%******&&$$$####@+++++....+++@@@++@##@##$&%==;;'),'-=->,~|553|<|<_(~][20cc969afgkimioptuuwwwyzAAAAAwwtpoifffc995573559cfiiifc955599flppoliccccgfiiiooopqppuyyBGFKNNOOPPPQQQPO",
+"OOMKFzzwqkij96}||5ciif93359cipEKEtooppttpoopwAEEEBwpif99cf93|<</),>>--&$#@@@++++@##%%*****=&$$#$$##@@++++++.+.++@@@@#@##@$#$%%=;;;;,',>--=;,(|5353|1<_]/_}29cc98ccfiommpptuuwwwxwyxwxwwwttpolifcc9533333559ciilic953599cfloollicccfiiiiolpqqpuuyACHKNNOOPPQQQQPP",
+"OONMKCByumjjc9}<_|39cc9|<<39flAIBpc9cipwwtppttwyAAytoifffi93|<<//))>--*&##@@+++++@#$$%**%%%*&$$$$##@@++++.+++++++@@@#####$$&%==;;;;;,,,>===;,(|35533|1_/(:}5cffccbfipppupsuuwwwywwwwtpptttppolifc99533333559cfilli955559cfiilooliiiiiiillloqrwuyCCEKMNOPQPQQQQPP",
+"OOOOKHByxrljc921_/_|5993<//|5cpBEtc335cltwtttppoptwwtoiiff93|<////~,-***$##@+++++@##$%%**%%*&&$$$###@@+++.+++++++++@#####$$&%==;;;;=>>,,-==*-,~|35577|1</[:49fiffbcgouutppqqswwywwwwttppppqpolliifc953333355599fllifc979cdffiopppoiiiiiilloqpwuyAACIKNOOQQQQQQQP",
+"POOOKHBAupojeb52<(/<<399|<~/|9iwEAl9599cilptwwtliiottpifc95||</~/</)-=***$#@++++++@#$%%**%%%=&%$#$##@@@++++++++++++@#$###$$&%=;;;;==;->,';***-,~|555733||}:15ciilfffltutppqptvwwttttttpppoomoliiiifc955333355559fillif9909ccflottpoolnlmlloqqpuyyACFKMNOPQRQQQQP",
+"QOONMICwurmjeb564|(]{<355|/~~3fpABtfcffiiilopwwtiffiptoic93<//(~)~/)>-****$#@++++++#$$%%%%%%&&%$$##@@@@++++++++++++#####&%$%==;;;;===*->,'-***-,/|55557552}|38dfllikipqqppqpttttttttttppppollliiiiiffc953333353359filiic9009cflpttpppppppoooppxuyBCFLNNOOQQRQQQP",
+"POONMICzqlkfa85434_~{~<355|~~/5iwAwicfltwpolipwwtlffiptpof5|/~/~,,)~)>*&**%##@+++.+@#$$%%%%%%&&%$##@@@@+++++++++++@@@#$$&%&&=;;;;;===**->>>-***-,/|59599c96|458ciloooqmpoqqpsttttttttttpppooliiiffiiifcc955333333559fiilic909cloptwtwwwwtpppptwwABGHKMNOPQQQRQQQ",
+"QOONMICAwqkbb67}<1|</~~/|33|//<9lttoffoyBAwtpopwywplilptwpi9<~~~),')~,-*&=*%#@+++..+#$$$%%%*%***%$###@@@++++++++++@@###$&%&*=;;;;;;===**=->>-***-,~|5599cfc556a8flpttpmooqqpppputttttttpppooomiffccfffiic995553335599cflolifcdiotwABEEEAwwtwwwAABEHIMMOPPQQQRRRQ",
+"QPOONLEztqjhb64[_/(/</~~/|53|//|9iopifitABEEBwtwyywtolopwwti5<~~),,,)),**&=%$#@++..+@#$$$%%%%&&*%%###@##+++++++++@@@###$&%*;=;;;;;;;==**=*->>--*-;,/|599cfid9a66cipwwwppopqqprpuuttttpttpppoollifcccccffiiffc955755999cfloppollotyBHIKIEAywwyAEBHIIIMNOPPQQQRRRQ",
+"QQPOOMIBxqjhb62_[{{{~//~~/|53|<<|5cooiipyEIKIHAywywwtpllpttof3/~)),>,))>*%%*%#@++..+@#$$$$%***&**%$#@###@++.+++++@@@###&*=-;;;;;;;;;==***==->>>-*;;,(|599cfifc66bfopwwtttuqmopppoppttptttppoooliiifcccfffiillfc99999cccfilppttpppwAEIIIHEAyyyAAEHHIKNNOOQQRRRRRR",
+"RQQPONMJAulkb861[({'!)~~~~<|33|<||5fiiilwBHHBAAAAAywwtplllopoc|/~/~,,'~)>*%%%&@++..++#$$#$%%*=&***%#@@##@@@+++++@@@####&%=-;';';;;;;;-=**&==->>>;;>>)/|55ccggf99ccimpwwywtpmmmponoppptpttpppoooiiiifffiiiiloolifcdf9ccffiiilpttttwwABEEEEEBAAyAEHHIKNNOOQQRRRRSS",
+"RRQPOONKHzrmf861[({!,,,)))~<3553|||5cfiltAAwppttyBAywwwplilptpf3|</{))~~)-*%%&$@++++@####$$%**=****&#@###@@++++@@@@##@#$%=*;'''';;;;;-=***===->,';-;''(|59ccgffcfehklptywtppopmmnnoooppttpppppolliiiiiiilllooooliiiffcdcff9bfltwyyyyyAABBEEEECAEBHKKMNOOQQRRRRSS",
+"SRQQOOOMKHAulia7}_({),,,,))~<3995|||39fopwyplillpwBAyyyypliowwtic53|//~/~,-&%&%#@++@@@####$%**=****%#@@##@@@+++@@@@##@#$%*;;''!!';;;;;=;***===>',';-''!{|99cfefilifgjmqttwtppoomlnoopopppttppppoooooliiiiiiopppooolifc999d99ciotwAAywyAAAEEIIHEGBEIIIMNOPPQRRRSS",
+"SRRQQONMKIBysric0a|_~)',',,,)<3995|||3clptwtoiffiptwAyyAytllpwywpi953|<//~>*%&%%#@@@@@@##$$%*-*****&&####@@@@++@@@###@$%%*=;''^^!'';;;=;;***===;',,',''{_26cifiopplkiimoppppololkinoopoppppttpppppoliifffffoptpopmlic97759a99cfiotyyyywwyABBEEHHEEHEHKMNOPPQQRRS",
+"RRQQPONMKIEywpolfc93|(~))',),~<3999|||5fllopplc99foptwwyAytpopwwwtof99|<<<)-%$$%$#@@@++@##$$%*=-***=&$@##@@@@@@@@@####$%&*=;;'^^^!'';;;;;****--;>,,!'''!{:29fiipptpojiiimmopooiiikiolooppppptttttpoliififfiottplifcc99079909099dioptwttttyAABEEIHHHEGKKNNOPQQRRR",
+"RRQPPOMLIIEAwtolffc953|<~))))){<59c93<|9fffillc559fioptwyAywwwwwwwwpic53||/,*%$$%$#@@++@##$$%==--=*=*$####@@@@@@@@####$%&*=;;'!]^^!,';;;;;;**----;,!{!!)^]16bflppwwplkifhfllmlliiggilloppppttwwwtpoiiiiiiilpwtlfc055999c05508888cfilpppptwAABEEIIKIIHKMMNOPQQQRR",
+"RRQQONMFGEEAwppigcdc9953</~~/~~/|5cc9||39c9cfif9539ciilptyAABBAywtttplfc5|<~,*&&%%%#+++@#$$%%&=---*&=%####@@@@@@@@####$$%*-;'>!!!^^!''';;;;;*----;>'{]{{^]_16cipptwtpokddccfililfffgfilmopttwwwttpoliiiiloottoic933375599009d909ccfflopttwyABEHHIKKMKKMMNOOPQQRR",
+"RRQQPONLEBAxtplfifcc99554|<</<//<|5cc93|39999fif53359fiilpwAEEEAywttppooi9|/)>%&%%%$@++@##$%%&*---*&=%$###@@@@@@@@@####$%&*=;;!!{!]^!'''';;;;;;;;;;'!~]:^(:228ioopptpplgcd09ciiiiffddfilmptwwwtttpolliilppptpic9553|433599ccccccccfcilptwyyAEHKIKKNNNMMNOOPPQRRR",
+"RRRQPONMHCAxtnied9999555543||||<</|5ccc533599cii93||59fffiotAEHEBAywtpppof3/~,-&%%%$#@+@##$%&&*;>--&&%%###@@@@@@@+@@####$%*=;;'!{!!^{{!!''';;;;;;;'',!{[::_}26biopppppolgd00a9fffiffddfilpttwwtttpooolopttttoic9554|}1|35dfcfffeffgilopwAEEEIMNOOOOPOOPOOPQQRQRR",
+"SRRQQPNMKECxsqib8967575555533333|<<|59fc53599ciof5|||5cfiffioyEEEEBywtpoli9</)>**%$$$#@@#$$&&**----=&%%$##@@@@++++@@@###$%&%=;;!!{{!^^{!)''''';;'''''']^:11}26bbeiloooooifd0786ddgfffddiiopppptttppppopttttpofc95511<|13559cfilliloptwyBEKMNOPQQQQQRQQQQQQQQRRRS",
+"SSRRQQOONIHBytpkb85633755555337553|<|3cc9559ccili93<|5cfili99itAEHIBAwtplic5|~,--%%$$$###$$&&**-;--=&%%&##@@@+++++++@@###$%&==;;!!{{{]^^!!!''''''''''!^^_162668abcfilllliic9776500dfifgillliopptttttpptppttplfc953|||3543559ilptttttwAAEIKNOPQQQQQQRRRRRRRQRRRRS",
+"SSRRRQPONKIEAywplf9a4773334333335553||599559cfiiic3<<3ciilic59fowBEEAywtoic95<~,;*%$%%%%$$&$%%*----==%%%$#@@+++++++++@@#@#$%%=;;'!!{{(^^^{!{{!)'''''^^^(_}2aaab888bffiiiiiic9725500cfiiiiifiiloppttwwwtppppoic9555333555559fiottwttwyBEHIKKNOPPPPOPPPPQQQQQQQRRR",
+"SSRRQQQOONKHBAAwtoi995573||||33||3555359c95559fiif9|<3ciloif9559fpyBBAwtplc95|/~,>*%%***%&&$%%*=----=%%%$##++++++.++++@@#@#%&%=;;!!{{{({^^^^({{!!'!^^^^(_}}26cba8aa99cfjffffc9732357ciiiiifffiilpptwywtpptplf995555595999ffiiloptwwyAEHHEEEEIKMMMKMNOOPPQQQQQQRR",
+"SSRRQQQPONKKEAywytqlf9053<<_<<||||335359cc95359fiif9339ciolic54|39ltAAyytpi95|</~)>*%*->>*&%%***-->>==%%&#@++++....++++@##@#$&%=;;!!{{((({^^^[[[^^^{^{(_}}}28bb98aa868accffccc9743570ciifffffiiloppwwttttwpic953559999cfiiiffioptABBBBAywyyyAEHKKMKNOPPPQQRQQQRR",
+"SSSSRRQQPOMMIBwwtttplc997|<<(//<<|||33359ffc5339ilif9559ciiif951<|9ityyywtpi93<//~)>**->>-*%%%***;>>;=%$$#++++.+.....+++@##@#$%==;;!{{((_(((^^^^^[^_[(__}}2268ca698a6a6689cccfc976357ccccfffffiilptttpptwwpic95359cffiiifccciotwAAAywwwwtwyABEIMNOOPPQQQRRSSSRSS",
+"SSSSSSSRQPONKHAwpppoifd0554|_/(/~/<||33359fic535cilifc959cccfc9|<<|5fptywtplf93</~),>--;>>-****=*->>;=%#$#@++..+++....+++@#@@#$%=;;'!{{(____(((__1111122}}}66866a6aa2}}}65999cc9d959999999cfffiilptpooptwwpic9559cfilifc99flpwyAywtppwyAAABEHIMNOPQQQQQQRSSSSSSS",
+"SSSSSSSSRQPONKHBwtpoifc9577553<<{//<||33|39iif959fiiffc99959cc93<</<3cottpplif93<~','>;-;>>>-;;***->>;%$#@@@...++++....++++@@#$&%=;'!!{___}}__[___1122222266a22226662}[:[2355999cc99d95559ccffiioppollpttplifc9ccfiiic999ipwAytppppttyEHIIHEEEIKMOOPQQPQQRSSSSSS",
+"SSSSSSSSRQQQPONKHEAyplifd5559553|<///<||||39iif999cfiiccc9559995|///<3clopoiiif9|~,>>>--;-->>>>*=*;>>;%$#@@+............+.++@@#$&%=;'!{___}}}}}}}}}2226a686a222222662}}:[:}225799cccd9955799cfilopplilpppliifffiillc535clwAAypllotwyyBEIIHEAAyBEKMNOPPPPQRRSSSSS",
+"SSSSRRRRRQQQQQQPPNKKEAwtlf95555953||<</|||||9flic99ciiffcc553555|<</<<|9iooliffc5<{,;>-->>>->,,>**->>;*$#@@@+..............+@@@#$&%=;'!(__}}}}2}}}}}}2268aa86622}22222}[:[[}}32399dff99555599cflppolilopliffffiopof5|3fpABBytooptyAAyAAyAABAAAEIMNOOPPPPPQQRSSSS",
+"SSSSRRQQQQQQQQQQQQPOOMIEypic53|33|33||<|3|||39ilfc9cfiiffc553553|<<<///|9iloifc995|~,>->>>>>>),,--->>-*&#@@+++..............+@+@#$&=;>'!(}}}}2222222226866626662222}1}}}1::}}[}|300c9999955999fipolliiooiffffiiooi935cpAEAywtttwwyyytppptAEHIIMMNNNNNOPPPPQQRRSS",
+"RRRRRQQPPPPPPQQQQQQQPOOMIEwpic53|<<|33335955|39fifccfiliic93|333|<<//~~/|9iooi955993/),>,,'>,,),,--;>-*%#@@+++...............++@@#$%=;'!^:}}22886666666666626662222}}}}:_:::__::|3795999c9999cfloliiilooiffifillf999coAEBwtwwwwwwwtoiiopAEKMNNNMKIIIKKNOOPPQQQRR",
+"RQQQQQPOONNNMNNOPPPPOOOOOMIEAwpi9|/<||3335993335cfccfiooli953|<|<//~~~~~/|9ioic535cc5<~)))),)!!)'>--;-=%#@+++.................++@@#$%=;']{_}}2866666666666}222222222}}::::<:}[::}|3335799999cciiiiifiioliiiiiiic559coAHEAttwwwttpliffotAHKMNNMMIHBEEEHKMNOPPPQQR",
+"QQQQQQPNNMKKIHIKMMMKMKMOONNMKKIApc3<<<|||35555335cfccflopoic9|//~~~)))~//<39iif9335995|/~~{)){!)),>---*%$@++++.......... .. ...++@#$&*=;'^]_}}866666666666}}22222221}1[_::_:}}:_||11|439999cffiliiiffilliiilllf559ciwEHBwwwtttplfcciowBHIKKIHEHEBABAAEEIMNOPPQQQ",
+"QQQPPPONNMKIIHHHHIEBBABIMMMMNNNMEti93<///<<|333||5cfcfioppoic3/~)))))))/<<|39cfc93335995|<//({~{)),>;--%$#++++...... .  . .  ..+++@#$&*;;'](_}266666666666}}222}22}}[:[::[[/}||:|}1<<||55999filliifffilifiloplc59fltAEAwtwtpptlc79itAHKHHEByyABABABAABEIKMOPPQQQ",
+"QPPOOOMMMKKIIHHEEHEAAwtwABBEIMNNMHyoc5|////<<||||59cfffloppoi93/!,,)),,)<<<<|59c953||5cc93|<</{~{)),'>-*$#++++......     . . ...++@@#%*;;'!^(_}26666666666}}222}22}[::::]]]:<<||334_|||33559filliifcfiiifioppicciopAAyttptpttof50fpBIMKEEAwptwyyAACBABBHIKNOPQQQ",
+"OOOONKKIIHEEBBCBAEBAAwttppptwBHKKIEwpi93|///<<|3359ffffiloppoi9|/))))),,)/(//<35995335cffc95|</{{{))',-*$$@+++..... .    .     ..+@@@$%*;;'^^(}}2666666662}}222}}2}[::^^]]]::::}363||||1|355cilliifffiiiilopiccipwAEytppppptpi99itBHKMKHAwpoppwwyAEEBEBEHHKNOPPQ",
+"OONNNKIHBByAwwwwwwwwwwwtpllllotAEHHBytoic5|<<<|||35fiiffiiopplf5|/~)))),>,)~~~/<|595559fiifc93</{{)))),-%$@@++....          .  ...+@@#$&*;;'^^_}}266666662}}222}22}[[::^^]::_<:<3331|311|3379iiliifffllilooofcclwBHEwppoloppiccitEHHKKHAwpoooutwyyECBEBEGCILMOOP",
+"PONMKKIHBAxxtqpoolooooptpolliiiotABEEAywpoi93|<|||59iiliiiilllic5|<~))),>-',))))~<359999fllif93</~)''),>*%@@++...               ..++#@&%&=;',^{_}}26666a62}}222222}[[::^:::[<:::||1|}33|35359fiiifffioooppplfcitBHIBtpollpoid9kwEEEEEAwppoooptwwwwyABHEECCFIKNOP",
+"OONMHIIEBxxppmlhjffffgfloomlliffiotwAABAAwtpf53||350ciopifcfiiiic5|</~),>---,,),,)/|59555fioif93</~),),,-*#@++...                ..+@##&%=;''!^(_[}66666666226222a642}}}<<::_::}|1_<:|1|3557cfiiffffioopptplffoAHIHypollppi95fpEHBywtpolproppwywttuzEHIECCFFKNOO",
+"NNMIGEHEEyzsqmleebbc9909gfiiliiffiilopwABBAyplf9597559iolc99fiillf5|</~)>>-;->,,,,)~|55559fillf95_/!)),>>-$#++...             ......+###&%*;''^](_}26666666889886067222}}::::]]:}<(/:_<||3559fffccccioopptpiioyIKKEtoliotpf59lAIBytploloprpwyytpnquzEEHHEEFIKNOO",
+"MMMIHEEEAAAtqqlgeba87976809cgiifffiffilpwBEBAtplic95439cfc99cfioolc5|</~,>>>---,,,,)/|3559cfiolic5<{~),>--*$@+....               ....+#@#%=*;''^^_}}}6a6a99899889b99652|}1:_:]:<<_(//<_|||359fffcc99flopppliltEMMKApifipti95iwHIAtpopptwwwwAzwpnnquAEAEEJHIFKNNO",
+"KIHHHHBBAAwtpooiica8774263779ccccfcffccfltAABAwtof9533|599ccciiopoi95|</),>>>>>',)),)/|399cfioooic5|<~,>--*%$@+++...              ...+@##&%=;;''^(_[26a688aa99cccfg99522|||<:<:||<__/__|<||59cfc9999floppoiioAKNMEwlfclto939oAIEwpppwBBBAABAwppnquwEBAABGKKKKLNM",
+"KICEHHBByAwwqroolfda573}24347759999cc989ciowyAAwplf957||359ciiloooic93||/),>>,>>>>,)))/<59cilooolic93<),>-**%$@++..               ..++@##$&%*;;'^^{[}}6689aaabbcfif9956333|||||4|||<|_<|<||79ccc9959flopoiilpEMNIApiffpti53fpAHEwppwEIIEBAytuprrtxAEACzCCKMMNMMK",
+"FECBEEEAyywtupoooigca74}}1|14335355999999dgltwyAwpoif973359cffilooic9533<~!,>,,>-->,))~/|9cflllliiif9|/'>-*%%%#@+..               ..+@+@##$%=*;',^{_[26688a98999cif995532533}||||<|<1__|||359ccc9959flopoiiowHMIBtliflwwf90ltwBEAttAEEEAywtpqtttwyABAAAzBFLMNNKF",
+"IBCCCBEAAwwuupppplifc77}}211114|33369909999ciptyAywtoof95599999filif9533|</~,,,,>-->)///<39ciiiiifffc5<),>*%$$##@+..              ...++#@##&%*;;,!](}}2aaa66809a9fic9966333}:1<|1:<___||||3599999559flopliotBIIBwoffipAtf9foptABAywwywttttptpttwuuAAEBCCGHKMOOMK",
+"KCCBEBEBEAywwwtppoiie97322|1||1|||||7589999cfiotyAAAwtpic55555359ffc53||||<<~~),>>->)/<||359fiiffcccc9|<~,>%$#$###+...             ...++##$$&=-;'!^[_[266622aa86dcec9965334|1_<|}:<___|<||3399995559flopllpAEIEypifflwApcclooptyywtpojnoptttpspuuxyAEEGEIKMOOOON",
+"MIJEEEHEIHEAAAwwtpollc9722|1|11<||_<|2695099cfiopyABAytof953333|39c953||||||</),>>--,~/|35999cfcc9955553<~,-*%$#$$$#@@..            ..+@@$%%=-;','^^(_}6662269989bb900077574|||||<|1__|<||1399995559fopplowBIIEwofcfowwlcflolloopligceiopptqttwxuAAEHIJIKMMOOOOO",
+"NMKKKKIKMMKIEEBAwtppplic96733|11<|_<<|||23350ccilpwyAAwpic53|33|||5553|<<<|||</),>->,)~<399999c99953||555|/,>*%$$$%%$@+.           ..+@#$&&**=;-;>'!{[[26622a8888dd0076777734333341|<||<|14599995555flooiowEIIEwl99fpwti9fiiiififcc9cellopqqpzyzBBEEEHHKMMNOONOO",
+"OOOONMKKMMNMIEBAypppppolie0955|1|||||<<:<<|379dggilpwAAwpi933353|<|33||<//<||||/)>>>,)~<|59c99c99553||3595|/,>-%$####@+.         ..++@@###$&%=*-;;,!!([[226aa88d00d077424633333574||||||||4599955339flolipyEHHBti99fpwoc5cff999ccdccffijoomptAAABBEBCCILLMNOONNO",
+"NOONKIHHIIMNKHAAypolloollfe9090334|||<<_<::|25ciiifiptyAytlc55995|<|||<<~~~<|33|/),>>,)/<|3599c995553|||555|/)-%$#@@@@+..     ......+++@@+##$%*=*;'!!([[286660dd000a666224233355531|3||3||3999975359flolipAEEBAoc59fpwoc59c03439cddchfiloqqpxwyBAEEGCEFFKNNNONOO",
+"NNNMHEAAABHKMKEBAwpoiliiifc999099953||<|<<|<}39fifffiptyAAyof9ccc9|</<</~))~/|33|/),,,)~<|||359955533|<<||33|/,*%$#@@@@@++++...........+++@##$&*-;>'!([[286000ddbbca6622}}}43435311|||3|||3999995359flolltABAyti959itwl939c931409999cfiioqrpwwBEHEEHIKKMNOOOPOOO",
+"MMMMIHAyzyAEKMMKIEAtooilifc955709995533|||<|||59cc99cfipwAAAtlfcff5<~~//~),,)/|33|/~),,)/<||13675334||<<(//<|3<)-*%$$$$$$#@+..      ....++@@##&%-;;'!{[[28a0a0dccceba60a6744444331||||||||3999995555flplltAAwtof539lwwi937905337675dfiimmopuxyEEIIKKMNNOOOPPPPON",
+"IIIKKKEEBABEHMNNNMKEytppoiic9577790c99953|}}||35553755cfotyAAwoiiic|/~~{~,>>,,{<|||</~)!~/||466373|1|<<<//))<|33/)>-*%$$##@+.        ...++@@##&%&;;'!{[[26000abbchkgd00a64441114||||<||<||3599955335flployAytplc559oywi533553|1|246cilkjmmouxBEIIKKNNNNOOPPPPNMK",
+"CGEIIKIHHEEHIKMOOOONIBywttolfc909999cccc963||2|433||||359ipwABAwpoi9|{]~)'>,>>,~/|3||<//~/<|5632|}|1|<<|<<~)~<355|~>*%$#++++..       ...+++@##$%&*;'^{[[260088bbggkkgd07744411355||<|||_<|3599995335flolpBEytoi955coAwf3|3|||<||279fiigikopxAEHIIHIKMMOOPPPONKIH",
+"CGEHEIHIHEEEIIMOPPPPOMHEAwwtpliilifcccffcc86532||4|<_<<||3dotABBAtoic|~!)),,,,>,)/|33||</(_|5962|<333333||<~)))/|3|~>%$#@+.....      ....++@##$&&*;']{([28088bbkggkkgd07a46662553|||||<<_|3599995333clolwEEwpif535coAtc||31_<13769fffffjmpwAEBEBBEHIKNOOPPOONIFE",
+"HIIIEEEHHEEEIKNOQQQQQPONKEBAwtppttplifgffc999a5||||1_/(/<<|9ftAEBytoi9|/~))),,>--'/|3331|<||39c97|555553|<<~,>->)<||~>%$#@+......    ....++@##$&%*;;!{^[280b8ggkgggklifd98676265334||||_<|3599995333clllyIEwlfc5|3coyt9||3|</_4769fhbejmtwAyAAzzAEFIMNOOPOOONKKI",
+"MMKIEHEIMKKKMMNOPQQQQQQPPONMIAywyywtpliifc999985|1||_(/<<|<15fpyAAwtpi9|/~~),,>-=;,/|35533559cgf953333||<//~,>-%*,~||/,*$#++............+++@##$&%==;!!([28abghggggmlligfd866533952||||1_||3599995333ciloyIEwlc9||3coyp93334</_|429cfjilpwAwywvzzDEHKMNPPPPPOONNN",
+"NKIIHIMNOOOOONNNOPQQQQQQPPPPPNIHEBywtpollf99999553|1|_/_<|3|359ipwywtpic|/~~),>;-=-)<39c9c99cfffc72|<<<///~{)>;*%%-)/|<)-%#@+....++.....+++@##$&%==;!!([280hhggglljmliffd9668a6952||||1|||35999953339ioowEEwic9||5cpyp93334|<<|769fillpxwwutwvxzDFIMNPPPPPOOONOO",
+"KIIIKMNNOPPPONMKKMNOOOOPOPPQPPPOMKEBAtpoolif97565533|<<<<<|353|5citwwtpl93<//),>>>>,/|59ccccc9c99931</~~~~~~),>>-%%*>~<|/,*%#@+...+++...+++@###&%*=;'!(:2a0ghhgllllmliffcd95607055|4|1||||3599c953339ioowBBtic9||5cpwo931|4555099filopttuqsrvxzDHILNPPPOOOONONOO",
+"KKKNNNONOOOONMIEEEEEHHHIKMMOOPPPPONMIEwpppoic85555753|1<<<|5333|49iptwwtlc5|<~,,,>>>)~|359cc9999053|<_())!~~~),>>-*%%*,/||~>*$@++..++++++++@###&%*=;!!([280gghilllplmifdcd997868554|1|||||3599c953|39ioptAApfc5|39ftwo93||49filliiiottuommrtvxCFILMOPOOONOONOOON",
+"KMOPPOOOOONMKEAywwwwAAAABBEEHIKNONNOONIEywtoic9975355573|||33|33435cotwwtof9|/,>>>>->)~<359dcc999572_(/),',,!)),,>>-%$%-~<|<)-%#@+..+@##@+@####&%*;;!!(:2abkgjjjopqlmkfcd90870600541||||||35999953339ioopywoc95||5fpwoc53|4cioppoioptpmhmqrvxBEFKKNOOOONNOONONNM",
+"NOPQPPPPONIHEAwwpppttAAAAAAABABEIIIKNNNMKEAtpiiif955559053|||||333339lpttoif5<)>>>>>-')/||7ccfcc99721<(~]!'>,')),,,>-%$$%>/||/>%##@+@@#########&&*;;!!([28bknjjnrrrmlifcb90990850541||3|3|35999953|39foopwwi953||5fpwofc535copppoopwpmjmmrswzEHILKNOOOOOOOOOONMM",
+"OPQPPPQPNKHBAAAwpooptyEHEEEEBBBBEHEEEHIKMMKEAtoolf995590953|||1437|||9ilpoli93/,>>>>;;,):<359iifcc964|</~)''>,',)),,>-*%$%-~|3|)-%$##@@@##$$$#$&&*;'!{[[26bknmjmrrrmllggc9009d09055533333|35999953335flopwti953<|5ftypic9|3clppootwpnkjmrpxzBHHLKNOOOOOOOOOOOMMN",
+"PQPPPQPOMIEAAABAwptttyEIKKKIIHHHIKKEBAAEHIKKIEytplf953335555||11273||35ciooif5|/)'>>';'']_|30fiigc95241<~!)',>;'',),,>--%$$*,/||~,*%$##@@#$%%$&%&;;'!{[[2abknlrmqrqmllkgc9089dddd055553333359ccc53335floptti553<<3ftytif9330lpplpwtlhghmrwyzFEILMNOOOOOOPOOOOMMO",
+"QQPPQQPOKHEABBEBAywwywAEKMMNMMKMNOONKEAAAyABHIEBwpic953||35553345993||35ciiif95|/)>;',,!]/|26bcfiff9631|</))',>;>,,,,,,>>=%$%-)/|<~>*%%$$#$&%%=*=;;'!{[}20bkorqrqrrrlmifgc988cgfcd59555553559fff95559floptwl553/<3ftAwoif530lppotwpfggmmszzBFEIKNOOOOOOPPOOOONOP",
+"QPPQQPNMIEEBBAEEEAywyyAEKNOPPPOOOPQQPNIBytpppwBEBytlf953|1|35555dfg9933359fifc95|/),,))]!(}269ccecfc9534|_(~!,>>>;>'>,,,,,>-**-,/||<~>-*%&&$%%*->;''!{[}60bkosrquusromliifc9cdggigc999955599ciiic9559foptwyo993/<3ftAytpi95cmoopwpihgemmtAzDEIIMNOPOOPPPPPPOOOOQ",
+"QPPQPNKHEABBAACEEAyyAAEKOPPPPPPOOOPQQQPMEypliiowABAtoic931||359ccfiic953339cfc953|/!))~]{([}0accbcc999053|<<~!',>>>--;''!),,>-**>)<||/)>-=&%%=*;;''!^_[}a0bhutsuussuooolifd9dddfkigc99999599fiilic999fptwABpcc5||5iwAAAwofciooowtlhhgemqwzzBCHIMNPPPPPPPQPPOOOPQ",
+"POOPOKHBEAzzwyAAyyABEHKNOOPPOONMMMNOQQQPNKBtlffiotyAwplf931||359dfiif9993||5ccc93||</~]^(_:}abcccb85090973|<//{!,,>>;;;-',,),,;;;>)/|||(!'>-*=-;>'){]<}a6dkovtuuuusuroolifcccccdgiicc9995999filiic999fptwBEtic5||5iyBBBBwliopptwplehgjmqwyzDCHILOPPPPPPPQPPOOPQQ",
+"POONKHBBzwxptwxwwAEHKMNMMMMKIIHHIIIMNPPPPONKApiccfltyywoic73|359cgiliic953|35ccc5|||||:<_}}}6bbebc8a5269977||</{!,,,>-=*;->,)))''',,~<1|</),'>>>,'!]_126adknvtxuuusqqqoiifgc900ddiifc9955559cfiif9959clptAEtic5||5iwByAByoopptwwolfegjqwwyzBEJIMOPPPPPPPQPPOPPQQ",
+"ONMIHBBywuurpttutyEKNOMIIKIHEBBEEEEHMOPPPPOONIyoiccfltwwtlf055559dillifcc93|55ccc53333|1|21668bheca97424375541<<({),>>-==%*->,)!~~),,)/<|||(!)),'!!^_228bbknruuuuuuqpqpokgga90009iifc95555559cfff95359iptyBti95|<3ftytpppopppwwpolhhknuywzzDEJKMOPPPPPQPPPPOPQQP",
+"OMIHBEEzxuonpuupotAKOOMIKMIEBBBEEBABIOPQQPPOOOMEwpiccfowwwoic99559gioif99953|59cc9533537222a6dbbhba874111355553|<</~),--*=%%%;''~~~~))~/<|3|<//~{{(]:226bhknvuvutqqqrmmlkfha80009cffc85535339cccc53339fotwBwi95</|cpwpliioolotpolihjmpwywyzDEIMNOOPPPPQPPPPOPQQP",
+"NKIHEHBwurnnmuqmjpwHNNNMNNIBBEEEEEEBBIOPQQPPPOONMHyoffflpwwtlfc9990cilf555553359cfc955555669bddghbb8a7}}<<|45555||</~)>;=*=%&&=;,{{(((__1||||||<__[[}2268ekoruuuuqqqomolkfd900099cccc955353359ccc53335cltAEwi93/~<9lpplillfiopoiiifjmpwwzyADEIMOOOOPPPPPPOPOQQQP",
+"MKHEHEAxprnnmpmkiopAKNMMNMHAABHHHHEBABEKOPONOOOOOONHwoifiotwtoicc990ciid3|355335cffc909c99dchgggghb8877}2__<|35554|<((),--==&&&%->)~{(<|55||<|34||}|4268dbhnvuuttuqqqnlnkhdda0999ccc9995353359ccc93335citBHyi93/~<9iooooofcilifggeeknrtwwyyEEINOPOOPPPPPPPOPPQPO",
+"MIEHHHApprnkmqmhkjltEKKKKIByyAEHIHEAyyyBHKKIIMNOOOONMEtlffipttpifc9599fc9|<355559cfcfc9cccffkllkkeeb985321_<__|7555||_~)'>;==&&%*=>,)~/<|7|<<|14376786bbhhknquvtvvqqqqmmmkgd09b9cccc8995353359ccc953359itEHAi95/~<5floooicflifddfchkruqtwxzDEINOOOOOPPPOOPOPQQOO",
+"NIIKKHtppnkkmqmkkjiotBHKKHBAyyAEHIEBAwwwAEEEBEHKMNNNONHwoicflppoifc955cfc3<<|3595cfiiiiffcfimppnmmffb953}}1_<(__|333|_</~)'-=&%%*=>;','{/<<(_<|436509cffgjmnrvvtvwwtuqmmmkfdccbccccc9599553359ccc953359itEHAoc5<~/3fiopliiloicabbbhknqqptxzDILNNOOOOPPOOPOPPQPOO",
+"NKMNNEtpqlkkkmqmkeihlpwEIIHEBBBEHIIEBAwwyBEAywyBHIKMNONIApf9dioplifc90cgf92_:|5999fillliiiiimopppmljfc954}}1<//(<_<|||1</~),;=**=-;>,,,,)~(/__|36709cfgiknnstssuwvvvttqmmmiifcbbcccc9999995599cffc9555citEHEpf5<//3cipttpttoiba8bbjmommpsuyDJIMNONNOPPOOOOOPQPOP",
+"NMMOMEvqqmkkkmmmmhefhiopyAAyyyAAEHIIEAwtwyAytpptwABEINNMIAof09cilliffc9cfc92||359ccilllliiiiloopppqiif9953}}<__/({(/(<_1<</~),--;>>''',,'!{((<|589cfcfiloqttxtutvvwvwwuppoliifbcbccc9999cd999cfiiic999fltEKIwi9|<<5fipwABAtlcb88bcimlmprsuDDJIMMONNOOONONOOPQOOP",
+"OMMNMEwtpmnkejmpmmhbheiioppolooopwBEBAwttttwtollooptwEIKKIypg009flollifcfic953|35ccfilloolommnqopppoiibb953}[:((({))))~_||<</))!',,)!{!!!!!{/_125ddfeiimopswxxwwxyvtvwtttpplifcccbccccffgfc9ccillif959cipEKIwl93<<5cfitAEApifcbhhjomjmpsvtDBHKMMNNNNONNNNMNOPONO",
+"ONNMIAwwtolnijjqqmjbbbhehloiec9dciptwtttpppwwtoiiiiiotwBIIEypi959foppoiiilic95|||59cfioopoomnqqroppqolec9553}::(({{),,,'{_||</((/~)){~{{{)]{~:[[70cchilmopwyyyxyyywtswwtttpnifcc9cbcccccfddcccilolf9559ipEMIwi5|//309cfptpicc99bflpommquuxDEHKMMNNNOONNMMMNOOMMO",
+"PPNKEzwwtponljjnuuonebbehfiif9969fiopppoooopwytoiifcfilpwABBAtld99ipttpolllf9953|359cilppppqpuqmqmpqnlngd99531[[{!!',>;>''{<<11<<(/_/_((/{([[[:13669fhloptwyyyyAAAywsvwtttpolieeccbbc999dcdcccfiloic999ioEMIAl5<~~|95559dc89898ccnoonmrsuDDHHKMMNNNONMNMKKNNNKIN",
+"PPNKEwpttpnnllloutwplhjijejif98cfilpttpoliiipwwtoiiffffioptwAytofcfltwwwqolif9956269cfoppttppuuqrqopmollifc9741[:])''>;;->;'{_<|1|44322}[[[[:_12|226bekopuwyyyyABBAyvwywtttrliffccccc8990999999fiifc99cioBMMEp9</~|753557957a8bbbmmimrsvtDEHIKMNNNNONNKMKKNNNKHK",
+"OONMEtpppoinlnnpttwttponihflliiliiiloppoiiffiptwtoliif9cfiimtyAwpliipwyytpolifcc98259jilotttpuuuqmnmnmnlniieb53_[])'''-;;-->>,~<|35599652}[1142a6268abhiottwzyyyAABAyyAywwwpolifeccfcc990509999cffc9559ciyKMIwc|</|55599995688bbjlomknvuxDBGIKMNNNNONNKMIKKNOKHI",
+"MOONHtoioonilnoptuuptttpollpttpoffccfiolfcccfiotwtpooic99cffmtyAwtpoppwAytpooifcccc9cfjioptwtuuuqqqnnmmjiliifc0|[:!'';;------->,~|49cccdd0755766aa8abhhjmpuxxxxwyAAAAABBAAywpoiifffffcc90999999ccfc93335ftHMIwc3|<|9959fgb968bbcioomkoruyDGGIKMNNNNNMMKKIIKNOKCE",
+"INONHpjkloliinonmmmqrtwwwttwyytlc9909cfif9999ciptttppoic9999flpwyAAwtppwwyuopoifciifccfloptwzxyuuqqnonkjjiliifc5}:(!'';;*-=-==--'!_49ciifdefc898abbbbgehmptxwxxxxyAAAABEEBBAwpolieffiffcc909999cffc95335coBKIyf|</_5550dgccb9bbelolmosvtyBEHIKMNNNONMKKIIEINOMBB",
+"AHMKApjjloliionikkmmjoopppwtttpic97755cffc99999flptppolifcc9dfipyBEEytppwwxtoomiioolecfilqpwAyAwuuuqnokmjejfiffc52[{!',;;**-**-;;'!/20filiiiiffcffcegjemqrutuuuuuwwyyzAEEEEEAwpliifffffcc99c9ccfiifc9555clAKIAi3//_33||5b9c9ffejmppmpsvwABGIKKMNOOOMMILIHBHMNMBw",
+"tABBwpjiioolnlojkkkkkjijiloolliig973359fiifcc959ciopooollifc9cflwAEEBwtttwyttopoooppoiijloptAABAwuuuunnmjjhjcchd972}{~'';;;;;-;;;'!^[|9giioollolinikjjmnpususuuvuuwwywyAAAAAAwtplliiiifgd9cc99cciifc9555clAKKBo5|<<73||36988bcikmpqtptuAAEEIKKNOOOOMMJKFEzGKMKEw",
+"ttwtpolgfioonlpqmmkkhhbhcfgcccfiif95359iooifff9959ippolllolfccclptyABAAwtttwttpppopollmmloptyABAywuuuoommjehfc999573}/{!'';;==;;;''^(16acilppppooqoolqqppsuuuuussuwwwywyAAyAAwttpolllliifcccccffiiic9555clAKKEp9|||5553599899bikouptwxwDEEIKKMOOOONMMJLHFzAHKKHy",
+"toppppoieekllloptpqmmjh8ab07659foic059fippliffc999fopoiiiloofdfioptwyBEBytppwttpppoomppmmopwwyBBAyuuuuprmjjhe988857321_/)'';;;;;;'^^_22abchilrtttpppuuwtwwwxuuuuuuxwxwxwyyyyywtpplllllliififffffilifc555clAMMIwc3|15990ccdcecjimppputuABHEIKMNNOOONNMJHFHzAAKMME",
+"Apilopoibbeiljnottwtqnjeh95}}||9iic559fiillifc99559iooiffiloliilloptwEHHBwpppttupppoqqpppppwwwBBBAyuuurpmmjeee98aa3342||({!,';';;!!{_268aehfkmquwwwwxwwAyzzwxxxuuuutuwwwwyywywtpoliiillliiiifffiillic999ciyKNKyf3319cfgffiefhjorptwwwxABEHIKNNOOOOONMJHFFzyyHKNK",
+"Iynilrojhhheilnjmpwwwtplif7}<:<|9fc559cffilifc995559illfcfiloppoloptAEEEEAwutttttpppptttpruwwAAEBBAyuuuppmmihffaa6a|1|[|}[_{!'''!!!{}}28bggkknopswzzAAyAAzAyxxxuuuuquuuutwwwwwtpoliiiiiiififffffiiif95559fpHMKAi5339ciiiiifefkopwtwyzABEGIKMNNNOOOONMKHHECywAINO",
+"OIwollolifhbeinjmmrsttwtpl82_(]_|09555999ciliicc9955ciolifcflpwpooptABEEEBAwtpttuwwttttttuuwxAAEEBBAuuuurrmmjhff8622|1<__:}}:[^^^!{_}}88gjkjjnqqruuyABBBCCzAxwuuuuqqquuqquutwwtpoliiiiiigfffcfccfiif953359lBMKAi3|15diokifchekppwwwyyBEHIKKNNNOOPOONMKHHECAwxEMP",
+"QPKypololifeehoommoprotttoc6__(_<455735335cillicc9959flppicciptwpoptyABBBBAAwtpttwxxwttxwuxwxAABEEBAAuuuurrmmiffb86222|1__[:[:[[___}}28bgjmmmmqmttttyAAAEBAAzwxttuuqqqqqquuutttpoiifffigffffccc9cfff95||39iAKIyi3||39iliiefhgkrttwyAADEHIKNNOOOPPOONMKHHEGBwuAIO",
+"OQPMBtoooolijinpqmnkjiilllf93|:_<159533|||5cillifc959ciptoifilpttpptwyBEEBBAAwttwwwwwwwwutxxAAACCEEBAAuuuprrmmhhbc8a2222____<1||436268abgmmmmpspppwwwxzABzAAywwwtttpqqqqqruuuttpoiifffiigfgfcccc9cfc953|39iwIIyi5||49gfkgcbbgjotwwyABDGHIKNNOOOPPOONNKHHECByuxAK",
+"HNPPNHwpppproopuutmkjfbefdcd531|3339953|<<|5ciiifcc99ciptpiiiliottttwyAEEEEEEAywwywywwywttuxAAAEBBEEAAAuuuponmkjbcbbaa2}}}}__114a889cbhghmsqrprvttuxxxyDAyxzyxxwtttuqqppqqptuttpojifffiiiiffffccccff953||9itEIAl53479cgfcbabgiqttwyABEHKKKNNOOOPPPOONKIFECEyqqpy",
+"tAKNOOMHBywtptttwwumjhaad099953353359953<<<|3cfffcccccipttpppoikopwwwwAEEBBEHEBAAyAByyyyxuuAAAEEECCEEAAAxuuurokkeebaa86222}}}}}22a89ehkkjmpxvtvvtuvuyDADAwuutuuuuttpppquppputtttpoliiikkliiiifffffffc933|5fpBIBp95509ccfdcahjjpttwxABHHIIKNNOOOPPPONNMIFGEEAuqnq",
+"lotAHIKMKKHBywttutuoehaa5657555505555955|_<<|5ccccccccipwyyywoliiotyyAAEEEEEIHEEBBABEEAAAAAABBEEEGCBEEAAAxuuuonkkkeha8882222}}}}228bhimoqquvxxxxuwxyDDDDyxtuuqqqqqqqpppttqptuwwwtpoliiillliiifffccffc93||5coAEBtc579ccfbbhhkjptywwzBEHGIIKNNNOOPPOONNMKFHCEBwuom",
+"lilopwAEIKKIHEAzwtpoifa642a73555995345955|__<35ccc9999fowAEEAtollmpwzAABBBBEHIHHEEEBEEEEEBAABHHHHHGGEEEAAAAuuuonnkkkeha8a88662}66aa8bknqqxAzzAzDDDDDDAADvwuqqqqqqmmmqpqtttptwwwwwpoliiiilliiiffccccfc95||39lwBEtc7379c900bhkjqtyzyAEEIHKKKNNNOOOPONMKKKFECBBywsq",
+"oollllopwyABEHHEBywpnfa73}4333355553355553<__|59cc9555cipyEHEwpoolptABBAEEEEHIIIIHEHEEEEEEEBBHHHHHJGGEEEEAAAuuuqnnnkkkebb8a66a66668agjjquwAzFEFBDDAAACAywwuqqqqqnnmmmomqpppptwwwwtpolliiliiiifffcccfc954139iwBEwf7509db8bagjmqwwwxEFEIIMKMNOOOOOOONKKKIHFzAyxxtp",
+"qollliillooptwACEEAywoi932||143555553559531<_|39cc95559cipAIHAwtppttAEEEEHHHHKKKKKIIIIEEEEEEHHHHIIHJGEEEEEAAyyuuqqnnljgggbbbb88888ddeemmsvwzFHHEEHGGCCDywvtqqqqqmmnnmkkkmolopttwywpolliillliliifccccfc54|39ipAEyl550ddb8bbgjnpwywzDEEIIMMNOOOOOOOONKLKIHDzvwwxtq",
+"moinlilllliinlqutwAAAwpld6||}|||33599559953<__159cc95599ciwEHBAwtptyAEHIKKKIIKKMKKKIIIIIIIIHHEHHIIIIHGEEEEEByyyyqqqqqjjjhggddddddddeemhrrvxzEGIIJIHEECBAywvuqqmmmmhkkkkgkkkkmptwwwtpolllllollkiffcccfc95|35fpwBAo968cfcbbhgjmtwyxyAEEHIMMNOOOOONOOMKKIIFFzvvtqpm",
+"mijiiiiilllijmmjnloppttplf93|<|||359c999995||__|5cfc99909ipBBAAAwwwyBEHIKMMKMKKKKKKKIIIIIIHHEEEHIIIKKIHGGGEBBCCywwwqqqqmmjheeheeeeemmmrrsxxDDJJILKIIHEEAAywtqqmmhmkkkggggkkgiopttwtppolloooolliiffccff95345cowBApc70ffhfekjmmtAyxyBEEHHKKMOOOOONNOMKHIHFFzzxtqnl",
+"geebbceffiinnnjihhfifillooif53|<||55cffcfc94||<|49cfffc99foyAwAyywwAABEHIKMKKKKKIKIKKIIIIIHEEEGEHJIKKKKIHEGGGCAAAxwuttmmmmmmmmmmmmmmmrrvvxDDEJIKKIKIIEGAAAvvqrmmhkkkgggggggggiopptppoollooooolliiffcffc9335cotAAtf9ciffejjmmmtAzxAEEEHHKKMNOOOMMNMMIHFHFFCzytqqj",
+"ggb8889abbhijmifgef9b880ciiiic5|||359ffiiif53||||5cfiifccfowytwyywwAADEEHKKKKKKKIIIIIIIHHHHHEGGEGHKKKMKKKIHGGCCCAAAyvsuusssmmmmmmmmsrrvvxzABJHKKKKKIIECBAywwtpqmmkkkgggdggggfilppppoomlllooooolliifffff9735cotABwicciiiiillmttAzyDFHEHHKKMNOOOMMMMMIFFEFEAzytqmj",
+"ggbba8888bhfkeebbbaaa854239ciiic53||59cilolc53||170ciifdciowwwtwywyyAAEEHKKKKKKKIIKIIIIHHHIIJGGGGHIKKMMMKKFKHEECCzzzzvvvvsssssssssssvvvxzDDEJIKMNMKIHHCCyvvwsuprmmlkggggdddfffloppppolkillopopoliffffiid055cotAEwoffiiijmnrqtyzAADEHHIJKKMMNOMMMKMKIFEFEECzyssmj",
+"edgbbb88bbbghebba68a6a4|}||35cfiic7|135ciopoc5|1||5cilidciowywttyAAyAABEHKKKMMMMKKIKKIIHHHIIIHEEHIKKMMMMKLKKIIIIEBBzzzzzwxwvvvvvvvvvvvxzDFEIJKMMNMKIHEAzzwvtsppppoliifgddddfffjooppplmjklmoppooliigfffic955cotAEypiflolimnqqtAzzABEHKIHKKMMOONMKKMMKFDACCCzwvsme",
+"eggbbbbeeehkeebaa66aaa1[}<<}|35cilf9|||5cipwpc5|1339fllifiowwtttwABBBAAEEIKKKMMNNKKIKKIHHHHIIIJHHIKKMMNMMMMMKKKKIFFEECzzzzzzzzvvvvvzzxzDFHIJKMMNNMMIHEBzzxtsspppppolkiffcddfggilopppomjmlmpppppolificfic9559otyEBtlglpomnmmsuACzDDFIKKIIKKMONNMILKKKHAzzCCzzvsmm",
+"jjggbehehkkkjehca866a31:}<<_<<<39fii93||5coyAo933355cllliiowwwttwABEBBEGEHHIKMOONMKHIIIKIIIIKKIIIKKKMMMOOONNMMKKKFFHEFDDEFCCzzzzzzzzzDDFHHJJMMMNNMMKHEEzzwwsrrprppoliiifcccgiiilopppolmimoopppppolfffiigd08bipyEEwojoppmmqqsyACzEEEIMKJIKKMNNMKJHIMKHCzzzzzzytmm",
+"qjgkkkkkkkmnnjjifb98a73}1<(((_/<|79ffc9335fpAwl93350dioollpwywtwyABEEBBEEEHJKNOONMKIIIKMMKKKKKKMKKKMLMMOOONNNNNMMMIIHFFEFFFFFDDFFDDDDFFHHLIMMMNMMMMKHEEzzzussrrrponllgfffccgllijoopppomkmopppppppliiffifc86aipyBEyplotppoqutABCBEFFIMKIIKKMMNMJJHIKKHCzzvvyzAttq",
+"qjjkkmmmmqqoonollijfcd76|<:_(~/<<<359fc9559itAwi0559dilpoopyAwxtwyBEEEBCCEEGIMNNNKKIIIIKMMMMMMMMKKKMLMOOOOOONNNMMLMLHHHHFIIIIFFFFFFFFHHLLLMMMNMKKIKIHHEAzztsssrnooolijifcccdiiiilopppommoqpptpppooiiggffca9dfpwABApljpqmqmutzBCEEEHIMMKKMMMNMMJIHFKKIGzwxwvvvvuq",
+"mqjnmmptttwtpppliiififc953||<///(/_<35cfc99fowAti970dfiopptyAAywwAAEIHEGEGEGIIKKMMKKIIIKMMMMMMMMMKMMMMNOOPPOOOOOOMMLLLHHIIILKLHIIHHHHKLLLMMNMMMKKIIIHHEBzzxtssroonoliifecc0dfgfiiooptpomoopptptppooiikkig99cfpwAEAwnlqpoqqpwzCADFFHIMMKKMMMMMKJEFEHIJEAyvvwvvvss",
+"qurrtwwwyttponfebcc0dd9c99053|<<//(<<|9cfc99fpyAti99dgilptwABAAyyABEIIKHCGHHHJHIIKIIIIIIMNNNMMNNNMMMMMNOOPPPOOOOOOLMMLLKKLLLLLLLLLLLLLKMNMNNMMMKKIIIHHEBAzxsssrponooijfc9900dffdfiopppoooppptwwtpponkiiigcdbjrwAEBwpnqpumprtzzADEFEKKKIIKKMMMJJEEEEIIEBzvvvvvvst",
+"uwywwwwwtqlief866643||233755553|<////<|5cifccitBBticciiipwAEEAAABBEHIKKIIIIHEGEEHIIHIIIFKMNNNNNNNMMMMNNNOPOPPPOOONNMLLLLLMLLLNNMMLLLMMNNMNNNMMMKKIIIHHEBCxxxtsrroooliigc90000cdddjlopppolqpuwwwttpollilllhebeowAEEypmpxuursuAADDDFEIKMIIKKLMKJIDDBCEHHEBzAvvyAAy",
+"EABAwtsppmiba86222}1_[[(]__||3553|//~/<|5ciifflyEBpifiiiowAEEBAEEEHIKMMKKKIGGCCGEJJIIIIKKMNNNNNNNNMMMNNNOOOPPQPOOONNONMLMMLMNNNOONNNNNNONNNMMMLIIIHHGHECCAxxupprrnlnigcc0008999ddciloppmlpppwwwwttpollmmlhebeowBEEAuopxuurvxzBDDEEGJKKKKKKKIJIEDDACEEHHEECAACBEB",
+"HBAyxxpomkebba6222}__^^{{{{((<|333|</~(_|39iiiipyBAtllilotAEEEEEIIIKKMMMMMIHCCECGGIKKKKKKKMNNNNNNNNMNNNNOOPPQPPPOONNNOOOOOOONNOOOOOOOOONOONNMKKKIIHHGEEBBAxxpsprnnliigcc0070999ddcfilooomoqpwwywwtppmlmllihhjpwAEEEuruuwtwtxAEBDEEIIKMKKLKKIIJFDDAzAEEHHEBEEEHII",
+"EEyxxuunkeecb62221}_^^({{!!)))/(||3||/~~/<3cilllpABAtploppyEEHEHIMNNMKMNNMJHECCCCGIKKKKKKKMNNNNNNNNONNNNOOPPQPPPPOONNNOOOOOOOOOPPOOOOOOOONNMMKKKIIHHGEEBByxxsrronliigfcdd0009099d0cilloolpqpwwyyywppppnoolijjowBEHEyuuwyzvwvCFFDEIIIKMKKMKHIIEEEBzAACEHEEEHIIIIK",
+"HBAxxuungbbbea2221::^^{{{!!,))){~/<|33<///<3ciloowBEAwopptyBIIIHIMNNNMMNNMIEEECCCGKKKKKKKKMNOOONNNOONNMOOOOPQPPPPPOOONNOOOOOOOPPPPPPPPPOONNMMKKKIIEECzzzzxxssrponljgfgddd0899989d0ciiloomoqptwyyywtppnppppnijnwBHHHAwuAAzwzAFHEEEJIIKMMMMMHIEEDDzxzzAEEEEEHKIIIH",
+"EAAAxxplgb8ba62211::^^{!!!!)))))))~/|33|<//<39ioptAHHAtptwyBIKKKKNNNNNNNNKIHGGBCCHIKKKLKLKMMNOOOOOOOONNONOOPPPPPPPOOOOOOOOOOPPPPQPPPPPPOONNMMKKIGGCCCzzzzxxpprronlggfdddd0999660c09filoomoppwwyAAwutpmnqppnjjosBEHHEwwABzzzAEFHGJJKKKMMMMIJIHDDDzxzyzBEEEEHIIHEE",
+"EBywuuokgb886222_1:^^{{!!!,,,,))))))~<||||_<|3ciotAHKHytptyBIKMMNNNNONNMMKIHGGBCGIIJIKKKKMMMMNOOOOOOOOOONNOOPPPPOPPPPOOOOOPPPPPQRQQQQPPOONMMKIGGGEEDDyywtttprrnlliggddddd0885560dd9dfilpoopptwyAyyuuqrnoqpnnnnuAEHIExwyECzzCHHHJIIKKKNNNLJJEFEDBzxzyAAAEHEEHEEEE",
+"BBwwuungb8a822221_(^^{!!!!,)''')))))))/<|||<<|3cipwEKKEAwwyBHKMNNMNNNNNMIIIIHEGCCHHGIJILLMMMMNOOOOOOOPOOOONOOOPOOOPPPPPOOPPPPPQRRQQQQPOONNMMJJGGDADDyvvsssrrrooniigdddddd0665566c989filopmpptwyABywuuprppprnmmuAEIHEAwABBzzCHFHJJJLLMOONMJJHEDBzxzzAAAABBBAEBBAC",
+"Czzwqqjgb88262211__^^{!!!,,'',))))),)))~/||||||5clpyHKKEAwyAEIMNONNNNNNIIIIIIGGBGEEEGHJLKMMMMNNOOOOOOPOOOOONOOOOOOOPPPPPPPPPPQQRRQQQQPONNMMJJJEBDDyvvvssrrrrnolkkigddddd00566255cd99cilopopptwzABzwwuuuuuuuqnmtAEHIHAzABEAzEEHEJJJKMMNONKJIEFDzxxzyABBBAAABCAAzA",
+"zAwxqiggb88622211_^^{{!'!,',,,)))))!,),)~/<||||39fltAIKIEAAABHMOOOONNNKIIIIIIHECGEGCGJJIKMMNNNNOOOOOPPPPOOONNOOOOOOOPPPPPPPQQQQRRQQQPPONMMJJEEDDDyxwtqqqmmmllmkkkigddd09007672600d979floppputwxBBCwwwuquuuuqrrsAEHKIEAzBEEAEHEEIJKMMMNONLJEFDBzxzxvzABBCBCAAAAzz",
+"zAwqqjgb8a8622}___^^)!!',,,,,,)))))))))))~/|34||59ipwEIIIEBBEEKOOOOONNKIIIHHIIHEGEGGGGHIIKKMNNNNOOPPPPPOONONNOOOOOOOPPPPPQQQQQQRRQQQPONMLJJEBDDAxuvuuqmmmmkkkkgggggddd089007666599809fioptpptwxBBAzwwttquuturrxAEKKIHAABEEEEFFGJJMMLMNONKIEDBzzzvvzAAABECCAAzyzz",
+"AAwqjhgc8a2222_|__^({{!!)',,,,,)))))),))))~/|33|35citAHIHEEEEEINOOOOOKKKIHEEHIHHEGEGGJGIKKKKMNNNNNOPPPPPOONNNOOOOOOOOPOPPPQQQQQRRQQPPNMMJIFEDDzxuuvrqrmhhjkggghhggfgdd9a9086775559090cioptpptwyCCAzzwttttwutrutABIKKHBABEGEEHFEJJMMMMNONKIFFDAzzyyAAAAAzAAvyxyyz",
+"Aummjgbb8822}21|}|}</_/~/{~~))',))))))!!))~{/|35337fowEHIHEEEEIMNOOOMKKKIHGGGHIIHEEGJGHIKKKKMMNNNNOPPPPPOONMNNOOOOOOOPOOPPPQQQQRRQPPONMKJJEDDxuuvvrvqqmhkkkhhhghhhhhd08a89967767880909inptpptxyCCCAAzztttwwxuuxzEHKKHCACEHEEEEEJJMMMNNOOMIHFFAzzzAzztttutvvvvyvA",
+"ztmmjgb882222333322|1<<<</<///~~~~~)))!!!{~~/<|59779ipAEHIIIHIIMNNOOMKKIIIHEEEIKHHEJHHJIKKMKKKKMMMNOPPPPOONMMNNOOOOOOOOOOPPPPPPQQQPPOMMJJEDDzvuvvsvmnkjhhfcccdd09a0aaaa0a8905775895900flpptpuxyCBCAzzzzxxzzxxuuCEIKKICzCGHEHEEEJJMMNNNOOMKHEFAzzzyyutttttttvvyzA",
+"wtmhggb886668095321|_(~{~~~/(////</(~~~)!~~~~(|39999coyEHKKKKIIKKMNMKKKIIHHEGGGKKHEHHHIKKMMMKKKMMMMNOPPPOONMMMMOOOOOOONNNOOPPPPPPPPOOMJJEDDDuvsvsnolljjhd00cbaa00a99058a7a895236905600cjpttttxyACBAzAzzxxzzzxzyAJIKMIGCCCHIIEEEIJMMMNNOONMHFFBzzzvvsssttttttxzAz",
+"xqqjgb8868a99053}}/]{{),,',!))~(/<<<</~~~~~((<<|7dcccltAEIMMMKKKKKKMKKKIEEGGGECHKIIJIIIKKKMKMKKKMMMMOPPOOOONMMMNOOOONNMNNNOOOPPPPPPOLMJJEDDxvvsvnnnggggdd000777777777a6aa6659656586700djptwwwxwAzCAEzzzzxzzzzzzBHIKMKGCCEGIIHEEEJKMMOOOONMHFEEAzyvvuustutuwwwwww",
+"wqjggbbc9ccc954|[:{!,,,>>;;>>,,)~~/<<<<</(((<<|139cfgltyEEIKKKKKKHIKKKKHECGEHGEHIIIJJIIIFIKMKKKKMMLMNOPOOOONMMMMNOOOONMMMMNNOOOOOPPOLKJEDDzvussnnnkggggdd0007777777774657a3599559556a0ahotwwxxzAzACEBBzzxxBAAAACHKKMKGCACEIIHFFEJKMMOOOOOMIHHGAzvvwstssttwwwwwww",
+"qmjghbfbccc05||<[{)!,>;>;;->->>,,)~/<|||||<<<11375cfiiowABHIKKMKIHHKKIHHECGEHGEHIIKIKIIIFIKKMMKKMLKKMOOOOOOMKKIIJKMMMKKMKNNNNNNOOOONLIJEDDwvsvnnhkkggb88aaa222222222274132259999953700adoswywxzzzAAAEBAAAACBABCCHKMMKHCzCGIIHEFGJIMMOOOOONMIHEzzwwytsuuttwwwwwwt",
+"mhgghbiec8833|_[^{)!',>>;>>>>>>>,!!~/<|||33111|3779cioopwAEIKMMIHHIIIHHHEGEGGGGHHIKKKIIIFIIIKKKIKLLKKMNNNNNNMKKIJIKLMLLLLLLLMMNOONNNMIJEDzxvvnnnhggbbbaa7744411111112}411423599cc52200adiptwywzAzzzAEEBAABCBECCCGMMMMJCzCEEHEBFGIIMNNOOOONMKIEAzwwwttstttxwwwwtt",
+"megbcfb906|1_(^^^!!',;>;;>->->>>,'!~~/_||3373||376acglpttzEIKMKIIHHHGEEHHHGGCCHHIIKKMKIFFHFIFKKKIIKKKKMNNNNNMMKKIJJKMMLKLLLLLLLLLMNNLIEEDxxvvnnkhgbbb0a7774441}[[[}111}11134459cc5220dadjpwwzwywzzAAzEBBAAEEECCCHMNNMIGBBEEEEDFGIJMMNNOOONMKFFzxzvwvssssuwwwwtum",
+"edgebe8622_(((]]{'''>;>;-*-=---->>,))~/__1137337aa9dilptwzAHKKKKIHEEGEGHIHEECCHHIKIKMMKIHHHFFFKIHIIIIIKMMKKMKKIHHEEHIIIIHHHHLLLLLLLLLJEEDvuvrnkggaaba0aa222}}}}[[:}}[1_:1112239995345badiowwyzwwwzAAzBBEEEEHGGCGIMNNMKHCCGBEDDFEIJMMNNOOONMIFDzxzxwxsssstxwwussm",
+"egecba62}__({^^^'''>;--=**======->',)){(__<|4508600chkptyACEKKKKIECCEECHIIHEEEHHKKIKLMMKFHFFFFFHHHFFIIIKMKKLKKIFFFDFFHFHHFEFHHHIILLLLHDDzvvvrnghbab00a6a6}}[[[[[[::[[_1_:11211|441247adhhmtwyzwwwvzzAzBBEEEHHGEIIMNNMKIFCCEEEDEEIIKMMMNOOOMLHFDzzwwxssstwwwtsumm",
+"ggccaa2}_({{!!^^'';-=*=***&=====->>,,!){_<_|4609ddhbflowyAzEHIKKIECCCBzBHIHEEGHHIKKKKMMKFFFFFFHHFFFHHHHIKKIKKKHEEDBBBFFFFDDDFFFFFFHHHHDDwvvvrkghba0066622}}[[[::[::[:[[__[11|1|111135a0henpwyxwwxwwzzzBBEEHJHHIFKMNONMIHFHEEDDDEEIIMMMNNOOMKHFDzxzvvvsstwwwtmmme",
+"ghfb62}[(^{!!!^!';;-=*&%%&&&=====->',!){(<1}2269cfhehjruABAEBHIKIECzAzzAEHHHHIIIIKKIKMMKFFHEEEBEFEEEEEEEIIIIIIIFBCAAzzAACCCzDDDFFDFFEFDDxvvrnkgbb00662222}}[[]]^]^^][[::__[1111111112a0hhjrwywxuwwwwzzBBEEGJIKFFKMOONNKHEHFEFBFEEIIMKKNNOOMKHEDDxzxvvsstwwwsmmme",
+"kbb62}[(({{!!!!'';;-**&%%%&&&====->','){(_}}2770bhfinjnqyCBBEEHIIHCAzyAzBEEHIKKIIKKIKIKKIIHECCCCCBBFEEEEHIIEHHEBzzzxxzzzzzzzzzzzCCDDDDDzxvvrnkgbb00a22222:[[[]^]^^]^^^:^[__:|111111124abhjqwyyxuuxwwyyzBEEJIKKKFKNOOONKIHHHFEFFEHJKKKIKMMMKKJHFDzzzvvwtwwwttmmeg",
+"icb2}[(({{!!!!!'';-=*&&%%&&&&====->','){(_}}7559bchlmrqszCECAAEHIIEAAzAAzAEHIKKKKKKHJIKKIHCCCCCCCzAzBEEEBEECCECCzzzzxxwzyyvzzzzzzzxxxzzxxvvrhkgb006a2222[[:[:]]]^]]]^^^]^:_[:1111114277bhjnuwwxuuuwwwzzBBEJIKMKKMNOOONKIHEFHEFFEHKKKKIKMMMMKIEDDzzzvvvtwwwummmjk",
+"eb6}[[({{!!!!!'';;==*&%%&%&%%%===--;,'){(_}270aabhjnpqtxzEECAzzEHHEEAAAzzzAGIKKKKKIJJHIIHGCCGGCCCzzzzCCCCCGCCCCCAzyxwvwwyvwvvvvvvvvxxvxxxvrrhkbb00a2222}}:::]]^^^!^]]^{]]^:_[111[[124770hhnptwvuuuutwzzBBEGIKMMMMNOPONMIHFFHFEEEHKKKKKLMMMMKIJEFDzzzvwywwusmmjgk",
+"b82}[(({!!!!!''';;==*&%%&$%$%%===*-;,'){(_}27aaabjhnqqtxAEEBBxzCEEHEBAzAyAzEIKKIIKIJGEHHEGCGEEEBAzzzzCCCCCCGCACBCzyzwwwvsttsssvvvvxvvvvvvvrrhhbba66222}}[[[:]]{!!!!!^]^{^]]__:_[_:}}47a0hhnpuwwtuuuwwzyzBEEJKMNMMOOOOOMKHFHFEFDHHKKKHHHKKKIHHEFEFBzzvxzwwtsmejkj",
+"b2}[[({!!!!!''';;;==%&%%$&&$$%&==*-;,'!{(<}478bbhjjmmqxxABBBBCzzBEEEEEAzyyzEHIIIIKIIHEFECCCEEEEEAAzzxzBGCzCBBzCBCAAutusstuussssssrrrrrvvvvrrhkb0a6222}[}[[[:{{{!!!''!!^^^^]]_[[[[:}}26aahhhnttwtpuuuttzzBEEJLMLMNOOPOOOKIIHEEFEHHKHIHHHIKIFEFEFDFFzzzvAAttmmhkjc",
+"82:[({!!!!!'''';;;=%%&%$$$$$$%&==*-;,'!{(_}45abhhjmmruxzAEBBBCCzBEHIIHBzyAAEEHIIIKIIHEECCCCBEEEEBBzxwwzBBABBBCAAyywtttsspmmmmmmmsrrrrrrrrrrkhbb0a6222[::[:(^]{!!!''''!!^^{^^:_}[:}}}466ahhjiputspuuuttxzBAEGKMMMOOOPPOONIIIFEFEHHHFHHFFFFIFDBDDCAzzzvvAwtmmejkhc",
+"2}[[({!!!!''>'';;==%&&$$$$&$&%%&=*-;,'){(_}47abhjmmruuyzAEEBCCAAAEHIIIEBAAACEEHIKKIIHFEAzzzCBBEEEBBzwwyBEBCBBByyyywwtqmmmmmmmmmmmmmmmmmkkkkkhbb08622[[[[:((^{{!!''',''!!^^^^[_1__}}4a666hheipputrrruutxzBAEGIMMNOOPPPPONMIIHHHEHIHFFHEEHIIHEBAACCzvvvtwtmmjjkic9",
+"2[[({!!!!'''''';==&%&&$$$$&$$$%&=*-;,'){(_}47abhjmruuwxzABEBCAAADBEHIIHEBAABCGEEIKKKHFEzzzzzAyAAABBBywzAEBBBAAyyyywqqqmmmmmmmmmmmmmmmmmkkkhkkbb08222}[[:::(^{!!!''','''!^^^^^:111}}47666bghhlptpppquuttxxAEGIMMNOOPPPPONMLIHHGHHHHFHEEFHIIEAzzCCBzvvtwwqmjjgkjb8",
+"}[[({!!!!;''''';=*&%&&$$#$&$$$&%&*-;>',{(_}47abhjmuuwwzzCABBAAAAADEHIHHEEBzBECEEHIIKHEECzzzywyyAAyBBzzyAEEAAAAyyyuuqqqqmmejjjeeeeeeeeeeeebbbbba08222[[[[__^]^^!!''',,','!^]]^]11}}}47a68bhghjppqpnppustxxAEGHKMLNOPPPPPNMKLLHHHIHIHHFEEHHECzzzCBAzvsuwqmmhggeca2",
+"[[({!!!!';>'';;;==&%&&$$$$$&&&%%&*-;>',{{([4aahhmnuuxzzACzBBAAAAAABHHEEEEBAACECGGJIIHEGzAAzwwwyAAwyywytwAAAAAAAuuuuuqqjjjjjjjgddeeeeeeeeebbbbb006222[[[[__({^^!!';;;'>,''!^]^^:1}}}78aa68bhgjnpppopqqqtxxAEGGKMLMOOPPPPOMKLLLLLLIIHFEDEEECCzzzzAAtstqqqmeeghcba2",
+"[[({!!!';;;;;;;;=*&%&&$$$#$$&%&&&*-;>'!{{_[4aahemnuxzzzAzAAAAAADAABEEEEEEEBACCEGGGHHHHBCAzAuwwyyAyywwuutwAAAAAxuuuuunnljjggggddddddddddddddaaa00822}}[[[_({^^^^',';;;''''!^^^]_}}}3666a6a88hhoppqoopqqtxxAAGGKMNNOOPPPPOOMKLLKLKIIHFEDAACCCyAzzywusmqqmjhggfba2}",
+"[((!!!!';;;;;;;;=*&%&&$$##$$$%&&%*;;>'!{]_:78ahjmnuxzCzzzCAzyzAAABBDEEEEEEBBBBGGGGGGEEBCAzwuxwyAAAAywwtttyAAAwxwuuuoonnkgggdbbb88888888888888888822}}[[(_((^]]!,'';;;;',,!!^^([}}2a66666aa8ahlpppnnpqqppxAACHIMMNOOPPPPOONMKLLKKIIHFFCAzCCCAzAzywumqqjjjggebb82[",
+"[({!!!';;;;;;;;;=*&%$&$#$#$$$&&%%*;>>,!{([[788hjmnuxzCCzzBAAyyAABEBDBEFBEEEBCCGGGGGCABzzAAwxwwyAAAAyywuutwyAxwxxuuonllkkggbbbbb88888888866666666622}[[[[[(^^^{!''>;;;;;,,'!^^^[[}26a6666aa8abhopqnnppqssxxAEGIMMNOPPPPPPOONMLLKKIIHEFCzzBBCAAyAysmmqnjjghecb82}[",
+"[({!!!';>;;;;;;;=&&%$&$####$$&$%**=>''!{([1468hjmvqwzzzzzCzAyyyABEBAABEEEEEEEHGGGGGBADxzAAyywywAAAAAyywtttwuwxwxuroolkkkebba66666666666666666666662}[[:[({]^^!!',>;;;>''!!!{^^[:}46aa226aaaabhoppoorrqssxxACGHKMNOOPPQPPOONMMMKKIIFEFBzzCBBAyyAuqmmjnjggbebc82[[",
+"((!!!!;;>;;;;;;;=%&%%&#$####$%%%*=;-',!{([1488ejnvwwAzzzzCCAyyyyAEEAABEEEEEJGJHJGGGADDxxyAAyywyyBBBAAywwttqutxxwupnokkkeeb88866666666a666666622}}}}}[[[[((]^^!{!'',''''']{{^[[[}25a66a6668abbeottppprqupxwACCGKMNNOPPQPPOONNMMKKKIFEEAzzABCyyywtqmjnngdbebcb22[[",
+"({!!!!;;>;;;;;;;=%&%%$&$$#$$$%%*=;-;,'!{_[168bbknvwAAAzzzABAyyyAADBBAAEHHEHJGGJIIHEAAxxxxzyyywyAABBBAyywttquuxxxppomkkhfa888866666666a22222222222}}2}}}__:^^{]]!!''',,''!]^^^^[}44a6666666a0cemtwtpppuuuxwAGCGKLNNOPPQQPPOOOMMMKLIFFFAzzABByyytuqjjnggabbhca2}[[",
+"({!!!';;;;;;;;;==%&%%$$$$%$$%%%%==-;,'!{[[266bjhnqwAAAzzzAAAyyyADAADAABHIHHHGGIIKIEBxxuusptwywAAAAEEBAyywqquuxwxpppmkfheb888822}}}}}22}2}}}}}}}}}}}}}}}__(]^{~{]'''''','']^^^^[[}2222222266abckpttqpruuuxxABEHKMNNOPPQQPPOOONLNLLIIFFBAzBEAywquuqjjkggb8ceb22[[[",
+"({!!!';;;;;;;;;==%&&%%&&$%%%%%&==-;'''{{[_468bjhnvwAAAzzzyAAAyyAAyyABBBHIIJIHJIIKKHByxurspstuuyAAAEEEBAAuuquuuxpprmmmjfbbaa8222}}}}2}}}}}}}}}}}}}}}}}}}_:]]]{{!!!'''',',!{]^^[[1122222622260abkotprrrqqtxxAAGJKMMNOPPQQPPOOONNLLLIKHECAABEAwtquujjkkgbb8cf62}[[(",
+"({!!!';;;;;;;;;==%&&%%&&&&%&&&&&**;>'!{{[1468benqvwAAAAwwzzCAyAAxuuAABCEJIIIIIHHIIIBzxxsspquqquAAAAEEEBAxuuuuuxpppmmijbccb8222}[[[}}}[[}}}}}}[___[[[_}}::]^]({{{!'',,!!]]]:[_122aaa66aaaaaabfhlpttpppquuxxAzBGIMMNOPPQQQPPPOONLMLMKHEEzCBEAwqqunjjkkbbabfb62[[[(",
+"({!!!';;;;;;;;;==%&&%%%&&&%&&&***;-',!{[[166bbknqsyAAAwwyAAAzAAwwuutACEEJKKIIJJHIIKEEAxwwuutquuyAAyABEEAyxuuuuxpspmmjjbbbb62}}}[[[[[[}}}}__[_:_:([(__[[___[:_//(({!!]{{((<1|1356988999a9cccfjiotyywttxuuzzAAEGHKMNOOPQQQQPPPPONNLMKFEHAAEEAwqqunikkkbb8bf62}[[[(",
+"({!!!';;;;;;;;;==%%&&%*%%%&%%%**=;;''!{^_166bhknqsyyAwwwxAACAAzxutuuxBEEIKKIIKIKIKHHEAAywtttuuxyAAwwABEAyxxuuupppqomiicbb6a2}[[[[[[[[}}____(([((((((:_1:|1:}1____({{{{(((_1|}34688a8abda9ecchmptAAyyyAAACAEEHJIMMLNOPQQQQQPPOOOOMMMKIHBBEEAwqqunjjkeb88bc62}[[[(",
+"({!!!';;;;;;;;;===%%&=%%%%%%%%==;;;''!{^_166aekvqwyyAwwwxzCBCBzxxuxxxAEHHKKKKMMMKIEEEAAwxtuuquuyAzxwyAyAyyxpprpppqqmjfbcba62}[[[[[[[[____((((^^^^:[:[[[1|}[[_<<__({{{{{((_<11|366a68899a8bbdflouwAAyyAAACCCEIIKNNOOPQQQQQQPPOOONONMKIHCCEEAxqqunjkkbb8acc62[[[[(",
+"({!!!!;;;;;;;;;===&%*&&&&%%&&=*-=;;''!^^126bagjrtvyywwwxxzCEEAzxuuuxxCCHHKMMMMNNKIEBDyyxxuupqquwyAwtwuwyztprppprrqqlifbb6622}}[[[[[(___]]((^^^^[[[:[[[:[[1:[_<___{{!!{{(((_}_|266a6668668aa9filotyAyzzAACCCHIIKNOOOPQQQQQQPPOOONOMMKIIEEEHAyuuunjjkb88bb822[[[[(",
+"({!!!!';;;;;;;;;===%***&&&&&=***;;''!{^_126bhgjqtvyywwwxxzBEBAxxuuuxxzEHIMNONMMMKHBByxxuxtspqrquwyxtuuttwtqmmmommmmljfbb662}}}[(((((__(](^^^^^^[(((((:[[:[:[}__<</~{{{{{((_|}}}22226aa66a8abhhiltwywwwyyzCAEIILMOOOPQQRRQQQPPOOOOOMMIIHEIHAyuuunnjhb88cc622[[[[(",
+"({!!!!';;;;;;;;;====***=******;;;'''!^^_266bhgjqtvvywwwxxzBEBzxuuuxxzzEHKNOOONMKIEBAwuuuspppmqruwwwuqqrpttpmiinlllmlifba6622}}(((((__(((^^^^^{{{{{{(((]([[[:}_<<__{{{{{{((:_[:[12222226aa6abbejlpyywtuwwzzzBHHJMNNOOQQRRQQQQPOOOOOMMIIHHIHEyuxxpnkkb8abb622[[[[(",
+"({{!!!!;;;;;;;;;=======**%===;;;;>,'^^_122bbgjmstvvywwwxxzAEzxxxuxxzzzEIKMNOOMMKIECvvqqqronppoqtxywuqlnmptpoiiijjllliecba222}}(((((_(((^^^^^{{{{{{{((((((_:[:<<<<_]{!]]]^]]][[[[}}}2}222268a8bhipwwxuwwwzzBBEGJKMMOOPQRRQQQQPPPPPOONMKIIIHBwzwzppmkeabcc62}[[[[[",
+"(({!!!!';;;;;;;;;===;=-=====;;;;'''^^(_2268hgjmvvvvywwwwyzABzxxxxxzzzBIIIMMNNMMKIGzvtqqqmnnnonquwyxuqnkklppoifiifiiifecb622}}_((((((({^^^^^!{{{{{{{{]{{]{(([:_((:<]]!!!!]^{]:[^[:[:_2}2}266a8ahimpwxustwzxAAEEGIMMMOPQQQQQQQPPPPPPPOOMMMKIEyyxxppmmjbbhba2}[[[[[",
+"(({{!!!!;;;;;;;;;==*=;====;;;;;;,'^^^(_2288bgmmsvvvvwwxwyzzAxxxxxzzzCEHIIKKMMMKIEGCvsqqmnnnnnhmquwwuonkjiiooliiijiiiief86222}_(((({(({^^^^{{{!!]!]]{^{{{{{(](_((__]]!!!!^^]^(^^_[[1[[}}2226668gelqwttupwxxAACBGGKMMNOPQQQQQQQPPPPPPPONNNNKHAAxwpomkiififa22}[[[[",
+"[(({!!!!';;;;;;;;;;;;;;;;;;;;;','!^^(_}228bgjmvvvvvvywwwyzAAAxxxxzzCEEHHHIIKMMKKEEAwuqqmnjnnnjhmqtuunkkjfiloiffffccbife8622}}_((({{({^^^^{!{!!!!!!!!{{{{]{](]((](<(!!]!]^^^]]^^[[[[[[122226668bgkqtwsrtuuuyyBCGGILKMOPQQQQQQPPOOPPPPOOOOONKIEAyxokkhjhifb622}[[[",
+"[[(({!!!!';;;;;;;;;;;;;;;;;;;''!!!^(_}}2aabgjmvvvvvvywwwyzzAzxxxzzCEGHHHEIIIKMKIEEAvuqmmmjjjnhjjmuuonkheheiiifcfccc9bb98622}__(({{{({^^^^!!!!!!!!!!!{!!!{{{]]//(/_(]]!]!{^^]^[[[[[_[[222222888hghmwwsruuuuyxzACCHFIMNPPQQQQQPPOOOPPPOOOOONNMIIBAtpkkeffbb8622}}[",
+"}[(({{!!!';;;;;;;;;;;;;;;;;;>!!!!!{__}}28bdjmmvvvvvvyzwwwyAAzAxzzzCEEHHEHIIIJKKHEBAvuqmnmjjjjjjhmqunkkhbb8bfffbccc999988a62}__({{{{({^^^{!!!!!!!!!!!{{!]!{^]{]:<:::]{]^]^^]]]][^[[[}2}2222668adghottsuuuuzyxzzACHIFKNOPQQQQQPPOOPPPPPOOOOOMMKIECwtqmiifbaa866a22",
+"2}[(({!!!!';;;;;;;;;;;;;;;'!!!!!{{([[}2a8bdhmsvzzvvvvzzwwzAAzAzzABEEHHEEHHIIHHIHGEDvuqmnnjjjjjhhmquokfbbb888ffc9cc998866662}__({{{{({^^^{!!!!!!'!!!'!!{]]!{^]]:::::(]]]]^^]^]^[^[}}}}}2}2666a0dhjotxxuuuuwxxAzzCEIFILNPQQPQPPPPOOPPPPOOOOOMKKIHBBywtponc888826a2",
+"222}_({!!!!';;;;;;;;;;;;;;'!!!!{{^([[26aabhmmsvzzzvvvzzzwzAAAAABEEHHEEEEHHHIHEIHHEDwuqmnnjjjjjhhmqomkjcb8a68bc99995555866222__({{{{(^^^^{!!!!!''!'''!!!!]]{{{(:_:::({]^]^^^]:[[[[}}}}}}266aaaaeejnuwxuuuwwwwzzACGIIKMNOPPPPPPPOOOOPPOOOOONMMKHHCAwwxwwplhba8a226",
+"22222_{!!!!';;;;;;;;;;;;;;',!^^(([[[}266ademvvxzzzzvvzzzABzAACBEHHHEEEEHGHHIHEHEEBDwuqmnhjjjjjhkkmomjeh888a85095555335544222__({{{{({^^^{]!!!!'!]'!'!!!!{]]{{(:_:_<_]]]^{^^^[[[[[}}}}}226aaabbehmquywuuwwwwwzzzCGFHFKNOPPPPOPPPOOOOOOOOOOOOMKIEEAytwwxtpoheb8882",
+"222}2<(]^!!';;;;;;;;;;;;';'!,^(([[[[}668bhhhvuxzzzzzvvzzzCCzzBEHHHEEEEHHHHGHECBCEBAyuqnnnjjjjjhkkmomifea6aa475534224443||||2__({{{{({^^^{!!!!!'!'')!!]{!{{]{{(_<<<1_(]]^{^^^::_[[[}}2227aaa8bbhkmquxxvwwvwwzAzACGHHFKNOPPPPOOOPOPOOOOOPOOOOMKIEEzxxtwwtppplifba8",
+"a22}__(^^^^';;;;-;;;;;;;'''!,{([[[[}668abekrvuzDzzzzzzzzAABBABEHHEEEEHHHHHHHEEzBEBDyturnnjjjjhkkmnnmkjjc8a744432}22}}}}|1<_<<_(({{{({^^^{!!]!!!!'!!!]{{{{{{]](__|_1__]^]^^]::::[[[}2227778888hhkmquyAxwwwwxzzzACGHFFKNOOOOPOOOOPPOOOOOOOOOONIHHBBwxxwwuqqppolihh",
+"h8a2__(^^]^!'';>;;;;;;>;'''!!{([[}}6668abkkqvxDDDzzzzzzzACBCCEHHIEEHHHHHJEHBEEzCGBDAxurmmjjjjkkkmmnmkhheba541}22}}22}}}::^(_((((({{({^^^{!{]^!]!')!]!!]~{({((:[<}|11_]]]^^^:::_[[22277777888bgkkmpuyyyxxwDAzyACCGHHFKMOOOOOOOOOOPPOOOOOPOOOMIHEEAAxxttpqqqnoplli",
+"mfc61_{!^]^!!!!''>;;;;;;;;'!!{([[[2228abkhrvvxAADDzzzzzzzACABEEEHHHHHHHIHGHBCAAzAAAAxuqrnjjjmkkknmlmlfcfec74[}2221111_}:::]^]{{{{{{({^^^{{]!^!]!!]]!]!{]{/(((_1|}}111:::_([_::}222277777a888bghkqptyAywzyDAAyyCCGHFFFKMOOOONONOOOPOOOOOPOPONKGCByyuxyyppmmmmoopl",
+"lifc9|_^]!!^{~{{'';;;--;;;'!!{(:[222600bkknvuDBBBDDDzzzzzAzABEEEEGEEHHHIHGEBEACCAAAAxxsqmjmnkkkmmmlmlifiic04}}}1_<<<<<//(:]^]^!!!!{{(^^^^{{!!!!]!!]{{!{{(/(_<_143|||1<::__[[}22222777770a888bghmmrtzCBAzAAAAAzzCGHFFFKMNOOONNNNOOOOOOOPPPPPNKHCzzwwuxxupormmmmoo",
+"igffc03:^^^^^]^]!'';;;;;;;,'!{{[_22600bhhnvvxDEEBDDBzzyvzwAAEEEBBGEEHHHHHGEEzCCCAAAyxxuqnnnmkkhhmmjmlifiif07}}1||<<<<<//{~){^^!!!!!^^]^^^{{{{!]{!]{{{]{(/(/_||144|33411_:}1}}337a7788a00bbbbbbhmmptABCzAzzDAAzzCGHFFFKMNOOONMNNNOOPOOOPPQQPOMFBzzxtwuuuunorommml",
+"fc0c00722|:(]^^^^''''>;-;;'''!{[[2260bagnnvuDDBECDBCzzyADzAAEEBAAAEEHHHHHEEECBBAADAyxxuummnmkkkkkmjmmifiic92}}_<|</////~~{)',''''!!^^^^]^{{{{{{{]]{{{{((</__<|1143|2411_11}14347a78a99dbcbbhefjmmpsyBCzAzzAzzAzCHHHFFFMNNNONMLNNOOOOOOPPQQQPNKHzzvvtwwqqqquoppme",
+"ea8877759952:^^!!!,),,';>',''!{[[2260bhgmvutyCGEBDBzzzyDxyABBBAzAAAEEHHIHHHCBCAAADAAzzxupmnmmhkkkmjklifffd922}_<<<(((/{{{)),''>;;''!^^^^]({{{{{{{{~{{{]](____}11|4|221____1114446aaaa0adbeffehmmmqtwEECCAzzzzzzCEHIFFIMNNNNNMKLNOOOOOOPQQQQOMKFBzzwytusmmmqqurmf",
+"e9aa7445cd95}<]^]!'''''';',''!{[:22a0ahnnvvvDBGBBDBzzwyzyDBEzxxAzAABHIIHHIHGCEABAAAAAAAzturmnhhkkkjkiidccd5221_<<__((({{{!'',;;;;;'''{^^^:{({{{{{{{{({]((__:__|114414}_____111226666aaaa9behjilqqqtyEECCCzCAzzzCEHEFFIKNNNNMMKLMOOOOOOPQQQQONKHFAzzyywprssmqqlif",
+"e8a85375955743}:^]!''''''',''!]^[22608gnjvuvDAGBBDzzzwvwyABAzxxxzAABHIHHHHHEEBAAAAABAAAAwuqmnmhkkhkkiicccd963|<<<<_(~~~)),''';;;;;;'''{^:[{]{{{{{{{{{{{^(__::<|11442|}[[[_[}}222aaaa0898abbbejlquuwyBEEEEEEEBBBEEHEEFIKNNNNMIKLKNOOOOOPQQQPONMIFDAzzzvvvrrsmhgfb",
+"baa777753}}}3437}_]!'''''!!!'!{^[2260agljqqwDADBBDzzzwywzAzzxxxxxABBEEEEBHHHBAAzyyAAAAAzwtqrqnmhhhkkiifcccc654|____~{~~))''>;;;==;;;'']{:[(({]^]{{~{{{(((_::<1|4443332}[[}}1222000aa9c9aaaabejoquuuyBEECHFIHHEGEEHEEEHKMNNNMKLKLMOOOOOPQQQPPNMIHFDAzzzvvvvrmegba",
+"222|7572[<[:|1|742|[!)'''!]!!{]][22678gjjqqwDDDDDDxzwxvxzAzxuuuxxzBEEEEBEHHBAAwxyyyAAAAwttqrqqljkhkkkiiecdc954|___//{~)),>>>;-====;;'''{([[((]((]]{/(((((__<:11|4353552}}}42770ddabbdccccdhgiopptxwABEGEIHIFIFFFEHECEHIMNNNMKIKLMOOOOOPQQQPPOMKHHEEEAzxxvvrmedaa",
+"2}}1774[[:[::[|4443|:{!''!!]^{([[}}6a8gjjqquDAADDDxzwwuwzwxuuuuxxxBEEEEEHHBAyyxxzyyyzAzwwtpqpooljjjkkiifcdc993|<__//)))),>>--*%%%==;;''!](:((](((]]/(((((_<_<1|435575955775700ddihhggfffikimopptwwxABHEEHIKKKIFFEIEECEIMNNNMFILMMNPOOOPQQQQPONKLHHHEFzzxxxrmed86",
+"2}}131_^]:^::_14|1233}({'!!!](__:}2778gjjrquDAADDDxxwwwwzxusuuuxxzzBBBEHHByyxxxxxywwyyAwwupuqnoomkkkmiieffc995|<__//~))),>;--*%%%%*;;;,!{{(_((:(((:(/<:__<_1|4377590990775000ddijifikfiiimmmmpqppwwABHHHHIKKKIIIHIHECEIKNNNMIIIMMOOOOOPQQQQPOOMLKHIFHDDzxvrmed86",
+"2}}1|_{^^]^_<_1111:}334<^]!!!{(:}22778dikmquwADDADxxwwwyyuuqvvuxzzzBzEEEAAwuuuuxxwwuxxxwwtrqooopmmmmmllffffc97||<//~~),,,>;-=%&&&&**-;'!]]([(__:_::/_<<<<|11|4355599900557909ciiiigggkfiikkkkmnnrtxxBHHHIKKLLKIIKKIEEEIKMNNKIFILMOOOOPPQQQPPPOOMKLKIHFDzxvrmed86",
+"2}2__{{{{{((__111<_[}323|:]!!{{[}62088djjmqtwAADAxxxxzwyuuqvvvuxzzzzBEEAywuuuuuupstpuxxtwuqqlnnmmmmmmoliffc9673|_//~~),,,>-**%$$$&&=--'']{]_______<<<<||||3||47579999990099ccgiiiijgggcfghhgggijjquuyBEEEIKMKKKKKKIHEHIKNNNMIHIIMOOOOOPQQPPPPOONMLLMLHDzxvrmed86",
+"222_({{!!{((_11311_[<:}2|11:({/:[220agdjmmqtvAADDyvxxywyuqqvvuuxxxzBEEAywutuxuspppsqutxuwtrnmlkmomliloonifc9663|1</~~),>>>-**%$$$$%==-''!{((1<_<1<<|<||||||33347799ccffdccccfgjkkggddggcdbbdhheehmqqwAEECGIKFFLKKKKIHIKMNNNMKFIILOOOOPQQQPPPPOONNNMMLHDzxvrmed86",
+"22}[(({{{{{{__2221__](:<11|||1_::220bghjmmquvyADDyuxwzyyvqqqqrruxxzGEAywxuxxtpprrppquuxtwtqqnjkjjillnilolif9a63||</~~),>>>-*&&###$%%==>''{(_1<|<|111||||||33357709cccffcc99cghhhhjghddgdbbhbdgeehmmqwABBCBHIKIFIIKKIHIKMNNONKFFIMNOOPPQQQQQPPOOONLNMLHDzxvrmed86",
+"22}[(({{{{((([}}2|__^](::<||752}}2609gglmnqtvyADDxvxwAyxqqqqsrquxzBEBAyxxuuxtutsssppstxtwtummkhkehijiilolij9aa3|1</~~),>>>==&&####$%*=>>'!{(__1_111||11||33355900ddccfgc99ddhehhhhhhddddbbbabheeemmmtyCBCCHIFIFIIKIHEHKMNNOOMKFKKOOOPPPQQQQPOOOOOONMLHFzxvrmed8a",
+"a}[[(((((({{[[[}}_1<<]^]^[_1459556678gglqqqtvyADyAvxxAwwqqqqvrruxzBEAywxwxxttwwyvvwwtxywyutpmmkheehhiiloilic9673|_<~~),>>;==&&####$&**;>,!{(_|||||1||1|33335599990dccfffddhhhghhhhhghdddabbbhheeehmmqyABBCEHFKIIIKIEEHKMNNOONKKKMOOOPPQQQPPPOOPPOONMKHFzxvrmed88",
+"a2[[[(((((([:[[}[}<__]^^]^]_|3999990adgjqqquwAADDDwxwzwwmmqqunruzACyyywxwxwyAEEEEBAAAAAAAwwsomkhhbbbejliiiif9673|_</~),>;===%$@@@@$&&*-;'){{(_|11|||11133555569990cccghfebhhhghkkhjfgdgggbbehhhjjhmqqyABCCEFIIFIIKKIHIKMNNOONMKMNOPOPQQQPPPPOOPPPONNKHFzxvrmedb8",
+"8}[[[[((([[[::1}}}_|__]/](^<<1599cfdbggkqpqwyAAADDxxyAwtsmqqquoxzzywwxwyAABEHKMKIIHEEBAAAAAwpmmjjbbbfiiiiiifc953||</~),>-==%%$#@@@#&%=*>>'!)(__1<1||43347555599999ddghfifghggklnjmmmiigghhfhghggjjqquyAEBCCHFKKIFKKIHIKNNOOONNMMNPPOPQQQQPQPOOPPPONNLLFDxvrmmhb8",
+"6}[[[[[[[[::}22}}}}_<_<_:/(__137ccfgfigimmqvyACADDzzzAztsmqqqquxAAvtwwABEEHIKMMIEEBAAywwyABytqnjjgbhhhgiiiifd99531</~),>;==%%$@@@@#$%%=;;,,!~(__|_|||33555550999cccdggiiijkjlooommmollkkkffghghkjjnquAAEBCEFIKKKKKKHHIKMNOOONNMNNOPOPQQQQQQPPOPPPPONLLFDxvrmmjga",
+"a6}[[[[[::[}22662}}(//<_<__<_}|580fiimomrqqwyAEADDAzAywusmqqqvxzAwtwxyBEHIKKKKEBAwwwxwtwyyAywqmoijijhfhfiijif8853|<<~)),;=%%%#@@@@##$%%*;;,!{/_<<||1|145559709cccffiillllllopprpppppoommiiikkkkkknmuuAAEECEFIKKKKFKFHHKMNNOONNNNNOOOPQQQQQQPPPPPPPONLLHDxvrrmhgb",
+"66}}[[[[[}}2288864}}({{(1||1_}|298fgiopprqqvvACADDDzzvvsssqqquxzzttwyAEIIMKIHBAywtttxwwwyyAywtpmlmihehcfiiiff9973||</)),-=%%$#@@@@##$&&**-')){/<_<<|||3755999dcfffiilooooooooppppqppppopllommmpmmpptwABEEGCIFKKKKLKIHIKMNNOONNMNNOOOOPQQQQQQPPPPPOONMLHFzxvrmjgb",
+"666}}[[}}266ccff996}(({/<||1_|2269dfmotttutvyACEBBBBzxvvstqqqtwzxtwyAEHIKKIEBAyAAyyyyAyAAAAywtpmlnlgfhfeeifgfc8953|</~),-=%%$#@++@##$&&==->'!~/_<<|||3355999ccdgfgiillllollnoorrpmoqoommoloompqpqttyyEHIHGHKKKKKLKKFFIKMNMNONNMNNOOOOPQQQQPPPPPOOOOONLHFzxvsmhdd",
+"8666}222a6bbfeifif92[((/_|<_}}2269dfmmpwwwwwyABEBDEEzxvvtutqqxwxxwyABHIIHHHEEEEEHEEEEEBBABAAytpoliiiighceffgcc8953|</~),>;%%$#@++@###$&==;>,!~/<<<<||3335599ccggfiijllnnlloooopppqqpoomomlmmmopqqttyAEIKKIIMMMMMKKLKIKKMMMMNMMMNOOOOPPQQQQPPPPOOOPPOOKLFBxvsmmed",
+"86666226bbbccjjefc6|[(((((/(::2669dckkptwwAAAACEGEHEAxxxwstuuxxxxwAEEIIHEHIKIKIIIHIIHIEEBEBAAwppojhfiffcddddc88653|</~),>;*%$#@++@@##$%%*;>,){//<<||||355599ccggfiijllonpppppttwwtxwttpttpppppputtwAAEIKKKKNOOONNMMKKKLNNNNNNMMNOOOOPPPQQQPPPOOOOPPPOMLIDzvssmed",
+"d86688abcbccehgif86}}[(({{{^:[}659dekoouuwABEBEEEEHEEzxvvwswyDuxzBBEHIHHIKMMMKKIIEHIHIIIHHEBBAwponijijfcccccc98655||<~),>;*%$#@++@@#@#$%*->,,)//<<<||||35599ccfiiillooppttwwwwyyyyAAyywwywwwtxzzyyABCHIMKKMNOOOOOOOMMMMNNNNNNMMNOOOOPPPQQPPPPOOOOPPPOOMIFBzytmme",
+"ddba88bbcciikggfc82}[:[{{^]^^::27dffkooptwABEHHGHIEEBAxzvvwwzyuxABBHHHHIKMKKKMKIIHHIHIIKIHHEEBAtpnjffefffcd9c996533|</)),;*%$#@+++@@@#$$*--,,)~//<<||||35599ccfiiloppttwwywwwwyyywyyywwtwwtttwAAAAEEEIKMMMNNOOPPOOOOOOOOONNNNMNNOOOOPPPPPPPPPOOOPPPOOONNIHzztmme",
+"eggbehchfilokkkf962}::::::[][:}2a0ckkmrpuwAAEJIIIKIEBCAzzyyAzyAzCEIHHIIKKKIIKMKIIEEHHIIKIHHEEBBypljfbeffcc9cc95333||</),,-=%$#@+++@+@#$$%*->,)~///<|||335599cfiilopppttwwwwwwwwywwwwywwuppppptwwyzABEHMNNMOOOPPPPPPPOPPPPPOOONNOPPPPPPPPPPPOPOOOPPPOOOONMIEAzsmm",
+"jjkkkhfhgkmmonkg6a6[::[:[[[:::2}60agkoupuwyABHIKMKIHBDDzzzACAyACEHIKHIIIIIHIIIIHHEBBAEEEEEHEEEBytoifbhcfdcccc9533|||</~),-=%$#@+++++##$%%*->,)~//<<||3355599cffillppptwwwwywwwyyyywyywwwutttttwwwyyABEIMMMNOOPPQPQQQPPQQQQPPOOOPPPOPOOOPPPPOOOOOPPPOOOONMMKGAwtq",
+"qnokkkggggillqjg862[}[[:::[[[222788glouuuyAAEGGKNNKIEBBDzzBBAABEEIIKIIIKKIHHEHHEEAAyyAyyAAEEBEBAwpljeedcc9ccc953||||<<~),>;%$#@++++@@#$%%*--,)~/(<||||355999ccfiilopptttwwwwwwyyyyyAAAyywwwyyyAAAAzEEIKMMMNNOOPPOPQQQPQQQQQQQPPPQPPPOOOPPPPOOOOOOPPOOOOONMKGEBwq",
+"xuronljeejjjqmhd8666}:[:[::[[22608ggjppuwyAAEEEKMNMIIEBDEBEEBEEHIIKKKIIKKHEEBBBBBAzyywtwwwAEBBBAwpoijedd99cc9953|||<<<~),>;%%#@++++@@##$%*-->)~/<<<|||355599ccffiiloptwwwwywwwyyAAAyyywwywyyAAAAACEHHKMNNNNOOOOOOOPPPPQQQQQQQQQQQQQPOOOPPPPOOOOOOOPOOOOOOMMKGEAA",
+"Eywuoljeemmqmmed8aaa}}[[:[:[422a08ggioqqwyAAEEHKMMMKKIEEEEEGGHIIKMKKKKMKIEBAAAAAAAAAywttpuwAABAAwtolifdda8c995531|<<<<~~,>;=%#@++++@@@#$%*->,,~/<<<||||335599ccfiiloppwwwwyAyyyyyyywwwwwwwtwwxyyAEEEKKNOOOOOOPOOOOOOOOPQQQQQQQQRQQQQPOOOPPPOOOOOOOOOOOOOOONKHHHE",
+"HHAyuqqmmqqqpmhdd8662}:[:[:2226788glinqqwAAEEEIKMMMMKKKHHHFHHFKKKMKIKMKIEBAABzAAABAAAwxupqtwyAAAwtpoljgd890999541<<<<//~,>;=%$@++.+@+@#$%%->,)~//<<<|||3355999cfiilopptwwyyywwwyvwwuutttpstquuuxAAAEHIMOOOOPPPPPPOPPOOOPQQQQQQQQQQQQQPPOPPPOOOOOOOOOONOOONMMMJII",
+"KHHEwuuqqqwtpkked82222[:[:22}267agglrrqtwyAEEHKKMMMMMMKKKIIIHKMNNMKMMKIHGEABBAAyyDyyyyuupttwwyyAywtpoifd09999953|1<//~~~,>>=%$@++.+@+@#$%*->,))~//<<<||335599ccfiillopptwwwwwwwywwwvxxwwwwwwwwyAAACEGHKNOOOOOPPPPQPPPPPPQPPPOPPQQQQQQQQPPPPPOOOOOOONNNNOONNMNNMK",
+"MKEEEBAyyywtpkmeda82222222222607aggkqrqvvAACEIKKMMMMMMMMMMKKKMNNNNMMMKEEEECAywwstsstzwuuutwwwwwyywtpplic98999953|<<//~~~),>=&$#++.++@##$%*-->))~//<<|||355599ccffiilllpptwwyyyyAAABBAABBEBABBBBEEHGIIKMOOOOOOPOOPPPQQQQQQQPOOOOPQQQQQQQQQQQPOOOOOOOONNNOOOMNNNNN",
+"MKIEEEBBABzypmkb0082266689889909ggkjmquvvABBEIKMMMNMMMMNMMMMMMNNNNONKIHIBBzzzxssrrruuuuuputwwwwwywwtolifcb955553|<//~~))),>=&$#++.++@##$%*-->,)~~//<<<||35599cccgffiloptwwAABBBEEEEEEEEEHHHHGHHKKKMMNOOOPPPOPPPOPPPPPQQQQQQQPOOPQQPPQQQQQQQQPOOOOOOOONNOOOOMMMNN",
+"KKKHHEHIIEAAtmme0088688cccfjiigfkglmnqtvwyBBIIKMMNNNNMNMNNONOONNNOONMIHEEAzxxuuuuuuqusuuttuwtwtwwwwtooiib9955553|<</~~))),>-&&#++.++@##%%*-->,,~~/<<<|||335599ccfiiloppwyABBBBBEEEEHHHHHHEEHHHIKKMMNOOOPQQPQQQQPPPPPPPQQQQQQQPPQQQPPPPPQQQQQQPPPPPPOOOOOOOONMMMM",
+"KIJIKIIIIIHBwtmefd9ccffccfiilklqmporqqwvyCAEHIMMNNNNNNMNNOOOOOONOONNKKJEBzAxuuuuuvvqqqqtuspttttwwywwpoliec957533|<</~))),,>-&&#+++++@##%%*-->,,~~//<<|||333599ccfilopttwwyAABBEEEEEEEEIHEEEEEEHHIIKMNOOPQQQQQQQQQQQQPPQQQQQQQQQQQQPPPPPPQQQQQPQPQPPPOOOOOOOOMNML",
+"FIIIKMKIIIHECwmmigkilifccffkkllpptupqtvvyCBHHIMMNNNOONONNOOPPPPOPOMMMIHHGAzAxuvuuuvqqqsttqutttwwwyywppliec95733||</~{),,,,>-*&#++++@@##%%*-->,,~///<<<||335599cfilloppptwwyyAABBBBEBBEEEEAACCBCCEIKMNNOOPQPQPQQPPPQQQQQQQQQQQPQQQQQPPPPPPPOOPPPQQQQPPPPOOOOOONMK",
+"KIIILMNNMKEEEAupnomoijfeccgggjomttxxuvyAyCBBHIKMMNNOOOOOOOOPPPPPPONMKIJGECzyxywvuvuqqvsuupuwwwwwwyywtplif9997731<<({~!),,>>-*&$@+++@@##%%*->>,))~//<<<||335599cfiloooppptwwwAAAAAAAAAADBBBAAAAEEHIKMMNNOPPPPPPPPPPPQPPQQQQQQPPQQQQQQQQQQQPOOOOOPQQQQPPPPPOOOOOMM",
+"MLIKKMNNNKHCBAxxttqoifbc9dddeekmpuwwyAAyAACBIIKMMMNOOPOOOOPPPPQQPONMKIJJECBzxwwwwwtttvstqstuwwwwwyywwtoifc9973||<//~)),,,>--**$@+++@@##%%*->>,)~~///<<||355599cfiloooppptwwwyAABBBBBBAAABEDBDEEHHIKMNNOOPPPPPPPPOOPPPPPQQQQQPPQQQQQQQQQQQPOONNOOPQQQQQPPPPPPPOOM",
+"LMMMKKMMMKIGCAyBywpokgddd00bbggoostxAAADyABEEIIKMMNNOPPPOPPPPPQQPONMKKIGGGCzzzvvwttttsvsuvttttwywyyywtplicc053|||</~),,,>>-=**$@+++@@#$%%*->,,)~~~/<<|||355559cfiioooopptwyAAEEEBEEBEEEBEEEEEHFIKKMMMOOOPPPPOPPOOOOOOOPQQQQQPPPQQQQQQQQQQQPOONNOPPQQQQQQQQPPPPOO",
+"ONMMMMMMKKHEEABABywmkgdd00bbgggmlpuwAAAADAAEHIIIKMNOOOPPPPQQPQPQPPONKKIIGGCCCzDytuutssvtvusuutvwwwwywttoicc973||<</~),,>>--;=*$@+++@@#$%%*->,,))~~/<<<|||35559cfiilooopptwyAABEEEEEEEEEEHEHHHIIKMMMNOOOPQQPPOPPOOOOOOOPPQQPPPPPQQQQQQQQQQQQPPOOOPQQQQQQQQQQPPPPO",
+"POOONLMLIIEEEEEAzwtpmgdd0bbbggllqruwAAAAAAAEHHIIIMMNOOOPPPQQQQQPPPOOMKLKIHGCCAAAxvvvvvvtwuusuttvvwwwwttplic973||<//~'',>--**=*%@++@@##$%*-->,,))~//<<<<||35559ccfiillmopptwwyBBEEEEHIEHHHIIIIKKKMMNNNOOQQQPPPOPPOOOOOOOPPPPPPOPPQQQQQQQQQQQQPPPOPQQQQQQQQQRQQQQP",
+"PPOOOOOMIFECEEHAytpppligecbgggnmrqquwwADDAABHHHIKKMNOOOPPQQQQQPPPPOOONKKKIIGCBAAzvvvvvvtwxxvutwwwwwwwwtpoifc95||<</)),,>-;**%&%#@#@@##$%*-->,,)~~//<<<<||355559cffiikllopppwwAABBBEHHHIHEGJHJJIIMMNNOOPQQQPPPOOOOOOOOOOPPPPPOOOPQQPPPPQQQQQQPPQQQQQQQQQQQQQQQQQQ",
+"QQPPPOOLIFBCEEEAywppppoljekggnlrvqttttxDABDEEHGIIKMNNOOPPQQQQQQPPPPOOONKKKIIHGGCCzzzzxwvxxxuuwwwyytwwwtpoifc95|1<</~!,,>--=*%&$#@##@#$$%*-->,,)~~///<<<||335559cffiiiillooptwyAzAAzEEHHHIIJIIIMMMLNOOPPPQQPPOOOOOOOOOOOPPPPOOOOOPPOPPPQQQQPPPPPQQQQQQQQQQQQQQQQQ",
+"QQQQPPOMIHECBEAwwwpooppolmmkknnquutuutuwDDEEEHEHIKKNNOPPPQQQQQQPPPOOPOONNMKKKKHGCCCCzzzxxxxxvwvyyywtttwtoifc9531</({!,>--;=%%$$#@##@#$$%**->,,)~~///<<<||3355599fffiiillopptwwyAAzABEHHIJIIIKKMMOOOPPPPQQQPPOOOOOOLNNOOPPPPPOOOOPPOOOPPQQPPPPPPPQQQRRRRRRQQQQQRR",
+"RQQQQPOMKIHCCAwwuuuoooppuqmmqmrruttqqqutwDBEEBGEIIKNNOOPPQQQQQQQPPPPOPOOOOMMFIIHGCzzzAAzzxxxvwyyAAywwtttolfc9531<//{),>>-*=%&$$#@####$$%*-->,,)~~///<<|||3355599ffiffiiloppptwyyAAzBHHHIIKIKMMNOOOPPPPPPQQPOOOOOONMNNNOOPPOOOOOPPPNNOOPPPPPOPPPPQQQRRRRRRRRRRRRR",
+"RRRQQPONMKKCzytuqqtuoooutuqtqqvvutuuuqqquwBEEBGEEIIKNOOPPQQQQQQQQQPPOOPPOOOMKIIHFECzzzAAAzzyyyyAAAywwtttplfc953|<//~),>>-*%&&$##@@#$#$%%*->>,))~~///<<<|||355599ffifgiiloooppwwyAAABEHHIIKKMMNNOOOOPPPPPQQPOOONNONMMMMNOOOOOOOOPPPNNNNOPPPOOOOPPPQQQRRRRRRRRRRSR",
+"RRRQQPPOOMKEAxutmqqutuuquuuwtxuuuuqquqqquwAEEBAECHIKMNOOPPQQQQQQQQQQPPPPPOOMLIFFHEEzAzzzABAAzAAABBAyywttpoic953|<//~),>--*%%&#@##@#$#$%%*->>,))~////<<<||335599cfffgfiiloloopwwyAAABEGEIIKMNNOOOOOPPPPPPQQPOOONNNNMMMMNOOOOONNOOPPONNNNOOOONOOOPPPQQQRRRRRRRRRSS",
+"SRRQQPPOONNHCyputmqquuutupwywyxxwuuqqqquuuyEEEBAEEIKKNOOPPPQQQQQQQQQQQPPOPNNMMKIHHEEDDDDABBBBABEEEBAywwtpoic9531<//~),>-**%%&#@@#@#$$$%%*->>,,)~////<<|||335999cffifiiililopptyyAABEEEHIIKMNNOOOPPPPPPPPPQPOOONOONMMMLNNOONONNNOOONNNNNNNNNNNNNOPPQQQQRRRSSRRRSS",
+"SSRQQPPOOONKEAyttmmqquuuupwwAAyxwuuuuqqquuyAEEBBGEHIMNOOOPPPPQQQQQQQQQPOPOOONNMKIIIHEDAAABBEEEEEEEEBAAwwpoic953|<//~),>-**%%$#@@###$%$%**->>,,)~//<<<<||3335599cfffffiililooptyyAABEHHHIKMMNOOOOPPPOOOOPPQPOOONNONNNNMMNOONMMMNOOOMMNMMMNNNMKMMNOPPQQQQRRRSSSSSS",
+"SSSQQPPOPONKJEAttmmqmqquuwwwAAAzyxuuuqqqquxyDDEEBEHHKNNOOOPPPPPPQQQQQQQPPPPPPONMKKIHHEDAABBEEEEEBEEBBAwwtplf953|<//~),>-*%%%$##@###&%$%**->>,,)~//<<<|||3335599ccfcffiiiilopppwyyAAEEEHIKMNNOOOOOOOOOOOPPPPOOONNONNNLMMNONNMMKNOOOMMMKKKKMMMMKKMNOOPQQQRRRRSSSSS",
+"SSSQQPPOOOMKIHEwutqqqmqqwwwwyAAAAyxxuuqquuwyyABEEEHIKNNNOOOOOPPPQQQQQQQQQPPPPOONMKKIHHBBACBDEIHBBABEBAywtpoic95|<</~),>-*%%%$##@#$$&%%%**->>,))~~/<<||||||3359cccfcffiiiloopptwAAAAEEEEIIKMNNOOOOOOOOOOOOPPOOONNOMMMMKKMNNMMKKKNOOMMMKIHHKKMKKKKMNNOOPQQRRRRSSSS",
+"SSSRQQPOONMIIHHAwwwqqqqttwwAyzAABAxxxuuuuuwwwyABEEEIKMNNNNOOOOPPQQQQQQQQQQPPPPOONMMIIHEEBCCBEIHBAAAABBywwppif953|<//),>-**%$$##@@#$&%%%*-->,,)~~//<<||33333559cfffffiillloopttwyAAAEHEEEIIKMNOOOOPOONNOOOOPOOONNMMMLMIKMNNKKKKKMNMMMMKIEEJHIKKIKKNNNOOPQQRRRSSSS",
+"SSSRRQQOOMKKHHEEywwwyywtttwAAzzABAzxxuuuuuxwwyyAEEHIMNMMNNNOONOOPPQPQQQQQQQQQQQPOOMKIHHEGBAEEHEBAAAABAAywtplfc53|<//)),--*%$$##@@#$&&*%*->>,))~~//<|||3333559cffiffiiilllopptwxAABBCEHHHHIKKKMMNOOOOOOOOOPPOOONNMMMMKIKKMMKKKIFMNMKKKKIHEECGHHIIKMNNOOOPPQRRSSSS",
+"SSSSRRQQPMKFEGCByywwwywtppzAAzzDEBAzxxuuuxxwwwyABEHIKNMMMNNNNNOOPQQQQQQQRRRRRQQQPPONMIHEEEEEEEEEAAyyAAyyywpoic95||//~),--*%$$##@@@$&&**-->>,))~~/<<|||3335599cffffffiiiillooptwyABBEEHHIIIIKKMMNNNNNNNNOOPPPONNNMLLMKIIKMMKKIFKMNMKKMKFHEECCCEGHIKMNNOOOPPQRRRSS",
+"SSSSRRRQPOMMIGAzAyyywwwtuxwxzAAEDAAAzyxxxxywtuwDBEHIKMMMMMNNLNOOPQQQQQQRRRRRQQQQPPPONKIIIHHEEEGBBAyywwywwwtpif993|<//),>-*%%$##+@@$%%*--->>,,)~~/<<||333355599ccfccfgfiiiiloopptwAABEGHIIKKKKMMNMNNNNNNOOOPOOONNMKLMKKIKMMKKIIIMMKIKMKFEEEzzzzCGGIKMNNOOPPQPQRRS",
+"RSRSRRRQQPONMICAAzyAywwtxtttzABEEEAAAAxxxzyxuttxBEIKKKKMMMMMNNOPQQQQQQRRRRRQQPPOOOOPONKIHIIIHHEEAAyytwwttttplfc953|</~),>**%$##+@@#%&---->,,,)~~/<<||3|3335559ccc9ccffifiiiloopptwyABCEHHIKKMMMNNNNNONOOOPPPOOOONLMMKKKKMMKIIHFKMKIKKKFFFEzzzzzzEEHHKNNOOPPPPQQR",
+"RRRRRRRRQPPONKHBzAzyAyzywttxxAEEEEEAAAAyzAyxutuxAEIMMKKKMMKKKNPPPPQQQRRRQQQQPPONNONOONMKIIKIIHEEBBAwttwttppplfc953|<</~),>--%$#@@#$&==--->,)))~~//<<||33333559ccccccdfffiiiilnrptwyyAEEHHHIKMMNNOOOOOOOOOOPPOOONNNMMKKKMMMKIHHFKMKIFKKIFHEzzzzzzCCCGGINNOOPPPPQQ",
+"QQQRRRRQQQPONMIEAzAzBBBzywxxuzBEHDEDAAzAAAAxuuxyABIMMKKKMKKKKMOOOOPQRRQQQQPPPPOONNNMNNNMKKKKKIHEEEBywtttpppolfc953|<//~)),>>-%%##$&&*-->>>,))~~~~//<<||3333599ccfdcffcfffiinnrpttwyAABEHHHHIIIKMMNNNNNNOOOOOOOOOOOOOMKKMNNKIIHIKKFFHIIIIHEBzzvxxzCCCCGHKNOOOPPPQ",
+"PPQQQRQQQQQPONKHEAzAABEBAzxxwDAEEHEDAAAAEBAxxuxxzEIMMMKKKKLKMMOOOPQQRQQPPPPPPPPOONMMKMNNMKIIKIIHHHBAytwtppoolic953|</~~),>>-*%%$$&**;>,,,,))))~~~//<<||335559ccfccfffffiilnlnpptwyyAABEEHHEEHHIIKKKMMMNNNNOONNNNOOOOONMNOOMIIEEHIIEEIIIHIIBzzzxwxyzzCCCEKMNOPQPP",
+"POPPQQQQQQPPPONKHEAAyAABBCAxwyAAEDEAAyzAEECzxxxzAEIMMMMKKIKKMNNOOPQQQQPPPPPQPQQPONMMKMNNNMIIIIEHEHEBAwwttpoolif953|</~),>>-*%%$###%=;>,)))))~~~~//<<|||355999cccccffffeiiiloppttwwwAAAABEEHGEGGJIIJIKKMNNNONMMKKMMNOOOOOOONKIEEHIHBEHIIHIICzzzwwvvvvyzzCCIKMOPQP",
+"POPPOOOPPPPPPPONMKHAzxzzBBCzzyADEDDBAyAzBEEAzxxzAEKMMMMKIIIKMNNOOQQQQPOOPQQQQQQPPONMKKNNNNKIIIEHEEBAyywtwppoolic933|<~))>--*%$#++@#%*-,,))))~~///<<||33559cccffccffcfeiiilloopppptwwwAABBEEEHJHHIIJIIKKMNNOOMKIIKKMNOOOOOONMKIIIKIGCGIIEIIEzzzxvvvvvvxyzCCELNOPP",
+"POOONNMNOOOPPPPOONMHAxxyzAACAzADDDEBAzAABCCBAzzzAEKMMNNKIIKKKMMOPQQPPPPPQQRRRRQQPPONMMMMNMMKIHHHHBAAywtttpooolif955||/~),>-*%#@++@#$%=->,,,,))~//<||335599ccfffcfffffiiiillllmmooqssvyADBEHIIHIIILIIKLKLMNNNNMKFIIIKMNOOPONKKIKKMKHGGHEEHIECzzvvwvvwwvxyAzCHMNOO",
+"OOOOOMKIKNOOOOPPONNKBwxwxzABCzAABBAAAzAACEBBBAAzBHKMMNNMIIKKMMOOPQPOOPQQRRRRRRRQQPPOOMKKKMMKIHHHEBAAAywtpoolllifc9953|/~),>-%#@+++#$%%;>>>,,,))~/<<||335559cccccffffiiiijliiiiillmqtwwDABEHIKKKIIMKKKKKKMMNNMMKKKIIKMMNOPPNKIIIKMIHEGHECEHECzzxxwvvwvvwzyyzCIMMN",
+"NNOONKIHIKMOOOOOOONMIBwxwwyACCCBBEAyzAzAEEAABBBBEIKKMNMMKIFKMNOPPPONOPQRRQRRRRRQQQQPONKIIKMKKIHIEEBBByywtpoiiiffc9553|</~),-*%@+++@#%&=;>'>,)))~/<<<||33555999ccfffiiiffffgfggkkmmqptwyDBEHIIIIIIIIIKKKKIKMNMMKKKLKKKMMNPPOMKHEIIIEEGJHHHHICCzwwvvrrrppwyzzCGHKK",
+"MNONKIHJEHIMONNOONNMKEAAxxwzACBCBBAzzAzBEEBAABEHIKMMMMMMKKKKMNOOOOMNOPQQQQQQQQQQQQQPPOMKIKMMKIIIHEBAAAyttpoiiifc9953|<</~),>-%#++@#$%**;>'',){~~//<|||33355999ccfffffccfccccggkkmoqqutwyABBEEHHIHHHIIIKKKKMMKKKKKKKMMMMNOPONMIHIIHBCBEIJIIIECzxwvqrrrrrssxzzGGEI",
+"KMMMIIHEEEHKKNNNNNNNKHEAzwxwyCBCBBAAyABBEECAAAEIKNMMMMKIMMMMNNNOOMMNOPQQQQQQQPQPPQQPPONMKKMMMKKKIEBAAywttpoiiifc995|<</~),>*%$@+@#$%%*->''){~{///<<||||3555999cfcccccccccccgggimmpquutuwyABBEHHIIIIIIKMKMMMMMKKIHIKKMMMNOPPOOMKKIHDzABEEIIIHGCyvvqrrrrrsssvzBCCE",
+"EHIIIIHEEHHEHKNNNNNNKIEEAAwwwyACBCBBzCCGEBzACAEINONNNMIIKMNNNNOONKMOOPPQQQPPPPPPPPPPPOONMMNNNMMKIEAyywwtppoiiffc9953|<~),>*%$#+.+@#$%*>>)!~{/(/(<<|||3355599ccfccccc9cccccgggkkmmqqqqutuwyBEEHIKKKKKKMMMNNNNNMKKIIIKMMMNOPPOOONNKIDzzzACEIHHHEAAussrrrrssstzBAzC",
+"CHHGCEHHHHEEEEIMNNNNMKIEBBzwwwyABCBBBCEHHBzzCEEIMOONNMIHKMNNNOOOMMNOOPQQPPPOPOOPPPPPPOOONMNNNNMKIEAywwwtppoliffc953||/~),-*%$#+..+##$&*>,){~//<__|||335559ccfccccccccfcccfggilmoomqquuxwyAEHIKKMMMMMMMMMNNNONNMMMKKMNNNOOPPOOOOOOMEBAzAzBHEEGEEBwtsummmmssswCAvz",
+"CEECCBEEBBBEEEEHKNNNNMKIEBBAwwwyAACBEEHIIEAAAEHINOOOOMIFIMNNNOOONNOPPPPPOOOOOPOOPPPPPPOONNNNNMMKIHBywwwttpoliifc953|</~)>-*%$#@++@#$%&*>>,!)]~(((<|2335999ccfffffffffffffkilooooppptwxzACEEHIKMMMNNNNNNMMNNONNNNNMMNNOOOPPPPOOOOONIEABAABGEEEEEBwwummqqmmmtwwzvz",
+"ABBAzCABBAABBBBBEINNNNMKIHEEAwxwxzzzBEHIKHBBBEKMNOOOOMIIIMNNNOPOOOOOOPOONNOOOPOOPPPPOPOOOONMMMMKIHEAywwwwtpliffc933|</~,>-*%$#@++#%%=*=>>,!~{](/__<|335999cccfccffffffffiiloloppptwzAABEEEEEHIKKMNNNNNMMMMNNNNNMNMMMNNNOPQQPPPPOOOMHEBEEEHGCCEBzxxwuuuqqmmqwwtwv",
+"AAAzwwyABAAAABBBBEIMNNNMMKIEEAxwwwzzyBGHIHEEAEIMNOOOONKIKMNNOOPOOOONNNNNNNNNOPPPPPPPOOOOOONNMKMKIEEAywwwwwtplic9553|</),>-*%$@+.+@$%**->,'!!~]/<__135999ccccccccfccfccdfiilllopptwyAAAABEEEEHIKMMNNNNMMMKMMMMMKKKKMMNNNOPPQPPPPOOONKIHHHHHGCCBAwttquuuuqmmqquspv",
+"wwusuwyAABAAAAAAAAEIMNNNMMMKIEAzxwzzyyAEHEEEAzEKNOOOONMKKMMNOPONNOOMKKKMMMMNNOPPPPPOOOPOOONNMKKKIEEAywwtwwtpoifc993|</~),>*$#+. .+@$&%=->,,']/<<<1|5cfffccccffffffffcdfiililoptwwyyAAAAAEEEHHIKMMNMMMMKIIKIIIIIHHHIKMMMNOPPPPPPPPOONMKHIIKIECBBwtuqquuuuqqqqqssu",
+"wwssstwyABBAAAAAABBEIMNNNNNMKIEAAyzAyyAEEEEECABHMNOOONMMMMMNOPONNONKIKKIKMMONOPPPPPOOOPOOONNMKMKIHEBAwtpttpoliffcc93|</~,-*$#+.  .+#$%&->,')]]_1||79filiffffiiiiiiiiiiilllopttwwwyyyyyAEEEEEEEIKKMMKKKKIIHHHHHEEEEEHIKKKNOPOOPPOPPOONNKKKMKIHEEwtumqquuuuuuuqtsw",
+"wwtssttwyAAAAAAAABBBEIMNNNNMMKHByzyAAAAEEEBBAACHKMNNNMMMNMMNOPOMNNMKIIKFKMNOOOPPPPOOOOOOOOONNMMMIHEBAwtpppplifcc99953|</~,-%$@.  .+##&%*;>,')]_<1359dfifcfiilllliiiiiilloopwwwwwwwwyyAABBAAAABEIIKKKKKIIIHEHHGEBBACBEHEEIMNMNOOOOOOOOONNMNMKIHEAwtmqquuuutxxqmtw",
+"uqmmmmstwyyyyABAAAAABEIMNNNMMKKHEywwwyyAABBBBBBHKMNNMKKNNMMOOOONNMKIKKKKMNOPPPPPPPPOOOOOOOONNNMMMIEAAwtpppplfc99553333|</~,>*$@...+#$&%*;>,')]_<|359900009dfiiiiiiiiiilooptwwwwwwwwwwyywwxxxzzAEEIKKKKIIIIHIIHEBAAzzCABEHKMKIKNNOOOOOOOOOONMKIIByuquuuomnpzyuqqu",
+"uqmmmmmmswwtwwAAAAAABEHKMNNNMKKKIEAwwyABAyyABEHIKMMMKKKMONNOOOONNMIJIKMMMNOPQQQPPQPPPONOOOOONNMMKIEAywtpppolif955||<<<</~~),>*%#@@#$%&**-''')~(<}357527755799ccffffilloppttttwwttppttwtttutxxxABEEIIKIIIIIIKKIEEBAAAyAABHKMIHIIKMNNNOOOOPPONMKKEEzyyAtrnnrtzxuuu",
+"uqmmmmmmmsttuuwAAAAABEHHIKNNMMKKKIEAAABEBAyAEHIKMMKKKKKMNOOPOOOONKIIKMMNNNOPQQQQQPQPPOONNOOONNMMKIHAAwwpppplifc95||<</~),,>-*%$##$%*;>>,,))!~](<|35772447777709cccfiiopptptttttptppppuwwwwwxwyyAEEEHHHIIHHIKKKHEEEEAABBBHMNMIIIIKMMMNOOOPPPPOMMIHEEGEytnlopxxuux",
+"xqmmmmmmmssssstyAAABBEHHHIMNNMKIHHHEBABEEAAAEIKNMMMKKKMMMOPPOOOONKIIKMMNNNNOPQRQQQQPPOOMMNNONNNMKKIEAwwttppoifc953|</~),>-*%$#@++#%*>,,~~~~///<|2552243277777090ccgiloppopttttppppppptwyywwwwxxADBFFHHIIIHHIKKIEEEEABEEEHMONMKKIIKKKKNNNOPPPPOOMKEEHHEwprptxuuxz",
+"xuqmmmmmmsssssswyABBABEHIIKNNNMKHEEEAwwAAywwAEMNONMKIKMNMNPQPOOPOKIIKMMMNMNOOPQQQQPPPONMKKMMONNNMMIHBywwttpolic953|</~),>-%$#+. .+@$=-,)~//<<11555575a7657509099cgfiooolopppppoloppptttwxttuuuuyAEEEEEHHHEEHIIIHEEEBEEEEHIMNMMKKKKIIIKKKNOPPPOOONIHEEEAtpptpuuxy",
+"suuqqmmmmpspssutwABEBAAEHIKMNNNMIEACAwwwwwwwyBINOONKIKMNNNOPPOOONMIIIIIKMMNNNOPQQQPPPONMMKKMNNNNMMKIEAywttpplic953|</~),>*%$#+.  .@#$*->,!~]<149999909a888999ddcffilollloppooooopptttppprqpuuuuwDEFEEEEEEEGHIKIIIHHEHIIIIIMMMMMKKMKIIKKIKNPPPOOOOMKHEEBwtttppppt",
+"pnuuqqmmmrssusttyABEEBAABHIKMNNNMHEEEBywwtttwAEMOOOKIIKMNOOPPPPONMKKIIHIMMNNOOPQQQPPOONMKKIKMNNNNMMKHEAwttppoif953|<//),>-%$#+.  .@#$%-->,)~/<|56596999cdccffggiilooliloppooloptttutpollqrqruquwAEBBDBDDABEIKMMKKKKIKKMMKMNNNMNNMMMKKKKMKMNOOOOOONNMIHAwwwwtpppp",
+"njnquuqmmsssupuwBCEEHHHAABHIKNNNMKIHHHEAwtuttwBINNMIIIIMNOOOPPPOMMMMIHGHIMNOOOPPPPPPOONMKIIIKMNNNMMKIEBywppooifc53|<//),>-%$#+.  +@#$%-;;'!](_||322565599gfffiiloppolllppplooptwwtpollllprprqquwABAAADDAABEIMNNNMMMKKMMNMNOONNNNNNNMKMMNNMOONMNNONOONMEwtwwwtppp",
+"njhqqquqqssspuwACBBBEEHEAAEHKKNMMMKIIIIEypopptyEKKIEEHIINOOOOOPONMMMIGEEHKMOOOOOPPPPOONKKKIHIKNNNNMKKHEAwtpollic953<</~,>*%$#+. .+@#$*=;>,!](_<}}|346769099cfiiooppoilpttppoptwwtpplllooprrmqquyBADyDxxyAAEIMNNNNMMMKKMMKMNOONNNNNNMMMOOOOPPOMIIIMNONNKAwwwwuppp",
+"nhjjmqquwttpsvwzABAwwyABAABEIKMMMMKIHEHEBwtptwAEEEHEEEHIMNOONNPPNMMKIGCCEFKMNNOOOPPOONNMKKIIHKMNNMMKKIEAwtpollif993|</~)>-%$#@...+@#%=-;',](_<|:|||776599989fiilooliiotwtttptwwttpooooollqrqquuABADxtuxxzAEIMNNNNMKKKMMMIIMNNNNNNNNMNNNOOPPQPOKIEHKNNNMIEBwutwtq",
+"pjhemmqqwwwuvxwtwywtutxAAAABHKMKMMKKHEAABywptwAEHEEHHIIIKNOONNOONMKIHGCCBHIKKMNOOOOOOONMKKKIIIMNNNMMKKEAywpollifc953</~),-*%#@+..+@#&=;>,)](_<1:}|4114700099filoolffiotttppttttppoopooolnqqvvuxABDxuuuxxxzGKMNNMNNMMKMMMHHKMKIIKKKMMKNNOOPQQQPNKGEEIKMMKKIBxuwxu",
+"qnjhmmmqwwwwypsuwywtpqtwyAAAEIKKKMMMKEAAAtpptwAEEEEEIKMKMNOONNOONMKHEECCBGHIIKNNOOOOOONMMKKKIIKMNNMMMKHEAwtplliifc93|</~,>-%$#+..+@$&--')]((<<_1}|114770799cfilolfffiopttpppopoooopoolmllrvrruxEBzuxuutwwxBIMNMMMNNNMMMKEHKKKHEEHHIIIMNNOOPQQQOMHEEHHHIIKMKBywxx",
+"uppnqqmmtwwwxtsmquuqmmmmwyyyAEIKKKMMMIEBxqoputyBBAABEKMMNOPONOPOONKIEEEBCGHHIIKMNNNOOOMMMKKKKKKMNNMMMKKEAywpoliifc953</~),-*$#+..+#&%;;,]((<<:<||1114770770fioollffgkpppqppooigllooolikilrprruxEBwuxvstwwxzEKNNMKMMMNKIIEHKMKIHEHHHHEHKMNOPQQQPOKHHEEBAAHKMKGCAx",
+"utttxuquttxwqqqmquqqmmmmmwywwyEIMKMMMKIHAqmmuuAAAwxwAEIKNPPPOOPPONMIEGGECBHFFIIMNNNNNNMMKMKMMKKKNNNMMMKIEAytpliiifc93|/~),>*$#+..@#&=;>,]((_::<|_114470770dflooiifcgmppppqpoiigglmolikjiimmnruwAAxussvvupptyHMNNMKKKKIIHHEIMMKIIIIHEABIKMOOPQPPONKEEEAtuwEIKKKHA",
+"AwwyAAxwwuqqquuqlnnjmhmmmqwwwwyAIMMMMMKKEumlptABywttyAAHMOPPOOPPONKIJECCCEHIIIKKKKMMMMMMMMKKKMKKMONNMMKIHBywpoiiffc953|/),>*%#@.+@#&=->){((___<|__14770070cilpliggdflpppppplggggkoolikikjnmmqqwAAxsstunqqpptyEKNMMKIIIHEEEIMNMKIIIIEAAEIMOPPPPOOOMIHEAumotAEKMMH",
+"HBAABAzAyqqqqnorooonjemmmqqwwwwuAIMMMMNMKApopwBEAwtttyyBINPOOOPPOMIIHGECCEGIIIKIKKKMMKMMMMKKKKKMMNONNMMKHEAytpoiffc953|<~),-%$@++#&&->'!{(((___|__1477770dgimoliiddglloppoigggggkkolikjkkmmnqqtwyzutvoonoppttyEIIKKKIIEEEBEKNMKKKKKIEABIMOPPPOOONMKKKHwolootAIMM",
+"KHEBCAyxuuunnlmmmmmkifjjqqpwywwquCIMKMNNMHytpwBIHAtttwyAEMOONNNONKHHHJGBBGEIIKIIIIIIIIMNNMMKKKMMMNOONMMKIHBAwpoiifc955|</),>*$#++#&*->!{{(((__<_[_1}23246dklopmliddfiilllifc9agkkiollillknqpuuuwxxwunnoookkmqwABBAEHHIHIHHEIMMMKKIIIHEEIKOOPOOONNMKMMKEwpojipyIK",
+"IIIHEAzxxrookkmmqqqmkgjjjqquAyywqwBIKMNONMHAwtBKMHytuwyyEINNKKMMMIJEEEGBCEHHHIIIIIIIIIKMNNNMMMNNNNOONNMMIHEAytplifc995|</),>*&#++#%*>'!{{((::___[_1}34226bkmppoliddciiigifc9a8akmkkollllmprsuuuuxwzxrnnkkkkmmqtwywwyyEHHIIHKMMMMKIHHEEEIKMOOOOONMMMKMMKAwpiiipyG",
+"zEIMICztppmkkfjiloppmkkjjquwAAAyuuyEHMNOONMIBAEMNKBttttwyHKKIKMMKJHEBEEECCEHHHHIIHHIIIKMNNNMNMOOOOOOONNMKIEBywpoifc9953|/~)>-%#+@#%-''{{({](<:<__:<}3222adjouuqligd9fiddddd9aaakmkglolmomrqpuuuuuuyttqkkmmmmmmtwuqtutuAAEEEKMNMMKIHIHEEEIKKNOOONNMMMMMKIEApfhlpx",
+"uyEMMJAwqqmjeecbcfopomkgjnwwwAAAuutABHMNOONKIHIMNNHwppptwEIIEHMMIHHEBCBCEEEEHEHIIHHHIIIKMNMMMNOOPOPOOONNKIEEAwtolicc953|<~),;*$@@$=;,){(~/]<:<:___:}422269iotwtmig9acgddgdd0788cmkgloooomqqqqsuvuswtwtmmmmkjmmuwuqmmppuwwyABIMMMMKIIHEEEIEIMNONNMMMNMMMKIIAoooop",
+"mpwHIKHzuomiec9abbfiolkggluuuwyAAtuuyAHMOONMKKKKMMHypqptwEIEEEMNIEBEEAABEGEBEHHIHHHHIIIIIKMMMNNOPPPPOOONMIHEBywpolfc955|</),-*$@#&=>,!~(](/(:<::__<}211179iotxwpmg9a0ggggfd07a8cmkggoooooqrmqquurrtpwtuqmmmmhjuwwuqmmmutuwwxCIKKKKIIEEEEEEIIMKKKIKKMNNMKKKIAttpm",
+"mmpwBHIEApmkifba88beinikglnqquwyAwuuutyEMNNNKKKMMMIBtomqtEIEEEMMIEABEBzAEHEBBHHIIHHIIFIHHIKMMMNOPPPPPOOOMKHEEBytpolfc953|<~)>;&##%->))~(]//<</<(::}|111147fmtyywqkc90dgfgd0077ackkgglopppqqrqquuqvnrtqpupqijloptwwuqqqqwwwwyzEEEJHHHHBBEEBHKKIHHEBEKNNNMMMKIEBwu",
+"tmpmuACHEwpmlgcaaa89fiokkkoqqqwyABwuqptzHMNNKKMNNNKHypmmtAIEEEKIECAABBAABHHEBEIFHIIIKIIFFHKMMMMMOPPPOPOOMKHEEBAwtplifc995|<~,>*%%*;,){/]/</_<<<(_:}1|11147dltwzAwnfd0dggca00009dfmkhnlppppurquuussopqmmquppppptyAwtxuuuuuAAAAEEBCBBEEEBBAABIIHEBAAAEKNNMMMMMKMHA",
+"BwqmoptAEEyolifca668ciilmmonqqwyAAyxuoptzIKMMMMNONMKBwqotAIEEEHEEEBABBBADEIHEEIIIIIKKKKIIIKKMMKKMNOOOOPONKHEBBAwtpoifc9953|<~)>**;,)~((/::<<<<<_::11211147dipwAAztlgdddccca0008aemkklooputxussuuuuorpkmmqoppptwyAyttpuuuxxxxCEEEBBAABBBAAwAEHEywwwyAEKMMMMMMMNMI",
+"KGzpooptAEBwpiif9a6aceiinqpnuuxAAAByxtopxEIKMMMNOONMIAwqtyHHEBEEEEEBABEEEHIIHEHKKIIKKMKKIIKKKMKKKMNNOOOOOMIEEAywwtoigc9953|</),--,)~/_|<||||1__<}|2|4411470gmtyCBypkgbdfgfdd008bbmmkkonpptywwttusuvookkmmlnoopptwwprolluutuuzEHEEEAzAwtwwwwBHEypppptwBHIIMKKMNNN",
+"NKEwpoolpyEEyplifd866fiioqqpxzAEEEByxwppuAEIMNNNOOONKHAttyHHHBEEEEEByAAEHHIKIHHIIIIKKKKKFIIKKMKKKKKMNOOPONKIEAyywtplid995||/~)>-;>)~/(_||||1||__}|14434}470dkpyzEAzulfhffffgdddabmmmkkorppwyyxwuustprmmmmiikillmptplnjinqqqquAEEBEAwwwptttwAIHAtlilptwyAEIKKMNOO",
+"NMIBwpiiiowEEAtliff98biilotwwAEIKIHEAywptyBEKNNNOOOOMKEywAIKIEHEEEEAAyAEEIIKKKIIIIIIFFKIIHIIIKMMKKKKMNOOPOMKEEyywtpoifc0531</!'**-,)~/_<|}|||<__:<|2442}}470dlpwABAAtoifcffggdhbbkmmmkgoopuxyzywwuuppummmeefefgkopmkijhijijquyBAAywttuuuppowHIAwpliloppptBEIIMNO",
+"NMKIBtoifipyEEApliifeciijotwAEHIKKKIBAytwyBEIMNOOOOONNKHBEKKIEHIHHBAAyAAEHKKKMKIIHIHHIFIHHHHFIKMMLIKKMNOOOOMIHByywtplif9771<({'==-,!~/__|||___(__:_1442}}2770diqtyAzytplffcgggifkkmmmkklmoptwyAAAyxtttmmkkehbhgkmpplkgheehjjnpwwwwwqquppollpAEBytoliloliitABBIMN",
+"MMKIEAtoffipyEEypliiifiiilpwBIKKKKKKIECwwAEEHKNOOOONNNNKEHKMKEIIHEEBAyyAAEHIIKMIHEEEHIIFFHHHIIKMMKKIKMNOOOONKIHByytpolic054|(~';=>,!~/<_|}|___<_<:_<1422}}2770cilpuxwwwtplifggikmmmmomkoloouuwAABAAAwtmkkkbbbcdgmtplggddeijjnpwwvttqmoollllltABAwpoiillfflttyBIK",
+"IKKIEAwpicccmwBBxpllliillootBIMMKKKKHHEAyABEEHKOPPONNNNNIIKMMHEHHEEBAywwyAEIIIKKHFEFFEIIFHIIKKMNNMKIKMNNOOOOMKIHBAwtpolid571_/';=;,)~/_<|}|<1<<__((<14222227770bhkmoptttupolkgjimmqqqqmkllmmppwAABBBwupkkkbbbbdglpumgddddgkknpxzwwwqlolnlifipyAAAwpolllifioopyBH",
+"BHHHEEAtof57dipyypoiiillllotzHMNKKKKKKEEABBBEEINPPPONONNMIKMKEBEEBBAwwtttwAHIIKKHBBEEEFIIIIIMMOONMMKIKMNOOOONMKHHBAytpoifc96}_!;=;,~/<<||||11<|__::_1}222227777abdgekloptttpqmlimmqpqqqknnnorppwyAABwtpkkkkbbb0glppmgdddggmmmuwAAywtolnllecclwAAAywpoopoiiiiltyA",
+"twBEEEByti0730gmutpiiiillilotCKMKIIIKIIEEBBAABEKOPPONMNNMIKKEEDAABAywttpptyEIIIKHEABAFGHIIIKKNOONNNMKKKMNOOOONMIHBAAytpoif952_!-;'!~/<<|||21|1|__:___}}22227777880888bfioopputpoqmmmpqqmomnnrppuwyAzAtpmkgkhcb0dkoqmgdddgkmmmqtAAyywooooif98fotyywwtpopplifcioww",
+"optyBEBAxqf5347dltwoiiiiliifowEKKHEAEEHHEEAyyAAHMOPONKKIIIIIEBAAyABAwtuuqutAIIIKIHBAzACFHIIKKNNOOOOONKKMOOPOOONMIHBAywtpoif97:);;')~/<|1||3114|<1:[_[1}12267000a0aaa66aadfloqutttppommmmprnoopqpwxwyywtpkkkfehddkmqmggggkkkkkmqtwwwpolollic89ilotwwwtqptpoiccipp",
+"oilpwABAAuld3||7dlutoiiiififioyEIJAwwABEHEBywwwAINOPNIEHHHIIEAyAyABAwqprpptyEIIIIHECzAABEGHIKMNNOOOOOONNOPPPPOONKIHBAywttlif5}{';'~/<1|1453442|11::___:[}227000bdaaaaaa6a8cfkmutwxtuqmmmqprnnopptwxxzzwtmmmmheedgmpmkbcfffbbbeipttopllillif99fcipyywtpopmpof9flp",
+"liilptAAAyuid7|47dmwtoiifffbilwAEEAtppxAEEEAwpwAHKOOOMHCBEIIIBAwwAEEwqmprptwEHHHJHHBzzzzABEEIKNOOOOOPPPONOOOOOONMKIEEAywtpol92[,'!~<<|347555333311:___1:[}47770008a6aaa66a0adglowwyxuupmpppronpppwxxwywwtmmqjjedgmoojeeehbbbbhfoooooljfiiifccddcowywpilommplccil",
+"iifilptyAAytmf0770itzwpliiifcipwBEypolqtwBHEwppyEKNOONKBABHIIEyywxAEwumpqqtwAEHHEHHECzzzzzCCGKNOONNOPPQPONOOOOOONMKIEEAywtpof7}!!~(||355055957|211}}__1}[}447787066aaaa8668a0degmuwwxwwuttppqrqppwwwxxywwqqpllidgkmpjffhfb9bhbfiopooofccffcb50ccitAypiglllppiffi",
+"fifiioqtyAAzwpmd77dmwAwmgiiiffotAAwtoiilpyEIBtotAIMOONMHyABEHHAtwwyBytqppruwAEHHHHHHECzzzzzCCGKNONNNNOOOONONOOOONNMKHEBAAwtpi93:~/1435990999577314}}1111}44247a76222666a6868ddbkkmquuwwwywttpprrqxxxzxwtwpqqqonggkmqljfeea8bbb8elponifccccc770dcfpywoffiiklpolii",
+"iffiiimptwAAAyulc0dkuAAwoimoilotwwtplifcipAEIAtpyHKNOONKBwyzEEBxwwwAxwutrpptyEHIIHHHHECCACzCCBHMNNNMKKKMNOONOOONONNMKIEBAywplc|:~<|7599cddcc099544}22114244477776}22226a66a8ddekkkkmmquwAzywwupqqwwxzyxttwuutlliggmqoiiheb8ba88clpoolibcccc5750dfltwofdfifimpppl",
+"iccfffgouwABEEBwpifipwAAwpppqppwyytpplffeioyHIAttBIMNONNIywAAEAzxtuwwwuwsrpuwBEIIHEEEEGBCCCAABEIMNNMIIHHIKNNNOOONNNMKKHEBywpid3]]<|5559ccdfcc9a90772244444477776622222226268ddekkkkkkmmqwAAAywttpwwxzzzytwquuojigkmooljieb8a888ciopoli999cc95|399fowpf9cfdglotwt",
+"ofcfiiiotAAEEHHEApliipwAAyttttpwAytpppliccipAIIytyHMNOONMEwyAEBAwwwzwxuytprptyBEHIEEEEEEBAAzAABHKMNKHHHEEGIMNNONNMNMMKKIEBypli5::|35099dfdgbc0d9975224477777787a2222[}22622a00bkkkkkkkmmtwyAAAywtwwvxzzzwuwqtuljkkmmoliifb678889fopliic88c097||59clwwofcfccilqww",
+"wlfiopootyAABEHHEwpiiiowAAytututyytolopoiiiltHKHzwEKNOOONKAwAEEAyyAzwtuwwtrrpwABEEEEEEHEBAzAzABEEMOMIEEEBGGKMNONNMKKKKIHHEAwpic4}6599ccfffgfc0dd9706657777777776222}1}16666800bkkkkkkkmmpputAAAAyAwwxzzyytuquuoojkmmooiihc666888elpllic9999951|45clwywpif99cgipw",
+"BypopppoptwyyAEEEAtmifglwAAtpqptwAwlcfiooifflwIIEABKNOOOONIAABEEwyyAwuuwywpppswzAEEEBEEHEAzyzzAAEKNNKEFEBCCIKMNNNMMKKKHHEEAtoib5|609cgiiiliiecdd0000675777708066266}2226a66800bkkkkkkkmmqpuqwwAAABAzzxywyttqquppoklmqoljheaa68aabjplllic99055|||5fotyAwoi9599glw",
+"EEypoppplotwwyAEEAwplf99itzypompwAwofcfqoliffoAIIEAHNOOOPOMHABHHBvxwuuutxwtppptwwAEEEBEHECyyvwwzBHMMMIEECCCHIKMMNNMMKIIIHBAwpi81_}599fgiklliifgd9c006665500cb0aa6a4242228aa8dehkkkkkkkkprqrsstwyACBAAzzvxxttquxppmmoppojifb666aabfolloic99575|1|5iptyAtoic509clw",
+"AEAwpoppootwAAABEBAyulf99iwzwpllpyAtf9ioolkdfipAEByBKOOPPPOMHBHKHytwtuquttwtqqtwwyAEEBBEHEAytwwyAEIIKIEECCGIIKMMMMMMMMIIHEAwpj82_|290cggiiiiifdcdc90d0899bcfdgc9807a666a8a8bghemkkkkkkkrrrqpuuutwBEEEEAzvxtwquxttpmppppniee866a88elllllf997553115iptwAtliiccfilp",
+"pyAAtooppopyEEEEBEBAwpf979iuxulgipyti9ciolffcdipABAwENOOPPONMIHKKBwppuqqutuqmmpswwyBBEBEEHEwxwwwyzABHHEEEEHKMNNMMMMMKKKIEEAwpj9}}478dcggfiiiifdchd00d09cdfffggeff9b99999fccfhjmmmmmmkkkprrrpruptyAAGEHEzxwttquutttqqttpojfeb668a8ciillif885553335fpwABApoooliigi",
+"otwwwpoppptAHIEBAAAzwpg5413guuogditwlc9cillfc0cipyAyAINOOPOONKIKKIAtppopttupqmmqqwyABDBBEHEzxxwyuxzAAEEEHHIKNOONMMMMKKIIHHBwpj8}[458ccfgiiiliifhfffdggcfffiigffffcc9dcccffhimnqqmmmmmmprqrrrrrqqwvzCGIIECzwttquupttttxwplfehb6a88bfllliic885557339lwABEAwwtoic9f",
+"loppxwtpptwyEHEyxwwwwpk0|<_4gqpicfpwticcktttld9dltAAAEKNOOOONMKIKIEwttppppptqmmmquuyABABEEEByxxzuxyzzAABHHIIMNONNNNNMKKKHHBwulb}[659cffiiilllikiiiigkkfffiiigc9cc8956aa9bfgimouuqqqqmmpprpprrrrrxxzzBIKHGAzttqqupptuwwwtnifhbb6a8aclloiic9959994}6ftwAEIHAticccf",
+"filotAAtpwwwAEEAwwpppqmd4_/<9kqofcmyApifoAAAwof9iqwBAAHMOOOONMKIHKHAwuttttttpolmquuuwABAABEEAywsuxxyxwAAFEGHKMNNNOONNMKKKIEAtqc6}6addfgiillolllmlilikikffffdd96622|2327689ahknqquuuuqttutrrrrprtvwxzAEIHHEAttuqquppuxAzypjfhbbb888bioollfc909954[3cpwAHKHyof9ccc",
+"ciiopyAAwtttwBEEAwpoomif5|<_49mqkfiwytiipAAAAtlfcfpwBABKNOOONMKIHIIBwwwtutwwwtooouttuxBBABEEEAuuuuxzxuyyyCBGKKMNNOOONNMKIIEAtqh6669ddfiilmmpooollilffffg9bc0d056}}:}[}2}a68dhhmnmqpswwwwtttuprrvvxxAEDEEGGEBwtmqqopstABCyoifbbbb88bfllollfcfd95333cpAEIHBtlfccc9",
+"9clpptAEAwttyEEEAwpmkmmg93<<<|9mmgfmwwoiotwttwplccfqyAyBKNOOONKHHHIHAwtpttwyywttppttuxAEEEEEEExxxxxzzxywwAzCEIKMNNNNNNMKIIHEzrk86abfiikllmpqppomlmiigffgf9906622}}[[::[}66addbkmmmmtttxvwwwttuwvvxxzBFEEBCEEAwqmqqnotyEIEwmhbbbb888cipopoiff995756cpEHEytpliif95",
+"5cloptyEHyttyBEywpoomlmld7|_((|dolcfqupllliilptpicfipyyyEMOOONKIEEHIEwtppptwwwwwwyywwyzEEEEEHBAzxxxzzyxywAAzCHIMMNMNNMMKKIHEzxk86bhilllomppppppmllilgggig997a222}}}_[[:[22adbbkkkkrrquttwwwwvyxvxxyDBEFEBzCEAAwqqqooptBIICtlgbbaba8biooptofcb90799ftEEypopplifc5",
+"69iotwwEIEwtwyAtpooomopplc51_(/3goicippliiiflpttpfciowAyAIMOOOMIBABIIBwoilpttttyAEEBAACEIHHEHBBAxwyzzAyAyAzzCFIKMMKMMMMMMMIHBxnd8bjilooopppppppmloiifgkkica76222}}2}}[[[2280bkkkrrqrrrrpttwwzzzyzxzDDEFEEzzAEBAuqqqoppxEKHymkggbdb88fltttof990900flwBAtiiopoifc5",
+"59fopwwAHKBwtwwplmllmoptpod7|</|9kmggoolllllpwwwtoiflpAAyEKNOONKEyyEIIApiiipppwABIKIIEHIIIHEHEEAzxwwyAADAAzCCEHLKMIKKKKMKKKHBAqedhinommppqppprrmloiigggkkf00a222}}22}}[22280bkkppprrrrvqrqvxzAACzAEEFEEFDzzzAAByuqqnprtAHIBtmgggbbb8cltwtpiccc90cipwywpfcippifc9",
+"999iptwwBKIBywytoiikikotttpg93147gmmklmklppopwwwwplfipwBBBKMOOONIywyEIHwlfflptwyBHKMMMMMMMKIIGGEAxuxxzzEBBCCCEHKLKIIKKKKKKKHEAqmeklopopppqtppprmmoiiiggike006222}}}}[[[22280bkhrprppqvvvtvwvwwzzCEFHHHEDDzzwzwAByxuqoptwEIHzqkgggbhhbjtwtoieccc9ipttppof9copifd9",
+"c95clpppwBEHEEEBwooliilptttpi000ddkoomikottpptwwwtoiiowBEEHKNOOOKBwtyEHAoffipwyyABEIIKMNNNONKIIHCAxxxwyBBACCzEFHKIHIIKIKKKKFGCwmenmpupptttutpprommokiggggc006222[}[:[[:22800bkrrrrrprtuvvvvvxvzzBHIHILHFBzxzzyxAAAxuqoptAHIExqkgggbejiptpoliccdflttpllic99lpoifc",
+"f969ffiilpyEHHHEEyttpopttuttpiddkkkqpqoilptttpopttpiiowEEHEIMOOONIAwtyBBtlffltywtttwAEIKNOPOMMKKIEzxxxxxABECCFFJLHHHIKKKKKKKHBwsmnmuttttuuuutppomoollgggg800a222[[[[[[[2260bbkrqrrrrvvvwxvvsvxxzDEHIMMKHFDyzwytxAAAxuuptwBIIEwpggggfjilppoolfdfiottofccc99ipplff",
+"ic579cfcfiotABAABAywtwtwwxywuuoilpmmquupoqtttlfcippllpwBEHEEKNOOOMHyttyBypieipwwtoolpwCHINOPNMMMMKEzzwxwAAEEGFHHKHHHIKKKKKMMICzssqquwwwtuxxwtsppqqrmllggg807a222:[[[[}222a0bkkrrrrrttvvvvsvxxxyADEHIMMMIHDzxvwxuwxAzzxupwAHIHAtnggkmlefllppoifiotwtoc99955clppii",
+"if929d9c99gipttptwwttttpwyyAzyxppupmquxtpptwwpf99fopptwyBEEBEKNOOOMEwttyAwpliotwpoiiitABEKOPOMMMMMIEEBAxDAEEHIKKKIIIIKKKKKKMKHCvsquuxyyyxxxxtwtpqqrlmjggg8006222[[[}}}2268dbkkrrrrvvvvvwvvxxxxzDFEHKKMMKIFCxxxwttwxzzyxtxyBIIEypnjkmlebciopplilpwwtof965335fppli",
+"ff950cd9599fiopolottppoiltxzAAzywxwuquxxtpuwwwoc99itwwwtyEEBAEKNOOOKAtptwAytpptwtlliiptwyBKNNMKKKMMIHHEBEBHHIKMMKKKKKKKMMKKLKFCzvwuzyzAyzxzzxwssqrqjjjgggbb06222}}}}}26680dbkkqrpvvwvvvxxxxxxzDFFHLLLLKKIIHzzxxsutqxAzyxxyBHKKBtonmmlcc9flpppppttpolf9555439lplf",
+"9c9999c0735cfkloilpptplffipwzzAzyyywttxAwttwywtlfcityywttAEEyyBKNPONHwpopwAAwttwpliiioppuwEKMKIIKKMMIHHEHEHHIKMNNMMMMMMMMMMNLKFzvzzzCzCBAyAzAywuuqqjlngggab066222[[[[22280bbkrrrvvvvvzxxxxxzzDDFHLLKNMLKIIHBzxwxstuuxzzyxxzCIKIBtrmmibb8cippttpppoili95553|5folc",
+"999550d0||2559ciiilptpplfcitxyyxwywyyyzBCAwyAywtolowAAywtyEEAtwEMOPOMEtoopwAywwtollinllopwAINKIIIKMMKIHHIHIIIKMNNNNNNMMMNNOONMFFzACBCCCCEBAACAvtqrqmnngggbb06a2222[}222280bkkrrvvvvvxxxxvzAzDDFHHLLMNMLKIFHECzwvsttwuxzAzxzAEIKHBtqmibc68foottpppliiic99993|9lof",
+"fc963595}:(<437giilotwtpmccmtwxwwyyAAAACIIEABBAwtpwABBAAAAEEEtotHNOPOMBtoopwAAwwpooliiilmtAIMNKKKKMMKIEEIIHIIKMNOONNNNNNOOOOONKFFCCBEGEGHECBCAwtuvrnmlnggga00622226666a8ddhkkrvvvvvwxxvzzzADDFFHLLMNNNLLHFFFCCzwwsttwuxzAzzAEIKKJApmhbc68cioptppoifiiic999539ipl",
+"oic65552}_~/137flpptwAywpiccotttwwwyywtyCGEAAEEBytyAEEEEEEEHHAolwINOONKwpoopwABAwtpliihilpBKMNNKIIIIIHEBBHEHHIMNNONNNNNNOOPPPOLIFGGEGHHHHHEEGADwuvvnnnmgggb00a866688888bgghmpuvwxvvxxxzzzCDDFFHLLLLNNNKLHHFFBCzAtssstuwxAAAACIKKKEymhbb889flppppoicfilic9cc9cipp",
+"wpf973}32<<<39cflppptttpoi95cmputppppplpxBCywyBBytwBEHIKKKIIIHwllwINOONIwpoptwyBBwtoiceenpAHMNOMHEABEEAzxAAEBGHKNNNNMMNMOOPPOONLIFEIIIIIIIIGGDDxxsvnonnkkkbeddc9bbcbbchekjqqttzzyzyzzzzADDEFEHLLLNNONNMLKHFFzzAAwusmmmquABBEEKKMMHAqjbb9889iptpppiccioplifffilpt",
+"wtlc9525553355999fiiiiiiif9539loplllolffotAwpotwtllwBEIMNNMMMKEploAKNOOMHwpppptwyywtlf8eeoxEKMNMHAzAEEAxuyyzACEIKMMMMMMMNOOPPOOLLIIJLKKIKILHHDDxxturprrkknmhggfiffchcffkkjqqwzAzAACCBCBFFFFFHHLKMNNONNMLLHDzzyzwwwqmmmmquABBEHMNNKEwocb8987cotppplfcfotwtooollot",
+"wywoifcc995|<||<<|7555559553||0klliikkc7cmtxtliii99fpAEKMNNNNNMEppwHKNONMHytpoppptwwplfifltAHKMNKBzABCAxqwwzACCIMNNMMMMMOOOPPPOOLLKKKKMKKLKJJDAyxuvpqqummqqlokkifbbbeeggjiqqtyyyAzCCBHFHHFFIILKLLNOOONNLLFDxzvstwuqqmmmqqyABBEKNNMEzpib9b830iopptpliiltABytpollp",
+"wAAypif553|/)))'))/|||||444|<<|dilmiiig79guxtpifc5|3cpAEIMNMMNNKBwtAIKNNNKHBwpppmlpwytpniopyBIKNMHBzABBxutwxACGIKNNMMMMMNNOOOPPOOLMMMMMMMLKIJBAyxtvqutuquutuomkhfebdbbgghmmppwwxyzzzEFFFIIKKMMLNNOOOONNLHFzxvvqtquuqqmmmqqyABEHMNMHAwof89875ciopptpooopyEAtppoop",
+"wyAypf93|_/),>>>->!<1<(_||||/~/4cilkggiddfoxAtpic7||3fpAEIKMMKMKIAwyHKMNMMKIBAywoilpwwwtpotAHKKNNKHBABBAxwuwACEIKKMMKKKMNNNOOPPOONNMNMNNMMJIEDDzxvvtuwwuuuuunokkhebbbddehmmqwwvwzzzzEFFFFKKMMMOOOOPPONLKHDzxvrrsmqquqqmmmqwyABEIMMICyplc99575floppppoootwytppttt",
+"ppwwof5|(~~),>>-=='!<_{)///~~,,{3gklkgiigfotyytpi95335fpwBIKIIKKIBwyEKMNMMKKIIHEyplloptwywyBKNNNNNKIEEEEzuwwzCGGKKKKIIIMLMNOOPPPOOLNNNNNLKIIEDDzxxwtwwwuuqqqqnigggggggeemmrrvvvwxxzzDFFFIIMMMNOOOPPPONLHFDzvvprmmmqquuqmmmqwyAIIKKIBypof997735illooliiiloptppttt",
+"llptof3<())))'>;=&*>~<~,)~~)),>,~5ilkiliiiopuyywpf95599kowEIIHHIIEwwAIKMNNMKIKMMIAtolllpwAyEKNNMNNMKKIKIEzAwwCBEHIKKKIILLLMNOPPPPOOOOOOMMJIJEEDzzwywwwwqqqmmmjhjhggggiijmmtsvvvvzzzDDFFHHLLMMOOOOQQQOOLIFCzvpsmmmmmjnuuqmmmtwAHHIHEEztpic99542cllopoiiiiilpppppo",
+"ffilli5|~),,'-*==%%;~11(~//~)~),)<floqommlmppxAAwic9cc9fipAIIIHIIHytwBIKMMMKIKMNNKEypllnptwEKNONMNMKKKMMKHEAyCCCEIKKKKKLMMMNOPPQPOOOOOONKLLHFFDzzyAwwttmmmmmmmeeedgghjjmmsswxyzzzzzEFHFIIKMMOOOOQQQPONLIEzzvppmmmmejjnruqmmtuyBHIEHEBwpofc95439iopttpolliiopolli",
+"fcffloc|/);-;*%=-*-,/|3</<<<<<<~)/5iopupomooquAAwpfccc959itEKKIIIIBtpwEIKIIKIIKNNNNKAtpllopAHMOONNNIHIKMNMIHEEEGCEIFKKKMMMLOOPQRPPOOOONNLLLHFDFzzyzuutummmmmmmmehheeeemmmsuxwwyzzzBFFFIIMMMNOOOPQQQPOMMFHzwvsmmmmeeejjnruqmmtxAEIEEBBAtplfc5313clptwwtpolillliff",
+"iifcfol9<)>;**=-,)),)~<<~~/<<<|<))<5fluqqoommuxAyticcf9335itEKIIKKIAttyHIHHHHHIKMNOOMBwoliowBHKOOOOMIHIIMNMKIHIIHHIKKKKMMMNOOPQRQPPPOONNLLHFFFCzzAzssssmmmmmmmmmeeeeemmmssvvvwxzzzFFFIIMMMMOOOOPQQQPOMKKECAtummmjjjjhjjouuqquwAEIEBABBywplf00725fotwywtollliliff",
+"lif99flf3~,>***-,),-*-)~~),)~~~~)>)<3clqqmmikmtyytlfffc5|39lAIIIIKKIAtwEIIHEEEEHKMOONMEwpoptABEMNOOOKHIHIMMIIHKMMKKMMMMNNNNOPPQRRQPPOONLLLIFFFECCyvtsrrmmmmmmrmmmmmmmmmpssvvvvvzzAEFFIILLLMOOOPPPPQOOLKFECAwwqqjjjjjjjjnpxuqqwyBHEEEEEEAtpic0975cipwwwtplilillll",
+"lid3}5fi9/)>*&*-->*#@#*>,>-->,',,>>)/|dlqqmkggmtxuiccffc559itEIIIIKKHytyEIIHHHHEHKMNNMIEywwyBEEIKMNMKIHIIKMKIHHMMMMOOOOPPPPPQQQRRQQOOONLLIFFFGCzyxvsrrrmmmmmmmrmmmmmmmmrrvvvwvzzzzFFFIKKKLOOOOPPQPPOOLIFCAzwuqqjjjggggjjnuuuqwyAEBCBBEEAytof009669ipttplifiioloo",
+"ii93:<5ff|~,-=***%#+.+@%--*%-),,,---,{|foqqmkgkqtul959fif99fpEKKKKKKKEwwBEIIIKKIHHIKKMMKEBEBEIKIMKKKKIHEIIKKIHHKMMMNOOPQQQQQQQRRRQPOOOMLLIFHFECzvvvssssmmmmmmmssmmmmmsssvvvvvxzzzCFFIILLLMOOOPPPQPPOMMFFzyzxuuljjggggggjjjuuuqwABEAAyABAwtpi0097269lppoifffiliil"};
diff --git a/hacks/images/timetunnel2.xpm b/hacks/images/timetunnel2.xpm
new file mode 100644 (file)
index 0000000..f87144e
--- /dev/null
@@ -0,0 +1,599 @@
+/* XPM */
+static char * timetunnel2_xpm[] = {
+"256 512 84 1",
+"      c #100A08",
+".     c #120C13",
+"+     c #171021",
+"@     c #18112D",
+"#     c #1C150F",
+"$     c #18103A",
+"%     c #1A1049",
+"&     c #1B105D",
+"*     c #1B1076",
+"=     c #241492",
+"-     c #21149D",
+";     c #2012AC",
+">     c #2112C7",
+",     c #332A1C",
+"'     c #382A2F",
+")     c #36245C",
+"!     c #39274A",
+"~     c #331F8A",
+"{     c #372375",
+"]     c #2714F8",
+"^     c #2B15EE",
+"/     c #2E17E3",
+"(     c #4021D9",
+"_     c #441DFC",
+":     c #4B2AC6",
+"<     c #5031B4",
+"[     c #5728F7",
+"}     c #6822FD",
+"|     c #5A4382",
+"1     c #5B3CAE",
+"2     c #5E439A",
+"3     c #5E34ED",
+"4     c #60514F",
+"5     c #655D38",
+"6     c #7A2FFA",
+"7     c #665471",
+"8     c #9027FE",
+"9     c #7540F9",
+"0     c #8D38FB",
+"a     c #7748EC",
+"b     c #6E4FE4",
+"c     c #784ED8",
+"d     c #9447F8",
+"e     c #AB3BFD",
+"f     c #A340FC",
+"g     c #9559FA",
+"h     c #B052FC",
+"i     c #9A64E7",
+"j     c #9267F5",
+"k     c #8D72CE",
+"l     c #8E6EE3",
+"m     c #BF5AFC",
+"n     c #AC64FB",
+"o     c #907EBF",
+"p     c #9386A0",
+"q     c #999C57",
+"r     c #D066FD",
+"s     c #B978FB",
+"t     c #AD83F7",
+"u     c #CD72FC",
+"v     c #A19F91",
+"w     c #CF84FB",
+"x     c #B197F3",
+"y     c #C793F9",
+"z     c #B2A8C4",
+"A     c #B2A8E4",
+"B     c #DE8FFC",
+"C     c #CAACF7",
+"D     c #DAA7FB",
+"E     c #D1BEF8",
+"F     c #CDC7EB",
+"G     c #DFBCFB",
+"H     c #CED1C5",
+"I     c #CECEDA",
+"J     c #E5CBFA",
+"K     c #DBE2A4",
+"L     c #E6D7FB",
+"M     c #E4DEF9",
+"N     c #E6E9DF",
+"O     c #EAE7F6",
+"P     c #EDF1D0",
+"Q     c #F2F0FC",
+"R     c #F9F8FC",
+"S     c #F9FAF6",
+"_[[0nDJMOOOMMMMMOOQQQQQQOMJCysngggitCJLMMLLGDwumhff0000fhsyCCCtc<bclAMOQRQQQOOOQQQQRRRRRRRRRRRRRRRRQOMLLLMMMLLJDBuh03>~%$$$&=:agc).              ..+$%&**=-;>>/////>;=****=-;;>:blAFOOOOMMMOQRRRRRSSSSSSSSSRRRQMFCtjad9ddnniic2!'#     ..++@$%&&&&%$$$%&=>///^^^",
+"__}0gBGLLMMMLLMMOQQQQQQOMLGysngdggixELMMMLJGywmhdf006660hsyCCDtccclxFORRRRRQQQQQQQQRRRRRRRRRRRRRRRRQOMLLLLLLJJDBumf93(={%%&~:3dhg~+             ..+@%&*=-;>>//^^^^^/>;-==--;;;::lAFOQQOOMMMOQRRRRRSSSSSSSSSRRRQOLCtjg999dgggb1)+.#    ...+$&&**=**&%%$%&=;///^^^",
+"__[6dsyGJJJLLLMOOQQQQQOOLEDtngd9dgsxELMMMLJDyshd006}}}60hsyCCCxlllxFORRRRRRRQQQQQQRRRRRRRRRRRRRRRRRQOLLJJJJGGDBurhf63(-~{*~:(dhmd:)..          ...+$&*->>//^^^]]]]^^//>;;;;;>(blAMOQQQQOOMOQQRRRRRSSSSSSSSSRRRROMEyjg999999:<)+.#    ...@%*=;;>;;-*&&%&*=;>//^^^",
+"]__[0hsyDDGJJLMOOQQQQOMLGysnd9399gtCLMOOMLGDwnh006}}}}}0hsDGECCkkxEORRSSSRRRRRQRRRRRRRRRRRRRRRRRRRQQOLLJGGGDDBurhf063(:=~=:(0dmmh3~@+............+@&=;>//^^]]]]]__]^^//>>>>((bkFOQRRRQQOOOOQRRRRRRRSSSSSSSSRRRROMEyja93333(<)@+.     ..@%*;>////>>-=*&**=;>>////",
+"^]_}6dhuwyDGJLMOOOOOMLJCysg96[[39jyELOOOMLGysgd06}}___[6dsDEJEACCAMORSSSSRRRRRRRRRRRRRRRRRRRRRRRRRQQOLJGGDDBBurmef063(::::33dmrmh0:&@+++..++.+++@$&=;//^^]]_______^^^///(((alxFORRRRRQQQOOQQRRRRRRRRSSSSSSSRRRQOLCtj933((>=%@..     ..+%*;/^^^^^/>>-=**=--;;;>>>",
+"^^^^[6dhmuBDGJLLMMLLJCysg93[[[[3aixFOOOOMLGysh06}}____}6gtCELFEEEFORSSSSSSRRRRRRRRRRRRRRRRRRRRRRRRQQOLJGDDBwurmef00633:::33dhrrrh0(=&%$@@@@@@@@$%*->/^^^_______[[[[[33333ackFMQRRRRRRRQQQQQRRRRRRRRRRSSSSSRRRRQMExja3(/>-*%+..     ..+$*;/^]]]]]^/>;-=========--",
+"//^^[}60dmuBDGGJJGGDysg96[[[[/(3btEMOQQOMLCynd06}_____[6gtGJMLFFFMORSSSSSSRRRRRRRRRQRRRRRRRRRRRRRRRQOLJGDBwurmeef00033::3adhmuurm03>-**&&&******-;//^^_____}[[669999aaaaclAFORRSRRRRRQQQQQRRRRRRRRRRRRRSSRRRRROLCla3((;=&$+..     ..+$*;/^]]]]]]^/>;-==***&&&&&&",
+";>/^^[}60dmuwyyyywsng96[[^^^//(3iCLOQQQOMLCtnd6[[_____[6gtGLMMFFMORRSSSSSSRRRRRRRRQQRRRRRRRRRRRRRRRQOLJGDBurmhee000093aaaddmruuume6/>>;;;;;;>>>>//^^^[[[}66660dgnjtjiiltCFORRSSSRRRRRQQQQRRRRRRRRRRRRRRRRRRRRQMEtb3((-*%@+..     ..+$*;/^]]]]]]]^/>;-=**&&%$$$$%",
+"-;//^^_}}0dhmnnngd06[[[^^^^^//3bxJOQQQQOMJCtnd6[_____^[6gtELMMMMMQRSSSSSSSRRRRRRQQQQQRRRRRRRRRRRRRRQOLJGBwummeee00099aaaddhruwuume6[/////////////[[[[660000ddnsyDCCCxCAFMORSSSSSRRRRQQQQRRRRRRRRRRRRRRRRRRRRQOFxj93(;=&$+...    ..+$*;/^]]]]]]]]^/>;=**&&$@@++@@",
+"*->/^^^__}6600066[[[^^___^^^/3atEMOQQQQOMJCwn06[_____^[3gyELMMMMOQRRSSSSSRRRRRRQQQQQQRRRRRRSSRRRRRRQOMJGBwrmeee00009daaddhmruuwume6[////////[33399aggnnnnnnswyGJLMLLFFMORRSSSSSRRRRRQQQRRRRRRRRRRRRRRRRRRRRRQMCta3((;~&@+..     .+@&;/^]]]]]]]]]^/>-=**&%$@++++@",
+"*->/^^]_____[[[_^________^^[39iCLOQRRQQOLJDwg06[[_^^^^[9nyEMMMMOQRRRSSSSRRRRRRQQQOQQQRRRRRSSSRRRRRRQOMJDBurmfe000099dddddhmruwurme6[[////[33ajitxxCCCCCCDDDCGJLMOOOOOORRSSSSSSSRRRRQQQQRRRRRRRRRRRRRRRRRRRRQMExj33((;=&$+..    ..@&->^]]]]]]]]]]^/>-=**&%$@++++@",
+"*-;>/^^]]_______]]]]]___^[[[9jxJOQRRQQQOLGysh06[^^^^^^[9sCLMMOOOQRRRSSSRRRRRRQQOOOOQQRRRRSSSSSRRRRRQOMJDBumhee000099aadddhmruuurme6[[//(3ajtxEFMMMMOMMMMLLLLLMOQQRRRRRSSSSSSSSSRRRQQQQRRRRRRRRRRRRRRRRRRRRROLCla3[//>-*$@+......+%*>/^]]]]]]]]]]^/>;-=**&%$@@@@@",
+"*->>/^^]]]]]]]]]]]]]___[[[39jyEMOQQQQQOMJDwnd0[[^^^^^^[gtEMOOOOQRRRSSRSRRRRRRQOMLLMOQRRRRSRRSSRRRRRQOLJDyumhff000099aaddhmruuuurhe6[[(3abtCFMQQQQRRRRRQQQOOOOQQQRRRRSSSSSSSSSSRRRRQQQQRRRRRRRRRRRRRRRRRRRRQMEtj93[//(;~%@+.....+$*;/^]]]]]]]]]]]^/>>;;-=*&%$@@@$",
+"=;>//^]]]]]]]]]]]]]]__[[39ajtALOQQQQQOMJGBsh06}^^^^^^[3nCLMOQQQQRRRSRSSSRRRRQQMLJLLOQRRRRRRRSRRRRRQQOLJDyumhf000009daaddhmruuurme06333bckEMORRRRRRRRRRRRRQQQQQQRRRRSSSSSSSSSSSRRRQQQQQRRRRRRRRRRRRRRRRRRQQMExia96[[//>-&$@+...+@&->/^]_]]]]]]__]^^//>>>;-*&$$$$$",
+";>>/^^]]]]]]]]]]]]]__[[39ajtCJMOQQQQOMLGDwnf6[_^^^^^^[9sEMOQQQQQRRRSRSSSRRRRQOLJGGLOQRRRRRRRSRRRRRQQOLJDBumff0000099adddhmrrurrhe033:<1kAIRSSSSSSSSRRRRRRRQQQQQQRRSSSSSSSSSSSRRRRQQQQQRRRRRRRRRRRRRRRRRQQMExsg936[[[/>;*%@+++@@&=>/^]]_]]]]]___]^^^^///>;=&%$$%%",
+">>/^^]]]]]]]]]]]]]]__[39gjtxEMOQQQQOMLGDwrf0}__^^^^^^[gtJMQQQQQQRRRSRSSSRRRRQOLGDCJMQRRRRRRRSRRRRRQOMLJDBsmff000099999ddhmrrrrme003:<1koINNSSSSSSSSSSSRRRRQOOMOQQRRSSSSSSSSSRRRRQQOOQQRRRRRRRRRRRRRRRRQOMExtgd966[[[/(;*%@@@@$&~;//^]]]]]]______]^^^^^^/>-*&%&&*",
+"/^^]]]]]]]]]]]]]]]__[39gitxELMOQQOOLJGDwrh06}__^^^^^^[gyLOQQQQQQRRRSRSSRRRRRQMJDyDGMQRRRRRRRSRRRRRQOMLEDBsmhff00099999ddhmmrmme003:<2||pINNSSSSSSSSSSRRRRQOMLJLMOQRRSSSSSSSRRRRQOOMOOQRRRRRRRRRRRRRRQQOLExiga93666[[/(;*%@@@$&~;(/^]_]]]]]______]]]]]^^/>-*&&*=-",
+"^^]]]]]]]]]]]]]]]__[[9gitxEFMOQQOOLLGDwuhf6}__]]^^]]^[gDLOQQQQQQRRRSRRSRRRRRQMGyByGLQRRRRRRRSRRRRRQOMLGDBsnhdf000099900dhhmmme063:<{||7pHNNSSSSSSSSSRRRRQQMJGCCGLMQRRSSSSSRRRQQOMLLMOQRRRRRRRRRRRRRRQOLExiga9900666[/(;*%@@$%*;>/^^_]]]]]________]]]]]^/>-***-;>",
+"]]]]]]]]]]^^]]]]]_^[9gjtxEFMOQQQOMLJDBumf0}___]]]]]__6gDLOQQQQQRRRRSRRSRRRRROLCywyCLQRRRRRRRRRRRRQQOLJGDBsnhdf000009900fhhhhe06[(:~{)!7pvNNSSSSSSSSRRRRRQMJCtsstDEMQRRRRRRRRQOMLJJJLOQQRRRRRRRRRRRRQOMExigd9999d006[/(-&%$$%&=>/^^]__]]]]_____^__]]]]]^/>-==->>/",
+"]]]]]]]]]^^^]]]]__[9gjtxEFMOQQQQOMJGyumd06}__]]]]]]__[dyJOQQQQQRRRRSRSSRRRRROLDwswDLORRRRRRRRRRRRQOOLJGDysnhdd000066660fffff06[[(-{)!!7pzHNSSSSSSSSRRRQOMEDwnggmsyGLOQRRRRRQOLJGDDGJMQQRRRRRRRRRRRRQMJCtja999ddddd6[/>-&%$%&*;>/^]]]]]]]______^^^^^^^^/>;--;>>/^",
+"]]]]]]]]^^^^]]]__[9gtxCELMQQRRQQOMJDBuh06[[__]^^]]]__[dwEMQQQRRRRRSRRSSRRRRROJDwswDLORRRRRRRRRRRRQOMLJGDwumhdd0006666600fff06}[/>=))!!77zIRSSSSSSRRRRQOLEDsnhdddhnwDJMQQQQQMLGDBBBDJMQQRRRRRRRRRRQQMJCtjg999dhgmhd06/>-&%%%*->/^^]]]]]]]____[[^^^^^^^//>;;;>>/^]",
+"]]]]]]]^^/^^^]]_[3gtxEFMMQRRRRRQOLGDsnd06[__]]^^^]]]_[9sGMQQRRRRRRRRSSSSSRRROJysnsDLOQRRRRRRRRRRRQOMLJGDwumhf00066[[[6000006}_^/;*%!!!77zIRSSSSSRRRQQOLGyshdd0000fhsyGLMOMLJDyuuuBDJOQRRRRRRRRRRQQMLGysgd99dhnnnnh06/(;*&&*=;>/^^]]]]]]]____}[^//////>>>;;>>/^]]",
+"____]]^^///^^^^[3gtCFMMOQRRRRRRQOLCtnd06[___]^^^^^]]_[9sGMQQRRRRRRRSSSSSSRRROJysssDLOQRRRRRRRRRRQQOMLJGDwumff0066[[[}}60006}__^/-&%$!!|ozIRSSSRRRRQOMJCyshd00000000dnwCJJJGDwumruwDLOQRRRRRRRRQQOMJCysga999dhnnnmd0[/(;=**=->/^^]]]]]]]_____[[//>>>>>>;;;>>/^^]]",
+"____]^^////^^^^[atELMOOQRRRRRRRQMEynd66[___]^^///^]]_[9sEMQRRRRRRRSSSSSSSRRROLCwwwDLOQRRRRRRRRRRQOOMLLEDBumff066[[[}}}}66}}__]^>=&$@!)|ozORRRRRRQQOLEDwnhd0000086660dmsyDDywummmuBGLOQRRRRRRRQQOMECtjgd9000ddhggd9[[/(>-=-->>/^^]]]]]]]_____^//>;;;;;---;>>/^^]]",
+"__[^^^//>>//^^[9lCLMOQQRRRRRRRQOLCsd0[}___]^^/>>>/^^^[9tEOQRRRRRRSSSSSSSSSRROLGyByGMQRRRRRRRRRRRQOOMMLJCysmf006}}}_}}}}}}}___]^>*%$@!)|oIORRRRRQQMLEDsndd00000886}660dmswwsrmhhmuyJMQRRRRRRRQQMLEDsng996666000096[[//>>;;;>>//^]]]]]]]]_____^/>;-----==-;;>//^^^",
+"[[[[//(>>>//^[3jxFMOQQRRRRRRRQQLGtg0[}____]^>;;;>>/^^[gyLORRRRSRSSSSSSSSSRRRQMECDDJMQRRRRRRRRRRQQOOOMLJCysnf006}}____}}}}___]^/;*%@@!|ozIQRRRRQOMJCysgd000008888}}}}60hnusumhhhmwDJOQRRRRRRRQOLEDsn9966[[[[[[[[[[////>>>>>>>/^^]]]]]]]______^/>;;--=====-;>>//^^",
+"[[[[/(>;;;>//3atEMOQQRRRRRRRRQMJyn96}____]^/;=*=->/^^3jCMQRRRRSRSSSSSSSSSRRRQMJGGGLOQRRRRRRRRRRRQOOOMLJGywnf06}}______}_____]^/-&$@@!|pzORRRRQOMJCtjgd0000088886}}}}60hnsuurmmmuBGMQRRRRRRRRQMLCtja9[[[[[[[[[^^^///>>>>>>>>/^^]]]]]________^^/>>;;--=***=--;>>//",
+"////(>-=~-;((3jxFMQQRRRRRRRRQOLCsd6[____]^/;=&&*=;//[atJORRRRSSSSSSSSSSSSRRRQOLJJJLOQRRRRRRRRRRQQOOOOMLGDwnd06}}___________]]^>-&$@@!|pIORRRQOMJCtng906600088886}}}60dnswBwwuuuyDJOQRRRRRRRQOLEyia93[[[[^^^_^^//>;;;;;>>>//^^]]]___________^^//>>>;-=******==;;>",
+"(((>;=*&&*->(atEMOQQRRRRRRRQQMGtg3[^__]]^/>=&%%&*;>/3jCMQRRRRSSSSSSSSSSSSRRRQOLLJLMOQRRRRRRRRRRQQQQQOMLJDwnd06}___________]]]/>=&$@!!7zIQRRRQOLCtja9666600088886}}66dmwDCGGDDDDGJMQRRRRRRRROMExlb93([//^^^^^^//;-==-;;>>//^^]]]_____}}}}____^^///>>;=**&&&&&&**=",
+"----~&%$%&=:3jxFMOQQRRRRRRQQMEyn3[/^^^^^/;=&%$%&*;>(ayJORRRRRSSSSSSSSSSSSRRRQOMLLLMQQRRRRRRRRRRQQQQQQOMJDwnd0}[___________]]^/;*%@@!!pzIQRRROMEyia96666600888886666dhsCJLLLLLJLLMOQRRRRRRRQIFxlc:((((////^^//>>-=*=-;>>//^^]]____}}66686}}__^^^^^/>>-**&&&%%%%%&",
+"&&&&%$@@@%*<btEMOQQQRRRRRQQMJxi:(>>>>>>>-*&$$$%&=;(3jCMQRRRRRSSSSSSSSSSSSRRRQOMMMMOQQRRRRRRRRRRRQQQQQOMJDwnd6[[__________]]]^/;*%$@!7pINRRROOFCtg93[666000888886660hsCLOOQQQOOOOQQRRRRRSSNIzok11<==--;>(////>>;-==-;>>/^^]]]___}60feeee06}}__^^^^^/>;=*&&%$$@@@@",
+"@@@@+++++$&1cxFOOQQRRRRRRQMJxi<~{&&&****&%$@@$%*->(atEOQRRRRRSSSSSSSSSSSSRRRQQOMMOOQRRRRRRRRRRRRQQQQQOMJDwnd6[___________]]^^>-&%$!!7zHNNNQOMExia96[6600088888060fhsDLOQRRRRRQQQRRRRRRSNNHp77))))%&&{~-;>(((>>;;;;>>//^^]]]___}0fhmmmmhe06}}_^^^^^/>;-**&%$@++++",
+"........+@)2kAMOQQQRRRRRQMExl1)$@@@@@$$$@@@@@%&=;((ayJORRRRRRSSSSSSSSSSSSRRRQQOOOOQQRRRRRRRRSRRRRQQQQOMJCwg96[[^________]]]^/>=&%$!7pHNNNNQOFAtja3666000eee88800dhuyJOQRRRRRRRRRRRRRSSNHvv4''!@@@@@$){~-:>((>>>>///^^^]]]____}0fmuuwwwumh06[[^^^^^/>>;=*&%@+++..",
+".........+!|AFOQQQQRRRQQMFxl2)@+....+++++++@$&*;>/3gyLOQRRRRRSSSSSSSSSSSSRRRRQQOOQQQRRRRRRSSSRRRRRQQQOMJDsg9[[[^_______]]]^^/;=&$$!7vHNNNNNOFAtja366600eeeee800fhnyGMQRRRSRRRRRRRRRRSNHv54'''++++++@!)~<<:(((////^^^]]]_____}0dmuwBDDDBwnh0[[[^^^//>>;=*&%@++...",
+"       ..''pzIQRRRRRRQQMFxk2)@+........++++@%*->//3gyLOQRRRRRRSSSSSSSSSSSRRRRQQQQQQRRRRRRRSRSSRQQRQQQOMJDsg9[[[^^^^^^^_]]]^/>;*&$!!pHNNNNNNOFAtca936000feeeeeefhnyGMQRSSSSSSSRRRRRSSNHv5,,##....++@!){21cba3(//^^^]_______}}0fmuwBDGGGGDwnd6[//////>>;=*&$@+....",
+"        #'4vHNNRRRRRQQMJxl2)!+..    ....++@$&=>/^[6gyJOQQRRRRRSSSSSSSSSSSRRRRQQQQQQRRRRRRRRSSRRQQOQQQOMJCsg9[[[^^^^^^^^]]^^/>-&%$!7vHNNNNNNIFAtca9900000ee0e0edmwDLORSSSSSSSSSSSSSSNHv5,,##....++@!)|2kkliga3[[^^_______}}}00hmuBDGJLLLJCtga33(///>>;;=*&$@+... ",
+"        #,5KHNSSRRRQQMJxl1{)+..      ...++@%*;>/^^6gyGMOQRRRRRSSSSSSSSSSSRRRRQQQQQQRRRRRRRSSSRQOOOQQQOMJDsg9[[^^^^^^^^^^^^^>;*&%$!7vHNNNNNNIFClca990000000000fhnDJORSSSSSSSSSSSSSSNHv5,,##...+++@))22kxxytia9[[[[_____}}}600fhmuyDJLMOMLExib33(((>>;;-*&%@+.... ",
+"       #,5qPNNSSRRRQOFClc1{$+..      ...++$&=>/^^[6hsCLOQQRRRRSSSSSSSSSSSRRRRRQQQQQRRRRRRRRRRQOIIOOQQOMExia3[[^^^^^^^^^^^^/>-*%$!!4HPPNPNPNIzxlba366600000000fmwGMQRSSSSSSSSSSSSSNHv5,,##..++@@$%{11lyDxytng96[[}}}}}}}66000ffmsyGLMOOOMLCtiaa3((>;;-=*&$@+...  ",
+"       #,5KHNSSRRRQOMAlb:~%@+..       ..++$&->/^^[6dsDJLOQRRRRSSSSSSSSSSSRRRRRQQQQQRRRRRRRRRRNIIIOOOOOMExja3[^^^^^^^^^^^^//;=&$$!7vHPPPPPPHIzklb9366666666660dsxJORSSSSSSSSSSSSSNHv44'#...+@@$%{~<<ctyyyysngd066}}}}}}880800fdhsyGLOQQQOMExlbaa3(:;-=*&$@+...   ",
+"      #,,vHNNSRRRQOMExb:=&$+..        ..++$&->/^^[6dnyCJMOQRRSSSSSSSSSSSSRRRRRRQQQQRRRRRRRRRRIIIIIOOOMFAtb93[^^^^^^^^^^^^/>;*%$@!4vKPPPPPPHIAkia93[[[}}66666dgtGMQRSSSSSSSSSSSSRIvp4'#...+@@%&*=-:acittwssnhdd000666686886800fhwCLMQQQQOMExtiga::;-=*&$@++...   ",
+"      ##4vHNRRRQQOMFxja-{$+...        ..++$&->/^^[6dgsyGLMQRRSSSSSSSSSSSSRRRRRRQQQQRRRRRRRRROFzzzIIIIMFxla3[^^^^^^^^//^//>>-&%$@!4vPPPPPPPHzAkca36[[[}}}}}60dnxFORSSSSSSSSSSSSNIzp4''...+@@%&*-;:(3agnissnnmhhdff00068886}6600hwGLOQQQQOMExtljba:;=*&%@++....   ",
+"      .'7pFOOQQQOMLCla:~%@..          ..+@%*->/^^[60hnsyGLORRRSSSSSSSSSSSRRRRRRQQQQRRRRRRRROIzppzIIIIIAxia3/^^^^^////////>;*&%$!!4vPPPPPPHHzolca3[[[[}}}}}69gtCMORSSSSSSSSSSSNHIp4''...+@$%&*=;;>((3agnnususurmhffe0066}}}}}6dnyJMQQQQOMLExytica:-~&%@@+......  ",
+"    ..+!2kAFOOOOMLExb:-&@+..          ..+@%*;>/^^[60dgnyCJORRSSSSSSSSSSSSRRRRRRQQQQRRRRRRRQOFAoppvHHIIAkca(/^^^/////////>>-*%$@!7vHPPNNPPHIzxlcd3[[[____}[6diyJMQRSSSSSSSSSNNHHp4''...+@$%&=-;;>>((33dhnwByyywwumhf006}}}}}}0gwGLOQQQQOMJGCCxtib:=*%$@+........ ",
+"   ..+${<lCJMMMMLExja:~$+..           ..+@%*;>/^^[69dhnsDJOQRSSSSSSSSSSSSRRRRRRQQQQRRRRRRQOMAooopvHHIzAkc3(/^^////((////>;=&%$$!4vHNNNNNNNIAxlg93[[[____[[9gtEMORRRSSSSSNNNNHvp4'''+++@$&*=;;>>>>((30dmwDDGGGDDwumhf06}}}}}6dsDJMQQQQOMMJEECCxlc<~{$@++.........",
+" ...+@&-:bxCJLLLExia3-&@..            ..+$&=>//^/[660dhsyJORRSSSSSSSSSSSSRRRRRRRQQQRRRRRRQMJxkkopvIHIzAkc3(/^///(((((//>>-*&%$!7pHNNNNNNNIIAxlga3[[[___[[6aiCJMORRRRRNNNNNHHvp7'!'++@$%&=;>>>>>((((3dnwDGJLLLJGDwuhf06}}}[69nyJMOQQQQOMMLLLLECxl1~)$@+..........",
+"...+@&=>(alxEJEExta3(=%@..            ..+$&->///[[669dhsDJORRSSSSSSSSSSSSRRRRRRRRRRRRRRRQOMExkkozzHIIFAkca(///(/(((((>>>;-*&%$!7vHNNSSNNOIFExtja9[[[__[[[9jxEMOOQRRQNOIIHHvp77!!!@@$%&~->>////////39hsDGLMOOMLJDysmd06[}}[6gtEMQQQQQQOMMMMMMLJCl1{)!@+..........",
+"..+@%*;/(9ixCEExtg3(:*$+..            ..+$*->///[339ddgsDLORSSSSSSSSSSSSSRRRRRRRRRRRRRRRQOMCklkozIIIIFAkca3///(((::(>>>>;=&%$$!pHNNSSRRQOMFECysgd6[[[[[[9jtCFMOOOOOIIFzzzpp7|)))))%&~-;>////////[3dnwDJLMOOOOLJGysgd6[[[[[9sCMOQRRRQQOOOOOOOOMAk2{)!@++.........",
+".+@%*;>/[9ixCECyja3(-&@+.             .+@%*;>///[39dddnwCMQRSSSSSSSSSSSSSRRRRRRRRRRRRRRRQOFAxkkozIIIIFAkca3//(((:::>>>>;-*&%$!7pHNNRRROOMMFECytjgd6[[[[9gtxEFMMMMIFFAAooo|22{{{{~~~=;>(///[[[[[39gsyGJLOOOOOMLJCysh0[[[[[9gxLOQRRRRRQQQQQQQQOMFo2{)$@+++........",
+"+@%*;>//[atCEECtj3(;~%@..            ..+$&=>///[39ddddnyGMQRSSSSSSSSSSSSSRRRRRRRRRRRRRRRQMFCxkkAzIIIIFAtb33//(((::::>>;-*&%$@@7vHNRRROOMMLJJECDtsg99669ajxCEFMFFFAAokkkl11<<<----:::((([[[[[[39gsyCJLMOOOOOMLJCysg96[[[[[9tEMQRRRRRRRRRRRRRRQOFo2{)$$@++........",
+"$%*;//^[6gtCEECta3(-&@+..            ..+$*;>///39ddddgsyEORRSSSSSSSSSSSSSRRRRRRRRRRRRRRQQMJCkkoAzIIIFFxlb33//(((::::;;;=*%$@@+4vHNNQOOMLLJJJJECDtng9999gtxCEEFEACxkkllicc::((((((::a33333[639gsyCJLMOOOOOMLLECysg9[[[^^[[atFOQRRRRRRRRRRRRRRROFk2{{)$@++........",
+"&~;(/^^[9nxEEExla(;*%@..             ..@%=>///[6ddggdgsyGMQRSSSSSSSSSSSSSRRRRRRRRRRRRRRQOMExkkoAFIIMFAxja33[/((:::;;;;-*&%@@++'vHHOOMLJJEJJJJEGCysgd999gjxCCCCCxxklllicba333(333aaaaa993339gntCJLMOOOOOMLLGCysnd6[[^^^^^3gxLOQRRRRRRRRRRRRRRQOAk1~{%$@++........",
+"=;(/[[[[9jyCECxja:=&@+..             .+@&->//[39dddddgsyJMQRSSSSSSSSSSSSSSRRRRRRRRRRRRRQOLCxlkoAFIMFFCtb33[//(((:;;;;-=*&$@++''4vIILLJGCCGEEJEGDysg9999ajttxxxxxtktttliga933339abbjbba9999gntCJMOOOOOMLJGDtsgd9[[[^^^^^^3jxLOQRRRRRRRRRRRRRROMAl1~{)$@+........+",
+":(([[[[6djtyxtia(;*%@...             .+$*;(/330ddddddgsyJMQRSSSSSSSSSSSSSSRRRRRRRRRRRRQOMExlllkAFFFFAxia3[///(((:;;;;-*&%$@+++'4pzJJGDDyDDCGGGDywnd96[39ajitttxxxCCCxytjga999abjjiijbaa9dgnsDGLMOOOOMLECysgd96[[^__]]^^^3jxLOQRRRRRRRRRRRRRQOFxl<~{$@+........+@",
+"(([[[[[69gjssja3>=&@+..             ..+%~:(330dddddddgsDJOQRSSSSSSSSSSSSSSSRRRRRRRRRRQQMJCtjclkCEFFECtb33[^^///(>;;;;-*&%$@+++'7pAADywwwwyDDDDDBshd6[[[39abiltxCAEEECCytjgaagjjillijbaaaggnwDELMOOOMLGDwnh06[[[____]]]^[[gyJOQQRRRRRRRRRRRQOFAlc<{)@+...   ..+@$",
+"(([[[[[[69dga93(-*$+..              .+@)<:339ddd9399dgtCLORRSSSSSSSSSSSSNNNRRRRRRRQQQQOLExibbilxAEECxia3[^^^^//(>;;;;-*&%$@+++'77oyysiinswwyyDywnh06[[[[39ajitxEEFFJECxtijjjjltllljjbbjgjnsyDGJLLLLECyshd06[[[_____]]__[6gyEMOQQQQQQRRRRRRQMEkc<~{$@+..    ..@%{",
+"[[[[[[[[[[66[[(;~%@+..              .+!{<:aaddda3339dnyGMQRRSSSSSSSSSSNNHHIINRRQQQQQOOMExlbabblxCCCxtj93[^^^^//(>>>;;-=&%$@+++'!|2linggdgnswBywsnd0[[[[[[39gitxEEFFJECyttiillttllliiilltstwyyDGGGGDysnh0066[[[_________[6hwGLOOQQQQQRRRRQQMExib<~%@+..    ..+$*-",
+"[^^^^^[__[[[[/>=&@+...             .+@)21ccgdaa33339gsDJOQRRSSSSSSSSSNHHzppzIOOQQOOOMLECtjaaabltxCxtig9[[^^^^^//>>>>;-=&%$@++++!)21caa39dhnswwwsnd0[[[[[[[9ajtxCEEEECxyttiitttlllllltxxxyyyyyyyyywsnhd066[[[[__________}6hsDJMOQQQQRRRQQQOLClb:<~%@+..   ..+@&->",
+"^^^^^_____^^//;&$+...             ..+!22lligaa:::(39gtCLORRSSSSSSSSSNHvp777pzIOOOOMMLECtja99agitxxytna3[[^^^^^///>>>;-=&%$+++.+@){1<::(33dhnuwwsnh96[[[[[[69gjttxxxxtttiiiiiliiilltxCAECCDyywsssnhdd0666[[[[[__________}0hsDELOOQQQRRQQQOLEyib:-*%@+... ..+@&=>/",
+"^^^________^/>*%@...             ..+$)2kkktic::::(3aiyEMQRRSSSSSSSSNHzp7777ozIOOOMMLECtjg999ajityytig9[[[^^^^^////>>;-=&%$+++.+@!{~<:::((3dhswywsgd6[[[[[[[39gjjjiiijjjjjjjjjjjilxCEFFFJECyysnnhd0066}[}[[[[[[________}0fmwDGLOQQQRRRQQOMJCtb::-*%@+.....+@%=>//",
+"__________]^/-&@+..             ..+@)2koACxtic<<::abtCLORRRSSSSSSSRIzp7!!!|ozFOOMMLECysg9999ajittttig9[[[^^^^^^///>>>-=&%$++..++!{~==--;:(9giwywsnd0[[[[[[[669dggggaaaaaggggjjjlxCEFMMMLJCywshd0066}}}}[[[[[[[______}}0dmuyDJLOQQRRRRQQOMJxib::-~&$@+...+@%=>//[",
+"_^________^/>*%@....            ..@%~1kAFFAxlc<<::aixEMQRRSSSSSSSNIzp|!!!!)|AFMMMLECtjg99399ajitttsnd6[[[^^_^^^////>>;=&%@++..++@%{*~===-::anwwwsnd96[[[[[[6699999999999aaaabjitCEMOOOMLJCysnd066}}}___[[[[[[[____}}60hnwyDGJMOQRRRRRRQOMExlc::-~&$@++++!{=:(/[[",
+"[[[}}}____^/;*$+...            ..+${<lAFMMFAk1<<:abtCLOQRSSSSSSSRNIo|!!@@!)|oFFMFECtjg933339gjtttsjg96[[[^__^^^^///>>;=&%@++...+@$%&&&**~=:aisttsng906[[[[[6669999999999999aajtCEMOOOOOLECysg966[}____}[[[[[[[}}}}}60huBDCGJLMOQRRRRRRQOMGxlc:<=*&%@@+!){1:3366[",
+"6666[}}}__^/-&@+...           ..+@%~<kAMOOIAk1<<:ajxEMORRSSSSSSSRIz7!!@@@!)|oAFFECtjg93[[339gjitsjgd6[[[_^__^^^^///>>;=&%@++...++@$%%%%&&~<:ciwtsngd96666666999993366663339aglxEFMOOOOMLCysnd06[______}[[666[[}}}}60hsyDGJJLLMQQRRRRRRQOLEkl<<=~{%$$!!)21cgddd00",
+"000066}}__/>=%@...            ..+$&=cxFOOOIAk1<bablxEMQRRRSSSSSNIzp|!@++@@)|oAAACxia93[[[33aajiijgg9[[[_____^^^^^//>>;=*%@+.....+@@$%%%%%{~<cittsngdd000000099999336[[[[399ajtCEMOOOOMLEytnd96[[______[[666666}}660huyDGJJJLLMOQRRRRRRQOLCkc<<~{&%))!||kytsnhdd0",
+"0000066}_^/>*$+...            ..+$&<lAIOOOIAk1baablxJMQRRRSSSSRNIp|!!++++@)|koAAxlg9[[[[[339agjjgg96[[_______^^^^//>>;=*%$+.....++@$$$%%%&{1clttsingdddddddddd99936[[[[399ajtxCJMMOOMFExtng9[[[______[[6666666}}60fnwDGJJJJLLMOQRRRRRRQMFCl1<~~{&)))|ooCCDysnhdd",
+"dfff06}}_^/;&@+..            ...+${<kAIOQOIAkc:aaaixEMQRRRSSSSQIzo|!@+++@@)|ooAxtja3[[[[[339aagaa96[[________]^^^//>>;-*&$+.....++@$%%%%%%{11kxyttinggggghhgddd993[[[[699gjstyCELMMLJCxsgd0[[[______[[669000666660dnBDGJJJJLLOQQRRRRRQOMAkl1~~{{{{{2oAEJJCywnhdd",
+"fff006}__^/-&@...            ...+${1kFOQQNIAlb:39aiyEMQRRRRRRRIzo|)!@+++@!)|oAAxtj93[[[[3339aaaa93[[[________]]^^^//>>-*&$++....++$%&&&%%%{2kkxxytsssssnnnnngad93[[[[69agjttyDCCEEEGDyig96[[_______[[660ddd000000fhsyGJJJLLLMOQRRRRRRQOFok11~~~*~~1kAFMLLGysnhfd",
+"ff006}}__^>=%@..             ...@${1oINRQIFola333ajyEMQRRRRRRIFpo|)!@+++@!)|oAAAtj93[[[[339aaaa99[[[[_________]^^^///>;-*%@+....+@%&***&&%{2koCCxxttttssssinga933[[[[9ajjttyyyyyDDytsgd96[[[______[[[69dddddd000ffnwDGJLLLMOQQRRRRRRRQIAk2~~~~~=<1kAFOOMLEDsnhdf",
+"ff00}}__^/>*$+..             ..+@%{2AINNNIFkca3339jtGMOQRRRROIAo|))@@@+@@!|oAFFAtj93([[339aaaa993[[[[_________^^^^^^//>;=&$+++++@%*=--=*&&)|2oAACCyytttwtsngga33[[[[39gstyyyyywwssngd96[[[^_______[[69ddgnhhfdfdhnsyGJLLMOOQQRRRRRSSSNIo|{{~~==-<lxFOOOOLEDsnhdd",
+"ff06}___^/;&@+..             ..+@%~kAINNOIAlb3[[[9gtCLOQQRQOIAo||)!@@@@@@!|ozFFAxj93((339aaaaaa93[[[[_____^^^^^^^^^^^^/>;*&$@++@%*-;;;-*&&){2oAEECDyyywtsngaa33(/[[[9gjtyyyyyssnggd93[[^^_______^[[69ddgnnnhhhhmnsyDJLMMOQQRRRRRSSSSNHp7|){{~-::cxFMQQQOLEDwshhh",
+"ff0}}__^/>*%+..              ..+${1kzIOOIFxia3[[[6gsCLMQQOOIAo||))$@@@@@!)|zIIFFxia3((33aabbba996[[[[___[[[^^^^^^^^]]^^/>;*%$$$%*->>>>;=&&%{2oAEEECDyttsnga33(((//[[9gstyyyysnghd06[[[^^________[[[99gnnnsnnnnuwBDCJLMOOQQRRRRRRSSSSNHp7)){~=::cxFOQQQQOLJCysunm",
+"hf0}__^^/;&$+...             .+@%~1kzIIIFAkb33[[[6dsyJMOOOIzo|))!@@@@@@@!)7zIIMExia3(33aajjjgad966[[}}}[[[[[^^^^^]]]]]]^/>-*&&&*;>///>>=*&%{2kAFFECDytigaa3((>>(//[39gsyyyysnhd06[[[^^^]]]]]___[[[69ggnnssssswyDGEJLMOQQRRRRRSSSSSSNNv7!)){~<blxFOQRRQQOMLGDywwu",
+"hf0}_^^/>=%@+..             ..+$&~1kAFIFAxla3[[[[6dnyELMMFzp|!!@@@+@+@@@!|pzIIIFxlb:33abjjjjgad000666}}}[[[[^^^^^____]]^^/>-==-;>/^^^/>-*&%{2kAFFJECysga33((>>>>(((3djstytsngd06[[/^^^^]]]]]___[[69dgnsssswwyDCELLMOOQQRRRRRSSSSSSSNHv7!){~<<lAFORRRRRQOMLECDyyB",
+"hf0[^^/>;*%@...            ..+@%*=<lAFFFAkia93[[60dsxEFFFzp7!!++++++++@@)|pIIIIFxlc::abjltiingddd000000006[[[^^^_______]^//>;;>//^^^^/>=&%%)2kAFFJECtia3((>>;;;;>((3ajsttssgdd6[[/^^^^^]]]]]]__[[69gnjsttyyyDGJLMOOOQQQRRRRRSSSSSSSNHp7|{~<<lAMORRRRRRQOMLJGCDDB",
+"h06[^//>=&$+....          ...+$&=-:lkAAAxklja9000dhsyGJFzp7!'++++++++@@$)|pFIIFAxlcbbbittttsnghhffeeeeeee066[[[[_______]^^/>>>//^^^^//;=&%$){2oEFJCxiba::>;;;;;;;>(3ajsttsngd96[[//^^^^^^]]]]_^[[99gjstyDDCCGELLMOOOQQQRRRRSSSSSSSNNHp|211ckAMORRRRRRRQOMLJEGCDy",
+"d0[[//>;*&@+....         ...+$&*;>:blkxxxxttigdddhnwDGEFzp7''.+...+++@@)||AFIFFAklcccitxxxytsnmhhhheeeehff06[[[[}}}}____]^//////^^^//>-*%$$!)|oAEACtcb::;;;;;;---;::acittingd33[/////^^^^^]]]^^[[9gjttDCGGGEJJLLMMOOOQQRRRRRSSSSSSNNIpk11lkAMORRRRRRRQQOMLLJGCDB",
+"0[[//>>-*%@+...         ...+$&*;>((:clkxxCCCytnmmnsyDGEzp74''....+++@@$)2oAFFFExklccitxCCCxytsnmmmmhhmmmmmff06[}}}}}____]^//////////>-*%$@@+!!|oAokl<<===--;;;--==-:bcitlingd33/////////^^^^^^^[39jtyCEJLLLLLLLLLLLLMMOQRRRRSSSSSSNNzokllkAFORRRRRRRRQOMLLJEGDBw",
+"[[//>>-*&$++...        ...+$&=;>///(ablxAEJJGDywsswDCGEzp4''.....++@@$){2oAFFFAxllcilxCCCCDywsurmmmmmmrrrrmhff0066}}}___^^//(3333((>-*%$++++''77oo22{{{**=-----====<<ciiliiga33(///////////^^^^[3aiyCJMMMMMMLLJJGGGEJLMOQRRRRSSSSSNIzoklkAFORRRRRRRRQQOMLJEGCDwu",
+"[[/>>-*&%@+....       ...+@&*;>////(3alxEMMMLJCDyyDDGGzzp4''#....++@$){2koAFFEAxliiltxCEECDywuurrrrrrrruuurrmhhfe00}}___^^/39ajga3:={)@++.##''4477|)))%%&*=---=***~~<cilliiba3(((>>>>>>>>>>////[9jtCFMOQQQQOMLJCDyyxCEMOQRRRRRSSSSQIAokxAFORRRRRRRRRQOMLJJEGDysn",
+"[/(>-**&$++...        ..+@%*;>/^^^//3alAMOOOOLJGDDDGGEzp44''#...++@@$)22kAAFEACtliilxCCEECDywwuurrrrrruuwuuwuumhffe0}}__^[[9gtytlc<{)!+.###,,,,447!!@@@$%&*===*****~~1cilicba:(>>>>>>;;;;;;>>/(3atCFMQQRRRQQOLEDttttCEMOQRRRRSSSSROFAoxAFORRRRRRRRRQQOLLJEGDywnh",
+"//>-=*&%@++...       ...+$&->//^^^^/3atEMQQQQOLJGGGGJJzp44''#...++@$){2koAEEEAxliiltxCEEECDyBwuurrrrrruwwBBBBwwurhf06}}_[[9gtxDxtl2)!''###,,,,,44'''++@@$%&******&&*~<1ccccb:::;;;;;;-==**=-;>(3ixJMQRRRRRRQOLEDtttxELOQRRRRRSSRRROFAAAFOQRRSRRRRRRQQMLJEGCDysh9",
+"/>;=*&&%@+....       ..+@%*;>/^^^^^/3bxLOQRQQOMLJGGJJJzp4'''#..+++!))22koAAAAxtliiltxCEEEGDyywuurrrrruuwBBDDDDDBwrmf06}}[6dntDCxk2|!'''##,,,,5544'''+++@$%&&***&&&&{{~<<ccc::---=====**&&&**-:(btEMQRRRRRRRRQMECytxEMOQRRRRSSRRRROMFEEFOQRRSSRRRRRRQOMLEGCDysnd6",
+"/>;=*&&%@+....       ..+@&=>//^^^^/[9iCMQRRRQQOLJJGJJFzp4,''#..++!!)||oooCACxtijjjlxCEEJEGCDywuuurrruuwBBDDGJJGGDBumd06669ditxxtk2|!'''',',,555544''+++@@$%&&&&&&&&&{~<<<<<<==~*****&&&%%%&*=:blCMORRRRRRRRRQMECxCEMOQRRRSSSRRRRQOMFFMOQRRSSRRRRRRQQOLJGCDysnd0[",
+"/>-**&%$@+....       ..+$&->//^^///3atFORRRRQQOLJJJJJFzp44,,''''!!77ooooCCCxtljbjitxCEJJJEGDDBBuuuuuuuwBBDGJLLLJGDyumd0009gnstll2|)!!+''''445vvv477!++@@@$%%&&%%%%%%&*~=<--=~*&%%%%%%%$$$$%*-:cxEMQRRRRRRRRQOMJEEFMOQRRSSSSSRRRQOMMMMOQRRSSSSRRRRRQQMLECDysnd9[[",
+">>-**&%$@+...        ..+$*->//////(3jCMQRRRRRQOMLJJJFFzv44,,,''477ppzzAAACxxtijbjlyCELLLLJGGDDBwuuuuuwBBDGJLMOOMLJDBuhdd9ddgnic12))!!!!!)77ppvvzpp7!!!@@$$$%%%%%$%%%%&*~==~*&%$$@@@$$$$@$%&~:biCJOQQRRRRRRQOMLJJLMOQRSSSSSSSSRRQOMMOOQRRRSSSSSRRRRQOMLGCywsg96[[",
+">;=*&&%$@+...        ..+%*;>////>((btFORRRRRRQOMLLJLLIIvv555555vvHHIIIFFAAxtljjjitCELLLMLLJGDDBwuuuuuwBBDGLMOQQOMLGDwsghdddaab12)))))){22|ozzIIIzpo|))$$$$$$$$$$$$$$%%&*~**&%$@@+++@@@@@$%*-:aiCJMOQQRRRQQOMMLLLMOQRSSSSSSSSRRRQOOOQRRRRSSSSSRRRRRQOMLGCysnd9[[^",
+";=*&&%%$++...       ..+@&=;>//(>>::iAIRRSSRRRQOMLLLLMIIHvqqqqqKPPNNNNNIFEAxtljjitxELLMMMMMLJGDDBwuuuuwBBDJLOQQQQOMLGDwngddda:<2)))){21<clkAFIIIIFAo2{))$$$@@@@@@@@@@$%%&&&&%@@++++++++@@$&=;(aixGLMOOQQQOOMLLLMMOQRRSSSSSSSSRRRQOOQRRRRRSSSSRRRRRRQOMLECywnd6[^^",
+"**&%%%$@+...        ..+%*;>///>;;<1kFQSSSSSRRROMLLLMOOHHKKKKKPPPNNSSSROMJAxtljjiyCJLMOOOOMMLJDDBBwuuuwBBDJLOQQRQQOMJGywngaaa<2{)!||21cclxAFMOOOOMFAk2{)$$@@@++++++++@@$%%%$@@+++.+++++@@%&->3ajtDGLLMOOMMLLLLMOQQRRSSSSSSSSSRRQQQQRRRRRRRSSRRRRRRRQOOLLGDtnd[[^/",
+"%%$$$$$@+...       ..+@&=>>//(>;-12oINSSSSSSRROMLLMMONNNPPPPPPNSSSSSSSRMFExtljitxGLMOOOOOOMLJGDDBwuuuwBBGJMQQRRRQQOLJGDtigbc12|777okktxxEFMOOQOOOIzo2{)$@@++++++..++++@@@@@+++....++++@@%*-(3djsyCGJLLLLLLLLMOQRRRSSSSSSSSSRRRQQQRRRRRRRSSRRRRRRRRQQOMLEDtg9[///",
+"@@@@@@@@+...      ..+@%*;>//((:;=12zISSSSSSSRROMMLMOQRNNNNNNNSSSSSSSSSROFCxtiistCELMOOQQQOMLJGDBwwuuuwBBGJMQRRRRRRQOMLECyti1277ppzzAACCELMOQQQQQOOIAo|!@@++..........+++++++......++++@@%*;(3ajsyDCGEJJJJLLMOQRRRSSSSSSSSSSRRRQQRRRRRRRRRRRRRRRRRQQQOMLGysa3[//;",
+"+++++@@++...     ..+@%*;>///((:;<1kzNSSSSSSSRROMLLMORRSSSSSSSSSSSSSSSSROFCttiisyCJLMOQQQQOOLJGDBwuuuuuBBGJMQRRRRRRRQOOMJGCxopvvHHIIFFJFLMOQQQRRRROIzp|!+++........................++++@$&=>(3antyDCGEEJJLLMOQRRRSSSSSSSSSSRRRQQQRRRRRRRRRRRRRRRRRQQOOLJCtg9[//>=",
+"++++++++...     ..+@%*;>////((>:<<kFQSSSSSSSRQOMLLMORSSSSSSSSSSSSSSSSRQMJCtiiityCJLMOQQQQOMLGDBBuuuuuuBBGJMQRRRRRRRRQQOMLFzzHHHNNROOMMMMOQQQRRRRRROIp7!++.........................+++@@%&->3djsyDCCGEJJLLMOQRRRSSSSSSSSSSSRRQQQRRRRRRRRRRRRRRRRRQQOOMJCtn9[[/>;*",
+"....+++....    ..+@%*;>//////(>::<lFOSSSSSSSRQOLJLMORSSSSSSSSSSSSSSSRRQMExsinstyCJLMOQQQOOLJGDBwuuruuuBBDJMQRRRRRRRRRRQOOIIHNNNNSRQOMMMMOQQQRRRRRRRIz7!'+.........................++@@$%*;(agsyDCGGJJLLLMOQRRRSSSSSSSSSSSRRQQQQQRRRRRRRRRRRRRRRQQOMLJCyj9[[^/>=&",
+"...........   ..+@%*;//^^/[[/((>(:lFORSSSSSSRQOMLLMRSSSSSSSSSSSSSSSRRRQMCtsinssyDJLMOQQQOMLGDywurrrruuBBDJMQRRRRRRRRRRRRQONNNNSSSRRQOMMOOQQQQRRRRRRNIp7''+............         ...++@$%&=:3gsyCGGEJLLLMOOQRRRSSSSSSSSSSSRRQQQQRRRRRRRRRRRRRRRRQOMMLECynd6[^^>-&%",
+"..........   ..+@%*;//^^^[[[//(((3iEORSSSSSSRQOMLMORSSSSSSSSSSSSSSSRRROLCtsnnswyDJLMOQQOOMJGDBwurrrruuBBDJMQRRRRRRRRRRRRRNNNSSSSSRRQOMMOOQQQQQRRRRRNIz4''++.++.........         ...+@$%*-:bixCGEJLLLMOOQQRRRRSSSSSSSSSSRRQQQQRRRRRRRRRRRRRRRQQOMMLJCysg9[^^/;*%@",
+".......... ....@%*;/^^^__[[[/((((3bCMRSSSSSSROOMLMORSSSSSSSSSSSSSRRRRROLCytssswyDGLMOOOOOLJCywwurrruuuBBDJMQRRRRRRRRRRRRNSNSSSSSSRRQMMMOOQQQQQQRRRRRIzp7!+++@@++++.....         ...+@@%*<ciyCEJJLLMMOQQQRRRRSSSSSSSSSSSRRQQQRRRRRRRRRRRRRRRRQQOMLJGDwnd6[^/>=&@+",
+"..............+$&->/^^__}}[[/(((/3bxMQRSSSSRROMLLMORSSSSSSSSSSSSSRRRRROLGCytwwByDJLMOOOOMLGDywwurrruuuBBDJMQRRRRRRRRRRRRSSSSSSSSRRQOMMMMOOQQQQQRRRRROIp7!!@@@$$$@@++....         ...+@%{<ctxCEJLLMOOQQRRRRRSSSSSSSSSSSSRQQQRRRRRRRRRRRRRRRRRQQOOMLGDwn9[[/>=&@+.",
+".............+@&=>/^^__}}[[(((>(/(axLQRRSSSRROMLMMORSSSSSSSSSSSSSRRRRROMLGCDyyyDGJLMOOOOMJGDywwuuruuuwBBDJMQRRRRRRRRRRRRSSSSSSSSRRQMMLLLMMOOOQQQRRRROFo|!$$$%%%%%$@+....         ...+@){1ctDCEJLMMOQQRRRRRRSSSSSSSSSSSSRRRRRRRRRRRRRRRRRRRRRRQQOOLJDwn9[/>-&$+..",
+" ...........+@%*;/^^__}}6663((>//(9tEORRSSRROMLLMMORSSSSSSSSSSSSRRRRRRQOMLLEGCDGJLMOOQOOMLGDywwuuuuuwBBDGJMQRRRRRRRRRRRSSSSSSSSRRROMJEEJLLMMMOQQQRRQOzo|)$$%%&&&%$@++...          ..+@${1clxCGJLMOQQRRRRRRRSSSSSSSSSNSRRRRRRRRRRRRRRRRRRRRRRRRQQOMLGyn93(-&$+...",
+"  .........+@$*->/^^_}}60003(((//[9lEMQRRRRQOMJJLMQRRSSSSSSSSSSSRRRRRRQQOOMLLJJJLMOOQQOOMLGDywwuuuuuwBBDGJMQQRRRRRQQQRRSSSSSSSRRRQOLEGGGEJLLLMOQQQQOFA2{)$$%%&&&%$@+....          ...+${<bitCGJMMOQRRRRRRSSSSSSSSSSNNNRRRRSRSRRRRRRRRRRRRRRRRRQQQOLGyg9(:*$@... ",
+"  ........+@$&->/^^_}}60fd03(((//[3jxMOQRRQOMFEGJMORSSSSSSSSSSSSRRRRRRRRQQQOMMLMMOOQQQQOMLGDywuuuuuwBBBDGLMQQRRRRQQQQRRSSSSSSSRRRQMLEGCCGGGJLMOQQQQOFo2{)$$$%%%$$@++....          ...+$&<:bixCJMOQRRRRRRRSSSSSSSSSNNNNRRSSSSSRSRRRRRRRRRRRRRRRQQQMLCwg3(-&@+..  ",
+"  .......++$&=>/^^__}}0ddd03((////3atEMOOOOMFGCCGLORRSSSSSSSSSSRRRRRRRRRRRQQQOOOOQQQQQQOMLGDywuuruuwBBDDGLMQQRRRQQQQQRRSSSSSSSRRRQMLEGDDDDCGJLOQQQQMEk2)$$@$$$$@+++......         ...+$&-(ajtCJMOQRRRRRRRSSSSSSSSNNNNNNSSSSSRSSRRRRRRRRRRRRRRQQQOLJDsa3>~%@..   ",
+"  ......++$&=>/^^]__}60ffd03(///^^[3iCFMOMMJCDyDGLORRSSSSSSSSSSRRRRRRRRRRRRRQQQQQQRRRQQOMJCywurrruuBBBDGJLMQQQQQQOOOQRRRSSSSSSRRRQMLEGDDDDDCELOQQQOMAk2)$@@@@@+++........        ....@$&-(3gtCLMQQRRRRRRRSSSSSSSNNNNINNSSSSSSSSRRRRRRRRRRRRRQQQOMJCwg9(;*$+..   ",
+"  ....+++@%*;/^^]___}60ef03((//^^^/3axAFMFFAxywyDJORRSSSSSSSSSRRRRRRRRRRRRRRRRQQRRRRRRQOMGDwurrrruwBBDGGJLOOQQQOOMMOQRRSSSSSSRRRQOMLEGDyyyyDGLOOQQOFCl{)$@@++++..........        ...+@$*;(3bxEMOQRRRRRRRRSSSSSSNNNHHINSSSSSSSSSRRRRRRRRRRRRQQQOMJGynd3(-&@..    ",
+"  ....++@%*->/^]]__}}60e003(//^^^^^[9lxEEEAxtsswDJOQRRSSSSSSSRRRRRRRRRRRRRRRRRRRRRRRRRQOLGysrmmmruwBDDGJLLMOOOOMLLLMOQRRSSSSRRRRQMLJGDyywwwyGLMOQOMFx1{)$@+++.............       ...+@%*;(3jxFMQQRRRRRRRRRSSSNNNNHHINNSSSSSSRSSRRRRRRRRRRRRQQOMLGysg93:*$+.     ",
+"   ...+@$&->/^]]]__}}800063///^^^^^[3btCAAxysissDJOQRRSRRSSSRRRRRRRRRRRRRRRRRRRRRRRRRRQOLCwummmrrwBDDGJJLLMOOMLLJJJLOQRRRRSRRRRQOMJGCDywuuwyGLMOQOMAk1{)@@++...............    .....+@%*;(bxFMOQRRRRRRRRRRSSSNNHHHIINNSSSSSSRSSRRRRRRRRRRRRQQOLJDwnd3(=%@..     ",
+"   ..++@%*;/^]]]___}}66666[//^^^^^^^3alxxxxtinnsDJORRRSRRRRRRRRRRRRRRRRRRRRRRRRRRRSSRRROJDwnmmmruBDDGJJLLLMMMLJGGGGJMQRRRRRRRRQOMJGCDywuuusyGLMOOMFAl1{%@++........................++@%~:alEMQQRRRRRRRRRRRRRNNHHzzIHNNSSSSSSRSSRRRRRRRRRRRRQQOLGysg9(-{@+.      ",
+"   ..++$&->/^]]]____}}}6[[[//^^^]]^^39jtxxtijnnwDLORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSRRMJDwrmmmrwBGGJLLLLMMMLJGCCDGJMORRRRRRRQOMJCDyywwurrsyGLMOOMExl<{%@+.......................+++@$&=:lAMQRRRRRRRRRRRRRROIzzpppzHNNSSSSSSSSRRRRRRRRRRRRRQOMJDtna3:~$+.       ",
+"   ..+@%*;>^]]]]]___}}}}[[[/^^^]]]^^[3bltttinnsyGLQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSQMJDwnmmruBDGJLLMMMLLJJGDDDDCELOQRRRRRQQMJCyyywwuumrsyGLMOMLAkc<~%@+...    .....+++....+++++@@$&*<cxMQRRRRRRRRRRRRQQOFAoo77pzHNNSSSSSSSSRSSSRRRRRRRRRQOLGyiga:=)@..       ",
+"   ..+@%*;/^]]]]]____}}}[[/^^^^]]]]^[3ajltiiiswDJMQRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSQMGywumruwDGJLMMMMMLJJGDDDDDCELOQQRRRQQMExtsswwwuuruwDELMMMFClb:~%@+...    ....++++++++@@$$$%%&*-:lFORRRRRRRRRRRRQOMAok|||7pIHNNSSSSSSSSSSSSRRRRRRRRQOMJDtga3:{$+.        ",
+"   ..+@%*;/^]]]]]______^^^^^^]]]]]]^^[9gjiiiswyGLOQRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSQLGywuruwBDJLMOOOMLLJGDyyDDDGELMOQQQQQMJxtsssuwwuuuswDJLMMMExj::=%@+..     ...+++@@@$$%%&&****~-:bxFORRRRRRRRRRRQOFAk22))|7pHNNSSSSSSSSSSSSSRRRRRRRRQOLGyia3:=&@+.        ",
+"   ..+@%*;/^]]]]]______^^^^^]]]]]]]_^[3ajiistyDJLORRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSOLGywuuuBDGLMOOOMMLJGDyyyDCGEJLMOQQQQMJCtsnnsuwwwuuwyCJLMMJClb3:-&@+...   ....++@$$%&&*=------;>:jAMQRRRRRRRRRRQOFAk12{))!7vHNNSSSSSSSSSSSSSRRRRRRRRQOJCtg93:~)+.         ",
+"   ..+@%*;>^]]]]______^^^^^]]]]]]]]_^[[9gnistDGJMQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSNNOLGywuwwBDJLMOOOMLJGDBwwyDGJJLLMMOOOMLGysnnruwBwwwuwyGJLLLExj3(>-&@+...  .....+@$%&*=-;>>>>>>>>(alAMOQRRRRRRRQQOLAkl1{)))|pvHNNSSSSSSSSSSSSRRRRRRRRQOMEDsa9(-{@+.         ",
+"   ...+$&->/^]]_____}[^^^^]]]]]]]]]__[[9dgntyCELOQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSNSNROLGywwwBDGLMOOOMLJGDwsstDGJLLLLLMMMMLEDtnnnuwBBBBwwBDGJLLExia3/(;&$+.........++$%&*-;>>////>>>/(atEMOQQRRRQQQOMLExl<1{{))7pHPNSSSSSSSSSSSRRRRRRRRRRQOLGyia3:~)+.          ",
+"    ..+$&->/^]]___[[[[^^^^]]]]]]]]]__[[69gntDCJLOQRRRRRRRRRRRRRRRRRRRRRRRRRQQQRRSNNNSQMLGDBBBBGJLMOOMMJGDwunsyCJLMMMMLLLLLECtsnnswBDDDBBBBDGJJECtb3///;*$+.........+@%&*-;>//////////(atCLMOOQQOOOMLJExlc<<~{{|7vHNNSSSSSSSSSRRRRRRRRRRRRQMJCtga3<{@+#          ",
+"    ..+@&=>/^^]_[[[[[[[^^^]]]]]]]]]___[60dntDGJMOQQRRRRRRRRRRRRRRRRRRRRRRRQOOMOORNNNQOMJGDyBBDGJLMMMMJGDwumnsyELMOOMMLLLJECyssnswBDDDDDBByDGGGCtj93^//;*$+........++$&*=;>>//////>>>/(aixELMMMMMMLJECxlca:<~{{|pHNNNSSSSSSSSSRRRRRRRRRRRQOLGysga:~!+.           ",
+"    ..+@&=>/^^^^[6666[[^^^^]]]]]]]]____}0dntCELMOQQRRRRRRRRRRRRRRRRRRRRRRQOMLFFMOOQQOMLECDBBDDGLLMMMLJDwughgsCJMOQOOMLJEGDysnnnuwyDGGDDByDDCCDtj93^^//;*$+........+@%&*-;>>/////>>>>//3btxCEEEEEECCxtlba::<~~2ozHNNSSSSSSSSSSSRRRRRRRRRRQMJCwna:<)@+# #         ",
+"    ..+$&->/^^^[[6666[[^^^^]]]]]]]]____[0dntCELMOQQQRRRRRRRRRRRRRRRRRRRRQOMJGCCEFMOOMLJGDDBBDGJLLMMLJDysngggtCLOQQQOMLECytsnghnsBDGGJGDDDDDDDyja3[^^^/;*%+.......++$&**-;>>>>>>>>;;>>((9jityxxxxxxttiba3(:<<12pIHNNSSSSSSSSSSSSRRRRRRRRQQLGDsna<{!+.            ",
+"    ..+%=>/^^^[[6666[[[^^^]]]]]]]]]]___[6dntCELMOQQQRRRRRRRRRRRRRRRRRRRRQMJCytyxCEFFJEGDDBBBDGJLLLLJGDwngdgiyEMOQQQOMJCysngddhnuBGJJJJGDDDDyysg9[^^^^/>*%+.......+@%&*==-;>>>>;;---;;>((3aggjiiiiiibaa3((:<<2ozHNNNSSSSSSSSSSSSSRRRRRRRQOLGysb:~)+.# ##         ",
+"    .+$*;>^^^^[[666[[[^^^^]]]]]]]]]]___}60ntDGJLOOQQQRRRRRRRRRRRRRRRRRRQOLCysiistDCCCCDyBBBBDGGJLLJJDBshddgixJMQQQQOLEDtngdddhuBGJLLLLJGDDywsg9[[^^^^/>=&@+.....++$%&**=---;;--=***==;>((333aaabccba:(((>:<12oINNNSSSSSSSSSSSSSSSRRRRRRQOLCyic1{!+## #          ",
+"   ..@&->/^^__}[[[[[[^^^^]]]]]]_]]]_____69gsyCJLMOQQQQRRRRRRRRRRRRRRRRQOMGDwngggiswyyywwwwwBDDGJJJGDyundaaaiCFOQQQQOLEDsndddhuBDJMOOOMLJDDBsgd6[^_]]^/>-&$+.....+@%&***======***&&&&**=;>>((::::::::((((>::1ozINNNSSSSSSSSSSSSSSSRRRRRRQOLCyic2)+.####          ",
+"  ..+%*>/^]]__}}}[[[^^^]]]]]]]]]_]______[0dntDGJLMOQQQQRRRRRRRRRRRRRRRQOLCysndddgnnsssuuuuuBBDGGGGDywnd93abiCFOOQQOOLGDsnghhrwDJMOQQQOMJGysnd6[[__]]^^/;*$++...+@$&**======***&&%$$$%%&*=----=<<<::((((((:blAINNNSSSSSSSSSSSSSSSSSRRRRRQOLGyl1)!'####           ",
+" ..+$*;/^^]____}}[[^^^^]]]]]]]___]_____}[9dnsyCGJLMOQQQRRRRRRRRRRRRRRQOMEDsnddddddhgmnrrruuwBDDDGDBwmd93::bixFOOQQOMLEDwsnnswDJMQQQQQQMLGysg9[[^__]]]^/>=&@++++@$&*=---===***&%$$@@@@@$%&&***~~=<::((((((:ckAIQNSSSSSSRRSRSSSSSSSSRRRRRQOJCk2|!'#####           ",
+"..+$&;>^^]________^^^^]]]]____________[[69dgswyCEJLMOOQQRRRRRRRRRRRRRQOLCyuhd00660ddhhmmrruwBBDDDBwrd03::::ixJMOOQOOLJGDBwwBDJMOQRRRQQOLGynd6[[^___]]^^>-&%@@@@$&*=;;;;--=**&%$@+++++++@@$%%&{*~=-:((((33alxFORRSSSRRRRRRRSSSSSSSSRRRRRQMJCk|!'####             ",
+"++$&->^^]]_____________]_____________[[69ddgnsyDDGJLMOOQQRRRRRRRRRRRQQLEDsmdd0666600ffhmmruuwBBBBwrh03(:-<<cxEMOOOOOMLJGDDDGJMOQRRRRRQOLCyn96[[[^___]^^/;*&$$$%&*-;>>>;;;-**&$@++......++@$%%&{~~<::(333aixEMOQRRRRRRRRRRRRSSSSSSSSRRRQOMAk2!'### #             ",
+"@%*;>^^]]___________________________[[6dggnnsswyyDGGJLOOQRRRRRRRRRRRQOLDBrhd0666[660ffhmmrruuuwwumh03(:-==<ckELMOOOOMMLJJJJLMOQRRRRRRQOLCwn93[[[[[^__]^/>=*&%&&*-;>>>>>;;-*&$@+..........+@$)){{~<<:aaagitCJMOQRRRRRQRRRRRRSSSSSSRRRRRQMJxk|!'##                ",
+"&=;/^^]]___________________________[[9gnsssssswwByDDGJMOQQRRRRRRRRRQOLGysmhe066[[[60ffhmmmmrrrmmhf03(>;===<cyGLMOOOOOMMMMMMMOQRRRRRRRQOLCtna936[[[[[^^^/>-*&&&*-;>>>>>>;;=&%@+.....    ..++@$)){211cccityCJMOQQRQQQQQQRRRRRRSSSSRRRRRQOFCl2!'##               ..",
+"->//^^________^____________________[9gsyDDDyywwwwwBDDJLMOQQRRRRRRRRQOLDBuhfe06}}}[60fhhhmmmhhhff033((;-===<cyGLMOOOOOOOOOOOQQQRRRRRRRQOLCyjggadd996[[^^/>;****=;>>>>>>>;=*%@+....       ..+@!!))|2kkkkxDGFMOOQQQQQQQQQQRRRRRRRRRRRRRQOLEt1|!'#               .+@",
+"(((/^^[[}}[^^^^___________________[6gsCEJEGCDywwsuwBDGJLMOQQRRRRRRQOLGDwrhee066}[[60dhhhhfff0063(((>>;===-:cyGLMMOOOOQQQQQQQQRRRRRRRRROLGytsjjnnng96[[//>;**&*=;>>>>>>;=*&$+....        .+++!!!!||ooCAEFMMOQQQQQQQQQQQRRRRRRRRRRRRRQOMExl1)@.               .+@)",
+"ba93[[[6[[[[[^^^__________________[dsCJLMMLJGDywsswwBDGJLMMOQQRRQQOMLDBumhee066}}660dhhhdd0633(((>>;-=~==-:ixGJMMMOOQQQQRQRRRRRRRRRRRRQMJCyyyyyttng96[//>-*&&*=-;>>>;-=*&$++...         ..++!!!77ppzzFMOOOQQRQQQQQQQQQRRRRRRSRRRRRQOMLCtc1)+.              .+@)~",
+"xtingdddd066[[^^_________________[0gyEMOOOMLJGDBwsswBDDGGEJLMOQQQOOLJDwumhee866}6600dddd0663((>>;;-=***=-:bixELLMMOOQQRRRRRRRRRRRRRRRRQMLECCCCCDysgd6[//;=*&&&*=;;;;-*&%$@+...         ...+@@!!77pzzFIOOOQQQQRQQQQQQQRRRRRRSRRRRRQOOLExi:~)+.             ..@)21",
+"JECyttsnngd96[[^________________}[9sCLOQQQOMLEDywsuswwBBByDCJMMOOOMLGywrmhee066666099d9033((>>;;-==****=;:btCELLMMOOQRRRRRRRRRRRRRRRRRQOLJEGGEGCysg9[[/>;*&%%%&*=--=*&%$@+....         ..+@@!!!77pzFIOOOOQQQQQQQQQQQRRRRRRSSRRRRQQOMJCtb:~$+.             .+!|2o",
+"OMLLECDytsgd3[[[________________[6dtEMOQQQQOLJCywsuuuuunnnntxELMMLLEDywrmhee006666699333(((>;;-==*****=;:3gtCELLLMOOQRRRRRRRRRRRRSSRRQOMLJJEGGCDtn9[[//>=&%$$$%&***&&%$@++....        ..+@@$))||opzFIOOOQQQQQQQOOOQQRRRRRRSRRRRRQOMLExja<&@+.            ..+)|oF",
+"RQQOOLJGDtna96[[_______________[[6gtEMOQQQOOLJCywsrnmhhd999ajtCELLJGDywrmmee80666[66333/(>>;-===***==-;>(3iyCJJLLMMQQRRRRRRRRRRSRSRRROMLJGGGCDysn9[[^/>-*%@@+@$$%&&%$$@++....       ....+@%&*~22kAEFMOOOOQQQOOOOOOQQRRRRRSRSRRRQQOMFCtb:~$+..            .+!|oFI",
+"RRRRQOMJGxig93[[[}__________^^[[[6dsCJMOOOOMLGDwsnmhhd06[[[39jtCEEGCDywummhee0066[[[[//(>>;-======-;;>>(3asyGJLLLLMQQRRRRRRRRRSSSSSROMJECDDyttjg9[[^//;*%@+++++@@$$$@@+++....     .....+@%*=-:<ckCEFLMOOOOOOOOMMOOQRRRRRRSRRRRRQOMLExlc~)@+.            .++!pINN",
+"SSSSRROMFxtgd96[}}}______[///////33glxEFLLLJGywsghdd06[[[^^/[9jtCCCDDywurmhff0066[[[///>>;-=====-;>>(//[3gtCEJLLLLOQQRRRRRSRRSSSSRROFEDytsnngg9[[^^^/>=&@++....+++++++++..... .. .....++$&=;>(actCEJLLMMMOMMMLLLMOQRRRRRSRRRRRQOMMFClc<{@+..            .+!7INSS",
+"SSSSSSQOFCtja9066}}}}}_[/////((>>((:bilkxxxytigdd0066[[/^^^^/3ajtyDDDyBwurmhhd006[[////>;;-===-;;>////[6dsDGJLLLLLOQRRRRRRSRSSSSSQIExljggdd96[[[^^^^>-&$++.......+++++++......  ......+@%*;>((ajtCCEJLLLLLLLJJJLMOQRRRRRRRRRRQOMMFAtc<~$+..           ..+!7zNSSS",
+"SSSSSRROFAxigd9066}}}[[//(>;;;------<<<<1cccaa33333[[[/^^^^^^[9gttyyyyBywwummhd06[[////>;;----;>>//[[[3dnyCJLLLLLMOQRRRRRSRSSSSSQFAlba336[[[[[__]^^>-&$++.........++++@++.............+@%*;(/39jtDCGGEJJJEGGCCELMOQRRRRRRRRRQOMFECxib<{$+..           .+!7pHSSSS",
+"SSSSRROOFAxtjgdd066}[[/(>;=********~~~~~~~<<::(((///////^^^^^/3ajsyyyDDDyywurnd96[[////>>;;;;;>(/([39dgntCELLLLLMOQQRRRRRRSSSSRQIClb3([[[[[^__]]^^>;*$++..........++@!!!@++...........+@%=;//3aitDCCCCCDCDDyyyCJMQRRRRRRRRRQOMJExtjb:=&$+..         ..+@!pINSSSS",
+"SSRRRQOMMJECysnhd06[[/>;=*&%%%&&&&&****{{**~=-;>>((//////^^^^^[9gstyyDDDDDyBsng93[[////>>>>>>>((33agjstDCELLLLLMMOQRRRRRRSSSSSOIxla((/^^^____]]^^>;*$@+.........++@!)))))!@++.........+@%*;(/3aiyDDDDyyBwwtstyCLOQRRRRRRRRQMLECxtjb::=&@+....     ...+!|oINSSSSS",
+"RRRQQOOOMMLJECyshd93(>-*&%%$%%%&&&&*&*&&&&&**==-;>>>>////^^^^^[9gjtyDDCGGGDywsg96[///////(>>(((39gitxCGELLLLLMMMOQRRRRRRSSSSSOFCla((/^^^]]]]]]^^>;*%@+.........+@$){22222{)$@++.......+@%*;>/3gsyDDDywwunnnisyELOQRRRRRRRQMFECxtjba(:=&$@+.........+@!|ozNSSSSSS",
+"RQQOOOOQQQOOMLGysh93:-*&%$$$%%&&&********&*****=-;>>>///^^^^^^[3gjtyDCGGEGGDysg9[[///////////[39gtCEJLLMMMMMMMMOQRRRRRSSSSSSQMAla3(/^^^]]]]]]^^/;*%@+........+@$&~1<1lcc<<~{%@+........@%*;>(3gsyDDywsnmhhgntxEMQRRRRRRRQOLECxtiba3(:=&$@++.....++@$)2kzIRSSSSSS",
+"OOOOOQQRRRQQOMLCyia:;~*&%%%%%&&**=====********==-;>>>//^^^]]]^[3antyDCGEEGGDysd9[[[[[[[[///[[69gtCJMOOOQOOOOMOOQRRRRRSSSSSSRIAkb3(/^^^^]]]]]^^/>=&$+.......+@$%*=::bbbcb::-~&$@+.......@%*->(3gsyyyBsnhdddgiyELOQRRRRRRRQMJCxtljba3(:-*%$@+++++@@%&~1kAIRSSSSSRR",
+"MMMOQQRRRRRRQOMExia:-~*&&&&&&**=--;;;;;---====--;;>>/^^^]]]]]_^[9nsyDGGEEEGDwnd6[[[[[[[[[[[669gsDEMOQQRQQQQOOOQQRRRRSSSSSNNIzkc33/^^^^^]]]]]^/>-*%@+......+@$&~->((33aa3(:-=*%@+.......+$&=;(3gsyywsnhd09djtCJMOQRRRRRRROMExtiija33(>-~&%%$$$$%&*=-:lAIRRSSSRRRQ",
+"FLMOQQRRRRRRQQMExib:-=**&***==-;;>>>>>>>>>>;;;;>>>//^^]]]]]]]_^[9nsyCGGEEGCysg9[[[[[[6660600dgsyELOQRRRRRQQQQQQRRRRSSSSSPPHzo1:((//^^^^^]]^^^/>-*%@+......+$&=;>(((333((>;-=&%@+.......+$&*->3aitssnhd069diyELOQRRRRRRRQOLExtija93((>;-=*&&&**=-;>(cxFORRRRRRQQO",
+"EFMOQRRRRRRRQOFCtc::-=~****=--;>>>>///////////////^^]]]]]]]]]__[9gsyCGGEGCytnd6[[[[60dfdhhdhmsyGLOQRRRRRRRQQQQRRRRRSSSNPKKv7|1:((/////^^^^^^//>-*%@+.....+@%~;>(/////((;-=~*&%@+.......+@%*-:(aninnd06669gtCJMOQRRRRRRRQOLCytjga33(/(>>;;--;;>>//3bxFOQRRRRQQOMF",
+"CELOQQRRRRROMFAklc:-=~*****=-;>>>///^^^^^^^^^^^^^^]]]]]]]]]]]]^[9gsyCCGGCDtsd96[[[60dhmrrmmruwDJOQRRRRRRRRQQQQRRRRSSSNPKq54'!{=;>(//////[[[[(/(;=&%@+...+@%*->((/[///(;-**&&%$@+.......+@%*=;:agggd06[[39gtCLMOQRRRRRRQOMEDtiga33(/////>>>>/////3bxEMOQRRQQOMFEC",
+"xEFMOQQOOOIFAolc<<<~~*&&&**=-;>>//^^^]]]]]]]]]]]]]]]]]]]]]]]]]^[3gsyDCCCDtsgd06[660dmuwwwuwwBDGLOQRRRRRRRQQQQRRRRSSNPKqq5,,'@){=;>(((33aabbbaa3::~&$@+++@$&=:(333[[/(>-*&%%%$$@++......+@%*=;(aagdd3[[[39gtCLMOQQRRRRRQOLCyiga33[////////^^^^^[3btEFOQQQQOMFAxtl",
+"tCEFMMMIFAokk211~~~{&%%%%&**-;>/^^^^___]]]]]]_________]]]]]]]]^^[ajtyDyytsgd906600dnuwBBBBwByDJMQRRRRRRRRQQQQQRRRSNNHq5,,##.+@%*-::abblxCCACxtib:<{%$@@@%*=:33aad333(:=&%$$$$$@@++.....+@%*=;:3ada33(/(39jtCJMMOQQRRQQOLGysga93[///^^^^^^^]^^[3btCFMOOOOMFAxijba",
+"ltxCAAAoo||22{{{{{&%%$$$%&*=;>//^^______]]]]]__[[[[[^^_]]]]]^^^^[9gjtttsngd99000dhnuBDDDDBBBDGLOQRRRRRRQQQOOQQQRRNHv5,,### ..@${~<cltCFMMOOMMExic1{)$$%&~-:abnjijga3(:~&%$$$%%$$@+++..+@$%*=;::aaa3((((39jtCEJLMOQQQQOLEDsg93[[/^^^^^^^]]]]^[3gtCEMMMMMFExlja999",
+"jjllll22|{))))))))%$$$$%%&~;>//^_______]]]]]__[39999[[^_]]^^^^^^[3dgnnggd990090dhnsBDDDDDDBDDJMOQRRRRRQQOOMMOOQOOIv4,###   ..+${1clxEMOQQRRQOMEyi1{))%{=::aityxxttja::={%%%%&&&&%$@++++@%&*=-:::a:3((((39gsyDGJLMOOOOLEDsg9[[^^^^^^^]]]]]_^[3gtCELMMFFECxja99339",
+"9aaab<1{{))))))))))%%%%&*=;>//^_________]]]__[9ajjjg93[^^^^^^^^^/[39dd99666609dhnswBDGGGDDDDGJMOQQRRRQOMLLLLMMMMzp4'##     ..+${1lkAMOQRRRRRROJx22{)&*=:agtxCCECCxtja:=~&&&&*****&%$@@@$%&*~=<<:::((((33dgityDGJLLLLLGDsg9[[^^^^^^^]]]]]_^[9gtCEJFFFECxtja9936[6",
+"333(::=~~{{{{{{{{{{{{*~=;>(//____}______]]__[6ajttttj9[[^^^^^^^^/[[6366[[[[660dgnsBDDGGGDDDDGLMQQQQQQOMLEGCCCECoo7'##      ..+${<cxEMQRRRSSRROzo||){{=:agtCEJLLJECxlb::==~~=--;;;-=*&&%&&*~~~<<<:::(((33dgnstyyCGEEGCynd6[[^^^^]]]]]]]__^[3gtxEEEEACxtjga999666[",
+"[[(/(>>;;---<<<::<:-:::((/[[}}}}}}_____]_]__[9nsyyytja3[^^^^^^^^/[[[[[[[[[[60dhnuwBBDGGGDDDCGLMOQQQQOLECyttttll2)!'.       ..@%~:ctEMQRRSSSRRIzo2{{{~::gtCELMMMLLECtb::;--;;;>>>>>>;-=~~~~~~~~1<<::((333dggnnswyDDDysnd6[[___]]]]]]]___[[3aitCAACxtljbaa99999936",
+"[[///////((333aa93333333[[}}}}}}}}_____]]__[[djtyyysnd6[^^^^^^^^^[[[[[[[[[[60dhnuuwBDDDDDDDGJLMOQQOMLGDsjgaac1{)++..      ...@%~:aiAMQRRRRRRIzo22{{~::btCJLMMMMMLECtb:::>>>>>////^//>>;;--=~~~11<::33339dghggnsswwsng96[____]]]]_____[[[3ajtxxCxklcbaa9dddddd996",
+"[[^^^^^[[[69dddhddd00066666}}}}}}}____]]]__[6dnswwsnh9[[^^^^^^^^[[[[[[[[[[[60dhmuuwBBBDDDDDGJLMOOOMLGyja93(:~{!@+..       ..+@&=>3bxFOQRRRROIAk2~~<::btCJMMOOMMMMEClc:(>>>////^^^^^^///>>;-=~~11<::33399dddhhgnnsnng96[[^___]]___^[[[[69agittkkllcbaaaddhhhhhd06",
+"[[[[_[}[660dhmmmmhhfee0008888}}}}____]]]]__[6dgnnngd06[__]^^^^^^[[[[[[[[[[60dhmrruuuwwBByyDGJLMMMMLGyja3((-*%$++..        ..+@&->(atEMOQQOOFAk1<<::abtCJMOOOOOMMLExlb:(((////^^^]]]^^^///>:-<111cba3999ddddhhhnnngg96[[________[[[699dgggjiiliccc:aadddhmmnmhd06",
+"[____[}60dhmmuuurmhfeee8888888}}____]]]]]__[60dhhdd06[___]]]^^^[[66[[[[[[[60dhmrrrruuuuuwwyCELLMLJGysa3((-*%@+....        ..+$*;((3jxJMMMMExlc::((3aiCJMOOOOOOMMFExia:(((///^^^^]]]__^^//((:<<<cbaaddddddhhhgnnnngd96[[______[[69dnnjjiijjcccc<<::addhmmrrrmhd06",
+"____}}60ffmuuuuurmheeee888888}}}___]]]]]]__}60000066}____]]]^^[[600666[[[60fhmrrrrrrmmmmrsyCELLLLGDsg9[/;~%@+...         ...@&=>//3aixEEAxtca3((33diyEMOQQQOOOMMJCtb:(((////^^^]]]]___^^//((:<ccbggggggnnnsssssssnd06[[[___}[60gntyyyttijcbc<:::a9ddhmrrrrmhf066",
+"__}}}600dhmuuwuurmheee888888}}}____]]]]]____}66066}}____]]]]^^[60ddd066600fhmuuurrmmhhfhhswCELLLEDtg93/(-&$@+..         ...@%*;///[3ajltiba33(/[39gyGLOQQQQQOMMLExib:(((////^^^]]]_____^^/((::bbcnnsssstyyyDDDyysngd006}}}}}0dgsyCCCCxticb<::::30dhhmrrrrmhf06}}",
+"___}}60fhmuuwwurmhfee088888}}}____]]]]]]____}}}}}}}____]]]]]^[60dhhdd0000dhrswwurmheee0ddntDGJJECyja3[/>-&$@+...      ...+@%*;///^[[[999933[/[[[6dsDLOQQRQQQOMLJCtja3((/////^^^]]]_____^^[(((:abnitwyyDCGEJJJJGDysnhdf006600dmsyCGEECylcc:::::300fhmrrrrmhe06}}_",
+"___}}60fhmuuwuurmfee00086}}}}}___]]]]]]]____}}}}}}_____]]]]_^[0dhmmhdd0ddhnwBBwwrmhe0000dntCGJJEDtj93[/>-&$@+..... .....+@&=>///[^^[[[[[[[^^^[[6dnyJMQQRRRQQOMLExlba3((////^^^^]]]]]]__^^[/(33agisyyDGEJLLMMMMLGDwsnhhfffefhmsyCGEECxlcb:::(3300femmrrmmhe06}}__",
+"____}60fhmuuuurmhf000666}}}}}____]]]]]]]____}}}}}______]]]__[60hmmmmhdddhuwyDyBumhe06660dntCEJEGytg93[//;*&@++........+@$*->//[[[[^^^[[[_^^___}0hBGMQQRRRRQQOMLExib33(////^^^^]]]]]]]__^^[/(3aansyDCGJLLMOOOOOMJCywurrmmhhhhnsyDCCCxlca::(33660eemmmrmmhe06}____",
+"____}}0dhmuuuurhd00666}}}}}}____]]]]]]]]___}}}}}_______]___[[6dhmmmmhhhmuwyDDDBumf06}}60dsyGEJECytg93[//>;*%$@+++++++@@%*;>/[[[[[[[^^^_______}6duDLOQRRRRRQQOMJCtja3(////^^^^]]]_]]]]___^//(3agsyDCGJLLMOOQQQOMLGDBwwwurrmmmnswyyytiba33336660eemmrrrmme06}}____",
+"____}}0fhmuuuumhf0066}}}}}}____]]]]]]]]____}}}}____________[}0fhmmmmmmnuwDCGGDBrh06}}[69gtCEJJECytg93[[//>;*&%$@@@@@@$&*;>//[666[[[/^^______}6fmBJOQRRRRRRQOMLGxia3((///^^^^^_____]]]___^^/(3aitDGJJJLLMOOQQQOMLGDDyyBwwuurmniiiicba:33336660eemmrrrrmhf06}____]",
+"____}}00hhnrrnhd006}}}}}}}_____]]]]]]]_____}}}}__________[[[60fhmmmmmnsyDGJJGDwnd6}}_[69jyCEJJECytja9[[^^/>;=&&%$@@$$&*;>//[[6663////^___}}}60hwGLQRRRRRRRQOLECtg93(///^^^^^_____]]]]]]]^^/(3atDGJJLLLLMOOQQQOMLGGCDDDDBwunnggaaa::(((3[[660eemruuwuumhf06}____]",
+"___}}60dhhnnnhd0066}}}}}}}____]]]]]]]]____}}}}}_______^[[[[600fhmmmmrswDELLLJDwh06}_[[6atxEEJEECytjg9[[^^//>-*&%%$$$%*=>///[6633(((/[[}}}}60fmuDLOQRRRRRRQOLECtg93(///^^^^^______]]]]]]]^^/(3btCJLLLLLLMOOQQQOMJJGGGGGDDBwngaa::::((([[[660efmrwBBBBwrh06[[____]",
+"___}}60dhhnnhhd0666}}}}}}}____]]]]]]]____}}}}}}}____[[[[[6600fhhmmruswDELMMLJCsh0[[^[[3gtCEEEEGCxttga9[[^//>;*&%$$$%&*;>/^/[333((((//[[600dhuwDJOQRRRRRRQOMJDtg93(/////^^^]______]]]]]]]^^//3cxGJLLLLLLLMOOOOMLJJGGJJGGDysic:::::((([[[660ehmuwBDDDywnh06[[____]",
+"___}[60ddhhhhd0066}}}}}}}_____]]]]]]____}}}}}}}}}_}[[[6999ddhhhmruuwBDELMOOMLGwg0[[^[[9jtCEEEEECCxtjg9[[///;=*%$$$$%&=>//^[[[3((>>(([66dhnwyDJLOQRRRRRRRQOLCtn93(//////^^^]_____]]]]]]]]^///3bxGJLLLLLLLMOOOOMJJGGGJJGGDBic<<:::((([[[60efhruBDGGGDysnd6[[[_____",
+"___}}60ddhhhdd0666}}}}}}}____]]]]]]____}}}}}}}}}}}6699ggnnnsssswwwyyDELOOQQOMEyn9[[[[39jtxCCCCCCCxtsg93[(/>-*%$@@@$&*->/^^^[///(>>(/[6dnwDGLMOQQRRRRRRRRQMJDjd3[///////^^^]]____]]]]]]]^^//((bxGJLLLLLLLMMOMMLJGCCGGGGDysic<:::((/[[660fhmuwDDGJJGDysg9[[[______",
+"___}}00ddhhdd006666}}}}}}____]]]]]____}}}}}}}}}}6609gnstyyDDDCDDDCGEJLOQQQQQOLDsd3[[[3ajtxxCCCCCCxyig93((>-*%$@@@$%&=>/^^^^^^///////6dnyGLOQQRRRRRRRRRRRQMEyg93(/((/////^^]_____]]]]]]]^^//((cxELLLLLLLMMOOMLJGDDDDDDDytic<::>(//[[60fhmuwBDGJJJJGysg9[[[______]",
+"__}}600dhhhdd00066666}}}}____]]]]____}}}}}}}}}}609dnstDCEJJLLLLLLLLMMOQQRRRQOMGtg93339ajittxxxCCCxtib33(;=*%$@@@@$&=;>/^^^^^^^/////[0myJMQRRRRRRRRRRRRRRQLGtg3(/(>>////^^^]_____]]]]]]^^//>>:lxJLMMMMMMMOOOMJGDwssswtttic<::((/[[[6dhmuwBDGJJLLJGDwn9[[[______]_",
+"__}}60ffhhfdf00006666}}}_____]]]]____}}}}}}}}6600dnsyCELMMOOOOOOOOOOQQRRRRRRQMJyia93399gjjiltxxCxysja::-~&%$@@@@$&*;>/^^^^^^^^^^^^[6hwJMQRRRRRRRRRRRRRRQQMCta3(((>(////^^]_______]]]]]^^/>>>:lCLMOOMOOOOOOOLGDtingniiiicc::((/[[60dhuwBDGGJJLLJGCynd6[[_____]]__",
+"_}}60fdhhhfff00000088}}}_____]]]____}}}}}}}66600dnsyCJMMOQQQRQQQQQQQQRRRRRRRQMJxia999999aaajityyytib:<~{%%@@@@@$&*;>/^^^^^^^^^^^^^[dsGMQRRRRRRRRRRRRRRRQOLCta3((((///^^^__________]]]]^//>;:bkEMOOOOOOQQQOMJCticaaacciccb:3([[[60hnwyDGJJLLLLJGDysd6[[______]___",
+"}}}60ffhhhfffe0000086}}______]]______}}}}}6000dhnsyCJMOQQRRRRRRRRRRRRRRRRRRRQMExja933333339ajistiib<<~{%$@@@@@$&*;>/^^^^^^^^^]]]_[9nCMQRRRRRRRRRRRRRRRRQOLCtb93((((//^^____________]]]^/>;;-ckFMOOOQQQQQQOMExl1<:::ccccba336[60dhsyCJJLLLLLLJGDysg9[[___________",
+"}}60efhhhhffee008086}}_____]]]_______}}}6600dhnstyCJMOQQRRRRRRRRRRRRRRRRRRRQOLCta93333[[3333abjjbb<1{)$@@@@@@$&*->/^^^^^^^^^^]]]^[gCLQRRRRRRRSSSSRRRRRRQMExtga99333[[[[____}}______]]^^/>;-<1kFMOOOQQQQQOOFAk21<<::acccgad9099hnwDGLMOOOMMLJGDBwnd0[[___________",
+"}800ehhhhhfeee0806}}}}__^^^]]]]______}}600dhnssyDEJMOQQRRRRRRRRRRRRRRRRRRRROMEtb933(///////3333a:<~{!@@+++@@$&*->/^^^^^^//^^^]]^[atLQRRRRRRSSSSSSRRRRRQOLExtjbggggad966[}}}}}}_____]]^^/;-==1kEMMOOOOQQOOMzo211<:::aagggggddhnsyCJMOOQQOOMLJGDwuhd6[[___________",
+"880ehhhhhefee0066}}}[^^^^^^^^^]]____}[60dhgnsyDGJLMOQQRRRRRRRRRRRRRRRRRRRQOMEtj93((/(//////((((:<~)!@++++@@$%*->//^^^^/////^^]^^3sEORRRSRRSSSSSRRRSRRRQMJCytiiitstsjndd0066}}}______]^//;-==<kCFLMMOOOOMLEok21<<:::adgnnnggnstDGLMOQQQQQOOLJDBunhd06[[________}}",
+"88eeehhheee006}}}[[/////>////^^^^^[[[60dgnstyCELMOQQRRRRRSRSRRRRRRQQQQQOOMFCtba3((((>>(//////(:={)@++..++@$%*->>/^^^//>>>//^^]^[axMQRRSRRSSSSRRRRSRRRQOLExttittyyDDytsnhdd006}_____]]^//>-==<lxGJLLLMMMLEok11<<::(3ddhnnnnswyDELMOQQRRQQOOLJDywnnd066[}_____}}}}",
+"88eeeeefe066[[[[////>>>;;>>///^^^[[[9dgnstyDCELMOQRRRSSSSSSSRRRRRRQQOMMLJCxlba::::::;>>(////(>-*%@++..++@$%*->>//^///>>>>>/^^]^[jEORRRSRSSSRRRRRRRRRQOMExttistyDCCCCCyyssnhd06}____]^^//>;-<<itDGGEJJJECxk11<-::(330dhhnuswyDGLMOQQRRRRQQOLJDysnndd066[[[}}}}}}}",
+"88eeeee066[[[////>>>;;-;;;>///^^[[[9gnsyDCCGJLMOQRRSSSSSSSSSSRRRRQQOMLGCylccc:<<<<<-;;>/////>;~&$++...+@@%*->>//^//>>;--;>/^^]^3tLQRRSRRRRRRRRRRRRRQOMExtjnnistyDCGGGCDyywshd6[___^^^///>;-<<clyDDCCCCxyl11<=;:((360ddhmnsyDGJLOQQRRRRRQQOLGDysnngd9066[[}}}}}}}",
+"8800066[[[////>>>;;----;;>(///^^[[9gstDCGGJLMOQRRSSSSSSSSSSSSRRRRQOMLGDtic<1111111<-->>/////>-*%@++..+@@%*->>/^^//>>-===;>/^]][9yMQRRRRRRRRRRRRRRRQOLEDsnggdgnswyDGGGGGGCDysg06[^^^^^///(>:::cityyDDyytic1<=-;>(/36660dhnsyDGLMOQQRRRRRQQOLGywsnggd9966666}}}}}}",
+"}}}}}[[////(>>;;;-----;>>/////[[[6dntyCGJLLMOQRSSSSSSSSSSSSSSRRRRQOMJCyic<1222|221<<:>//////>-*%@++++@$%*->>/^^^//>-***=;>^]]_[axMQRRRRRRRRRRRRRRQOMJDtndd0ddhnuwyDCGGGGGCDynd6[^^^^/////(((abittyyyttic<<~=-;>(/[[6600dhnwyGJLMOQRRRRRQOMEDwnnggdd99666666}}}}}",
+"___[[///>>>>;;;-----;>>/////^/[[[6dnsyCEJLMOQRSSSSSSSSSSSSSSSRRRRQOMJDtic122|oook1<:(///////>-*&$@@@@$%*=>>/^^^//>;=***=;/^]]_[gxMQRRRRRRRRRRRRRQQOLGyshd0000ddmmuwyDGGGJECysg9[[^^^/////((3agistwwssic<<~~=->(//[[}}660dhswDGJLOQQRRRQQMLCtngdddd999666666}}}__",
+"^^^//(>>;;;;;;----;;>///^^^^^^[[[0dgsyDGLMOQRSSSNNNSSSSSSSSSSRRRRQOMJDti112|ooooklb((/^^^^//>;-*&%$$%&*->>/^^^^//>-****=>/^]__[gxLOQRRRRRRRRRRRQQOMJCwnd0000000fhmrwBDGGJJGDtnd6[[[[[[[[[339agissssincc<~~~=;>(/[[}}}}660dgswyGJMOQRRQQOLCtnd9909999966666[}____",
+"^//>>;------;;;;;>>>//^^^^^^^^[[[60hntyCLMORSSNNNNNSSSSSSSSSRRRRRQOLExli1122kokklca3/^^^^^^//>;-=*&&*=->//^^^^//>;-***=;>/]]__[gyLMOQQRRRRRRRRRQQOLEDtnh00000000fhmuwBDGJJGDynd9[[[[[[66639agiisssinga:<~**=;>//[}}}}}}660dnstDGLMQQQQOLCtg96[[[66366[[[[[[____]",
+">>;;-=***=-;;>>>>///^^^]]]__^_}}}60dgsyGLOQSSNNNNNNSSSSSSSSRRRRRRQOLCxlcc<1lllllba3[^^^_^^^^///>;;---;>//^^^^^//>;-==-;>/^]]__6gyELOOQQQQQQQRRQQQOLECtsgdd000000ffhmuwDGGJGDysg99660999ddagjisttsinga:<~{{*-;(/[[}}}}}}}60dhnsyCJMOOOOLCtg9[[[[[[[[[[[[[[[^_^^^^",
+"-==******=;;>>///^^^^]]]_____}}}}60dgsyEMOSNNNNNNNSSSSSSSRRRRRRRQOLExlibbbbbccbb93[[^___]^^^^^////>>>//^^^^[[[//>;;;;>>/^]]___6dtGLLMMMMOOQQQRQQQOLECysngddddddddfhmuwDDGGGDysngdgggnnnnniistyytsngaa:~{&{~->//}}}}}}}}}00dhnwyCELMMMFAtb3((////[[[[[[[[/^^^^//>",
+"**&&&&**=;>///^^^^^]]_____}[[}}6600hsyCLOQSNNNNNNSSSSSSSRRRRRRQOMLECticbaaaaaa933[[[^____]]^^^^^^^///^^^[[[[[[/(>>>>>//^]]]___6dsDGJJJJLLOOQQQQQQOLJGDtsnngnnnnnnnmuuwyDGGGDyssnnsswttttttyxCCCxtiga:<{%%&~;(/[}}}}}}}}60fhnswyCELLMFAxl::>>>>>(((((((/////>>>;;",
+"&&&&&**->>//^^^^]]]___^[[[6600000dhnyCLMORSNNNNNSSSSSRRRRRRRQOOLJGxxtijgaa99933[[[[[____________]]^^^^[[60dd063(((>//^^]]]____6dnyDGGGGJLMOQQQQQOMLJGCytsssstyyywwwwwyDDGGCDyywwyyDDCDCDDCCEEEECxtcb<{)%%&~;(/}}}}}}}}800fmuBDCEJLLLFAk1<--------;:::::::;;;--=*",
+"****=-;>//^^_________[[[09dhhhhhhnsyGLMORSSSSNSSSSSRRRRQQQOOMLECDxytttsigga993[[[[[_________________[[0dgusnnd3((///^^]]]_____60nuBDDDDGJLOOQQQOOMLJGCytstyDGGGGCDyyyyDDGGCDDyyDDGEEEEGGGGELLMLJCxic~))$%&=>/[}}}}}88880ehuBDGJLMMMMFAk11=========<<<<--======~*",
+"--;;>(//^^__________[[9answtwwwwwyDGLMOQRRSSSSSSSRRQQQOOMLLECDytttyxDDxytijgd93[[[[[_______________[60hsByDysnd3(//^^]]_______}0huwBBBDDGLMOOOOMLLJEGCyttyCELLLLJEGDDDDDCCDDDDDCGJLLLJEGGEJLMMMMJCk1{)!$%{->/[}}}8888880fmwDGLLMOOOOMAok1<======<<<<<<111<<=----",
+"((////^__}}_______[[[9ntDCGEEEGGGJLLOOQQRRRRSRRRRQOMMLJGCDytsiiisyDGEEGCCytjga996[[[[___[[[[[[}}_}}6dmwDGJGCysg33/^^]_________}0hmuwBBDDGJLLMLLLJEGCDyttyCELMOOMLLJGCDDDCDDDDDGGJLLLLJEGGGJMMOOOLAk2|!!!%*;(/[}}6688880efuyGLMOQQQQOOFAkc<<::::::<c111l111<::>>>",
+"[[[[}}}}}}}______[[6ajxGLLMOOOMMMOOOQQQQQQRRQQQOMMFECxtsnnggagjiyCELLMLLECytsngd99[[[[[[[[66666}}}6dmwDJLLLECtg93[^^__________}0dmuuwBBDDGJJJGGCCDDyysssyCJMOOOOMLJGCDDCDGGGGGGJLLLLLJGCCCELMOOOMFo|!!!!)~;([[}}68888800hsDJMOQQRRRROOFCtca3333aacitkxCCxkiba333",
+"[}}}}}}}}}}}____[[3ajxEMOQQQQQQQQQQQQQQQQQQQOMMLECxtiga993399gixGFMOOOOMLJGCytjng9966[6660dddd0000fhuDJLMMLJCtg93[^^__________}6fhrruwBBDDDDDDBBwwwssnnstCLMOOOOMLEGCDDCGGGGGGJJLLLLJGDyyDCLMOQOOFA77!!!&=>([[}688866660hwCLOQQRRRRRROMJCwngdddgitxCEFFFECxigd66",
+"6}}}}}}}}}}}}__[[3aixEMOQRRRRRRRRRRRRQQQQOOMLLGCytjg93[[[[[3aixEMOQQQQOOMLJECytsjgd9999ddgnnnmhdfdhuyGLOOOMJDla3[^^____________60hmruuwBBBBBwwuuumnnhhhnwCJMOOMMLEGCDDDCGGGGGJJJLLLJGDywttCEMOOOOIzp7!!){<((66600086}}60hyGLOQRRRRRRRROMJDysnnnswyGJLMMMLECtnd00",
+"666}}}}}}}}}}}}66ajtAFOQRRRRRRRRRRRRRQQQOOMLJCytjg93[[[//[3aiCFOQRRRRQQOOMLJECytsjggdggnswByBwummmuBGLMOOOLExia3[^^____________}0fhrruwwBBBwuummhhhhddhnsyGLLLLJECyyyyDDGGGGGJJJJJJGDyssnsyEMOOOOIzp77!)~:(360000006}66dnyJMQQRRRRRRRRQOLGDBwsswyDGLLMMLLGDsgd00",
+"666}}}}}}}}}}}60dgtxEMORSSSRRRRRRRRRRQQQOMLJGysnd9[[////((alCMORRRRRRRQQOMMLJECysjnggnswyDCGDDBwwwBDJMOQQOLGtg33^^_________]]__[6fhmruwByyBBurmhfff000ddnsyCGGCxytssswyDGGGGGGGJJJJDywnggntCFOOOOIIpp7|21:addhhhhf00660hwCLOQQRRRRRRRRQOLJDBwwuwBDCJLLLJGDwnd006",
+"8888}}}}}}}}6600gjxCFINNSSSSRRRRRRRRRQQOOMLGDynd93(/(>>::blAIRSSSSRRRRQOOMMFJECytsnnnstDCEJJJJGDDDGJMOQQQOLCta3[^^______]]]]]^^[6fhmuByDGGDDwumhd0006600dgnstssnnggnswyDGGGGGGGGGGDDwngddgtCJMOOOIIvpp721innssuurmhd00hsDJOQQRRRRRRRRRQOLJDBwuuuuwyDGEEGDwnh0000",
+"66888888888800dhntxEFINNNSSSSRRRRRRRQQQOOMLGDsgd3((:--=<<kAINSSSSSRRRRQOOMFFJECxtsnnswyCELLLLLJJGJLMOQQRQOLCia3[^^______]]]^^^^[6dmsyDGJLLJGDwnhd066[[[[6699999999dgnsyDGGGDDDDDDDywuhd99aixEMOOIIIzppookyyDDDDDyysnnnsyEMQQRRRRRRRRRRQOLGDwurmmmuwyDDDDysnd0000",
+"088888888800edhnsxCEIINNNNNRRRRRRRQQQQQOOLJGysg3(:-=~{~2|AINSSSSSSRRRROOIFFFFECysjnnsyDGLLMMMMMLLLMOQRRRQOMCia3/^^____]]]^^////[0hsyGLMOOMLJCyuhd06[[[[[[[[[[[[[[69dnsyDDDDDBBBBBBurhd0669gtAFIIIIIzzzAAEEJJLLLLJGCyyyDEMOQQRRRRRRRRRQOMJCyumhhfhmnwyDDywsndd000",
+"008880008eeffhnsyDCFMINNNNOOOOOOQQQQQQOOMLJCtia::=~{{{|ozHNSSSSSSSRRRQOMFFFFEECysjnnsyCELLMMOMMMMMOQRRRRRQMAla3/^^^^]]]^^/>>>>(3dsDJMOQQQOMLGysh06[[^^^^______[[[69dnsBDDDBBwuuuuumh06[[[3alCFFIIzzzzzFFLMOOOQQQOMLJEELMOQRRRRRRRRRRQQOLGDwuhffffhnwyDDDywsnddf0",
+"66686000effhmuwyDCJLMOOOOOMLLLLLMMOOOOMMLJCyib::<~{{||pzHNNSSSSSSSRRROMFAzAFEECxtsnswyCJLLMMMMMMMOQQRRRRRQOEtb3(//^^^^^//>;==;(aiDJMQQRRQQOLGysh06[[^^^^_______[[60dnswyBBwurmmhhd006[[^/(3btCAzzzzAAzFMOORRRRRRRQOMMMMOQRRRRRRRRRRRQOMJDBumhfffdhsyCGGGCDtsnhdd",
+"[[[[[6660fhmuwyCGJLMMOOOMFJGCCCGJJLLLLLLECxiba:<~~{||pzHNSSSSSSSSSRRQOFAAAAAEECCtssstyGEJLLLMMMMMOQQRRRRRRQMCia3(//////>;=*&*=:cxJOQRRRRRQOLGysh06[^^^^^_^[[[[[[600hnuuwwwumhff0066}___^//(aikooooooAEFOQRRRRRRRRRQQOOQQQRRRRRRRRRQQQOMJDBumhffdhnyCEJJJGCysngd0",
+"////((336ddmsyCGJLMMMOMMFECxywwyyDCGGGGCxtja::<<~22ozINNSSSSSSSSSRRRQMFAooAFFFECytssyDCGJJJJLLLLLOQQRRRRRRQOFxc::((>>>;-*&%%&~<kEMQRRRRRRQMJDwnd0[[^^^^^[[3999990dhhmuuuurmhf006}}____]^//(:<1lkookkAFFORRRRSRRRRRRQQQQQRRRRRRRQRRQQQOLGDwumhdffmsyGJLLJECysna93",
+";;;;;::((3aiwDELLMMOMMLLEDywsnnnstwyyyttjaa3::<<12ozIONSSSSSSSSSSSRROFAoooAFFFJExtttyDDGGGGGGGGJLMOQRRRRRRRQMAk1<::>;;=&%$@@%{1CMQRRRRRRQOLGysh06[[[[/[39gjjjjnnnnnmmrrmmhff06}}_____]]^/>>:<11222kkxEMORRRSRSSRRRRRQQQRRRRRRQQQQQQQQOLJDwumhddhnsDGJJEECxlca:::",
+"**&***~=<:ciDELMOOOOMMLJCywsnhdddgggggga33(:--<11kAINSSSSSSSSSSSRRRQOEoooozFMMMJCyttyyDDDDDDDDDGJLOQRRRRRRRROFAk1<:--~&%$@@@${kEOQRRRRRQOMGysg96[[[//[3btxCEECDywwuurrmmhee0}}_____]]]]^/>;--<1111llxAMORRRSSSSRRRRRRRRRRRRRQQQQQQQQQOLJDwumhfddgsyDCCDxlcc<<-=~",
+"%%%%%&{~<<iyELMOOOOOMLJGDysmdd903399933((>;--=<1kAIORSSSSSSSSSSSRRRQMAooopzIOOMLECyyyyyyBBwwwwBBDJMQRRRRRRRRROFok1<==*&$@++@!|kEMOQRRRQOLCtng96[[[//(3bxELMMMLJGDywuummhe00}}____]]]]]]^/>;--=<111clkAFOQRRSRSSRRRRRRRRRRRRRQQQQQQQQOOLGDwnhdddddgistiicb<<~~*&&",
+"%%&&&*~~<1kALOOQQQOMLLGDBumhd0333((((((>;--==<1kAIORSSSSSSSSSRRSRRROFoo7pzIIOOOMJCyytyBBwwuuruuwBGLORRRRRRRRROMAk1<~*&%@@++@!{kCFMOOOOFExig96[[[///(3btFMQQQQOMLGDBwurhee0}}_____]]]]]^//>;;--<<<<cclCFOQRRRRRRRRRRRRRRRRRRQQQOOOQQQOMJCyshd06669aaaaa:::-=~**&&",
+"***==-;:clCLOQQQQQOMLJCysnhd633((/(((>>;-===<1kAIORRSSSSSSSSSRRSSRROzp77pvINRQOMLEyttssuurmmmmrrwDJOQRRRRRRRROLCk11{&%$@+++@${1kxGEEACklba3(//^^///(3lEMQRRRRQOLJDBwrmhe0}}_____]]]]]]^//>;;::<<::bclxEMQRRRRRRRRRRQQQQQRRQQQQOOOOOOMLGysgd063[((3333((>>;---==*",
+">>>>((3alCLOQQQQQOMLJCysnhd66[///(((>;-=~~~11kAIORRRSSSSSSRSSRSSSSRIzpppvHNNRQQMLCyssnnnmhheeehmrBGMQRRRRRRRQMJCk1{)!@+++.++${1cittlicb::((////////(axFQRRRRRQOLJDBurme06}_____]]]]]]^^/>>::::::::bbjtAFOQRRRRRRRRQQQQQQQQQQOOMMMMLLJCysh96[[//(((((/////>>>>>>>",
+"^^^^/[9iCLOQQQQQOMLEDBsmd06[[///((((:-=~~~1koFOQRRRSSSSSSSSSSSSSSSSIzppvHHNRRQOMFCtjgdddffeeeeeehuDLOQRRRRRQOLGk22)@++....++${~<bgaa::::>>(////////(axMQRRRRRQOLGDwumhe0}}_____]]]]]]^//>:::bbbb:::bblxEMOQRRRRRQQQOOQQQQQOOMLLJGGCCxtia93[///(((///////////^^^^",
+"]__^[9nyJMOQQQQOMLGDwnh006[[[//((((::<1122oAIORRSSSSSSSSSSSSSSSSSSSNHvvvHNSRRQOMExjg990000088880fmyJOQRRRRQOLCy12)@+.......+${~<baa:((>>>(//^^^^^^/[gxMQRRRRRQOLGBwrmee6}_____]]]]]]^^/>::ccllccb:::bclCFOQQRRRQQQOOOOOOOOMLJGCyttsijga3[/////((///^^^^^^^^^__]]",
+"___[6gtGLOQQQOOLJCysg006[[[[[/((3abc112oozIIRSSSSSSSSSSSSSSSSSSSSSNNHHHHNNSRRQOLCtg96[[[}}}}}}660hBGMOQQQOMJDtc1)@+.......+@${1ccba3((((//^^^^^^^^^[gyMQRRRRRQMJDBurme86}______]]]]]^/(>:clkkklc<<:::bixEMOQQRQQQOMMMMMMMLJGDtiggdd9933//////>>///^^____________",
+"__[[9sCJMOOOOMLGysgd06[[[[^^[[3abclkoAzIIINSSSSSSSSSSSSSSSSSSSSSSSNNHHHNNSSRRQMEyj93[[[______}}}6dsCLMOOMJCtib<~)@+......++@)22lliba3(///^^^]]]]__[6gyLOQRRRQOLJDwumhe06}______]]]]]^/>:<koAAxkl<<<<::blCFOQQQQQOMLJJJJJJGCtigd96[[[[[///////////^______________",
+"__[9gtGLMOOMLJDwnd6[[[_[^^^[333blkAAIINNNNSSSSSSSSSSSSSSSSSSSSSSSSNNHNNNSSSRROMCta3[[^^_________}0nyGJLJGDsg::=*%$@++..++@$){2oCxxib93[[^^^_______}6dwEMQQQQQMLGBwrmhe06}______]]]]^//:<lozFFAkl11~~<:bjxEMOQQQOMLECCCCCDysgd0[[[[[[[[[^^^^/////^^______________",
+"__[9jyELMMLJGysd0[[____^^^[[33blxAFIQNSSSSSSSSSSSSSSSSSSSSSSSSSSSSQNNNNSSSRRQOFxj9[[^^^^^_______}0hsyCCDtna::;-=*&$@@++@@$){2oEFFCxja3[[^^________}6dsDLOQQOOLJDBurmhe06}_______]]]^/>:1kzIIIzo22{{~=<:clALOOOOMLGxtttsssng96[[[[_^^_^^^^^^^///^^______________]",
+"_[6gtCELLLEDwnd6[_____^^^[[33blxFMORSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRONNNSSSSRRQMEta3[^^^^^^^^]]]___[0gsssiga::;;;;-=*&%$$$%&~1oFMMMECta93[[[[[[[___}}6fnyGLMOMLJDBwurmee06}}______]]^//:<2ozIIIzoo|)){~<:bjxEMMMMLEytjngggd90[[[___________]^^^^^^^_____________]]",
+"_[9jyCEJJGDwnd6[^^^^^^^^^[33ajxAMORSSSSSSSSSSSSSSSSSSSSSSSSSSSSRROOOQSSSSRRRQMCl9[^^^//////^^^]]_[[9daaa::;;;>>>>>;-**&&&~1kAMOOMFCtb93[[[[[[[}}}}}6fhuDJJLJGDBBurmmhe06}}______]^^/>:1ozIIHHIp7|)){~-::blxEFLECxtja999066[[[_____________]^^^^^]___________]]]]",
+"[9gtCEEEGCynd0[^^^^^^^^^[339blCFORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSROOOORRSSRRRQOFxj3[^^//>>>>>//^^^^^/[3(::---;>>/////>;=**~=1kFOOOMFCla3[[[[[[[[[}}}}60hrBDGGGDBwurrmhe006}}}}____^^/>:<2oIHNNHHv77!){~-((3aixCCCtjg99666[[[}}}}}}__________]^^^^]]__________]]]]]",
+"6atxEJJJCDsg96[/////////[33ajxEORRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRQOOMOQRRRRRRQMEta[[^^/>;;--;>>//////>;;-==~=;>/^^^^//>-=*~~1oFOOOMExja3[[[[[[6666}}600fmuBDDBBwurrmhee0066}}}}___^//>:1kzINNNNHv47!){=;(((3ajlttja96[[[[[}}}}}}}6}[}_______^^^^^^]_________]]]]]]",
+"gtxEJLJECyia3(((>>>>(//((3abtAMQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRQOOOOQRRRRRQMJxj9[^^//>;=**=-;>>>>>;-=*****-;>/^]]]^/>-***~2AFIMMExla3[[[[[66666666600emruwwuurrmmeee0066666}}__^^/(>:lAINNNNNHvv7!{~->//^[39aga99[[[}_[_[_}[6660666[[____^^^^^^^]]]_______]]]]__",
+"txELLLLExtja::-====-;>((3ablCFORRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRQOOOOQQRRQQOLxj9[[_^^/>-=***=-;>>;-**&&&**=;>/^]]]]^/>-*&{{2ozFFExla3[[[[[399900666000ehmruurrmmheee006666666}}_^^//(bkFNNSNNNPHv7){=>//^^[[[366[[[[_____[[[660ddd906[[[^^^^^^^^^^]]_______]]]__[",
+"xEJLMLJCxic<<~{{&{{~=<::bckAFORRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRQQOOOOQQQOMLCsa6[__^^/>;=***-;;;;-**&&&&*=->/^]]]]]^/>=*&&{|oAAAxla3[/^[[[9dddd000000eehmrrrrmmheee0066666666}}_^^//3cCMRSSSNNPHv7){->/^^^^[[[[[[[_______[[69ddnnngd0[[[[//////^^^^]___________[[",
+"EFLMLJCxlc11{)!!!!)){~11koAIORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRQQOOOOOOOMJCtg9[[___]^/>;---;;;;-=*&&&&**-;>/^]]]]]^/>=&%%)||ookcb((///[[9dgggdd0000eeemrrurrmmeee8088666686}}___^/(alFORSSSNNPHv7)~;(/^^____[__________[[[69gnsssng96[[////////^^^^^^^^______[39",
+"EEFJECkl12{)!!!+'+!!!||ozIINSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRQQQOMMLLLEDsg9[____]]]^//>>>>>>;-**&&&**-;>/^]]]]]]^/;*&%$))||21<::>>///39dggghd0000eehruuuuurheee0006666866}}___^/3bxFORSSSSNPKv7|~:(/^^______________[[[39gjsttssga3[(/////////^^^^^[[[____[[9g",
+"CCCxxkl22{)!!++''''''4pvHPPNNSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRQQQOLLEGCyjg6[____]]_]^^/////(>;-*&&&**-;>/^]]]]]]]^>-*%$$@!)){{{*~=;>(/3dhhhhdf000eeemuwBBBwrmfee8000666066}}__^^[9lAORSSSSSNPKv72<((/[[____________[[[[39ajjstttsga33(((>>>(////^^^[[[[[___[[9g",
+"tllic11{{)!!!+''''',45qKKPPPNSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRRRRQOMLGDysn96[[___]]]__^^[[3993(:=*&&**-;>//^]]]]]]^/>=&$@@@@$)))%%%&~;>(6dhhhdfe000eemrwBDDDBumhffee80800006}}__^[3bxFORSSSSSNPHvo2<33[[[[[_^_______^[[[399gjtttttiga33((>>>>>(////^[333[[[__[[39",
+"aaa:<~{{%)$!@+++'',5qqKKKPPPNSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRRRRRQOLEDwnd9[[___]]]____[[9gistib:=*&&*=;>>/^]]]__]]^/-&$@+++@@@@@@@$%&=>(0fffffe0088eemuBDGGDywuhhfeeee800806}}_[[3alAORRSSSSSNNHzolba36[[[[[^^^___^^[[[339aajjtttija93((>:>>>>>(///[33993[[^^^[[3",
+"(((;=~{&%%$$@++'',5qqKKKKPPPSSSSSSSSSSSSSSSSSSSSSRRRRQQQRRRRRRRRQOLGynd9[[___]]]____[9gsxGEEClc<~**=-;>/^^]]___]^/>*%@+++++++++++@$&=(30fffee8008eemrBDGJJGDwrhffeeeee80806}}[[39jxFORSSSSSSSNHzolca9996[[[^^^^^^^^[[3333aabjjijjba3(::::;;>>>>(/(3aaaa3[[^^^^^[",
+"/>>-=*&&&%%$@++',5qqKKKKPPPPSSSSSSSSSSSSSSSSSSSSRRRRQQQQRRRRRRRRQOJCsg9[[[___]_____69nyELMMLJxl1~~=-;>//^^]___]]^>=&@++.....+++++@$&;(600eee80888eemuBGJJJGDwnhdfeeee88008}}}[[3bxFORSSSSSSSSNIFAkiggd996[[^^//^^^^^//(3333aaaabaa:::---;;::>>>>((abjjja3[^^^^^/",
+">>;-=**&&%%$@@',5qqKKKKPPPPSSSSSSSSSSSSSSSSSSSSRRRRQOOOQRRRRRRRRQMJDsd9[[^_______}6dsDJMOOOOLCk11=-;>//^^]____]^/;&$++.........++@%~:(6608e88888eehrwDGJJJCyshdf0000008086}}}[3alAORRSSSSSSSSROFAxljgg996[[///////^////(((33333:::<=~~~==-;;;;:::aclxtlb93//////",
+">>;-=**&&%%$!!45qqKKKKPPPPSSSSSSSSSSSSSSSSSSSSRRRRQOOOQQRRRRRRRRQMEysg9[[[______[6dsDJMOQQQOLGlc<-;>(/^^^_____]^>=%@+..........++$&-([668888888eeemuBDGJJGDwnd00000000686}}}[[3jxFQRSSSSRSRRRROFAxtjgd96[[[//>>>//////((((((((:;=~{&&{{~~<<<<-::<lkCCCxib33(////",
+"(>;-=~*&&%)!!45qKKKKPPPPPSSSSSSSSSSSSSSSSSSSSRRRRQOOOOQRRRRRRRRRQMJDwnd0[[[[_[[60gwCJMOQQQOMJxib::>(//^^______^/;&$+...........+@%=>/[68888888eeehmuBDGJGDysh0066}}}}}}}}}}}[6atEORSSSSSSRRRRROLCyigd96[[[//>---;>>>>>>;;;;;;;-~&%$$$$){~11<<<11koAFFFAxia3((((/",
+"((>;-=~{{))74vKKKKKPPPPSSSSSSSSSSSSSSSSSSSSSRRRRQOMMOQRRRRRRRRRRQMLGywnh906660dgsyGLMOOQQOMLCtga(((///^^_____^^>=%@+..........+@%*;/[}6888888eeeehruBDGGDysh066}}}}}}}}}}__[[3jCMQRRSSSRRRRRRROFCtja96[[[^/>-*&**-;;;;-======*&%$@@++@!)|222222oAIIOOOFAtib:((((",
+"//(>;=~{{|7vvKKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSRRRQMLLMOQRRRRRRRRRRQOMLECywsnggnswDGLMOOQQOOMLGynd3((///[^______^/;&$+.........++@$&;(/}}88888eeeeehmrwBDDDysnd06}}}}}}}}}}___[[atFORRSRSRRRRRRROMExia96[[[^^/>*&%%&&*===**&&&&&%%@@+++++!77ooooopzHNNRROOFClcb:333",
+"[//(:-~2|pvHKKKKPPPPPSSSSSSSSSSSSSSSSSSSSRRRRQQMLLLOQRRRRRRRRRRRQQOMLLJGCDyyDGJLMOOQQQOOMLGynd6[/////[[_}___^/>*%@+....++++++@$&=>/[}68888eeeeeemmuwyDDysnd06}}}____}}_____[3jCMQRRRSRRRRRRRQOJCtg93[[[__^/-&%$$$%&&&&&%%$$$$$@+++..+''7pppppzHHNNSSRROFAklca333",
+"[[((:<2|pvKKKPPPPPPPSSSSSSSSSSSSSSSSSSSSSRRRRQOLJJLOQRRRRSSRRRRRRQQQQOOMLLLLLMOQQQQQQOOLJCBnd6[//////[}}____^/-&@+...++@@@@$$%&=;/[[60888eeeeehhmruwyyBsnh06[}_____}}}}___[[9tEORRRRRRRRRRQQOLExia3[[[__^^>=&$@@@$%%%%$@@@@@@+++....''4vvzzzvHHNNSSSSROMExlcaa36",
+"[[((:1opvKKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSRRRRQOLJJJMORRRRRSSRRRRRRRRRQQQQQQQQQQQRRRQQQOLJDwnd6[^^//////[}___^/>*%@+.+++!))%%%&&~;(/660eeeeeehhmmmmruwwwsnh066}_____}}}}}}__[3gxMQRRRRRRRRQQQOMJDib3[[[[^_^/>*%$@@@@$$$$@+++++++......'44vvIIHHHPNSSSSSRQMFxlca996",
+"[[(3ckpHKKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLJGJMQRRRRRSSRRRRRRRRRRRRRRRRRRRRRRRQQOLJDwnd0[[^//>>>///___^^>=&@+++''!||{~***~->(6dhhhfeefhmmmmmmussssnhd06}}____}}}66}}}[[9tEMQRRRRRRRQOOMMJCtja3[[^^_^^/>*%$@@@@@$@@++...........''4vvIIIHHNNNSSSSSROMAxiaa6[[",
+"^[3bkzHPKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSSRRRRRQMLGGJLORRRSSSRRRRRRRRRRRRRRRRRRRRRRRRQQMJDBuh0}_^^/>;;;;(//^^^/;*$@++''47po21~~~=:(dgussurmmmmmrrrmnnnsnngd06}}____}}}60006669jxLQRRRRRRRQOOMLJGDsb3(/^^^_^^/;*&$@@@@@@+++...........+'7pzIIIIIHNNSSSSSRROFCtca3[[[",
+"^3alAIHPPPPPPPPSSSSSSSSSSSSSSSSSSSSSSSSRRRRQOMJGCGLMQRRSSSSSSRRRRRRRRRRRRRRRRRRRRQQOLGBuhf6}_^^>;****->>//>;*%@@+''4vpzok1<==-:anyDCDDywuuuruurnnnnghd066}}}___}}}60df0069gtEOQRRRRRRQOMLLJJCxia3(/^^^^^^/>~&$@@@@+++............+'77pzIIIIIHNNSSSSRRQMExia3[[[_",
+"^3bxFNPPPPPPPSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLJCDDEMORRSSSSSRRRRRRRRRRRRRRRRRRRRQQOLGDwrh0}}_^/;*&%$%&**==*&%@@++'4vvIIAkl<<<::ctGLLLJDywuuuurnhhddd0066}}____}}}600dddd0djCMQRRRRRRQQMLLLJECyia3(/^^^^^//>=&$@@++++....    ....''77ozFFFFIIINSSSSRRQOLClg9[[^__",
+"^3lFINNNPPNSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRQOLGDyyxGFORSSSSSSSRRRSRRRRRRRRRRRRRQQOMJDBumf0}_^/>=&$@++@@$%%$@@@+@@7pzIIIAkl1<<:biDJMMLLGDwsunnhhdd0066[}}______}}}600dddddnyJOQRRRRRRQOMLLJJGCtib((//^^^[[(:=&$@@+++....     ###''77zzFMMFFIINNSSSSRRQMEyja3[^^__",
+"[axMRSSSNSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRQOLGysiitCFIRSSSSSRRRRSSSRSSSRRRRRRQQOLJGDwume0}[//;*%@+....+++++++@@)|ozIIFAkc<::::ixJMMLLGysnnhdd00666[}}________}}}}6000ddntEMQRRRRRRQOMLLJJJGCtc<:>(///[33a:<{$@+++....     ###'44pzFMMMMMFIIRSSSSRRROLCtg33/^^__",
+"3jAORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLCyigbclkAFIQSSSRSRSSSSSSSSRRRRRQOMLJGDBwumf0}[/>-&@+...........+@${2oAFFAkcb:::(3btCJLJGDtngd00666}}______________}}}6600hsCLORRRRRRRQMLLJJJGCxic<-;>//33bjll2|)!++....     ##,,5vvIIIOOMMMMOORSSSRRRQOLCtb33[[^__",
+"axMQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLCwna:<122opzIIQRRSSSSSSSSSRRRQQMLGDDDBBBurhf6[(>=%@+...    ....+@%~<lxxxlcb::>>((3jtCCCysnd9666[}}__________________}}}60gtEMQRRRRRRQOMLJEEGCDtic<=->/(3btCAAAo7!''.#     ##,,55vHHNOOOOOOMOORRSSSSRRQOLCtja33[[[[",
+"tEORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRQOJDsb::=~{{)||opzIORSSSSSSSRRRQOLGDyyBBBBBwumd63(:~%@+...     ....@%=:bbbba:(>>>///[9gsssjnd9666}}}}___________________}}6dsCMQRRRRRRQOMLJGGGCDysc<<=->(3atAMMOIzp7'''#######,55qKPNNRRQOOOOOOORRSSSRRRQOMExlcba3399",
+"EMQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRQMJyia::=*&%))))||ozIQSSSSSSRRQMJCtsuuwBBBBBund03(:=&$+...      ...+%=:(((((>>>>//^^[[9gnnngdd9666}}}}__________________}}6dtJOQRRRRRQQOLJGGCDDyysg:<-;>(3jCLOQQOIIp44'#####,,5qqKPNNSRRQQOOOOOQRRRRRRRRQOLExkklcbjit",
+"MORRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRQOJCsb:(;=*&%%$$)){2koFIRSSSRRQMFxsnhhnuwBBBBsnhd93:-~%$+...     ...+$*;>>>>;;>>//^^^[[9dgnnnnngd00066}}}}__}}}}}}}}}_}}}}60nCLQRRRRRQQOLJGGCDDDywsg::;:((atEMQQRROIzp74'',,,5qqKKPPSSSRRQQOMMOQQRRRRRRRQOMFAoookkkxCE",
+"OQRRSSSSSSSSSSNNNNNNSSSSSSSSSSSSSSNNNNNNNOMJxib3((>-=*&%%%%{~<1loFIRRRRQOMExjgddhhuwwBwsngdda3:<~%$+..     ...+@&=;;;--;;>/^^_^[60hnswyyyysnhff0066}}}66006}}}}}}}}}0dwEMQRRRRQQOMLGGDDDDDyytna::>(3atJOQRRQQOMzpp7445qqKKKPNSSSSRRQOMMMOQQRRRRRRRQOLEAoo7oooAFM",
+"QQRSSSNNPPPPPKKKKKKPPNNNNNHHIIIIHHHPKKKHIAxlba3(((>;-=~***~=-::ixFIRRRRRQMLCtjgddhgnsssssngggga:<~%@+..     ..+@%&*====-;>^^]_[[0hnsBDGJJGGDwumhee00fffffee0066}}}60dnDLOQRRRQQOMJGDDDyyyDDyyib:(((3bxJMQQQQQOMFFAzpvvKKPPNSSSSSSRRQOMMMOQQRRRRRQQMLGxko777ooEMO",
+"QQRNPPKKKKKqqqqqqqqvvvpppooo||||||7744447|1<(((//>>>>;;;;::::actAMORSSRRRQOMExjgdddgnnsssssssiig:~)@+.     ....+$%&&&&*=;/^^^[[6dgnwDGJMMMLJDBwrmmmmmuuuurmhff000000hsCLOQQQQQOLJGDByBBBBDDDDtia:((3axEMOQQQOOMMMLLIINNNSSSSSSSSSRRQOMMMOQQRRRRQQMJCtl2|!!77oAMO",
+"QONKqqqqqq5555,,,,''!!)){){{{{{{{))!!'+'!){=;>>>>>((((3333adnsDJMRRSSSSSRRRQMJxjgd9ddgnnsswyyytic~)@..    .....+@$$%%%&=;/^^^[[9dhnwDJLOOOOLJDBwwuwwBDDDDBwumhff00fhnyELOQQQOMLJDBwwuuuwBDDGGDic:((3bxEMOOOOOOOOOOOORRSSSSSSSSSSSRRQOMMMOQQRRRQQOLCyic1)!!!)2xFO",
+"QIvq555,,,,,######.+@$%%&&&&&&&&&&%$$@+@@$&*-;>>>((:abjinnnwyGLORRSSSSSSSRRRQMJxtga9ddgnssyyDxti1{!+.     ....++@$$$$%&*;/^^^[[09dgsDJMOQQOMLJGDDDDGJJLJJGDyumhfddhnsDJMOOOOMLGDwurmmmmuwBCGGCtc::(3jxJMOOOOOOOOOQQQRRRSSSSSSSSRRRRROMMMOQQQQQQOLGynd:~)!@@)2lEO",
+"Oz5,,,########    .+@$%&&&&***====*&%$@@$%&*-;>>>(ajtxCCyDDGJMQRRRSSSSSSSSSRRQMExjga9ddgnstyyyl12!+.     ...+++@$$$$$$%*;>/^^[[[60dnBGLOQQOOLJJJJJJLMOOMMJGDwunhhhgsyCJMOOMLJGywumhhffhmsyCGECkc:::blAMOOQOOOOOOQQQQRRRRSSSSSSSRRRRQOMMMMOQQQQOLJDsh3:~)$@@)~cDM",
+"Jo'######        ..+@%&&**==-;>>>>;-*&&%&&*=-;;>:bkAFLLLJGJLOQRRRRSSSSSSSSRSRRQMEyjgaddggnsssi1|!+.     ..++@$$%%%%$$$%*->/^^^[[[[0dsDLMOOOMMLLLLMOOOOOOMLGDwsnhhgntDELMMMLJGywumhfe00ffnwDGGCkc<:biCFOQQQQOOOOQQQQRRRRRRRSSSSSRRRRQOMLLMMOOOMLJDwmd3:~%$$$&~btJ",
+"y1!#            ..+@$&*=-;>>>//^^//>;-=**==-;;>:lxFMOOOMLLMOQRRRRRRSSSSSSSSRRRQMFCtjg99dagggc1|!'#    ...+@%&&***&&%%%%*->//^^^^[[[0nyGLMMMLLLLMOOOQQQQOMLGysnhddgiyCLMMMLLGDwumff00000fhsyCCCtccccxFORRRRRQQOQQQQQRRRRRRRSSSRRRRRRQOMLLLLLLLJGDwrh03(={%%&~:anD",
+"n:)+.          ...+$&*-;>>//^^]]]]^^/>>;;;;;>(blAMOQQQQOMMOOQRRRRRRSSSSSSSSRRRQOMEyig999999a<)@.#    ...+$&=-;;;;-*&&%&*=;>//^^^__[6dsDGJLJLLLMOOQQQQQOMLGDsngd9dgsxELMMMLJDysmdf066}}60hsDCCCxlllxFORRRRRRRQQQQQQRRRRRRRRRRRRRRRRRQOLLJJJJJGDBwrhf63(-~{*~:3drB",
+"m3~$+............+@&=;>//^^^]]]]__]^^//>>>>>(bkFOQRRRQQOOOOQRRRRRRRSSSSSSSSRRRQOMEyja93333(<)@+      ..@%*;>////>>-=*&**=;>>//^^^__[0hsyDDGJJLMOOQQQQOMLGysgd9399gtCLMOOMLEDwnhd06}}}}}0hsDGEECkkxEORRSSSRRRRRQRRRRRRRRRRRRRRRRRRRQQOLLJGGGDDBurhf063(:=~=:(0huw",
+"h0:&@+++..++.+++@$&=;//^^]]_______^^^///(((alxFORRRRRQQQOOQQRRRRRRRRSSSSSSSRRRQOLCtj933((>=%@..     ..+%*;/^^^^^/>>-=**=--;;>>//^^^}6dhuwyDGJLMOOOOOMLJCysg96[[39jyELOOOMLGysgd06}}___[6dsDEJEACCAMORSSSSRRRRRRRRRRRRRRRRRRRRRRRRRQQOLJGGDDBBurmff063(::::33dmuB",
+"h0(=&%$@@@@@@@@$%*->/^^^_______[[[[[33333ackFMQRRRRRRRQQQQQRRRRRRRRRRSSSSSRRRRQMExja3(/>-*%+..     ..+$*;/^]]]]]^/>;-=========;>/^^^[6dhmuBDGJLLMMLLJCysg93[[[[3aixFOOOOMLGysh06}}____}6gtCELFEEEFORSSSSSSRRRRRRRRRRRRRRRRRRRRRRRRQQOLJGDDBwurmef00633:::33dhruB",
+"h0(>-**&&&******-;//^^_____}[[669999aaaaclAFORRSRRRRRQQQQQRRRRRRRRRRRRRSSRRRRROLCla3((;=&$+..     ..+$*;/^]]]]]]^/>;-==***&&&&*=>/^^[}60dmuBDGGJJGGDysg96[[[[/(3btEMOQQOMLCynd06}_____[6gtGJMLFFFMORSSSSSSRRRRRRRRRQRRRRRRRRRRRRRRRQOLJGDBwurmeef00033::3adhmuwB",
+"he6/>>;;;;;;>>>>//^^^[[[}66660dgnjtjiiltCFORRSSSRRRRRQQQQRRRRRRRRRRRRRRRRRRRRQMEtb3((-*%@+..     ..+$*;/^]]]]]]]^/>;-=**&&%$$$%&=>/^^[}60dmuwyyyywsng96[[^^^//(3iCLOQQQOMLCtnd6[[_____[6gtGLMMFFMORRSSSSSSRRRRRRRRQQRRRRRRRRRRRRRRRQOLJGDBurmhee000093aaaddmruBB",
+"he6[/////////////[[[[660000ddnsyDCCCxCAFMORSSSSSRRRRQQQQRRRRRRRRRRRRRRRRRRRRQOFxj93(;=&$+...    ..+$*;/^]]]]]]]]^/>;=**&&$@@+@@%*;>/^^_}}0dhmnnngd06[[[^^^^^//3bxJOQQQQOMJCtnd6[_____^[6gtELMMMMMQRSSSSSSSRRRRRRQQQQQRRRRRRRRRRRRRRQOLJGBwummeee00099aaaddhruwBB",
+"he6[////////[33399aggnnnnnnswyGJLMLLFFMORRSSSSSRRRRRQQQRRRRRRRRRRRRRRRRRRRRRQMCta3((;~&@+..     .+@&;/^]]]]]]]]]^/>-=**&%$@+++@$&=>/^^^__}6600066[[[^^___^^^/3atEMOQQQQOMJCwn06[_____^[3gyELMMMMOQRRSSSSSRRRRRRQQQQQQRRRRRRSSRRRRRRQOMJGBwrmeee00009daaddhmruwBB",
+"ee6[[////[33ajitxxCCCCCCDDDCGJLMOOOOOORRSSSSSSSRRRRQQQQRRRRRRRRRRRRRRRRRRRRQMExj33((;=&$+..    ..@&->^]]]]]]]]]]^/>-=**&%$@+++@$&=;/^^]_____[[[_^________^^[39iCLOQRRQQOLJDwg06[[_^^^^[9nyEMMMMOQRRRSSSSRRRRRRQQQOQQQRRRRRSSSRRRRRRQOMJDBurmfe000099dddddhmruwBw",
+"ee6[[//(3ajtxEFMMMMOMMMMLLLLLMOQQRRRRRSSSSSSSSSRRRQQQQRRRRRRRRRRRRRRRRRRRRROLCla3[//>-*$@+......+%*>/^]]]]]]]]]]^/>;-=**&%$@@@@$&=;>/^^]]_______]]]]]___^[[[9jxJOQRRQQQOLGysh06[^^^^^^[9sCLMMOOOQRRRSSSRRRRRRQQOOOOQQRRRRSSSSSRRRRRQOMJDBumhee000099aadddhmruwwu",
+"e06[[(3abtCFMQQQQRRRRRQQQOOOOQQQRRRRSSSSSSSSSSRRRRQQQQRRRRRRRRRRRRRRRRRRRRQMEtj93[//(;~%@+.....+$*;/^]]]]]]]]]]]^/>>;;-=*&%$@@$%&=;>/^^]]]]]]]]]]]]]___[[[39jyEMOQQQQQOMJDwnd0[[^^^^^^[gtEMOOOOQRRRSSRSRRRRRRQOMLLMOQRRRRSRRSSRRRRRQOLJDyumhff000099aaddhmruuwuu",
+"e66333bckEMORRRRRRRRRRRRRQQQQQQRRRRSSSSSSSSSSSRRRQQQQQRRRRRRRRRRRRRRRRRRQQMExia96[[//>-&$@+...+@&->/^]_]]]]]]__]^^//>>>;-*&$$$$&*->//^]]]]]]]]]]]]]]__[[39ajtALOQQQQQOMJGBsh06}^^^^^^[3nCLMOQQQQRRRSRSSSRRRRQQMLJLLOQRRRRRRRSRRRRRQQOLJDyumhf000009daaddhmruuuur",
+"0633:<1kAIRSSSSSSSSRRRRRRRQQQQQQRRSSSSSSSSSSSRRRRQQQQQRRRRRRRRRRRRRRRRRQQMExsg936[[[/>;*%@+++@@&=>/^]]_]]]]]___]^^^^///>;=&%%%%&=;>/^^]]]]]]]]]]]]]__[[39ajtCJMOQQQQOMLGDwnf6[_^^^^^^[9sEMOQQQQQRRRSRSSSRRRRQOLJGGLOQRRRRRRRSRRRRRQQOLJDBumff0000099adddhmrruurr",
+"63(:<1koINNSSSSSSSSSSSRRRRQOOMOQQRRSSSSSSSSSRRRRQQOOQQRRRRRRRRRRRRRRRRQOMExtgd966[[[/(;*%@@@@$&~;//^]]]]]]______]^^^^^^/>-*&%&*=;>/^^]]]]]]]]]]]]]]__[39gjtxEMOQQQQOMLGDwrf0}__^^^^^^[gtJMQQQQQQRRRSRSSSRRRRQOLGDCJMQRRRRRRRSRRRRRQOMLJDBsmff000099999ddhmrrrrmm",
+"3(:<2||pINNSSSSSSSSSSRRRRQOMLJLMOQRRSSSSSSSRRRRQOOMOOQRRRRRRRRRRRRRRQQOLExiga93666[[/(;*%@@@$&~;(/^]_]]]]]______]]]]]^^/>-*&&*=;>/^^]]]]]]]]]]]]]]__[39gitxELMOQQOOLJGDwrh06}__^^^^^^[gyLOQQQQQQRRRSRSSRRRRRQMJDyDGMQRRRRRRRSRRRRRQOMLEDBsmhff00099999ddhmmrmmee",
+"(:<{||7pHNNSSSSSSSSSRRRRQQMJGCCGLMQRRSSSSSRRRQQOMLLMOQRRRRRRRRRRRRRRQOLExiga9900666[/(;*%@@$%*;>/^^_]]]]]________]]]]]^/>-***->>/^]]]]]]]]]]]]]]]__[[9gitxEFMOQQOOLLGDwuhf6}__]]^^]]^[gDLOQQQQQQRRRSRRSRRRRRQMGyByGLQRRRRRRRSRRRRRQOMLGDBsnhdf000099900dhhmmmee0",
+":-~{)!7pvNNSSSSSSSSRRRRRQMJCtsstDEMQRRRRRRRRQOMLJJJLOQQRRRRRRRRRRRRQOMExigd9999d006[/(-&%$$%&=>/^^]__]]]]_____^__]]]]]^/>-==->/^^]]]]]]]]]^^]]]]]_^[9gjtxEFMOQQQOMLJDBumf0}___]]]]]__6gDLOQQQQQRRRRSRRSRRRRROLCywyCLQRRRRRRRRRRRRQQOLJGDBsnhdf000009900fhhhhee6}",
+"-~{)!!7pzHNSSSSSSSSRRRQOMEDwnggmsyGLOQRRRRRQOLJGDDGJMQQRRRRRRRRRRRRQMJCtja999ddddd6[/>-&%$%&*;>/^]]]]]]]______^^^^^^^^/>;--;>/^^]]]]]]]]]^^^]]]]__[9gjtxEFMOQQQQOMJGyumd06}__]]]]]]__[dyJOQQQQQRRRRSRSSRRRRROLDwswDLORRRRRRRRRRRRQOOLJGDysnhdd000066660fffff06}}",
+"=*%)!!77zIRSSSSSSRRRRQOLEDsnhdddhnwDJMQQQQQMLGDBBBDJMQQRRRRRRRRRRQQMJCtjg999dhgmhd06/>-&%%%*->/^^]]]]]]]____[[^^^^^^^//>;;;>>^^]]]]]]]]]^^^^]]]__[9gtxCELMQQRRQQOMJDBuh06[[__]^^]]]__[dwEMQQQRRRRRSRRSSRRRRROJDwswDLORRRRRRRRRRRRQOMLJGDwumhdd0006666600fff06}}^",
+"*&%!!!77zIRSSSSSRRRQQOLGyshdd0000fhsyGLMOMLJDyuuuBDJOQRRRRRRRRRRQQMLGysgd99dhnnnnh06/(;*&&*=;>/^^]]]]]]]____}[^//////>>>;;>>/^]]]]]]]]]^^/^^^]]_[3gtxEFMMQRRRRRQOLGDsnd06[__]]^^^]]]_[9sGMQQRRRRRRRRSSSSSRRROJysnsDLOQRRRRRRRRRRRQOMLJGDwumhf00066[[[6000006}__^",
+"&%$$!!|ozIRSSSRRRRQOMJCyshd00000000dnwCJJJGDwumruwDLOQRRRRRRRRQQOMJCysga999dhnnnmd0[/(;=**=->/^^]]]]]]]_____[[//>>>>>>;;;>>/^^]]]___]]^^///^^^^[3gtCFMMOQRRRRRRQOLCtnd06[___]^^^^^]]_[9sGMQQRRRRRRRSSSSSSRRROJysssDLOQRRRRRRRRRRQQOMLJGDwumff0066[[[}}60006}__]^",
+"%$$@!)|ozORRRRRRQQOLEDwnhd0000086660dmsyDDywummmuBGLOQRRRRRRRQQOMECtjgd9000ddhggd9[[/(>-=-->>/^^]]]]]]]_____^//>;;;;;---;>>/^^]]____]^^////^^^^[atELMOOQRRRRRRRQMEynd66[___]^^///^]]_[9sEMQRRRRRRRSSSSSSSRRROLCwwwDLOQRRRRRRRRRRQOOMLLEDBumff066[[[}}}}66}}__]^^",
+"%$@@!)|oIORRRRRQQMLEDsndd00000886}660dmswwsrmhhmuyJMQRRRRRRRQQMLEDsng996666000096[[//>>;;;>>//^]]]]]]]]_____^/>;-----==-;;>//^^^^^^^^^//>>//^^[9lCLMOQQRRRRRRRQOLCsd0[}___]^^/>>>/^^^[9tEOQRRRRRRSSSSSSSSSRROLGyByGMQRRRRRRRRRRRQOOMMLJCysmf006}}}_}}}}}}}___]^/",
+"$@@@!|ozIQRRRRQOMJCysgd000008888}}}}60hnusumhhhmwDJOQRRRRRRRQOLEDsn9966[[[[[[[[[[////>>>>>>>/^^]]]]]]]______^/>;;--=====-;>>//^^^[[^//(>>>//^[3jxFMOQQRRRRRRRQQLGtg0[}____]^>;;;>>/^^[gyLORRRRSRSSSSSSSSSRRRQMECDDJMQRRRRRRRRRRQQOOOMLJCysnf006}}____}}}}___]]^/",
+"@@@@!|pzORRRRQOMJCtjgd0000088886}}}}60hnsuurmmmuBGMQRRRRRRRRQMLCtja9[[[[[[[[[^^^///>>>>>>>>/^^]]]]]________^^/>>;;--=***=--;>>///[[[/(>;;;>//3atEMOQQRRRRRRRRQMJyn96}____]^/;=*=->/^^3jCMQRRRRSRSSSSSSSSSRRRQMJGGGLOQRRRRRRRRRRRQOOOMLJGywnf06}}______}_____]^/>",
+"@@@@!|pIORRRQOMJCtng906600088886}}}60dnswBwwuuuyDJOQRRRRRRRQOLEyia93[[[[^^^_^^//>;;;;;>>>//^^]]]___________^^//>>>;-=******=-;>(////(>-=~-;((3jxFMQQRRRRRRRRQOLCsd6[____]^/;=&&*=;//[atJORRRRSSSSSSSSSSSSRRRQOLJJJLOQRRRRRRRRRRQQOOOOMLGDwnd06}}___________]]^/>",
+"@@@@!7zIQRRRQOLCtja9666600088886}}66dmwDCGGDDDDGJMQRRRRRRRROMExlb93([//^^^^^^//;-==-;;>>//^^]]]_____}}}}____^^///>>;=**&&&&&&*=;>((>;=*&&*->(atEMOQQRRRRRRRQQMGtg3[^__]]^/>=&%%&*;>/3jCMQRRRRSSSSSSSSSSSSRRRQOLLJLMOQRRRRRRRRRRQQQQQOMLJDwnd06}___________]]]^>;",
+"@@@!!pzIQRRROMEyia96666600888886666dhsCJLLLLLJLLMOQRRRRRRRQIFxlc:((((////^^//>>-=*=-;>>//^^]]____}}66686}}__^^^^^/>>-**&&&%%%%&*=--=*&%$%&=:3jxFMOQQRRRRRRQQMEyn3[/^^^^^/;=&%$%&*;>(ayJORRRRRSSSSSSSSSSSSRRRQOMLLLMQQRRRRRRRRRRQQQQQQOMJDwnd0}[___________]]^/>;",
+"@@@!7pINRRROOFCtg93[666000888886660hsCLOOQQQOOOOQQRRRRRSSNIzok11<==--;>(////>>;-==-;>>/^^]]]___}60feeee06}}__^^^^^/>;=*&&%$$@@@$%&&&%$@@@%*<btEMOQQQRRRRRQQMJxi:(>>>>>>>-*&$$$%&=;(3jCMQRRRRRSSSSSSSSSSSSRRRQOMMMMOQQRRRRRRRRRRRQQQQQOMJDwnd6[[__________]]]^/>=",
+"@@@!7zHNNNQOMExia96[6600088888060fhsDLOQRRRRRQQQRRRRRRSNNHp77))))%&&{~-;>(((>>;;;;>>//^^]]]___}0fhmmmmhe06}}_^^^^^/>;-**&%$@+++++@@@+++++$&1cxFOOQQRRRRRRQMJxi<~{&&&****&%$@@$%*->(atEOQRRRRRSSSSSSSSSSSSRRRQQOMMOOQRRRRRRRRRRRRQQQQQOMJDwnd6[___________]]]^>;=",
+"@@!7pHNNNNQOFAtja3666000eee88800dhuyJOQRRRRRRRRRRRRRSSNHvv4''!@@@@@$){~-:>((>>>>///^^^]]]____}0fmuuwwwumh06[[^^^^^/>>;=*&%@+++..........+@)2kAMOQQQRRRRRQMExl1)$@@@@@$$$@@@@@%&=;((ayJORRRRRRSSSSSSSSSSSSRRRQQOOOOQQRRRRRRRRSRRRRQQQQOMJCwg96[[^________]]]^/>-*",
+"@@!7vHNNNNNOFAtja366600eeeee800fhnyGMQRRRSRRRRRRRRRRSNHv54'''++++++@!)~<<:(((////^^^]]]_____}0dmuwBDDDBwnh0[[[^^^//>>;=*&%@++............+!|AFOQQQQRRRQQMFxl2)@+....+++++++@$&*;>/3gyLOQRRRRRSSSSSSSSSSSSRRRRQQOOQQQRRRRRRSSSRRRRRQQQOMJDsg9[[[^_______]]]^^/>=&",
+"@!7pHNNNNNNOFAtca936000feeeeeefhnyGMQRSSSSSSSRRRRRSSNHv5,,##....++@!){21cba3(//^^^]_______}}0fmuwBDGGGGDwnd6[//////>>;=*&$@+....       ..''pzIQRRRRRRQQMFxk2)@+........++++@%*->//3gyLOQRRRRRRSSSSSSSSSSSRRRRQQQQQQRRRRRRRSRSSRQQRQQQOMJDsg9[[[^^^^^^^_]]]^/>;*&",
+"@!7vHNNNNNNIFAtca9900000ee0e0edmwDLORSSSSSSSSSSSSSSNHv5,,##....++@!)|2kkliga3[[^^_______}}}00hmuBDGJLLLJCtga33(///>>;;=*&$@+...         #'4vHNNRRRRRQQMJxl2)!+..    ....++@$&=>/^[6gyJOQQRRRRRSSSSSSSSSSSRRRRQQQQQQRRRRRRRRSSRRQQOQQQOMJCsg9[[[^^^^^^^^]]^^/>-&%",
+"@!7vHNNNNNNIFClca990000000000fhnDJORSSSSSSSSSSSSSSNHv5,,##...+++@))22kxxytia9[[[[_____}}}600fhmuyDJLMOMLExib33(((>>;;-*&%@+...          #,5KHNSSRRRQQMJxl1{)+..      ...++@%*;>/^^6gyGMOQRRRRRSSSSSSSSSSSRRRRQQQQQQRRRRRRRSSSRQOOOQQQOMJDsg9[[^^^^^^^^^^^^^>;*&$",
+"!74HPPNPNPNIzxlba366600000000fmwGMQRSSSSSSSSSSSSSNHv5,,##..++@@$%{11lyDxytng96[[}}}}}}}66000ffmsyGLMOOOMLCtiaa3((>;;-=*&$@+...         #,5qPNNSSRRRQOFClc1{$+..      ...++$&=>/^^[6hsCLOQQRRRRSSSSSSSSSSSRRRRRQQQQQRRRRRRRRRRQOIIOOQQOMExia3[[^^^^^^^^^^^^/>-*%$",
+"!4vHPPPPPPHIzklb9366666666660dsxJORSSSSSSSSSSSSSNHv44'#...+@@$%{~<<ctyyyysngd066}}}}}}880800fdhsyGLOQQQOMExlbaa3(:;-=*&$@+...          #,5KHNSSRRRQOMAlb:~%@+..       ..++$&->/^^[6dsDJLOQRRRRSSSSSSSSSSSRRRRRQQQQQRRRRRRRRRRNIIIOOOOOMExja3[^^^^^^^^^^^^//;=&$@",
+"'4vKPPPPPPHIAkia93[[[}}66666dgtGMQRSSSSSSSSSSSSRIvp4'#...+@@%&*=-:acittwssnhdd000666686886800fhwCLMQQQQOMExtiga::;-=*&$@++...         #,,vHNNSRRRQOMExb:=&$+..        ..++$&->/^^[6dnyCJMOQRRSSSSSSSSSSSSRRRRRRQQQQRRRRRRRRRRIIIIIOOOMFAtb93[^^^^^^^^^^^^/>;*&$@",
+"44vPPPPPPPHzAkca36[[[}}}}}60dnxFORSSSSSSSSSSSSNIzp4''...+@@%&*-;:(3agnissnnmhhdff00068886}6600hwGLOQQQQOMExtljba:;=*&%@++....         ##4vHNRRRQQOMFxja-{$+...        ..++$&->/^^[6dgsyGLMQRRSSSSSSSSSSSSRRRRRRQQQQRRRRRRRRROFzzzIIIIMFxla3[^^^^^^^^//^//>>-&%@@",
+"4vHPPPPPPHHzolca3[[[[}}}}}69gtCMORSSSSSSSSSSSNHIp4''...+@$%&*=;;>((3agnnususurmhffe0066}}}}}6dnyJMQQQQOMLExytica:-~&%@@+......        .'7pFOOQQQOMLCla:~%@..          ..+@%*->/^^[60hnsyGLORRRSSSSSSSSSSSRRRRRRQQQQRRRRRRRROIzppzIIIIIAxia3/^^^^^////////>;*&$@@",
+"vvPPPNNPPHIzxlcd3[[[____}[6diyJMQRSSSSSSSSSNNHHp4''...+@$%&=-;;>>((33dhnwByyywwumhf006}}}}}}0gwGLOQQQQOMJGCCxtib:=*%$@+.......      ..+!2kAFOOOOMLExb:-&@+..          ..+@%*;>/^^[60dgnyCJORRSSSSSSSSSSSSRRRRRRQQQQRRRRRRRQOFAoppvHHIIAkca(/^^^/////////>>-*%$@@",
+"vHHNNNNNNNIAxlg93[[[____[[9gtEMORRRSSSSSNNNNHvp4'''+++@$&*=;;>>>>((30dmwDDGGGDDwumhf06}}}}}6dsDJMQQQQOMMJEECCxlc<~{$@++.........   ..+${<lCJMMMMLExja:~$+..           ..+@%*;>/^^[69dhnsDJOQRSSSSSSSSSSSSRRRRRRQQQQRRRRRRQOMAooopvHHIzAkc3(/^^////((////>;=&%$@@",
+"HHNNNNNNNIIAxlga3[[[___[[6aiCJMORRRRRNNNNNHHvp7'!'++@$%&=;>>>>>((((3dnwDGJLLLJGDwuhf06}}}[69nyJMOQQQQOMMLLLLECxl1~)$@+..............+@&-:bxCJLLLExia3-&@..            ..+$&=>//^/[660dhsyJORRSSSSSSSSSSSSRRRRRRRQQQRRRRRRQMJxkkopvIHIzAkc3(/^///(((((//>>-*&%$@!",
+"HNNNSSNNOIFExtja9[[[__[[[9jxEMOOQRRQNOIIHHvp77!!!@@$%&~->>////////39hsDGLMOOMLJDysmd06[}}[6gtEMQQQQQQOMMMMMMLJCl1{)!@+.............+@&=>(alxEJEExta3(=%@..            ..+$&->///[[669dhsDJORRSSSSSSSSSSSSRRRRRRRRRRRRRRRQOMExkkozzHIIFAkca(///(/(((((>>>;-*&%$!!",
+"NNNSSRRQOMFECysgd6[[[[[[9jtCFMOOOOOIIFzzzpp7|)))))%&~-;>////////[3dnwDJLMOOOOLJGysgd6[[[[[9sCMOQRRRQQOOOOOOOOMAk2{)!@++...........+@%*;/(9ixCEExtg3(:*$+..            ..+$*->///[339ddgsDLORSSSSSSSSSSSSSRRRRRRRRRRRRRRRQOMCklkozIIIIFAkca3///(((::(>>>>;=&%$$!7",
+"NNSRRROOMMFECytjgd6[[[[9gtxEFMMMMIFFAAooo|22{{{{~~~=;>(///[[[[[39gsyGJLOOOOOMLJCysh0[[[[[9gxLOQRRRRRQQQQQQQQOMFo2{)$@+++.........+@%*;>/[9ixCECyja3(-&@+.             .+@%*;>///[39dddnwCMQRSSSSSSSSSSSSSRRRRRRRRRRRRRRRQOFAxkkozIIIIFAkca3//(((:::>>>>;-*&%$!!4",
+"NNRRROOMMLJJECDtsg99669ajxCEFMFFFAAokkkl11<<<----:::((([[[[[[39gsyCJLMOOOOOMLJCysg96[[[[[9tEMQRRRRRRRRRRRRRRQOFo2{)$$@++........+@%*;>//[atCEECtj3(;~%@..            ..+$&=>///[39ddddnyGMQRSSSSSSSSSSSSSRRRRRRRRRRRRRRRQMFCxkkAzIIIIFAtb33//(((::::>>;-*&%$@@'4",
+"NNNQOOMLLJJJJECDtng9999gtxCEEFEACxkkllicc::((((((::a33333[639gsyCJLMOOOOOMLLECysg9[[[^^[[atFOQRRRRRRRRRRRRRRROFk2{{)$@++.......+@%*;//^[6gtCEECta3(-&@+..            ..+$*;>///39ddddgsyEORRSSSSSSSSSSSSSRRRRRRRRRRRRRRQQMJCkkoAzIIIFFxlb33//(((::::;;;=*%$@@+'4",
+"NNOOMLJJEJJJJEGCysgd999gjxCCCCCxxklllicba333(333aaaaa993339gntCJLMOOOOOMLLGCysnd6[[^^^^^3gxLOQRRRRRRRRRRRRRRQOAk1~{%$@++.......+$*;(/^^[9nxEEExla(;*%@..             ..@%=>///[6ddggdgsyGMQRSSSSSSSSSSSSSRRRRRRRRRRRRRRQOMExkkoAFIIMFAxja33[/((:::;;;;-*&%@@+''4",
+"HIMLLJGCCGEEJEGDysg9999ajttxxxxxtktttliga933339abbjbba9999gntCJMOOOOOMLJGDtsgd9[[[^^^^^^3jxLOQRRRRRRRRRRRRRROMAl1~{)$@+.......+@&-(/[[[[9jyCECxja:=&@+..             .+@&->//[39dddddgsyJMQRSSSSSSSSSSSSSSRRRRRRRRRRRRRQOLCxlkoAFIMFFCtb33[//(((:;;;;-=*&$@+++'4",
+"IIFJGDDyDDCGGGDywnd96[39ajitttxxxCCCxytjga999abjjiijbaa9dgnsDGLMOOOOMLECysgd96[[^__]]^^^3jxLOQRRRRRRRRRRRRRQOFxl<~{$@+........+%~:([[[[6djtyxtia(;*%@...             .+$*;(/330ddddddgsyJMQRSSSSSSSSSSSSSSRRRRRRRRRRRRQOMExlllkAFFFFAxia3[///(((:;;;;-*&%$@+++'4",
+"zzGCywwwwyDDDDDBshd6[[[39abiltxCAEEECCytjgaagjjillijbaaaggnwDELMOOOMLGDwnh06[[[____]]]^[[gyJOQQRRRRRRRRRRRQOFAlc<{)@+...   ..+${;([[[[[69gjssja3>=&@+..             ..+%~:(330dddddddgsDJOQRSSSSSSSSSSSSSSSRRRRRRRRRRQQMJCtjclkCEFFECtb33[^^///(>;;;;-*&%$@+++''",
+"ooytsiinswwyyDywnh06[[[[39ajitxEEFFJECxtijjjjltllljjbbjgjnsyDGJLLLLECyshd06[[[_____]]__[6gyEMOQQQQQQRRRRRRQMEkc<~{$@+..    ..@%=(([[[[[[69dga93(-*$+..              .+@)<:339ddd9399dgtCLORRSSSSSSSSSSSSNNNRRRRRRRQQQQOLExibbilxAEECxia3[^^^^//(>;;;;-*&%$@+++''",
+"oklinggdgnswBywsnd0[[[[[[39gitxEEFFJECyttiillttllliiilltstwyyDGGGGDysnh0066[[[_________[6hwGLOOQQQQQRRRRQQMExib<~%@+..    ..+$~>//[[[[[[[[66[[(;~%@+..              .+!{<:aaddda3339dnyGMQRRSSSSSSSSSSNNHHIINRRQQQQQOOMExlbabblxCCCxtj93[^^^^//(>>>;;-=&%$@++++'",
+"|2ccaa39dhnswwwsnd0[[[[[[[9ajtxCEEEECxyttiitttlllllltxxxyyyyyyyyywsnhd066[[[[__________}6hsDJMOQQQQRRRQQQOLClb:<~%@+..   ..+$&;(//^^^^[__[[[[/>=&@+...             .+@)21ccgdaa33339gsDJOQRRSSSSSSSSSNHHzppzIOOQQOOOMLECtjaaabltxCxtig9[[^^^^^//>>>>;-=&%$@++.+'",
+"22<:::(33dhnuwwsnh96[[[[[[69gjttxxxxtttiiiiiliiilltxCAECCDyywsssnhdd0666[[[[[__________}0hsDELOOQQQRRQQQOLEyib:-*%@+... ..+@&->/^^^^^_____^^//;&$+...             ..+!22lligaa:::(39gtCLORRSSSSSSSSSNHvp777pzIOOOOMMLECtja99agitxxytna3[[^^^^^///>>>;-=&%$++..++",
+"){~<:::((3dhswywsgd6[[[[[[[39gjjjiiijjjjjjjjjjjilxCEFFFJECyysnnhd0066}[}[[[[[[________}0fmwDGLOQQQRRRQQOMJCtb::-*%@+.....+@%=>/^^^^________^/>*%@...             ..+$)2kkktic::::(3aiyEMQRRSSSSSSSSNHzp7777ozIOOOMMLECtjg999ajityytig9[[[^^^^^////>>;-=&%$++...+",
+"){~~=--;:(9giwywsnd0[[[[[[[669dggggaaaaaggggjjjlxCEFMMMLJCywshd0066}}}}[[[[[[[______}}0dmuyDJLOQQRRRRQQOMJxib::-~&$@+...+@%=>//^^^________]^/-&@+..             ..+@)2koACxtic<<::abtCLORRRSSSSSSSRIzp7!!!|ozFOOMMLECysg9999ajittttig9[[[^^^^^^///>>>-=&%$++....",
+"%%{*~===-::anwwwsnd96[[[[[[6699999999999aaaabjitCEMOOOMLJCysnd066}}}___[[[[[[[____}}60hnwyDGJMOQRRRRRRQOMExlc::-~&$@++++!{=:(/[[[^________^/>*%@....            ..@%~1kAFFAxlc<<::aixEMQRRSSSSSSSNIzp|!!!!)|AFMMMLECtjg99399ajitttsnd6[[[^^_^^^////>>;=&%@++....",
+"$%%&&&**~=:aisttsng906[[[[[6669999999999999aajtCEMOOOOOLECysg966[}____}[[[[[[[}}}}}60huBDCGJLMOQRRRRRRQOMGxlc:<=*&%@@+!){1:336[[[[[}}}____^/;*$+...            ..+${<lAFMMFAk1<<:abtCLOQRSSSSSSSRNIo|!!@@!)|oFFMFECtjg933339gjtttsjg96[[[^__^^^^///>>;=&%@++....",
+"@@$%%%%&&~<:ciwtsngd96666666999993366663339aglxEFMOOOOMLCysnd06[______}[[666[[}}}}60hsyDGJJLLMQQRRRRRRQOLEkl<<=~{%$$!!)21cgdd0066666[}}}__^/-&@+...           ..+@%~<kAMOOIAk1<<:ajxEMORRSSSSSSSRIz7!!@@@!)|oAFFECtjg93[[339gjitsjgd6[[[_^__^^^^///>>;=&%@++....",
+"@@@$%%%%%{~<cittsngdd000000099999336[[[[399ajtCEMOOOOMLEytnd96[[______[[666666}}660huyDGJJJLLMOQRRRRRRQOLCkc<<~{&%))!||kytsnhdd0000066}}__/>=%@...            ..+$&=cxFOOOIAk1<bablxEMQRRRSSSSSNIzp|!@++@@)|oAAACxia93[[[33aajiijgg9[[[_____^^^^^//>>;=*%@+.....",
+"+@@$$$%%%&{1clttsingdddddddddd99936[[[[399ajtxCJMMOOMFExtng9[[[______[[6666666}}60fnwDGJJJJLLMOQRRRRRRQMFCl1<~~{&)))|ooCCDysnhddd000066}_^/>*$+...            ..+$&<lAIOOOIAk1baablxJMQRRRSSSSRNIp|!!++++@)|koAAxlg9[[[[[339agjjgg96[[_______^^^^//>>;=*%$+.....",
+"++@$%%%%%%{11kxyttinggggghhgddd993[[[[699gjstyCELMMLJCxsgd0[[[______[[669000666660dnBDGJJJJLLOQQRRRRRQOMAkl1~~{{{{{2oAEJJCywnhdfdfff06}}_^/;&@+..            ...+${<kAIOQOIAkc:aaaixEMQRRRSSSSQIzo|!@+++@@)|ooAxtja3[[[[[339aagaa96[[________]^^^//>>;-*&$+.....",
+"+@$%&&&%%%{2kkxxytsssssnnnnngad93[[[[69agjttyDCCEEEGDyig96[[_______[[660ddd000000fhsyGJJJLLLMOQRRRRRRQOFok11~~~*~~1kAFMLLGysnhdffff006}__^/-&@...            ...+${1kFOQQNIAlb:39aiyEMQRRRRRRRIzo|)!@+++@!)|oAAxtj93[[[[3339aaaa93[[[________]]^^^//>>-*&$++....",
+"@$%&***&&%{2koCCxxttttssssinga933[[[[9ajjttyyyyyDDytsgd96[[[______[[[69dddddd000ffnwDGJLLLMOQQRRRRRRRQIAk2~~~~~=<1kAFOOMLEDsnhdfff006}}__^>=%@..             ...@${1oINRQIFola333ajyEMQRRRRRRIFpo|)!@+++@!)|oAAAtj93[[[[339aaaa99[[[[_________]^^^///>;-*%@+....",
+"$%*=--=*&&)|2oAACCyytttwtsngga33[[[[39gstyyyyywwssngd96[[[^_______[[69ddgnhhfdfdhnsyGJLLMOOQQRRRRRSSSNIo|{{~~==-<lxFOOOOLEDsnhdfff00}}__^/>*$+..             ..+@%{2AINNNIFkca3339jtGMOQRRRROIAo|))@@@+@@!|oAFFAtj93([[339aaaa993[[[[_________^^^^^^//>;=&$++...",
+"&*-;;;-*&&){2oAEECDyyywtsngaa33(/[[[9gjtyyyyyssnggd93[[^^_______^[[69ddgnnnhhhhmnsyDJLMMOQQRRRRRSSSSNHp7|){{~-::cxFMQQQOLEDwshhfff06}___^/;&@+..             ..+@%~kAINNOIAlb3[[[9gtCLOQQRQOIAo||)!@@@@@@!|ozFFAxj93((339aaaaaa93[[[[_____^^^^^^^^^^^^/>;*&$++++",
+"=;>>>>;=&&%{2oAEEECDyttsnga33(((//[[9gstyyyysnghd06[[[^^________[[[99gnnnsnnnnuwBDCJLMOOQQRRRRRRSSSSNHp7)){~=::cxFOQQQQOLJCyssnhff06}__^/>*%+..              ..+${1kzIOOIFxia3[[[6gsCLMQQOOIAo||))$@@@@@!)|zIIFFxia3((33aabbba996[[[[___[[[^^^^^^^^]]^^/>;*%$@@$",
+">>///>>=*&%{2kAFFECDytigaa3((>>(//[39gsyyyysnhd06[[[^^^]]]]]___[[[69ggnnssssswyDGEJLMOQQRRRRRSSSSSSNNv7!)){~<blxFOQRRQQOMLGDywumhd0}__^^/;&$+...             .+@%~1kzIIIFAkb33[[[6dsyJMOOOIzo|))!@@@@@@@!)7zIIMExia3(33aajjjgad966[[}}}[[[[[^^^^^]]]]]]^/>-*&&&&",
+"//^^^/>-*&%{2kAFFJECysga33((>>>>(((3djstytsngd06[[/^^^^]]]]]___[[69dgnsssswwyDCELLMOOQQRRRRRSSSSSSSNHv7!){~<<lAFORRRRRQOMLECDywumf0}_^^/>=%@+..             ..+$&~1kAFIFAxla3[[[[6dnyELMMFzp|!!@@@+@+@@@!|pzIIIFxlb:33abjjjjgad000666}}}[[[[^^^^^____]]^^/>-===-",
+"^^^^^/>=&%%)2kAFFJECtia3((>>;;;;>((3ajsttssgdd6[[/^^^^^]]]]]]__[[69gnjsttyyyDGJLMOOOQQQRRRRRSSSSSSSNHp7|{~<<lAMORRRRRRQOMLJGCDywmd0[^^/>;*%@...            ..+@%*=<lAFFFAkia93[[60dsxEFFFzp7!!++++++++@@)|pIIIIFxlc::abjltiingddd000000006[[[^^^_______]^//>;;>>",
+"^^^^//;=&%$){2oEFJCxiba::>;;;;;;;>(3ajsttsngd96[[//^^^^^^]]]]_^[[99gjstyDDCCGELLMOOOQQQRRRRSSSSSSSNNHp|211ckAMORRRRRRRQOMLJEGDywmf6[^//>=&$+....          ...+$&=-:lkAAAxklja9000dhsyGJFzp7!'++++++++@@$)|pFIIFAxlcbbbittttsnghhffeeeeeee066[[[[_______]^^/>>>//",
+"^^^//>-*%$$!)|oAEACtcb::;;;;;;---;::acittingd33[/////^^^^^]]]^^[[9gjttDCGGGEJJLLMMOOOQQRRRRRSSSSSSNNIpk11lkAMORRRRRRRQQOMLLJGDysh0[[//>;*&@+....         ...+$&*;>:blkxxxxttigdddhnwDGEFzp7''.+...+++@@)||AFIFFAklcccitxxxytsnmhhhheeeehff06[[[[}}}}____]^//////",
+"^///>-*%$@@+!!|oAokl<<===--;;;--==-:bcitlingd33/////////^^^^^^^[39jtyCEJLLLLLLLLLLLLMMOQRRRRSSSSSSNNzokllkAFORRRRRRRRQOMLLJEGDBrd6[//>>-*%@+...         ...+$&*;>((:clkxxCCCytnmmnsyDGEzp74''....+++@@$)2oAFFFExklccitxCCCxytsnmmmmhhmmmmmff06[}}}}}____]^/////[",
+"(((>-*%$++++''77oo22{{{**=-----====<<ciiliiga33(///////////^^^^[3aiyCJMMMMMMLLJJGGGEJLMOQRRRRSSSSSNIzoklkAFORRRRRRRRQQOMLJEGCysh0[[//>-*&$++...        ...+$&=;>///(ablxAEJJGDywsswDCGEzp4''.....++@@$){2oAFFFAxllcilxCCCCDywsurmmmmmmrrrrmhff0066}}}___^^//(339",
+"a3:={)@++.##''4477|)))%%&*=---=***~~<cilliiba3(((>>>>>>>>>>////[9jtCFMOQQQQOMLJCDyyxCEMOQRRRRRSSSSQIAokxAFORRRRRRRRRQOMLJJEGDBnd6[//>-*&%@+....       ...+@&*;>////(3alxEMMMLJCDyyDDGGzzp4''#....++@$){2koAFFEAxliiltxCEECDywuurrrrrrrruuurrmhhfe00}}___^^/39gii",
+"ic<{)!+.###,,,,447!!@@@$%&*===*****~~1cilicba:(>>>>>>;;;;;;>>/(3atCFMQQRRRQQOLEDttttCEMOQRRRRSSSSROFAoxAFORRRRRRRRRQQOLLJEGDysg9[//>-**&$++...        ..+@%*;>/^^^//3alAMOOOOLJGDDDGGEzp44''#...++@@$)22kAAFEACtliilxCCEECDywwuurrrrrruuwuuwuumhffe0}}__^[[9jtxC",
+"l12)!''###,,,,,44'''++@@$%&******&&*~<1ccccb:::;;;;;;-==**=-;>(3ixJMQRRRRRRQOLEDtttxELOQRRRRRSSRRROFAAAFOQRRSRRRRRRQQMLJEGCDynd6[/>-=*&%@++...       ...+$&->//^^^^/3atEMQQQQOLJGGGGJJzp44''#...++@$){2koAEEEAxliiltxCEEECDyBwuurrrrrruwwBBBBwwurhf06}}_[[9gsxCG",
+"k2|!'''##,,,,5544'''+++@$%&&***&&&&{{~<<ccc::---=====**&&&**-:(btEMQRRRRRRRRQMECytxEMOQRRRRSSRRRROMFEEFOQRRSSRRRRRRQOMLEGCDysg9[//;=*&&%@+....       ..+@%*;>/^^^^^/3bxLOQRQQOMLJGGJJJzp4'''#..+++!))22koAAAAxtliiltxCEEEGDyywuurrrrruuwBBDDDDDBwrmf06}}[6dntCGG",
+"22)!'''',',,555544''+++@@$%&&&&&&&&&{~<<<<<<==~*****&&&%%%&*=:blCMORRRRRRRRRQMECxCEMOQRRRSSSRRRRQOMFFMOQRRSSRRRRRRQQOLJGCDysnd6[/(;=*&&%@+....       ..+@&=>//^^^^/[9iCMQRRRQQOLJJGJJFzp4,''#..++!!)||oooCACxtijjjlxCEEJEGCDywuuurrruuwBBDDGJJGGDBumd06669ditxDx",
+"2))!!+''''445vvv477!++@@@$%%&&%%%%%%&*~=<--=~*&%%%%%%%$$$$%*-:cxEMQRRRRRRRRQOMJEEFMOQRRSSSSSRRRQOMMMMOQRRSSSSRRRRRQQMLECDysnd9[[/>;=*&%$@+....       ..+$&->//^^///3atFORRRRQQOLJJJJJFzp44,,''''!!77ooooCCCxtljbjitxCEJJJEGDDBBuuuuuuuwBBDGJLLLJGDyumd0009gnsttt",
+"))!!!!!!)77ppvvzpp7!!!@@$$$%%%%%$%%%%&*~==~*&%$$@@@$$$$@$%&~:biCJOQQRRRRRRQOMLJJLMOQRSSSSSSSSRRQOMMOOQRRRSSSSSRRRRQOMLGCywsg96[^/>-**&%$@+...        ..+$*->//////(3jCMQRRRRRQOMLJJJFFzv44,,,''477ppzzAAACxxtijbjlyCELLLLJGGDDBwuuuuuwBBDGJLMOOMLJDBuhdd9ddgnii1",
+")!!))){22|ozzIIIzpo|))$$$$$$$$$$$$$$%%&*~**&%$@@+++@@@@@$%*-:aiCJMOQQRRRQQOMMLLLMOQRSSSSSSSSRRRQOOOQRRRRSSSSSRRRRRQOMLGCysnd9[[^/>-*&&%$@+...        ..+%*;>////>((btFORRRRRRQOMLLJLLIIvv555555vvHHIIIFFAAxtljjjitCELLLMLLJGDDBwuuuuuwBBDGLMOQQOMLGDwsghdddaab<1",
+"!)){21<clkAFIIIIFAo2{))$$$@@@@@@@@@@$%%&&&&%@@++++++++@@$&=;(aixGLMOOQQQOOMLLLMMOQRRSSSSSSSSRRRQOOQRRRRRSSSSRRRRRRQOMLECywnd6[^/>;*&&%%$++...       ..+@&=;>//(>>::iAIRRSSRRRQOMLLLLMIIHvqqqqqKPPNNNNNIFEAxtljjitxELLMMMMMLJGDDBwuuuuwBBDJLOQQQQOMLGDwngddda:<~{",
+"7||21cclxAFMOOOOMFAk2{)$$@@@++++++++@@$%%%$@@+++.+++++@@%&->3ajtDGLLMOOMMLLLLMOQQRRSSSSSSSSSRRQQQQRRRRRRRSSRRRRRRRQOOLLGDtnd[[//;*&%%%$@+...        ..+%*;>///>;;<1kFQSSSSSRRROMLLLMOOHHKKKKKPPPNNSSSROMJAxtljjiyCJLMOOOOMMLJDDBBwuuuwBBDJLOQQRQQOMJGywngaa:<~{)",
+"ppokktxxEFMOOQOOOIzo2{)$@@++++++..++++@@@@@+++....++++@@%*-(3djsyCGJLLLLLLLLMOQRRRSSSSSSSSSRRRQQQRRRRRRRSSRRRRRRRRQQOMLEDtg9[//>*&%$$$$@+...       ..+@&=>>//(>;-12oINSSSSSSRROMLLMMONNNPPPPPPNSSSSSSSRMFExtljitxGLMOOOOOOMLJGDDBwuuuwBBGJMQQRRRQQOLJGDtigbc1||7",
+"vzzAACCELMOQQQQQOOIAo|!@@++..........+++++++......++++@@%*;(3ajsyDCGEJJJJLLMOQRRRSSSSSSSSSSRRRQQRRRRRRRRRRRRRRRRRQQQOMLGysa3[/>=&$@@@@@@+...      ..+@%*;>//((:;=12zISSSSSSSRROMMLMOQRNNNNNNNSSSSSSSSSROFCxtiistCELMOOQQQOMLJGDBwwuuuwBBGJMQRRRRRRQOMLECyti12|74",
+"NIIMFJFLMOQQQRRRROIzp|!+++........................++++@$&=>(3antyDCGEEJJLLMOQRRRSSSSSSSSSSRRRQQQRRRRRRRRRRRRRRRRRQQOOLJCtg9[//;*$@+++@@++...     ..+@%*;>///((:;<1kzNSSSSSSSRROMLLMORRSSSSSSSSSSSSSSSSROFCttiisyCJLMOQQQQOOLJGDBwuuuuuBBGJMQRRRRRRRQOOMJGCxoppvv",
+"NROOMMMMOQQQRRRRRROIp7!++.........................+++@@%&->3djsyDCCGEJJLLMOQRRRSSSSSSSSSSSRRQQQRRRRRRRRRRRRRRRRRQQOOMJCtn9[[/>=&@+++++++...     ..+@%*;>////((>:<<kFQSSSSSSSRQOMLLMORSSSSSSSSSSSSSSSSRQMJCtiiityCJLMOQQQQOMLGDBBuuuuuuBBGJMQRRRRRRRRQQOMLFzzHHPP",
+"SRQOMMMMOQQQRRRRRRRIz7!'+.........................++@@$%*;(agsyDCGGJJLLLMOQRRRSSSSSSSSSSSRRQQQQQRRRRRRRRRRRRRRRQQOMLJCyj9[[^/;*$@+..+++....    ..+@%*;>//////(>::<lFOSSSSSSSRQOLJLMORSSSSSSSSSSSSSSSRRQMExsinstyCJLMOQQQOOLJGDBwuuruuuBBDJMQRRRRRRRRRRQOOIIHNPNN",
+"SRRQOMMOOQQQQRRRRRRNIp7''+............         ...++@$%&=:3gsyCGGEJLLLMOOQRRRSSSSSSSSSSSRRQQQQRRRRRRRRRRRRRRRRQOMMLECynd6[^^>-&@+..........   ..+@%*;//^^/[[/((>(:lFORSSSSSSRQOMLLMRSSSSSSSSSSSSSSSRRRQMCtsinssyDJLMOQQQOMLGDywurrrruuBBDJMQRRRRRRRRRRRRQONNNNSS",
+"RRRQOMMOOQQQQQRRRRRNIz4''++.++.........         ...+@$%*-:bixCGEJLLLMOOQQRRRRSSSSSSSSSSRRQQQQRRRRRRRRRRRRRRRQQOMMLJCysg9[^^/;*$@+.........   ..+@%*;//^^^[[[//(((3iEORSSSSSSRQOMLMORSSSSSSSSSSSSSSSRRROLCtsnnswyDJLMOQQOOMJGDBwurrrruuBBDJMQRRRRRRRRRRRRRNNNSSSS",
+"RRRQMMMOOQQQQQQRRRRRIzp7!+++@@++++.....         ...+@@%*<ciyCEJJLLMMOQQQRRRRSSSSSSSSSSSRRQQQRRRRRRRRRRRRRRRRQQOMLJGDwnd6[^/>=%@+.......... ....@%*;/^^^__[[[/((((3bCMRSSSSSSROOMLMORSSSSSSSSSSSSSRRRRROLCytssswyDGLMOOOOOLJCywwurrruuuBBDJMQRRRRRRRRRRRRNSNSSSSS",
+"RRQOMMMMOOQQQQQRRRRROIp7!!@@@$$$@@++....         ...+@%{<ctxCEJLLMOOQQRRRRRSSSSSSSSSSSSRQQQRRRRRRRRRRRRRRRRRQQOOMLGDwn9[[/>=&@+...............+$&->/^^__}}[[/(((/3bxMQRSSSSRROMLLMORSSSSSSSSSSSSSRRRRROLGCytwwByDJLMOOOOMLGDywwurrruuuBBDJMQRRRRRRRRRRRRSSSSSSSS",
+"RRQMMLLLMMOOOQQQRRRROFo|!$$$%%%%%$@+....         ...+@){1ctDCEJLMMOQQRRRRRRSSSSSSSSSSSSRRRRRRRRRRRRRRRRRRRRRRQQOOLJDwn9[/>-&$+...............+@&=>/^^__}}[[(((>(/(axLQRRSSSRROMLMMORSSSSSSSSSSSSSRRRRROMLGCDyyyDGJLMOOOOMJGDywwuuruuuwBBDJMQRRRRRRRRRRRRSSSSSSSS",
+"RQOMJEEJLLMMMOQQQRRQOzo|)$$%%&&&%$@++...          ..+@${1clxCGJLMOQQRRRRRRRSSSSSSSSSNSRRRRRRRRRRRRRRRRRRRRRRRRQQOMLGyn93(-&$+...............+@%*;/^^__}}6663((>//(9tEORRSSRROMLLMMORSSSSSSSSSSSSRRRRRRQOMLLEGCDGJLMOOQOOMLGDywwuuuuuwBBDGJMQRRRRRRRRRRRSSSSSSSSS",
+"QQMLEGGGEJLLLMOQQQQOFA2{)$$%%&&&%$@+....          ...+${<bitCGJMMOQRRRRRRSSSSSSSSSSNNNRRRRSRSRRRRRRRRRRRRRRRRRQQQOLGyg9(:*$@...   .........+@$*->/^^_}}60003(((//[9lEMQRRRRQOMJJLMQRRSSSSSSSSSSSRRRRRRQQOOMLLJJJLMOOQQOOMLGDywwuuuuuwBBDGJMQQRRRRRQQQRRSSSSSSSSS",
+"QQMLEGCCGGGJLMOQQQQOFo2{)$$$%%%$$@++....          ...+$&<:bixCJMOQRRRRRRRSSSSSSSSSNNNNRRSSSSSRSRRRRRRRRRRRRRRRQQQMLCwg3(-&@+..    ........+@$&->/^^_}}60fd03(((//[3jxMOQRRQOMFEGJMORSSSSSSSSSSSSRRRRRRRRQQQOMMLMMOOQQQQOMLGDywuuuuuwBBBDGLMQQRRRRQQQQRRSSSSSSSSS",
+"QQMLEGDDDDCGJLOQQQQMEk2)$$@$$$$@+++......         ...+$&-(ajtCJMOQRRRRRRRSSSSSSSSNNNNNNSSSSSRSSRRRRRRRRRRRRRRQQQOLJDsa3>~%@..    ........++$&=>/^^__}}0ddd03((////3atEMOOOOMFGCCGLORRSSSSSSSSSSRRRRRRRRRRRQQQOOOOQQQQQQOMLGDywuuruuwBBDDGLMQQRRRQQQQQRRSSSSSSSSR",
+"QOMLEGDDDDDCELOQQQOMAk2)$@@@@@+++........        ....@$&-(3gtCLMQQRRRRRRRSSSSSSSNNNNINNSSSSSSSSRRRRRRRRRRRRRQQQOMJCwg9(;*$+..     ......++$&=>/^^]__}60ffd03(///^^[3iCFMOMMJCDyDGLORRSSSSSSSSSSRRRRRRRRRRRRRQQQQQQRRRQQOMJCywurrruuBBBDGJLMQQQQQQOOOQRRRSSSSSSRR",
+"OMMJEGDyyyyDGLOOQQOFCl{)$@@++++..........        ...+@$*;(3bxEMOQRRRRRRRRSSSSSSNNNHHINSSSSSSSSSRRRRRRRRRRRRQQQOMJGynd3(-&@..      ....+++@%*;/^^]___}60ef03((//^^^/3axAFMFFAxywyDJORRSSSSSSSSSRRRRRRRRRRRRRRRRQQRRRRRRQOMGDwurrrruwBBDGGJLOOQQQOOMMOQRRSSSSSSRRR",
+"MMLEGDyywwwyGLMOQOMFx1{)$@+++.............       ...+@%*;(3jxFMQQRRRRRRRRRSSSNNNNHHINNSSSSSSRSSRRRRRRRRRRRRQQOMLGysg93:*$+.       ....++@%*->/^]]__}}60e003(//^^^^^[9lxEEEAxtsswDJOQRRSSSSSSSRRRRRRRRRRRRRRRRRRRRRRRRRQOLGysrmmmruwBDDGJLLMOOOOMLLLMOQRRSSSSRRRR",
+"MLEGCDywuuwyGLMOQOMAk1{)@@++...............    .....+@%*;(bxFMOQRRRRRRRRRRSSSNNHHHIINNSSSSSSRSSRRRRRRRRRRRRQQOLJDwnd3(=%@..        ...+@$&->/^]]]__}}800063///^^^^^[3btCAAxysissDJOQRRSRRSSSRRRRRRRRRRRRRRRRRRRRRRRRRRQOLCwummmrrwBDDGJJLLMOOMLLJJJLOQRRRRSRRRRQ",
+"EGCCDywuuusyGLMOOMFAl1{%@++........................++@%~:alEMQQRRRRRRRRRRRRRNNHHzzIHNNSSSSSSRSSRRRRRRRRRRRRQQOLGysg9(-{@+.         ..++@%*;/^]]]___}}66666[//^^^^^^^3alxxxxtinnsDJORRRSRRRRRRRRRRRRRRRRRRRRRRRRRRRSSRRROJDwnmmmruBDDGJJLLLMMMLJGGGGJMQRRRRRRRRQQ",
+"CDyyywwurrsyGLMOOMExl<{%@+.......................+++@$&=:lAMQRRRRRRRRRRRRRROIzzpppzHNNSSSSSSSSRRRRRRRRRRRRRQOMJDtna3:~$+.          ..++$&->/^]]]____}}}6[[[//^^^]]^^39jtxxtijnnwDLORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSRRMJDwrmmmrwBGGJLLLLMMMLJGCCDGJMORRRRRRRQQM",
+"ttwwwwuumrsyGLMOMLAkc<~%@+...    .....+++....+++++@@$&*<cxMQRRRRRRRRRRRRQQOFAoo77pzHNNSSSSSSSSRSSSRRRRRRRRRQOLGyiga:=)@..          ..+@%*;>^]]]]]___}}}}[[[/^^^]]]^^[3bltttinnsyGLQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSQMJDwnmmruBDGJLLMMMLLJJGDDDDCELOQRRRRRQQML",
+"ssswwwuuruwDELMMMFClb:~%@+...    ....++++++++@@$$$%%&*-:lFORRRRRRRRRRRRQOMAok|||7pIHNNSSSSSSSSSSSSRRRRRRRRQOMJDtga3:{$+.           ..+@%*;/^]]]]]____}}}[[/^^^^]]]]^[3ajltiiiswDJMQRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSQMGywumruwDGJLMMMMMLJJGDDDDDCELOQQRRRQQMJC",
+"nnsuwwuuuswDJLMMMExj::=%@+..     ...+++@@@$$%%&&****~-:bxFORRRRRRRRRRRQOFAk22))|7pHNNSSSSSSSSSSSSSRRRRRRRRQOLGyia3:=&@+.           ..+@%*;/^]]]]]______^^^^^^]]]]]]^^[9gjiiiswyGLOQRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSQLGywuruwBDJLMOOOMLLJGDyyDDDGELMOQQQQQMJCt",
+"nnsuwwwuuwyCJLMMJClb3:-&@+...   ....++@$$%&&*=------;>:jAMQRRRRRRRRRRQOFAk12{))!7vHNNSSSSSSSSSSSSSRRRRRRRRQOJCtg93:~)+.            ..+@%*;/^]]]]]______^^^^^]]]]]]]_^[3ajiistyDJLORRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSOLGywuuuBDGLMOOOMMLJGDyyyDCGEJLMOQQQQMJCtn",
+"nruwBwwwuwyGJLLLExj3(>-&@+...  .....+@$%&*=-;>>>>>>>>(alAMOQRRRRRRRQQOLAkl1{)))|pvHNNSSSSSSSSSSSSRRRRRRRRQOMEDsa9(-{@+.            ..+@%*;>^]]]]______^^^^^]]]]]]]]_^[[9gnistDGJMQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSSSNNOLGywuwwBDJLMOOOMLJGDBwwyDGJJLLMMOOOMLGysn",
+"ruwBBBBwwBDGJLLExia3/(;&$+.........++$%&*-;>>////>>>/(atEMOQQRRRQQQOMLExl<1{{))7pHPNSSSSSSSSSSSRRRRRRRRRRQOLGyia3:~)+.             ...+$&->/^]]_____}[^^^^]]]]]]]]]__[[9dgntyCELOQRRRRRRRRRRRRRRRRRRRRRRRRRRRRRSSSNSNROLGywwwBDGLMOOOMLJGDwsstDGJLLLLLMMMMLEDsng",
+"uwBDDDBBBBDGJJECtb3///;*$+.........+@%&*-;>//////////(atCLMOOQQOOOMLJExlc<<~{{|7vHNNSSSSSSSSSRRRRRRRRRRRRQMJCtga3<{@+#              ..+$&->/^]]___[[[[^^^^]]]]]]]]]__[[69gntDCJLOQRRRRRRRRRRRRRRRRRRRRRRRRRQQQRRSNNNSQMLGDBBBBGJLMOOMMJGDwunsyCJLMMMMLLLLLECtsng",
+"wBDDDDDBByDGGGCtj93^//;*$+........++$&*=;>>//////>>>/(aixELMMMMMMLJECxlca:<~{{|pHNNNSSSSSSSSSRRRRRRRRRRRQOLGysga:~!+.               ..+@&=>/^^]_[[[[[[[^^^]]]]]]]]]___[60dntDGJMOQQRRRRRRRRRRRRRRRRRRRRRRRQOOMOORNNNQOMJGDyBBDGJLMMMMJGDwumnsyELMOOMMLLLJECysnnn",
+"BDDGGDDByDDCCDtj93^^//;*$+........+@%&*-;>>/////>>>>//3btxCEEEEEECCxtlba::<~~2ozHNNSSSSSSSSSSSRRRRRRRRRRQMJCwna:<)@+# #             ..+@&=>/^^^^[6666[[^^^^]]]]]]]]____}0dntCELMOQQRRRRRRRRRRRRRRRRRRRRRRQOMLFFMOOQQOMLECDBBDDGLLMMMLJDwughgsCJMOQOOMLJEGDysnnnh",
+"DDGGJGDDDDDDDyja3[^^^/;*%+.......++$&**-;>>>>>>>>;;>>((9jityxxxxxxttiba3(:<<12pIHNNSSSSSSSSSSSSRRRRRRRRQQLGDsna<{!+.                ..+$&->/^^^[[6666[[^^^^]]]]]]]]____[0dntCELMOQQQRRRRRRRRRRRRRRRRRRRRQOMJGCCEFMOOMLJGDDBBDGJLLMMLJDysngggtCLOQQQOMLECytsngghm",
+"DGJJJJGDDDDyysg9[^^^^/>*%+.......+@%&*==-;>>>>;;---;;>((3aggjiiiiiibaa3((:<<2ozHNNNSSSSSSSSSSSSSRRRRRRRQOLGysb:~)+.# ##             ..+%=>/^^^[[6666[[[^^^]]]]]]]]]]___[6dntCELMOQQQRRRRRRRRRRRRRRRRRRRRQMJCytyxCEFFJEGDDBBBDGJLLLLJGDwngdgiyEMOQQQOMJCysngddhhm",
+"JJLLLLJGDDywsg9[[^^^^/>=&@+.....++$%&**=---;;--=***==;>((333aaabccba:(((>:<12oINNNSSSSSSSSSSSSSSSRRRRRRQOLCyic1{!+## #              .+$*;>^^^^[[666[[[^^^^]]]]]]]]]]___}60ntDGJLOOQQQRRRRRRRRRRRRRRRRRRQOLCysiistDCCCCDyBBBBDGGJLLJJDBshddgixJMQQQQOLEDtngdddhmu",
+"MMOOOMLJDDBsgd6[^_]]^/>-&$+.....+@%&***======***&&&&**=;>>((::::::::((((>::1ozINNNSSSSSSSSSSSSSSSRRRRRRQOLCyic2)+.####             ..@&->/^^__}[[[[[[^^^^]]]]]]_]]]_____69gsyCJLMOQQQQRRRRRRRRRRRRRRRRQOMGDwngggiswyyywwwwwBDDGJJJGDyundaaaiCFOQQQQOLEDsndddhrwB",
+"OQQQQOMJGysnd6[[__]]^^/;*$++...+@$&**======***&&%$$$%%&*=----=<<<::((((((:blAINNNSSSSSSSSSSSSSSSSSRRRRRQOLGyl1)!'####             ..+%*>/^]]__}}}[[[^^^]]]]]]]]]_]______[0dntDGJLMOQQQQRRRRRRRRRRRRRRRQOLCysndddgnnsssuuuuuBBDGGGGDywnd93abiCFOOQQOOLGDsnghhrwDG",
+"QQQQQQMLGysg9[[^__]]]^/>=&@++++@$&*=---===***&%$$@@@@@$%&&***~~=<::((((((:ckAIQNSSSSSSRRSRSSSSSSSSRRRRRQOJCk2|!'#####             .+$*;/^^]____}}[[^^^^]]]]]]]___]_____}[9dnsyCGJLMOQQQRRRRRRRRRRRRRRQOMEDsnddddddhgmnrrruuwBDDDGDBwmd93::bixFOOQQOMLEDwsnnswDGL",
+"RRRRQQOLGynd6[[^___]]^^>-&%@@@@$&*=;;;;--=**&%$@+++++++@@$%%&{*~=-:((((33alxFORRSSSRRRRRRRSSSSSSSSRRRRRQMJCk|!'####             ..+$&;>^^]________^^^^]]]]____________[[69dgswyCEJLMOOQQRRRRRRRRRRRRRQOLCyuhd00660ddhhmmrruwBBDDDBwrd03::::ixJMOOQOOLJGDBwwBDJLO",
+"RRRRRQOLCyn96[[[^___]^^/;*&$$$%&*-;>>>;;;-**&$@++......++@$%%&{~~<::(333aixEMOQRRRRRRRRRRRRSSSSSSSSRRRQOMAk2!'### #             .+$&->^^]]_____________]_____________[[69ddgnsyDDGJLMOOQQRRRRRRRRRRRQQLEDsmdd0666600ffhmmruuwBBBBwrh03(:-<<cxEMOOOOOMLJGDDDGJLOQ",
+"RRRRRQOLCwn93[[[[[^__]^/>=*&%&&*-;>>>>>;;-*&$@+..........+@$)){{~<<:aaagitCJMOQRRRRRQRRRRRRSSSSSSRRRRRQMJxk|!'##               .+$*;>^^]]___________________________[[6dggnnsswyyDGGJLOOQRRRRRRRRRRRQOLDBrhd0666[660ffhmmrruuuwwumh03(:-==<ckELMOOOOMMLJJJJLMOQQ",
+"RRRRRQOLCtna936[[[[[^^^/>-*&&&*-;>>>>>>;;=&%@+.....    ..++@$)){211cccityCJMOQQRQQQQQQRRRRRRSSSSRRRRRQOFCl2!'##               .+$*;/^^]]___________________________[[9gnsssssswwByDDGJMOQQRRRRRRRRRQOLGysmhe066[[[60ffhmmmmrrrmmhf03(>;===<cyGLMOOOOOMMMMMMMOQQR",
+"RRRRRQOLCyjggadd996[[^^/>;****=;>>>>>>>;=*%@+....       ..+@!!))|2kkkkxDGFMOOQQQQQQQQQQRRRRRRRRRRRRRQOLEt1|!'#               .+$*;(/^^________^____________________[9gsyDDDyywwwwwBDDJLMOQQRRRRRRRRQOLDBuhfe06}}}[60fhhhmmmhhhff033((;-===<cyGLMOOOOOOOOOOOQQQRR",
+"RRRRRROLGytsjjnnng96[[//>;**&*=;>>>>>>;=*&$+....        .+++!!!!||ooCAEFMMOQQQQQQQQQQQRRRRRRRRRRRRRQOMExl1)@.               .+${:((/^^[[}}[^^^^___________________[6gsCEJEGCDywwsuwBDGJLMOQQRRRRRRQOLGDwrhee066}[[60dhhhhfff0063(((>>;===-:cyGLMMOOOOQQQQQQQQRRR",
+"RRRRRRQMJCyyyyyttng96[//>-*&&*=-;>>>;-=*&$++...         ..++!!!77ppzzFMOOOQQRQQQQQQQQQRRRRRRSRRRRRQOMLCtc1)+.              .+!{<aa93[[[6[[[[[^^^__________________[dsCJLMMLJGDywsswwBDGJLMMOQQRRQQOMLDBumhee066}}660dhhhdd0633(((>>;-=~==-:ixGJMMMOOQQQQRQRRRRRR",
+"RRRRRRQMLECCCCCDysgd6[//;=*&&&*=;;;;-*&%$@+...         ...+@@!!77pzzFIOOOQQQQRQQQQQQQRRRRRRSRRRRRQOOLExi:~)+.             ..@)1lllijgdddd066[[^^_________________[0gyEMOOOMLJGDBwsswBDDGGEJLMOQQQOOLJDwumhee866}6600dddd0663((>>;;-=***=-:bixELLMMOOQQRRRRRRRRRR",
+"RRRRRRQOLJEGGEGCysg9[[/>;*&%%%&*=--=*&%$@+....         ..+@@!!!77pzFIOOOOQQQQQQQQQQQRRRRRRSSRRRRQQOMJCtb:~$+.             .+!2kxCCCyttsnngd96[[^________________}[9sCLOQQQOMLEDywsuswwBBByDCJMMOOOMLGywrmhee066666099d9033((>>;;-==****=;:btCELLMMOOQRRRRRRRRRRR",
+"SSSRRQOMLJJEGGCDtn9[[//>=&%$$$%&***&&%$@++....        ..+@@$))||opzFIOOOQQQQQQQOOOQQRRRRRRSRRRRRQOMLExja<&@+.            ..+!2oFMMLLECDytsgd3[[[________________[6dtEMOQQQQOLJCywsuuuuunnnntxELMMLLEDywrmhee006666699333(((>;;-==*****=;:3gtCELLLMOOQRRRRRRRRRRR",
+"SSSRROMLJGGGCDysn9[[^/>-*%@@+@$$%&&%$$@++....       ....+@%&*~22kAEFMOOOOQQQOOOOOOQQRRRRRSRSRRRQQOMFCtb:~$+..            .+!|oFOOQOOMLJGDtna96[[_______________[[6gtEMOQQQOOLJCywsrnmhhd999ajtCELLJGDywrmmee80666[66333/(>>;-===***==-;>(3iyCJJLLMMQQRRRRRRRRRRR",
+"SSRROMJECDDyttjg9[[^//;*%@+++++@@$$$@@+++....     .....+@%*=-:<ckCEFLMOOOOOOOOMMOOQRRRRRRSRRRRRQOMLExlc~)@+.            .++!pIOSRRRRQOMJGxig93[[[}__________^^[[[6dsCJMOOOOMLGDwsnmhhd06[[[39jtCEEGCDywummhee0066[[[[//(>>;-======-;;>>(3asyGJLLLLMQQRRRRRRRRRSS",
+"SRQOFEDytsnngg9[[^^^/>=&@++....+++++++++..... .. .....++$&=;>(actCEJLLMMMOMMMLLLMOQRRRRRSRRRRRQOMMFClc<{@+..            .+!7INSSSSSRRROMFxtgd96[}}}______[///////33glxEFLLLJGywsghdd06[[[^^/[9jtCCCDDywurmhff0066[[[///>>;-=====-;>>(//[3gtCEJLLLLOQQRRRRRSRRSSS",
+"ROIExljggdd96[[[^^^^>-&$++.......+++++++......  ......+@%*;>((ajtCCEJLLLLLLLJJJLMOQRRRRRRRRRRQOMMFAtc<~$+..           ..+!7zNSSSSSSSSSQOFCtja9066}}}}}_[/////((>>((:bilkxxxytigdd0066[[/^^^^/3ajtyDDDyBwurmhhd006[[////>;;-===-;;>////[6dsDGJLLLLLOQRRRRRRSRSSSS",
+"IFClba336[[[[[__]^^>-&$++.........++++@++.............+@%*;(/39jtDCGGEJJJEGGCCELMOQRRRRRRRRRQOMFECxib<{$+..           .+!7pHSSSSSSSSSRROFAxigd9066}}}[[//(>;;;------<<<<1cccaa33333[[[/^^^^^^[9gttyyyyBywwummhd06[[////>;;----;>>//[[[3dnyCJLLLLLMOQRRRRRSRSSSSS",
+"Akla3([[[[[^__]]^^>;*$++..........++@!!!@++...........+@%=;//3aitDCCCCCDCDDyyyCJMQRRRRRRRRRQOMJExtjb:=&$+..         ..+@!pINSSSSSSSSRROOFAxtjgdd066}[[/(>;=********~~~~~~~<<::(((///////^^^^^/3ajsyyyDDDyywurnd96[[////>>;;;;;>(/([39dgntCELLLLLMOQQRRRRRRSSSSSR",
+"lca((/^^^____]]^^>;*$@+.........++@!)))))!@++.........+@%*;(/3aiyDDDDyyBwwtstyCLOQRRRRRRRRQMLECxtjb::=&@+....     ...+!|oINSSSSSSSRRRQOMMJECysnhd06[[/>;=*&%%%&&&&&****{{**~=-;>>((//////^^^^^[9gstyyDDDDDyBsng93[[////>>>>>>>((33agjstDCELLLLLMMOQRRRRRRSSSSRQO",
+"a3(//^^^]]]]]]^^>;*%@+.........+@$){22222{)$@++.......+@%*;>/3gsyDDDywwunnnisyELOQRRRRRRRQMFECxtjba(:=&$@+.........+@!|ozNSSSSSSRRRQQOOOMMLJECyshd93(>-*&%%$%%%&&&&*&*&&&&&**==-;>>>>////^^^^^[9gjtyDDCGGGDywsg96[///////(>>(((39gitxCGELLLLLMMMOQRRRRRRSSSSSOMF",
+"3((/^^^]]]]]]^^/;*%@+........+@$&~1<1lcc<<~{%@+........@%*;>(3gsyDDywsnmhhgntxEMQRRRRRRRQOLECxtiba3(:=&$@++.....++@$)2kzIRSSSSRRRRQOOOOQQQOOMLGysh93:-*&%$$$%%&&&********&*****=-;>>>///^^^^^^[3gjtyDCGGEGGDysg9[[///////////[39gtCEJLLMMMMMMMMOQRRRRRSSSSSSQMAx",
+"(//^^^^]]]]]^^/>=&$+.......+@$%*=::bbbcb::-~&$@+.......@%*->(3gsyyyBsnhdddgiyELOQRRRRRRRQMJCxtljba3(:-*%$@+++++@@%&~1kAIRSSSSSRRQQOOOQQRRRQQOMLCyia:;~*&%%%%%&&**=====********==-;>>>//^^^]]]^[3antyDCGEEGGDysd9[[[[[[[[///[[69gtCJMOOOQOOOOMOOQRRRRRSSSSSSRIAki",
+"//^^^^^]]]]]^/>-*%@+......+@$&~->((33aa3(:-=*%@+.......+$&=;(3gsyywsnhd09djtCJMOQRRRRRRROMExtiija33(>-~&%%$$$$%&*=-:lAIRRSSSRRRQOMMOQQRRRRRRQOMExia:-~*&&&&&&**=--;;;;;---====--;;>>/^^^]]]]]_^[9nsyDGGEEEGDwnd6[[[[[[[[[[[669gsDEMOQQRQQQQOOOQQRRRRSSSSSNNIzkca",
+"///^^^^^]]^^^/>-*%@+......+$&=;>(((333((>;-=&%@+.......+$&*->3aitssnhd069diyELOQRRRRRRRQOLExtija93((>;-=*&&&**=-;>(cxFORRRRRRQOOMMMOQQRRRRRRQQMExib:-=**&***==-;;>>>>>>>>>>;;;;>>>//^^]]]]]]]_^[9nsyCGGEEGCysg9[[[[[[6660600dgsyELOQRRRRRQQQQQQRRRRSSSSSPPHzo1b3",
+"//////^^^^^^//>-*%@+.....+@%~;>(/////((;-=~*&%@+.......+@%*-:(aninnd06669gtCJMOQRRRRRRRQOLCytjga33(/(>>;;--;;>>//3bxFOQRRRRQQOMFFFMOQRRRRRRRQOFCtc::-=~****=--;>>>>///////////////^^]]]]]]]]]__[9gsyCGGEGCytnd6[[[[60dfdhhdhmsyGLOQRRRRRRRQQQQRRRRRSSSNPKKv7|1::",
+"(///////[[[[(/(;=&%@+...+@%*->((/[///(;-**&&%$@+.......+@%*=;:agggd06[[39gtCLMOQRRRRRRQOMEDtiga33(/////>>>>/////3bxEMOQRRQQOMFECEFLOQQRRRRROMFAklc:-=~*****=-;>>>///^^^^^^^^^^^^^^]]]]]]]]]]]]^[9gsyCCGGCDtsd96[[[60dhmrrmmruwDJOQRRRRRRRRQQQQRRRRSSSNPKq54'!{~-",
+">((((33aabbbaa3::~&$@+++@$&=:(333[[/(>-*&%%%$$@++......+@%*=;(aagdd3[[[39gtCLMOQQRRRRRQOLCyiga33[////////^^^^^[3btEFOQQQQOMFAxttxCFMOQQOOOIFAolc<<<~~*&&&**=-;>>//^^^]]]]]]]]]]]]]]]]]]]]]]]]]^[3gsyDCCCDtsgd06[660dmuwwwuwwBDGLOQRRRRRRRQQQQRRRRSSNPKqq5,,'+$&~",
+":::abblxCCACxtib:<{%$@@@%*=:33aad333(:=&%$$$$$@@++.....+@%*=;:3ada33(/(39jtCJMMOQQRRQQOLGysga93[///^^^^^^^]^^[3btCFMOOOOMFAxijjjtxEFMMMIFAokk211~~~{&%%%%&**-;>/^^^^___]]]]]]_________]]]]]]]]^^[ajtyDyytsgd906600dnuwBBBBwByDJMQRRRRRRRRQQQQQRRRSNNHq5,,##.+@%&",
+"<ccltCFMMOOMMExic1{)$$%&~-:abnjijga3(:~&%$$$%%$$@+++..+@$%*=;::aaa3((((39jtCEJLMOQQQQOLEDsg93[[/^^^^^^^]]]]^[3gtCEMMMMMFExlja99ajtxCAAAoo||22{{{{{&%%$$$%&*=;>//^^______]]]]]__[[[[[^^_]]]]]^^^^[9gjtttsngd99000dhnuBDDDDBBBDGLOQRRRRRRQQQOOQQQRRNHv5,,### ..+$%",
+"<clxEMOQQRRQOMEyi1{))%{=::aityxxttja::={%%%%&&&&%$@++++@%&*=-:::a:3((((39gsyDGJLMOOOOLEDsg9[[^^^^^^^]]]]]_^[3gtCELMMFFECxja99999ajjlll22|{))))))))%$$$$%%&~;>//^_______]]]]]__[39999[[^_]]^^^^^^[3dgnnggd990090dhnsBDDDDDDBDDJMOQRRRRRQQOOMMOOQOOIv4,###   ..+$%",
+"clxEMOQRRRRRROJx22{)&*=:agtxCCECCxtja:=~&&&&*****&%$@@@$%&*~=<<:::((((33dgityDGJLLLLLGDsg9[[^^^^^^^]]]]]_^[9gtCEJFFFECxtja9936639aaab<1{{))))))))))%%%%&*=;>//^_________]]]__[9ajjjg93[^^^^^^^^^/[39dd99666609dhnswBDGGGDDDDGJMOQQRRRQOMLLLLMMMMzp4'##     ..+$%",
+"clxEMQRRRSSRROzo||){{=:agtCEJLLJECxlb::==~~=--;;;-=*&&%&&*~~~<<<:::(((33dgnstyyCGEEGCynd6[[^^^^]]]]]]]__^[3gtxEEEEACxtjga9996663333(::=~~{{{{{{{{{{{{*~=;>(//____}______]]__[6ajttttj9[[^^^^^^^^/[[6366[[[[660dgnsBDDGGGDDDDGLMQQQQQQOMLEGCCCECoo7'##      ..+$%",
+"ackEMQRRSSSRRIzo2{{{~::gtCELMMMLLECtb::;--;;;>>>>>>;-=~~~~~~~~1<<::((333dggnnswyDDDysnd6[[___]]]]]]]___[[3aitCAACxtljbaa9999996[[[(/(>>;;---<<<::<:-:::((/[[}}}}}}_____]_]__[9nsyyytja3[^^^^^^^^/[[[[[[[[[[60dhnuwBBDGGGDDDCGLMOQQQQOLECyttttll2)!'.       ..@$&",
+"3alAMQRRRRRRIzo22{{~::btCJLMMMMMLECtb:::>>>>>////^//>>;;--=~~~11<::33339dghggnsswwsng96[____]]]]_____[[[3ajtxxCxklcbaa9dddddd006[[///////((333aa93333333[[}}}}}}}}_____]]__[[djtyyysnd6[^^^^^^^^^[[[[[[[[[[60dhnuuwBDDDDDDDGJLMOQQOMLGDsjgaac1{)++..      ...@%&",
+"(3jxFOQRRRROIAk2~~<::btCJMMOOMMMMEClc:(>>>////^^^^^^///>>;-=~~11<::33399dddhhgnnsnng96[[^___]]___^[[[[69agittkkllcbaaaddhhhhhd06[[^^^^^[[[69dddhddd00066666}}}}}}}____]]]__[6dnswwsnh9[[^^^^^^^^[[[[[[[[[[[60dhmuuwBBBDDDDDGJLMOOOMLGyja93(:~{!@+..       ..+@%*",
+"/3atEMOQQOOFAk1<<::abtCJMOOOOOMMLExlb:(((////^^^]]]^^^///>:-<111cba3999ddddhhhnnngg96[[________[[[699dgggjiiliccc:aadddhmmnmhd0[[[[[_[}[660dhmmmmhhfee0008888}}}}____]]]]__[6dgnnngd06[__]^^^^^^[[[[[[[[[[60dhmrruuuwwBByyDGJLMMMMLGyja3((-*%$++..        ..+@&=",
+"/(3jxJMMMMExlc::((3aiCJMOOOOOOMMFExia:(((///^^^^]]]__^^//((:<<<cbaaddddddhhhgnnnngd96[[______[[69dnnjjiijjcccc<<::addhmmrrrmhd0[[}___[}60dhmmuuurmhfeee8888888}}____]]]]]__[60dhhdd06[___]]]^^^[[66[[[[[[[60dhmrrrruuuuuwwyCELLMLJGysa3((-*%@+....        ..+$&-",
+"//39ixEEAxtca3((33diyEMOQQQOOOMMJCtb:(((////^^^]]]]___^^//((:<ccbggggggnnnsssssssnd06[[[___}[60gntyyyttijcbc<:::a9ddhmrrrrmhf06}}}__}}60ffmuuuuurmheeee888888}}}___]]]]]]__}60000066}____]]]^^[[600666[[[60fhmrrrrrrmmmmrsyCELLLLGDsg9[/;~%@+...         ...@&=;",
+"^/[3ajltiba33(/[39gyGLOQQQQQOMMLExib:(((////^^^]]]_____^^/((::bbcnnsssstyyyDDDyysngd006}}}}}0dgsyCCCCxticb<::::30dhhmrrrrmhf06}}__}}}600dhmuuwuurmheee888888}}}____]]]]]____}66066}}____]]]]^^[60ddd066600fhmuuurrmmhhfhhswCELLLEDtg93/(-&$@+..         ...@%*;>",
+"^^[[[999933[/[[[6dsDLOQQRQQQOMLJCtja3((/////^^^]]]_____^^[(((:abnitwyyDCGEJJJJGDysnhdf006600dmsyCGEECylcc:::::300fhmrrrrmhe06}}___}}}60fhmuuwwurmhfee088888}}}____]]]]]]____}}}}}}}____]]]]]^[60dhhdd0000dhrswwurmheee0ddntDGJJECyja3[/>-&$@+...      ...+@%*;(/",
+"^^^[[[[[[[^^^[[6dnyJMQQRRRQQOMLExlba3((////^^^^]]]]]]__^^[/(33agisyyDGEJLLMMMMLGDwsnhhfffefhmsyCGEECxlcb:::(3300femmrrmmhe06}}_____}}60fhmuuwuurmfee00086}}}}}___]]]]]]]____}}}}}}_____]]]]_^[0dhmmhdd0ddhnwBBwwrmhe0000dntCGJJEDtj93[/>-&$@+..... .....+@&=>//[",
+"[^^^^[[[_^^___}0hBGMQQRRRRQQOMLExib33(////^^^^]]]]]]]__^^[/(3aansyDCGJLLMOOOOOMJCywurrmmhhhhnsyDCCCxlca::(33660eemmmrmmhe06}_______}}60fhmuuuurmhf000666}}}}}____]]]]]]]____}}}}}______]]]__[60hmmmmhdddhuwyDyBumhe06660dntCEJEGytg93[//;*&@++........+@$*->/[[[",
+"[[[^^^_______}6duDLOQRRRRRQQOMJCtja3(////^^^^]]]_]]]]___^//(3agsyDCGJLLMOOQQQOMLGDBwwwurrmmmnswyyytiba33336660eemmrrrmme06}}________}}0dhmuuuurhd00666}}}}}}____]]]]]]]]___}}}}}_______]___[[6dhmmmmhhhmuwyDDDBumf06}}60dsyGEJECytg93[//>;*%$@+++++++@@%*;(/[[66",
+"[[[/^^______}6fmBJOQRRRRRRQOMLGxia3((///^^^^^_____]]]___^^/(3aitDGJJJLLMOOQQQOMLGDDyyBwwuurmniiiicba:33336660eemmrrrrmhf06}_________}}0fhmuuuumhf0066}}}}}}____]]]]]]]]____}}}}____________[}0fhmmmmmmnuwDCGGDBrh06}}[69gtCEJJECytg93[[//>;*&%$@@@@@@$&*;>/[[666",
+"(////^___}}}60hwGLQRRRRRRRQOLECtg93(///^^^^^_____]]]]]]]^^/(3atDGJJLLLLMOOQQQOMLGGCDDDDBwunnggaaa::(((3[[660eemruuwuumhf06}_________}}00hhnrrnhd006}}}}}}}_____]]]]]]]_____}}}}__________[[[60fhmmmmmnsyDGJJGDwnd6}}_[69jyCEJJECytja9[[^^/>;=&&%$@@$$&*;>//[6666",
+"(((/[[}}}}60fmuDLOQRRRRRRQOLECtg93(///^^^^^______]]]]]]]^^/(3btCJLLLLLLMOOQQQOMJJGGGGGDDBwngaa::::((([[[660efmrwBBBBwrh06[[________}}60dhhnnnhd0066}}}}}}}____]]]]]]]]____}}}}}_______^[[[[600fhmmmmrswDELLLJDwh06}_[[6atxEEJEECytjg9[[^^//>-*&%%$$$%*=>///[6663",
+":>((/[[600dhuwDJOQRRRRRRQOMJDtg93(/////^^^]______]]]]]]]^^//3cxGJLLLLLLLMOOOOMLJJGGJJGGDysic:::::((([[[660ehmuwBDDDywnh06[[________}}60dhhnnhhd0666}}}}}}}____]]]]]]]____}}}}}}}____[[[[[6600fhhmmruswDELMMLJCsh0[[^[[3gtCEEEEGCxttga9[[^//>;*&%$$$%&*;>/^/[[333",
+";;>([66dhnwyDJLOQRRRRRRRQOLCtn93(//////^^^]_____]]]]]]]]^///3bxGJLLLLLLLMOOOOMJJGGGJJGGDBic<<:::((([[[60efhruBDGGGDysnd6[[[________}[60ddhhhhd0066}}}}}}}_____]]]]]]____}}}}}}}}}_}[[[6999ddhhhmruuwBDELMOOMLGwg0[[^[[9jtCEEEEECCxtjg9[[///;=*%$$$$%&=>//^[[[[((",
+";>(/[6dnwDGLMOQQRRRRRRRRQMJDjd3[///////^^^]]____]]]]]]]^^//((bxGJLLLLLLLMMOMMLJGCCGGGGDysic<:::((/[[660fhmuwDDGJJGDysg9[[[_________}}60ddhhhdd0666}}}}}}}____]]]]]]____}}}}}}}}}}}6699ggnnnsssswwwyyDELOOQQOMEyn9[[[[39jtxCCCCCCCxtsg93[(/>-*%$@@@$&*->/^^^[///(",
+">///6dnyGLOQQRRRRRRRRRRRQMEyg93(/((/////^^]_____]]]]]]]^^//((cxELLLLLLLMMOOMLJGDDDDDDDytic<::>(//[[60fhmuwBDGJJJJGysg9[[[__________}}00ddhhdd006666}}}}}}____]]]]]____}}}}}}}}}}6609gnstyyDDDCDDDCGEJLOQQQQQOLDsd3[[[3ajtxxCCCCCCxyig93((>-*%$@@@$%&=>/^^^^^^///",
+"///[0myJMQRRRRRRRRRRRRRRQLGtg3(/(>>////^^^]_____]]]]]]^^//>>:lxJLMMMMMMMOOOMJGDwssswtttic<::((/[[[6dhmuwBDGJJLLJGDwn9[[[__________}}600dhhhdd00066666}}}}____]]]]____}}}}}}}}}}609dnstDCEJJLLLLLLLLMMOQQRRRQOMGtg93339ajittxxxCCCxtib33(;=*%$@@@@$&=;>/^^^^^^^//",
+"^^[6hwJMQRRRRRRRRRRRRRRQQMCta3(((>(////^^]_______]]]]]^^/>>>:lCLMOOMOOOOOOOLGDtingniiiicc::((/[[60dhuwBDGGJJLLJGCynd6[[___________}}60ffhhfdf00006666}}}_____]]]]____}}}}}}}}6600dnsyCELMMOOOOOOOOOOQQRRRRRRQMJyia93399gjjiltxxCxysja::-~&%$@@@@$&*;>/^^^^^^^^^^",
+"^^[dsGMQRRRRRRRRRRRRRRRQOLCta3((((///^^^__________]]]]^//>;:bkEMOOOOOOQQQOMJCticaaacciccb:3([[[60hnwyDGJJLLLLJGDysd6[[______]____}}60fdhhhfff00000088}}}_____]]]____}}}}}}}66600dnsyCJMMOQQQRQQQQQQQQRRRRRRRQMJxia999999aaajityyytib:<~{%%@@@@@$&*;>/^^^^^^^^^^^",
+"_[6nCMQRRRRRRRRRRRRRRRRQOLCtb93((((//^^____________]]]^/>;;-ckFMOOOQQQQQQOMExl1<:::ccccba336[60dhsyCJJLLLLLLJGDysg9[[____________}}60ffhhhfffe0000086}}______]]______}}}}}6000dhnsyCJMOQQRRRRRRRRRRRRRRRRRRRQMExja933333339ajistiib<<~{%$@@@@@$&*;>/^^^^^^^^^]]]",
+"[[gCLQRRRRRRRSSSSRRRRRRQMExtga99333[[[[____}}______]]^^/>;-<1kFMOOOQQQQQOOFAk21<<::acccgad9099hnwDGLMOOOMMLJGDBwnd0[[___________}}60efhhhhffee008086}}_____]]]_______}}}6600dhnstyCJMOQQRRRRRRRRRRRRRRRRRRRQOLCta93333[[3333abjjbb<1{)$@@@@@@$&*->/^^^^^^^^^^]]]",
+"[gyLQRRRRRRSSSSSSRRRRRQOLExtjbggggad966[}}}}}}_____]]^^/;-==1kEMMOOOOQQOOMzo211<:::aagggggddhnsyCJMOOQQOOMLJGDwuhd6[[__________}}}00ehhhhhfeee0806}}}}__^^^]]]]______}}600dhnssyDEJMOQQRRRRRRRRRRRRRRRRRRRROMEtb933(///////3333a:<~{!@@+++@@$&*->/^^^^^^//^^^]]]",
+"atEORRRSRRSSSSSRRRSRRRQMJCytiiitstsjndd0066}}}______]^//;-==<kCFLMMOOOOMLEok21<<:::adgnnnggnstDGLMOQQQQQOOLJDBunhd06[[________}}}88ehhhhhefee0066}}}[^^^^^^^^^]]____}[60dhgnsyDGJLMOQQRRRRRRRRRRRRRRRRRRRQOMEtj93((/(//////((((:<~)!@++++@@$%*->//^^^^/////^^]]]",
+"jCMQRRSRRSSSSRRRRSRRRQOLExttittyyDDytsnhdd006}_____]]^//>-==<lxGJLLLMMMLEok11<<::(3ddhnnnnswyDELMOQQRRQQOOLJDywnnd066[}_____}}}}88eeehhheee006}}}[[/////>////^^^^^[[[60dgnstyCELMOQQRRRRRSRSRRRRRRQQQQQOOMFCtba3((((>>(//////(:={)@++..++@$%*->>/^^^//>>>//^^]]]",
+"xJORRRSRSSSRRRRRRRRRQOMExttistyDCCCCCyyssnhd06}____]^^//>;-<<itDGGEJJJECxk11<-::(330dhhnuswyDGLMOQQRRRRQQOLJDysnndd066[[[}}}}}}}88eeeeefe066[[[[////>>>;;>>///^^^[[[9dgnstyDCELMOQRRRSSSSSSSRRRRRRQQOMMLJCxlba::::::;>>(////(>-*%@++..++@$%*->>//^///>>>>>/^]]]^",
+"CMQRRSRRRRRRRRRRRRRQOMExtjnnistyDCGGGCDyywshd6[___^^^///>;-<<clyDDCCCCxyl11<=;:((360ddhmnsyDGJLOQQRRRRRQQOLGDysnngd9066[[}}}}}}8888eeee066[[[////>>>;;-;;;>///^^[[[9gnsyDCCGJLMOQRRSSSSSSSSSSRRRRQQOMLGCylccc:<<<<<-;;>/////>;~&$++...+@@%*->>//^//>>;--;>/^^]__",
+"EMQRRRRRRRRRRRRRRRQOLEDsnggdgnswyDGGGGGGCDysg06[^^^^^///(>:::cityyDDyytic1<=-;>(/36660dhnsyDGLMOQQRRRRRQQOLGywsnggd9966666}}}}}}8800066[[[////>>>;;----;;>(///^^[[9gstDCGGJLMOQRRSSSSSSSSSSSSRRRRQOMLGDtic<1111111<-->>/////>-*%@++..+@@%*->>/^^//>>-===;>/^]]_[",
+"JMQRRRRRRRRRRRRRRQOMJDtndd0ddhnuwyDCGGGGGCDynd6[^^^^/////(((abittyyyttic<<~=-;>(/[[6600dhnwyGJLMOQRRRRRQOMEDwnnggdd99666666}}}}}}}}}}[[////(>>;;;-----;>>/////[[[6dntyCGJLLMOQRSSSSSSSSSSSSSSRRRRQOMJCyic<1222|221<<:>//////>-*%@++++@$%*->>/^^^//>-***=;>^]]__[",
+"JMQRRRRRRRRRRRRRQQOLGyshd0000ddmmuwyDGGGJECysg9[[^^^/////((3agistwwssic<<~~=->(//[[}}660dhswDGJLOQQRRRQQMLCtngdddd999666666}}}_____[[///>>>>;;;-----;>>/////^/[[[6dnsyCEJLMOQRSSSSSSSSSSSSSSSRRRRQOMJDtic122|oook1<:(///////>-*&$@@@@$%*=>>/^^^//>;=***=;/^]]_^[",
+"JMOQRRRRRRRRRRRQQOMJCwnd0000000fhmrwBDGGJJGDtnd6[[[[[[[[[339agissssincc<~~~=;>(/[[}}}}660dgswyGJMOQRRQQOLCtnd9909999966666[}_____^^//(>>;;;;;;----;;>///^^^^^^[[[0dgsyDGLMOQRSSSNNNSSSSSSSSSSRRRRQOMJDti112|ooooklb((/^^^^//>;-*&%$$%&*->>/^^^^//>-****=>/^]]_[[",
+"ELOQQQRRRRRRRRRQQOLEDtnh00000000fhmuwBDGJJGDynd9[[[[[[66639agiisssinga:<~**=;>//[}}}}}}660dnstDGLMQQQQOLCtg96[[[66366[[[[[[___]^^//>>;------;;;;;>>>//^^^^^^^^[[[60hntyCLMORSSNNNNNSSSSSSSSSRRRRRQOLExli1122kokklca3/^^^^^^//>;-=*&&*=->//^^^^//>;-***=;>/]]__[[",
+"ELMOOQQQQQQQRRQQQOLECtsgdd000000ffhmuwDGGJGDysg99660999ddagjisttsinga:<~{{*-;(/[[}}}}}}}60dhnsyCJMOOOOLCtg9[[[[[[[[[[[[[[[^_^^^^/>;;-=***=-;;>>>>///^^^]]]__^_}}}60dgsyGLOQSSNNNNNNSSSSSSSSRRRRRRQOLCxlcc<1lllllba3[^^^_^^^^///>;;---;>//^^^^^//>;-==-;>/^]]__[6",
+"CELLMMMMOOQQQRQQQOLECysngddddddddfhmuwDDGGGDysngdgggnnnnniistyytsngaa:~{&{~->//}}}}}}}}}00dhnwyCELMMMFAtb3((////[[[[[[[[/^^^///>;-=******=;;>>///^^^^]]]_____}}}}60dgsyEMOSNNNNNNNSSSSSSSRRRRRRRQOLExlibbbbbccbb93[[^___]^^^^^////>>>//^^^^[[[//>;;;;>>/^]]___[6",
+"DGJJJJJLLOOQQQQQQOLJGDtsnngnnnnnnnmuuwyDGGGDyssnnsswttttttyxCCCxtiga:<{%%&~;(/[}}}}}}}}60fhnswyCELLMFAxl::>>>>>(((((((/////>>>;-=*&&&&**=;>///^^^^^]]_____}[[}}6600hsyCLOQSNNNNNNSSSSSSSRRRRRRQOMLECticbaaaaaa933[[[^____]]^^^^^^^///^^^[[[[[[/(>>>>>//^]]]___}6",
+"yDDGGGGJLMOQQQQQOMLJGCytsssstyyywwwwwyDDGGCDyywwyyDDCDCDDCCEEEECxtcb<{)%%&~;(/}}}}}}}}800fmuBDCEJLLLFAk1<--------;:::::::;;;-==**&&&&**->>//^^^^]]]___^[[[6600000dhnyCLMORSNNNNNSSSSSRRRRRRRQOOLJGxxtijgaa99933[[[[[____________]]^^^^[[60dd063(((>//^^]]]____}6",
+"wByDDDDGJLOOQQQOOMLJGCytstyDGGGGCDyyyyDDGGCDDyyDDGEEEEGGGGELLMLJCxic~))$%&=>/[}}}}}88880ehuBDGJLMMMMFAk11=========<<<<--======******=-;>//^^_________[[[09dhhhhhhnsyGLMORSSSSNSSSSSRRRRQQQOOMLECDxytttsigga993[[[[[_________________[[0dgusnnd3((///^^]]]_____}6",
+"uwwBBBDDGLMOOOOMLLJEGCyttyCELLLLJEGDDDDDCCDDDDDCGJLLLJEGGEJLMMMMJCk1{)!$%{->/[}}}8888880fmwDGLLMOOOOMAok1<======<<<<<<111<<=------;;>(//^^__________[[9answtwwwwwyDGLMOQRRSSSSSSSRRQQQOOMLLECDytttyxDDxytijgd93[[[[[_______________[60hsByDysnd3(//^^]]_______}6",
+"muwwBBDDGJLLMLLLJEGCDyttyCELMOOMLLJGCDDDCDDDDDGGJLLLLJEGGGJMMOOOLAk2|!!!%*;(/[}}6688880efuyGLMOQQQQOOFAkc<<::::::<c111l111<::>>>((////^__}}_______[[[9ntDCGEEEGGGJLLOOQQRRRRSRRRRQOMMLJGCDytsiiisyDGEEGCCytjga996[[[[___[[[[[[}}_}}6dmwDGJGCysg33/^^]_________}}",
+"mruuwBBDDGJJJGGCCDDyysssyCJMOOOOMLJGCDDCDGGGGGGJLLLLLJGCCCELMOOOMFo|!!!!)~;([[}}68888800hsDJMOQQRRRROOFCtca3333aacitkxCCxkiba33[[[[[}}}}}}}______[[6ajxGLLMOOOMMMOOOQQQQQQRRQQQOMMFECxtsnnggagjiyCELLMLLECytsngd99[[[[[[[[66666}}}6dmwDJLLLECtg93[^^__________}}",
+"hmruuwBBDDDDDDBBwwwssnnstCLMOOOOMLEGCDDCGGGGGGJJLLLLJGDyyDCLMOQOOFA77!!!&=>([[}688866660hwCLOQQRRRRRROMJCwngdddgitxCEFFFECxig966[[}}}}}}}}}}____[[3ajxEMOQQQQQQQQQQQQQQQQQQQOMMLECxtiga993399gixGFMOOOOMLJGCytjng9966[6660dddd0000fhuDJLMMLJCtg93[^^___________}",
+"fhrruuwBBBBBwwuuumnnhhhnwCJMOOMMLEGCDDDCGGGGGJJJLLLJGDywttCEMOOOOIzp7!!){<((66600086}}60hyGLOQRRRRRRRROMJDysnnnswyGJLMMMLECtnd0066}}}}}}}}}}}__[[3aixEMOQRRRRRRRRRRRRQQQQOOMLLGCytjg93[[[[[3aixEMOQQQQOOMLJECytsjgd9999ddgnnnmhdfdhuyGLOOOMJDla3[^^____________}",
+"fhmrruwwBBBwuummhhhhddhnsyGLLLLJECyyyyDDGGGGGJJJJJJGDyssnsyEMOOOOIzp77!)~:(360000006}66dnyJMQQRRRRRRRRQOLGDBwsswyDGLLMMLLGDsgd06666}}}}}}}}}}}}66ajtAFOQRRRRRRRRRRRRRQQQOOMLJCytjg93[[[//[3aiCFOQRRRRQQOOMLJECytsjggdggnswByBwummmuBGLMOOOLExia3[^^_____________",
+"fdhmruwByyBBurmhfff000ddnsyCGGCxytssswyDGGGGGGGJJJJDywnggntCFOOOOIIpp7|21:addhhhhf00660hwCLOQQRRRRRRRRQOLJDBwwuwBDCJLLLJGDwnd006666}}}}}}}}}}}60dgtxEMORSSSRRRRRRRRRRQQQOMLJGysnd9[[////((alCMORRRRRRRQQOMMLJECysjnggnswyDCGDDBwwwBDJMOQQOLGtg33^^_________]]___",
+"0fhruByDGGDDwumhd0006600dgnstssnnggnswyDGGGGGGGGGGDDwngddgtCJMOOOIIvpp721innssuurmhd00hsDJOQQRRRRRRRRRQOLJDBwuuuuwyDGEEGDwnh00066888}}}}}}}}6600gjxCFINNSSSSRRRRRRRRRQQOOMLGDynd93(/(>>::blAIRSSSSRRRRQOOMMFJECytsnnnstDCEJJJJGDDDGJMOQQQOLCta3[^^______]]]]]^^^",
+"fhmuyDGJLLJGDwnhd066[[[[6699999999dgnsyDGGGDDDDDDDywuhd99aixEMOOIIIzppookyyDDDDDyysnnnsyEMQQRRRRRRRRRRQOLGDwurmmmuwyDDDDysnd000066888888888800dhntxEFINNNSSSSRRRRRRRQQQOOMLGDsgd3((:--=<<kAINSSSSSRRRRQOOMFFJECxtsnnswyCELLLLLJJGJLMOQQRQOLCia3[^^______]]]^^^//",
+"hnwDGLMOOMLJCyuhd06[[[[[[[[[[[[[[69dnsyDDDDDBBBBBBurhd0669gtAFIIIIIzzzAAEEJJLLLLJGCyyyDEMOQQRRRRRRRRRQOMJCyumhhfhmnwyDDywsndd000008888888800edhnsxCEIINNNNNRRRRRRRQQQQQOOLJGysg3(:-=~{~2|AINSSSSSSRRRROOIFFFFECysjnnsyDGLLMMMMMLLLMOQRRRQOMCia3/^^____]]]^^/////",
+"nwDJLOQQQOMLGysh06[[^^^^______[[[69dnsBDDDBBwuuuuumh06[[[3alCFFIIzzzzzFFLMOOOQQQOMLJEELMOQRRRRRRRRRRQQOLGDwuhffffhnwyDDDywshddf0000880008eeffhnsyDCFMINNNNOOOOOOQQQQQQOOMLJCtia::=~{{{|ozHNSSSSSSSRRRQOMFFFFEECysjnnsyCELLMMOMMMMMOQRRRRRQMAla3/^^^^]]]^^/>>;>>(",
+"yCJMQQRRQQOLGysh06[[^^^^_______[[60dnswyBBwurmmhhd006[[^/(3btCAzzzzAAzFMOORRRRRRRQOMMMMOQRRRRRRRRRRRQOMJDBumhfffdhsyCGGGCDtsnhd006686000effhmuwyDCJLMOOOOOMLLLLLMMOOOOMMLJCyib::<~{{||pzHNNSSSSSSSRRROMFAzAFEECxtsnswyCJLLMMMMMMMOQQRRRRRQOEtb3(//^^^^^//>;==-:(",
+"GLOQRRRRRQOLGysh06[^^^^^_^[[[[[[600hnuuwwwumhff0066}___^//(aikooooooAEFOQRRRRRRRRRQQOOQQQRRRRRRRRRQQQOMJDBumhffdhnyCEJJJGCysndd066[[[6660fhmuwyCGJLMMOOOMFJGCCCGJJLLLLLLECxiba:<~~{||pzHNSSSSSSSSSRRQOFAAAAAEECCtssstyGEJLLLMMMMMOQQRRRRRRQMCia3(//////>;=*&*=::",
+"MOQRRRRRRQMJDwnd0[[^^^^^[[3999990dhhmuuuurmhf006}}____]^//(:<1lkookkAFFORRRRSRRRRRRQQQQQRRRRRRRQRRQQQOLGDwumhdffmsyGJLLJECysgd333(//((336ddmsyCGJLMMMOMMFECxywwyyDCGGGGCxtja::<<~22ozINNSSSSSSSSSRRRQMFAooAFFFECytssyDCGJJJJLLLLLOQQRRRRRRQOFxc::((>>>;-*&%%%~<c",
+"OQRRRRRRQOLGysh06[[[[/[39gjjjjnnnnnmmrrmmhff06}}_____]]^/>>:<11222kkxEMORRRSRSSRRRRRQQQRRRRRRQQQQQQQQOLJDwumhddhnsDGJJEECxlca::::;;;;::((3aiwDELLMMOMMLLEDywsnnnstwyyyttjaa3::<<12ozIONSSSSSSSSSSSRROFAoooAFFFJExtttyDDGGGGGGGGJLMOQRRRRRRRQMAk1<::>;;=&%$@@${1k",
+"QRRRRRRQOMGysg96[[[//[3btxCEECDywwuurrmmhee0}}_____]]]]^/>;--<1111llxAMORRRSSSSRRRRRRRRRRRRRQQQQQQQQQOLJDwumhfddgsyDCCDxlcc<<==~******~=<:ciDELMOOOOMMLJCywsnhdddgggggga33(:--<11kAINSSSSSSSSSSSRRRQOEoooozFMMMJCyttyyDDDDDDDDDGJLOQRRRRRRRROFAk1<:--~&%$@@@${2o",
+"OQQRRRQOLCtng96[[[//(3bxELMMMLJGDywuummhe00}}____]]]]]]^/>;--=<111clkAFOQRRSRSSRRRRRRRRRRRRRQQQQQQQQOOLGDwnhdddddgistiicb<<~~*&&&%%%%&{~<<iyELMOOOOOMLJGDysmdd903399933((>;--=<1kAIORSSSSSSSSSSSRRRQMAooopzIOOMLECyyyyyyBBwwwwBBDJMQRRRRRRRRROFok1<==*&$@++@!{2o",
+"MOOOOOFExig96[[[///(3btFMQQQQOMLGDBwurhee0}}_____]]]]]^//>;;--<<<<cclCFOQRRRRRRRRRRRRRRRRRRQQQOOOQQQOMJCyshd06669aaaaa:::-=~**&&&&&&&*~~<1kALOOQQQOMLLGDBumhd0333((((((>;--==<1kAIORSSSSSSSSSRRSRRROFoo7pzIIOOOMJCyytyBBwwuuruuwBGLORRRRRRRRROMAk1<~*&%@@++@!{2k",
+"JEEEACklba3(//^^///(3lEMQRRRRQOLJDBwrmhe0}}_____]]]]]]^//>;;::<<::bclxEMQRRRRRRRRRRQQQQQRRQQQQOOOOOOMLGysgd063[((3333((>>;---==****==-;:clCLOQQQQQOMLJCysnhd633((/(((>>;-===<1kAIORRSSSSSSSSSRRSSRROzp77pvINRQOMLEyttssuurmmmmrrwDJOQRRRRRRRROLCk11{&%$@+++@${1l",
+"tttlicb::((////////(axFQRRRRRQOLJDBurme06}_____]]]]]]^^/>>::::::::bbjtAFOQRRRRRRRRQQQQQQQQQQOOMMMMLLJCysh96[[//(((((/////>>>>>>>>>>>((3alCLOQQQQQOMLJCysnhd66[///(((>;-=~~~11kAIORRRSSSSSSRSSRSSSSRIzpppvHNNRQQMLCyssnnnmhheeehmrBGMQRRRRRRRQMJCk1{)!@+++.++${1c",
+"icga::::>>(////////(axMQRRRRRQOLGDwumhe0}}_____]]]]]]^//>:::bbbb:::bblxEMOQRRRRRQQQOOQQQQQOOMLLJGGCCxtia93[///(((///////////^^^^^^^^/[9iCLOQQQQQOMLEDBsmd06[[///((((:-=~~~1koFOQRRRSSSSSSSSSSSSSSSSIzppvHHNRRQOMFCtjgdddffeeeeeehuDLOQRRRRRQOLGk22)@++....++$)~<",
+"caa:((>>>(//^^^^^^/[gxMQRRRRRQOLGBwrmee6}_____]]]]]]^^/>::ccllccb:::bclCFOQQRRRQQQOOOOOOOOMLJGCyttsijga3[/////((///^^^^^^^^^__]]]__^[9nyJMOQQQQOMLGDwnh006[[[//((((::<1122oAIORRSSSSSSSSSSSSSSSSSSSNHvvvHNSRRQOMExjg990000088880fmyJOQRRRRQOLCy12)@+.......+$)~<",
+"ica3((((//^^^^^^^^^[gyMQRRRRRQMJDBurme86}______]]]]]^/(>:clkkklc<<:::bixEMOQQRQQQOMMMMMMMLJGDtiggdd9933//////>>///^^_______________[6gtGLOQQQOOLJCysg006[[[[[/((3abc112oozIIRSSSSSSSSSSSSSSSSSSSSSNNHHHHNNSRRQOLCtg96[[[}}}}}}660hBGMOQQQOMJDtc1)@+.......++${11",
+"tiga3(///^^^]]]]__[6gyLOQRRRQOLJDwumhe06}______]]]]]^/>:<koAAxkl<<<<::blCFOQQQQQOMLJJJJJJGCtigd96[[[[[///////////^________________[[9sCJMOOOOMLGysgd06[[[[^^[[3abclkoAzIIINSSSSSSSSSSSSSSSSSSSSSSSNNHHHNNSSRRQMEyj93[[[______}}}6dsCLMOOMJCtib<~)@+......++@)22k",
+"Cxlb93[[^^^_______}6dwEMQQQQQMLGBwrmhe06}______]]]]^//:<lozFFAkl11~~<:bjxEMOQQQOMLECCCCCDysgd0[[[[[[[[[^^^^/////^^________________[9ntGLMOOMLJDwnd6[[[_[^^^[333blkAAIINNNNSSSSSSSSSSSSSSSSSSSSSSSSNNHNNNSSSRROMCta3[[^^_________}0nyGJLJGDsg::=*%$@++..++@$){2oA",
+"JAxja3[[^^________}6dsDLOQQOOLJDBurmhe06}_______]]]^/>:1kzIIIzo22{{~=<:clALOOOOMLGxtttsssng96[[[[_^^_^^^^^^^///^^_________________[9jyELMMLJGysd0[[____^^^[[33blxAFIQNSSSSSSSSSSSSSSSSSSSSSSSSSSSSQNNNNSSSRRQOFxj9[[^^^^^_______}0hsyCCDtna::;-=*&$@@++@@$){2oFM",
+"MExta93[[[[[[[___}}6fnyGLMOMLJDBwurmee06}}______]]^//:<2ozIIIzoo|)){~<:bjxEMMMMLEytjngggd90[[[___________]^^^^^^^_____________]__[6gtCELLLEDwnd6[_____^^^[[33blxFMORSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRONNNSSSSRRQMEta3[^^^^^^^^]]]___[0gsssiga::;;;;-=*&%$$$%&~2oFIO",
+"MFCtb93[[[[[[[}}}}}6fhuDJJLJGDBBurmmhe06}}______]^^/>:1ozIIHHIp7|)){~-::blxEFLECxtja999066[[[_____________]^^^^^]___________]]]__[9jyCEJJGDwnd6[^^^^^^^^^[33ajxAMORSSSSSSSSSSSSSSSSSSSSSSSSSSSSRROOOQSSSSRRRQMCl9[^^^//////^^^]]_[[9daaa::;;;>>>>>;-**&&&~1kAIOQ",
+"MECla3[[[[[[[[[}}}}60hrBDGGGDBwurrmhe006}}}}____^^/>:<2oIHNNHHv77!){~-((3aixCCCtjg99666[[[}}}}}}__________]^^^^]]__________]]]]_[3gtCEEEGCynd0[^^^^^^^^^[339blCFORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSROOOORRSSRRRQOFxj3[^^//>>>>>//^^^^^/[3(::---;>>/////>;=**~=1kFOOQ",
+"FEtja3[[[[[[6666}}600fmuBDDBBwurrmhee0066}}}}___^//>:1kzINNNNHv47!){=;(((3ajlttja96[[[[[}}}}}}}6}[}_______^^^^^^]_________]]]]__[9jxEJJJCDsg96[/////////[33ajxEORRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRQOOMOQRRRRRRQMEta[[^^/>;;--;>>//////>;;-==~=;>/^^^^//>-=*~~1oFOOO",
+"Axja3[[[[[66666666600emruwwuurrmmeee0066666}}__^^/(>:lAINNNNNHvv7!{~->//^[39aga99[[[}_[_[_}[6660666[[____^^^^^^^]]]_______]]]__[9jyEJLJECyia3(((>>>>(//((3abtAMQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRQOOOOQRRRRRQMJxj9[^^//>;=**=-;>>>>>;-=*****-;>/^]]]^/>-***~2AFIOO",
+"tja3[[[[[399900666000ehmruurrmmheee006666666}}_^^//(bkFNNSNNNPHv7){=>//^^[[[366[[[[_____[[[660ddd906[[[^^^^^^^^^^]]_______]]__[3gtEJLLLExtja::-====-;>((3ablCFORRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRQOOOOQQRRQQOLxj9[[_^^/>-=***=-;>>;-**&&&**=;>/^]]]]^/>-*&{{2ozFFF",
+"ba3[/^[[[9dddd000000eehmrrrrmmheee0066666666}}_^^//3cCMRSSSNNPHv7){->/^^^^[[[[[[[_______[[69ddnnngd0[[[[//////^^^^]___________[atCFLMLJCxic<<~{{&{{~=<::bckAFORRSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRQQOOOOQQQOMLCsa6[__^^/>;=***-;;;;-**&&&&*=->/^]]]]]^/>=*&&{|oAAAA",
+":(////[[9dgggdd0000eeemrrurrmmeee8088666686}}___^/(alFORSSSNNPHv7)~;(/^^____[__________[[[69gnsssng96[[////////^^^^^^^^______[9jxEFLLJCxlc11{)!!!!)){~11koAIORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRQQOOOOOOOMJCtg9[[___]^/>;---;;;;-=*&&&&**-;>/^]]]]]^/>=&%%)||ookk",
+";;>>///39dggghd0000eehruuuuurheee0006666866}}___^/3bxFORSSSSNPKv7|~:(/^^______________[[[39gjsttssga3[(/////////^^^^^[[[____[[alxEEFECkl12{)!!!+'+!!!||ozIINSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRQQQOMMLLLEDsg9[____]]]^//>>>>>>;-**&&&**-;>/^]]]]]]^/;*&%$))||221",
+"*~=;>(/3dhhhhdf000eeemuwBBBwrmfee8000666066}}__^^[9lAORSSSSSNPKv72<((/[[____________[[[[39ajjstttsga33(((>>>(////^^^[[[[[___[[ajtxCxxkl22{)!!++''''''4pvHPPNNSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRQQQOLLEGCyjg6[____]]_]^^/////(>;-*&&&**-;>/^]]]]]]]^>-*%$$@!)){{{",
+"$%&~;>(6dhhhdfe000eemrwBDDDBumhffee80800006}}__^[3bxFORSSSSSNPHvo2<33[[[[[_^_______^[[[399gjtttttiga33((>>>>>(////^[333[[[__[[9ajiiic11{{)!!!+''''',45qKKPPPNSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRRRRQOMLGDysn96[[___]]]__^^[[3993(:=*&&**-;>//^]]]]]]^/>=&$@@@@$))$$",
+"@@%&=>(0fffffe0088eemuBDGGDywuhhfeeee800806}}_[[3alAORRSSSSSNNHzolba36[[[[[^^^___^^[[[339aajjtttija93((>:>>>>>(///[33993[[^^^[[33a3:<~{{%)$!@+++'',5qqKKKPPPNSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRRRRRQOLEDwnd9[[___]]]____[[9gistib:=*&&*=;>>/^]]]__]]^/-&$@+++@@@@@@",
+"+@$&=(30fffee8008eemrBDGJJGDwrhffeeeee80806}}[[39jxFORSSSSSSSNHzolca9996[[[^^^^^^^^[[3333aabjjijjba3(::::;;>>>>(/(3aaaa3[[^^^^//(((;-~{&%%$$@++'',5qqKKKKPPPSSSSSSSSSSSSSSSSSSSSSRRRRQQQRRRRRRRRQOLGynd9[[___]]]____[9gsxGEEClc<~**=-;>/^^]]___]^/>*%@++++++++++",
+"+@$&;(600eee80888eemuBGJJJGDwnhdfeeee88008}}}[[3bxFORSSSSSSSSNIFAkiggd996[[^^//^^^^^//(3333aaaabaa:::---;;::>>>>((abjjja3[^^^^^//>>-=*&&&%%$@++',5qqKKKKPPPPSSSSSSSSSSSSSSSSSSSSRRRRQQQQRRRRRRRRQOJCsg9[[[___]_____69nyELMMLJxl1~~=-;>//^^]___]]^>=&@++.....++..",
+"+@%~:(6608e88888eehrwDGJJJCyshdf0000008086}}}[3alAORRSSSSSSSSROFAxljgg996[[///////^////(((33333:::<=~~~==-;;;;:::aclxtlb93//////(>;-=**&&%%$@@',5qqKKKKPPPPSSSSSSSSSSSSSSSSSSSSRRRRQOOOQRRRRRRRRQMJDsd9[[^_______}6dsDJMOOOOLCk11=-;>//^^]____]^/;&$++..........",
+"@$&;([668888888eeemuBDGJJGDwnd00000000686}}}[[3jxFQRSSSSRSRRRROFAxtjgd96[[[//>>>//////((((((((:;=~{&&{{~~<<<<-::<lkCCCxib33(////>>;-=**&&%%$!!45qqKKKKPPPPSSSSSSSSSSSSSSSSSSSSRRRRQOOOQQRRRRRRRRQMEysg9[[[______[6dsDJMOQQQOLGlc<-;>(/^^^_____]^>=%@+...........",
+"$&=>/[68888888eeehmuBDGJGDysh0066}}}}}}}}}}}[6atEORSSSSSSRRRRROLCyigd96[[[//>---;>>>>>>;;;;;;;-~&%$$$$){~11<<<11koAFFFAxia3(((((>>;-=~*&&%)!!45qKKKKPPPPPSSSSSSSSSSSSSSSSSSSSRRRRQOOOOQRRRRRRRRRQMJDwnd0[[[[_[[60gwCJMOQQQOMJxib::>(//^^______^/;&$+............",
+"&*;/[}6888888eeeehruBDGGDysh066}}}}}}}}}}__[[3jCMQRRSSSRRRRRRROFCtja96[[[^/>-*&**-;;;;-======*&%$@@++@!)|222222oAIIOOOFAtib:((((((>;-=~{{))74vKKKKKPPPPSSSSSSSSSSSSSSSSSSSSSRRRRQOMMOQRRRRRRRRRRQMLGywnh906660dgsyGLMOOQQOMLCtga(((///^^_____^^>=%@+..........++",
+"=;(/}}88888eeeeehmrwBDDDysnd06}}}}}}}}}}___[[atFORRSRSRRRRRRROMExia96[[[^^/>*&%%&&*===**&&&&&%%@@+++++!77ooooopzHNNRROOFClcb:33((((>;=~{{|7vvKKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSRRRQMLLMOQRRRRRRRRRRQOMLECywsnggnswDGLMOOQQOOMLGynd3((///[^______^/;&$+.........+++@",
+";(/[}68888eeeeeemmuwyDDysnd06}}}____}}_____[3jCMQRRRSRRRRRRRQOJCtg93[[[__^/-&%$$$%&&&&&%%$$$$$@+++..+''7pppppzHHNNSSRROFAklca333[//(:-~2|pvHKKKKPPPPPSSSSSSSSSSSSSSSSSSSSRRRRQQMLLLOQRRRRRRRRRRRQQOMLLJGCDyyDGJLMOOQQQOOMLGynd6[/////[[_}___^/>*%@+....++++++@@$",
+"(/[[60888eeeeehhmruwyyBsnh06[}_____}}}}___[[9tEORRRRRRRRRRQQOLExia3[[[__^^>=&$@@@$%%%%$@@@@@@+++....''4vvzzzvHHNNSSSSROMExlcaa36[[((:<2|pvKKKPPPPPPPSSSSSSSSSSSSSSSSSSSSSRRRRQOLJJLOQRRRRSSRRRRRRQQQQOOMLLLLLMOQQQQQQOOLJCBnd6[//////[}}____^/-&@+...++@@@@$$$%&",
+"/[660eeeeeehhmmmmruwwwsnh066}_____}}}}}}__[3gxMQRRRRRRRRQQQOMJDib3[[[[^_^/>*%$@@@@$$$$@+++++++......'44vvIIHHHPNSSSSSRQMFxlca96[[[((:1opvKKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSRRRRQOLJJJMORRRRRSSRRRRRRRRRQQQQQQQQQQQRRRQQQOLJDwnd6[^^//////[}___^/>*%@+.+++!))%%%&&*=",
+"30dhhhfeefhmmmmmmussssnhd06}}____}}}66}}}[[9tEMQRRRRRRRQOOMMJCtja3[[^^_^^/>*%$@@@@@$@@++...........''4vvIIIHHNNNSSSSSROMAxia93[[[[(3ckpHKKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLJGJMQRRRRRSSRRRRRRRRRRRRRRRRRRRRRRRQQOLJDwnd0[[^//>>>///___^^>=&@+++''!||{~***~=;",
+"gnsssurmmmmmrrrmnnnsnngd06}}____}}}60006669jxLQRRRRRRRQOOMLJGDsb3(/^^^_^^/;*&$@@@@@@+++...........+'7pzIIIIIHNNSSSSSRROFCtca3[[[[[3bkzHPKKKPPPPPSSSSSSSSSSSSSSSSSSSSSSSRRRRRQMLGGJLORRRSSSRRRRRRRRRRRRRRRRRRRRRRRRQQMJDBuh0}_^^/>;;;;(//^^^/;*$@++''47po21~~~=-:",
+"wyCCDDywuuuruurnnnnghd066}}}___}}}60df0069gtEOQRRRRRRQOMLLJJCxia3(/^^^^^^/>~&$@@@@+++............+'77pzIIIIIHNNSSSSRRQMExia3[[[[[[alAIHPPPPPPPPSSSSSSSSSSSSSSSSSSSSSSSSRRRRQOMJGCGLMQRRSSSSSSRRRRRRRRRRRRRRRRRRRRQQOLGBuhf6}_^^>;****->>//>;*%@@+''4vpzok1<==-::",
+"CJLLLJDywuuuurnhhddd0066}}____}}}600dddd0djCMQRRRRRRQQMLLLJECyia3(/^^^^^//>=&$@@++++....    ....''77ozFFFFIIINSSSSRRQOLClg9[[^^^[3bxFNPPPPPPPSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLJCDDEMORRSSSSSRRRRRRRRRRRRRRRRRRRRQQOLGDwrh0}}_^/;*&%$%&**==*&%@@++'4vvIIAkl<<<<::",
+"JLMMMLGDwsunnhhdd0066[}}______}}}600dddddnyJOQRRRRRRQOMLLJJGCtib((//^^^[[(:=&$@@+++....     ###''77zzFMMFFIINNSSSSRRQMEyja3[^^_^[9lFINNNPPNSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRQOLGDyyxGFORSSSSSSSRRRSRRRRRRRRRRRRRQQOMJDBumf0}_^/>=&$@++@@$%%$@@@+@@7pzIIIAkl1<<:::",
+"JLMMLLGysnnhdd00666[}}________}}}}6000ddntEMQRRRRRRQOMLLJJJGCtc<:>(///[33a:<{$@+++....     ###'44pzFMMMMMFIIRSSSSRRROLCtg33/^^_^[axMRSSSNSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRQOLGysiitCFIRSSSSSRRRRSSSRSSSRRRRRRQQOLJGDwume0}[//;*%@+....+++++++@@)|ozIIFAkc<<-:::",
+"CELLJGDtngd00666}}______________}}}6600hsCLORRRRRRRQMLLJJJGCxic<-;>//33bjll2|)!++....     ##,,5vvIIIOOMMMMOORSSSRRRQOLCtb33[[^^[3jAORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLCyigbclkAFIQSSSRSRSSSSSSSSRRRRRQOMLJGDBwumf0}[/>-&@+...........+@${2oAFFAkcb:::>(3",
+"txCCCysnd9666[}}__________________}}}60gtEMQRRRRRRQOMLJEEGCDtic<=->/(3btCAAAo7!''.#     ##,,55vHHNOOOOOOMOORRSSSSRRQOLCtja33[[[3axMQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRQOLCwna:<122opzIIQRRSSSSSSSSSRRRQQMLGDDDBBBurhf6[(>=%@+...    ....+@%~<lxxxlcb::>>(/(",
+"gjsssjnd9666}}}}___________________}}6dsCMQRRRRRRQOMLJGGGCDysc<<=->(3atAMMOIzp7'''#######,55qKPNNRRQOOOOOOORRSSSRRRQOMExlcba339jtEORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRQOJDsb::=~{{)||opzIORSSSSSSSRRRQOLGDyyBBBBBwumd63(:~%@+...     ....@%=:bbbba:(>>>////",
+"9ggnnngdd9666}}}}__________________}}6dtJOQRRRRRQQOLJGGCDDyysg:<-;>(3jCLOQQOIIp44'#####,,5qqKPNNSRRQQOOOOOQRRRRRRRRQOLExkklcbjtxEMQRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRQMJyia::=*&%))))||ozIQSSSSSSRRQMJCtsuuwBBBBBund03(:=&$+...      ...+%=:(((((>>>>//^^^",
+"9dhgnnnnngd00066}}}}__}}}}}}}}}_}}}}60nCLQRRRRRQQOLJGGCDDDywsg::;:((atEMQQRROIzp74'',,,5qqKKPPSSSRRQQOMMOQQRRRRRRRQOMFAoookkkxCFMQRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRQOJCsb:(;=*&%%$$)){2koFIRSSSRRQMFxsnhhnuwBBBBsnhd93:-~%$+...     ...+$*;>>>>;;>>//^^^^",
+"0dhnswyyyysnhff0066}}}66006}}}}}}}}}0dwEMQRRRRQQOMLGGDDDDDyytna::>(3atJOQRRQQOMzpp7445qqKKKPNSSSSRRQOMMMOQQRRRRRRRQOLEAoo7oooAFMOQRRSSSSSSSSSSNNNNNNSSSSSSSSSSSSSSNNNNNNNOMJxib3((>-=*&%%%%{~~1loFIRRRRQOMExjgddhhuwwBwsngdda3:<~%$+..     ...+@&=;;;--;;>/^^__[",
+"hhnsBDGJJGGDwumhee00fffffee00686}660dnyLOQRRRQQOMJGDDDyyyDDyyib:(((3bxJMQQQQQOMFFAzpvvKKPPNSSSSSSRRQOMMMOQQRRRRRQQMLGxko777ooEMOQRRSSSNNPPPPPKKKKKKPPNNNNNHHIIIIHHHPKKKHIAxlba3(((>;-=~***~=-::ixFIQRRRRQMLCtjgddhgnsssssngggga:<~%@+..     ..+@%&*====-;>^^]_[[",
+"gnuwDGLMMMLJDBurmhhmmuuuurmhfe000000hsCLOQQQQQOLJGDByBByBDDCDtia:((3bxEMOQQQOOMMLLLMINNNSSSSSSSSSRRQOMMMOQQRRRRQQMJCyl2|!!77oALOQRRNNPKKKKKqqqqqqqqvvvppppo||||||77444447|1<(((/(>>>>;;;;::::actAMQRSSRRRQOMEyjgddddnnssssssssig:<)@+.      ...+@%&&&&*=;/^^_[[[",
+"gnswDJMOOOOLJDBwuuuwBDDDDBwumhff00fhnyELOQQQOMLJDBwwuuuwBDCGGDlc:((3btEMOOOOOOOOOOOORRSSSSSSSSSSSRRQOMMMOQQRRRRQOLCyic1)!!!)|oFOOQNKqqqqqq5555,,,,,'!!)))))){{{{))!!'''+@){=;>>>>>>((((3333dgsyEMQRSSSSSRRRQMExjgd9ddgnnsstyyytic1)@..     ....+@$$%%%&=>/^^^[[9",
+"hhnsDJMOQQOMLJDDBBDDGJJJJGDBumhhfdhnsDJMOOOOMLGDBwurrrruwDGEECkc::(3btEMMOOOMMOOOQQQRRRSSSSSSSSSRRRRQOMMOQQRRRQQMJysa:~)@@@!|kEOOHqq555,,,,,######.++@$%%%%%%%%&%%$@+++++@%*=;>>>>((3abgggnnyCJOQRSSSSSSSSRRQMEtja999dgnswyDCDxsc2!+.      ....++@$$$%&*;/^^^[69",
+"ddgsDJMQQQQOMJGDDDGJLMMMMJGDBsmhhhhnwCJMOOOMLGDBurmmhhmmuyGJJGkc<:::bxELMMMMMMOOQQQQRRRRSSSSSSSSRRRRQOMMOQQRRQQOLGwn9:{$@++@)2AINKq5,,#########   ..+@$$$%%%%%&&&%%$@+++@@%*=-;>>>(:bitttwwyGLOQRRSSSSSSSSRRROLxtg999ddnswDCGCDt1)!.       ....++@@@$$&*;/^^[[69"};
diff --git a/hacks/images/tunnelstar.xpm b/hacks/images/tunnelstar.xpm
new file mode 100644 (file)
index 0000000..e87d452
--- /dev/null
@@ -0,0 +1,323 @@
+/* XPM */
+static char * tunnelstar_xpm[] = {
+"256 256 64 1",
+"      c #020202",
+".     c #040404",
+"+     c #070707",
+"@     c #0B0B0B",
+"#     c #0E0E0E",
+"$     c #121212",
+"%     c #161616",
+"&     c #1A1A1A",
+"*     c #1D1D1D",
+"=     c #202020",
+"-     c #252525",
+";     c #282828",
+">     c #2C2C2C",
+",     c #2F2F2F",
+"'     c #333333",
+")     c #363636",
+"!     c #3A3A3A",
+"~     c #3C3C3C",
+"{     c #3E3E3E",
+"]     c #414141",
+"^     c #454545",
+"/     c #494949",
+"(     c #4C4C4C",
+"_     c #505050",
+":     c #535353",
+"<     c #575757",
+"[     c #5A5A5A",
+"}     c #5F5F5F",
+"|     c #626262",
+"1     c #666666",
+"2     c #696969",
+"3     c #6D6D6D",
+"4     c #707070",
+"5     c #747474",
+"6     c #767676",
+"7     c #797979",
+"8     c #7B7B7B",
+"9     c #7F7F7F",
+"0     c #838383",
+"a     c #878787",
+"b     c #8A8A8A",
+"c     c #8E8E8E",
+"d     c #929292",
+"e     c #969696",
+"f     c #999999",
+"g     c #9D9D9D",
+"h     c #A0A0A0",
+"i     c #A4A4A4",
+"j     c #ACACAC",
+"k     c #AFAFAF",
+"l     c #B3B3B3",
+"m     c #B6B6B6",
+"n     c #BABABA",
+"o     c #BEBEBE",
+"p     c #C2C2C2",
+"q     c #C5C5C5",
+"r     c #C8C8C8",
+"s     c #CCCCCC",
+"t     c #CFCFCF",
+"u     c #D1D1D1",
+"v     c #D6D6D6",
+"w     c #E2E2E2",
+"x     c #E6E6E6",
+"y     c #EAEAEA",
+"wqljjjkkkllkkkjjjjjjjjkllmmmmmllkkkjkkklllllllkkkklmnnnnmlkkkkkklmmmlkkkkklmnonmmlkkklmmmlkjjjjjkkkkkjjjjjjjjjjjjjjkkkkkkkkklmnmmlkkjkkklllkkklmnonmllklmopponmlkkklllllkkklmnnonnmmlklmmnnnnmmlllmnoooonmllllmoqstsrqponmmmoqsuutsrponmmmmmnoqrrrqpponnmmlmnpvy",
+"qc1<<[}}|11||}[[<<<<[[}|234443221|}}}}||122221||}}|2577531|}[[}|23332||}}}14687531|}}13442|[[[[[}}}}}[[<<[[[[[[[[[[}}|||}}}|245431|}[}||111|||24787421|248009642|||22221|||1357875421|13577654211247909753221250cfgfdb0864459cfiihec0864323580cddcba087542236bjv",
+"l1,*&*=-;>,>>;-==****=-;,)~~~!)),>;---;>,'''',,>;;>'{^/^{)>;---;,)!!',>;-;,!^((^~'>;;,!]{)>-=*==-;;--==**==--======-;;;;;;;>){]{),;---;,,,,>>,)]((/{),,']_[<_^!'>>,'))',>;>,!^((/^~),>'!^//^]!),,)](:<_/]!'''~(}47752}:(^{]/[380073}:(]~!!{/:}1221}[:(^{!)!]_2es",
+"j<*+.+@#$%&&&%$#@@+++@#$&=;>>;;-=*%$##$%&=====*&%%%*;')),;*%$##$&-;;-*&%$$&-,!!)>-&%$&->,-&$@@@##$$$##@+++@###@@@@#$$%%%%$$&->,,-*%$#$%&***&&&-'~~)>=&&-']/^~';*%%*=-=*&%%&=>)~~),;=&&=>)!)'>;=*=;']^^~'>-==-'^[232|:/{),,)^[26741</{)>;;>'](<[[<:(^~),;;;,~(2es",
+"j:&.  .+@#$%%%$#@++...+@$%=-;;;-=*%$####$&****&&%$$%*;')';=%##@#$*=--*%$##$*;'!)>-&$#$*;>-&#++++@#$##@+..++@@@++++@#$$$$$##%=;,>-&$#@#$%&&&%%%-,!!';*%&-']^])>=%$%&==*&%$$%=,)!)';=&%&-,))'>;=*&=;)]]{)>-=*=;!_|22|<(]),>,~_|4641</{'>--;,~/:[[<_/]!'>;-->!/[5gt",
+"j:&.   .+@#$%%%$#@++...+@$%=-;;--=&%$#@#$%&****&%$$$%=>'),-&$#@#$%=--=&%###%-,)),;*%$$&-;;*$@+++@#$##@+...+@@@+++++##$$$$##%=;,>-&$#@#$%&&&%%&-'!!,-*%&-)]^{);=%$%*==&%$$$&-,!!),-*%%*;')),;-*&*-,~]]!,-=**-'^[221[(]),>,!(}4652[(])>;--,!^_<[<_/]~'>;-->!/[29iu",
+"j<&.    .+@#$%%%$#@++..++@$&=-;;-=*&%##@#$%&****&%$$$&-,)'>=%$#@#$*=-=*%$##$*>))'>=%$#%=;;=%@+++@##$#@++..++@@+++++@#$$$$##%=;,>-&$#@#$%&&&%%&-'!),-&%&;!^^~'-*%$%*=*&%$$%*;)!!'>-&%&=>))'>;=*&=>)]]~';-**=>{:|21}:^~'>>)^[3652}_]),;-->)^_<[<_/]~),;-->!/[250iu",
+"j<&.     .+@#$%%%$#@+...++#$&=;;;-=*%$##@#$%****&&%$$%=;'),-*$#@#$%=--=&%##$&-')),-&$#$*-;-&#++++@###@++..++@@+++++@#$$$$##%*;,>-&$#@#%&&&&%%&;'!)>=&%*>~^^!,-&$%&*=*&%$$%=,)!),;=&%*;,)),;-*&*-'~]{),-=*=;)(}22|</{)>>']:2563|:^!,;-->)]_<[<:(^~),;-->!/[2469ht",
+"j<*+      .+@#$%%%$#@+...++#%*-;;;-=*%$#@##%&****&%$$$&-,''>=%$#@#$&=-=*%$##$=>)),;*%$$&-;;*$@+++@#$##@+..++@@+++++@#$$$$##$*;,>-&$#@#%&&&%%%*;)!)>=&%=,{^])>=%$%&=*&%$$$&-'!!'>-*%&=>')'>;=*&=>)]]!';=**-,^[121[(]),>,~_|464|:^!';--;'](:[<:(^~),;-->)/[24557fs",
+"j[=+       .+@#$%%%$#++...++#%*-;;--=&%$#@#$%&****&%$$%*;'),;*%#@@#%=--=&$##$&;')'>=&$#%=;;=%@+++@#$##@+..++@@+++++@#$$$$##$*;,>-&$#@#%&&&%%%*>)!';=&&-']^]);=%%%*=*&%$$%=>)!)';=&%*-,)),;-*&*-'~]{)>-=*=>~:|21}_^!,>>)/}4641</{'>--;'{(:<<:(^{),;-->)/[245434dr",
+"j[=@.       .+@#$%%$$#++...+@#%=-;;-=*&%##@#$%&***&%%$$%=>''>-&$#@#$&=-=*%$##%=,)),-*$#$*-;-%#+++@####@++..+@@+++++@#$$$$##$*;,>-&$###%&&&%%%=>)!';*%&-)]^{';*%%&*=*&%$$%-,)!),-*%%=>')'>;=*&=>!]]!,;=**-)/}22|</{'>>'^[2552[(])>--;,{/:[<:(^{),;-->)/[24542|2bq",
+"k}-#+.       .+@$$%%$#@++...+@$%=-;;-=*&$####$&****&%$$$&-,)';*%####%=--=&$##$*;))';=%$$&-;-*$++++@###@++..+@@@++++@#$$$$##$*;,>-&$###%&&&%%%=,)),-*%&;!^^~,-&%%&*=*&%$%*;'!!'>-&%&-,)),;-*&*;'{]{'>-**=,]<121[(]),>']:1553}_]),;-;,~/:[<:(^{),;-->!/[24542}<}0p",
+"k}-#@+.       .+@$%%%$#@++...+@$&=-;;-=*%$###$%&****&%$$%=;'',-&$#@#$&=-=*%$##%-,))>-&$#%=;;=$@+++@#$##@+..+@@@++++@#$$$$##$*;,>=&$##$%&&&%%%=,!),-&%*>~^]!>=%$%*==*%$$%=>)!),;=&%=;')'>;=**=,!]]!,-=*=;!_|21}_^!,>,!_|454|:^!,;--,!^:<<:(^{),;-->)/[24542}:(<9o",
+"j[-#@++.       .+#$%%%$#@++..++#$&=-;--=&%$#@#$%&***&%$$$&-,'';=%####%=--=&$##$*>)),;*%$$*-;-%#+++@#$##@++.++@@++++@#$$$$##$*;>>=&$##$%&&&%%&-,!)>=&%=,{^]);=%%%*=*&%$$&-,)!'>-*%&-,)),;-*&*;){]~';-**-'/[12|:/~'>,)/}3541</!,;-->!^_<[:_^]),;-->)/[24541}:/^(7n",
+"j[=#@@@+.       .+#$%%%$#@++..++#%*-;;--=&%##@#$%&***&%$$$*;,',-*$#@#$&=-=*%$#$&-')'>=%$$&-;-*$+++@####@++.++@@+++++##$$$$#$*;,>=&$##$%&&&%%&-'!)>=&&-']^{';*%%&*=*&%$%*;'!)';=&%*;')',;=**-,!]]),-=*=>]:12|[(]),>'^[2552[({'>-->)^_<[:_/]!,;-->)/[24541}:/]~^5m",
+"j[=#@@@@++.      .+#$$%%$#@++..+@#%*-;;-=*&$####$&***&&%$$%=>''>=%$###%=--=%$##%=,)),-&$$%=;;=$@+++####@++.++@@+++++@#$$$$#$*;,>=&$##$%&&&%%&;')';=&&-)]^~,-&$%&==*%%$%=>)!),-*&&=>'),;-*&=;){]~';=*=;)(}21}_^!,>,{:1552}(])>;->)](<[<_/]!,;-->)/[24541}:/])'{3m",
+"j<*@@@@@@++.      .+@$$%%$#@++..+@#%=-;;-=*%$#@#$%&***&%$$$&-,',;*$###$*=-=*%$#$&;')';=%$$*-;=%#+++@#$##@+.++@@+++++@#$$$$#$*;>>=&$##$%&&&%%*;')';*&&;!^]!>=%$%*=*&%%%&-,))'>-&%*;,)',;=&*-,~]{)>-=*-,^[12|:/~'>,!(|453}_]),;-;'](<[<_/]!'>-->)/[24431[:/{),>!3m",
+"j<*+++@@@@++.      .+#$$%%$#@++.++@$&=-;--=&%$#@#$%&***&%$$%=;'',-&$###%=--*%$##%=,)'>=&$$%-;-&#+++@#$$#@++++@@@++++@#$$$$#$*;>>=&$##$%&&&%%*;)),-*&*>!^]);*%%&*=*&%$%*;'!),;=&&=>'),>-*&=;){]!,;=*=>{:|2|<({),,)/}354|:^!,;-;'{(:<<_/]!'>-->)/[24431[:/{),;;~4m",
+"j<*+.++@@@@++.      .+#$%%$$#@+++++#$&=-;--=&%####$%&**&&%$$&-,'';*%###$&=-=&%$#$*;'),-*$$%=;;=$@++@#$$#@++++@@@++++@#$$$$#$*;,>=%$##$%&&&%%=>)),-&&=,{^{';*%%&==*%%$%=,)!)>-*%*-,)',;=**-,~]{)>-==-)(}11[_]),>']<2541</!,;-;,~/:<<:/]!'>-->)/[24431[_^{),;;,^7o",
+"j[*+..++@@@@++.      .+#$%%$$#@+++++#$*=-;-=*&$####%&***&%$$%*;'',-&$##$%=--*%$##%-,)';=%$$*-;=%#++@#$$#@++++@@@++++@#$$$$#$&;>>=%$##$&&&&%%=>)),=&&-']]~,-&%%*==&%%%&-'!)';=&&=>')'>-*&=;)]]!,-=*=,]<|1}:^!'>,{:1442[({'>-;,!/:<<_/]!'>-->)/[2443|[_^~'>;;>!:aq",
+"j[=@...++@@@@++.      ++#$$%$##@+++++#%*-;;-=*%$###$%&***&%$$%=>''>=%###$*--=&%$#$=>)),-&$$&-;-&#+++@#$##@+++@@@++++@#$$$$#$&;>;=%$##%&*&%%%=,))>=&&-)]]!>=%%%*=*&%$%*;)!),-*&*-,)',;=**-,~]~';=*=;!_}1|</{'>,!(|442}(])>-->!^:<<:(]!'>-->)/[2443|[_^~'>;;,!/1ds",
+"k}=@+...+++@@@++.      ++#$$%$##@++++@#%*-;--=&%$###$%&***&%$$&-,',-&$##$%=--*%$#$&;'),;*%$%=;;*$@++@#$$#@++++@@@+++@#$$$$#$&->>=%###%&*&%%&-,)';=&*;!]]);*%%&*=*&%$%=,))'>-&&=;')'>-*&=>)]]),-==-'/[1|[(]),>)^[353|_])>;->)^_<<:(^~'>;->)/[2442|<(^!'>;;,!(}6ht",
+"k}-#++...+++@@@++.      ++#$$%$#@+++++@$%=-;--=&%####%&***&%$$%*;''>=%$##$*--=&$##%=,)'>=%$$*-;=%#++@#$$#@++++@@@+++@#$$$$#$&->>=%$##%&*&%%&-,)';*&*>!]{';*%%&==*%%%&-')),;=&&-,)',;=**-'~]~';=*=>{:||}_^!,>']<244|:^!,;->)^_<<:(^~'>;->)^[1442|<(^!'>;;,{(}39iu",
+"k|;$@++...+++@@@++.      ++#$$%$#@+++++@$&=---=*%$###$%&***&%$$&-,',;*$##$%=--*%$#$&;'),-&$$&-;-&#@+@#$$##@+++@@@+++@#$$$$#$&->>=%$#$%&*&%%&-,),;*&=,~]~,-&%%*=*&%$%*>)!)>-*&=;')'>-**=>!]{)>-==;)(}|}:/~'>,~_1441</!,;-;)]_<[:(^~'>;->)^[1442|<(]!,>;;'{_}360it",
+"k|;%#@@+...+++@@@++.      +@#$$$$#@+++++@$&=---=*%$###$%&***&%$%*;,'>-%$##$*--=&$##%-,)';=%$%=;;*$@++#$$$#@+++@#@+++@#$$$$#$&->>=%$#$%**&%%&;'),-*&='{]!>=%%&*=*&%%&-,))';=&&-,'',;=**-'{]!,-=*-,^<||<(]),,!(}342[({';;;'](<[:(^~'>;->)^[1342}<(]),;;>']:|3568gs",
+"l1>%$##@++...++@@@+++.     ++#$$$$#@+++++#$&=---=&%$###$&***&%$$%=>',;*%##$%=--*%$#$*>'),-&$%*;;=%#++@#$$#@+++@#@++++#$$$$$$&->;=%##$%**&%%*;''>-&&-)]]);*%%&==*%%%*;'!),-*&*;')'>-**=>!]{)>-*=>~_}|[_]),>)^[243}_])>;;,{(<[<_^{)>;->)^<1332}:/]),;;>)^:|45435dr",
+"l1,&%$##@++...++@@@@++.     ++#$$$$#@+++++#%*=--=*&$###$%&***&%$$&-,',-&$##$*--=&$#$%-,),;*%$&-;-&#@+@#$$##+++@#@@+++#$$$$$$&->;=%##$&**&%%*;''>=&*;)]{';*%%*==&%$%=>))'>=&&=>'),;=**;'{]!,-==-)/[|}:^!,>']<243|:])>;;,~/:[<_^{)>;-;)^<1332}:/]),;;>)^<14542|1bp",
+"l2'*%%$##@++...++@@@@++.    .+@#$$$$#@++++@#%*=--=*%$###$%&***&%$%*;,';=%##$%=--=%$#%=>''>=%$%=;;*$@@@#$$$#@++@##@+++#$$$$$$&->;=%##$&**&%%=>'';=&*;!]~,-&%%*=*&%%&-,)),;=&*;,)'>-=*=,!]~';===,]:}}</{',,~_|441:^!,;;,!/:[<_/{)>;-;)^<1331}:/{),;;,!/[24541[:[0o",
+"l2'=&%%$$#@++...++@@@@++.    .+@#$$$$#@++++@#%*---=*%$###$%&**&%$$%-,',-&$##$*--=&$$$&;'',-&%%*;;=%#@@#$$$#@++@##@+++#$$$$$$&->;=%##%&=*&%%=>',;=&=,~]!>=%%&==*%%%*;'))>-*&=>'),;=**;){]!,-==;!([}[(]),,)(}342[/!,;;,!/:[<_/]),;-;)^<1331}:/{)>;;,~(}24531[_/_7n",
+"l1,=*&&%$$#@@++..++@@@@++..   .+@#$$$##@++++@$&=--==&%####$&***&%$%*;,'>=%##$%=--=%$$%=,'';=%$&-;-&$@@#$%$$#++@##@@++@#$$$$$&->;=%##%*=*&%%=>',-*&=,{]);*%%*==*%%%=>))';=&*-,)'>-=*-,~]~';==-'^<}[_^!,>'^[242[({'>;>!^:<<:/]),;-;)^<|221[_^~'>;;'{_}3553|<(]~^5n",
+"k|,*&*&&%%$##@++.+++@@@@++..   .++#$$$##@++++#$&=--=*%$###$%&**&%%$%=>',;*$##%*-;-&$$$*;''>-&%%=;;*$#@#$$%$#@+@###@++@#$$$$$&->;=%##%*=*&%%=>',-*&-)]{'-&%%*=*&%$&-,)),-*&=>'),;=*=;)]])>-==>~_[[:/~'>,]:243}_]'>;>)^:[[:/]),;-;)^<|22|[_^~'>;;']:|3542}:/])'{4m",
+"k};&%&*&&%%$##@++.+++@@@@+++..  .++##$$#@@++++#$&=-==*%$#@#$%&**&%$$&-,'>=%##$&=;-=%$$%-,',;*%%*;;=%#@@#$%$#@+@###@++@#$$$$$&->;=%#$%===&%&=>,>=&*;)]~,-&%&==*&%%*;')'>=**-,)'>-=*-,~]~';==-)/<[<({',,!_|43|:])>;>)]_[[:(]),;-;'^<|22|[_^!'>;>)^:|3442}:^{),>!2m",
+"k}-$$%&&&&%%$##@++.+++@@@@@++... .++##$$#@@+++@#%&===*&%$#@#$%&**&%$%*;',;*$##%*-;-&$$$*>''>=%%&-;-&$@@#$%%$#@@###@++@#$%$$$%->;=%#$%===&%&-,,;=&*>!]!>=%%&==*%%%=,)),;=*=;'),;=*=;)]{)>-==,]:[<(]),,)/}341<^!,;>']_<[:(]),;-;'^:|22|<(]!,>;>)^<14431[_^!'>;;)3m",
+"j[-$#$%&&*&&%$$#@+++.++@@@@@+++.. .++##$##@++++@#%*===*&$#@@#$%&*&&%%&-,',-%$#$&-;;=%$$&-,',-&%%=;;*$#@#$%%$#@@####@+@#$%$$$%->;=%#$&=-=&%&-,,;=&=,~{);*%%*==&%%&-'))>-**-,)'>-=*-'{]!,-==;!(<[_^!,>'^[242[/!,;;'](<[<(]!,;-;'^:|22|<(]!,>;,!/[2443|[(]!,>--;{5n",
+"k}-#@#$%%&&&&%$$#@++++++@@@@@+++....++@####@++++@#%*===*%$#@#$%&**&%%%*;,';=%##%=;;-*%$%=>',;*%%*;;=%#@#$%%$#@@####@+@#$%$$$%->;=%$$&=-=&%*-,,;*&=,{{'-&%%*=*&%%*;))';=*=;'),;=*=>!]{);==-'^:<:/~',,{:142}({'>;,{(<[<(^!,;-;']:|21}<(]),;;,~([2442|</]),;--;'(9p",
+"k}-#@@#$$%&*&&%%$#@@+++++@@#@@@++....++@####@++++@$%*==*&%$#@#$%&**&%$%=>',-&$#$&-;;=%$$&;,'>=&%&-;-&$##$%%%$#@##$#@+@#$%$$$%=;;=%$$*--=&%*;,>-**-'{~,=%%&==*%%%=,)),-**-,)'>-=*-'{]!,-==>~(<:({),,!_|33|_])>;,~(<[<_^!,;-;']:|11}:/]),;;,{(}2442}:/~)>;-->)^}cr",
+"k|;$#@@##$%&&&&%%$##@+++++@@#@@@+++...++@####@++++#$&*==*%$#@@#$%&&&%%$&-,'>=%##%=;;-&$$%=>',-*%&=;;=%###%%%$#@##$#@+@#$%$$$%=>;=%$$*--=&%*;,>-**;){!>=%%*==*%%&;')'>=*=;')';=*=>!]{';==-)^::(]),,)/}33|:^)>;,!/<[<_^!,;-;']:}1|}:/{),;>']_|3431[_^!'>---,!^<4fs",
+"k|>%##@@@#$%&&&&%%$##@+++++@@##@@+++...++@####@+++@#$&*==&%$#@##$%&&&%%%*;,,;&$#$&-;;=%$$*;,,;=&%=;;-%###$%%%#@##$#@@@#$%$$$%=;;=%$%=--=&%*;>;=&*>!{);*%%*==&%%=>)),;=*-,)',-=*-'{])>-=-,]_:_^!,>'][231<^!,;,!/:[<_^!,;-;']:}1|[:/{'>;>']:|343|[(]!,;--;,{([28ht",
+"l1,&$$#@@@#$%%&&&%%$##@+++++@@##@@+++...++@###@@+++@#$&*=*&%$#@#$%&&*&%%%=>'>=%##%=;;-*%$%-,'>-&%*->-*$##$%&%$###$$#@@#$%%$$%=;;*%$%=;-=&%=;>;=&=,!~'-&%&==*&%&-,))>-*=;')';=*=,!]~';==;!/:_/~'>,{:132[/~,>>)^:[[_^!,;-;,]:}||[_^~'>;>)^<1342|</]),;-->)]:}248gt",
+"l1,*%$$##@@##$%&&&%%$$#@++++++@##@@@++...++@###@@+++@#%&*=*&$#@@#$%&&&%%%&;,,;*$#$&->;=%$%*;,,;*%&-;;=%##$%&%$###$$#@@#$%%$$%=;;*%$%=;-=%%=;>-**=,~!,=%%&==*%%*;')';=*->)),-==;)]])>==-,](_/]),,!(|32}({'>>)^:[[:/~';-;,]:}||[_^!'>;>)^<1442}:/~'>;-;,!/<|3446er",
+"l2'=&%%$##@@##$%&&&&%$$#@++++++@###@@+++..++@@##@@@++@#%&**&%$#@@#$%&*&%%%=>,,-%$#%=;>-*%$&-,,>=&&=;;-&$#$%&&%###$$#@@#$%%$$%=;;*%$%-;-*%%=;>-**-'{!>*%%*==&%%=>)),-==;,)'>=*-,~]~,-==>!/_(]),>)/}23|:])>>)]_[[:/~';-;,]_}|}<(^!'>;,!/[2431[_^!'>--;,{([134212cq",
+"l2'=*&%%$$#@@@#$%%&&&%%$##@+++++@###@@+++..++@@##@@@+@@$%&**&%$#@@#$%&&&%%&-,,;*$#$&->;=%$%=>,,-*%*->-*$#$%&&%$##$$#@@#$%%$$%=;;*$$&-;-*%&=;;-**;)~);&%&===&%&-,)'>=*=>'),-==;)]]);==;)^((^!,>']<23|:^),>']_[[:/{';-;,]_[|}<(]!,>>,~(}233|[(]),;-->)]:}2332}<}0p",
+"l2'=**&&%%$##@@##$%&&&%%$##@+++++@####@@++..++@@@@@@@+@#$%&**&$#@@#$%&&&%%%*;,,-&$#%=;>-*%$&;,,;=&&->;=%##%&*%$##$$$#@@$%%$$%=;;*$$&-;-*%&=;;=*=>!~'-&%&==*&%*;'),;==;,)'>-=-,~]!,-=-,{/(^~'>,~:131</!,>'{_[[:/{';-;,]_[|}<(]),;>'{_}232|</{),;-;,!/<|332|[_(:8o",
+"l1'=****&%%$$#@@##$%&&&%%$##@+++++@####@@++..++@@@@@@@@@#$%**&%$#@@#$%&&&%%%=>,>=%#$*;>;=%$%=>,>-*&=;>-&$#$&*&%##$%$#@@$%%$$%=;;*$$&->-*%&-;;=*=,!!,=%%*==*%%=>))>-==>'),;==;)]{);==;)^(/{),,!(|32[(~,>,{(<[<({';-;,{_[}}:(]),;>']:|232}:^~'>;-;'{([1332}<(^{/6n",
+"k|,******&&%$$##@##$%%&&%%$$#@+++++@#####@++..++@@@@@@@@@#$&**&%$#@@#$%&&&%%*;,,-&$$%=>>-*%%*;,,;=&*;>;*$#$&**%$#$%$#@@$%%$$%=;;*$$*;>-*%&-;-=*=,!!>*%%=-=&%&-,)';==-,)'>-=-'{]!,-=-,]//]),>)^[22}({'>,~(<[<(]'>-;,{_[}[:/{)>;>)^:|231[_^!,;-->)]:}2321[:/]))]4m",
+"k};&&&****&&%%$##@@#$$%&&&%$$#@+++++@#####@+++..++@@@@@@@@#$&*&&$#@@@#%&&&%%%=>,>=%$$*;>;=%$&->,>=&*->;=%$$%**%$#$%%#@@$%%%$%=;;*$$*;>-*%*-;-**-'~);&%&=-=&%*;'),-==>'),;==>!]{';==>!^/]!,>']<12|:]),,!/<[<(])>-;,{([}[:/{'>;>)^<132|[(]),;-;,!/<|232|<(^~),>~3m",
+"k}-$$%&&****&%%$$##@##$%%&&%%$#@@++++@#####@@++..++@@@@@@@@#%&&&%$#@@#$%&&&%%&-,,;*$$%=>>-*%%=;,,-*&=;>-&$$%**&$$$%%$@@#%%%$%=;-*$$=;>-&%*-;-**;)!'-&%*=-*&&=,)'>==-,)'>-=-'{])>-=-']^^~'>,~_|21<^),,!/<[[_])>--,{(<[[_^~'>;>)/[132|</{)>;-;'{([1321}:/]!'>;;~4m",
+"j[=##$%%&****&&%%$##@##$%%&&%%$##@++++@#####@@++..++@@@@@@@##%&&&%$#@@#$%&&&%%*;,>-%$$*;,;=%%&-,,;=&=;>;*$$%***%$$%%$#@#%%%$%=;;*$%=>>-&%*--=*=>)!,=%%*-=*%&-'),;==;'),;==>!]~'-=->!^^{),>)(}21[/!,,)^:[[_])>--,~(<[<_^!'>;,!([122}:^~'>;;>)^:}222|[_^~),;;;,^7o",
+"j[=#@##$%&*****&&%$$#@@#$$%%&%%$##@++++@######@++..++@@@@@@@#$%&&%%##@@#$%&&%%&=>,;*$$%=>>-*%%=>,>-**->;=%$$&=*%$$%%$###%%%$%=;-*$%=>>-&%*--=*=>!)>*%&=-=&%*>))>-=-,)'>-=-'{]);==;)]^]),>'^[22}(~',)^:[[_^)>--,~(<[<(^!,>>,~(}221[_^!,;-;,!/<|221}:/]!'>;;;,~:aq",
+"j[=@+@@#$%%&*****&%$$##@##$%%&%%$##@++++@######@++..++@@@@@@@#$%&&%$#@@@#%%&&%%*;,,-&$$*;,;=%%*;,,;=*=;>-&$$&==&$$%%$###%%%$%=;-*$%-,,-&%*--=*=,!);&%&=-*&&=,)';==;'),;==>!]~,-=-,~]]!,>,]:12}_{',)]:[[:^)>-;,~(<[:(]!,>>']_}22|[(]),;-;'{([122|[_^~),;;;>)]_2es",
+"j[=@+++@##$%&*****&%%$##@##$%%%%%$$#@++++@##$$##@++.+++@@@@@@@#$%&&%$#@@#$%&&&%%=>,>=%$%->>-&%%=>,>=*=;>;=%$%==*%$%%%###$%%$%=;-&$%-,,-&%*--**-'!'-&%*-=*%&-'),-=-,)'>-=;)]]);==>)]]~'>,!_|2|:]),']_[[:^)>--,~(<[:(]),>>']:|22|:/{'>;;>)^:}121}:(]!'>;;;,~/<|7ht",
+"j[=@++++@@#$%%&****&&%$$####$$%%%%$$#@++++@##$$##@@+++++@@@@@@##$%&%%$#@@#$%&&%%&-,,-&$$*;,;=%%*;,>-**->>=%$%*=*%$%&%$##$%%%%=;-&$%-,,-&%=-=**;)!,=%&=-=&&=>''>-=;'),;=-,~]!,-=-'~]~),>)/}21<^),'{([[:^!,;-,~(:<:/]),;>)^<|21}:^!';;;,!/<|21|[_^{),;;;,)]_}249ht",
+"j[=@++++++@##$%&*****&%%$#####$%%%%$$#@++++@##$$$##@++.++@@@@@@##$%&%$#@@@#$&&&%%*;,>=%$%->>-&%&->,;=*->>-&%%*==&$%&%$##$%%%%*;-&$%;',=&&=-=*=;))>*%&=-=&&-,),;=->)'>-=;)]{';=->!]{),>'^[11[/!,'~(<[:/!,;-,~/:<:/{)>;>)/<|21[_]),;;;'{([|11}<(]!'>;;>'{(<|3448fs",
+"j[=@+++++++@@#$%%&****&&%$#####$%%%%%$#@@+++@##$$$##@+++++@@@@@@#$%%&%$#@@#$%&&&%&=>,;*$$*;,;=%%=;,>-*=;,;=%%&==&%%&&$##$%%%%*--&$&;',=&&===*=>));&%*--*&*;''>-=;,),;=-,~]!>-=;'~{!,>,{:|1}(~''!/<[:/!,;-,!/:<_/~'>;,!/[12|<(])>;;>)]_}11|[_^{),>;;,!^:}244324dr",
+"j[*@+++++++++@##$%&****&&%$$##@#$$%%%%$##@+++@@#$$$##@+++++@@@####$%%%%$#@@#$%&&%%*-,>=%$%->>-&%&->,;==;,>=&%&==*%%%&$##$%%%%*--&$&;',=&&===*=,)'-&%=-=*&=>'';-->''>-=;)]{'-=-,!{!'>,!(}1}_{''!/:[</~,;->!/::_^~'>;,~([11|</~'>;;,!^:}1|}<(]!'>;;>']([13432}[|ap",
+"j<*++++++++++++@#$%%&****&%%$##@##$%%%%$##@+++@##$$$$#@+++++@@#####$%%%%$#@@#$%&&%%=;,;*$$*;,;=%%=>,;==->,-*%&==*%%%&%##$%%%%*--&$&;'>=%&==**-,),=%&=-=&&-,',-=;,),;=-,{])>==;)~!),>)/[1|:])')^:[<(~,;;>!/::(^!,>;,{(}11}:^!,;;;,{([|||[_^{),>;>,!^:|2432|[_(:8o",
+"j<*+..++++++++++@##$%&****&&%$$####$$%%%$##@+++@##$$$$#@+++++@@#####$%%%$#@@#$%&&&%&->>-&$%->>-&%*;,>-==;,;=%&=-=&%%&%$#$%%%%*--&%&;'>=%&==**;')>*%*--*&*;'';-->''>-=;)]~,-=-,!~),>']<1|<^)')^:[<({,;;>!/_:(^!,>>']_}1|[_]),;;>']_[||}<(]!'>;;>)]_[13431}:(]~/5n",
+"j<*+....++++++++++@#$$%&****&%%$#####$%%%$$#@+++@##$$$$#@+++++@@#####$%%%$#@@#$%&&%%*;,;*%$*;,;=%&=>,;==;,>-&%*-=&%%&%$#$%&%%*--&%*;'>*%*==*=;'';&%*--*&=>',;-;,),;=-,{{);=->)!),>,~:|1[/!')]_[<({';;>!^__(]),>>)]:}1|<({'>;;>)^:[}}[_^{),>;>'~/<|2331}<(^~',~3m",
+"j[*+.....++++++++++@@#$%&*****&%$##@##$%%%$$#@+++@@#$$$$#@+++++@#####$$%%%$#@@#$&&&%&=>>-&$%->>-&%*;,>-=->,-*%*=-*%%&&$#$%&%%*--&%*>';*%&==*=>),-&&=-=&&-,'>--;'',-->!]!,-=;'!!'>>)(}|[(~')]_[[_]';;>!^__/]),;>)^<||}:/~';;;,~/:}}[:(]!'>;;,)^:}2332|[_^{),;;)2l",
+"j[=@+......+++++++++@@#$$%&****&%%$####$$%%$$#@++++@#$$$$##++++@@#####$%%%$##@@#%&&&%*->>=%$*;,;=%&->>-=->,;=&*=-=&%&&$#$%&%%*--&%*>,;*%&==*=,),=&&--=&*;',;--,)';--'{{';=-,)!),>'^[|}_{)'{([[_]';;>!^(_/]),;>)/<||[_^!,;;;'](<}}<_^{),>;>'{([1332|[:/]),;-=-)2m",
+"j[=@+++.....++++++++++@@#$%&*****&%$#####$$%$$##@+++@#$$$$##++++@@#####$%%%$#@@#$%&&&&=;,;&%%->>-&%=;>;==;,>-&&=-=&%&&%#$%&%%*--&%*>,;&%*=**-,'>*%*--*&=>',--;'',-->!{!>--;'!),>,]:|}:]))~(<[_]';;>!^((/{)>;,!/[||[(])>;;>)]_<[[:(]!'>;>,!^:|2331}<(]!'>-===;{5n",
+"j[=@+++++....+++++++++++@#$%%&****&%%$####$$$$$##@+++@#$$%$$#@+++@@#####$%%%$#@@#$&&&&*->>=%%*;>;*%*->>-=-,,-*&=--*%&&%$$%&%%*--&%=>,-&%*=**-,';&&=-=**-,,;--,'';-;'{~'-=-,))'>,~_}}:^)'!/<[:^)>;>!^((^{'>;,~([|}<({'>;;,!^_<[<_^{),>;>)]([1332|<_^~'>;-==->)(9o",
+"k[=#++++++....+++++++++++@@#$%&*****&%$#####$$$$##@+++@#$$%$$#@+++@######$%%%$#@@#%&*&&=;,;*%%=>>-&&=;>;=->,;=&*--*%&&%$#%&%%*--&%=>,-&%*=*=;',-&&=-=&*;,,;-;'',-->!{)>-->))',>)/[}</!'!^:[:^)>;>)^((^~'>>,{([|}:^!,;;;,~/:<<:/]!'>;>,~/<|232|[_/{),;-==-;,!^[ap",
+"k}-#@@++++++++++++++++++++@@#$$%&****&%$$####$$$$$#@+++@#$%%$$#@+++@#####$$%%%$#@#$%&&&&=>>-&%*;>;*&*;>;--;,>=&*--=&&*&$$%&&%&--&%=,,-&&*=*=>',=&*--**=>,>-->'';-;'{!,-=;')),>'^<}[(~))^:<:^)>;>)^((^!'>>']_[}[_^),;;>'](:<:(^~),;;,)]_}1321}:/]),;-==-;,)]^_|bq",
+"k}-#@@@@++++++++++++++++++++@@#$%&*****&%$####$$$$$#@+++@#$%%$$#@++@######$%%%$##@#$&*&&*->;=%%=;;=&&->>-=;,,-**--=&&*&$$%&&%&--*&=,,-&&*=*=>'>=&=--**-,,;-;,',-->!~);=-,)),>,{:}[({))]_<:^)>;>)^((^!,>>']:}}<(])>;;,)](::_/]!'>;>'~(<|222}<(]!'>-==-;,)]^(_:|bq",
+"k};$##@@@@+++++++++++++++++++@@##$%&****&%$#####$$$$#@@++@#$%%%$#@++@##$$#$$%%%$#@#$%&*&&=;>-&%*->-*&=;>;-->,;=*=--*&&&$$%&&%&--*&-,,=&&*=*-,';*&=-=*=;,>-->'';-;)~!,-->')'>,!([}:]))]_<:/!>;>)]//]!,>>)^:}}</~';;;,!^(:_(^~),;;,)^:}122|[_^~'>;-=-;,){^(____[0p",
+"k};$####@@@@+++++++++++++++++++@@#$%&*****&%$####$$$$##@++@#$%%%$#@+@@##$$$$$%%%$###$%**&*->>=%%=;;=&*->>--;,>=*=--*&&&%$%&&%&=-*&-,>=&&**=-,,-**--=*=>,;-;,',--,!~';-;,)',>)^<[:^!)](<:/!,;>)]//]),>,)^:}[:^!,;;>'{/__(/])'>;>'{([|22|[:/{),;-=-;,){^(___(//:9o",
+"k};$$#####@@@++++++++++++++@@@+++@##$%&*=**&%$####$$$$##@++@#$%%%$#@@@@#$$$$$$%%%$###%&**&=;>;*%*-;-*&=;>;-;,,-*=--*&&&%$$&&%&=-*&-,>=%&**=;',=&=--**-,,;->'';-;)~)>--,)),>']:[</!){(<:(!,;>)]//]),>,!/<[[_])>;;>)]/((/]!',>>,!^:}121}:(]),;-=-->'~^((__(/^]{(7n",
+"k};$$$######@@@@+++++++++++++@@@++@@#$%&**=**%$#####$$$##@++@#$%%%$#@@@##$$$$$%%&%$##$%****->>=&%=;;=&*->;-->,;==--=&&&%$$%&%&=-*&-,>=%&**=>'>=&=-=*=;,>--,',;-,!!,;-;')',,~_[</~)~/::(~,;>)]/^]),>,~(<[<({'>;;,)]/((^{),>;>)]([|21}<(]!'>-=-->'~^/(__(/^]!))]4m",
+"k}-$##########@@@@+++++++++++@@@@@@@@##$%&*=**&%$####$$$$#@@+@#$%%%$#@@@#$$$$$$%&&%$##$&***=->;*%&-;-&&=;>-->,>-*--=*&*%$$%&%&=-*&-,>*%&**->';**--=*->,;-;,'>-;)!);-;,)',,)/<<({)!^::(~,;>)]/^{),>,{(<[:/!,;;;,!^/(/]!'>;>,~/<|11|[_^~'>---->'!]/(__(/^]!)'>>!3m",
+"j[-#############@@@@+++++++++@@@@@@@@@@#$%&**=*&%$####$$$$#@@+@#$%%%$##@##$$$$$%%&&%###%&***=;>-&%=--*&=;>;-;,,-==--*&&%$$%&%&=-**-,;*&***-,,-*=--=*->>-;>',;;,!!,-->'',,'^:<_])!^_:({,>>)]^^{',>'](<<_^),;;>'~^//^{),>;,)]_}11|}:/{),;---;,!]/(_((/^]!),>;-;)3m",
+"k[-#@@############@@@@++++++++@@@@@@@@@@##$%&*==*&%$####$$$##@+@#$%%%$$###$$%%$$%&&&$##$%****->;=%&-;=&*->;-;,,;==--*&&&$$%&&&=-**->;*&*==-,,-*=--*=;>;-;,,>->)!';-;')',,{_<_^!!](:({'>,)]^^~'>>)]_<<(])>;;>){^^^]!'>;>'~(<|11}<(]),;---;,)]^((((/^{!),>;---;~4m",
+"k}-#@@@@####$$$#####@@@@+++++++@@@@@@@@@@@#$%&*==*&%$####$$$##@@@#$$%%%$###$%%%$$%&&%$##$&***=;>-&%*--*&=;>;->,>-=--=&&&%$%&&&=-**->-*&**=;,>=*=-=*->>;->,,;;,!)>-;,)',,!(::^!!](:(]'>,)]^^~'>,)^_<:/~';;;,)]^^]~),>>,)^:}11|<(]!,;---;,){^/(((/]{!),>;----;,^7n",
+"k|;$##@@@@####$$$$####@@@@+++++@@@@@##@@@@@##$%**==*&$####$$$##@@@#$%%%%$###$%%%%%%&&%$#$%*=**-;;=&&=-=&*->;->,,-=--=&&&%$%&&&=-**-;-&&*==>,;==--==->;-;,,>;>)!';->'),,)^::/~!](:(]'>,)]^]!'>,)^_:_^!,;;;,!]^]{)'>;>'{([|1|[_^~'>---;>)~^/((/^]{!',>;---;;,){:0p",
+"l1,&$$##@@@@####$$$$#####@@@+++++@@@####@@@@@#$%&*==*&%$####$$##@@@#$$%%%$##$%%%%%%%&&%$$$&*=*=;>-*&*-=*&=;;;;,,;=--=*&&%$%&&*=-**-;=&&*=->,;==--==;>;->,,;;,))>-;')',']_:({!{/_(])>,)]^]!,>,!^_:(])>;;>'!]]]!',>>,!^:}||[:/{)>;--->'~]/((/^]~!',>;---;>,){]/[ap",
+"m2)=&%$$##@@@@###$$$$$$####@@@+++@@@@######@@@##$%**=**%$####$$$##@@#$%%%%$##$%&&%%%&**%$$%*===-;;=&&=-*&*;;;;,'>--;-*&&%$%&&*=-**-;=&&*=->>-=--==-;;-;>,>;>)),;;,)',,~(:(]!~/__]),,)]^]!,>,!/::({'>;;,)~]]~),>;>)]_[||}<(]),;--->'!]^///^]~)',;;---;>'!{^/(_}ap",
+"m4~;=*&%%$###@@@###$$$$$$$###@@@@@@@@@#######@@@#$%&*==*&%$###$$$##@@@#$%%%$$$$%&&%%%&*&%$$%*===-;;*&*==&&-;;;>,,----=&&%%%&&*=-**--=%&*=->>-=--==->;-;,,;;,)'>;>'),,)^_(]!!^_(^),,)]^]),>,~/__/~,;;;,)~]{!',>>,!/<}|}<(]),;---;,){^///^]~)',;;---;,'!]^/(((([0p",
+"n6^,>;-=*&%$$##@@@###$$$$$$$###@@@@@@@@########@@##%&*===*%$###$$$##@@##$%%%$$$%&*&&%&**&%$%&====;;-&&==*&=;;;;,,;---=&&%%%&**=-**--*&&*=;,;==--==;;-->,>;>)),;;,)',)]((^!!]((^),,)]^]),>'~/_(^),;;>'!~{~),>>,)]_[||[_^!,;---;,)~]^/^]{!)'>;---;>,)~]^/(((/^^:9o",
+"n7/)',>;-=*&%$$##@@###$$$$$$$$$##@@@@@@@#########@##$%&*==*&$$###$$$#@@##$%%%$$$%&**&%&**&%$%*===-;;=&*=*&*-;;;,'>---=&&&%%&&*=-**--*&*==;,;=---=-;;-;,>;;,),;;,)','{/(^~!]/(^),,)]]{),,'{/(/])>;;>'!~~!',>>'~/<}|[:/~'>---;>'!]^^^]{!),>;---;>'){]/(((/^^]{~(7n",
+"n6^))'',,;--=&%%$#######$$$%%%$$$##@@@@@@####$$###@@##$&*==*&%$###$$$##@@#$%%%$$$&***&&&**&%%&====;;-*&*=&&=;;;>',;-;-*&%%%&&*=-**=-*&*=-;>-=--==-;;;>,>;>''>;>'),,!^(^~!{/(^!,,)]]{),,)]/(^~,;;;,)!~!),>>,)^_[}}<(])>;--->'!]]^^]~!',>;---;>'!{^/(((/^]]~!))]5m",
+"m4{,,'')'',>;-=*&%$$######$$%%%%%$$###@@@@@###$$$$#####$%&*==*%$###$$$##@##$%%%%$%&*=*&&*=*&%%*===-;;=&&**&*-;;;,,;-;-*&&%%&&*==**==*&*=->>-=--==;;-;>>;;,',;>')',)](/{!{^(^!,,)]]{),,)]//]!,;;>,)!!)',>>'{(<}}<(]),;---;,){]]]{~)',;;--;;,)!]^/((//^]{!)',>>~4m",
+"l2)-;;,,'''',>;-=*&%$$#####$$%%%%%%$$$##@@@@###$$$$$####$%&*==*&%$##$$$#####$%%%%$%&==*&&*=*&%&=-==-;-*&**&&=;;;,'>;;-=&&%%&&*=-**==&&*=->>--;-=-;;-;>>;>''>;,)),'{//]!~^(^!',)]]{),,)]//])>;;>'!!!),>>,!^:[}[_^!,;-=-;,)!{]]{!)'>;;--;>,)~]^/(//^]]~)),,>;;;~4m",
+"l1,**=-;>,,''',,>;-=&%%$#####$$%%&&&%%$$##@@@###$$$$$$####$%*===&%$##$$$$####$%%%%%%*===**==*&%&=---;;=&&*&&=;;;>',;;-=&&%%&**==**==&&*=;>;--;-=-;-;>>;;,',;>')''!^/]!~^/^~'')]]~',,)]^^~'>;;,)!!)'>>>)](<[[:/~';-=-;>'!~{{~!),>;---;>,){]^/(//^]{!)',>;;;;;,^6n",
+"l1,*&&**=-;>,'''',>;-=*&%$$####$%%&&&&&%%$###@###$$$$$$$###$%&*==*%$$#$$$$####$%%%%%&*===**==*&&*----;;=&&&&*-;;>,,;;;=&&%%&&*===*==&&==;>;---==-;-;>>;>',>>')'')]^]!!]/^~''!]]~',,)]^]!,;;>,)!!),>>,!^:[[:({'>-=-->')!~~!)',>;---;>'!{^////^]{~)',>>;;;;>,){:0p",
+"l2'=&&&&&*==-;,,''',,;-=*&%$$###$$%%&***&%%$###@###$$$$$$####$%*==*&%$#$$$$####$%%%%%&=--=*===*&&=---;;-*&&&&=;;;,'>;;-*&%%&**==**=*&&=-;>;-;-=-;-->>;;,',>,))'){^]~!]^^~''!]]~','!]]{)>;;>')!)',>,)](<[<(])>--=-;,)!!!!)',;;---;,'!]^///^^]~!)',>;;;;>,)!]/_|cq",
+"m3!-=**&&&&&*=-;>,,'',,>;-=&%%$$##$$%&**=*&%%$######$$$%$$$###$%&*==*%$$$$$$$###$%%%%%&=--=====*&*----;;=&&&&*-;;,',;;-*&%%&**===*=*&*=->>--;-=---;>>;>,,>,')''~]]~!{^^{)'!]]!','!]]~'>;;,'))',>>'~/:<<_^!,;-=-;,')!!)',>;----;,)!]^^//^]{~)',>>;;;>,'!]^(:<[2dr",
+"m4~;--==**&&&&*==-;>,,,,,>;-=*&%$$#$$$%&*===*&%$######$$%%%$$##$$%*==*&%$$$$$$###$%%%%%*=--===-=**=---;;-*&&%&=;;>',>;-=&%%%**===**&&*=->;---==---;>;;,,>>')''!]]{!{^^{)'!]]!','!]]!,;;>,)))',>,)](:<_/~';-=-;>'))))',>;---->,)~]^^^^^]~!)',>;;;>,'!{^(_:<[[[1bq",
+"n5],;;;--==**&&&&*==-;>,,,,>;-=*&%$$$$$%%&*===*&%$$####$$%%%$$$##$%&*=*&%$$$$$$$##$%%%%&*-;-===-=**=---;;=&%%%*-;>,'>;;=&%%%**===**&&*=;>;-;-=---;>;;>,,>,))'){]{!~]^{))!]]!','!{~),;;>'))),>,'{/:::/{'>-=-->,'))',>;;---;>,)~]^^^^]{!)',>;;;;,'){^(_:<[<<:__[0o",
+"n5],>>>;;;--==**&&&&*=-;;>,,,>;--=&%%$$$$%&*==-==&%$$####$$%%%%$$$$%&*==*%$$$$$$$##$%%&%&=-;-==--=*=---;;-*%%%&=;;,',;;=&%%%**===**&&*=;>;-;-=---;>;;,,>,')')!]{!!]^{))!]{!','!~!'>;;,'))',>,!](::(])>----;,'''',>;----;>'){]^^^]]~)',>>;;;>,)~]/_:<<<<:_(^]](7n",
+"m4{,>>>>>>;;;--==**&&&**=-;>>,,>>;-=*%%$$$$%&*=---=*&%$###$$$%%%$$$$$%&*=*&%$$$%$$$$$%&&&&=-;;----===-;;;;=&%%%=-;>',>;-*&%%&*=-=**&&*-;;;;;-=---;;;>,,,'))'!{{!!{]{!)!]{)','!!),;;>,))),,,'{/_:(^!,;-=-;>,'',,;;----;>'!{]^^^]{!)',>;;;>,)!]/(:<<<<:_(^]~!)']4m",
+"l2);;;>>>>>>>;;;--==**&&&**=-;>>>>;;-=*&%$$$$%&*=---=*&%$###$$%%%%$$$$%&*==&%$$$%%$$$$%%&&*=;;;----==-;;;;-=%%%&-;>,',;-*&%%&*=-=*&&&=-;;;;-=---;;;;,,>,))')~{!!{]{!)~]{),,'!!'>;;,'))',,'!^(__^~';-=-;>,,,,>;--==-;,'!{]^^]{!)',>;;;>,'!]^(_:<<::_/^]~)',>;>!3m",
+"k|,**=--;;>>>>>>;;;--==**&&&*==-;;>>;;-=*&%%$$%%&==---=*&%$###$$%%%%$$$%%*==*&%$$%%$$$$%%&&*-;>;----==-;;;;-&%%%=;;,',;-=&%%&*=-=*&&*=-;;;;-=---;;;>,,,')))!{~!{]]!)~]{),,'))'>;>,)))',,){/__/{'>-=--;,,,>>;--=--;,)!{]]]]~!),,>;;;>'){^/_::<::(/^]~)',>;;--;!3m",
+"k};%$%&*==-;;>>>>>>>;;--==*&&&&*==-;;;;;--=*&%$$%%&=--;-=*&%$##$$$%%%%$$$%&==*&%$$%%%$$$%%&&*-;>;----=-;;;;;=%%%*-;,',>;=&%%&*=-=&&&*=->;;;-=--;;;>,,,')))!~~!{]]!!~]{),,')),;;>'))',,'!^((/])>----;>,,>;;-==-->,)!{]]]{!)',>;;;>,)~]/(::::_(/^]!)',>;;----->{5n",
+"k};$##$$%%&*=--;>>>>>>;;;--==*&&&&*==-;;;;--=*&%%$%%&=--;--*&%$##$$%%%%%$$%&*==*%%%%%%$$$%%&&=->>;;-----;;;;-&%$%=;>,',;=&%%&*=-=&%&*=;;;;-==--;;;>,,'))))!!!~]]~!~{~),,')'>;;,'))',,)]/(/]!,;---;>>>>;--==-;>,)~{]]{~)',>;;;>,'!]^(_:::_(/^{!)',>;;----;>,'!(8o",
+"k|>%$$####$$%&*==-;>>>>>>>;;--=**&&&&*==--;;--=*&%%%%%&=-;;;-=&%$$$$$%%%%$$%%*==*&%%%%%%$$%&&*=;>,;;;---;;;;;=%%%*->,',;-*&%&*=-=&%%*-;;;;-==--;;>,,,))))!!!!]]~!~{~),,'',>;>,)))','!^//^~';---;;>>;;-===-;>')~{{{~!),,>;;;>'){^/(_:__(^]{!),>;;----;;>,)!{^(}bq",
+"l2'*&%%$$###$$$%%&==-;;>>,,>>;;-==*&&&&&*==-----=*&%%%%%&=-;;;-=&%$$$$%%%%%%%%&*==&%%%%%%$$%&&*=;,,;;;;--;;;;-*%$&=;,',>-=&%&*=-=&%%*-;;;;-=--;;;>,,'))))!!!{{~!~{~),,',,;;>'))',')]^/^{)>---;;>>;;-===-;>')~{{~!)',>;;;>,)~]/(___(/^]~)',>;;---;;>,')~]^(_:[2cr",
+"m4~;==*&%%$$$$$$$$%%&*=-;>>,,,>>;;-==*&&&&&*==----=**&%%%%&=-;;;-=&%$$$$%%%%%%%&*==*&%%%%%%%%%&*=;,,>;;;;;;;;;=%$%*->,,,;=&%%*=-=&%%*-;;;--=--;;;>,'))))!!!~{~!~{!',,,,>;>,)))'')~]^^]),;---;;;;--===-;,')!~~!)',>;;;>,'!]^/((((/^]~)',>;;---;;,')!]^(_::<<[[2cr",
+"n6^'>;;-==*&%%$$$$$$$$%&*=-;>>,,,,>;;-==*&&&&&*===--==*&%%%%&=-;;;-=&%$$$$%%%%%%%*==*&%%%%%%%%%&*=;,,>>;;;;;>;-*%$&-;,',;=&%%*--=&%%*-;>;-==-;;;>,,)))))!!!~~!~~!',,,,>;>,)))''!{^^]!,;---;;;;--===-;,)!!~!!)',>;;;>')~]/(((/^]{!)',>;;--;;>,)!{^/(_:<<[[<<:<|bq",
+"n7(!)',,>;;-==*&%%$$$$$$%%&*=-;>>,,,,>>;-==*&&&&&*======*&&%%%&=--;--*&%$$$$%%%%%%&*==*&%%%%%%%%&*-;,,>>;;;;>;;=%$%=;,',;=&%&=--=&%&=-;;;-=--;;>>,'))))!!~~~!~~!',,,>>>,'))'')~]^]!'>;--;;;;-====->,)!!!!)',>;;;>,)!]^/((/^]~!',>;;;-;;>,')~]^(_:<<<<<<::_((([0o",
+"n7/!)))))',,>;;-==*&%%%$$$$%%&*=-;>,,,,,,>;-==*&&&&&**====**&%%%&=--;--*&%$$$$%%%%%&*==*&%%%%%%%%&*->,,>;;;;>>;-*%%&->,,>-*&&=--=&%&=-;;;---;;;>,')))))!~~~!~~!',>>>;>,)))')!{]]~)>;-;;;;;--==-;>,))!!)',>;;;>,'!{]^//^^]~)',>;;--;;>,)!]^/(::<<<<<::_((/^]]{(7n",
+"m4],,''))))))',,>;;-==*&&%%$$$%%&*=-;>,,,,,,>;-==*&&&&&**===**&&%&&*=---=*&%$$$$%%%%%&*==*&%%%%%%%&*->,,>;;;;>>;=&$%=;,',;=&*=--=&&*-;;;-==-;;>>,'))))!~{~~~~)',>>;;>')))))!]]{),;;;;;;;-===-;>,))!)),,>;;;>,)~]^^^^]{!)',>;---;>,')~]/(_::<<<:::_((/^]{~!)')^5n",
+"l2'---;>,,'))))))'',>;;-==*&&%%%%%%&*=-;>,,'',,>;-=*&&%%&&**==**&&&&&*=---=*%$$$$$%%%%&*==*&&&&%%%%&=->,,>>;;>>;-*%%*-,',;=&&==-=&&*-;>;-=--;;>,')))))!~~~~!)',>>;>,'))))!~]{!'>;;;;;;-===-;,'))))',>;;;>,)!{]^^^]~!),>;;--;;>,)!]^/(:::<<::__(/^]]{!))',,>>,]4m",
+"k|>&&&*==-;;>,'')))))'',,>;--=**&%%%%&&*=-;>,'''',>;-=*&&%&&&**=***&&&&*==--=*%$$$$$%%%&*===*&&%%%%&&=->,,>>;;>>;-&%%=>,,;=&&*===&&*-;>;----;>,')))))!~~~~!),,>>;>,)))))!{{!'>;;;;;;--=--;,')))',>;;;;,')~]]]]{!)',>;---;>,')~]/(_::::::_((/^]{~!)'',,,,,,,')/7o",
+"k|>%%%%%%&**=--;>,,'))))))',,>;;-==*&&&&&&*=-;>,'''',>;-=*&&&&&******&&&&*==-==&%$$$$$%%%&*==*&&&%%%&*=->,,,>>>>>;*%%*;,,>-&&&==*&&*-;;--=-;;>,')))))!~~!!),>;;>,'))))!~~!),>;;;;;--=-;>,'))',,>;;;>,)!{]]]{!)',>;;-;;>,)!]^/(_::::__(/^^]{!))',,,,,,,')!~]^(}bq",
+"l1,*&%%%%%%%%%&*==-;>>,''))))))',,>;--=**&&&*==-;>,'''',>;-=*&&&&&******&&&*====*&%$$$$$%%&*==**&&&&&&*=->,,,>>>>;-&%&->,,;*&&*=*&&=-;;----;>,')))))!~~!!',>;;>,'))))!~!),>;;;;;----;>,'''',>;;;>,')!{{{~)),>;;-;;>,'){]/(__::__((/^]]~!))',,,,,,')!~]^/(:<[|4es",
+"m3!-==**&&%%%%%%%%&&*=--;>,'')))))))',>;;-==****==-;>,'''',,;-=*&&&&&******&***===*&%$$$$$%%&*==*&&&&&&*=;>,,,>>>>;=%%=;,,;=%%*=*%&=;;;----;>,'))))!!~!!',;;;>,))))!!!)'>>;;;;----;>,''',>;;;>,')!~~~!)',>;;;;;>,)!]^/(_____(/^^]{!))'',,,,,')!~]^/(:<[}|12237fs",
+"n5],>;;--==**&&%%%%%%%%&*==-;>,'')!!!!))'',>;--======-;>,'''',,;-=**&&&**********==**&%$$$$%%&*==**&&&&&*=;,,,,>>>;-*%&->,;=&%*=&%&-;>;---;>,'))))!!~!)',;;>,'))))!!)',>>;;;----;>,',,>>;;;>,')!!!)),,>;;;;>,')~]^(((_(((/^]]~!))',,,,,')!~]^/_:<[}|1122222114er",
+"o8(~))',,>>;;--==**&&%%%%%%&*==-;>,'))!!!!!))',>;;-====--;>,'''',,;-=**&&***********=*&%%$$$$%%&*==*&&&&&*=;>,,,>>>;=&%=;,>=&&*=&%&-;;----;>,)))))!!!)'>;;>,)))))!)',>>;;;---;;>,,,,>;;;>,'))!))',>>;;;;>')!]^/(((((/^^]{~!))'''''')!{]^(_:<[}|1111111||}}[<<|bq",
+"o9:]{{~~!!))',,>;;--==**&&%%%%&&&*=-;>,'))!!~~!!)',,>;------;>,,''',,;-==***************&%%$$$%%&**=**&&&&*=;,,,,>>>-*%*;,>;**==&%*=;;---;>,'))))!!!)'>;;>,))))))),,>;;;---;>>,,,>;;;>>,'))))',>;;;;>,')~]^//((//^]]~!))'''''))!{]^(_:<[}||1111|||}[[<:__(/^^:9o",
+"n7(~~~{{{{~~~!!)))',,>;;-==**&&&%&&&&*=-;;,'))!~~~!!))',>;-----;>,,''',,;-==*****==*******&%$$$$%%&*=***&&&*=;,,,,>>;=&&->,;=*==&&=--;--;;,'')))!!!),>;>,'))))))',>>;;;--;>>,>>;;;;>,,'))'',>>;;>,')!{]^////^^]{~!))'''))!~]]/(_:[[}||||||||}[[<:_(//^]]{!!))^6n",
+"m4{,,,')))!!~~~~~~!!!))',,>;;--==*&&&&&&&*==-;>,')!~~~!!))',>;;---;;>,,'',>;-==***=====****&&%$$$$%&*****&&&*=;,',,>>-*&=;,;===*%&=;;---;>,)))!!~!),>;>,')))))',>>;;;-;;;>>>>;;;>>,'''',,>>>>,,)!~]^^^^^^]]~!!))))))!~]^/(:<[[}||||||}}[<::_(/^^]{~!))''',,,,]4m",
+"l1'====-;;>,,''))!!!~~!!!!))',,>;;--=**&&&&&&**=-;>,'))!~!!!)),,>;;--;;>,,,,,>;--=========***&%%$$$$%&****&&&*=;,'',,;-**->;===&%%->;--;;,'))!~~!),>>>,)))))',,>;;;;;;;>>>;;;;>,,,,,,,>>>>,')!{]^^^^]]{~!)))))!!{]^/(:<[[}}||}}}[[<:_((/^]]~!!))'',,,,,,,,,,'^6n",
+"k|>%%%%%&&**==--;>>,''))))!!!))))',,>;;--=***&&&&**==-;>,'))!!!))',>;;;-;;>>,,,,>;--========**&&%%$$$%%&****&&*=>,'',>;=*=;>;-*%$%=;;;-;>,'))!!)',>>,'))))',,>>;;;;;;>;;;;;>>,,,,,>>>,,')!~]]]]]]{~!!))))!!{]^/(:<[[}}}}}[[<::_(/^]]{!!))'',,,,,,,,'''))!~]]/[ap",
+"k|>%$$$$$$$%%%%&&**==--;;>,,''')))))'',,,>;;--==**&&&**==-;;,,'')))'',>;;;;-;;>>,,>>;---======**&&%$$$$%&*****&*=;,,,>;-**;,>=&$#$&=--;;,''))!)'>>>,')))',,>>;;;;;;;;;;;;>>,,,,,,,,'))!{]]]]{{~!)))!!!{]^/(_:<[}}[[[[<:_(/^]]~!!))'',,,,,,'''')!!{]^^/(_:<[}|5fs",
+"l1,*&%%%%%%%$$$$$%%%%%%&&*===--;;>,,,,'''',,,>>;;-==****&&**==-;>>,,'',,,>;;---;;;>>>>>;;--======*&&%$$$%%&***&&*-;>,>>;=*->;*$##$&=--;>'''))),>;>,'))'',>>;;;;;;;;;;;>>>,,,,,,'')!~{{{{{~!)))!!!~]^/(_:<<[[<<<:_(/^]]~!!))'',,,,,'''))!~{]^//(_:<[}|122344560iu",
+"m3!;-===****&&&%%%%%%$$$%%%%%%%&**===--;;;>>>,,,>>>;;;--==******===-;;;>>>>;;;;-----;;>>>;;;---====*&%%$$$%&*****=-;>,,>-==--*$#$&=---;,'))))',>>,')'',,>;;;;;;;;;;;>>>,,,,,'))!!~~~~!!))))!~]^^/(_::::::__(/^]{!!)'',,,,,,'''))~{]^//(_:[}||12234455666666670iu",
+"n5^',>>>;;;----===***&&&%%%%%%%%%%%%%%%&&**==---;;;;>>;;;;---===****====-----;----------;;;;;;-----==*&%%$$%%&****==;>,>;==--=%$%=-;-->'))))',,,,''',,>>;;;;;;;;;;>>>,,,''))!!!!!))))))!~]]^/(___((((/^]{~!))',,,,,,''))!~]]^/(_:[}}|1123445555555555444332225fs",
+"o8(~)))))''',,,,>>;;;;---===***&&&%%%%%%%%%%%%%&&*===----;;;;;;-----======================---;;;;----==**&%%%%%&***==;>,>-=-;-*%&=---;,)!)),,,''''',,>;;;;;;;;;>>,,,'''))))))))))))!~{]]^////^^^]{~!))',,,,,'''))!{]^/(_:<[}}|122344444444444332211||}}}[[<:<|bq",
+"o8(~!!!!!!!!!))))))))'',,,,>>;;;;--===***&&%%%%%%%%%%%%&**====---;;;-------=========*********==--;;;----==*&%%%%&&***=-;>;----*&&=--;,)!!)',,,''',>>;;;;;;;;;>,,,'''))))))''''))!!~]]]]]]]]~!)))'',''''')!~]]^/(_:<[[}||122222222222211|||}}[[<<::__((//^^^]^:9o",
+"n5^)''''')))))))!!!!!!!!!)))))))))'',,,>>;;--===***&&%%%%%%%&&&**====--;;;;------====***&&&&&&&&*==-------==*&%%%%&***=----=--=**=-;>'!!)',,,'',,>;;;;;;;;>>,,,'''''''',,'')))!!!!~~~!)))))'''''))!{]^//((_:<[}}}||||||||||}}}[[[<<:::_(((//^^]]]{~~!!!))))')^6n",
+"m3!;--;;;;;>>>,,,,''''))))))!!!~~~~~~~!!!!!)))'',,>>;;--====**&&&&&***==-----;;;;;;;;---==**&&&%%%&***=-----==**&%&&&*****=---===-;>>,)',,'',,,>;;;;;;;>,,,,'',,,,,,,,,'''))))))))))))))))!{]]^^^/(_:<<<<<<<[[[[[<<:::__(((//^^^]]]]{{~~!!!)))''''',,,,,,,,,'^5n",
+"l2'=****======------;;;;;>>,,,'')))))!!!~~{{]]{{{~~!!!))))'',>>;---===========--;;;;;;;;;;---==*&&&%%%&***======**&&&**&%&=----==->,,,,,>,'',>;;;;;;>>>,,,,,,,>>>>,,,,''''''))))))!~~{]]]^/((___________((///^^^]]]]{{~~!!!)))))''''')'''''''''''')))))!!!!~]_9o",
+"l2'=************===========----;;;;>>,,,,'')))!!!!~~~{{]]]]{~!!)))'''',,>;;---------;;;;;>>>>;;----=*&&&&&***======****&%&=--===*->',,,,>,,,>>;;>>>>>,>>>>;;>,,,,,,,''''))))!!!~{]]^^^^^^^^//^^^]]]]{{{~~!!)))))))))))))))))))))))!!~~{{]]]]^^^^^///(((__:::<1cr",
+"m3!;----------==================---------;;;;;>>,,,,'')))!!!!)))!!!!!~~!))'',,,,>>>>;;;;;;;;;;;>>,>;--====*&&&**======*&&&*====**->',,,,>>>>>>>;>>>>>>>>>>;>>,'''''')))!!~~~{{{{]]]]]]{~~~!!!!!))))))))))))!!!!!!~~{]]]]^^^^///(((__::<<<[[[}}}}|||||111222237gt",
+"n6^',,,,,,,,,>>>>>>>>>>;;;;;;;;;;;;;;;;;;;;;;;;;;;;>>>>>,,,,,,,,,,'')))))))'''',,,,,,,,>>>>>;;>>,,,>;;;;>;-=====-==**=***&&&**=*=->,>;;;>>>;>,,>;;>>>>,,,,>,,'))!))))!!!!!!!!!!!!!!!!!!!!!!!!!!~~{]]]^^///((((___:::<<[[[[}}}}}|||1112222333334444444444444459ht",
+"o9:]{{{{{~~~~~~!!!!!!!!!!!)))))))))))))'''''''''''''''',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>>>>>>>>,>>;;--;;>>;;;;;>;-=&*====&&&&*==-;'',;--;>;;>')',>>>,,''',,,,'))))))))))))))!!!~~{{{]]]]]]^^^//(((_:::<<[[}}}}}}}||||||||||11111111122222222222222222111111125fs",
+"pa}_((((((/////////////^^^^^^^^^^^^^^^]]]]]]]]]]]]]{{{{{~~~~!!!!!!)))))))'''',,,,,,,,,,>>>>>>>>>;;;----;;;;>>>,,>-=**-;;-=*====-;,')'>;-;>>>'!~!)',,,,'',,>>,,,''''))))))!!!~{]]]]]^^^^^^////((((____::::<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<::::::::::|bq",
+"qb|:_____((((((((((((((((((((///////////^^^^^^^^^^^^^]]]]]]]]]{{{{~~~!!!!)))))'''',,,,,,,>>>>>;;;;;----;;;>>>>>;;-==-;>>>;;;;--;>,')),>;>,,)~]]{!)'',,,,,>>>>>>,,,,,'''')))))!!!!!!!!!!!~~~~~~~~~~{{{{{{{{]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]:9o",
+"p0<^^^^^]]]]]]]]]]]]]]]]]]]]]{{{{{{{{~~~~~~!!!!!!!!!))))))))))))))))))''''''''',,,,,,,,,,,,,,>>>>>;;;;>>,,'',,>;---;,''',,;;;;;>,,,'',,,,'){^^]!'',,',,,,>>>>>>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,''''''''''''''''''''''''')^6n",
+"n6^),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>>>>>>>>>>>>>>>>>>;;;;>>>>>>>>>,,,,,,,,,,,,,,,''''''''''))))'''',,,,'))!!!!)'>--;>')'',;;;;;>>>>>,,,,,,,){/^~'>>,')))',,,>,,,''''''''''',,,,,,,,,,,,,,,,,,,,,>>>>>>>>>>>>>>>>>>>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>,]4m",
+"m3!;------------------------------------;;;;;;;;;;;;;;>>>>>,,,,,'''''')))))))!!!!!!!!!!!!!!!!!!!!!))'')!~!!))!),;-->,,,>;----;>;;;;>>;;;>>,)]{'>>,))!!!)',,,'')))))'''''',,,,,,,,,,,'''''''))))))))))))))))))!!!!!~~~~~{{{{{{{{{]]]]]]]]]]]]]{{{{~~~~!!!!!))!/7n",
+"m2)-=========-------------;;;;;;;;>>>>>>,,,,,''''')))))))!!!!~~{{{~~~~~~~~~~~~~!!!!!!!!!!!!!!~~{{~!)'')))',>>,,>;--;>;;;---;;;>;--;;;----;;,)'>>,)!!)!!!)',')!!)))'''',,,,,,,,,,>>>>,,,,,,,'''''))))))!!!~~{{]]]^^///(((((_____::::::<<<<<<<<<<<<::::::____(_}ap",
+"m3!;;;;;;;;;;>>>>>>,,,,,,,,'''))))))!!!!~~~{{{]]]]]]]]]]]]]]]]]]]{~!!))))))))))))))))!!!!~!!!!!!!!)'>>>>>;;-;;;;;;-;;;-----;-;>>;;;;;------;>;;>,'''))!!!)))!~!))))))))''''',,,,>>>>>;;;;;;;;;;>>>,,,,,'''))!!~~{]]^^///((___::<<<[[[}}}|||1111111111111||||14er",
+"n5^'''''''))))))!!!!~~~~{{{]]]]]]^^^^^^^^^^^^^^^^^]]]{{~!!))))))))'',,,,''')))))!!~~~~~~~~!))',,,>;;-=---;;;;>>;;;-----;--;;-------;;;;;-==----;>>>,,,'))))!~~!!)))!))))))))))))'',,,,,,>>;;------------;;;;>>,,,'''))!!~{{]]^^//((__::<<[[}}}|||||11111122237gs",
+"o8_]{{{]]]]]]]^^^^^^^^^/////////^^^^^^]]]]{{~!!!)))''',,,,>>>>,,,,,''''))!~{{{{{{{{~!!))',,>;;--=====--;;>,>>>;---===-;>>;;;--==**=-;>,,;=====---;;;>>>,,,')!!!!!~{{~~!!!))))))))))))))))'',,,,>>>;;;---------------;;;;>>,,,,'')))!~~{]]^^^//(((__:::<<[[[[}3dr",
+"p0[(/////((((((////////^^^^]]]]{~~!!))''',,,,>>;;;;;;;>>>>>,,''))!~~{]]]]]]]]{!!))',,>;;--========-;;>,,>>>;;--=====-->,>;--;-=*&&=--;,,;-==**==---;;;;;>>>,''')!!!~{{]]]{{~~!!))))')))))))))))))))''',,,,,>>;;;;----------------;;;;>>>,,,''')))!!~~{]]]^^^([ap",
+"pa}_((((////^^^^]]]{{~!!))''',,,,>>;;;;--;;;;;;;;>>,,''))!!~{]]^^^^^^^]{~!))',>>;;---====**===-;;>,,,,>>;;;--==**==-;;,>;==-;;-*&*=---;;;--==****=--;;;;;;;>>>,''''))!~{]]]^^^]]]{~!)))))'))))))!!!!!!!!!~!!!))))''',,,>>>;;;------------------;;;;;>>>,,,'')/7n",
+"p0<^]]]{{~!!)))'',,,>>>;;;------------;;;>>,,''))!~{]]^^^^^^^^^^]{~!!)',>>;;---=====****==--;>,,,,,,>;;;;---=***=--;>>>;=*=->>-==*=--===-----=**&**=-------;;;;>>,,''')))!~{]]^^///^^^]]~!))))'''))))!!!~{{{]]]]]]]]]]{{~~!!)))'',,,>>;;------=========-----;!3m",
+"n7/)',,,>>>;;;;--------------;;;;>>,,''))!~{]]^^////////^^]{~!)),,>;;;-----======**===--;>>,,,,,,>>;;-----=****=--;>>>;-=*=->;---==--==*==-----=*&&**==---;-----;;;>,,'''')))!!{]^^//((((/^^^]!))))''''')))!!~{]]]^^^^^///////^^^^^]]{~!))'',,>>;;-----=====-)2l",
+"m4!;-----------------;;;>>,,,'))!!~{]]^^/((((((((/^^]{~!)',>>;;;--------===========-;;>,,,,,,,>;;;---;;-=*&&*=---;>>>>-=**=-;;;;;-=---=***=--;-==*&&&&*==-;;;------;;>>,,''')))))!!~]^//((_::_(//^]{!)))'''''')))!!~{]]^^//((((___:::__(((///^]]{!!))',,,>;;;!3m",
+"m2)-====-----;;;>>,,''))!!{]]^^//(((_____((//^]]~!)',>>;;;------------========--;;>,,,,,,,>>>;;----;;-=*&&*=-----;>,>;==*=-;;;>>>-=-;;-=***=----==*&&&&&*==-----------;;;>,,''))))))))!~{]^((_::<<:_((/^]{!))''',,''')))!~{]]^^/((__:::::<<<<<:::__((//^]]{!~/7n",
+"m3!;;;;;>>,,''))!~{]]^^//((_________((/^]]~!)',>;;;;----------------======--;;>,,,,,,,>>>;;;;---;;;-=*&%&*=-----;>,>;=**=->,,,,,>-==;;-==**=-------=*&&&&&*==-------------;;;>,'')))))))))!!{]^/(_::<[[<::_(/^]~!)''',,,,,''))!!~{]^^//((_::<<<<[[[[[[[<<::_:}ap",
+"n5^)''))!!{]]^^//((__::::::::_((/^]{!))',>;;;;-----;;;;;;;;;;;---=====---;>,,,,,,,>>>;;;;;;--;;;;-=*&%%&=-----;;>,,;-***=;>,,,',;=&&-;;-=**=--------=*&&&&&&*==--------------;;;>,''))))))))'))!~{]^(_:<[[[[[<::_(/^]~))'',,,,,,,''))!!~]]^^/((__::<<[[[[[[[}3dr",
+"o9_]]^^//((__::::::<:::_((/^]{!))',>;;;;----;;;;;>>>>>>>;;;---====--;;>,,,,,,,>>;;;;;;;;;;;;;;;;=*&%%&*=-----;;>,,>;=**=-;>;;>,,;*%&-;;;-=**=---------=*&&&&&&**==---------------;;>,,')!!!!!))'''))!~]^/(:<[[}}}}[[<:_/^]{!)'',,,,>,,,,''))!!~{]]^//((_:::<[2dr",
+"pa}:_:::<<<<<<<::_((/^]{!))',>;;;;----;;;>>>,,,,,,,>>>;;---===--;;>>,,,,,,>>;;;;;;>>;;;;;;;>;;-*%%$%&=------;>>,,,;-*&*=;>,;-->,;*%%=;;;-==**=---------=*&&%%&&&**==-----==----------;;>,')!~~~!!))''''))!{]^(_:[[}}|||}[[<:(/^]{!)',,,,>>>,,,,'')))!~{]]^^/(}aq",
+"rc2[<<<<::__(//^]~!)',,>;;;;;--;;;;>>,,,''''''',,>>;;---==---;>>,,''',,>;----;;>>>>;;;;;>>>;-*%%$%&*-;;----;>,,,,;-*&*=-;>,>;->>;*%%*->;;-=***=---------==*&&%%&&&&**==----====--;;------;>,')!~{{~!!))''''')!~]^/(:<[}}|||||}[[<_(/^]~!)',,,>>>>>>,,,'')))!{_9o",
+"rc1<__(/^]]~!)',,>;;;-----;;;>>,,''))))))))'',>>;;------;;>>,,''',,>;;-----;>>,,>;;;;>>,>;-*&%$$%*=-;-----;>,,,>;-*&&*=;>,,>;-;>;=&%&->>;--=*&*=----------=*&&%%%&&&&**==----====--;;;------;;,')!~{]]{~!))',,,'')!{]^(_:[}}||111||}[[:_(^]{!)',,,>>>;>>>>>,'^6n",
+"p0<^{~))',>>;;;-----;;;>>,,')))!!!!!!!)))',>;;-------;>>,'''''',>;--===-;>,,,,>>;;;>,,>;-*%%$$%&=-;;--=--;>,,,>;-=&&&*-;>,>;;;;>;=*&&->>;;-==*&*=----------=*&&&%%%&&&&**==---======--;;;;------;>,)!~{]]]{~!))',,,,'))~]^/(:<[}||11111||}[<:_/^]{!)',,>>>;;>{4m",
+"n6^'>;;-------;;;>>,,''))!!~~{{{{~!!)',,>;;-----;;>>,'')))'',>;-====-;>,''',>>;;;>,,>;-*%%$$$%*-;;--==--;>,,,>;-=*&&*=->,,>;;;;>;==&&=;>>;--=*&&*=----------==*&&&%%%&&&&&**==--==***==-;;;;;--===-;;,')!{]]]]]~!)',,,,,,')!{]^(_:<[}|1122221||}[<:(/^]~!)',,]4m",
+"m3!;-----;;;>,,''))!!~{{]]]]]{{!!)',>;;------;>>,'))))))',>;-=**==-;,'))',>>;;>,,,>;-*&%$$$%&=-;--===--;>,,,,>;=*&&&*-;>,,>;-;>>;-=&%*->>;;-==*&&=------------=**&&%%%%&&&&&**==--==****=--;;;;;--===--;>')!{]]^^]]~!)',,>,,,,')~]^/(:<[}||12222221|}}[:_(^]](8n",
+"m3!;;;>>,,''))!~{]]]^^^]]]]~!)',>;;------;>>,'))!!!))',>;-=***=-;,')))',>;;;>,,,>;-*&%$$$$%*--;--====-;>,,,,>;-*&&&*=-;>,,>;-;>>;-=%%&->,>;--=*&&&=------------=**&&&%%%%&&*&&&**=====**&**=-;;;>;;--====-;>,)!{]^^^^]]~!)',,>>>,,')!{]^(_:<[}|1222233221|}[[|bq",
+"m4]',''))!~{]]]^^^^^^]]{!)',>;;------;;>,'))!!!!!)',>;-=***=-;,')!!)',>;;>>,,,>;=*&%$$$$%&=-;--=====-;>,,,,>;-=&&&&*=;>>,>;--;>,;-=&%&=>,>;;-==*&&*=-------------=*&&&&%%%%&**&&&&*=====*&&&**=-;;>>;;--====--;,')~]^^/^^^]~!)',>>>>>,,))~]^/(_:[[}|1223333336fs",
+"n7(~!~{]]]^^^^^^^^]{~)',>;;------;;>,'))!~{{~!!),>;-=***=-;,')!~!)',>;;>,,',>;=*&%$$$$$%*-;;-=====-;>,,,,,>;-=*&&&*=-;>>>>;--;>,;-=&%%=;,,;;--==*&&*=-------------=*&&&&%%%%%&**&&&&**====*&&&&*=--;>>>>;--====--;>')!]]^///^^]~!)',>>>>>,,')!{]^/(:<[}||22348gt",
+"o9:^^^^^//^^^^]{!)),>;;------;;>,'))!~{]]{~!),>;-=***=-;>')~{~!)',>;;>,'',>;=*%%$$$$$%&=-;-======-;>,,,,,>;-=*&&&&*=;>>,,>;-;>,,>--*%%*-,,>;;--=**&&*--------------=**&*&&%%%%&&***&&&&*====*&&%&&*=-;>>>>>;--=====-;>,)!{]^////^^]~!),,>;;;>>,'))~{]^(_:<[}|5fs",
+"p0[(///^^]]{!)',>;;--=----;>,'))!{]]]]]{!)'>;-=***=-;>')~]]{!),>;;>>,'',>;=*%%$$$$$$%*----======-;>,,,,,>;-=*&&&&&=-;>>,,>;;;>,,>;-=&%&->,,;;--==*&&&=---------------=*&***&%%%%&&***&&&&*====*&&%%&&*=-;>>>>>;--=====-;>,'!~]^/(((//^]~)',,>;;;;>,,')!~]^/(:|cr",
+"p0[/^]]~!)',>;;--===--;>,,')!{]]^^^]]~)',;-=***==;>')~]]]{!',>;;>,,'',>;=*&%%$$$$$%&=-;-=**====-;,,,,,,>;;=*&&&&&*=->>>>>>;;;>>,>;-=&%&=;,,>;---==*&&&=-------=-------=*&&***&%$%%&****&%%&&*===**&%%%&&=--;>,,,>;--==*===-;,')~]^/(((((/^]~)',,>;;;;;>,'))!]:0p",
+"o9:]!)',>;--====--;;>,')!~]]^^^^^]{!',;-=***=-;>')~]]]]~),>;;;>,''',>;=*%%%%$$$$$%*---==***===->,,,,,,>;;-=*&&&&&*-;>>>>>;--;>>,>;-=&%%=;,,>;-;--==*&%&=-------=-------=*&&***&%%$%%&****&&%&&*====*&%%%%&*=-;>,,,,>;--==*===-;>,)!{^^/(((((/^]~)',>;;;;;;>,'^7n",
+"n6^,>;--====--;;>,')!~]]^////^]{!',;-==*==-;>,)~]^^]]!',;;;;>,''',>-=*&%%%$$$$$%&=---=******=->,,,,,>;;;-=*&%%&&*=-;>>>,>;--;;>>>;-=&%%*;,,,;;;;-==*&%%*=;;-----=--------=*&&***&%%$%%&*==*&%%%&**===*&%%%%%&*=-;>,,,,>;--==**==-;>,'!{]^/((((((/^]~)',>;;;;;~4m",
+"m3!-=====--;>,'))~{]^//(//^^{!),;-=====-;>')~]^^^]~),>;;;;,,''',>-=*%%%%%$$$$$%*=--=*******=->,,,,,>;;;-=*&&%&&&*=;>>>>,>;--;;;>>;-=&%%*->,,>;-;;-==*&%&*-;;-----=---=----=*&&**=*&%$$$%*===*&%%%&&*===*&&%%$%%&*=-;>,,,,>;--==**==--;,')~]^/((___((/^]!)',>>~4m",
+"l2)-=--;>,,')!{]^^/(((//^]!),;-=====-;>,)~]^^^^]!',;;;;>,'')',>-=*&%%%%%$$$$%&=--==*&*****=->>>,,,>;;;-=*&&%&&&*=-;>>>>>>;--;;;>>;-=*&%*-;,',;;;;-===*&%&=-;-----===--==----=&&&*==*%%$$%%*===*&%%%&&*====*&%%$$%%&==-;>,,,,>;--==***=--;>,)!{]^/(____((/^{!!^5n",
+"m3!>;>,')!~]]^/(((((/^]!),;-=====-;>,)~]^///^{),>;--;>,'))',>-=&&%%%%%$$$$$%*=--=*&&*****=;>>>>,,>;-;-=**&%%%%&*=;>>>>>>;--;;;;>>-===&%&=;,',>;-;;-==*&%%&=-;---;-===---==---=*&&*===&%$$$%&*===*&%%%%&*====*&%%$$$%&*=-;>,,,,,>;--=****==-;>,')~]^/(_____((/<9o",
+"n5^)))!{]^/((((((/^]!',;-=====-;>,)~]^/(/^]!',;--;;>,'))',>-=&&%%%%%%$$$$%&==-=*&&&***&*=;>>>>,,>;-;--=*&%%%%&&=-;>;;>>>;--;;;;>>;-==*&&=;,',>;-;;-===*&%%&=-;---;-===---==---=*&&&*==*&%$$$%&*===*&%%%%&*====*&%%$$$$%&*=-;>,''',>;-==****==-;>,')!{]^((__::|bq",
+"o8(]]^^/((((((/]{!',;-=====-;>,)!]^/((/^{),>;--;;>,'))',>-=&&%%%%%%$$$$$%*===*&&&&***&*=;>>>>,,>;----=**&%%%%&*=->>;>>>>;--;;;;>>;--=*&&=->,',;;-;;-===&&%%&=-;---;-===---==----*&%&*===*&$$#$%&==-=*&%%%%&*====**&%$$$$%%&*=-;,,''',>;-==*****=--;>,)!{]^/(:|bq",
+"o0[((((__((/]{!'>;-=====-;>,)!]^/(((/]!',;---;>,')))',;-=&&%&&&&%%$$$$%&====*&%&&**&&*-;,>>>,,,;----=**&%%%%%&*=;>;;>>,>;--;>;;>>;---*&&*-;,',>;-;;;===*&&%&*=;;---;;-==---===---=&%%&*===*%$##$%*=--=*&&%%%&*=====*&%%$$$$%%*=-;>,,''',>;-==*****==-;>,')!{^<0p",
+"qb}:__(/^]~)'>;-=====-;>,)!]^/(((/^{),>----;>,')))',;-=&&%&&&&&%$$#$$%*===*&%%&**&&&*->,>;>,,,;----=**&%%&%%%*=->>;;;>,>;--;>;>>>;---*&&*-;,''>;--;;-===*&%%&*-;;--;;;-==---===---=*&%&*=--=&%$##$%*=--==*&%%%&*=====*&%%$$$$$%&*=-;>,'''',>;-==*****==-;;,')(8o",
+"qb}_/^]~),>;-=====-;>,)!{^/(_((/]!',;----;>,')))',;-=&&%&&&&&%%$$$$%&*===&%%%&**&&&*->,>;;,,,;----=***&%%%%%&*=;>;;;;>,;---;>;>,>;---*&&*=;>'',;;-;;;====&&%%&*-;;--;>;-==---=*==---*&%%&*=-=*&$###$&*=--==*&%%%&*======*&%$$$$$$%&*=-;>,'''',>;-==**&&**=-->]5n",
+"p0<]~),>;-=====-;>,'!{^/(__((^{),>-----;>,')))',;-=&&&&&**&&%$$#$%%*===*&%%%&**&%&*->,>;;,',;----=***&%%%%%%&*->>;;;;>,;---;>;>,>;;--=***=;>,',>;;-;>-===*&%%%&=;>;--;>;-===--=**=---=&%%%*=--=*%$##$%&=----=*&%%%&*===-==*&%$$$$$$%%&*=-;,,'''',>;-==*&&&**-)3m",
+"n7^';-======-;>,'!{]/(___(/]!'>;-==-;>,'))))',;-=&&&&&***&%$$#$$%&*==*&%%%&&*&&%&*;>,>;;,',;-=--=****&%%%%%&*=;>;;;;;,>;--;;;;>,>>;--=***=->,'',;;-;>;-===*&%&%&=;>;--;>;-===--=**==--=*%%%&*=--=&%$##$%*=-;--=*&%%&&*===-==*&%%$$$$$$%%*=-;>,''''',>;-==*&&*,1l",
+"m3!-==*==--;,')~]^(____(^{),;-==--;>,'))))',;-=&&&&*****&%$##$%%*==*&%%%%&&*&%%&=;,,>;;,',;==--=**=*&%%&%%%&*-;>;-;;>,>;--;;;;>,>>;--=***=->,'',>;;-;>;====&&&&&&=;>;--;>>-===---=**=---=&%%%*=---*&$###$%*--;;-=*&%%&&*==---==*&%$$$#$$$%&*=-;>,'')'',>;-===,1l",
+"l2'===--;,')~]^(__:_(/]!'>;-===-;>,'))))',;-=&&&&**==*&%$$#$$%&*==*&%%%%&*&&%%%=;,,>;;,',;===-=****&%%&%%%%&=->;--;;>,>;--;>;;,,,>;--=**==-;>,)'>;;-;>>-====&%&&%&=;;---;,>-=*=---=**=---=&%%%&*---=*%$###$&=-;;;-=*&%%&&*==---==*&%%$$##$$%%&*=-;,,')))',>;;)2l",
+"l2)--;>,)!]^/(_::_(^{),;-===--;>,')!!)',;-=&&&**====*&%$##$%%**=*&%%%%%&&&%%%&=;,,;-;,',;===-=***=*%%%%%$%&*=;>;--;;,,;;--;>;;,,,>;--=====-;>,'',>;;-;,;====*&%&&%*-;;--->,>-=*=---=&&*=--=*%$$%*=---=&%####$&=-;;;-=*&%%&&*==----=*&&%$$###$$%%&=-;>,'')))'']4m",
+"m4{,,)!{^/(_:::(/]!'>;-===-;;,'))!!)',;-=*&&**====*&%$$##$%&*=**%%$%%&&&&%%%&=;,,;-;>'';=*===***=*&%%%%$$%&*->>----;,,;;;-;>;;,,,,>---====-;>,'),>;;-;,,-====&%&&&%*->;--->,>-=*=---=&&*=---=&%$%&*=---*%$####%*=;;;;-=*&%%&&*==----==*&%$$###$$$%&*=-;>,'))!/7n",
+"n6/~{]/(_:::_(^{),;-====-;>,'))!!)',;-=*&&*======*&%$##$%&****&%$$%%&&&&%$%&->,,;-;>'';=**===**==&%%%%%$%%&=;>;---->,,;;;-;>;;,,,,>---===-=;>,,)'>;;;->,>=*=-*&%&&%&*->;--->,>-=*=---=*&&*=--=*%$$%&=---=*%$###$%*-;>>;-=*&%%&**==-----=*&%$$####$$$%&*=-;>,)/7n",
+"o9:/(_::::_/]!'>;-===--;>,'))!!)',;-=*&&*==---==&%$##$$%&*=**&%$$%%&&&%%$%&->,,;-->''>=**===&*==*%%%%%$$%&*->>----->,>;;--;>;;,',,>---==---;>,,)),;;;-;,,;====*%%&&%&=;>;--;,,,-=**---=*&&*=--=*&$$%%*=---=&$####$&=-;>>;-=*&&&&**==-----=*&%%$$####$$%%&==->]5n",
+"pa|::::_(^{),;-====--;>,')!!!)',;-=*&**==----=*%$$#$$%&**=*&%$$$%%&&&%$$%*-,,,;-->''>=**===&&*==&%%%%$$$%&=;>;----;,,;;;;->>;;,',,,;--==---->,,'),;;;-->,>-*=-=&%&&&%&=;>;--;,',;=**=---*%%&=---=&%$$%&=---=*%$#@##$&=;>>>;-=*&%&&**=------==*&%$$#####$$%&*-)3m",
+"qc1<:_/]!'>;=====-;>,'))!!!)'>;-=*&**==----=*&%$##$%%**==*&%$$%%&&&%%$$%*-,,,;-->''>=&&*==*&*==&%%%%%$$%%&->>-=---;,,;;;-->>;;,',',;--==-;-->,,,)'>;>;-;,,;=*=-*%%&*&%&=;>;--;,',;=&*=-;-*%%&*=--=*%$$$%*=---=&%##@#$%*=;>,>;-=*&%&&*==------==*&%$$#####$$%&,1l",
+"qb|_^{),;-=====-;>,'))!!!)'>;-=****=------=*%$##$$%&*==*&%$$$%%&&&%$$$%*;,,>-=->''>-&&*==*&*==*%%%%%$$$%&*;>;-=--->,,;;;-->>;;,','';--==-;--;,,,)),;;>-->',-*=-=*%%&*&%&->>;--;,',;=&*=-;-*&%%&=--=*&$$$%&*----*&$#@@#$%*-;,,>;-=*&&&&*==-------=*&&%$$#####%;|k",
+"p0:~'>;-====--;>,')!!!!)'>;-=****=--;;;-=*&$$##$%&*===*&%$$$%%&&&%$$$%*;,,>-=->,'>-&%&==*&&=-=&%%%%$$$$%&=>>;==--->,>;;;-->>-;'',''>--=*=;;-;,,,'),;;>;-;,';=*=-=&%&**&%*->>;--;,',;=&&=---=&%%&*=--=&%$$$%*=---=*%$#@@#$&=->,,,;-=*&%&&*==-------==*&%$$###$-}k",
+"n6]>-=====-;;,,')!!!!)'>;-=***==--;;;;-=&%$##$$%&*==*&%$$$$%&&&%%$$$%=;,,;-=-;,'>-&%&*=*&&*-=&%$%&%$#$%%*->>-=--=;,,>;;;-->>-;'',''>--===;;-;,,,,)'>;>>-->',-**--*%%&**%%*->>;--;,',;=&&=-;-=&%%%*=--=*%$$$%&*----=&$#@@@#$&=;>,,,;-=*&%&&*==-------==*&%%$$$-}k",
+"m3)-====-;>,,')!!!!)'>;-=***==-;;;;;-=*%$###$%&*===*&%$$$%%&&&%%$#$%=;,,;-=-;,'>-&%&*=*&%*=-*%$%%%$##$%&=;>;==-==;,,;;;;-->>-;'',))>---==;>;;,',,)),;;>;-;,'>=*=--*%%&*&%%*;>>;-->')';=&&*-;-=&%%%&==-=*%$$$$%*=---=*%$#@@##%*-;,,,,>-=*&%&&*==--------=*&&%%;}k",
+"l2'==--;>,'))!!!!)'>;==***==-;;;>;;-=&%$##$$%*====*%%$$$%%&&&%$$#$%=>,,;===;,'>-&%%***&%*=-=&$$%%%##$$%&->>-==-=->',;;>;-->;->'',)),---==;,;->',,')';;>>-->'';**=-=&%%**&%%*;,>;-->')';=&&*-;;-*%$%%*===*&%$#$%&*=---=&%##@@#$%*->,'',;-=*&%&&*==--------==**,|k",
+"l2);;;>,'))!!!!),>;==***==-;;>>>;-=*%$###$%&*====&%$$$$%&&&&%$##$&=>,,;=*=;,',-&%%&**&%&=--*%$%%%$##$%%=;,;=====-,'>;;>;-;>;->)',)),---==;,>;;'','))>;>,;--,),=**--*%%&**&%%=;,>--->')';=&&*=-;-*%$$%&====&%$##$%&=---=*%$#@@@#$%=->,'',;-=*&%&&**==-------=-'2l",
+"m4~,>,'))!!!!),>;==***==-;;>>>>;-*&$###$%&*=--=*&%$$$%%&&&%%$##$&->,,;=*=;,',-&%%&**&%&=--*%$$%%$###$%&->>-*====;,'>;>>--;,;->)),)),---==;,>;;,',,)),;;>>-->'';*&=--&%%&=*%%&=>,>-=->')';=&&*=-;-*%$$%&*===*%$$#$$%*=---=&%$#@@@#$&=;,''',;-=*&%&&**==------;)2m",
+"n5])')!!!!)),>-=****==-;;>>>>;-=&%$###$%&==--=*%$$$$%%&&&%%$##$&-,,,-**=;,',-&$$%**&%%*--=&$$%%%$##$$%*;,;=*====;',;;>>--;,>;,)),)),---==-,,;;,),,')';;>,;--,),-&*--=%%%*=*%%&->,>-=->))'>=&%&=-;-=%$$$%*===*&%$##$%&==--=*&$#@@@##%&=;,')',;-=&&%%&**==----;!3m",
+"n7/!!!~!!),>-=****==-;>>,,>>;=*%$###$%&*=--=*&%$$$$%&&&&%$$##$*-,',-**=;,',-&$$%&*&%%&-;-*$$%%%$###$%&=>,-=*==*=>',;;>>-->,>;,)),)!,---=*-,'>;,)','))>-;,>--;))>=&=--*%$%*=&%%&->,;-=->)))>=&%&=-;-=&$$$%&*===&%$##$$%*=---=&%$#@@@#$%*->,')',>-=&&%%&**==--;!3m",
+"o8({~!)),>-=****==-;>>,,,>;-*&$###$$%*=---=*%$$#$$%&&&&%$###%*;,,>-*&=;,',-&$$%&*&%%&=--=%$$%%%#@#$$%*;,>=*===*-,'>;;,;==>,;-,!),)!,-=-=*-,),;>'),,)),;;>,;=-,)'-&&=--&%%&==&%%&->,;-=-,)!)>=&%&=-;-=&$$$$%*===*%$###$%&*=--=*&$##@@@#$%*->,))',;-=&&%%&**==-!3m",
+"o9_{!),>-=****==-;;>,,,>;-=&%$###$%&=----=&%$##$%%&&&&%$###%*;,,>-*&=;,',;*$$$&*&%%%=-;=%$$%%%$#@#$$%=>,;=*==*=;,'>;>,;=->,;-,!),)!'-=-=*=,),;;'),,')';->,>-->))>=&*--=%$%*==&$%*;,,;-=;,)!)>=&%&*-;;=&%$$$%&*==*&$$##$$%&==--=*%$#@@@@#$&=->'))',;-=&&%%&&*-)2m",
+"o8(),;-=**&*==-;>>,,,,>;=*%$###$%&*=-;--=&$$#$$%%&&&%%$###%=;,,>=*&=;,',;*$$$%&&%$%*-;-&$$$%%$#@##$%&-,>-**==*=;',;;>,;=->,;-,!),)!'-=--==>)';;,)',,))>-;,,;--,)'-&&=--*%$%*=*%$%*;,>;==;,)!)>=&%%*=-;-*%$#$%&**=*&%$###$%&*=--==&%##@@@@#$&=;,'))',;-=&%%%&*'2l",
+"n6]>-=**&*==-;>>,,,,>;-*%$####$%*=-;;-=*%$##$$%&&&&%$$##$%=;,,;=&&*-,',;*$$$%&&%$%&-;-*%$$%%%$@@#$$%=;,;=**=**=>',;;,,;=->>--'!),)!);---==;))>;,)),,)),;->,>-->)),=&&=-=&$$&==*%$%=;,>;==;,)!)>=&%%*=-;-*%$#$$%&***&%$####$%&*=--=*%$#@@@@##%*=;,'))',;-=&%%&,1l",
+"m3!-**&*==-;>>,,,,,;-=&%$###$%&*-;;;-=&%$##$%%&*&&%$###$%=;,,;=&&*-,',;*$#$%&&&%%&=;;=%$$$%%$#@@#$$&-,,-**==**-,'>-;,,-=->>--'~),)~);---==;)!,;>)),>'!);-;,,;=-,));&%*--=%$%&==&%$%=;,>-==;,)!),=&%%&=---=%$##$%&&**&%$####$%%*==-==&%$#@@@@#$%*->,)))',;-=&*,|k",
+"l2'=&*==-;;>,,,,,>;=*%$####$%*=-;;;-*%$###$%%&**&%$###$%=;,,;=&&*-,'';*%##$&&&%$%=-;-&$#$%%%#@@##$%*;,>=**==**;'';-;,>-=-,>--'~),)~)>---=*-'!';>)!'>,)),-;,'>-=;)!,=&&=--*%$%*-=&$$&->,>-==;,)!),=&%%&=---=&$##$$%&**&%%$####$%&*====*&$#@@@@@#$%*->')))',;-=,1l",
+"l1,=*=-;;>,,,,,>;-*%$####$%&=-;;;;=*%$##$$%&&**&%$###$&=;,>-*&&*-,''>=%##$%&&%$%*-;;*%#$%%%$@@@#$$&->,;*&*=*&=>',;->,>==;,>--'~),)~!>---=*-'!)>;'!),,)!';->',;=-,!);*%*-;-&$$%=-=%$$&->,>-==;,)!),=&%%&*---=&$###$%&&**&%$####$%%*=====&%$#@@@@@#$&=->')))',>!2l",
+"l2'--;;>,,,,,,;-=&$####$$&*=;;>;-=&$###$$%&**&%%$#@#$&=>,>-*%%*->''>=%##$%&&%$$&-;;=%##$%%$#@@##$%*;,>-&*==*&-,',-->,;==;,>--){),){~,---=*-,!)>;,!),>'!)>-;,'>-=;)!'-&&=--=%$$&=-*%$$&->,;-==;,)!),=&$%%*---=&$###$$%&&&&%$#####$%&*====*&%$#@@@@##%&=;,'))))^5m",
+"m3!;;>,,,',,>;=*%$####$%&=-;>>;-*%$###$%&&**&%$##@#$&->,>-*%%*->''>=%##$%&&%$$%=;;-&$#$%%%#@+@#$$%=>,;=&*==**-,'>-;,,;*=;,>-;){),){~,---=*=,!!,;>)!'>,)!,-->',;=-,!)>*%&=;-*%$%*--*%$%*;>,;-==;,)!),=&$$%*=--=*%####$%&&&&%$#####$$%&*====*%$#@@@@@#$%*=;,')!(7n",
+"m4{,,,,'',>;-*%$####$%&*-;>>>;=&$####$%&***&%$##@#$&->,>-&%%*->''>=%###%&&%$$%*-;-*$##$%%$#++@#$$*;,,-*&==*&*;'';-;,,;*=>,;=-){),)]{,---=*=>!~';>)!'>,)!';-;,'>-=;)!'-&%*-;=&$$%=-=&$$%*;,>;===;,)!),-&$$%*=--=*%$###$$%&&&%$$##@##$%&*====*&%$#@@+@@#$%*-;,)(8o",
+"n5]','',,;-=&$#####$%*=-;>>;-*%$####$%&***&%$#@@#$&->>;=&%%*->''>=%###$%&%$$%*-;;=%##$%%$#@+@#$$%=>,>=&&==*&=>',;-;,,-*=>,;=;){),)]]'----*=;!{);;'!),>'!)>--,)';=-,!!>*%&=--=%$$&=-=&$$%=;,>;===;,)!),-&$$%&=---*%$###$$%%&&%%$##@@#$$%&*====*&%##@++@@#$%*->^6n",
+"n5^)',,>;=&%$####$%&=-;>,>;=&%####$$%**=*&%$#@@#$*-;>;=&%%*->,'>=%###$%&%$$$&=;;-&$##$%%$@++@#$$&-,,;*&*==*&-,',-->,,-*=>,;=;){),)]]'----**;){)>;,!!,>,!!,--;''>-=;)~)-&%*-;-*%$$*--=%$$%=;,>-===;,)!),-&$$%&=---*%$#@##$$%%%%%$##@@##$%&*=====*%$#@@++@##$&=!4m",
+"n6^),>;=*%$####$$%*=;>,,>-=&$####$%&*==*&$##@@#%*-;>;=&%%*->,'>=%###$%&%$$$%=;;-*$##$%%$#++@#$$%=;,>-&&==*&*-,'>-->,>=&=>,-=;)~),']]'-=--**-'{!,;,)~'>>)!);-;,)';=-,!!,=%%*-;-&$$%*--*%$$&=>,>-===;,)!),-&$$%&*=--=&$####$$%%%%%$##@@@#$$%&*====*&%$#@+++@##%,1l",
+"n6^,;-*%$#####$%&=-;>,>;-*%$###$$%&*==*%$#@@@#%*-;;-*%%%*->,'>-%###$%&&%$$%*-;;=%##$$%$#@++@#$$&-,,;*&*==*&*;'';--,';*&->,-=;)~)>'{]'-=--=*-'{{';>)~)>>'!!,-->))>-=;)~);&%&=;-=%$$%=--*$#$&->,>-=*=;,)!),-&$$$%*=--=&$##@##$$%%%%$$#@@@##$%%&*====*&$##@++@@$;|k",
+"n5{;=&%#####$%%*=;>,,>;=&$####$$%*==*&%$#@@@#%*-;;-*%$%*->,'>-&#@##%%&%$$$&-;;-%###$%%$@++@##$%*;,,-&&*==*&=>',;=;,,;**->>-=;)~'>'{]'-=--=*=,{]);;'~!,;,!!';=;')';=-,!!,=%%*-;-*$$$&-;=&$#$&->,;-**=;,)!),-&$$$%*=--=&%#@@@##$%%%%$$#@@@@#$$%&*=====&%$#@@++#-}k",
+"m3)=%$#####$%&=->,,,;-*%$####$%&*==*&%$#@@@#%*-;;-*%$%&=;,,>-&$###$%&%$$$&=;>-*$##$%%$#+++@#$$&->,>=&&=-=&&-,',-=;,,-**-,>=*;)~'>'{])-=--=*=>~])>;,!~';>)!)>--,))>==;)~);&%%=-;=&$$%*--=%$#$*->>;=**=;,)!),-&$$$%&==-=&%#@@@##$$%%%$$##@@@##$%%&*====*&%$#@+@=[j",
+"l1>%##@##$%&*-;>,,>;=&$##@##$%&====&$#@@@@#%*-;;=&%$%&=;,,>-&$#@#$%&%$#$%=;>;=$###$%$#@++@##$$*;,,;*&*=-*&*;,'>-=;,,-&*;,;=*;)~'>,{])-=---*=;!]!>;,!~)>;'!!,-->))'-=-,!!,=%$&=;-=%$$%=--=%##%*->>;=**=;,)!),-&$$$%&*===*%$#@@###$$%%%$##@@@@#$$%&*=====*%$###=[j",
+"k};$###$$%*=->,,,>-=%$####$$%*===*&$#@@@@#%*-;-=&%$%&=;,,>-&$@@#$%&%$#$%*-;;=%#@#$$%$#+++@#$$%=>',-&&=-=*&*;'';=->,,=&*;,;=*;)!'>,~]);=-;-**;)]{,;>){)>;,!!';=-,))>==;'!);&$%*-;-*$$$&=;-*$#$%=;>>;=**=;,))),-&$$$%&*===*%$#@@@##$$%%%$$#@@@@##$%%&*====*&%$$-[j",
+"k}-###$%&=-;>,,,;=&%##@##$%&*===*%$#@@@@$%*-;-=&$$%&=;,,>-&$@@#$%&%$##$&-;>-&$@##$%$#@++@##$$&-,';=&&=-=&&=>',-=->,>=&*;,;**;)!'>,~]!;=-;-**-)]]';;'~!,;>)!)>=->)!,-=-,)!'-%$%=;;=&$#$*-;-&$#$%=;>>-=**=;,)))>-&$$$%&*===*%$#@@@###$$%%$$##@@@@#$$%&**====*&%;}k",
+"k}-$$$%*=;>,,,>-=%$#@@##$%&====*%$#@+@@$%*---*%$$%&=;,,>-&$@@#$%%%$##$&=;;;*$#@#$$$#@+++##$$%=>',-&&*--=&&-,',-=-,,;*&=;,;**;)!,;,~]!;=-;-=*-']]);;,!~';;'!!,-=;'!)>==;'!)>*$%&-;;=%$$%=;;=&$#$&=;>>-*&*=;,)))>-&$$$$%*===*%$#@@@@##$$$$$$##@@@@##$%%&*======,|k",
+"k};%%&=-;,,,,;-*%$#@@##$%*=--=&%#@@+@#$%*--=*%$$%&=;>,>-&$@@##%%%%$#$%*-;;=%#@##$$$#+++@#$$$&-,'>=&&=--*&*;,'>==;,,;*&=>,-**;)!,;,~]!>=---=*=,{^!>->!{)>;,)!';=-,)!,-=-,)!'-%$%*-;-*$$$&=;;=%$#$&-;>;-*&*=;,')'>-&$$$$%&*==*&$#@@@@###$$$$$##@@@@@#$$%&&*===-)2l",
+"k|>**=;>,,,>-=&$##@##$%&*=-==&$#@@+@#$%*=-=*%$$%&=;>,>-*$#@@#$%&%$##%*-;;-&#@@#$$$#@+++##$$%=;'';*&*---*&=;'';==;,,-&&=>,-**;)!,;,!]~>==--=*=>~^~,->){!,;>)~!,-=;)!)>==;'!)>*$$&=;;=&$#$&-;-*%##$*->>;=*&*=;,')'>-&$#$$%&*==*&%#@@@@@##$$$$$$##@@@@##$%%&*==-)3m",
+"l1'--;,,,,;-*%$#@@##$%&=--=*%$#@++@#$%*===&%$$%&=;>,>-*$#@@#$%&%$##$&=;;-*$@@##$$#@+++@#$$$&-,',-&&=-;=&&=>',-*=;,,-&&=>>-&*;)!,;>!]~>==-;=*=;!^]';;'~~,;;'!!'-=-,!!,-=->)!'-%$%*-;-=%$$%*-;-&$##%*->>;=&&*=;,')'>=&$##$%&*==*&%#@@+@@###$$$$$##@@@@@#$$%&&*-)3m",
+"l2!>>,',>;=&$##@@##$%*=--=*%$#@++@#$%*==*&%$$%&=->,>-*$#@@#$%%%$##$%=-;;=%#@@#$$$#++++##$$%*;,'>=&&=;-=&&-,',-*->,>=&&->>=&*;)!,;>!]{,==-;-**;)]]);;,!{);;,)~);=->)~);==;'!!>*$$%=;;-*$$$%=;;=&$#$%*->>-=&&*=;,')'>=&$##$%&**=*&%$@@++@@###$$$$##@@@@@##$%%&='2m",
+"m4]',,,;-*%$#@@##$%&*=--=*%#@+++@#$%*==*%$$$%&=->,>-*$#@@#$%%%$###%*-;;=%#@@##$$#@+.+@#$$$%=>',-*&*-;-*&*-,';=*->,;=&&->;=&*;)),;>!]{,==-;-**-']^);->!{)>->)~!,-=;'~!,-=->)!'-&$$&=;;=&$#$&=;;=%$#$%=->;-*&&*=;>'',>=&$##$%%&*=*&%$#@++@@###$$$$$##@@@@##$$%*,2l",
+"n5^',>;=&$##@@##$%&=---=&%#@+++@#$%*==*%$$$%&=->,>-*$#@@#$%%%$###%*-;;-&$@@@#$$#@+..+##$$$*;,',=&&=;;-&&=;,,;=*->,;*%*->;=&*>)),->)]],==-;-=*=,]^~>-;){!,-;,!~';=-,!~);==;'!!,=%$%*-;-*%$$%*-;;=%##$%=;>;-*&%*=;>,',>=&$##$$%&***&%$#@+++@@###$$$$##@@@@@##$%>1l",
+"n6^'>-*%$#@@@##$%*=---=&$#@+++@#$%*=*&%$$$%&=->,>;*%#@@#$%%%%$##$&=;;-*$@@@##$##++.+@#$$$%=>'';*%&-;;=&&=>',-**-,,-&%*->;*&*>))>-;)]],==-;-=*=,{^{,-;'~~';-,)~)>==;)~!,-=->)!);&$$%=;;-&$$$%=;;-*$##$&=;>;-*%%&=->,',;=&$##$$%&***&%$#@+++@@###$$$$###@@@@@#$;|k",
+"n5]>=&$##@@##$%&*=--=*%$#@+++@#$%***&%$$$%&=->,>;*%#@@##$%%%$##$%*-;;=%#@@@#$$#@+..+#$$$$&-,),-&%*->;=&&->'>=*=;,,-&%*->-*%*>))>-;)]]'==-;;=*=>~^]';-,!{);->)~!,-=-,!{);==;'!),=%$$&-;;=%$#$&=;;-&$##$&=;>;=&%%&=->,',;=&$##$$%&&**&%$#@+++@@@###$$$$##@@@@@$-}k",
+"m4!=%$#@@@##$%&=---=*%$@@+++@#$%&**&%$#$%&=-;>>;*%#@@##$%%%$###%*-;;-&#@+@##$#@++.+@#$$$%=;''>=%&=;>-*%*-,,;=*=;,>=%%*;>-*%*>))>-;)]]'-*-;;-*=;!^^);->){!>-;,!~);=->){!,-=->)!);&$$%*-;-*%$$%*-;;=%$##$&-;;;=&%%&=->,,,;=&$##$$%%&**&%$#@++++@@###$$$$##@@@@#-}k",
+"l2,%##@@##$$%*=---=&%#@++++@#$%&*&%$##$%&=-;>>-*%#@@@#$%&%$###$&=-;-*$@+@#####++..+#$$$$&-,)';*%*->>-&%*;,,;*&=;,>=%%=;;-&%=>))>-;)]]'-*=;;-**;)^^!>-;){~,-->)~!,-=;'~{);==;,)),=%$$&=;;-&$$$%*-;;=%###%*-;;-=&%%&=-;,,,;=&$##$$%%&***&%#@@+++@@###$$$$$##@@#=[j",
+"k|;$@@@##$%&*----=&$#@++++@#$%&&&%$##$%&=-;>>;=%#@@@#$%%%$###$&=-;-=%#++@####@+..+@#$$$%*;'),=&&=;>;=&&=>,,-*&=>,;*%%=;;=&%=>))>-;)]^)-*=;;-**-']^{,-;'~{';-;'~~'-=-,!{!,-=->'!);&$$%*-;;=%$#$&=;;-*$##$%*-;;-*%%%&=-;,,,;=&$###$%%&**&&%$#@+++@@@###$$$$##@#=[j",
+"k}-#@@##$%*=----*%$#@++++@#$%&&&%$##$%&*-;>>-=%#@@@#$%&%%###$%*-;;=%#++@@###@+...+#$$#$&->)';*%&->,;*%&->,>=&*->,;*%&=;;=%%=>));-;']^)-*=;;-=*=,{^],--,!{);-;,!~);==;){{);==;,)),=%$$%=;;-*%$$$&-;;-&$##$%*-;;-*%%%&=-;>,>;=&$###$%%&&**&%$#@++++@@###$$$$###-[j",
+"k[-#@#$$%*=-;-=*%#@+++++@#$%&&%%$##$%&*-;>>-=%#@@@#$%%&%$###%&=;;-&$@++@###@++..+@#$$$%*;')'-&%*-,,-*%*-,,;=&*->,-&%&=;;=%%=>)';=-']^)-*=;;;=&=>~^]'-->){!,-->)~!,-=-,!]~,-=->')';*$#$&=;;-&$#$%*-;;=&$##$%=-;;=*%$%&*-;>,>;=&$###$$%&&*&&%$#@++++@@###$$$$$$-}k",
+"j[-$#$%&*----=&%#@+++++@#$%%%%$$##$%&*-;;;-=%#@@@#$%%&%$#@#$&=-;-*$@++@@###@+...@#$$#$%=>')>=%&=;,>-&%*;,,;*&*;>>-&%&-;-*%%=>)';=-']^!;*=-;;=*=>!^^);-;){~'-=;'~~';=->)]]);==;,)),-%$$%*-;;=%$$$%=;>;=%###$&=-;;=&%$%&*-;>>>;=&$###$$%%&&&&%$#@++++@@@###$$$$;}k",
+"k}-$$%&=----=&$#@+++++@#$%%%%$###$%&*=;;;-=%#@@@#$%%&%$#@#$%*-;-=%#+++@###@+...+@$$$$$&-,)';*%&->,>=%%=;,,-&&=;>>=%%*-;-*%%=>)';=-,{^!;*=-;;-**;)^^!>-;'~{);=-,!~)>==;'~]~,-=->')';*$#$%=;;-*%$$$&=;;-*%###$&=-;-=&%$%&*=;;>>-=&$###$$%%&&&&%$#@@++++@@###$$%;}k",
+"k};%%*=-;--*%$#@+++++@#$%%%%$###$%&*=;;;-=%#@@@#$$%%%$#@@#%*=--=&#@++@@##@++..+@#$$#$%=>'),-&%=;,,;*%&=>,>=&&=;>;=%%*-;-*%%=>)';=-,{^!;*=-;;-**-']^{,--,!]!>=->)~!,-=-,!]]);==;,)),-%$#$&-;;-&$$$%*-;;-&$##$%&=-;-*%$$%&*=-;>;-=&$###$$%%&&&&%$#@@++++@@###$%;|k",
+"k|>*=--;-=*%$@++++++@#$%%%$$###$%&*=;;;-=%#@@@#$$%%%$#@@#$&=---*$@+++@##@@+. .+#$$$#$&-,))>*%&=>',-&%*-,,;=%&=;>;*%%*-;-&%%=,)';=-,~^!;=*-;;-**-,]/],-->){~,-=;'~~);==;){]!,==->')';*$#$%=-;;=%$$$%=-;;=&$##$%*=;;-*%$$$&*=-;>;-=&$###$$%%&&&&%$$#@++++@@###$;|k",
+"l1'---;-=&%#@+++++@@#$%%%$$###$%&*=-;;-=%$@@@##$%%%%#@@#$&=---*%#+++@@##@+.  +@#$$#$%=;')'-&%*-,',=%%*;,,;*%&-;>-&%%*-;=&$%=,)';=-,~]~>=*-;>-=*=,{^^)--;){{'-=-,!~!>-=;,~]]);==;,)),-%$#$&=;;-*%$$$&=;;;=%###$%*=--=*%$$$%*=-;;;-=%$###$$$%%&&&%%$#@++++@@@#$;}k",
+"l2);;;-=&$#@+++++@@#$$%%$$###$%&*=-;;-=%$@@@##$%%%%$#@#$%*---=%#+++@@##@++. .+#$$$#$&-,)),=%&=;''>*%%=;,>-&%*->>-&%&=--=%$%=,),-==>~]~>=*-;>;=*=>!^^!;=;'~{);=->)~~'-=->)]]!>==->')';*$#$%*-;;=&$$$%*-;>-*%###$%*---=&%$$$%*=-;;;-*%$####$$%%&&&&%$#@+++++@@$-}k",
+"m3~>;-*%$#@+++++@@#$$%$$####$%&*=-;;-=%$@@@##$%%%%$#@@#%&=--=&$@+++@@@@++. .+@#$$$$%*;'));*%&->'';&%&=>,>=%%*->;=&%&=--=%$%=,),-==>!]~>=*=;>;=*=;!^/~>--,!{!>==;'!~)>==;'{^]';==;,'),-&$#$%=;;;=%$$$%*->;-*$###$%*---=&$$$$%*=-;;;-*%$####$$%%&&&&%$#@@++++@#-}k",
+"m4~;=*%$#++++++@##$$%$$####$$%*=-;;-=%#@+@@#$%%%%$#@@#$&=---*$@+++@@@@@+.  .+#$$$#$%=>)),-&%*;,),-%%&->,;*%%*->;=%%&=--*%$%=,),-*=>!]~>=*=;>;=**;)^/{,-->){~,-=-,!~!,-=-,!]^!>==->,)'>=%##$&=;;-*%$$$&=;>;=&$###$%*---=&$##$%*=-;;--*%$####$$%%&&&&%$#@@++++#=[k",
+"m4!-&%#@++++++@##$$$$$####$$%*=-;;-=%$@@@@#$%%&%$#@@#$%*---=%#++++@@@@++. .+@#$$##$*-,))>=%&=>')>=%%*-,,;*%&=;>;*%%&=--*%$%-,',-*=>!]{,=&=;>>-**-']/]'-=;'~{);==>)~~';==>)]^]'-==;,'',-&$##%*-;;=&$$$%*-;>;=%$###$&=---*%$##$%&=--;-=*%$####$$%%&&&&%$$#@+++@=[j",
+"m2'*$#@++++++@##$$$$$####$$%*=--;-=%$@@@@#$%%&%$#@@@$%*=--=&$@++++@@@++.  .+#$$$#$%=>)!';&%&-,));*%%=;,>-&%&=;>-*%%*=--*%$&-,',-*=;!]{,=&=;>>-**-,{/^);=;'~{);==;'!{)>==;,~^^!>==->,''>=%##$%=;;;=%$$$%*-;>;*%####$&=---*%$##$%&=--;-=*%$####$$%%%&&&%%$#@++@=[j",
+"l1>%#@++++++@##$$$$#####$$%&=--;-=&$@@@@#$$%&%%$@@@#%&=---*$@++++@@@++.. .+@$$$##$&-,)),=&%*;')'-&%&=>,>=%%&=;;-&%%*=-=&$$&-,',-*=;)]],=&=->>;=*=,~//!;=-,!{~,==-,)~!,-=->)]^]'-==;,'',-&$##$&-;;-*%$$$&=;>;-*$####%&=--=*%$##$%&==---=*%$####$$%%%&&&&%$#@+@=[j",
+"k|;#@++++++@##$$$$#####$%%*=----=&$#@@@#$$%&%%$#@@#$&*=--*%#+++++@@++..  .+#$$$#$%=;'!);*%&=>)),=%%&->,;*%%&-;;-&%%*=-=&$$&-,',-*=;)]]'=&*->>;=*=>!^/{>-->){{'-*=>)~~);==;'{^]!>==-;,''>=%##$%*-;;=&$$$%*=;>;-&$###$%&=--=&%###$%&*=---=*%$####$$%%%&&&&%$#@#=[j",
+"k}=@++++++@##$$$$##@##$%%*=----=&$#@@@#$$%%&%$#@@#$%*=--=%#+++++@@+++.  .+@$$$##$&-,)!'-&%*-,))>*%%*-,,;*%%*-;;=%%%*=-=%$$&-,',-**;)]]'-**->>;=&*;)^/],-=;'~{);==;'!{!>==-,!]^{'-==;>'',-&$##$&=;;-=%$$$%*-;>;=%$###$%*=--=&$###$%&*=---=*%$####$$$%%&&&&%$#$=[j",
+"j[=@+++++@##$$$$##@##$%%*=----=&$#@@@#$$%%&%$#@@#$%&=--=&$@+++++@+++.   +@#$$$#$%*;'!)>=%%=;)!);&%%=;,>-&%%*-;;=%$%*--*%$$&-,',-**;)]])-**->>;=**-']/]'-=;,!]!>=*-,)~~'-==;)]^^!;==-;,''>=%###%*-;;-&$$$$&=->>;=%$###$%*=--=&$###$%&*=---=*%$####$$$%%&&&&%%%-}j",
+"j[=@++++@##$$$$##@##$%%*==---=&$#@@@##$%%&%$#@@@#%&==-=*$@+++++++++..  .+#$$$##$&=>)!';&%&=,)!,-%%&=;,>=%%&=-;-*%$&=-=*%$$&-,'>=&*;)]])-**-;>>-**-,]/^);=-,!{~,-*=>)~{);==-,!^^{,-==;>,',;*$##$%=;;;=%$#$%&=;>>-*%####$%*=--*%$###$%&*==--=*%$#####$$%%&&&&%&;}k",
+"j[=@++@@##$$$###@##$%%&==---=&$#@@@##$%%&%%#@@@#$&*=--=%#++++++++++.   .@#$$$##%*;,!!,=%%*-'!!>=%%&->,;*%%&=;;-&%%&=-=*%$$&-,'>=&*;)]^)-**=;,>-**-,{//!;=->){{)-*=;'!{!,-==>)]^]);==-;,''>=%###$&-;;-*%$#$%*-;>;-&$####$&*=-=*%$###$%&*==-==*%$#####$$%%&&&&*>|k",
+"j[=@+@@#$$$$###@##$%%&==---=&$#@+@##$%%&%%$#@@#$%*=--=&$@+.+++++++.   .+#$$$$#$%=>)!);*%%=>)~);&$%*->,;*%%&=;;-&$%&=-=*%$$&-,'>=&*-']^!;**=;,>-**=>!//{>==;'~]);=*-,){~';==;'~^^{,-==;>,',;*$##$%*-;;-&$$$$&=-;>;=&$###$%&=--=*%$###$%&*==-==*%$#####$$%%&&&*,1k",
+"j[=@@##$$$$##@@##$%%&*=---=&$#@+@##$%%%%%$#@@#$%&==-=*$@+.+++++++.    .@#$$$##$*-,!!'-&%&-,!~'-%$%=;,>-&$%&-;;=&$%*=-=&$$$&-,'>=&*-']^!;*&=;>>;*&=;)^(],-=;,!]~,=*=>)~{)>==-,!]^]);==-;,''>-%###$&=;;;=%$#$%&=;>>;=%$###$%&=--=*%####$%&*==-==*%$#####$$%%%&*,1l",
+"j[=###$$$$##@@##$%%&*=---=&$#@+@##$$%%%%$#@@@#%&*=--*%#+..+++++++.   .+@$$$##$%=;'!)>=%%*;'!!,=%$&=;,>=%$%*-;;=%$%*===&$$$*-,'>=&*-']^!;*&=;>,;=&*;)^(^'-=-,!]{'-*=;'!{!,-==;){^^{,-*=;>,',;*$###%*-;;-*%$#$%*=;>>-*%####$%&=--=&%#@@#$%&*=====*%$#####$$%%%*,1l",
+"j[-$#$$$$##@@##$%%&*=---=&$#@+@@#$$%%&%$#@+@#$%*=--=%#++.+++++++.    .@#$$$##$&-,)!';&%&=>)~);*%%&->,;*%$%*-;;=%$%*=-=&$$$*;,'>=&*-']^!;*&=;>,;=&*-']/^);=->){]);**-,){{);==-,!^/]);==-;,',>-&$##$%=-;;-&$$$$%*-;>;-&$####$%&=--=&$#@@#$%&*=====*%$#####$$%%&,1l",
+"k}-$$$$$##@@##$%%&*=---=&%#@+@@#$$%%&%$#@+@#$%*=--=&$@+.+++++++.    .+#$$$##$%*;'!!,=%%&-,!~)-&$%*-,,;*%$%=-;-*%$%*=-=&$$%*;,'>=&*-']^~;*&=->,;=**-,{//~>==;'~]!>=*=>)~{!,=*->)]^^~,-*=;>,',;=%###$&=;>;=%$#$%&=-;>;=&$####$%*=--=&$#@@#$%&*=====*%$#####$$$&,1l",
+"k};%$$$##@@##$%%&*=---=&%#@+@@#$$%%&%%$#@@#$%&=--=*%#+..+++++++.    +@#$$$##$&=>)!);*%%*;'~~,=%$%=;,,-&$$&=;;-&%$&====%$$%*;,'>=&*-,{^~>*&*->,>-**=,~/(],==;,!]~,-*=;'!{~'-==;'~^/]);==-;,''>-&$##$%*-;;-*%$#$%&=;>>;=%$####$%*=-=*%$#@##$%&*=====*%$#####$$%>|k",
+"k|;%$$##@@##$%%&*=---=*%#@++@##$%%&&%$#@@@#%&*=--=%#++.+++++++.    .+#$$$###%*;,!!'-&%&=>){!>*$$&=>,>=%$%&=;;-&$$&===*%$#%*;,'>=&&-,{^~>*&*->,>-*&=>!^(]'-=-,){{);**-,){{);=*-,)]/^~,=*=;>,',;=%###$%=;;;=&$#$$%*-;>>-*%##@#$$&*=-=*%$#@##$%&*=====*%$#####$%>|k",
+"k|;%$##@@##$%%&*=---=*%#@++@##$%%&%%$#@@@#$%*=--=&$@+.+++++++..    +@#$$$##$&=>)~!>=%%*-,!{);&$%&->,;=%$%*-;;=%$%&===*%$#%*;,'>=&&-,{^{,*&*-;,>-*&=;)^(^)-=->){]!>=*=>)~{!,-*=;'{^/]';==-;,,',-&$###%&-;>;=%$#$%&=-;>;-*$####$%&*=-=*%$#@##$%&*=====&%$#####$;|k",
+"k|;%##@@##$%%&*=---=*%#@++@##$%%&&%$#@+@#$%&==-=*$#+..+++++++.    .+#$$$###%*-,!~);*%%=;)~~'=%$%*-,,;*$$%*-;;=%$%&===*%##%*;,'>=&&-,{^{,=&*-;,,;=&*;'](/!;==;'~]~,=*=;'!{~';==-,!^/^!>=*=;>,',;=%###$%*-;;-*%$#$%&=-;>;=&$####$%&==-=*%##@##$%&*=====&%$####$;}k",
+"k};$#@@##$%%&*=---=*%#@++@##$$%%&%$#@+@#$%&*=--*%#+..+++++++..    +@#$$$##$%=;)~!,-%%&=,!{!>*$$%=;,,-&$$%=-;;=%$%*===&$##%*;,'>=&&-,~^],=&&=;,,;=&*-'](/~>==;,!]{'-**-,){{)>=*=>)]^/]'-*=-;,,,,-*$###$&=;>;-&$#$$%*=;>>;=%$####$%&=--=*%#@@##$%&**====*%$###$-}k",
+"k}-#@@##$%%&*=---=*%$@++@##$$%%&%%$@@@@#%&*=--=&$@+..++++++..    .+#$$$###$&-,)~)>*%%*-'~{);&$$&=>,>=%$$&=-;-*%$%*===&$##%=;,'>=&&-,~^],=&&=;,,;=&*-,~/(],==-,){]);*&=>)~{~,-*=;'~^/^!>=*=->,',>=%###$%*-;>;=%$#$$%*-;>>-=%$####$%&=--=&%#@@##$%&**====*%$##$-}k",
+"k}-#@##$%%&*=---=*%$@+++@#$$%%&%%$#@+@#$%*=--=*$@+..+++++++.     +@#$$$##$%=;'!~'-&%%=;){{'-%$%*->,;=%$%&=;;-*$$%*===&$##%=;,'>=&&=,~^]'=&&=;>,;=&&=>!/(^'-=->){]!>=&=;,!{{);=*->)]//]'-*=-;,,,,;*$###$%=;>;-*%$#$%&=-;>;-*%##@##$%*=--=&$#@@##$%&**====*%$#$-}k",
+"k}-###$%%&*=---=*%$@+++@#$$%%&&%$#@+@#$%&=--=*%#+..+++++++..    .+#$$$$##$&->)~!,=%%&-,!{!,=%$%*;,,;*%$%*-;;-&$$%*===&$#$%=;''>=&&=,~^]'-&&=;>,>-*&=>)^(^);==;'~]~,-&*-,){{!>=*=;'~^/^!>=*=->,',>-&$###$&=;>;=&$#$$%*=;>>;-&$####$$%*=--=&$#@@##$%&**====*%$$-}k",
+"j[-$#$%%&*=---=*%$@+++@##$%%&&%$#@+@#$%&*=--=&$@+..+++++++.     +@#$$$##$%*;'!~);*%%*-'~{);&$$&=;,,-&$$%*-;;=&$$&*===&$#$%=;,';=&&=>!^])-&&=->,>-*&=;)](/!;==;,!]{);*&=>'~]~'-**-,!]//{,-*=-;,,',;*%###$%*-;>;=%$#$$%*-;>>;=&$####$%&*=--=&$#@@##$%&**====*%%;}k",
+"k}-$$%%&*=---=*%$#+++@##$%%&&%$#@++@#$&*=--=&$@+..+++++++..    .+#$$$$##$&=>)~!,=%%%=;){{'-%$%&->,>-&$$%=-;;=%$$&===*%$#$%=>'';=&&=>!^^)-&&*->,,-*&*;'](({>==-,){]!>=&=;,!{{);=*=>){^/^);=*=->,',>-&$###$&=;>;-*%$#$%&=-;>>-=%$#@##$%&*=-=*%$#@@##$%&**====**>|k",
+"k};%%%&*=----*&$#+++@##$$%%&%%$@@+@#$%*=--=*%#+..++++++++.     +@#$$$##$%*-,!~)>*%%&-,!]~,=%$%*->,>=%$$&=-;;=%$%&===*%$#$%=>'';=&&=>!^^)-&&*->,,;=&*-,{/(],=*->)~]~,=&*-,){]!,-*=;,!^//{,-**-;,,',;=%####%*-;>;=&$##$%&=-;>;-*%##@##$%&=--=*%$#@@##$%&**=====,|k",
+"k|;&&&*=----=&$#@++@##$$%%&%%$#@+@#$%&==--=%$@+..+++++++.     .+#$$$###$&=>)~~'-&%%*;'~]);&$$%=;,,;*%$%&=;;-*%$%&===*%$#$&=>'';=&&=>!^^!;&%*->,,;=&*-,~/(^)-==;'~]{'-&&=>'~]~';**->)]//^);=*=->,',>-&$###$%=->>;=%$#$$%*=;>>;-&$#@@##$%&=--=*%$#@@#$$%&**===-'1l",
+"k|>***=----=&$#@++@##$$%%&&%$#@+@#$%&*=--=&$@+..+++++++..     +@#$$$###%*-,!~!,=%%&=>){{)-%$$&=;,,;&$$%*=;;-*%$%*===*%$#$&=>'';=&&=>!^^!;&%*-;,,;=&&=>!^(/);==;,!]]);*&=;,!{{)>=*=;'~^//~,=**-;,,',;=%####$&=;>;-*%$#$%&*-;>>;=&$#@###$%*=--=*%$#@@#$$%&**==-)2l",
+"l1'-=-;;;;-*%$#@@##$%%&&**&%$#@##$%*=-;;-=&$@+++@@@@@@++++..++@$%%%$$$%*->){{)>=%&=;'~]{'-&%%*-,',;*%%&=;>>;*%%&=---=&$$%*-,)'>=**-,~//{>*&=->'',-**->!^_({,-=;,!]^{,-*=;,!]]{';==;,!^((^!>==-;,')',;=%$#$%&=;>,>-*%$$%&*=;>,,;-&%$##$$%*=-;;-=&$###$%%&*==-;!3m",
+"n5^)))!!!)'>;-===--;;>,,,,>;-===-;,'))!!),;=****======**&&&&&*-;>>;;-;>,)]/_(^!,>>'~^_:(]'>;>'!]^]),;;,'!{{),;;,')))'>;-;,)]^^{),,){(<[_{,,,)~]^])',)~/:}}:])')]/_:_^),')]/_:_/~'')]/_[[<(])''!{]^^^{)>;---;,)~]]!'>;-;;>,)~]]{!'>;----;>,')!!),>--=--;>,,')!(7n",
+"sf632333321|}[[[[}}}||111||}[[[}}|1223332|}[<<<[[[[[[[<<<<<<<[}}||}}}}|23589852|||24799741|||245542|||1234421||122221|}}|13465421124800841|1245543112469aa95222468996311246899742124680a095312345565431}}[}}|2344421}}}||123454421}}[}}}||123332|}}[[}}||11237gt",
+"xsnmmmmmmlkkjjjjjkkkkklllkkkjjjkkklllmmmlkjjjjjjjjjjjjjjjjjjjjjkkkkkkkklmnoonmlkkllmnoonmlkkklmnnmlkkkllmmmlkkkkllmllkkkklmmnnmlkllmoppomlkllmnnmmlllmnopponmlmmnooonmlllmnooonmlllmnoopponmlllmmnnnnmlkkjkkklmmmmmlkkkkkklmmnnmllkkjjkkkkllmmmlkkjjjjkkkkllmnsx"};
index 2517792df6b6c6a21f61984662ce385a72ce2ab1..08cbbe0948de48fed26d8ed5d8b0f4ee6d15e2b1 100644 (file)
@@ -321,8 +321,8 @@ inline unsigned long trans_point(int x1, int y1, unsigned long myc, double a,
     } 
     else 
     {
-       int or, og, ob;
-       int r, g, b;
+       int or=0, og=0, ob=0;
+       int r=0, g=0, b=0;
        int nr, ng, nb;
        unsigned long c;
 
index 205d273f234088c0d966310fdb919bd0507fc9c8..594d7462e3d3b961e5a1713a6fcceafe9fef4b89 100644 (file)
@@ -532,7 +532,7 @@ char *progclass = "Noseguy";
 char *defaults [] = {
   ".background:         black",
   ".foreground:         gray80",
-  "*program:    xscreensaver-text --cols 40 | head -15",
+  "*program:    xscreensaver-text --cols 40 | head -n15",
   "noseguy.font: -*-new century schoolbook-*-r-*-*-*-180-*-*-*-*-*-*",
   0
 };
index cc1d724337ea0daa8094da6b36219a1d0d4837dc..43962ebf4b3016b3fca68e89cc0a6a17046bb506 100644 (file)
@@ -45,7 +45,7 @@ The font used for the messages.
 This program will be run periodically, and its output will be the text
 of the messages.  Default:
 
-    xscreensaver-text --cols 40 | head -15
+    xscreensaver-text --cols 40 | head -n15
 
 You can configure the text printed through the "Advanced" tab of
 .BR xscreensaver\-demo (1),
index 0b6dc273064ab03cdb2e8dded9ae440329e65701..c30e2adf2dc904829d9f67eabc1737ba4b11f44a 100644 (file)
@@ -99,6 +99,9 @@ static void (*draw_transparent)(short *src);
                              - (((x)>>3)&0x11111111))
 
 
+static Bool grayscale_p;
+static unsigned long grayscale(unsigned long color);
+
 /*      -------------------------------------------             */
 
 
@@ -197,13 +200,13 @@ draw_transparent_vanilla(short *src)
 
       if (dirty[pixel] > 0) {
         XPutPixel(buffer_map, (across<<1),  (down<<1),
-                  XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady));
+                  grayscale(XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady)));
         XPutPixel(buffer_map, (across<<1)+1,(down<<1),
-                  XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady));
+                  grayscale(XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady)));
         XPutPixel(buffer_map, (across<<1),  (down<<1)+1,
-                  XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady1));
+                  grayscale(XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady1)));
         XPutPixel(buffer_map, (across<<1)+1,(down<<1)+1,
-                  XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady1));
+                  grayscale(XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady1)));
       }
     }
 }
@@ -257,6 +260,52 @@ bright(int dx, unsigned long color)
 }
 
 
+static unsigned long
+grayscale(unsigned long color)
+{
+  int red;
+  int green;
+  int blue;
+  int total;
+  int gray_r;
+  int gray_g;
+  int gray_b;
+
+  if (!grayscale_p)
+    return color;
+  if (!transparent)
+    return color;
+  if ((rmask == 0) || (gmask == 0) || (bmask == 0))
+    return color;
+
+  red = ((color >> rshift) & rmask);
+  green =  ((color >> gshift) & gmask);
+  blue =  ((color >> bshift) & bmask);
+  total = red * gmask * bmask + green * rmask * bmask + blue * rmask * gmask;
+
+  gray_r = total / (3 * gmask * bmask);
+  if (gray_r < 0)
+    gray_r = 0;
+  if (gray_r > rmask)
+    gray_r = rmask;
+  
+  gray_g = total / (3 * rmask * bmask);
+  if (gray_g < 0)
+    gray_g = 0;
+  if (gray_g > gmask)
+    gray_g = gmask;
+
+  gray_b = total / (3 * rmask * gmask);
+  if (gray_b < 0)
+    gray_b = 0;
+  if (gray_b > bmask)
+    gray_b = bmask;
+
+  return ((unsigned long)
+          ((gray_r << rshift) | (gray_g << gshift) | (gray_b << bshift)));
+}
+
+
 static void
 draw_transparent_light(short *src)
 {
@@ -310,23 +359,23 @@ draw_transparent_light(short *src)
 
         if (dx != 0) {
           XPutPixel(buffer_map, (across<<1),  (down<<1),
-                    bright(dx, XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady)));
+                    bright(dx, grayscale(XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady))));
           XPutPixel(buffer_map, (across<<1)+1,(down<<1),
-                    bright(dx, XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady)));
+                    bright(dx, grayscale(XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady))));
           XPutPixel(buffer_map, (across<<1),  (down<<1)+1,
-                    bright(dx, XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady1)));
+                    bright(dx, grayscale(XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady1))));
           XPutPixel(buffer_map, (across<<1)+1,(down<<1)+1,
-                    bright(dx, XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady1)));
+                    bright(dx, grayscale(XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady1))));
         } else {
           /* Could use XCopyArea, but XPutPixel is faster */
           XPutPixel(buffer_map, (across<<1),  (down<<1),
-                    XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady));
+                    grayscale(XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady)));
           XPutPixel(buffer_map, (across<<1)+1,(down<<1),
-                    XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady));
+                    grayscale(XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady)));
           XPutPixel(buffer_map, (across<<1),  (down<<1)+1,
-                    XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady1));
+                    grayscale(XGetPixel(orig_map, (across<<1) + gradx, (down<<1) + grady1)));
           XPutPixel(buffer_map, (across<<1)+1,(down<<1)+1,
-                    XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady1));
+                    grayscale(XGetPixel(orig_map, (across<<1) + gradx1,(down<<1) + grady1)));
         }
       }
     }
@@ -757,9 +806,20 @@ init_ripples(int ndrops, int splash)
     add_drop(ripple_blob, splash);
 
   if (transparent) {
+    if (grayscale_p)
+    {
+      int across, down;
+      for (down = 0; down < bigheight; down++)
+        for (across = 0; across < bigwidth; across++)
+          XPutPixel(buffer_map, across, down,
+                    grayscale(XGetPixel(orig_map, across, down)));
+    }
+    else
+    {  
     /* There's got to be a better way of doing this  XCopyArea? */
     memcpy(buffer_map->data, orig_map->data,
            bigheight * buffer_map->bytes_per_line);
+    }
   } else {
     int across, down, color;
 
@@ -892,6 +952,7 @@ char *defaults[] =
   "*stir:              False",
   "*fluidity:          6",
   "*light:             0",
+  "*grayscale:                 False",
 #ifdef HAVE_XSHM_EXTENSION
   "*useSHM: True",
 #endif                         /* HAVE_XSHM_EXTENSION */
@@ -910,6 +971,7 @@ XrmOptionDescRec options[] =
   {"-stir",    ".stir",        XrmoptionNoArg, "True"},
   {"-fluidity",        ".fluidity",    XrmoptionSepArg, 0},
   {"-light",   ".light",       XrmoptionSepArg, 0},
+  {"-grayscale",       ".grayscale",   XrmoptionNoArg, "True"},
 #ifdef HAVE_XSHM_EXTENSION
   {"-shm",     ".useSHM",      XrmoptionNoArg, "True"},
   {"-no-shm",  ".useSHM",      XrmoptionNoArg, "False"},
@@ -928,6 +990,7 @@ void screenhack(Display *disp, Window win)
   int stir = get_boolean_resource("stir", "Boolean");
   int fluidity = get_integer_resource("fluidity", "Integer");
   transparent = get_boolean_resource("water", "Boolean");
+  grayscale_p = get_boolean_resource("grayscale", "Boolean");
 #ifdef HAVE_XSHM_EXTENSION
   use_shm = get_boolean_resource("useSHM", "Boolean");
 #endif /* HAVE_XSHM_EXTENSION */
@@ -964,9 +1027,16 @@ void screenhack(Display *disp, Window win)
     maxbits = MIN(MIN(BITCOUNT(rmask), BITCOUNT(gmask)), BITCOUNT(bmask));
     light -= 8-maxbits;
     if (light < 0) light = 0;
-  } else
+  } else {
+    if (grayscale_p)
+    { 
+      set_mask(visual->red_mask,   &rmask, &rshift);
+      set_mask(visual->green_mask, &gmask, &gshift);
+      set_mask(visual->blue_mask,  &bmask, &bshift);
+    }
     draw_transparent = draw_transparent_vanilla;
-
+  }
+  
   init_ripples(0, -SPLASH); /* Start off without any drops */
 
   /* Main drawing loop */
index caa2686327e806fec806e563be79210344cc9ec2..55160029b3dcccf54d83fa6d6d9ff0927c07497d 100644 (file)
@@ -14,6 +14,7 @@ ripples - interference patterns.
 [\-water]
 [\-stir]
 [\-oily]
+[\-grayscale]
 [\-colors \fInumber\fP]
 [\-no-shm]
 .SH DESCRIPTION
@@ -53,6 +54,11 @@ Moving Splashes.  Boolean.
 .B \-oily | \-no-oily
 Psychedelic Colors.  Boolean.
 .TP 8
+.B \-grayscale
+Convert the screen image to grayscale.
+Ignored if we don't grab the screen image or if our screen doesn't have
+enough color depth.
+.TP 8
 .B \-colors \fInumber\fP
 Colors Two.  Default: 200.
 .TP 8
index e2ebf15472978a2523f9d17aba599c6ee2fc2b7b..b3f3cb6a1f1211b589de785f48ede253bc2e0edc 100644 (file)
@@ -38,7 +38,7 @@
  * software for any purpose.  It is provided "as is" without express or 
  * implied warranty.
  *
- * $Revision: 1.38 $
+ * $Revision: 1.39 $
  *
  * Version 1.0 April 27, 1998.
  * - Initial version
@@ -537,8 +537,9 @@ lookupHost(ping_target *target)
       hent = gethostbyname (target->name);
       if (!hent)
         {
-          fprintf (stderr, "%s: could not resolve host:  %s\n",
-                   progname, target->name);
+          if (debug_p)
+            fprintf (stderr, "%s: could not resolve host:  %s\n",
+                     progname, target->name);
           return 0;
         }
 
@@ -608,7 +609,7 @@ newHost(char *name)
       struct sockaddr_in *iaddr = (struct sockaddr_in *) &(target->address);
       unsigned long ip = iaddr->sin_addr.s_addr;
 
-      if ((ntohl (ip) & 0xFFFFFF00L) == 0x7f000000L)  /* 127.0.0 */
+      if ((ntohl (ip) & 0xFFFFFF00L) == 0x7f000000L)  /* 127.0.0.x */
         {
           if (debug_p)
             fprintf (stderr, "%s:   ignoring loopback host %s\n",
@@ -617,6 +618,19 @@ newHost(char *name)
         }
     }
 
+    /* Don't ever use broadcast (255.x.x.x) hosts */
+    {
+      struct sockaddr_in *iaddr = (struct sockaddr_in *) &(target->address);
+      unsigned long ip = iaddr->sin_addr.s_addr;
+      if ((ntohl (ip) & 0xFF000000L) == 0xFF000000L)  /* 255.x.x.x */
+        {
+          if (debug_p)
+            fprintf (stderr, "%s:   ignoring broadcast host %s\n",
+                     progname, target->name);
+          goto target_init_error;
+        }
+    }
+
     /* Done */
 
     if (debug_p)
index b98d54b68fcb2901946ac714db624d9c5d673e11..7137d6614f11ce68e03f85fcb5a213311eb6af64 100644 (file)
@@ -181,9 +181,9 @@ onestep (Display *dpy, Window window, Bool first_p)
     now = currentTimeInMs() + off;
 
     /* find new x,y */
-    x = ((1 + sin(((float)now) / X_PERIOD * 2. * M_PI))/2.0) 
+    x = ((1 + sin(((double)now) / X_PERIOD * 2. * M_PI))/2.0) 
       * (sizex - s/2) -s/4  + MINX;
-    y = ((1 + sin(((float)now) / Y_PERIOD * 2. * M_PI))/2.0) 
+    y = ((1 + sin(((double)now) / Y_PERIOD * 2. * M_PI))/2.0) 
       * (sizey - s/2) -s/4  + MINY;
     
     if (!first_p)
index 4ed61c7b434dfc7866d323bb397d3d421f74b131..3a8ea8c93b30bf7e666f3d1958eae68a9c6403dc 100755 (executable)
@@ -60,20 +60,21 @@ use bytes;  # Larry can take Unicode and shove it up his ass sideways.
 
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.127 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my $version = q{ $Revision: 1.129 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
 my $copyright = "WebCollage $version, Copyright (c) 1999-2005" .
     " Jamie Zawinski <jwz\@jwz.org>\n" .
     "            http://www.jwz.org/webcollage/\n";
 
 
 
-my @search_methods = (  58, "altavista",    \&pick_from_alta_vista_random_link,
+my @search_methods = (  56, "altavista",    \&pick_from_alta_vista_random_link,
                         11, "livejournal",  \&pick_from_livejournal_images,
-                         7, "yahoorand",    \&pick_from_yahoo_random_link,
+                         5, "yahoorand",    \&pick_from_yahoo_random_link,
                         10, "googlephotos", \&pick_from_google_image_photos,
-                         6, "googleimgs",   \&pick_from_google_images,
+                         5, "googleimgs",   \&pick_from_google_images,
                          3, "googlenums",   \&pick_from_google_image_numbers,
-                         5, "flickr",       \&pick_from_flickr,
+                         2, "flickr_recent", \&pick_from_flickr_recent,
+                         8, "flickr_random", \&pick_from_flickr_random,
 
                      # In Apr 2002, Google asked me to stop searching them.
                      # I asked them to add a "random link" url.  They said
@@ -803,6 +804,29 @@ sub pick_image_from_body($$) {
   return $url;
 }
 
+# Given a URL and the RSS feed from that URL, pick a random image from
+# the feed.  This is a lot simpler than extracting images out of a page:
+# we already know we have reasonable images, so we just pick one.
+# Returns: the real URL of the page (preferably not the RSS version),
+# and the image.
+
+sub pick_image_from_rss($$) {
+  my ( $url, $body ) = @_;
+  my @suitable = ($body =~ m/<enclosure url="(.*?)"/g);
+
+  my ($base) = ($body =~ m@<link>([^<>]+)</link>@i);
+  $base = $url unless $base;
+
+  # pick a random element of the table
+  if (@suitable) {
+    my $i = int(rand(scalar @suitable));
+    my $url = $suitable[$i];
+    LOG ($verbose_load, "picked image " .($i+1) . "/" . 
+                        ($#suitable+1) . ": $url");
+    return ($base, $url);
+  }
+  return;
+}
 
 \f
 ############################################################################
@@ -1763,8 +1787,8 @@ my @flickr_cache = (); # fifo, for ordering by age
 my %flickr_cache = (); # hash, for detecting dups
 
 
-# flickr
-sub pick_from_flickr($) {
+# flickr_recent
+sub pick_from_flickr_recent($) {
   my ($timeout) = @_;
 
   my $start = 16 * int(rand(100));
@@ -1831,6 +1855,47 @@ sub pick_from_flickr($) {
   return ($page, $img);
 }
 
+\f
+############################################################################
+#
+# Pick images from a random RSS feed on Flickr.
+#
+############################################################################
+
+my $flickr_rss_base = ("http://www.flickr.com/services/feeds/photos_public.gne" .
+                       "?format=rss_200_enc&tags=");
+
+# Picks a random RSS feed; picks a random image from that feed;
+# returns 2 URLs: the page containing the image, and the image.
+# Mostly by Joe Mcmahon <mcmahon@yahoo-inc.com>
+#
+# flickr_random
+sub pick_from_flickr_random($) {
+  my $timeout = shift;
+
+  my $rss = $flickr_rss_base . random_word();
+  $last_search = $rss;
+
+  print STDERR "\n\n" if ($verbose_load);
+  LOG ($verbose_load, "URL: $last_search");
+
+  $suppress_audit = 1;
+
+  my ( $base, $body ) = get_document ($last_search, undef, $timeout);
+  if (!$base || !$body) {
+    $body = undef;
+    return;
+  }
+
+  my $img;
+  ($base, $img) = pick_image_from_rss ($base, $body);
+  $body = undef;
+  return () unless defined ($img);
+
+  LOG ($verbose_load, "redirected to: $base");
+  return ($base, $img);
+}
+
 \f
 ############################################################################
 #
@@ -3362,6 +3427,10 @@ sub main() {
     pick_dictionary();
   }
 
+  if ($imagemap_base && !($img_width && $img_height)) {
+    error ("-size WxH is required with -imagemap");
+  }
+
   init_signals();
 
   spawn_driftnet ($driftnet_cmd) if ($driftnet_cmd);
index 8ba09d73733cd5e4a0d06337ae7c1a686a3f963c..3f9a0747e786646eba6b83859cf0f2e32540bc79 100644 (file)
@@ -24,6 +24,7 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 
+#undef HAVE_STDLIB_H /* stupid jconfig.h! */
 #include <jpeglib.h>
 #include <gdk-pixbuf/gdk-pixbuf.h>
 
index df8c0eedef5a0a0dba77c9866f5b40ceb1f29434..4c38e3777b90fd3d7af20f0811f621a048d933e6 100644 (file)
@@ -11,7 +11,7 @@ whirlygig -- zooming chains of sinusoidal spots
 [\-wrap 1|0] [\-db] [\-no-db] 
 
 .SH DESCRIPTION
-The \flwhirlygig\fP program draws a series of circles on your screen.
+The \fIwhirlygig\fP program draws a series of circles on your screen.
 They then move about in a cyclic pattern
 .SH OPTIONS
 .I whirlygig
@@ -27,33 +27,33 @@ Draw on the root window.
 Specify which visual to use.  Legal values are the name of a visual class,
 or the id number (decimal or hex) of a specific visual.
 .TP 8
-.B \-xspeed \flspeed\fP
+.B \-xspeed \fIspeed\fP
 Specify how fast the dots should cycle horizontally.
 Try out values from .01 to 4000. Random by default.
 .TP 8
-.B \-yspeed \flspeed\fP
+.B \-yspeed \fIspeed\fP
 Specify how fast the dots should cycle vertically.
 Try out values from .01 to 4000. Random by default.
 .TP 8
-.B \-xamplitude \flfactor\fP
+.B \-xamplitude \fIfactor\fP
 Specify the horizontal amplitude.
 Try out values from .01 to 10. Defaults to 1.0.
 .TP 8
-.B \-yamplitude \flfactor\fP
+.B \-yamplitude \fIfactor\fP
 Specify the horizontal amplitude.
 Try out values from .01 to 10. Defaults to 1.0.
 .TP 8
-.B \-whirlies \fla number\fP
+.B \-whirlies \fIa number\fP
 Specify how many whirlies you want (per line). Defaults
 to a random number.
 .TP 8
-.B \-nlines \flnumber of lines\fP
+.B \-nlines \fInumber of lines\fP
 Specify how many lines of whirlies you want. Defaults to a 
 random number.
 .TP 8
-.B \-xmode \flmode\fP
+.B \-xmode \fImode\fP
 .TP 8 
-.B \-ymode \flmode\fP
+.B \-ymode \fImode\fP
 Specify which mode to use for calculating the x and y positions of the
 whirlies. Can be any of spin, funky, circle, linear, test, fun, innie
 or lissajous. Defaults to 'change' mode, which randomly selects a new
@@ -63,37 +63,37 @@ mode for x and y every now an then. Unrecognized options default to spin.
 Prints some strings to the window explaining what the initially
 selected modes are, before displaying the whirlies. Off by default.
 .TP 8
-.B \-trail \fl1 or 0\fP
+.B \-trail \fI1 or 0\fP
 Trail mode fails to erase the whirlies as they move, so they leave a
 multicoloured trail behind. Doesn't work if the doubled buffered mode
 is using the X server's double buffer extension, and the useDBEclear 
 resource is true (which it is by default).
 .TP 8
-.B \-speed \flint\fP
+.B \-speed \fIint\fP
 Specifies how fast to cycle through the internal time. Values 1,2 and
 3 look ok, up to 10 is not too bad, but beyond ends up
 flickery. Adjust xspeed and yspeed instead.
 .TP 8
-.B \-start_time \flint\fP
+.B \-start_time \fIint\fP
 Where in the internal time cycle to start. Ranges from 1 to 429496729,
 Defaults to a random value.
 .TP 8
-.B \-xoffset \flfactor\fP
+.B \-xoffset \fIfactor\fP
 Tell the whirlies to be offset by this factor of a sin.
 Defaults to 1.0
 .TP 8
-.B \-yoffset \flfactor\fP
+.B \-yoffset \fIfactor\fP
 Tell the whirlies to be offset by this factor of a cos.
 Defaults to 1.0
 .TP 8
-.B \-offset_period \flfactor\fP
+.B \-offset_period \fIfactor\fP
 Change the period of an offset cycle
 Defaults to 1
 .TP 8
-.B \-color_modifier \flint\fP
+.B \-color_modifier \fIint\fP
 How many colors away from the current should the next whirly be?
 .TP 8
-.B \-wrap \fl1|0\fP
+.B \-wrap \fI1|0\fP
 Causes whirlies that fall off the edge of the screen to wrap over to
 the other end of the screen. Otherwise they disappear and new ones
 to materialize on the other side of the screen. The difference is
index 683c21baa610b7aae8573b3af77bb9d9bddd669d..3af8850725c2fa655225f6d943fd857461aa2f08 100644 (file)
@@ -217,7 +217,7 @@ static double  minexp, maxexp, prob=0.5;
 static int     expind[MAXFRAMES]={0}, resized[MAXFRAMES]={0};
 static int     numwheels=MAXWHEELS, force=0, Force=0, negative=1;
 static int     rgb_max=65000, nostart=1, stripe_interval=7;
-static int     save=1, show=0, useprod=1, spinlength=256, savefile=0;
+static int     save=1, show=0, useprod=1, spinlength=256/*, savefile=0*/;
 static int     maxframe=0, frame=0, dorecalc=0, mapindex=0, run=1;
 static char    *outname="lyap.out";
 
@@ -246,7 +246,7 @@ static void main_event(void);
 static int complyap(void);
 static void Getkey(XKeyEvent *event);
 static int sendpoint(double expo);
-static void save_to_file(void);
+/*static void save_to_file(void);*/
 static void setforcing(void);
 static void check_params(int mapnum, int parnum);
 static void usage(void);
@@ -605,15 +605,15 @@ complyap(void)
       return FALSE;
     else {
       FlushBuffer();
-      if (savefile)
-       save_to_file();
+/*      if (savefile)
+       save_to_file(); */
       return TRUE;
     }
   }
   if (b >= max_b) {
     FlushBuffer();
-    if (savefile)
-      save_to_file();
+/*    if (savefile)
+      save_to_file();*/
     return TRUE;
   }
   prod = 1.0;
@@ -705,8 +705,8 @@ complyap(void)
     return FALSE;
   else {
     FlushBuffer();
-    if (savefile)
-      save_to_file();
+/*    if (savefile)
+      save_to_file();*/
     return TRUE;
   }
 }
@@ -1316,7 +1316,7 @@ Getkey(XKeyEvent *event)
       redraw(exponents[frame], expind[frame], 1);
       break;
   case 'f':
-  case 'F': save_to_file(); break;
+/*  case 'F': save_to_file(); break;*/
   case 'i': if (stripe_interval > 0) {
       stripe_interval--;
        if (displayplanes > 1) {
@@ -1568,6 +1568,7 @@ Redraw(void)
   resized[frame] = 0;
 }
 
+#if 0
 /* Store color pics in PPM format and monochrome in PGM */
 static void
 save_to_file(void)
@@ -1643,6 +1644,7 @@ save_to_file(void)
       }
   fclose(outfile);
 }
+#endif
 
 static void
 recalc(void)
index 15d465a4c8137ff17338e63255ff01c1f78ab7ef..7073ce09a7e71fc574cd4d599c087873e897c873 100644 (file)
@@ -1,4 +1,4 @@
-# Auto-generated: Wed Jun 22 18:02:31 PDT 2005
+# Auto-generated: Fri Oct 21 23:44:10 PDT 2005
 driver/demo-Gtk-conf.c
 driver/demo-Gtk-support.c
 driver/demo-Gtk-widgets.c
@@ -34,6 +34,7 @@ hacks/config/bumps.xml
 hacks/config/cage.xml
 hacks/config/carousel.xml
 hacks/config/ccurve.xml
+hacks/config/celtic.xml
 hacks/config/circuit.xml
 hacks/config/cloudlife.xml
 hacks/config/compass.xml
@@ -42,6 +43,7 @@ hacks/config/cosmos.xml
 hacks/config/crackberg.xml
 hacks/config/critical.xml
 hacks/config/crystal.xml
+hacks/config/cube21.xml
 hacks/config/cubenetic.xml
 hacks/config/cubestorm.xml
 hacks/config/cynosure.xml
@@ -82,6 +84,7 @@ hacks/config/gflux.xml
 hacks/config/glblur.xml
 hacks/config/gleidescope.xml
 hacks/config/glforestfire.xml
+hacks/config/glhanoi.xml
 hacks/config/glknots.xml
 hacks/config/glmatrix.xml
 hacks/config/glplanet.xml
@@ -107,6 +110,7 @@ hacks/config/intermomentary.xml
 hacks/config/jigglypuff.xml
 hacks/config/jigsaw.xml
 hacks/config/juggle.xml
+hacks/config/juggler3d.xml
 hacks/config/julia.xml
 hacks/config/kaleidescope.xml
 hacks/config/klein.xml
@@ -188,6 +192,7 @@ hacks/config/swirl.xml
 hacks/config/t3d.xml
 hacks/config/tangram.xml
 hacks/config/thornbird.xml
+hacks/config/timetunnel.xml
 hacks/config/triangle.xml
 hacks/config/truchet.xml
 hacks/config/twang.xml
index b15b962a1ca0e43bfee9d3587fef0e0dfaa4d67c..96b598429ce962d63b76d9e0f13006cb8a8b6318 100644 (file)
--- a/setup.com
+++ b/setup.com
@@ -5,7 +5,6 @@ $ mydisk = f$trnlmn("SYS$DISK")
 $ mydir  = mydisk+f$directory()
 $ anemone      :== $'mydir'anemone
 $ anemotaxis   :== $'mydir'anemotaxis
-$ ant          :== $'mydir'ant
 $ apollonian   :== $'mydir'apollonian
 $ apple2       :== $'mydir'apple2
 $ attraction   :== $'mydir'attraction
@@ -19,6 +18,7 @@ $ bsod                :== $'mydir'bsod
 $ bubbles      :== $'mydir'bubbles
 $ bumps                :== $'mydir'bumps
 $ ccurve       :== $'mydir'ccurve
+$ celtic       :== $'mydir'celtic
 $ cloudlife    :== $'mydir'cloudlife
 $ compass      :== $'mydir'compass
 $ coral                :== $'mydir'coral
index 716a2d7cc6223445a237fe5a71eaadf88aed9eee..7b105c9e275bb1c6079c736fef54bd9f73f181dd 100644 (file)
@@ -1,2 +1,2 @@
 static const char screensaver_id[] =
-       "@(#)xscreensaver 4.22 (22-Jun-2005), by Jamie Zawinski (jwz@jwz.org)";
+       "@(#)xscreensaver 4.23 (21-Oct-2005), by Jamie Zawinski (jwz@jwz.org)";
index 12c529b181d1e14a187078705649b420541c8ade..9ebb6643bcda39c78f5ad0534871c1c83492bc60 100644 (file)
@@ -1,5 +1,5 @@
 %define        name xscreensaver
-%define        version 4.22
+%define        version 4.23
 
 Summary:       X screen saver and locker
 Name:          %{name}
@@ -48,7 +48,7 @@ Obsoletes: xscreensaver-gl
 
 %description
 A modular screen saver and locker for the X Window System.
-More than 190 display modes are included in this package.
+More than 200 display modes are included in this package.
 
 %description base
 A modular screen saver and locker for the X Window System.