http://packetstormsecurity.org/UNIX/admin/xscreensaver-4.04.2.tar.gz
authorZygo Blaxell <zblaxell@hungrycats.org>
Mon, 2 Mar 2009 05:42:55 +0000 (00:42 -0500)
committerZygo Blaxell <zblaxell@faye.furryterror.org>
Fri, 8 Feb 2013 17:53:52 +0000 (12:53 -0500)
-rw-r--r-- 1 zblaxell zblaxell 2901618 Jun  3  2002 xscreensaver-4.04.2.tar.gz
9b5ebf93c0ad4373d84b66a68c9b05559d0c5672  xscreensaver-4.04.2.tar.gz

153 files changed:
Makefile.in
README
config.h.in
configure
configure.in
driver/Makefile.in
driver/XScreenSaver.ad.in
driver/XScreenSaver_ad.h
driver/demo-Gtk-conf.c
driver/demo-Gtk.c
driver/screensaver-properties.desktop.in
driver/windows.c
driver/xscreensaver-command.man
driver/xscreensaver-demo.glade
driver/xscreensaver-demo.glade2 [new file with mode: 0644]
driver/xscreensaver-demo.man
driver/xscreensaver-getimage-file.man
driver/xscreensaver-getimage-video.man
driver/xscreensaver-getimage.c
driver/xscreensaver-getimage.man
driver/xscreensaver.man
hacks/Makefile.in
hacks/anemone.c [new file with mode: 0644]
hacks/anemone.man [new file with mode: 0644]
hacks/ant.man [new file with mode: 0644]
hacks/apollonian.man [new file with mode: 0644]
hacks/blaster.man [new file with mode: 0644]
hacks/ccurve.man [new file with mode: 0644]
hacks/compass.man [new file with mode: 0644]
hacks/compile_axp.com
hacks/compile_decc.com
hacks/config/README
hacks/config/anemone.xml [new file with mode: 0644]
hacks/config/blitspin.xml
hacks/config/coral.xml
hacks/config/fluidballs.xml
hacks/config/lavalite.xml [new file with mode: 0644]
hacks/config/queens.xml [new file with mode: 0644]
hacks/config/rotor.xml
hacks/config/t3d.xml
hacks/coral.man [new file with mode: 0644]
hacks/crystal.man [new file with mode: 0644]
hacks/cynosure.man [new file with mode: 0644]
hacks/deluxe.c
hacks/deluxe.man [new file with mode: 0644]
hacks/demon.man [new file with mode: 0644]
hacks/discrete.man [new file with mode: 0644]
hacks/euler2d.man [new file with mode: 0644]
hacks/fadeplot.man [new file with mode: 0644]
hacks/flow.man [new file with mode: 0644]
hacks/fluidballs.man [new file with mode: 0644]
hacks/glx/Makefile.in
hacks/glx/atlantis.man [new file with mode: 0644]
hacks/glx/boxed.man [new file with mode: 0644]
hacks/glx/bubble3d.man [new file with mode: 0644]
hacks/glx/cage.man [new file with mode: 0644]
hacks/glx/circuit.man [new file with mode: 0644]
hacks/glx/cubenetic.c
hacks/glx/cubenetic.man [new file with mode: 0644]
hacks/glx/dangerball.c
hacks/glx/dangerball.man [new file with mode: 0644]
hacks/glx/engine.man [new file with mode: 0644]
hacks/glx/extrusion.c
hacks/glx/extrusion.man [new file with mode: 0644]
hacks/glx/flipscreen3d.man [new file with mode: 0644]
hacks/glx/fps.c
hacks/glx/gears.c
hacks/glx/gears.man [new file with mode: 0644]
hacks/glx/gflux.c
hacks/glx/glplanet.c
hacks/glx/glplanet.man [new file with mode: 0644]
hacks/glx/gltext.c
hacks/glx/gltrackball.c [new file with mode: 0644]
hacks/glx/gltrackball.h [new file with mode: 0644]
hacks/glx/lament.c
hacks/glx/lavalite.c [new file with mode: 0644]
hacks/glx/lavalite.man [new file with mode: 0644]
hacks/glx/marching.c [new file with mode: 0644]
hacks/glx/marching.h [new file with mode: 0644]
hacks/glx/menger.c
hacks/glx/menger.man [new file with mode: 0644]
hacks/glx/moebius.c
hacks/glx/moebius.man [new file with mode: 0644]
hacks/glx/molecule.c
hacks/glx/morph3d.man [new file with mode: 0644]
hacks/glx/pipes.man [new file with mode: 0644]
hacks/glx/pulsar.man [new file with mode: 0644]
hacks/glx/queens.c [new file with mode: 0644]
hacks/glx/queens.man [new file with mode: 0644]
hacks/glx/rotator.c [new file with mode: 0644]
hacks/glx/rotator.h [new file with mode: 0644]
hacks/glx/rubik.man [new file with mode: 0644]
hacks/glx/sierpinski3d.c
hacks/glx/sierpinski3d.man [new file with mode: 0644]
hacks/glx/spheremonics.c
hacks/glx/spheremonics.man [new file with mode: 0644]
hacks/glx/sproingies.man [new file with mode: 0644]
hacks/glx/stairs.man [new file with mode: 0644]
hacks/glx/stonerview.man [new file with mode: 0644]
hacks/glx/superquadrics.man [new file with mode: 0644]
hacks/glx/trackball.c [new file with mode: 0644]
hacks/glx/trackball.h [new file with mode: 0644]
hacks/glx/xpm-ximage.c
hacks/images/matrix0.xbm
hacks/images/matrix0.xpm
hacks/images/matrix0b.xbm
hacks/images/matrix0b.xpm
hacks/images/matrix1.xbm
hacks/images/matrix1.xpm
hacks/images/matrix1b.xbm
hacks/images/matrix1b.xpm
hacks/images/matrix2.xbm
hacks/images/matrix2.xpm
hacks/images/matrix2b.xbm
hacks/images/matrix2b.xpm
hacks/interference.man [new file with mode: 0644]
hacks/juggle.man [new file with mode: 0644]
hacks/kumppa.man [new file with mode: 0644]
hacks/lissie.man [new file with mode: 0644]
hacks/loop.man [new file with mode: 0644]
hacks/moire2.man [new file with mode: 0644]
hacks/mountain.man [new file with mode: 0644]
hacks/polyominoes.man [new file with mode: 0644]
hacks/ripples.man [new file with mode: 0644]
hacks/rotor.man [new file with mode: 0644]
hacks/screenhack.c
hacks/shadebobs.man [new file with mode: 0644]
hacks/thornbird.man [new file with mode: 0644]
hacks/triangle.man [new file with mode: 0644]
hacks/truchet.man [new file with mode: 0644]
hacks/vermiculate.man [new file with mode: 0644]
hacks/vidwhacker
hacks/wander.man [new file with mode: 0644]
hacks/webcollage
hacks/webcollage-helper.c
hacks/webcollage.man
hacks/worm.man [new file with mode: 0644]
hacks/xlockmore.c
hacks/xlockmore.h
hacks/xlockmoreI.h
hacks/xmatrix.c
hacks/xml2man.pl [new file with mode: 0755]
hacks/xpm-pixmap.c
hacks/xrayswarm.man [new file with mode: 0644]
po/ChangeLog
po/Makefile.in.in
po/POTFILES.in
screenblank.txt [deleted file]
setup.com
utils/version.h
utils/xscreensaver-intl.h
xscreensaver.lsm
xscreensaver.spec

index ba7f47d8245ecb107bca435f4c83259768f92ef7..5268e7702ab5c800cb745aa0a755bb99be78582b 100644 (file)
@@ -10,8 +10,7 @@ SUBDIRS               = utils driver hacks hacks/glx po
 TARFILES       = README README.VMS README.debugging INSTALL xscreensaver.lsm \
                  configure configure.in Makefile.in config.h.in \
                  config.h-vms install-sh setup.com config.guess aclocal.m4 \
-                 config.sub makevms.com screenblank.txt \
-                 install-sh \
+                 config.sub install-sh makevms.com \
                  intltool-merge.in intltool-extract.in intltool-update.in \
                  xscreensaver.lsm.sh xscreensaver.spec \
 
@@ -159,7 +158,7 @@ update_spec_version::
        @S=$(srcdir)/xscreensaver.spec ;                                    \
        U=$(srcdir)/utils/version.h ;                                       \
        V=`sed -n 's/.*\([0-9][0-9]*\.[0-9]*\).*/\1/p' < $$U` ;             \
-       echo -n "Updating version number in $$S to \"$$V\"... " ;           \
+       echo -n "Updating $$S to \"$$V\"... " ;                             \
        T=/tmp/xs.$$$$ ;                                                    \
        sed "s/^\(%define.version[^0-9]*\)\(.*\)/\1$$V/"                    \
          < $$S > $$T ;                                                     \
diff --git a/README b/README
index 1d05026f576b48b10b92acb8c4d9418d525f4b85..811c4a3196af60e9eed21ef6719c31c82a8bb5d4 100644 (file)
--- a/README
+++ b/README
@@ -70,6 +70,28 @@ the XScreenSaver FAQ about that: http://www.jwz.org/xscreensaver/faq.html
 
                               ============
 
+Changes since 4.03:   * Support for GTK 2.x / GNOME 2.x.
+                      * The `configure' script will now use `pkg-config' if
+                        you have it, in preference to `gtk-config', etc.
+                      * New hacks, `lavalite', `queens', and `anemone'.
+                      * Minor updates to `spheremonics', `gltext', `xmatrix'.
+                      * You can use the mouse to manually spin most of the GL
+                        hacks now (when they are displaying in a window.)
+                      * Fixed a bug in `webcollage' (due to recent Alta Vista
+                        url changes) that was causing it to try and load 
+                        incorrect image URLs.
+                      * Made `xscreensaver-getimage' use gdk_pixbuf if it is
+                        available: this means that those hacks that load images
+                        will no longer rely on "xv", "xloadimage", etc.  This
+                        will close a race condition that could sometimes cause
+                        your desktop background to be changed; and also makes
+                        it possible for those programs to operate on image
+                        files when running in non-root mode.
+                      * `webcollage' can now be used in conjunction with
+                        `driftnet' to display images snooped from your local
+                        ethernet instead of obtained from search engines.
+                      * Added man pages for all the hacks that didn't have
+                        them.
 Changes since 4.02:   * New hack, `spheremonics'.
                       * Minor updates to `webcollage', `cage', `moebius',
                         `morph3d', `boxed', `circuit', and `helix'.
index 05c8ed2f1ef146097a4a368002af4a65cbca2870..98d8560cdec244e3e966f97d0f1196b70f0647a8 100644 (file)
  */
 #undef HAVE_XMCOMBOBOX
 
-/*  Define this if you have Gtk.
+/*  Define this if you have Gtk (any version.)
  */
 #undef HAVE_GTK
 
+/* Define this if you have Gtk 2.x.
+ */
+#undef HAVE_GTK2
+
 /*  Define this if you have Gnome and want to build support for the 
     xscreensaver control panel in the Gnome Control Center (gnomecc).
+    (This is needed only with Gtk 1.x.)
  */
 #undef HAVE_CRAPPLET
 
index de9a8afe281bec4f8ca3e884ff5ed31ad9d4ace9..8bd583807abb656f95afd558f99179fd27f9fdd2 100755 (executable)
--- a/configure
+++ b/configure
@@ -833,7 +833,6 @@ Screen locking options:
   --enable-locking        Compile in support for locking the display.
   --disable-locking       Do not allow locking at all.
 
-
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
@@ -876,11 +875,15 @@ Screen blanking and idle-detection options:
 
 User interface options:
 
-  --with-motif            Use the Motif toolkit for the user interface.
+  --with-motif            Use the Motif toolkit for the user interface
+                          (not recommended.)
   --with-gtk              Use the Gtk toolkit for the user interface.
-  --with-gnome            Include support for the Gnome Control Center.
+  --with-gnome            Include support for the Gnome 1.x Control Center.
+                          (This option is not needed with GTK 2.x / Gnome 2.x.)
+
   --with-xml              The XML toolkit is needed for some parts of
-                          the Gtk interface.
+                          the Gtk interface.  Without it, the configuration
+                          interface will be much less featureful.
 
 Graphics options:
 
@@ -888,12 +891,14 @@ Graphics options:
   --with-gle              Build those demos which depend on GLE
                           (the OpenGL "extrusion" library.)
   --with-xpm              Include support for XPM files in some demos.
+                          (Not needed if Pixbuf is used.)
   --with-pixbuf           Include support for the GDK-Pixbuf library in some
                           demos, which will make it possible for them to read
-                          GIF, JPEG, and PNG files as well.
-  --with-jpeg             Include support for the JPEG library in some demos,
-                          which will make it possible for them to read JPEG
-                          files as well.
+                          GIF, JPEG, and PNG files as well.  (The path here is
+                         ignored if GTK 2.x is being used.)
+  --with-jpeg             Include support for the JPEG library in some demos.
+                          (If this library is available, webcollage will be a
+                        . lot faster.)
   --with-xshm-ext         Include support for the Shared Memory extension.
   --with-xdbe-ext         Include support for the DOUBLE-BUFFER extension.
   --with-readdisplay      Include support for the XReadDisplay extension.
@@ -2380,7 +2385,7 @@ echo $ECHO_N "checking whether gcc accepts -std... $ECHO_C" >&6
 if test "${ac_cv_gcc_accepts_std+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  if ( gcc -E -std=c89 - </dev/null >/dev/null 2>&1 | \
+  if ( ( gcc -E -std=c89 - </dev/null >/dev/null ) 2>&1 | \
           grep unrecognized >/dev/null ); then
        ac_cv_gcc_accepts_std=no
      else
@@ -6271,7 +6276,9 @@ _ACEOF
 
 
 
-ALL_LINGUAS="ca de et fr it ko pl pt sv da es fi hu ja no pt pt_BR ru wa"
+# #### no sign of  en_GB
+#ALL_LINGUAS="ca de en_GB et fr it ko pl sv da es fi hu ja no pt pt_BR ru wa"
+ALL_LINGUAS="ca de et fr it ko pl sv da es fi hu ja no pt pt_BR ru wa"
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ranlib; ac_word=$2
@@ -10509,7 +10516,6 @@ fi
 #fi
 
 
-
 ###############################################################################
 #
 #       Check for PAM.
@@ -12211,6 +12217,7 @@ fi
 ###############################################################################
 
 have_gtk=no
+have_gtk2=no
 with_gtk_req=unspecified
 
 # Check whether --with-gtk or --without-gtk was given.
@@ -12354,6 +12361,19 @@ if test "$with_gnome" != yes -a "$with_gnome" != no ; then
   exit 1
 fi
 
+parse_gtk_version_string() {
+  # M4 sucks!!
+
+  maj=`echo $ac_gtk_version_string | sed -n 's/\..*//p'`
+  min=`echo $ac_gtk_version_string | sed -n 's/[^.]*\.\([^.]*\).*/\1/p'`
+
+  ac_gtk_version=`echo "$maj * 1000 + $min" | bc`
+  if test -z "$ac_gtk_version"; then
+    ac_gtk_version=unknown
+    ac_gtk_version_string=unknown
+  fi
+}
+
 
 jurassic_gtk=no
 if test "$with_gtk" = yes; then
@@ -12376,7 +12396,172 @@ if test "$with_gtk" = yes; then
     gtk_path="$foo:$gtk_path"
   fi
 
-  for ac_prog in glib12-config glib-config
+  for ac_prog in pkg-config
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_pkg_config+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $pkg_config in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_pkg_config="$pkg_config" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $gtk_path
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_pkg_config="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  ;;
+esac
+fi
+pkg_config=$ac_cv_path_pkg_config
+
+if test -n "$pkg_config"; then
+  echo "$as_me:$LINENO: result: $pkg_config" >&5
+echo "${ECHO_T}$pkg_config" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$pkg_config" && break
+done
+
+
+  if test -n "$pkg_config" ; then
+    #
+    # the new way...
+    # run pkg-config based tests.
+    #
+
+    pkgs=''
+    pkg_check_version() {
+      if test "$ok" = yes ; then
+        req="$1"
+        min="$2"
+        echo "$as_me:$LINENO: checking for $req" >&5
+echo $ECHO_N "checking for $req... $ECHO_C" >&6
+        if $pkg_config --exists "$req" ; then
+          vers=`$pkg_config --modversion "$req"`
+          if $pkg_config --exists "$req >= $min" ; then
+            echo "$as_me:$LINENO: result: $vers" >&5
+echo "${ECHO_T}$vers" >&6
+            pkgs="$pkgs $req"
+            return 1
+          else
+            echo "$as_me:$LINENO: result: $vers (wanted >= $min)" >&5
+echo "${ECHO_T}$vers (wanted >= $min)" >&6
+            ok=no
+            return 0
+          fi
+        else
+          echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+          ok=no
+          return 0
+        fi
+      fi
+    }
+
+    ok="yes"
+    pkg_check_version     gtk+-2.0  2.0.1  ; ac_gtk_version_string="$vers"
+    pkg_check_version  gmodule-2.0  2.0.0
+    pkg_check_version   libxml-2.0  2.4.6
+    pkg_check_version libglade-2.0  1.99.0
+    have_gtk="$ok"
+
+    if test "$have_gtk" = yes; then
+      have_gtk2=yes
+      cat >>confdefs.h <<\_ACEOF
+#define HAVE_GTK2 1
+_ACEOF
+
+    fi
+
+    if test "$have_gtk" = no; then
+      #
+      # we don't have GTK 2.  Let's look for GTK 1.
+      #
+      pkgs=''
+      ok="yes"
+      pkg_check_version gtk+ 1.2           ; ac_gtk_version_string="$vers"
+      pkg_check_version glib 1.0
+      have_gtk="$ok"
+
+      # Now check for Gnome...
+      #
+      if test "$have_gtk" = yes; then
+        old_pkgs="$pkgs"
+        ok=yes
+        pkg_check_version capplet    1.0
+        pkg_check_version gnomeui    1.0
+        pkg_check_version gdk_pixbuf 0.1
+        have_gnome="$ok"
+
+        if test "$have_gnome" = no; then
+          pkgs="$old_pkgs"
+        else
+          cat >>confdefs.h <<\_ACEOF
+#define HAVE_CRAPPLET 1
+_ACEOF
+
+        fi
+      fi
+    fi
+
+    if test "$have_gtk" = yes; then
+      parse_gtk_version_string
+      jurassic_gtk=no
+    else
+      have_gnome=no
+    fi
+
+    if test "$have_gtk" = yes; then
+      echo "$as_me:$LINENO: checking for Gtk includes" >&5
+echo $ECHO_N "checking for Gtk includes... $ECHO_C" >&6
+if test "${ac_cv_gtk_config_cflags+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_gtk_config_cflags=`$pkg_config --cflags $pkgs`
+fi
+echo "$as_me:$LINENO: result: $ac_cv_gtk_config_cflags" >&5
+echo "${ECHO_T}$ac_cv_gtk_config_cflags" >&6
+      echo "$as_me:$LINENO: checking for Gtk libs" >&5
+echo $ECHO_N "checking for Gtk libs... $ECHO_C" >&6
+if test "${ac_cv_gtk_config_libs+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_gtk_config_libs=`$pkg_config --libs $pkgs`
+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
+
+    ac_gnome_config_cflags=$ac_gtk_config_cflags
+    ac_gnome_config_libs=$ac_gtk_config_libs
+
+  else
+    #
+    # the old way...
+    # run {gnome,gtk}-config based tests.
+    #
+
+    for ac_prog in glib12-config glib-config
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
@@ -12420,7 +12605,7 @@ fi
   test -n "$glib_config" && break
 done
 
-  for ac_prog in gtk12-config  gtk-config
+    for ac_prog in gtk12-config  gtk-config
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
@@ -12465,8 +12650,8 @@ fi
 done
 
 
-  if test "$with_gnome" = yes; then
-    for ac_prog in gnome-config
+    if test "$with_gnome" = yes; then
+      for ac_prog in gnome-config
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
   test -n "$gnome_config" && break
 done
 
-  fi
+    fi
 
-  if test -n "$glib_config" -a  -n "$gtk_config" ; then
-    have_gtk=yes
-    if test "$with_gnome" = yes -a -n "$gnome_config" ; then
-      have_gnome=yes
+    if test -n "$glib_config" -a  -n "$gtk_config" ; then
+      have_gtk=yes
+      if test "$with_gnome" = yes -a -n "$gnome_config" ; then
+        have_gnome=yes
+      fi
     fi
-  fi
 
-  if test "$have_gtk" = yes; then
-    echo "$as_me:$LINENO: checking Gtk version number" >&5
+    if test "$have_gtk" = yes; then
+      echo "$as_me:$LINENO: checking Gtk version number" >&5
 echo $ECHO_N "checking Gtk version number... $ECHO_C" >&6
 if test "${ac_cv_gtk_version_string+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -12529,27 +12714,20 @@ else
 fi
 echo "$as_me:$LINENO: result: $ac_cv_gtk_version_string" >&5
 echo "${ECHO_T}$ac_cv_gtk_version_string" >&6
-    ac_gtk_version_string=$ac_cv_gtk_version_string
-    # M4 sucks!!
+      ac_gtk_version_string=$ac_cv_gtk_version_string
+    fi
 
-    maj=`echo $ac_gtk_version_string | sed -n 's/\..*//p'`
-    min=`echo $ac_gtk_version_string | sed -n 's/[^.]*\.\([^.]*\).*/\1/p'`
+    parse_gtk_version_string
 
-    ac_gtk_version=`echo "$maj * 1000 + $min" | bc`
-    if test -z "$ac_gtk_version"; then
-      ac_gtk_version=unknown
-      ac_gtk_version_string=unknown
-    fi
     if test "$ac_gtk_version" = "unknown" || test "$ac_gtk_version" -lt 1002
     then
       have_gtk=no
       have_gnome=no
       jurassic_gtk=yes
     fi
-  fi
 
-  if test "$have_gtk" = yes; then
-    echo "$as_me:$LINENO: checking for Gtk includes" >&5
+    if test "$have_gtk" = yes; then
+      echo "$as_me:$LINENO: checking for Gtk includes" >&5
 echo $ECHO_N "checking for Gtk includes... $ECHO_C" >&6
 if test "${ac_cv_gtk_config_cflags+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -12558,7 +12736,7 @@ else
 fi
 echo "$as_me:$LINENO: result: $ac_cv_gtk_config_cflags" >&5
 echo "${ECHO_T}$ac_cv_gtk_config_cflags" >&6
-    echo "$as_me:$LINENO: checking for Gtk libs" >&5
+      echo "$as_me:$LINENO: checking for Gtk libs" >&5
 echo $ECHO_N "checking for Gtk libs... $ECHO_C" >&6
 if test "${ac_cv_gtk_config_libs+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -12567,80 +12745,78 @@ else
 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
+    fi
+    ac_gtk_config_cflags=$ac_cv_gtk_config_cflags
+    ac_gtk_config_libs=$ac_cv_gtk_config_libs
 
-  # Check for Gnome Capplet support.
-  #
-  if test "$have_gnome" = yes -a "$have_gtk" = yes; then
-    gnome_config_libs="gtk capplet gnomeui gdk_pixbuf"
-    echo "$as_me:$LINENO: checking for Gnome capplet includes" >&5
+    # Check for Gnome Capplet support.
+    #
+    if test "$have_gnome" = yes -a "$have_gtk" = yes; then
+      gnome_config_libs="gtk capplet gnomeui gdk_pixbuf"
+      echo "$as_me:$LINENO: checking for Gnome capplet includes" >&5
 echo $ECHO_N "checking for Gnome capplet includes... $ECHO_C" >&6
-    if test "${ac_cv_gnome_config_cflags+set}" = set; then
+      if test "${ac_cv_gnome_config_cflags+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if ( $gnome_config --cflags $gnome_config_libs >/dev/null 2>&1 | \
-            grep Unknown >/dev/null ) ; then
-         ac_cv_gnome_config_cflags=''
-       else
-         ac_cv_gnome_config_cflags=`$gnome_config --cflags $gnome_config_libs`
-       fi
+              grep Unknown >/dev/null ) ; then
+           ac_cv_gnome_config_cflags=''
+         else
+          ac_cv_gnome_config_cflags=`$gnome_config --cflags $gnome_config_libs`
+         fi
 fi
 
-    ac_gnome_config_cflags=$ac_cv_gnome_config_cflags
-    if test "$ac_gnome_config_cflags" = "" ; then
-      have_gnome=no
-      echo "$as_me:$LINENO: result: no" >&5
+      ac_gnome_config_cflags=$ac_cv_gnome_config_cflags
+      if test "$ac_gnome_config_cflags" = "" ; then
+        have_gnome=no
+        echo "$as_me:$LINENO: result: no" >&5
 echo "${ECHO_T}no" >&6
-    else
-      echo "$as_me:$LINENO: result: $ac_gnome_config_cflags" >&5
+      else
+        echo "$as_me:$LINENO: result: $ac_gnome_config_cflags" >&5
 echo "${ECHO_T}$ac_gnome_config_cflags" >&6
+      fi
     fi
-  fi
 
-  if test "$have_gnome" = yes -a "$have_gtk" = yes; then
-    echo "$as_me:$LINENO: checking for Gnome capplet libs" >&5
+    if test "$have_gnome" = yes -a "$have_gtk" = yes; then
+      echo "$as_me:$LINENO: checking for Gnome capplet libs" >&5
 echo $ECHO_N "checking for Gnome capplet libs... $ECHO_C" >&6
-    if test "${ac_cv_gnome_config_libs+set}" = set; then
+      if test "${ac_cv_gnome_config_libs+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if ( $gnome_config --libs $gnome_config_libs >/dev/null 2>&1 |
-            grep Unknown >/dev/null ) ; then
-         ac_cv_gnome_config_libs=''
-       else
-         ac_cv_gnome_config_libs=`$gnome_config --libs $gnome_config_libs`
-       fi
+              grep Unknown >/dev/null ) ; then
+           ac_cv_gnome_config_libs=''
+         else
+           ac_cv_gnome_config_libs=`$gnome_config --libs $gnome_config_libs`
+         fi
 fi
 
-    ac_gnome_config_libs=$ac_cv_gnome_config_libs
-    if test "$ac_gnome_config_libs" = "" ; then
-      have_gnome=no
-      echo "$as_me:$LINENO: result: no" >&5
+      ac_gnome_config_libs=$ac_cv_gnome_config_libs
+      if test "$ac_gnome_config_libs" = "" ; then
+        have_gnome=no
+        echo "$as_me:$LINENO: result: no" >&5
 echo "${ECHO_T}no" >&6
-    else
-      echo "$as_me:$LINENO: result: $ac_gnome_config_libs" >&5
+      else
+        echo "$as_me:$LINENO: result: $ac_gnome_config_libs" >&5
 echo "${ECHO_T}$ac_gnome_config_libs" >&6
+      fi
     fi
-  fi
 
-  GNOME_DATADIR=""
-  if test "$have_gnome" = yes -a "$have_gtk" = yes; then
-    GNOME_DATADIR=`$gnome_config --datadir`
-  fi
-
-
-  # If we have Gnome, then override the gtk-config values with
-  # the gnome-config values.
-  #
-  if test "$have_gnome" = yes -a "$have_gtk" = yes; then
-    ac_gtk_config_cflags=$ac_gnome_config_cflags
-    ac_gtk_config_libs=$ac_gnome_config_libs
-    cat >>confdefs.h <<\_ACEOF
+    # If we have Gnome, then override the gtk-config values with
+    # the gnome-config values.
+    #
+    if test "$have_gnome" = yes -a "$have_gtk" = yes; then
+      ac_gtk_config_cflags=$ac_gnome_config_cflags
+      ac_gtk_config_libs=$ac_gnome_config_libs
+      cat >>confdefs.h <<\_ACEOF
 #define HAVE_CRAPPLET 1
 _ACEOF
 
+    fi
+
+  fi   # end of {gnome,gtk}-config based tests
 
+  if test "$have_gtk" = yes -a "$have_gtk2" = no; then
     # check for this function that was not in libcapplet 1.2.
 
   ac_save_CPPFLAGS="$CPPFLAGS"
   fi
 
 
+  GNOME_DATADIR=""
+  if test "$have_gnome" = yes -a "$have_gtk" = yes; then
+    if test -n "$gnome_config"; then
+      GNOME_DATADIR=`$gnome_config --datadir`
+    else
+      #### is this right?
+      GNOME_DATADIR=`$pkg_config --variable=prefix gtk+`
+      GNOME_DATADIR="$GNOME_DATADIR/share"
+    fi
+  fi
+
+  # .desktop files go in different places in Gnome 1.x and Gnome 2.x...
+  if test "$have_gtk2" = yes; then
+    GNOME_PANELDIR='$(GNOME_PANELDIR2)'
+  else
+    GNOME_PANELDIR='$(GNOME_PANELDIR1)'
+  fi
+
+
   if test "$have_gtk" = yes; then
     INCLUDES="$INCLUDES $ac_gtk_config_cflags"
     GTK_LIBS="$GTK_LIBS $ac_gtk_config_libs"
 #define HAVE_GTK 1
 _ACEOF
 
+
+    if test "$have_gtk2" = yes; then
+      GTK_EXTRA_OBJS=""
+    else
+      GTK_EXTRA_OBJS="\$(GTK_EXTRA_OBJS)"
+    fi
   fi
 
 fi
@@ -12886,7 +13087,52 @@ if test "$with_xml" = yes; then
     xml_path="$foo:$xml_path"
   fi
 
-  for ac_prog in xml2-config xml-config
+  if test -n "$pkg_config" ; then
+    #
+    # the new way...
+    # run pkg-config based tests.
+    #
+    pkgs=""
+    ok="yes"
+    pkg_check_version xml2 1.0
+
+    if test "$ok" = no; then
+      ok=yes
+      pkg_check_version xml 1.0
+    fi
+
+    have_xml="$ok"
+
+    if test "$have_xml" = yes; then
+      echo "$as_me:$LINENO: checking for XML includes" >&5
+echo $ECHO_N "checking for XML includes... $ECHO_C" >&6
+if test "${ac_cv_xml_config_cflags+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_xml_config_cflags=`$pkg_config --cflags $pkgs`
+fi
+echo "$as_me:$LINENO: result: $ac_cv_xml_config_cflags" >&5
+echo "${ECHO_T}$ac_cv_xml_config_cflags" >&6
+      echo "$as_me:$LINENO: checking for XML libs" >&5
+echo $ECHO_N "checking for XML libs... $ECHO_C" >&6
+if test "${ac_cv_xml_config_libs+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_xml_config_libs=`$pkg_config --libs $pkgs`
+fi
+echo "$as_me:$LINENO: result: $ac_cv_xml_config_libs" >&5
+echo "${ECHO_T}$ac_cv_xml_config_libs" >&6
+      ac_xml_config_cflags=$ac_cv_xml_config_cflags
+      ac_xml_config_libs=$ac_cv_xml_config_libs
+    fi
+
+  else
+    #
+    # the old way...
+    # run {gnome,gtk}-config based tests.
+    #
+
+    for ac_prog in xml2-config xml-config
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 done
 
 
-  # If we found the xml-config program, run it to get flags.
-  #
-  if test -n "$xml_config" ; then
-    echo "$as_me:$LINENO: checking for XML includes" >&5
+    # If we found the xml-config program, run it to get flags.
+    #
+    if test -n "$xml_config" ; then
+      echo "$as_me:$LINENO: checking for XML includes" >&5
 echo $ECHO_N "checking for XML includes... $ECHO_C" >&6
 if test "${ac_cv_xml_config_cflags+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -12943,7 +13189,7 @@ else
 fi
 echo "$as_me:$LINENO: result: $ac_cv_xml_config_cflags" >&5
 echo "${ECHO_T}$ac_cv_xml_config_cflags" >&6
-    echo "$as_me:$LINENO: checking for XML libs" >&5
+      echo "$as_me:$LINENO: checking for XML libs" >&5
 echo $ECHO_N "checking for XML libs... $ECHO_C" >&6
 if test "${ac_cv_xml_config_libs+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -12952,15 +13198,15 @@ else
 fi
 echo "$as_me:$LINENO: result: $ac_cv_xml_config_libs" >&5
 echo "${ECHO_T}$ac_cv_xml_config_libs" >&6
-    ac_xml_config_cflags=$ac_cv_xml_config_cflags
-    ac_xml_config_libs=$ac_cv_xml_config_libs
-  fi
+      ac_xml_config_cflags=$ac_cv_xml_config_cflags
+      ac_xml_config_libs=$ac_cv_xml_config_libs
+    fi
 
-  ac_save_xml_CPPFLAGS="$CPPFLAGS"
-  CPPFLAGS="$CPPFLAGS $ac_xml_config_cflags"
+    ac_save_xml_CPPFLAGS="$CPPFLAGS"
+    CPPFLAGS="$CPPFLAGS $ac_xml_config_cflags"
 
-  # first try <libxml/parser.h> which is the new way...
-  #
+    # first try <libxml/parser.h> which is the new way...
+    #
 
   ac_save_CPPFLAGS="$CPPFLAGS"
   if test \! -z "$includedir" ; then
@@ -13008,9 +13254,9 @@ fi
 
   CPPFLAGS="$ac_save_CPPFLAGS"
 
-  # if that didn't work, then try just <parser.h> which is the old way...
-  #
-  if test "$have_xml" = no; then
+    # if that didn't work, then try just <parser.h> which is the old way...
+    #
+    if test "$have_xml" = no; then
 
   ac_save_CPPFLAGS="$CPPFLAGS"
   if test \! -z "$includedir" ; then
 
 
   CPPFLAGS="$ac_save_CPPFLAGS"
+    fi
+
+    CPPFLAGS="$ac_save_xml_CPPFLAGS"
   fi
 
-  CPPFLAGS="$ac_save_xml_CPPFLAGS"
 
   have_zlib=no
   if test "$have_xml" = yes; then
@@ -14243,7 +14491,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 14252 "configure"
+#line 14500 "configure"
 #include "confdefs.h"
 #include <GL/gl.h>
 #ifndef MESA_MAJOR_VERSION
@@ -14260,20 +14508,12 @@ EOF
          fi
          CPPFLAGS="$CPPFLAGS $X_CFLAGS"
 
-# With autoconf 2.13 we could do this:
-#
-#        changequote(X,Y)
-#        mglv=`(eval "$ac_cpp conftest.$ac_ext") 2>&AC_FD_CC | sed -n \
-#             's/^configure:.*\([0-9][0-9]*\).*\([0-9][0-9]*\).*$/\1.\2/p'`
-#        changequote([,])
-#
-# but with autoconf 2.52+ (m4 1.4) that causes an error:
-#   m4: ERROR: Recursion limit of 1024 exceeded, use -L<N> to change it
-#
-# So, we need to use the autoconf line-noise macros [ for [ and ] for ]
-#
-         mglv=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | sed -n \
-              's/^configure:.*\([0-9][0-9]*\).*\([0-9][0-9]*\).*$/\1.\2/p'`
+         mglv=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | grep configure:`
+
+         # M4 sucks!!
+
+          mglv=`echo "$mglv" | sed -n \
+             's/^configure:.*\([0-9][0-9]*\).*\([0-9][0-9]*\).*$/\1.\2/p'`
 
 
          rm -f conftest.$ac_ext
 
 if test "$with_gdk_pixbuf" = yes; then
   have_gdk_pixbuf=no
+  have_gdk_pixbuf2=no
 
-  # if the user specified --with-gtk=/foo/ or --with-gnome=/foo/ then
-  # look in /foo/bin/ for for gdk-pixbuf-config.
-  #
-  gdk_pixbuf_path="$PATH"
+  if test -n "$pkg_config" ; then
+    #
+    # the new way...
+    # run pkg-config based tests.
+    #
+    pkgs=''
+    ok="yes"
+    pkg_check_version gdk-pixbuf-2.0      2.0.0
+    pkg_check_version gdk-pixbuf-xlib-2.0 2.0.0
+    have_gdk_pixbuf="$ok"
+    have_gdk_pixbuf2="$ok"
+
+    if test "$have_gdk_pixbuf2" = no; then
+      #
+      # We don't have pixbuf 2.x; check for 1.x.
+      #
+      pkgs=''
+      ok="yes"
+      pkg_check_version gdk-pixbuf      0.0
+      pkg_check_version gdk-pixbuf-xlib 0.0
+      have_gdk_pixbuf="$ok"
+    fi
 
-  if test ! -z "$gtk_dir"; then
-    # canonicalize slashes.
-    foo=`echo "${gtk_dir}/bin" | sed 's@//*@/@g'`
-    gdk_pixbuf_path="$foo:$gdk_pixbuf_path"
+    if test "$have_gdk_pixbuf" = yes; then
+      echo "$as_me:$LINENO: checking for gdk-pixbuf includes" >&5
+echo $ECHO_N "checking for gdk-pixbuf includes... $ECHO_C" >&6
+if test "${ac_cv_gdk_pixbuf_config_cflags+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_gdk_pixbuf_config_cflags=`$pkg_config --cflags $pkgs`
+fi
+echo "$as_me:$LINENO: result: $ac_cv_gdk_pixbuf_config_cflags" >&5
+echo "${ECHO_T}$ac_cv_gdk_pixbuf_config_cflags" >&6
+      echo "$as_me:$LINENO: checking for gdk-pixbuf libs" >&5
+echo $ECHO_N "checking for gdk-pixbuf libs... $ECHO_C" >&6
+if test "${ac_cv_gdk_pixbuf_config_libs+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_gdk_pixbuf_config_libs=`$pkg_config --libs $pkgs`
+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
   fi
 
-  if test ! -z "$gnome_dir"; then
-    # canonicalize slashes.
-    foo=`echo "${gnome_dir}/bin" | sed 's@//*@/@g'`
-    gdk_pixbuf_path="$foo:$gdk_pixbuf_path"
-  fi
+  if test "$have_gdk_pixbuf" = no; then
+    #
+    # the old way...
+    # run gdk-pixbuf-config based tests.
+    # note that we can't assume that the existence of "pkg-config" means
+    # that we don't have to look for gdk-pixbuf-config -- in Gnome 1.4,
+    # pkg-config exists, but doesn't know about pixbuf.
+    #
 
-  for ac_prog in gdk-pixbuf-config
+    # if the user specified --with-gtk=/foo/ or --with-gnome=/foo/ then
+    # look in /foo/bin/ for for gdk-pixbuf-config.
+    #
+    gdk_pixbuf_path="$PATH"
+
+    if test ! -z "$gtk_dir"; then
+      # canonicalize slashes.
+      foo=`echo "${gtk_dir}/bin" | sed 's@//*@/@g'`
+      gdk_pixbuf_path="$foo:$gdk_pixbuf_path"
+    fi
+
+    if test ! -z "$gnome_dir"; then
+      # canonicalize slashes.
+      foo=`echo "${gnome_dir}/bin" | sed 's@//*@/@g'`
+      gdk_pixbuf_path="$foo:$gdk_pixbuf_path"
+    fi
+
+    for ac_prog in gdk-pixbuf-config
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 done
 
 
-  # If we found the gdk-pixbuf-config program, run it to get flags.
-  #
-  if test -n "$gdk_pixbuf_config" ; then
-    echo "$as_me:$LINENO: checking for gdk-pixbuf includes" >&5
+    # If we found the gdk-pixbuf-config program, run it to get flags.
+    #
+    if test -n "$gdk_pixbuf_config" ; then
+      echo "$as_me:$LINENO: checking for gdk-pixbuf includes" >&5
 echo $ECHO_N "checking for gdk-pixbuf includes... $ECHO_C" >&6
 if test "${ac_cv_gdk_pixbuf_config_cflags+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -15191,7 +15488,7 @@ else
 fi
 echo "$as_me:$LINENO: result: $ac_cv_gdk_pixbuf_config_cflags" >&5
 echo "${ECHO_T}$ac_cv_gdk_pixbuf_config_cflags" >&6
-    echo "$as_me:$LINENO: checking for gdk-pixbuf libs" >&5
+      echo "$as_me:$LINENO: checking for gdk-pixbuf libs" >&5
 echo $ECHO_N "checking for gdk-pixbuf libs... $ECHO_C" >&6
 if test "${ac_cv_gdk_pixbuf_config_libs+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -15200,14 +15497,33 @@ else
 fi
 echo "$as_me:$LINENO: result: $ac_cv_gdk_pixbuf_config_libs" >&5
 echo "${ECHO_T}$ac_cv_gdk_pixbuf_config_libs" >&6
-    ac_gdk_pixbuf_config_cflags=$ac_cv_gdk_pixbuf_config_cflags
-    ac_gdk_pixbuf_config_libs=$ac_cv_gdk_pixbuf_config_libs
+
+      # note that "gdk-pixbuf-config --libs" produces a link line including
+      # -lgdk_pixbuf, but there's no way to get it to produce one that also
+      # includes -lgdk_pixbuf_xlib.  Since we don't know *exactly* what the
+      # name of the library will be, construct it with sed...
+      # M4 sucks!!
+
+      ac_cv_gdk_pixbuf_config_libs=`echo $ac_cv_gdk_pixbuf_config_libs | \
+       sed 's@ \(-lgdk_pixbuf\([-_a-zA-Z0-9.]*\)\) @ \1 -lgdk_pixbuf_xlib\2 @'`
+
+
+      ac_gdk_pixbuf_config_cflags=$ac_cv_gdk_pixbuf_config_cflags
+      ac_gdk_pixbuf_config_libs=$ac_cv_gdk_pixbuf_config_libs
+    fi
   fi
 
   ac_save_gdk_pixbuf_CPPFLAGS="$CPPFLAGS"
   CPPFLAGS="$CPPFLAGS $ac_gdk_pixbuf_config_cflags"
 
-  # check for header 1...
+  if test "$have_gdk_pixbuf" = no; then
+    #
+    # we appear to have pixbuf; check for headers/libs to be sure.
+    #
+
+    have_gdk_pixbuf=no
+
+    # check for header 1...
 
   ac_save_CPPFLAGS="$CPPFLAGS"
   if test \! -z "$includedir" ; then
 
   CPPFLAGS="$ac_save_CPPFLAGS"
 
-  # if that worked, check for header 2...
-  if test "$have_gdk_pixbuf" = yes; then
-    have_gdk_pixbuf=no
+    # if that worked, check for header 2...
+    if test "$have_gdk_pixbuf" = yes; then
+      have_gdk_pixbuf=no
+      gdk_pixbuf_halfassed=yes
 
   ac_save_CPPFLAGS="$CPPFLAGS"
   if test \! -z "$includedir" ; then
@@ -15434,10 +15751,132 @@ echo "${ECHO_T}$ac_cv_header_gdk_pixbuf_gdk_pixbuf_xlib_h" >&6
 fi
 if test $ac_cv_header_gdk_pixbuf_gdk_pixbuf_xlib_h = yes; then
   have_gdk_pixbuf=yes
+                         gdk_pixbuf_halfassed=no
+fi
+
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+
+      # yay, it has a new name in GTK2...
+      if test "$have_gdk_pixbuf" = no; then
+        have_gdk_pixbuf=no
+        gdk_pixbuf_halfassed=yes
+
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  if test "${ac_cv_header_gdk_pixbuf_xlib_gdk_pixbuf_xlib_h+set}" = set; then
+  echo "$as_me:$LINENO: checking for gdk-pixbuf-xlib/gdk-pixbuf-xlib.h" >&5
+echo $ECHO_N "checking for gdk-pixbuf-xlib/gdk-pixbuf-xlib.h... $ECHO_C" >&6
+if test "${ac_cv_header_gdk_pixbuf_xlib_gdk_pixbuf_xlib_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_gdk_pixbuf_xlib_gdk_pixbuf_xlib_h" >&5
+echo "${ECHO_T}$ac_cv_header_gdk_pixbuf_xlib_gdk_pixbuf_xlib_h" >&6
+else
+  # Is the header compilable?
+echo "$as_me:$LINENO: checking gdk-pixbuf-xlib/gdk-pixbuf-xlib.h usability" >&5
+echo $ECHO_N "checking gdk-pixbuf-xlib/gdk-pixbuf-xlib.h usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+$ac_includes_default
+#include <gdk-pixbuf-xlib/gdk-pixbuf-xlib.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (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_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_header_compiler=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking gdk-pixbuf-xlib/gdk-pixbuf-xlib.h presence" >&5
+echo $ECHO_N "checking gdk-pixbuf-xlib/gdk-pixbuf-xlib.h presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+#include "confdefs.h"
+#include <gdk-pixbuf-xlib/gdk-pixbuf-xlib.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc in
+  yes:no )
+    { echo "$as_me:$LINENO: WARNING: gdk-pixbuf-xlib/gdk-pixbuf-xlib.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: gdk-pixbuf-xlib/gdk-pixbuf-xlib.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: gdk-pixbuf-xlib/gdk-pixbuf-xlib.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: gdk-pixbuf-xlib/gdk-pixbuf-xlib.h: proceeding with the preprocessor's result" >&2;};;
+  no:yes )
+    { echo "$as_me:$LINENO: WARNING: gdk-pixbuf-xlib/gdk-pixbuf-xlib.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: gdk-pixbuf-xlib/gdk-pixbuf-xlib.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: gdk-pixbuf-xlib/gdk-pixbuf-xlib.h: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: gdk-pixbuf-xlib/gdk-pixbuf-xlib.h: check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: gdk-pixbuf-xlib/gdk-pixbuf-xlib.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: gdk-pixbuf-xlib/gdk-pixbuf-xlib.h: proceeding with the preprocessor's result" >&2;};;
+esac
+echo "$as_me:$LINENO: checking for gdk-pixbuf-xlib/gdk-pixbuf-xlib.h" >&5
+echo $ECHO_N "checking for gdk-pixbuf-xlib/gdk-pixbuf-xlib.h... $ECHO_C" >&6
+if test "${ac_cv_header_gdk_pixbuf_xlib_gdk_pixbuf_xlib_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_header_gdk_pixbuf_xlib_gdk_pixbuf_xlib_h=$ac_header_preproc
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_gdk_pixbuf_xlib_gdk_pixbuf_xlib_h" >&5
+echo "${ECHO_T}$ac_cv_header_gdk_pixbuf_xlib_gdk_pixbuf_xlib_h" >&6
+
+fi
+if test $ac_cv_header_gdk_pixbuf_xlib_gdk_pixbuf_xlib_h = yes; then
+  have_gdk_pixbuf=yes
+                           gdk_pixbuf_halfassed=no
 fi
 
 
   CPPFLAGS="$ac_save_CPPFLAGS"
+      fi
+    fi
   fi
 
   CPPFLAGS="$ac_save_gdk_pixbuf_CPPFLAGS"
@@ -15446,6 +15885,7 @@ fi
     # we have the headers, now check for the libraries
     have_gdk_pixbuf=no
     gdk_pixbuf_halfassed=yes
+
     # library 1...
 
   ac_save_CPPFLAGS="$CPPFLAGS"
   # note: $X_LIBS includes $x_libraries
   LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
 
-  echo "$as_me:$LINENO: checking for gdk_pixbuf_new_from_file in -lgdk_pixbuf" >&5
-echo $ECHO_N "checking for gdk_pixbuf_new_from_file in -lgdk_pixbuf... $ECHO_C" >&6
-if test "${ac_cv_lib_gdk_pixbuf_gdk_pixbuf_new_from_file+set}" = set; then
+  echo "$as_me:$LINENO: checking for gdk_pixbuf_new_from_file in -lc" >&5
+echo $ECHO_N "checking for gdk_pixbuf_new_from_file in -lc... $ECHO_C" >&6
+if test "${ac_cv_lib_c_gdk_pixbuf_new_from_file+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-lgdk_pixbuf $ac_gdk_pixbuf_config_libs $LIBS"
+LIBS="-lc $ac_gdk_pixbuf_config_libs -lX11 -lXext -lm $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
 #include "confdefs.h"
@@ -15508,21 +15948,19 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_lib_gdk_pixbuf_gdk_pixbuf_new_from_file=yes
+  ac_cv_lib_c_gdk_pixbuf_new_from_file=yes
 else
   echo "$as_me: failed program was:" >&5
 cat conftest.$ac_ext >&5
-ac_cv_lib_gdk_pixbuf_gdk_pixbuf_new_from_file=no
+ac_cv_lib_c_gdk_pixbuf_new_from_file=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_gdk_pixbuf_gdk_pixbuf_new_from_file" >&5
-echo "${ECHO_T}$ac_cv_lib_gdk_pixbuf_gdk_pixbuf_new_from_file" >&6
-if test $ac_cv_lib_gdk_pixbuf_gdk_pixbuf_new_from_file = yes; then
+echo "$as_me:$LINENO: result: $ac_cv_lib_c_gdk_pixbuf_new_from_file" >&5
+echo "${ECHO_T}$ac_cv_lib_c_gdk_pixbuf_new_from_file" >&6
+if test $ac_cv_lib_c_gdk_pixbuf_new_from_file = yes; then
   have_gdk_pixbuf=yes
-else
-  true
 fi
 
   CPPFLAGS="$ac_save_CPPFLAGS"
@@ -15531,6 +15969,7 @@ fi
 
     # library 2...
     if test "$have_gdk_pixbuf" = yes; then
+      have_gdk_pixbuf=no
 
   ac_save_CPPFLAGS="$CPPFLAGS"
   ac_save_LDFLAGS="$LDFLAGS"
   # note: $X_LIBS includes $x_libraries
   LDFLAGS="$LDFLAGS $X_LIBS $X_EXTRA_LIBS"
 
-  echo "$as_me:$LINENO: checking for gdk_pixbuf_xlib_init in -lgdk_pixbuf_xlib" >&5
-echo $ECHO_N "checking for gdk_pixbuf_xlib_init in -lgdk_pixbuf_xlib... $ECHO_C" >&6
-if test "${ac_cv_lib_gdk_pixbuf_xlib_gdk_pixbuf_xlib_init+set}" = set; then
+  echo "$as_me:$LINENO: checking for gdk_pixbuf_xlib_init in -lc" >&5
+echo $ECHO_N "checking for gdk_pixbuf_xlib_init in -lc... $ECHO_C" >&6
+if test "${ac_cv_lib_c_gdk_pixbuf_xlib_init+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-lgdk_pixbuf_xlib $ac_gdk_pixbuf_config_libs $LIBS"
+LIBS="-lc $ac_gdk_pixbuf_config_libs -lX11 -lXext -lm $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
 #include "confdefs.h"
@@ -15592,22 +16031,20 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_lib_gdk_pixbuf_xlib_gdk_pixbuf_xlib_init=yes
+  ac_cv_lib_c_gdk_pixbuf_xlib_init=yes
 else
   echo "$as_me: failed program was:" >&5
 cat conftest.$ac_ext >&5
-ac_cv_lib_gdk_pixbuf_xlib_gdk_pixbuf_xlib_init=no
+ac_cv_lib_c_gdk_pixbuf_xlib_init=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_gdk_pixbuf_xlib_gdk_pixbuf_xlib_init" >&5
-echo "${ECHO_T}$ac_cv_lib_gdk_pixbuf_xlib_gdk_pixbuf_xlib_init" >&6
-if test $ac_cv_lib_gdk_pixbuf_xlib_gdk_pixbuf_xlib_init = yes; then
+echo "$as_me:$LINENO: result: $ac_cv_lib_c_gdk_pixbuf_xlib_init" >&5
+echo "${ECHO_T}$ac_cv_lib_c_gdk_pixbuf_xlib_init" >&6
+if test $ac_cv_lib_c_gdk_pixbuf_xlib_init = yes; then
   have_gdk_pixbuf=yes
                       gdk_pixbuf_halfassed=no
-else
-  true
 fi
 
   CPPFLAGS="$ac_save_CPPFLAGS"
 
   if test "$have_gdk_pixbuf" = yes; then
     INCLUDES="$INCLUDES $ac_gdk_pixbuf_config_cflags"
-    XPM_LIBS="$ac_gdk_pixbuf_config_libs -lgdk_pixbuf -lgdk_pixbuf_xlib"
+    XPM_LIBS="$ac_gdk_pixbuf_config_libs"
     cat >>confdefs.h <<\_ACEOF
 #define HAVE_GDK_PIXBUF 1
 _ACEOF
 
+  else
+    have_gdk_pixbuf2=no
   fi
 fi
 
 
 
 
-# After computing $HACK_CONF_DIR, make sure $GTK_ICONDIR has a value
+# After computing $HACK_CONF_DIR, make sure $GLADE_DATADIR has a value
 # so that we know where to install the Gtk pixmaps.
 #
 if test -n "$GNOME_DATADIR" ; then
-  GTK_ICONDIR='$(GNOME_DATADIR)/pixmaps'
+  GLADE_DATADIR='$(GNOME_DATADIR)/xscreensaver'
 elif test "$have_gtk" = yes; then
   # should this be "$(prefix)/share/pixmaps"? But /usr/X11R6/share/ is wrong...
-  GTK_ICONDIR='/usr/share/pixmaps'
+  GLADE_DATADIR='/usr/share/xscreensaver'
 else
-  GTK_ICONDIR=''
+  GLADE_DATADIR=''
 fi
 
 
@@ -17090,6 +17529,8 @@ HACK_CONF_DIR=`echo "${HACK_CONF_DIR}" | sed 's@/$@@;s@//*@/@g'`
 
 
 
+
+
 
 
 
@@ -17742,6 +18183,7 @@ s,@INTLOBJS@,$INTLOBJS,;t t
 s,@POFILES@,$POFILES,;t t
 s,@POSUB@,$POSUB,;t t
 s,@MKINSTALLDIRS@,$MKINSTALLDIRS,;t t
+s,@pkg_config@,$pkg_config,;t t
 s,@glib_config@,$glib_config,;t t
 s,@gtk_config@,$gtk_config,;t t
 s,@gnome_config@,$gnome_config,;t t
@@ -17790,8 +18232,10 @@ s,@GNOMEHELP_Y@,$GNOMEHELP_Y,;t t
 s,@GNOMEHELP_N@,$GNOMEHELP_N,;t t
 s,@HACKDIR@,$HACKDIR,;t t
 s,@GNOME_DATADIR@,$GNOME_DATADIR,;t t
-s,@GTK_ICONDIR@,$GTK_ICONDIR,;t t
+s,@GLADE_DATADIR@,$GLADE_DATADIR,;t t
+s,@GNOME_PANELDIR@,$GNOME_PANELDIR,;t t
 s,@HACK_CONF_DIR@,$HACK_CONF_DIR,;t t
+s,@GTK_EXTRA_OBJS@,$GTK_EXTRA_OBJS,;t t
 s,@APPDEFAULTS@,$APPDEFAULTS,;t t
 s,@DEPEND@,$DEPEND,;t t
 s,@DEPEND_FLAGS@,$DEPEND_FLAGS,;t t
@@ -18456,7 +18900,6 @@ elif test "$jurassic_gtk" = yes ; then
 elif test "$with_gtk_req" = yes -a "$have_gtk" = no ; then
   warnL "Use of Gtk was requested, but it wasn't found;"
   warn2 "Motif will be used instead."
-
 fi
 
 
@@ -18535,9 +18978,10 @@ if test "$with_gdk_pixbuf_req" = yes  -a "$have_gdk_pixbuf" = no; then
   warnL 'Use of GDK-Pixbuf was requested, but it was not found.'
 fi
 
-if test "$have_xpm" = no -a "$have_gdk_pixbuf" = no; then
+if test "$have_xpm" = no -a "$have_gdk_pixbuf" = no || \
+   test "$gdk_pixbuf_halfassed" = yes; then
 
-  if test "$with_xpm_req" = yes ; then
+  if test "$with_xpm_req" = yes -o "$have_xpm" = yes ; then
     true
   elif test "$with_xpm_req" = no ; then
     warnL 'The XPM library is not being used.'
index ae0e4930b02784d5a353e2d29cb396b1db07aa08..901b5a23a02063a67ae8120877436c3e947df445 100644 (file)
@@ -1,7 +1,7 @@
 # configure.in --- xscreensaver, Copyright (c) 1997-2000 Jamie Zawinski.
 #
 
-AC_PREREQ(2.53)
+AC_PREREQ(2.52)
 AC_INIT(driver/subprocs.c)
 AC_CONFIG_HEADER(config.h)
 
@@ -98,7 +98,7 @@ AC_DEFUN(AC_GCC_ACCEPTS_STD,
  [if test -n "$GCC"; then
    AC_CACHE_CHECK([whether gcc accepts -std],
      ac_cv_gcc_accepts_std,
-    [if ( gcc -E -std=c89 - </dev/null >/dev/null 2>&1 | \
+    [if ( ( gcc -E -std=c89 - </dev/null >/dev/null ) 2>&1 | \
           grep unrecognized >/dev/null ); then
        ac_cv_gcc_accepts_std=no
      else
@@ -808,7 +808,9 @@ AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE")
 AC_DEFINE_UNQUOTED(PACKAGE, "$GETTEXT_PACKAGE")
 AC_SUBST(GETTEXT_PACKAGE)
 
-ALL_LINGUAS="ca de et fr it ko pl pt sv da es fi hu ja no pt pt_BR ru wa"
+# #### no sign of  en_GB
+#ALL_LINGUAS="ca de en_GB et fr it ko pl sv da es fi hu ja no pt pt_BR ru wa"
+ALL_LINGUAS="ca de et fr it ko pl sv da es fi hu ja no pt pt_BR ru wa"
 AM_GLIB_GNU_GETTEXT
 
 
@@ -1371,8 +1373,7 @@ AC_ARG_ENABLE(locking,[
 Screen locking options:
 
   --enable-locking        Compile in support for locking the display.
-  --disable-locking       Do not allow locking at all.
-],
+  --disable-locking       Do not allow locking at all.],
   [enable_locking="$enableval"],[enable_locking=yes])
 if test "$enable_locking" = yes; then
   true
@@ -1425,7 +1426,6 @@ fi
 #fi
 
 
-
 ###############################################################################
 #
 #       Check for PAM.
@@ -1779,7 +1779,8 @@ with_motif_req=unspecified
 AC_ARG_WITH(motif,[
 User interface options:
 
-  --with-motif            Use the Motif toolkit for the user interface.],
+  --with-motif            Use the Motif toolkit for the user interface
+                          (not recommended.)],
   [with_motif="$withval"; with_motif_req="$withval"],[with_motif=yes])
 
 HANDLE_X_PATH_ARG(with_motif, --with-motif, Motif)
@@ -1816,6 +1817,7 @@ fi
 ###############################################################################
 
 have_gtk=no
+have_gtk2=no
 with_gtk_req=unspecified
 AC_ARG_WITH(gtk,
 [  --with-gtk              Use the Gtk toolkit for the user interface.],
@@ -1842,7 +1844,9 @@ fi
 have_gnome=no
 with_gnome_req=unspecified
 AC_ARG_WITH(gnome,
-[  --with-gnome            Include support for the Gnome Control Center.],
+[  --with-gnome            Include support for the Gnome 1.x Control Center.
+                          (This option is not needed with GTK 2.x / Gnome 2.x.)
+],
   [with_gnome="$withval"; with_gnome_req="$withval"],[with_gnome=yes])
 
 # if --with-gnome=/directory/ was specified, remember that directory so that
@@ -1863,6 +1867,19 @@ if test "$with_gnome" != yes -a "$with_gnome" != no ; then
   exit 1
 fi
 
+parse_gtk_version_string() {
+  # M4 sucks!!
+  changequote(X,Y)
+  maj=`echo $ac_gtk_version_string | sed -n 's/\..*//p'`
+  min=`echo $ac_gtk_version_string | sed -n 's/[^.]*\.\([^.]*\).*/\1/p'`
+  changequote([,])
+  ac_gtk_version=`echo "$maj * 1000 + $min" | bc`
+  if test -z "$ac_gtk_version"; then
+    ac_gtk_version=unknown
+    ac_gtk_version_string=unknown
+  fi
+}
+
 
 jurassic_gtk=no
 if test "$with_gtk" = yes; then
@@ -1885,104 +1902,193 @@ if test "$with_gtk" = yes; then
     gtk_path="$foo:$gtk_path"
   fi
 
-  AC_PATH_PROGS(glib_config,  glib12-config glib-config,,  $gtk_path)
-  AC_PATH_PROGS(gtk_config,   gtk12-config  gtk-config,,   $gtk_path)
+  AC_PATH_PROGS(pkg_config, pkg-config,, $gtk_path)
 
-  if test "$with_gnome" = yes; then
-    AC_PATH_PROGS(gnome_config, gnome-config,, $gtk_path)
-  fi
+  if test -n "$pkg_config" ; then
+    #
+    # the new way...
+    # run pkg-config based tests.
+    #
 
-  if test -n "$glib_config" -a  -n "$gtk_config" ; then
-    have_gtk=yes
-    if test "$with_gnome" = yes -a -n "$gnome_config" ; then
-      have_gnome=yes
+    pkgs=''
+    pkg_check_version() {
+      if test "$ok" = yes ; then
+        req="$1"
+        min="$2"
+        AC_MSG_CHECKING(for $req)
+        if $pkg_config --exists "$req" ; then
+          vers=`$pkg_config --modversion "$req"`
+          if $pkg_config --exists "$req >= $min" ; then
+            AC_MSG_RESULT($vers)
+            pkgs="$pkgs $req"
+            return 1
+          else
+            AC_MSG_RESULT($vers (wanted >= $min))
+            ok=no
+            return 0
+          fi
+        else
+          AC_MSG_RESULT(no)
+          ok=no
+          return 0
+        fi
+      fi
+    }
+
+    ok="yes"
+    pkg_check_version     gtk+-2.0  2.0.1  ; ac_gtk_version_string="$vers"
+    pkg_check_version  gmodule-2.0  2.0.0
+    pkg_check_version   libxml-2.0  2.4.6
+    pkg_check_version libglade-2.0  1.99.0
+    have_gtk="$ok"
+
+    if test "$have_gtk" = yes; then
+      have_gtk2=yes
+      AC_DEFINE(HAVE_GTK2)
     fi
-  fi
 
-  if test "$have_gtk" = yes; then
-    AC_CACHE_CHECK([Gtk version number], ac_cv_gtk_version_string,
-                   [ac_cv_gtk_version_string=`$gtk_config --version`])
-    ac_gtk_version_string=$ac_cv_gtk_version_string
-    # M4 sucks!!
-    changequote(X,Y)
-    maj=`echo $ac_gtk_version_string | sed -n 's/\..*//p'`
-    min=`echo $ac_gtk_version_string | sed -n 's/[^.]*\.\([^.]*\).*/\1/p'`
-    changequote([,])
-    ac_gtk_version=`echo "$maj * 1000 + $min" | bc`
-    if test -z "$ac_gtk_version"; then
-      ac_gtk_version=unknown
-      ac_gtk_version_string=unknown
+    if test "$have_gtk" = no; then
+      #
+      # we don't have GTK 2.  Let's look for GTK 1.
+      #
+      pkgs=''
+      ok="yes"
+      pkg_check_version gtk+ 1.2           ; ac_gtk_version_string="$vers"
+      pkg_check_version glib 1.0
+      have_gtk="$ok"
+
+      # Now check for Gnome...
+      #
+      if test "$have_gtk" = yes; then
+        old_pkgs="$pkgs"
+        ok=yes
+        pkg_check_version capplet    1.0
+        pkg_check_version gnomeui    1.0
+        pkg_check_version gdk_pixbuf 0.1
+        have_gnome="$ok"
+
+        if test "$have_gnome" = no; then
+          pkgs="$old_pkgs"
+        else
+          AC_DEFINE(HAVE_CRAPPLET)
+        fi
+      fi
+    fi
+
+    if test "$have_gtk" = yes; then
+      parse_gtk_version_string
+      jurassic_gtk=no
+    else
+      have_gnome=no
+    fi
+
+    if test "$have_gtk" = yes; then
+      AC_CACHE_CHECK([for Gtk includes], ac_cv_gtk_config_cflags,
+                     [ac_cv_gtk_config_cflags=`$pkg_config --cflags $pkgs`])
+      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
+
+    ac_gnome_config_cflags=$ac_gtk_config_cflags
+    ac_gnome_config_libs=$ac_gtk_config_libs
+
+  else
+    #
+    # the old way...
+    # run {gnome,gtk}-config based tests.
+    #
+
+    AC_PATH_PROGS(glib_config,  glib12-config glib-config,,  $gtk_path)
+    AC_PATH_PROGS(gtk_config,   gtk12-config  gtk-config,,   $gtk_path)
+
+    if test "$with_gnome" = yes; then
+      AC_PATH_PROGS(gnome_config, gnome-config,, $gtk_path)
+    fi
+
+    if test -n "$glib_config" -a  -n "$gtk_config" ; then
+      have_gtk=yes
+      if test "$with_gnome" = yes -a -n "$gnome_config" ; then
+        have_gnome=yes
+      fi
+    fi
+
+    if test "$have_gtk" = yes; then
+      AC_CACHE_CHECK([Gtk version number], ac_cv_gtk_version_string,
+                     [ac_cv_gtk_version_string=`$gtk_config --version`])
+      ac_gtk_version_string=$ac_cv_gtk_version_string
     fi
+
+    parse_gtk_version_string
+
     if test "$ac_gtk_version" = "unknown" || test "$ac_gtk_version" -lt 1002
     then
       have_gtk=no
       have_gnome=no
       jurassic_gtk=yes
     fi
-  fi
-
-  if test "$have_gtk" = yes; then
-    AC_CACHE_CHECK([for Gtk includes], ac_cv_gtk_config_cflags,
-                   [ac_cv_gtk_config_cflags=`$gtk_config --cflags`])
-    AC_CACHE_CHECK([for Gtk libs], ac_cv_gtk_config_libs,
-                   [ac_cv_gtk_config_libs=`$gtk_config --libs`])
-  fi
-  ac_gtk_config_cflags=$ac_cv_gtk_config_cflags
-  ac_gtk_config_libs=$ac_cv_gtk_config_libs
 
-  # Check for Gnome Capplet support.
-  #
-  if test "$have_gnome" = yes -a "$have_gtk" = yes; then
-    gnome_config_libs="gtk capplet gnomeui gdk_pixbuf"
-    AC_MSG_CHECKING(for Gnome capplet includes)
-    AC_CACHE_VAL(ac_cv_gnome_config_cflags,
-      [if ( $gnome_config --cflags $gnome_config_libs >/dev/null 2>&1 | \
-            grep Unknown >/dev/null ) ; then
-         ac_cv_gnome_config_cflags=''
-       else
-         ac_cv_gnome_config_cflags=`$gnome_config --cflags $gnome_config_libs`
-       fi])
-    ac_gnome_config_cflags=$ac_cv_gnome_config_cflags
-    if test "$ac_gnome_config_cflags" = "" ; then
-      have_gnome=no
-      AC_MSG_RESULT(no)
-    else
-      AC_MSG_RESULT($ac_gnome_config_cflags)
+    if test "$have_gtk" = yes; then
+      AC_CACHE_CHECK([for Gtk includes], ac_cv_gtk_config_cflags,
+                     [ac_cv_gtk_config_cflags=`$gtk_config --cflags`])
+      AC_CACHE_CHECK([for Gtk libs], ac_cv_gtk_config_libs,
+                     [ac_cv_gtk_config_libs=`$gtk_config --libs`])
     fi
-  fi
+    ac_gtk_config_cflags=$ac_cv_gtk_config_cflags
+    ac_gtk_config_libs=$ac_cv_gtk_config_libs
 
-  if test "$have_gnome" = yes -a "$have_gtk" = yes; then
-    AC_MSG_CHECKING(for Gnome capplet libs)
-    AC_CACHE_VAL(ac_cv_gnome_config_libs,
-      [if ( $gnome_config --libs $gnome_config_libs >/dev/null 2>&1 |
-            grep Unknown >/dev/null ) ; then
-         ac_cv_gnome_config_libs=''
-       else
-         ac_cv_gnome_config_libs=`$gnome_config --libs $gnome_config_libs`
-       fi])
-    ac_gnome_config_libs=$ac_cv_gnome_config_libs
-    if test "$ac_gnome_config_libs" = "" ; then
-      have_gnome=no
-      AC_MSG_RESULT(no)
-    else
-      AC_MSG_RESULT($ac_gnome_config_libs)
+    # Check for Gnome Capplet support.
+    #
+    if test "$have_gnome" = yes -a "$have_gtk" = yes; then
+      gnome_config_libs="gtk capplet gnomeui gdk_pixbuf"
+      AC_MSG_CHECKING(for Gnome capplet includes)
+      AC_CACHE_VAL(ac_cv_gnome_config_cflags,
+        [if ( $gnome_config --cflags $gnome_config_libs >/dev/null 2>&1 | \
+              grep Unknown >/dev/null ) ; then
+           ac_cv_gnome_config_cflags=''
+         else
+          ac_cv_gnome_config_cflags=`$gnome_config --cflags $gnome_config_libs`
+         fi])
+      ac_gnome_config_cflags=$ac_cv_gnome_config_cflags
+      if test "$ac_gnome_config_cflags" = "" ; then
+        have_gnome=no
+        AC_MSG_RESULT(no)
+      else
+        AC_MSG_RESULT($ac_gnome_config_cflags)
+      fi
     fi
-  fi
 
-  GNOME_DATADIR=""
-  if test "$have_gnome" = yes -a "$have_gtk" = yes; then
-    GNOME_DATADIR=`$gnome_config --datadir`
-  fi
+    if test "$have_gnome" = yes -a "$have_gtk" = yes; then
+      AC_MSG_CHECKING(for Gnome capplet libs)
+      AC_CACHE_VAL(ac_cv_gnome_config_libs,
+        [if ( $gnome_config --libs $gnome_config_libs >/dev/null 2>&1 |
+              grep Unknown >/dev/null ) ; then
+           ac_cv_gnome_config_libs=''
+         else
+           ac_cv_gnome_config_libs=`$gnome_config --libs $gnome_config_libs`
+         fi])
+      ac_gnome_config_libs=$ac_cv_gnome_config_libs
+      if test "$ac_gnome_config_libs" = "" ; then
+        have_gnome=no
+        AC_MSG_RESULT(no)
+      else
+        AC_MSG_RESULT($ac_gnome_config_libs)
+      fi
+    fi
 
+    # If we have Gnome, then override the gtk-config values with 
+    # the gnome-config values.
+    #
+    if test "$have_gnome" = yes -a "$have_gtk" = yes; then
+      ac_gtk_config_cflags=$ac_gnome_config_cflags
+      ac_gtk_config_libs=$ac_gnome_config_libs
+      AC_DEFINE(HAVE_CRAPPLET)
+    fi
 
-  # If we have Gnome, then override the gtk-config values with 
-  # the gnome-config values.
-  #
-  if test "$have_gnome" = yes -a "$have_gtk" = yes; then
-    ac_gtk_config_cflags=$ac_gnome_config_cflags
-    ac_gtk_config_libs=$ac_gnome_config_libs
-    AC_DEFINE(HAVE_CRAPPLET)
+  fi   # end of {gnome,gtk}-config based tests
 
+  if test "$have_gtk" = yes -a "$have_gtk2" = no; then
     # check for this function that was not in libcapplet 1.2.
     AC_CHECK_X_LIB(capplet, capplet_widget_changes_are_immediate,
                    [AC_DEFINE(HAVE_CRAPPLET_IMMEDIATE)], [true],
@@ -1990,10 +2096,35 @@ if test "$with_gtk" = yes; then
   fi
 
 
+  GNOME_DATADIR=""
+  if test "$have_gnome" = yes -a "$have_gtk" = yes; then
+    if test -n "$gnome_config"; then
+      GNOME_DATADIR=`$gnome_config --datadir`
+    else
+      #### is this right?
+      GNOME_DATADIR=`$pkg_config --variable=prefix gtk+`
+      GNOME_DATADIR="$GNOME_DATADIR/share"
+    fi
+  fi
+
+  # .desktop files go in different places in Gnome 1.x and Gnome 2.x...
+  if test "$have_gtk2" = yes; then
+    GNOME_PANELDIR='$(GNOME_PANELDIR2)'
+  else
+    GNOME_PANELDIR='$(GNOME_PANELDIR1)'
+  fi
+
+
   if test "$have_gtk" = yes; then
     INCLUDES="$INCLUDES $ac_gtk_config_cflags"
     GTK_LIBS="$GTK_LIBS $ac_gtk_config_libs"
     AC_DEFINE(HAVE_GTK)
+
+    if test "$have_gtk2" = yes; then
+      GTK_EXTRA_OBJS=""
+    else
+      GTK_EXTRA_OBJS="\$(GTK_EXTRA_OBJS)"
+    fi
   fi
 
 fi
@@ -2019,7 +2150,8 @@ with_xml_req=unspecified
 xml_halfassed=no
 AC_ARG_WITH(xml,
 [  --with-xml              The XML toolkit is needed for some parts of
-                          the Gtk interface.],
+                          the Gtk interface.  Without it, the configuration
+                          interface will be much less featureful.],
 [with_xml="$withval"; with_xml_req="$withval"],[with_xml=yes])
 
 # if --with-xml=/directory/ was specified, remember that directory so that
@@ -2061,35 +2193,68 @@ if test "$with_xml" = yes; then
     xml_path="$foo:$xml_path"
   fi
 
-  AC_PATH_PROGS(xml_config, xml2-config xml-config,, $xml_path)
+  if test -n "$pkg_config" ; then
+    #
+    # the new way...
+    # run pkg-config based tests.
+    #
+    pkgs=""
+    ok="yes"
+    pkg_check_version xml2 1.0
 
-  # If we found the xml-config program, run it to get flags.
-  #
-  if test -n "$xml_config" ; then
-    AC_CACHE_CHECK([for XML includes], ac_cv_xml_config_cflags,
-                   [ac_cv_xml_config_cflags=`$xml_config --cflags`])
-    AC_CACHE_CHECK([for XML libs], ac_cv_xml_config_libs,
-                   [ac_cv_xml_config_libs=`$xml_config --libs`])
-    ac_xml_config_cflags=$ac_cv_xml_config_cflags
-    ac_xml_config_libs=$ac_cv_xml_config_libs
-  fi
+    if test "$ok" = no; then
+      ok=yes
+      pkg_check_version xml 1.0
+    fi
 
-  ac_save_xml_CPPFLAGS="$CPPFLAGS"
-  CPPFLAGS="$CPPFLAGS $ac_xml_config_cflags"
+    have_xml="$ok"
 
-  # first try <libxml/parser.h> which is the new way...
-  #
-  AC_CHECK_X_HEADER(libxml/xmlIO.h, [have_xml=yes],,
-                    [#include <libxml/parser.h>])
+    if test "$have_xml" = yes; then
+      AC_CACHE_CHECK([for XML includes], ac_cv_xml_config_cflags,
+                     [ac_cv_xml_config_cflags=`$pkg_config --cflags $pkgs`])
+      AC_CACHE_CHECK([for XML libs], ac_cv_xml_config_libs,
+                     [ac_cv_xml_config_libs=`$pkg_config --libs $pkgs`])
+      ac_xml_config_cflags=$ac_cv_xml_config_cflags
+      ac_xml_config_libs=$ac_cv_xml_config_libs
+    fi
 
-  # if that didn't work, then try just <parser.h> which is the old way...
-  #
-  if test "$have_xml" = no; then
-    AC_CHECK_X_HEADER(xmlIO.h, [have_xml=yes; have_old_xml=yes],,
-                      [#include <parser.h>])
+  else
+    #
+    # the old way...
+    # run {gnome,gtk}-config based tests.
+    #
+
+    AC_PATH_PROGS(xml_config, xml2-config xml-config,, $xml_path)
+
+    # If we found the xml-config program, run it to get flags.
+    #
+    if test -n "$xml_config" ; then
+      AC_CACHE_CHECK([for XML includes], ac_cv_xml_config_cflags,
+                     [ac_cv_xml_config_cflags=`$xml_config --cflags`])
+      AC_CACHE_CHECK([for XML libs], ac_cv_xml_config_libs,
+                     [ac_cv_xml_config_libs=`$xml_config --libs`])
+      ac_xml_config_cflags=$ac_cv_xml_config_cflags
+      ac_xml_config_libs=$ac_cv_xml_config_libs
+    fi
+
+    ac_save_xml_CPPFLAGS="$CPPFLAGS"
+    CPPFLAGS="$CPPFLAGS $ac_xml_config_cflags"
+
+    # first try <libxml/parser.h> which is the new way...
+    #
+    AC_CHECK_X_HEADER(libxml/xmlIO.h, [have_xml=yes],,
+                      [#include <libxml/parser.h>])
+
+    # if that didn't work, then try just <parser.h> which is the old way...
+    #
+    if test "$have_xml" = no; then
+      AC_CHECK_X_HEADER(xmlIO.h, [have_xml=yes; have_old_xml=yes],,
+                        [#include <parser.h>])
+    fi
+
+    CPPFLAGS="$ac_save_xml_CPPFLAGS"
   fi
 
-  CPPFLAGS="$ac_save_xml_CPPFLAGS"
 
   have_zlib=no
   if test "$have_xml" = yes; then
@@ -2387,21 +2552,13 @@ EOF
          fi
          CPPFLAGS="$CPPFLAGS $X_CFLAGS"
 
-# With autoconf 2.13 we could do this:
-#
-#        changequote(X,Y)
-#        mglv=`(eval "$ac_cpp conftest.$ac_ext") 2>&AC_FD_CC | sed -n \
-#             's/^configure:.*\([0-9][0-9]*\).*\([0-9][0-9]*\).*$/\1.\2/p'`
-#        changequote([,])
-#
-# but with autoconf 2.52+ (m4 1.4) that causes an error:
-#   m4: ERROR: Recursion limit of 1024 exceeded, use -L<N> to change it
-#
-# So, we need to use the autoconf line-noise macros @<:@ for [ and @:>@ for ]
-#
-         mglv=`(eval "$ac_cpp conftest.$ac_ext") 2>&AC_FD_CC | sed -n \
-              's/^configure:.*\(@<:@0-9@:>@@<:@0-9@:>@*\).*\(@<:@0-9@:>@@<:@0-9@:>@*\).*$/\1.\2/p'`
+         mglv=`(eval "$ac_cpp conftest.$ac_ext") 2>&AC_FD_CC | grep configure:`
 
+         # M4 sucks!!
+         changequote(X,Y)
+          mglv=`echo "$mglv" | sed -n \
+             's/^configure:.*\([0-9][0-9]*\).*\([0-9][0-9]*\).*$/\1.\2/p'`
+         changequote([,])
 
          rm -f conftest.$ac_ext
 
@@ -2534,7 +2691,8 @@ fi
 have_xpm=no
 with_xpm_req=unspecified
 AC_ARG_WITH(xpm,
-[  --with-xpm              Include support for XPM files in some demos.],
+[  --with-xpm              Include support for XPM files in some demos.
+                          (Not needed if Pixbuf is used.)],
   [with_xpm="$withval"; with_xpm_req="$withval"],[with_xpm=yes])
 
 HANDLE_X_PATH_ARG(with_xpm, --with-xpm, XPM)
@@ -2571,7 +2729,8 @@ with_gdk_pixbuf_req=unspecified
 AC_ARG_WITH(pixbuf,
 [  --with-pixbuf           Include support for the GDK-Pixbuf library in some
                           demos, which will make it possible for them to read
-                          GIF, JPEG, and PNG files as well.],
+                          GIF, JPEG, and PNG files as well.  (The path here is
+                         ignored if GTK 2.x is being used.)],
   [with_gdk_pixbuf="$withval"; with_gdk_pixbuf_req="$withval"],
   [with_gdk_pixbuf=yes])
 
 
 if test "$with_gdk_pixbuf" = yes; then
   have_gdk_pixbuf=no
+  have_gdk_pixbuf2=no
 
-  # if the user specified --with-gtk=/foo/ or --with-gnome=/foo/ then
-  # look in /foo/bin/ for for gdk-pixbuf-config.
-  #
-  gdk_pixbuf_path="$PATH"
+  if test -n "$pkg_config" ; then
+    #
+    # the new way...
+    # run pkg-config based tests.
+    #
+    pkgs=''
+    ok="yes"
+    pkg_check_version gdk-pixbuf-2.0      2.0.0
+    pkg_check_version gdk-pixbuf-xlib-2.0 2.0.0
+    have_gdk_pixbuf="$ok"
+    have_gdk_pixbuf2="$ok"
+
+    if test "$have_gdk_pixbuf2" = no; then
+      #
+      # We don't have pixbuf 2.x; check for 1.x.
+      #
+      pkgs=''
+      ok="yes"
+      pkg_check_version gdk-pixbuf      0.0
+      pkg_check_version gdk-pixbuf-xlib 0.0
+      have_gdk_pixbuf="$ok"
+    fi
 
-  if test ! -z "$gtk_dir"; then
-    # canonicalize slashes.
-    foo=`echo "${gtk_dir}/bin" | sed 's@//*@/@g'`
-    gdk_pixbuf_path="$foo:$gdk_pixbuf_path"
+    if test "$have_gdk_pixbuf" = yes; then
+      AC_CACHE_CHECK([for gdk-pixbuf includes], ac_cv_gdk_pixbuf_config_cflags,
+                 [ac_cv_gdk_pixbuf_config_cflags=`$pkg_config --cflags $pkgs`])
+      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
   fi
 
-  if test ! -z "$gnome_dir"; then
-    # canonicalize slashes.
-    foo=`echo "${gnome_dir}/bin" | sed 's@//*@/@g'`
-    gdk_pixbuf_path="$foo:$gdk_pixbuf_path"
-  fi
+  if test "$have_gdk_pixbuf" = no; then
+    #
+    # the old way...
+    # run gdk-pixbuf-config based tests.
+    # note that we can't assume that the existence of "pkg-config" means
+    # that we don't have to look for gdk-pixbuf-config -- in Gnome 1.4,
+    # pkg-config exists, but doesn't know about pixbuf.
+    #
 
-  AC_PATH_PROGS(gdk_pixbuf_config, gdk-pixbuf-config,, $gdk_pixbuf_path)
+    # if the user specified --with-gtk=/foo/ or --with-gnome=/foo/ then
+    # look in /foo/bin/ for for gdk-pixbuf-config.
+    #
+    gdk_pixbuf_path="$PATH"
 
-  # If we found the gdk-pixbuf-config program, run it to get flags.
-  #
-  if test -n "$gdk_pixbuf_config" ; then
-    AC_CACHE_CHECK([for gdk-pixbuf includes], ac_cv_gdk_pixbuf_config_cflags,
-               [ac_cv_gdk_pixbuf_config_cflags=`$gdk_pixbuf_config --cflags`])
-    AC_CACHE_CHECK([for gdk-pixbuf libs], ac_cv_gdk_pixbuf_config_libs,
-               [ac_cv_gdk_pixbuf_config_libs=`$gdk_pixbuf_config --libs`])
-    ac_gdk_pixbuf_config_cflags=$ac_cv_gdk_pixbuf_config_cflags
-    ac_gdk_pixbuf_config_libs=$ac_cv_gdk_pixbuf_config_libs
+    if test ! -z "$gtk_dir"; then
+      # canonicalize slashes.
+      foo=`echo "${gtk_dir}/bin" | sed 's@//*@/@g'`
+      gdk_pixbuf_path="$foo:$gdk_pixbuf_path"
+    fi
+
+    if test ! -z "$gnome_dir"; then
+      # canonicalize slashes.
+      foo=`echo "${gnome_dir}/bin" | sed 's@//*@/@g'`
+      gdk_pixbuf_path="$foo:$gdk_pixbuf_path"
+    fi
+
+    AC_PATH_PROGS(gdk_pixbuf_config, gdk-pixbuf-config,, $gdk_pixbuf_path)
+
+    # If we found the gdk-pixbuf-config program, run it to get flags.
+    #
+    if test -n "$gdk_pixbuf_config" ; then
+      AC_CACHE_CHECK([for gdk-pixbuf includes], ac_cv_gdk_pixbuf_config_cflags,
+                [ac_cv_gdk_pixbuf_config_cflags=`$gdk_pixbuf_config --cflags`])
+      AC_CACHE_CHECK([for gdk-pixbuf libs], ac_cv_gdk_pixbuf_config_libs,
+                [ac_cv_gdk_pixbuf_config_libs=`$gdk_pixbuf_config --libs`])
+
+      # note that "gdk-pixbuf-config --libs" produces a link line including
+      # -lgdk_pixbuf, but there's no way to get it to produce one that also
+      # includes -lgdk_pixbuf_xlib.  Since we don't know *exactly* what the
+      # name of the library will be, construct it with sed...
+      # M4 sucks!!
+      changequote(X,Y)
+      ac_cv_gdk_pixbuf_config_libs=`echo $ac_cv_gdk_pixbuf_config_libs | \
+       sed 's@ \(-lgdk_pixbuf\([-_a-zA-Z0-9.]*\)\) @ \1 -lgdk_pixbuf_xlib\2 @'`
+      changequote([,])
+
+      ac_gdk_pixbuf_config_cflags=$ac_cv_gdk_pixbuf_config_cflags
+      ac_gdk_pixbuf_config_libs=$ac_cv_gdk_pixbuf_config_libs
+    fi
   fi
 
   ac_save_gdk_pixbuf_CPPFLAGS="$CPPFLAGS"
   CPPFLAGS="$CPPFLAGS $ac_gdk_pixbuf_config_cflags"
 
-  # check for header 1...
-  AC_CHECK_X_HEADER(gdk-pixbuf/gdk-pixbuf.h, [have_gdk_pixbuf=yes])
+  if test "$have_gdk_pixbuf" = no; then
+    #
+    # we appear to have pixbuf; check for headers/libs to be sure.
+    #
 
-  # if that worked, check for header 2...
-  if test "$have_gdk_pixbuf" = yes; then
     have_gdk_pixbuf=no
-    AC_CHECK_X_HEADER(gdk-pixbuf/gdk-pixbuf-xlib.h, [have_gdk_pixbuf=yes])
+
+    # check for header 1...
+    AC_CHECK_X_HEADER(gdk-pixbuf/gdk-pixbuf.h, [have_gdk_pixbuf=yes])
+
+    # if that worked, check for header 2...
+    if test "$have_gdk_pixbuf" = yes; then
+      have_gdk_pixbuf=no
+      gdk_pixbuf_halfassed=yes
+      AC_CHECK_X_HEADER(gdk-pixbuf/gdk-pixbuf-xlib.h,
+                        [have_gdk_pixbuf=yes
+                         gdk_pixbuf_halfassed=no])
+
+      # yay, it has a new name in GTK2...
+      if test "$have_gdk_pixbuf" = no; then
+        have_gdk_pixbuf=no
+        gdk_pixbuf_halfassed=yes
+        AC_CHECK_X_HEADER(gdk-pixbuf-xlib/gdk-pixbuf-xlib.h,
+                          [have_gdk_pixbuf=yes
+                           gdk_pixbuf_halfassed=no])
+      fi
+    fi
   fi
 
   CPPFLAGS="$ac_save_gdk_pixbuf_CPPFLAGS"
@@ -2644,24 +2878,26 @@ if test "$with_gdk_pixbuf" = yes; then
     # we have the headers, now check for the libraries
     have_gdk_pixbuf=no
     gdk_pixbuf_halfassed=yes
+
     # library 1...
-    AC_CHECK_X_LIB(gdk_pixbuf, gdk_pixbuf_new_from_file,
-                   [have_gdk_pixbuf=yes], [true],
-                   $ac_gdk_pixbuf_config_libs)
+    AC_CHECK_X_LIB(c, gdk_pixbuf_new_from_file, [have_gdk_pixbuf=yes],,
+                   $ac_gdk_pixbuf_config_libs -lX11 -lXext -lm)
     # library 2...
     if test "$have_gdk_pixbuf" = yes; then
-      AC_CHECK_X_LIB(gdk_pixbuf_xlib, gdk_pixbuf_xlib_init,
+      have_gdk_pixbuf=no
+      AC_CHECK_X_LIB(c, gdk_pixbuf_xlib_init,
                      [have_gdk_pixbuf=yes
-                      gdk_pixbuf_halfassed=no],
-                     [true],
-                     $ac_gdk_pixbuf_config_libs)
+                      gdk_pixbuf_halfassed=no],,
+                     $ac_gdk_pixbuf_config_libs -lX11 -lXext -lm)
     fi
   fi
 
   if test "$have_gdk_pixbuf" = yes; then
     INCLUDES="$INCLUDES $ac_gdk_pixbuf_config_cflags"
-    XPM_LIBS="$ac_gdk_pixbuf_config_libs -lgdk_pixbuf -lgdk_pixbuf_xlib"
+    XPM_LIBS="$ac_gdk_pixbuf_config_libs"
     AC_DEFINE(HAVE_GDK_PIXBUF)
+  else
+    have_gdk_pixbuf2=no
   fi
 fi
 
@@ -2676,9 +2912,9 @@ have_jpeg=no
 with_jpeg_req=unspecified
 jpeg_halfassed=no
 AC_ARG_WITH(jpeg,
-[  --with-jpeg             Include support for the JPEG library in some demos,
-                          which will make it possible for them to read JPEG
-                          files as well.],
+[  --with-jpeg             Include support for the JPEG library in some demos.
+                          (If this library is available, webcollage will be a
+                        . lot faster.)],
   [with_jpeg="$withval"; with_jpeg_req="$withval"],
   [with_jpeg=yes])
 
@@ -3058,16 +3294,16 @@ fi
 
 
 
-# After computing $HACK_CONF_DIR, make sure $GTK_ICONDIR has a value
+# After computing $HACK_CONF_DIR, make sure $GLADE_DATADIR has a value
 # so that we know where to install the Gtk pixmaps.
 #
 if test -n "$GNOME_DATADIR" ; then
-  GTK_ICONDIR='$(GNOME_DATADIR)/pixmaps'
+  GLADE_DATADIR='$(GNOME_DATADIR)/xscreensaver'
 elif test "$have_gtk" = yes; then
   # should this be "$(prefix)/share/pixmaps"? But /usr/X11R6/share/ is wrong...
-  GTK_ICONDIR='/usr/share/pixmaps'
+  GLADE_DATADIR='/usr/share/xscreensaver'
 else
-  GTK_ICONDIR=''
+  GLADE_DATADIR=''
 fi
 
 
@@ -3125,8 +3361,10 @@ AC_SUBST(GNOMEHELP_Y)
 AC_SUBST(GNOMEHELP_N)
 AC_SUBST(HACKDIR)
 AC_SUBST(GNOME_DATADIR)
-AC_SUBST(GTK_ICONDIR)
+AC_SUBST(GLADE_DATADIR)
+AC_SUBST(GNOME_PANELDIR)
 AC_SUBST(HACK_CONF_DIR)
+AC_SUBST(GTK_EXTRA_OBJS)
 
 APPDEFAULTS=$ac_x_app_defaults
 AC_SUBST(APPDEFAULTS)
@@ -3267,7 +3505,6 @@ elif test "$jurassic_gtk" = yes ; then
 elif test "$with_gtk_req" = yes -a "$have_gtk" = no ; then
   warnL "Use of Gtk was requested, but it wasn't found;"
   warn2 "Motif will be used instead."
-
 fi
 
 
@@ -3346,9 +3583,10 @@ if test "$with_gdk_pixbuf_req" = yes  -a "$have_gdk_pixbuf" = no; then
   warnL 'Use of GDK-Pixbuf was requested, but it was not found.'
 fi
 
-if test "$have_xpm" = no -a "$have_gdk_pixbuf" = no; then
+if test "$have_xpm" = no -a "$have_gdk_pixbuf" = no || \
+   test "$gdk_pixbuf_halfassed" = yes; then
 
-  if test "$with_xpm_req" = yes ; then
+  if test "$with_xpm_req" = yes -o "$have_xpm" = yes ; then
     true
   elif test "$with_xpm_req" = no ; then
     warnL 'The XPM library is not being used.'
index fde4e63cfcbf0cd77e2664a52f1eb653114b2579..f7012a66f224fbe4e19fb89cd38abffea4aba6fc 100644 (file)
@@ -24,10 +24,12 @@ INTLTOOL_MERGE      = @INTLTOOL_MERGE@
 
 GNOME_DATADIR  = @GNOME_DATADIR@
 GNOME_CCDIR    = $(GNOME_DATADIR)/control-center/Desktop
-GNOME_PANELDIR = $(GNOME_DATADIR)/gnome/apps/Settings/Desktop
+GNOME_PANELDIR1 = $(GNOME_DATADIR)/gnome/apps/Settings/Desktop
+GNOME_PANELDIR2        = $(GNOME_DATADIR)/applications
+GNOME_PANELDIR = @GNOME_PANELDIR@
+GLADE_DATADIR  = @GLADE_DATADIR@
 GNOME_BINDIR   = $(bindir)
 HACK_CONF_DIR  = @HACK_CONF_DIR@
-GTK_ICONDIR    = @GTK_ICONDIR@
 
 CC             = @CC@
 CFLAGS         = @CFLAGS@
@@ -35,7 +37,7 @@ LDFLAGS               = @LDFLAGS@
 DEFS           = @DEFS@
 INTL_DEFS      = -DLOCALEDIR=\"$(localedir)\"
 SUBP_DEFS      = $(DEFS) -DDEFAULT_PATH_PREFIX='"@HACKDIR@"'
-GTK_DEFS       = $(DEFS) -DDEFAULT_ICONDIR='"$(GTK_ICONDIR)"'
+GTK_DEFS       = $(DEFS) -DDEFAULT_ICONDIR='"$(GLADE_DATADIR)"'
 CONF_DEFS      = -DHACK_CONFIGURATION_PATH='"$(HACK_CONF_DIR)"'
 
 LIBS           = @LIBS@
@@ -60,6 +62,7 @@ X_LIBS                = @X_LIBS@
 X_PRE_LIBS     = @X_PRE_LIBS@
 X_EXTRA_LIBS   = @X_EXTRA_LIBS@
 XMU_LIBS       = @XMU_LIBS@
+XPM_LIBS       = @XPM_LIBS@
 
 # Note:
 #
@@ -90,8 +93,8 @@ MOTIF_OBJS    = demo-Xm.o demo-Xm-widgets.o
 
 GTK_SRCS       = demo-Gtk.c demo-Gtk-conf.c \
                  demo-Gtk-widgets.c demo-Gtk-support.c
-GTK_OBJS       = demo-Gtk.o demo-Gtk-conf.o \
-                 demo-Gtk-widgets.o demo-Gtk-support.o
+GTK_EXTRA_OBJS  = demo-Gtk-widgets.o demo-Gtk-support.o
+GTK_OBJS       = demo-Gtk.o demo-Gtk-conf.o @GTK_EXTRA_OBJS@
 
 PWENT_SRCS     = passwd-pwent.c
 PWENT_OBJS     = passwd-pwent.o
@@ -192,7 +195,7 @@ SAVER_LIBS  = $(LIBS) $(X_LIBS) $(XMU_LIBS) @SAVER_LIBS@ \
 CMD_LIBS       = $(LIBS) $(X_LIBS) \
                  $(X_PRE_LIBS) -lX11 -lXext $(X_EXTRA_LIBS)
 
-GETIMG_LIBS    = $(LIBS) $(X_LIBS) \
+GETIMG_LIBS    = $(LIBS) $(X_LIBS) $(XPM_LIBS) \
                  $(X_PRE_LIBS) -lXt -lX11 $(XMU_LIBS) -lXext $(X_EXTRA_LIBS)
 
 EXES           = xscreensaver xscreensaver-command xscreensaver-demo \
@@ -209,7 +212,7 @@ MEN         = xscreensaver.man xscreensaver-demo.man \
                  xscreensaver-getimage-file.man \
                  xscreensaver-getimage-video.man
 EXTRAS         = README Makefile.in XScreenSaver.ad.in xscreensaver.pam \
-                 xscreensaver.kss xscreensaver-demo.glade \
+                 xscreensaver.kss xscreensaver-demo.glade xscreensaver-demo.glade2 \
                  screensaver-properties.desktop.in \
                  screensaver-properties-capplet \
                  .gdbinit
@@ -508,34 +511,62 @@ install-gnome:: screensaver-properties-capplet
 
 # xscreensaver.xpm
 install-gnome:: $(LOGO)
-       @if [ "$(GTK_ICONDIR)" != "" ]; then                                  \
-           if [ ! -d "$(install_prefix)$(GTK_ICONDIR)" ]; then                \
-             echo $(INSTALL_DIRS) "$(install_prefix)$(GTK_ICONDIR)"          ;\
-                  $(INSTALL_DIRS) "$(install_prefix)$(GTK_ICONDIR)"          ;\
+       @if [ "$(GLADE_DATADIR)" != "" ]; then                                  \
+           if [ ! -d "$(install_prefix)$(GLADE_DATADIR)" ]; then                \
+             echo $(INSTALL_DIRS) "$(install_prefix)$(GLADE_DATADIR)"          ;\
+                  $(INSTALL_DIRS) "$(install_prefix)$(GLADE_DATADIR)"          ;\
            fi                                                                ;\
           target=xscreensaver.xpm                                           ;\
           echo $(INSTALL_DATA) $(LOGO)                                       \
-                 $(install_prefix)$(GTK_ICONDIR)/$$target                   ;\
+                 $(install_prefix)$(GLADE_DATADIR)/$$target                 ;\
                $(INSTALL_DATA) $(LOGO)                                       \
-                 $(install_prefix)$(GTK_ICONDIR)/$$target                   ;\
+                 $(install_prefix)$(GLADE_DATADIR)/$$target                 ;\
         fi
 
 # ../utils/images/screensaver-*.xpm
 install-gnome::
-       @if [ "$(GTK_ICONDIR)" != "" ]; then                                  \
-           if [ ! -d "$(install_prefix)$(GTK_ICONDIR)" ]; then                \
-             echo $(INSTALL_DIRS) "$(install_prefix)$(GTK_ICONDIR)"          ;\
-                  $(INSTALL_DIRS) "$(install_prefix)$(GTK_ICONDIR)"          ;\
+       @if [ "$(GLADE_DATADIR)" != "" ]; then                                \
+           if [ ! -d "$(install_prefix)$(GLADE_DATADIR)" ]; then              \
+             echo $(INSTALL_DIRS) "$(install_prefix)$(GLADE_DATADIR)"        ;\
+                  $(INSTALL_DIRS) "$(install_prefix)$(GLADE_DATADIR)"        ;\
            fi                                                                ;\
           for target in $(GTK_ICONS) ; do                                    \
             dest=`echo $$target | sed 's@^.*/@@'`                           ;\
             echo $(INSTALL_DATA) $$target                                    \
-                 $(install_prefix)$(GTK_ICONDIR)/$$dest                     ;\
+                 $(install_prefix)$(GLADE_DATADIR)/$$dest                   ;\
                  $(INSTALL_DATA) $$target                                    \
-                 $(install_prefix)$(GTK_ICONDIR)/$$dest                     ;\
+                 $(install_prefix)$(GLADE_DATADIR)/$$dest                   ;\
           done                                                              ;\
         fi
 
+# xscreensaver-demo.glade2
+install-gnome:: xscreensaver-demo.glade2
+       @if [ "$(GLADE_DATADIR)" != "" ]; then                                \
+         if [ ! -d "$(install_prefix)$(GLADE_DATADIR)" ]; then               \
+           echo $(INSTALL_DIRS) "$(install_prefix)$(GLADE_DATADIR)"         ;\
+                $(INSTALL_DIRS) "$(install_prefix)$(GLADE_DATADIR)"         ;\
+         fi                                                                 ;\
+         target=xscreensaver-demo.glade2                                    ;\
+         echo $(INSTALL_DATA) $(srcdir)/$$target                             \
+           $(install_prefix)$(GLADE_DATADIR)/$$target                       ;\
+         if   $(INSTALL_DATA) $(srcdir)/$$target                             \
+           $(install_prefix)$(GLADE_DATADIR)/$$target                       ;\
+           then true                                                        ;\
+          else                                                                \
+           e=echo ;                                                          \
+ $$e ""                                                                      ;\
+ $$e "  ####################################################################";\
+ $$e "  Warning: unable to install $$target into"                           ;\
+ $$e "           $(install_prefix)$(GLADE_DATADIR)/."                        ;\
+ $$e "           Without this file, xscreensaver-demo will not"              ;\
+ $$e "           be able to run properly."                                   ;\
+ $$e "  ####################################################################";\
+ $$e ""                                                                      ;\
+             exit 1 ;                                                         \
+          fi ;                                                               \
+        fi
+
+
 # screensaver-properties.desktop
 uninstall-gnome::
        @if [ "$(GNOME_DATADIR)" != "" ]; then                                \
@@ -556,19 +587,19 @@ uninstall-gnome::
 
 # xscreensaver.xpm
 uninstall-gnome::
-       @if [ "$(GTK_ICONDIR)" != "" ]; then                                  \
+       @if [ "$(GLADE_DATADIR)" != "" ]; then                                \
          target=xscreensaver.xpm                                            ;\
-         echo rm -f $(install_prefix)$(GTK_ICONDIR)/$$target                ;\
-              rm -f $(install_prefix)$(GTK_ICONDIR)/$$target                ;\
+         echo rm -f $(install_prefix)$(GLADE_DATADIR)/$$target                ;\
+              rm -f $(install_prefix)$(GLADE_DATADIR)/$$target                ;\
         fi
 
 # xscreensaver.xpm
 uninstall-gnome::
-       @if [ "$(GTK_ICONDIR)" != "" ]; then                                  \
+       @if [ "$(GLADE_DATADIR)" != "" ]; then                                \
           for target in $(GTK_ICONS) ; do                                    \
             dest=`echo $$target | sed 's@^.*/@@'`                           ;\
-            echo rm -f $(install_prefix)$(GTK_ICONDIR)/$$dest               ;\
-                 rm -f $(install_prefix)$(GTK_ICONDIR)/$$dest               ;\
+            echo rm -f $(install_prefix)$(GLADE_DATADIR)/$$dest             ;\
+                 rm -f $(install_prefix)$(GLADE_DATADIR)/$$dest             ;\
           done                                                              ;\
         fi
 
@@ -624,7 +655,7 @@ depend: XScreenSaver_ad.h
 # close.  This excludes dependencies on files in /usr/include, etc.  It tries
 # to include only dependencies on files which are themselves a part of this
 # package.
-distdepend: update_ad_version update_man_version XScreenSaver_ad.h
+distdepend: check_men update_ad_version update_man_version XScreenSaver_ad.h
        @echo updating dependencies in `pwd`/Makefile.in... ;               \
        $(DEPEND) -w 0 -f -                                                 \
        -s '# DO NOT DELETE: updated by make distdepend' $(DEPEND_FLAGS) -- \
@@ -657,7 +688,7 @@ update_ad_version::
        V=`sed -n 's/.*\([0-9][0-9]*\.[0-9]*\).*/\1/p' < $$U` ;             \
        D=`date '+%d-%b-%Y'` ;                                              \
        for S in $$files ; do                                               \
-         echo -n "Updating version number in $$S to $$V $$D... " ;         \
+         echo -n "Updating $$S to $$V $$D... " ;                           \
          T=/tmp/xs.$$$$ ;                                                  \
          sed -e "s/\(.*version \)[0-9][0-9]*\.[0-9]*\(.*\)/\1$$V\2/"       \
              -e "s/\([0-9][0-9]-[A-Z][a-z][a-z]-[0-9][0-9][0-9]*\)/$$D/"   \
@@ -676,7 +707,7 @@ update_man_version::
        U=$(UTILS_SRC)/version.h ;                                          \
        V=`sed -n 's/.*\([0-9][0-9]*\.[0-9]*\).*/\1/p' < $$U` ;             \
        V="`date '+%d-%b-%Y'` ($$V)" ;                                      \
-       echo -n "Updating footer in $$S to \"$$V\"... " ;                   \
+       echo -n "Updating $$S to \"$$V\"... " ;                             \
        T=/tmp/xs.$$$$ ;                                                    \
        sed "s/^\(\.TH[^\"]*\)\"[^\"]*\"\(.*\)/\1\"$$V\"\2/"                \
          < $$S > $$T ;                                                     \
@@ -697,6 +728,23 @@ echo_tarfiles:
        @$(MAKE) XScreenSaver_ad.h 2>&1 >&- /dev/null
        @echo $(TARFILES)
 
+check_men:
+       @badmen="" ;                                                    \
+        for exe in $(EXES); do                                         \
+          if ! [ -f $(srcdir)/$$exe.man ]; then                        \
+            badmen="$$badmen $$exe" ;                                  \
+          fi ;                                                         \
+        done ;                                                         \
+        if [ -n "$$badmen" ]; then                                     \
+          echo "" ;                                                    \
+          echo "Warning: The following programs have no manuals:" ;    \
+          echo "" ;                                                    \
+          for m in $$badmen ; do                                       \
+            echo "    $$m" ;                                           \
+          done ;                                                       \
+          echo "" ;                                                    \
+        fi
+
 
 # Rules for noticing when the objects from the utils directory are out of
 # date with respect to their sources, and going and building them according
index ffd0cd53c4122286290450b3677dcd9713d4c329..10b60265e6597966e5579a45a8d238436defd3ef 100644 (file)
@@ -4,8 +4,8 @@
 !            a screen saver and locker for the X window system
 !                            by Jamie Zawinski
 !
-!                              version 4.03
-!                              11-May-2002
+!                              version 4.04
+!                              31-May-2002
 !
 ! See "man xscreensaver" for more info.  The latest version is always
 ! available at http://www.jwz.org/xscreensaver/
                                polyominoes -root                           \n\
 -                              thornbird -root                             \n\
                                fluidballs -root                            \n\
+                               anemone -root                               \n\
   color:                       bubbles -root                               \n\
 - default-n:                   webcollage -root                            \n\
 - default-n:  "WebCollage (whacked)"                                         \
 @GL_KLUDGE@ GL:                        sballs -root                                \n\
 @GL_KLUDGE@ GL:                        cubenetic -root                             \n\
 @GL_KLUDGE@ GL:                        spheremonics -root                          \n\
+@GL_KLUDGE@ GL:                        lavalite -root                              \n\
+@GL_KLUDGE@ GL:                        queens -root                                \n\
                                                                              \
 -                              xdaliclock -root -builtin3 -cycle           \n\
 - default-n:                   xearth -nofork -nostars -ncolors 50           \
index 6d33f01824f2cc68c0e66436c667ca3d9da73bb1..0d91e8f3db3c16bc4553d21e47e0581ca4cbf56e 100644 (file)
                                polyominoes -root                           \\n\
 -                              thornbird -root                             \\n\
                                fluidballs -root                            \\n\
+                               anemone -root                               \\n\
   color:                       bubbles -root                               \\n\
 - default-n:                   webcollage -root                            \\n\
 - default-n:  \"WebCollage (whacked)\"                                       \
           GL:                  sballs -root                                \\n\
           GL:                  cubenetic -root                             \\n\
           GL:                  spheremonics -root                          \\n\
+          GL:                  lavalite -root                              \\n\
+          GL:                  queens -root                                \\n\
                                                                              \
 -                              xdaliclock -root -builtin3 -cycle           \\n\
 - default-n:                   xearth -nofork -nostars -ncolors 50           \
index 91a305cf5519f54b33daf7009e4004a36933969e..44726c70f9fdd246b0d3e5e831ca9f67ce8b49ae 100644 (file)
@@ -40,9 +40,9 @@
  * workaround.
  */
 #ifdef HAVE_OLD_XML_HEADERS
-#include <parser.h>
+# include <parser.h>
 #else /* ! HAVE_OLD_XML_HEADERS */
-#include <libxml/parser.h> 
+# include <libxml/parser.h> 
 #endif /* HAVE_OLD_XML_HEADERS */
 
 /* 
index 32440ba8013598a5c41327153d588b6df0d8f6fc..486e4a48cb91d45c4b9a5b2436c95d48b7f3a38e 100644 (file)
@@ -16,6 +16,8 @@
 
 #ifdef HAVE_GTK /* whole file */
 
+#include <xscreensaver-intl.h>
+
 #include <stdlib.h>
 
 #ifdef HAVE_UNISTD_H
 
 #include <gdk/gdkx.h>
 
+#ifdef HAVE_GTK2
+#include <glade/glade-xml.h>
+#endif /* HAVE_GTK2 */
+
+#if defined(DEFAULT_ICONDIR) && !defined(GLADE_DIR)
+# define GLADE_DIR DEFAULT_ICONDIR
+#endif
+#if !defined(DEFAULT_ICONDIR) && defined(GLADE_DIR)
+# define DEFAULT_ICONDIR GLADE_DIR
+#endif
+
+
 #include "version.h"
 #include "prefs.h"
 #include "resources.h"         /* for parse_time() */
 #include <string.h>
 #include <ctype.h>
 
+#ifdef HAVE_GTK2
+enum {
+  COL_ENABLED,
+  COL_NAME,
+  COL_LAST
+};
+#endif /* HAVE_GTK2 */
 
 /* from exec.c */
 extern void exec_command (const char *shell, const char *command, int nice);
@@ -122,6 +143,10 @@ typedef struct {
   GtkWidget *popup_widget;     /* the "Settings" dialog */
   conf_data *cdata;            /* private data for per-hack configuration */
 
+#ifdef HAVE_GTK2
+  GladeXML *glade_ui;           /* Glade UI file */
+#endif /* HAVE_GTK2 */
+
   Bool debug_p;                        /* whether to print diagnostics */
   Bool initializing_p;         /* flag for breaking recursion loops */
   Bool saving_p;               /* flag for breaking recursion loops */
@@ -201,11 +226,32 @@ name_to_widget (state *s, const char *name)
   if (!name) abort();
   if (!*name) abort();
 
+#ifdef HAVE_GTK2
+  if (!s->glade_ui)
+    {
+      s->glade_ui = glade_xml_new (GLADE_DIR "/xscreensaver-demo.glade2",
+                                   NULL, NULL);
+      if (!s->glade_ui)
+       {
+         fprintf (stderr,
+                   "%s: could not load glade file"
+                   " \"%s/xscreensaver-demo.glade2\"\n",
+                   blurb(), GLADE_DIR);
+          exit (-1);
+       }
+      glade_xml_signal_autoconnect (s->glade_ui);
+    }
+
+  w = glade_xml_get_widget (s->glade_ui, name);
+
+#else /* !HAVE_GTK2 */
+
   w = (GtkWidget *) gtk_object_get_data (GTK_OBJECT (s->base_widget),
                                          name);
   if (w) return w;
   w = (GtkWidget *) gtk_object_get_data (GTK_OBJECT (s->popup_widget),
                                          name);
+#endif /* HAVE_GTK2 */
   if (w) return w;
 
   fprintf (stderr, "%s: no widget \"%s\"\n", blurb(), name);
@@ -219,6 +265,10 @@ name_to_widget (state *s, const char *name)
 static void
 ensure_selected_item_visible (GtkWidget *widget)
 {
+#ifdef HAVE_GTK2
+
+#else /* !HAVE_GTK2 */
+
   GtkScrolledWindow *scroller = 0;
   GtkViewport *vp = 0;
   GtkList *list_widget = 0;
@@ -303,6 +353,7 @@ ensure_selected_item_visible (GtkWidget *widget)
 
       gtk_adjustment_set_value (adj, target);
     }
+#endif /* !HAVE_GTK2 */
 }
 
 static void
@@ -356,7 +407,11 @@ warning_dialog (GtkWidget *parent, const char *message,
 
       {
         label = gtk_label_new (head);
+#ifdef HAVE_GTK2
+       gtk_label_set_selectable (GTK_LABEL (label), TRUE);
+#endif /* HAVE_GTK2 */
 
+#ifndef HAVE_GTK2
         if (i == 1)
           {
             GTK_WIDGET (label)->style =
@@ -367,7 +422,7 @@ warning_dialog (GtkWidget *parent, const char *message,
             gtk_widget_set_style (GTK_WIDGET (label),
                                   GTK_WIDGET (label)->style);
           }
-
+#endif /* !HAVE_GTK2 */
         if (center <= 0)
           gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
         gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
@@ -392,6 +447,18 @@ warning_dialog (GtkWidget *parent, const char *message,
   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
                       label, TRUE, TRUE, 0);
 
+#ifdef HAVE_GTK2
+  if (restart_button_p)
+    {
+      cancel = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
+      gtk_container_add (GTK_CONTAINER (label), cancel);
+    }
+
+  ok = gtk_button_new_from_stock (GTK_STOCK_OK);
+  gtk_container_add (GTK_CONTAINER (label), ok);
+
+#else /* !HAVE_GTK2 */
+
   ok = gtk_button_new_with_label ("OK");
   gtk_container_add (GTK_CONTAINER (label), ok);
 
@@ -401,15 +468,22 @@ warning_dialog (GtkWidget *parent, const char *message,
       gtk_container_add (GTK_CONTAINER (label), cancel);
     }
 
+#endif /* !HAVE_GTK2 */
+
   gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
   gtk_container_set_border_width (GTK_CONTAINER (dialog), 10);
   gtk_window_set_title (GTK_WINDOW (dialog), progclass);
+  GTK_WIDGET_SET_FLAGS (ok, GTK_CAN_DEFAULT);
   gtk_widget_show (ok);
+  gtk_widget_grab_focus (ok);
+
   if (cancel)
-    gtk_widget_show (cancel);
+    {
+      GTK_WIDGET_SET_FLAGS (cancel, GTK_CAN_DEFAULT); 
+      gtk_widget_show (cancel);
+    }
   gtk_widget_show (label);
   gtk_widget_show (dialog);
-/*  gtk_window_set_default (GTK_WINDOW (dialog), ok);*/
 
   if (restart_button_p)
     {
@@ -430,8 +504,12 @@ warning_dialog (GtkWidget *parent, const char *message,
   gdk_window_set_transient_for (GTK_WIDGET (dialog)->window,
                                 GTK_WIDGET (parent)->window);
 
+#ifdef HAVE_GTK2
+  gtk_window_present (GTK_WINDOW (dialog));
+#else  /* !HAVE_GTK2 */
   gdk_window_show (GTK_WIDGET (dialog)->window);
   gdk_window_raise (GTK_WIDGET (dialog)->window);
+#endif /* !HAVE_GTK2 */
 
   free (msg);
 }
@@ -514,7 +592,11 @@ about_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
   *s = 0;
   s += 2;
 
+#ifdef HAVE_GTK2
+  sprintf(copy, _("Copyright \xC2\xA9 1991-2002 %s"), s);
+#else  /* !HAVE_GTK2 */
   sprintf(copy, _("Copyright \251 1991-2002 %s"), s);
+#endif /* !HAVE_GTK2 */
 
   sprintf (msg, "%s\n\n%s", copy, desc);
 
@@ -564,27 +646,35 @@ about_menu_cb (GtkMenuItem *menuitem, gpointer user_data)
     gtk_label_set_justify (GTK_LABEL (label1), GTK_JUSTIFY_LEFT);
     gtk_misc_set_alignment (GTK_MISC (label1), 0.0, 0.75);
 
+#ifndef HAVE_GTK2
     GTK_WIDGET (label1)->style = gtk_style_copy (GTK_WIDGET (label1)->style);
     GTK_WIDGET (label1)->style->font =
       gdk_font_load (get_string_resource ("about.headingFont","Dialog.Font"));
     gtk_widget_set_style (GTK_WIDGET (label1), GTK_WIDGET (label1)->style);
+#endif /* HAVE_GTK2 */
 
     label2 = gtk_label_new (msg);
     gtk_box_pack_start (GTK_BOX (vbox), label2, TRUE, TRUE, 0);
     gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
     gtk_misc_set_alignment (GTK_MISC (label2), 0.0, 0.25);
 
+#ifndef HAVE_GTK2
     GTK_WIDGET (label2)->style = gtk_style_copy (GTK_WIDGET (label2)->style);
     GTK_WIDGET (label2)->style->font =
       gdk_font_load (get_string_resource ("about.bodyFont","Dialog.Font"));
     gtk_widget_set_style (GTK_WIDGET (label2), GTK_WIDGET (label2)->style);
+#endif /* HAVE_GTK2 */
 
     hb = gtk_hbutton_box_new ();
 
     gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area),
                         hb, TRUE, TRUE, 0);
 
+#ifdef HAVE_GTK2
+    ok = gtk_button_new_from_stock (GTK_STOCK_OK);
+#else /* !HAVE_GTK2 */
     ok = gtk_button_new_with_label (_("OK"));
+#endif /* !HAVE_GTK2 */
     gtk_container_add (GTK_CONTAINER (hb), ok);
 
     gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
@@ -837,13 +927,26 @@ manual_cb (GtkButton *button, gpointer user_data)
 
 
 static void
-force_list_select_item (state *s, GtkList *list, int list_elt, Bool scroll_p)
+force_list_select_item (state *s, GtkWidget *list, int list_elt, Bool scroll_p)
 {
   GtkWidget *parent = name_to_widget (s, "scroller");
   Bool was = GTK_WIDGET_IS_SENSITIVE (parent);
+#ifdef HAVE_GTK2
+  GtkTreeIter iter;
+  GtkTreeModel *model;
+  GtkTreeSelection *selection;
+#endif /* HAVE_GTK2 */
 
   if (!was) gtk_widget_set_sensitive (parent, True);
+#ifdef HAVE_GTK2
+  model = gtk_tree_view_get_model (GTK_TREE_VIEW (list));
+  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);
+#else  /* !HAVE_GTK2 */
   gtk_list_select_item (GTK_LIST (list), list_elt);
+#endif /* !HAVE_GTK2 */
   if (scroll_p) ensure_selected_item_visible (GTK_WIDGET (list));
   if (!was) gtk_widget_set_sensitive (parent, False);
 }
@@ -856,8 +959,7 @@ run_next_cb (GtkButton *button, gpointer user_data)
   saver_preferences *p = &s->prefs;
   Bool ops = s->preview_suppressed_p;
 
-  GtkList *list_widget =
-    GTK_LIST (name_to_widget (s, "list"));
+  GtkWidget *list_widget = name_to_widget (s, "list");
   int list_elt = selected_list_element (s);
 
   if (list_elt < 0)
@@ -871,7 +973,7 @@ run_next_cb (GtkButton *button, gpointer user_data)
   s->preview_suppressed_p = True;
 
   flush_dialog_changes_and_save (s);
-  force_list_select_item (s, GTK_LIST (list_widget), list_elt, True);
+  force_list_select_item (s, list_widget, list_elt, True);
   populate_demo_window (s, list_elt);
   run_hack (s, list_elt, False);
 
@@ -886,8 +988,7 @@ run_prev_cb (GtkButton *button, gpointer user_data)
   saver_preferences *p = &s->prefs;
   Bool ops = s->preview_suppressed_p;
 
-  GtkList *list_widget =
-    GTK_LIST (name_to_widget (s, "list"));
+  GtkWidget *list_widget = name_to_widget (s, "list");
   int list_elt = selected_list_element (s);
 
   if (list_elt < 0)
@@ -901,7 +1002,7 @@ run_prev_cb (GtkButton *button, gpointer user_data)
   s->preview_suppressed_p = True;
 
   flush_dialog_changes_and_save (s);
-  force_list_select_item (s, GTK_LIST (list_widget), list_elt, True);
+  force_list_select_item (s, list_widget, list_elt, True);
   populate_demo_window (s, list_elt);
   run_hack (s, list_elt, False);
 
@@ -1071,6 +1172,39 @@ normalize_directory (const char *path)
 }
 
 
+#ifdef HAVE_GTK2
+
+typedef struct {
+  state *s;
+  int i;
+  Bool *changed;
+} FlushForeachClosure;
+
+static gboolean
+flush_checkbox  (GtkTreeModel *model,
+                GtkTreePath *path,
+                GtkTreeIter *iter,
+                gpointer data)
+{
+  FlushForeachClosure *closure = data;
+  gboolean checked;
+
+  gtk_tree_model_get (model, iter,
+                     COL_ENABLED, &checked,
+                     -1);
+
+  if (flush_changes (closure->s, closure->i,
+                    checked, 0, 0))
+    *closure->changed = True;
+  
+  closure->i++;
+
+  /* don't remove row */
+  return FALSE;
+}
+
+#endif /* HAVE_GTK2 */
+
 /* Flush out any changes made in the main dialog window (where changes
    take place immediately: clicking on a checkbox causes the init file
    to be written right away.)
@@ -1080,11 +1214,18 @@ flush_dialog_changes_and_save (state *s)
 {
   saver_preferences *p = &s->prefs;
   saver_preferences P2, *p2 = &P2;
+#ifdef HAVE_GTK2
+  GtkTreeView *list_widget = GTK_TREE_VIEW (name_to_widget (s, "list"));
+  GtkTreeModel *model = gtk_tree_view_get_model (list_widget);
+  FlushForeachClosure closure;
+#else /* !HAVE_GTK2 */
   GtkList *list_widget = GTK_LIST (name_to_widget (s, "list"));
   GList *kids = gtk_container_children (GTK_CONTAINER (list_widget));
+  int i;
+#endif /* !HAVE_GTK2 */
+
   Bool changed = False;
   GtkWidget *w;
-  int i;
 
   if (s->saving_p) return False;
   s->saving_p = True;
@@ -1093,6 +1234,14 @@ flush_dialog_changes_and_save (state *s)
 
   /* Flush any checkbox changes in the list down into the prefs struct.
    */
+#ifdef HAVE_GTK2
+  closure.s = s;
+  closure.changed = &changed;
+  closure.i = 0;
+  gtk_tree_model_foreach (model, flush_checkbox, &closure);
+
+#else /* !HAVE_GTK2 */
+
   for (i = 0; kids; kids = kids->next, i++)
     {
       GtkWidget *line = GTK_WIDGET (kids->data);
@@ -1105,7 +1254,7 @@ flush_dialog_changes_and_save (state *s)
       if (flush_changes (s, i, (checked ? 1 : 0), 0, 0))
         changed = True;
     }
-
+#endif /* ~HAVE_GTK2 */
 
   /* Flush the non-hack-specific settings down into the prefs struct.
    */
@@ -1334,8 +1483,6 @@ flush_popup_changes_and_save (state *s)
 }
 
 
-
-
 void
 pref_changed_cb (GtkWidget *widget, gpointer user_data)
 {
@@ -1348,6 +1495,12 @@ pref_changed_cb (GtkWidget *widget, gpointer user_data)
     }
 }
 
+gboolean
+pref_changed_event_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+  pref_changed_cb (widget, user_data);
+  return FALSE;
+}
 
 /* Callback on menu items in the "mode" options menu.
  */
@@ -1356,7 +1509,7 @@ mode_menu_item_cb (GtkWidget *widget, gpointer user_data)
 {
   state *s = (state *) user_data;
   saver_preferences *p = &s->prefs;
-  GtkList *list = GTK_LIST (name_to_widget (s, "list"));
+  GtkWidget *list = name_to_widget (s, "list");
   int list_elt;
 
   GList *menu_items = gtk_container_children (GTK_CONTAINER (widget->parent));
@@ -1418,6 +1571,52 @@ switch_page_cb (GtkNotebook *notebook, GtkNotebookPage *page,
     schedule_preview (s, 0);
 }
 
+#ifdef HAVE_GTK2
+static void
+list_activated_cb (GtkTreeView       *list,
+                  GtkTreePath       *path,
+                  GtkTreeViewColumn *column,
+                  gpointer           data)
+{
+  state *s = data;
+  char *str;
+  int list_elt;
+
+  g_return_if_fail (!gdk_pointer_is_grabbed ());
+
+  str = gtk_tree_path_to_string (path);
+  list_elt = strtol (str, NULL, 10);
+  g_free (str);
+
+  if (list_elt >= 0)
+    run_hack (s, list_elt, True);
+}
+
+static void
+list_select_changed_cb (GtkTreeSelection *selection, gpointer data)
+{
+  state *s = (state *)data;
+  GtkTreeModel *model;
+  GtkTreeIter iter;
+  GtkTreePath *path;
+  char *str;
+  int list_elt;
+  if (!gtk_tree_selection_get_selected (selection, &model, &iter))
+    return;
+
+  path = gtk_tree_model_get_path (model, &iter);
+  str = gtk_tree_path_to_string (path);
+  list_elt = strtol (str, NULL, 10);
+
+  gtk_tree_path_free (path);
+  g_free (str);
+
+  populate_demo_window (s, list_elt);
+  flush_dialog_changes_and_save (s);
+}
+
+#else /* !HAVE_GTK2 */
 
 static time_t last_doubleclick_time = 0;   /* FMH!  This is to suppress the
                                               list_select_cb that comes in
@@ -1466,6 +1665,8 @@ list_unselect_cb (GtkList *list, GtkWidget *child, gpointer data)
   flush_dialog_changes_and_save (s);
 }
 
+#endif /* !HAVE_GTK2 */
+
 
 /* Called when the checkboxes that are in the left column of the
    scrolling list are clicked.  This both populates the right pane
@@ -1473,27 +1674,65 @@ list_unselect_cb (GtkList *list, GtkWidget *child, gpointer data)
    also syncs this checkbox with  the right pane Enabled checkbox.
  */
 static void
-list_checkbox_cb (GtkWidget *cb, gpointer data)
+list_checkbox_cb (
+#ifdef HAVE_GTK2
+                 GtkCellRendererToggle *toggle,
+                 gchar                 *path_string,
+#else  /* !HAVE_GTK2 */
+                 GtkWidget *cb,
+#endif /* !HAVE_GTK2 */
+                 gpointer               data)
 {
   state *s = (state *) data;
 
+#ifdef HAVE_GTK2
+  GtkScrolledWindow *scroller =
+    GTK_SCROLLED_WINDOW (name_to_widget (s, "scroller"));
+  GtkTreeView *list = GTK_TREE_VIEW (name_to_widget (s, "list"));
+  GtkTreeModel *model = gtk_tree_view_get_model (list);
+  GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
+  GtkTreeIter iter;
+  gboolean active;
+#else /* !HAVE_GTK2 */
   GtkWidget *line_hbox = GTK_WIDGET (cb)->parent;
   GtkWidget *line = GTK_WIDGET (line_hbox)->parent;
 
   GtkList *list = GTK_LIST (GTK_WIDGET (line)->parent);
   GtkViewport *vp = GTK_VIEWPORT (GTK_WIDGET (list)->parent);
   GtkScrolledWindow *scroller = GTK_SCROLLED_WINDOW (GTK_WIDGET (vp)->parent);
+#endif /* ~HAVE_GTK2 */
   GtkAdjustment *adj;
   double scroll_top;
 
-  int list_elt = gtk_list_child_position (list, line);
+  int list_elt;
+
+#ifdef HAVE_GTK2
+  if (!gtk_tree_model_get_iter (model, &iter, path))
+    {
+      g_warning ("bad path: %s", path_string);
+      return;
+    }
+  gtk_tree_path_free (path);
+
+  gtk_tree_model_get (model, &iter,
+                     COL_ENABLED, &active,
+                     -1);
+
+  gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+                     COL_ENABLED, !active,
+                     -1);
+
+  list_elt = strtol (path_string, NULL, 10);  
+#else  /* !HAVE_GTK2 */
+  list_elt = gtk_list_child_position (list, line);
+#endif /* !HAVE_GTK2 */
 
   /* remember previous scroll position of the top of the list */
   adj = gtk_scrolled_window_get_vadjustment (scroller);
   scroll_top = adj->value;
 
   flush_dialog_changes_and_save (s);
-  force_list_select_item (s, list, list_elt, False);
+  force_list_select_item (s, GTK_WIDGET (list), list_elt, False);
   populate_demo_window (s, list_elt);
   
   /* restore the previous scroll position of the top of the list.
@@ -1517,7 +1756,7 @@ store_image_directory (GtkWidget *button, gpointer user_data)
   GtkFileSelection *selector = fsd->widget;
   GtkWidget *top = s->toplevel_widget;
   saver_preferences *p = &s->prefs;
-  char *path = gtk_file_selection_get_filename (selector);
+  const char *path = gtk_file_selection_get_filename (selector);
 
   if (p->image_directory && !strcmp(p->image_directory, path))
     return;  /* no change */
@@ -1750,7 +1989,7 @@ scroll_to_current_hack (state *s)
   if (hack_number >= 0 && hack_number < p->screenhacks_count)
     {
       int list_elt = s->hack_number_to_list_elt[hack_number];
-      GtkList *list = GTK_LIST (name_to_widget (s, "list"));
+      GtkWidget *list = name_to_widget (s, "list");
       force_list_select_item (s, list, list_elt, True);
       populate_demo_window (s, list_elt);
     }
@@ -1760,6 +1999,70 @@ scroll_to_current_hack (state *s)
 static void
 populate_hack_list (state *s)
 {
+#ifdef HAVE_GTK2
+  saver_preferences *p = &s->prefs;
+  GtkTreeView *list = GTK_TREE_VIEW (name_to_widget (s, "list"));
+  GtkListStore *model;
+  GtkTreeSelection *selection;
+  GtkCellRenderer *ren;
+  GtkTreeIter iter;
+  int i;
+
+  g_object_get (G_OBJECT (list),
+               "model", &model,
+               NULL);
+  if (!model)
+    {
+      model = gtk_list_store_new (COL_LAST, G_TYPE_BOOLEAN, G_TYPE_STRING);
+      g_object_set (G_OBJECT (list), "model", model, NULL);
+      g_object_unref (model);
+
+      ren = gtk_cell_renderer_toggle_new ();
+      gtk_tree_view_insert_column_with_attributes (list, COL_ENABLED,
+                                                  _("Use"), ren,
+                                                  "active", COL_ENABLED,
+                                                  NULL);
+
+      g_signal_connect (ren, "toggled",
+                       G_CALLBACK (list_checkbox_cb),
+                       s);
+
+      ren = gtk_cell_renderer_text_new ();
+      gtk_tree_view_insert_column_with_attributes (list, COL_NAME,
+                                                  _("Screen Saver"), ren,
+                                                  "text", COL_NAME,
+                                                  NULL);
+
+      g_signal_connect_after (list, "row_activated",
+                             G_CALLBACK (list_activated_cb),
+                             s);
+
+      selection = gtk_tree_view_get_selection (list);
+      g_signal_connect (selection, "changed",
+                       G_CALLBACK (list_select_changed_cb),
+                       s);
+
+    }
+
+  for (i = 0; i < p->screenhacks_count; i++)
+    {
+      screenhack *hack = p->screenhacks[s->list_elt_to_hack_number[i]];
+
+      char *pretty_name = (hack->name
+                           ? strdup (hack->name)
+                           : make_hack_name (hack->command));
+
+      gtk_list_store_append (model, &iter);
+      gtk_list_store_set (model, &iter,
+                         COL_ENABLED, hack->enabled_p,
+                         COL_NAME, pretty_name,
+                         -1);
+
+      free (pretty_name);
+    }
+
+#else /* !HAVE_GTK2 */
+
   saver_preferences *p = &s->prefs;
   GtkList *list = GTK_LIST (name_to_widget (s, "list"));
   int i;
@@ -1824,9 +2127,9 @@ populate_hack_list (state *s)
   gtk_signal_connect (GTK_OBJECT (list), "unselect_child",
                       GTK_SIGNAL_FUNC (list_unselect_cb),
                       (gpointer) s);
+#endif /* !HAVE_GTK2 */
 }
 
-
 static void
 update_list_sensitivity (state *s)
 {
@@ -1835,21 +2138,31 @@ update_list_sensitivity (state *s)
   Bool checkable = (p->mode == RANDOM_HACKS);
   Bool blankable = (p->mode != DONT_BLANK);
 
+#ifndef HAVE_GTK2
   GtkWidget *head     = name_to_widget (s, "col_head_hbox");
   GtkWidget *use      = name_to_widget (s, "use_col_frame");
+#endif /* HAVE_GTK2 */
   GtkWidget *scroller = name_to_widget (s, "scroller");
   GtkWidget *buttons  = name_to_widget (s, "next_prev_hbox");
   GtkWidget *blanker  = name_to_widget (s, "blanking_table");
 
+#ifdef HAVE_GTK2
+  GtkTreeView *list      = GTK_TREE_VIEW (name_to_widget (s, "list"));
+  GtkTreeViewColumn *use = gtk_tree_view_get_column (list, COL_ENABLED);
+#else /* !HAVE_GTK2 */
   GtkList *list = GTK_LIST (name_to_widget (s, "list"));
   GList *kids   = gtk_container_children (GTK_CONTAINER (list));
 
   gtk_widget_set_sensitive (GTK_WIDGET (head),     sensitive);
+#endif /* !HAVE_GTK2 */
   gtk_widget_set_sensitive (GTK_WIDGET (scroller), sensitive);
   gtk_widget_set_sensitive (GTK_WIDGET (buttons),  sensitive);
 
   gtk_widget_set_sensitive (GTK_WIDGET (blanker),  blankable);
 
+#ifdef HAVE_GTK2
+  gtk_tree_view_column_set_visible (use, checkable);
+#else  /* !HAVE_GTK2 */
   if (checkable)
     gtk_widget_show (use);   /* the "Use" column header */
   else
@@ -1869,6 +2182,7 @@ update_list_sensitivity (state *s)
 
       kids = kids->next;
     }
+#endif /* !HAVE_GTK2 */
 }
 
 
@@ -1876,7 +2190,6 @@ static void
 populate_prefs_page (state *s)
 {
   saver_preferences *p = &s->prefs;
-  char str[100];
 
   /* The file supports timeouts of less than a minute, but the GUI does
      not, so throttle the values to be at least one minute (since "0" is
@@ -1889,12 +2202,10 @@ populate_prefs_page (state *s)
 # undef THROTTLE
 
 # define FMT_MINUTES(NAME,N) \
-    sprintf (str, "%d", (((N / 1000) + 59) / 60)); \
-    gtk_entry_set_text (GTK_ENTRY (name_to_widget (s, (NAME))), str)
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (name_to_widget (s, (NAME))), (double)((N) + 59) / (60 * 1000))
 
 # define FMT_SECONDS(NAME,N) \
-    sprintf (str, "%d", ((N) / 1000)); \
-    gtk_entry_set_text (GTK_ENTRY (name_to_widget (s, (NAME))), str)
+    gtk_spin_button_set_value (GTK_SPIN_BUTTON (name_to_widget (s, (NAME))), (double)((N) / 1000))
 
   FMT_MINUTES ("timeout_spinbutton",      p->timeout);
   FMT_MINUTES ("cycle_spinbutton",        p->cycle);
@@ -2086,6 +2397,7 @@ sensitize_demo_widgets (state *s, Bool sensitive_p)
 static void
 fix_text_entry_sizes (state *s)
 {
+#ifdef FIXME
   const char * const spinbuttons[] = {
     "timeout_spinbutton", "cycle_spinbutton", "lock_spinbutton",
     "dpms_standby_spinbutton", "dpms_suspend_spinbutton",
@@ -2139,10 +2451,11 @@ fix_text_entry_sizes (state *s)
     w = GTK_WIDGET (name_to_widget (s, "scroller"));
     gtk_widget_set_usize (w, -2, height);
   }
+#endif
 }
 
 
-
+#ifndef HAVE_GTK2
 \f
 /* Pixmaps for the up and down arrow buttons (yeah, this is sleazy...)
  */
@@ -2241,7 +2554,7 @@ map_prev_button_cb (GtkWidget *w, gpointer user_data)
   state *s = (state *) user_data;
   pixmapify_button (s, 0);
 }
-
+#endif /* !HAVE_GTK2 */
 
 \f
 /* Work around a Gtk bug that causes label widgets to wrap text too early.
@@ -2280,7 +2593,7 @@ eschew_gtk_lossage (GtkLabel *label)
   gtk_object_set_data (GTK_OBJECT (label), "gtk-aux-info", aux_info);
 
   gtk_signal_connect (GTK_OBJECT (label), "size_allocate",
-                      you_are_not_a_unique_or_beautiful_snowflake,
+                      GTK_SIGNAL_FUNC (you_are_not_a_unique_or_beautiful_snowflake),
                       0);
 
   gtk_widget_set_usize (GTK_WIDGET (label), -2, -2);
@@ -2465,7 +2778,7 @@ maybe_reload_init_file (state *s)
       const char *f = init_file_name();
       char *b;
       int list_elt;
-      GtkList *list;
+      GtkWidget *list;
 
       if (!f || !*f) return 0;
       b = (char *) malloc (strlen(f) + 1024);
@@ -2480,13 +2793,13 @@ maybe_reload_init_file (state *s)
       initialize_sort_map (s);
 
       list_elt = selected_list_element (s);
-      list = GTK_LIST (name_to_widget (s, "list"));
+      list = name_to_widget (s, "list");
       gtk_container_foreach (GTK_CONTAINER (list), widget_deleter, NULL);
       populate_hack_list (s);
       force_list_select_item (s, list, list_elt, True);
       populate_prefs_page (s);
       populate_demo_window (s, list_elt);
-      ensure_selected_item_visible (GTK_WIDGET (list));
+      ensure_selected_item_visible (list);
 
       status = 1;
     }
@@ -2535,6 +2848,16 @@ clear_preview_window (state *s)
   gdk_window_set_background (window, &p->style->bg[GTK_STATE_NORMAL]);
   gdk_window_clear (window);
 
+#ifdef HAVE_GTK2
+  {
+    GtkWidget *notebook;
+
+    notebook = name_to_widget (s, "preview_notebook");
+    gtk_notebook_set_page (GTK_NOTEBOOK (notebook),
+                          s->running_preview_error_p
+                          ? 1 : 0);
+  }
+#else /* !HAVE_GTK2 */
   if (s->running_preview_error_p)
     {
       const char * const lines[] = { N_("No Preview"), N_("Available") };
@@ -2554,11 +2877,9 @@ clear_preview_window (state *s)
           y += lh;
         }
     }
+#endif /* !HAVE_GTK2 */
 
   gdk_flush ();
-
-  /* Is there a GDK way of doing this? */
-  XSync (GDK_DISPLAY(), False);
 }
 
 
@@ -3405,6 +3726,36 @@ delayed_scroll_kludge (gpointer data)
   return FALSE;  /* do not re-execute timer */
 }
 
+#ifdef HAVE_GTK2
+
+GtkWidget *
+create_xscreensaver_demo (void)
+{
+  GtkWidget *nb;
+
+  nb = name_to_widget (global_state_kludge, "preview_notebook");
+  gtk_notebook_set_show_tabs (GTK_NOTEBOOK (nb), FALSE);
+
+  return name_to_widget (global_state_kludge, "xscreensaver_demo");
+}
+
+GtkWidget *
+create_xscreensaver_settings_dialog (void)
+{
+  GtkWidget *w, *box;
+
+  box = name_to_widget (global_state_kludge, "dialog_action_area");
+
+  w = name_to_widget (global_state_kludge, "adv_button");
+  gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (box), w, TRUE);
+
+  w = name_to_widget (global_state_kludge, "std_button");
+  gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (box), w, TRUE);
+
+  return name_to_widget (global_state_kludge, "xscreensaver_settings_dialog");
+}
+
+#endif /* HAVE_GTK2 */
 
 int
 main (int argc, char **argv)
@@ -3426,11 +3777,11 @@ main (int argc, char **argv)
   textdomain (GETTEXT_PACKAGE);
 
 # ifdef HAVE_GTK2
-  bindtextdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
-# else /* ! HAVE_GTK2 */
+  bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+# else  /* !HAVE_GTK2 */
   if (!setlocale (LC_ALL, ""))
     fprintf (stderr, "%s: locale not supported by C library\n", real_progname);
-# endif /* ! HAVE_GTK2 */
+# endif /* !HAVE_GTK2 */
 
 #endif /* ENABLE_NLS */
 
@@ -3464,11 +3815,13 @@ main (int argc, char **argv)
   }
 
 #ifdef DEFAULT_ICONDIR  /* from -D on compile line */
+# ifndef HAVE_GTK2
   {
     const char *dir = DEFAULT_ICONDIR;
     if (*dir) add_pixmap_directory (dir);
   }
-#endif
+# endif /* !HAVE_GTK2 */
+#endif /* DEFAULT_ICONDIR */
 
   /* This is gross, but Gtk understands --display and not -display...
    */
@@ -3484,19 +3837,18 @@ main (int argc, char **argv)
         (!strcmp(argv[i], "--crapplet") ||
          !strcmp(argv[i], "--capplet")))
       {
-# ifdef HAVE_CRAPPLET
+# if defined(HAVE_CRAPPLET) || defined(HAVE_GTK2)
         int j;
         crapplet_p = True;
         for (j = i; j < argc; j++)  /* remove it from the list */
           argv[j] = argv[j+1];
         argc--;
-
-# else  /* !HAVE_CRAPPLET */
+# else  /* !HAVE_CRAPPLET && !HAVE_GTK2 */
         fprintf (stderr, "%s: not compiled with --crapplet support\n",
                  real_progname);
         fprintf (stderr, "%s: %s\n", real_progname, usage);
         exit (1);
-# endif /* !HAVE_CRAPPLET */
+# endif /* !HAVE_CRAPPLET && !HAVE_GTK2 */
       }
   else if (argv[i] &&
            (!strcmp(argv[i], "--debug") ||
@@ -3746,13 +4098,14 @@ main (int argc, char **argv)
                       "map", GTK_SIGNAL_FUNC(map_popup_window_cb),
                       (gpointer) s);
 
+#ifndef HAVE_GTK2
   gtk_signal_connect (GTK_OBJECT (name_to_widget (s, "prev")),
                       "map", GTK_SIGNAL_FUNC(map_prev_button_cb),
                       (gpointer) s);
   gtk_signal_connect (GTK_OBJECT (name_to_widget (s, "next")),
                       "map", GTK_SIGNAL_FUNC(map_next_button_cb),
                       (gpointer) s);
-
+#endif /* !HAVE_GTK2 */
 
   /* Hook up callbacks to the items on the mode menu. */
   {
index ea0489db425cafd792bbc7b375b761b5a9696a72..436ec83de228384a8b2d7cccf6d3ced3e82568e2 100644 (file)
@@ -1,7 +1,9 @@
 [Desktop Entry]
 Exec=xscreensaver-demo --crapplet
+TryExec=xscreensaver-demo
 Icon=xscreensaver.xpm
 Terminal=0
 _Name=Screensaver
 _Comment=Configure the settings of the screensaver.
 Type=Application
+Categories=Applications;Settings;
index cbc72d76b698bc8322a2b435f3f521a9f644f824..2ecfdfc020e6408494b1d3122c5777b3333dcbae 100644 (file)
@@ -1518,7 +1518,7 @@ mouse_screen (saver_info *si)
                              &root_x, &root_y, &win_x, &win_y, &mask))
             {
               if (p->verbose_p)
-                fprintf (stderr, "%s: mouse is on screen %d\n",
+                fprintf (stderr, "%s: mouse is on screen %d of %d\n",
                          blurb(), i, si->nscreens);
               return i;
             }
index 05bcc5b2f178552d8c3b495ffea512563eaa78fc..a3622c7af58db7698a88c24e977c5eb3256ce58e 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "11-May-2002 (4.03)" "X Version 11"
+.TH XScreenSaver 1 "31-May-2002 (4.04)" "X Version 11"
 .SH NAME
 xscreensaver-command - control a running xscreensaver process
 .SH SYNOPSIS
index e9b298eb7fb8b33749b2043e36cec5bdf24f9b61..71f91d4d0416a3d0452891631afd2c03460c032f 100644 (file)
@@ -25,6 +25,7 @@
 <widget>
   <class>GtkWindow</class>
   <name>xscreensaver_demo</name>
+  <visible>False</visible>
   <title>XScreenSaver</title>
   <type>GTK_WINDOW_TOPLEVEL</type>
   <position>GTK_WIN_POS_NONE</position>
@@ -1879,6 +1880,7 @@ Random Screen Saver
 <widget>
   <class>GtkDialog</class>
   <name>xscreensaver_settings_dialog</name>
+  <visible>False</visible>
   <title>XScreenSaver: Mode-Specific Settings</title>
   <type>GTK_WINDOW_DIALOG</type>
   <position>GTK_WIN_POS_NONE</position>
diff --git a/driver/xscreensaver-demo.glade2 b/driver/xscreensaver-demo.glade2
new file mode 100644 (file)
index 0000000..4e51989
--- /dev/null
@@ -0,0 +1,2162 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
+
+<glade-interface>
+
+<widget class="GtkWindow" id="xscreensaver_demo">
+  <property name="title" translatable="yes">XScreenSaver</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="wmclass_name">xscreensaver</property>
+  <property name="wmclass_class">XScreenSaver</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+
+  <child>
+    <widget class="GtkVBox" id="outer_vbox">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">5</property>
+
+      <child>
+       <widget class="GtkMenuBar" id="menubar">
+         <property name="visible">True</property>
+
+         <child>
+           <widget class="GtkMenuItem" id="file">
+             <property name="visible">True</property>
+             <property name="label" translatable="yes">_File</property>
+             <property name="use_underline">True</property>
+
+             <child>
+               <widget class="GtkMenu" id="file_menu">
+
+                 <child>
+                   <widget class="GtkMenuItem" id="activate_menu">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">_Blank Screen Now</property>
+                     <property name="use_underline">True</property>
+                     <signal name="activate" handler="activate_menu_cb"/>
+                   </widget>
+                 </child>
+
+                 <child>
+                   <widget class="GtkMenuItem" id="lock_menu">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">_Lock Screen Now</property>
+                     <property name="use_underline">True</property>
+                     <signal name="activate" handler="lock_menu_cb"/>
+                   </widget>
+                 </child>
+
+                 <child>
+                   <widget class="GtkMenuItem" id="kill_menu">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">_Kill Daemon</property>
+                     <property name="use_underline">True</property>
+                     <signal name="activate" handler="kill_menu_cb"/>
+                   </widget>
+                 </child>
+
+                 <child>
+                   <widget class="GtkMenuItem" id="restart">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">_Restart Daemon</property>
+                     <property name="use_underline">True</property>
+                     <signal name="activate" handler="restart_menu_cb"/>
+                   </widget>
+                 </child>
+
+                 <child>
+                   <widget class="GtkMenuItem" id="separator1">
+                     <property name="visible">True</property>
+                   </widget>
+                 </child>
+
+                 <child>
+                   <widget class="GtkMenuItem" id="exit_menu">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">_Quit</property>
+                     <property name="use_underline">True</property>
+                     <signal name="activate" handler="exit_menu_cb"/>
+                   </widget>
+                 </child>
+               </widget>
+             </child>
+           </widget>
+         </child>
+
+         <child>
+           <widget class="GtkMenuItem" id="help">
+             <property name="visible">True</property>
+             <property name="label" translatable="yes">_Help</property>
+             <property name="use_underline">True</property>
+
+             <child>
+               <widget class="GtkMenu" id="help_menu">
+
+                 <child>
+                   <widget class="GtkMenuItem" id="about_menu">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">_About...</property>
+                     <property name="use_underline">True</property>
+                     <signal name="activate" handler="about_menu_cb"/>
+                   </widget>
+                 </child>
+
+                 <child>
+                   <widget class="GtkMenuItem" id="doc_menu">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">_Documentation...</property>
+                     <property name="use_underline">True</property>
+                     <signal name="activate" handler="doc_menu_cb"/>
+                   </widget>
+                 </child>
+               </widget>
+             </child>
+           </widget>
+         </child>
+       </widget>
+       <packing>
+         <property name="padding">0</property>
+         <property name="expand">False</property>
+         <property name="fill">False</property>
+       </packing>
+      </child>
+
+      <child>
+       <widget class="GtkNotebook" id="notebook">
+         <property name="visible">True</property>
+         <property name="can_focus">True</property>
+         <property name="show_tabs">True</property>
+         <property name="show_border">True</property>
+         <property name="tab_pos">GTK_POS_TOP</property>
+         <property name="scrollable">False</property>
+         <property name="tab_hborder">2</property>
+         <property name="tab_vborder">2</property>
+         <property name="enable_popup">False</property>
+         <signal name="switch_page" handler="switch_page_cb"/>
+
+         <child>
+           <widget class="GtkTable" id="demos_table">
+             <property name="border_width">10</property>
+             <property name="visible">True</property>
+             <property name="n_rows">2</property>
+             <property name="n_columns">2</property>
+             <property name="homogeneous">False</property>
+             <property name="row_spacing">0</property>
+             <property name="column_spacing">0</property>
+
+             <child>
+               <widget class="GtkTable" id="blanking_table">
+                 <property name="visible">True</property>
+                 <property name="n_rows">3</property>
+                 <property name="n_columns">4</property>
+                 <property name="homogeneous">False</property>
+                 <property name="row_spacing">2</property>
+                 <property name="column_spacing">0</property>
+
+                 <child>
+                   <widget class="GtkLabel" id="cycle_label">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">_Cycle After</property>
+                     <property name="use_underline">True</property>
+                     <property name="use_markup">False</property>
+                     <property name="justify">GTK_JUSTIFY_RIGHT</property>
+                     <property name="wrap">False</property>
+                     <property name="selectable">False</property>
+                     <property name="xalign">1</property>
+                     <property name="yalign">0.5</property>
+                     <property name="xpad">8</property>
+                     <property name="ypad">0</property>
+                     <property name="mnemonic_widget">cycle_spinbutton</property>
+                   </widget>
+                   <packing>
+                     <property name="left_attach">1</property>
+                     <property name="right_attach">2</property>
+                     <property name="top_attach">1</property>
+                     <property name="bottom_attach">2</property>
+                     <property name="x_options">fill</property>
+                     <property name="y_options"></property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkEventBox" id="lock_button_eventbox">
+                     <property name="visible">True</property>
+                     <property name="tooltip" translatable="yes">Whether a password should be required to un-blank the screen.</property>
+
+                     <child>
+                       <widget class="GtkCheckButton" id="lock_button">
+                         <property name="visible">True</property>
+                         <property name="can_focus">True</property>
+                         <property name="label" translatable="yes">_Lock Screen After</property>
+                         <property name="use_underline">True</property>
+                         <property name="relief">GTK_RELIEF_NORMAL</property>
+                         <property name="active">False</property>
+                         <property name="inconsistent">False</property>
+                         <property name="draw_indicator">True</property>
+                         <signal name="toggled" handler="pref_changed_cb"/>
+                       </widget>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="left_attach">0</property>
+                     <property name="right_attach">2</property>
+                     <property name="top_attach">2</property>
+                     <property name="bottom_attach">3</property>
+                     <property name="x_options">fill</property>
+                     <property name="y_options"></property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkLabel" id="timeout_label">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">_Blank After</property>
+                     <property name="use_underline">True</property>
+                     <property name="use_markup">False</property>
+                     <property name="justify">GTK_JUSTIFY_RIGHT</property>
+                     <property name="wrap">False</property>
+                     <property name="selectable">False</property>
+                     <property name="xalign">1</property>
+                     <property name="yalign">0.5</property>
+                     <property name="xpad">8</property>
+                     <property name="ypad">0</property>
+                     <property name="mnemonic_widget">timeout_spinbutton</property>
+                   </widget>
+                   <packing>
+                     <property name="left_attach">1</property>
+                     <property name="right_attach">2</property>
+                     <property name="top_attach">0</property>
+                     <property name="bottom_attach">1</property>
+                     <property name="x_options">fill</property>
+                     <property name="y_options"></property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkSpinButton" id="timeout_spinbutton">
+                     <property name="visible">True</property>
+                     <property name="tooltip" translatable="yes">How long before the monitor goes completely black.</property>
+                     <property name="can_focus">True</property>
+                     <property name="climb_rate">15</property>
+                     <property name="digits">0</property>
+                     <property name="numeric">True</property>
+                     <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+                     <property name="snap_to_ticks">True</property>
+                     <property name="wrap">False</property>
+                     <property name="adjustment">1 1 720 1 15 15</property>
+                     <signal name="activate" handler="pref_changed_cb"/>
+                     <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+                     <signal name="value_changed" handler="pref_changed_cb"/>
+                   </widget>
+                   <packing>
+                     <property name="left_attach">2</property>
+                     <property name="right_attach">3</property>
+                     <property name="top_attach">0</property>
+                     <property name="bottom_attach">1</property>
+                     <property name="x_options">fill</property>
+                     <property name="y_options"></property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkLabel" id="timeout_mlabel">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">minutes</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</property>
+                     <property name="yalign">0.5</property>
+                     <property name="xpad">0</property>
+                     <property name="ypad">0</property>
+                   </widget>
+                   <packing>
+                     <property name="left_attach">3</property>
+                     <property name="right_attach">4</property>
+                     <property name="top_attach">0</property>
+                     <property name="bottom_attach">1</property>
+                     <property name="y_options"></property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkLabel" id="cycle_mlabel">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">minutes</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</property>
+                     <property name="yalign">0.5</property>
+                     <property name="xpad">0</property>
+                     <property name="ypad">0</property>
+                   </widget>
+                   <packing>
+                     <property name="left_attach">3</property>
+                     <property name="right_attach">4</property>
+                     <property name="top_attach">1</property>
+                     <property name="bottom_attach">2</property>
+                     <property name="y_options"></property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkLabel" id="lock_mlabel">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">minutes</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</property>
+                     <property name="yalign">0.5</property>
+                     <property name="xpad">0</property>
+                     <property name="ypad">0</property>
+                   </widget>
+                   <packing>
+                     <property name="left_attach">3</property>
+                     <property name="right_attach">4</property>
+                     <property name="top_attach">2</property>
+                     <property name="bottom_attach">3</property>
+                     <property name="y_options"></property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkSpinButton" id="lock_spinbutton">
+                     <property name="visible">True</property>
+                     <property name="tooltip" translatable="yes">How long before the monitor goes completely black.</property>
+                     <property name="can_focus">True</property>
+                     <property name="climb_rate">15</property>
+                     <property name="digits">0</property>
+                     <property name="numeric">True</property>
+                     <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+                     <property name="snap_to_ticks">True</property>
+                     <property name="wrap">False</property>
+                     <property name="adjustment">0 0 720 1 15 15</property>
+                     <signal name="activate" handler="pref_changed_cb"/>
+                     <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+                     <signal name="value_changed" handler="pref_changed_cb"/>
+                   </widget>
+                   <packing>
+                     <property name="left_attach">2</property>
+                     <property name="right_attach">3</property>
+                     <property name="top_attach">2</property>
+                     <property name="bottom_attach">3</property>
+                     <property name="y_padding">10</property>
+                     <property name="x_options">fill</property>
+                     <property name="y_options"></property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkSpinButton" id="cycle_spinbutton">
+                     <property name="visible">True</property>
+                     <property name="tooltip" translatable="yes">How long before the monitor goes completely black.</property>
+                     <property name="can_focus">True</property>
+                     <property name="climb_rate">15</property>
+                     <property name="digits">0</property>
+                     <property name="numeric">True</property>
+                     <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+                     <property name="snap_to_ticks">True</property>
+                     <property name="wrap">False</property>
+                     <property name="adjustment">1 1 720 1 15 15</property>
+                     <signal name="activate" handler="pref_changed_cb"/>
+                     <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+                     <signal name="value_changed" handler="pref_changed_cb"/>
+                   </widget>
+                   <packing>
+                     <property name="left_attach">2</property>
+                     <property name="right_attach">3</property>
+                     <property name="top_attach">1</property>
+                     <property name="bottom_attach">2</property>
+                     <property name="x_options">fill</property>
+                     <property name="y_options"></property>
+                   </packing>
+                 </child>
+               </widget>
+               <packing>
+                 <property name="left_attach">0</property>
+                 <property name="right_attach">1</property>
+                 <property name="top_attach">1</property>
+                 <property name="bottom_attach">2</property>
+                 <property name="x_options">fill</property>
+                 <property name="y_options">fill</property>
+               </packing>
+             </child>
+
+             <child>
+               <widget class="GtkHButtonBox" id="demo_manual_hbbox">
+                 <property name="visible">True</property>
+                 <property name="layout_style">GTK_BUTTONBOX_SPREAD</property>
+                 <property name="spacing">30</property>
+
+                 <child>
+                   <widget class="GtkButton" id="demo">
+                     <property name="visible">True</property>
+                     <property name="can_default">True</property>
+                     <property name="can_focus">True</property>
+                     <property name="label" translatable="yes">_Preview</property>
+                     <property name="use_underline">True</property>
+                     <property name="relief">GTK_RELIEF_NORMAL</property>
+                     <signal name="clicked" handler="run_this_cb"/>
+                   </widget>
+                 </child>
+
+                 <child>
+                   <widget class="GtkButton" id="settings">
+                     <property name="visible">True</property>
+                     <property name="can_default">True</property>
+                     <property name="can_focus">True</property>
+                     <property name="label" translatable="yes">_Settings...</property>
+                     <property name="use_underline">True</property>
+                     <property name="relief">GTK_RELIEF_NORMAL</property>
+                     <signal name="clicked" handler="settings_cb"/>
+                   </widget>
+                 </child>
+               </widget>
+               <packing>
+                 <property name="left_attach">1</property>
+                 <property name="right_attach">2</property>
+                 <property name="top_attach">1</property>
+                 <property name="bottom_attach">2</property>
+                 <property name="x_options">fill</property>
+                 <property name="y_options">fill</property>
+               </packing>
+             </child>
+
+             <child>
+               <widget class="GtkVBox" id="list_vbox">
+                 <property name="border_width">10</property>
+                 <property name="visible">True</property>
+                 <property name="homogeneous">False</property>
+                 <property name="spacing">0</property>
+
+                 <child>
+                   <widget class="GtkHBox" id="mode_hbox">
+                     <property name="visible">True</property>
+                     <property name="homogeneous">False</property>
+                     <property name="spacing">0</property>
+
+                     <child>
+                       <widget class="GtkLabel" id="mode_label">
+                         <property name="visible">True</property>
+                         <property name="label" translatable="yes">_Mode:</property>
+                         <property name="use_underline">True</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</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">0</property>
+                         <property name="ypad">0</property>
+                         <property name="mnemonic_widget">mode_menu</property>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">False</property>
+                         <property name="fill">False</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkOptionMenu" id="mode_menu">
+                         <property name="visible">True</property>
+                         <property name="can_focus">True</property>
+                         <property name="history">0</property>
+
+                         <child internal-child="menu">
+                           <widget class="GtkMenu" id="convertwidget1">
+                             <property name="visible">True</property>
+
+                             <child>
+                               <widget class="GtkMenuItem" id="convertwidget2">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes">Disable Screen Saver</property>
+                                 <property name="use_underline">True</property>
+                               </widget>
+                             </child>
+
+                             <child>
+                               <widget class="GtkMenuItem" id="convertwidget3">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes">Blank Screen Only</property>
+                                 <property name="use_underline">True</property>
+                               </widget>
+                             </child>
+
+                             <child>
+                               <widget class="GtkMenuItem" id="convertwidget4">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes">Only One Screen Saver</property>
+                                 <property name="use_underline">True</property>
+                               </widget>
+                             </child>
+
+                             <child>
+                               <widget class="GtkMenuItem" id="convertwidget5">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes">Random Screen Saver</property>
+                                 <property name="use_underline">True</property>
+                               </widget>
+                             </child>
+                           </widget>
+                         </child>
+                       </widget>
+                       <packing>
+                         <property name="padding">4</property>
+                         <property name="expand">True</property>
+                         <property name="fill">True</property>
+                       </packing>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="padding">10</property>
+                     <property name="expand">False</property>
+                     <property name="fill">True</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkScrolledWindow" id="scroller">
+                     <property name="visible">True</property>
+                     <property name="can_focus">True</property>
+                     <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
+                     <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
+                     <property name="shadow_type">GTK_SHADOW_IN</property>
+                     <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+                     <child>
+                       <widget class="GtkTreeView" id="list">
+                         <property name="visible">True</property>
+                         <property name="can_focus">True</property>
+                         <property name="headers_visible">False</property>
+                         <property name="rules_hint">True</property>
+                         <property name="reorderable">False</property>
+                         <property name="enable_search">True</property>
+                       </widget>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="padding">0</property>
+                     <property name="expand">True</property>
+                     <property name="fill">True</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkHBox" id="centering_hbox">
+                     <property name="visible">True</property>
+                     <property name="homogeneous">True</property>
+                     <property name="spacing">0</property>
+
+                     <child>
+                       <widget class="GtkHBox" id="next_prev_hbox">
+                         <property name="visible">True</property>
+                         <property name="homogeneous">False</property>
+                         <property name="spacing">0</property>
+
+                         <child>
+                           <widget class="GtkButton" id="next">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="relief">GTK_RELIEF_NORMAL</property>
+                             <signal name="clicked" handler="run_next_cb"/>
+
+                             <child>
+                               <widget class="GtkArrow" id="arrow1">
+                                 <property name="visible">True</property>
+                                 <property name="arrow_type">GTK_ARROW_DOWN</property>
+                                 <property name="shadow_type">GTK_SHADOW_OUT</property>
+                                 <property name="xalign">0.5</property>
+                                 <property name="yalign">0.5</property>
+                                 <property name="xpad">0</property>
+                                 <property name="ypad">0</property>
+                               </widget>
+                             </child>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkButton" id="prev">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="relief">GTK_RELIEF_NORMAL</property>
+                             <signal name="clicked" handler="run_prev_cb"/>
+
+                             <child>
+                               <widget class="GtkArrow" id="arrow2">
+                                 <property name="visible">True</property>
+                                 <property name="arrow_type">GTK_ARROW_UP</property>
+                                 <property name="shadow_type">GTK_SHADOW_OUT</property>
+                                 <property name="xalign">0.5</property>
+                                 <property name="yalign">0.5</property>
+                                 <property name="xpad">0</property>
+                                 <property name="ypad">0</property>
+                               </widget>
+                             </child>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">False</property>
+                         <property name="fill">False</property>
+                       </packing>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="padding">0</property>
+                     <property name="expand">False</property>
+                     <property name="fill">True</property>
+                     <property name="pack_type">GTK_PACK_END</property>
+                   </packing>
+                 </child>
+               </widget>
+               <packing>
+                 <property name="left_attach">0</property>
+                 <property name="right_attach">1</property>
+                 <property name="top_attach">0</property>
+                 <property name="bottom_attach">1</property>
+                 <property name="x_options">fill</property>
+               </packing>
+             </child>
+
+             <child>
+               <widget class="GtkFrame" id="preview_frame">
+                 <property name="visible">True</property>
+                 <property name="label" translatable="yes">Description</property>
+                 <property name="label_xalign">0</property>
+                 <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+
+                 <child>
+                   <widget class="GtkNotebook" id="preview_notebook">
+                     <property name="visible">True</property>
+                     <property name="can_focus">True</property>
+                     <property name="show_tabs">True</property>
+                     <property name="show_border">False</property>
+                     <property name="tab_pos">GTK_POS_BOTTOM</property>
+                     <property name="scrollable">False</property>
+                     <property name="tab_hborder">2</property>
+                     <property name="tab_vborder">2</property>
+                     <property name="enable_popup">False</property>
+
+                     <child>
+                       <widget class="GtkAspectFrame" id="preview_aspectframe">
+                         <property name="border_width">8</property>
+                         <property name="visible">True</property>
+                         <property name="label_xalign">0</property>
+                         <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+                         <property name="xalign">0.5</property>
+                         <property name="yalign">0.5</property>
+                         <property name="ratio">1.33</property>
+                         <property name="obey_child">False</property>
+
+                         <child>
+                           <widget class="GtkDrawingArea" id="preview">
+                             <property name="visible">True</property>
+                             <accessibility>
+                               <atkproperty name="AtkObject::accessible_description" translatable="yes">Preview of screen saver</atkproperty>
+                             </accessibility>
+                           </widget>
+                         </child>
+                       </widget>
+                       <packing>
+                         <property name="tab_expand">False</property>
+                         <property name="tab_fill">True</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkLabel" id="preview_tab">
+                         <property name="visible">True</property>
+                         <property name="label" translatable="yes">preview</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>
+
+                     <child>
+                       <widget class="GtkLabel" id="no_preview_label">
+                         <property name="visible">True</property>
+                         <property name="label" translatable="yes">No Preview
+Available</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="tab_expand">False</property>
+                         <property name="tab_fill">True</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkLabel" id="no_preview_tab">
+                         <property name="visible">True</property>
+                         <property name="label" translatable="yes">no preview</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>
+               </widget>
+               <packing>
+                 <property name="left_attach">1</property>
+                 <property name="right_attach">2</property>
+                 <property name="top_attach">0</property>
+                 <property name="bottom_attach">1</property>
+                 <property name="y_padding">6</property>
+                 <property name="x_options">expand|shrink|fill</property>
+                 <property name="y_options">expand|shrink|fill</property>
+               </packing>
+             </child>
+           </widget>
+           <packing>
+             <property name="tab_expand">False</property>
+             <property name="tab_fill">True</property>
+           </packing>
+         </child>
+
+         <child>
+           <widget class="GtkLabel" id="demo_tab">
+             <property name="visible">True</property>
+             <property name="label" translatable="yes">_Display Modes</property>
+             <property name="use_underline">True</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="type">tab</property>
+           </packing>
+         </child>
+
+         <child>
+           <widget class="GtkTable" id="options_table">
+             <property name="visible">True</property>
+             <property name="n_rows">2</property>
+             <property name="n_columns">2</property>
+             <property name="homogeneous">True</property>
+             <property name="row_spacing">0</property>
+             <property name="column_spacing">0</property>
+
+             <child>
+               <widget class="GtkFrame" id="grab_frame">
+                 <property name="border_width">10</property>
+                 <property name="visible">True</property>
+                 <property name="label" translatable="yes">Image Manipulation</property>
+                 <property name="label_xalign">0</property>
+                 <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+
+                 <child>
+                   <widget class="GtkHBox" id="grab_hbox">
+                     <property name="border_width">8</property>
+                     <property name="visible">True</property>
+                     <property name="homogeneous">False</property>
+                     <property name="spacing">8</property>
+
+                     <child>
+                       <widget class="GtkImage" id="image2">
+                         <property name="visible">True</property>
+                         <property name="pixbuf">screensaver-snap.xpm</property>
+                         <property name="xalign">0</property>
+                         <property name="yalign">0</property>
+                         <property name="xpad">4</property>
+                         <property name="ypad">8</property>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">False</property>
+                         <property name="fill">False</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkVBox" id="grab_vbox">
+                         <property name="visible">True</property>
+                         <property name="homogeneous">False</property>
+                         <property name="spacing">0</property>
+
+                         <child>
+                           <widget class="GtkCheckButton" id="grab_desk_button">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="label" translatable="yes">Grab Desktop _Images</property>
+                             <property name="use_underline">True</property>
+                             <property name="relief">GTK_RELIEF_NORMAL</property>
+                             <property name="active">False</property>
+                             <property name="inconsistent">False</property>
+                             <property name="draw_indicator">True</property>
+                             <signal name="toggled" handler="pref_changed_cb"/>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkCheckButton" id="grab_video_button">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="label" translatable="yes">Grab _Video Frames</property>
+                             <property name="use_underline">True</property>
+                             <property name="relief">GTK_RELIEF_NORMAL</property>
+                             <property name="active">False</property>
+                             <property name="inconsistent">False</property>
+                             <property name="draw_indicator">True</property>
+                             <signal name="toggled" handler="pref_changed_cb"/>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkCheckButton" id="grab_image_button">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="label" translatable="yes">Choose _Random Image:</property>
+                             <property name="use_underline">True</property>
+                             <property name="relief">GTK_RELIEF_NORMAL</property>
+                             <property name="active">False</property>
+                             <property name="inconsistent">False</property>
+                             <property name="draw_indicator">True</property>
+                             <signal name="toggled" handler="pref_changed_cb"/>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkHBox" id="image_hbox">
+                             <property name="visible">True</property>
+                             <property name="homogeneous">False</property>
+                             <property name="spacing">0</property>
+
+                             <child>
+                               <widget class="GtkLabel" id="grab_dummy">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes"></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">8</property>
+                                 <property name="ypad">0</property>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkEntry" id="image_text">
+                                 <property name="visible">True</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="editable">True</property>
+                                 <property name="visibility">True</property>
+                                 <property name="max_length">0</property>
+                                 <property name="text" translatable="yes"></property>
+                                 <property name="has_frame">True</property>
+                                 <property name="invisible_char" translatable="yes">*</property>
+                                 <property name="activates_default">False</property>
+                                 <signal name="activate" handler="pref_changed_cb"/>
+                                 <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">True</property>
+                                 <property name="fill">True</property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkButton" id="image_browse_button">
+                                 <property name="visible">True</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="label" translatable="yes">_Browse</property>
+                                 <property name="use_underline">True</property>
+                                 <property name="relief">GTK_RELIEF_NORMAL</property>
+                                 <signal name="clicked" handler="browse_image_dir_cb"/>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                               </packing>
+                             </child>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">True</property>
+                         <property name="fill">True</property>
+                       </packing>
+                     </child>
+                   </widget>
+                 </child>
+               </widget>
+               <packing>
+                 <property name="left_attach">0</property>
+                 <property name="right_attach">1</property>
+                 <property name="top_attach">0</property>
+                 <property name="bottom_attach">1</property>
+               </packing>
+             </child>
+
+             <child>
+               <widget class="GtkFrame" id="diag_frame">
+                 <property name="border_width">10</property>
+                 <property name="visible">True</property>
+                 <property name="label" translatable="yes">Diagnostics</property>
+                 <property name="label_xalign">0</property>
+                 <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+
+                 <child>
+                   <widget class="GtkHBox" id="diag_hbox">
+                     <property name="border_width">8</property>
+                     <property name="visible">True</property>
+                     <property name="homogeneous">False</property>
+                     <property name="spacing">8</property>
+
+                     <child>
+                       <widget class="GtkImage" id="diag_logo">
+                         <property name="visible">True</property>
+                         <property name="pixbuf">screensaver-diagnostic.xpm</property>
+                         <property name="xalign">0.5</property>
+                         <property name="yalign">0</property>
+                         <property name="xpad">0</property>
+                         <property name="ypad">0</property>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">False</property>
+                         <property name="fill">False</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkVBox" id="diag_vbox">
+                         <property name="visible">True</property>
+                         <property name="homogeneous">False</property>
+                         <property name="spacing">0</property>
+
+                         <child>
+                           <widget class="GtkCheckButton" id="verbose_button">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="label" translatable="yes">_Verbose Dialognostics</property>
+                             <property name="use_underline">True</property>
+                             <property name="relief">GTK_RELIEF_NORMAL</property>
+                             <property name="active">False</property>
+                             <property name="inconsistent">False</property>
+                             <property name="draw_indicator">True</property>
+                             <signal name="toggled" handler="pref_changed_cb"/>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkCheckButton" id="capture_button">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="label" translatable="yes">Display Subprocess _Errors</property>
+                             <property name="use_underline">True</property>
+                             <property name="relief">GTK_RELIEF_NORMAL</property>
+                             <property name="active">False</property>
+                             <property name="inconsistent">False</property>
+                             <property name="draw_indicator">True</property>
+                             <signal name="toggled" handler="pref_changed_cb"/>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkCheckButton" id="splash_button">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="label" translatable="yes">Display _Splash Screen at Startup</property>
+                             <property name="use_underline">True</property>
+                             <property name="relief">GTK_RELIEF_NORMAL</property>
+                             <property name="active">False</property>
+                             <property name="inconsistent">False</property>
+                             <property name="draw_indicator">True</property>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">True</property>
+                         <property name="fill">True</property>
+                       </packing>
+                     </child>
+                   </widget>
+                 </child>
+               </widget>
+               <packing>
+                 <property name="left_attach">0</property>
+                 <property name="right_attach">1</property>
+                 <property name="top_attach">1</property>
+                 <property name="bottom_attach">2</property>
+                 <property name="x_options">fill</property>
+               </packing>
+             </child>
+
+             <child>
+               <widget class="GtkFrame" id="dpms_frame">
+                 <property name="border_width">10</property>
+                 <property name="visible">True</property>
+                 <property name="label" translatable="yes">Display Power Management</property>
+                 <property name="label_xalign">0</property>
+                 <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+
+                 <child>
+                   <widget class="GtkHBox" id="dpms_hbox">
+                     <property name="border_width">8</property>
+                     <property name="visible">True</property>
+                     <property name="homogeneous">False</property>
+                     <property name="spacing">8</property>
+
+                     <child>
+                       <widget class="GtkImage" id="dpms_logo">
+                         <property name="visible">True</property>
+                         <property name="pixbuf">screensaver-power.xpm</property>
+                         <property name="xalign">0.5</property>
+                         <property name="yalign">0</property>
+                         <property name="xpad">0</property>
+                         <property name="ypad">0</property>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">False</property>
+                         <property name="fill">False</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkVBox" id="vbox6">
+                         <property name="visible">True</property>
+                         <property name="homogeneous">False</property>
+                         <property name="spacing">0</property>
+
+                         <child>
+                           <widget class="GtkCheckButton" id="dpms_button">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="label" translatable="yes">_Power Management Enabled</property>
+                             <property name="use_underline">True</property>
+                             <property name="relief">GTK_RELIEF_NORMAL</property>
+                             <property name="active">True</property>
+                             <property name="inconsistent">False</property>
+                             <property name="draw_indicator">True</property>
+                             <signal name="toggled" handler="pref_changed_cb"/>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkTable" id="dpms_table">
+                             <property name="visible">True</property>
+                             <property name="n_rows">3</property>
+                             <property name="n_columns">3</property>
+                             <property name="homogeneous">False</property>
+                             <property name="row_spacing">2</property>
+                             <property name="column_spacing">4</property>
+
+                             <child>
+                               <widget class="GtkLabel" id="dpms_standby_label">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes">Stand_by After</property>
+                                 <property name="use_underline">True</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">1</property>
+                                 <property name="yalign">0.5</property>
+                                 <property name="xpad">10</property>
+                                 <property name="ypad">0</property>
+                                 <property name="mnemonic_widget">dpms_standby_spinbutton</property>
+                               </widget>
+                               <packing>
+                                 <property name="left_attach">0</property>
+                                 <property name="right_attach">1</property>
+                                 <property name="top_attach">0</property>
+                                 <property name="bottom_attach">1</property>
+                                 <property name="x_options">fill</property>
+                                 <property name="y_options"></property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkLabel" id="dpms_suspend_label">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes">Sus_pend After</property>
+                                 <property name="use_underline">True</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">1</property>
+                                 <property name="yalign">0.5</property>
+                                 <property name="xpad">10</property>
+                                 <property name="ypad">0</property>
+                                 <property name="mnemonic_widget">dpms_suspend_spinbutton</property>
+                               </widget>
+                               <packing>
+                                 <property name="left_attach">0</property>
+                                 <property name="right_attach">1</property>
+                                 <property name="top_attach">1</property>
+                                 <property name="bottom_attach">2</property>
+                                 <property name="x_options">fill</property>
+                                 <property name="y_options"></property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkLabel" id="dpms_off_label">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes">_Off After</property>
+                                 <property name="use_underline">True</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">1</property>
+                                 <property name="yalign">0.5</property>
+                                 <property name="xpad">10</property>
+                                 <property name="ypad">0</property>
+                                 <property name="mnemonic_widget">dpms_off_spinbutton</property>
+                               </widget>
+                               <packing>
+                                 <property name="left_attach">0</property>
+                                 <property name="right_attach">1</property>
+                                 <property name="top_attach">2</property>
+                                 <property name="bottom_attach">3</property>
+                                 <property name="x_options">fill</property>
+                                 <property name="y_options"></property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkLabel" id="dpms_standby_mlabel">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes">minutes</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</property>
+                                 <property name="yalign">0.5</property>
+                                 <property name="xpad">0</property>
+                                 <property name="ypad">0</property>
+                               </widget>
+                               <packing>
+                                 <property name="left_attach">2</property>
+                                 <property name="right_attach">3</property>
+                                 <property name="top_attach">0</property>
+                                 <property name="bottom_attach">1</property>
+                                 <property name="x_options">fill</property>
+                                 <property name="y_options"></property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkLabel" id="dpms_suspend_mlabel">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes">minutes</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</property>
+                                 <property name="yalign">0.5</property>
+                                 <property name="xpad">0</property>
+                                 <property name="ypad">0</property>
+                               </widget>
+                               <packing>
+                                 <property name="left_attach">2</property>
+                                 <property name="right_attach">3</property>
+                                 <property name="top_attach">1</property>
+                                 <property name="bottom_attach">2</property>
+                                 <property name="x_options">fill</property>
+                                 <property name="y_options"></property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkLabel" id="dpms_off_mlabel">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes">minutes</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</property>
+                                 <property name="yalign">0.5</property>
+                                 <property name="xpad">0</property>
+                                 <property name="ypad">0</property>
+                               </widget>
+                               <packing>
+                                 <property name="left_attach">2</property>
+                                 <property name="right_attach">3</property>
+                                 <property name="top_attach">2</property>
+                                 <property name="bottom_attach">3</property>
+                                 <property name="x_options">fill</property>
+                                 <property name="y_options"></property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkSpinButton" id="dpms_off_spinbutton">
+                                 <property name="visible">True</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="climb_rate">15</property>
+                                 <property name="digits">0</property>
+                                 <property name="numeric">True</property>
+                                 <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+                                 <property name="snap_to_ticks">True</property>
+                                 <property name="wrap">False</property>
+                                 <property name="adjustment">0 0 1440 1 15 15</property>
+                                 <signal name="activate" handler="pref_changed_cb"/>
+                                 <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+                                 <signal name="value_changed" handler="pref_changed_cb"/>
+                               </widget>
+                               <packing>
+                                 <property name="left_attach">1</property>
+                                 <property name="right_attach">2</property>
+                                 <property name="top_attach">2</property>
+                                 <property name="bottom_attach">3</property>
+                                 <property name="x_options"></property>
+                                 <property name="y_options"></property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkSpinButton" id="dpms_suspend_spinbutton">
+                                 <property name="visible">True</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="climb_rate">15</property>
+                                 <property name="digits">0</property>
+                                 <property name="numeric">True</property>
+                                 <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+                                 <property name="snap_to_ticks">True</property>
+                                 <property name="wrap">False</property>
+                                 <property name="adjustment">0 0 1440 1 15 15</property>
+                                 <signal name="activate" handler="pref_changed_cb"/>
+                                 <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+                                 <signal name="value_changed" handler="pref_changed_cb"/>
+                               </widget>
+                               <packing>
+                                 <property name="left_attach">1</property>
+                                 <property name="right_attach">2</property>
+                                 <property name="top_attach">1</property>
+                                 <property name="bottom_attach">2</property>
+                                 <property name="x_options"></property>
+                                 <property name="y_options"></property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkSpinButton" id="dpms_standby_spinbutton">
+                                 <property name="visible">True</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="climb_rate">15</property>
+                                 <property name="digits">0</property>
+                                 <property name="numeric">True</property>
+                                 <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+                                 <property name="snap_to_ticks">True</property>
+                                 <property name="wrap">False</property>
+                                 <property name="adjustment">0 0 1440 1 15 15</property>
+                                 <signal name="activate" handler="pref_changed_cb"/>
+                                 <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+                                 <signal name="value_changed" handler="pref_changed_cb"/>
+                               </widget>
+                               <packing>
+                                 <property name="left_attach">1</property>
+                                 <property name="right_attach">2</property>
+                                 <property name="top_attach">0</property>
+                                 <property name="bottom_attach">1</property>
+                                 <property name="x_options"></property>
+                                 <property name="y_options"></property>
+                               </packing>
+                             </child>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">True</property>
+                             <property name="fill">True</property>
+                           </packing>
+                         </child>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">True</property>
+                         <property name="fill">True</property>
+                       </packing>
+                     </child>
+                   </widget>
+                 </child>
+               </widget>
+               <packing>
+                 <property name="left_attach">1</property>
+                 <property name="right_attach">2</property>
+                 <property name="top_attach">0</property>
+                 <property name="bottom_attach">1</property>
+                 <property name="y_options">fill</property>
+               </packing>
+             </child>
+
+             <child>
+               <widget class="GtkFrame" id="cmap_frame">
+                 <property name="border_width">10</property>
+                 <property name="visible">True</property>
+                 <property name="label" translatable="yes">Colormaps</property>
+                 <property name="label_xalign">0</property>
+                 <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+
+                 <child>
+                   <widget class="GtkHBox" id="cmap_hbox">
+                     <property name="border_width">8</property>
+                     <property name="visible">True</property>
+                     <property name="homogeneous">False</property>
+                     <property name="spacing">8</property>
+
+                     <child>
+                       <widget class="GtkImage" id="image5">
+                         <property name="visible">True</property>
+                         <property name="pixbuf">screensaver-colorselector.xpm</property>
+                         <property name="xalign">0.5</property>
+                         <property name="yalign">0</property>
+                         <property name="xpad">0</property>
+                         <property name="ypad">0</property>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">False</property>
+                         <property name="fill">False</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkVBox" id="vbox7">
+                         <property name="visible">True</property>
+                         <property name="homogeneous">False</property>
+                         <property name="spacing">0</property>
+
+                         <child>
+                           <widget class="GtkCheckButton" id="install_button">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="label" translatable="yes">Install _Colormap</property>
+                             <property name="use_underline">True</property>
+                             <property name="relief">GTK_RELIEF_NORMAL</property>
+                             <property name="active">False</property>
+                             <property name="inconsistent">False</property>
+                             <property name="draw_indicator">True</property>
+                             <signal name="toggled" handler="pref_changed_cb"/>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkHSeparator" id="cmap_hr">
+                             <property name="visible">True</property>
+                           </widget>
+                           <packing>
+                             <property name="padding">4</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkCheckButton" id="fade_button">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="label" translatable="yes">Fade to Black when _Blanking</property>
+                             <property name="use_underline">True</property>
+                             <property name="relief">GTK_RELIEF_NORMAL</property>
+                             <property name="active">False</property>
+                             <property name="inconsistent">False</property>
+                             <property name="draw_indicator">True</property>
+                             <signal name="toggled" handler="pref_changed_cb"/>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkCheckButton" id="unfade_button">
+                             <property name="visible">True</property>
+                             <property name="can_focus">True</property>
+                             <property name="label" translatable="yes">Fade from Black When _Unblanking</property>
+                             <property name="use_underline">True</property>
+                             <property name="relief">GTK_RELIEF_NORMAL</property>
+                             <property name="active">False</property>
+                             <property name="inconsistent">False</property>
+                             <property name="draw_indicator">True</property>
+                             <signal name="toggled" handler="pref_changed_cb"/>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkHBox" id="fade_hbox">
+                             <property name="visible">True</property>
+                             <property name="homogeneous">False</property>
+                             <property name="spacing">0</property>
+
+                             <child>
+                               <widget class="GtkLabel" id="fade_dummy">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes"></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">3</property>
+                                 <property name="ypad">0</property>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkLabel" id="fade_label">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes">F_ade Duration</property>
+                                 <property name="use_underline">True</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</property>
+                                 <property name="yalign">0.5</property>
+                                 <property name="xpad">0</property>
+                                 <property name="ypad">0</property>
+                                 <property name="mnemonic_widget">fade_spinbutton</property>
+                               </widget>
+                               <packing>
+                                 <property name="padding">10</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkSpinButton" id="fade_spinbutton">
+                                 <property name="visible">True</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="climb_rate">1</property>
+                                 <property name="digits">0</property>
+                                 <property name="numeric">True</property>
+                                 <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+                                 <property name="snap_to_ticks">True</property>
+                                 <property name="wrap">False</property>
+                                 <property name="adjustment">0 0 10 1 1 1</property>
+                                 <signal name="activate" handler="pref_changed_cb"/>
+                                 <signal name="focus_out_event" handler="pref_changed_event_cb"/>
+                                 <signal name="value_changed" handler="pref_changed_cb"/>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">True</property>
+                                 <property name="fill">True</property>
+                               </packing>
+                             </child>
+
+                             <child>
+                               <widget class="GtkLabel" id="fade_sec_label">
+                                 <property name="visible">True</property>
+                                 <property name="label" translatable="yes">seconds</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</property>
+                                 <property name="yalign">0.5</property>
+                                 <property name="xpad">0</property>
+                                 <property name="ypad">0</property>
+                               </widget>
+                               <packing>
+                                 <property name="padding">0</property>
+                                 <property name="expand">False</property>
+                                 <property name="fill">False</property>
+                               </packing>
+                             </child>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">True</property>
+                             <property name="fill">True</property>
+                           </packing>
+                         </child>
+                       </widget>
+                       <packing>
+                         <property name="padding">0</property>
+                         <property name="expand">True</property>
+                         <property name="fill">True</property>
+                       </packing>
+                     </child>
+                   </widget>
+                 </child>
+               </widget>
+               <packing>
+                 <property name="left_attach">1</property>
+                 <property name="right_attach">2</property>
+                 <property name="top_attach">1</property>
+                 <property name="bottom_attach">2</property>
+                 <property name="x_options">fill</property>
+                 <property name="y_options">fill</property>
+               </packing>
+             </child>
+           </widget>
+           <packing>
+             <property name="tab_expand">False</property>
+             <property name="tab_fill">True</property>
+           </packing>
+         </child>
+
+         <child>
+           <widget class="GtkLabel" id="options_tab">
+             <property name="visible">True</property>
+             <property name="label" translatable="yes">_Advanced</property>
+             <property name="use_underline">True</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>
+       <packing>
+         <property name="padding">0</property>
+         <property name="expand">True</property>
+         <property name="fill">True</property>
+       </packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+<widget class="GtkDialog" id="xscreensaver_settings_dialog">
+  <property name="title" translatable="yes">dialog1</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="has_separator">False</property>
+
+  <child internal-child="vbox">
+    <widget class="GtkVBox" id="dialog_vbox">
+      <property name="border_width">2</property>
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">0</property>
+
+      <child internal-child="action_area">
+       <widget class="GtkHButtonBox" id="dialog_action_area">
+         <property name="border_width">5</property>
+         <property name="visible">True</property>
+         <property name="layout_style">GTK_BUTTONBOX_END</property>
+         <property name="spacing">10</property>
+
+         <child>
+           <widget class="GtkButton" id="adv_button">
+             <property name="visible">True</property>
+             <property name="can_default">True</property>
+             <property name="can_focus">True</property>
+             <property name="label" translatable="yes">_Advanced &gt;&gt;</property>
+             <property name="use_underline">True</property>
+             <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="response_id">0</property>
+             <signal name="clicked" handler="settings_adv_cb"/>
+           </widget>
+         </child>
+
+         <child>
+           <widget class="GtkButton" id="std_button">
+             <property name="visible">True</property>
+             <property name="can_default">True</property>
+             <property name="can_focus">True</property>
+             <property name="label" translatable="yes">_Standard &lt;&lt;</property>
+             <property name="use_underline">True</property>
+             <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="response_id">0</property>
+             <signal name="clicked" handler="settings_std_cb"/>
+           </widget>
+         </child>
+
+         <child>
+           <widget class="GtkButton" id="cancel_button">
+             <property name="visible">True</property>
+             <property name="can_default">True</property>
+             <property name="can_focus">True</property>
+             <property name="label">gtk-cancel</property>
+             <property name="use_stock">True</property>
+             <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="response_id">-6</property>
+             <signal name="clicked" handler="settings_cancel_cb"/>
+           </widget>
+         </child>
+
+         <child>
+           <widget class="GtkButton" id="ok_button">
+             <property name="visible">True</property>
+             <property name="can_default">True</property>
+             <property name="can_focus">True</property>
+             <property name="label">gtk-ok</property>
+             <property name="use_stock">True</property>
+             <property name="relief">GTK_RELIEF_NORMAL</property>
+             <property name="response_id">-5</property>
+             <signal name="clicked" handler="settings_ok_cb"/>
+           </widget>
+         </child>
+       </widget>
+       <packing>
+         <property name="padding">0</property>
+         <property name="expand">False</property>
+         <property name="fill">True</property>
+         <property name="pack_type">GTK_PACK_END</property>
+       </packing>
+      </child>
+
+      <child>
+       <widget class="GtkHBox" id="hbox1">
+         <property name="visible">True</property>
+         <property name="homogeneous">False</property>
+         <property name="spacing">8</property>
+
+         <child>
+           <widget class="GtkFrame" id="opt_frame">
+             <property name="visible">True</property>
+             <property name="label" translatable="yes">Settings</property>
+             <property name="label_xalign">0</property>
+             <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+
+             <child>
+               <widget class="GtkNotebook" id="opt_notebook">
+                 <property name="border_width">12</property>
+                 <property name="visible">True</property>
+                 <property name="can_focus">True</property>
+                 <property name="show_tabs">True</property>
+                 <property name="show_border">False</property>
+                 <property name="tab_pos">GTK_POS_BOTTOM</property>
+                 <property name="scrollable">False</property>
+                 <property name="tab_hborder">2</property>
+                 <property name="tab_vborder">2</property>
+                 <property name="enable_popup">False</property>
+                 <signal name="switch_page" handler="settings_switch_page_cb"/>
+
+                 <child>
+                   <widget class="GtkVBox" id="settings_vbox">
+                     <property name="visible">True</property>
+                     <property name="homogeneous">False</property>
+                     <property name="spacing">0</property>
+
+                     <child>
+                       <placeholder/>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="tab_expand">False</property>
+                     <property name="tab_fill">True</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkLabel" id="std_label">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">Standard</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>
+
+                 <child>
+                   <widget class="GtkTable" id="adv_table">
+                     <property name="visible">True</property>
+                     <property name="n_rows">4</property>
+                     <property name="n_columns">2</property>
+                     <property name="homogeneous">False</property>
+                     <property name="row_spacing">0</property>
+                     <property name="column_spacing">0</property>
+
+                     <child>
+                       <widget class="GtkImage" id="cmd_logo">
+                         <property name="visible">True</property>
+                         <property name="pixbuf">screensaver-cmndln.xpm</property>
+                         <property name="xalign">0.5</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">4</property>
+                         <property name="ypad">8</property>
+                       </widget>
+                       <packing>
+                         <property name="left_attach">0</property>
+                         <property name="right_attach">1</property>
+                         <property name="top_attach">0</property>
+                         <property name="bottom_attach">1</property>
+                         <property name="x_options">fill</property>
+                         <property name="y_options">fill</property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkLabel" id="cmd_label">
+                         <property name="visible">True</property>
+                         <property name="label" translatable="yes">_Command Line:</property>
+                         <property name="use_underline">True</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</property>
+                         <property name="yalign">0.5</property>
+                         <property name="xpad">0</property>
+                         <property name="ypad">0</property>
+                         <property name="mnemonic_widget">cmd_text</property>
+                       </widget>
+                       <packing>
+                         <property name="left_attach">1</property>
+                         <property name="right_attach">2</property>
+                         <property name="top_attach">1</property>
+                         <property name="bottom_attach">2</property>
+                         <property name="x_options">fill</property>
+                         <property name="y_options"></property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkEntry" id="cmd_text">
+                         <property name="visible">True</property>
+                         <property name="can_focus">True</property>
+                         <property name="editable">True</property>
+                         <property name="visibility">True</property>
+                         <property name="max_length">0</property>
+                         <property name="text" translatable="yes"></property>
+                         <property name="has_frame">True</property>
+                         <property name="invisible_char" translatable="yes">*</property>
+                         <property name="activates_default">False</property>
+                       </widget>
+                       <packing>
+                         <property name="left_attach">1</property>
+                         <property name="right_attach">2</property>
+                         <property name="top_attach">2</property>
+                         <property name="bottom_attach">3</property>
+                         <property name="y_options"></property>
+                       </packing>
+                     </child>
+
+                     <child>
+                       <widget class="GtkHBox" id="visual_hbox">
+                         <property name="visible">True</property>
+                         <property name="homogeneous">False</property>
+                         <property name="spacing">0</property>
+
+                         <child>
+                           <widget class="GtkLabel" id="visual">
+                             <property name="visible">True</property>
+                             <property name="label" translatable="yes">_Visual:</property>
+                             <property name="use_underline">True</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">1</property>
+                             <property name="yalign">0.5</property>
+                             <property name="xpad">3</property>
+                             <property name="ypad">0</property>
+                             <property name="mnemonic_widget">visual_entry</property>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">False</property>
+                             <property name="fill">False</property>
+                           </packing>
+                         </child>
+
+                         <child>
+                           <widget class="GtkCombo" id="visual_combo">
+                             <property name="visible">True</property>
+                             <property name="value_in_list">False</property>
+                             <property name="allow_empty">True</property>
+                             <property name="case_sensitive">False</property>
+                             <property name="enable_arrow_keys">True</property>
+                             <property name="enable_arrows_always">False</property>
+
+                             <child internal-child="entry">
+                               <widget class="GtkEntry" id="visual_entry">
+                                 <property name="visible">True</property>
+                                 <property name="can_focus">True</property>
+                                 <property name="editable">True</property>
+                                 <property name="visibility">True</property>
+                                 <property name="max_length">0</property>
+                                 <property name="text" translatable="yes"></property>
+                                 <property name="has_frame">True</property>
+                                 <property name="invisible_char" translatable="yes">*</property>
+                                 <property name="activates_default">False</property>
+                               </widget>
+                             </child>
+
+                             <child internal-child="list">
+                               <widget class="GtkList" id="combo-list1">
+                                 <property name="visible">True</property>
+                                 <property name="selection_mode">GTK_SELECTION_BROWSE</property>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem25">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">Any</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem26">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">Best</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem27">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">Default</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem28">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">Default-N</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem29">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">GL</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem30">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">TrueColor</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem31">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">PseudoColor</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem32">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">StaticGray</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem33">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">GrayScale</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem34">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">DirectColor</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem35">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">Color</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem36">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">Gray</property>
+                                   </widget>
+                                 </child>
+
+                                 <child>
+                                   <widget class="GtkListItem" id="listitem37">
+                                     <property name="visible">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="label" translatable="yes">Mono</property>
+                                   </widget>
+                                 </child>
+                               </widget>
+                             </child>
+                           </widget>
+                           <packing>
+                             <property name="padding">0</property>
+                             <property name="expand">True</property>
+                             <property name="fill">True</property>
+                           </packing>
+                         </child>
+                       </widget>
+                       <packing>
+                         <property name="left_attach">1</property>
+                         <property name="right_attach">2</property>
+                         <property name="top_attach">3</property>
+                         <property name="bottom_attach">4</property>
+                         <property name="x_options">fill</property>
+                         <property name="y_options">fill</property>
+                       </packing>
+                     </child>
+                   </widget>
+                   <packing>
+                     <property name="tab_expand">False</property>
+                     <property name="tab_fill">True</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkLabel" id="adv_label">
+                     <property name="visible">True</property>
+                     <property name="label" translatable="yes">Advanced</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>
+           </widget>
+           <packing>
+             <property name="padding">0</property>
+             <property name="expand">True</property>
+             <property name="fill">True</property>
+           </packing>
+         </child>
+
+         <child>
+           <widget class="GtkFrame" id="doc_frame">
+             <property name="visible">True</property>
+             <property name="label" translatable="yes">Description</property>
+             <property name="label_xalign">0</property>
+             <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
+
+             <child>
+               <widget class="GtkVBox" id="doc_vbox">
+                 <property name="border_width">5</property>
+                 <property name="visible">True</property>
+                 <property name="homogeneous">False</property>
+                 <property name="spacing">5</property>
+
+                 <child>
+                   <widget class="GtkLabel" id="doc">
+                     <property name="visible">True</property>
+                     <property name="can_focus">True</property>
+                     <property name="label" translatable="yes"></property>
+                     <property name="use_underline">False</property>
+                     <property name="use_markup">False</property>
+                     <property name="justify">GTK_JUSTIFY_LEFT</property>
+                     <property name="wrap">True</property>
+                     <property name="selectable">True</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="padding">0</property>
+                     <property name="expand">True</property>
+                     <property name="fill">True</property>
+                   </packing>
+                 </child>
+
+                 <child>
+                   <widget class="GtkButton" id="manual">
+                     <property name="visible">True</property>
+                     <property name="can_focus">True</property>
+                     <property name="label" translatable="yes">_Documentation...</property>
+                     <property name="use_underline">True</property>
+                     <property name="relief">GTK_RELIEF_NORMAL</property>
+                     <signal name="clicked" handler="manual_cb"/>
+                   </widget>
+                   <packing>
+                     <property name="padding">0</property>
+                     <property name="expand">False</property>
+                     <property name="fill">False</property>
+                   </packing>
+                 </child>
+               </widget>
+             </child>
+           </widget>
+           <packing>
+             <property name="padding">0</property>
+             <property name="expand">True</property>
+             <property name="fill">True</property>
+           </packing>
+         </child>
+       </widget>
+       <packing>
+         <property name="padding">0</property>
+         <property name="expand">True</property>
+         <property name="fill">True</property>
+       </packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+</glade-interface>
index f393acb533156a4cf4cc5764dfdf04f8ed6b3a92..b39b13d83c36fd168506d282bea620b4d5205e61 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "11-May-2002 (4.03)" "X Version 11"
+.TH XScreenSaver 1 "31-May-2002 (4.04)" "X Version 11"
 .SH NAME
 xscreensaver-demo - interactively control the background xscreensaver daemon
 .SH SYNOPSIS
index b0480bc516e7f2543daa63acbf661f6121bbcc03..71861cf0e4598ea922d9abd5b4ebd2d32558a1fa 100644 (file)
@@ -1,4 +1,4 @@
-.TH XScreenSaver 1 "11-May-2002 (4.03)" "X Version 11"
+.TH XScreenSaver 1 "31-May-2002 (4.04)" "X Version 11"
 .SH NAME
 xscreensaver-getimage-file - put a randomly-selected image on the root window
 .SH SYNOPSIS
index a9ea4ce9e55127c236479a8d42aa647f940a4e44..f2587fa73edafaed2130cfef173658870e96471c 100644 (file)
@@ -1,4 +1,4 @@
-.TH XScreenSaver 1 "11-May-2002 (4.03)" "X Version 11"
+.TH XScreenSaver 1 "31-May-2002 (4.04)" "X Version 11"
 .SH NAME
 xscreensaver-getimage-video - put a video frame on the root window
 .SH SYNOPSIS
index ab5243273117d2108c0e26b4f2776b87be4d48ed..2d3cce597c157d6ff0279ca742857e998f9c21ee 100644 (file)
 #include <ctype.h>
 #include <errno.h>
 
+#ifdef HAVE_SYS_WAIT_H
+# include <sys/wait.h>         /* for waitpid() and associated macros */
+#endif
+
 #ifdef HAVE_XMU
 # ifndef VMS
 #  include <X11/Xmu/Error.h>
 #include "prefs.h"
 #include "vroot.h"
 
+#ifdef HAVE_GDK_PIXBUF
+
+# ifdef HAVE_GTK2
+#  include <gdk-pixbuf-xlib/gdk-pixbuf-xlib.h>
+# else  /* !HAVE_GTK2 */
+#  include <gdk-pixbuf/gdk-pixbuf-xlib.h>
+# endif /* !HAVE_GTK2 */
+
+# define HAVE_BUILTIN_IMAGE_LOADER
+#endif /* HAVE_GDK_PIXBUF */
+
 
 static char *defaults[] = {
 #include "../driver/XScreenSaver_ad.h"
@@ -103,7 +118,7 @@ exec_error (char **av)
       fprintf (stderr, "\n");
     }
 
-  exit (1);
+  exit (-1);
 }
 
 static int
@@ -117,6 +132,14 @@ x_ehandler (Display *dpy, XErrorEvent *error)
 
 
 
+#ifdef HAVE_BUILTIN_IMAGE_LOADER
+static void load_image_internal (Screen *screen, Window window,
+                                 int win_width, int win_height,
+                                 Bool verbose_p,
+                                 int ac, char **av);
+#endif /* HAVE_BUILTIN_IMAGE_LOADER */
+
+
 static void
 get_image (Screen *screen, Window window, Bool verbose_p)
 {
@@ -172,23 +195,28 @@ get_image (Screen *screen, Window window, Bool verbose_p)
   if ((desk_p || video_p || image_p) &&
       !top_level_window_p (screen, window))
     {
-      desk_p  = False;
-      video_p = False;
-      image_p = False;
-      if (verbose_p)
+      Bool changed_p = False;
+      if (desk_p)  desk_p  = False, changed_p = True;
+      if (video_p) video_p = False, changed_p = True;
+# ifndef HAVE_BUILTIN_IMAGE_LOADER
+      if (image_p) image_p = False, changed_p = True;
+      if (changed_p && verbose_p)
         fprintf (stderr, "%s: not a top-level window: using colorbars.\n",
                  progname);
+# endif /* !HAVE_BUILTIN_IMAGE_LOADER */
     }
   else if (window != VirtualRootWindowOfScreen (screen))
     {
       Bool changed_p = False;
-      if (!desk_p) desk_p  = True,  changed_p = True;
       if (video_p) video_p = False, changed_p = True;
+# ifndef HAVE_BUILTIN_IMAGE_LOADER
+      if (!desk_p) desk_p  = True,  changed_p = True;
       if (image_p) image_p = False, changed_p = True;
       if (changed_p && verbose_p)
         fprintf (stderr,
                  "%s: not running on root window: grabbing desktop.\n",
                  progname);
+# endif /* !HAVE_BUILTIN_IMAGE_LOADER */
     }
 
   count = 0;
@@ -231,19 +259,24 @@ get_image (Screen *screen, Window window, Bool verbose_p)
   else
     {
       char *av[10];
+      int ac = 0;
       memset (av, 0, sizeof(av));
       switch (which)
         {
         case do_video:
           if (verbose_p)
             fprintf (stderr, "%s: grabbing video\n", progname);
-          av[0] = GETIMAGE_VIDEO_PROGRAM;
+          av[ac++] = GETIMAGE_VIDEO_PROGRAM;
           break;
         case do_image:
           if (verbose_p)
             fprintf (stderr, "%s: loading random image file\n", progname);
-          av[0] = GETIMAGE_FILE_PROGRAM;
-          av[1] = dir;
+          av[ac++] = GETIMAGE_FILE_PROGRAM;
+
+# ifdef HAVE_BUILTIN_IMAGE_LOADER
+          av[ac++] = "--name";
+# endif /* !HAVE_BUILTIN_IMAGE_LOADER */
+          av[ac++] = dir;
           break;
         default:
           abort();
@@ -253,9 +286,10 @@ get_image (Screen *screen, Window window, Bool verbose_p)
       if (verbose_p)
         {
           int i;
-          for (i = (sizeof(av)/sizeof(*av))-1; i > 1; i--)
+          for (i = ac; i > 1; i--)
             av[i] = av[i-1];
           av[1] = strdup ("--verbose");
+          ac++;
         }
 
       if (verbose_p)
@@ -302,6 +336,16 @@ get_image (Screen *screen, Window window, Bool verbose_p)
       }
 # endif /* HAVE_PUTENV */
 
+# ifdef HAVE_BUILTIN_IMAGE_LOADER
+      if (which == do_image)
+        {
+          load_image_internal (screen, window, xgwa.width, xgwa.height,
+                               verbose_p, ac, av);
+          return;
+        }
+# endif /* HAVE_BUILTIN_IMAGE_LOADER */
+
+
       close (ConnectionNumber (dpy));  /* close display fd */
 
       execvp (av[0], av);              /* shouldn't return */
@@ -310,6 +354,199 @@ get_image (Screen *screen, Window window, Bool verbose_p)
 }
 
 
+#ifdef HAVE_BUILTIN_IMAGE_LOADER
+
+/* Reads a filename from "GETIMAGE_FILE_PROGRAM --name /DIR"
+ */
+static char *
+get_filename (Display *dpy, int ac, char **av)
+{
+  pid_t forked;
+  int fds [2];
+  int in, out;
+  char buf[1024];
+
+  if (pipe (fds))
+    {
+      sprintf (buf, "%s: error creating pipe", progname);
+      perror (buf);
+      return 0;
+    }
+
+  in = fds [0];
+  out = fds [1];
+
+  switch ((int) (forked = fork ()))
+    {
+    case -1:
+      {
+        sprintf (buf, "%s: couldn't fork", progname);
+        perror (buf);
+        return 0;
+      }
+    case 0:
+      {
+        int stdout_fd = 1;
+
+        close (in);  /* don't need this one */
+        close (ConnectionNumber (dpy));                /* close display fd */
+
+        if (dup2 (out, stdout_fd) < 0)         /* pipe stdout */
+          {
+            sprintf (buf, "%s: could not dup() a new stdout", progname);
+            exit (-1);                          /* exits fork */
+          }
+
+        execvp (av[0], av);                    /* shouldn't return. */
+        exit (-1);                              /* exits fork */
+        break;
+      }
+    default:
+      {
+        int wait_status = 0;
+        FILE *f = fdopen (in, "r");
+        int L;
+
+        close (out);  /* don't need this one */
+        *buf = 0;
+        fgets (buf, sizeof(buf)-1, f);
+        fclose (f);
+
+        /* Wait for the child to die. */
+        waitpid (-1, &wait_status, 0);
+
+        L = strlen (buf);
+        while (L && buf[L-1] == '\n')
+          buf[--L] = 0;
+          
+        return strdup (buf);
+      }
+    }
+
+  abort();
+}
+
+
+
+static void
+load_image_internal (Screen *screen, Window window,
+                     int win_width, int win_height,
+                     Bool verbose_p,
+                     int ac, char **av)
+{
+  GdkPixbuf *pb;
+  Display *dpy = DisplayOfScreen (screen);
+  char *filename = get_filename (dpy, ac, av);
+
+  if (!filename)
+    {
+      fprintf (stderr, "%s: no file name returned by %s\n",
+               progname, av[0]);
+      goto FAIL;
+    }
+  else if (verbose_p)
+    fprintf (stderr, "%s: loading \"%s\"\n", progname, filename);
+
+  gdk_pixbuf_xlib_init (dpy, screen_number (screen));
+  xlib_rgb_init (dpy, screen);
+
+  pb = gdk_pixbuf_new_from_file (filename
+#ifdef HAVE_GTK2
+                                , NULL
+#endif /* HAVE_GTK2 */
+         );
+
+  if (pb)
+    {
+      int w = gdk_pixbuf_get_width (pb);
+      int h = gdk_pixbuf_get_height (pb);
+      int srcx, srcy, destx, desty;
+
+      Bool exact_fit_p = ((w == win_width  && h <= win_height) ||
+                          (h == win_height && w <= win_width));
+
+      if (!exact_fit_p)  /* scale the image up or down */
+        {
+          float rw = (float) win_width  / w;
+          float rh = (float) win_height / h;
+          float r = (rw < rh ? rw : rh);
+          int tw = w * r;
+          int th = h * r;
+          int pct = (r * 100);
+
+          if (pct < 95 || pct > 105)  /* don't scale if it's close */
+            {
+              GdkPixbuf *pb2;
+              if (verbose_p)
+                fprintf (stderr,
+                         "%s: scaling image by %d%% (%dx%d -> %dx%d)\n",
+                         progname, pct, w, h, tw, th);
+
+              pb2 = gdk_pixbuf_scale_simple (pb, tw, th, GDK_INTERP_BILINEAR);
+              if (pb2)
+                {
+                  gdk_pixbuf_unref (pb);
+                  pb = pb2;
+                  w = tw;
+                  h = th;
+                }
+              else
+                fprintf (stderr, "%s: out of memory when scaling?\n",
+                         progname);
+            }
+        }
+
+      /* Center the image on the window. */
+      srcx = 0;
+      srcy = 0;
+      destx = (win_width  - w) / 2;
+      desty = (win_height - h) / 2;
+      if (destx < 0) srcx = -destx, destx = 0;
+      if (desty < 0) srcy = -desty, desty = 0;
+
+      if (win_width  < w) w = win_width;
+      if (win_height < h) h = win_height;
+
+      /* #### Note that this always uses the default colormap!  Morons!
+              Owen says that in Gnome 2.0, I should try using
+              gdk_pixbuf_render_pixmap_and_mask_for_colormap() instead.
+              But I don't have Gnome 2.0 yet.
+       */
+      XClearWindow (dpy, window);
+      gdk_pixbuf_xlib_render_to_drawable_alpha (pb, window,
+                                                srcx, srcy, destx, desty, w, h,
+                                                GDK_PIXBUF_ALPHA_FULL, 127,
+                                                XLIB_RGB_DITHER_NORMAL, 0, 0);
+      XSync (dpy, False);
+
+      if (verbose_p)
+        fprintf (stderr, "%s: displayed %dx%d image at %d,%d.\n",
+                 progname, w, h, destx, desty);
+    }
+  else if (filename)
+    {
+      fprintf (stderr, "%s: unable to load %s\n", progname, filename);
+      goto FAIL;
+    }
+  else
+    {
+      fprintf (stderr, "%s: unable to initialize built-in images\n", progname);
+      goto FAIL;
+    }
+
+  return;
+
+ FAIL:
+  if (verbose_p)
+    fprintf (stderr, "%s: drawing colorbars\n", progname);
+  draw_colorbars (dpy, window, 0, 0, win_width, win_height);
+  XSync (dpy, False);
+}
+
+#endif /* HAVE_BUILTIN_IMAGE_LOADER */
+
+
+
 #if 0
 static Bool
 mapper (XrmDatabase *db, XrmBindingList bindings, XrmQuarkList quarks,
index 607c86349d09bae754453db541f69da146dfa355..c956fe8c9804bcfd4f3fe2b3cb46946a5d42bcb4 100644 (file)
@@ -1,4 +1,4 @@
-.TH XScreenSaver 1 "11-May-2002 (4.03)" "X Version 11"
+.TH XScreenSaver 1 "31-May-2002 (4.04)" "X Version 11"
 .SH NAME
 xscreensaver-getimage - put some randomly-selected image on the root window
 .SH SYNOPSIS
index abc39e6e76ea5988c932eaf2beddce21444c1f3e..5d1cfd2b8846b11170bfabd1c1219e9865f6de4c 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "11-May-2002 (4.03)" "X Version 11"
+.TH XScreenSaver 1 "31-May-2002 (4.04)" "X Version 11"
 .SH NAME
 xscreensaver - extensible screen saver framework, plus locking
 .SH SYNOPSIS
@@ -854,8 +854,13 @@ Open the ``\fIControl Center\fP'' and
 select the ``\fILook and Feel / Screensaver\fP'' page.
 Turn off the ``\fIEnable Screensaver\fP'' checkbox.
 .TP 3
-\fB2: Add xscreensaver to your startup programs.\fP
-Create a file in your \fI~/.kde2/Autostart/\fP directory
+\fB2: Find your Autostart directory.\fP
+Open the ``\fILook and Feel / Desktop / Paths\fP'' page,
+and see what your ``Autostart'' directory is set to: it will
+probably be \fI~/.kde3/Autostart/\fP or something similar.
+.TP 3
+\fB3: Add xscreensaver to your startup programs.\fP
+Create a file in your autostart directory
 called \fIlaunch-xscreensaver\fP.  Make that file be executable,
 and contain a single line: \fI``xscreensaver\fP''.
 .RE
@@ -1261,10 +1266,6 @@ in the X protocol.
 
 In all these years, I've not heard of even a single case of this happening,
 but it is theoretically possible, so I'm mentioning it for completeness...
-.TP 8
-.B Red Hot Lava
-There need to be a lot more graphics hacks.  In particular, there should be
-a simulation of a Lavalite (tm).
 .SH ENVIRONMENT
 .PP
 .TP 8
index 65630f91b7b02869f336e5963864c38deb905976..12e58419aeaf8c94f299d1df3ed8cdb5501f3459 100644 (file)
@@ -94,7 +94,8 @@ SRCS          = attraction.c blitspin.c bouboule.c braid.c bubbles.c \
                  nerverot.c xrayswarm.c hyperball.c zoom.c whirlwindwarp.c \
                  rotzoomer.c whirlygig.c speedmine.c vermiculate.c \
                  xpm-pixmap.c webcollage-helper.c twang.c apollonian.c \
-                 euler2d.c juggle.c polyominoes.c thornbird.c fluidballs.c
+                 euler2d.c juggle.c polyominoes.c thornbird.c fluidballs.c \
+                 anemone.c
 SCRIPTS                = vidwhacker webcollage
 
 OBJS           = attraction.o blitspin.o bouboule.o braid.o bubbles.o \
@@ -117,7 +118,8 @@ OBJS                = attraction.o blitspin.o bouboule.o braid.o bubbles.o \
                  nerverot.o xrayswarm.o hyperball.o zoom.o whirlwindwarp.o \
                  rotzoomer.o whirlygig.o speedmine.o vermiculate.o \
                  xpm-pixmap.o webcollage-helper.o twang.o apollonian.o \
-                 euler2d.o juggle.o polyominoes.o thornbird.o fluidballs.o
+                 euler2d.o juggle.o polyominoes.o thornbird.o fluidballs.o \
+                 anemone.o
 
 NEXES          = attraction blitspin bouboule braid bubbles decayscreen deco \
                  drift flag flame forest vines galaxy grav greynetic halo \
@@ -133,7 +135,7 @@ NEXES               = attraction blitspin bouboule braid bubbles decayscreen deco \
                  xsublim ccurve blaster bumps ripples xteevee xspirograph \
                  nerverot xrayswarm hyperball zoom whirlwindwarp rotzoomer \
                  whirlygig speedmine vermiculate twang apollonian euler2d \
-                 juggle polyominoes thornbird  fluidballs \
+                 juggle polyominoes thornbird  fluidballs anemone \
                  @JPEG_EXES@
 SEXES          = sonar
 JPEG_EXES      = webcollage-helper
@@ -150,25 +152,33 @@ XDBE_OBJS = $(UTILS_BIN)/xdbe.o
 
 HDRS           = bubbles.h screenhack.h xlockmore.h xlockmoreI.h automata.h \
                  bumps.h xpm-pixmap.h
-MEN            = attraction.man blitspin.man bouboule.man braid.man \
-                 bubbles.man decayscreen.man deco.man drift.man flag.man \
-                 flame.man forest.man vines.man galaxy.man grav.man \
-                 greynetic.man halo.man helix.man hopalong.man hypercube.man \
-                 ifs.man imsmap.man julia.man kaleidescope.man laser.man \
-                 lightning.man lisa.man lmorph.man maze.man moire.man \
-                 noseguy.man pedal.man penrose.man pyro.man qix.man \
-                 rocks.man rorschach.man sierpinski.man slidescreen.man \
-                 slip.man sphere.man spiral.man strange.man swirl.man \
-                 goop.man starfish.man munch.man rd-bomb.man bumps.man \
-                 xjack.man xlyap.man jigsaw.man epicycle.man bsod.man \
-                 sonar.man t3d.man squiral.man spotlight.man critical.man \
-                 vidwhacker.man webcollage.man xsublim.man distort.man \
-                 phosphor.man xmatrix.man xteevee.man xflame.man petri.man \
-                 nerverot.man zoom.man whirlwindwarp.man hyperball.man \
-                 rotzoomer.man whirlygig.man speedmine.man penetrate.man \
-                 xspirograph.man twang.man
+MEN            = anemone.man ant.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 \
+                 deco.man deluxe.man demon.man discrete.man distort.man \
+                 drift.man epicycle.man euler2d.man fadeplot.man flag.man \
+                 flame.man flow.man fluidballs.man forest.man galaxy.man \
+                 goop.man grav.man greynetic.man halo.man helix.man \
+                 hopalong.man hyperball.man hypercube.man ifs.man imsmap.man \
+                 interference.man jigsaw.man juggle.man julia.man \
+                 kaleidescope.man kumppa.man laser.man lightning.man \
+                 lisa.man lissie.man lmorph.man loop.man maze.man moire.man \
+                 moire2.man mountain.man munch.man nerverot.man noseguy.man \
+                 pedal.man penetrate.man penrose.man petri.man phosphor.man \
+                 polyominoes.man pyro.man qix.man rd-bomb.man ripples.man \
+                 rocks.man rorschach.man rotor.man rotzoomer.man \
+                 shadebobs.man sierpinski.man slidescreen.man slip.man \
+                 sonar.man speedmine.man sphere.man spiral.man \
+                 spotlight.man squiral.man starfish.man strange.man \
+                 swirl.man t3d.man thornbird.man triangle.man truchet.man \
+                 twang.man vermiculate.man vidwhacker.man vines.man \
+                 wander.man webcollage.man whirlwindwarp.man whirlygig.man \
+                 worm.man xflame.man xjack.man xlyap.man xmatrix.man \
+                 xrayswarm.man xspirograph.man xsublim.man xteevee.man \
+                 zoom.man
 STAR           = *
-EXTRAS         = README Makefile.in xlock_23.h .gdbinit \
+EXTRAS         = README Makefile.in xlock_23.h xml2man.pl .gdbinit \
                  config/README \
                  config/$(STAR).xml \
                  images/$(STAR).xbm \
@@ -350,6 +360,44 @@ tags:
 echo_tarfiles:
        @echo $(TARFILES)
 
+check_men:
+       @badmen="" ;                                                    \
+        for exe in $(EXES) $(SCRIPTS); do                              \
+          if ! [ -f $(srcdir)/$$exe.man                                \
+                 -o "$$exe" = webcollage-helper ]; then                \
+            badmen="$$badmen $$exe" ;                                  \
+          fi ;                                                         \
+        done ;                                                         \
+        if [ -n "$$badmen" ]; then                                     \
+          echo "" ;                                                    \
+          echo "Warning: The following programs have no manuals:" ;    \
+          echo "" ;                                                    \
+          for m in $$badmen ; do                                       \
+            echo "    $$m" ;                                           \
+          done ;                                                       \
+        fi
+
+check_xml:
+       @badxml="" ;                                                    \
+        for exe in $(EXES) $(SCRIPTS); do                              \
+          if ! [ -f $(srcdir)/config/$$exe.xml                         \
+                 -o "$$exe" = webcollage-helper                        \
+                 -o "$$exe" = xsublim ]; then                          \
+            badxml="$$badxml $$exe" ;                                  \
+          fi ;                                                         \
+        done ;                                                         \
+        if [ -n "$$badxml" ]; then                                     \
+          echo "" ;                                                    \
+          echo "Warning: The following programs have no configurators:" ; \
+          echo "" ;                                                    \
+          for m in $$badxml ; do                                       \
+            echo "    $$m" ;                                           \
+          done ;                                                       \
+          echo "" ;                                                    \
+        fi
+
+
+
 
 # Rules for generating the VMS makefiles on Unix, so that it doesn't have to
 # be done by hand...
@@ -401,6 +449,7 @@ $(srcdir)/../setup.com: Makefile.in
 distdepend:: compile_axp.com compile_decc.com
 distdepend:: link_axp.com link_decc.com
 distdepend:: $(srcdir)/../setup.com
+distdepend:: check_men check_xml
 
 
 # Rules for noticing when the objects from the utils directory are out of
@@ -670,6 +719,9 @@ twang:              twang.o         $(HACK_OBJS) $(GRAB) $(SHM)
 fluidballs:    fluidballs.o    $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
 
+anemone:       anemone.o       $(HACK_OBJS) $(DBE)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(DBE) $(HACK_LIBS)
+
 
 # The rules for those hacks which follow the `xlockmore' API.
 #
@@ -802,6 +854,8 @@ webcollage-helper: webcollage-helper.o
 #
 # DO NOT DELETE: updated by make distdepend
 
+anemone.o: ../config.h
+anemone.o: $(srcdir)/screenhack.h
 ant.o: $(srcdir)/automata.h
 ant.o: ../config.h
 ant.o: $(srcdir)/screenhack.h
diff --git a/hacks/anemone.c b/hacks/anemone.c
new file mode 100644 (file)
index 0000000..bbd2d74
--- /dev/null
@@ -0,0 +1,414 @@
+/* anemon, Copyright (c) 2001 Gabriel Finch
+ *
+ * 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.
+ */
+
+/*------------------------------------------------------------------------
+  |
+  |  FILE            anemone.c
+  |  MODULE OF       xscreensaver
+  |
+  |  DESCRIPTION     Anemone.
+  |
+  |  WRITTEN BY      Gabriel Finch
+  |                  
+  |
+  |
+  |  MODIFICATIONS   june 2001 started
+  |           
+  +----------------------------------------------------------------------*/
+
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include "screenhack.h"
+
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+#include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+
+/*-----------------------------------------------------------------------+
+  |  PRIVATE DATA                                                          |
+  +-----------------------------------------------------------------------*/
+
+
+#define TWO_PI     (2.0 * M_PI)
+#define RND(x)     (random() % (x))
+#define MAXPEND    2000
+#define MAXPTS    200
+#define TRUE 1
+#define FALSE 0
+
+static Display *dpy;
+static Window window;
+
+static Pixmap b,ba,bb;
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+static  XdbeBackBuffer backb;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+static int
+arms,                       /* number of arms */
+  finpoints;                  /* final number of points in each array. */
+static long delay;              /* usecs to wait between updates. */
+
+static int         scrWidth, scrHeight;
+static GC          gcDraw, gcClear;
+
+typedef struct {
+  double x,y,z;
+  int sx,sy,sz;
+} vPend;
+
+typedef unsigned short bool;
+
+static bool dbuf;
+static int width;
+
+typedef struct {
+  long col;
+  int numpt;
+  int growth;
+  unsigned short rate;
+} appDef;
+
+static vPend *vPendage;  /* 3D representation of appendages */
+static appDef *appD;  /* defaults */
+static vPend *vCurr, *vNext;
+static appDef *aCurr;
+
+static double turn, turndelta;
+
+static int    mx, my;            /* max screen coordinates. */
+static int withdraw;
+
+static    XGCValues         gcv;
+static    Colormap          cmap;
+
+
+
+/*-----------------------------------------------------------------------+
+  |  PUBLIC DATA                                                           |
+  +-----------------------------------------------------------------------*/
+
+char *progclass = "Anemone";
+
+char *defaults [] = {
+  ".background: black",
+  "*arms: 128",
+  "*width: 2",
+  "*finpoints: 64",
+  "*delay: 40000",
+  "*withdraw: 1200",
+  "*turnspeed: 50",
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+  "*useDBE:            True",
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+  0
+};
+
+
+XrmOptionDescRec options [] = {
+  { "-arms",        ".arms",        XrmoptionSepArg, 0 },
+  { "-finpoints",   ".finpoints",   XrmoptionSepArg, 0 },
+  { "-delay",       ".delay",       XrmoptionSepArg, 0 },
+  { "-width",       ".width",       XrmoptionSepArg, 0 },
+  { "-withdraw",    ".withdraw",    XrmoptionSepArg, 0 },
+  { "-turnspeed",   ".turnspeed",   XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+int options_size = (sizeof (options) / sizeof (options[0]));
+
+/*-----------------------------------------------------------------------+
+  |  PRIVATE FUNCTIONS                                                     |
+  +-----------------------------------------------------------------------*/
+
+static void *
+xmalloc(size_t size)
+{
+  void *ret;
+
+  if ((ret = malloc(size)) == NULL) {
+    fprintf(stderr, "anemone: out of memory\n");
+    exit(1);
+  }
+  return ret;
+}
+
+
+static void
+initAppendages(void)
+{
+  int    i;
+  /*int    marginx, marginy; */
+    
+  /*double scalex, scaley;*/
+
+  double x,y,z,dist;
+
+  mx = scrWidth - 1;
+  my = scrHeight - 1;
+
+  /* each appendage will have: colour,
+     number of points, and a grow or shrink indicator */
+
+  /* added: growth rate 1-10 (smaller==faster growth) */
+  /* each appendage needs virtual coords (x,y,z) with y and z combining to
+     give the screen y */
+
+  vPendage = (vPend *) xmalloc((finpoints + 1) * sizeof(vPend) * arms);
+  appD = (appDef *) xmalloc(sizeof(appDef) * arms);
+
+
+  for (i = 0; i < arms; i++) {
+    aCurr = appD + i;
+    vCurr = vPendage + (finpoints + 1) * i;
+    vNext = vCurr + 1;
+
+    aCurr->col = (long)RND(256)*RND(256)+32768;
+    aCurr->numpt = 1;
+    aCurr->growth=finpoints/2+RND(finpoints/2);
+    aCurr->rate=RND(11)*RND(11);
+
+    dist=1.;
+
+    do {
+      x=(1-RND(1001)/500);
+      y=(1-RND(1001)/500);
+      z=(1-RND(1001)/500);
+      dist=x*x+y*y+z*z;
+    } while (dist>=1.);
+
+    vCurr->x=x*200;
+    vCurr->y=my/2+y*200;
+    vCurr->z=0+z*200;
+
+    /* start the arm going outwards */
+    vCurr->sx=vCurr->x/5;
+    vCurr->sy=(vCurr->y-my/2)/5;
+    vCurr->sz=(vCurr->z)/5;
+
+    
+    vNext->x=vCurr->x+vCurr->sx;
+    vNext->y=vCurr->y+vCurr->sy;
+    vNext->z=vCurr->z+vCurr->sz;
+  }
+}
+
+static void
+initAnemone(void)
+{
+  XWindowAttributes wa;
+
+  turn = 0.;
+  
+  width = get_integer_resource("width", "Integer");
+  arms = get_integer_resource("arms", "Integer");
+  finpoints = get_integer_resource("finpoints", "Integer");
+  delay = get_integer_resource("delay", "Integer");
+  withdraw = get_integer_resource("withdraw", "Integer");
+  turndelta = get_float_resource("turnspeed", "float")/100000;
+
+  dbuf=TRUE;
+
+
+  b=ba=bb=0;   /* double-buffer to reduce flicker */
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+  b = backb = xdbe_get_backbuffer (dpy, window, XdbeUndefined);
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+
+  XGetWindowAttributes(dpy, window, &wa);
+  scrWidth = wa.width;
+  scrHeight = wa.height;
+  cmap = wa.colormap;
+  gcDraw = XCreateGC(dpy, window, GCForeground, &gcv);
+  gcv.foreground = get_pixel_resource("background", "Background", dpy, cmap);
+  gcClear = XCreateGC(dpy, window, GCForeground, &gcv);
+
+  if (dbuf) {
+    if (!b)
+      {
+       ba = XCreatePixmap (dpy, window, scrWidth, scrHeight, wa.depth);
+       bb = XCreatePixmap (dpy, window, scrWidth, scrHeight, wa.depth);
+       b = ba;
+      }
+  }
+  else
+    {  
+      b = window;
+    }
+
+  if (ba) XFillRectangle (dpy, ba, gcClear, 0, 0, scrWidth, scrHeight);
+  if (bb) XFillRectangle (dpy, bb, gcClear, 0, 0, scrWidth, scrHeight);
+
+  XClearWindow(dpy, window);
+  XSetLineAttributes(dpy, gcDraw,  width, LineSolid, CapRound, JoinBevel);
+
+  initAppendages();
+}
+
+
+static void
+createPoints(void)
+{
+  int i;
+  int withdrawall=RND(withdraw);
+
+  for (i = 0; i< arms; i++) {
+    aCurr = appD + i;
+    if (!withdrawall) {
+      aCurr->growth=-finpoints;
+      turndelta=-turndelta;
+    }
+
+    else if (withdrawall<11) aCurr->growth=-aCurr->numpt;
+
+    else if (RND(100)<aCurr->rate) {
+      if (aCurr->growth>0) {
+       if (!(--aCurr->growth)) aCurr->growth=-RND(finpoints)-1;
+       vCurr = vPendage + (finpoints + 1) * i + aCurr->numpt-1;
+       if (aCurr->numpt<finpoints - 1) {
+         /* add a piece */     
+         vNext=vCurr + 1;
+         aCurr->numpt++;
+         vNext->sx=vCurr->sx+RND(3)-1;
+         vNext->sy=vCurr->sy+RND(3)-1;
+         vNext->sz=vCurr->sz+RND(3)-1;
+         vCurr=vNext+1;
+         vCurr->x=vNext->x+vNext->sx;
+         vCurr->y=vNext->y+vNext->sy;
+         vCurr->z=vNext->z+vNext->sz;
+       }
+      }
+    }
+  }
+}
+
+
+static void
+drawImage(Drawable curr_window, double sint, double cost)
+{
+  int q,numpt,mx2=mx/2;
+  double cx,cy,cz,nx,ny,nz;
+
+  if ((numpt=aCurr->numpt)==1) return;
+  XSetForeground(dpy, gcDraw, aCurr->col);
+    
+  vNext=vCurr+1;
+
+  cx=vCurr->x;
+  cy=vCurr->y;
+  cz=vCurr->z;
+
+
+  for (q = 0; q < numpt-1; q++) {
+    nx=vNext->x+2-RND(5);
+    ny=vNext->y+2-RND(5);
+    nz=vNext->z+2-RND(5);
+
+    XDrawLine(dpy, curr_window, gcDraw,mx2+cx*cost-cz*sint, cy, mx2+nx*cost-nz*sint, ny);
+    vCurr++;
+    vNext++;
+
+    cx=nx;
+    cy=ny;
+    cz=nz;
+  }
+  XSetLineAttributes(dpy, gcDraw, width*3, LineSolid, CapRound, JoinBevel);
+  XDrawLine(dpy, curr_window, gcDraw,mx/2+cx*cost-cz*sint, cy, mx/2+nx*cost-nz*sint, ny);
+  XSetLineAttributes(dpy, gcDraw, width, LineSolid, CapRound, JoinBevel);
+
+}
+
+static void
+animateAnemone(Drawable curr_window)
+{
+  int i;
+  double sint=sin(turn),cost=cos(turn);
+
+  aCurr = appD;
+  for (i = 0; i< arms; i++) {
+    vCurr=vPendage + (finpoints + 1) * i;
+    if (RND(25)<aCurr->rate) {
+      if (aCurr->growth<0) {
+       aCurr->numpt-=aCurr->numpt>1;
+       if (!(++aCurr->growth)) aCurr->growth=RND(finpoints-aCurr->numpt)+1;
+      }
+    }
+    drawImage(curr_window, sint, cost);
+    turn+=turndelta;
+    aCurr++;
+  }
+  createPoints();
+  usleep(delay);
+
+  if (turn>=TWO_PI) turn-=TWO_PI;
+}
+
+/*-----------------------------------------------------------------------+
+  |  PUBLIC FUNCTIONS                                                      |
+  +-----------------------------------------------------------------------*/
+
+void
+screenhack(Display *disp, Window win)
+{
+
+  dpy=disp;
+  window=win;
+
+  initAnemone();
+  for (;;) {
+
+    XFillRectangle (dpy, b, gcClear, 0, 0, scrWidth, scrHeight);
+
+    animateAnemone(b);
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+    if (backb)
+      {
+       XdbeSwapInfo info[1];
+       info[0].swap_window = window;
+       info[0].swap_action = XdbeUndefined;
+       XdbeSwapBuffers (dpy, info, 1);
+      }
+    else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+      if (dbuf)
+       {
+         XCopyArea (dpy, b, window, gcClear, 0, 0,
+                    scrWidth, scrHeight, 0, 0);
+         b = (b == ba ? bb : ba);
+       }
+
+    screenhack_handle_events (dpy);
+  }
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/hacks/anemone.man b/hacks/anemone.man
new file mode 100644 (file)
index 0000000..20184fe
--- /dev/null
@@ -0,0 +1,60 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+anemone - wiggling tentacles.
+.SH SYNOPSIS
+.B anemone
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-finpoints \fInumber\fP]
+[\-width \fInumber\fP]
+.SH DESCRIPTION
+Wiggling tentacles.
+.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: 40000 (0.04 seconds.).
+.TP 8
+.B \-cycles \fInumber\fP
+Arms.  2 - 500.  Default: 128.
+.TP 8
+.B \-finpoints \fInumber\fP
+Tentacles.  3 - 200.  Default: 64.
+.TP 8
+.B \-width \fInumber\fP
+Thickness.  1 - 10.  Default: 2.
+.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 Gabriel Finch.  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
+Gabriel Finch.
diff --git a/hacks/ant.man b/hacks/ant.man
new file mode 100644 (file)
index 0000000..4d9f2ca
--- /dev/null
@@ -0,0 +1,83 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+ant - cellular automaton.
+.SH SYNOPSIS
+.B ant
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-sharpturns]
+[\-truchet]
+[\-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 \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 1000 (0.00 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.
diff --git a/hacks/apollonian.man b/hacks/apollonian.man
new file mode 100644 (file)
index 0000000..ae4e356
--- /dev/null
@@ -0,0 +1,66 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+apollonian - Descartes Circle Theorem.
+.SH SYNOPSIS
+.B apollonian
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-no-label]
+[\-no-altgeom]
+[\-cycles \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-delay \fInumber\fP]
+.SH DESCRIPTION
+Packs a large circle with smaller circles, demonstrating the Descartes
+Circle Theorem.
+.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 \-label | \-no-label
+Draw Labels.  Boolean.
+.TP 8
+.B \-altgeom | \-no-altgeom
+Include Alternate Geometries.  Boolean.
+.TP 8
+.B \-cycles \fInumber\fP
+Depth. 1 - 20.  Default: 20.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors.  Default: 64.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 1000000 (1.00 seconds.).
+.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 Allan R. Wilks and 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
+Allan R. Wilks and David Bagley. 
diff --git a/hacks/blaster.man b/hacks/blaster.man
new file mode 100644 (file)
index 0000000..088f04a
--- /dev/null
@@ -0,0 +1,61 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+blaster - simulation of space combat
+.SH SYNOPSIS
+.B blaster
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-num_robots \fInumber\fP]
+[\-num_lasers \fInumber\fP]
+[\-num_stars \fInumber\fP]
+[\-delay \fInumber\fP]
+.SH DESCRIPTION
+Draws a simulation of flying space-combat robots (cleverly disguised as
+colored circles) doing battle in front of a moving star field.
+.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 \-num_robots \fInumber\fP
+Robots.  2 - 50.  Default: 5.
+.TP 8
+.B \-num_lasers \fInumber\fP
+Lasers.  1 - 100.  Default: 3.
+.TP 8
+.B \-num_stars \fInumber\fP
+Stars. 5 - 200.  Default: 50.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 10000 (0.01 seconds.).
+.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 Jonathan Lin.  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
+Jonathan Lin.
diff --git a/hacks/ccurve.man b/hacks/ccurve.man
new file mode 100644 (file)
index 0000000..c06dafe
--- /dev/null
@@ -0,0 +1,56 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+ccurve - self-similar linear fractals.
+.SH SYNOPSIS
+.B ccurve
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-pause \fInumber\fP]
+[\-limit \fInumber\fP]
+.SH DESCRIPTION
+Generates self-similar linear fractals, including the classic ``C Curve.''
+.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
+Delay. 0 - 60.  Default: 1.
+.TP 8
+.B \-pause \fInumber\fP
+Duration.  1 - 60.  Default: 3.
+.TP 8
+.B \-limit \fInumber\fP
+Density.  3 - 300000.  Default: 200000.
+.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 Rick Campbell.  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
+Rick Campbell.
diff --git a/hacks/compass.man b/hacks/compass.man
new file mode 100644 (file)
index 0000000..86ea044
--- /dev/null
@@ -0,0 +1,53 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+compass - draws a spinning compass.
+.SH SYNOPSIS
+.B compass
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-no-db]
+.SH DESCRIPTION
+This draws a compass, with all elements spinning about randomly, for that
+``lost and nauseous'' feeling.
+.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 \-db | \-no-db
+Double Buffer. Boolean.
+.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 Jamie Zawinski.  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
+Jamie Zawinski.
index a0c5decdb33b68829751de244280d0a0f6e2f903..d1703538ad48fa9ed7f466bbf784249d5cf3aa73 100644 (file)
@@ -1,3 +1,4 @@
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANEMONE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANT.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) APOLLONIAN.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ATTRACTION.C
index a0c5decdb33b68829751de244280d0a0f6e2f903..d1703538ad48fa9ed7f466bbf784249d5cf3aa73 100644 (file)
@@ -1,3 +1,4 @@
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANEMONE.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANT.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) APOLLONIAN.C
 $ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ATTRACTION.C
index 9deb86b11e7671d598a93bec672bfdd7ec16ad68..492330ca1b29dad7d8284fdfe189487901d0f777 100644 (file)
@@ -4,8 +4,8 @@
             a screen saver and locker for the X window system
                             by Jamie Zawinski
 
-                              version 4.03
-                               11-May-2002
+                              version 4.04
+                               31-May-2002
 
                      http://www.jwz.org/xscreensaver/
 
diff --git a/hacks/config/anemone.xml b/hacks/config/anemone.xml
new file mode 100644 (file)
index 0000000..3443aea
--- /dev/null
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="anemone" _label="Anemone">
+
+  <command arg="-root"/>
+
+<!--
+ -withdraw 1200
+ -turnspeed 50
+-->
+
+  <number id="speed" type="slider" arg="-delay %"
+          _label="Speed" _low-label="Slow" _high-label="Fast"
+          low="0" high="80000" default="40000"
+          convert="invert"/>
+
+  <number id="cycles" type="slider" arg="-cycles %"
+           _label="Arms" _low-label="Few" _high-label="Many"
+          low="2" high="500" default="128"/>
+
+  <number id="finpoints" type="slider" arg="-finpoints %"
+           _label="Tentacles" _low-label="Few" _high-label="Many"
+          low="3" high="200" default="64"/>
+
+  <number id="width" type="slider" arg="-width %"
+           _label="Thickness" _low-label="Thin" _high-label="Thick"
+          low="1" high="10" default="2"/>
+
+<!--
+  <number id="ncolors" type="slider" arg="-ncolors %"
+            _label="Number of Colors" _low-label="Two" _high-label="Many"
+            low="2" high="255" default="64"/>
+-->
+
+  <_description>
+Wiggling tentacles.  By Gabriel Finch.
+  </_description>
+</screensaver>
index d7e73b2ea6d5ee1e7e554af0d6dba5c6d6ca325d..fe086d4510deacb5509bdeb4fd28fabaad19cd81 100644 (file)
@@ -10,7 +10,7 @@
           convert="invert"/>
 
   <number id="delay2" type="slider" arg="-delay2 %"
-          _label="90° Rotation Speed" _low-label="Slow" _high-label="Fast"
+          _label="90 deg Rotation Speed" _low-label="Slow" _high-label="Fast"
           low="1" high="800000" default="500000"
           convert="invert"/>
 
index 31a330d885834c3640897561ac1fa189b1f5518c..5c37df223ef890a0c3738b9b8b3b7006d046e573 100644 (file)
@@ -23,7 +23,6 @@
           low="1" high="100" default="25"/>
 
   <_description>
-Simulates coral growth, albeit somewhat slowly.  This image doesn't
-really do it justice.  Written by Frederick Roeber.
+Simulates coral growth, albeit somewhat slowly.  Written by Frederick Roeber.
   </_description>
 </screensaver>
index 087d68c0a0e5c80698740aa237ceb2df2db63521..fb01c2f6420f4afb6b3d258939b9ba219e24bd96 100644 (file)
@@ -38,5 +38,6 @@ Models the physics of bouncing balls, or of particles in a gas or
 fluid, depending on the settings.  If "Shake Box" is selected, then
 every now and then, the box will be rotated, changing which direction
 is down (in order to keep the settled balls in motion.)
+By Peter Birtles and Jamie Zawinski.
   </_description>
 </screensaver>
diff --git a/hacks/config/lavalite.xml b/hacks/config/lavalite.xml
new file mode 100644 (file)
index 0000000..68011be
--- /dev/null
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="lavalite" _label="LavaLite">
+
+  <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="speed" type="slider" arg="-speed %"
+          _label="Activity" _low-label="Sparse" _high-label="Dense"
+          low="0.001" high="0.01" default="0.003"/>
+
+  <number id="count" type="slider" arg="-count %"
+          _label="Max Blobs" _low-label="1" _high-label="10"
+          low="1" high="10" default="3"/>
+
+  <number id="resolution" type="slider" arg="-resolution %"
+          _label="Resolution" _low-label="Low" _high-label="High"
+          low="10" high="120" default="40"/>
+
+  <boolean id="wander" _label="Wander" arg-set="-wander"/>
+
+  <select id="style">
+    <option id="classic" _label="Classic Lavalite" arg-set="-style classic"/>
+    <option id="giant"   _label="Giant Lavalite"   arg-set="-style giant"/>
+    <option id="cone"    _label="Cone Lavalite"    arg-set="-style cone"/>
+    <option id="rocket"  _label="Rocket Lavalite"  arg-set="-style rocket"/>
+    <option id="random"  _label="Random Lamp Style"/>
+  </select>
+
+  <select id="rotation">
+    <option id="no"  _label="Don't Rotate" arg-set="-no-spin"/>
+    <option id="x"   _label="Rotate around X axis"/>
+    <option id="y"   _label="Rotate around Y axis" arg-set="-spin Y"/>
+    <option id="z"   _label="Rotate around Z axis" arg-set="-spin Z"/>
+    <option id="xy"  _label="Rotate around X and Y axes" arg-set="-spin XY"/>
+    <option id="xz"  _label="Rotate around X and Z axes" arg-set="-spin XZ"/>
+    <option id="yz"  _label="Rotate around Y and Z axes" arg-set="-spin YZ"/>
+    <option id="xyz" _label="Rotate around all three axes" arg-set="-spin XYZ"/>
+  </select>
+
+  <select id="render">
+    <option id="wire"     _label="Wireframe" arg-set="-wireframe"/>
+    <option id="solid"    _label="Smooth"/>
+    <option id="solid"    _label="Faceted" arg-set="-no-smooth"/>
+  </select>
+
+  <_description>
+Draws a 3D Simulation a Lava Lite(r): odd-shaped blobs of a mysterious
+substance are heated, slowly rise to the top of the bottle, and then
+drop back down as they cool.  This program requires OpenGL and a fairly
+fast machine (both CPU and 3D performance.)  Written by Jamie Zawinski.
+
+"LAVA LITE(r) and the configuration of the LAVA(r) brand motion lamp are
+registered trademarks of Haggerty Enterprises, Inc.  The configuration
+of the globe and base of the motion lamp are registered trademarks of
+Haggerty Enterprises, Inc. in the U.S.A. and in other countries around
+the world."
+  </_description>
+</screensaver>
diff --git a/hacks/config/queens.xml b/hacks/config/queens.xml
new file mode 100644 (file)
index 0000000..7c52fcf
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="queens" _label="Queens">
+
+  <command arg="-root"/>
+
+  <number id="speed" type="slider" arg="-delay %"
+          _label="Speed" _low-label="Slow" _high-label="Fast"
+          low="0" high="50000" default="20000"
+          convert="invert"/>
+
+  <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
+
+  <_description>
+Solves the N-Queens problem (where, in this program, N is between 5 and
+10 queens.)  The problem is: how may one place N queens on an NxN
+chessboard such that no queen can attack a sister?
+Written by Blair Tennessy.
+  </_description>
+</screensaver>
index 200435509b354cf59844c18732c5fa5d21c2b2d3..f2e8a63daf5dc741966924ed51db8d3e100971b8 100644 (file)
@@ -25,8 +25,6 @@
 
   <_description>
 Another ancient xlock demo, this one by Tom Lawrence.  It draws a
-line segment moving along a complex spiraling curve.  I tweaked this
-to generate curvier lines, but still frames of it don't look like
-much.
+line segment moving along a complex spiraling curve.
   </_description>
 </screensaver>
index b2dc29d0e993b058c578088956d3bbbbbdf18e1f..bf846f01fc5e68acc5d7c58c2c360c9dfa0912ad 100644 (file)
@@ -10,7 +10,7 @@
           convert="invert"/>
 
   <number id="move" type="slider" arg="-move %"
-          _label="Turn Side-to-Side" _low-label="0°" _high-label="90°"
+          _label="Turn Side-to-Side" _low-label="0 deg" _high-label="90 deg"
           low="0.0" high="3.0" default="2.0"/>
 
   <number id="wobble" type="slider" arg="-wobble %"
diff --git a/hacks/coral.man b/hacks/coral.man
new file mode 100644 (file)
index 0000000..9d0e48d
--- /dev/null
@@ -0,0 +1,60 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+coral - simulates coral growth, albeit somewhat slowly.
+.SH SYNOPSIS
+.B coral
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay2 \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-density \fInumber\fP]
+[\-seeds \fInumber\fP]
+.SH DESCRIPTION
+Simulates coral growth, albeit somewhat slowly.
+.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 \-delay2 \fInumber\fP
+Per-frame delay, in microseconds.  Default: 1000 (0.001 seconds.).
+.TP 8
+.B \-delay \fInumber\fP
+Duration.  1 - 60.  Default: 5.
+.TP 8
+.B \-density \fInumber\fP
+Density.  1 - 90.  Default: 25.
+.TP 8
+.B \-seeds \fInumber\fP
+Seeds. 1 - 100.  Default: 25.
+.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 Frederick Roeber.  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
+Frederick Roeber.
diff --git a/hacks/crystal.man b/hacks/crystal.man
new file mode 100644 (file)
index 0000000..07071a2
--- /dev/null
@@ -0,0 +1,77 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+crystal - kaleidescope.
+.SH SYNOPSIS
+.B crystal
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-grid]
+[\-no-cell]
+[\-centre]
+[\-nx \fInumber\fP]
+[\-ny \fInumber\fP]
+[\-count \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+.SH DESCRIPTION
+Moving polygons, similar to a kaleidescope (more like a kaleidescope than
+the hack called `kaleid,' actually.)
+.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 \-grid | \-no-grid
+Whether to draw grid.
+.TP 8
+.B \-cell | \-no-cell
+Whether to draw the cell.
+.TP 8
+.B \-centre | \-no-centre
+Whether to center on screen 
+.TP 8
+.B \-nx \fInumber\fP
+Horizontal Symmetries. -10 - 10.  Default: -3.
+.TP 8
+.B \-ny \fInumber\fP
+Vertical Symmetries.  -10 - 10.  Default: -2.
+.TP 8
+.B \-count \fInumber\fP
+Count. -5000 - 5000.  Default: -500.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 60000 (0.06 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors.  Default: 100.
+.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 Jouk Jansen.  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
+Jouk Jansen.
diff --git a/hacks/cynosure.man b/hacks/cynosure.man
new file mode 100644 (file)
index 0000000..da21ec6
--- /dev/null
@@ -0,0 +1,60 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+cynosure - gentle overlapping squares screen saver.
+.SH SYNOPSIS
+.B cynosure
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-iterations \fInumber\fP]
+.SH DESCRIPTION
+A hack similar to `greynetic', but less frenetic. The first implementation
+was by Stephen Linhart; then Ozymandias G. Desiderata wrote a Java applet
+clone. That clone was discovered by Jamie Zawinski, and ported to C for
+inclusion here. 
+.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: 500000 (0.50 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors.  Default: 128.
+.TP 8
+.B \-iterations \fInumber\fP
+Duration.  2 - 200.  Default: 100.
+.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 Stephen Linhart, Ozymandias G. Desiderata, and
+Jamie Zawinski.  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
+Stephen Linhart, Ozymandias G. Desiderata, and Jamie Zawinski.
index bf34b316047741eca6aab952420b394e2d24efba..522e01352947c3f4ddec21c0372c93c43f0b9ffb 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1999, 2001 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1999, 2001, 2002 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
@@ -335,7 +335,11 @@ screenhack (Display *dpy, Window window)
 
   while (1)
     {
-      if (!backb || !dbeclear_p)
+      if (!dbeclear_p ||
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+          !backb
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+          )
         XFillRectangle (dpy, b, erase_gc, 0, 0, xgwa.width, xgwa.height);
 
       for (i = 0; i < count; i++)
diff --git a/hacks/deluxe.man b/hacks/deluxe.man
new file mode 100644 (file)
index 0000000..73de9a0
--- /dev/null
@@ -0,0 +1,68 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+deluxe - pulsing sequence of stars, circles, and lines.
+.SH SYNOPSIS
+.B deluxe
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-thickness \fInumber\fP]
+[\-count \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-transparent]
+[\-no-db]
+.SH DESCRIPTION
+This draws a pulsing sequence of stars, circles, and lines.
+.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: 5000 (0.01 seconds.).
+.TP 8
+.B \-thickness \fInumber\fP
+Thickness of lines.  Default: 50.
+.TP 8
+.B \-count \fInumber\fP
+Number of objects.  Default: 5.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of colors.  Default: 20.
+.TP 8
+.B \-transparent | \-no-transparent
+Whether to use transparency.
+.TP 8
+.B \-db | \-no-db
+Whether to double buffer.
+.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 Jamie Zawinski.  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
+Jamie Zawinski.
diff --git a/hacks/demon.man b/hacks/demon.man
new file mode 100644 (file)
index 0000000..9115655
--- /dev/null
@@ -0,0 +1,65 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+demon - celular automaton.
+.SH SYNOPSIS
+.B demon
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-size \fInumber\fP]
+.SH DESCRIPTION
+A cellular automaton that starts with a random field, and organizes it into
+stripes and spirals.
+.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 \-count \fInumber\fP
+States.  0 - 20.  Default: 0.
+.TP 8
+.B \-cycles \fInumber\fP
+Timeout.  0 - 800000.  Default: 1000.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 50000 (0.05 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors.  Default: 64.
+.TP 8
+.B \-size \fInumber\fP
+Cell Size.  -20 - 20.  Default: -7.
+.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.
diff --git a/hacks/discrete.man b/hacks/discrete.man
new file mode 100644 (file)
index 0000000..abc6faa
--- /dev/null
@@ -0,0 +1,57 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+discrete - discrete map iterative function fractal systems.
+.SH SYNOPSIS
+.B discrete
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+.SH DESCRIPTION
+More ``discrete map'' systems, including new variants of Hopalong and
+Julia, and a few others.
+.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 \-cycles \fInumber\fP
+Timeout.  100 - 10000. Default: 2500.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 1000 (0.001 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors.  Default: 100.
+.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 Tim Auckland.  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
+Tim Auckland.
diff --git a/hacks/euler2d.man b/hacks/euler2d.man
new file mode 100644 (file)
index 0000000..2284a03
--- /dev/null
@@ -0,0 +1,65 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+euler2d - two dimensional incompressible inviscid fluid flow.
+.SH SYNOPSIS
+.B euler2d
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-eulertail \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-delay \fInumber\fP]
+.SH DESCRIPTION
+Simulates two dimensional incompressible inviscid fluid flow.
+.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 \-count \fInumber\fP
+Particles.  2 - 5000.  Default: 1024.
+.TP 8
+.B \-eulertail \fInumber\fP
+Trail Length.  2 - 500.  Default: 10.
+.TP 8
+.B \-cycles \fInumber\fP
+Duration.  100 - 5000. Default: 3000.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors.  Default: 64.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 10000 (0.01 seconds.).
+.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 Stephen Montgomery-Smith.  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
+Stephen Montgomery-Smith.
diff --git a/hacks/fadeplot.man b/hacks/fadeplot.man
new file mode 100644 (file)
index 0000000..4ee0a03
--- /dev/null
@@ -0,0 +1,61 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+fadeplot - draws a waving ribbon following a sinusoidal path.
+.SH SYNOPSIS
+.B fadeplot
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+.SH DESCRIPTION
+Draws what looks like a waving ribbon following a sinusoidal path.
+.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 \-count \fInumber\fP
+Count. 0 - 20.  Default: 10.
+.TP 8
+.B \-cycles \fInumber\fP
+How many frames until the shape changes.  Default: 1500.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 30000 (0.03 seconds.).
+.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 Bas van Gaalen and Charles Vidal.  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
+Bas van Gaalen and Charles Vidal.
diff --git a/hacks/flow.man b/hacks/flow.man
new file mode 100644 (file)
index 0000000..6215286
--- /dev/null
@@ -0,0 +1,89 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+flow - strange attractors.
+.SH SYNOPSIS
+.B flow
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-rotate \fIbool\fP]
+[\-ride \fIbool\fP]
+[\-zoom \fIbool\fP]
+[\-box \fIbool\fP]
+[\-freeze \fIbool\fP]
+[\-allow2d \fIbool\fP]
+[\-slow \fIbool\fP]
+.SH DESCRIPTION
+Another series of strange attractors: a flowing series of points, making
+strange rotational shapes.
+.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 \-count \fInumber\fP
+Number of pixels.  Default: 500.
+.TP 8
+.B \-cycles \fInumber\fP
+Timeout before changing objects.  0 - 800000.  Default: 3000.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 1000 (0.001 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors.  Default: 200.
+.TP 8
+.B \-rotate
+Rotate Around Attractor.
+.TP 8
+.B \-ride
+Ride a Trained Bee.
+.TP 8
+.B \-zoom
+Zoom In and Out.
+.TP 8
+.B \-box
+Show Bounding Box.
+.TP 8
+.B \-freeze
+Freeze Some Bees.
+.TP 8
+.B \-allow2d
+Allow 2D Attractors.
+.TP 8
+.B \-slow
+Slow Bees with Antifreeze.
+.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 Jeff Butterworth.  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
+Jeff Butterworth.
diff --git a/hacks/fluidballs.man b/hacks/fluidballs.man
new file mode 100644 (file)
index 0000000..5e06b89
--- /dev/null
@@ -0,0 +1,89 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+fluidballs - the physics of bouncing balls.
+.SH SYNOPSIS
+.B fluidballs
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-size \fInumber\fP]
+[\-gravity \fInumber\fP]
+[\-wind \fInumber\fP]
+[\-friction \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-nonrandom]
+[\-no-shake]
+[\-fps]
+.SH DESCRIPTION
+Models the physics of bouncing balls, or of particles in a gas or fluid,
+depending on the settings. If "Shake Box" is selected, then every now and
+then, the box will be rotated, changing which direction is down (in order
+to keep the settled balls in motion.) 
+.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 \-count \fInumber\fP
+How many balls to display.  Default: 300.
+.TP 8
+.B \-size \fInumber\fP
+Maximum size of each ball.  Default: 25.
+.TP 8
+.B \-gravity \fInumber\fP
+Coefficient of gravity.  Useful values are < 0.1.  Default: 0.01.
+.TP 8
+.B \-wind \fInumber\fP
+Wind.  Useful values are < 0.1.  Default: 0.00.
+.TP 8
+.B \-friction \fInumber\fP
+Coefficient of friction (or viscosity.)  Useful values are < 4.  Default: 0.8.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-nonrandom
+Make all balls be the same size.
+.TP 8
+.B \-no-nonrandom
+Make the balls be random sizes.  Default.
+.TP 8
+.B \-shake | \-no-shake
+Whether to shake the box if the system seems to have settled down.
+"Shake" means "change the direction of Down."
+.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 2002 by Peter Birtles and Jamie Zawinski.  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
+Peter Birtles and Jamie Zawinski.
+
index 68cb2fadb58e958b4def3d6b85ecf2e25a4125fc..49e42729c68894463f09a74c9dcd96b8482e441d 100644 (file)
@@ -80,7 +80,8 @@ SRCS          = xscreensaver-gl-helper.c \
                  gltext.c molecule.c dangerball.c sphere.c tube.c circuit.c \
                  menger.c engine.c flipscreen3d.c font-ximage.c \
                  grab-ximage.c glsnake.c boxed.c glforestfire.c sballs.c \
-                 cubenetic.c spheremonics.c
+                 cubenetic.c spheremonics.c marching.c lavalite.c rotator.c \
+                 trackball.c gltrackball.c queens.c
 
 OBJS           = xscreensaver-gl-helper.o \
                  atlantis.o b_draw.o b_lockglue.o b_sphere.o bubble3d.o \
@@ -97,13 +98,14 @@ OBJS                = xscreensaver-gl-helper.o \
                  gltext.o molecule.o dangerball.o sphere.o tube.o circuit.o \
                  menger.o engine.o flipscreen3d.o font-ximage.o \
                  grab-ximage.o glsnake.o boxed.o glforestfire.o sballs.o \
-                 cubenetic.o spheremonics.o
+                 cubenetic.o spheremonics.o marching.o lavalite.o rotator.o \
+                 trackball.o gltrackball.o queens.o
 
 GL_EXES                = cage gears moebius pipes sproingies stairs superquadrics \
                  morph3d rubik atlantis lament bubble3d glplanet pulsar \
                  sierpinski3d gflux stonerview starwars gltext molecule \
                  dangerball circuit menger engine flipscreen3d glsnake boxed \
-                 glforestfire sballs cubenetic spheremonics
+                 glforestfire sballs cubenetic spheremonics lavalite queens
 GLE_EXES       = extrusion
 GL_UTIL_EXES   = xscreensaver-gl-helper
 HACK_EXES      = @GL_EXES@ @GLE_EXES@
@@ -118,10 +120,16 @@ HACK_OBJS = screenhack-gl.o xlock-gl.o fps.o $(HACK_BIN)/xlockmore.o \
 
 HDRS           = atlantis.h bubble3d.h buildlwo.h e_textures.h xpm-ximage.h \
                  grab-ximage.h font-ximage.h tube.h sphere.h boxed.h \
-                 stonerview-move.h stonerview-osc.h glutstroke.h glut_roman.h
-GL_MEN         = gflux.man lament.man starwars.man gltext.man \
-                 molecule.man xscreensaver-gl-helper.man glsnake.man \
-                 glforestfire.man sballs.man
+                 stonerview-move.h stonerview-osc.h glutstroke.h \
+                 glut_roman.h marching.h rotator.h trackball.h gltrackball.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 \
+                 glplanet.man glsnake.man gltext.man lament.man lavalite.man \
+                 menger.man moebius.man molecule.man morph3d.man pipes.man \
+                 pulsar.man queens.man rubik.man sballs.man sierpinski3d.man \
+                 spheremonics.man sproingies.man stairs.man starwars.man \
+                 stonerview.man superquadrics.man xscreensaver-gl-helper.man
 MEN            = @GL_MEN@
 EXTRAS         = README Makefile.in
 
@@ -244,6 +252,7 @@ distdepend:: molecules.h
        mv Makefile.in Makefile.in.bak &&                                   \
        mv /tmp/distdepend.$$$$ Makefile.in
 
+
 TAGS: tags
 tags:
        find $(srcdir) -name '*.[chly]' -print | xargs etags -a
@@ -251,6 +260,44 @@ tags:
 echo_tarfiles:
        @echo $(TARFILES)
 
+check_men:
+       @badmen="" ;                                                    \
+        for exe in $(EXES); do                                         \
+          if ! [ -f $(srcdir)/$$exe.man ]; then                        \
+            badmen="$$badmen $$exe" ;                                  \
+          fi ;                                                         \
+        done ;                                                         \
+        if [ -n "$$badmen" ]; then                                     \
+          echo "" ;                                                    \
+          echo "Warning: The following programs have no manuals:" ;    \
+          echo "" ;                                                    \
+          for m in $$badmen ; do                                       \
+            echo "    $$m" ;                                           \
+          done ;                                                       \
+        fi
+
+check_xml:
+       @badxml="" ;                                                    \
+        for exe in $(EXES); do                                         \
+          if ! [ -f $(srcdir)/../config/$$exe.xml -o                   \
+                 "$$exe" = xscreensaver-gl-helper ]; then              \
+            badxml="$$badxml $$exe" ;                                  \
+          fi ;                                                         \
+        done ;                                                         \
+        if [ -n "$$badxml" ]; then                                     \
+          echo "" ;                                                    \
+          echo "Warning: The following programs have no configurators:" ; \
+          echo "" ;                                                    \
+          for m in $$badxml ; do                                       \
+            echo "    $$m" ;                                           \
+          done ;                                                       \
+          echo "" ;                                                    \
+        fi
+
+distdepend:: check_men check_xml
+
+
+
 
 # Rules for noticing when the objects from the utils directory are out of
 # date with respect to their sources, and going and building them according
@@ -295,6 +342,8 @@ screenhack-gl.o: $(HACK_SRC)/screenhack.c
 
 CC_HACK                = $(CC) $(LDFLAGS)
 
+TRACK_OBJS=rotator.o trackball.o gltrackball.o
+
 ATLANTIS_OBJS = $(HACK_OBJS) dolphin.o shark.o swim.o whale.o xpm-ximage.o
 atlantis:      atlantis.o      $(ATLANTIS_OBJS)
        $(CC_HACK) -o $@ $@.o   $(ATLANTIS_OBJS) $(HACK_LIBS) $(XPM_LIBS)
@@ -302,11 +351,11 @@ atlantis: atlantis.o      $(ATLANTIS_OBJS)
 cage:          cage.o          $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
 
-gears:         gears.o         $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+gears:         gears.o         $(HACK_OBJS) $(TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(TRACK_OBJS) $(HACK_LIBS)
 
-moebius:       moebius.o               $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+moebius:       moebius.o       $(TRACK_OBJS) $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(TRACK_OBJS) $(HACK_OBJS) $(HACK_LIBS)
 
 pipes:         pipes.o         $(HACK_OBJS) pipeobjs.o buildlwo.o
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) pipeobjs.o buildlwo.o \
@@ -329,27 +378,28 @@ SPROINGIES = sproingiewrap.o buildlwo.o \
 sproingies: sproingies.o $(HACK_OBJS) $(SPROINGIES)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(SPROINGIES) $(HACK_LIBS)
 
-lament:                lament.o        $(HACK_OBJS) xpm-ximage.o
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) xpm-ximage.o $(XPM_LIBS)
+lament:                lament.o        $(TRACK_OBJS) xpm-ximage.o $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(TRACK_OBJS) xpm-ximage.o $(HACK_OBJS) $(XPM_LIBS)
 
 B3D = b_sphere.o b_draw.o b_lockglue.o
 bubble3d:      bubble3d.o      $(HACK_OBJS) $(B3D)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(B3D) $(HACK_LIBS)
 
-glplanet:      glplanet.o      sphere.o xpm-ximage.o $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   sphere.o xpm-ximage.o $(HACK_OBJS) $(XPM_LIBS)
+PLANETHACKS=sphere.o xpm-ximage.o $(TRACK_OBJS)
+glplanet:      glplanet.o      $(PLANETHACKS) $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(PLANETHACKS) $(HACK_OBJS) $(XPM_LIBS)
 
 pulsar:                pulsar.o        $(HACK_OBJS) xpm-ximage.o
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) xpm-ximage.o $(HACK_LIBS) $(XPM_LIBS)
 
 EXTRUSION_OBJS=extrusion.o extrusion-helix2.o extrusion-helix3.o    \
        extrusion-helix4.o extrusion-joinoffset.o extrusion-screw.o \
-       extrusion-taper.o extrusion-twistoid.o xpm-ximage.o
+       extrusion-taper.o extrusion-twistoid.o xpm-ximage.o $(TRACK_OBJS)
 extrusion:     $(EXTRUSION_OBJS) $(HACK_OBJS)
        $(CC_HACK) -o $@ $(EXTRUSION_OBJS) $(HACK_OBJS) $(XPM_LIBS) $(GLE_LIBS)
 
-sierpinski3d:  sierpinski3d.o  $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+sierpinski3d:  sierpinski3d.o  $(HACK_OBJS) $(TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(TRACK_OBJS) $(HACK_LIBS)
 
 gflux:         gflux.o         $(HACK_OBJS) $(GRAB_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB_OBJS) $(HACK_LIBS)
@@ -358,18 +408,19 @@ SW_OBJS=starwars.o glut_stroke.o glut_swidth.o
 starwars:      $(SW_OBJS) $(HACK_OBJS)
        $(CC_HACK) -o $@ $(SW_OBJS) $(HACK_OBJS) $(HACK_LIBS)
 
-GLT_OBJS=gltext.o glut_stroke.o glut_swidth.o tube.o
+GLT_OBJS=gltext.o glut_stroke.o glut_swidth.o tube.o $(TRACK_OBJS)
 gltext:        $(GLT_OBJS) $(HACK_OBJS)
        $(CC_HACK) -o $@ $(GLT_OBJS) $(HACK_OBJS) $(HACK_LIBS)
 
-dangerball:    dangerball.o    sphere.o tube.o $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   sphere.o tube.o $(HACK_OBJS) $(HACK_LIBS)
+DB_OBJS=sphere.o tube.o $(TRACK_OBJS)
+dangerball:    dangerball.o    $(DB_OBJS) $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(DB_OBJS) $(HACK_OBJS) $(HACK_LIBS)
 
 circuit:       circuit.o       $(HACK_OBJS) font-ximage.o
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) font-ximage.o $(HACK_LIBS)
 
-menger:                menger.o        $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+menger:                menger.o        $(HACK_OBJS) $(TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(TRACK_OBJS) $(HACK_LIBS)
 
 engine:                engine.o        $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
@@ -389,12 +440,18 @@ glforestfire:     glforestfire.o  $(HACK_OBJS) xpm-ximage.o
 sballs:                sballs.o        $(HACK_OBJS) xpm-ximage.o
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) xpm-ximage.o $(XPM_LIBS)
 
-cubenetic:     cubenetic.o     $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+cubenetic:     cubenetic.o     $(HACK_OBJS) $(TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(TRACK_OBJS) $(HACK_LIBS)
 
-spheremonics:  spheremonics.o  $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+spheremonics:  spheremonics.o  $(HACK_OBJS) $(TRACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(TRACK_OBJS) $(HACK_LIBS)
+
+LLOBJS=marching.o xpm-ximage.o $(TRACK_OBJS) $(HACK_OBJS)
+lavalite:      lavalite.o      $(LLOBJS)
+       $(CC_HACK) -o $@ $@.o   $(LLOBJS)  $(XPM_LIBS)
 
+queens:                queens.o        $(TRACK_OBJS) $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(TRACK_OBJS) $(HACK_OBJS) $(HACK_LIBS)
 
 # This one works differently (it's not xlock-like.)
 #
@@ -414,8 +471,9 @@ molecules.h:
        done ;                                                          \
        mv $$tmp molecules.h
 
-molecule:      molecule.o      sphere.o tube.o $(HACK_OBJS)
-       $(CC_HACK) -o $@ $@.o   sphere.o tube.o $(HACK_OBJS) $(HACK_LIBS)
+MOLECULEOBJS=sphere.o tube.o $(TRACK_OBJS)
+molecule:      molecule.o      $(MOLECULEOBJS) $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(MOLECULEOBJS) $(HACK_OBJS) $(HACK_LIBS)
 
 dnalogo:       dnalogo.o       tube.o $(HACK_OBJS)
        $(CC_HACK) -o $@ $@.o   tube.o $(HACK_OBJS) $(HACK_LIBS)
@@ -444,7 +502,11 @@ cage.o: $(srcdir)/e_textures.h
 circuit.o: ../../config.h
 circuit.o: $(srcdir)/font-ximage.h
 cubenetic.o: ../../config.h
+cubenetic.o: $(srcdir)/gltrackball.h
+cubenetic.o: $(srcdir)/rotator.h
 dangerball.o: ../../config.h
+dangerball.o: $(srcdir)/gltrackball.h
+dangerball.o: $(srcdir)/rotator.h
 dangerball.o: $(srcdir)/sphere.h
 dangerball.o: $(srcdir)/tube.h
 dolphin.o: $(srcdir)/atlantis.h
@@ -454,6 +516,7 @@ extrusion-helix3.o: ../../config.h
 extrusion-helix4.o: ../../config.h
 extrusion-joinoffset.o: ../../config.h
 extrusion.o: ../../config.h
+extrusion.o: $(srcdir)/rotator.h
 extrusion.o: $(srcdir)/xpm-ximage.h
 extrusion-screw.o: ../../config.h
 extrusion-taper.o: ../../config.h
@@ -463,6 +526,8 @@ flipscreen3d.o: $(srcdir)/grab-ximage.h
 font-ximage.o: ../../config.h
 fps.o: ../../config.h
 gears.o: ../../config.h
+gears.o: $(srcdir)/gltrackball.h
+gears.o: $(srcdir)/rotator.h
 gflux.o: ../../config.h
 gflux.o: $(srcdir)/grab-ximage.h
 glforestfire.o: ../../config.h
@@ -470,27 +535,49 @@ glforestfire.o: $(HACK_SRC)/images/ground.xpm
 glforestfire.o: $(HACK_SRC)/images/tree.xpm
 glforestfire.o: $(srcdir)/xpm-ximage.h
 glplanet.o: ../../config.h
+glplanet.o: $(srcdir)/gltrackball.h
 glplanet.o: $(HACK_SRC)/images/earth.xpm
+glplanet.o: $(srcdir)/rotator.h
 glplanet.o: $(srcdir)/sphere.h
 glplanet.o: $(srcdir)/xpm-ximage.h
 glsnake.o: ../../config.h
 gltext.o: ../../config.h
+gltext.o: $(srcdir)/gltrackball.h
 gltext.o: $(srcdir)/glut_roman.h
 gltext.o: $(srcdir)/glutstroke.h
+gltext.o: $(srcdir)/rotator.h
 gltext.o: $(srcdir)/tube.h
+gltrackball.o: ../../config.h
+gltrackball.o: $(srcdir)/gltrackball.h
+gltrackball.o: $(srcdir)/trackball.h
 glut_stroke.o: ../../config.h
 glut_stroke.o: $(srcdir)/glutstroke.h
 glut_swidth.o: ../../config.h
 glut_swidth.o: $(srcdir)/glutstroke.h
 grab-ximage.o: ../../config.h
 lament.o: ../../config.h
+lament.o: $(srcdir)/gltrackball.h
 lament.o: $(HACK_SRC)/images/lament.xpm
+lament.o: $(srcdir)/rotator.h
 lament.o: $(srcdir)/xpm-ximage.h
+lavalite.o: ../../config.h
+lavalite.o: $(srcdir)/gltrackball.h
+lavalite.o: $(srcdir)/marching.h
+lavalite.o: $(srcdir)/rotator.h
+lavalite.o: $(srcdir)/xpm-ximage.h
+marching.o: ../../config.h
+marching.o: $(srcdir)/marching.h
 menger.o: ../../config.h
+menger.o: $(srcdir)/gltrackball.h
+menger.o: $(srcdir)/rotator.h
 moebius.o: ../../config.h
 moebius.o: $(srcdir)/e_textures.h
+moebius.o: $(srcdir)/gltrackball.h
+moebius.o: $(srcdir)/rotator.h
 molecule.o: ../../config.h
+molecule.o: $(srcdir)/gltrackball.h
 molecule.o: molecules.h
+molecule.o: $(srcdir)/rotator.h
 molecule.o: $(srcdir)/sphere.h
 molecule.o: $(srcdir)/tube.h
 morph3d.o: ../../config.h
@@ -499,6 +586,10 @@ pipes.o: $(srcdir)/buildlwo.h
 pipes.o: ../../config.h
 pulsar.o: ../../config.h
 pulsar.o: $(srcdir)/xpm-ximage.h
+queens.o: ../../config.h
+queens.o: $(srcdir)/gltrackball.h
+rotator.o: ../../config.h
+rotator.o: $(srcdir)/rotator.h
 rubik.o: ../../config.h
 s1_1.o: $(srcdir)/buildlwo.h
 s1_2.o: $(srcdir)/buildlwo.h
@@ -513,7 +604,11 @@ sballs.o: $(HACK_SRC)/images/sball.xpm
 sballs.o: $(srcdir)/xpm-ximage.h
 shark.o: $(srcdir)/atlantis.h
 sierpinski3d.o: ../../config.h
+sierpinski3d.o: $(srcdir)/gltrackball.h
+sierpinski3d.o: $(srcdir)/rotator.h
 spheremonics.o: ../../config.h
+spheremonics.o: $(srcdir)/gltrackball.h
+spheremonics.o: $(srcdir)/rotator.h
 sphere.o: ../../config.h
 sproingies.o: $(srcdir)/buildlwo.h
 sproingies.o: ../../config.h
@@ -536,6 +631,8 @@ stonerview-view.o: $(srcdir)/stonerview-osc.h
 superquadrics.o: ../../config.h
 swim.o: $(srcdir)/atlantis.h
 swim.o: ../../config.h
+trackball.o: ../../config.h
+trackball.o: $(srcdir)/trackball.h
 tube.o: ../../config.h
 tube.o: $(srcdir)/tube.h
 whale.o: $(srcdir)/atlantis.h
diff --git a/hacks/glx/atlantis.man b/hacks/glx/atlantis.man
new file mode 100644 (file)
index 0000000..7ec1ee9
--- /dev/null
@@ -0,0 +1,78 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+atlantis - draw swimming sharks, whales, and dolphins.
+.SH SYNOPSIS
+.B atlantis
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-whalespeed \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-size \fInumber\fP]
+[\-count \fInumber\fP]
+[\-no-texture]
+[\-gradient]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+This is xfishtank writ large: a GL animation of a number of sharks,
+dolphins, and whales. The swimming motions are great.
+.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 \-whalespeed \fInumber\fP
+Whale Speed.  0 - 1000.  Default: 250.
+.TP 8
+.B \-delay \fInumber\fP
+Shark Speed.  0 - 500. Default: 100.
+.TP 8
+.B \-size \fInumber\fP
+Shark Proximity.  100 - 10000. Default: 6000.
+.TP 8
+.B \-count \fInumber\fP
+Number of Sharks.  0 - 20.  Default: 4.
+.TP 8
+.B \-texture | \-no-texture
+Whether to show shimmering water.
+.TP 8
+.B \-gradient
+Whether to draw a gradient on the background, making it darker at the bottom.
+.TP 8
+.B \-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 2002 by Mark Kilgard.  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
+Mark Kilgard.
+
diff --git a/hacks/glx/boxed.man b/hacks/glx/boxed.man
new file mode 100644 (file)
index 0000000..6faafe5
--- /dev/null
@@ -0,0 +1,56 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+boxed - draws a box full of 3D bouncing balls that explode.
+.SH SYNOPSIS
+.B boxed
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Draws a box full of 3D bouncing balls that explode.
+.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 \-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 2002 by Sander van Grieken.  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
+Sander van Grieken.
diff --git a/hacks/glx/bubble3d.man b/hacks/glx/bubble3d.man
new file mode 100644 (file)
index 0000000..21bdbe0
--- /dev/null
@@ -0,0 +1,53 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+bubble3d - 3d rising bubbles.
+.SH SYNOPSIS
+.B bubble3d
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Draws a stream of rising, undulating 3D bubbles, rising toward the top of
+the screen, with nice specular reflections.
+.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 (0.01 seconds.).
+.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 2002 by Richard Jones.  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
+Richard Jones.
diff --git a/hacks/glx/cage.man b/hacks/glx/cage.man
new file mode 100644 (file)
index 0000000..c60498f
--- /dev/null
@@ -0,0 +1,53 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+cage - Escher's impossible cage, for xscreensaver.
+.SH SYNOPSIS
+.B cage
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[-delay \fInumber\fP]
+[-fps]
+.SH DESCRIPTION
+This draws Escher's "Impossible Cage", a 3d analog of a moebius strip,
+and rotates it in three dimensions.
+.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: 25000 (0.03 seconds.).
+.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 2002 by Marcelo Vianna.  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
+Marcelo Vianna.
diff --git a/hacks/glx/circuit.man b/hacks/glx/circuit.man
new file mode 100644 (file)
index 0000000..211780c
--- /dev/null
@@ -0,0 +1,72 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+circuit - animates a number of 3D electronic components.
+.SH SYNOPSIS
+.B circuit
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-parts \fInumber\fP]
+[\-no-spin]
+[\-rotate]
+[\-delay \fInumber\fP]
+[\-no-light]
+[\-fps]
+.SH DESCRIPTION
+Animates a number of 3D electronic components.
+.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 \-parts \fInumber\fP
+Number of parts.  Default: 10.
+.TP 8
+.B \-spin | \-no-spin
+Whether the objects should spin.
+.TP 8
+.B \-rotate | \-no-rotate
+Whether the scene should spin.
+.TP 8
+.B \-delay \fInumber\fP
+Rotation speed, 0 - 100.  Default: 1.
+.TP 8
+.B \-light | \-no-light
+Whether to us lighting, or flat coloring.
+.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 2002 by Ben Buxton.  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
+Ben Buxton.
index 4b4815e3dc11f91eef28fbed07e4cfb9763298fe..db2f6ac365e2eaa28df954322ec995040375d503 100644 (file)
@@ -17,6 +17,8 @@ extern XtAppContext app;
 #define HACK_INIT      init_cube
 #define HACK_DRAW      draw_cube
 #define HACK_RESHAPE   reshape_cube
+#define HACK_HANDLE_EVENT cube_handle_event
+#define EVENT_MASK      PointerMotionMask
 #define ccs_opts       xlockmore_opts
 
 #define DEF_SPIN        "XYZ"
@@ -43,6 +45,8 @@ extern XtAppContext app;
 
 #include "xlockmore.h"
 #include "colors.h"
+#include "rotator.h"
+#include "gltrackball.h"
 #include <ctype.h>
 
 #ifdef USE_GL /* whole file */
@@ -74,12 +78,9 @@ typedef struct {
 
 typedef struct {
   GLXContext *glx_context;
-
-  GLfloat rotx, roty, rotz;       /* current object rotation */
-  GLfloat dx, dy, dz;             /* current rotational velocity */
-  GLfloat ddx, ddy, ddz;          /* current rotational acceleration */
-  GLfloat d_max;                  /* max velocity */
-  Bool spin_x, spin_y, spin_z;
+  rotator *rot;
+  trackball_state *trackball;
+  Bool button_down_p;
 
   GLuint cube_list;
   GLuint texture_id;
@@ -199,89 +200,17 @@ reshape_cube (ModeInfo *mi, int width, int height)
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
 
-  gluPerspective( 30.0, 1/h, 1.0, 100.0 );
-  gluLookAt( 0.0, 0.0, 15.0,
-             0.0, 0.0, 0.0,
-             0.0, 1.0, 0.0);
+  gluPerspective (30.0, 1/h, 1.0, 100.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
-  glTranslatef(0.0, 0.0, -15.0);
+  gluLookAt( 0.0, 0.0, 30.0,
+             0.0, 0.0, 0.0,
+             0.0, 1.0, 0.0);
 
   glClear(GL_COLOR_BUFFER_BIT);
 }
 
 
-/* lifted from lament.c */
-#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
-static void
-rotate(GLfloat *pos, GLfloat *v, GLfloat *dv, GLfloat max_v)
-{
-  double ppos = *pos;
-
-  /* tick position */
-  if (ppos < 0)
-    ppos = -(ppos + *v);
-  else
-    ppos += *v;
-
-  if (ppos > 1.0)
-    ppos -= 1.0;
-  else if (ppos < 0)
-    ppos += 1.0;
-
-  if (ppos < 0) abort();
-  if (ppos > 1.0) abort();
-  *pos = (*pos > 0 ? ppos : -ppos);
-
-  /* accelerate */
-  *v += *dv;
-
-  /* clamp velocity */
-  if (*v > max_v || *v < -max_v)
-    {
-      *dv = -*dv;
-    }
-  /* If it stops, start it going in the other direction. */
-  else if (*v < 0)
-    {
-      if (random() % 4)
-       {
-         *v = 0;
-
-         /* keep going in the same direction */
-         if (random() % 2)
-           *dv = 0;
-         else if (*dv < 0)
-           *dv = -*dv;
-       }
-      else
-       {
-         /* reverse gears */
-         *v = -*v;
-         *dv = -*dv;
-         *pos = -*pos;
-       }
-    }
-
-  /* Alter direction of rotational acceleration randomly. */
-  if (! (random() % 120))
-    *dv = -*dv;
-
-  /* Change acceleration very occasionally. */
-  if (! (random() % 200))
-    {
-      if (*dv == 0)
-       *dv = 0.00001;
-      else if (random() & 1)
-       *dv *= 1.2;
-      else
-       *dv *= 0.8;
-    }
-}
-
-
 \f
 /* Waves.
    Adapted from ../hacks/interference.c by Hannu Mallat.
@@ -414,6 +343,39 @@ shuffle_texture (ModeInfo *mi)
 }
 
 
+Bool
+cube_handle_event (ModeInfo *mi, XEvent *event)
+{
+  cube_configuration *cc = &ccs[MI_SCREEN(mi)];
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button & Button1)
+    {
+      cc->button_down_p = True;
+      gltrackball_start (cc->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)
+    {
+      cc->button_down_p = False;
+      return True;
+    }
+  else if (event->xany.type == MotionNotify &&
+           cc->button_down_p)
+    {
+      gltrackball_track (cc->trackball,
+                         event->xmotion.x, event->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+
+  return False;
+}
+
+
 void 
 init_cube (ModeInfo *mi)
 {
@@ -454,12 +416,16 @@ init_cube (ModeInfo *mi)
 
 
   {
+    Bool spinx=False, spiny=False, spinz=False;
+    double spin_speed   = 1.0;
+    double wander_speed = 0.05;
+
     char *s = do_spin;
     while (*s)
       {
-        if      (*s == 'x' || *s == 'X') cc->spin_x = 1;
-        else if (*s == 'y' || *s == 'Y') cc->spin_y = 1;
-        else if (*s == 'z' || *s == 'Z') cc->spin_z = 1;
+        if      (*s == 'x' || *s == 'X') spinx = True;
+        else if (*s == 'y' || *s == 'Y') spiny = True;
+        else if (*s == 'z' || *s == 'Z') spinz = True;
         else
           {
             fprintf (stderr,
@@ -469,22 +435,15 @@ init_cube (ModeInfo *mi)
           }
         s++;
       }
-  }
 
-  cc->rotx = frand(1.0) * RANDSIGN();
-  cc->roty = frand(1.0) * RANDSIGN();
-  cc->rotz = frand(1.0) * RANDSIGN();
-
-  /* bell curve from 0-6 degrees, avg 3 */
-  cc->dx = (frand(0.7) + frand(0.7) + frand(0.7)) / (360/2);
-  cc->dy = (frand(0.7) + frand(0.7) + frand(0.7)) / (360/2);
-  cc->dz = (frand(0.7) + frand(0.7) + frand(0.7)) / (360/2);
-
-  cc->d_max = cc->dx * 2;
-
-  cc->ddx = 0.00006 + frand(0.00003);
-  cc->ddy = 0.00006 + frand(0.00003);
-  cc->ddz = 0.00006 + frand(0.00003);
+    cc->rot = make_rotator (spinx ? spin_speed : 0,
+                            spiny ? spin_speed : 0,
+                            spinz ? spin_speed : 0,
+                            1.0,
+                            do_wander ? wander_speed : 0,
+                            True);
+    cc->trackball = gltrackball_init ();
+  }
 
   cc->ncolors = 256;
   cc->texture_colors = (XColor *) calloc(cc->ncolors, sizeof(XColor));
@@ -591,39 +550,18 @@ draw_cube (ModeInfo *mi)
   glScalef(1.1, 1.1, 1.1);
 
   {
-    GLfloat x, y, z;
-
-    if (do_wander)
-      {
-        static int frame = 0;
-
-#       define SINOID(SCALE,SIZE) \
-        ((((1 + sin((frame * (SCALE)) / 2 * M_PI)) / 2.0) * (SIZE)) - (SIZE)/2)
-
-        x = SINOID(0.0071, 8.0);
-        y = SINOID(0.0053, 6.0);
-        z = SINOID(0.0037, 15.0);
-        frame++;
-        glTranslatef(x, y, z);
-      }
-
-    if (cc->spin_x || cc->spin_y || cc->spin_z)
-      {
-        x = cc->rotx;
-        y = cc->roty;
-        z = cc->rotz;
-        if (x < 0) x = 1 - (x + 1);
-        if (y < 0) y = 1 - (y + 1);
-        if (z < 0) z = 1 - (z + 1);
-
-        if (cc->spin_x) glRotatef(x * 360, 1.0, 0.0, 0.0);
-        if (cc->spin_y) glRotatef(y * 360, 0.0, 1.0, 0.0);
-        if (cc->spin_z) glRotatef(z * 360, 0.0, 0.0, 1.0);
-
-        rotate(&cc->rotx, &cc->dx, &cc->ddx, cc->d_max);
-        rotate(&cc->roty, &cc->dy, &cc->ddy, cc->d_max);
-        rotate(&cc->rotz, &cc->dz, &cc->ddz, cc->d_max);
-      }
+    double x, y, z;
+    get_position (cc->rot, &x, &y, &z, !cc->button_down_p);
+    glTranslatef((x - 0.5) * 8,
+                 (y - 0.5) * 6,
+                 (z - 0.5) * 15);
+
+    gltrackball_rotate (cc->trackball);
+
+    get_rotation (cc->rot, &x, &y, &z, !cc->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);
   }
 
   glScalef (2.5, 2.5, 2.5);
diff --git a/hacks/glx/cubenetic.man b/hacks/glx/cubenetic.man
new file mode 100644 (file)
index 0000000..f10b07d
--- /dev/null
@@ -0,0 +1,89 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+cubenetic - cubist 3D undulating blob.
+.SH SYNOPSIS
+.B cubenetic
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-count \fInumber\fP]
+[\-no-wander]
+[\-no-spin]
+[\-spin \fI[XYZ]\fP]
+[\-wireframe]
+[\-no-texture]
+[\-wave-speed \fInumber\fP]
+[\-wave-radius \fInumber\fP]
+[\-waves \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Draws a pulsating set of overlapping boxes with ever-chaning blobby
+patterns undulating across their surfaces.
+.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 \-count \fInumber\fP
+How many boxes make up the object.  Default: 5.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin \fI[XYZ]\fP
+Around which axes should the object spin?
+.TP 8
+.B \-no-spin
+Don't spin.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-texture | \-no-texture
+Display Solid Colors.
+.TP 8
+.B \-wave-speed \fInumber\fP
+Surface Pattern Speed. 5 - 150.  Default: 80.
+.TP 8
+.B \-wave-radius \fInumber\fP
+Surface Pattern Overlap.  5 - 600.  Default: 512.
+.TP 8
+.B \-waves \fInumber\fP
+Surface Pattern Complexity.  1 - 20.  Default: 3.
+.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 2002 by Jamie Zawinski.  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
+Jamie Zawinski.
index 746b7b2415edeef6909a2d8b2454b0d306ebe5f8..6f3f9d46808a2a88098414c50363ded4e86b8ff8 100644 (file)
@@ -17,6 +17,8 @@ extern XtAppContext app;
 #define HACK_INIT      init_ball
 #define HACK_DRAW      draw_ball
 #define HACK_RESHAPE   reshape_ball
+#define HACK_HANDLE_EVENT ball_handle_event
+#define EVENT_MASK      PointerMotionMask
 #define sws_opts       xlockmore_opts
 
 #define DEF_SPIN        "True"
@@ -45,6 +47,8 @@ extern XtAppContext app;
 #include "colors.h"
 #include "sphere.h"
 #include "tube.h"
+#include "rotator.h"
+#include "gltrackball.h"
 #include <ctype.h>
 
 #ifdef USE_GL /* whole file */
@@ -53,11 +57,9 @@ extern XtAppContext app;
 
 typedef struct {
   GLXContext *glx_context;
-
-  GLfloat rotx, roty, rotz;       /* current object rotation */
-  GLfloat dx, dy, dz;             /* current rotational velocity */
-  GLfloat ddx, ddy, ddz;          /* current rotational acceleration */
-  GLfloat d_max;                  /* max velocity */
+  rotator *rot;
+  trackball_state *trackball;
+  Bool button_down_p;
 
   GLuint ball_list;
   GLuint spike_list;
@@ -74,7 +76,7 @@ typedef struct {
 
 static ball_configuration *bps = NULL;
 
-static char *do_spin;
+static Bool do_spin;
 static GLfloat speed;
 static Bool do_wander;
 
@@ -106,90 +108,18 @@ reshape_ball (ModeInfo *mi, int width, int height)
 
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
+  gluPerspective (30.0, 1/h, 1.0, 100.0);
 
-  gluPerspective( 30.0, 1/h, 1.0, 100.0 );
-  gluLookAt( 0.0, 0.0, 15.0,
-             0.0, 0.0, 0.0,
-             0.0, 1.0, 0.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
-  glTranslatef(0.0, 0.0, -15.0);
+  gluLookAt( 0.0, 0.0, 30.0,
+             0.0, 0.0, 0.0,
+             0.0, 1.0, 0.0);
 
   glClear(GL_COLOR_BUFFER_BIT);
 }
 
 
-/* lifted from lament.c */
-#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
-static void
-rotate(GLfloat *pos, GLfloat *v, GLfloat *dv, GLfloat max_v)
-{
-  double ppos = *pos;
-
-  /* tick position */
-  if (ppos < 0)
-    ppos = -(ppos + *v);
-  else
-    ppos += *v;
-
-  if (ppos > 1.0)
-    ppos -= 1.0;
-  else if (ppos < 0)
-    ppos += 1.0;
-
-  if (ppos < 0) abort();
-  if (ppos > 1.0) abort();
-  *pos = (*pos > 0 ? ppos : -ppos);
-
-  /* accelerate */
-  *v += *dv;
-
-  /* clamp velocity */
-  if (*v > max_v || *v < -max_v)
-    {
-      *dv = -*dv;
-    }
-  /* If it stops, start it going in the other direction. */
-  else if (*v < 0)
-    {
-      if (random() % 4)
-       {
-         *v = 0;
-
-         /* keep going in the same direction */
-         if (random() % 2)
-           *dv = 0;
-         else if (*dv < 0)
-           *dv = -*dv;
-       }
-      else
-       {
-         /* reverse gears */
-         *v = -*v;
-         *dv = -*dv;
-         *pos = -*pos;
-       }
-    }
-
-  /* Alter direction of rotational acceleration randomly. */
-  if (! (random() % 120))
-    *dv = -*dv;
-
-  /* Change acceleration very occasionally. */
-  if (! (random() % 200))
-    {
-      if (*dv == 0)
-       *dv = 0.00001;
-      else if (random() & 1)
-       *dv *= 1.2;
-      else
-       *dv *= 0.8;
-    }
-}
-
-
 static void
 randomize_spikes (ModeInfo *mi)
 {
@@ -234,6 +164,8 @@ draw_spikes (ModeInfo *mi)
       glScalef (diam, pos, diam);
       glCallList (bp->spike_list);
       glPopMatrix();
+
+      mi->polygon_count += (SPIKE_FACES + 1);
     }
 }
 
@@ -258,6 +190,39 @@ move_spikes (ModeInfo *mi)
 }
 
 
+Bool
+ball_handle_event (ModeInfo *mi, XEvent *event)
+{
+  ball_configuration *bp = &bps[MI_SCREEN(mi)];
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button & Button1)
+    {
+      bp->button_down_p = True;
+      gltrackball_start (bp->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)
+    {
+      bp->button_down_p = False;
+      return True;
+    }
+  else if (event->xany.type == MotionNotify &&
+           bp->button_down_p)
+    {
+      gltrackball_track (bp->trackball,
+                         event->xmotion.x, event->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+
+  return False;
+}
+
+
 void 
 init_ball (ModeInfo *mi)
 {
@@ -299,20 +264,19 @@ init_ball (ModeInfo *mi)
       glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
     }
 
-  bp->rotx = frand(1.0) * RANDSIGN();
-  bp->roty = frand(1.0) * RANDSIGN();
-  bp->rotz = frand(1.0) * RANDSIGN();
-
-  /* bell curve from 0-6 degrees, avg 3 */
-  bp->dx = (frand(2) + frand(2) + frand(2)) / (360/2);
-  bp->dy = (frand(2) + frand(2) + frand(2)) / (360/2);
-  bp->dz = (frand(2) + frand(2) + frand(2)) / (360/2);
-
-  bp->d_max = bp->dx * 2;
-
-  bp->ddx = 0.00006 + frand(0.00003);
-  bp->ddy = 0.00006 + frand(0.00003);
-  bp->ddz = 0.00006 + frand(0.00003);
+  {
+    double spin_speed   = 10.0;
+    double wander_speed = 0.15;
+    double spin_accel   = 2.0;
+
+    bp->rot = make_rotator (do_spin ? spin_speed : 0,
+                            do_spin ? spin_speed : 0,
+                            do_spin ? spin_speed : 0,
+                            spin_accel,
+                            do_wander ? wander_speed : 0,
+                            True);
+    bp->trackball = gltrackball_init ();
+  }
 
   bp->ncolors = 128;
   bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor));
@@ -347,10 +311,6 @@ draw_ball (ModeInfo *mi)
   Window window = MI_WINDOW(mi);
   int c2;
 
-  /* #### I'm not getting specular reflections on the ball,
-          and I can't figure out why.
-   */
-
   static GLfloat bcolor[4] = {0.0, 0.0, 0.0, 1.0};
   static GLfloat scolor[4] = {0.0, 0.0, 0.0, 1.0};
   static GLfloat bspec[4]  = {1.0, 1.0, 1.0, 1.0};
@@ -374,39 +334,18 @@ draw_ball (ModeInfo *mi)
   glScalef(1.1, 1.1, 1.1);
 
   {
-    GLfloat x, y, z;
-
-    if (do_wander)
-      {
-        static int frame = 0;
-
-#       define SINOID(SCALE,SIZE) \
-        ((((1 + sin((frame * (SCALE)) / 2 * M_PI)) / 2.0) * (SIZE)) - (SIZE)/2)
-
-        x = SINOID(0.051, 8.0);
-        y = SINOID(0.037, 8.0);
-        z = SINOID(0.131, 13.0);
-        frame++;
-        glTranslatef(x, y, z);
-      }
-
-    if (do_spin)
-      {
-        x = bp->rotx;
-        y = bp->roty;
-        z = bp->rotz;
-        if (x < 0) x = 1 - (x + 1);
-        if (y < 0) y = 1 - (y + 1);
-        if (z < 0) z = 1 - (z + 1);
-
-        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);
-
-        rotate(&bp->rotx, &bp->dx, &bp->ddx, bp->d_max);
-        rotate(&bp->roty, &bp->dy, &bp->ddy, bp->d_max);
-        rotate(&bp->rotz, &bp->dz, &bp->ddz, bp->d_max);
-      }
+    double x, y, z;
+    get_position (bp->rot, &x, &y, &z, !bp->button_down_p);
+    glTranslatef((x - 0.5) * 8,
+                 (y - 0.5) * 8,
+                 (z - 0.5) * 15);
+
+    gltrackball_rotate (bp->trackball);
+
+    get_rotation (bp->rot, &x, &y, &z, !bp->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);
   }
 
   bcolor[0] = bp->colors[bp->ccolor].red   / 65536.0;
@@ -421,6 +360,8 @@ draw_ball (ModeInfo *mi)
   bp->ccolor++;
   if (bp->ccolor >= bp->ncolors) bp->ccolor = 0;
 
+  mi->polygon_count = 0;
+
   glScalef (2.0, 2.0, 2.0);
 
   move_spikes (mi);
@@ -429,6 +370,7 @@ draw_ball (ModeInfo *mi)
   glMateriali  (GL_FRONT, GL_SHININESS,           bshiny);
   glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, bcolor);
   glCallList (bp->ball_list);
+  mi->polygon_count += (SPHERE_SLICES * SPHERE_STACKS);
 
   glMaterialfv (GL_FRONT, GL_SPECULAR,            sspec);
   glMaterialf  (GL_FRONT, GL_SHININESS,           sshiny);
diff --git a/hacks/glx/dangerball.man b/hacks/glx/dangerball.man
new file mode 100644 (file)
index 0000000..033811a
--- /dev/null
@@ -0,0 +1,72 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+dangerball - a 3D ball that periodically extrudes spikes. Ouch!
+.SH SYNOPSIS
+.B dangerball
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-count \fInumber\fP]
+[\-no-wander]
+[\-no-spin]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Draws a ball that periodically extrudes many random spikes. Ouch!
+.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
+Spike growth frequency.  0.0 - 0.25.  Default: 0.05.
+.TP 8
+.B \-count \fInumber\fP
+Number o spikes.  Default: 30.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the object should spin.
+.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 2002 by Jamie Zawinski.  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
+Jamie Zawinski.
diff --git a/hacks/glx/engine.man b/hacks/glx/engine.man
new file mode 100644 (file)
index 0000000..e5204b3
--- /dev/null
@@ -0,0 +1,60 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+engine - draws a 3D four-stroke engine.
+.SH SYNOPSIS
+.B engine
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-no-move]
+[\-no-spin]
+[\-fps]
+.SH DESCRIPTION
+Draws a simple four-stroke engine that floats around the screen.
+.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 (0.01 seconds.).
+.TP 8
+.B \-move | \-no-move
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin | \-no-spin
+Whether the object should spin.
+.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 2002 by Ben Buxton.  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
+Ben Buxton.
index 2e6958ccf0effdcb631e39b2b6a1eea4f6a66400..fd9f0f4891b5bcf084c3da5308ff07b6398a0d31 100644 (file)
@@ -38,6 +38,8 @@
 # define HACK_INIT                                             init_screensaver
 # define HACK_DRAW                                             draw_screensaver
 # define HACK_RESHAPE                                  reshape_screensaver
+# define HACK_HANDLE_EVENT                             screensaver_handle_event
+# define EVENT_MASK                                            PointerMotionMask
 # define screensaver_opts                              xlockmore_opts
 #define        DEFAULTS                        "*delay:                        10000   \n" \
                                                                                "*showFPS:              False   \n" \
@@ -80,6 +82,7 @@
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
 #include "xpm-ximage.h"
+#include "rotator.h"
 
 #define checkImageWidth 64
 #define checkImageHeight 64
@@ -175,6 +178,9 @@ ModStruct   screensaver_description =
 typedef struct {
   int screen_width, screen_height;
   GLXContext *glx_context;
+  rotator *rot;
+  Bool button_down_p;
+  int mouse_x, mouse_y;
   Window window;
   XColor fg, bg;
 } screensaverstruct;
@@ -194,17 +200,12 @@ static GLfloat lightTwoPosition[] = {-40.0, 40, 100.0, 0.0};
 static GLfloat lightTwoColor[] = {0.99, 0.99, 0.99, 1.0}; 
 
 float rot_x=0, rot_y=0, rot_z=0;
-static float dx=0, dy=0, dz=0;
-static float ddx=0, ddy=0, ddz=0;
-static float d_max = 0;
-static int screensaver_number;
+float lastx=0, lasty=0;
 
 static float max_lastx=300, max_lasty=400;
 static float min_lastx=-400, min_lasty=-400;
-static float d_lastx=0, d_lasty=0;
-static float dd_lastx=0, dd_lasty=0;
-static float max_dlastx=0, max_dlasty=0;
-float lastx=0, lasty=0;
+
+static int screensaver_number;
 
 struct functions {
   void (*InitStuff)(void);
@@ -326,139 +327,15 @@ void Create_Texture(ModeInfo *mi, const char *filename)
 }
 
 
-/* mostly lifted from lament.c */
-static void
-rotate (float *pos, float *v, float *dv, float max_v)
-{
-  double ppos = *pos;
-
-  /* tick position */
-  if (ppos < 0)
-    ppos = -(ppos + *v);
-  else
-    ppos += *v;
-
-  if (ppos > 360)
-    ppos -= 360;
-  else if (ppos < 0)
-    ppos += 360;
-
-  if (ppos < 0) abort();
-  if (ppos > 360) abort();
-  *pos = (*pos > 0 ? ppos : -ppos);
-
-  /* accelerate */
-  *v += *dv;
-
-  /* clamp velocity */
-  if (*v > max_v || *v < -max_v)
-    {
-      *dv = -*dv;
-    }
-  /* If it stops, start it going in the other direction. */
-  else if (*v < 0)
-    {
-      if (random() % 4)
-        {
-          *v = 0;
-
-          /* keep going in the same direction */
-          if (random() % 2)
-            *dv = 0;
-          else if (*dv < 0)
-            *dv = -*dv;
-        }
-      else
-        {
-          /* reverse gears */
-          *v = -*v;
-          *dv = -*dv;
-          *pos = -*pos;
-        }
-    }
-
-  /* Alter direction of rotational acceleration randomly. */
-  if (! (random() % 120))
-    *dv = -*dv;
-
-  /* Change acceleration very occasionally. */
-  if (! (random() % 200))
-    {
-      if (*dv == 0)
-        *dv = 0.00001;
-      else if (random() & 1)
-        *dv *= 1.2;
-      else
-        *dv *= 0.8;
-    }
-}
-
-
-static void
-bounce (float *pos, float *v, float *dv, float max_v)
-{
-  *pos += *v;
-
-  if (*pos > 1.0)
-    *pos = 1.0, *v = -*v, *dv = -*dv;
-  else if (*pos < 0)
-    *pos = 0, *v = -*v, *dv = -*dv;
-
-  if (*pos < 0.0) abort();
-  if (*pos > 1.0) abort();
-
-  /* accelerate */
-  *v += *dv;
-
-  /* clamp velocity */
-  if (*v > max_v || *v < -max_v)
-    {
-      *dv = -*dv;
-    }
-
-  /* Alter direction of rotational acceleration randomly. */
-  if (! (random() % 120))
-    *dv = -*dv;
-
-  /* Change acceleration very occasionally. */
-  if (! (random() % 200))
-    {
-      if (*dv == 0)
-        *dv = 0.00001;
-      else if (random() & 1)
-        *dv *= 1.2;
-      else
-        *dv *= 0.8;
-    }
-}
-
-
 static void
-init_rotation (void)
+init_rotation (ModeInfo *mi)
 {
-  rot_x = (float) (random() % (360 * 2)) - 360;  /* -360 - 360 */
-  rot_y = (float) (random() % (360 * 2)) - 360;
-  rot_z = (float) (random() % (360 * 2)) - 360;
-
-  /* bell curve from 0-1.5 degrees, avg 0.75 */
-  dx = (frand(1) + frand(1) + frand(1)) / 2.0;
-  dy = (frand(1) + frand(1) + frand(1)) / 2.0;
-  dz = (frand(1) + frand(1) + frand(1)) / 2.0;
-
-  d_max = dx * 2;
-
-  ddx = 0.004;
-  ddy = 0.004;
-  ddz = 0.004;
+  screensaverstruct *gp = &Screensaver[MI_SCREEN(mi)];
+  double spin_speed = 1.0;
+  gp->rot = make_rotator (spin_speed, spin_speed, spin_speed, 1.0, 0.0, True);
 
   lastx = (random() % (int) (max_lastx - min_lastx)) + min_lastx;
   lasty = (random() % (int) (max_lasty - min_lasty)) + min_lasty;
-  d_lastx = (frand(1) + frand(1) + frand(1));
-  d_lasty = (frand(1) + frand(1) + frand(1));
-  max_dlastx = d_lastx * 2;
-  max_dlasty = d_lasty * 2;
-  dd_lastx = 0.004;
-  dd_lasty = 0.004;
 }
 
 
@@ -469,11 +346,6 @@ void draw_screensaver(ModeInfo * mi)
   Display    *display = MI_DISPLAY(mi);
   Window      window = MI_WINDOW(mi);
 
-  Window root, child;
-  int rootx, rooty, winx, winy;
-  unsigned int mask;
-  XEvent event;
-
   if (!gp->glx_context)
        return;
 
@@ -481,44 +353,22 @@ void draw_screensaver(ModeInfo * mi)
 
   funcs_ptr[screensaver_number].DrawStuff();
          
-  rotate(&rot_x, &dx, &ddx, d_max);
-  rotate(&rot_y, &dy, &ddy, d_max);
-  rotate(&rot_z, &dz, &ddz, d_max);
-
-  /* swallow any ButtonPress events */
-  while (XCheckMaskEvent (MI_DISPLAY(mi), ButtonPressMask, &event))
-    ;
-  /* check the pointer position and button state. */
-  XQueryPointer (MI_DISPLAY(mi), MI_WINDOW(mi),
-                 &root, &child, &rootx, &rooty, &winx, &winy, &mask);
-
   /* track the mouse only if a button is down. */
-  if (mask & (Button1Mask|Button2Mask|Button3Mask|Button4Mask|Button5Mask))
+  if (gp->button_down_p)
     {
-      lastx = winx;
-      lasty = winy;
+      lastx = gp->mouse_x;
+      lasty = gp->mouse_y;
     }
   else
     {
       float scale = (max_lastx - min_lastx);
-      lastx -= min_lastx;
-      lasty -= min_lasty;
-      lastx /= scale;
-      lasty /= scale;
-      d_lastx /= scale;
-      d_lasty /= scale;
-      dd_lastx /= scale;
-      dd_lasty /= scale;
-      bounce(&lastx, &d_lastx, &dd_lastx, max_dlastx);
-      bounce(&lasty, &d_lasty, &dd_lasty, max_dlasty);
-      lastx *= scale;
-      lasty *= scale;
-      lastx += min_lastx;
-      lasty += min_lasty;
-      d_lastx *= scale;
-      d_lasty *= scale;
-      dd_lastx *= scale;
-      dd_lasty *= scale;
+      double x, y, z;
+      get_rotation (gp->rot, &x, &y, &z, True);
+      rot_x = x * 360;
+      rot_y = y * 360;
+      rot_z = z * 360;
+      lastx = x * scale + min_lastx;
+      lasty = y * scale + min_lasty;
     }
 
   if (mi->fps_p) do_fps (mi);
@@ -564,7 +414,8 @@ reshape_screensaver(ModeInfo *mi, int width, int height)
 
 
 /* decide which screensaver example to run */
-static void chooseScreensaverExample(void) {
+static void chooseScreensaverExample(ModeInfo *mi)
+{
   int i;
   /* call the extrusion init routine */
 
@@ -587,7 +438,7 @@ static void chooseScreensaverExample(void) {
          fprintf(stderr,"\t%s\n", funcs_ptr[i].name);
        exit(1);
   }
-  init_rotation();
+  init_rotation(mi);
   funcs_ptr[screensaver_number].InitStuff();
 }
 
@@ -605,6 +456,7 @@ initializeGL(ModeInfo *mi, GLsizei width, GLsizei height)
   glClearColor(0,0,0,0);
 /*    glCullFace(GL_BACK); */
 /*    glEnable(GL_CULL_FACE); */
+  glLightModeli (GL_LIGHT_MODEL_TWO_SIDE, TRUE);
   glShadeModel(GL_SMOOTH);
 
   if (do_light)
@@ -634,6 +486,37 @@ initializeGL(ModeInfo *mi, GLsizei width, GLsizei height)
 
 }
 
+Bool
+screensaver_handle_event (ModeInfo *mi, XEvent *event)
+{
+  screensaverstruct *gp = &Screensaver[MI_SCREEN(mi)];
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button & Button1)
+    {
+      gp->button_down_p = True;
+      gp->mouse_x = event->xbutton.x;
+      gp->mouse_y = event->xbutton.y;
+      return True;
+    }
+  else if (event->xany.type == ButtonRelease &&
+           event->xbutton.button & Button1)
+    {
+      gp->button_down_p = False;
+      return True;
+    }
+  else if (event->xany.type == MotionNotify)
+    {
+      gp->mouse_x = event->xmotion.x;
+      gp->mouse_y = event->xmotion.y;
+      return True;
+    }
+
+  return False;
+}
+
+
+
 /* xscreensaver initialization routine */
 void init_screensaver(ModeInfo * mi)
 {
@@ -650,7 +533,7 @@ void init_screensaver(ModeInfo * mi)
   if ((gp->glx_context = init_GL(mi)) != NULL) {
        reshape_screensaver(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
        initializeGL(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
-       chooseScreensaverExample();
+       chooseScreensaverExample(mi);
   } else {
        MI_CLEARWINDOW(mi);
   }
diff --git a/hacks/glx/extrusion.man b/hacks/glx/extrusion.man
new file mode 100644 (file)
index 0000000..f9d69de
--- /dev/null
@@ -0,0 +1,71 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+extrusion - various rotating extruded shapes.
+.SH SYNOPSIS
+.B extrusion
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-name \fIwhich\fP]
+[\-no-light]
+[\-wire]
+[\-fps]
+.SH DESCRIPTION
+Draws various rotating extruded shapes that twist around, lengthen, and
+turn inside out.
+.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 (0.01 seconds.).
+.TP 8
+.B \-name \fIwhich\fP
+Which object to draw.  Choices are: helix2, helix3, helix4, joinoffset,
+screw, taper, and twistoid.
+.TP 8
+.B \-light | \-no-light
+Whether to light the scene, or use flat coloring.
+.TP 8
+.B \-bitmap \fIfile\fP
+The texture map to use.
+.TP 8
+.B \-wire
+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 2002 by Linas Vepstas and David Konerding.  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
+This screensaver was created by David Konerding from the samples that
+come with the GL Extrusion library by Linas Vepstas.
diff --git a/hacks/glx/flipscreen3d.man b/hacks/glx/flipscreen3d.man
new file mode 100644 (file)
index 0000000..16f57e7
--- /dev/null
@@ -0,0 +1,57 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+flipscreen3d - rotates an image of the screen through 3 dimensions.
+.SH SYNOPSIS
+.B flipscreen3d
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-no-rotate]
+[\-fps]
+.SH DESCRIPTION
+Grabs an image of the desktop, turns it into a GL texture map, and spins it
+around and deforms it in various ways.
+.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 \-rotate | \-no-rotate
+Whether to rotate.
+.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 2002 by Ben Buxton.  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
+Ben Buxton.
index 2b91bbfeb40f734e23e1980ee2c1a9546261e4e7..2ba56d40e62e57564e2b3cdd5f88585e8bd56968 100644 (file)
@@ -153,7 +153,7 @@ fps_print_string (ModeInfo *mi, GLfloat x, GLfloat y, const char *string)
             L2++;
             glCallLists (strlen(L2), GL_UNSIGNED_BYTE, L2);
             glRasterPos2f (x, y + (fps_ascent + fps_descent));
-            glCallLists (L2 - string, GL_UNSIGNED_BYTE, string);
+            glCallLists (L2 - string - 1, GL_UNSIGNED_BYTE, string);
           }
         else
           {
@@ -249,13 +249,13 @@ do_fps (ModeInfo *mi)
 
           strcat (msg, "\nPolys: ");
           if (p >= 1000000)
-            sprintf (msg + strlen(msg), "%d,%03d,%03d%s",
+            sprintf (msg + strlen(msg), "%lu,%03lu,%03lu%s",
                      (p / 1000000), ((p / 1000) % 1000), (p % 1000), s);
           else if (p >= 1000)
-            sprintf (msg + strlen(msg), "%d,%03d%s",
+            sprintf (msg + strlen(msg), "%lu,%03lu%s",
                      (p / 1000), (p % 1000), s);
           else
-            sprintf (msg + strlen(msg), "%d%s", p, s);
+            sprintf (msg + strlen(msg), "%lu%s", p, s);
         }
     }
 
index 954acd1752b690e367a238638dd24636182627a2..52bdab820adf0e387b4674bacbc9487f0e9c59b3 100644 (file)
@@ -47,6 +47,8 @@ static const char sccsid[] = "@(#)gears.c     4.07 97/11/24 xlockmore";
 # define HACK_INIT                                     init_gears
 # define HACK_DRAW                                     draw_gears
 # define HACK_RESHAPE                          reshape_gears
+# define HACK_HANDLE_EVENT                     gears_handle_event
+# define EVENT_MASK                                    PointerMotionMask
 # define gears_opts                                    xlockmore_opts
 # define DEFAULTS      "*count:                1       \n"                     \
                                        "*cycles:               2       \n"                     \
@@ -61,6 +63,9 @@ static const char sccsid[] = "@(#)gears.c     4.07 97/11/24 xlockmore";
 
 #ifdef USE_GL
 
+#include "rotator.h"
+#include "gltrackball.h"
+
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
@@ -98,18 +103,15 @@ ModStruct   gears_description =
 
 
 typedef struct {
-
-  GLfloat rotx, roty, rotz;       /* current object rotation */
-  GLfloat dx, dy, dz;             /* current rotational velocity */
-  GLfloat ddx, ddy, ddz;          /* current rotational acceleration */
-  GLfloat d_max;                          /* max velocity */
-
   GLuint      gear1, gear2, gear3;
   GLuint      gear_inner, gear_outer;
   GLuint      armature;
   GLfloat     angle;
   GLXContext *glx_context;
   Window      window;
+  rotator    *rot;
+  trackball_state *trackball;
+  Bool           button_down_p;
 } gearsstruct;
 
 static gearsstruct *gears = NULL;
@@ -540,16 +542,14 @@ draw(ModeInfo * mi)
 
        glPushMatrix();
 
+    gltrackball_rotate (gp->trackball);
+
     {
-      GLfloat x = gp->rotx;
-      GLfloat y = gp->roty;
-      GLfloat z = gp->rotz;
-      if (x < 0) x = 1 - (x + 1);
-      if (y < 0) y = 1 - (y + 1);
-      if (z < 0) z = 1 - (z + 1);
-      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);
+      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) {
@@ -921,74 +921,36 @@ pinit(ModeInfo * mi)
 }
 
 
-/* lifted from lament.c */
-#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
-static void
-rotate(GLfloat *pos, GLfloat *v, GLfloat *dv, GLfloat max_v)
+Bool
+gears_handle_event (ModeInfo *mi, XEvent *event)
 {
-  double ppos = *pos;
-
-  /* tick position */
-  if (ppos < 0)
-    ppos = -(ppos + *v);
-  else
-    ppos += *v;
-
-  if (ppos > 1.0)
-    ppos -= 1.0;
-  else if (ppos < 0)
-    ppos += 1.0;
-
-  if (ppos < 0) abort();
-  if (ppos > 1.0) abort();
-  *pos = (*pos > 0 ? ppos : -ppos);
+  gearsstruct *gp = &gears[MI_SCREEN(mi)];
 
-  /* accelerate */
-  *v += *dv;
-
-  /* clamp velocity */
-  if (*v > max_v || *v < -max_v)
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button & Button1)
     {
-      *dv = -*dv;
+      gp->button_down_p = True;
+      gltrackball_start (gp->trackball,
+                         event->xbutton.x, event->xbutton.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
     }
-  /* If it stops, start it going in the other direction. */
-  else if (*v < 0)
+  else if (event->xany.type == ButtonRelease &&
+           event->xbutton.button & Button1)
     {
-      if (random() % 4)
-       {
-         *v = 0;
-
-         /* keep going in the same direction */
-         if (random() % 2)
-           *dv = 0;
-         else if (*dv < 0)
-           *dv = -*dv;
-       }
-      else
-       {
-         /* reverse gears */
-         *v = -*v;
-         *dv = -*dv;
-         *pos = -*pos;
-       }
+      gp->button_down_p = False;
+      return True;
     }
-
-  /* Alter direction of rotational acceleration randomly. */
-  if (! (random() % 120))
-    *dv = -*dv;
-
-  /* Change acceleration very occasionally. */
-  if (! (random() % 200))
+  else if (event->xany.type == MotionNotify &&
+           gp->button_down_p)
     {
-      if (*dv == 0)
-       *dv = 0.00001;
-      else if (random() & 1)
-       *dv *= 1.2;
-      else
-       *dv *= 0.8;
+      gltrackball_track (gp->trackball,
+                         event->xmotion.x, event->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
     }
+
+  return False;
 }
 
 
@@ -1010,20 +972,8 @@ init_gears(ModeInfo * mi)
 
        gp->window = MI_WINDOW(mi);
 
-    gp->rotx = frand(1.0) * RANDSIGN();
-    gp->roty = frand(1.0) * RANDSIGN();
-    gp->rotz = frand(1.0) * RANDSIGN();
-
-    /* bell curve from 0-1.5 degrees, avg 0.75 */
-    gp->dx = (frand(1) + frand(1) + frand(1)) / (360*2);
-    gp->dy = (frand(1) + frand(1) + frand(1)) / (360*2);
-    gp->dz = (frand(1) + frand(1) + frand(1)) / (360*2);
-
-    gp->d_max = gp->dx * 2;
-
-    gp->ddx = 0.00006 + frand(0.00003);
-    gp->ddy = 0.00006 + frand(0.00003);
-    gp->ddz = 0.00006 + frand(0.00003);
+    gp->rot = make_rotator (1, 1, 1, 1, 0, True);
+    gp->trackball = gltrackball_init ();
 
        if ((gp->glx_context = init_GL(mi)) != NULL) {
                reshape_gears(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
@@ -1055,10 +1005,6 @@ draw_gears(ModeInfo * mi)
        /* let's do something so we don't get bored */
        gp->angle = (int) (gp->angle + angle_incr) % 360;
 
-    rotate(&gp->rotx, &gp->dx, &gp->ddx, gp->d_max);
-    rotate(&gp->roty, &gp->dy, &gp->ddy, gp->d_max);
-    rotate(&gp->rotz, &gp->dz, &gp->ddz, gp->d_max);
-
     if (mi->fps_p) do_fps (mi);
        glFinish();
        glXSwapBuffers(display, window);
diff --git a/hacks/glx/gears.man b/hacks/glx/gears.man
new file mode 100644 (file)
index 0000000..999cf11
--- /dev/null
@@ -0,0 +1,65 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+gears - draw interlocking gears, for xscreensaver.
+.SH SYNOPSIS
+.B gears
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[-delay \fInumber\fP]
+[-cycles \fInumber\fP]
+[-planetary]
+[-wireframe]
+[-fps]
+.SH DESCRIPTION
+This draws sets of turning, interlocking gears, rotating in three
+dimensions.
+.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 \-cycles \fInumber\fP
+Rotational Speed.  1 - 30.  Default: 2.
+.TP 8
+.B \-planetary
+Draw a planetary gear system, instead of three simple gears.
+.TP 8
+.B \-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 2002 by Jamie Zawinski.  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
+By Danny Sung, Brian Paul, Ed Mackey, and Jamie Zawinski.
index 172f4061925ab86aa9c9b52e63d67502e0c9e1cd..56b7a02624f64c41cd5880020ac04dff6b650654 100644 (file)
@@ -35,6 +35,7 @@
  * 21 July 2000 : cleaned up code from bug hunts, manpage written
  * 24 November 2000 : fixed x co-ord calculation in solid - textured
  * 05 March 2001 : put back non pnmlib code with #ifdefs
+ * 11 May 2002 : fixed image problems with large images
  */
 
 
@@ -576,18 +577,21 @@ grabTexture(void)
   int real_height = gflux->modeinfo->xgwa.height;
   XImage *ximage = screen_to_ximage (gflux->modeinfo->xgwa.screen,
                                      gflux->window);
+  Bool bigimage = False;
+  int size = 0;
 
   if (ximage->width > 1280 ||   /* that's too damned big... */
       ximage->height > 1280)
     {
       Display *dpy = gflux->modeinfo->dpy;
       Visual *v = gflux->modeinfo->xgwa.visual;
-      int size = (ximage->width < ximage->height ?
-                  ximage->width : ximage->height);
       int real_size = (ximage->width < ximage->height ?
                        real_width : real_height);
       XImage *x2;
       int x, y, xoff, yoff;
+      size = (ximage->width < ximage->height ?
+              ximage->width : ximage->height);
+      bigimage = True;
 
       if (size > 1024) size = 1024;
 
@@ -614,16 +618,18 @@ grabTexture(void)
   /* Add a border. */
   {
     unsigned long gray = 0xAAAAAAAAL;  /* so shoot me */
+    int width  = (bigimage ? size : real_width);
+    int height = (bigimage ? size : real_height);
     int i;
     for (i = 0; i < real_height; i++)
       {
         XPutPixel (ximage, 0, i, gray);
-        XPutPixel (ximage, real_width-1, i, gray);
+        XPutPixel (ximage, width-1, i, gray);
       }
     for (i = 0; i < real_width; i++)
       {
         XPutPixel (ximage, i, 0, gray);
-        XPutPixel (ximage, i, real_height-1, gray);
+        XPutPixel (ximage, i, height-1, gray);
       }
   }
 
@@ -631,8 +637,16 @@ grabTexture(void)
   gflux->imageHeight = ximage->height;
   gflux->image = ximage->data;
 
-  gflux->tex_xscale = ((GLfloat) real_width  / (GLfloat) ximage->width);
-  gflux->tex_yscale = ((GLfloat) real_height / (GLfloat) ximage->height);
+  if (bigimage)  /* don't scale really large images */
+    {
+      gflux->tex_xscale = 1;
+      gflux->tex_yscale = 1;
+    }
+  else
+    {
+      gflux->tex_xscale = ((GLfloat) real_width  / (GLfloat) ximage->width);
+      gflux->tex_yscale = ((GLfloat) real_height / (GLfloat) ximage->height);
+    }
 
   ximage->data = 0;
   XDestroyImage (ximage);
index 20632b9a56b0b792aba4f530c4213512d49029f4..5352a5db53d5dde5148037c0a3239080f2339579 100644 (file)
@@ -47,6 +47,8 @@
 # define HACK_INIT                                             init_planet
 # define HACK_DRAW                                             draw_planet
 # define HACK_RESHAPE                                  reshape_planet
+# define HACK_HANDLE_EVENT                             planet_handle_event
+# define EVENT_MASK                                            PointerMotionMask
 # define planet_opts                                   xlockmore_opts
 #define DEFAULTS       "*delay:                        15000   \n"     \
                                        "*showFPS:                      False   \n" \
@@ -87,6 +89,7 @@
 #define DEF_TEXTURE "True"
 #define DEF_STARS   "True"
 #define DEF_LIGHT   "True"
+#define DEF_RESOLUTION "64"
 #define DEF_IMAGE   "BUILTIN"
 
 #undef countof
@@ -99,6 +102,8 @@ static int do_texture;
 static int do_stars;
 static int do_light;
 static char *which_image;
+static int resolution;
+
 static XrmOptionDescRec opts[] = {
   {"-rotate",  ".glplanet.rotate",  XrmoptionNoArg, (caddr_t) "true" },
   {"+rotate",  ".glplanet.rotate",  XrmoptionNoArg, (caddr_t) "false" },
@@ -113,6 +118,7 @@ static XrmOptionDescRec opts[] = {
   {"-light",   ".glplanet.light",   XrmoptionNoArg, (caddr_t) "true" },
   {"+light",   ".glplanet.light",   XrmoptionNoArg, (caddr_t) "false" },
   {"-image",   ".glplanet.image",  XrmoptionSepArg, (caddr_t) 0 },
+  {"-resolution", ".glplanet.resolution", XrmoptionSepArg, (caddr_t) 0 },
 };
 
 static argtype vars[] = {
@@ -123,6 +129,7 @@ static argtype vars[] = {
   {(caddr_t *) &do_stars,  "stars", "Stars", DEF_STARS, t_Bool},
   {(caddr_t *) &do_light,    "light",   "Light",   DEF_LIGHT,   t_Bool},
   {(caddr_t *) &which_image, "image",   "Image",   DEF_IMAGE,   t_String},
+  {(caddr_t *) &resolution,  "resolution","Resolution", DEF_RESOLUTION, t_Int},
 };
 
 ModeSpecOpt planet_opts = {countof(opts), opts, countof(vars), vars, NULL};
@@ -137,6 +144,8 @@ ModStruct   planet_description =
 
 #include "../images/earth.xpm"
 #include "xpm-ximage.h"
+#include "rotator.h"
+#include "gltrackball.h"
 
 
 /*-
@@ -146,8 +155,6 @@ ModStruct   planet_description =
  */
 
 #define NUM_STARS 1000
-#define SLICES 32
-#define STACKS 32
 
 /* radius of the sphere- fairly arbitrary */
 #define RADIUS 4
@@ -164,17 +171,12 @@ typedef struct {
   int screen_width, screen_height;
   GLXContext *glx_context;
   Window window;
-
   XColor fg, bg;
-
-  GLfloat tx, ty, tz;
-  GLfloat dtx, dty, dtz;
-  GLfloat xpos, ypos, zpos;
-  GLfloat dx, dy, dz;
-  GLfloat box_width, box_height, box_depth;
-
   GLfloat sunpos[4];
-
+  double z;
+  rotator *rot;
+  trackball_state *trackball;
+  Bool button_down_p;
 } planetstruct;
 
 
@@ -206,11 +208,13 @@ setup_xpm_texture (ModeInfo *mi, char **xpm_data)
 {
   XImage *image = xpm_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi),
                                   MI_COLORMAP (mi), xpm_data);
+  char buf[1024];
   clear_gl_error();
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
                image->width, image->height, 0,
                GL_RGBA, GL_UNSIGNED_BYTE, image->data);
-  check_gl_error("texture");
+  sprintf (buf, "builtin texture (%dx%d)", image->width, image->height);
+  check_gl_error(buf);
 
   /* setup parameters for texturing */
   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
@@ -227,6 +231,7 @@ setup_file_texture (ModeInfo *mi, char *filename)
 {
   Display *dpy = mi->dpy;
   Visual *visual = mi->xgwa.visual;
+  char buf[1024];
 
   Colormap cmap = mi->xgwa.colormap;
   XImage *image = xpm_file_to_ximage (dpy, visual, cmap, filename);
@@ -235,7 +240,9 @@ setup_file_texture (ModeInfo *mi, char *filename)
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
                image->width, image->height, 0,
                GL_RGBA, GL_UNSIGNED_BYTE, image->data);
-  check_gl_error("texture");
+  sprintf (buf, "texture: %.100s (%dx%d)",
+           filename, image->width, image->height);
+  check_gl_error(buf);
 
   /* setup parameters for texturing */
   glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
@@ -264,6 +271,11 @@ setup_texture(ModeInfo * mi)
        setup_file_texture (mi, which_image);
 
   check_gl_error("texture initialization");
+
+  /* Need to flip the texture top for bottom for some reason. */
+  glMatrixMode (GL_TEXTURE);
+  glScalef (1, -1, 1);
+  glMatrixMode (GL_MODELVIEW);
 }
 
 
@@ -380,7 +392,7 @@ init_sun (ModeInfo * mi)
 {
   planetstruct *gp = &planets[MI_SCREEN(mi)];
 
-  GLfloat lamb[4] = { 0.0, 0.0, 0.0, 1.0 };
+  GLfloat lamb[4] = { 0.1, 0.1, 0.1, 1.0 };
   GLfloat ldif[4] = { 1.0, 1.0, 1.0, 1.0 };
   GLfloat spec[4] = { 1.0, 1.0, 1.0, 1.0 };
 
@@ -389,10 +401,18 @@ init_sun (ModeInfo * mi)
   GLfloat mpec[4] = { 1.0, 1.0, 1.0, 1.0 };
   GLfloat shiny = .4;
 
-  gp->sunpos[0] =  1.00 - frand(2.00);
-  gp->sunpos[1] =  0.25 - frand(0.50);
-  gp->sunpos[2] = -1.00;
-  gp->sunpos[3] =  0.00;
+  {
+    double h =  0.1 + frand(0.8);   /* east-west position - screen-side. */
+    double v = -0.3 + frand(0.6);   /* north-south position */
+
+    if (h > 0.3 && h < 0.8)         /* avoid having the sun at the camera */
+      h += (h > 0.5 ? 0.2 : -0.2);
+
+    gp->sunpos[0] = cos(h * M_PI);
+    gp->sunpos[1] = sin(h * M_PI);
+    gp->sunpos[2] = sin(v * M_PI);
+    gp->sunpos[3] =  0.00;
+  }
 
   glEnable(GL_LIGHTING);
   glEnable(GL_LIGHT0);
@@ -421,6 +441,7 @@ init_sun (ModeInfo * mi)
 static void
 pick_velocity (ModeInfo * mi)
 {
+#if 0
   planetstruct *gp = &planets[MI_SCREEN(mi)];
 
   gp->box_width =  15.0;
@@ -438,42 +459,7 @@ pick_velocity (ModeInfo * mi)
   gp->dx = (frand(0.2) + frand(0.2)) * RANDSIGN();
   gp->dy = (frand(0.2) + frand(0.2)) * RANDSIGN();
   gp->dz = (frand(0.2) + frand(0.2)) * RANDSIGN();
-}
-
-
-static void
-rotate_and_move (ModeInfo * mi)
-{
-  planetstruct *gp = &planets[MI_SCREEN(mi)];
-
-  if (do_roll)
-       {
-         gp->tx += gp->dtx;
-         while (gp->tx < 0)   gp->tx += 360;
-         while (gp->tx > 360) gp->tx -= 360;
-
-         gp->ty += gp->dty;
-         while (gp->ty < 0)   gp->ty += 360;
-         while (gp->ty > 360) gp->ty -= 360;
-       }
-
-  if (do_rotate)
-       {
-         gp->tz += gp->dtz;
-         while (gp->tz < 0)   gp->tz += 360;
-         while (gp->tz > 360) gp->tz -= 360;
-       }
-
-  if (do_wander)
-       {
-      static int frame = 0;
-#     define SINOID(SCALE,SIZE) \
-        ((((1 + sin((frame * (SCALE)) / 2 * M_PI)) / 2.0) * (SIZE)) - (SIZE)/2)
-      gp->xpos = SINOID(0.031, gp->box_width);
-      gp->ypos = SINOID(0.023, gp->box_height);
-      gp->zpos = SINOID(0.017, gp->box_depth);
-      frame++;
-       }
+#endif
 }
 
 
@@ -494,6 +480,39 @@ reshape_planet (ModeInfo *mi, int width, int height)
 }
 
 
+Bool
+planet_handle_event (ModeInfo *mi, XEvent *event)
+{
+  planetstruct *gp = &planets[MI_SCREEN(mi)];
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button & Button1)
+    {
+      gp->button_down_p = True;
+      gltrackball_start (gp->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)
+    {
+      gp->button_down_p = False;
+      return True;
+    }
+  else if (event->xany.type == MotionNotify &&
+           gp->button_down_p)
+    {
+      gltrackball_track (gp->trackball,
+                         event->xmotion.x, event->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+
+  return False;
+}
+
+
 void
 init_planet (ModeInfo * mi)
 {
@@ -543,6 +562,18 @@ init_planet (ModeInfo * mi)
        free (b);
   }
 
+  {
+    double spin_speed   = 1.0;
+    double wander_speed = 0.05;
+    gp->rot = make_rotator (do_roll ? spin_speed : 0,
+                            do_roll ? spin_speed : 0,
+                            0, 1,
+                            do_wander ? wander_speed : 0,
+                            True);
+    gp->z = frand (1.0);
+    gp->trackball = gltrackball_init ();
+  }
+
   if (wire)
     {
       do_texture = False;
@@ -568,7 +599,18 @@ init_planet (ModeInfo * mi)
   glColor3f (1,1,1);
   glPushMatrix ();
   glScalef (RADIUS, RADIUS, RADIUS);
-  unit_sphere (STACKS, SLICES, wire);
+  glRotatef (90, 1, 0, 0);
+  unit_sphere (resolution, resolution, wire);
+  mi->polygon_count += resolution*resolution;
+#if 0
+  if (!wire)
+    {
+      glDisable(GL_LIGHTING);
+      glScalef(1.01,1.01,1.01);
+      unit_sphere (12, 24, 1);
+      glEnable(GL_LIGHTING);
+    }
+#endif
   glPopMatrix ();
   glEndList();
 }
@@ -579,6 +621,7 @@ draw_planet (ModeInfo * mi)
   planetstruct *gp = &planets[MI_SCREEN(mi)];
   Display    *display = MI_DISPLAY(mi);
   Window      window = MI_WINDOW(mi);
+  double x, y, z;
 
   if (!gp->glx_context)
        return;
@@ -592,23 +635,38 @@ draw_planet (ModeInfo * mi)
     draw_stars (mi);
 
   glPushMatrix();
+
+  get_position (gp->rot, &x, &y, &z, !gp->button_down_p);
+  glTranslatef((x - 0.5) * 15,
+               (y - 0.5) * 15,
+               (z - 0.5) * 8);
+
+  gltrackball_rotate (gp->trackball);
+
   glRotatef (90,1,0,0);
-  glTranslatef (gp->xpos, gp->ypos, gp->zpos);
 
-  glRotatef (gp->tx, 1, 0, 0);
-  glRotatef (gp->ty, 0, 1, 0);
-  glRotatef (gp->tz, 0, 0, 1);
+  if (do_roll)
+    {
+      get_rotation (gp->rot, &x, &y, 0, !gp->button_down_p);
+      glRotatef (x * 360, 1.0, 0.0, 0.0);
+      glRotatef (y * 360, 0.0, 1.0, 0.0);
+    }
 
   glLightfv (GL_LIGHT0, GL_POSITION, gp->sunpos);
 
+  glRotatef (gp->z * 360, 0.0, 0.0, 1.0);
+  if (do_rotate && !gp->button_down_p)
+    {
+      gp->z += 0.01;
+      if (gp->z > 1) gp->z -= 1;
+    }
+
   glCallList (gp->platelist);
   glPopMatrix();
 
   if (mi->fps_p) do_fps (mi);
   glFinish();
   glXSwapBuffers(display, window);
-
-  rotate_and_move (mi);
 }
 
 
diff --git a/hacks/glx/glplanet.man b/hacks/glx/glplanet.man
new file mode 100644 (file)
index 0000000..096c7e6
--- /dev/null
@@ -0,0 +1,66 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+glplanet - rotating 3d texture-mapped planet.
+.SH SYNOPSIS
+.B glplanet
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-no-light]
+[\-delay \fInumber\fP]
+[\-bitmap \fIfile\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Draws a planet bouncing around in space.  The built-in image is a map
+of the earth, but you can wrap any texture around the sphere, e.g., the
+planetary textures that come with `ssystem'.
+.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 \-light | \-no-light
+Use Flat Coloring.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 15000 (0.01 seconds.).
+.TP 8
+.B \-bitmap \fIfile\fP
+The texture map to wrap around the planet's surface.
+.TP 8
+.B \-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 2002 by David Konerding.  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 Konerding. 
index 4cc6005a14b39d1c6a10d5db07b104e1783118c1..2ccae16165466b1b4a2916546db3772dc0b01b21 100644 (file)
@@ -1,4 +1,4 @@
-/* gltext, Copyright (c) 2001 Jamie Zawinski <jwz@jwz.org>
+/* gltext, Copyright (c) 2001, 2002 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
@@ -17,6 +17,8 @@ extern XtAppContext app;
 #define HACK_INIT      init_text
 #define HACK_DRAW      draw_text
 #define HACK_RESHAPE   reshape_text
+#define HACK_HANDLE_EVENT text_handle_event
+#define EVENT_MASK     PointerMotionMask
 #define sws_opts       xlockmore_opts
 
 #define DEF_TEXT        "(default)"
@@ -46,6 +48,10 @@ extern XtAppContext app;
 #include "xlockmore.h"
 #include "colors.h"
 #include "tube.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include <time.h>
+#include <sys/time.h>
 #include <ctype.h>
 
 #ifdef USE_GL /* whole file */
@@ -63,11 +69,9 @@ extern XtAppContext app;
 
 typedef struct {
   GLXContext *glx_context;
-
-  GLfloat rotx, roty, rotz;       /* current object rotation */
-  GLfloat dx, dy, dz;             /* current rotational velocity */
-  GLfloat ddx, ddy, ddz;          /* current rotational acceleration */
-  GLfloat d_max;                  /* max velocity */
+  rotator *rot;
+  trackball_state *trackball;
+  Bool button_down_p;
 
   GLuint text_list;
 
@@ -75,7 +79,6 @@ typedef struct {
   XColor *colors;
   int ccolor;
 
-  Bool spin_x, spin_y, spin_z;
   char *text;
 
 } text_configuration;
@@ -114,14 +117,13 @@ reshape_text (ModeInfo *mi, int width, int height)
 
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
+  gluPerspective (30.0, 1/h, 1.0, 100.0);
 
-  gluPerspective( 30.0, 1/h, 1.0, 100.0 );
-  gluLookAt( 0.0, 0.0, 15.0,
-             0.0, 0.0, 0.0,
-             0.0, 1.0, 0.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
-  glTranslatef(0.0, 0.0, -15.0);
+  gluLookAt( 0.0, 0.0, 30.0,
+             0.0, 0.0, 0.0,
+             0.0, 1.0, 0.0);
 
   glClear(GL_COLOR_BUFFER_BIT);
 }
@@ -150,77 +152,6 @@ gl_init (ModeInfo *mi)
 }
 
 
-/* lifted from lament.c */
-#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
-static void
-rotate(GLfloat *pos, GLfloat *v, GLfloat *dv, GLfloat max_v)
-{
-  double ppos = *pos;
-
-  /* tick position */
-  if (ppos < 0)
-    ppos = -(ppos + *v);
-  else
-    ppos += *v;
-
-  if (ppos > 1.0)
-    ppos -= 1.0;
-  else if (ppos < 0)
-    ppos += 1.0;
-
-  if (ppos < 0) abort();
-  if (ppos > 1.0) abort();
-  *pos = (*pos > 0 ? ppos : -ppos);
-
-  /* accelerate */
-  *v += *dv;
-
-  /* clamp velocity */
-  if (*v > max_v || *v < -max_v)
-    {
-      *dv = -*dv;
-    }
-  /* If it stops, start it going in the other direction. */
-  else if (*v < 0)
-    {
-      if (random() % 4)
-       {
-         *v = 0;
-
-         /* keep going in the same direction */
-         if (random() % 2)
-           *dv = 0;
-         else if (*dv < 0)
-           *dv = -*dv;
-       }
-      else
-       {
-         /* reverse gears */
-         *v = -*v;
-         *dv = -*dv;
-         *pos = -*pos;
-       }
-    }
-
-  /* Alter direction of rotational acceleration randomly. */
-  if (! (random() % 120))
-    *dv = -*dv;
-
-  /* Change acceleration very occasionally. */
-  if (! (random() % 200))
-    {
-      if (*dv == 0)
-       *dv = 0.00001;
-      else if (random() & 1)
-       *dv *= 1.2;
-      else
-       *dv *= 0.8;
-    }
-}
-
-
 static void
 parse_text (ModeInfo *mi)
 {
@@ -280,10 +211,44 @@ parse_text (ModeInfo *mi)
 }
 
 
+Bool
+text_handle_event (ModeInfo *mi, XEvent *event)
+{
+  text_configuration *tp = &tps[MI_SCREEN(mi)];
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button & Button1)
+    {
+      tp->button_down_p = True;
+      gltrackball_start (tp->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)
+    {
+      tp->button_down_p = False;
+      return True;
+    }
+  else if (event->xany.type == MotionNotify &&
+           tp->button_down_p)
+    {
+      gltrackball_track (tp->trackball,
+                         event->xmotion.x, event->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+
+  return False;
+}
+
+
 void 
 init_text (ModeInfo *mi)
 {
   text_configuration *tp;
+  int i;
 
   if (!tps) {
     tps = (text_configuration *)
@@ -303,21 +268,19 @@ init_text (ModeInfo *mi)
     reshape_text (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
   }
 
-  tp->rotx = frand(1.0) * RANDSIGN();
-  tp->roty = frand(1.0) * RANDSIGN();
-  tp->rotz = frand(1.0) * RANDSIGN();
-
-  /* bell curve from 0-6 degrees, avg 3 */
-  tp->dx = (frand(1) + frand(1) + frand(1)) / (360/2);
-  tp->dy = (frand(1) + frand(1) + frand(1)) / (360/2);
-  tp->dz = (frand(1) + frand(1) + frand(1)) / (360/2);
-
-  tp->d_max = tp->dx * 2;
-
-  tp->ddx = 0.00006 + frand(0.00003);
-  tp->ddy = 0.00006 + frand(0.00003);
-  tp->ddz = 0.00006 + frand(0.00003);
-
+  {
+    double spin_speed   = 1.0;
+    double wander_speed = 0.05;
+    double spin_accel   = 1.0;
+
+    tp->rot = make_rotator (do_spin ? spin_speed : 0,
+                            do_spin ? spin_speed : 0,
+                            do_spin ? spin_speed : 0,
+                            spin_accel,
+                            do_wander ? wander_speed : 0,
+                            True);
+    tp->trackball = gltrackball_init ();
+  }
 
   tp->ncolors = 255;
   tp->colors = (XColor *) calloc(tp->ncolors, sizeof(XColor));
@@ -325,25 +288,15 @@ init_text (ModeInfo *mi)
                         tp->colors, &tp->ncolors,
                         False, 0, False);
 
-  parse_text (mi);
+  /* brighter colors, please... */
+  for (i = 0; i < tp->ncolors; i++)
+    {
+      tp->colors[i].red   = (tp->colors[i].red   / 2) + 32767;
+      tp->colors[i].green = (tp->colors[i].green / 2) + 32767;
+      tp->colors[i].blue  = (tp->colors[i].blue  / 2) + 32767;
+    }
 
-  {
-    char *s = do_spin;
-    while (*s)
-      {
-        if      (*s == 'x' || *s == 'X') tp->spin_x = 1;
-        else if (*s == 'y' || *s == 'Y') tp->spin_y = 1;
-        else if (*s == 'z' || *s == 'Z') tp->spin_z = 1;
-        else
-          {
-            fprintf (stderr,
-         "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
-                     progname, do_spin);
-            exit (1);
-          }
-        s++;
-      }
-  }
+  parse_text (mi);
 
 }
 
@@ -518,41 +471,21 @@ draw_text (ModeInfo *mi)
   glScalef(1.1, 1.1, 1.1);
 
   {
-    GLfloat x, y, z;
-
-    if (do_wander)
-      {
-        static int frame = 0;
-
-#       define SINOID(SCALE,SIZE) \
-        ((((1 + sin((frame * (SCALE)) / 2 * M_PI)) / 2.0) * (SIZE)) - (SIZE)/2)
-
-        x = SINOID(0.031, 9.0);
-        y = SINOID(0.023, 9.0);
-        z = SINOID(0.017, 9.0);
-        frame++;
-        glTranslatef(x, y, z);
-      }
-
-    if (tp->spin_x || tp->spin_y || tp->spin_z)
-      {
-        x = tp->rotx;
-        y = tp->roty;
-        z = tp->rotz;
-        if (x < 0) x = 1 - (x + 1);
-        if (y < 0) y = 1 - (y + 1);
-        if (z < 0) z = 1 - (z + 1);
-
-        if (tp->spin_x) glRotatef(x * 360, 1.0, 0.0, 0.0);
-        if (tp->spin_y) glRotatef(y * 360, 0.0, 1.0, 0.0);
-        if (tp->spin_z) glRotatef(z * 360, 0.0, 0.0, 1.0);
-
-        rotate(&tp->rotx, &tp->dx, &tp->ddx, tp->d_max);
-        rotate(&tp->roty, &tp->dy, &tp->ddy, tp->d_max);
-        rotate(&tp->rotz, &tp->dz, &tp->ddz, tp->d_max);
-      }
+    double x, y, z;
+    get_position (tp->rot, &x, &y, &z, !tp->button_down_p);
+    glTranslatef((x - 0.5) * 8,
+                 (y - 0.5) * 8,
+                 (z - 0.5) * 8);
+
+    gltrackball_rotate (tp->trackball);
+
+    get_rotation (tp->rot, &x, &y, &z, !tp->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);
   }
 
+
   glColor4fv (white);
 
   color[0] = tp->colors[tp->ccolor].red   / 65536.0;
diff --git a/hacks/glx/gltrackball.c b/hacks/glx/gltrackball.c
new file mode 100644 (file)
index 0000000..c7ddc8b
--- /dev/null
@@ -0,0 +1,75 @@
+/* gltrackball, Copyright (c) 2002 Jamie Zawinski <jwz@jwz.org>
+ * GL-flavored wrapper for trackball.c
+ *
+ * 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 "config.h"
+#include <stdlib.h>
+#include <math.h>
+#include <GL/gl.h>
+#include "trackball.h"
+#include "gltrackball.h"
+
+struct trackball_state {
+  int x, y;
+  GLfloat q[4];
+};
+
+/* Returns a trackball_state object, which encapsulates the stuff necessary
+   to make dragging the mouse on the window of a GL program do the right thing.
+ */
+trackball_state *
+gltrackball_init (void)
+{
+  trackball_state *ts = (trackball_state *) calloc (1, sizeof (*ts));
+  if (!ts) return 0;
+  trackball (ts->q, 0, 0, 0, 0);
+  return ts;
+}
+
+/* Begin tracking the mouse: Call this when the mouse button goes down.
+   x and y are the mouse position relative to the window.
+   w and h are the size of the window.
+ */
+void
+gltrackball_start (trackball_state *ts, int x, int y, int w, int h)
+{
+  ts->x = x;
+  ts->y = y;
+}
+
+/* Track the mouse: Call this each time the mouse moves with the button down.
+   x and y are the new mouse position relative to the window.
+   w and h are the size of the window.
+ */
+void
+gltrackball_track (trackball_state *ts, int x, int y, int w, int h)
+{
+  float q2[4];
+  trackball (q2,
+             (2.0 * ts->x - w) / w,
+             (h - 2.0 * ts->y) / h,
+             (2.0 * x - w) / w,
+             (h - 2.0 * y) / h);
+  ts->x = x;
+  ts->y = y;
+  add_quats (q2, ts->q, ts->q);
+}
+
+/* Execute the rotations current encapsulated in the trackball_state:
+   this does something analagous to glRotatef().
+ */
+void
+gltrackball_rotate (trackball_state *ts)
+{
+  GLfloat m[4][4];
+  build_rotmatrix (m, ts->q);
+  glMultMatrixf (&m[0][0]);
+}
diff --git a/hacks/glx/gltrackball.h b/hacks/glx/gltrackball.h
new file mode 100644 (file)
index 0000000..fbe2efd
--- /dev/null
@@ -0,0 +1,41 @@
+/* gltrackball, Copyright (c) 2002 Jamie Zawinski <jwz@jwz.org>
+ * GL-flavored wrapper for trackball.c
+ *
+ * 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.
+ */
+
+#ifndef __GLTRACKBALL_H__
+#define __GLTRACKBALL_H__
+
+typedef struct trackball_state trackball_state;
+
+/* Returns a trackball_state object, which encapsulates the stuff necessary
+   to make dragging the mouse on the window of a GL program do the right thing.
+ */
+extern trackball_state *gltrackball_init (void);
+
+/* Begin tracking the mouse: Call this when the mouse button goes down.
+   x and y are the mouse position relative to the window.
+   w and h are the size of the window.
+ */
+extern void gltrackball_start (trackball_state *, int x, int y, int w, int h);
+
+/* Track the mouse: Call this each time the mouse moves with the button down.
+   x and y are the new mouse position relative to the window.
+   w and h are the size of the window.
+ */
+extern void gltrackball_track (trackball_state *, int x, int y, int w, int h);
+
+/* Execute the rotations current encapsulated in the trackball_state:
+   this does something analagous to glRotatef().
+ */
+extern void gltrackball_rotate (trackball_state *);
+
+#endif /* __GLTRACKBALL_H__ */
+
index aedc57d421df8ebb1eaef93d86bc02a996e104e0..b100a9ce8bf909089c101501bc38f0ba5a09fe4a 100644 (file)
 
      *  Needs music.  ("Hellraiser Themes" by Coil: TORSO CD161; also
         duplicated on the "Unnatural History 2" compilation, WORLN M04699.)
-
-     *  I'm not totally happy with the spinning motion; I like the
-        acceleration and deceleration, but it often feels like it's going too
-        fast, or not naturally enough, or something.
-
-     *  However, the motion is better than that used by gears, superquadrics,
-        etc.; so maybe I should make them all share the same motion code.
  */
 
 #include <X11/Intrinsic.h>
@@ -82,6 +75,8 @@
 #define HACK_INIT      init_lament
 #define HACK_DRAW      draw_lament
 #define HACK_RESHAPE   reshape_lament
+#define HACK_HANDLE_EVENT lament_handle_event
+#define EVENT_MASK     PointerMotionMask
 #define lament_opts    xlockmore_opts
 #define DEFAULTS       "*delay:        10000   \n"     \
                        "*showFPS:      False   \n"     \
@@ -109,7 +104,8 @@ static argtype vars[] = {
 ModeSpecOpt lament_opts = {countof(opts), opts, countof(vars), vars, NULL};
 
 #include "xpm-ximage.h"
-
+#include "rotator.h"
+#include "gltrackball.h"
 #include "../images/lament.xpm"
 
 #define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
@@ -155,6 +151,10 @@ static GLfloat interior_color[] = { 0.20, 0.20, 0.15, 1.00,  /* ambient    */
 
 typedef struct {
   GLXContext *glx_context;
+  rotator *rot;
+  double rotx, roty, rotz;
+  trackball_state *trackball;
+  Bool button_down_p;
 
   GLuint box;                     /* display list IDs */
   GLuint star1, star2;
@@ -162,10 +162,6 @@ typedef struct {
   GLuint lid_0, lid_1, lid_2, lid_3, lid_4;
   GLuint taser_base, taser_lifter, taser_slider;
 
-  GLfloat rotx, roty, rotz;       /* current object rotation */
-  GLfloat dx, dy, dz;             /* current rotational velocity */
-  GLfloat ddx, ddy, ddz;          /* current rotational acceleration */
-  GLfloat d_max;                  /* max velocity */
   XImage *texture;                /* image bits */
   GLuint texids[6];               /* texture map IDs */
   lament_type type;               /* which mode of the object is current */
@@ -1404,6 +1400,39 @@ taser(ModeInfo *mi, Bool wire)
 /* Rendering and animating object models
  */
 
+Bool
+lament_handle_event (ModeInfo *mi, XEvent *event)
+{
+  lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button & Button1)
+    {
+      lc->button_down_p = True;
+      gltrackball_start (lc->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)
+    {
+      lc->button_down_p = False;
+      return True;
+    }
+  else if (event->xany.type == MotionNotify &&
+           lc->button_down_p)
+    {
+      gltrackball_track (lc->trackball,
+                         event->xmotion.x, event->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+
+  return False;
+}
+
+
 static void
 draw(ModeInfo *mi)
 {
@@ -1416,24 +1445,14 @@ draw(ModeInfo *mi)
     glClear(GL_COLOR_BUFFER_BIT);
 
   glPushMatrix();
-  {
-    GLfloat x = lc->rotx;
-    GLfloat y = lc->roty;
-    GLfloat z = lc->rotz;
-
-#if 0
- x=0.75; y=0; z=0; 
-#endif
 
-    if (x < 0) x = 1 - (x + 1);
-    if (y < 0) y = 1 - (y + 1);
-    if (z < 0) z = 1 - (z + 1);
+  gltrackball_rotate (lc->trackball);
 
-    /* Make into the screen be +Y right be +X, and up be +Z. */
-    glRotatef(-90.0, 1.0, 0.0, 0.0);
+  /* Make into the screen be +Y right be +X, and up be +Z. */
+  glRotatef(-90.0, 1.0, 0.0, 0.0);
 
-    /* Scale it up. */
-    glScalef(4.0, 4.0, 4.0);
+  /* Scale it up. */
+  glScalef(4.0, 4.0, 4.0);
 
 #ifdef DEBUG
     glPushMatrix();
@@ -1459,9 +1478,12 @@ draw(ModeInfo *mi)
     glPushMatrix();
     {
       /* Apply rotation to the object. */
-      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 (lc->type != LAMENT_LID_ZOOM)
+        get_rotation (lc->rot, &lc->rotx, &lc->roty, &lc->rotz,
+                      !lc->button_down_p);
+      glRotatef (lc->rotx * 360, 1.0, 0.0, 0.0);
+      glRotatef (lc->roty * 360, 0.0, 1.0, 0.0);
+      glRotatef (lc->rotz * 360, 0.0, 0.0, 1.0);
 
       switch (lc->type)
        {
@@ -1571,7 +1593,6 @@ draw(ModeInfo *mi)
     }
     glPopMatrix();
 
-  }
   glPopMatrix();
 }
 
@@ -1765,9 +1786,6 @@ animate(ModeInfo *mi)
        {
          lc->anim_r = 0.0;
          lc->anim_z = 0.0;
-         lc->rotx = frand(1.0) * RANDSIGN();
-         lc->roty = frand(1.0) * RANDSIGN();
-         lc->rotz = frand(1.0) * RANDSIGN();
          lc->type = LAMENT_BOX;
        }
       break;
@@ -1821,73 +1839,6 @@ animate(ModeInfo *mi)
 }
 
 
-static void
-rotate(GLfloat *pos, GLfloat *v, GLfloat *dv, GLfloat max_v)
-{
-  double ppos = *pos;
-
-  /* tick position */
-  if (ppos < 0)
-    ppos = -(ppos + *v);
-  else
-    ppos += *v;
-
-  if (ppos > 1.0)
-    ppos -= 1.0;
-  else if (ppos < 0)
-    ppos += 1.0;
-
-  if (ppos < 0) abort();
-  if (ppos > 1.0) abort();
-  *pos = (*pos > 0 ? ppos : -ppos);
-
-  /* accelerate */
-  *v += *dv;
-
-  /* clamp velocity */
-  if (*v > max_v || *v < -max_v)
-    {
-      *dv = -*dv;
-    }
-  /* If it stops, start it going in the other direction. */
-  else if (*v < 0)
-    {
-      if (random() % 4)
-       {
-         *v = 0;
-
-         /* keep going in the same direction */
-         if (random() % 2)
-           *dv = 0;
-         else if (*dv < 0)
-           *dv = -*dv;
-       }
-      else
-       {
-         /* reverse gears */
-         *v = -*v;
-         *dv = -*dv;
-         *pos = -*pos;
-       }
-    }
-
-  /* Alter direction of rotational acceleration randomly. */
-  if (! (random() % 120))
-    *dv = -*dv;
-
-  /* Change acceleration very occasionally. */
-  if (! (random() % 200))
-    {
-      if (*dv == 0)
-       *dv = 0.00001;
-      else if (random() & 1)
-       *dv *= 1.2;
-      else
-       *dv *= 0.8;
-    }
-}
-
-
 \f
 /* Window management, etc
  */
@@ -2100,20 +2051,11 @@ init_lament(ModeInfo *mi)
 
   lc = &lcs[MI_SCREEN(mi)];
 
-  lc->rotx = frand(1.0) * RANDSIGN();
-  lc->roty = frand(1.0) * RANDSIGN();
-  lc->rotz = frand(1.0) * RANDSIGN();
-
-  /* bell curve from 0-1.5 degrees, avg 0.75 */
-  lc->dx = (frand(1) + frand(1) + frand(1)) / (360*2);
-  lc->dy = (frand(1) + frand(1) + frand(1)) / (360*2);
-  lc->dz = (frand(1) + frand(1) + frand(1)) / (360*2);
-
-  lc->d_max = lc->dx * 2;
-
-  lc->ddx = 0.00006 + frand(0.00003);
-  lc->ddy = 0.00006 + frand(0.00003);
-  lc->ddz = 0.00006 + frand(0.00003);
+  {
+    double rot_speed = 0.5;
+    lc->rot = make_rotator (rot_speed, rot_speed, rot_speed, 1, 0, True);
+    lc->trackball = gltrackball_init ();
+  }
 
   lc->type = LAMENT_BOX;
   lc->anim_pause = 300 + (random() % 100);
@@ -2149,13 +2091,6 @@ draw_lament(ModeInfo *mi)
   glFinish();
   glXSwapBuffers(dpy, window);
 
-  if (lc->type != LAMENT_LID_ZOOM)
-    {
-      rotate(&lc->rotx, &lc->dx, &lc->ddx, lc->d_max);
-      rotate(&lc->roty, &lc->dy, &lc->ddy, lc->d_max);
-      rotate(&lc->rotz, &lc->dz, &lc->ddz, lc->d_max);
-    }
-
   if (lc->anim_pause)
     lc->anim_pause--;
   else
diff --git a/hacks/glx/lavalite.c b/hacks/glx/lavalite.c
new file mode 100644 (file)
index 0000000..631c2e2
--- /dev/null
@@ -0,0 +1,1597 @@
+/* lavalite --- 3D Simulation a Lava Lite, written by jwz.
+ *
+ * This software Copyright (c) 2002 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.
+ *
+ * LAVA®, LAVA LITE®, LAVA WORLD INTERNATIONAL® and the configuration of the
+ * LAVA® brand motion lamp are registered trademarks of Haggerty Enterprises,
+ * Inc.  The configuration of the globe and base of the motion lamp are
+ * registered trademarks of Haggerty Enterprises, Inc. in the U.S.A. and in
+ * other countries around the world.
+ *
+ * Official Lava Lite web site: http://www.lavaworld.com/
+ *
+ * Implementation details:
+ *
+ * The blobs are generated using metaballs.  For an explanation of what
+ * those are, see http://astronomy.swin.edu.au/~pbourke/modelling/implicitsurf/
+ * or http://www.fifi.org/doc/povray-manual/pov30005.htm
+ *
+ * Basically, each bubble of lava is a few (4) overlapping spherical metaballs
+ * of various sizes following similar but slightly different steep, slow
+ * parabolic arcs from the bottom to the top and back.
+ *
+ * We then polygonize the surface of the lava using the marching squares
+ * algorithm implemented in marching.c.
+ *
+ * Like real lavalites, this program is very slow.
+ *
+ * Surprisingly, it's loading the CPU and not the graphics engine: the speed
+ * bottleneck is in *computing* the scene rather than *rendering* it.  We
+ * actually don't use a huge number of polygons, but computing the mesh for
+ * the surface takes a lot of cycles.
+ *
+ * I eliminated all the square roots, but there is still a lot of
+ * floating-point multiplication in here.  I tried optimizing away the
+ * fp divisions, but that didn't seem to make a difference.
+ *
+ *     -style            lamp shape: classic, giant, cone, rocket, or random.
+ *     -speed            frequency at which new blobs launch.
+ *     -resolution       density of the polygon mesh.
+ *     -count            max number of blobs allowed at once.
+ *     -wander, -spin    whether to roll the scene around the screen.
+ *     -lava-color       color of the blobbies
+ *     -fluid-color      color of the stuff the blobbies float in
+ *     -base-color       color of the base of the lamp
+ *     -table-color      color of the table under the lamp
+ *     -impatient        at startup, skip forward in the animation so
+ *                       that at least one blob is fully exposed.
+ *
+ * TODO:
+ *
+ *    - make the table look better, somehow.
+ *    - should the lava be emissive?  should the one at the bottom be
+ *      more brightly colored than the ones at the top?  light distance?
+ *    - is there some way to put a specular reflection on the front glass
+ *      itself?  Maybe render it twice with FRONT/BACK tweaked, or alpha
+ *      with depth buffering turned off?
+ */
+
+#include <X11/Intrinsic.h>
+
+extern XtAppContext app;
+
+#define PROGCLASS      "LavaLite"
+#define HACK_INIT      init_lavalite
+#define HACK_DRAW      draw_lavalite
+#define HACK_RESHAPE   reshape_lavalite
+#define HACK_HANDLE_EVENT lavalite_handle_event
+#define EVENT_MASK      PointerMotionMask
+#define sws_opts       xlockmore_opts
+
+#define DEF_SPIN        "Z"
+#define DEF_WANDER      "False"
+#define DEF_SPEED       "0.003"
+#define DEF_RESOLUTION  "40"
+#define DEF_SMOOTH      "True"
+#define DEF_COUNT       "3"
+#define DEF_STYLE       "random"
+#define DEF_IMPATIENT   "False"
+#define DEF_LCOLOR     "#FF0000" /* lava */
+#define DEF_FCOLOR     "#00AAFF" /* fluid */
+#define DEF_BCOLOR     "#666666" /* base */
+#define DEF_TCOLOR     "#000000" /*"#00FF00"*/ /* table */
+
+#define DEF_FTEX       "(none)"
+#define DEF_BTEX       "(none)"
+#define DEF_TTEX       "(none)"
+
+#define DEFAULTS       "*delay:        10000       \n" \
+                       "*showFPS:      False       \n" \
+                       "*wireframe:    False       \n" \
+                       "*count:      " DEF_COUNT " \n" \
+                       "*style:      " DEF_STYLE " \n" \
+                       "*speed:      " DEF_SPEED " \n" \
+                       "*spin:       " DEF_SPIN   "\n" \
+                       "*wander:     " DEF_WANDER "\n" \
+                       "*resolution: " DEF_RESOLUTION "\n" \
+                       "*smooth: "     DEF_SMOOTH "\n" \
+                       "*impatient:  " DEF_IMPATIENT " \n" \
+                       "*geometry:     600x900\n" \
+                       "*lavaColor:  " DEF_LCOLOR "\n" \
+                       "*fluidColor: " DEF_FCOLOR "\n" \
+                       "*baseColor:  " DEF_BCOLOR "\n" \
+                       "*tableColor: " DEF_TCOLOR "\n" \
+                       "*fluidTexture: "       DEF_FTEX "\n" \
+                       "*baseTexture:  "       DEF_BTEX "\n" \
+                       "*tableTexture: "       DEF_TTEX "\n" \
+
+
+#define BLOBS_PER_GROUP 4
+
+#define GRAVITY         0.000013    /* odwnward acceleration */
+#define CONVECTION      0.005       /* initial upward velocity (bell curve) */
+#define TILT            0.00166666  /* horizontal velocity (bell curve) */
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#undef ABS
+#define ABS(n) ((n)<0?-(n):(n))
+#undef SIGNOF
+#define SIGNOF(n) ((n)<0?-1:1)
+
+#include "xlockmore.h"
+#include "marching.h"
+#include "rotator.h"
+#include "gltrackball.h"
+#include "xpm-ximage.h"
+#include <ctype.h>
+
+#ifdef USE_GL /* whole file */
+
+#include <GL/glu.h>
+
+
+typedef struct metaball metaball;
+
+struct metaball {
+
+  Bool alive_p;
+  Bool static_p;
+
+  double r;            /* hard radius */
+  double R;            /* radius of field of influence */
+
+  double z;            /* vertical position */
+  double pos_r;                /* position on horizontal circle */
+  double pos_th;       /* position on horizontal circle */
+  double dr, dz;       /* current velocity */
+
+  double x, y;         /* h planar position - compused from the above */
+
+  metaball *leader;    /* stay close to this other ball */
+};
+
+
+typedef enum { CLASSIC = 0, GIANT, CONE, ROCKET } lamp_style;
+typedef enum { CAP = 100, BOTTLE, BASE } lamp_part;
+
+typedef struct {
+  lamp_part part;
+  GLfloat elevation;
+  GLfloat radius;
+  GLfloat texture_elevation;
+} lamp_geometry;
+
+static lamp_geometry classic_lamp[] = {
+  { CAP,    1.16, 0.089, 0.00 },
+  { BOTTLE, 0.97, 0.120, 0.40 },
+  { BOTTLE, 0.13, 0.300, 0.87 },
+  { BOTTLE, 0.07, 0.300, 0.93 },
+  { BASE,   0.00, 0.280, 0.00 },
+  { BASE,  -0.40, 0.120, 0.50 },
+  { BASE,  -0.80, 0.280, 1.00 },
+  { 0, 0, 0, 0 },
+};
+
+static lamp_geometry giant_lamp[] = {
+  { CAP,    1.12, 0.105, 0.00 },
+  { BOTTLE, 0.97, 0.130, 0.30 },
+  { BOTTLE, 0.20, 0.300, 0.87 },
+  { BOTTLE, 0.15, 0.300, 0.93 },
+  { BASE,   0.00, 0.230, 0.00 },
+  { BASE,  -0.18, 0.140, 0.20 },
+  { BASE,  -0.80, 0.280, 1.00 },
+  { 0, 0, 0, 0 },
+};
+
+static lamp_geometry cone_lamp[] = {
+  { CAP,    1.35, 0.001, 0.00 },
+  { CAP,    1.35, 0.020, 0.00 },
+  { CAP,    1.30, 0.055, 0.05 },
+  { BOTTLE, 0.97, 0.120, 0.40 },
+  { BOTTLE, 0.13, 0.300, 0.87 },
+  { BASE,   0.00, 0.300, 0.00 },
+  { BASE,  -0.04, 0.320, 0.04 },
+  { BASE,  -0.60, 0.420, 0.50 },
+  { 0, 0, 0, 0 },
+};
+
+static lamp_geometry rocket_lamp[] = {
+  { CAP,    1.35, 0.001, 0.00 },
+  { CAP,    1.34, 0.020, 0.00 },
+  { CAP,    1.30, 0.055, 0.05 },
+  { BOTTLE, 0.97, 0.120, 0.40 },
+  { BOTTLE, 0.13, 0.300, 0.87 },
+  { BOTTLE, 0.07, 0.300, 0.93 },
+  { BASE,   0.00, 0.280, 0.00 },
+  { BASE,  -0.50, 0.180, 0.50 },
+  { BASE,  -0.75, 0.080, 0.75 },
+  { BASE,  -0.80, 0.035, 0.80 },
+  { BASE,  -0.90, 0.035, 1.00 },
+  { 0, 0, 0, 0 },
+};
+
+
+
+typedef struct {
+  GLXContext *glx_context;
+  lamp_style style;
+  lamp_geometry *model;
+  rotator *rot;
+  rotator *rot2;
+  trackball_state *trackball;
+  Bool button_down_p;
+
+  GLfloat max_bottle_radius;      /* radius of widest part of the bottle */
+
+  GLfloat launch_chance;          /* how often to percolate */
+  int blobs_per_group;            /* how many metaballs we launch at once */
+  Bool just_started_p;            /* so we launch some goo right away */
+
+  int grid_size;                  /* resolution for marching-cubes */
+  int nballs;
+  metaball *balls;
+
+  GLuint bottle_list;
+  GLuint ball_list;
+
+  Bool spin_x, spin_y, spin_z;    /* spin of the scene overall */
+
+  int bottle_poly_count;          /* polygons in the bottle only */
+
+} lavalite_configuration;
+
+static lavalite_configuration *bps = NULL;
+
+static char *do_spin;
+static char *do_style;
+static GLfloat speed;
+static Bool do_wander;
+static int resolution;
+static Bool do_smooth;
+static Bool do_impatient;
+
+static char *lava_color_str, *fluid_color_str, *base_color_str,
+  *table_color_str;
+static char *fluid_tex, *base_tex, *table_tex;
+
+static GLfloat lava_color[4], fluid_color[4], base_color[4], table_color[4];
+static GLfloat lava_spec[4] = {1.0, 1.0, 1.0, 1.0};
+static GLfloat lava_shininess = 128.0;
+static GLfloat foot_color[4] = {0.2, 0.2, 0.2, 1.0};
+
+static GLfloat light0_pos[4] = {-0.6, 0.0, 1.0, 0.0};
+static GLfloat light1_pos[4] = { 1.0, 0.0, 0.2, 0.0};
+static GLfloat light2_pos[4] = { 0.6, 0.0, 1.0, 0.0};
+
+
+
+static XrmOptionDescRec opts[] = {
+  { "-style",  ".style",  XrmoptionSepArg, 0 },
+  { "-spin",   ".spin",   XrmoptionSepArg, 0 },
+  { "+spin",   ".spin",   XrmoptionNoArg, "" },
+  { "-speed",  ".speed",  XrmoptionSepArg, 0 },
+  { "-wander", ".wander", XrmoptionNoArg, "True" },
+  { "+wander", ".wander", XrmoptionNoArg, "False" },
+  { "-resolution", ".resolution", XrmoptionSepArg, 0 },
+  { "-smooth", ".smooth", XrmoptionNoArg, "True" },
+  { "+smooth", ".smooth", XrmoptionNoArg, "False" },
+  { "-impatient", ".impatient", XrmoptionNoArg, "True" },
+  { "+impatient", ".impatient", XrmoptionNoArg, "False" },
+
+  { "-lava-color",   ".lavaColor",   XrmoptionSepArg, 0 },
+  { "-fluid-color",  ".fluidColor",  XrmoptionSepArg, 0 },
+  { "-base-color",   ".baseColor",   XrmoptionSepArg, 0 },
+  { "-table-color",  ".tableColor",  XrmoptionSepArg, 0 },
+
+  { "-fluid-texture",".fluidTexture",  XrmoptionSepArg, 0 },
+  { "-base-texture", ".baseTexture",   XrmoptionSepArg, 0 },
+  { "-table-texture",".tableTexture",  XrmoptionSepArg, 0 },
+};
+
+static argtype vars[] = {
+  {(caddr_t *) &do_style,  "style",  "Style",  DEF_STYLE,  t_String},
+  {(caddr_t *) &do_spin,   "spin",   "Spin",   DEF_SPIN,   t_String},
+  {(caddr_t *) &do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+  {(caddr_t *) &speed,     "speed",  "Speed",  DEF_SPEED,  t_Float},
+  {(caddr_t *) &resolution, "resolution", "Resolution", DEF_RESOLUTION, t_Int},
+  {(caddr_t *) &do_smooth,  "smooth", "Smooth", DEF_SMOOTH, t_Bool},
+  {(caddr_t *) &do_impatient, "impatient", "Impatient", DEF_IMPATIENT, t_Bool},
+
+  {(caddr_t *) &lava_color_str, "lavaColor", "LavaColor", DEF_LCOLOR,t_String},
+  {(caddr_t *) &fluid_color_str,"fluidColor","FluidColor",DEF_FCOLOR,t_String},
+  {(caddr_t *) &base_color_str, "baseColor", "BaseColor", DEF_BCOLOR,t_String},
+  {(caddr_t *) &table_color_str,"tableColor","TableColor",DEF_TCOLOR,t_String},
+
+  {(caddr_t *) &fluid_tex, "fluidTexture", "FluidTexture", DEF_FTEX, t_String},
+  {(caddr_t *) &base_tex,  "baseTexture",  "BaseTexture",  DEF_BTEX, t_String},
+  {(caddr_t *) &table_tex, "tableTexture", "BaseTexture",  DEF_TTEX, t_String},
+};
+
+ModeSpecOpt sws_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+
+/* Window management, etc
+ */
+void
+reshape_lavalite (ModeInfo *mi, int width, int height)
+{
+  GLfloat h = (GLfloat) height / (GLfloat) width;
+
+  glViewport (0, 0, (GLint) width, (GLint) height);
+
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  gluPerspective (30.0, 1/h, 1.0, 100.0);
+
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+  gluLookAt( 0.0, 0.0, 30.0,
+             0.0, 0.0, 0.0,
+             0.0, 1.0, 0.0);
+
+  glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+\f
+/* Textures
+ */
+
+static Bool
+load_texture (ModeInfo *mi, const char *filename)
+{
+  Display *dpy = mi->dpy;
+  Visual *visual = mi->xgwa.visual;
+  Colormap cmap = mi->xgwa.colormap;
+  char buf[1024];
+  XImage *image;
+
+  if (!filename ||
+      !*filename ||
+      !strcasecmp (filename, "(none)"))
+    {
+      glDisable (GL_TEXTURE_2D);
+      return False;
+    }
+
+  image = xpm_file_to_ximage (dpy, visual, cmap, filename);
+
+  clear_gl_error();
+  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+               image->width, image->height, 0,
+               GL_RGBA, GL_UNSIGNED_BYTE, image->data);
+  sprintf (buf, "texture: %.100s (%dx%d)",
+           filename, image->width, image->height);
+  check_gl_error(buf);
+
+  glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+  glPixelStorei (GL_UNPACK_ROW_LENGTH, image->width);
+  glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+  glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+  glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+  glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+  glEnable (GL_TEXTURE_2D);
+  return True;
+}
+
+
+\f
+/* Generating the lamp's bottle, caps, and base.
+ */
+
+static int
+draw_disc (GLfloat r, GLfloat z, int faces, Bool up_p, Bool wire)
+{
+  int j;
+  GLfloat th;
+  GLfloat step = M_PI * 2 / faces;
+  int polys = 0;
+  GLfloat x, y;
+
+  glFrontFace (up_p ? GL_CW : GL_CCW);
+  glNormal3f (0, (up_p ? 1 : -1), 0);
+  glBegin (wire ? GL_LINE_LOOP : GL_TRIANGLES);
+
+  x = r;
+  y = 0;
+
+  for (j = 0, th = 0; j <= faces; j++)
+    {
+      glTexCoord2f (-j / (GLfloat) faces, 1);
+      glVertex3f (0, z, 0);
+
+      glTexCoord2f (-j / (GLfloat) faces, 0);
+      glVertex3f (x, z, y);
+
+      th += step;
+      x  = r * cos (th);
+      y  = r * sin (th);
+
+      glTexCoord2f (-j / (GLfloat) faces, 0);
+      glVertex3f (x, z, y);
+
+      polys++;
+    }
+  glEnd();
+
+  return polys;
+}
+
+
+static int
+draw_tube (GLfloat r0, GLfloat r1,
+           GLfloat z0, GLfloat z1,
+           GLfloat t0, GLfloat t1,
+           int faces, Bool inside_out_p, Bool smooth_p, Bool wire)
+{
+  int polys = 0;
+  GLfloat th;
+  GLfloat x, y, x0=0, y0=0;
+  GLfloat step = M_PI * 2 / faces;
+  GLfloat s2 = step/2;
+  int i;
+
+  glFrontFace (inside_out_p ? GL_CW : GL_CCW);
+  glBegin (wire ? GL_LINES : (smooth_p ? GL_QUAD_STRIP : GL_QUADS));
+
+  th = 0;
+  x = 1;
+  y = 0;
+
+  if (!smooth_p)
+    {
+      x0 = cos (s2);
+      y0 = sin (s2);
+    }
+
+  if (smooth_p) faces++;
+
+  for (i = 0; i < faces; i++)
+    {
+      int nsign = (inside_out_p ? -1 : 1);
+
+      if (smooth_p)
+        glNormal3f (x  * nsign, z1, y  * nsign);
+      else
+        glNormal3f (x0 * nsign, z1, y0 * nsign);
+
+      glTexCoord2f (nsign * -i / (GLfloat) faces, 1-t1);
+      glVertex3f (x * r1, z1, y * r1);
+
+      glTexCoord2f (nsign * -i / (GLfloat) faces, 1-t0);
+      glVertex3f (x * r0, z0, y * r0);
+
+      th += step;
+      x  = cos (th);
+      y  = sin (th);
+
+      if (!smooth_p)
+        {
+          x0 = cos (th + s2);
+          y0 = sin (th + s2);
+
+          glTexCoord2f (nsign * -(i+1) / (double) faces, 1-t0);
+          glVertex3f (x * r0, z0, y * r0);
+
+          glTexCoord2f (nsign * -(i+1) / (double) faces, 1-t1);
+          glVertex3f (x * r1, z1, y * r1);
+        }
+
+      polys++;
+    }
+  glEnd();
+
+  return polys;
+}
+
+
+static int
+draw_table (GLfloat z, Bool wire)
+{
+  GLfloat faces = 6;
+  GLfloat step = M_PI * 2 / faces;
+  GLfloat s = 8;
+  GLfloat th;
+  int j;
+  int polys = 0;
+
+  glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, table_color);
+
+  glFrontFace(GL_CW);
+  glNormal3f(0, 1, 0);
+  glBegin(wire ? GL_LINE_LOOP : GL_TRIANGLE_FAN);
+
+  if (! wire)
+    {
+      glTexCoord2f (-0.5, 0.5);
+      glVertex3f(0, z, 0);
+    }
+
+  for (j = 0, th = 0; j <= faces; j++)
+    {
+      GLfloat x = cos (th);
+      GLfloat y = sin (th);
+      glTexCoord2f (-(x+1)/2.0, (y+1)/2.0);
+      glVertex3f(x*s, z, y*s);
+      th += step;
+      polys++;
+    }
+  glEnd();
+  return polys;
+}
+
+
+static int
+draw_wing (GLfloat w, GLfloat h, GLfloat d, Bool wire)
+{
+  static int coords[2][8][2] = {
+    { {  0,   0 },
+      { 10,  10 },
+      { 20,  23 },
+      { 30,  41 },
+      { 40,  64 },
+      { 45,  81 },
+      { 50, 103 },
+      { 53, 134 } },
+    { {  0,  54 },
+      { 10,  57 },
+      { 20,  64 },
+      { 30,  75 },
+      { 40,  92 },
+      { 45, 104 },
+      { 50, 127 },
+      { 51, 134 } 
+    }
+  };
+
+  int polys = 0;
+  int maxx = coords[0][countof(coords[0])-1][0];
+  int maxy = coords[0][countof(coords[0])-1][1];
+  int x;
+
+  for (x = 1; x < countof(coords[0]); x++)
+    {
+      GLfloat px0 = (GLfloat) coords[0][x-1][0] / maxx * w;
+      GLfloat py0 = (GLfloat) coords[0][x-1][1] / maxy * h;
+      GLfloat px1 = (GLfloat) coords[1][x-1][0] / maxx * w;
+      GLfloat py1 = (GLfloat) coords[1][x-1][1] / maxy * h;
+      GLfloat px2 = (GLfloat) coords[0][x  ][0] / maxx * w;
+      GLfloat py2 = (GLfloat) coords[0][x  ][1] / maxy * h;
+      GLfloat px3 = (GLfloat) coords[1][x  ][0] / maxx * w;
+      GLfloat py3 = (GLfloat) coords[1][x  ][1] / maxy * h;
+      GLfloat zz = d/2;
+
+      /* Left side
+       */
+      glFrontFace (GL_CW);
+      glNormal3f (0, 0, -1);
+      glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+
+      glTexCoord2f (px0, py0); glVertex3f (px0, -py0, -zz);
+      glTexCoord2f (px1, py1); glVertex3f (px1, -py1, -zz);
+      glTexCoord2f (px3, py3); glVertex3f (px3, -py3, -zz);
+      glTexCoord2f (px2, py2); glVertex3f (px2, -py2, -zz);
+      polys++;
+      glEnd();
+
+      /* Right side
+       */
+      glFrontFace (GL_CCW);
+      glNormal3f (0, 0, -1);
+      glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+      glTexCoord2f(px0, py0); glVertex3f (px0, -py0, zz);
+      glTexCoord2f(px1, py1); glVertex3f (px1, -py1, zz);
+      glTexCoord2f(px3, py3); glVertex3f (px3, -py3, zz);
+      glTexCoord2f(px2, py2); glVertex3f (px2, -py2, zz);
+      polys++;
+      glEnd();
+
+      /* Top edge
+       */
+      glFrontFace (GL_CCW);
+      glNormal3f (1, -1, 0); /* #### wrong */
+      glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+      glTexCoord2f(px0, py0); glVertex3f (px0, -py0, -zz);
+      glTexCoord2f(px0, py0); glVertex3f (px0, -py0,  zz);
+      glTexCoord2f(px2, py2); glVertex3f (px2, -py2,  zz);
+      glTexCoord2f(px2, py2); glVertex3f (px2, -py2, -zz);
+      polys++;
+      glEnd();
+
+      /* Bottom edge
+       */
+      glFrontFace (GL_CW);
+      glNormal3f (-1, 1, 0); /* #### wrong */
+      glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
+      glTexCoord2f(px1, py1); glVertex3f (px1, -py1, -zz);
+      glTexCoord2f(px1, py1); glVertex3f (px1, -py1,  zz);
+      glTexCoord2f(px3, py3); glVertex3f (px3, -py3,  zz);
+      glTexCoord2f(px3, py3); glVertex3f (px3, -py3, -zz);
+      polys++;
+      glEnd();
+
+
+    }
+
+  return polys;
+
+}
+
+
+static void
+generate_bottle (ModeInfo *mi)
+{
+  lavalite_configuration *bp = &bps[MI_SCREEN(mi)];
+  int wire = MI_IS_WIREFRAME(mi);
+  int faces = resolution * 1.5;
+  Bool smooth = do_smooth;
+  Bool have_texture = False;
+
+  lamp_geometry *top_slice = bp->model;
+  const char *current_texture = 0;
+  lamp_part last_part = 0;
+
+  if (faces < 3)  faces = 3;
+  else if (wire && faces > 20) faces = 20;
+  else if (faces > 60) faces = 60;
+
+  bp->bottle_poly_count = 0;
+
+  glNewList (bp->bottle_list, GL_COMPILE);
+  glPushMatrix();
+
+  glRotatef (90, 1, 0, 0);
+  glTranslatef (0, -0.5, 0);
+
+  /* All parts of the lamp use the same specularity and shininess. */
+  glMaterialfv (GL_FRONT, GL_SPECULAR,  lava_spec);
+  glMateriali  (GL_FRONT, GL_SHININESS, lava_shininess);
+
+  while (1)
+    {
+      lamp_geometry *bot_slice = top_slice + 1;
+
+      const char *texture = 0;
+      GLfloat *color = 0;
+      GLfloat t0, t1;
+
+      glDisable (GL_LIGHT2);
+
+      switch (top_slice->part)
+        {
+        case CAP:
+        case BASE:
+          texture = base_tex;
+          color   = base_color;
+          break;
+        case BOTTLE:
+          texture = fluid_tex;
+          color   = fluid_color;
+          if (!wire) glEnable (GL_LIGHT2);   /* light2 affects only fluid */
+          break;
+        default:
+          abort();
+          break;
+        }
+
+      have_texture = False;
+      if (!wire && texture && texture != current_texture)
+        {
+          current_texture = texture;
+          have_texture = load_texture (mi, current_texture);
+        }
+        
+      /* Color the discs darker than the tube walls. */
+      glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, foot_color);
+
+      /* Do a top disc if this is the first slice of the CAP or BASE.
+       */
+      if ((top_slice->part == CAP  && last_part == 0) ||
+          (top_slice->part == BASE && last_part == BOTTLE))
+        bp->bottle_poly_count +=
+          draw_disc (top_slice->radius, top_slice->elevation, faces,
+                     True, wire);
+
+      /* Do a bottom disc if this is the last slice of the CAP or BASE.
+       */
+      if ((top_slice->part == CAP  && bot_slice->part == BOTTLE) ||
+          (top_slice->part == BASE && bot_slice->part == 0))
+        {
+          lamp_geometry *sl = (bot_slice->part == 0 ? top_slice : bot_slice);
+          bp->bottle_poly_count +=
+            draw_disc (sl->radius, sl->elevation, faces, False, wire);
+        }
+
+      if (bot_slice->part == 0)    /* done! */
+        break;
+
+      /* Do a tube or cone
+       */
+      glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+
+      t0 = top_slice->texture_elevation;
+      t1 = bot_slice->texture_elevation;
+
+      /* Restart the texture coordinates for the glass.
+       */
+      if (top_slice->part == BOTTLE)
+        {
+          Bool first_p = (top_slice[-1].part != BOTTLE);
+          Bool last_p  = (bot_slice->part    != BOTTLE);
+          if (first_p) t0 = 0;
+          if (last_p)  t1 = 1;
+        }
+
+      bp->bottle_poly_count +=
+        draw_tube (top_slice->radius, bot_slice->radius,
+                   top_slice->elevation, bot_slice->elevation,
+                   t0, t1,
+                   faces,
+                   (top_slice->part == BOTTLE),
+                   smooth, wire);
+
+      last_part = top_slice->part;
+      top_slice++;
+    }
+
+  if (bp->style == ROCKET)
+    {
+      int i;
+      for (i = 0; i < 3; i++)
+        {
+          glPushMatrix();
+          glRotatef (120 * i, 0, 1, 0);
+          glTranslatef (0.14, -0.05, 0);
+          bp->bottle_poly_count += draw_wing (0.4, 0.95, 0.02, wire);
+          glPopMatrix();
+        }
+      glTranslatef (0, -0.1, 0);  /* move floor down a little */
+    }
+
+
+  have_texture = !wire && load_texture (mi, table_tex);
+  glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, table_color);
+  bp->bottle_poly_count += draw_table (top_slice->elevation, wire);
+
+
+  glPopMatrix ();
+  glDisable (GL_TEXTURE_2D);   /* done with textured objects */
+  glEndList ();
+}
+
+
+
+\f
+/* Generating blobbies
+ */
+
+static double
+bellrand (double extent)    /* like frand(), but a bell curve. */
+{
+  return (((frand(extent) + frand(extent) + frand(extent)) / 3)
+          - (extent/2));
+}
+
+
+static void move_ball (ModeInfo *mi, metaball *b);
+
+/* Bring a ball into play, and re-randomize its values.
+ */
+static void
+reset_ball (ModeInfo *mi, metaball *b)
+{
+/*  lavalite_configuration *bp = &bps[MI_SCREEN(mi)]; */
+
+  b->r = 0.00001;
+  b->R = 0.12 + bellrand(0.10);
+
+  b->pos_r = bellrand (0.9);
+  b->pos_th = frand(M_PI*2);
+  b->z = 0;
+
+  b->dr = bellrand(TILT);
+  b->dz = CONVECTION;
+
+  b->leader = 0;
+
+  if (!b->alive_p)
+    b->alive_p = True;
+
+  move_ball (mi, b);
+}
+
+
+/* returns the first metaball that is not in use, or 0.
+ */
+static metaball *
+get_ball (ModeInfo *mi)
+{
+  lavalite_configuration *bp = &bps[MI_SCREEN(mi)];
+  int i;
+  for (i = 0; i < bp->nballs; i++)
+    {
+      metaball *b = &bp->balls[i];
+      if (!b->alive_p)
+        return b;
+    }
+  return 0;
+}
+
+
+/* Generate the blobs that don't move: the ones at teh top and bottom
+   that are part of the scenery.
+ */
+static void
+generate_static_blobs (ModeInfo *mi)
+{
+  lavalite_configuration *bp = &bps[MI_SCREEN(mi)];
+  metaball *b0, *b1;
+  int i;
+
+  b0 = get_ball (mi);
+  if (!b0) abort();
+  b0->static_p = True;
+  b0->alive_p = True;
+  b0->R = 0.6;
+  b0->r = 0.3;
+
+  /* the giant blob at the bottom of the bottle.
+   */
+  b0->pos_r = 0;
+  b0->pos_th = 0;
+  b0->dr = 0;
+  b0->dz = 0;
+  b0->x = 0;
+  b0->y = 0;
+  b0->z = -0.43;
+
+  /* the small blob at the top of the bottle.
+   */
+  b1 = get_ball (mi);
+  if (!b1) abort();
+
+  *b1 = *b0;
+  b1->R = 0.16;
+  b1->r = 0.135;
+  b1->z = 1.078;
+
+  /* Some extra blobs at the bottom of the bottle, to jumble the surface.
+   */
+  for (i = 0; i < bp->blobs_per_group; i++)
+    {
+      b1 = get_ball (mi);
+      if (!b1) abort();
+      reset_ball (mi, b1);
+      b1->static_p = True;
+      b1->z = frand(0.04);
+      b1->dr = 0;
+      b1->dz = 0;
+    }
+}
+
+
+static GLfloat
+max_bottle_radius (lavalite_configuration *bp)
+{
+  GLfloat r = 0;
+  lamp_geometry *slice;
+  for (slice = bp->model; slice->part != 0; slice++)
+    {
+      if (slice->part == BOTTLE && slice->radius > r)
+        r = slice->radius;      /* top */
+      if (slice[1].radius > r)
+        r = slice[1].radius;    /* bottom */
+    }
+  return r;
+}
+
+
+static GLfloat
+bottle_radius_at (lavalite_configuration *bp, GLfloat z)
+{
+  GLfloat topz = -999, botz = -999, topr, botr;
+  lamp_geometry *slice;
+  GLfloat ratio;
+
+  for (slice = bp->model; slice->part != 0; slice++)
+    if (z > slice->elevation)
+      {
+        slice--;
+        topz = slice->elevation;
+        topr = slice->radius;
+        break;
+      }
+  if (topz == -999) return 0;
+
+  for (; slice->part != 0; slice++)
+    if (z > slice->elevation)
+      {
+        botz = slice->elevation;
+        botr = slice->radius;
+        break;
+      }
+  if (botz == -999) return 0;
+
+  ratio = (z - botz) / (topz - botz);
+
+  return (botr + ((topr - botr) * ratio));
+}
+
+
+static void
+move_ball (ModeInfo *mi, metaball *b)
+{
+  lavalite_configuration *bp = &bps[MI_SCREEN(mi)];
+  double gravity = GRAVITY;
+  double real_r;
+
+  if (b->static_p) return;
+
+  b->pos_r += b->dr;
+  b->z     += b->dz;
+
+  b->dz -= gravity;
+
+  if (b->pos_r > 0.9)
+    {
+      b->pos_r = 0.9;
+      b->dr = -b->dr;
+    }
+  else if (b->pos_r < 0)
+    {
+      b->pos_r = -b->pos_r;
+      b->dr = -b->dr;
+    }
+
+  real_r = b->pos_r * bottle_radius_at (bp, b->z);
+
+  b->x = cos (b->pos_th) * real_r;
+  b->y = sin (b->pos_th) * real_r;
+
+  if (b->z < -b->R)  /* dropped below bottom of glass - turn it off */
+    b->alive_p = False;
+}
+
+
+/* This function makes sure that balls that are part of a group always stay
+   relatively close to each other.
+ */
+static void
+clamp_balls (ModeInfo *mi)
+{
+  lavalite_configuration *bp = &bps[MI_SCREEN(mi)];
+  int i;
+  for (i = 0; i < bp->nballs; i++)
+    {
+      metaball *b = &bp->balls[i];
+      if (b->alive_p && b->leader)
+        {
+          double zslack = 0.1;
+          double minz = b->leader->z - zslack;
+          double maxz = b->leader->z + zslack;
+
+          /* Try to keep the Z values near those of the leader.
+             Don't let it go out of range (above or below) and clamp it
+             if it does.  If we've clamped it, make sure dz will be
+             moving it in the right direction (back toward the leader.)
+
+             We aren't currently clamping r, only z -- doesn't seem to
+             be needed.
+
+             This is kind of flaky, I think.  Sometimes you can see
+             the blobbies "twitch".  That's no good.
+           */
+
+          if (b->z < minz)
+            {
+              if (b->dz < 0) b->dz = -b->dz;
+              b->z = minz - b->dz;
+            }
+
+          if (b->z > maxz)
+            {
+              if (b->dz > 0) b->dz = -b->dz;
+              b->z = maxz + b->dz;
+            }
+        }
+    }
+}
+
+
+static void
+move_balls (ModeInfo *mi)   /* for great justice */
+{
+  lavalite_configuration *bp = &bps[MI_SCREEN(mi)];
+  int i;
+  for (i = 0; i < bp->nballs; i++)
+    {
+      metaball *b = &bp->balls[i];
+      if (b->alive_p)
+        move_ball (mi, b);
+    }
+
+  clamp_balls (mi);
+}
+
+
+\f
+/* Rendering blobbies using marching cubes.
+ */
+
+static double
+compute_metaball_influence (lavalite_configuration *bp,
+                            double x, double y, double z,
+                            int nballs, metaball *balls)
+{
+  double vv = 0;
+  int i;
+
+  for (i = 0; i < nballs; i++)
+    {
+      metaball *b = &balls[i];
+      double dx, dy, dz;
+      double d2, r, R, r2, R2;
+
+      if (!b->alive_p) continue;
+
+      dx = x - b->x;
+      dy = y - b->y;
+      dz = z - b->z;
+      R = b->R;
+
+      if (dx > R || dx < -R ||    /* quick check before multiplying */
+          dy > R || dy < -R ||
+          dz > R || dz < -R)
+        continue;
+
+      d2 = (dx*dx + dy*dy + dz*dz);
+      r = b->r;
+
+      r2 = r*r;
+      R2 = R*R;
+
+      if (d2 <= r2)             /* (d <= r)   inside the hard radius */
+        vv += 1;
+      else if (d2 > R2)         /* (d > R)   outside the radius of influence */
+        ;
+      else          /* somewhere in between: linear drop-off from r=1 to R=0 */
+        {
+          /* was: vv += 1 - ((d-r) / (R-r)); */
+          vv += 1 - ((d2-r2) / (R2-r2));
+        }
+    }
+
+  return vv;
+}
+
+
+/* callback for marching_cubes() */
+static void *
+obj_init (double grid_size, void *closure)
+{
+  lavalite_configuration *bp = (lavalite_configuration *) closure;
+  bp->grid_size = grid_size;
+
+  return closure;
+}
+
+
+/* Returns True if the given point is outside of the glass tube.
+ */
+static double
+clipped_by_glass_p (double x, double y, double z,
+                    lavalite_configuration *bp)
+{
+  double d2, or, or2, ir2;
+
+  or = bp->max_bottle_radius;
+
+  if (x > or || x < -or ||    /* quick check before multiplying */
+      y > or || y < -or)
+    return 0;
+
+  d2 = (x*x + y*y);
+  or = bottle_radius_at (bp, z);
+
+  or2 = or*or;
+
+  if (d2 > or2)   /* (sqrt(d) > or) */
+    return 0;
+
+  ir2 = or2 * 0.7;
+
+  if (d2 > ir2)  /* (sqrt(d) > ir) */
+    {
+      double dr1 = or2;
+      double dr2 = ir2;
+      /* was: (1 - (d-ratio2) / (ratio1-ratio2)) */
+      return (1 - (d2-dr2) / (dr1-dr2));
+    }
+
+  return 1;
+}
+
+
+
+/* callback for marching_cubes() */
+static double
+obj_compute (double x, double y, double z, void *closure)
+{
+  lavalite_configuration *bp = (lavalite_configuration *) closure;
+  double clip;
+
+  x /= bp->grid_size;  /* convert from 0-N to 0-1. */
+  y /= bp->grid_size;
+  z /= bp->grid_size;
+
+  x -= 0.5;    /* X and Y range from -.5 to +.5; z ranges from 0-1. */
+  y -= 0.5;
+
+  clip = clipped_by_glass_p (x, y, z, bp);
+  if (clip == 0) return 0;
+
+  return (clip *
+          compute_metaball_influence (bp, x, y, z, bp->nballs, bp->balls));
+}
+
+
+/* callback for marching_cubes() */
+static void
+obj_free (void *closure)
+{
+}
+
+
+/* Send a new blob travelling upward.
+   This blob will actually be composed of N metaballs that are near
+   each other.
+ */
+static void
+launch_balls (ModeInfo *mi)
+{
+  lavalite_configuration *bp = &bps[MI_SCREEN(mi)];
+  metaball *b0 = get_ball (mi);
+  int i;
+
+  if (!b0) return;
+  reset_ball (mi, b0);
+
+  for (i = 0; i < bp->blobs_per_group; i++)
+    {
+      metaball *b1 = get_ball (mi);
+      if (!b1) break;
+      *b1 = *b0;
+
+      reset_ball (mi, b1);
+      b1->leader = b0;
+
+# define FROB(FIELD,AMT) \
+         b1->FIELD += (bellrand(AMT) * b0->FIELD)
+
+   /* FROB (pos_r,  0.7); */
+   /* FROB (pos_th, 0.7); */
+      FROB (dr, 0.8);
+      FROB (dz, 0.6);
+# undef FROB
+    }
+
+}
+
+
+static void
+animate_lava (ModeInfo *mi)
+{
+  lavalite_configuration *bp = &bps[MI_SCREEN(mi)];
+  int wire = MI_IS_WIREFRAME(mi);
+  Bool just_started_p = bp->just_started_p;
+
+  double isolevel = 0.3;
+
+  /* Maybe bubble a new blobby to the surface.
+   */
+  if (just_started_p ||
+      frand(1.0) < bp->launch_chance)
+    {
+      bp->just_started_p = False;
+      launch_balls (mi);
+
+      if (do_impatient && just_started_p)
+        while (1)
+          {
+            int i;
+            move_balls (mi);
+            for (i = 0; i < bp->nballs; i++)
+              {
+                metaball *b = &bp->balls[i];
+                if (b->alive_p && !b->static_p && !b->leader &&
+                    b->z > 0.5)
+                  goto DONE;
+              }
+          }
+      DONE: ;
+    }
+
+  move_balls (mi);
+
+  glNewList (bp->ball_list, GL_COMPILE);
+  glPushMatrix();
+
+  glMaterialfv (GL_FRONT, GL_SPECULAR,            lava_spec);
+  glMateriali  (GL_FRONT, GL_SHININESS,           lava_shininess);
+  glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, lava_color);
+
+  /* For the blobbies, the origin is on the axis at the bottom of the
+     glass bottle; and the top of the bottle is +1 on Z.
+   */
+  glTranslatef (0, 0, -0.5);
+
+  mi->polygon_count = 0;
+  {
+    double s = 1.0/bp->grid_size;
+    glPushMatrix();
+    glTranslatef (-0.5, -0.5, 0);
+    glScalef (s, s, s);
+    marching_cubes (resolution, isolevel, wire, do_smooth,
+                    obj_init, obj_compute, obj_free, bp,
+                    &mi->polygon_count);
+    glPopMatrix();
+  }
+
+  mi->polygon_count += bp->bottle_poly_count;
+
+  glPopMatrix();
+  glEndList ();
+}
+
+
+\f
+/* Startup initialization
+ */
+
+Bool
+lavalite_handle_event (ModeInfo *mi, XEvent *event)
+{
+  lavalite_configuration *bp = &bps[MI_SCREEN(mi)];
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button & Button1)
+    {
+      bp->button_down_p = True;
+      gltrackball_start (bp->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)
+    {
+      bp->button_down_p = False;
+      return True;
+    }
+  else if (event->xany.type == MotionNotify &&
+           bp->button_down_p)
+    {
+      gltrackball_track (bp->trackball,
+                         event->xmotion.x, event->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+
+  return False;
+}
+
+
+static void
+parse_color (ModeInfo *mi, const char *name, const char *s, GLfloat *a)
+{
+  XColor c;
+  a[4] = 1.0;  /* alpha */
+
+  if (! XParseColor (MI_DISPLAY(mi), MI_COLORMAP(mi), s, &c))
+    {
+      fprintf (stderr, "%s: can't parse %s color %s", progname, name, s);
+      exit (1);
+    }
+  a[0] = c.red   / 65536.0;
+  a[1] = c.green / 65536.0;
+  a[2] = c.blue  / 65536.0;
+}
+
+
+void 
+init_lavalite (ModeInfo *mi)
+{
+  lavalite_configuration *bp;
+  int wire = MI_IS_WIREFRAME(mi);
+
+  if (!bps) {
+    bps = (lavalite_configuration *)
+      calloc (MI_NUM_SCREENS(mi), sizeof (lavalite_configuration));
+    if (!bps) {
+      fprintf(stderr, "%s: out of memory\n", progname);
+      exit(1);
+    }
+
+    bp = &bps[MI_SCREEN(mi)];
+  }
+
+  bp = &bps[MI_SCREEN(mi)];
+
+  bp->glx_context = init_GL(mi);
+
+  reshape_lavalite (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
+  {
+    char *s = do_spin;
+    while (*s)
+      {
+        if (*s == ' ' || *s == '\t') ;
+        else if (*s == 'x' || *s == 'X') bp->spin_x = 1;
+        else if (*s == 'y' || *s == 'Y') bp->spin_y = 1;
+        else if (*s == 'z' || *s == 'Z') bp->spin_z = 1;
+        else
+          {
+            fprintf (stderr,
+         "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
+                     progname, do_spin);
+            exit (1);
+          }
+        s++;
+      }
+
+    s = do_style;
+    if (!s || !*s || !strcasecmp (s, "classic")) bp->style = CLASSIC;
+    else if (!strcasecmp (s, "giant"))  bp->style = GIANT;
+    else if (!strcasecmp (s, "cone"))   bp->style = CONE;
+    else if (!strcasecmp (s, "rocket")) bp->style = ROCKET;
+    else if (!strcasecmp (s, "random"))
+      {
+        if (random() & 1) bp->style = CLASSIC;  /* half the time */
+        else bp->style = (random() % ((int) ROCKET+1));
+      }
+    else
+      {
+        fprintf (stderr,
+         "%s: style must be Classic, Giant, Cone, or Rocket (not \"%s\")\n",
+                 progname, s);
+        exit (1);
+      }
+  }
+
+  parse_color (mi, "lava",  lava_color_str,  lava_color);
+  parse_color (mi, "fluid", fluid_color_str, fluid_color);
+  parse_color (mi, "base",  base_color_str,  base_color);
+  parse_color (mi, "table", table_color_str, table_color);
+
+  if (!wire)
+    {
+      GLfloat amb[4]  = {0.0, 0.0, 0.0, 1.0};
+      GLfloat dif[4]  = {1.0, 1.0, 1.0, 1.0};
+      GLfloat spc0[4] = {0.0, 1.0, 1.0, 1.0};
+      GLfloat spc1[4] = {1.0, 0.0, 1.0, 1.0};
+
+      glEnable(GL_LIGHTING);
+      glEnable(GL_LIGHT0);
+      glEnable(GL_LIGHT1);
+      glEnable(GL_DEPTH_TEST);
+      glEnable(GL_CULL_FACE);
+      glEnable(GL_NORMALIZE);
+      glShadeModel(GL_SMOOTH);
+
+      glLightfv(GL_LIGHT0, GL_AMBIENT,  amb);
+      glLightfv(GL_LIGHT0, GL_DIFFUSE,  dif);
+      glLightfv(GL_LIGHT0, GL_SPECULAR, spc0);
+
+      glLightfv(GL_LIGHT1, GL_AMBIENT,  amb);
+      glLightfv(GL_LIGHT1, GL_DIFFUSE,  dif);
+      glLightfv(GL_LIGHT1, GL_SPECULAR, spc1);
+
+      glLightfv(GL_LIGHT2, GL_AMBIENT,  amb);
+      glLightfv(GL_LIGHT2, GL_DIFFUSE,  dif);
+      glLightfv(GL_LIGHT2, GL_SPECULAR, spc0);
+    }
+
+  {
+    Bool spinx=False, spiny=False, spinz=False;
+    double spin_speed   = 0.4;
+    double wander_speed = 0.03;
+
+    char *s = do_spin;
+    while (*s)
+      {
+        if      (*s == 'x' || *s == 'X') spinx = True;
+        else if (*s == 'y' || *s == 'Y') spiny = True;
+        else if (*s == 'z' || *s == 'Z') spinz = True;
+        else
+          {
+            fprintf (stderr,
+         "%s: spin must contain only the characters X, Y, or Z (not \"%s\")\n",
+                     progname, do_spin);
+            exit (1);
+          }
+        s++;
+      }
+
+    bp->rot = make_rotator (spinx ? spin_speed : 0,
+                            spiny ? spin_speed : 0,
+                            spinz ? spin_speed : 0,
+                            1.0,
+                            do_wander ? wander_speed : 0,
+                            False);
+    bp->rot2 = make_rotator (spin_speed, 0, 0,
+                             1, 0.1,
+                             False);
+    bp->trackball = gltrackball_init ();
+
+    /* move initial camera position up by around 15 degrees:
+       in other words, tilt the scene toward the viewer. */
+    gltrackball_start (bp->trackball, 50, 50, 100, 100);
+    gltrackball_track (bp->trackball, 50,  5, 100, 100);
+
+    /* Oh, but if it's the "Giant" model, tilt the scene away: make it
+       look like we're looking up at it instead of odwn at it! */
+    if (bp->style == GIANT)
+      gltrackball_track (bp->trackball, 50, -12, 100, 100);
+    else if (bp->style == ROCKET)  /* same for rocket, but not as much */
+      gltrackball_track (bp->trackball, 50, -4, 100, 100);
+  }
+
+  switch (bp->style)
+    {
+    case CLASSIC: bp->model = classic_lamp; break;
+    case GIANT:   bp->model = giant_lamp;   break;
+    case CONE:    bp->model = cone_lamp;    break;
+    case ROCKET:  bp->model = rocket_lamp;  break;
+    default: abort(); break;
+    }
+
+  bp->max_bottle_radius = max_bottle_radius (bp);
+
+  bp->launch_chance = speed;
+  bp->blobs_per_group = BLOBS_PER_GROUP;
+  bp->just_started_p = True;
+
+  bp->nballs = (((MI_COUNT (mi) + 1) * bp->blobs_per_group)
+                + 2);
+  bp->balls = (metaball *) calloc (sizeof(*bp->balls), bp->nballs+1);
+
+  bp->bottle_list = glGenLists (1);
+  bp->ball_list = glGenLists (1);
+
+  generate_bottle (mi);
+  generate_static_blobs (mi);
+}
+
+
+/* Render one frame
+ */
+
+void
+draw_lavalite (ModeInfo *mi)
+{
+  lavalite_configuration *bp = &bps[MI_SCREEN(mi)];
+  Display *dpy = MI_DISPLAY(mi);
+  Window window = MI_WINDOW(mi);
+
+  if (!bp->glx_context)
+    return;
+
+  glMatrixMode (GL_MODELVIEW);
+  glPushMatrix ();
+
+  {
+    double cx, cy, cz; /* camera position, 0-1. */
+    double px, py, pz; /* object position, 0-1. */
+    double rx, ry, rz; /* object rotation, 0-1. */
+
+    get_position (bp->rot2, 0,   &cy, &cz, !bp->button_down_p);
+    get_rotation (bp->rot2, &cx, 0,   0,   !bp->button_down_p);
+
+    get_position (bp->rot,  &px, &py, &pz, !bp->button_down_p);
+    get_rotation (bp->rot,  &rx, &ry, &rz, !bp->button_down_p);
+
+#if 1
+    cx = 0.5;
+    cy = 0.5;
+    cz = 1.0;
+
+#else  /* #### this crud doesn't really work yet */
+
+
+    /* We have c[xyz] parameters describing a camera position, but we don't
+       want to just map those to points in space: the lamp doesn't look very
+       good from the inside, or from underneath...
+
+       Good observation points form a ring around the lamp: basically, a
+       torus ringing the lamp, parallel to the lamp's floor.
+
+       We interpret cz as distance from the origin.
+       cy as elevation.
+       cx is then used as position in the torus (theta).
+     */
+
+    {
+      double cx2, cy2, cz2;
+      double d;
+
+      cx2 = 0.5;
+      cy2 = 0.5;
+      cz2 = 1.0;
+
+      cy2 = (cy * 0.4);                /* cam elevation: 0.0 (table) - 0.4 up. */
+      d = 0.9 + cz;            /* cam distance: 0.9 - 1.9. */
+
+      cz2 = 0.5 + (d * cos (cx * M_PI * 2));
+      cx2 = 0.5 + (d * sin (cx * M_PI * 2));
+
+
+      cx = cx2;
+      cy = cy2;
+      cz = cz2;
+    }
+#endif  /* 0 */
+
+    glLoadIdentity();
+
+    gluLookAt ((cx - 0.5) * 8,         /* Position the camera */
+               (cy - 0.5) * 8,
+               (cz - 0.5) * 8,
+               0, 0, 0,
+               0, 1, 0);
+
+    gltrackball_rotate (bp->trackball);        /* Apply mouse-based camera position */
+
+
+    /* Place the lights relative to the object, before the object has
+       been rotated or wandered within the scene. */
+    glLightfv(GL_LIGHT0, GL_POSITION, light0_pos);
+    glLightfv(GL_LIGHT1, GL_POSITION, light1_pos);
+    glLightfv(GL_LIGHT2, GL_POSITION, light2_pos);
+
+
+    /* Position the lamp in the scene according to the "wander" settings */
+    glTranslatef ((px - 0.5), (py - 0.5), (pz - 0.5));
+
+    /* Rotate the object according to the "spin" settings */
+    glRotatef (rx * 360, 1.0, 0.0, 0.0);
+    glRotatef (ry * 360, 0.0, 1.0, 0.0);
+    glRotatef (rz * 360, 0.0, 0.0, 1.0);
+
+    /* Move the lamp up slightly: make 0,0 be at its vertical center. */
+    switch (bp->style)
+      {
+      case CLASSIC: glTranslatef (0, 0, 0.33); break;
+      case GIANT:   glTranslatef (0, 0, 0.33); break;
+      case CONE:    glTranslatef (0, 0, 0.16); break;
+      case ROCKET:  glTranslatef (0, 0, 0.30);
+                    glScalef (0.85,0.85,0.85); break;
+      default: abort(); break;
+      }
+  }
+
+  animate_lava (mi);
+
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+  glCallList (bp->bottle_list);
+  glCallList (bp->ball_list);
+  glPopMatrix ();
+
+  if (mi->fps_p) do_fps (mi);
+  glFinish();
+
+  glXSwapBuffers(dpy, window);
+}
+
+#endif /* USE_GL */
diff --git a/hacks/glx/lavalite.man b/hacks/glx/lavalite.man
new file mode 100644 (file)
index 0000000..4f29062
--- /dev/null
@@ -0,0 +1,162 @@
+.de EX         \"Begin example
+.ne 5
+.if n .sp 1
+.if t .sp .5
+.nf
+.in +.5i
+..
+.de EE
+.fi
+.in -.5i
+.if n .sp 1
+.if t .sp .5
+..
+.TH XScreenSaver 1 "18-May-2002" "X Version 11"
+.SH NAME
+lavaite - 3D OpenGL simulation of a Lavalite.
+.SH SYNOPSIS
+.B starwars
+[\-display \fIhost:display.screen\fP] [\-window] [\-root]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP] [\-fps]
+[\-style \fIstyle\fP ]
+[\-spin \fIxyz\fP ] [\-no-spin ]
+[\-speed \fIfloat\fP ]
+[\-resolution \fIinteger\fP ]
+[\-count \fIinteger\fP ]
+[\-no-smooth ]
+[\-wireframe ]
+[\-impatient ]
+[\-lava-color \fIcolor\fP ]
+[\-fluid-color \fIcolor\fP ]
+[\-base-color \fIcolor\fP ]
+[\-table-color \fIcolor\fP ]
+[\-fluid-texture \fIfilename\fP ]
+[\-base-texture \fIfilename\fP ]
+[\-table-texture \fIfilename\fP ]
+.SH DESCRIPTION
+The \fIlavalite\fP program displays a 3D simulation of the famous lamp
+of the same name.  It requires a fast computer with fast OpenGL support.
+.SH OPTIONS
+.I lavalite
+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 \-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 \-style \fIstyle\fP\fP
+Specify which model of lamp to draw.  Available models 
+are: \fBClassic\fP, \fBGiant\fP, \fBCone\fP, and \fBRocket\fP.
+Default: random.
+.TP 8
+.B \-spin \fIxyz\fP
+Around which axes the model should auto-spin.  Defaults to "Z", meaning
+it rotates horizontally, but otherwise pitch or roll.
+.TP 8
+.B \-no-spin
+Same as \fB\-spin ''\fP.
+.TP 8
+.B \-speed \fIfloat\fP
+A number controlling the frequency at which new blobs launch: you can
+think of this as being related to the the heat of the lightbulb in
+the base.  Default: 0.003.
+.TP 8
+.B \-delay \fIusecs\fP
+The delay between steps of the animation; default is 40000 (1/25th second.)
+.TP 8
+.B \-resolution \fIinteger\fP
+The size of the grid from which the mesh is created that is used
+to polygonize the blobs.  higher values will give very smooth looking
+blobs, at the expense of speed.  Default: 40.
+
+The options "-resolution 10 -no-smooth" look kind of interesting.
+.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.
+.TP 8
+.B \-count \fIinteger\fP
+The maximum number of blobs that can be in motion at once.
+Default: 3.
+.TP 8
+.B \-no-smooth
+Turn off smoothing: the objects in the scene will be facetted.
+.TP 8
+.B \-wireframe
+Render all objects in wireframe instead of as solids.
+.TP 8
+.B \-impatient
+Provide this option if you are.  This will pre-warm the lamp, so when it
+starts up, the first frame will show a blob already halfway up the lamp.
+.TP 8
+.B \-lava-color \fIcolor\fP
+Specifies the color of the blobbies.  Default: red.
+.TP 8
+.B \-fluid-color \fIcolor\fP
+Specifies the color of the fluid that the blobbies float in.
+Default: light blue.
+.TP 8
+.B \-base-color \fIcolor\fP
+Specifies the color of the lamp base, and the cap on top of the bottle.
+Default: very dark gray.
+.TP 8
+.B \-table-color \fIcolor\fP
+Specifies the color of the table that the lamp is sitting on.
+Default: black (meaning it is invisible.)
+.TP 8
+.B \-fluid-texture \fIfilename\fP
+An image file to wrap around the glass.
+
+Note that on most systems, GL textures must have dimensions that are a
+power of two.
+
+Note also that colors and textures are both applied: so, if you apply a
+texture and it isn't showing up, try specifying the corresponding color
+as "white".  Otherwise, the combination of the two might be too dark to
+see.
+.TP 8
+.B \-base-texture \fIfilename\fP
+An image file to wrap around the base of the lamp, and the cap on top
+of the bottle.
+.TP 8
+.B \-table-texture \fItexture\fP
+An image file to spread across the table that the lamp is sitting on.
+.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),
+ http://www.lavaworld.com/
+ http://www.lavarnd.org/
+.SH COPYRIGHT
+Copyright \(co 2002 by Jamie Zawinski.
+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.
+
+LAVA LITE\(rg and the configuration of the LAVA\(rg brand motion lamp
+are registered trademarks of Haggerty Enterprises, Inc.  The
+configuration of the globe and base of the motion lamp are registered
+trademarks of Haggerty Enterprises, Inc. in the U.S.A. and in other
+countries around the world.
+
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>
diff --git a/hacks/glx/marching.c b/hacks/glx/marching.c
new file mode 100644 (file)
index 0000000..a4cafb4
--- /dev/null
@@ -0,0 +1,671 @@
+/* xscreensaver, Copyright (c) 2002 Jamie Zawinski <jwz@jwz.org>
+ * Utility functions to create "marching cubes" meshes from 3d fields.
+ *
+ * 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.
+ *
+ * Marching cubes implementation by Paul Bourke <pbourke@swin.edu.au>
+ * http://astronomy.swin.edu.au/~pbourke/modelling/polygonise/
+ */
+
+#include "config.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include "marching.h"
+
+extern char *progname;
+
+#undef ABS
+#define ABS(x) ((x)<0?(-(x)):(x))
+
+typedef struct {
+   double x,y,z;
+} XYZ;
+
+typedef struct {
+   XYZ p[3];
+} TRIANGLE;
+
+typedef struct {
+   XYZ p[8];
+   double val[8];
+} GRIDCELL;
+
+
+/* Indexing convention:
+
+             Vertices:                    Edges:
+
+          4  ______________ 5           ______________
+           /|            /|           /|     4      /|
+          / |         6 / |       7  / |8        5 / |
+      7  /_____________/  |        /______________/  | 9
+        |   |         |   |        |   |   6     |   |
+        | 0 |_________|___| 1      |   |_________|10_|
+        |  /          |  /      11 | 3/     0    |  /
+        | /           | /          | /           | / 1
+      3 |/____________|/ 2         |/____________|/
+                                          2
+ */
+
+static const int edgeTable[256] = {
+  0x0  , 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c,
+  0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00,
+  0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c,
+  0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90,
+  0x230, 0x339, 0x33 , 0x13a, 0x636, 0x73f, 0x435, 0x53c,
+  0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30,
+  0x3a0, 0x2a9, 0x1a3, 0xaa , 0x7a6, 0x6af, 0x5a5, 0x4ac,
+  0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0,
+  0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c,
+  0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60,
+  0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff , 0x3f5, 0x2fc,
+  0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0,
+  0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55 , 0x15c,
+  0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950,
+  0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc ,
+  0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0,
+  0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc,
+  0xcc , 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0,
+  0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c,
+  0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650,
+  0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc,
+  0x2fc, 0x3f5, 0xff , 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0,
+  0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c,
+  0x36c, 0x265, 0x16f, 0x66 , 0x76a, 0x663, 0x569, 0x460,
+  0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac,
+  0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa , 0x1a3, 0x2a9, 0x3a0,
+  0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c,
+  0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33 , 0x339, 0x230,
+  0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c,
+  0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99 , 0x190,
+  0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c,
+  0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0
+};
+
+static const int triTable[256][16] = {
+  {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 0,  8,  3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 0,  1,  9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 1,  8,  3,  9,  8,  1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 1,  2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 0,  8,  3,  1,  2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 9,  2, 10,  0,  2,  9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 2,  8,  3,  2, 10,  8, 10,  9,  8, -1, -1, -1, -1, -1, -1, -1},
+  { 3, 11,  2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 0, 11,  2,  8, 11,  0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 1,  9,  0,  2,  3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 1, 11,  2,  1,  9, 11,  9,  8, 11, -1, -1, -1, -1, -1, -1, -1},
+  { 3, 10,  1, 11, 10,  3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 0, 10,  1,  0,  8, 10,  8, 11, 10, -1, -1, -1, -1, -1, -1, -1},
+  { 3,  9,  0,  3, 11,  9, 11, 10,  9, -1, -1, -1, -1, -1, -1, -1},
+  { 9,  8, 10, 10,  8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 4,  7,  8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 4,  3,  0,  7,  3,  4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 0,  1,  9,  8,  4,  7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 4,  1,  9,  4,  7,  1,  7,  3,  1, -1, -1, -1, -1, -1, -1, -1},
+  { 1,  2, 10,  8,  4,  7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 3,  4,  7,  3,  0,  4,  1,  2, 10, -1, -1, -1, -1, -1, -1, -1},
+  { 9,  2, 10,  9,  0,  2,  8,  4,  7, -1, -1, -1, -1, -1, -1, -1},
+  { 2, 10,  9,  2,  9,  7,  2,  7,  3,  7,  9,  4, -1, -1, -1, -1},
+  { 8,  4,  7,  3, 11,  2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  {11,  4,  7, 11,  2,  4,  2,  0,  4, -1, -1, -1, -1, -1, -1, -1},
+  { 9,  0,  1,  8,  4,  7,  2,  3, 11, -1, -1, -1, -1, -1, -1, -1},
+  { 4,  7, 11,  9,  4, 11,  9, 11,  2,  9,  2,  1, -1, -1, -1, -1},
+  { 3, 10,  1,  3, 11, 10,  7,  8,  4, -1, -1, -1, -1, -1, -1, -1},
+  { 1, 11, 10,  1,  4, 11,  1,  0,  4,  7, 11,  4, -1, -1, -1, -1},
+  { 4,  7,  8,  9,  0, 11,  9, 11, 10, 11,  0,  3, -1, -1, -1, -1},
+  { 4,  7, 11,  4, 11,  9,  9, 11, 10, -1, -1, -1, -1, -1, -1, -1},
+  { 9,  5,  4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 9,  5,  4,  0,  8,  3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 0,  5,  4,  1,  5,  0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 8,  5,  4,  8,  3,  5,  3,  1,  5, -1, -1, -1, -1, -1, -1, -1},
+  { 1,  2, 10,  9,  5,  4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 3,  0,  8,  1,  2, 10,  4,  9,  5, -1, -1, -1, -1, -1, -1, -1},
+  { 5,  2, 10,  5,  4,  2,  4,  0,  2, -1, -1, -1, -1, -1, -1, -1},
+  { 2, 10,  5,  3,  2,  5,  3,  5,  4,  3,  4,  8, -1, -1, -1, -1},
+  { 9,  5,  4,  2,  3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 0, 11,  2,  0,  8, 11,  4,  9,  5, -1, -1, -1, -1, -1, -1, -1},
+  { 0,  5,  4,  0,  1,  5,  2,  3, 11, -1, -1, -1, -1, -1, -1, -1},
+  { 2,  1,  5,  2,  5,  8,  2,  8, 11,  4,  8,  5, -1, -1, -1, -1},
+  {10,  3, 11, 10,  1,  3,  9,  5,  4, -1, -1, -1, -1, -1, -1, -1},
+  { 4,  9,  5,  0,  8,  1,  8, 10,  1,  8, 11, 10, -1, -1, -1, -1},
+  { 5,  4,  0,  5,  0, 11,  5, 11, 10, 11,  0,  3, -1, -1, -1, -1},
+  { 5,  4,  8,  5,  8, 10, 10,  8, 11, -1, -1, -1, -1, -1, -1, -1},
+  { 9,  7,  8,  5,  7,  9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 9,  3,  0,  9,  5,  3,  5,  7,  3, -1, -1, -1, -1, -1, -1, -1},
+  { 0,  7,  8,  0,  1,  7,  1,  5,  7, -1, -1, -1, -1, -1, -1, -1},
+  { 1,  5,  3,  3,  5,  7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 9,  7,  8,  9,  5,  7, 10,  1,  2, -1, -1, -1, -1, -1, -1, -1},
+  {10,  1,  2,  9,  5,  0,  5,  3,  0,  5,  7,  3, -1, -1, -1, -1},
+  { 8,  0,  2,  8,  2,  5,  8,  5,  7, 10,  5,  2, -1, -1, -1, -1},
+  { 2, 10,  5,  2,  5,  3,  3,  5,  7, -1, -1, -1, -1, -1, -1, -1},
+  { 7,  9,  5,  7,  8,  9,  3, 11,  2, -1, -1, -1, -1, -1, -1, -1},
+  { 9,  5,  7,  9,  7,  2,  9,  2,  0,  2,  7, 11, -1, -1, -1, -1},
+  { 2,  3, 11,  0,  1,  8,  1,  7,  8,  1,  5,  7, -1, -1, -1, -1},
+  {11,  2,  1, 11,  1,  7,  7,  1,  5, -1, -1, -1, -1, -1, -1, -1},
+  { 9,  5,  8,  8,  5,  7, 10,  1,  3, 10,  3, 11, -1, -1, -1, -1},
+  { 5,  7,  0,  5,  0,  9,  7, 11,  0,  1,  0, 10, 11, 10,  0, -1},
+  {11, 10,  0, 11,  0,  3, 10,  5,  0,  8,  0,  7,  5,  7,  0, -1},
+  {11, 10,  5,  7, 11,  5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  {10,  6,  5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 0,  8,  3,  5, 10,  6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 9,  0,  1,  5, 10,  6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 1,  8,  3,  1,  9,  8,  5, 10,  6, -1, -1, -1, -1, -1, -1, -1},
+  { 1,  6,  5,  2,  6,  1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 1,  6,  5,  1,  2,  6,  3,  0,  8, -1, -1, -1, -1, -1, -1, -1},
+  { 9,  6,  5,  9,  0,  6,  0,  2,  6, -1, -1, -1, -1, -1, -1, -1},
+  { 5,  9,  8,  5,  8,  2,  5,  2,  6,  3,  2,  8, -1, -1, -1, -1},
+  { 2,  3, 11, 10,  6,  5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  {11,  0,  8, 11,  2,  0, 10,  6,  5, -1, -1, -1, -1, -1, -1, -1},
+  { 0,  1,  9,  2,  3, 11,  5, 10,  6, -1, -1, -1, -1, -1, -1, -1},
+  { 5, 10,  6,  1,  9,  2,  9, 11,  2,  9,  8, 11, -1, -1, -1, -1},
+  { 6,  3, 11,  6,  5,  3,  5,  1,  3, -1, -1, -1, -1, -1, -1, -1},
+  { 0,  8, 11,  0, 11,  5,  0,  5,  1,  5, 11,  6, -1, -1, -1, -1},
+  { 3, 11,  6,  0,  3,  6,  0,  6,  5,  0,  5,  9, -1, -1, -1, -1},
+  { 6,  5,  9,  6,  9, 11, 11,  9,  8, -1, -1, -1, -1, -1, -1, -1},
+  { 5, 10,  6,  4,  7,  8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 4,  3,  0,  4,  7,  3,  6,  5, 10, -1, -1, -1, -1, -1, -1, -1},
+  { 1,  9,  0,  5, 10,  6,  8,  4,  7, -1, -1, -1, -1, -1, -1, -1},
+  {10,  6,  5,  1,  9,  7,  1,  7,  3,  7,  9,  4, -1, -1, -1, -1},
+  { 6,  1,  2,  6,  5,  1,  4,  7,  8, -1, -1, -1, -1, -1, -1, -1},
+  { 1,  2,  5,  5,  2,  6,  3,  0,  4,  3,  4,  7, -1, -1, -1, -1},
+  { 8,  4,  7,  9,  0,  5,  0,  6,  5,  0,  2,  6, -1, -1, -1, -1},
+  { 7,  3,  9,  7,  9,  4,  3,  2,  9,  5,  9,  6,  2,  6,  9, -1},
+  { 3, 11,  2,  7,  8,  4, 10,  6,  5, -1, -1, -1, -1, -1, -1, -1},
+  { 5, 10,  6,  4,  7,  2,  4,  2,  0,  2,  7, 11, -1, -1, -1, -1},
+  { 0,  1,  9,  4,  7,  8,  2,  3, 11,  5, 10,  6, -1, -1, -1, -1},
+  { 9,  2,  1,  9, 11,  2,  9,  4, 11,  7, 11,  4,  5, 10,  6, -1},
+  { 8,  4,  7,  3, 11,  5,  3,  5,  1,  5, 11,  6, -1, -1, -1, -1},
+  { 5,  1, 11,  5, 11,  6,  1,  0, 11,  7, 11,  4,  0,  4, 11, -1},
+  { 0,  5,  9,  0,  6,  5,  0,  3,  6, 11,  6,  3,  8,  4,  7, -1},
+  { 6,  5,  9,  6,  9, 11,  4,  7,  9,  7, 11,  9, -1, -1, -1, -1},
+  {10,  4,  9,  6,  4, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 4, 10,  6,  4,  9, 10,  0,  8,  3, -1, -1, -1, -1, -1, -1, -1},
+  {10,  0,  1, 10,  6,  0,  6,  4,  0, -1, -1, -1, -1, -1, -1, -1},
+  { 8,  3,  1,  8,  1,  6,  8,  6,  4,  6,  1, 10, -1, -1, -1, -1},
+  { 1,  4,  9,  1,  2,  4,  2,  6,  4, -1, -1, -1, -1, -1, -1, -1},
+  { 3,  0,  8,  1,  2,  9,  2,  4,  9,  2,  6,  4, -1, -1, -1, -1},
+  { 0,  2,  4,  4,  2,  6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 8,  3,  2,  8,  2,  4,  4,  2,  6, -1, -1, -1, -1, -1, -1, -1},
+  {10,  4,  9, 10,  6,  4, 11,  2,  3, -1, -1, -1, -1, -1, -1, -1},
+  { 0,  8,  2,  2,  8, 11,  4,  9, 10,  4, 10,  6, -1, -1, -1, -1},
+  { 3, 11,  2,  0,  1,  6,  0,  6,  4,  6,  1, 10, -1, -1, -1, -1},
+  { 6,  4,  1,  6,  1, 10,  4,  8,  1,  2,  1, 11,  8, 11,  1, -1},
+  { 9,  6,  4,  9,  3,  6,  9,  1,  3, 11,  6,  3, -1, -1, -1, -1},
+  { 8, 11,  1,  8,  1,  0, 11,  6,  1,  9,  1,  4,  6,  4,  1, -1},
+  { 3, 11,  6,  3,  6,  0,  0,  6,  4, -1, -1, -1, -1, -1, -1, -1},
+  { 6,  4,  8, 11,  6,  8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 7, 10,  6,  7,  8, 10,  8,  9, 10, -1, -1, -1, -1, -1, -1, -1},
+  { 0,  7,  3,  0, 10,  7,  0,  9, 10,  6,  7, 10, -1, -1, -1, -1},
+  {10,  6,  7,  1, 10,  7,  1,  7,  8,  1,  8,  0, -1, -1, -1, -1},
+  {10,  6,  7, 10,  7,  1,  1,  7,  3, -1, -1, -1, -1, -1, -1, -1},
+  { 1,  2,  6,  1,  6,  8,  1,  8,  9,  8,  6,  7, -1, -1, -1, -1},
+  { 2,  6,  9,  2,  9,  1,  6,  7,  9,  0,  9,  3,  7,  3,  9, -1},
+  { 7,  8,  0,  7,  0,  6,  6,  0,  2, -1, -1, -1, -1, -1, -1, -1},
+  { 7,  3,  2,  6,  7,  2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 2,  3, 11, 10,  6,  8, 10,  8,  9,  8,  6,  7, -1, -1, -1, -1},
+  { 2,  0,  7,  2,  7, 11,  0,  9,  7,  6,  7, 10,  9, 10,  7, -1},
+  { 1,  8,  0,  1,  7,  8,  1, 10,  7,  6,  7, 10,  2,  3, 11, -1},
+  {11,  2,  1, 11,  1,  7, 10,  6,  1,  6,  7,  1, -1, -1, -1, -1},
+  { 8,  9,  6,  8,  6,  7,  9,  1,  6, 11,  6,  3,  1,  3,  6, -1},
+  { 0,  9,  1, 11,  6,  7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 7,  8,  0,  7,  0,  6,  3, 11,  0, 11,  6,  0, -1, -1, -1, -1},
+  { 7, 11,  6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 7,  6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 3,  0,  8, 11,  7,  6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 0,  1,  9, 11,  7,  6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 8,  1,  9,  8,  3,  1, 11,  7,  6, -1, -1, -1, -1, -1, -1, -1},
+  {10,  1,  2,  6, 11,  7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 1,  2, 10,  3,  0,  8,  6, 11,  7, -1, -1, -1, -1, -1, -1, -1},
+  { 2,  9,  0,  2, 10,  9,  6, 11,  7, -1, -1, -1, -1, -1, -1, -1},
+  { 6, 11,  7,  2, 10,  3, 10,  8,  3, 10,  9,  8, -1, -1, -1, -1},
+  { 7,  2,  3,  6,  2,  7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 7,  0,  8,  7,  6,  0,  6,  2,  0, -1, -1, -1, -1, -1, -1, -1},
+  { 2,  7,  6,  2,  3,  7,  0,  1,  9, -1, -1, -1, -1, -1, -1, -1},
+  { 1,  6,  2,  1,  8,  6,  1,  9,  8,  8,  7,  6, -1, -1, -1, -1},
+  {10,  7,  6, 10,  1,  7,  1,  3,  7, -1, -1, -1, -1, -1, -1, -1},
+  {10,  7,  6,  1,  7, 10,  1,  8,  7,  1,  0,  8, -1, -1, -1, -1},
+  { 0,  3,  7,  0,  7, 10,  0, 10,  9,  6, 10,  7, -1, -1, -1, -1},
+  { 7,  6, 10,  7, 10,  8,  8, 10,  9, -1, -1, -1, -1, -1, -1, -1},
+  { 6,  8,  4, 11,  8,  6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 3,  6, 11,  3,  0,  6,  0,  4,  6, -1, -1, -1, -1, -1, -1, -1},
+  { 8,  6, 11,  8,  4,  6,  9,  0,  1, -1, -1, -1, -1, -1, -1, -1},
+  { 9,  4,  6,  9,  6,  3,  9,  3,  1, 11,  3,  6, -1, -1, -1, -1},
+  { 6,  8,  4,  6, 11,  8,  2, 10,  1, -1, -1, -1, -1, -1, -1, -1},
+  { 1,  2, 10,  3,  0, 11,  0,  6, 11,  0,  4,  6, -1, -1, -1, -1},
+  { 4, 11,  8,  4,  6, 11,  0,  2,  9,  2, 10,  9, -1, -1, -1, -1},
+  {10,  9,  3, 10,  3,  2,  9,  4,  3, 11,  3,  6,  4,  6,  3, -1},
+  { 8,  2,  3,  8,  4,  2,  4,  6,  2, -1, -1, -1, -1, -1, -1, -1},
+  { 0,  4,  2,  4,  6,  2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 1,  9,  0,  2,  3,  4,  2,  4,  6,  4,  3,  8, -1, -1, -1, -1},
+  { 1,  9,  4,  1,  4,  2,  2,  4,  6, -1, -1, -1, -1, -1, -1, -1},
+  { 8,  1,  3,  8,  6,  1,  8,  4,  6,  6, 10,  1, -1, -1, -1, -1},
+  {10,  1,  0, 10,  0,  6,  6,  0,  4, -1, -1, -1, -1, -1, -1, -1},
+  { 4,  6,  3,  4,  3,  8,  6, 10,  3,  0,  3,  9, 10,  9,  3, -1},
+  {10,  9,  4,  6, 10,  4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 4,  9,  5,  7,  6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 0,  8,  3,  4,  9,  5, 11,  7,  6, -1, -1, -1, -1, -1, -1, -1},
+  { 5,  0,  1,  5,  4,  0,  7,  6, 11, -1, -1, -1, -1, -1, -1, -1},
+  {11,  7,  6,  8,  3,  4,  3,  5,  4,  3,  1,  5, -1, -1, -1, -1},
+  { 9,  5,  4, 10,  1,  2,  7,  6, 11, -1, -1, -1, -1, -1, -1, -1},
+  { 6, 11,  7,  1,  2, 10,  0,  8,  3,  4,  9,  5, -1, -1, -1, -1},
+  { 7,  6, 11,  5,  4, 10,  4,  2, 10,  4,  0,  2, -1, -1, -1, -1},
+  { 3,  4,  8,  3,  5,  4,  3,  2,  5, 10,  5,  2, 11,  7,  6, -1},
+  { 7,  2,  3,  7,  6,  2,  5,  4,  9, -1, -1, -1, -1, -1, -1, -1},
+  { 9,  5,  4,  0,  8,  6,  0,  6,  2,  6,  8,  7, -1, -1, -1, -1},
+  { 3,  6,  2,  3,  7,  6,  1,  5,  0,  5,  4,  0, -1, -1, -1, -1},
+  { 6,  2,  8,  6,  8,  7,  2,  1,  8,  4,  8,  5,  1,  5,  8, -1},
+  { 9,  5,  4, 10,  1,  6,  1,  7,  6,  1,  3,  7, -1, -1, -1, -1},
+  { 1,  6, 10,  1,  7,  6,  1,  0,  7,  8,  7,  0,  9,  5,  4, -1},
+  { 4,  0, 10,  4, 10,  5,  0,  3, 10,  6, 10,  7,  3,  7, 10, -1},
+  { 7,  6, 10,  7, 10,  8,  5,  4, 10,  4,  8, 10, -1, -1, -1, -1},
+  { 6,  9,  5,  6, 11,  9, 11,  8,  9, -1, -1, -1, -1, -1, -1, -1},
+  { 3,  6, 11,  0,  6,  3,  0,  5,  6,  0,  9,  5, -1, -1, -1, -1},
+  { 0, 11,  8,  0,  5, 11,  0,  1,  5,  5,  6, 11, -1, -1, -1, -1},
+  { 6, 11,  3,  6,  3,  5,  5,  3,  1, -1, -1, -1, -1, -1, -1, -1},
+  { 1,  2, 10,  9,  5, 11,  9, 11,  8, 11,  5,  6, -1, -1, -1, -1},
+  { 0, 11,  3,  0,  6, 11,  0,  9,  6,  5,  6,  9,  1,  2, 10, -1},
+  {11,  8,  5, 11,  5,  6,  8,  0,  5, 10,  5,  2,  0,  2,  5, -1},
+  { 6, 11,  3,  6,  3,  5,  2, 10,  3, 10,  5,  3, -1, -1, -1, -1},
+  { 5,  8,  9,  5,  2,  8,  5,  6,  2,  3,  8,  2, -1, -1, -1, -1},
+  { 9,  5,  6,  9,  6,  0,  0,  6,  2, -1, -1, -1, -1, -1, -1, -1},
+  { 1,  5,  8,  1,  8,  0,  5,  6,  8,  3,  8,  2,  6,  2,  8, -1},
+  { 1,  5,  6,  2,  1,  6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 1,  3,  6,  1,  6, 10,  3,  8,  6,  5,  6,  9,  8,  9,  6, -1},
+  {10,  1,  0, 10,  0,  6,  9,  5,  0,  5,  6,  0, -1, -1, -1, -1},
+  { 0,  3,  8,  5,  6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  {10,  5,  6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  {11,  5, 10,  7,  5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  {11,  5, 10, 11,  7,  5,  8,  3,  0, -1, -1, -1, -1, -1, -1, -1},
+  { 5, 11,  7,  5, 10, 11,  1,  9,  0, -1, -1, -1, -1, -1, -1, -1},
+  {10,  7,  5, 10, 11,  7,  9,  8,  1,  8,  3,  1, -1, -1, -1, -1},
+  {11,  1,  2, 11,  7,  1,  7,  5,  1, -1, -1, -1, -1, -1, -1, -1},
+  { 0,  8,  3,  1,  2,  7,  1,  7,  5,  7,  2, 11, -1, -1, -1, -1},
+  { 9,  7,  5,  9,  2,  7,  9,  0,  2,  2, 11,  7, -1, -1, -1, -1},
+  { 7,  5,  2,  7,  2, 11,  5,  9,  2,  3,  2,  8,  9,  8,  2, -1},
+  { 2,  5, 10,  2,  3,  5,  3,  7,  5, -1, -1, -1, -1, -1, -1, -1},
+  { 8,  2,  0,  8,  5,  2,  8,  7,  5, 10,  2,  5, -1, -1, -1, -1},
+  { 9,  0,  1,  5, 10,  3,  5,  3,  7,  3, 10,  2, -1, -1, -1, -1},
+  { 9,  8,  2,  9,  2,  1,  8,  7,  2, 10,  2,  5,  7,  5,  2, -1},
+  { 1,  3,  5,  3,  7,  5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 0,  8,  7,  0,  7,  1,  1,  7,  5, -1, -1, -1, -1, -1, -1, -1},
+  { 9,  0,  3,  9,  3,  5,  5,  3,  7, -1, -1, -1, -1, -1, -1, -1},
+  { 9,  8,  7,  5,  9,  7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 5,  8,  4,  5, 10,  8, 10, 11,  8, -1, -1, -1, -1, -1, -1, -1},
+  { 5,  0,  4,  5, 11,  0,  5, 10, 11, 11,  3,  0, -1, -1, -1, -1},
+  { 0,  1,  9,  8,  4, 10,  8, 10, 11, 10,  4,  5, -1, -1, -1, -1},
+  {10, 11,  4, 10,  4,  5, 11,  3,  4,  9,  4,  1,  3,  1,  4, -1},
+  { 2,  5,  1,  2,  8,  5,  2, 11,  8,  4,  5,  8, -1, -1, -1, -1},
+  { 0,  4, 11,  0, 11,  3,  4,  5, 11,  2, 11,  1,  5,  1, 11, -1},
+  { 0,  2,  5,  0,  5,  9,  2, 11,  5,  4,  5,  8, 11,  8,  5, -1},
+  { 9,  4,  5,  2, 11,  3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 2,  5, 10,  3,  5,  2,  3,  4,  5,  3,  8,  4, -1, -1, -1, -1},
+  { 5, 10,  2,  5,  2,  4,  4,  2,  0, -1, -1, -1, -1, -1, -1, -1},
+  { 3, 10,  2,  3,  5, 10,  3,  8,  5,  4,  5,  8,  0,  1,  9, -1},
+  { 5, 10,  2,  5,  2,  4,  1,  9,  2,  9,  4,  2, -1, -1, -1, -1},
+  { 8,  4,  5,  8,  5,  3,  3,  5,  1, -1, -1, -1, -1, -1, -1, -1},
+  { 0,  4,  5,  1,  0,  5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 8,  4,  5,  8,  5,  3,  9,  0,  5,  0,  3,  5, -1, -1, -1, -1},
+  { 9,  4,  5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 4, 11,  7,  4,  9, 11,  9, 10, 11, -1, -1, -1, -1, -1, -1, -1},
+  { 0,  8,  3,  4,  9,  7,  9, 11,  7,  9, 10, 11, -1, -1, -1, -1},
+  { 1, 10, 11,  1, 11,  4,  1,  4,  0,  7,  4, 11, -1, -1, -1, -1},
+  { 3,  1,  4,  3,  4,  8,  1, 10,  4,  7,  4, 11, 10, 11,  4, -1},
+  { 4, 11,  7,  9, 11,  4,  9,  2, 11,  9,  1,  2, -1, -1, -1, -1},
+  { 9,  7,  4,  9, 11,  7,  9,  1, 11,  2, 11,  1,  0,  8,  3, -1},
+  {11,  7,  4, 11,  4,  2,  2,  4,  0, -1, -1, -1, -1, -1, -1, -1},
+  {11,  7,  4, 11,  4,  2,  8,  3,  4,  3,  2,  4, -1, -1, -1, -1},
+  { 2,  9, 10,  2,  7,  9,  2,  3,  7,  7,  4,  9, -1, -1, -1, -1},
+  { 9, 10,  7,  9,  7,  4, 10,  2,  7,  8,  7,  0,  2,  0,  7, -1},
+  { 3,  7, 10,  3, 10,  2,  7,  4, 10,  1, 10,  0,  4,  0, 10, -1},
+  { 1, 10,  2,  8,  7,  4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 4,  9,  1,  4,  1,  7,  7,  1,  3, -1, -1, -1, -1, -1, -1, -1},
+  { 4,  9,  1,  4,  1,  7,  0,  8,  1,  8,  7,  1, -1, -1, -1, -1},
+  { 4,  0,  3,  7,  4,  3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 4,  8,  7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 9, 10,  8, 10, 11,  8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 3,  0,  9,  3,  9, 11, 11,  9, 10, -1, -1, -1, -1, -1, -1, -1},
+  { 0,  1, 10,  0, 10,  8,  8, 10, 11, -1, -1, -1, -1, -1, -1, -1},
+  { 3,  1, 10, 11,  3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 1,  2, 11,  1, 11,  9,  9, 11,  8, -1, -1, -1, -1, -1, -1, -1},
+  { 3,  0,  9,  3,  9, 11,  1,  2,  9,  2, 11,  9, -1, -1, -1, -1},
+  { 0,  2, 11,  8,  0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 3,  2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 2,  3,  8,  2,  8, 10, 10,  8,  9, -1, -1, -1, -1, -1, -1, -1},
+  { 9, 10,  2,  0,  9,  2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 2,  3,  8,  2,  8, 10,  0,  1,  8,  1, 10,  8, -1, -1, -1, -1},
+  { 1, 10,  2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 1,  3,  8,  9,  1,  8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 0,  9,  1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  { 0,  3,  8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+  {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}
+};
+
+
+
+/* Linearly interpolate the position where an isosurface cuts
+   an edge between two vertices, each with their own scalar value
+*/
+static XYZ
+interp_vertex (double isolevel, XYZ p1, XYZ p2, double valp1, double valp2)
+{
+  double mu;
+  XYZ p;
+
+  if (ABS(isolevel-valp1) < 0.00001)
+    return(p1);
+  if (ABS(isolevel-valp2) < 0.00001)
+    return(p2);
+  if (ABS(valp1-valp2) < 0.00001)
+    return(p1);
+  mu = (isolevel - valp1) / (valp2 - valp1);
+  p.x = p1.x + mu * (p2.x - p1.x);
+  p.y = p1.y + mu * (p2.y - p1.y);
+  p.z = p1.z + mu * (p2.z - p1.z);
+
+  return(p);
+}
+
+
+/* Given a grid cell and an isolevel, calculate the triangular
+   facets required to represent the isosurface through the cell.
+   Return the number of triangular facets.
+   `triangles' will be loaded up with the vertices at most 5 triangular facets.
+   0 will be returned if the grid cell is either totally above
+   of totally below the isolevel.
+
+  By Paul Bourke <pbourke@swin.edu.au>
+*/
+static int
+march_one_cube (GRIDCELL grid, double isolevel, TRIANGLE *triangles)
+{
+  int i, ntriang;
+  int cubeindex;
+  XYZ vertlist[12];
+
+  /*
+    Determine the index into the edge table which
+    tells us which vertices are inside of the surface
+  */
+  cubeindex = 0;
+  if (grid.val[0] < isolevel) cubeindex |= 1;
+  if (grid.val[1] < isolevel) cubeindex |= 2;
+  if (grid.val[2] < isolevel) cubeindex |= 4;
+  if (grid.val[3] < isolevel) cubeindex |= 8;
+  if (grid.val[4] < isolevel) cubeindex |= 16;
+  if (grid.val[5] < isolevel) cubeindex |= 32;
+  if (grid.val[6] < isolevel) cubeindex |= 64;
+  if (grid.val[7] < isolevel) cubeindex |= 128;
+
+  /* Cube is entirely in/out of the surface */
+  if (edgeTable[cubeindex] == 0)
+    return(0);
+
+  /* Find the vertices where the surface intersects the cube */
+  if (edgeTable[cubeindex] & 1)
+    vertlist[0] =
+      interp_vertex (isolevel,grid.p[0],grid.p[1],grid.val[0],grid.val[1]);
+  if (edgeTable[cubeindex] & 2)
+    vertlist[1] =
+      interp_vertex (isolevel,grid.p[1],grid.p[2],grid.val[1],grid.val[2]);
+  if (edgeTable[cubeindex] & 4)
+    vertlist[2] =
+      interp_vertex (isolevel,grid.p[2],grid.p[3],grid.val[2],grid.val[3]);
+  if (edgeTable[cubeindex] & 8)
+    vertlist[3] =
+      interp_vertex (isolevel,grid.p[3],grid.p[0],grid.val[3],grid.val[0]);
+  if (edgeTable[cubeindex] & 16)
+    vertlist[4] =
+      interp_vertex (isolevel,grid.p[4],grid.p[5],grid.val[4],grid.val[5]);
+  if (edgeTable[cubeindex] & 32)
+    vertlist[5] =
+      interp_vertex (isolevel,grid.p[5],grid.p[6],grid.val[5],grid.val[6]);
+  if (edgeTable[cubeindex] & 64)
+    vertlist[6] =
+      interp_vertex (isolevel,grid.p[6],grid.p[7],grid.val[6],grid.val[7]);
+  if (edgeTable[cubeindex] & 128)
+    vertlist[7] =
+      interp_vertex (isolevel,grid.p[7],grid.p[4],grid.val[7],grid.val[4]);
+  if (edgeTable[cubeindex] & 256)
+    vertlist[8] =
+      interp_vertex (isolevel,grid.p[0],grid.p[4],grid.val[0],grid.val[4]);
+  if (edgeTable[cubeindex] & 512)
+    vertlist[9] =
+      interp_vertex (isolevel,grid.p[1],grid.p[5],grid.val[1],grid.val[5]);
+  if (edgeTable[cubeindex] & 1024)
+    vertlist[10] =
+      interp_vertex (isolevel,grid.p[2],grid.p[6],grid.val[2],grid.val[6]);
+  if (edgeTable[cubeindex] & 2048)
+    vertlist[11] =
+      interp_vertex (isolevel,grid.p[3],grid.p[7],grid.val[3],grid.val[7]);
+
+  /* Create the triangle */
+  ntriang = 0;
+  for (i=0; triTable[cubeindex][i] != -1; i+=3)
+    {
+      triangles[ntriang].p[0] = vertlist[triTable[cubeindex][i  ]];
+      triangles[ntriang].p[1] = vertlist[triTable[cubeindex][i+1]];
+      triangles[ntriang].p[2] = vertlist[triTable[cubeindex][i+2]];
+      ntriang++;
+    }
+
+  return(ntriang);
+}
+
+
+/* Walking the grid.  By jwz.
+ */
+
+#include <GL/gl.h>
+
+/* Normalise a vector */
+static void
+normalize (XYZ *p)
+{
+  double length;
+  length = sqrt(p->x * p->x + p->y * p->y + p->z * p->z);
+  if (length != 0) {
+    p->x /= length;
+    p->y /= length;
+    p->z /= length;
+  } else {
+    p->x = 0;
+    p->y = 0;
+    p->z = 0;
+  }       
+}
+
+
+/* Calculate the unit normal at p given two other points 
+   p1,p2 on the surface. The normal points in the direction 
+   of p1 crossproduct p2
+ */
+static void
+do_plane_normal (XYZ p, XYZ p1, XYZ p2)
+{
+  XYZ n, pa, pb;
+  pa.x = p1.x - p.x;
+  pa.y = p1.y - p.y;
+  pa.z = p1.z - p.z;
+  pb.x = p2.x - p.x;
+  pb.y = p2.y - p.y;
+  pb.z = p2.z - p.z;
+  n.x = pa.y * pb.z - pa.z * pb.y;
+  n.y = pa.z * pb.x - pa.x * pb.z;
+  n.z = pa.x * pb.y - pa.y * pb.x;
+  normalize (&n);
+  glNormal3f (n.x, n.y, n.z);
+}
+
+
+/* Computes the normal of the scalar field at the given point,
+   for vertex normals (as opposed to face normals.)
+ */
+static void
+do_function_normal (double x, double y, double z,
+                    double (*compute_fn) (double x, double y, double z,
+                                          void *closure),
+                    void *c)
+{
+  XYZ n;
+  double off = 0.5;
+  n.x = compute_fn (x-off, y, z, c) - compute_fn (x+off, y, z, c);
+  n.y = compute_fn (x, y-off, z, c) - compute_fn (x, y+off, z, c);
+  n.z = compute_fn (x, y, z-off, c) - compute_fn (x, y, z+off, c);
+  normalize (&n);
+  glNormal3f (n.x, n.y, n.z);
+}
+
+
+/* Given a function capable of generating a value at any XYZ position,
+   creates OpenGL faces for the solids defined.
+
+   init_fn is called at the beginning for initial, and returns an object.
+   free_fn is called at the end.
+
+   compute_fn is called for each XYZ in the specified grid, and returns
+   the double value of that coordinate.  If smoothing is on, then
+   compute_fn will also be called twice more for each emitted vertex,
+   in order to calculate vertex normals (so don't assume it will only
+   be called with values falling on the grid boundaries.)
+
+   Points are inside an object if the are less than `isolevel', and
+   outside otherwise.
+*/
+void
+marching_cubes (int grid_size,     /* density of the mesh */
+                double isolevel,   /* cutoff point for "in" versus "out" */
+                int wireframe_p,   /* wireframe, or solid */
+                int smooth_p,      /* smooth, or faceted */
+
+                void * (*init_fn)    (double grid_size, void *closure1),
+                double (*compute_fn) (double x, double y, double z,
+                                      void *closure2),
+                void   (*free_fn)    (void *closure2),
+                void *closure1,
+
+                unsigned long *polygon_count)
+{
+  int planesize = grid_size * grid_size;
+  int x, y, z;
+  void *closure2 = 0;
+  unsigned long polys = 0;
+  double *layers;
+
+  layers = (double *) calloc (sizeof (*layers), planesize * 2);
+  if (!layers)
+    {
+      fprintf (stderr, "%s: out of memory for %dx%dx%d grid\n",
+               progname, grid_size, grid_size, 2);
+      exit (1);
+    }
+
+  if (init_fn)
+    closure2 = init_fn (grid_size, closure1);
+
+  glFrontFace(GL_CCW);
+  if (!wireframe_p)
+    glBegin (GL_TRIANGLES);
+
+  for (z = 0; z < grid_size; z++)
+    {
+      double *layer0 = (z & 1 ? layers+planesize : layers);
+      double *layer1 = (z & 1 ? layers           : layers+planesize);
+      double *row;
+
+      /* Fill in the XY grid on the currently-bottommost layer. */
+      row = layer1;
+      for (y = 0; y < grid_size; y++, row += grid_size)
+        {
+          double *cell = row;
+          for (x = 0; x < grid_size; x++, cell++)
+            *cell = compute_fn (x, y, z, closure2);
+        }
+
+      /* Now we've completed one layer (an XY slice of Z.)  Now we can
+         generate the polygons that fill the space between this layer
+         and the previous one (unless this is the first layer.)
+      */
+      if (z == 0) continue;
+
+      for (y = 1; y < grid_size; y += 1)
+        for (x = 1; x < grid_size; x += 1)
+          {
+            TRIANGLE tri[6];
+            int i, ntri;
+            GRIDCELL cell;
+
+            /* This is kinda hokey, there ought to be a more efficient
+               way to do this... */
+            cell.p[0].x = x-1; cell.p[0].y = y-1; cell.p[0].z = z-1;
+            cell.p[1].x = x  ; cell.p[1].y = y-1; cell.p[1].z = z-1;
+            cell.p[2].x = x  ; cell.p[2].y = y  ; cell.p[2].z = z-1;
+            cell.p[3].x = x-1; cell.p[3].y = y  ; cell.p[3].z = z-1;
+            cell.p[4].x = x-1; cell.p[4].y = y-1; cell.p[4].z = z  ;
+            cell.p[5].x = x  ; cell.p[5].y = y-1; cell.p[5].z = z  ;
+            cell.p[6].x = x  ; cell.p[6].y = y  ; cell.p[6].z = z  ;
+            cell.p[7].x = x-1; cell.p[7].y = y  ; cell.p[7].z = z  ;
+
+# define GRID(X,Y,WHICH) ((WHICH) \
+                          ? layer1[((Y)*grid_size) + ((X))] \
+                          : layer0[((Y)*grid_size) + ((X))])
+
+            cell.val[0] = GRID (x-1, y-1, 0);
+            cell.val[1] = GRID (x  , y-1, 0);
+            cell.val[2] = GRID (x  , y  , 0);
+            cell.val[3] = GRID (x-1, y  , 0);
+            cell.val[4] = GRID (x-1, y-1, 1);
+            cell.val[5] = GRID (x  , y-1, 1);
+            cell.val[6] = GRID (x  , y  , 1);
+            cell.val[7] = GRID (x-1, y  , 1);
+# undef GRID
+
+            /* Now generate the triangles for this cubic segment,
+               and emit the GL faces.
+            */
+            ntri = march_one_cube (cell, isolevel, tri);
+            polys += ntri;
+            for (i = 0; i < ntri; i++)
+              {
+                if (wireframe_p) glBegin (GL_LINE_LOOP);
+
+                /* If we're smoothing, we need to call the field function
+                   again for each vertex (via function_normal().)  If we're
+                   not smoothing, then we can just compute the normal from
+                   this triangle.
+                 */
+                if (!smooth_p)
+                  do_plane_normal (tri[i].p[0], tri[i].p[1], tri[i].p[2]);
+
+# define VERT(X,Y,Z) \
+                if (smooth_p) \
+                  do_function_normal ((X), (Y), (Z), compute_fn, closure2); \
+                glVertex3f ((X), (Y), (Z))
+
+                VERT (tri[i].p[0].x, tri[i].p[0].y, tri[i].p[0].z);
+                VERT (tri[i].p[1].x, tri[i].p[1].y, tri[i].p[1].z);
+                VERT (tri[i].p[2].x, tri[i].p[2].y, tri[i].p[2].z);
+# undef VERT
+                if (wireframe_p) glEnd ();
+              }
+          }
+    }
+
+  if (!wireframe_p)
+    glEnd ();
+
+  free (layers);
+
+  if (free_fn)
+    free_fn (closure2);
+
+  if (polygon_count)
+    *polygon_count = polys;
+}
diff --git a/hacks/glx/marching.h b/hacks/glx/marching.h
new file mode 100644 (file)
index 0000000..755545d
--- /dev/null
@@ -0,0 +1,48 @@
+/* xscreensaver, Copyright (c) 2002 Jamie Zawinski <jwz@jwz.org>
+ * Utility functions to create "marching cubes" meshes from 3d fields.
+ *
+ * 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.
+ */
+
+#ifndef __MARCHING_H__
+#define __MARCHING_H__
+
+/* Given a function capable of generating a value at any XYZ position,
+   creates OpenGL faces for the solids defined.
+
+   init_fn is called at the beginning for initial, and returns an object.
+   free_fn is called at the end.
+
+   compute_fn is called for each XYZ in the specified grid, and returns
+   the double value of that coordinate.  If smoothing is on, then
+   compute_fn will also be called twice more for each emitted vertex,
+   in order to calculate vertex normals (so don't assume it will only
+   be called with values falling on the grid boundaries.)
+
+   Points are inside an object if the are less than `isolevel', and
+   outside otherwise.
+
+   If polygon_count is specified, the number of faces generated will be
+   returned there.
+*/
+extern void
+marching_cubes (int grid_size,     /* density of the mesh */
+                double isolevel,   /* cutoff point for "in" versus "out" */
+                int wireframe_p,   /* wireframe, or solid */
+                int smooth_p,      /* smooth, or faceted */
+
+                void * (*init_fn)    (double grid_size, void *closure1),
+                double (*compute_fn) (double x, double y, double z,
+                                      void *closure2),
+                void   (*free_fn)    (void *closure2),
+                void *closure1,
+
+                unsigned long *polygon_count);
+
+#endif /* __MARCHING_H__ */
index 653f7a8c57c6a5af5086a74533c8e34319021cf7..b4f24f18248e4b922166d9c0dff80d6c8a1cd7d9 100644 (file)
@@ -62,6 +62,8 @@ extern XtAppContext app;
 #define HACK_INIT      init_sponge
 #define HACK_DRAW      draw_sponge
 #define HACK_RESHAPE   reshape_sponge
+#define HACK_HANDLE_EVENT sponge_handle_event
+#define EVENT_MASK     PointerMotionMask
 #define sws_opts       xlockmore_opts
 
 #define DEF_SPIN        "True"
@@ -85,6 +87,8 @@ extern XtAppContext app;
 
 #include "xlockmore.h"
 #include "colors.h"
+#include "rotator.h"
+#include "gltrackball.h"
 #include <ctype.h>
 
 #ifdef USE_GL /* whole file */
@@ -111,12 +115,9 @@ typedef struct {
 
 typedef struct {
   GLXContext *glx_context;
-
-  GLfloat rotx, roty, rotz;       /* current object rotation */
-  GLfloat dx, dy, dz;             /* current rotational velocity */
-  GLfloat ddx, ddy, ddz;          /* current rotational acceleration */
-  GLfloat d_max;                  /* max velocity */
-
+  rotator *rot;
+  trackball_state *trackball;
+  Bool button_down_p;
   GLuint sponge_list0;            /* we store X, Y, and Z-facing surfaces */
   GLuint sponge_list1;            /* in their own lists, to make it easy  */
   GLuint sponge_list2;            /* to color them differently.           */
@@ -137,7 +138,7 @@ typedef struct {
 
 static sponge_configuration *sps = NULL;
 
-static char *do_spin;
+static Bool do_spin;
 static Bool do_wander;
 static int speed;
 static Bool do_optimize;
@@ -176,90 +177,18 @@ reshape_sponge (ModeInfo *mi, int width, int height)
 
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
+  gluPerspective (30.0, 1/h, 1.0, 100.0);
 
-  gluPerspective( 30.0, 1/h, 1.0, 100.0 );
-  gluLookAt( 0.0, 0.0, 15.0,
-             0.0, 0.0, 0.0,
-             0.0, 1.0, 0.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
-  glTranslatef(0.0, 0.0, -15.0);
+  gluLookAt( 0.0, 0.0, 30.0,
+             0.0, 0.0, 0.0,
+             0.0, 1.0, 0.0);
 
   glClear(GL_COLOR_BUFFER_BIT);
 }
 
 
-/* lifted from lament.c */
-#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
-static void
-rotate(GLfloat *pos, GLfloat *v, GLfloat *dv, GLfloat max_v)
-{
-  double ppos = *pos;
-
-  /* tick position */
-  if (ppos < 0)
-    ppos = -(ppos + *v);
-  else
-    ppos += *v;
-
-  if (ppos > 1.0)
-    ppos -= 1.0;
-  else if (ppos < 0)
-    ppos += 1.0;
-
-  if (ppos < 0) abort();
-  if (ppos > 1.0) abort();
-  *pos = (*pos > 0 ? ppos : -ppos);
-
-  /* accelerate */
-  *v += *dv;
-
-  /* clamp velocity */
-  if (*v > max_v || *v < -max_v)
-    {
-      *dv = -*dv;
-    }
-  /* If it stops, start it going in the other direction. */
-  else if (*v < 0)
-    {
-      if (random() % 4)
-       {
-         *v = 0;
-
-         /* keep going in the same direction */
-         if (random() % 2)
-           *dv = 0;
-         else if (*dv < 0)
-           *dv = -*dv;
-       }
-      else
-       {
-         /* reverse gears */
-         *v = -*v;
-         *dv = -*dv;
-         *pos = -*pos;
-       }
-    }
-
-  /* Alter direction of rotational acceleration randomly. */
-  if (! (random() % 120))
-    *dv = -*dv;
-
-  /* Change acceleration very occasionally. */
-  if (! (random() % 200))
-    {
-      if (*dv == 0)
-       *dv = 0.00001;
-      else if (random() & 1)
-       *dv *= 1.2;
-      else
-       *dv *= 0.8;
-    }
-}
-
-
 /* Pushes a 1x1x1 cube at XYZ into the sp->squares list.
  */
 static void
@@ -501,6 +430,40 @@ delete_redundant_faces (sponge_configuration *sp)
 }
 
 
+Bool
+sponge_handle_event (ModeInfo *mi, XEvent *event)
+{
+  sponge_configuration *sp = &sps[MI_SCREEN(mi)];
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button & Button1)
+    {
+      sp->button_down_p = True;
+      gltrackball_start (sp->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)
+    {
+      sp->button_down_p = False;
+      return True;
+    }
+  else if (event->xany.type == MotionNotify &&
+           sp->button_down_p)
+    {
+      gltrackball_track (sp->trackball,
+                         event->xmotion.x, event->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+
+  return False;
+}
+
+
+
 void 
 init_sponge (ModeInfo *mi)
 {
@@ -544,20 +507,17 @@ init_sponge (ModeInfo *mi)
       glEnable(GL_CULL_FACE);
     }
 
-  sp->rotx = frand(1.0) * RANDSIGN();
-  sp->roty = frand(1.0) * RANDSIGN();
-  sp->rotz = frand(1.0) * RANDSIGN();
-
-  /* bell curve from 0-3 degrees, avg 1.5 */
-  sp->dx = (frand(1) + frand(1) + frand(1)) / (360/2);
-  sp->dy = (frand(1) + frand(1) + frand(1)) / (360/2);
-  sp->dz = (frand(1) + frand(1) + frand(1)) / (360/2);
-
-  sp->d_max = sp->dx * 2;
-
-  sp->ddx = 0.00006 + frand(0.00003);
-  sp->ddy = 0.00006 + frand(0.00003);
-  sp->ddz = 0.00006 + frand(0.00003);
+  {
+    double spin_speed   = 1.0;
+    double wander_speed = 0.03;
+    sp->rot = make_rotator (do_spin ? spin_speed : 0,
+                            do_spin ? spin_speed : 0,
+                            do_spin ? spin_speed : 0,
+                            1.0,
+                            do_wander ? wander_speed : 0,
+                            True);
+    sp->trackball = gltrackball_init ();
+  }
 
   sp->ncolors = 128;
   sp->colors = (XColor *) calloc(sp->ncolors, sizeof(XColor));
@@ -627,39 +587,18 @@ draw_sponge (ModeInfo *mi)
   glScalef(1.1, 1.1, 1.1);
 
   {
-    GLfloat x, y, z;
-
-    if (do_wander)
-      {
-        static int frame = 0;
-
-#       define SINOID(SCALE,SIZE) \
-        ((((1 + sin((frame * (SCALE)) / 2 * M_PI)) / 2.0) * (SIZE)) - (SIZE)/2)
-
-        x = SINOID(0.0071, 8.0);
-        y = SINOID(0.0053, 6.0);
-        z = SINOID(0.0037, 15.0);
-        frame++;
-        glTranslatef(x, y, z);
-      }
-
-    if (do_spin)
-      {
-        x = sp->rotx;
-        y = sp->roty;
-        z = sp->rotz;
-        if (x < 0) x = 1 - (x + 1);
-        if (y < 0) y = 1 - (y + 1);
-        if (z < 0) z = 1 - (z + 1);
-
-        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);
-
-        rotate(&sp->rotx, &sp->dx, &sp->ddx, sp->d_max);
-        rotate(&sp->roty, &sp->dy, &sp->ddy, sp->d_max);
-        rotate(&sp->rotz, &sp->dz, &sp->ddz, sp->d_max);
-      }
+    double x, y, z;
+    get_position (sp->rot, &x, &y, &z, !sp->button_down_p);
+    glTranslatef((x - 0.5) * 8,
+                 (y - 0.5) * 6,
+                 (z - 0.5) * 15);
+
+    gltrackball_rotate (sp->trackball);
+
+    get_rotation (sp->rot, &x, &y, &z, !sp->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);
   }
 
   color0[0] = sp->colors[sp->ccolor0].red   / 65536.0;
diff --git a/hacks/glx/menger.man b/hacks/glx/menger.man
new file mode 100644 (file)
index 0000000..3f702bb
--- /dev/null
@@ -0,0 +1,78 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+menger - 3D menger gasket fractal.
+.SH SYNOPSIS
+.B menger
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-depth \fInumber\fP]
+[\-no-wander]
+[\-no-spin]
+[\-spin \fI[XYZ]\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+This draws the three-dimensional variant of the recursive Menger Gasket, a
+cube-based fractal object analagous to the Sierpinski Tetrahedron.
+.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
+Number of frames before changing shape.  Default: 150.
+.TP 8
+.B \-depth \fInumber\fP
+Max depth to descend.  Default: 3.  You probably don't have enough
+memory for 6.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin [XYZ]
+Around which axes should the object spin?
+.TP 8
+.B \-no-spin
+None.
+.TP 8
+.B \-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 2002 by Jamie Zawinski.  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
+Jamie Zawinski.
index 39229944e0bf3bc92642e4b6dd61ad1c3243b6ed..dcdb0f5e4363e2711a4c53d4f42c4820c3cba485 100644 (file)
@@ -88,6 +88,8 @@ static const char sccsid[] = "@(#)moebius.c   5.01 2001/03/01 xlockmore";
 # define HACK_INIT                     init_moebius
 # define HACK_DRAW                     draw_moebius
 # define HACK_RESHAPE          reshape_moebius
+# define HACK_HANDLE_EVENT     moebius_handle_event
+# define EVENT_MASK                    PointerMotionMask
 # define moebius_opts          xlockmore_opts
 # define DEFAULTS                      "*delay:                20000   \n"                     \
                                                        "*showFPS:      False   \n"                     \
@@ -103,6 +105,8 @@ static const char sccsid[] = "@(#)moebius.c 5.01 2001/03/01 xlockmore";
 
 #include <GL/glu.h>
 #include "e_textures.h"
+#include "rotator.h"
+#include "gltrackball.h"
 
 #define DEF_SOLIDMOEBIUS  "False"
 #define DEF_NOANTS  "False"
@@ -161,12 +165,9 @@ typedef struct {
        GLfloat     step;
        GLfloat     ant_position;
        GLXContext *glx_context;
-
-  GLfloat rotx, roty, rotz;       /* current object rotation */
-  GLfloat dx, dy, dz;             /* current rotational velocity */
-  GLfloat ddx, ddy, ddz;          /* current rotational acceleration */
-  GLfloat d_max;                          /* max velocity */
-
+    rotator    *rot;
+    trackball_state *trackball;
+    Bool        button_down_p;
 } moebiusstruct;
 
 static float front_shininess[] =
@@ -627,92 +628,49 @@ pinit(void)
 
 
 
-/* lifted from lament.c */
-#define RANDSIGN() ((LRAND() & 1) ? 1 : -1)
-#define FLOATRAND(a) (((double)LRAND() / (double)MAXRAND) * a)
-
-static void
-rotate(GLfloat *pos, GLfloat *v, GLfloat *dv, GLfloat max_v, Bool verbose)
+void
+release_moebius(ModeInfo * mi)
 {
-  double ppos = *pos;
-
-  /* tick position */
-  if (ppos < 0)
-    ppos = -(ppos + *v);
-  else
-    ppos += *v;
-
-  if (ppos > 1.0)
-    ppos -= 1.0;
-  else if (ppos < 0)
-    ppos += 1.0;
-
-  if ((ppos < 0.0) || (ppos > 1.0)) {
-    if (verbose) {
-      (void) fprintf(stderr, "Weirdness in rotate()\n");
-      (void) fprintf(stderr, "ppos = %g\n", ppos);
-    }
-    return;
-  }
-
-  *pos = (*pos > 0 ? ppos : -ppos);
+       if (moebius != NULL) {
+               (void) free((void *) moebius);
+               moebius = (moebiusstruct *) NULL;
+       }
+       FreeAllGL(mi);
+}
 
-  /* accelerate */
-  *v += *dv;
+Bool
+moebius_handle_event (ModeInfo *mi, XEvent *event)
+{
+  moebiusstruct *mp = &moebius[MI_SCREEN(mi)];
 
-  /* clamp velocity */
-  if (*v > max_v || *v < -max_v)
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button & Button1)
     {
-      *dv = -*dv;
+      mp->button_down_p = True;
+      gltrackball_start (mp->trackball,
+                         event->xbutton.x, event->xbutton.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
     }
-  /* If it stops, start it going in the other direction. */
-  else if (*v < 0)
+  else if (event->xany.type == ButtonRelease &&
+           event->xbutton.button & Button1)
     {
-      if (random() % 4)
-       {
-         *v = 0;
-
-         /* keep going in the same direction */
-         if (random() % 2)
-           *dv = 0;
-         else if (*dv < 0)
-           *dv = -*dv;
-       }
-      else
-       {
-         /* reverse gears */
-         *v = -*v;
-         *dv = -*dv;
-         *pos = -*pos;
-       }
+      mp->button_down_p = False;
+      return True;
     }
-
-  /* Alter direction of rotational acceleration randomly. */
-  if (! (random() % 120))
-    *dv = -*dv;
-
-  /* Change acceleration very occasionally. */
-  if (! (random() % 200))
+  else if (event->xany.type == MotionNotify &&
+           mp->button_down_p)
     {
-      if (*dv == 0)
-       *dv = 0.00001;
-      else if (random() & 1)
-       *dv *= 1.2;
-      else
-       *dv *= 0.8;
+      gltrackball_track (mp->trackball,
+                         event->xmotion.x, event->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
     }
-}
 
-void
-release_moebius(ModeInfo * mi)
-{
-       if (moebius != NULL) {
-               (void) free((void *) moebius);
-               moebius = (moebiusstruct *) NULL;
-       }
-       FreeAllGL(mi);
+  return False;
 }
 
+
 void
 init_moebius(ModeInfo * mi)
 {
@@ -727,24 +685,11 @@ init_moebius(ModeInfo * mi)
        mp->step = NRAND(90);
        mp->ant_position = NRAND(90);
 
-    mp->rotx = FLOATRAND(1.0) * RANDSIGN();
-    mp->roty = FLOATRAND(1.0) * RANDSIGN();
-    mp->rotz = FLOATRAND(1.0) * RANDSIGN();
-
-    /* bell curve from 0-1.5 degrees, avg 0.75 */
-    mp->dx = (FLOATRAND(1) + FLOATRAND(1) + FLOATRAND(1)) / (360*2);
-    mp->dy = (FLOATRAND(1) + FLOATRAND(1) + FLOATRAND(1)) / (360*2);
-    mp->dz = (FLOATRAND(1) + FLOATRAND(1) + FLOATRAND(1)) / (360*2);
-
-    mp->d_max = mp->dx * 2;
-
-    mp->ddx = 0.00006 + FLOATRAND(0.00003);
-    mp->ddy = 0.00006 + FLOATRAND(0.00003);
-    mp->ddz = 0.00006 + FLOATRAND(0.00003);
-
-    mp->ddx = 0.00001;
-    mp->ddy = 0.00001;
-    mp->ddz = 0.00001;
+    {
+      double rot_speed = 0.3;
+      mp->rot = make_rotator (rot_speed, rot_speed, rot_speed, 1, 0, True);
+      mp->trackball = gltrackball_init ();
+    }
 
        if ((mp->glx_context = init_GL(mi)) != NULL) {
 
@@ -781,6 +726,8 @@ draw_moebius(ModeInfo * mi)
 
        glTranslatef(0.0, 0.0, -10.0);
 
+    gltrackball_rotate (mp->trackball);
+
        if (!MI_IS_ICONIC(mi)) {
                glScalef(Scale4Window * mp->WindH / mp->WindW, Scale4Window, Scale4Window);
        } else {
@@ -788,15 +735,11 @@ draw_moebius(ModeInfo * mi)
        }
 
     {
-      GLfloat x = mp->rotx;
-      GLfloat y = mp->roty;
-      GLfloat z = mp->rotz;
-      if (x < 0) x = 1 - (x + 1);
-      if (y < 0) y = 1 - (y + 1);
-      if (z < 0) z = 1 - (z + 1);
-      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);
+      double x, y, z;
+      get_rotation (mp->rot, &x, &y, &z, !mp->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);
     }
 
        /* moebius */
@@ -807,10 +750,6 @@ draw_moebius(ModeInfo * mi)
 
        glPopMatrix();
 
-    rotate(&mp->rotx, &mp->dx, &mp->ddx, mp->d_max, MI_IS_VERBOSE(mi));
-    rotate(&mp->roty, &mp->dy, &mp->ddy, mp->d_max, MI_IS_VERBOSE(mi));
-    rotate(&mp->rotz, &mp->dz, &mp->ddz, mp->d_max, MI_IS_VERBOSE(mi));
-
     if (MI_IS_FPS(mi)) do_fps (mi);
        glFlush();
 
diff --git a/hacks/glx/moebius.man b/hacks/glx/moebius.man
new file mode 100644 (file)
index 0000000..45b09d8
--- /dev/null
@@ -0,0 +1,65 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+moebius - Escher's Moebuis Strip II, with ants.
+.SH SYNOPSIS
+.B moebius
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[-delay \fInumber\fP]
+[-solidmoebius]
+[-wireframe]
+[-noants]
+[-fps]
+.SH DESCRIPTION
+Another M. C. Escher hack by Marcelo Vianna, this one draws ``Moebius Strip
+II,'' a GL image of ants walking along the surface of a moebius strip. 
+.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 \-solidmoebius
+Solid Floor.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-noants | \-no-noants
+Draw Ants.  Boolean.
+.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 2002 by Marcelo Vianna.  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
+Marcelo Vianna.
index c6c59b868ed0e9e8de26793e7a4e72fb2db6ea7d..75010b8ee0b8c17cd798be8a3b10b12fe13ab1f1 100644 (file)
@@ -73,6 +73,8 @@
 #define HACK_INIT      init_molecule
 #define HACK_DRAW      draw_molecule
 #define HACK_RESHAPE   reshape_molecule
+#define HACK_HANDLE_EVENT molecule_handle_event
+#define EVENT_MASK     PointerMotionMask
 #define molecule_opts  xlockmore_opts
 
 #define DEF_TIMEOUT     "20"
 #include "colors.h"
 #include "sphere.h"
 #include "tube.h"
+#include "rotator.h"
+#include "gltrackball.h"
 
 #ifdef USE_GL /* whole file */
 
 #include <stdlib.h>
 #include <ctype.h>
+#include <time.h>
+#include <sys/time.h>
 #include <GL/glu.h>
 
 #define SPHERE_SLICES 16  /* how densely to render spheres */
@@ -186,13 +192,9 @@ typedef struct {
 
 typedef struct {
   GLXContext *glx_context;
-
-  GLfloat rotx, roty, rotz;       /* current object rotation */
-  GLfloat dx, dy, dz;             /* current rotational velocity */
-  GLfloat ddx, ddy, ddz;          /* current rotational acceleration */
-  GLfloat d_max;                  /* max velocity */
-
-  Bool spin_x, spin_y, spin_z;
+  rotator *rot;
+  trackball_state *trackball;
+  Bool button_down_p;
 
   GLfloat molecule_size;          /* max dimension of molecule bounding box */
 
@@ -230,7 +232,7 @@ static XrmOptionDescRec opts[] = {
   { "-molecule", ".molecule", XrmoptionSepArg, 0 },
   { "-timeout",".timeout",XrmoptionSepArg, 0 },
   { "-spin",   ".spin",   XrmoptionSepArg, 0 },
-  { "+spin",   ".spin",   XrmoptionNoArg, "False" },
+  { "+spin",   ".spin",   XrmoptionNoArg, "" },
   { "-wander", ".wander", XrmoptionNoArg, "True" },
   { "+wander", ".wander", XrmoptionNoArg, "False" },
   { "-labels", ".labels", XrmoptionNoArg, "True" },
@@ -977,7 +979,7 @@ parse_pdb_data (molecule *m, const char *data, const char *filename, int line)
       else if (!strncmp (s, "CONECT ", 7))
         {
           int atoms[11];
-          int i = sscanf (s + 8, " %d %d %d %d %d %d %d %d %d %d %d ",
+          int i = sscanf (s + 8, " %d %d %d %d %d %d %d %d %d %d %d %d ",
                           &atoms[0], &atoms[1], &atoms[2], &atoms[3], 
                           &atoms[4], &atoms[5], &atoms[6], &atoms[7], 
                           &atoms[8], &atoms[9], &atoms[10], &atoms[11]);
@@ -1224,15 +1226,13 @@ reshape_molecule (ModeInfo *mi, int width, int height)
 
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
-
-  gluPerspective( 30.0, 1/h, 20.0, 40.0 );
-  gluLookAt( 0.0, 0.0, 15.0,
-             0.0, 0.0, 0.0,
-             0.0, 1.0, 0.0);
+  gluPerspective (30.0, 1/h, 20.0, 40.0);
 
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
-  glTranslatef(0.0, 0.0, -15.0);
+  gluLookAt( 0.0, 0.0, 30.0,
+             0.0, 0.0, 0.0,
+             0.0, 1.0, 0.0);
 
   glClear(GL_COLOR_BUFFER_BIT);
 }
@@ -1256,77 +1256,6 @@ gl_init (ModeInfo *mi)
 }
 
 
-/* lifted from lament.c */
-#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
-static void
-rotate(GLfloat *pos, GLfloat *v, GLfloat *dv, GLfloat max_v)
-{
-  double ppos = *pos;
-
-  /* tick position */
-  if (ppos < 0)
-    ppos = -(ppos + *v);
-  else
-    ppos += *v;
-
-  if (ppos > 1.0)
-    ppos -= 1.0;
-  else if (ppos < 0)
-    ppos += 1.0;
-
-  if (ppos < 0) abort();
-  if (ppos > 1.0) abort();
-  *pos = (*pos > 0 ? ppos : -ppos);
-
-  /* accelerate */
-  *v += *dv;
-
-  /* clamp velocity */
-  if (*v > max_v || *v < -max_v)
-    {
-      *dv = -*dv;
-    }
-  /* If it stops, start it going in the other direction. */
-  else if (*v < 0)
-    {
-      if (random() % 4)
-       {
-         *v = 0;
-
-         /* keep going in the same direction */
-         if (random() % 2)
-           *dv = 0;
-         else if (*dv < 0)
-           *dv = -*dv;
-       }
-      else
-       {
-         /* reverse gears */
-         *v = -*v;
-         *dv = -*dv;
-         *pos = -*pos;
-       }
-    }
-
-  /* Alter direction of rotational acceleration randomly. */
-  if (! (random() % 120))
-    *dv = -*dv;
-
-  /* Change acceleration very occasionally. */
-  if (! (random() % 200))
-    {
-      if (*dv == 0)
-       *dv = 0.00001;
-      else if (random() & 1)
-       *dv *= 1.2;
-      else
-       *dv *= 0.8;
-    }
-}
-
-
 static void
 startup_blurb (ModeInfo *mi)
 {
@@ -1340,6 +1269,39 @@ startup_blurb (ModeInfo *mi)
   glXSwapBuffers(MI_DISPLAY(mi), MI_WINDOW(mi));
 }
 
+Bool
+molecule_handle_event (ModeInfo *mi, XEvent *event)
+{
+  molecule_configuration *mc = &mcs[MI_SCREEN(mi)];
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button & Button1)
+    {
+      mc->button_down_p = True;
+      gltrackball_start (mc->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)
+    {
+      mc->button_down_p = False;
+      return True;
+    }
+  else if (event->xany.type == MotionNotify &&
+           mc->button_down_p)
+    {
+      gltrackball_track (mc->trackball,
+                         event->xmotion.x, event->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+
+  return False;
+}
+
+
 void 
 init_molecule (ModeInfo *mi)
 {
@@ -1367,28 +1329,17 @@ init_molecule (ModeInfo *mi)
 
   wire = MI_IS_WIREFRAME(mi);
 
-  mc->rotx = frand(1.0) * RANDSIGN();
-  mc->roty = frand(1.0) * RANDSIGN();
-  mc->rotz = frand(1.0) * RANDSIGN();
-
-  /* bell curve from 0-6 degrees, avg 3 */
-  mc->dx = (frand(1) + frand(1) + frand(1)) / (360/2);
-  mc->dy = (frand(1) + frand(1) + frand(1)) / (360/2);
-  mc->dz = (frand(1) + frand(1) + frand(1)) / (360/2);
-
-  mc->d_max = mc->dx * 2;
-
-  mc->ddx = 0.00006 + frand(0.00003);
-  mc->ddy = 0.00006 + frand(0.00003);
-  mc->ddz = 0.00006 + frand(0.00003);
-
   {
+    Bool spinx=False, spiny=False, spinz=False;
+    double spin_speed   = 2.0;
+    double wander_speed = 0.03;
+
     char *s = do_spin;
     while (*s)
       {
-        if      (*s == 'x' || *s == 'X') mc->spin_x = 1;
-        else if (*s == 'y' || *s == 'Y') mc->spin_y = 1;
-        else if (*s == 'z' || *s == 'Z') mc->spin_z = 1;
+        if      (*s == 'x' || *s == 'X') spinx = True;
+        else if (*s == 'y' || *s == 'Y') spiny = True;
+        else if (*s == 'z' || *s == 'Z') spinz = True;
         else
           {
             fprintf (stderr,
@@ -1398,6 +1349,14 @@ init_molecule (ModeInfo *mi)
           }
         s++;
       }
+
+    mc->rot = make_rotator (spinx ? spin_speed : 0,
+                            spiny ? spin_speed : 0,
+                            spinz ? spin_speed : 0,
+                            1.0,
+                            do_wander ? wander_speed : 0,
+                            True);
+    mc->trackball = gltrackball_init ();
   }
 
   mc->molecule_dlist = glGenLists(1);
@@ -1428,7 +1387,8 @@ draw_molecule (ModeInfo *mi)
   if (!mc->glx_context)
     return;
 
-  if (last + timeout <= now)   /* randomize molecules every -timeout seconds */
+  if (last + timeout <= now && /* randomize molecules every -timeout seconds */
+      !mc->button_down_p)
     {
       if (mc->nmolecules == 1)
         {
@@ -1474,39 +1434,18 @@ draw_molecule (ModeInfo *mi)
   glScalef(1.1, 1.1, 1.1);
 
   {
-    GLfloat x, y, z;
-
-    if (do_wander)
-      {
-        static int frame = 0;
-
-#       define SINOID(SCALE,SIZE) \
-        ((((1 + sin((frame * (SCALE)) / 2 * M_PI)) / 2.0) * (SIZE)) - (SIZE)/2)
-
-        x = SINOID(0.031, 9.0);
-        y = SINOID(0.023, 9.0);
-        z = SINOID(0.017, 9.0);
-        frame++;
-        glTranslatef(x, y, z);
-      }
-
-    if (mc->spin_x || mc->spin_y || mc->spin_z)
-      {
-        x = mc->rotx;
-        y = mc->roty;
-        z = mc->rotz;
-        if (x < 0) x = 1 - (x + 1);
-        if (y < 0) y = 1 - (y + 1);
-        if (z < 0) z = 1 - (z + 1);
-
-        if (mc->spin_x) glRotatef(x * 360, 1.0, 0.0, 0.0);
-        if (mc->spin_y) glRotatef(y * 360, 0.0, 1.0, 0.0);
-        if (mc->spin_z) glRotatef(z * 360, 0.0, 0.0, 1.0);
-
-        rotate(&mc->rotx, &mc->dx, &mc->ddx, mc->d_max);
-        rotate(&mc->roty, &mc->dy, &mc->ddy, mc->d_max);
-        rotate(&mc->rotz, &mc->dz, &mc->ddz, mc->d_max);
-      }
+    double x, y, z;
+    get_position (mc->rot, &x, &y, &z, !mc->button_down_p);
+    glTranslatef((x - 0.5) * 9,
+                 (y - 0.5) * 9,
+                 (z - 0.5) * 9);
+
+    gltrackball_rotate (mc->trackball);
+
+    get_rotation (mc->rot, &x, &y, &z, !mc->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);
   }
 
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
diff --git a/hacks/glx/morph3d.man b/hacks/glx/morph3d.man
new file mode 100644 (file)
index 0000000..06f716a
--- /dev/null
@@ -0,0 +1,57 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+morph3d - 3d morphing objects.
+.SH SYNOPSIS
+.B morph3d
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-fps]
+.SH DESCRIPTION
+Another 3d shape-changing GL hack. It has the same shiny-plastic feel
+as Superquadrics, as many computer-generated objects do... 
+.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 \-count \fInumber\fP
+0 - 20.  Default: 0.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 40000 (0.04 seconds.).
+.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 2002 by Marcelo Vianna.  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
+Marcelo Vianna.
\ No newline at end of file
diff --git a/hacks/glx/pipes.man b/hacks/glx/pipes.man
new file mode 100644 (file)
index 0000000..2fc7d5a
--- /dev/null
@@ -0,0 +1,85 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+pipes - fill the screen with a plumbing system.
+.SH SYNOPSIS
+.B pipes
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[-count 0]
+[-count 1]
+[-cycles \fInumber\fP]
+[-size \fInumber\fP]
+[-factory \fInumber\fP]
+[-delay \fInumber\fP]
+[-no-fisheye]
+[-tightturns]
+[-db]
+[-fps]
+.SH DESCRIPTION
+If you've ever been in the same room with a Windows NT machine, you've
+probably seen this GL hack.  It fills the screen with a plumbing system.
+.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 \-count 0
+Curved Pipes.
+.TP 8
+.B \-count 1
+Ball Joints.
+.TP 8
+.B \-cycles \fInumber\fP
+Number of pipe systems to draw at once.  Default: 5.
+.TP 8
+.B \-size \fInumber\fP
+Length of each pipe system.  Default: 500.
+.TP 8
+.B \-factory \fInumber\fP
+How much gadgetry to create; Useful range is 0-10.  Default: 2.
+.TP 8
+.B \-delay \fInumber\fP
+How long (in microseconds) to sleep between frames.  Default: 100.
+.TP 8
+.B \-fisheye | \-no-fisheye
+Whether to use a fisheye lens.
+.TP 8
+.B \-tightturns | \-no-tightturns
+Whether to allow tight turns.
+.TP 8
+.B \-db | \-no-db
+Whether to double-buffer.
+.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 2002 by Marcelo Vianna.  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
+Marcelo Vianna.
diff --git a/hacks/glx/pulsar.man b/hacks/glx/pulsar.man
new file mode 100644 (file)
index 0000000..f2691a1
--- /dev/null
@@ -0,0 +1,102 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+pulsar - intersecting planes, alpha blending, fog, and textures.
+.SH SYNOPSIS
+.B pulsar
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-no-light]
+[\-wire]
+[\-delay \fInumber\fP]
+[\-quads \fInumber\fP]
+[\-bitmap \fIfile\fP]
+[\-light]
+[\-fog]
+[\-texture]
+[\-mipmap]
+[\-no-blend]
+[\-antialias]
+[\-texture_quality]
+[\-do_depth]
+[\-fps]
+.SH DESCRIPTION
+Draws some intersecting planes, making use of alpha blending, fog,
+textures, and mipmaps, plus a ``frames per second'' meter so that you can
+tell how fast your graphics card is... Requires 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 \-light | \-no-light
+Use Flat Coloring.
+.TP 8
+.B \-wire
+Render in wireframe instead of solid.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-bitmap \fIfile\fP
+The texture map to use.
+.TP 8
+.B \-quads \fInumber\fP
+Quad Count.  1 - 50.  Default: 5.
+.TP 8
+.B \-light | \-no-light
+Whether to enable lighting.
+.TP 8
+.B \-fog | \-no-fog
+Whether to enable fog.
+.TP 8
+.B \-texture | \-no-texture
+Whether to enable texturing.
+.TP 8
+.B \-mipmap | \-no-mipmap
+Whether to enable texture mipmaps.
+.TP 8
+.B \-blend | \-no-blend
+Whether to enable blending.
+.TP 8
+.B \-antialias | \-no-antialias
+Whether to anti-alias lines.
+.TP 8
+.B \-texture_quality | \-no-texture_quality
+Whether to enable texture filtering.
+.TP 8
+.B \-do_depth | \-no-do_depth
+Whether to enable depth buffer.
+.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 2002 by David Konerding.  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 Konerding.
diff --git a/hacks/glx/queens.c b/hacks/glx/queens.c
new file mode 100644 (file)
index 0000000..42ac6e2
--- /dev/null
@@ -0,0 +1,488 @@
+/*
+ * queens - solves n queens problem, displays
+ * i make no claims that this is an optimal solution to the problem,
+ * good enough for xss
+ * hacked from glchess
+ *
+ * version 1.0 - May 10, 2002
+ *
+ * Copyright (C) 2002 Blair Tennessy (tennessb@unbc.ca)
+ *
+ * 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>
+
+#ifdef STANDALONE
+# define PROGCLASS        "Queens"
+# define HACK_INIT        init_queens
+# define HACK_DRAW        draw_queens
+# define HACK_RESHAPE     reshape_queens
+# define HACK_HANDLE_EVENT queens_handle_event
+# define EVENT_MASK       PointerMotionMask
+# define queens_opts  xlockmore_opts
+
+#define DEFAULTS       "*delay:       20000       \n" \
+                       "*showFPS:       False       \n" \
+                      "*wireframe:     False     \n"   \
+
+# include "xlockmore.h"
+
+#else
+# include "xlock.h"
+#endif
+
+#ifdef USE_GL
+
+#include <GL/glu.h>
+#include "gltrackball.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+static XrmOptionDescRec opts[] = {
+  {"+rotate", ".queens.rotate", XrmoptionNoArg, (caddr_t) "false" },
+  {"-rotate", ".queens.rotate", XrmoptionNoArg, (caddr_t) "true" },
+};
+
+int rotate;
+
+static argtype vars[] = {
+  {(caddr_t *) &rotate, "rotate", "Rotate", "True", t_Bool},
+};
+
+ModeSpecOpt queens_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct   queens_description =
+{"queens", "init_queens", "draw_queens", "release_queens",
+ "draw_queens", "init_queens", NULL, &queens_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "Queens", 0, NULL};
+
+#endif
+
+typedef struct {
+  GLXContext *glx_context;
+  Window window;
+  trackball_state *trackball;
+  Bool button_down_p;
+} Queenscreen;
+
+static Queenscreen *qs = NULL;
+
+#include <math.h>
+#include <sys/time.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifndef M_PI
+#define M_PI 3.14159265
+#endif
+
+#define NONE 0
+#define QUEEN 1
+#define MINBOARD 5
+#define MAXBOARD 10
+
+/* definition of white/black colors */
+GLfloat colors[2][3] = { {0.5, 0.7, 0.9},
+                        {0.2, 0.3, 0.6} };
+
+int board[MAXBOARD][MAXBOARD];
+int work = 0, vb = 0, steps = 0, BOARDSIZE = 8; /* 8 cuz its classic */
+
+Bool
+queens_handle_event (ModeInfo *mi, XEvent *event)
+{
+  Queenscreen *c = &qs[MI_SCREEN(mi)];
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button & Button1)
+    {
+      c->button_down_p = True;
+      gltrackball_start (c->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)
+    {
+      c->button_down_p = False;
+      return True;
+    }
+  else if (event->xany.type == MotionNotify &&
+           c->button_down_p)
+    {
+      gltrackball_track (c->trackball,
+                         event->xmotion.x, event->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+
+  return False;
+}
+
+
+
+/* returns true if placing a queen on column c causes a conflict */
+int conflictsCols(int c) {
+  int i;
+
+  for(i = 0; i < BOARDSIZE; ++i)
+    if(board[i][c])
+      return 1;
+
+  return 0;
+}
+
+/* returns true if placing a queen on (r,c) causes a diagonal conflict */
+int conflictsDiag(int r, int c) {
+  int i;
+
+  /* positive slope */
+  int n = r < c ? r : c;
+  for(i = 0; i < BOARDSIZE-abs(r-c); ++i)
+    if(board[r-n+i][c-n+i])
+      return 1;
+
+  /* negative slope */
+  n = r < BOARDSIZE - (c+1) ? r : BOARDSIZE - (c+1);
+  for(i = 0; i < BOARDSIZE-abs(BOARDSIZE - (1+r+c)); ++i)
+    if(board[r-n+i][c+n-i])
+      return 1;
+  
+  return 0;
+}
+
+/* returns true if placing a queen at (r,c) causes a conflict */
+int conflicts(int r, int c) {
+  return !conflictsCols(c) ? conflictsDiag(r, c) : 1;
+}
+
+/* clear board */
+void blank(void) {
+  int i, j;
+
+  for(i = 0; i < MAXBOARD; ++i)
+    for(j = 0; j < MAXBOARD; ++j)
+      board[i][j] = NONE;
+}
+
+/* recursively determine solution */
+int findSolution(int row) {
+  int col = 0;
+
+  if(row == BOARDSIZE)
+    return 1;
+  
+  while(col < BOARDSIZE) {
+    if(!conflicts(row, col)) {
+      board[row][col] = QUEEN;
+
+      if(findSolution(row+1))
+       return 1;
+
+      board[row][col] = NONE; 
+    }
+
+    ++col;
+  }
+
+  return 0;
+}
+
+/* driver for finding solution */
+void go(void) { findSolution(0); }
+
+/* configure lighting */
+void setup_lights(void) {
+  GLfloat position[] = { 4.0, 8.0, 4.0, 1.0 };
+
+  glEnable(GL_LIGHTING);
+  glLightfv(GL_LIGHT0, GL_POSITION, position);
+  glEnable(GL_LIGHT0);
+}
+
+/* return alpha value for fading */
+GLfloat findAlpha(void) {
+  return steps < 128 ? steps/128.0 : steps < 512-128 ? 1.0 : (512-steps)/128.0;
+}
+
+/* draw pieces */
+void drawPieces(void) {
+  int i, j;
+
+  for(i = 0; i < BOARDSIZE; ++i) {
+    for(j = 0; j < BOARDSIZE; ++j) {
+      if(board[i][j]) {
+       glColor4f(colors[i%2][0], colors[i%2][1], colors[i%2][2], findAlpha());
+       glCallList(QUEEN);
+      }
+      
+      glTranslatef(1.0, 0.0, 0.0);
+    }
+    
+    glTranslatef(-1.0*BOARDSIZE, 0.0, 1.0);
+  }
+}
+
+/* draw board */
+void drawBoard(int wire) {
+  int i, j;
+
+  if (!wire) glBegin(GL_QUADS);
+
+  for(i = 0; i < BOARDSIZE; ++i)
+    for(j = 0; j < BOARDSIZE; ++j) {
+      int par = (i-j+BOARDSIZE)%2;
+      glColor4f(colors[par][0], colors[par][1], colors[par][2], findAlpha());
+      glNormal3f(0.0, 1.0, 0.0);
+      if (wire) glBegin(GL_LINE_LOOP);
+      glVertex3f(j - 0.5, -0.01, i - 0.5);
+      glVertex3f(j + 0.5, -0.01, i - 0.5);
+      glVertex3f(j + 0.5, -0.01, i + 0.5);
+      glVertex3f(j - 0.5, -0.01, i + 0.5);
+      if (wire) glEnd();
+    }
+
+  if (!wire) glEnd();
+}
+
+double theta = 0.0;
+
+void display(Queenscreen *c, int wire) {
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+  
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+  gluLookAt(0.0, 1.0+(0.8*fabs(sin(theta)))*10.0, -1.2*BOARDSIZE,
+           0.0, 1.0, 0.0,
+           0.0, 0.0, 1.0);
+
+  glScalef(1, -1, 1);
+  gltrackball_rotate (c->trackball);   /* Apply mouse-based camera position */
+  glScalef(1, -1, 1);
+
+  glRotatef(theta*100, 0.0, 1.0, 0.0);
+  glTranslatef(-0.5 * (BOARDSIZE-1), 0.0, -0.5 * (BOARDSIZE-1));
+
+  if (!wire) {
+    glEnable(GL_LIGHTING);
+    glEnable(GL_COLOR_MATERIAL);
+    glEnable(GL_BLEND);
+  }
+
+  drawBoard(wire);
+  glTranslatef(0.0, 0.01, 0.0);  
+  drawPieces();
+
+  glDisable(GL_COLOR_MATERIAL);
+  glDisable(GL_BLEND);
+  glDisable(GL_LIGHTING);
+
+  theta += .002;
+
+  /* zero out board, find new solution of size MINBOARD <= i <= MAXBOARD */
+  if(++steps == 512) {
+    steps = 0;
+    blank();
+    BOARDSIZE = MINBOARD + (random() % (MAXBOARD - MINBOARD + 1));
+    go();
+  }
+}
+
+#define piece_size 0.1
+#define EPSILON 0.001
+
+/* Make a revolved piece */
+void revolve_line(double *trace_r, double *trace_h, double max_iheight, 
+                 int rot, int wire) {
+  double theta, norm_theta, sin_theta, cos_theta;
+  double norm_ptheta = 0.0, sin_ptheta = 0.0, cos_ptheta = 1.0;
+  double radius, pradius;
+  double max_height = max_iheight, height, pheight;
+  double dx, dy, len;
+  int npoints, p;
+  double dtheta = (2.0*M_PI) / rot;
+
+  /* Get the number of points */
+  for(npoints = 0; 
+      fabs(trace_r[npoints]) > EPSILON || fabs(trace_h[npoints]) > EPSILON;
+      ++npoints);
+
+  /* If less than two points, can not revolve */
+  if(npoints < 2)
+    return;
+
+  /* If the max_height hasn't been defined, find it */
+  if(max_height < EPSILON)
+    for(p = 0; p < npoints; ++p)
+      if(max_height < trace_h[p])
+       max_height = trace_h[p];
+
+  /* Draw the revolution */
+  for(theta = dtheta; rot > 0; --rot) {
+    sin_theta = sin(theta);
+    cos_theta = cos(theta);
+    norm_theta = theta / (2.0 * M_PI);
+    pradius = trace_r[0] * piece_size;
+    pheight = trace_h[0] * piece_size;
+    
+    for(p = 0; p < npoints; ++p) {
+      radius = trace_r[p] * piece_size;
+      height = trace_h[p] * piece_size;
+
+      /* Get the normalized lengths of the normal vector */
+      dx = radius - pradius;
+      dy = height - pheight;
+      len = sqrt(dx*dx + dy*dy);
+      dx /= len;
+      dy /= len;
+
+      /* If only triangles required */
+      if (fabs(radius) < EPSILON) {
+       glBegin(wire ? GL_LINE_LOOP : GL_TRIANGLES);
+
+       glNormal3f(dy * sin_ptheta, -dx, dy * cos_ptheta);
+       glTexCoord2f(norm_ptheta, pheight / max_height);
+       glVertex3f(pradius * sin_ptheta, pheight, pradius * cos_ptheta);
+       
+       glNormal3f(dy * sin_theta, -dx, dy * cos_theta);
+       glTexCoord2f(norm_theta, pheight / max_height);
+       glVertex3f(pradius * sin_theta, pheight, pradius * cos_theta);
+       
+       glTexCoord2f(0.5 * (norm_theta + norm_ptheta),
+                    height / max_height);
+       glVertex3f(0.0, height, 0.0);
+       
+       glEnd();
+      } 
+      
+      else {
+       glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+
+       glNormal3f(dy * sin_ptheta, -dx, dy * cos_ptheta);
+       glTexCoord2f(norm_ptheta, pheight / max_height);
+       glVertex3f(pradius * sin_ptheta, pheight, pradius * cos_ptheta);
+
+       glNormal3f(dy * sin_theta, -dx, dy * cos_theta);
+       glTexCoord2f(norm_theta, pheight / max_height);
+       glVertex3f(pradius * sin_theta, pheight, pradius * cos_theta);
+
+       glTexCoord2f(norm_theta, height / max_height);
+       glVertex3f(radius * sin_theta, height, radius * cos_theta);
+
+       glNormal3f(dy * sin_ptheta, -dx, dy * cos_ptheta);
+       glTexCoord2f(norm_ptheta, height / max_height);
+       glVertex3f(radius * sin_ptheta, height, radius * cos_ptheta);
+
+       glEnd();
+      }
+
+      pradius = radius;
+      pheight = height;
+    }
+
+    sin_ptheta = sin_theta;
+    cos_ptheta = cos_theta;
+    norm_ptheta = norm_theta;
+    theta += dtheta;
+  }
+}
+
+void draw_queen(int wire) {
+  double trace_r[] =
+      { 4.8, 4.8, 3.4, 3.4, 1.8, 1.4, 2.9, 1.8, 1.8, 2.0, 
+       2.7, 2.4, 1.7, 0.95, 0.7, 0.0, 0.0 }; /*, 0.9, 0.7, 0.0, 0.0};*/
+  double trace_h[] =
+      { 0.0, 2.2, 4.0, 5.0, 8.0, 11.8, 11.8, 13.6, 15.2, 17.8,
+       19.2, 20.0, 20.0, 20.8, 20.8, 22.0, 0.0 };/*,21.4, 22.0, 22.0, 0.0 };*/
+
+  revolve_line(trace_r, trace_h, 0.0, 8, wire);
+}
+
+void reshape_queens(ModeInfo *mi, int width, int height) {
+  GLfloat h = (GLfloat) height / (GLfloat) width;
+  glViewport(0,0, width, height);
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  gluPerspective(45, 1/h, 2.0, 30.0);
+  glMatrixMode(GL_MODELVIEW);
+}
+
+void init_queens(ModeInfo *mi) {
+  GLfloat mat_shininess[] = { 90.0 };
+  GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+
+  int screen = MI_SCREEN(mi);
+  int wire = MI_IS_WIREFRAME(mi);
+  Queenscreen *c;
+
+  if(!qs && 
+     !(qs = (Queenscreen *) calloc(MI_NUM_SCREENS(mi), sizeof(Queenscreen))))
+    return;
+  
+  c = &qs[screen];
+  c->window = MI_WINDOW(mi);
+  c->trackball = gltrackball_init ();
+  
+  if((c->glx_context = init_GL(mi)))
+    reshape_queens(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+  else
+    MI_CLEARWINDOW(mi);
+
+  glClearColor(0.0, 0.0, 0.0, 0.0);
+
+  setup_lights();
+  glNewList(1, GL_COMPILE);
+  draw_queen(wire);
+  glEndList();
+
+  if (!wire) {
+    glColorMaterial(GL_FRONT, GL_DIFFUSE);
+
+    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
+    glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
+
+    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);  
+    glShadeModel(GL_SMOOTH);
+    glEnable(GL_DEPTH_TEST);
+  }
+
+  /* find a solution */
+  go();
+}
+
+void draw_queens(ModeInfo *mi) {
+  Queenscreen *c = &qs[MI_SCREEN(mi)];
+  Window w = MI_WINDOW(mi);
+  Display *disp = MI_DISPLAY(mi);
+
+  if(!c->glx_context)
+    return;
+
+  glXMakeCurrent(disp, w, *(c->glx_context));
+
+  display(c, MI_IS_WIREFRAME(mi));
+
+  if(mi->fps_p) do_fps(mi);
+  glFinish(); 
+  glXSwapBuffers(disp, w);
+}
+
+void release_queens(ModeInfo *mi) {
+  if(qs)
+    free((void *) qs);
+
+  FreeAllGL(MI);
+}
+
+#endif
diff --git a/hacks/glx/queens.man b/hacks/glx/queens.man
new file mode 100644 (file)
index 0000000..bcfcd38
--- /dev/null
@@ -0,0 +1,59 @@
+.TH XScreenSaver 1 "May 2002"
+.SH NAME
+queens \- n queens screensaver
+.SH SYNOPSIS
+.B queens
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP] [\-fps]
+.SH DESCRIPTION
+The \fIqueens\fP program solves the n-queens problem (where, in this
+program, N is between 5 and 10 queens) using a straightforward
+backtracking algorithm.  The problem is: how may one place N queens 
+on an NxN chessboard such that no queen can attack a sister?
+.SH OPTIONS
+.I queens
+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.
+.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 BUGS
+It's not unknown for this and other OpenGL hacks to fail under hardware accelaration (UtahGLX) and take the X server with them.  Texture images must be 16x16 or 32x32 or 64x64 etc.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 2002 by Blair Tennessy.  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
+Blair Tennessy <tennessb@unbc.ca>, 20-April-2002.
diff --git a/hacks/glx/rotator.c b/hacks/glx/rotator.c
new file mode 100644 (file)
index 0000000..f13cb54
--- /dev/null
@@ -0,0 +1,243 @@
+/* xscreensaver, Copyright (c) 1998-2002 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 "config.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include "rotator.h"
+#include "yarandom.h"
+
+struct rotator {
+
+  double spin_x_speed, spin_y_speed, spin_z_speed;
+  double wander_speed;
+
+  double rotx, roty, rotz;        /* current object rotation */
+  double dx, dy, dz;              /* current rotational velocity */
+  double ddx, ddy, ddz;                   /* current rotational acceleration */
+  double d_max;                           /* max rotational velocity */
+
+  int wander_frame;               /* position in the wander cycle */
+
+};
+
+
+#undef ABS
+#define ABS(x) ((x)<0?-(x):(x))
+
+#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3)
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+static void
+rotate_1 (double *pos, double *v, double *dv, double speed, double max_v)
+{
+  double ppos = *pos;
+
+  if (speed == 0) return;
+
+  /* tick position */
+  if (ppos < 0)
+    ppos = -(ppos + *v);
+  else
+    ppos += *v;
+
+  if (ppos > 1.0)
+    ppos -= 1.0;
+  else if (ppos < 0)
+    ppos += 1.0;
+
+  if (ppos < 0) abort();
+  if (ppos > 1.0) abort();
+  *pos = (*pos > 0 ? ppos : -ppos);
+
+  /* accelerate */
+  *v += *dv;
+
+  /* clamp velocity */
+  if (*v > max_v || *v < -max_v)
+    {
+      *dv = -*dv;
+    }
+  /* If it stops, start it going in the other direction. */
+  else if (*v < 0)
+    {
+      if (random() % 4)
+       {
+         *v = 0;
+
+         /* keep going in the same direction */
+         if (random() % 2)
+           *dv = 0;
+         else if (*dv < 0)
+           *dv = -*dv;
+       }
+      else
+       {
+         /* reverse gears */
+         *v = -*v;
+         *dv = -*dv;
+         *pos = -*pos;
+       }
+    }
+
+  /* Alter direction of rotational acceleration randomly. */
+  if (! (random() % 120))
+    *dv = -*dv;
+
+  /* Change acceleration very occasionally. */
+  if (! (random() % 200))
+    {
+      if (*dv == 0)
+       *dv = 0.00001;
+      else if (random() & 1)
+       *dv *= 1.2;
+      else
+       *dv *= 0.8;
+    }
+}
+
+
+/* Returns a rotator object, which encapsulates rotation and motion state.
+
+   spin_[xyz]_speed indicates the relative speed of rotation.
+   Specify 0 if you don't want any rotation around that axis.
+
+   spin_accel specifies a scaling factor for the acceleration that is
+   randomly applied to spin: if you want the speed to change faster,
+   make this > 1.
+
+   wander_speed indicates the relative speed through space.
+
+   If randomize_initial_state_p is true, then the initial position and
+   rotation will be randomized (even if the spin speeds are 0.)  If it
+   is false, then all values will be initially zeroed.
+ */
+rotator *
+make_rotator (double spin_x_speed,
+              double spin_y_speed,
+              double spin_z_speed,
+              double spin_accel,
+              double wander_speed,
+              int randomize_initial_state_p)
+{
+  rotator *r = (rotator *) calloc (1, sizeof(*r));
+  double d, dd;
+
+  if (!r) return 0;
+
+  if (spin_x_speed < 0 || spin_y_speed < 0 || spin_z_speed < 0 ||
+      wander_speed < 0)
+    abort();
+
+  r->spin_x_speed = spin_x_speed;
+  r->spin_y_speed = spin_y_speed;
+  r->spin_z_speed = spin_z_speed;
+  r->wander_speed = wander_speed;
+
+  if (randomize_initial_state_p)
+    {
+      r->rotx = frand(1.0) * RANDSIGN();
+      r->roty = frand(1.0) * RANDSIGN();
+      r->rotz = frand(1.0) * RANDSIGN();
+
+      r->wander_frame = random() % 0xFFFF;
+    }
+  else
+    {
+      r->rotx = r->roty = r->rotz = 0;
+      r->wander_frame = 0;
+    }
+
+  d  = 0.006;
+  dd = 0.00006;
+
+  r->dx = BELLRAND(d * r->spin_x_speed);
+  r->dy = BELLRAND(d * r->spin_y_speed);
+  r->dz = BELLRAND(d * r->spin_z_speed);
+
+  r->d_max = r->dx * 2;
+
+  r->ddx = (dd + frand(dd+dd)) * r->spin_x_speed * spin_accel;
+  r->ddy = (dd + frand(dd+dd)) * r->spin_y_speed * spin_accel;
+  r->ddz = (dd + frand(dd+dd)) * r->spin_z_speed * spin_accel;
+
+# if 0
+  fprintf (stderr, "rotator:\n");
+  fprintf (stderr, "   wander: %3d %6.2f\n", r->wander_frame, r->wander_speed);
+  fprintf (stderr, "    speed: %6.2f %6.2f %6.2f\n",
+           r->spin_x_speed, r->spin_y_speed, r->spin_z_speed);
+  fprintf (stderr, "      rot: %6.2f %6.2f %6.2f\n",
+           r->rotx, r->roty, r->rotz);
+  fprintf (stderr, "        d: %6.2f %6.2f %6.2f, %6.2f\n",
+           r->dx, r->dy, r->dz,
+           r->d_max);
+  fprintf (stderr, "       dd: %6.2f %6.2f %6.2f\n",
+           r->ddx, r->ddy, r->ddz);
+# endif
+
+  return r;
+}
+
+
+void
+free_rotator (rotator *r)
+{
+  free (r);
+}
+
+void
+get_rotation (rotator *rot, double *x_ret, double *y_ret, double *z_ret,
+              int update_p)
+{
+  double x, y, z;
+
+  if (update_p) {
+    rotate_1 (&rot->rotx, &rot->dx, &rot->ddx, rot->spin_x_speed, rot->d_max);
+    rotate_1 (&rot->roty, &rot->dy, &rot->ddy, rot->spin_y_speed, rot->d_max);
+    rotate_1 (&rot->rotz, &rot->dz, &rot->ddz, rot->spin_z_speed, rot->d_max);
+  }
+
+  x = rot->rotx;
+  y = rot->roty;
+  z = rot->rotz;
+  if (x < 0) x = 1 - (x + 1);
+  if (y < 0) y = 1 - (y + 1);
+  if (z < 0) z = 1 - (z + 1);
+
+  if (x_ret) *x_ret = x;
+  if (y_ret) *y_ret = y;
+  if (z_ret) *z_ret = z;
+}
+
+
+void
+get_position (rotator *rot, double *x_ret, double *y_ret, double *z_ret,
+              int update_p)
+{
+  double x = 0.5, y = 0.5, z = 0.5;
+
+  if (rot->wander_speed != 0)
+    {
+      if (update_p)
+        rot->wander_frame++;
+
+# define SINOID(F) ((1 + sin((rot->wander_frame * (F)) / 2 * M_PI)) / 2.0)
+      x = SINOID (0.71 * rot->wander_speed);
+      y = SINOID (0.53 * rot->wander_speed);
+      z = SINOID (0.37 * rot->wander_speed);
+# undef SINOID
+    }
+
+  if (x_ret) *x_ret = x;
+  if (y_ret) *y_ret = y;
+  if (z_ret) *z_ret = z;
+}
diff --git a/hacks/glx/rotator.h b/hacks/glx/rotator.h
new file mode 100644 (file)
index 0000000..b3f36f6
--- /dev/null
@@ -0,0 +1,60 @@
+/* xscreensaver, Copyright (c) 1998-2002 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.
+ */
+
+#ifndef __ROTATOR_H__
+#define __ROTATOR_H__
+
+typedef struct rotator rotator;
+
+/* Returns a rotator object, which encapsulates rotation and motion state.
+
+   spin_[xyz]_speed indicates the relative speed of rotation.
+   Specify 0 if you don't want any rotation around that axis.
+
+   spin_accel specifies a scaling factor for the acceleration that is
+   randomly applied to spin: if you want the speed to change faster,
+   make this > 1.
+
+   wander_speed indicates the relative speed through space.
+
+   If randomize_initial_state_p is true, then the initial position and
+   rotation will be randomized (even if the spin speeds are 0.)  If it
+   is false, then all values will be initially zeroed.
+ */
+extern rotator *make_rotator (double spin_x_speed,
+                              double spin_y_speed,
+                              double spin_z_speed,
+                              double spin_accel,
+                              double wander_speed,
+                              int randomize_initial_state_p);
+
+/* Rotates one step, and returns the new rotation values.
+   x, y, and z range from 0.0-1.0, the fraction through the circle
+   (*not* radians or degrees!)
+   If `update_p' is non-zero, then (maybe) rotate first.
+ */
+extern void get_rotation (rotator *rot,
+                          double *x_ret, double *y_ret, double *z_ret,
+                          int update_p);
+
+/* Moves one step, and returns the new position values.
+   x, y, and z range from 0.0-1.0, the fraction through space:
+   scale those values as needed.
+   If `update_p' is non-zero, then (maybe) move first.
+ */
+extern void get_position (rotator *rot,
+                          double *x_ret, double *y_ret, double *z_ret,
+                          int update_p);
+
+/* Destroys and frees a `rotator' object. */
+extern void free_rotator (rotator *r);
+
+#endif /* __ROTATOR_H__ */
diff --git a/hacks/glx/rubik.man b/hacks/glx/rubik.man
new file mode 100644 (file)
index 0000000..6b34c94
--- /dev/null
@@ -0,0 +1,69 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+rubik - screen saver that solves Rubik's Cube.
+.SH SYNOPSIS
+.B rubik
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-size \fInumber\fP]
+[\-hideshuffling]
+[\-fps]
+.SH DESCRIPTION
+Draws a Rubik's Cube that rotates in three dimensions and repeatedly
+shuffles and solves itself.
+.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 \-count \fInumber\fP
+Count. -100 - 100.  Default: -30.
+.TP 8
+.B \-cycles \fInumber\fP
+Timeout.  0 - 60.  Default: 5.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 40000 (0.04 seconds.).
+.TP 8
+.B \-size \fInumber\fP
+Size.  -20 - 20.  Default: -6.
+.TP 8
+.B \-hideshuffling | \-no-hideshuffling
+Show Shuffling.  Boolean.
+.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 2002 by Marcelo Vianna.  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
+Marcelo Vianna. 
index 1517d271d135139c5d34cabbdcf67ac51f2b2547..3a0a158b0989af4e4d58d8247cd2c31361cb6462 100644 (file)
@@ -39,12 +39,24 @@ static const char sccsid[] = "@(#)sierpinski3D.c    00.01 99/11/04 xlockmore";
 # define HACK_INIT                                     init_gasket
 # define HACK_DRAW                                     draw_gasket
 # define HACK_RESHAPE                          reshape_gasket
+# define HACK_HANDLE_EVENT                     gasket_handle_event
+# define EVENT_MASK                                    PointerMotionMask
 # define gasket_opts                           xlockmore_opts
+
+
+#define DEF_SPIN                               "True"
+#define DEF_WANDER                             "True"
+#define DEF_SPEED                              "150"
+#define DEF_MAXDEPTH                   "5"
+
 # define DEFAULTS                                      "*delay:                20000   \n"                     \
-                                                                       "*maxDepth:             5       \n"                     \
-                                                                       "*speed:                150     \n"                     \
                                                                        "*showFPS:      False   \n"                     \
-                                                                       "*wireframe:    False   \n"
+                                                                       "*wireframe:    False   \n"                     \
+                                                                       "*maxDepth:        " DEF_MAXDEPTH  "\n" \
+                                                                       "*speed:           " DEF_SPEED     "\n" \
+                                                                       "*spin:        " DEF_SPIN      "\n" \
+                                                                       "*wander:      " DEF_WANDER    "\n" \
+
 # include "xlockmore.h"                /* from the xscreensaver distribution */
 #else  /* !STANDALONE */
 # include "xlock.h"                    /* from the xlockmore distribution */
@@ -52,19 +64,32 @@ static const char sccsid[] = "@(#)sierpinski3D.c    00.01 99/11/04 xlockmore";
 
 #ifdef USE_GL
 
+#include <GL/glu.h>
+#include "rotator.h"
+#include "gltrackball.h"
+
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
 static int max_depth;
 static int speed;
+static Bool do_spin;
+static Bool do_wander;
+
 static XrmOptionDescRec opts[] = {
   {"-depth", ".sierpinski3d.maxDepth", XrmoptionSepArg, (caddr_t) 0 },
-  {"-speed", ".sierpinski3d.speed",    XrmoptionSepArg, (caddr_t) 0 }
+  {"-speed", ".sierpinski3d.speed",    XrmoptionSepArg, (caddr_t) 0 },
+  { "-spin",   ".spin",   XrmoptionNoArg, "True" },
+  { "+spin",   ".spin",   XrmoptionNoArg, "False" },
+  { "-wander", ".wander", XrmoptionNoArg, "True" },
+  { "+wander", ".wander", XrmoptionNoArg, "False" },
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &max_depth, "maxDepth", "MaxDepth", "5", t_Int},
-  {(caddr_t *) &speed,     "speed",    "Speed",   "150", t_Int},
+  {(caddr_t *) &do_spin,   "spin",   "Spin",   DEF_SPIN,   t_Bool},
+  {(caddr_t *) &do_wander, "wander", "Wander", DEF_WANDER, t_Bool},
+  {(caddr_t *) &speed,     "speed",  "Speed",  DEF_SPEED,  t_Int},
+  {(caddr_t *) &max_depth, "maxDepth", "MaxDepth", DEF_MAXDEPTH, t_Int},
 };
 
 
@@ -86,15 +111,12 @@ typedef struct{
 } GL_VECTOR;
 
 typedef struct {
-  GLfloat rotx, roty, rotz;       /* current object rotation */
-  GLfloat dx, dy, dz;             /* current rotational velocity */
-  GLfloat ddx, ddy, ddz;          /* current rotational acceleration */
-  GLfloat d_max;                          /* max velocity */
-
-  GLfloat     angle;
   GLuint      gasket0, gasket1, gasket2, gasket3;
   GLXContext *glx_context;
   Window      window;
+  rotator    *rot;
+  trackball_state *trackball;
+  Bool           button_down_p;
 
   int current_depth;
 
@@ -109,8 +131,6 @@ typedef struct {
 
 static gasketstruct *gasket = NULL;
 
-#include <GL/glu.h>
-
 static GLfloat normals[4][3];
 
 \f
@@ -351,26 +371,18 @@ draw(ModeInfo *mi)
   glPushMatrix();
 
   {
-    static int frame = 0;
-    GLfloat x, y, z;
-
-#   define SINOID(SCALE,SIZE) \
-      ((((1 + sin((frame * (SCALE)) / 2 * M_PI)) / 2.0) * (SIZE)) - (SIZE)/2)
-    x = SINOID(0.0071, 8.0);
-    y = SINOID(0.0053, 6.0);
-    z = SINOID(0.0037, 15.0);
-    frame++;
-    glTranslatef(x, y, z);
-
-    x = gp->rotx;
-    y = gp->roty;
-    z = gp->rotz;
-    if (x < 0) x = 1 - (x + 1);
-    if (y < 0) y = 1 - (y + 1);
-    if (z < 0) z = 1 - (z + 1);
-    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);
+    double x, y, z;
+    get_position (gp->rot, &x, &y, &z, !gp->button_down_p);
+    glTranslatef((x - 0.5) * 10,
+                 (y - 0.5) * 10,
+                 (z - 0.5) * 20);
+
+    gltrackball_rotate (gp->trackball);
+
+    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);
   }
 
   glScalef( 8.0, 8.0, 8.0 );
@@ -423,14 +435,13 @@ reshape_gasket(ModeInfo *mi, int width, int height)
   glViewport(0, 0, (GLint) width, (GLint) height);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
+  gluPerspective (30.0, 1/h, 1.0, 100.0);
 
-  gluPerspective( 30.0, 1/h, 1.0, 100.0 );
-  gluLookAt( 0.0, 0.0, 15.0,
-             0.0, 0.0, 0.0,
-             0.0, 1.0, 0.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
-  glTranslatef(0.0, 0.0, -15.0);
+  gluLookAt( 0.0, 0.0, 30.0,
+             0.0, 0.0, 0.0,
+             0.0, 1.0, 0.0);
   
   glClear(GL_COLOR_BUFFER_BIT);
 }
@@ -449,75 +460,36 @@ pinit(ModeInfo *mi)
 }
 
 
-
-/* lifted from lament.c */
-#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
-static void
-rotate(GLfloat *pos, GLfloat *v, GLfloat *dv, GLfloat max_v)
+Bool
+gasket_handle_event (ModeInfo *mi, XEvent *event)
 {
-  double ppos = *pos;
-
-  /* tick position */
-  if (ppos < 0)
-    ppos = -(ppos + *v);
-  else
-    ppos += *v;
-
-  if (ppos > 1.0)
-    ppos -= 1.0;
-  else if (ppos < 0)
-    ppos += 1.0;
-
-  if (ppos < 0) abort();
-  if (ppos > 1.0) abort();
-  *pos = (*pos > 0 ? ppos : -ppos);
-
-  /* accelerate */
-  *v += *dv;
+  gasketstruct *gp = &gasket[MI_SCREEN(mi)];
 
-  /* clamp velocity */
-  if (*v > max_v || *v < -max_v)
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button & Button1)
     {
-      *dv = -*dv;
+      gp->button_down_p = True;
+      gltrackball_start (gp->trackball,
+                         event->xbutton.x, event->xbutton.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
     }
-  /* If it stops, start it going in the other direction. */
-  else if (*v < 0)
+  else if (event->xany.type == ButtonRelease &&
+           event->xbutton.button & Button1)
     {
-      if (random() % 4)
-       {
-         *v = 0;
-
-         /* keep going in the same direction */
-         if (random() % 2)
-           *dv = 0;
-         else if (*dv < 0)
-           *dv = -*dv;
-       }
-      else
-       {
-         /* reverse gears */
-         *v = -*v;
-         *dv = -*dv;
-         *pos = -*pos;
-       }
+      gp->button_down_p = False;
+      return True;
     }
-
-  /* Alter direction of rotational acceleration randomly. */
-  if (! (random() % 120))
-    *dv = -*dv;
-
-  /* Change acceleration very occasionally. */
-  if (! (random() % 200))
+  else if (event->xany.type == MotionNotify &&
+           gp->button_down_p)
     {
-      if (*dv == 0)
-       *dv = 0.00001;
-      else if (random() & 1)
-       *dv *= 1.2;
-      else
-       *dv *= 0.8;
+      gltrackball_track (gp->trackball,
+                         event->xmotion.x, event->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
     }
+
+  return False;
 }
 
 
@@ -537,20 +509,17 @@ init_gasket(ModeInfo *mi)
 
   gp->window = MI_WINDOW(mi);
 
-  gp->rotx = frand(1.0) * RANDSIGN();
-  gp->roty = frand(1.0) * RANDSIGN();
-  gp->rotz = frand(1.0) * RANDSIGN();
-
-  /* bell curve from 0-1.5 degrees, avg 0.75 */
-  gp->dx = (frand(1) + frand(1) + frand(1)) / (360*2);
-  gp->dy = (frand(1) + frand(1) + frand(1)) / (360*2);
-  gp->dz = (frand(1) + frand(1) + frand(1)) / (360*2);
-
-  gp->d_max = gp->dx * 2;
-
-  gp->ddx = 0.00006 + frand(0.00003);
-  gp->ddy = 0.00006 + frand(0.00003);
-  gp->ddz = 0.00006 + frand(0.00003);
+  {
+    double spin_speed   = 1.0;
+    double wander_speed = 0.03;
+    gp->rot = make_rotator (do_spin ? spin_speed : 0,
+                            do_spin ? spin_speed : 0,
+                            do_spin ? spin_speed : 0,
+                            1.0,
+                            do_wander ? wander_speed : 0,
+                            True);
+    gp->trackball = gltrackball_init ();
+  }
 
   gp->ncolors = 255;
   gp->colors = (XColor *) calloc(gp->ncolors, sizeof(XColor));
@@ -579,7 +548,6 @@ draw_gasket(ModeInfo * mi)
   gasketstruct *gp = &gasket[MI_SCREEN(mi)];
   Display      *display = MI_DISPLAY(mi);
   Window        window = MI_WINDOW(mi);
-  int           angle_incr = 1;
 
   if (!gp->glx_context) return;
 
@@ -590,14 +558,6 @@ draw_gasket(ModeInfo * mi)
 
   glXMakeCurrent(display, window, *(gp->glx_context));
   draw(mi);
-
-  /* rotate */
-  gp->angle = (int) (gp->angle + angle_incr) % 360;
-
-  rotate(&gp->rotx, &gp->dx, &gp->ddx, gp->d_max);
-  rotate(&gp->roty, &gp->dy, &gp->ddy, gp->d_max);
-  rotate(&gp->rotz, &gp->dz, &gp->ddz, gp->d_max);
-
   if (mi->fps_p) do_fps (mi);
   glFinish();
   glXSwapBuffers(display, window);
diff --git a/hacks/glx/sierpinski3d.man b/hacks/glx/sierpinski3d.man
new file mode 100644 (file)
index 0000000..660cb73
--- /dev/null
@@ -0,0 +1,67 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+sierpinski3d - 3D Sierpinski triangle fractal.
+.SH SYNOPSIS
+.B sierpinski3d
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-depth \fInumber\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+This draws the three-dimensional variant of the recursive Sierpinski
+triangle fractal, using GL.
+.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
+Number of frames before changing shape.  Default: 150.
+.TP 8
+.B \-depth \fInumber\fP
+Max depth to descend.  Default: 3.  You probably don't have enough
+memory for 6.
+.TP 8
+.B \-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 2002 by Tim Robinson and Jamie Zawinski.  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
+Tim Robinson and Jamie Zawinski.
index b894ae84c503a7bc994a386d63e95b1b71d29de7..f4ffa0116085ecc4e5a6dadcc1cb72c44748f40d 100644 (file)
  * There tends to be a dark stripe in the colormaps.  I don't know why.
  * Perhaps utils/colors.c is at fault?
  *
- * With the hairier objects, some of the faces are inside out.  E.g.,
+ * Note that this equation sometimes generates faces that are inside out:
  *     -parameters 01210111
- * If we turn off GL_CULL_FACE, that object renders more solidly
- * (indicating wrong winding) and the altered surfaces are too dark
- * (indicating wrong normals.)
+ * To make this work, we need to render back-faces with two-sided lighting:
+ * figuring out how to correct the winding and normals on those inside out
+ * surfaces would be too hard.
  */
 
 #include <X11/Intrinsic.h>
@@ -68,6 +68,8 @@ extern XtAppContext app;
 #define HACK_INIT      init_spheremonics
 #define HACK_DRAW      draw_spheremonics
 #define HACK_RESHAPE   reshape_spheremonics
+#define HACK_HANDLE_EVENT spheremonics_handle_event
+#define EVENT_MASK      PointerMotionMask
 #define ccs_opts       xlockmore_opts
 
 #define DEF_DURATION    "100"
@@ -96,6 +98,8 @@ extern XtAppContext app;
 
 #include "xlockmore.h"
 #include "colors.h"
+#include "rotator.h"
+#include "gltrackball.h"
 #include <ctype.h>
 
 #ifdef USE_GL /* whole file */
@@ -108,12 +112,9 @@ typedef struct {
 
 typedef struct {
   GLXContext *glx_context;
-
-  GLfloat rotx, roty, rotz;       /* current object rotation */
-  GLfloat dx, dy, dz;             /* current rotational velocity */
-  GLfloat ddx, ddy, ddz;          /* current rotational acceleration */
-  GLfloat d_max;                  /* max velocity */
-  Bool spin_x, spin_y, spin_z;
+  rotator *rot;
+  trackball_state *trackball;
+  Bool button_down_p;
 
   GLuint dlist, dlist2;
   GLfloat scale;
@@ -129,6 +130,7 @@ typedef struct {
 
   int tracer;
   int mesher;
+  int polys1, polys2;  /* polygon counts */
 
   XFontStruct *font;
   GLuint font_list;
@@ -187,14 +189,13 @@ reshape_spheremonics (ModeInfo *mi, int width, int height)
 
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
+  gluPerspective (30.0, 1/h, 1.0, 100.0);
 
-  gluPerspective( 30.0, 1/h, 1.0, 100.0 );
-  gluLookAt( 0.0, 0.0, 15.0,
-             0.0, 0.0, 0.0,
-             0.0, 1.0, 0.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
-  glTranslatef(0.0, 0.0, -15.0);
+  gluLookAt( 0.0, 0.0, 30.0,
+             0.0, 0.0, 0.0,
+             0.0, 1.0, 0.0);
 
   glClear(GL_COLOR_BUFFER_BIT);
 }
@@ -213,84 +214,35 @@ gl_init (ModeInfo *mi)
   if (!wire)
     {
       glLightfv(GL_LIGHT0, GL_POSITION, pos);
-      glEnable(GL_CULL_FACE);
       glEnable(GL_LIGHTING);
       glEnable(GL_LIGHT0);
       glEnable(GL_DEPTH_TEST);
-    }
-}
-
-
-/* lifted from lament.c */
-#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
-#define RANDSIGN() ((random() & 1) ? 1 : -1)
-
-static void
-rotate(GLfloat *pos, GLfloat *v, GLfloat *dv, GLfloat max_v)
-{
-  double ppos = *pos;
-
-  /* tick position */
-  if (ppos < 0)
-    ppos = -(ppos + *v);
-  else
-    ppos += *v;
 
-  if (ppos > 1.0)
-    ppos -= 1.0;
-  else if (ppos < 0)
-    ppos += 1.0;
-
-  if (ppos < 0) abort();
-  if (ppos > 1.0) abort();
-  *pos = (*pos > 0 ? ppos : -ppos);
-
-  /* accelerate */
-  *v += *dv;
-
-  /* clamp velocity */
-  if (*v > max_v || *v < -max_v)
-    {
-      *dv = -*dv;
-    }
-  /* If it stops, start it going in the other direction. */
-  else if (*v < 0)
-    {
-      if (random() % 4)
-       {
-         *v = 0;
-
-         /* keep going in the same direction */
-         if (random() % 2)
-           *dv = 0;
-         else if (*dv < 0)
-           *dv = -*dv;
-       }
-      else
-       {
-         /* reverse gears */
-         *v = -*v;
-         *dv = -*dv;
-         *pos = -*pos;
-       }
-    }
-
-  /* Alter direction of rotational acceleration randomly. */
-  if (! (random() % 120))
-    *dv = -*dv;
-
-  /* Change acceleration very occasionally. */
-  if (! (random() % 200))
-    {
-      if (*dv == 0)
-       *dv = 0.00001;
-      else if (random() & 1)
-       *dv *= 1.2;
-      else
-       *dv *= 0.8;
+      /* With objects that have proper winding and normals set up on all
+         their faces, one can cull back-faces; however, these equations
+         generate objects that are sometimes "inside out", and determining
+         whether a facet has been inverted like that is really hard.
+         So we render both front and back faces, at a probable performance
+         penalty on non-accelerated systems.
+
+         When rendering back faces, we also need to do two-sided lighting,
+         or the fact that the normals are flipped gives us too-dark surfaces
+         on the inside-out surfaces.
+
+         This isn't generally something you'd want, because you end up
+         with half the lighting dynamic range (kind of.)  So if you had
+         a sphere with correctly pointing normals, and a single light
+         source, it would be illuminated from two sides.  In this case,
+         though, it saves us from a difficult and time consuming
+         inside/outside test.  And we don't really care about a precise
+         lighting effect.
+       */
+      glDisable(GL_CULL_FACE);
+      glLightModeli (GL_LIGHT_MODEL_TWO_SIDE, TRUE);
     }
 }
 
+
 \f
 /* generate the object */
 
@@ -549,12 +501,12 @@ do_tracer (ModeInfo *mi)
 }
 
 
-static void
+static int
 unit_spheremonics (ModeInfo *mi,
                    int resolution, Bool wire, int *m, XColor *colors)
 {
   spheremonics_configuration *cc = &ccs[MI_SCREEN(mi)];
-
+  int polys = 0;
   int i, j;
   double du, dv;
   XYZ q[4];
@@ -572,8 +524,6 @@ unit_spheremonics (ModeInfo *mi,
   if (wire)
     glColor3f (1, 1, 1);
 
-/*  mi->polygon_count = 0; */
-
   glBegin (wire ? GL_LINE_LOOP : GL_QUADS);
 
   for (i = 0; i < res; i++) {
@@ -612,7 +562,7 @@ unit_spheremonics (ModeInfo *mi,
       if (!wire) do_color (i, colors);
       glVertex3f(q[3].x,q[3].y,q[3].z);
 
-/*      mi->polygon_count++; */
+      polys++;
 
 # define CHECK_BBOX(N) \
          if (q[(N)].x < cc->bbox[0].x) cc->bbox[0].x = q[(N)].x; \
@@ -650,6 +600,7 @@ unit_spheremonics (ModeInfo *mi,
         glPopMatrix();
       }
   }
+  return polys;
 }
 
 
@@ -769,7 +720,7 @@ generate_spheremonics (ModeInfo *mi)
 
   {
     glNewList(cc->dlist, GL_COMPILE);
-    unit_spheremonics (mi, cc->resolution, wire, cc->m, cc->colors);
+    cc->polys1 = unit_spheremonics (mi, cc->resolution, wire,cc->m,cc->colors);
     glEndList();
 
     glNewList(cc->dlist2, GL_COMPILE);
@@ -777,7 +728,7 @@ generate_spheremonics (ModeInfo *mi)
     glDisable (GL_LIGHTING);
     glPushMatrix();
     glScalef (1.05, 1.05, 1.05);
-    unit_spheremonics (mi, cc->resolution, 2, cc->m, cc->colors);
+    cc->polys2 = unit_spheremonics (mi, cc->resolution, 2, cc->m, cc->colors);
     glPopMatrix();
     glPopAttrib();
     glEndList();
@@ -879,12 +830,16 @@ init_spheremonics (ModeInfo *mi)
     }
 
   {
+    Bool spinx=False, spiny=False, spinz=False;
+    double spin_speed   = 1.0;
+    double wander_speed = 0.03;
+
     char *s = do_spin;
     while (*s)
       {
-        if      (*s == 'x' || *s == 'X') cc->spin_x = 1;
-        else if (*s == 'y' || *s == 'Y') cc->spin_y = 1;
-        else if (*s == 'z' || *s == 'Z') cc->spin_z = 1;
+        if      (*s == 'x' || *s == 'X') spinx = True;
+        else if (*s == 'y' || *s == 'Y') spiny = True;
+        else if (*s == 'z' || *s == 'Z') spinz = True;
         else
           {
             fprintf (stderr,
@@ -894,22 +849,16 @@ init_spheremonics (ModeInfo *mi)
           }
         s++;
       }
-  }
 
-  cc->rotx = frand(1.0) * RANDSIGN();
-  cc->roty = frand(1.0) * RANDSIGN();
-  cc->rotz = frand(1.0) * RANDSIGN();
-
-  /* bell curve from 0-6 degrees, avg 3 */
-  cc->dx = (frand(0.4) + frand(0.4) + frand(0.4)) / (360/2);
-  cc->dy = (frand(0.4) + frand(0.4) + frand(0.4)) / (360/2);
-  cc->dz = (frand(0.4) + frand(0.4) + frand(0.4)) / (360/2);
-
-  cc->d_max = cc->dx * 2;
+    cc->rot = make_rotator (spinx ? spin_speed : 0,
+                            spiny ? spin_speed : 0,
+                            spinz ? spin_speed : 0,
+                            1.0,
+                            do_wander ? wander_speed : 0,
+                            True);
+    cc->trackball = gltrackball_init ();
+  }
 
-  cc->ddx = 0.00006 + frand(0.00003);
-  cc->ddy = 0.00006 + frand(0.00003);
-  cc->ddz = 0.00006 + frand(0.00003);
   cc->tracer = -1;
   cc->mesher = -1;
 
@@ -935,18 +884,36 @@ init_spheremonics (ModeInfo *mi)
 }
 
 
-static Bool
-mouse_down_p (ModeInfo *mi)
+Bool
+spheremonics_handle_event (ModeInfo *mi, XEvent *event)
 {
-  Window root, child;
-  int rx, ry, wx, wy;
-  unsigned int mask;
-  if (!XQueryPointer (MI_DISPLAY(mi), MI_WINDOW(mi),
-                      &root, &child, &rx, &ry, &wx, &wy, &mask))
-    return False;
-  if (! (mask & Button1Mask))
-    return False;
-  return True;
+  spheremonics_configuration *cc = &ccs[MI_SCREEN(mi)];
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button & Button1)
+    {
+      cc->button_down_p = True;
+      gltrackball_start (cc->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)
+    {
+      cc->button_down_p = False;
+      return True;
+    }
+  else if (event->xany.type == MotionNotify &&
+           cc->button_down_p)
+    {
+      gltrackball_track (cc->trackball,
+                         event->xmotion.x, event->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+
+  return False;
 }
 
 
@@ -956,13 +923,10 @@ draw_spheremonics (ModeInfo *mi)
   spheremonics_configuration *cc = &ccs[MI_SCREEN(mi)];
   Display *dpy = MI_DISPLAY(mi);
   Window window = MI_WINDOW(mi);
-  Bool mouse_p;
 
   if (!cc->glx_context)
     return;
 
-  mouse_p = mouse_down_p (mi);
-
   glShadeModel(GL_SMOOTH);
 
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
@@ -972,58 +936,46 @@ draw_spheremonics (ModeInfo *mi)
   glScalef(1.1, 1.1, 1.1);
 
   {
-    GLfloat x, y, z;
-
-    if (do_wander)
-      {
-        static int frame = 0;
-
-#       define SINOID(SCALE,SIZE) \
-        ((((1 + sin((frame * (SCALE)) / 2 * M_PI)) / 2.0) * (SIZE)) - (SIZE)/2)
-
-        x = SINOID(0.0071, 8.0);
-        y = SINOID(0.0053, 6.0);
-        z = SINOID(0.0037, 15.0);
-        frame++;
-        glTranslatef(x, y, z);
-      }
-
-    if (cc->spin_x || cc->spin_y || cc->spin_z)
-      {
-        x = cc->rotx;
-        y = cc->roty;
-        z = cc->rotz;
-        if (x < 0) x = 1 - (x + 1);
-        if (y < 0) y = 1 - (y + 1);
-        if (z < 0) z = 1 - (z + 1);
-
-        if (cc->spin_x) glRotatef(x * 360, 1.0, 0.0, 0.0);
-        if (cc->spin_y) glRotatef(y * 360, 0.0, 1.0, 0.0);
-        if (cc->spin_z) glRotatef(z * 360, 0.0, 0.0, 1.0);
-
-        rotate(&cc->rotx, &cc->dx, &cc->ddx, cc->d_max);
-        rotate(&cc->roty, &cc->dy, &cc->ddy, cc->d_max);
-        rotate(&cc->rotz, &cc->dz, &cc->ddz, cc->d_max);
-      }
+    double x, y, z;
+    get_position (cc->rot, &x, &y, &z, !cc->button_down_p);
+    glTranslatef((x - 0.5) * 8,
+                 (y - 0.5) * 6,
+                 (z - 0.5) * 8);
+
+    gltrackball_rotate (cc->trackball);
+
+    get_rotation (cc->rot, &x, &y, &z, !cc->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);
   }
 
   glScalef(7,7,7);
 
+  mi->polygon_count = 0;
+
   glScalef (cc->scale, cc->scale, cc->scale);
   glCallList (cc->dlist);
+  mi->polygon_count += cc->polys1;
+
   if (cc->mesher >= 0 /* || mouse_p */)
     {
       glCallList (cc->dlist2);
+      mi->polygon_count += cc->polys2;
       if (cc->mesher >= 0)
         cc->mesher--;
     }
   do_tracer(mi);
 
 
-  if (mouse_p)
+  if (cc->button_down_p)
     {
       char buf[200];
-      sprintf (buf, "%d %d %d %d %d %d %d %d",
+      sprintf (buf,
+               ((cc->m[0]<10 && cc->m[1]<10 && cc->m[2]<10 && cc->m[3]<10 &&
+                 cc->m[4]<10 && cc->m[5]<10 && cc->m[6]<10 && cc->m[7]<10)
+                ? "%d%d%d%d%d%d%d%d"
+                : "%d %d %d %d %d %d %d %d"),
                cc->m[0], cc->m[1], cc->m[2], cc->m[3],
                cc->m[4], cc->m[5], cc->m[6], cc->m[7]);
       draw_label (mi, buf);
@@ -1032,7 +984,7 @@ draw_spheremonics (ModeInfo *mi)
   if (!static_parms)
     {
       static int tick = 0;
-      if (tick++ == duration)
+      if (tick++ >= duration && !cc->button_down_p)
         {
           generate_spheremonics(mi);
           tick = 0;
diff --git a/hacks/glx/spheremonics.man b/hacks/glx/spheremonics.man
new file mode 100644 (file)
index 0000000..f714278
--- /dev/null
@@ -0,0 +1,92 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+spheremonics - 3d spherical harmonic shapes.
+.SH SYNOPSIS
+.B spheremonics
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-duration \fInumber\fP]
+[\-resolution \fInumber\fP]
+[\-wander]
+[\-no-spin]
+[\-spin \fI[XYZ]\fP]
+[\-wireframe]
+[\-no-smooth]
+[\-no-grid]
+[\-bbox]
+[\-fps]
+.SH DESCRIPTION
+These closed objects are commonly called spherical harmonics, although they
+are only remotely related to the mathematical definition found in the
+solution to certain wave functions, most notable the eigenfunctions of
+angular momentum operators.
+.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 \-duration \fInumber\fP
+Duration.  5 - 1000.  Default: 500.
+.TP 8
+.B \-resolution \fInumber\fP
+Resolution.  5 - 100.  Default: 64.
+.TP 8
+.B \-wander | \-no-wander
+Whether the object should wander around the screen.
+.TP 8
+.B \-spin \fI[XYZ]\fP
+Around which axes should the object spin?
+.TP 8
+.B \-no-spin
+Don't spin.
+.TP 8
+.B \-wireframe
+Render in wireframe instead of solid.
+.TP 8
+.B \-smooth | \-no-smooth
+Smoothed Lines.  Boolean.
+.TP 8
+.B \-grid | \-no-grid
+Draw Grid.  Boolean.
+.TP 8
+.B \-bbox | \-no-bbox
+Draw Bounding Box.  Boolean.
+.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 2002 by Paul Bourke and Jamie Zawinski.  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
+Paul Bourke and Jamie Zawinski.
diff --git a/hacks/glx/sproingies.man b/hacks/glx/sproingies.man
new file mode 100644 (file)
index 0000000..5a45f38
--- /dev/null
@@ -0,0 +1,64 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+sproingies - Q-Bert meets Marble Madness!
+.SH SYNOPSIS
+.B sproingies
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-size \fInumber\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Q-Bert meets Marble Madness!
+.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 \-count \fInumber\fP
+How many sproingies to draw at once.  Default: 5.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 25000 (0.03 seconds.).
+.TP 8
+.B \-size \fInumber\fP
+How much to scale the image down.  Default 0 (full screen.)
+.TP 8
+.B \-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 2002 by Ed Mackey.  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
+Ed Mackey.
diff --git a/hacks/glx/stairs.man b/hacks/glx/stairs.man
new file mode 100644 (file)
index 0000000..f741999
--- /dev/null
@@ -0,0 +1,56 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+stairs - Escher's infinite staircase.
+.SH SYNOPSIS
+.B stairs
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+This draws an "infinite" staircase. 
+.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 \-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 2002 by Marcelo Vianna.  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
+Marcelo Vianna.
diff --git a/hacks/glx/stonerview.man b/hacks/glx/stonerview.man
new file mode 100644 (file)
index 0000000..83d439d
--- /dev/null
@@ -0,0 +1,49 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+stonerview - 3D undulating ribbons of squares.
+.SH SYNOPSIS
+.B stonerview
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-wireframe]
+.SH DESCRIPTION
+Chains of colorful squares dance around each other in complex spiral
+patterns.  This is a clone of the SGI "electropaint" screen saver.
+.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 \-wireframe
+Render in wireframe 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 2002 by Andrew Plotkin.  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
+Andrew Plotkin.
diff --git a/hacks/glx/superquadrics.man b/hacks/glx/superquadrics.man
new file mode 100644 (file)
index 0000000..e925b17
--- /dev/null
@@ -0,0 +1,70 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+superquadrics - morphing 3d shapes.
+.SH SYNOPSIS
+.B superquadrics
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-spinspeed \fInumber\fP]
+[\-count \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Ed Mackey reports that he wrote the first version of this program in BASIC
+on a Commodore 64 in 1987, as a 320x200 black and white wireframe. Now it
+is GL and has specular reflections. 
+.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: 40000 (0.04 seconds.).
+.TP 8
+.B \-spinspeed \fInumber\fP
+0.1 - 15.0.  Default: 5.0.
+.TP 8
+.B \-count \fInumber\fP
+0 - 100.  Default: 25.
+.TP 8
+.B \-cycles \fInumber\fP
+0 - 100.  Default: 40.
+.TP 8
+.B \-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 2002 by Ed Mackey.  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
+Ed Mackey.
diff --git a/hacks/glx/trackball.c b/hacks/glx/trackball.c
new file mode 100644 (file)
index 0000000..a0efbea
--- /dev/null
@@ -0,0 +1,325 @@
+/*
+ * (c) Copyright 1993, 1994, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+/*
+ * Trackball code:
+ *
+ * Implementation of a virtual trackball.
+ * Implemented by Gavin Bell, lots of ideas from Thant Tessman and
+ *   the August '88 issue of Siggraph's "Computer Graphics," pp. 121-129.
+ *
+ * Vector manip code:
+ *
+ * Original code from:
+ * David M. Ciemiewicz, Mark Grossman, Henry Moreton, and Paul Haeberli
+ *
+ * Much mucking with by:
+ * Gavin Bell
+ */
+#include "config.h"
+#include <math.h>
+#include "trackball.h"
+
+/*
+ * This size should really be based on the distance from the center of
+ * rotation to the point on the object underneath the mouse.  That
+ * point would then track the mouse as closely as possible.  This is a
+ * simple example, though, so that is left as an Exercise for the
+ * Programmer.
+ */
+#define TRACKBALLSIZE  (0.8)
+
+/*
+ * Local function prototypes (not defined in trackball.h)
+ */
+static float tb_project_to_sphere(float, float, float);
+static void normalize_quat(float [4]);
+
+void
+vzero(float *v)
+{
+    v[0] = 0.0;
+    v[1] = 0.0;
+    v[2] = 0.0;
+}
+
+void
+vset(float *v, float x, float y, float z)
+{
+    v[0] = x;
+    v[1] = y;
+    v[2] = z;
+}
+
+void
+vsub(const float *src1, const float *src2, float *dst)
+{
+    dst[0] = src1[0] - src2[0];
+    dst[1] = src1[1] - src2[1];
+    dst[2] = src1[2] - src2[2];
+}
+
+void
+vcopy(const float *v1, float *v2)
+{
+    register int i;
+    for (i = 0 ; i < 3 ; i++)
+        v2[i] = v1[i];
+}
+
+void
+vcross(const float *v1, const float *v2, float *cross)
+{
+    float temp[3];
+
+    temp[0] = (v1[1] * v2[2]) - (v1[2] * v2[1]);
+    temp[1] = (v1[2] * v2[0]) - (v1[0] * v2[2]);
+    temp[2] = (v1[0] * v2[1]) - (v1[1] * v2[0]);
+    vcopy(temp, cross);
+}
+
+float
+vlength(const float *v)
+{
+    return sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
+}
+
+void
+vscale(float *v, float div)
+{
+    v[0] *= div;
+    v[1] *= div;
+    v[2] *= div;
+}
+
+void
+vnormal(float *v)
+{
+    vscale(v,1.0/vlength(v));
+}
+
+float
+vdot(const float *v1, const float *v2)
+{
+    return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
+}
+
+void
+vadd(const float *src1, const float *src2, float *dst)
+{
+    dst[0] = src1[0] + src2[0];
+    dst[1] = src1[1] + src2[1];
+    dst[2] = src1[2] + src2[2];
+}
+
+/*
+ * Ok, simulate a track-ball.  Project the points onto the virtual
+ * trackball, then figure out the axis of rotation, which is the cross
+ * product of P1 P2 and O P1 (O is the center of the ball, 0,0,0)
+ * Note:  This is a deformed trackball-- is a trackball in the center,
+ * but is deformed into a hyperbolic sheet of rotation away from the
+ * center.  This particular function was chosen after trying out
+ * several variations.
+ *
+ * It is assumed that the arguments to this routine are in the range
+ * (-1.0 ... 1.0)
+ */
+void
+trackball(float q[4], float p1x, float p1y, float p2x, float p2y)
+{
+    float a[3]; /* Axis of rotation */
+    float phi;  /* how much to rotate about axis */
+    float p1[3], p2[3], d[3];
+    float t;
+
+    if (p1x == p2x && p1y == p2y) {
+        /* Zero rotation */
+        vzero(q);
+        q[3] = 1.0;
+        return;
+    }
+
+    /*
+     * First, figure out z-coordinates for projection of P1 and P2 to
+     * deformed sphere
+     */
+    vset(p1,p1x,p1y,tb_project_to_sphere(TRACKBALLSIZE,p1x,p1y));
+    vset(p2,p2x,p2y,tb_project_to_sphere(TRACKBALLSIZE,p2x,p2y));
+
+    /*
+     *  Now, we want the cross product of P1 and P2
+     */
+    vcross(p2,p1,a);
+
+    /*
+     *  Figure out how much to rotate around that axis.
+     */
+    vsub(p1,p2,d);
+    t = vlength(d) / (2.0*TRACKBALLSIZE);
+
+    /*
+     * Avoid problems with out-of-control values...
+     */
+    if (t > 1.0) t = 1.0;
+    if (t < -1.0) t = -1.0;
+    phi = 2.0 * asin(t);
+
+    axis_to_quat(a,phi,q);
+}
+
+/*
+ *  Given an axis and angle, compute quaternion.
+ */
+void
+axis_to_quat(float a[3], float phi, float q[4])
+{
+    vnormal(a);
+    vcopy(a,q);
+    vscale(q,sin(phi/2.0));
+    q[3] = cos(phi/2.0);
+}
+
+/*
+ * Project an x,y pair onto a sphere of radius r OR a hyperbolic sheet
+ * if we are away from the center of the sphere.
+ */
+static float
+tb_project_to_sphere(float r, float x, float y)
+{
+    float d, t, z;
+
+    d = sqrt(x*x + y*y);
+    if (d < r * 0.70710678118654752440) {    /* Inside sphere */
+        z = sqrt(r*r - d*d);
+    } else {           /* On hyperbola */
+        t = r / 1.41421356237309504880;
+        z = t*t / d;
+    }
+    return z;
+}
+
+/*
+ * Given two rotations, e1 and e2, expressed as quaternion rotations,
+ * figure out the equivalent single rotation and stuff it into dest.
+ *
+ * This routine also normalizes the result every RENORMCOUNT times it is
+ * called, to keep error from creeping in.
+ *
+ * NOTE: This routine is written so that q1 or q2 may be the same
+ * as dest (or each other).
+ */
+
+#define RENORMCOUNT 97
+
+void
+add_quats(float q1[4], float q2[4], float dest[4])
+{
+    static int count=0;
+    float t1[4], t2[4], t3[4];
+    float tf[4];
+
+    vcopy(q1,t1);
+    vscale(t1,q2[3]);
+
+    vcopy(q2,t2);
+    vscale(t2,q1[3]);
+
+    vcross(q2,q1,t3);
+    vadd(t1,t2,tf);
+    vadd(t3,tf,tf);
+    tf[3] = q1[3] * q2[3] - vdot(q1,q2);
+
+    dest[0] = tf[0];
+    dest[1] = tf[1];
+    dest[2] = tf[2];
+    dest[3] = tf[3];
+
+    if (++count > RENORMCOUNT) {
+        count = 0;
+        normalize_quat(dest);
+    }
+}
+
+/*
+ * Quaternions always obey:  a^2 + b^2 + c^2 + d^2 = 1.0
+ * If they don't add up to 1.0, dividing by their magnitued will
+ * renormalize them.
+ *
+ * Note: See the following for more information on quaternions:
+ *
+ * - Shoemake, K., Animating rotation with quaternion curves, Computer
+ *   Graphics 19, No 3 (Proc. SIGGRAPH'85), 245-254, 1985.
+ * - Pletinckx, D., Quaternion calculus as a basic tool in computer
+ *   graphics, The Visual Computer 5, 2-13, 1989.
+ */
+static void
+normalize_quat(float q[4])
+{
+    int i;
+    float mag;
+
+    mag = (q[0]*q[0] + q[1]*q[1] + q[2]*q[2] + q[3]*q[3]);
+    for (i = 0; i < 4; i++) q[i] /= mag;
+}
+
+/*
+ * Build a rotation matrix, given a quaternion rotation.
+ *
+ */
+void
+build_rotmatrix(float m[4][4], float q[4])
+{
+    m[0][0] = 1.0 - 2.0 * (q[1] * q[1] + q[2] * q[2]);
+    m[0][1] = 2.0 * (q[0] * q[1] - q[2] * q[3]);
+    m[0][2] = 2.0 * (q[2] * q[0] + q[1] * q[3]);
+    m[0][3] = 0.0;
+
+    m[1][0] = 2.0 * (q[0] * q[1] + q[2] * q[3]);
+    m[1][1]= 1.0 - 2.0 * (q[2] * q[2] + q[0] * q[0]);
+    m[1][2] = 2.0 * (q[1] * q[2] - q[0] * q[3]);
+    m[1][3] = 0.0;
+
+    m[2][0] = 2.0 * (q[2] * q[0] - q[1] * q[3]);
+    m[2][1] = 2.0 * (q[1] * q[2] + q[0] * q[3]);
+    m[2][2] = 1.0 - 2.0 * (q[1] * q[1] + q[0] * q[0]);
+    m[2][3] = 0.0;
+
+    m[3][0] = 0.0;
+    m[3][1] = 0.0;
+    m[3][2] = 0.0;
+    m[3][3] = 1.0;
+}
+
diff --git a/hacks/glx/trackball.h b/hacks/glx/trackball.h
new file mode 100644 (file)
index 0000000..f7da950
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * (c) Copyright 1993, 1994, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+/*
+ * trackball.h
+ * A virtual trackball implementation
+ * Written by Gavin Bell for Silicon Graphics, November 1988.
+ */
+
+#ifndef __TRACKBALL_H__
+#define __TRACKBALL_H__
+
+/*
+ * Pass the x and y coordinates of the last and current positions of
+ * the mouse, scaled so they are from (-1.0 ... 1.0).
+ *
+ * The resulting rotation is returned as a quaternion rotation in the
+ * first paramater.
+ */
+void
+trackball(float q[4], float p1x, float p1y, float p2x, float p2y);
+
+/*
+ * Given two quaternions, add them together to get a third quaternion.
+ * Adding quaternions to get a compound rotation is analagous to adding
+ * translations to get a compound translation.  When incrementally
+ * adding rotations, the first argument here should be the new
+ * rotation, the second and third the total rotation (which will be
+ * over-written with the resulting new total rotation).
+ */
+void
+add_quats(float *q1, float *q2, float *dest);
+
+/*
+ * A useful function, builds a rotation matrix in Matrix based on
+ * given quaternion.
+ */
+void
+build_rotmatrix(float m[4][4], float q[4]);
+
+/*
+ * This function computes a quaternion based on an axis (defined by
+ * the given vector) and an angle about which to rotate.  The angle is
+ * expressed in radians.  The result is put into the third argument.
+ */
+void
+axis_to_quat(float a[3], float phi, float q[4]);
+
+#endif /* __TRACKBALL_H__ */
index 77210ecaab3defae89686a23b2674ee2f23ea53d..901ce678281dd7cc8e3735a3520b8cb2145fac09 100644 (file)
@@ -25,7 +25,12 @@ extern char *progname;
 #if defined(HAVE_GDK_PIXBUF)
 
 # include <gdk-pixbuf/gdk-pixbuf.h>
-# include <gdk-pixbuf/gdk-pixbuf-xlib.h>
+
+# ifdef HAVE_GTK2
+#  include <gdk-pixbuf-xlib/gdk-pixbuf-xlib.h>
+# else  /* !HAVE_GTK2 */
+#  include <gdk-pixbuf/gdk-pixbuf-xlib.h>
+# endif /* !HAVE_GTK2 */
 
 
 /* Returns an XImage structure containing the bits of the given XPM image.
@@ -47,16 +52,26 @@ xpm_to_ximage_1 (Display *dpy, Visual *visual, Colormap cmap,
 {
   GdkPixbuf *pb;
   static int initted = 0;
+#ifdef HAVE_GTK2
+  GError *gerr = NULL;
+#endif
 
   if (!initted)
     {
+#ifdef HAVE_GTK2
+      g_type_init ();
+#endif
       gdk_pixbuf_xlib_init (dpy, DefaultScreen (dpy));
       xlib_rgb_init (dpy, DefaultScreenOfDisplay (dpy));
       initted = 1;
     }
 
   pb = (filename
+#ifdef HAVE_GTK2
+       ? gdk_pixbuf_new_from_file (filename, &gerr)
+#else
         ? gdk_pixbuf_new_from_file (filename)
+#endif /* HAVE_GTK2 */
         : gdk_pixbuf_new_from_xpm_data ((const char **) xpm_data));
   if (pb)
     {
@@ -114,13 +129,18 @@ xpm_to_ximage_1 (Display *dpy, Visual *visual, Colormap cmap,
             }
           row += stride;
         }
-      /* gdk_pixbuf_unref (pb);  -- #### does doing this free colors? */
+      gdk_pixbuf_unref (pb); /* #### does doing this free colors? */
 
       return image;
     }
   else if (filename)
     {
+#ifdef HAVE_GTK2
+      fprintf (stderr, "%s: %s\n", progname, gerr->message);
+      g_error_free (gerr);
+#else
       fprintf (stderr, "%s: unable to load %s\n", progname, filename);
+#endif /* HAVE_GTK2 */
       exit (1);
     }
   else
index 078bb618c2815322300d70493bc5baaa6157d9fc..1f071fdf75d112396b604cf79a043cd1baaf1d58 100644 (file)
@@ -598,11 +598,11 @@ static unsigned char matrix0_bits[] = {
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfe,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xfb, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfd, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xff, 0xff,
+   0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xff, 0xff,
    0xff, 0xf6, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb,
    0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
    0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xff,
@@ -612,27 +612,27 @@ static unsigned char matrix0_bits[] = {
    0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xef, 0xf7, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xdb,
+   0xef, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xdb,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfb, 0xff, 0xff, 0xff, 0xff,
    0xef, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
    0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xff,
    0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xf7, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xf7, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff,
    0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff,
    0xff, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xfe, 0xff,
    0xff, 0xff, 0xff, 0x76, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xbf,
    0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xef, 0xff, 0xbf, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xef, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xf7,
    0xff, 0xff, 0xff, 0xbf, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xfe, 0xff, 0xff, 0x7f, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0x76, 0xff, 0xff, 0xfe, 0xff, 0xef, 0xff, 0xff,
    0xff, 0xff, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xfd, 0xff, 0xff, 0xf7, 0xff, 0x6d, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xfb, 0xfd, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xfe, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xfb,
    0xdf, 0xff, 0xdf, 0xff, 0xfb, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb,
    0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff,
@@ -642,13 +642,13 @@ static unsigned char matrix0_bits[] = {
    0xff, 0xff, 0x77, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xfd, 0xff,
    0xfb, 0xff, 0xdf, 0xfe, 0xff, 0xff, 0xbf, 0xef, 0xff, 0xff, 0xfb, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff,
+   0xdf, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff,
    0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd,
    0xfe, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xef, 0xff, 0xff, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xf7, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef,
+   0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xef,
    0xfe, 0xbf, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff,
    0xfd, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
    0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
@@ -658,7 +658,7 @@ static unsigned char matrix0_bits[] = {
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff,
    0xef, 0xff, 0xff, 0x7f, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xdf, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xdf, 0xfd, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff,
    0xfe, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff,
    0xff, 0xff, 0xee, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
index 7902d7d0cee69473d8e488d498410a5f8503245a..6422b25fe8e217740672b494900ec18ed8880ae9 100644 (file)
 /* XPM */
-static char *matrix0_xpm[] = {
-/* width height ncolors chars_per_pixel */
-"320 377 6 1",
-/* colors */
-"  c #1B641B",
-". c #165016",
-"X c #0B2A0B",
-"o c #081E08",
-"O c #030E03",
-"+ c #000000",
-/* pixels */
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOOOO++++++++++++++OOOOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOO+++",
-"++++++++++++++++++++++++++++OOOO+++++++++++++++++++++++++++++++++OOOoooooOOO+++++++++++OOoooOO++++++++++++++O++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++O++++++++++++++++O++++++++++++++++++++OO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOoooO++",
-"+++++++++++++++++++++++++++OOOOOOO+++++++++++++OOOOOOOO++++++++++OOoooooooOO++++++++++OOOXoooOO+++++++++++OOOOO+++++++++++++++++++++++++++++++++++++OOOOO++++++++++++++++OOOOO++++++++++++OOOOO+++++++++++++++++OOOOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOoooOO+",
-"++++++++++++++++++++++++++OOo...oOO+++++++++OOOooOOOooOOO++++++++OoooXXXXooOO++++++++OOoo...oooOO+++++++OOoooooO++++++++++++++++++++++++++++++++++++OooooO++++++++++++++OO..ooO++++++++++Ooo.XOO++++++++++++++OOO...OO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOo...OO+",
-"++++++++++++++++++++++++++Ooo...ooO+++++++++OoooXoooXooOO+++++++OOoXoXoXXoooO+++++++OOooX...oooOO+++++++OOoXXXXOO++++++++++++++OOOOOOO+++++++++++++OOoXooOO++++++++++++OOO.XooOO+++++++++oOo..oOO+++++++++++++OOo...oOO+++++++++++++++O++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOo.X.OO+",
-"++++++++++++++++++++++++++Ooo...ooO+++++++++OoooXoooXooOO+++++++OooXXXoXXoooO++++++OOOooX...XooOO++++++OOoooooXOOO++++++++++++OOooOoOO++++++++++++OOooXXoOO++++++++++++OoO..ooO++++++++++OooX.oOO+++++++++++OOOOo...ooOO+++++++++++OOOoOO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Ooo...OO+",
-"+++++++++++++++++++++++++OOoX...ooOO+++++++Oooo..ooo..oooO+++++OOOXooXXXXoooOO++++OOooXXXXXX..oooO+++++OOoXXoXoooO+++++++++++OOoo...XoOO+++++++++OOoo...ooO++++++++++OOooooXOOO+++++++++OOOoXXoooO+++++++++OOoooo...oooooO+++++++++OO...OO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOoooooOO+",
-"+++++++++++++++++++++++++OOoX...XoOO+++++++OOoo..Xoo..ooo++++++OoOoXXXXXXoooO+++++OOXoXXXXXX..ooO+++++OooooXoXoooO++++++++++OOoXX...XoO+++++++++++Ooo...oOO+++++++++++OooXXXOOO+++++++++++OOoXoooO+++++++++Oooooo...ooooo++++++++++OO...OO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OooXXXooO+",
-"++++++++++++++++++++++++++ooo. .ooo++++++++Oooo..ooX..ooOO+++++ooXXXX....XXooO++++OoXXXooooooXoOoO+++++OoooXoXoXoOO++++++++OOooXXoooooOO+++++++++OOoXoooOO+++++++++++OOXoXoooO+++++++++++OOoXoXXoOO++++++++Oooo.......oooO++++++++OOoX..oOO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOO..oooO++",
-"+++++++++++++++++++++++++OOoX...XoOO+++++++OooX..ooo..ooO++++O+oooXX.....XXXOO++++OOXXXXooooooooO+++++OoooXoXoXoooO+++++++++OooXXoooXoOO+++++++++OOoXoXoOO+++++++++++OOXoXXoOO+++++++++++++OoXoXXOO++++++++Oooo.......oooO++++++++OOo...oOO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOoX.ooOO++",
-"++++++++++++++++++++++++++ooo...ooO++++++++OOoo..ooo..oOO+++++OoooXXX....XXooOO+++OOXXXoooooXoooOO+++++OoooXoXoXoOOO+++++++OoooXXoooooO++++++++++OOXooooOO+++++++++++OOXoXooO+++++++++++++OOooXoooO++++++++OoooX......oooO+++++++OOOo.X.ooOO+++++++++++++++++++++++++++++++O+O+O+O+++++++++++++++++++++++++++++++++++OoO..oOO+++",
-"+++++++++++++++++++++++++OOoX. .Xoo++++++++OOoooooooooOOO+++++OooX..XXo..XXoo+++++OOoXX..XXXoooOO++++++OOooXXXXoXooO++++++++Ooo..oooOoOO++++++++++OooOOO+++++++++++++Oo...ooO+++++++++++++OOoo...OO+++++++++Ooooo...ooooOO+++++OOOooo...OoOOO++++++++++++++++++++++++++OOOOOOOOOOOOOO++++++++++++++++++++++++++++++OOoooXooOO+++",
-"++++++++++++++++++++++++++ooo...ooOO++++++++OOOooOOOooO++++++OOooo..XXX..oXXOO++++OOooo..XoXooooOO++++++OOXooXoXooooO++++++OOooX.ooOoOOOO++++++++++OOOO+++++++++++++OOO...oOO++++++++++++++OOo...oOO+++++++OOOooo...oooOO+++++OOOoOoo...ooooOOO+++++++++++++++++++++++OOOoooooooooooOOO+++++++++++++++++++++++++++++OooXoXOO++++",
-"++++++++++++++++++++++++++Ooo...ooO+++++++++OO+OOOOOOOO+++++++Oooo..ooo..ooOO++++++OoooooXXX..oooO+++++OOOoXXXXXooOO+++++++OOoo..XXXooooOO+++++++++O++++++++++++++++OOo..XoOO+++++++++++++++Oo...oO+++++++++Ooo..ooX..ooO+++++Oo.............oO+++++++++++++++++++++++Oo.............oO+++++++++++++++++++++++++++OOOXXXooOO++++",
-"++++++++++++++++++++++++++OOo...oOO++++++++++++++++O+++++++++OOOoo..Xoo..oooOO+++++OOOoooXXX..XXoOO++++OOoXoXXXXooOO+++++++OOoo..XXXoooooO+++++++++++++++++++++++++++OO...oO+++++++++++++++OOO..XoOO+++++++OOOo..ooo..ooOO++++Oo.............oO+++++++++++++++++++++++Oo.............oO++++++++++++++++++++++++++++OoXXXooO+++++",
-"++++++++++++++++++++++++++OOo...OOO++++++++++++++++++++++++++OOooo..ooo..oOOO++++++OOOooXoXX.XXooo+++++OOOoXXXXXoooOO++++++Oooo..XXXoooooO++++++++++++++++++++++++++OOo...OOO++++++++++++++OOo...OOO+++++++OOOo..ooo.XooO+++++Oo.. ... .. ...oO+++++++++++++++++++++++OO.............oO+++++++++++++++++++++++++++OOOXXXooO+++++",
-"+++++++++++++++++++++++++++OOX..oO+++++++++++++++++++++++++++OO...... ...XXoO+++++OOooooooooXoXXXOO++++OooooXXXXXXooO+++++OOoooXo.....XXoOO+++++++++++++++++++++++++OOO...OoO+++++++++++++OOOO...OOO++++++++OOooooooooOOO++++++OoOooo...ooooOOO+++++++++++++++++++++++OOooooooooooooOOO+++++++++++++++++++++++++++OooXXXoOO+++++",
-"+++++++++++++++++++++++++++Oo...OO+++++++++++++++++++++++++++Oo..........XXXO++++++OooXooooooXXXXOO++++OooooXXXXXXXoo+++++OooXXXo.....XooOO+++++++++++++++++++++++++OOOoXXooO++++++++++++++OooXoXOO+++++++++OOOooOOOooOOO++++++OOOooo...ooOoO+++++++++++OOOO++++++++++O+OOOOOOOoOOOOO++++++++++++OOO+++++++++++++OOooXXXOOO+++++",
-"+++++++++++++++++++++++++++OOOoOOO+++++++++++++++++++++++++++OOooXXXXXXXXoOOOO++++OoXXX..XXX..oXooO++++OOOooXXoooXooOO++++OOXXXXoooo..oooO+++++++++++++++++++++++++++OooXXooOO++++++++++++OoooXXooO++++++++++OO+O++OOOO+++++++++++OOo...oOOO++++++++++++OooooO++++++++++++OOOOO++OOO++++++++++++OOoooO+++++++++++OOoXoooOO++++++",
-"++++++++++++++++++++++++++++OOoOOO+++++++++++++++++++++++++++OOoooXXXoXoooOO++++++OOXXX..oXo..XooOO+++++OOOOoXXoooXoOO++++OOXXXoXoXX..oooOO++++++++++++++++++++++++++OOoooXXOO++++++++++++OOXXoooOO+++++++++++++++++++++++++++++++OOo..XoOOO+++++++++++OOooooOO++++++++++++++++O+++++++++++++++OoooooOO++++++++++OooXoooOO++++++",
-"+++++++++++++++++++++++++++OOOOoO+++++++++++++++++++++++++++++OoooXXXXoXXOOO++++++OOoXX..XXX..XXoO+++++++OOoXoXoooXoO+++++OooXXXoXoo..oooOO+++++++++++++++++++++++++++OoXoXooOO++++++++++OOooXXooO++++++++++++++++++++++++++++++++OOO...oO++++++++++++OOooXooo+++++++++++++++++++++++++++++++++OOooXoOO+++++++++OOoXXXooO+++++++",
-"+++++++++++++++++++++++++++OO...OO+++++++++++++++++++++++++++OOoooXXXXXoooO+++++++OOooooo...oooOOO++++++++OOXXXXXXoXOO+++++OoXo.... XX...oO++++++++++++++++++++++++++OOoooXXOOO++++++++++OOoXXoooO+++++++++++++++++++++++++++++++++OO...OOO+++++++++++Ooo...oo+++++++++++++++++++++++++++++++++Ooo...OO+++++++++OooX.oOOO+++++++",
-"++++++++++++++++++++++++++++O...O+++++++++++++++++++++++++++++OoooXXXXXooOO++++++++++OOOo...oOO++++++++++++OooXoXoooO+++++OOooX.....XX...OO++++++++++++++++++++++++++++Ooo..ooO++++++++++Ooo..ooOO++++++++++++++++++++++++++++++++OOoX..OO++++++++++++Ooo...ooO+++++++++++++++++++++++++++++++OOoo...OO++++++++OOoo.XoOO++++++++",
-"++++++++++++++++++++++++++++OOOOO+++++++++++++++++++++++++++++OoooXXoXXXoOO++++++++++OOOO...oOO++++++++++++OOoOOoOOOO++++++OOOooooOoooooOOO+++++++++++++++++++++++++++++OO..ooo+++++++++OOooX.OO+O++++++++++++++++++++++++++++++++++OOOOO++++++++++++OOoXoooOO+++++++++++++++++++++++++++++++++OOooOoO+++++++++OoooXooO+++++++++",
-"+++++++++++++++++++++++++++++O++++++++++++++++++++++++++++++++OOooXXXoXooO+++++++++++++OooooOO++++++++++++++OOOOOOO+++++++++OOOOOOOOOOOOO++++++++++++++++++++++++++++++OOO..ooO++++++++++OOo..oOO++++++++++++++++++++++++++++++++++++OOO+++++++++++++OOXoXooOO++++++++++++++++++++++++++++++++++++OOO+++++++++OOoXoXoOO+++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOoooXoooooO+++++++++++++OOoXoOO++++++++++++++++++++++++++++++++++OO+O++++O+++++++++++++++++++++++++++++++OOOO+OO++++++++++OOOOO++++++++++++++++++++++++++++++++++++++++++++++++++++++++OoXoooOO+++++++++++++++++++++++++++++++++++++++++++++++++OooXooOO+++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOoOoooOOO+++++++++++++OOoooO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++O+O+++++++++++++++O+O++++++++++++++++++++++++++++++++++++++++++++++++++++++OOoooOO++++++++++++++++++++++++++++++++++++++++++++++++++OOoooooO++++++++++",
-"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOO+OO+++++++++++++++++OOOOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOOO+++++++++++++++++++++++++++++++++++++++++++++++++++OOoooOOO++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++O++++++++++++++++++++++++++++++++++++++O+O++++++++++++++++O+O++++++++++++++++++++++++++++++++++++O+OO+O++++++++++++++++++++O++++++++++++O+OOOOOO++++++++++++++++O+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"+++++++OOOOOOO++++++++++++OOOOOO++++++++++++++OOOOOOOO+++++++++++OOOOOOOO++++++++++++++++OOOO+++++++++++OOOOOOOOOOO++++++++++++++OOOOOOO++++++++OOOOOOOOOOOOO+++++++++OOOOOOOO+++++++++++++OOOOOOO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"+++++OOoooXooOOO++++++++OOOoooooO++++++++++++OOooXoXooOO++++++++OOooXoXooOO+++++++++++++OoooooO++++++++OOOoXoXoXooooO++++++++++OOOooXoooOO+++++OooooXooooXoooO+++++++OOoooXoOoOO+++++++++OOOoooooOOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOOOOOOO++++++",
-"++++OOOoooXoooOO+++++++OOOoooXoooO+++++++++OOOoooXoXoooOOO++++OOOoooXoXoooOOO+++++++++OOOoooooOO+++++++OoooXoXoXXoooO+++++++++OOOoooXoXooO++++OOooXoXXXXoXoooOO++++OOOOoooXXooOoO++++++++OOoXXooooOOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOooooOOOO+++++",
-"+++OOoo..XXX..oooO++++OOoXX.....OO+++++++++Oooo..XXX..oooO++++Oooo..XXX..oooO+++++++++OOo.....OO++++++Oooo..XXXXXXooO++++++++OOo.....XoXOO++++OOXXXXXXXXXXXXXOO++++Oooo..XoX..oooO++++++OO.XXXXXXXXXOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOo.......oOO++++",
-"+++Oooo..XXX..ooo+++++OOXXX.....oO++++++++OOoXo..XXX..XooOO+++OoXo..XXX..XooOO++++++++Ooo.....OO++++++OOoo..XXoXXoooO++++++++Ooo.....XXooO+++++OoXXXXoXXXXXXXOO+++OOoXo..XXX..XooOO++++OOo..XXXXXXXXOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOO++++++++++++++++++++++++++OOOO++++++++++++++++OOo.......ooOO+++",
-"++OOooo..oXo..oooOO++++OoXX.....oOO++++++++oooX..oXX..XXoOO++OOooX..oXX..XXoOO+++++++OOoo.....oOO+++++Oooo..XXXXXXooOO+++++OOOoo.....XXoOO++++OOXXoXXXXXXXXXXOO+++OoooX..XXo..XXoOO++++OOoX.XXXXXXXXOO+++++++++++++++++++++++++++++++++++++++++++++++++++++OOOOOOOO+++++++++++++++++++++++OOOOOOOOO+++++++++++OOoO.......oooO+++",
-"++OOXXXoooooooXXXOO+++OOOOooo...OOO+++++++OOXXXoooooooXXXOO++OOooooooooooXXXOO+++++++OOXXXXo.XoO++++++OoooXXoooooooOO++++++OOo..oooooOooO++++++OOOoOoOoOoXoXoOO+++OOXXXoooooooXXXOO++++oooXXOoooo...oOO++++++++++OOO+++++++++++++++++OOO++++++++++++++++OOOooo...oO++++++O+OOOOOOO+O++++++O...oXOOOO++++++++++OOooXXooooXXoXOO++",
-"++OOXXXoooooooXXXOO+++++OOOoo...oO+++++++++OooXooOooooXXXoO+++OoooooOooXoXXXoO++++++OOOXoXoX..oOO+++++OoooXXoooooooOO++++++OOoX.XXooooOO+O+++++++OOOOOoooXXoXOO+++OoXXXoooooooXXXoO++++oooXXooOooX.Xoo++++++++++OOOOOO++++++++++++++OOOOOO+++++++++++++OOOOoooX.Xoo+++++OOOOOOOOOOOOO++++O+.X.XXooOOOO+++++++++ooooXoooXXXXXoO++",
-"++OOXXXooOOoooXXXOO+++++OOOOo...Oo++++++++OOOOOoOOOoXoXXXOO+++OOOOOoOoo..XooOO++++++Ooo..ooo.XoO++++++Oooo.......oooO++++++Ooo..ooXooooOO++++++++++OOOooXXoooOO+++OOoXXXooooXoXooOO++O+oooXXooOoo...oOO+++++++O+oo...OO+++++++++++O+oo...OO++++++++++OOooXXXXXoooOO+++OOooXooXoXooXooO++++OOoOoX...ooOO++++++++OoooooOoooXXoOO++",
-"+OOOXXXoooOOooXXXoO+++++++OOoX..oOO+++++++++OOOOOOOooXXXXOO+++++OOOOoOo..XXXOO+++++OOOO..ooo..oOO++++++ooo.......XooOO++++Oooo..oXoXXooOO++++++++++++OOOXXoooO++++OOXoXoXooooXXXXOO+++OoooXXoOoOo..XooO++++++++Ooo...OO++++++++++++Ooo...OO+++++++++OOOOoXXXXXoooOO+++OOoXoXXoXoXXoXoOO++++OOoXo...oooOOO+++++OOOoooOooooXXXoO++",
-"+OOoXXXooOOoooXXXOO+++++++OOo...OOO++++++++++++OOOoooXXXXOO++++++OOOoooX.oXoOO+++++Oooo..ooo.XoOO+++++Oooo.......oXoOO++++Oooo..oXoXooooOO+++++++++++OooXXooo+++++OOoXXXooooXoXoooO+++OoooXXooooo...oOO++++++++Ooo...OO++++++++++++Ooo...OO++++++++OOooooXXXXXoOOO++++OOXoXoXXXXoXoXXOO++++OOOoo...XooOOOO+++++OOooooOoooXXXOO++",
-"++OOXXXoooOOooXXXoO+++++++OOoX..oO++++++++++++OOOooo..oooOO+++++O+oo.....oooOO++++OOooooXooo..oOO++++++OOooXoooXX...oO+++++ooo.....XX...OO+++++++++++OOO..oOOO+++++oooo.......oooO+++++ooo..ooooo...oOO++++++++OoooXooO++++++++++++OoooXooO+++++++OOooX..ooooOOOO++++OOOXXXXXoXXXXXXooO++++++OoooooXX...oOO++++++OOoooo..XooOO++",
-"++OOXXXooOOOooXXooO+++++++OOo...OOO++++++++++++OOooo..oOOO+++++++Ooo.....oooOO++++OOXXXXXooo..oOOO++++OOOoooooooX..XoOO++OOooo.....XX.X.OO++++++++++OOoo.XoO++++++OOooo.......oooo+++++ooo.XoooXX...oo++++++++++oooXoOO+++++++++++++oooXoOO+++++++OOXoX..XXoooO++++++OOooXXXXXXoXXXXooO+++++++OOoooXX...ooO+++++++OOooX..oXoOO++",
-"++oOXXXooOOoooXXXOO++++++++OO...oO++++++++++++Ooo...oooOO+++++++++OOoooXXXXXoO++++OO...XXXXX..oooO++++++OOOoOOOoO...oO++++Oooo..ooooo...oOO+++++++++OoooXXOOO+++++OOXXXXXoooXXXXXOO++++OOOXX...oX...oOO+++++++++OOOOOO++++++++++++++OOOOOO++++++++OoXXX..oooOOO+++++++OoooXooXXXXooXXOO+++++++OOOooXo...ooO++++++OOo...oooOOO+++",
-"++OooXXooOOOooXXXoO+++++++OOoX..oOO++++++++++OOoo...ooOOO++++++++OOOooooXXXXOO++++OO...oXXXo..XooO+++++OOOOOOOOoo.X.ooO+++Oooo..ooooo...oOO+++++++++OoooXXOO++++++OOXXXXXoooXXXXXOO++++OOOoX...XX...ooO++++++++++O+O+++++++++++++++++O+O++++++++++OOXXX..oXooOO++++++OOoXoXXoXXXoXXoXOO+++++++OOOooXX...ooO+++++++OO...oooOO++++",
-"+OOoXXXooOoOooXXXOO++++++++Oo...Oo++++++++++OOOoo...ooO++++++++OOOOOOoooXXXXOO+++OOO...XXXXX..oooOO+++O+OOOOOOOOo...oOO+++Oooo..oooOo.X.ooO++++++++OoooXoXOO+++++OOOXXXoXoooXoXXXoO+++++OooX ..Xo..XoO++++++++++++O+O+++++++++++++++++O+O++++++++OOOXoX..oooooOO++++++OooXoXoXoXXXXoXOO++++++OOOoooXo...ooO++++++OOO...ooOO+++++",
-"++OOXXXoooOOooXXXOO++++++OOOo...oOO+++++++++Ooo..XoXoOOO++++++OOooOOOOoooXXXOO+++OOooXXoXXXX..XooOO+++OOooOOOOOoo...oOO+++Oooo..Ooooo...OOO++++++++OOoXXoooO++++++OooXXoooooooXXooO+++++OOOoooooo...oOO+++++++++++++O+++++++++++++++++++O+++++++++OOOoOoo...oXoOO+++++OooXXXXXXXoXXXXOO++++OOOoo...XooOOOO+++++++OOOoXXOOO++++++",
-"++OOXXXoooooooXXXoO++++++OOOoX..ooOO+++++++OOoo..oooooOO+++++OOoooOoOooooXXXoOO+++OOXoXXXXXX..XXoO++++OoooOoOoOoo...oo+++++ooo..oooOo...oOO++++++++OoXoXXoO+++++++OoXXXXooooXoXXXOO+++++OOOoooooo...OO+++++++++++OOOO++++++++++++++++OOOO+++++++++++OOooo...XXooOO+++OOOXXXXXoXXXXoXooO++++OOOoo...XoooOO+++++++++OooXooOO++++++",
-"++OOXXXoooooooXXoOO+++++OOooo...OoOOO+++++OOooo..XXoooOOO++++OOooooooOoooXXXOO++++OOXoXXoXXX..oXoo++++OoooooooOoo..XoOO++++ooo..oooooX..oO+++++++++OOoXoXoO+++++++OOXXXoooooooXXXOO+++++OOOoooooo.X.OO+++++++++OOOOOOO+++++++++++++OOOOOOO+++++++++++OOoo..XXXoooOO+++OOoooXXoXoXXoXoOO+++OOoooX...ooOOO++++++++++OOoXooO+++++++",
-"++OOooo..oXo..oooOO++++OOoooo...Xoooo++++++oX....oXXoooooO+++Oo...oXoXX..XooOO++++OOOOoooXXX..XooOO+++OoXo..ooXX.XXXOO+++++OOoX.XXXXX...oOO++++++++Oo...OoOO+++++++oooX..ooo..XoooO++++OOOXoXXX..XXoOOO+++++++++oo...OO++++++++++++Ooo...OO++++++++++++OOOooXo...oo++++OOoOOOoOOOOoOOO++++O.X.XXooooOOO+++++++++++OoXooOOO++++++",
-"+++Oooo..oXX..oooO+++++OoooXX...XooooO+++OOO.....XoXXoooo++++OO...XXooX..XoXO++++++OOOOooXoX..oXoOO+++OooX..XoX..XXXOO+++++OOO..XXXoX..XoO+++++++++OO...oO+++++++++OoXo..XXX..XXoOO++++OoooXoXo..ooXOO+++++++++Ooo...OO+++++++++++OOoo...O++++++++++++++OOOOoo..Xoo++++O+OOOOOOOOOOOO+++++O.X.oXOoOOO+++++++++++++OOoXoOO+++++++",
-"++++OOoooXoXoooOO+++++OOooXoXXXXXXXooO++++OoooXXXXXXXXXooO+++OOoooXXXXoXooOOO++++++++OOooXXXXXXooO++++OOOoooXXXXoOoOOO++++++OOoOXoXXXoooOOO++++++++OooooOOO+++++++OOOOoXoXXXXooOO++++++OOooXXXXoooOO+++++++++++OoooXoOO++++++++++OOO..oooOO+++++++++++++++OOOOOoOOO+++++++O++++O++++++++++OOOooOOO+O++++++++++++++OOoXoO++++++++",
-"+++++OOooXXXooOOO++++++OooXXoXoXXXoXoO++++OoXXoXXXXoXXoooO++++OooooXXXXXooOO+++++++++OOoooXoXoXooo++++OOOooXXoXoXOOO+++++++++OOooXoXooooO+++++++++++OXXoOO+++++++++OOOOoXXoXoooOO++++++OooXoXXXoooOO+++++++++++OooXXXOO+++++++++++OO..oooOO++++++++++++++++OOOOOO+++++++++++++++++++++++++OOOOOO+O++++++++++++++++OOooXOO+++++++",
-"++++++OoooXoooO+++++++OOooooXXXooXoooOO+++OOooXooXoXXoXooOO++++OoooXoXoooOO++++++++++++OoXoXXXoooO+++++++OooXXoXoOO+++++++++O+OoooXoXoOO+++++++++++OOoooO++++++++++++OooooXoXoOO+++++++OOooXooooOOO+++++++++++++OooooOO++++++++++OOO..oooO+++++++++++++++++++++++++++++++++++++++++++++++++OOO+++++++++++++++++++++OoooO++++++++",
-"++++++++OOOOOOO++++++++OOOoOOOooOOOOO+++++OOoOooOoOOoOOOO+++++++OOOOoOoOOO+++++++++++++O+OOOOOoOO+++++++OOOOOoOOOOO++++++++++++OOOoOOOOO+++++++++++++OOOO+++++++++++++OOoOoOOOOO++++++++OOOoOoOOO+++++++++++++++OOOOOO+++++++++++OoooooOOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOO+O++++++++",
-"+++++++O+OOOO++++++++++++OOOOO+OOOOO+++++++++OOOOOOOOOOO+++++++++OOOOOOOO+++++++++++++++OOOOOO+O++++++++++O+OOOOO+++++++++++++++OO+OO++++++++++++++++++++++++++++++++++++OOOO++++++++++++++OOOOO++++++++++++++++++OO+++++++++++++OOoooOO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++O+++++++++",
-"+++++++++++++++++++++++++++++O+O+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++O+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++O+OOOOO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"+++++++OOOOO++++++++++++++++O++++++++++++++++O+O+O+O+++++++++++++++++O+O+++++++++++++O+O+O+O+++++++++++++O+O+OO+O++++++++++++O+O+OO+O+O++++++++++++++O+O+++++++++++++O++++++++O++++++++++++O+O+O+O++++++++++++++O+O+O+O++++++++++O++++++++O++++++++++O+O+O++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"+++++OOOOOoOOO+++++++++++OOOOOOO+++++++++++OOOOOOOOOOO+++++++++++++OOOOOOOOOO++++++OOOOOOOOOOO+++++++++OOOOOOOOOOOOO+++++++OOOOOOOOOOOOOO++++++++++OOOOOOOOOO++++++OOOOOOOOOOOOOOO+++++++OOOOOOOOOOOO++++++++++OOOOOOOOOO++++++OOOOOOOOOOOOOO++++++OOOOOOOOO+++++++++++OOOOO+++++OOOOO+++++OOOOO++++OOOOO++++++++++OOOOOO+++++++",
-"++++OOooX...ooO++++++++OOooooXooOO++++++++OoooXooXoooOOO++++++++OOOoooooXooOoO+++OOoooXooXooooOO++++++OoooXoXooXooooO+++++OoooXoXooXoooooOO+++++OOOoooooXooOoO+++OOoooXooOOOoooXooO++++OooooXoXoooooo++++++++OooooXooooooO+++OOoooXooOOooooooO++++OooooXoooOO++++++++OOooooOO+++OOooooO++OOooooOOOOOoooooO++++++OOOooooooOO+++++",
-"++++OOoXX...ooOO+++++++OOoooXoooOO+++++++OOooXoXoXoXooOOO+++++++OOoooXXoooooooO+++oooXoXoXoXooOOO++++OOooXoXoXoXXoXoOO+++OOooXoXoXXoXXXoooO+++++OOoooXXoooooooO+++ooXooXooooXoXoooo+++O+oooooXoXXooooO++++++O+oooXoXXXXoooO+++ooXooXooooXoXooOO++OOoXXoXoXooOO+++++++OooooooOOOOOooXooo+++OoooooOOOoooXoooO+++++OOooXoXooOOO++++",
-"++OOooooX...oooO+++++++OoooXoXXooOO++++++OooXoXXoXoXoooOOO++++OOOOooXoXXooooooO+OOoooXoXXoXoXooOoO+++OooXoXXoXXoXXoXOO+++OooXoXoXoXXooXoooO+++OOOOooXoXXooooooO+OOoooXoXoooooXoXooo+++OOooXXoXoXXXoooO++++++OOooXoXoXoXooo++OOoooXXoXooooXXooOO++OOooXoXoXooOO+++++++OooXXoooOOOoooXooo+OOooXooooOOooXoXooO+++OOOOooXoXoXoOOOO++",
-"+++OoooXXooo..oOO++++++Oooo.....ooO++++++OOXXX..XXXXX...OO++++OoXo..XXXXX...XoO++Ooo...XXXXXXX..XOO++OOXXX..XXXXX...oOO++OOXXX..XXXXX...XoO+++OoXo..XXXXX...XoO++Ooo...XXoooXX...oo++++OoooXX...oXXooO+++++++OooXXX..XXXooO++Ooo...XXooo..XXXoO++OooXX..XXXoo++++++++Ooo...oooOooo...oo++Oo.....ooooX...ooO+++OooXX.XXXXo...OO++",
-"++OOoXoXXooo..oOO++++++OoXo.... ooOO+++++OOXXX..XXXXX.X.OO+++OOooX..oXoXX...XXO++Ooo...XXXXXXX...oO++OOXXX..XXoXX...oOO++OOXXX..XXoXX...XXO++OOooX..oXXXX...XXO++Ooo...XXoooXX...oo++++OooXXX...XoXooO++++++OOooXoX..XXXoo+++Ooo...XXooo..XXoOO++OOXoX..XoooO++++++++Ooo...XoooooX.. oo++Oo.....oooXo...ooO++OOoXo..oXXXX.X.OOO+",
-"++OoXXXooXXo..oooO+++++OOooXXXXXXXOO++++OOOoooXXooooo...oOO+OOO...oooooooXooXoO++OOoXXXooOoOooX..oo+OOOoooXXooooo...oo++OOOoooXXoooooooooXO+OOO...oooOoOoXooXoO++OOoXXXoooooooXXXoO+++++OOOOo...ooOOO++++++++OOOoooXXoooOOO++OOoXXXooXXXXXoOoO++++OOoo..oooOOO++++++OOoo. .XXoooXX...oo+OOOXXX..ooooo...ooO+OOo...oooOooo...ooO+",
-"+OOoXXXooXoo..oooOO+++++OOoXXXXXXXOO+++++OOoooXXooooo...oOO++OoX..ooOOOOOoXoXXO++OOoXXXooooOOo...oo++OOoooXXooooo.X.OOO++OOoooXXoooooXoXXoO++OoX..oooOoOooXoXXO++OOoXXXooooooXXXXoO+++++OOOoo...oOOOO+++++++++OOOOoXXoooOO+++OOoXXXoXXXXXXoOOO++++OOOo..ooOO++++++++OOoo...XXoooXX...oo+OOoXXX..ooooo...oOO++OO...oooOOOo...ooO+",
-"++OOXXXXo.....ooo+++++++OOooXXXXXooOO+++++OoooXXooooo...ooO+OOo...oooOOOooooooO+++OOXXXooOOOooX..oo+++OoooXXooooo..XoO++++OoooXXoooooXooXoO+OOo...ooOOOOOoXoXoO+++OoXXXXooooooXXXoO+++++++OOO...ooO+++++++++++++OOoXXXooOO++++OOXXXooXXXXXOO+++++++OOoX.ooOO+++++++++Ooo...XXoooXX...oO++OooXX..XXooo..XooO+OOO...ooOOoOoX..XoO+",
-"++OoXXXoX.....oooO++++++OOo..ooo..oOO++++OOooX..oXoXX..XoOO+OOoX..ooOO++OOOoOOO++OOoXXXXoOOOOooXXXo+++OoooXXooo..oooOO+++OOooXXXoooX.ooOOOO+OOoX..ooOOOOoOoooOO+++OOXXXXoXoXXXXXXOO+++++++Ooo.X.OOO+++++++++++++OOoXXoooO+++++OoXXX.....ooOO+++++++OOo..OoOO+++++++++Ooo.....ooo.....oo++OoXXXoXXXXoo...oOO+OooX..ooOOOOooXoXoo+",
-"++OOXXXXXXXXXXoooO+++++OOoo..ooo..ooOO++++Oooo..oXXoX...ooO++oo...oOO+++++OOO+++++OOXXXooOOO+ooooXo++OOoooXXooo..ooOO+++++OoooXXooo.XoOOOO+++oo...oOOOOOOooOoOO++OOoXXXXXXXoXXXXXoO++++++++OO...oOO++++++++++++++OOXXoooO++++OOOXXX.....ooOO+++++++OOoX.oOO++++++++++OOo.....ooo.....oo+OOOXXXXoXXXoo...oOO+OOo...oOO++OOoXoXoO+",
-"++OOXXXXXXXXXXoooO+++++OoooXXoooXXooo+++++Oooo..XXXXX...ooO+OOo..XoOO++++++++++++OOOXXXooO+OOOoXoXX+++OooX......XooOO+++++Oooo.......oOO++++OOo...oOOOOooooooo++++OOXXXXXoXXXXXXXOO+++++++OOo...oO++++++++++++++OOOXXoooO++++OOoXXX....XooOO++++++++Oo..oOO++++++++++OOo.X.oX...Xo...Oo++OOXXXoo...oo.X.oOO+OOo..XoOOO+OoooXXXO+",
-"++OOXXXXo.....XXoOO+++OOoooXXoooXXoooO++++Oooo..oXXoX...ooO+OoO...oOO++++++++++++OOOXXXooOO+OooooXX++OOooo.......oOOO+++++Oooo......XoOO++++OOo.X.ooOOOXoXXXooO++OOOXXXXXXXXXXXXXoO++++++++OO..XoOO+++++++++O+O+OOoXXoooO+++++OOXXX.....ooOO++++++++OoX.ooOO++++++++OOOo...oX...Xo...oO+OOoXXXoo...oo...ooO+OOo...oOO++OOoXooXO+",
-"+OOooXXoX.....oooOO++++OooXXXoooXXoooOO+++Oooo..XXXXX...ooO+OOo...oOO++++++++++++OOooXXooOO+OOoXoXo+++Oooo.......oOOOO++++OooX.......oO+++++Ooo...OOOOOoXooXooO++OOooXXXXXXoXXXXooO+++++++OOo...oO+++++++OOOOOOOOOOXXoooO++++OOOXXX.....ooOOO++++++OOo.XooOOOOO++++++OooX..Xo...XX.X.oO++OOXXXoo...oo..XoOO+OOo...oOOO+OOooXXXO+",
-"++OoXXXXooXoXXXXoO++++OoXXX.......XXXOO+++OoooXXooooooXoXXO+OOo.X.ooOO++++OOO+++++OoXXXooOOOOooXoXX+++OooXXXooo..ooooO++++OoooXXXoo.XOOO+++++Oo...ooOooXX...XoO+++OoXXXoooooooXXXoO++++++O+OO...oOO++++++OooXXOOOOoXXoooO+++++OoXXXooXoX..oOO+++++++OO..ooOOOoooO++++OOo...ooXXXoo...oo+OOoXXXoXoooXX...ooO+OooX..oOO+OOoXXoXoO+",
-"++OOXXXoXoXoXXoXoo+++OOOXXX.......XXXOO+++OooXXXoOoOoXoXXoO+OOo...OoOO+OOOOOOO++++OoXXXooOOOOoooXoX+++OoooXXooo..oooooO+++OoooXXooo..OO+++++OOoX..ooOOOXX..XXoo+++OoXXXoooooooXXXOO+++++++OoO..XoOO++++++OoXXXOoOOoXXoooO+++++OOXXXXoXXo..ooOO+++++OOo.XooOOOoooOO+++OOo...ooXoXoo..XoO++OOXXXXoXXoXX.X.OOO++Oo...ooOOOOOoXXXXO+",
-"+OOOXXXXoXXXoXXooOO+++Oo...XoXooXo...oO++OOoooXXoooooXXoXXO+OOOXXXXoOOOOOoooooO++OOOXXXooOOOOo...oo++OOooXXXooooooXoXoO++OOoooXXoooooO+++++++OoXXXooooooooXXXXO++OOOXXXXoOooXoXXXoO++++++OOOo...oOOO++++OOoX..oOooo..oooO++++OOoXXXoooooXXXooOO++++OoO..ooooo.X.oO+++OooX..ooOooOo...oo++OoXXXooooo.....ooO+OOOXXXoooOOoo...ooO+",
-"++OOooXoXoooooooo+++OOOo...oXoooXo...oo++OOoooXXooOoooXXXoO+OOOXXXoXooOoooXXooO++OoOXXXooooooo...oo+++OoooXXoooooXooXXO++OOooXXXooooOO+++++++OOXXXXoooOooXoXoXO++OooXXXooooOooXXXoO+++++OOOoo...oOOO++++OOo...oooOo..ooOO++++OOoXXXXooooXXoXoo+++OOOoo..ooooo..Xoo+++OOo...ooOOoOo.X.oo++OoXXXooooo.....oOO+OOOXXXXoooOoo...ooO+",
-"++OOXoXXooooXoooOO+++Ooo...Xoooooo...oo++OOoXoXXoooooXXoXXO++OooXXXooooooXoXXoO++OOoXXXXooOoooX.Xoo++OoooXXXooooooXoXoO++OooooXXooOooOO+++++O+ooXXXoooooooXXXoO++OOOXXXXoOooXoXXXoO+++++OOOoO...oooOO++++oO...ooooo..ooo+++++OoOXXXoooooXXXXooO+++OOOO..ooooo...oOO+OOooX.XoooOOoo...oo+OOOXXXXooooX....ooO+++ooXXXoooooo...oOO+",
-"++OOooo.......ooOO+++Ooo.....ooX.....oo++Oo.............oOO+++OoooXX.....XXXoOO++Ooo..........XXoOO++Oo....... .....XXO++Oo........oo+++++++++Oooo.......XXoooO++OoX.....ooo.....oo++++OoXo.......XooO+++OOoXo.....XXOOO+++++Ooo.....oOooo...oo++Oo.............oO+++OoX...XoOoOoX...oo+OOo.....oOooX...oO++++Oooo.......oooOOO+",
-"+++OOoo.....X.ooO+++OOoX.....ooo.....Xo+OOO.............oOO++O+OOoXo.....XXooOO+OOoX..........XoXOO++OO.............XoO++OO........oOO+++++++OOOOo.X.....XXXoOO+OOoo.....ooo.....Xo+++OOooX.......XXoO+++OOXoX.....XooO++++++Ooo ....ooOoo...Xo++OO.............oOO+OOoo ..oXOOOXo...Xo++Oo.....OoOXo...oOO+++OOOo.X.X...XooOO++",
-"+++OOOoX.....XoOO++++OOoooooooOOooooooO++OOoooooooooOoOOOO++++OOOOoOooOooOoOO++++OOoooooooooooOoOO+++OOoooooooooooooOoO++OOooooooooOO++++++++++OOOOOoooooOOOO+O++OooooooOOOOooooooO++++OoOooooooooOoOO+++OOOOooooooOoOO++++++OooooooOOOOOooooOO++OOoooooooooooooOO++OOoOooooOOOOOoooooO++OOoooooOOOOooooOO++++OOOOOooooOoOoOO+++",
-"+++++OOOOooooOOOO++++OOOOoOoOOOOOOooOOO+++OOOoOoOOOOoOoOO+++++++++OOOOoOOOOOO++++++OOoOoooOoOOOOO+++++OOOooooOooooOOOOO+++OOOooooOOO+++++++++++++OOOOOoOoOOOO+++++OOOooOoOOOOOoOOOO+++++OOOOoooOooOOO++++++OOOOOoOoOO+++++++++OOoOOoOOOOOOOOOOO+++OOoOoOoOoOooOOO+++++OoOOoOOOOOOOOOOOO+++OOooOOOOOOOOOOO+++++++++OOOOoOOOO+++++",
-"+++++OOOOOOOOOO+++++++OOOOOOOOOOOOOOOOO+++OOOOOOOOoOOOOO++++++++++OOOOOOOO+++++++++OOOOOOOOOOOO+++++++OOOOOOoOOOOOOOOO++++OOOOOOOOOO++++++++++++++OOOOOOOO++++++++OOOOOOOOOOOOOOOOO+++++OOOOOOOOOOOOO++++++++OOOOOO+O++++++++++OOOOOO++++OOOOOO++++OOOOOOOOOOOOO++++++OOOOOOO++OOOOOOOO++++OOOOO++++OOOO++++++++++OOOOOOO+O+++++",
-"+++++++++OOO+++++++++++++O+O++++O+++O++++++++O+OO+++++++++++++++++++++OOO+++++++++++++O++O++O++++++++++++++O++++++O+++++++++++++OO++++++++++++++++++++O+O+++++++++++++++++++++OOO+++++++++O+++OOOO++++++++++++O+OOO++++++++++++++O+O+++++++O+++++++++OO+OOOOO+O++++++++++O+++++++++O++++++++++O++++++++++++++++++++++++O++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOOO+++++++++OOOOO++++++++++++++++++++OOOOOO+++++++++++++++++++++++++++++++++++++++++++++++",
-"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OoooooOO+++++++OoXoOoO++++++++++++++++OOOoooooO++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++O+++++++++++++++++++++++++++++++++++++++O++++++++++++++++++++++++++++++++++++++++O++O++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++O+++++++++++++++OOOooXoooOO++++++OoXXoOO++++++++++++++++OOooXoooOO++++++++++++++OO+++++++++++++++++++++++++++++",
-"+++OOOOOOOOOOOO+++++++++++OOOOOOOO+++++++++OOOOOOOOOOO+++++++++++++OOOOOOOOOO+++++++OOOOOOOOOOOOO++++++OOOOO+O+OOOOOOO+++++OOOOOO+++OOOOOOO++++OOOOOO+++OOOOOOO++++OOOOOOOOOOOOOOOO++++OOOOOOOOOOOOOOOO+++++OOOOOOOOOOOO++++++++++Oo...XXoOO+++++OOoooXoOO+++++++++++++++OooXX...OO+++++++++++++OoooO+++++++++++++++++++++++++++",
-"+OOOooooooooOOOOO+++++++OOOoooOoOOO++++++OOOoooooooOOOO++++++++++OOOooooooOOOO++++OOOoooooooooOOoO+++OOOoOoOOOOOOoOOOO+++OOOoOOOOOOOOOoOOOO++OOOoOoOOOOOOOoOOOO++OOOoooOOOOOoooOOOO++OOOoooOOOOOoooOOOO++OOOOooooooooOoOOO++++++++OO...XXoOO+++++OOoooXXOO+++++++++++++++OOoXX...oO+++++++++++OOOoooOO++++++++++++++++++++++++++",
-"+OO.X..X.....XooO++++++OOoooX....oooO+++OOoo.X..X...XooOO+++++++OOO.X...X....OO+++OO.X..X..X.....oO++OO.....oooXX...ooO+OOoo...XXOOOXo...oo+OOoo...XooOOXo...oo++OoXX....oooX....oo++OoXX....oooX....oo+++OoXo.X........OO+++++++OOo...XooOO++++++OoooXooOO++++++++++++++OoOXX...oOO++++++++++OOo...oOO+++++++++++++++++++++++++",
-"+Oo......X...XXooO++++OOOoXX...X.oooO++++OoX........XXoOOO+++++OOoo...X....X.oO++OOo............XoO++Oo.....oOooo...XoO++OoX...oXOOOXX...Xo++OoX...XXoooXX...Xo++OoX.....ooo.....Xo++OoX.....ooo.....Xo++OOXXX....X.....oOO++++++OOo...ooOO+++++++OOoo..oOO+++++++++++++++OOoO..XoO+++++++++++Ooo...ooO+++++++++++++++++++++++++",
-"OOO..........oXooOO+++OOooXX.....oooOO+++ooo........oXoooO++++OOOooX.........Oo++OOo.............oo+OOoX..X.oooXX...oXO+Oooo...XooOooo...Xo+OOXoX..XoooooX...oX+OOoo.....ooo.....Xo+OOoo.....ooo.....Xo++OoooX..........oO++++++++OO...oOO++++++++++OoX.ooOO++++++++++++++OOOo...oOO+++++++++OOoo...ooOO++++++++++++++++++++++++",
-"OOOoooXXoooooXXXXoO+OOOXXXoXooooo...oOO++Ooo...oooooXXXXoOO++++OoXXXXooooo...oO++OooX..oo...oo...Oo+OOo...oooOOoo...ooO++Ooo...oooOooo...oo+OOoo...ooooXoo...oo+OOoo...oXoooXo...oo+OOoo...oXoooXo...oo++OOXXXoooooXo..XoOO++++++OOo...oOO++++++++++OOooXooO+++++++++++++++OOo..XoO++++++++++OOoXXXXXoOO++++++++++++++++++++++++",
-"+OoooXXXoooooXXXXoO++OooXXXoooooo...ooO+OOOoX..XoXooXoXXXOO+++OoXoXXXXooXo...oo++OOo...oo...ooX..oO++OoX..oooOoOo...ooO+OOoo.X.ooOOOooX..oo++Ooo...oooXooo...oo++OOO...XXoooXX...oO++OOO...XXoooXX...oO++OoXXXXoXooXX...oO++++++++OO.X.oOO+++++++++OOooXoXooO++++++++++++++OOO...oOO++++++++OOoXoXXXXXoO++++++++++++++++++++++++",
-"++OoooXXooooooooXXO+OOo...oooooooXXXooO++OOoXXXoooooooXXXOO+++OOXXXoooooooXoXOO++OOo...oo...oo...oO++OoXXXooOOOOoX..ooO++OOoXXXooOOOooXXXOO++Ooo...oX...oo...oo++OOOooo..XXX..oooOO++OOOoooXXooo..oooOO++OOooXooooo..oooOO+++++++OOo...OOO+++++++++++OoXoXoOO++++++++++++++OOo...OOO++++++++OOo..oooX.Oo++++++++++++++++++++++++",
-"+OOoooXXooOoooXoXXO+OOo...ooOOOOOXXXXXO++OOOXXXXooooXoXXXoO+++OOXXXXooooooXXooO+++OoX..oo...oo..Xoo+OOOXXXooOOOOo..XooO+++OOXXXoooOOooXXXoO++OOoX..oo...oo..Xoo+++OOooo..XoX..oooO++++OOoooXXooo..oooO+++OOoXoooooo..oooOO+++++++OOO...oO+++++++++++OOoo...oOO++++++++++++++OoX..oO+++++++++OOO..ooo..oOO+++++++++++++++++++++++",
-"++OooXXXooOoooXoXoO+OOo...ooOOOOooXXooO++OOoXXXoooooooXXoOO+++OOXoXoXoooOooXooO++OOoX..oo...oo...OO++OoXXXoooOOOO...oOO++OOoXXXooOoOooXXXoO++Ooo...oX...Xo...oO++++Oooo..XXX..oooO+++++OoooXXooo..oooO++++Ooooooooo..oooO++++++++OOoX..oOO+++++++++++OOo...OOO+++++++++++++OOo..XoOO++++++++OooX.oooX.oOO+++++++++++++++++++++++",
-"+OOoooXXooOoooXXXXo+OOoX..oOOOOOOXooXXo+++OOXXXXXXoo..XXooO+++OOooo.....XooooOO++++OoOooo...oOooOOO+OOOXXXooOOOOo.X.oOO+++OOooXoooOooooXoOO++OOo...XX...XX..XoO+++++Ooooo...oooOO+++++++OOoXX...XXoOO++++++OooooXXXXXooO++++++++++Oo.X.oO+++++++++++++OOoXXooO++++++++++++++OO...oO++++++++OOOoooOOoooOoO+++++++++++++++++++++++",
-"++OoooXXoooooXoXooO+Ooo..XoOO++OOoXoXoO++OOOXXXoXoXo..oXoOO+++OOooo.....oXooooO+++++OOooo...ooOOOO+++OoXXXooOOOOO...oOO+++OOXoXXooOooXXXooO++OOoX..oX...Xo...oo++++++OooX...XooOOO++++++OOOXX...XooOO+++++++OOooXXXXXOOO+++++++++OOo.X.oOO+++++++++++++Oooo..OO++++++++++++OOo...OOO++++++++OOooooOOooOOO+++++++++++++++++++++++",
-"++Oooo.......XXXooO++oo..XoOOOOOoooXoXO+++OoXXX.....XXoooO+++++OOooooooX.....OO+++++OOOOo...ooOOO+++OOOXXXooOOOOoX..ooO++++OoooXXoooXXoooO+++Ooo.....oXo.....oO+++++OOooXXXXXooO+++++++++OOoo...ooO+++++++++OOoo..XooOO+O++++++++OOO...oO+++++++++++++++OOoX.oOO+++++++++++OOO...oO++++++++++++OOO+OOOOO++++++++++++++++++++++++",
-"++Oooo.......XXXoOO+OOo...ooOOOOoXXXooo++OOOXXX.....XXoOOO+++++OOOoooXoX..X..OO+++++++OOo..XoOO++++++OOXXXooOOOOo..XoOO+++OOoooXXoooXXoooO+++OOo.....oXo...X.oO+++++OOooXXXXXXoOO++++++++OOoo...OoOO++++++++OOoo...ooOOO+++++++++OOo...oOO+++++++++++++OOOoXXooOO++++++++++OOo...oOO++++++++++++++++++++++++++++++++++++++++++++",
-"++Oooo.......XXooOO++OO...oooooooXXXXoO++OOoXXX.....XXooOO++++OOOoooooXo...X.oO++++++OOOO...oOOO++++OOoXXXooOOoOoX..ooO+++++oooXXoooXXoooO++++OoX....Xoo....Xoo+++OOOoooXXXXXoooOO++++++++OoO...oOO+++++++OOOoXo...ooooOO+++++++++OoX..oO+++++++++++++++OOOXXoooO++++++++++OOO.X.oO+++++++++++++++++++++++++++++++++++++++++++++",
-"++OooXXXoooooooOO+++OOOoXX..ooooX...ooO+++OOXXXooooo..oooOO+++OOXoXooooooo...oO+++++++OoO...oOO++++++OOXXXooOOoOo...OOO+++++OoO..ooo..oOO++++OOoXXX..ooo..XXXOO+++OOooX..ooo..oooOO+++++++Ooo...OOO++++++++OoO..ooooooXooO+++++++OOo..XoOO+++++++++++++++OOXXoooO++++++++++OOo...Oo+++++++++++++++++++++++++++++++++++++++++++++",
-"+OOoooXXoooooOOOO++++OOXoo..oXoXX...ooO++OOoXXXooooo..oooOO++OOoXXXooooooo..Xoo++++++OOOo...ooO+++++O+ooXXooooooo.X.oo+++++++OoX.ooo..oOO+++++OOXXX..Xoo..XXXoO+++Ooooo..ooo..oXoOO++++++OOOoX..ooOO++++++OOoo..oXoooXXXoOO++++++OOO...ooO+++++++++++++++OOooXoXOO+++++++++OoO...oOO++++++++++++++++++++++++++++++++++++++++++++",
-"+OoXXX..XXoooOO++++++OOoXX..oXoXo...oOO++Ooo...XXooooX...oO++OOo...XooXoXo...oO++++++Oooo...oooO++++++OooXXXoooXoXXXOOO++++++OooX...oooO+++++OOoXXXXXoooXXXXXOO++Ooo. .XXoooXX...oo++++++OOoX...ooOOO++++OOoXX..XXoXo...OOO++++++OOo...OOOO++++++++++++++OOooXXXOO++++++++OOoo..XoO+++++++++++++++++++++++++++++++++++++++++++++",
-"+OOXoX..XoXooO+++++++OOOOoXX...XXoooooO+OOoo...XoOooXX..Xoo++OOo...XXXooXX...oO+++++OOooX...ooOOO+++++ooooXXXXXoXXXXoO+++++++OOXo...XoOOO+++++OOoXXXXoooXXXXXoO+O+oo...XXoooXX...oo+++++OOoXo...XooO+++++OOXoX..oXXoX...oo++++++++OoX..XoOO+++++++++++++++OOo...oOO++++++OOOoo...oOO++++++++++++++++++++++++++++++++++++++++++++",
-"+OOXXXX.XoooOOO+++++++OoooXX...XXoooooO++OooX..oXoOOoo...oO++OOo...XoXoXoX..XoO+++++OOooo...XooOO+++++OooXXXoXoXoXXoOO+++++++OOoo...XoOO++++++OoXXXXXoooXXXXooO+OOoo...XXoooXX...oo+++++OOooX...oooOO++++OOoXX..XoXoo...oO++++++++Oo...oXoOO++++++++++++++OOO.X.OO+++++++OOooX...OOO++++++++++++++++++++++++++++++++++++++++++++",
-"+OOoXXXXXXXooO+++++++++Ooo..XXX.....ooO+++ooXXXXXOooooXXXoo+++OoXoXXXXXXXXoooOO+++++OOoXXXXXXXoOO++++++OOooXXXXXXoooOO++++++++OooXXXooO+++++++OOoooooOOOoooooOO++OooXXXXXoooXXXXXoo+++++OOoXXXXXXXOoO+++++ooooXXXXXXXXXooOO++++++OOoX..XooOO++++++++++++++++oX.XoO+++++++OOooo...oO++++++++++++++++++++++++++++++++O+O+O+O+O++++",
-"+OooXXoXXXooO+++++++++OOoo..XXX.....ooO++OoooXXoXOOOOooXooo++OOOoooXoXXXXXoooO+++++++OOXXXXXoXoOO++++++OOOoXoXXXXoooO+++++++++OoooXXooO++++++++OooXoooOOoXoXoO+++OooXXXoXoOooXXXooo+++++OOooXXXXXXOOO+++++OoooXXXXXXXXXooO++++++++OOXXoXXooO+++++++++++++++OOooOOO+++++++OooXXXXooO++++++++++++++++++++++++++++OOOOOOOOOOOOOOO++",
-"++OOOOOOOoOOO++++++++++ooo..XXX...X.ooO+++OOOOOoOO++OOOOOOO++++OOoOoOoOOOOOOO++++++++OOOOOOoOOOO+++++++++OOoOoOOOOO++++++++++++OOOOOOO+++++++++OOOOOOOOOOOOOO+++++OOOOOoOOOOoOOoOOO++++++OOOOOOOOOOO++++++OOoOOOoOOOOOoOO++++++++++ooXXXXoOO+++++++++++++++++OOOO++++++++OOoXXXXXOOO++++++++++++++++++++++++++OOooooooooooooooo+",
-"++OOOOOOOO++O+++++++++++OoooooOoooooOO++++OOOOOO+O+++OOOO++++++O+OOOOOOOOOO+O++++++++++OOOOOO+++++++++++++OOOOOOOO+++++++++++++OOOO+O+++++++++++O+OO++O+OO++O++++++OOOOOOOO+OOOOO+O+++++++OOOOOOOO++++++++++OOOOOOOOOOO+O+++++++++OOoXoXooOO+++++++++++++++++OOO+++++++++OOooXoXoOO++++++++++++++++++++++++++OoOooXoXoXooXXXooo+",
-"+++++O++++++++++++++++++OOOOOOOoooOOO+++++++O++++++++++++++++++++++++++O++++++++++++++++++O++O++++++++++++++++O+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++O+OO+++++++++++++++++OOOO++++++++++++++OOOOOOOOO++++++++++++++++++++++++++++O+OOOoOoOO++++++++++++++++++++++++++++oooXoXoXoXooXoXoo+",
-"+++++++++++++++++++++++++OOOOOOOOOOOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOOO++++++++++++++++++++++++++++++++++O+OOOO+++++++++++++++++++++++++++OOooXXXXXXXXXXXXXXX+",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"+++++++++++++++++++++++++++++++++++++++++++OOOO+++++++++++++++++++++++++++++++++++++++++++++OOOO+++++++++++++++++++++++++++++++++OOOOOOOO++++++++++++++++++++++++++OOOO+++++++++++++++++++++OOO+++++++++++++++++++OOO++++++++++OOOO+++++++++++++++++++OOOOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++OOO+++++++++++++++++++++++++++++++OOOOOOO++++++++++++++++++++++++++++++++++++++++++OOOOOOO++++++++++++++++++++++++++++++OOOOoooOOO++++++++++++++++++++++++OOOOOOO++++++++++++++++++OOOOOO++++++++++++++++OOOOOO+++++++OOOOOOO++++++++++++++++OOOOoOOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"+++++OOOoooO++++++++++++++++++++++++++++OOoo...oOO+++++++++++++++++++++++++++++++++++++++OOO..XooOO++++++++++++++++++++++++++++OOXoXX....OO+++++++++++++++++++++OOoo...oOO++++++++++++++++OOo...OO++++++++++++++OO...oo++++++OO...ooO+++++++++++++++OOo.....OO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"+++++OOooooOO++++++++++++++++++++++++++++OXo...ooO++++++++++++++++++++++++++++++++++++++++Oo..XXXOO+++++++++++++++++++++++++++OOooXX.....oO++++++++++++++++++++++OXo...ooO++++++++++++++++OooX.XOO++++++++++++++OO.X.ooO+++++Oo...XooO++++++++++++++Ooo.X.X.OO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"+++++Ooo...oOO+++++++++++++++++++++++++++OooXXXooO++++++++++++++++++++++++++++++++++++++O+OOooXXXOO++++++++++++++++++++++++++OOoo...ooooOO+++++++++++++++++++++++OooXXXooO++++++++++++++++OooXXXOO+++++++++++++OOOXXXooO+++++OOoooXXOO+++++++++++++++OOoo...OO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"+++++OOo...ooO+++++++++++++++++++++++++++OOOXXXooOOO++++++++++++++++++O+O+++++++++++++++OOOoXoXXXoO++++++++++++++++++++++++++OOoo...oooooOO+++++++++++O+O++++++++OOOXXXooOOO+++++++++++++OoooXXXoOO+++++++++++OOOoXXXooOO++++OOooXXXoOOO+++++++++++++OOoo...oOO++++++++++++O+O+O++++++++++++++++++++++++++++++++++++++++++++++++",
-"+++++Ooo...oOO+++++++++++OOOOOOOO++++++++OooXXXoooOOOO++++++++++++OOOOOOOOOOO+++++++++OOOOoOoXXXXOO+++++++OOOOOOOO+++++++++OOOooo...oooooO+++++++OOOOOOOOOOOO++++OooXXXoooOOOO+++++++++++OOooXXXOO++++++++++++OOooXXXooO+++++OOoooXXoOOOOOO++++++++++OOoo...oO++++++++OOOOOOOOOOOOOO+++++++OOOOOOOOOOO++++++++++++OOOOOOOO++++++",
-"++++++OOoXoXoOO+++++++++OOOoooooOoO+++++++OOXXXoXoooooOOO+++++++OOOooooooooooO+++++++OOooooXooXXXoO+++++OOOoooooooOOO++++++OOooXXXXXXXoooO+++++OOOoooooooooooO++++OOXXXoXoooooOO++++++++OOoXoXooOO++++++++++OOooooXooooOO+++++ooooXXooooooOo++++++++++OOo.X.oOO++++++OOoooooooooooooOO++++OoooooooooooOO++++++++OOOoooooooOOO+++",
-"++++++OOoXoXoOO+++++++OOOoooXooooOOO++++++OoXXXXoXXooooOOO+++++OOOooooXoXooooOO++++OOOoooXoXoXXXooO++++OOOoooXoooooOOO+++++OoooXXXXXooXooO++++OOOooooXoooXoooo++++OoXXXXoXXoooOOO+++++++OOOooXoXOOO+++++++++OoooooXoXooOO+++++OoooXXOoooooooO+++++++++OOo...OOO+++++OoooooXoXoXooooooOO+OOOoooooooooooOOO++++++OOOoooXoooooOOO++",
-"++++++OOOOoooO+++++++++OoXo.......oOO++++OOOXXX.......oXoO++++OOoXo..XXX.....oO+++OOoXo.......XXXOO+++OOooX..XXX..XXoO+++++OoXo.....XXXooOO++OOooX..XXX.....ooO++OOOXXX.......oooO++++++OooXX...oO++++++++++OooXXX.....OO++++OOoooXXooo..XooO++++++++++OO...oO++++++Ooo.............ooO++Ooo...XXXXX..oooO++++OOooX..XXX..XXoO++",
-"+++++++OOOOooO++++++++OOXXX......XoOO++++OOoXXX.......XXooO+++OooXX..XXX.....oO+++OooXX.......XXXoO+++OoXXo..XXX..oXXOO+++OOoXo.....XXXooO+++OoXXo..XXX.....XoO++OOoXXX.......XooO++++++OooXX...oOO+++++++++OoXoXX.....OO+++++OoooXXXoo..Xooo+++++++++OOoX..Oo++++++Ooo.............Xoo+OOoX...XXXXX..oooO++++OoXXo..XXX..oXXOO+",
-"+++++++++OOooO++++++++OOooXX..X...ooOO++++OOXXX.......XXXOO+++OOXXX..XXX.....oo+++OOXoX..X....XXXoO+++OOoXX..XXX..XoXoO++++OoXo.....XXXXoOO++OOoXX..XXX.....ooO+++OOXXX.......oooOO+++++OOoXX...oO+++++++++OOooXXXX.X..oOO++++OoooXXXoX..oXoO++++++++O+Oo...oOO+++++ooX.............XoO++ooo...XXXXX..XooOO+++OOoXX..XXX..XXooO+",
-"++++++++++++++++++++++OOoooXoXoo..ooo+++++OoXXXXXOoooo...oO++OOoX..ooooooo...oO++Ooo...oooooXXXXooO++OOo...oXooooX...OO++++OOOoooXXXoOOOOO++OOo...oooooXXXXXoOO+++OoXXXXoooooXXXXOO++++++OOoo...OOO+++++++++OOOOooooo.XoO+++++OooX.....oXoOOO+++++++++OOO..XoO++++++OOoXXXooXXXXXoooXXO++OooXXXXXoooooXXXOO++OOo...ooooooo...oO+",
-"++++++++++++++++++++++OoooooXoXo..oooO+++OOOXXXoXoOooo...oo+++oo...ooOOooo...oO+++OO...oooOooXXXXOO++OOo...XooooXo...oo+++++OOoXoXXoooOO++++OOo...oooooXXXXXoOO++OOOXXXXXoOoXoXXXoO+++++O+OOO...oO++++++++++++OOOOooo..oOO+++OOooo.....oooOO++++++++++OOo...oOO+++++OOoXXXoXoXoXoXXoXoo+++OoXXXXXoooXXXXXoO++OOo...oooOooo...oO+",
-"++++++++++++++++++++++OOXXX..XXX..ooOO++++OOXXXooooooo.X.Oo++OOo...oooOOoooooOO++Ooo...oooOoooXXXoO++Ooo.............oO+++++OOOoXoXXOOOO++++OooX..ooOOOooXXXoOO+++OOXXXooooOooXXXOO+++++++OoO...oOO+++++++++++++OOOoo.XoO+++++Oooo.....ooOO++++++++++++OoX..OOO+++++OOOXXXoXXXXXXooXXoo++OOOXXXoooOoooXXXOO++OooX..oooOOoo.X.oO+",
-"++++++++++++++++++++++OoXXX..XXX..oooO+++OOoXXXXoOOOOo...oo+++oO...oOOOOOOoooOO++OOO...ooOooooXXXoO++OOo.............oO++++++OOXoXXooOO+++++OOo...ooOooooXXXoO+++OOOXXXooOOoooXXXoO+++++++OOo.X.oO++++++++++++++++OOo..oO+++++Oooo.....oooOO++++++++++OOo...oO+++++++OoXXXooXoXoXoXoXXO+++OoXXXooOoOooXXXoO++OOo...oOOOoOo...oo+",
-"+++++++++++++++++++++OOOXXX..XXX..oooO++++OOXXXoooooOo...Oo++OooX..oOOOOOOoOoOO++OooX..OoOOoooXXXOO++OOo.............oO++++++OOoXoXooO++++++Ooo...ooOOoooXXXOO+++OOooXXoooOoooXXooO+++++++OOo...oOO++++++++++++++OOoo.XoOO++++Oooo.....ooOO+++++++++++OOo...oOO+++++OOoXXXXoXXXoXoXoXoO+++OooXXooOoOooXXooO++Ooo...ooOOOooX.XoO+",
-"+++++++++++++++++++++OOo...ooooo..oooOO++OOoXXXXXoOooo...oO+++Oo...ooOOOOOoooOO++OOo...oooooXXXXXoO++Ooo...XXoooooXXXoO+++++OOoXoXXooOO++++++OO...oooooXXXXXoOO+++OoXXXooOOOooXXXoO++++++OOoO...oOOO+++++++++++++OOoo..OO++++OOoooXXXXX..oOOO++++++++OOOoX..ooOO+++++OoXXXooXXXXXoXoXXo++OOoXXXoooOoooXXXoO+++OO...oooOooo...oo+",
-"+++++++++++++++++++++OOoX..ooooo..XooO+++OOoXXXXXooooX..XoO++OOo...oXoOOoOooooO++OOo...XooooXXXXXoO+++Oo...XXoXoXoXoooO+++++OOooXoXXoOOOO+++OooX..oXoooXXXXXOO+++OOoXXXoooooooXXXOO+++++OOOoo...oOOO++++++++++++OOoOo..oOO++++OooXXXXoX..ooOO++++++++OOoo...OOOO++++OOoXXXXoXXoXooXoXoo++OOoXXXoooOoooXXXOO++OooX..ooooooX...OO+",
-"+++++++++++++++++++++OOo...ooooo..oooOO++OOoXXXXXooooo...oo+++OO...oooooooooooo+++OO...XooooXXXXXoO++OoO...oXoooooXXXOO++++OOoooXXXooooOO++++Oo...oooooXXXXXoOO++OOoXXXoooOoooXXXoO+++++OOOooX..oooOOO+++++++OOOOOooo.XoO++++OooooXXXXo..oooOO++++++OOooo...oooOOO++OOoXXXooXXXoXXoXXXo++OOoXXXXoOooXoXXXoO+++Oo...Xoooooo...oo+",
-"+++++++++++++++++++++OOoX............oO++Ooo..........oXoOO++OOOoXX..........oo++OOOooX..........oo+++OOooX..........oO++++OooX.......oooO+++OOoXX.......XXooO+++Ooo.....ooo.....oo+++OOoXo.......oXoO+++++++OooooXoXXXOO++++Oo...Xoooo.....ooO+++OOooXX......oXoO++Ooo...XXoXX..XoX..o++Ooo.....ooo.....oo+++OOoXo.......oooOO+",
-"++++++++++++++++++++++OO.............OO++Ooo..........oXoOO++++oooo...X......oo+++OOXoo..........oo++++ooXo.........XOO++++OoXo.......XXoO++++oooo.......XXXOO++OOoo.....ooo.....oo++++OooX.......XooO+++++OOoooooXXXXXOO++++OO...XXooo.....ooO++++OooX.......XooO++Ooo...XXXXo..XXo..o++Ooo.....oOo.....oo++++oooX.......XXoOO+",
-"++++++++++++++++++++++OOoOoooooooooooOO++OoooooooooooooOOO+++++OOooooooooooooOO++++OOoOoooooooooooo++++OOooooooooooooO+++++OooooooooooooOO++++OooooooooooXXXoO+++OoooooooOOOooooooO++++OooooooooooooOO++++++OooXXXXXoooOO++++OOooooOoOoooooooOO+++OOooooooooooooOO++Ooooooooooooooooooo++OooooooooOOooooooO++++OOoOoooooooOoOO++",
-"+++++++++++++++++++++++OOoOoooooooooOO++++OOoooOooooooOOO+++++++OOOOoooooooOOOO+++++OOOoOoooOooooOO++++++OOoooooooOOO+O++++OOOooooooooOOO++++++OOOooXoXoXXXXOOO+++OOoooOoOOOooooooO+++++OOOoooooooOOO+++++++OoXoXXXXXoOO++++++OOooOoOOOoooooOO++++++OOOoooooooOOO++++OOooooOoOoooOooooO+++OOoooooOOOooooooO+++++OOOoOoooooOOO+++",
-"+++++++++++++++++++++++OOOOOOOOoOOOOOO++++OOOOoOOOOOOOO+++++++++++OOOOOOOOOOO++++++++O+OOOOOOOOOoOO+++++++OOOOoOOOOOO++++++OOOOoooooOOOOO++++++OOOoooooXoXXXOO++++OOoooOOOOOOOOOOOO+++++OOOOOoOOOOoOO++++++OOooXXXXXoOO+++++++OOOoOOO++OOoOoOO++++++OOOOOOoOOOoOO++++OOooOOOOOOOoOOOoOO+++OOOOOOOOOOOoOOOOO++++++O+OOOOOOO++++++",
-"++++++++++++++++++++++++++OOOOO+OOO+O++++++++O+OOOOOO+++++++++++++++OOOO+OOO+++++++++++OOOOOOOOO++++++++++++OO+OOOO+++++++++++O++O+OOOOO+++++++OOoooXXoXXXoXOO+++++O+O+OOO++OOOOOO+++++++++OOOOOOO++++++++++OOOOOOOoOOO++++++++O++++++O+OOO++++++++++O+OOO+OOO++++++++++OOO+OO+OOO+O+O++++++OOOOOO++O+OOOO+++++++++OOOOO+O++++++",
-"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++O+++++++++++++OOooXooXXXXXoOO++++++++++++++++++++++++++++++++++++++++++++++++OOOOOOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOo+++++++++++++++OOOO+++++++++++++OOOo+++++++++++++++++++++++++++++++++++++++++++++++++++",
-"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOooOO+++++++++++++OoooO+++++++++++++OooOOO++++++++++++++++++++++++++++++++++++++++++++++++",
-"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOOooOO++++++++++++OOoooOO++++++++++OOOoooOOO+++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOooO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOoXXooOO++++++++++++OO...OO+++++++++++OOoooXoOO++++++++++++++++++++++++++++++++++++++++++++++",
-"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OooooXOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OooXXooOO++++++++++++OO...OO++++++++++++OoXXXoo+++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++oooXXoOOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OO...ooO++++++++++++OOoX..oOO+++++++++++OOO...OOO+++++++++++++++++++++++++++++++++++++++++++++",
-"+++OOOOOOOOOOO+++++++++++OOOOOOOOOOOO++++++++OOOOOOOOOOO++++++++++OOOOOOOOO+++++++OOoooXXoOOOO+++++++++OOOO+++++OOOO+++++++OOOOOOO+OOOOOOO+++++OOOOO++++OOOOO+++++++OOOOOO+OOOOOO++++++OOOOO++++OOOOO+++++++OOOOOOOOOOOO+++++++++OOo...OOO++++++++++++OOo...OO++++++++++++Ooo...oO++++++++++++++++++++++++++++++++++++++++++++++",
-"++OOOoooooooOOOOO++++++OOOOOoooooooOOO+++++OOOOOoOOOoOOOOO++++++OOOOooooOOOOO++++OOOoooXXooooOOO++++++OOOOOOO+OOOOOOOO++++OOOoOoOOOOOOooOOO+++OOOOOOOOOOOOOOOOO++++OOOoOOOoOOoOOOO++++OOOOOOOOOOOOOOOOO++++OOOOoooooooOOOO++++++++OoX..oO+++++++++++++OOO...oOO++++++++++++OO...oOO+++++++++++++++++++++++++++++++++++++++++++++",
-"OOoo.X.oo.X.XXooO+++++OOooXXX.XXo..XooO++++OoXXX.ooo..XXoOO++++OOoXo.X.XoXooO+++++Oo.......X..OoO+++OOoo...ooOOO..oXoOO+OOoo.....ooo..X..oo+OOoo...oXOOooX...oo++OOO.....ooo....XoO+OOoo...ooOOOoX...oo++++OoXo.X.X.X.XooO+++++++OOo...oOO++++++++++++OOoX..oO++++++++++++OOoX..OO++++++++++++++++++++++++++++++++++++++++++++++",
-"+Ooo...XX...XXoooO++++OoooXX...XX...XoO+++OOXoX..XoXX.XXXOO++++OOoXX...XXXXXOO+++OOo..........oOO++++Ooo.X.OoOOoX.XoXOO++Ooo..X..ooo.....oo++Ooo...XoooOXo...Xo+++OO.X.X.ooo.X...OO++Ooo...Xoooooo...Xo+++OooXX.......XXXOO++++++OOO.X.oO++++++++++++++Oo.X.oOO++++++++++++Oo...oOO+++++++++++OOOOOOOOO+O+++++++++++++++++++++++",
-"OOoo...XX...XXoooOO++OOoooXX..XXX...ooO++++OoXX..oXo..XXXOO++OOOooXX...oXXoXOO++++Oo........X.oOO+++OOoX...ooOOo..XXoOO+OOoo.....ooo...X.Xo+OOoX.X.XooooXo..XXo++OOO.....ooo...X.oO+OOoXX..XooOoXo..Xoo+++OOoXX.......oXoOO++++++OOo...Oo+++++++++++++OOo...OOO+++++++++++OOO...oOO++++++++OOOOOOOOOOOOOOO++++++++++++++++++++++",
-"+OooX....oooXX...oO++OO...XXooo..X..ooO+++OOooo.....ooXXooO+++OoXo..oooXXXXXOO++++OOoXoXXoooooOOO++++OooX..oooOoooXXXoO++OooX..ooooooo...oo+OOoo...ooXXXoo...oo+++OOooo..ooo..XooOO++Ooo...XooooXo...oo+++OoXXXooXoo..oooO+++++++Ooo...oOO++++++++++++OOO...oO++++++++++++OOo.X.ooO++++++++Oooo..oXoooXXoOO+++++++++++++++++++++",
-"OOoo..X..oooXX..XOO++OO...XXoXo....Xoo+++++OOoo.....oooXoOO++OOoXX..oXoXXXXXOO++++OOoXoXXoooooO++++++OOo..XoooOooXXXXOO++OOo...XooooXX..XoO++Ooo...ooXXXoo...oo+++OOooo..ooo.XoooOO+++OoX..oXooOXo...oO++++OoXXXXoXX..oooO++++++OOoo...OOO++++++++++++OOo...oOO+++++++++++OOo...ooO+++++++OOooo..XXoooXXXOO+++++++++++++++++++++",
-"++OOXXXoXooooO...oO+OOo.X.oooooXoXXXoOO+++++OOo..ooooooOOO+++OOooo.....oooooOO++++OOoooXXoooOO+++++++OOoXXXooOOoooXXXoO++OOOoooXXooooXoXoOO+OOOoXXXoX...XoXXXoO++++OOoooo...oXooO++++OOoooo..ooo..oooOO+++OOooooo...XooOO++++++++OOo...oO++++++++++++++OO.X.oO++++++++++++OOO...oOOO+++++OOo...oo.....XXooO+++++++++++++++++++++",
-"+OOoXXXXooOooo...oo++OO...ooOooXoXXXOOO+++++OOo..oooOOOOOO+++OOooo.....XooooO+++++OOooXXXoOO+OO++++++OOOXXXooOOOooXXooO+++OOooXXXoooXXoooOO++OOoXXXXo...oXXXXOO+++++OOooX...oooOO+++++OOoXo..ooo..XooOO++++OOoooo...oooOOO+++++++OOo.X.oOO++++++++++++OOo...Oo+++++++++++++OoX..oOO+++++++Oo...Xo.....oXooO+++++++++++++++++++++",
-"++OOXXXooooooo...oO+OOoX..XXooo..XXXoO++++++OOO..oooOOO+++++++OoooX....oXoooOO+++++OoooXXoOOO+++++++++OoXXXoooOoooXXXoO+++OOooooXoooXXXooO++++OOXXXoX...ooXXXoO+++++OOooo...XoOOO+++++++OOo..oXo..ooOO+++++OOooXo...XooOO++++++++OOO...OO+++++++++++++OOO...oOO+++++++++++OOo...oO++++++++OO...Xo.....XXoOO+++++++++++++++++++++",
-"+OOoXXX..oooXX...oO++Oo.X.XXXoX..XXooO++++++OoO..oooOO+++++++OOooXooXoX..XXXOO++++OOoooXXooOOOOO++++++OOXXXoooOOooXXXoO++++Oooo..ooo.XoOOO++++OoXXXXX.....XXXOO+++++OOoXo...oXoOO+++++++OOOoX...oooO+++++++OOoo..XXoooooOO+++++++OOo...oOO++++++++++++OOo.X.OOO+++++++++++OOO...Oo++++++++OOoOoOooOoooooOO++++++++++++++++++++++",
-"+OOOXXX..oXoXX..XOO++OO...XXoXo..XXXoO+++++OOOo..oooOOO++++++OOoooooXXX..XXooO++++++oooXXoooooOOO++++OOOXXXoooooXoXXXoO+++++OOoX.ooo..OoO++++OOOXXXXX.....XXXOO++++OOOOXo...XooOOO+++++++OoXX...XXOOO+++++OOOoo..XXXoooooO+++++++OOO...oO+++++++++++++OOO...oO++++++++++++OOoX..oOO+++++++++OOoOOOoOoOOOO+++++++++++++++++++++++",
-"++OoXXXXX...XXoooOO+O+OOooXXXXXXXXXooOO++++Oooo..oooooOO+++++OOXXXXXoooXo...oO+++++Oooo..ooooXoooO++++OOoXXXXoooXX..Xoo+++++OOooX...XooO++++++OOooX..ooo..oooOO++++OooX..ooo..oooO+++++++Oooo...ooO+++++++OOoXo..ooXXoXXoo+++++++OOo.X.oOO++++++++++++OOo...OOO+++++++++++OOo...OOO++++++++OO+O+O+OOOOO+O+++++++++++++++++++++++",
-"++OOXXXXX...ooooOO++++OOooXXXXXXXXXXoO++++OOooo..XoXooOOO++++OOXXXXXXoXoX...oOO+++++OOo..XoXXXXXoOO+++OooXXXXXooXX...oo++++++OooX...XoOOO+++++OOooo..ooo..oXoO++++OOoXo..ooo..XXoOO+++++OOOXXXXXoOO++++++++ooXX..oXooXXXXOO+++++++OO...ooO+++++++++++++OooXXoO++++++++++++OOo.X.oO++++++++++++++++++++++++++++++++++++++++++++++",
-"+OOoXXXoooOoooOOO+++++++OOOOoooooXXXOOO+++OOoXo..oXooooOO++++OOXXXXXXoXoX...oO+++++OOoo..ooXXXoXoO++++OOoXoXXoXoXX..Xoo++++++OOoo...XoOO++++++OOooo..ooo..oooO++++OoooX..ooo..oXoOO++++OOoOoXXXooOO+++++++OOXoX..oXXoXXXXOO+++++++OO..XoOO+++++++++++++OOXXooO++++++++++++Ooo..XoO++++++++++++++++++++++++++++++++++++++++++++++",
-"+OOoXXXooooOOO+++++++++++OOOooooXXXXoO++++OO.....XXX..oOO+++++oooXXo.....oooOOO+++++OOOoo..XXXooOO+++++OOOoXX...Xo...oo+++++++OooXoXooO++++++++OoooXoooooXoooO++++OO..XXXoooX....OO+++OOOooXoXXXOO++++++++OOoXo.......XooOO++++++OOoX..ooOO++++++++++++OOoXoOO+++++++++++OOOo...OO++++++++++++++++++++++++++++++++++++++++++++++",
-"+OOoXXXXooOoO+O+++++++++O+OOOooooXXXoOO+++OOX.X..XXXX.OOO+++++OoooXo.X.X.oooO++++++++OOoo...ooooOO+++++OOOOXo.X.oXX.Xoo+++++++OOOXXooOO+++++++++OOoooOOooooOO+++++OOX..XXooo.X.X.OO+++OO........OO++++++++OOooXX.X.X.XXooO+++++++++OoooooOO+++++++++++++OOOOO++++++++++++OooooooOO++++++++++++++++++++++++++++++++++++++++++++++",
-"+Ooo.....XooO++++++++++++++OooX.....ooO+++OOOOoOoOoOoOOO++++++OOOoOoOoooOOOO++++++++++OOOOOOoOOO+++++++++OOOoOoOoOoOOO+++++++++OOOOOO++++++++++++OOOOOOOOOOO++++++OOOOOOOOOOOOOoOO++++OO.X......oOO++++++++OOOOoOoooOoOoOO+++++++++OOOoXoOOO++++++++++++O+OO+++++++++++++OOXoOoO++++++++++++++++++++++++++++++++++++++++++++++++",
-"OOoo.....ooo+O+++++++++++++Oooo.....XoO++++OOOOOOOOOOO+++++++++O+OOOOOOOOO+++++++++++++OOOOOOO+O+++++++++++OOOOOOOOOOO++++++++++OOO+O+++++++++++++O+O++++++++++++++OOOOOOOOOOOOOOO+++++OooooooooO+++++++++++OOOOOOOOOOO++++++++++++OOOOOOO+++++++++++++++++++++++++++++++++OOOOO++++++++++++++++++++++++++++++++++++++++++++++++",
-"+OoooooooooOO++++++++++++++OOooooooooOO+++++++O+++O+++++++++++++++++++++++++++++++++++++++O+++++++++++++++++++O+O+O+O+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOoooooooOOO++++++++++++++O++O++++++++++++++++++++++++++++++++++++++++++++++++++++++++O+++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++OOooooooOO++++++++++++++++OOOoooooOOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++oooooooO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++O+O+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++O+++++++++++++++++OOOOOOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"+++++++++++++++++++++++++++++++++++++++++++++++++OOOOO++++++++++++++OOOOOO++++++++++++++++++++++++++++++OOOOO+O+OOOOO+++++++++++OOOOO+++++++++++++OOOOooOoOOO+++++++++++++++++++++++++++++++OOOO+O+++++++++++++++O+O++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOO+O++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++OOXoXOO+++++++++++OOOooooOO+++++++++++++++++++++++++++OOoooooOOOooooOO+++++++++OOXoXOO+++++++++++OOoo.X...oXoO+++++++++++++++++++++++++++OOOOoooOOO++++++++++++OOoOoOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOOoooOOO+++++++++++OOOOOOO+++++++",
-"+++++++++++++++++++++++++++++++++++++++++++++++OOOXXXOOO+++++++++OOoooooooOO++++++++++++++++++++++++++OOoooooOoOoooooOO++++++++OooXXOO++++++++++OOoXo..X..oXoOO++++++++OO+OOOO++++++++++OOOoooooooOOO+++++++++OOOooooOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOoooooooOOO++++++++OOOOooOOOO+++++",
-"++++++++++++++++++++++++++++++++++++++++++++++OOoo...ooOO+++++++OOOX..X...ooO+++++++OOOO+O+O+OOOO+++++Oo.....ooo.....oO++++++++Oo...OO++++++++++Ooo..oXoXXXXXOO+++++OOOooOOOoXO+++++++OOooo....X..oooO+++++++OOooooo..OO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOooo....X..oooO+++++++OoXX.X..oOO++++",
-"+++++++++++++++++++++++++++++++++++++++++++++OOOoo...oooOO++++++OOo.......oOO++++++OOOoOOOOOOOOoOO+++OOo.....ooo.....oO+++++++OOoX..oOO++++++++OOoo..XooXoXXXOO+++++OOoooOOOXoOO+++++++Oooo.X.....XooOO++++++OOXXXoXX.OO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Oooo.X.....XooOO+++++OOXo....XooO++++",
-"+++++++++++++++++++++++++++++++++++++++++++++OOooo...oooOO++++++OooX...X..ooO++++++OooooooooooooOO++++Oo.....ooo.....oO++++++++Oo...OO+++++++++Oooo..oXoXoXXXOO+++++OOOooOOOXoO++++++OOOoXo....X..oooOO++++++OOoXoXo..OO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOoXo....X..oooOO+++++OOoX.X..XoOO++++",
-"++++++++++++++++++++++++++++O+OO++++++++++++Oooo.......ooO+++++Oooo..oooooOOO+++++OOoXo..X.X..XoXOO++OOOooX..ooo..oooOO+++++++OOO...oOO+++++++OOooo..oXooooooOO+++++OOOoOOOOOoO+++++++Oo...Xo...XX...oO+++++OooXXXXX..oOO++++++++++O+O+O+OOO++++++++OOOOOOOOOOOOO+++++++++++++++++++++++++Oo....X...XX...oO++++++OoooooooOOO++++",
-"+++++++++++++++++++++++++++OoooooO+++++++++OOooX...X...ooo+++++OOoo.XooOoOOOO+++++OooXX.......XoXOO+++OOooX..ooo..XooOO++++++++OoX..OOO+++++++OOoXX..XoXoooooO+++++++OOOOOOOOOO+++++OOOoX..XX...oX..XoO+++++OOooXXXo.XoOO++++++++OOOOOOOOOOOOO++++OOOoooooooooOOOO++++++++++++++++++++++OOOoX.......oX..XoO++++++OOooooooOOO++++",
-"+++++++++++++++++++++++++++OOooooO+++++++++OOXXXoooooXXooOO+++OOoooXXoOoOOO+++++++OOXoXXXoooXXXXoOO++++Oooo..oXo..oooO++++++++OOo...oO+++++++OOoX..oX...XXoooO++++++++++++++O++++++++OXoXXX..oooXXoXoXo+++++oooXXooo..oOO++++++++OoooXXooXXXooO++++oXX.X..X.X....OO++++++++++++++++++++++OoXoXo..ooo..oXoXo++++++++OOOOOOO++++++",
-"++++++++++++++++++++++++++O+oOoooOO++++++++OOXXXXoooooXooO+++++OooXXXooOOO++++++++OOXXXoXXooXXXXXOO+++++OOo..oXo..oOOO+++++++++OO...OO+++++++OOo...Xo...XXoooOO+++++++++++++++++++++OOooXXo..XXoXXXXoXo++++OOooXXoXo..oOO++++++OOooXXoXooXXooo+++OOo...........X.oO+++++OOOOOOOOOOO+++++OOoXoXo..XXo..XXoXo+++++++++++++++++++++",
-"++++++++++++++++++++++++++OOooXooO++++++++OOOXXXXooOoXoOoOO+++OooooXXoooOOO++++++OOooXXXXoXoXXXXooO++++OOOo..XoXX.ooO+++++++++OOoX..oOO++++++OOoX..oX...XXoooOO+++++++++++++++++++++OOXoXXX..oXoXXoXoXo+++++oooXXooo..ooOO++++OOOoXoXXXooXXXooO+++OO.X.X....X....oO++++OOOOoooooooOOO++++oooXoX..oXo..oXoXo+++++++++++++++++++++",
-"+++++++++++++++++++++++++++OXooXXOO++++++++OooXXooooOooOO+++++Oo......X.oo++++++++OOXXXoXoooooXXXOO+++++OOOXX...XXOoO++++++++++OOoooOO+++++++OOo...XXoXoXX...oO+++++++++++++++++++++OOXXXXX..oooooXoXXo++++OOooXXXXXXXooO+++++Oooo..oooXXXXXOOO++++Ooooooooooo..Xoo+++OooXX.X.X.X...OO++OOXXXoo..XXXXXoXoXX+++++++++++++++++++++",
-"++++++++++++++++++++++++++OOoXXoooO+++++++OOoXXXXooOooOoOO++++OO.......XooO+++++++OOXXXoooooXoXXXoO+++++OOooX...XXoOO++++++++++OoooooO++++++++OO...XXoXoXX...oO+++++++++++++++++++++OOoXXoX..oooXoXooXX+++++OOoXXXXXoXooOO+++OOooo..oooXXXXXoO++++OOOooooooooo...oO+++Oooo........X.OO+++oooXoX..XXXXXoXoXo+++++++++++++++++++++",
-"+++++++++++++++++++++++++OOOXoXXXOO++++++++OOoXXXXoooXooOO++++OOooo..oXooOO+++++++OOoXXXXXooXXXXoOO+++++OOoXX...oXooO++++++++++OoXXXOO+++++++OOOoooXX...XX..XoO+++++++++++++++++++++OOoo..........XXXoo++++OoooX......ooO++++Oo...XXoXo..oooOO++++++O+OOOOoooo..XoO+++OoooooooooooooO+++OOooXXX..ooXXXXXXoo+++++++++++++++++++++",
-"++++++++++++++++++++++++++OOXoXXXOO++++++++OOXXoXXXooXXooOO+++Ooooo..XoooOO++++++OOoXXXXXooXXXoXXoO+++++OOooX...XXOoO++++++++++OOXXXoOO++++++++OOooXX...XX..XoO++++++++++++++++++++++OooX..X......XXXoo+++++Ooo.X...X.ooOO+++OO...oXoXo..ooooO+++++++O++O+OOOO...oo++++OOoooooooooooOO+++OooXXX..XooXXXXXoo+++++++++++++++++++++",
-"+++++++++++++++++++++++++OOo.....oOO+++++++OOoXXXXoooXoooO++++OOooX..oXooOOOO+++++OOoXXXXXoXXXXXoOO++++OOOoXX...oXoOO++++++++++OOXXooO++++++++O+OOoooooo..XXXOO+++++++++++++++++++++OOoo......X...XXXoo+++++OOo...X..XooO++++OO...XoXoX..oooOO+++++++++++++OOOX.XoO+++OOOOooooooooOO++++OOooXXX..oXoXXXXXoo+++++++++++++++++++++",
-"++++++++++++++++++++++++++OO.....oO+++++++++OOoOXX ..XXoOO++++OooXo..oooooooOO+++OOOXoXX......XoXOO+++++OOooo...ooooOO++++++++OOo...OO+++++++++OOOoOooXo..XXXOO+++++++++++++++++++++++OooXXXXXXoXXXXoOO+++++OOOoooXoooOOO++++OOooo..oooXXXXXoOO+++++++++++++OOoooOO+++++OO+OOOO+O+OO+++++OOooXo..XoX..XXXOO+++++++++++++++++++++",
-"+++++++++++++++++++++++++OOoX....oOO++++++++OOOoXX...XXOOO++++OOooX..oooooooOOO+++OOoXX..X.X..XoXOO++++OOOooX...oooOO+++++++++OOO...oOO+++++++OOooXooooo..oooOO+++++++++++++++++++++++OOoXoXXXXXXXXXXOO+++++OOOoooooooOO+++++OOooo..XoXXXXXXOO++++++++++++++O+oOoOO+++++++++++O+O+++++++++OOXXX..ooo..XoXOO+++++++++++++++++++++",
-"++++++++++++++++++++++++++Oo.....OOO+++++++++OOOOo...ooOO+++++Oo.........X...oO++++OooooooooOoooOO+++++OOoo... ...ooO+++++++++OOo...oO++++++++OOXoXooooo..oooOO+++++++++++++++++++++++OOooooo.X.XooOoO+++++++O+OOOOOOOO+++++++OOooXoXXXooXXXooO++++++++++++++++O+++++++++++++++++++++++++++OOOooX...XoooOO++++++++++++++++++++++",
-"++++++++++++++++++++++++++Oo.....oOO+++++++++++OOo...OOO+++++OOo......X......OO++++OOOOOOOOOOOooOO+++++OOooX......ooO++++++++++OO.X.oOO++++++++ooXXooooo..oooO+++++++++++++++++++++++++OOOoXo...oXoOOO+++++++++++OO++++++++++++OOOoXoXoooXXXooO++++++++++++++++++++++++++++++++++++++++++++OOoooo...oXooOO++++++++++++++++++++++",
-"+++++++++++++++++++++++++OOO.....oO++++++++++++OOoX..oOO++++++Oo..........X..oO+++++OOOOOO+O+OOOO+++++++OOo......XooOO++++++++OOo...OO++++++++OOXXX.......oOO+++++++++++++++++++++++++++OOOoo.X.ooOOO+++++++++++++++++++++++++++OOooXoXoOXoXoOO+++++++++++++++++++++++++++++++++++++++++++++OOOXoX..ooOOO+++++++++++++++++++++++",
-"++++++++++++++++++++++++++OO.....OOO++++++++++++OOooOOO+++++++OOooooooooooooOO+++++++OO+++++++++++++++++OOOoooooooOOO++++++++++OO...oO++++++++OOoXX...X.X.OoO++++++++++++++++++++++++++++OOOOoOoOoO++++++++++++++++++++++++++++++OOOOoOOOoOOOO+++++++++++++++++++++++++++++++++++++++++++++++O+OoOOooOO+++++++++++++++++++++++++",
-"+++++++++++++++++++++++++OOOoXoXooO++++++++++++++OOooO+++++++++OoooooooooooOoOO+++++++++++++++++++++++++OOOoooooooOO++++++++++OOO...OOO+++++++OOooooooooooOO+++++++++++++++++++++++++++++++OOOOOOO++++++++++++++++++++++++++++++++OOO+OOOOOOO++++++++++++++++++++++++++++++++++++++++++++++++++OOOO+OO++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++OOooXooOO++++++++++++++++++++++++++++++OOOOOOOoOOO++++++++++++++++++++++++++++++OOOOOOOOO++++++++++++OOoooO++++++++++OOoooXoooOOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++O+++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++OOoooXoO++++++++++++++++O++++++++++++++++OOOOO+++++++++++++++++++++++++++++++++++++OO+++++++++++++++++OOoOOO++++++++++OOooooooOO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"+++++++++++++++++++++++++++OOoOOOO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOoO+++++++++++++++OOOO+O+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++O+O+++++++++++++++++O+O++++++++++++++++OOOO+++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++O+OOOOOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOOO+++++++++++++++OOOOO++++++++++++++OOOOOOOO++++++++++++++++++++++++++++++",
-"+++++++OOoOOOO++++++++++++++++++++++++++++++++OOoOoOO+++++++++++++OOoOoOO+++++++++++++++++++++++++++++++++++++++++++++++++++++OOoOoooOooOO++++++++++++++++++++++++++++++++++++++++++++++++++OOOO+++++++++++++++++++++++++++++++++++++++++++++++++OOoooooO++++++++++++OOoooooO++++++++++++OooXXoXOOO+++++++++++++++++++++++++++++",
-"+++++++OOoooOO++++++++++++++++++++++++++++++++OOooooOO++++++++++++OOooooOO++++++++++++++++++++++++++++++++++++++++++++++++++OOOooooooooooO+++++++++++++++++++++++++++++++++++++++++++++++++OOOoOO++++++++++++++++O+O++++++++++++++++++++++++++++++ooXXXooO++++++++++++ooXXXooO++++++++++OOoXoXXXooOO++++++++++++++++++++++++++++",
-"+++++OOOoooooOOO+++++++++++++++++++++++++++++OOooooooOO++++++++++OOooooooOO+++++++++++++++OOO++++++++++++++++++++++++++++++OOOoooooooooooO++++++++++++++++++++++++++++++++++++++++++++++++OOooooOO++++++++++++OOOOOOOO++++++++++++++++++++++++++OOooXoXoOO++++++++++OOooXoXoOO+++++OOO++OooXXoXXoooO+++OOO++++++++++++++++++++++",
-"+++++OOXXoooXXOO++++++++++++OOoOO+++++++++++OOoXoooXXoOO++++++++OOoXoooXXoOO++++++++++++OOOoooO+++++++++++++++++++++++++++OOoXo... ......oO++++++++++++++++++++++++++++++++++++++++++++++OOoo...OO++++++++++++OooXoXooO+++++++++++++++++++++++++++oo...ooO++++++OOO+++oo...ooOO+++OOOoo+OooooXoXoooOOOOOooo++++++++++OOOO+++++++",
-"+++O+OOXXXoXXXOOO++++++++++OOooOO+++++++++++OOXXoXoXXooO++++++++OOXXoXoXXooO+++++++++++OOoooooO+++++++++++++++++++++++++++OooXX.........XoO++++++++++++++++++++++++++++++++++++++++++++++OooX...OO++++++++++OOOooXoXoooO++++++++++++++++++++++++OOOo.X.ooO+++OOOOOO+OOOo.X.ooOO+OOooooo+OooXoXoXXooOOOOOooO++++++++++OoXXO++++++",
-"++++oooXXoooXXooO+++++++++OOO...OOO++++++++++OoooooXooOO+++++++++OoooXo..OoO+++++++++++OOXoXoOO++++++++++++++++++++++++++Ooo...oo...XXoooOO+++++++++++++++++++++++++++++++++++++++++++++++OOo...oOO+++++++++OOoXXoooXXoOO++++++++++++++++++++++++OOoXXXooOO+++oooXo++OOoXXXooOOOOOooXoo+OOoooX..oooOooooXoo+++++++++OOXooOO+++++",
-"++++OooXXoooXXooo+++++++++OOo...oOO+++++++++OOoooXoXXoOO++++++++OOooXoo..oOO+++++++++++OOXXXoOO++++++++OOO++++++OOO++++++OOo...oo...XXoooOO+++++++++++++++++++++++++++++++++++++++++++++++OOo...oO+++++++++OOooXXoooXXooO++++++++++++++++++++++++OOoXXXooOOOOOoooXo++OOoXXXooOOOooXXXoo+OOooXo..ooooooooXXO+++++++++OOoooO++++++",
-"+++OOooXXoooXXooO+++++++OOOoO...ooOOO++++++++OoooooXXoOO+++++++++OoooXo.XooOO+++++++++OOooXoOO++++++++OOOOOOO+OOOOOOO+++++oo...Xo...XXXooO+++++++++++++++++++++++++++++++++++++++++++++++OOOO..XoOO++++++++OOooXXoooXXoooO+++++++O+O++O+++++++++++OoXXXoooOOOooooXo+++OOXXXoooOOoooXXoo+OOoooX..XoooooXoXoO+++++++++OOoooOO+++++",
-"++++OOoXXoooXXoOO++++++Oooooo...ooooo++++++++OooXXXoooOO++++++++OOoooXoXXooO+++++++++++OOoooOO+++++++OooXXXOoOOO..oXoO+++OOo. .oX...XXoooO+++++++++++O+O++++++++++++++++++++++++++++++++++OOo...oOO++++++++OOooXXoooXXooO+++++OoOoOOOOoOOOO++++++OOoXXXoooOOooXXXoO++OooXXXooooooXooooO+OoooooXoXXXooXXXoOO+++++++++OooooOO+++++",
-"++++OOooXoXoXooOO+++++OOooooo...oooooOO+++++OOooXXXooOO+++++++++OOooXoXXXooOO+++++++++O+OOOOO++++++++OooXoXooOOOX.oXoOO+++oo...Xo...XXoooOO++++++++OOOOOO+++++++++++++++++++++++++++++++++OoO...oOO+++++++++oooXXoooXXoooO++++OoooOooooooOOO+++++OOOXXXoooooooXXooO++OOOXXXoooooXXXXooO+OooXoXoXXoXooXXooOO++++++++OOOXXXoO+++++",
-"++++++OoooooooOOO+++++OO.............OO+++++OOXXXXoXXoOO++++++++OO..ooXXXooO+++++++++++++OO++++++++++Ooo...ooOoooXXXXOO++OOoXXX.....XXoooO++++++++OOoXoXO+++++++++++++++++++++++++++++++++Ooo...ooO+++++++++OooXXXooXXoOO++++OOoXXXoooo..ooOO++++OoXXXXXXooXXXoXooO++OoXXXXXXXXXXXXXXXo+OooXXXXXoXoXXoXooOO++++++++OoOXXXOO+++++",
-"+++++OOOoooooOO+++++++OoX...........XoO+++++OOoXooXXoooO++++++++OoX.XooXXooOO++++++++++++++++++++++++OooX..ooOOOXoXXXoO+++OOoXo.....XXoooO++++++++OooXXXOO++++++++++++++++++++++++++++++++Ooo...ooO++++++++OOOoXXoXoXXooO++++OOXXXXXooo..oooO+++OOooXXXXXXXoXXXoXOo+OOooXXXXoXXXXXoXXoX+OOoXXXXXXoXXXXXooo++++++++OOoo...oOO++++",
-"+++++++OOoooOO++++++++OO.X........X..OO+++++OOXXXXoXooOO+++++++++OX.oooXXOoO+++++++++++++++++++++++++Ooo..XoooOooXXXXOO+++OOoXX.....XXXooO++++++++OooXoXOO++++++++++++++++++++++++++++++++Ooo...ooO+++++++++OOoXXoXoXXoOO++++OOoXXXXoXo..ooooO++OOooXXXXoXXXXXXoXOo+OOoXXXXXXXXXXXXXXoX+OOooXXXoXoXXXoXooO++++++OOOooX.X.OO+++++",
-"+++++++++O+++++++++++++OOoOoo...oooOOOO++++++OoooooooOO+++++++++OOoooooooOO+++++++++++++++++++++++++++OOXXXooOOOooXXXoO++++OOOooo...XXoooO+++++++++oo..XoO+++++++++++++++++++++++++++++++OOoooooooOO++++++++OoOXoXXXoooOO+++++Oooo..XXXoo...oOO++OOoOooooXXXoo...oO++OOOoooXoXoXoXooo..++OOoOooo...Xo...ooO+++++OOooXo...OOO++++",
-"+++++++++++++++++++++++OOOOoo...ooOoO++++++++OOooooooOO++++++++++OOoooooOOO++++++++++++++++++++++++++OOoXXXoooOoooXXooO++++O+OOoo...XXoooO++++++++OOoX..OO++++++++++++++++++++++++++++++++OooooooOO+++++++++OOooXoXXoXoOO+++++OOoo..oXXXX...oo+++O+OOooooXXXXo...oO+++OOOooXoXXoXoooo..+++OOOooo..XXo...OOO+++++OooXXXoooOO+++++",
-"+++++++++++++++++++++++++OOOoXXXoOOO++++++++++OOOOOOO+++++++++++++++OOOOO+++++++++++++++++++++++++++++OoXXXooOoOooXXXoO+++++OOOoo...XXoooO+++++++++OOoOOO+++++++++++++++++++++++++++++++++++OO+OOO+++++++++OOoo.......ooOO+++O+oOoXXXoXoo...ooO+++OOoOoXXoooXo...oo++OOOoooXXoooooXXXoo++++OOoXXXooXo...ooO++++OOXXXXXoooOOO++++",
-"++++++++++++++++++++++++OOOOoXXXoOOO++++++++++++OO++++++++++++++++++++++++++++++++++++++++++++++++++++OOXXXXXoooXX..XoO++++++OOOo...XXoooO+++++++++++O+O++++++++++++++++OOOOO++++++++++++++++O+++++++++++++OOoo......XooO+++++OoooXXXXXoo...ooO+++++oOoXXXXoXo...Oo+++OooooXooooooXXXoo+++OOOoXXoXoXo...oOO++++OOoXXXXoooOOO++++",
-"+++++++++++++++++++++++O+OoOoXXXooOOO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOoXXXXXoXoXo...oO+++++++OoO...XXoooOO++++++++++++++++++++++++++++OOoXoOO++++++++++++++++++++++++++++++OoO.X.....oOo+++++OOooXXXXXXo...ooO++++OOooXXoooXo...oO+++OooXoXXOOOooXXXoo++OOOOoXXXooXo...ooO+++OOoXXXoooooXoOoO++",
-"+++++++++++++++++++++++OOooooooooooOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOXXXXXooXXX...oO++++++OOOo...XXXooO++++++++++++++++++++++++++++OOooXooO+++++++++++++++++++++++++++++++OOOoOOOOOoO+++++OOoXXXXooo..oooOO++++OOoXXoXXXoXX...oo+++OoXXXooOoOoXoXooo+++OXoXooXXoXX...ooO++++OOXXXooooOXoooO++",
-"++++++++++++++++++++++++ooooooXooooooO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOXXX.....XXX..oo+++++OOOoo...XXoXoOO+++++++++++++++++++++++++++Ooo...ooO+++++++++++++++++++++++++++++++OOOOoOOO+++++++OOXXXXXooo..XooOOO+++OOXoXXooXoXo...oo++OOoXXXOoOOoXXoXooo++OOooXXooooXo...ooO++++OOoXXXXoooXXoooO+",
-"++++++++++++++++++++++OOooooXooXooooOOO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOooXX....XXX.X.oo+++++OOooo...XXXoXOO+++++++++++++++++++++++++++Ooo...ooO+++++++++++++++++++++++++++++++++O+OO+O+++++++OOoXXXXooo..oooO+++++OOoXoooXoXoX...oo++OOooXXOoOOOXXoXooo++OOXoXooXooXo...ooO++++OooXXXXoooXXooO++",
-"+++++++++++++++++++++O+oX.........X..OO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OoXXXooooooOooOOO+++++Ooo..........oO++++++++++++++++++++++++++OOoo...ooO++++++++++++++++++++++++++++++++++++++++++++++OOoooooooooooOO+++++++OooooOoOooo...oo+++OOoOOOOOOoX.XoX..+++OooooOOOoooX..ooO++++OOoXoXXoXoXXoooO+",
-"++++++++++++++++++++++OO...X..X....X.OO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOoXXXoooOOO++OOOO++++OOoo........X.Oo++++++++++++++++++++++++++OOoo...ooO++++++++++++++++++++++++++++++++++++++++++++++OOoooOOoOoOoOOO+++++++OOoOOOOOOOoX..oo+++OOOOOO+OOoX.oXoX.+++OOOOOOOOOoo.X.ooO+++++OOoo......XoOO++",
-"+++++++++++++++++++++++OOOooOoooOoOoOO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOXXXooO++++++O+++++++OOo.X..X.X...OO+++++++++++++++++++++++++++OXo...ooOO+++++++++++++++++++++++++++++++++++++++++++++++++OOO+O+OO+++++++++++++O+++++OOOOOOO++++O+O++O++OoOOOoOO+++++OOOO+++OOOOOOO++++++OOOO.X..X..OOO++",
-"++++++++++++++++++++++++OOOOOOOOOOOO+O+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ooXXoOOO+++++++++++++OOOOoOooooOOOOO+++++++++++++++++++++++++++OoooooOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOOO++++++++++++++OOOOOO++++++++++++++OOOO+O+++++++OOOOOOoOOOOO+++",
-"+++++++++++++++++++++++++++O+++O+O++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOoooOO+++++++++++++++++OOOOOOOOOOO++++++++++++++++++++++++++++++OooooOOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++O++++++++++++++++++++++++++++++++OOOOOOOOO++++",
-"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OoOoOO++++++++++++++++++++++++O+++++++++++++++++++++++++++++++++OOoooO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++O+OOO+++++++",
-"++++++++O+++++++++++++++++++++++O++++++++++++++++OOO++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOOO++++++++++++++++++++++++++++++++++++++++++++++++++++OooOOO++++++++++++++++++OOooOO+++++++++++OOoooOO+++++++++++++++++++++++++++++++++++O++++++++++++++++++++++++O++++++++++++++OOOOO+++++++++++++++++++++++++++",
-"++++OOOooO+++++++++++++++++++OOOooO+++++++++++OOOoooO++++++++++++++OOOOOOO++++++++++++++++++++++++++++++++OOooooOO+++++++++++++++++++++++++++++++++++++++++++++++++++OooooOO++++++++++++++++OOoooOOO++++++++++OOoooOOO++++++++++++++++++++++++++++++OOOooO++++++++++++++++++++OOooOO++++++++++OOOXoooO++++++++++++++++++++++++++",
-"++++OOoooOOO++++++++++++++++OOooooO+++++++++++OOooooOO+++++++++++OOooOoOOO+++++++++++++++++++++++++++++++++ooXoXOO++++++++++++++O+O+O+O+++++++++++++++O+O+++++++++++OOooooOOO++++++++++++++OOOooXoOO+++++++++OOooXooOOO++++++++++OOOOOOOO+++++++++++OOoooOOO+++++++++++++++++OOoooOOO+++++++++OOoXXooOO+++++++++++++++++++++++++",
-"++++OOooXOOO+++++++++++++++OOoooooO+++++++++++OOooXoOO++++++++++OOOoooooooO+++++++++++OOO+O+O++++++++++++OOoooXooOO+++++++++++OOOoOoOoOoOO++++++++OOOoOoOOOOO+++++++OOooXXXoOO++++++++++++OOooXooOO+++++++++OOooXXXXXOO+++++++++OOooOOOooOoO++++++++OOooXoOOO+++++++++++++++OOOooXoOO++++++++OOoOXXXooO+++++++++++O+O+O+O+O+++++",
-"+++++OoooXooO+++++++++++++OOooXXooO++++++++++OOXXXXXooO++++++++OOoo.X...XoOO++++++++OOOooOOOooO++++++++++OOoXooooo+++++++++++OooooooooooooO+++++OOOoOooooooOoO++++++OOooXXooOOO+++++++++OOOOoXoXXOOO+++++++OOOooXXXXXoOO+++++++OOOXXoooooooOO++++++++OooooooOO+++++++++++++OOooXooOO+++++++++OOXXooXoXOO++++++++OoOooOOOooOOO+++",
-"++++OOooXoXoOO+++++++++++OOOoXXXoOO++++++++OOOoXXXXXooO++++++++Oooo....XXXOO++++++++OoooooOoooO+++++++++OOOoXoXooo++++++++++OOOoooooooooooO++++OOOoooooooooooOO+++OOooooooXooooO+++++++OOooooXXooooOO+++++OOoooXoooXooooO+++++OOoooooooXooooO+++++++OOooXXoooO++++++++++++OOOooXoXOOO+++++++OOOXXXXoXXoOO+++++++OoOoooOoooooO+++",
-"+++OOooooXoXOO++++++++++OOoooooooO+++++++++OOoooooooooO++++++++OooooooXXooOO+++++++OoOoXooooooOO+++++++OOooooXXooOO+++++++++OO.X..........O+++OoooX........XXoO+++OOoooXoXoXooooO++++OOoOoooXXoooooo++++++OoooXXoXoXooooO+++++OoooXXoXoXooooOO+++++OOooooXXooOoOO+++++++OOOooXXXoooOO++++++OOoooooooXoooOO+++++OoooXooooXooooO++",
-"++++OooooXXooO++++++++++OOooXoXooOO++++++++OoooXXoXoooO++++++++OooXoXXoXooOO+++++++OOooXooooooO+++++++++OooXoXoXoO++++++++++OO............o++OOooo..X.......oXO++OOoooooXooXooooOO++++OoooXoXXXooooooO+++OOoooXoXooXXoooOO++++OoooXoXooXXoooOO++++++OooooXXooooOO+++++++OoOooXoXooooO++++++OoooXXoooXoooo++++++OOooXooooXooooO++",
-"+++OoooXooXooOO++++++++OOooXoXoooOO++++++++OoooXoXooooOO++++++OOoXoXoXXoooO++++++++OoooXXXooooO++++++++OoooXoXXooOO+++++++++OOoX...XooooXXO++OO...ooooOoOoXXXXO++OO.............oO+++OO.............oO+++Oo.............oO++OOO.............oOO++++OoooooXXXooooOO+++++OOooooXXXooooOO+++++OooooXoXoXXoooOO+++OOooXoXXooXXoooO++",
-"+++OooX.....ooO++++++++OooX.....ooO++++++++OoXX.....ooO+++++++OOoXX.....ooOO+++++++OooX.....ooOO+++++++OooX.....ooO++++++++OOooX...oXoooXXo++OoX..XooOOoooXoXoO++Oo.............oOO+OOo.............oOO+OOO.......... ..ooO++OO.............oO+++++OoXX.......oXoO+++++OoXX.......oXoO+++++OoXX.......XooO+++++OoXX.......XooO++",
-"+++OXoX.. ..ooOO++++++OOXoX.. ..ooOO++++++OOooX.... ooOO++++++OOooX... .ooO+++++++OOoXo.....ooO+++++++OOXoX.....ooOO++++++++OooX...XooooXoO+OOo.X.oooOOOooXoXoO++OOoooXXooooo...oOO+++OoooXXooooo...oOO++OOoooXXooooo...oO++OOOoooXXooooo...oo++++OOooo.......XooO++++OOooo.......XooO++++OOXoo.......XXoO++++OOooo.......XXoOO+",
-"++++OoooX...XoOO++++++++OoooX...XoOO+++++++OoOooX...oXOO+++++++OooooX...XooO+++++++OOooXX...XooO++++++++OoooX...XoOO+++++++OOO..XXXXXXXXooO++Oo...ooOO+OOOooooO++OOooXXXooooo...Oo+++OOoooXXooooo..XoO+++OOoooXXooooo..XoOO++OOoooXXooooo..XoOO++++OOoooo...oooOOO+++++OOoooo...ooooOO++++++Ooooo...oOOoOO+++++OOoooo...oOOoOO++",
-"+++OOOoXX...oXOO+++++++OOOOXo...oXOO++++++++OOoXo...XoOO++++++++OOoXo...oXOO++++++++OOooX...oXOO+++++++OOOoXX...oXOO+++++++OOoX.XXXoXXoXooO+OOo...oOOO++OOOOOOO++OOoooXXoooXoXoooOO+++OoooXXoooXXoooOOO+++OoooXXoooXXoooOO++++OoooXXoooXXoooOOO++++++OOoo...OoOOO+++++++OOOOo...oOO+O++++++O+OOoo...ooOOO++++++++OOOo...ooOO++++",
-"++++OOOoX...XXOO++++++++OoooX...XooO++++++++OOooX...XXOO++++++++OOooX...XooO+++++++OOOooX...XooO++++++++OOooX...XooO+++++++OOo..oXXXXXXooOO+OOo...ooO++++OOOOO++++OooXXXoooXXoooO+++++OoooXXooooXoXoOO+++OOoooXXoooXXoooOO++++OoooXXooooXoooO+++++++++OOo...oOOO+++++++++OOOo...oOOO++++++++++OOo...OoO++++++++++OOOo...OoOO++++",
-"+++++oo..ooo..oOO++++++++Oo..ooo..oOO+++++++OOo..ooo..oOO++++++++Oo..ooo..oOO+++++++Ooo..Xoo..oOO+++++++OOo..ooo..OOO+++++OoooXXXXX.....oO++OOoX.XoOO++++++O++++++OoooXXoooXXXooOO+++OOoooXXoooXXoooO+++++OoooXXoooXXoooO+++++OoooXXoooXXoooOO+++++++OOOO...oOO+++++++++++OOO...ooO++++++++++OOOO...oOOO++++++++++OOO...oOO+++++",
-"+++Oooo..ooo..oooOO+++OOooo..ooo..oooOO+++OOooo..ooo..oooOO++++Oooo..ooo..oooOO+++OOooo..ooo..oooOO++++Oooo..ooo..oooOO++++oooXXXoX.....oOO+Ooo...oOO+++++++++++++Oooo..XXX..ooOO+++++Oooo..XXX..ooOO+++++Oooo..XXX..oOOO+++++Oooo..XXX..oOO+++++++++O+OO.X.oO+++++++++++++Oo...oO++++++++++++OOO...oOO++++++++++++OoX..oO++++++",
-"+OOOXXX..XXX..XXoOO+++OOXXX..XXX..XoXOO+++OOXXX..XXX..XXoOO+++OOXXX..XXX..XoXOO+++OOXXX..XXX..XoXOO+++OOXXX..XXX..XXoOO++OOoXo.....oXooooOO++ooX..oOOOOOOOOO+O++++Oooo..oXX..oOOOO++++OooX..oXo..oOOOO++++Oooo..oXo..oOOO+++++Oooo..oXo..ooOOO++++++++OOo...OOO+++++++++++OOO...oOO+++++++++++OOo...OOO+++++++++++OOo...oOO+++++",
-"++OOooX..XXX..XXXOO+++OOXoX..XXX..XXoOO+++OOooX..XXX..XXXOO+++OOoXX..XXX..XXoOO++O+oooX..XXX..XXoOO++OOOoXX..XXX..XXXOO+OOOXoX.....XoXooOO++OOO...oooOOOOooooo++++Oooo..Xoo..oooOO++++Oooo..XoX..oooOO++++Oooo..oXo..oooOO++++Oooo..XXo..ooOOO+++++++++oO...oOO+++++++++++OOo.X.oOO+++++++++++OOoX..oOO+++++++++++OOo.X.oOO+++++",
-"+OOoXXX..XXX..XoXoO++OOOXXX..XXX..XXXoO++OOoXXX..XXX..XoXoO++OOoXoX..XXX..XXXoO++OOoXXX..XXX..XXXoO+++OoXoX..XXX..XoXoO++OOXXX.....XXoXooOO++OO.X.XoooooooooooO+++Oooo..oXX..ooooOO+++Oooo..XoX..ooooOO+++Oooo..XXo..ooooOO+++Oooo..oXo..oooOOO++++++OOOo...oOO+++++++++++OOo...oOO+++++++++++OOo...oOO+++++++++++OOo...oOO+++++",
-"+OOo...XXoXoXX...oO++OOo...XXoooXX...oO++OOo...XXooXoX...oO++OOo...XXXooXX...oO++OOo...XXoooXX...oO++OOo...XXXoooX...oO+OooX..ooXXoXoooooXO+OOOoXo..XXXXX...ooO++OOoooXXooooooooooO++OOoooXXooooooooXoO++OOoooXXooooooooXoO++OOoooXXooooooooXoO++++++OOooX..ooOO++++++++OOOoo...ooOO+++++++++OOoO...ooOO+++++++++OOoO...ooOO++++",
-"+Ooo...XXoXoXX...oo++Ooo...XXXXoXo...oO++Ooo...oXXoXXX...oO++Ooo...XoXooXo...oO++OoO...oXXXoXo...oO+OOoo...XoXXXXX...oO+OOo...ooXXXXooooXoO++OOooo..XXXXX..XooO++OooooXXoooXoXXoXXO++OOoooXXoooXoXooXoO++OoooXXXoooXoXooXoO++OooooXXoooXXXXoXXO++++OOOOoo...OoOOO+++++++OOOooX..OoOOO++++++OOOOoo...OoOOO++++++OOOOoo...OoOOO+++",
-"OOoo...XXoooXX...oo+OOoo...XXoooXX...oo+OOoo...XXoooXX...Xo+OOoo...XXoXoXX...oo+OOoo...XXoooXX...oo++Ooo...XXoooXX...Xo+Ooo...XX.....XXX..o+++Oooo..XXXXX...oOO++OO.....XXXXX...XoO+OOo.....XXXXX...XXO+OOO.....XXXXX...XXO+OOO.....XXXXX...XoO+++++oooXX...XXXooO+++++OoooXX...XXXooO+++++OoooXX...XXXooO+++++OoooXX...XXXooO++",
-"OOoo...XXoooXX...Xo++Ooo...XXoooXX...Xo+OOoo...XXoooXX...oo++Ooo...XXoooXX...Xo+OOoX...XXoooXX...Xo+OOoX...XXoooXX...oo+OoX...oo.....XXX..O++++OOooo...ooooOOO++OOo.....XXXXX...XXO++Oo.....XXXXX...oXO++OoX.X..XXXXX...oXO++Oo.....XXXXX...Xoo+++OOooXXX...XXoooO+++++OooXXX...XXoooO+++++OooXXX...XXoooO+++++OooXXX...XXoooO++",
-"+OXo...XXoooXX...oo+OOXo...XXoooXX...oo++OXo...XXoooXX...Xo+OOXo...XXoooXX...oo+OOoo...XXoooXX...oo+OOoo...XXoooXX...Xo+Ooo...XX.....XXX..o++++++OooXXXXoOO++++++OO.X...XXXXX...ooO++OO.X...XXXXX...XoO+OOO.....XXXXX...XoO+OOO.X...XXXXX.X.XoO++++OoooXX...XXXooOO++++OoooXX...XXXooOO++++OoooXX...XXXooOO++++OoooXX...XXXooOO+",
-"+OooooooXooOooooooo++OoooooooooooooXooo++OoooXoooooOooooooo+OOoooooooooooooXooo++OoooooooooooooXooo++OoooooooooOooooooo+OoooooooooooXoXoooO++++++OooXXXoXOO++++++OOooooXooooooooooO+++OooooXooXoooooooO++OOoooXoXoXoooooooO++OOoooXoooooooooooO++++OoooooXoXoooooO++++OOooooXoXooooooO++++OOoooooXoooooooO+++++OoooooXoooooooO++",
-"++OooooooOOoooooooO+++OoooooooOOooooooO+++OooooooOOooooooOO+++OooooooOOOooooooO++OOoooooooOOooooooO+O+OooooooOOooooooOO+OOoooooooooooXooooO+++++OOoXX..oOO++++++++OoooXooXoXoooooOO++OOooooooooooooooOO+++OooooooooXoooooOO+++OooooXoXooXooooOO++++OOoooooooooooO+++++++OoooooooooooO+++++++OooooooXooooO++++++OOooooooXooooO+++",
-"+++OOoOOOOOOOOoOOOO++++OOOoOOOOOOOOOOOO++++OOOOOOOOOOOoOOOO++++OOoOOOOOOOOOOOOO++++OOoOOOOOOOOOOOOO++++OOOoOOOOOOOoOOOO+++OOOOOOOoOOOOoOOOO++++++Ooo.X.oOO++++++++OOOOOOOOOOOoOOO+O+++OOOoOoOoOoOoOOO++++++OOOoOoOOOOoOOO+++++OOOOOOOOOOOOOOO++++++++OOOoOOOoOOO+++++++++OOOOoOoOOOOO++++++++OOOoOOOOOOOO++++++++OOOoOOOOOOOO+++",
-"+++++++++++++O+O+++++++++O+++++++OOO+++++++++OOOO++++O+OO+++++++O+OOO++++OOO++++++++O+OO+++++OOO+++++++++O+++++++O+OO+++++++OO+OOOOOOO+OO+++++++++OOoOOOO++++++++++++OOOOOOOO+O++++++++++OO+OOO+OO++++++++++OOOO+O+OOO++++++++++OOOOOOOOOOO++++++++++++O+OOO+++++++++++++++OO+OOOO+++++++++++++O+OOOOO+++++++++++++O+OOOOO++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++O+OOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++OOooXXXoooooO+++++++++OOO++++++++++++++++++++++OO+++++++++++++++OOOO++++++++++++++++O+O+O+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOO++++++++++++++++++++++OO+++++++++++++++OOOO+++++++++++++++++++++++++++++++++++++OOOOO++++++++++++++++++++++++++++++++++++++++++++++",
-"+++++++++++++++++++++++OOOXoXoXXoXooO++++++++OOOOOO++++++++++++++++++OOOOO++++++++++++OOOoOOO+++++++++++++OOOOOOOOOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOOOO++++++++++++++++++OOOOO++++++++++++OOOoOOO+++++++++++++++++++++++++++++++++++OOOXoOO+++++++++++++++++++++++++++++++++++++++++++++",
-"+++++++++++++++++++++++OooXXXXX..oooO++++++++OoooooO++++++++++++++++OOOXoOO+++++++++++OOXoXooO+++++++++++OoooXXooooo+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OoooooO++++++++++++++++OOOXoOO+++++++++++OOXoXooO+++++++++++++++++++++++++++++++++OOooXXOOO+++++++++++++++++++++++++++++++OOOOOO+++++++",
-"++++OOOOOOOOOO++++++++OooooXXXX..oooOO+++++++OoXXooOO++++++++++++++OOooXXOOO+++++++++OOoXXXooOO+++++++++OOooXXXoooooO++++++++OOOOOOOO++++++++++++++++++++++++++++++++++++++++++++++++++++OoXXooOO++++++++++++++OOooXXOOO++++++++OOOoXXXooOO++++++++++OOO+OOOO+++++++++++++OOoooXXoOO++++++++OOOOO++++++++++++++++++OOoooOO++++++",
-"+OOOOooooOoOOOOO+++++OOoooXXXXX..oooOO++++++OOooXoXOO+++++++++++++OOoooXooO+++++++++OOOoXXXXoOO+++++++++OoooXoXXoXooO++++++++OOOOOOoOOO+++++++++++++++++++++++++++++++++++++++++++++++++OooooXooOO++++++++++++OOooooXoOO+++++++++OooXXXXoOOO+++++++++OOOOOOoOOOO++++++++OOOOXoXooOOO+++++OOOOOOOOOO++++++++++++++OOoooooOOOO++++",
-"++ooXoXoXXXXXooOOO+++OOoXXXooooXoXXXooO+++++OOoOXXXoo+++++++++++++OOXoXoooO+++++++++OOoXoooXXooO+++++++OOoXXXXX..ooOO+++++++OOXoooOoXooO+++++++++++++++++++++++++++++++++++O+OOO++++++++OOooXXXoOO+++++++++++OOOoXXoooOO+++++++OOOoXoooXXooOO++++++OOOXXOoOoXooO+++++++OOOOoXXXooooOO++++OOoXXXXoooO++++++++++++OOOXo...XXOO++++",
-"+OooXXXXXXXXXXoooOO++OoXXXXXooooXXXXooO++++++OOoXXoooOO++++++++++OOOXXXooOOO++++++++OooXoXoXoooO++++++OOoooXXXX..ooOO+++++++OOXXoooXoooOO++++++++O+++++++++O++++++++++++OOOOOOOO+++++++OOOooXoXooOOOO++++++OOOOoXXXoooOOO++++++OOoXXoXoXooooO++++++OOoXXoooXooooOO+++OOOOoooXXXoooOOOO+++OOXXXXXoooOO+++++++++++OOoXX...XXOOO+++",
-"O+oo...oXoooXo...oO+OOO.....ooooo...ooO+++++OOOooXXooOOO+++++++++OooXXXoooOO+++++++OOOXXoooXXooo+++++++OooXXXXX..ooOO++++++OOooXoooXXooo++++++++oooOO+++O+ooOO+++++++OOOOoOoooooO++++OOOooooXXXoooOOOO++++OOOoooXXXooooOOO++++OOoooXoooXXoooOO+++OOOoOXXoooXXoooOO++OoooXoXXoooXXXXXooO+++oooX..XoooOOO+++++++++Ooo..ooo..ooo+++",
-"+Ooo...XXoXoXX.X.oO++OO.X...oooXo...ooO++++OOoooXXXXXooOO++++++OOOooXXXXXOoOO++++++OOooXXXXXXooOOO++++OOOoooXXXXooooOO+++++OOoXoXXXXXoooOO++++OOoooOOO+OOOoooO+++++OOOooXXXXX.X.OO++++OXoXoXooooXXXXooO++OOXXXXXoooXoXXXooO++OOoXXXXoooXoXXXooO+++OoXXXXoooooXXXooO+OooXXXXXoooXXXXXoo+++OOXoX..oXoooOOO+++++++Oooo..ooo..ooo+++",
-"+OOo...oXXoXoX...oo+OOo.....oooXo...ooO+++OOOooXXXXXoooOOO++++OOooooXXXXXooOOO++++OOOoooXXXXXoooOO++++OoooXoXXXXXooOOO+++OOOOoooXXXXXoooOO+++++OooooOOOOOooooOO+++OOooooXXXXX..XoO++OOOXXXXXooooXXXXoo+++OOXXXXXooooXXXXoo+++OoXXXXXooooXXXXooO+OOoXXXXXOooXXXXXooO+Ooo...oXoooXX...ooO+O+OXoX..XoXoooOOOO++++O+oooX.ooo..oooO++",
-"+OOoXXXoooooooXXXoo++OooXXXXXXXoo...oOO+++OoXo..oooXX...oO++++OooX..XooXo...oO+++OOoXXXXoXoXo...oO+++OOooXXXXooXo...oO++++OoXXXXXooXo...oOO+++OO...XXooooX..XOO+++Oooo..oooX....oOO++OO...XooOooo...ooO++OoX.XXoOoooo...ooO+OOO...oXOoooo...ooO++OO.X.XooOOoo...ooO+Ooo...XXooooX...ooO++OOooo.......XXXOOO++++OOooXXooo..oooO++",
-"OOOOXXXXooooOoXXXXo++OoXXXXXXXXoo...ooO+OOOoXX..XXoXo...oOO+OOOXoo..oXoXX...oOO++OooXXXXXooXX...oOO++OoXXoXXoXoXX...oOO+OOOXoXXXoXoXX...OOO+++OOX.XXooooXXX..O++OOOXXo..XXX.....oOO+OOO..XXooOooo...ooO++Oo...XXOOooo...ooO++OO...XXOOooo...ooO++OO...oXooOoo...ooO+Ooo ..XooooXX...ooO+++Oooo.......XXXooO++++OoooXXXoo..oooO++",
-"+Ooo.....ooooooooXX++OoXXXoo...oo..XooO++OoXoo..oooXo...ooO++OooXX..XooXo.X.ooO++OooXXXXoXoXo.X.ooO++OOoXXXXoooXo.X.ooO++OooXXXXXoooo...ooO+++OOooo..XXX..oooO+++OOoXX..ooo.....ooO++OO...XXOoOoo...ooO++OoX..XooOOoo...ooO+OOoX..ooooOoo...ooO+OOo...XoOOooo...ooO++OOXXXXoooooXXXXOOO+++OoooXXooooooXoXoO++++OooXXX.....oooO++",
-"OOoo.....XooOoXoXXo+OOOXXXoXX..oo...oOO+OOo...oooooooXXXooO++Oo...ooooOooXXXooO+OOo...ooooOooXXXooO+OOo...oooooooXXXooO+OOo...oooooooXXXooO++++OOoo..XXX..ooOOO+OOo...oooXoXoXXXooO+OOooXXooOOOOoX..ooO++OoXXXoooOOOo.X.oOO++OoXXXooOOOOo...oOO++OOXXXoooOOoo...oOO+OOOoXoXXoooXoXXooO+++OOoooXXooOooXoXXXO+++OOoooXX.....XooOO+",
-"OOoo.....ooooOoooXX++OOXXXXo...oo...oOO++Oo...ooOOOOooXXoXO+OoO...ooOOOOoXXXoXO+OOo...ooOOOOoXXXoXO+OOo...XoOOOOoXXXoXO+OOo...ooOOOOooXXoXO++++OOOo..XXX..oOO++++oO...oXoooXXXXXXoO++OoXXXoooOOOo...oOO+OOOXXXooOOOoO...ooO+OOOXXXooOOOOoX..ooO+OOooXXooOOOOO...ooO++OOooo..ooo..oooOO++++OooXXXoooOoXXoXoO++++OoooXX.....oooOO+",
-"+Ooo...oXoooOoXoXXo+OOoXXXooXXXoo.X.oOO+OOo..XoOO++OOoXoXXo+OoO...oOOO+OooXoXoO++oO...oOO++OooXoXXo+OOo...oOOO+OooXoXoO+Ooo...oOO+OOOoXoXXo+++++OoOXo...ooooOO++OooX..oooXXoooXooXO+OOOXXXooOOOOO.X.oOO+OOoXXXooOOOOoX..ooO+OOOXXXooOOOOo.X.oOO+OOOXXXooOOOoO..XooO+++OOOo..oXo..ooOO++++OOoooXXoooooXoXXXO++++OoooXXooooo...oO+",
-"OOoo...XooooOOoooXX++OOXXXXoXXXoo...oOO+Ooo...oOOO+OoooXXoO+Ooo.X.oOO++OOooXXXO+OooX..oOOO+OOooXoXO+OOo.X.oOO++OOooXXXO+OOo..XoOO++OoooXoXO++++OOoooX...XXOOO+++OOo...ooXXXoooXoXXO+OOooXXooOOOOo..XoOO++OOXXXooOOOOo...oOO++OOXXXooOOOOo...oOO++OOXXXooOO+Oo...oOO+++OOooX.oXo..OOO++++++OoooXXoOooooXoXoO++++OoooXXoooXX...oO+",
-"+OOOXXXoooOOoooXXXo+OOoXXXoXooXXX..XooO+OOo...ooOOOOooXoXoo++Oo...ooOOOOOXXXXoo++Oo...ooOOOOooXXXoO+OOo...ooOOOOOXXXXoo+OOo...ooOOOOooXXXoO++++OOoo..XXX..oooO++OOo...XXoooooXXXXoo++OoXXXooOOOOO...oo++OOoXXXooOOOOoX.Xoo++OOoXXXooOOOOoX..ooO+OOoXXXooOOoOO.X.oO+++++OOOXX...oooOO++++++Oooo..XXXXX...ooO++++OoooXXooooo..XoO+",
-"+OooXXXoooOOOooXoXo++OOXXXooXooXX...oOO++OoX..oOOOOOoXXXXoO+OOo...ooOOOoOXoXooO+OOo..XooOOOOoXXoXXO+OOo...oOOOOoOXoXooO+OOo...ooOOOOoXXoXXO++++Oooo..XoX..oooO++OOo...XXXoXooXXXooO++OOXXXooOOooO...oO+++OOXXXooOOoOo...oO+++OOXXXooOOoOo..XoOO++OOXXXooOOOoo...oOO+++++OOoX.. XooO+++++++Oooo..XXXoX...ooO++++OoooXXoOoOo...oO+",
-"++OOXXXXoooooooXoXo+OOoXXXoooXoXX...oOO+OOo...oooOOOoXoXoXO+OOoX..oooOoOoXXXXXO+OOO...oooOOoOXXXooO+OOO...oooOoOoXXXXXO+OOoX..oooOOoooXXooO+++OOooo..oXo..oooOO+OOoX..XXooooooXXXXO+OOOXXXooooOoo.X.OoO++OOXXXooooOoo...OoO++OOXXXooooOoO...oo+++OOXXXooooOoO..Xoo++++++OOoo...ooOO++++++OOooo..XXXXX...ooO+++OOoooXXoooooX..oo+",
-"+Ooo...ooooOoo...oo+OOO...XooooXX...oOO+OOOoXXXXooooo...ooO++OoXXXoXooooo...oOO+OOOoXXoXooooo...ooO+OOOoXXXXooooo...oOO+OOOXXoXXooooo...ooO+++Oo...oXooooX...O++OOoXXX..oXooX...oOO++OOooXXXooooo...OOO++OOooXXoooooo.X.oO+++OOooXXXooooo..XoO+++OOooXXXooooo...OO++++++OOoo...ooOO++++++OOoXo..oXoXooooOOO+++OooXoXXooooX..XoO+",
-"+OOoX..XooooXo...oO+OOo...oXoooXX...ooO++OOXoXoXooooo...oOO++OOoXXXXooooo...OoO++OOXoXXXooooo...oOO++OOXoXoXooooo..XooO++OOoXXXXooooo...oOO+++OO.X.ooOOooo.X.OO++OOXXX..ooooo...OoO+++ooXoXoooooo..XoO+++OOoXoXXooooo..XOOO++OOoXooXooooo...OOO+++ooooXoooooo.X.oOO++++OOooo...oooOO+++++OoooX..XXXoooOOO+++++OOooXXXXXoXo...oo+",
-"+OoX..........oooOO++OoX....ooooo...oOO++OOOooXX.....oooOO+++OOoooXX.....oooOOO++OOoooXX.....ooooO+++OOOooXX.....oooOOO++OOOoooX.....ooooO++++OOoooOOOOOOOooOO+++OOoXXXX.....oooOO++++OOoo.......oXooO++++OOoo.......XoXOO++++OOoo.......ooXOO++++Oooo.......Xooo++++++Ooo.......oOO+++++Oo.....ooXoOOO+++++++oo.....oXo....XoO+",
-"OOoo..........XooOO+OOo.....oooXo.X.oO+++++oOooX.....oooOO+++++OOooX.....XooO++++++OOooX.....oooOO+++++oOooX.....oooO+++++OOOoXX.....XooOO++++++OoOOOO++OOOOo+O+OOoooXXX.....XooOO+++++OOo.......XooOO++++OOOoX......oXoOO++++OOOo.......XooOO+++++OOo.......oXoOO+++++OOoX......ooOO+++OOo.....XooOOO+++++++OOO.....Xoo.....OO+",
-"+Ooo..........oooO+++OO.....OOOoo...OO+++++OOooX.....ooo+++++++OOooX...X.oooO++++++OOooX.....ooO+O+++++OOooX.....oooO+++++OOOOoX...X.oooO+++++++OOOO++++OOOOO+++++OXoXXX....XoooO++++++OOOX..X...oXoO++++++OOo.X.....oooO++++++OOOX......oXoO++++++OOOX......oooOO++++OOoo...X...ooO++++OOO.....oXoOO+++++++++Oo..X..ooo..XX.OO+",
-"+OoOOOOOOOoOoOoOO++++OOOOOOOoOOOoOOOOO++++++OOOOOOOOOOO+O+++++++OOOOOOoOoOOOO+++++++OOOOOOOOOOOO++++++++OOOOOOOOOOO+++++++++OOOOOOooOOOO+++++++++++++++++++++++++OOoooOooOoOooOO+++++++O+oOOOooOoOOO++++++++OOOoOoOOooOO+++++++OOOOOOOOOoOOO++++++++OoOOOoOoOooO+++++++OOOOOooOOOOOO++++++OOOOOoOOOO+++++++++O+OOOoOOoooOooOOO++",
-"++OOOOoOOOOOOOOO+O++++OOOOOOO+O+OOOO+++++++++OOOOOOoO+O++++++++++O+OOOOOOOO+++++++++++OOOOOOO++++++++++++OOOOOOOOOO++++++++++OOOOOOOOOO+++++++++++++++++++++++++++OoooOOOOOOOOO+O++++++++OOOOOOOOOOO+++++++++OOOOOOOOOOO++++++++OOOOOoOOOOOO+++++++++OOOOOOOOO+++++++++++OOOOOOOO+++++++++OOOOOOOO+++++++++++++OOOOOOO+OOOOOO+++",
-"+++++O+OOOO+O+++++++++++OO++++++++O++++++++++++OOO++++++++++++++++O+O+O+++++++++++++++++OOOO++++++++++++++++OOOO++++++++++++++++O++O+++++++++++++++++++++++++++++++O+OOOO+O++++++++++++++++OO+O+O++++++++++++++++OO+++++++++++++++++O+O+O++++++++++++++++O+O+++++++++++++++O++OO+++++++++++++O+O++++++++++++++++++OO++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"+++++++O++++++++++++++++++++++++++++++++++++++++++O++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++O+++++++++++++++++++++++++O++++++++++++++++O++++++++++++++++++++++++++++++++++++O+++++++++++++++++++++++++O+++++++++++++++O++++++++++++++++++++++++++++++",
-"+++++OOooO+++++++++++++++++++OOOoo++++++++++++++OoOoO+++++++++++++++OO+O+++++++++++++++++++++++++++++++++++OooooO++++++++++++++++++++++++++++++++++++++++++++++++++++OOooO+++++++++++++++++++++OooOO+++++++++++++oooO++++++++++++++++++++++++++++++++OOooO+++++++++++++++++++++OooOO+++++++++++OoOoO++++++++++++++++++++++++++++",
-"++++OOOooOOO++++++++++++++++OOoOooO+++++++++++OOOoooO++++++++++++OOOOOOOOOO+++++++++++++++++++++++++++++++OoooXoOO++++++++++++++++++++++++++++++++++++++++++++++++++OOOooOOO+++++++++++++++++OOOooOOO++++++++++OOoooOO++++++++++++++++++++++++++++++OOOooOOO+++++++++++++++++OOOooOOO++++++++OOOoooO++++++++++++++++++++++++++++",
-"+++++OOoooOO+++++++++++++++OOOooooO+++++++++++OOooooOO+++++++++++OOooooooOO++++++++++++O+O++O+++++++++++++OooXoXOO+++++++++++++++++++++++++++++++++++++++++++++++++++OOoooOO+++++++++++++++++OOooooO++++++++++OOOoooOOO+++++++++++++O+++O++++++++++++OOoooOO+++++++++++++++++OOOoooO+++++++++OOooooOO+++++++++++++O+O++O++++++++",
-"++++OOooooooO++++++++++++++OOXoXooO++++++++++OOoXXXXooO++++++++OOoo..X.XXooO++++++++OOOooOOOooO+++++++++++Oooooooo++++++++++++++++++++++++++++++++++++++++++++++++++OOOoXoooO+++++++++++++++OoooXoOO++++++++++OooXXXXoOO++++++++OOoooOOOooOO++++++++OOOoXoooO++++++++++++++OOoooXoOO++++++++OOoXXXXoo++++++++++OOOooOOOoo+++++++",
-"+++++OOXXoXoOO++++++++++++OOoXXXoOO++++++++++OoXXXXXooO+++++++++ooo.....XXOOO+++++++OOoooOoOooO++++++++++OOoXoooooO++++++++++++++++++++++++++++++++++++++++++++++++++OooXoXoOO+++++++++++++OOoooXooO+++++++++OOooXXXoXOO++++++++OOOooOOOooOOO++++++++OOXoXooOO+++++++++++++OOoooXoOO++++++++OoXXXXXooO+++++++++OOooooOOooO++++++",
-"+++++OOooXoXOO+++++++++++OOooooooOO++++++++OOOooooooooOO++++++OOoooooXXoooOO+++++++OOOooooooooOO+++++++++OoooXXooO+++++++++OOOOOO+OOOOOO+++++++++++OOOOOOOOOO++++++++OOooXoXoOO++++++++++OOOooXXooOO+++++++++OOoXooXoooOO+++++++OoOooooooooOO++++++++OOooXooOO++++++++++++OOooXXoOOO+++++++OOooooooooO++++++++OOOooooooooO++++++",
-"++++OOOooXXooOO+++++++++OOOoooXooOOO++++++++OOoXXoooXoOO+++++++OooXoooXXoooO+++++++OOooXooooooO++++++++OOOOXoXoXoOOO+++++++OOOoOOoOOOOoOOO+++++++OOOOooooOoOOO++++++OOOooXXoooOO+++++++++OOooXXooooOO+++++++OOoXoXooXoooOO+++++OOOoXooooooooOO++++++OOOoooXXOO+++++++++++OOooXoooOO+++++++OOOooXXooooO+++++++++OOooooooooOO+++++",
-"+++OOoooooXXoOOO+++++++OOoooXoXoooO++++++++OooooooXoXooO++++++OOooXoXXXXooOO+++++++OoOooXooooooO+++++++OOoOoXXXooOO++++++OOoooooooooooooOO+++++OOOooooooooooOOO+++O+OooooXXXoooOOO+++++OOOOoooXXoooOOO+++++OOOooXoooXoooOO+++++OooooXoooXoooOO+++++++OOooXoooO+++++++++++OOooXXooO+++++++++OOooooXoooO++++++++OOoooXooooo+++++++",
-"+++Oooo.....XXOO+++++++Oooo.....XXOO+++++++OooX.....XXOOO+++++OOXoX.....XXoOO+++++OOooX.....XXOOO++++++OooX.....XXoO+++++OO.....oXX.....ooO+++OOoooX.........oO++++Oooo.......oooO++++OOoXo.......oooO++++OOoXo.......oXoOO+++OOooo.......oXoOO+++++Ooo.....OO++++++++++OOo.....oOO++++++++ooo.....oOO+++++++++Ooo.....oOO++++++",
-"+++OoXX.....XXoOO++++++OoXX.....XXoOO+++++OOoXX.....XXoOO+++++OOoXo.....XXoOO++++++OXoX.....XXoOO++++++OoXo.....XXOo+++++OO.....XXXX....XoO+++OooXX..........oO++OOOoXo.......XoooO+++OOooX.......XXooO+++OOooX.......XoXOO+++OooXX.......oXooO+++++Ooo.....oOO+++++++++OooX....oOO++++++++Ooo.....oOO++++++++OOoo.....oOO++++++",
-"++OOoooooooo..ooo+++++Oooooooooo..ooo+++++OOoooooooo..ooOO++++OOooXooooo..ooo+++++OOoooXoXoo..ooOO++++OoooXooooo..oooO++OOOooooo...ooooo..o+++Oo...oooOooo...oo+++Oo...oooooXo...oO+++Oo...ooooooo...oO++OOo...XXooooX...oO+++Oo...oXoooXX...oO++++++OOoo...oO+++++++++++OOoo...oO++++++++O+Oooo...oO+++++++++++OOoo...oOO++++++",
-"++OOoXXoXooo..ooo++++++OoXXoXooo.Xooo+++++OOoXXoXooo..ooo+++++OOooooXooo..ooo+++++OOoXoooooo..ooo++++++OooXoXooo..ooO++++OooXXXX...oXooo..o++OOO...ooOOooo...Oo++OOO...XXoooXo...oO++OOo...XooooXo..XoO+++Oo...oXoooXo...OO++OOo...oXooooX..XoO++++++OOOo...oOO++++++++++OOOo..XoOO++++++++++Ooo...oOO++++++++++OOoo...OO+++++++",
-"++OoooXooooo..oooO++++Oooooooooo..oooO++++OoooXooooo..oooO++++OOooXooooo..oooO++++OoooXooXoo..oooO++++OoooXooooo..oooO++OOoooooo...ooooo..o++Ooo.X.ooOOOoooXoOO++OOo...XooooXX...oo++OOo...oXoooXo...oo++OOO...oXooooX...oo++OOO...XXoooXo...oo+++++++OoO...OO++++++++++++OoO...oO+++++++++++OOO..XoO++++++++++++OOO...oOO++++++",
-"++OOoXo.......oooO++++OOXXX.......oooO++++OOoXo.......oooO++++OooXo.......oooO++++OOXoX.......oooO++++OOXoX.......oooO++OOoXXX.....XXXXX..O++OOo...oOoOOOOoooOO++OOo...XXXXXoX...OO++OOo...XXXXXXX...oO++Ooo...XXXXXXX...oO++Ooo...XXXXXXX...oO+++++++OOo...oOO+++++++++++OOo...oOO++++++++++OOo...oOO+++++++++++OoO...oOO++++++",
-"+OOooXX.......oooO++++OoooX..... .oooO++++OooXX.......oooO++++OOoXX.......oooO++++OoXoX..... .oooO+++OOoXoX.......oooOO+OooXXX.....XXXXX..o++OOo...ooOOOOooooOO++OOo...XXoXXXX...oo++OOo...XXXXXXX...oo+++Oo...XXXXXXX...oo++OOo...oXXXXXX...oO+++++++OOoX..oOO+++++++++++OOO.X.oOO++++++++++OoO...oOO+++++++++++OOo.X.oOO++++++",
-"+OOo...oooooXXoooO+++OOo...oooooXXoooO+++OOo...oXoooXXXooO+++OOo...oooooXXoooO+++OOo...oooooXXoooO++++Oo...oooooXXXooO++OoXXXXoo...XXoXoXoo+++Oo...oooOOoOooOoO++OOo...XXXooXoXoXoO++Ooo...XXoXooXXoXOO++OOo...XXoXoooXXooO++OOo...XXoooXoXXooO+++++++OOo...oOO+++++++++++Ooo...OOO++++++++++OOo..XoOO+++++++++++OOo...OOO++++++",
-"+OOo...XooooXXoooOO++OOo...oXoooXXoooOO++OOo...oooooXXoooOO++OOo...oXoooXXoooOO+++Oo...oooooXXXooOO++OOo...oXoooXXoooO++OXXoXXoo...XXXXoXXO+++OOXXX..XXXXX...oo++OOo...XXoXXoXXXooo++OOo...XXoXXXoXXooo+++oo...oXXoXXoXoXoO++OOo...XXXXXoXXoXoo++++++OOoO...oOOO+++++++++OOOo...ooOO+++++++OOOoO...ooOO++++++++OOOOo...ooOO+++++",
-"+OOo...oooooXXXooOO++OOo...oooooXXXooOO++OOo...oooooXXoooOO++OOo...oooooXXXooOO++OOo...oXoooXXoooOO++OOo...oooooXXoooo++OoXXXXoo...XooXXoXO+++OOooX..oXoXX.X.Xo++OOo...XXXoXXoXXooO++OOo...XXXooXoXXooO+++Oo.. XXoXXXoXXooO++OOo...XXoXoXoXXooO++++OOOOoo...ooOOO++++++OOOoOo...ooOOO++++++OOOoo...oOoOO+++++++OOooO...ooOOO++++",
-"+OOO...XXXXX..XXXoO++OOo...XXXXX..XXXoO+++oO...XXXXX .XXXoO++OOo...XXXXX..XXXoO+++oO...XXXXX..XXXoO+++oO...XXXXX..XXXoO+OXo..........XXX..O++++OoOooX...oXoXoOO+++OoXXX..XXXXX...oO+++OoXXX..XXXXX...oO++OOOXXX..XoX.....oO+++OOXXX..XXXXX...oO+++++oooXo...XoXooO++++++oooXo...XXoooO++++OoooXo...XXoooO+++++OooooX...XXoooO+++",
-"+OOo...XXXXX..XXXOO++OOo...XXXXX..XXXOO+++Oo...XXXXX..XXXOO++OOo...XXXXX .XXXOO++OOo...XXXXX..XXXOO+++Oo...XXXXX .XXXOO+OoXX.........XoX..O++++++OOoo...XoXooO++++OOoXX..XXoXX...oO+++OOXXX..XXXXX...oO+++OOooX..XXX.....oO++OOOXXX..XXXXX...oO+++OOooXXX...XXoooO++++OOooXXX...oXXooO++++OooXXX...XXoooO+++++OooXXX...oXXooO+++",
-"++OOoooXoXXXXoXooOO+++OOoooXoXXXooXooOO++OOOoooXoXXoXoXoooO+++OOoooXoXXoooXoooO+++OOooooXoXXXoXoooO++OOOoooXoXXoooXoooO+OooXoXoXooooXoXooOO++++++OOooXXXoXoOOO+++++OoOoooooXXooooOO++++OOOooooXoXooooOO++++OOooooXooXoooOOO++++OOOooooooXooooOO++++OooooXoXoXoXooOO++++OoooXoXoXoXoooOO+++OooooXoXooXoooOO++++OoooXoXoXoXoooOO++",
-"++OOoooXoXooooXoXOO+++OOooooXooXooXooOO+++OOoooXooXoooXooOO++++OoooXoXoXoooXoOO+++OOoooXoXooooXooOO+++OOoooXoXoXooXooOO++OOooXoXooooXoXooOO++++++OOOoXXXXoOOO+++++++OOOoXXooXooOOO+++++OOOooXooXoXoOOO+++++OOOOooXooXoooOO++++++OOOoXXXoXooOOO++++++oooXoXoXooooo+++++++oooXoXoXoXooo++++++oooXoXXXoXooo+++++++ooooXXoXoXooo++++",
-"+++OoooooooXoooooO+++++OooooooXooooooO+++++OooooXooooooooO++++OOooooooXooooooO+++++OooooooXooooooO+++++OooooooXooooooO+++OoooooooOooooooOO++++++++Ooo...ooO++++++++++OOooooooooOO++++++++OOooXooooOoO++++++++OOoooXoooOOO++++++O+OOoooooooOoO++++++OOoooXoooXooooO++++++OOooXoXooooooO++++OOooooooooooooO++++++OoooooXooooooO+++",
-"++++OOOoOoOOoOoO+O++++++OOOoOOOoOOOoOO++++++OOOOOoOoOOOOO+++++++OOOoOOOOoOOOO+++++++OOOoOOOOoOOOO+++++++OOOOoOOOOOOOO+++++OOOoOOOOOOOOOO+++++++++OOoo...oOO++++++++++++OOOoOoOOOO+++++++++OOOOoOOOOO++++++++++OOOOOOoOOO+++++++++++OOOOoOOOO+++++++++OOOOooOOoOO++++++++OOOOOOOoOOOO++++++++OOoOoOoOoOO+++++++++OOoOOOoOOOO+++++",
-"++++++O+O+OO+O++O++++++++O+OOOO+OOO+++++++++++OOO+OOOOOO++++++++++O+OOOOOO++++++++++++O+OOOO+OO+++++++++++OO+OOOOOOO++++++++O+O++++OOOO+++++++++++OoOOOOOO++++++++++++++OOO+O++++++++++++++O+O+OOO+++++++++++++++OOOO++++++++++++++++OOOOO+++++++++++++OO++OOO+++++++++++++OOOOOOO+++++++++++++OOO+OO++++++++++++++OOOOOO+++++++",
-"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOOOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"+++++++O+O++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"+++OOOOOOOOOoOO++++++++++++++O+O++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOOO++++++++++++++++O+O+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OO++++++++++++++++O+O+++++++++++++++++++++++++++++++++++++++++++++++++OOooOOOO+++++++++++++++++++++++++++++++",
-"++OOOoooooooOoOOO++++++++++OOOOOOOO+++++++++++OOOOO+++++++++++++++++++OOOOO++++++++++++OOooOOO++++++++++++++OOOOOOOO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOOO++++++++++++++++++OOOOOO++++++++++++OOOOOO+++++++++++++++++++++++++++++++++++++OOOOO++++++OO...XoOO++++++++++++++++++++++++++++++",
-"+Ooo.X...oXX..oooO++++++OOOoooooooOO++++++++OOOXoOOO+++++++++++++++++OOoX.OO+++++++++OOoo...oo+++++++++++OOOoXoXooooO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOXoOOO++++++++++++++++OoooooO+++++++++++OooXoXOO+++++++++++++++++++++++++++++++++++OOoX.OOO+++OOo...XXOO++++++++++++++++++++++++++++++",
-"+Ooo.....XXo..XooO+++++++OooXoXoooOOO+++++++OOooXooOO+++++++++++++++OOOo.XoOO+++++++++OOo...ooOO++++++++++OooXXooooooO+++++++++++++++++++++++++++++++O++++++++++++++++++++++++++++++++++OOoXXooOO+++++++++++++++OoooXXOO+++++++++O+ooXXXOOO+++++++++++++++++++++++++++++++++OOOo.XoOO++++Oo...XXoOO+++++++++++++++++++++++++++++",
-"+Ooo.....XXX..oXoO+++++OOOooXoXoXXOOO+++++++OOoXXoOOOO+++++++++++++OOooo.XoO+++++++++OOoo..XooOO++++++++OOOooXXXooooOO+++++++OOOOOOOOOO++++++++++++OOOOOO+++++++++++++++++++++++++++++++OOooXoOoOO+++++++++++OOOOooXooOO++++++++OOOooXXXoOOO++++++++OOOOOOOOOOO+++++++++++OOOooo..OOO++++OOoooXXooOOO++++++++++++OOOOOOOOOOO++++",
-"OOoooooXX...XXooOOO+++OOoXoXX...XooO+++++++++OOooXXXOO++++++++++++OOOoXXooOOO+++++++OOoXXoooXXoOO+++++++OOooXXXX..oOo+++++++OOoXooOoooOoO++++++++++OooXoO++++++++++++++++OOOOOOOO++++++OOOoooXXoOOOO+++++++++OOooXXXoooOO++++++OOooXXooooXOO+++++++OOooooOoO..OOO++++++++OOOOXoXooooOO+++OOoooXXoOOOOOO++++++++OOOO..oOOXooooO++",
-"+OooXoXXX...XXooOO++++OOoXoXX...XXOO+++++++++OOooXXXoOO+++++++++++OooXXXooOO++++++++OOoXXoooXXoOO+++++++OOoXXXXX..ooO++++++OOoOXooooXXooO+++++++++OoooXooO++++++++++++OOOOOOoOOOOOO++OOOoOoooXXXoOOOO++++OOOOOOooXXXooOOOO+++OOOoooXXXXXXXOoO++++OOooooXXOooX.oOOO++++OOOOOoOXXXooooOOO++OOoXoXXXXXXXoOo++++++OOOoO.XooooXoooOO+",
-"+OooXXXooooo..oXoOO++OooXXXooXXoXooOO+++++++OOoXoXXXXoOO+++++++++OOoXoXXXXoOO+++++++oOooXXXXXooOO+++++++OoOXoXXXXooOOO++++++OoooXXoXoooOOO++++++++Ooo...OO+++++++++++OOoXoXXooXXooo+++oooXXoooooXXoooO++++ooXoXooOoooXXooO++++ooooXoooooXXoooO++++ooXoXoooooXXoooO+++OooXoXoooooXoXoXoo++OOoooXXoXoXoooo+O++++ooXoXXooOoXoXoXoo+",
-"+OOoXXXooooo..XXoo+++OooXXXooXXXXooOO+++++++OOooXXoXoXoOO++++++OOOooXXXoXooOO+++++OOOooXXXXXXooOOO+++++OOOoXoXoXXooOO+++++OOOooXoXXXXXoOO++++++++OOoo...oOO++++++++OOOooXXoXXXoXXoo++OooXXooooOooXXooOO++OooXXooooOoXXoooOO++OooXXXooooooXXooo+++OooXXXooOoOXXXooOO++OooXXXoooOoooXXooo+++OoooXXXoXXXoooOO++OOooXXoXoooOXoXXXoo+",
-"++oOXXXoXooo..XoXOO+OOooXXXooXXoXXooOO++++OOOooXoXXXXoooOO+++++OOooXoXXXoXooOO+++++OoooXoXoXXXooOO+++++OOooXXXXXXXoooO+++++OoooXXXXXXoooOOO+++++OOOoo...OOO++++++++OOoooXXXXoXXoXoo+OOooXXXooOooXXoXoOO+OOooXXXooOoooXXXoOO+OOooXoXooOooXXXXoOO++OoooXooooooXXoXoOO++OoooXXXoOooXoXXXoo+++Oooo..XXXXX...oOO++OooXXXoXOoooXXXXoo+",
-"++OOXoX..........oO++Ooo.....XXX.XXooO++++OOoXX..XoX..XXXOO+++OOoXX..oXX..XXoOO+++OOoXX..XXo..XXoOO+++OOXoX..oXo..XXoo+++OOOoXX..oXo..XXXOO+++++OOoooooooOOOO+++++OOXoX..oXX..XXXoO++Ooo...ooOoOXXXXXOO++Ooo...oooOoXXXXXOO++Ooo...oooOooXXXXOO++Ooo...ooOOOXXXXXOO++Ooo...oXoOooX...oo+++OooX..XXXXX...ooO++Ooo...oXOoooo...oo+",
-"+OOooXX..........oO++Ooo.....oXo..XXoOO+++OoXXX..oXo..XXXOO+++OoXXX..Xoo..XXXOO+++OoXXX..XoX..XXXoO+++OOXXX..oXo..XXXOO+++OoXXXX.XXX..XXXOO+++OOOooooooooooOOO++++OOXXX..oXo..XXXoO++Ooo...ooOOooXXXXoO+++oo...ooOOooXXXXoO++Ooo...oooOoXXXXXoO+OOoo...ooooooXXXXoO+OOoo...XoOooXo...oo+++Oooo. XXXoX...ooO+++oo...XooooXo...oo+",
-"+OOoooX..........oO++Ooo...X.XXX..oXXOO++OOOXXX..oXo..XXXOO++OOOXXX.XXXo..XXXoO++OOOXXXX.oXo..XXXOO++OOOXXX..XoX..XXXoO+++OOXXX..ooX.XXXXOO+++OOoooooooooOooOO+++OOOXXX..XoX..XXXoO++Ooo.X.oooOooXXXXOO+OOooX..oooOooXXXXOO++Ooo...ooOOOoXXXXOO++Ooo...ooOOooXXXXOO++Ooo...XXooOXo...oo+++Oooo..oooooXXXXoO++OooX..oXoOoXo..Xoo+",
-"++Oo...oXooooo...oO++OOOXXXXooooooXXXOO+++Oo...ooooooo...oO+++Oo...ooooooo...oO+++Oo...ooooooo...oO++OOo...ooooOoo...oO++OOo...ooooooo...oO++Ooo.............OO++OOo...oooXoXX...oO++OOoXXXooOOoooXXXoO+++OoXXXooOOoooXXXoO++OOOXXXooOooooXXXoO++OOoXXXoooOoooXXXoO+++OooooXXoooXXoXoOO+++Oooo.XoooooXXXXoo+++OoooXXXoooXXoXooO+",
-"+OOo...ooooooo...oO++OOoXXXXooOoooXXXOO++OOo...oooOooo.X.oo++OOo...ooOOOoo.X.oO++OOo...oooOOoo...oo++OOo...ooOoOoo.X.oO++OOo...oooOooo...oo++Ooo.............OO++OOo...ooXoXXX...oO+++OoXXXoooOoooXXXOO++OOoXXXoooOOooXXooO++OOoXXXooOOOooXXooO++OOoXXXooOOoooXXXOO+++OOoXoXXoooXXXoXOO+++OoooXXooOOooooXXO+++OOXooXXoooXXXooOO+",
-"++oo...oooOoOo.X.oO+++OOXXXooOooooXXXoO+++ooX..oOOOOOo...oo+++ooX..oOoOoOo...oo++OooX..oOOoOOo.X.oO++OOo.X.oOoOoOo...oo++OooX..oOOOOOo.X.oO+++OOoOooooooooOooO+++Ooo...XoXXXoo...oo++OOoXXXooOoOooXXXoO+++OOXXXooOOoooXXXoO++OOOXXXoooOoooXXXoO+++OOXXXoooOOooXXXoO+++OOooo..ooo..ooOO++++Oooo..oXooo...ooO++++Oooo..ooo..oooO++",
-"+OOo...oOoOoOo...oO++OOoXXXoooOoooXXXOO++OOo...ooOOooo..XoO++OOo..XooOOoOo..XoO++OOo...ooOOoOo...oO++OOo...oOOOoOo..XoO++OOo...ooOoOoo...oO+++O+OOOooooooOOOOO+++OOoX..oXXXXoo.X.oO+++OOXXXoooOoooXXooO+++OoXXXoooOoooXXXOO++OOOXXXoooOOooXXXOO+++OoXXXooOoOooXXooO++++OOOo..ooo..ooO+++++Oooo..XoXoo...ooO++++OOOo..oXo..ooO+++",
-"++oO.X.oooOooo...oo+O+OOXXXXoOOoooXXXoO++OOo.X.oooOoOO...oo+++oO...oOooOoo...oo++OOo..XoooOooo..Xoo++OOoX..oooOooO...oo++OOo.X.oOoOoOo..Xoo++++OOOoOoooOoOO+++++++oo...ooXXXoo...oO+++OoXXXXoOooXoXXXoO++OOOXXXXoOooooXXXoO+++OOXXXoooooooXXXoO++OOOXXXoooooooXXXoO+++++OOooX...XooOO+++++Oooo.......XoXOO++++++OOoXX...XXOOO+++",
-"++Oo...oXooooXX.XoO++OooXXXoooooooXXXoO++OOo...oooooXo..XoO++OOo...XoooooXX..OO++OOoX..oXooooo...OO++OOo..XXoooooX..XoO++OOo...XoooooXX..OO++++++OOoo...OOO+++++++Oo.....oooXX..XoO+++OOXXXoXooooXXXXoO+++OOXXXXooooXoXXXoO++OOOXXXXooooXoXXXoO+++OOXXXXooooXoXXXoO+++++OOooo...ooOO+++++OOoooXXoooooOoOO++++++++OOoX...XooO++++",
-"+OOoX..XooooXX...oO++OOoXXXoooooXoXXXoO+++OoX..XXoooXX...OO+++OO.X.XXoooXX...OO+++Oo...XooooXX...oO++OOO...XXoooXo...OO+++OO.X.XXoooXX...oO+++++++Ooo...oO+++++++OoO.....oooXo...OO+++OOXXXXooooXoXXXoO+++OooXXoXoooXXXXXoO++++ooXXXXoooXXXXXoO+++OOoXXXXoooXXXXXoO++++++OooX...ooO++++++OooooXXooooOOOO+O++++++OOooo...ooO+++++",
-"++OOooo.......oooo++OOoX.....ooo.....Xo+++OOooo.......oooOO++OOOooo.......oooOO+++OOooo.......oooOO+++OOooo.......oooOO+++OOooo.......oooOO++++++OOoooXoOO++++++++OoXXX.......oooOO++++OOoo..........oo++++Oooo..........Xo++++Oooo..........Xo+++OOooo..........oo+++++OOOXoXXXoOO++++++OOXXX..XXooOO+++++++++OOOooXXXXoOO+++++",
-"++OOoXo.......XooOO+OOoX.....ooo.....Xo+++OOoXo.......oooOO+++OOoXo.......oooOO+++OOoXo.......oooOO+++OOoXo.......XooOO+++Ooooo.......XooOO+++++++OOooooOO+++++++OOOXXX.......XooOO+++OOOoo..........Xo++++OOoo..........Xo+++++OOO..........Xo+++++OOO..........Xo++++OXoX.....oOO+++++OOoXXX..Xooo+O+++++++++OoXX.....OO++++++",
-"+++Oooo......XoooO+++OoX... .ooo.....oo+++OOooo.......oooO++++OOooo.......oooO+++++Oooo.......oooO++++OOooo.......oooO+++++Oooo......XoooO++++++++OOooooOO+++++++OOoXXX.......oooO+++++OOOo..........Xo+++++OOo.....X....oo+++++OoO.....X....oo++++OOoO.....X....Xo+++OOoXX....XoO+++++++OOXXX..XXoOO+++++++++OOoXX....XoO++++++",
-"++O+OOOOOOoOoOoOO+++OOOOOoOoOOOOOoooooO+++++OOOOOoOoOOoOO+++++++OOOOOOoOoOoOO+++++++OOoOoOoOoOoOO+++++++OOOOOoooOOOOO+++++++OOOOoOoooOoOO+++++++++++OOOO++++++++++ooXoXoooooOOoOO++++++++OOOoOoOOooooOO++++++OOOOoOooOooooO++++++OOOOoOooOooooO++++++OOOOoOooooooOO+++OOXoX..X..OO++++++OOOoXoXooXoOO+++++++++OOXoX.....OOO+++++",
-"+++++OOOOOOOOOO+O++++OOOOOOOOOOOOOOOOO+++++++OOOOOOOOOO+O++++++++OOOOOOOOOO+O+++++++++OOOOOOOOO+O++++++++OOOOOOOOOOO++++++++OOOOOOOOOOO+O++++++++++++O++++++++++++OooXooOOOOOOO+O+++++++++OOOOOOOOOOOOO+++++++OOOOOOOOOOOO++++++++OOOOOOOOOOOO++++++++OOOOOOOOOOOOO+++OOoXoXoXooOO+++++++OOooXoXoooO++++++++++OOoXoXooooOO++++++",
-"+++++++OOOOOO++++++++++O+OOO+O+O+++++++++++++++O+OOOO++++++++++++++OOOO+O++++++++++++++++OOO+++++++++++++++O++O+OO++++++++++++++O+O+O++++++++++++++++++++++++++++OOOOOOOOO+OO++++++++++++++++OOOO+OO+++++++++++++OO+OOO++++++++++++++OOOOOO++++++++++++++OO+O+OO+++++++OoooXooooOO++++++++OOOOOoOOO++++++++++++OooXooXooO+++++++",
-"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOO++O+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOoOOooOOO++++++++++++++++++++++++++++++OOOOoOOoOO+++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOOOOOOOOOOO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOOO+++++++++++++++++++++++++++++++++",
-"+++++++++++++++++++++++O+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOOoOOOoOOOOOO+++++++++++++++++++++++++++OOOOOOOOO++++++++++++++OOOO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOOOOOO++++++++++++++++++++++++++++++++",
-"++++++++++++++++++++++oOooO++++++++++++++++++++++++++++++++++++++O++O+O+O+++++++++++++++++++++++++++++OOX..oXXoXoX...OO+++++++++++++OOOO+++++++++OoooooooooO++++++++++++OoooO+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOO++++OO+++++OoX...ooOOOOOO++++++++++++++++++++++++++",
-"++++++++++++++++++++OOoooooO+++++++++++++++++++++++++++++++++OOOOOOOOOOOOOOOO++++++++++++++++++++++++OOo.X.XXoXXXXX..oO++++++++++OOOooOO+++++++OOooooooooooOO++++++++++OOooooO+++++++++++++++++OOOOOOO++++++++++OOO+++++++++++++++++++++++++++++++++OOOOO+++++++++++++++OOOOOOOOOOOO++++OoX.X.ooOOOOoOOO++++++++++++++++++++++++",
-"+++++++++OO+++++++++OOoooooOO++++++++++++++++++++++++++++++++OOOOoooooooooooOOO++++++OOOOO++++++++++++OO...XXXXoXX..XoO+++++++++++OOooOOO+++++++OooooXoooXoOO+++++++++OOoXXoOOO++++++++++++++++OOOooOOO++++++++OOOOOO+++++++++++++O+O+O+O+O++++++++OOOOOOOOOOO+O++++++++OOoooooOOooOO+++OXo...oooooooOoOOOO+++++++OOO+++++OO++++",
-"++++++OOoOoOO+++++++oo.....oOO++++++++++++++OOOOOOOOO+++++++Ooo..............XO++++++oooooO++++++++++OOo...oXoXoXo...oo+++++++++OOoo..ooO+++++++OooXXXXoo..OO+++++++OOOOo...oOOOO+++++++++++++OO.....oo++++++OOoo...OO++++++++OOOOOOOOOOOOoOOO++++OOoXXoXoooOOOOOOO++++OOooXooooo..OOO++OoX...Xoooo..XoXooo++++OOOooO+OOOooo+O++",
-"++++++OOoooooO++++++OO.X...ooO+++++++O+++++OOOOoooooOOOO++++Ooo....X......X...O+++++OoooXoOO+++++++++OOoX..XXXoXXX...oO++++++O+OOooo..ooOO+++++OOoooXXoXo..oOO++++OOOOooo...oooOOO+++++++++++OOo.....Xo++++OOOOoo.X.oOO++++++OOOOooooooooOoooO+++OOooXXoXooooooooOO+++OOOXXXXXooo..ooO++oooX..XXXXo..XXoXoo++++OooooOOOOOooooO++",
-"++++++Oo...ooO++++++OOoo...ooOO+++OOOoo++OOooo.....XXooO++++OOoooOooXXXooooOOOO+++++OooXoXOO+++++++++OOoXXX.....oX...oo++OOoOoOOOooo..ooOO+++++OoooXXXooo..OOO+++OOooXooX...oXoXooO++++++++++OOoXoXoXoO++OOoOooooXXooOoOO++++OoX...........X.OO+OOoX..............X+++OoooooXXooo..oOOO+Oooooo..oooXo...Xoo++++OOo..oOOOoX.XooO+",
-"++++++oO...ooOO+++++OOoo...XoOOO+OOoOoo++OOooo.....XXoooOO++OOOOooooXXXoOoOoOOO++++++oooXoOO++++++++OOOoXXXX....XX...oo++OooooooOooo..oooO+++OOOooooXXooo..ooOO++OooXXXXo...XXXoXoo++++++++++OOooXXXooo+++ooooooXoXXooOOOO++OOoo.............oO++OoX...............+++OooXXXoXooo..oooO++OOooo..oXooX...XXo++++OOo..ooooo...ooO+",
-"+++++OOo...oooO++++++OOo...oXOOO+Oooooo+OOooXo.....XXoooOOO+OOOOOoooXXXooOOOO++++++O+ooXXoo+++++++++OoOoXXX...X.XX...oO+OOoooooooooo..oooOO++OOOooXoXXooo..ooOo+OOooXXXXX...oXXoXoo+++++++++OOooXoXXooO+OOooooXoXoXooooooOO+OOXX.............OO+OOoo.....X.......X.+OOOoooXoXXooo..oooO+OOoooo..oooXo...oXO++++OOo..oooOo...ooO+",
-"++++++OOooo..OO++++++OOooXXooOOOOoXX.oo+Ooo...ooXXXoXXXXooO+OoooooOoXXXoooOOOOO+++++OoooXoOO++++++++OO.....XXoXXXX...oX+O+............XXXOO+oOoXXXXX..XXX..oXoo+OOoo...XX...XXXXXoo++++++++OOooX.....oO+OO...............oo++Ooo...ooooooo...oO++OOoooo..XXo..ooooO+OOo..............Xo+++ooXX..ooooo...ooO++++OOoX.oooooXXX..O+",
-"++++++OOoXo..Oo+++++++OoXXXoooOOOo...oo+Ooo...ooXXXXoXXXooO+OoooooooXXXooooOOOO+++++OOoXXooO++++++++ooX....XXoXoXX...Xo+OO.X..........XXXOO+OoooXXXX..XXo..XXXo+OOXo...oX...XoXXXXo++++++++OOXXo.....oo+OO........ .....Xoo++OOo...oOoOooo..XoO++O+OoooX.XXX..oOOOO+Ooo...............o+OOoooo..oooOoX..ooO+++++OoX.oXoooXXXX.O+",
-"+++++OOOooo..oOO++++++OOooX..ooOooX..oO+O..ooooooooXXooo..O+OXoXoXXo...XXoXoXoo+++++OooXoXOO+++++++++oooXoXoXXoX..XXXoo++OOoooo..oooooXXXoO+oooXoXXX..XXX..ooXX+Oooo...oo...ooXooXo+++++++++ooXXXXooooO+OooXXoXoo...oooooOO++OooX.XooOOooo...oO++++O+OOooXXXooOoOO++++OOoXoXoXooo..oooO+OOo.....oOOooXoXooO++++OOOXo...XXooooOO+",
-"++++++OOooo..ooO++++++OooXo.XooOoo..XoO+O..XooooooXXXooo..O+OooXXoXX...XXoXoXoo+++++OOoXoXOO++++++++OOoXoXoXoXXo..XXXoo++OOOooo..oooooXXXoO+oooXXXoX.XXXX..XXoo+OOXo...oo...oooXoXo++++++++OOoXXXXXXooO+OOXoXoXoo...XXoooO+++OOo...oOOOOoo...oO++++++OOOOXXXXooO++++++OOooXoXXooo..oooO+Ooo.....ooOOOXoXooo+++++OOoo...XXoXoOO++",
-"+++OOOOOoOo..ooOO++++++Oooo..ooooo.X.OO+O..oXoOooooXXooo..o+OooooXoX...XXXXoXoo+++++OoooXooOO++++++++oooXoXXoXoX..XXXoo++++OOoo..oooooXXXoO+oooooXXX..oXX..oXoX++ooXX..oo...oooXoXo++++++++OOXoXXXoXooo+OooXoXooo...oooooOO++OooX..OoOOOoo...oO+++++++OOoXXXooOOO+++++OOOXoXXXooo..oooO+Ooo.....oOOOooXXXoO++++++ooo...XXoooOO++",
-"++OOoooXoOoXXoooO++++++OOoo..oooooOoOO++o..oXooOooo..oooXXo+OOooOoooXXXoOOoOOOO+++++OOo...OO+++++++++Ooo..........XXXoO+++++OOOXXXXXooooOXo+OOOoooooXXooo..oooO+OOoX...Xo...XXXXXoX++++++++OOooo..XXXoX+OOoXXXXooXXXXooOO++++OOo...OoOOOoo..Xoo+++++++OOOoXXXoOO+++++++OOoXoXXooo..ooOO+OooXoX.XoooOooooXoO++++OOOoo...XXoOO+O++",
-"+OOoooXoooOXXoooOO++++++OOO..oXooOOOO+++o..XoooOOOo..oooXXo++++OOOOoXXXooOOOOOO++++++ooX..oOO++++++++OOo..........XoXOO++++++OooXoXooOoOooo+++OOOoXoXXooo..ooOO++ooo...XX...XXXXXoo+++++++++OOoo..XXXXo++oooXXXooXXXXooOO+++++oo.X.oOOOOoo...oO++++++++OOooXoXOOO+++++OOooXoXXoXo..ooOO+OXooXo..oooOooXoXXO+++++OOoo...XXooOO+++",
-"OOoX..oooooooXXoOO++++++OOOoo...oOOOO+++OXXXXooOoOoXXXXoXXo+++++OOOoXXXOoOOO++++++++OOo..XoO++++++++++OOXXXoXoooooXXXOO+++++++Ooo...oooOOOO++++OOoooXXooo..oooO++OooXXXoo...oooXooo++++++++OOOoOXXX..XX++Ooo...ooXXoXXoOO++++OOo..XooOoOoo...oO++++++++OOoooXXOO+++++++OOoXoXoooo..ooO+++OoOoooXooooooXoXoo+++OOoooX.....OoO++++",
-"OOo...XooooooXXXoOO++++++OOoo...ooOO++++OXXoXXOoOOooXoXXXXo+++++++OooXXoOOO+++++++++OOO...oOO++++++++OOoXXXXooooXooXoOO++++++OOoo...ooOOOO++++++OoooXXooo..oooO+OOooXXXoo...ooXoooo+++++OOOOOOooXX...XX+OOOo...ooXXXXXoOOO++++oO...oOoOooo...oO+++++++++OOooXXoOO++++++OOXoXXXXoo..ooOO+++OOOoXXoXoooXooXoO++OOOooXX.....ooOO+++",
-"OoO..XoooooooXXoooO+++++++OooX..OoOOO+++OoXXoXooOooXXoXoXXo+++++++OoXXXoOOO++++++++++Oo...ooOO++++++++OOXXXoXoooooXXoOO++++++++Oo...ooOO+O++++++OooXXXoooX.oXoO++OOooXXoo...oOooooO++OOOOOooooooXX..XXX++OOoX..ooXoXXXoOOO+++OooX..ooooooo..XoO+++++++++OOooXXooOO+++++OOoXoooooo..ooO+++++OOOoXoXooooXoXoO+OOooooXX.....oooOO++",
-"OXX.....XXXXX...Xoo++++++++OOXooXXooOO++Ooo...XooOooo.....o++++++OOOXXXXooOO++++++++OOOoXXXoOO+++++++++oooX..XoXooOOOO++++++++OOOoooXooOO++++++O+oooXXoOoXo...o+++OOOOOoo...oooOOO+++OooXoo.X...XXXXXoo+++OoXXX..oooooXXXOO+++Oo...XoXXXXX...oo++++++++++OOOoXoooOO+++++oooXXXXXo..ooOO++++++OooXXXXX...ooO+Ooo.....ooooo..XoOO+",
-"OXX. ...XXXXX...Xoo++++++++OOoXXXXooOOO+OOO.X.XXooooo...X.O+++++++OOXXXoXoOO+++++++++OOXXoXXoOO+++++++OOoXo..XXoooOOO+++++++++++OoooXXOOO+++++++OoooXXoOOoo.X.o+++OOOOOOo.X.OOO++++++OooXXo.....XXXXXoo+++OOXXX. ooXXoXoXOO++OOo...XXXXXXX...OO+++++++++++OooXXooo+++++OOoXXXXoXo..oOO+++++++OOoXXXoX..XoOO+OoX....XoOoXo...oOO+",
-"O..XoooooooXoXoX..o+++++++++OOOOoo...oO++OOOoooo.X.ooooooOO+++++++OooXXXooOO++++++++++OOoo.XXooO+++++++Oooo..XXXoOOO+++++++++++++OOOoooooO+++++++OooooOoOOooooX++++++OOoO...oOOO++++OOoooXXXoooooooooXo++++OOoooooOoOooXoXo+++OooooOoOOoOoXXXoO+++++++++++OOooXXXoo++++OOoooXXXXX..ooO++++++++OOoooXooooOO++OooXooOoOOOOOooo..o+",
-"O.XoXooooXoXoXXo..o+++++++++OOOooo.X.oo+++OOOooX..XoOoOoOOO+++++++OOoXXXXoOO+++++++++++OOO..oooO+++++++OOoo..XXXOO+++++++++++++++OOOooXoo+++++++OOoooXOOOOOoXoX++++++++OO...OO+++++++OoooXoXoooOOOooooX++++OOOooXOOOOooooXo+++OOoXooOOOOoOXoXOO++++++++++++OOOooXoO+++++OoooXXoXo..ooO++++++++OOoooXoooOO+++OOoooooOOOOOOoooX.o+",
-"O..oooOoooXoXoXo..O+++++++++++OOoo..Xoo+++++OOooX..OOOOOO++++++++++ooooXoOO+++++++++++O+OoX.XooOO+++++++OOoX.oXoOO++++++++++++++++OOoooooO+++++++OOOooOO+OOoooo++++++++OO...OOO++++++OOooooXooOoOOOOooo+++++OOOooOOOOOooXoo+++OOoooOOOOOOoXXoOO+++++++++++++OooXooo+++++OoooXXXoX..OOO++++++++++OoooooOO++++OOooooOO++++OOOo.Xo+",
-"OOOOOOOOOOOOOOoOOoO++++++++++++OOOOoooo+++++OOOOOOOOOO+++++++++++++OOoOOOOO+++++++++++++OOOOoooO+++++++++OOOoOoOOO++++++++++++++++++OOOO+O+++++++OOOO++O+++OOOO++++++++OOOooO+++++++++OOoOoOOOOOOOOOOOO++++++OO+O+++OOOOOoO+++OOOOOO++++O+OOOO+++++++++++++++OOOOOO++++++OOOOooOooooOO+++++++++++OOOOOOO++++++OOO++++++++OOOOOO+",
-"+OOOOO++OOOOOOOOOO+++++++++++++++OOOOOO+++++++OOOOOOO++++++++++++++++OOOO+++++++++++++++++OOooOO++++++++++OOOOOO++++++++++++++++++++++++++++++++++++++++++++OOO+++++++++OOOO+O+++++++++++O+OOO+++++++O++++++++++++++++O+O+++++++++++++++++OOO++++++++++++++++O+OO+++++++++OOOOOOOooO+++++++++++++++O+O+++++++++++++++++++++++OO+",
-"+++++++++++++++++O++++++++++++++++++OO++++++++++++++++++++++++++++++++O+++++++++++++++++++OO+O+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOO++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++OOOO+O++++++++++++++++++++++++++++++++++++++++++++"
-};
+static char * matrix0_xpm[] = {
+"320 377 7 1",
+"      c None",
+".     c #000000",
+"+     c #030E03",
+"@     c #081E08",
+"#     c #0B2A0B",
+"$     c #165016",
+"%     c #1B641B",
+"................................................................................................................................................................................................................................................................................................................................",
+"....................................................................++++++..............+++++.............................................................................................................................................................................................................................+++...",
+"............................++++.................................+++@@@@@+++...........++@@@++..............+..............................................................+................+....................++.....................................................................................................++@@@+..",
+"...........................+++++++.............++++++++..........++@@@@@@@++..........+++#@@@++...........+++++.....................................+++++................+++++............+++++.................+++++...................................................................................................++@@@++.",
+"..........................++@$$$@++.........+++@@+++@@+++........+@@@####@@++........++@@$$$@@@++.......++@@@@@+....................................+@@@@+..............++$$@@+..........+@@$#++..............+++$$$++.................................................................................................++@$$$++.",
+"..........................+@@$$$@@+.........+@@@#@@@#@@++.......++@#@#@##@@@+.......++@@#$$$@@@++.......++@####++..............+++++++.............++@#@@++............+++$#@@++.........@+@$$@++.............++@$$$@++...............+................................................................................++@$#$++.",
+"..........................+@@$$$@@+.........+@@@#@@@#@@++.......+@@###@##@@@+......+++@@#$$$#@@++......++@@@@@#+++............++@@+@++............++@@##@++............+@+$$@@+..........+@@#$@++...........++++@$$$@@++...........+++@++..............................................................................+@@$$$++.",
+".........................++@#$$$@@++.......+@@@$$@@@$$@@@+.....+++#@@####@@@++....++@@######$$@@@+.....++@##@#@@@+...........++@@$$$#@++.........++@@$$$@@+..........++@@@@#+++.........+++@##@@@+.........++@@@@$$$@@@@@+.........++$$$++............................................................................++@@@@@++.",
+".........................++@#$$$#@++.......++@@$$#@@$$@@@......+@+@######@@@+.....++#@######$$@@+.....+@@@@#@#@@@+..........++@##$$$#@+...........+@@$$$@++...........+@@###+++...........++@#@@@+.........+@@@@@$$$@@@@@..........++$$$++............................................................................+@@###@@+.",
+"..........................@@@$%$@@@........+@@@$$@@#$$@@++.....@@####$$$$##@@+....+@###@@@@@@#@+@+.....+@@@#@#@#@++........++@@##@@@@@++.........++@#@@@++...........++#@#@@@+...........++@#@##@++........+@@@$$$$$$$@@@+........++@#$$@++..........................................................................+++$$@@@+..",
+".........................++@#$$$#@++.......+@@#$$@@@$$@@+....+.@@@##$$$$$###++....++####@@@@@@@@+.....+@@@#@#@#@@@+.........+@@##@@@#@++.........++@#@#@++...........++#@##@++.............+@#@##++........+@@@$$$$$$$@@@+........++@$$$@++..........................................................................++@#$@@++..",
+"..........................@@@$$$@@+........++@@$$@@@$$@++.....+@@@###$$$$##@@++...++###@@@@@#@@@++.....+@@@#@#@#@+++.......+@@@##@@@@@+..........++#@@@@++...........++#@#@@+.............++@@#@@@+........+@@@#$$$$$$@@@+.......+++@$#$@@++...............................+.+.+.+...................................+@+$$@++...",
+".........................++@#$%$#@@........++@@@@@@@@@+++.....+@@#$$##@$$##@@.....++@##$$###@@@++......++@@####@#@@+........+@@$$@@@+@++..........+@@+++.............+@$$$@@+.............++@@$$$++.........+@@@@$$$@@@@++.....+++@@@$$$+@+++..........................++++++++++++++..............................++@@@#@@++...",
+"..........................@@@$$$@@++........+++@@+++@@+......++@@@$$###$$@##++....++@@@$$#@#@@@@++......++#@@#@#@@@@+......++@@#$@@+@++++..........++++.............+++$$$@++..............++@$$$@++.......+++@@@$$$@@@++.....+++@+@@$$$@@@@+++.......................+++@@@@@@@@@@@+++.............................+@@#@#++....",
+"..........................+@@$$$@@+.........++.++++++++.......+@@@$$@@@$$@@++......+@@@@@###$$@@@+.....+++@#####@@++.......++@@$$###@@@@++.........+................++@$$#@++...............+@$$$@+.........+@@$$@@#$$@@+.....+@$$$$$$$$$$$$$@+.......................+@$$$$$$$$$$$$$@+...........................+++###@@++....",
+"..........................++@$$$@++................+.........+++@@$$#@@$$@@@++.....+++@@@###$$##@++....++@#@####@@++.......++@@$$###@@@@@+...........................++$$$@+...............+++$$#@++.......+++@$$@@@$$@@++....+@$$$$$$$$$$$$$@+.......................+@$$$$$$$$$$$$$@+............................+@###@@+.....",
+"..........................++@$$$+++..........................++@@@$$@@@$$@+++......+++@@#@##$##@@@.....+++@#####@@@++......+@@@$$###@@@@@+..........................++@$$$+++..............++@$$$+++.......+++@$$@@@$#@@+.....+@$$%$$$%$$%$$$@+.......................++$$$$$$$$$$$$$@+...........................+++###@@+.....",
+"...........................++#$$@+...........................++$$$$$$%$$$##@+.....++@@@@@@@@#@###++....+@@@@######@@+.....++@@@#@$$$$$##@++.........................+++$$$+@+.............++++$$$+++........++@@@@@@@@+++......+@+@@@$$$@@@@+++.......................++@@@@@@@@@@@@+++...........................+@@###@++.....",
+"...........................+@$$$++...........................+@$$$$$$$$$$###+......+@@#@@@@@@####++....+@@@@#######@@.....+@@###@$$$$$#@@++.........................+++@##@@+..............+@@#@#++.........+++@@+++@@+++......+++@@@$$$@@+@+...........++++..........+.+++++++@+++++............+++.............++@@###+++.....",
+"...........................+++@+++...........................++@@########@++++....+@###$$###$$@#@@+....+++@@##@@@#@@++....++####@@@@$$@@@+...........................+@@##@@++............+@@@##@@+..........++.+..++++...........++@$$$@+++............+@@@@+............+++++..+++............++@@@+...........++@#@@@++......",
+"............................++@+++...........................++@@@###@#@@@++......++###$$@#@$$#@@++.....++++@##@@@#@++....++###@#@##$$@@@++..........................++@@@##++............++##@@@++...............................++@$$#@+++...........++@@@@++................+...............+@@@@@++..........+@@#@@@++......",
+"...........................++++@+.............................+@@@####@##+++......++@##$$###$$##@+.......++@#@#@@@#@+.....+@@###@#@@$$@@@++...........................+@#@#@@++..........++@@##@@+................................+++$$$@+............++@@#@@@.................................++@@#@++.........++@###@@+.......",
+"...........................++$$$++...........................++@@@#####@@@+.......++@@@@@$$$@@@+++........++######@#++.....+@#@$$$$%##$$$@+..........................++@@@##+++..........++@##@@@+.................................++$$$+++...........+@@$$$@@.................................+@@$$$++.........+@@#$@+++.......",
+"............................+$$$+.............................+@@@#####@@++..........+++@$$$@++............+@@#@#@@@+.....++@@#$$$$$##$$$++............................+@@$$@@+..........+@@$$@@++................................++@#$$++............+@@$$$@@+...............................++@@$$$++........++@@$#@++........",
+"............................+++++.............................+@@@##@###@++..........++++$$$@++............++@++@++++......+++@@@@+@@@@@+++.............................++$$@@@.........++@@#$++.+..................................+++++............++@#@@@++.................................++@@+@+.........+@@@#@@+.........",
+".............................+................................++@@###@#@@+.............+@@@@++..............+++++++.........+++++++++++++..............................+++$$@@+..........++@$$@++....................................+++.............++#@#@@++....................................+++.........++@#@#@++.........",
+"..............................................................++@@@#@@@@@+.............++@#@++..................................++.+....+...............................++++.++..........+++++........................................................+@#@@@++.................................................+@@#@@++.........",
+"................................................................++@+@@@+++.............++@@@+.............................................................................+.+...............+.+......................................................++@@@++..................................................++@@@@@+..........",
+".................................................................+++.++.................+++++.........................................................................................................................................................+++++...................................................++@@@+++..........",
+"................................................................................................................................................................................................................................................................................................................................",
+"..........+......................................+.+................+.+....................................+.++.+....................+............+.++++++................+.....................................................................................................................................................",
+".......+++++++............++++++..............++++++++...........++++++++................++++...........+++++++++++..............+++++++........+++++++++++++.........++++++++.............+++++++..............................................................................................................................",
+".....++@@@#@@+++........+++@@@@@+............++@@#@#@@++........++@@#@#@@++.............+@@@@@+........+++@#@#@#@@@@+..........+++@@#@@@++.....+@@@@#@@@@#@@@+.......++@@@#@+@++.........+++@@@@@+++.............................................................................................................+++++++++......",
+"....+++@@@#@@@++.......+++@@@#@@@+.........+++@@@#@#@@@+++....+++@@@#@#@@@+++.........+++@@@@@++.......+@@@#@#@##@@@+.........+++@@@#@#@@+....++@@#@####@#@@@++....++++@@@##@@+@+........++@##@@@@+++...........................................................................................................+++@@@@++++.....",
+"...++@@$$###$$@@@+....++@##$$$$$++.........+@@@$$###$$@@@+....+@@@$$###$$@@@+.........++@$$$$$++......+@@@$$######@@+........++@$$$$$#@#++....++#############++....+@@@$$#@#$$@@@+......++$#########++.........................................................................................................++@$$$$$$$@++....",
+"...+@@@$$###$$@@@.....++###$$$$$@+........++@#@$$###$$#@@++...+@#@$$###$$#@@++........+@@$$$$$++......++@@$$##@##@@@+........+@@$$$$$##@@+.....+@####@#######++...++@#@$$###$$#@@++....++@$$########++.......................................................++++..........................++++................++@$$$$$$$@@++...",
+"..++@@@$$@#@$$@@@++....+@##$$$$$@++........@@@#$$@##$$##@++..++@@#$$@##$$##@++.......++@@$$$$$@++.....+@@@$$######@@++.....+++@@$$$$$##@++....++##@##########++...+@@@#$$##@$$##@++....++@#$########++.....................................................++++++++.......................+++++++++...........++@+$$$$$$$@@@+...",
+"..++###@@@@@@@###++...++++@@@$$$+++.......++###@@@@@@@###++..++@@@@@@@@@@###++.......++####@$#@+......+@@@##@@@@@@@++......++@$$@@@@@+@@+......+++@+@+@+@#@#@++...++###@@@@@@@###++....@@@##+@@@@$$$@++..........+++.................+++................+++@@@$$$@+......+.+++++++.+......+$$$@#++++..........++@@##@@@@##@#++..",
+"..++###@@@@@@@###++.....+++@@$$$@+.........+@@#@@+@@@@###@+...+@@@@@+@@#@###@+......+++#@#@#$$@++.....+@@@##@@@@@@@++......++@#$##@@@@++.+.......+++++@@@##@#++...+@###@@@@@@@###@+....@@@##@@+@@#$#@@..........++++++..............++++++.............++++@@@#$#@@.....+++++++++++++....+.$#$##@@++++.........@@@@#@@@#####@+..",
+"..++###@@++@@@###++.....++++@$$$+@........+++++@+++@#@###++...+++++@+@@$$#@@++......+@@$$@@@$#@+......+@@@$$$$$$$@@@+......+@@$$@@#@@@@++..........+++@@##@@@++...++@###@@@@#@#@@++..+.@@@##@@+@@$$$@++.......+.@@$$$++...........+.@@$$$++..........++@@#####@@@++...++@@#@@#@#@@#@@+....++@+@#$$$@@++........+@@@@@+@@@##@++..",
+".+++###@@@++@@###@+.......++@#$$@++.........+++++++@@####++.....++++@+@$$###++.....++++$$@@@$$@++......@@@$$$$$$$#@@++....+@@@$$@#@##@@++............+++##@@@+....++#@#@#@@@@####++...+@@@##@+@+@$$#@@+........+@@$$$++............+@@$$$++.........++++@#####@@@++...++@#@##@#@##@#@++....++@#@$$$@@@+++.....+++@@@+@@@@###@+..",
+".++@###@@++@@@###++.......++@$$$+++............+++@@@####++......+++@@@#$@#@++.....+@@@$$@@@$#@++.....+@@@$$$$$$$@#@++....+@@@$$@#@#@@@@++...........+@@##@@@.....++@###@@@@#@#@@@+...+@@@##@@@@@$$$@++........+@@$$$++............+@@$$$++........++@@@@#####@+++....++#@#@####@#@##++....+++@@$$$#@@++++.....++@@@@+@@@###++..",
+"..++###@@@++@@###@+.......++@#$$@+............+++@@@$$@@@++.....+.@@$$$$$@@@++....++@@@@#@@@$$@++......++@@#@@@##$$$@+.....@@@$$$$$##$$$++...........+++$$@+++.....@@@@$$$$$$$@@@+.....@@@$$@@@@@$$$@++........+@@@#@@+............+@@@#@@+.......++@@#$$@@@@++++....+++#####@######@@+......+@@@@@##$$$@++......++@@@@$$#@@++..",
+"..++###@@+++@@##@@+.......++@$$$+++............++@@@$$@+++.......+@@$$$$$@@@++....++#####@@@$$@+++....+++@@@@@@@#$$#@++..++@@@$$$$$##$#$++..........++@@$#@+......++@@@$$$$$$$@@@@.....@@@$#@@@##$$$@@..........@@@#@++.............@@@#@++.......++#@#$$##@@@+......++@@######@####@@+.......++@@@##$$$@@+.......++@@#$$@#@++..",
+"..@+###@@++@@@###++........++$$$@+............+@@$$$@@@++.........++@@@#####@+....++$$$#####$$@@@+......+++@+++@+$$$@+....+@@@$$@@@@@$$$@++.........+@@@##+++.....++#####@@@#####++....+++##$$$@#$$$@++.........++++++..............++++++........+@###$$@@@+++.......+@@@#@@####@@##++.......+++@@#@$$$@@+......++@$$$@@@+++...",
+"..+@@##@@+++@@###@+.......++@#$$@++..........++@@$$$@@+++........+++@@@@####++....++$$$@###@$$#@@+.....++++++++@@$#$@@+...+@@@$$@@@@@$$$@++.........+@@@##++......++#####@@@#####++....+++@#$$$##$$$@@+..........+.+.................+.+..........++###$$@#@@++......++@#@##@###@##@#++.......+++@@##$$$@@+.......++$$$@@@++....",
+".++@###@@+@+@@###++........+@$$$+@..........+++@@$$$@@+........++++++@@@####++...+++$$$#####$$@@@++...+.++++++++@$$$@++...+@@@$$@@@+@$#$@@+........+@@@#@#++.....+++###@#@@@#@###@+.....+@@#%$$#@$$#@+............+.+.................+.+........+++#@#$$@@@@@++......+@@#@#@#@####@#++......+++@@@#@$$$@@+......+++$$$@@++.....",
+"..++###@@@++@@###++......+++@$$$@++.........+@@$$#@#@+++......++@@++++@@@###++...++@@##@####$$#@@++...++@@+++++@@$$$@++...+@@@$$+@@@@$$$+++........++@##@@@+......+@@##@@@@@@@##@@+.....+++@@@@@@$$$@++.............+...................+.........+++@+@@$$$@#@++.....+@@#######@####++....+++@@$$$#@@++++.......+++@##+++......",
+"..++###@@@@@@@###@+......+++@#$$@@++.......++@@$$@@@@@++.....++@@@+@+@@@@###@++...++#@######$$##@+....+@@@+@+@+@@$$$@@.....@@@$$@@@+@$$$@++........+@#@##@+.......+@####@@@@#@###++.....+++@@@@@@$$$++...........++++................++++...........++@@@$$$##@@++...+++#####@####@#@@+....+++@@$$$#@@@++.........+@@#@@++......",
+"..++###@@@@@@@##@++.....++@@@$$$+@+++.....++@@@$$##@@@+++....++@@@@@@+@@@###++....++#@##@###$$@#@@....+@@@@@@@+@@$$#@++....@@@$$@@@@@#$$@+.........++@#@#@+.......++###@@@@@@@###++.....+++@@@@@@$#$++.........+++++++.............+++++++...........++@@$$###@@@++...++@@@##@#@##@#@++...++@@@#$$$@@+++..........++@#@@+.......",
+"..++@@@$$@#@$$@@@++....++@@@@$$$#@@@@......@#$$$$@##@@@@@+...+@$$$@#@##$$#@@++....++++@@@###$$#@@++...+@#@$$@@##$###++.....++@#$#####$$$@++........+@$$$+@++.......@@@#$$@@@$$#@@@+....+++#@###$$##@+++.........@@$$$++............+@@$$$++............+++@@#@$$$@@....++@+++@++++@+++....+$#$##@@@@+++...........+@#@@+++......",
+"...+@@@$$@##$$@@@+.....+@@@##$$$#@@@@+...+++$$$$$#@##@@@@....++$$$##@@#$$#@#+......++++@@#@#$$@#@++...+@@#$$#@#$$###++.....+++$$###@#$$#@+.........++$$$@+.........+@#@$$###$$##@++....+@@@#@#@$$@@#++.........+@@$$$++...........++@@$$$+..............++++@@$$#@@....+.++++++++++++.....+$#$@#+@+++.............++@#@++.......",
+"....++@@@#@#@@@++.....++@@#@#######@@+....+@@@#########@@+...++@@@####@#@@+++........++@@######@@+....+++@@@####@+@+++......++@+#@###@@@+++........+@@@@+++.......++++@#@####@@++......++@@####@@@++...........+@@@#@++..........+++$$@@@++...............+++++@+++.......+....+..........+++@@+++.+..............++@#@+........",
+".....++@@###@@+++......+@@##@#@###@#@+....+@##@####@##@@@+....+@@@@#####@@++.........++@@@#@#@#@@@....+++@@##@#@#+++.........++@@#@#@@@@+...........+##@++.........++++@##@#@@@++......+@@#@###@@@++...........+@@###++...........++$$@@@++................++++++.........................++++++.+................++@@#++.......",
+"......+@@@#@@@+.......++@@@@###@@#@@@++...++@@#@@#@##@#@@++....+@@@#@#@@@++............+@#@###@@@+.......+@@##@#@++.........+.+@@@#@#@++...........++@@@+............+@@@@#@#@++.......++@@#@@@@+++.............+@@@@++..........+++$$@@@+.................................................+++.....................+@@@+........",
+"........+++++++........+++@+++@@+++++.....++@+@@+@++@++++.......++++@+@+++.............+.+++++@++.......+++++@+++++............+++@+++++.............++++.............++@+@+++++........+++@+@+++...............++++++...........+@@@@@+++.........................................................................+++.+........",
+".......+.++++............+++++.+++++.........+++++++++++.........++++++++...............++++++.+..........+.+++++...............++.++....................................++++..............+++++..................++.............++@@@++..............................................................................+.........",
+".............................+.+.............................................................+...................................................................................................................................+.+++++........................................................................................",
+"................................................................................................................................................................................................................................................................................................................................",
+"................................................................................................................................................................................................................................................................................................................................",
+".......+++++................+................+.+.+.+.................+.+.............+.+.+.+.............+.+.++.+............+.+.++.+.+..............+.+.............+........+............+.+.+.+..............+.+.+.+..........+........+..........+.+.+......................................................................",
+".....+++++@+++...........+++++++...........+++++++++++.............++++++++++......+++++++++++.........+++++++++++++.......++++++++++++++..........++++++++++......+++++++++++++++.......++++++++++++..........++++++++++......++++++++++++++......+++++++++...........+++++.....+++++.....+++++....+++++..........++++++.......",
+"....++@@#$$$@@+........++@@@@#@@++........+@@@#@@#@@@+++........+++@@@@@#@@+@+...++@@@#@@#@@@@++......+@@@#@#@@#@@@@+.....+@@@#@#@@#@@@@@++.....+++@@@@@#@@+@+...++@@@#@@+++@@@#@@+....+@@@@#@#@@@@@@........+@@@@#@@@@@@+...++@@@#@@++@@@@@@+....+@@@@#@@@++........++@@@@++...++@@@@+..++@@@@+++++@@@@@+......+++@@@@@@++.....",
+"....++@##$$$@@++.......++@@@#@@@++.......++@@#@#@#@#@@+++.......++@@@##@@@@@@@+...@@@#@#@#@#@@+++....++@@#@#@#@##@#@++...++@@#@#@##@###@@@+.....++@@@##@@@@@@@+...@@#@@#@@@@#@#@@@@...+.@@@@@#@##@@@@+......+.@@@#@####@@@+...@@#@@#@@@@#@#@@++..++@##@#@#@@++.......+@@@@@@+++++@@#@@@...+@@@@@+++@@@#@@@+.....++@@#@#@@+++....",
+"..++@@@@#$$$@@@+.......+@@@#@##@@++......+@@#@##@#@#@@@+++....++++@@#@##@@@@@@+.++@@@#@##@#@#@@+@+...+@@#@##@##@##@#++...+@@#@#@#@##@@#@@@+...++++@@#@##@@@@@@+.++@@@#@#@@@@@#@#@@@...++@@##@#@###@@@+......++@@#@#@#@#@@@..++@@@##@#@@@@##@@++..++@@#@#@#@@++.......+@@##@@@+++@@@#@@@.++@@#@@@@++@@#@#@@+...++++@@#@#@#@++++..",
+"...+@@@##@@@$$@++......+@@@$$$$$@@+......++###$$#####$$$++....+@#@$$#####$$$#@+..+@@$$$#######$$#++..++###$$#####$$$@++..++###$$#####$$$#@+...+@#@$$#####$$$#@+..+@@$$$##@@@##$$$@@....+@@@##$$$@##@@+.......+@@###$$###@@+..+@@$$$##@@@$$###@+..+@@##$$###@@........+@@$$$@@@+@@@$$$@@..+@$$$$$@@@@#$$$@@+...+@@##$####@$$$++..",
+"..++@#@##@@@$$@++......+@#@$$$$%@@++.....++###$$#####$#$++...++@@#$$@#@##$$$##+..+@@$$$#######$$$@+..++###$$##@##$$$@++..++###$$##@##$$$##+..++@@#$$@####$$$##+..+@@$$$##@@@##$$$@@....+@@###$$$#@#@@+......++@@#@#$$###@@...+@@$$$##@@@$$##@++..++#@#$$#@@@+........+@@$$$#@@@@@#$$%@@..+@$$$$$@@@#@$$$@@+..++@#@$$@####$#$+++.",
+"..+@###@@##@$$@@@+.....++@@#######++....+++@@@##@@@@@$$$@++.+++$$$@@@@@@@#@@#@+..++@###@@+@+@@#$$@@.+++@@@##@@@@@$$$@@..+++@@@##@@@@@@@@@#+.+++$$$@@@+@+@#@@#@+..++@###@@@@@@@###@+.....++++@$$$@@+++........+++@@@##@@@+++..++@###@@#####@+@+....++@@$$@@@+++......++@@$%$##@@@##$$$@@.+++###$$@@@@@$$$@@+.++@$$$@@@+@@@$$$@@+.",
+".++@###@@#@@$$@@@++.....++@#######++.....++@@@##@@@@@$$$@++..+@#$$@@+++++@#@##+..++@###@@@@++@$$$@@..++@@@##@@@@@$#$+++..++@@@##@@@@@#@##@+..+@#$$@@@+@+@@#@##+..++@###@@@@@@####@+.....+++@@$$$@++++.........++++@##@@@++...++@###@######@+++....+++@$$@@++........++@@$$$##@@@##$$$@@.++@###$$@@@@@$$$@++..++$$$@@@+++@$$$@@+.",
+"..++####@$$$$$@@@.......++@@#####@@++.....+@@@##@@@@@$$$@@+.++@$$$@@@+++@@@@@@+...++###@@+++@@#$$@@...+@@@##@@@@@$$#@+....+@@@##@@@@@#@@#@+.++@$$$@@+++++@#@#@+...+@####@@@@@@###@+.......+++$$$@@+.............++@###@@++....++###@@#####++.......++@#$@@++.........+@@$$$##@@@##$$$@+..+@@##$$##@@@$$#@@+.+++$$$@@++@+@#$$#@+.",
+"..+@###@#$$$$$@@@+......++@$$@@@$$@++....++@@#$$@#@##$$#@++.++@#$$@@++..+++@+++..++@####@++++@@###@...+@@@##@@@$$@@@++...++@@###@@@#$@@++++.++@#$$@@++++@+@@@++...++####@#@######++.......+@@$#$+++.............++@##@@@+.....+@###$$$$$@@++.......++@$$+@++.........+@@$$$$$@@@$$$$$@@..+@###@####@@$$$@++.+@@#$$@@++++@@#@#@@.",
+"..++##########@@@+.....++@@$$@@@$$@@++....+@@@$$@##@#$$$@@+..@@$$$@++.....+++.....++###@@+++.@@@@#@..++@@@##@@@$$@@++.....+@@@##@@@$#@++++...@@$$$@++++++@@+@++..++@#######@#####@+........++$$$@++..............++##@@@+....+++###$$$$$@@++.......++@#$@++..........++@$$$$$@@@$$$$$@@.+++####@###@@$$$@++.++@$$$@++..++@#@#@+.",
+"..++##########@@@+.....+@@@##@@@##@@@.....+@@@$$#####$$$@@+.++@$$#@++............+++###@@+.+++@#@##...+@@#$$$$$$#@@++.....+@@@$$$$$$$@++....++@$$$@++++@@@@@@@....++#####@#######++.......++@$$$@+..............+++##@@@+....++@###$$$$#@@++........+@$$@++..........++@$#$@#$$$#@$$$+@..++###@@$$$@@$#$@++.++@$$#@+++.+@@@###+.",
+"..++####@$$$$$##@++...++@@@##@@@##@@@+....+@@@$$@##@#$$$@@+.+@+$$$@++............+++###@@++.+@@@@##..++@@@$$$$$$$@+++.....+@@@$$$$$$#@++....++@$#$@@+++#@###@@+..+++#############@+........++$$#@++.........+.+.++@##@@@+.....++###$$$$$@@++........+@#$@@++........+++@$$$@#$$$#@$$$@+.++@###@@$$$@@$$$@@+.++@$$$@++..++@#@@#+.",
+".++@@##@#$$$$$@@@++....+@@###@@@##@@@++...+@@@$$#####$$$@@+.++@$$$@++............++@@##@@++.++@#@#@...+@@@$$$$$$$@++++....+@@#$$$$$$$@+.....+@@$$$+++++@#@@#@@+..++@@######@####@@+.......++@$$$@+.......++++++++++##@@@+....+++###$$$$$@@+++......++@$#@@+++++......+@@#$$#@$$$##$#$@+..++###@@$$$@@$$#@++.++@$$$@+++.++@@###+.",
+"..+@####@@#@####@+....+@###$$$$$$$###++...+@@@##@@@@@@#@##+.++@$#$@@++....+++.....+@###@@++++@@#@##...+@@###@@@$$@@@@+....+@@@###@@$#+++.....+@$$$@@+@@##$$$#@+...+@###@@@@@@@###@+......+.++$$$@++......+@@##++++@##@@@+.....+@###@@#@#$$@++.......++$$@@+++@@@+....++@$$$@@###@@$$$@@.++@###@#@@@##$$$@@+.+@@#$$@++.++@##@#@+.",
+"..++###@#@#@##@#@@...+++###$$$$$$$###++...+@@###@+@+@#@##@+.++@$$$+@++.+++++++....+@###@@++++@@@#@#...+@@@##@@@$$@@@@@+...+@@@##@@@$$++.....++@#$$@@+++##$$##@@...+@###@@@@@@@###++.......+@+$$#@++......+@###+@++@##@@@+.....++####@##@$$@@++.....++@$#@@+++@@@++...++@$$$@@#@#@@$$#@+..++####@##@##$#$+++..+@$$$@@+++++@####+.",
+".+++####@###@##@@++...+@$$$#@#@@#@$$$@+..++@@@##@@@@@##@##+.+++####@+++++@@@@@+..+++###@@++++@$$$@@..++@@###@@@@@@#@#@+..++@@@##@@@@@+.......+@###@@@@@@@@####+..+++####@+@@#@###@+......+++@$$$@+++....++@#$$@+@@@$$@@@+....++@###@@@@@###@@++....+@+$$@@@@@$#$@+...+@@#$$@@+@@+@$$$@@..+@###@@@@@$$$$$@@+.+++###@@@++@@$$$@@+.",
+"..++@@#@#@@@@@@@@...+++@$$$@#@@@#@$$$@@..++@@@##@@+@@@###@+.+++###@#@@+@@@##@@+..+@+###@@@@@@@$$$@@...+@@@##@@@@@#@@##+..++@@###@@@@++.......++####@@@+@@#@#@#+..+@@###@@@@+@@###@+.....+++@@$$$@+++....++@$$$@@@+@$$@@++....++@####@@@@##@#@@...+++@@$$@@@@@$$#@@...++@$$$@@++@+@$#$@@..+@###@@@@@$$$$$@++.+++####@@@+@@$$$@@+.",
+"..++#@##@@@@#@@@++...+@@$$$#@@@@@@$$$@@..++@#@##@@@@@##@##+..+@@###@@@@@@#@##@+..++@####@@+@@@#$#@@..+@@@###@@@@@@#@#@+..+@@@@##@@+@@++.....+.@@###@@@@@@@###@+..+++####@+@@#@###@+.....+++@+$$$@@@++....@+$$$@@@@@$$@@@.....+@+###@@@@@####@@+...++++$$@@@@@$$$@++.++@@#$#@@@++@@$$$@@.+++####@@@@#$$$$@@+...@@###@@@@@@$$$@++.",
+"..++@@@$$$$$$$@@++...+@@$$$$$@@#$$$$$@@..+@$$$$$$$$$$$$$@++...+@@@##$$$$$###@++..+@@$$$$$$$$$$##@++..+@$$$$$$$%$$$$$##+..+@$$$$$$$$@@.........+@@@$$$$$$$##@@@+..+@#$$$$$@@@$$$$$@@....+@#@$$$$$$$#@@+...++@#@$$$$$##+++.....+@@$$$$$@+@@@$$$@@..+@$$$$$$$$$$$$$@+...+@#$$$#@+@+@#$$$@@.++@$$$$$@+@@#$$$@+....+@@@$$$$$$$@@@+++.",
+"...++@@$$$$$#$@@+...++@#$$$$$@@@$$$$$#@.+++$$$$$$$$$$$$$@++..+.++@#@$$$$$##@@++.++@#$$$$$$$$$$#@#++..++$$$$$$$$$$$$$#@+..++$$$$$$$$@++.......++++@$#$$$$$###@++.++@@$$$$$@@@$$$$$#@...++@@#$$$$$$$##@+...++#@#$$$$$#@@+......+@@%$$$$@@+@@$$$#@..++$$$$$$$$$$$$$@++.++@@%$$@#+++#@$$$#@..+@$$$$$+@+#@$$$@++...+++@$#$#$$$#@@++..",
+"...+++@#$$$$$#@++....++@@@@@@@++@@@@@@+..++@@@@@@@@@+@++++....++++@+@@+@@+@++....++@@@@@@@@@@@+@++...++@@@@@@@@@@@@@+@+..++@@@@@@@@++..........+++++@@@@@++++.+..+@@@@@@++++@@@@@@+....+@+@@@@@@@@+@++...++++@@@@@@+@++......+@@@@@@+++++@@@@++..++@@@@@@@@@@@@@++..++@+@@@@+++++@@@@@+..++@@@@@++++@@@@++....+++++@@@@+@+@++...",
+".....++++@@@@++++....++++@+@++++++@@+++...+++@+@++++@+@++.........++++@++++++......++@+@@@+@+++++.....+++@@@@+@@@@+++++...+++@@@@+++.............+++++@+@++++.....+++@@+@+++++@++++.....++++@@@+@@+++......+++++@+@++.........++@++@+++++++++++...++@+@+@+@+@@+++.....+@++@++++++++++++...++@@+++++++++++.........++++@++++.....",
+".....++++++++++.......+++++++++++++++++...++++++++@+++++..........++++++++.........++++++++++++.......++++++@+++++++++....++++++++++..............++++++++........+++++++++++++++++.....+++++++++++++........++++++.+..........++++++....++++++....+++++++++++++......+++++++..++++++++....+++++....++++..........+++++++.+.....",
+".........+++.............+.+....+...+........+.++.....................+++.............+..+..+..............+......+.............++....................+.+.....................+++.........+...++++............+.+++..............+.+.......+.........++.+++++.+..........+.........+..........+........................+........",
+"................................................................................................................................................................................................................................................................................................................................",
+"....................................................................................................................................................................................................................................+++++.........+++++....................++++++...............................................",
+"...................................................................................................................................................................................................................................+@@@@@++.......+@#@+@+................+++@@@@@+..............................................",
+"........+.......................................+........................................+..+....................................................................................................................+...............+++@@#@@@++......+@##@++................++@@#@@@++..............++.............................",
+"...++++++++++++...........++++++++.........+++++++++++.............++++++++++.......+++++++++++++......+++++.+.+++++++.....++++++...+++++++....++++++...+++++++....++++++++++++++++....++++++++++++++++.....++++++++++++..........+@$$$##@++.....++@@@#@++...............+@@##$$$++.............+@@@+...........................",
+".+++@@@@@@@@+++++.......+++@@@+@+++......+++@@@@@@@++++..........+++@@@@@@++++....+++@@@@@@@@@++@+...+++@+@++++++@++++...+++@+++++++++@++++..+++@+@+++++++@++++..+++@@@+++++@@@++++..+++@@@+++++@@@++++..++++@@@@@@@@+@+++........++$$$##@++.....++@@@##++...............++@##$$$@+...........+++@@@++..........................",
+".++$#$$#$$$$$#@@+......++@@@#$$$$@@@+...++@@$#$$#$$$#@@++.......+++$#$$$#$$$$++...++$#$$#$$#$$$$$@+..++$$$$$@@@##$$$@@+.++@@$$$##+++#@$$$@@.++@@$$$#@@++#@$$$@@..+@##$$$$@@@#$$$$@@..+@##$$$$@@@#$$$$@@...+@#@$#$$$$$$$$++.......++@$$$#@@++......+@@@#@@++..............+@+##$$$@++..........++@$$$@++.........................",
+".+@$$$$$$#$$$##@@+....+++@##$$$#$@@@+....+@#$$$$$$$$##@+++.....++@@$$$#$$$$#$@+..++@$$$$$$$$$$$$#@+..+@$$$$$@+@@@$$$#@+..+@#$$$@#+++##$$$#@..+@#$$$##@@@##$$$#@..+@#$$$$$@@@$$$$$#@..+@#$$$$$@@@$$$$$#@..++###$$$$#$$$$$@++......++@$$$@@++.......++@@$$@++...............++@+$$#@+...........+@@$$$@@+.........................",
+"+++$$$$$$$$$$@#@@++...++@@##$$$$$@@@++...@@@$$$$$$$$@#@@@+....+++@@#$$$$$$$$$+@..++@$$$$$$$$$$$$$@@.++@#$$#$@@@##$$$@#+.+@@@$$$#@@+@@@$$$#@.++#@#$$#@@@@@#$$$@#.++@@$$$$$@@@$$$$$#@.++@@$$$$$@@@$$$$$#@..+@@@#$$$$$$$$$$@+........++$$$@++..........+@#$@@++..............+++@$$$@++.........++@@$$$@@++........................",
+"+++@@@##@@@@@####@+.+++###@#@@@@@$$$@++..+@@$$$@@@@@####@++....+@####@@@@@$$$@+..+@@#$$@@$$$@@$$$+@.++@$$$@@@++@@$$$@@+..+@@$$$@@@+@@@$$$@@.++@@$$$@@@@#@@$$$@@.++@@$$$@#@@@#@$$$@@.++@@$$$@#@@@#@$$$@@..++###@@@@@#@$$#@++......++@$$$@++..........++@@#@@+...............++@$$#@+..........++@#####@++........................",
+".+@@@###@@@@@####@+..+@@###@@@@@@$$$@@+.+++@#$$#@#@@#@###++...+@#@####@@#@$$$@@..++@$$$@@$$$@@#$$@+..+@#$$@@@+@+@$$$@@+.++@@$#$@@+++@@#$$@@..+@@$$$@@@#@@@$$$@@..+++$$$##@@@##$$$@+..+++$$$##@@@##$$$@+..+@####@#@@##$$$@+........++$#$@++.........++@@#@#@@+..............+++$$$@++........++@#@#####@+........................",
+"..+@@@##@@@@@@@@##+.++@$$$@@@@@@@###@@+..++@###@@@@@@@###++...++###@@@@@@@#@#++..++@$$$@@$$$@@$$$@+..+@###@@++++@#$$@@+..++@###@@+++@@###++..+@@$$$@#$$$@@$$$@@..+++@@@$$###$$@@@++..+++@@@##@@@$$@@@++..++@@#@@@@@$$@@@++.......++@$$$+++...........+@#@#@++..............++@$$$+++........++@$$@@@#$+@........................",
+".++@@@##@@+@@@#@##+.++@$$$@@+++++#####+..+++####@@@@#@###@+...++####@@@@@@##@@+...+@#$$@@$$$@@$$#@@.+++###@@++++@$$#@@+...++###@@@++@@###@+..++@#$$@@$$$@@$$#@@...++@@@$$#@#$$@@@+....++@@@##@@@$$@@@+...++@#@@@@@@$$@@@++.......+++$$$@+...........++@@$$$@++..............+@#$$@+.........+++$$@@@$$@++.......................",
+"..+@@###@@+@@@#@#@+.++@$$$@@++++@@##@@+..++@###@@@@@@@##@++...++#@#@#@@@+@@#@@+..++@#$$@@$$$@@$$$++..+@###@@@++++$$$@++..++@###@@+@+@@###@+..+@@$$$@#$$$#@$$$@+....+@@@$$###$$@@@+.....+@@@##@@@$$@@@+....+@@@@@@@@$$@@@+........++@#$$@++...........++@$$$+++.............++@$$#@++........+@@#$@@@#$@++.......................",
+".++@@@##@@+@@@####@.++@#$$@++++++#@@##@...++######@@$$##@@+...++@@@$$$$$#@@@@++....+@+@@@$$$@+@@+++.+++###@@++++@$#$@++...++@@#@@@+@@@@#@++..++@$$$##$$$##$$#@+.....+@@@@$$$@@@++.......++@##$$$##@++......+@@@@#####@@+..........+@$#$@+.............++@##@@+..............++$$$@+........+++@@@++@@@+@+.......................",
+"..+@@@##@@@@@#@#@@+.+@@$$#@++..++@#@#@+..+++###@#@#@$$@#@++...++@@@$$$$$@#@@@@+.....++@@@$$$@@++++...+@###@@+++++$$$@++...++#@##@@+@@###@@+..++@#$$@#$$$#@$$$@@......+@@#$$$#@@+++......+++##$$$#@@++.......++@@#####+++.........++@$#$@++.............+@@@$$++............++@$$$+++........++@@@@++@@+++.......................",
+"..+@@@$$$$$$$###@@+..@@$$#@+++++@@@#@#+...+@###$$$$$##@@@+.....++@@@@@@#$$$$$++.....++++@$$$@@+++...+++###@@++++@#$$@@+....+@@@##@@@##@@@+...+@@$$$$$@#@$$$$$@+.....++@@#####@@+.........++@@$$$@@+.........++@@$$#@@++.+........+++$$$@+...............++@#$@++...........+++$$$@+............+++.+++++........................",
+"..+@@@$$$$$$$###@++.++@$$$@@++++@###@@@..+++###$$$$$##@+++.....+++@@@#@#$$#$$++.......++@$$#@++......++###@@++++@$$#@++...++@@@##@@@##@@@+...++@$$$$$@#@$$$#$@+.....++@@######@++........++@@$$$+@++........++@@$$$@@+++.........++@$$$@++.............+++@##@@++..........++@$$$@++............................................",
+"..+@@@$$$$$$$##@@++..++$$$@@@@@@@####@+..++@###$$$$$##@@++....+++@@@@@#@$$$#$@+......++++$$$@+++....++@###@@++@+@#$$@@+.....@@@##@@@##@@@+....+@#$$$$#@@$$$$#@@...+++@@@#####@@@++........+@+$$$@++.......+++@#@$$$@@@@++.........+@#$$@+...............+++##@@@+..........+++$#$@+.............................................",
+"..+@@###@@@@@@@++...+++@##$$@@@@#$$$@@+...++###@@@@@$$@@@++...++#@#@@@@@@@$$$@+.......+@+$$$@++......++###@@++@+@$$$+++.....+@+$$@@@$$@++....++@###$$@@@$$###++...++@@#$$@@@$$@@@++.......+@@$$$+++........+@+$$@@@@@@#@@+.......++@$$#@++...............++##@@@+..........++@$$$+@.............................................",
+".++@@@##@@@@@++++....++#@@$$@#@##$$$@@+..++@###@@@@@$$@@@++..++@###@@@@@@@$$#@@......+++@$$$@@+.....+.@@##@@@@@@@$#$@@.......+@#$@@@$$@++.....++###$$#@@$$###@+...+@@@@$$@@@$$@#@++......+++@#$$@@++......++@@$$@#@@@###@++......+++$$$@@+...............++@@#@#++.........+@+$$$@++............................................",
+".+@###$$##@@@++......++@##$$@#@#@$$$@++..+@@$$$##@@@@#$$$@+..++@$$$#@@#@#@$$$@+......+@@@$$$@@@+......+@@###@@@#@###+++......+@@#$$$@@@+.....++@#####@@@#####++..+@@$%$##@@@##$$$@@......++@#$$$@@+++....++@##$$##@#@$$$+++......++@$$$++++..............++@@###++........++@@$$#@+.............................................",
+".++#@#$$#@#@@+.......++++@##$$$##@@@@@+.++@@$$$#@+@@##$$#@@..++@$$$###@@##$$$@+.....++@@#$$$@@+++.....@@@@#####@####@+.......++#@$$$#@+++.....++@####@@@#####@+.+.@@$$$##@@@##$$$@@.....++@#@$$$#@@+.....++#@#$$@##@#$$$@@........+@#$$#@++...............++@$$$@++......+++@@$$$@++............................................",
+".++####$#@@@+++.......+@@@##$$$##@@@@@+..+@@#$$@#@++@@$$$@+..++@$$$#@#@#@#$$#@+.....++@@@$$$#@@++.....+@@###@#@#@##@++.......++@@$$$#@++......+@#####@@@####@@+.++@@$$$##@@@##$$$@@.....++@@#$$$@@@++....++@##$$#@#@@$$$@+........+@$$$@#@++..............+++$#$++.......++@@#$$$+++............................................",
+".++@#######@@+.........+@@$$###$$$$$@@+...@@#####+@@@@###@@...+@#@########@@@++.....++@#######@++......++@@######@@@++........+@@###@@+.......++@@@@@+++@@@@@++..+@@#####@@@#####@@.....++@#######+@+.....@@@@#########@@++......++@#$$#@@++................@#$#@+.......++@@@$$$@+................................+.+.+.+.+....",
+".+@@##@###@@+.........++@@$$###$$$$$@@+..+@@@##@#++++@@#@@@..+++@@@#@#####@@@+.......++#####@#@++......+++@#@####@@@+.........+@@@##@@+........+@@#@@@++@#@#@+...+@@###@#@+@@###@@@.....++@@######+++.....+@@@#########@@+........++##@##@@+...............++@@+++.......+@@####@@+............................+++++++++++++++..",
+"..+++++++@+++..........@@@$$###$$$#$@@+...+++++@++..+++++++....++@+@+@+++++++........++++++@++++.........++@+@+++++............+++++++.........++++++++++++++.....+++++@++++@++@+++......+++++++++++......++@+++@+++++@++..........@@####@++.................++++........++@#####+++..........................++@@@@@@@@@@@@@@@.",
+"..++++++++..+...........+@@@@@+@@@@@++....++++++.+...++++......+.++++++++++.+..........++++++.............++++++++.............++++.+...........+.++..+.++..+......++++++++.+++++.+.......++++++++..........+++++++++++.+.........++@#@#@@++.................+++.........++@@#@#@++..........................+@+@@#@#@#@@###@@@.",
+".....+..................+++++++@@@+++.......+..........................+..................+..+................+.............................................................................+.++.................++++..............+++++++++............................+.+++@+@++............................@@@#@#@#@#@@#@#@@.",
+".........................++++++++++++...............................................................................................................................................................................................+++++..................................+.++++...........................++@@###############.",
+"................................................................................................................................................................................................................................................................................................................................",
+"................................................................................................................................................................................................................................................................................................................................",
+"...........................................++++.............................................++++.................................++++++++..........................++++.....................+++...................+++..........++++...................+++++.....................................................................",
+"........+++...............................+++++++..........................................+++++++..............................++++@@@+++........................+++++++..................++++++................++++++.......+++++++................++++@+++...................................................................",
+".....+++@@@+............................++@@$$$@++.......................................+++$$#@@++............................++#@##$$$$++.....................++@@$$$@++................++@$$$++..............++$$$@@......++$$$@@+...............++@$$$$$++..................................................................",
+".....++@@@@++............................+#@$$$@@+........................................+@$$###++...........................++@@##$$$$$@+......................+#@$$$@@+................+@@#$#++..............++$#$@@+.....+@$$$#@@+..............+@@$#$#$++..................................................................",
+".....+@@$$$@++...........................+@@###@@+......................................+.++@@###++..........................++@@$$$@@@@++.......................+@@###@@+................+@@###++.............+++###@@+.....++@@@##++...............++@@$$$++..................................................................",
+".....++@$$$@@+...........................+++###@@+++..................+.+...............+++@#@###@+..........................++@@$$$@@@@@++...........+.+........+++###@@+++.............+@@@###@++...........+++@###@@++....++@@###@+++.............++@@$$$@++............+.+.+................................................",
+".....+@@$$$@++...........++++++++........+@@###@@@++++............+++++++++++.........++++@+@####++.......++++++++.........+++@@@$$$@@@@@+.......++++++++++++....+@@###@@@++++...........++@@###++............++@@###@@+.....++@@@##@++++++..........++@@$$$@+........++++++++++++++.......+++++++++++............++++++++......",
+"......++@#@#@++.........+++@@@@@+@+.......++###@#@@@@@+++.......+++@@@@@@@@@@+.......++@@@@#@@###@+.....+++@@@@@@@+++......++@@#######@@@+.....+++@@@@@@@@@@@+....++###@#@@@@@++........++@#@#@@++..........++@@@@#@@@@++.....@@@@##@@@@@@+@..........++@$#$@++......++@@@@@@@@@@@@@++....+@@@@@@@@@@@++........+++@@@@@@@+++...",
+"......++@#@#@++.......+++@@@#@@@@+++......+@####@##@@@@+++.....+++@@@@#@#@@@@++....+++@@@#@#@###@@+....+++@@@#@@@@@+++.....+@@@#####@@#@@+....+++@@@@#@@@#@@@@....+@####@##@@@+++.......+++@@#@#+++.........+@@@@@#@#@@++.....+@@@##+@@@@@@@+.........++@$$$+++.....+@@@@@#@#@#@@@@@@++.+++@@@@@@@@@@@+++......+++@@@#@@@@@+++..",
+"......++++@@@+.........+@#@$$$$$$$@++....+++###$$$$$$$@#@+....++@#@$$###$$$$$@+...++@#@$$$$$$$###++...++@@#$$###$$##@+.....+@#@$$$$$###@@++..++@@#$$###$$$$$@@+..+++###$$$$$$$@@@+......+@@##$$$@+..........+@@###$$$$$++....++@@@##@@@$$#@@+..........++$$$@+......+@@$$$$$$$$$$$$$@@+..+@@$$$#####$$@@@+....++@@#$$###$$##@+..",
+".......++++@@+........++###$$$$$$#@++....++@###$$$$$$$##@@+...+@@##$$###$$$$$@+...+@@##$$$$$$$###@+...+@##@$$###$$@##++...++@#@$$$$$###@@+...+@##@$$###$$$$$#@+..++@###$$$$$$$#@@+......+@@##$$$@++.........+@#@##$$$$$++.....+@@@###@@$$#@@@.........++@#$$+@......+@@$$$$$$$$$$$$$#@@.++@#$$$#####$$@@@+....+@##@$$###$$@##++.",
+".........++@@+........++@@##$$#$$$@@++....++###$$$$$$$###++...++###$$###$$$$$@@...++#@#$$#$$$$###@+...++@##$$###$$#@#@+....+@#@$$$$$####@++..++@##$$###$$$$$@@+...++###$$$$$$$@@@++.....++@##$$$@+.........++@@####$#$$@++....+@@@###@#$$@#@+........+.+@$$$@++.....@@#$$$$$$$$$$$$$#@+..@@@$$$#####$$#@@++...++@##$$###$$##@@+.",
+"......................++@@@#@#@@$$@@@.....+@#####+@@@@$$$@+..++@#$$@@@@@@@$$$@+..+@@$$$@@@@@####@@+..++@$$$@#@@@@#$$$++....+++@@@###@+++++..++@$$$@@@@@#####@++...+@####@@@@@####++......++@@$$$+++.........++++@@@@@$#@+.....+@@#$$$$$@#@+++.........+++$$#@+......++@###@@#####@@@##+..+@@#####@@@@@###++..++@$$$@@@@@@@$$$@+.",
+"......................+@@@@@#@#@$$@@@+...+++###@#@+@@@$$$@@...@@$$$@@++@@@$$$@+...++$$$@@@+@@####++..++@$$$#@@@@#@$$$@@.....++@#@##@@@++....++@$$$@@@@@#####@++..+++#####@+@#@###@+.....+.+++$$$@+............++++@@@$$@++...++@@@$$$$$@@@++..........++@$$$@++.....++@###@#@#@#@##@#@@...+@#####@@@#####@+..++@$$$@@@+@@@$$$@+.",
+"......................++###$$###$$@@++....++###@@@@@@@$#$+@..++@$$$@@@++@@@@@++..+@@$$$@@@+@@@###@+..+@@$$$$$$$$$$$$$@+.....+++@#@##++++....+@@#$$@@+++@@###@++...++###@@@@+@@###++.......+@+$$$@++.............+++@@$#@+.....+@@@$$$$$@@++............+@#$$+++.....+++###@######@@##@@..+++###@@@+@@@###++..+@@#$$@@@++@@$#$@+.",
+"......................+@###$$###$$@@@+...++@####@++++@$$$@@...@+$$$@++++++@@@++..+++$$$@@+@@@@###@+..++@$$$$$$$$$$$$$@+......++#@##@@++.....++@$$$@@+@@@@###@+...+++###@@++@@@###@+.......++@$#$@+................++@$$@+.....+@@@$$$$$@@@++..........++@$$$@+.......+@###@@#@#@#@#@##+...+@###@@+@+@@###@+..++@$$$@+++@+@$$$@@.",
+".....................+++###$$###$$@@@+....++###@@@@@+@$$$+@..+@@#$$@++++++@+@++..+@@#$$+@++@@@###++..++@$$$$$$$$$$$$$@+......++@#@#@@+......+@@$$$@@++@@@###++...++@@##@@@+@@@##@@+.......++@$$$@++..............++@@$#@++....+@@@$$$$$@@++...........++@$$$@++.....++@####@###@#@#@#@+...+@@##@@+@+@@##@@+..+@@$$$@@+++@@#$#@+.",
+".....................++@$$$@@@@@$$@@@++..++@#####@+@@@$$$@+...+@$$$@@+++++@@@++..++@$$$@@@@@#####@+..+@@$$$##@@@@@###@+.....++@#@##@@++......++$$$@@@@@#####@++...+@###@@+++@@###@+......++@+$$$@+++.............++@@$$++....++@@@#####$$@+++........+++@#$$@@++.....+@###@@#####@#@##@..++@###@@@+@@@###@+...++$$$@@@+@@@$$$@@.",
+".....................++@#$$@@@@@$$#@@+...++@#####@@@@#$$#@+..++@$$$@#@++@+@@@@+..++@$$$#@@@@#####@+...+@$$$##@#@#@#@@@+.....++@@#@##@++++...+@@#$$@#@@@#####++...++@###@@@@@@@###++.....+++@@$$$@+++............++@+@$$@++....+@@####@#$$@@++........++@@$$$++++....++@####@##@#@@#@#@@..++@###@@@+@@@###++..+@@#$$@@@@@@#$$$++.",
+".....................++@$$$@@@@@$$@@@++..++@#####@@@@@$$$@@...++$$$@@@@@@@@@@@@...++$$$#@@@@#####@+..+@+$$$@#@@@@@###++....++@@@###@@@@++....+@$$$@@@@@#####@++..++@###@@@+@@@###@+.....+++@@#$$@@@+++.......+++++@@@$#@+....+@@@@####@$$@@@++......++@@@$$$@@@+++..++@###@@###@##@###@..++@####@+@@#@###@+...+@$$$#@@@@@@$$$@@.",
+".....................++@#$$$$$$$$$$$$@+..+@@$$$$$$$$$$@#@++..+++@##$$$$$$$$$$@@..+++@@#$$$$$$$$$$@@...++@@#$$$$$$$$$$@+....+@@#$$$$$$$@@@+...++@##$$$$$$$##@@+...+@@$$$$$@@@$$$$$@@...++@#@$$$$$$$@#@+.......+@@@@#@###++....+@$$$#@@@@$$$$$@@+...++@@##$$$$$$@#@+..+@@$$$##@##$$#@#$$@..+@@$$$$$@@@$$$$$@@...++@#@$$$$$$$@@@++.",
+"......................++$$$$$$$$$$$$$++..+@@$$$$$$$$$$@#@++....@@@@$$$#$$$$$$@@...++#@@$$$$$$$$$$@@....@@#@$$$$$$$$$#++....+@#@$$$$$$$##@+....@@@@$$$$$$$###++..++@@$$$$$@@@$$$$$@@....+@@#$$$$$$$#@@+.....++@@@@@#####++....++$$$##@@@$$$$$@@+....+@@#$$$$$$$#@@+..+@@$$$####@$$##@$$@..+@@$$$$$@+@$$$$$@@....@@@#$$$$$$$##@++.",
+"......................++@+@@@@@@@@@@@++..+@@@@@@@@@@@@@+++.....++@@@@@@@@@@@@++....++@+@@@@@@@@@@@@....++@@@@@@@@@@@@+.....+@@@@@@@@@@@@++....+@@@@@@@@@@###@+...+@@@@@@@+++@@@@@@+....+@@@@@@@@@@@@++......+@@#####@@@++....++@@@@+@+@@@@@@@++...++@@@@@@@@@@@@++..+@@@@@@@@@@@@@@@@@@..+@@@@@@@@++@@@@@@+....++@+@@@@@@@+@++..",
+".......................++@+@@@@@@@@@++....++@@@+@@@@@@+++.......++++@@@@@@@++++.....+++@+@@@+@@@@++......++@@@@@@@+++.+....+++@@@@@@@@+++......+++@@#@#@####+++...++@@@+@+++@@@@@@+.....+++@@@@@@@+++.......+@#@#####@++......++@@+@+++@@@@@++......+++@@@@@@@+++....++@@@@+@+@@@+@@@@+...++@@@@@+++@@@@@@+.....+++@+@@@@@+++...",
+".......................++++++++@++++++....++++@++++++++...........+++++++++++........+.+++++++++@++.......++++@++++++......++++@@@@@+++++......+++@@@@@#@###++....++@@@++++++++++++.....+++++@++++@++......++@@#####@++.......+++@+++..++@+@++......++++++@+++@++....++@@+++++++@+++@++...+++++++++++@+++++......+.+++++++......",
+"..........................+++++.+++.+........+.++++++...............++++.+++...........+++++++++............++.++++...........+..+.+++++.......++@@@##@###@#++.....+.+.+++..++++++.........+++++++..........+++++++@+++........+......+.+++..........+.+++.+++..........+++.++.+++.+.+......++++++..+.++++.........+++++.+......",
+".................................................................................................................................+.............++@@#@@#####@++................................................+++++++...........................................................................................................",
+"................................................................................................................................................................................................................................................................................................................................",
+"................................................................................................................................................................................................................................................................................................................................",
+".....................................................................................................................................................................................................................................+++@...............++++.............+++@...................................................",
+".....................................................................................................................................................................................................................................++@@++.............+@@@+.............+@@+++................................................",
+".....................................................................................+++...........................................................................................................................................++++@@++............++@@@++..........+++@@@+++...............................................",
+"....................................................................................+++@@+........................................................................................................................................++@##@@++............++$$$++...........++@@@#@++..............................................",
+"...................................................................................+@@@@#++.......................................................................................................................................+@@##@@++............++$$$++............+@###@@...............................................",
+"....................................................................................@@@##@+++.....................................................................................................................................++$$$@@+............++@#$$@++...........+++$$$+++.............................................",
+"...+++++++++++...........++++++++++++........+++++++++++..........+++++++++.......++@@@##@++++.........++++.....++++.......+++++++.+++++++.....+++++....+++++.......++++++.++++++......+++++....+++++.......++++++++++++.........++@$$$+++............++@$$$++............+@@$$$@+..............................................",
+"..+++@@@@@@@+++++......+++++@@@@@@@+++.....+++++@+++@+++++......++++@@@@+++++....+++@@@##@@@@+++......+++++++.++++++++....+++@+@++++++@@+++...+++++++++++++++++....+++@+++@++@++++....+++++++++++++++++....++++@@@@@@@++++........+@#$$@+.............+++$$$@++............++$$$@++.............................................",
+"++@@$#$@@$#$##@@+.....++@@###$##@$$#@@+....+@###$@@@$$##@++....++@#@$#$#@#@@+.....+@$$$$$$$#$$+@+...++@@$$$@@+++$$@#@++.++@@$$$$$@@@$$#$$@@.++@@$$$@#++@@#$$$@@..+++$$$$$@@@$$$$#@+.++@@$$$@@+++@#$$$@@....+@#@$#$#$#$#@@+.......++@$$$@++............++@#$$@+............++@#$$++..............................................",
+".+@@$$$##$$$##@@@+....+@@@##$$$##$$$#@+...++#@#$$#@##$###++....++@##$$$#####++...++@$$$$$$$$$$@++....+@@$#$+@++@#$#@#++..+@@$$#$$@@@$$$$$@@..+@@$$$#@@@+#@$$$#@...++$#$#$@@@$#$$$++..+@@$$$#@@@@@@$$$#@...+@@##$$$$$$$###++......+++$#$@+..............+@$#$@++............+@$$$@++...........+++++++++.+.......................",
+"++@@$$$##$$$##@@@++..++@@@##$$###$$$@@+....+@##$$@#@$$###++..+++@@##$$$@##@#++....+@$$$$$$$$#$@++...++@#$$$@@++@$$##@++.++@@$$$$$@@@$$$#$#@.++@#$#$#@@@@#@$$##@..+++$$$$$@@@$$$#$@+.++@##$$#@@+@#@$$#@@...++@##$$$$$$$@#@++......++@$$$+@.............++@$$$+++...........+++$$$@++........+++++++++++++++......................",
+".+@@#$$$$@@@##$$$@+..++$$$##@@@$$#$$@@+...++@@@$$$$$@@##@@+...+@#@$$@@@#####++....++@#@##@@@@@+++....+@@#$$@@@+@@@###@+..+@@#$$@@@@@@@$$$@@.++@@$$$@@###@@$$$@@...++@@@$$@@@$$#@@++..+@@$$$#@@@@#@$$$@@...+@###@@#@@$$@@@+.......+@@$$$@++............+++$$$@+............++@$#$@@+........+@@@$$@#@@@##@++.....................",
+"++@@$$#$$@@@##$$#++..++$$$##@#@$$$$#@@.....++@@$$$$$@@@#@++..++@##$$@#@#####++....++@#@##@@@@@+......++@$$#@@@+@@####++..++@$$$#@@@@##$$#@+..+@@$$$@@###@@$$$@@...++@@@$$@@@$#@@@++...+@#$$@#@@+#@$$$@+....+@####@##$$@@@+......++@@$$$+++............++@$$$@++...........++@$$$@@+.......++@@@$$##@@@###++.....................",
+"..++###@#@@@@+$$$@+.++@$#$@@@@@#@###@++.....++@$$@@@@@@+++...++@@@$$$$$@@@@@++....++@@@##@@@++.......++@###@@++@@@###@+..+++@@@##@@@@#@#@++.+++@###@#$$$#@###@+....++@@@@$$$@#@@+....++@@@@$$@@@$$@@@++...++@@@@@$$$#@@++........++@$$$@+..............++$#$@+............+++$$$@+++.....++@$$$@@$$$$$##@@+.....................",
+".++@####@@+@@@$$$@@..++$$$@@+@@#@###+++.....++@$$@@@++++++...++@@@$$$$$#@@@@+.....++@@###@++.++......+++###@@+++@@##@@+...++@@###@@@##@@@++..++@####@$$$@####++.....++@@#$$$@@@++.....++@#@$$@@@$$#@@++....++@@@@$$$@@@+++.......++@$#$@++............++@$$$+@.............+@#$$@++.......+@$$$#@$$$$$@#@@+.....................",
+"..++###@@@@@@@$$$@+.++@#$$##@@@$$###@+......+++$$@@@+++.......+@@@#$$$$@#@@@++.....+@@@##@+++.........+@###@@@+@@@###@+...++@@@@#@@@###@@+....++###@#$$$@@###@+.....++@@@$$$#@+++.......++@$$@#@$$@@++.....++@@#@$$$#@@++........+++$$$++.............+++$$$@++...........++@$$$@+........++$$$#@$$$$$##@++.....................",
+".++@###$$@@@##$$$@+..+@$#$###@#$$##@@+......+@+$$@@@++.......++@@#@@#@#$$###++....++@@@##@@+++++......++###@@@++@@###@+....+@@@$$@@@$#@+++....+@#####$$$$$###++.....++@#@$$$@#@++.......+++@#$$$@@@+.......++@@$$##@@@@@++.......++@$$$@++............++@$#$+++...........+++$$$+@........++@+@+@@+@@@@@++......................",
+".+++###$$@#@##$$#++..++$$$##@#@$$###@+.....+++@$$@@@+++......++@@@@@###$$##@@+......@@@##@@@@@+++....+++###@@@@@#@###@+.....++@#$@@@$$+@+....+++#####$$$$$###++....++++#@$$$#@@+++.......+@##$$$##+++.....+++@@$$###@@@@@+.......+++$$$@+.............+++$$$@+............++@#$$@++.........++@+++@+@++++.......................",
+"..+@#####$$$##@@@++.+.++@@#########@@++....+@@@$$@@@@@++.....++#####@@@#@$$$@+.....+@@@$$@@@@#@@@+....++@####@@@##$$#@@.....++@@#$$$#@@+......++@@#$$@@@$$@@@++....+@@#$$@@@$$@@@+.......+@@@$$$@@+.......++@#@$$@@##@##@@.......++@$#$@++............++@$$$+++...........++@$$$+++........++.+.+.+++++.+.......................",
+"..++#####$$$@@@@++....++@@##########@+....++@@@$$#@#@@+++....++######@#@#$$$@++.....++@$$#@#####@++...+@@#####@@##$$$@@......+@@#$$$#@+++.....++@@@$$@@@$$@#@+....++@#@$$@@@$$##@++.....+++#####@++........@@##$$@#@@####++.......++$$$@@+.............+@@##@+............++@$#$@+..............................................",
+".++@###@@@+@@@+++.......++++@@@@@###+++...++@#@$$@#@@@@++....++######@#@#$$$@+.....++@@$$@@###@#@+....++@#@##@#@##$$#@@......++@@$$$#@++......++@@@$$@@@$$@@@+....+@@@#$$@@@$$@#@++....++@+@###@@++.......++#@#$$@##@####++.......++$$#@++.............++##@@+............+@@$$#@+..............................................",
+".++@###@@@@+++...........+++@@@@####@+....++$$$$$###$$@++.....@@@##@$$$$$@@@+++.....+++@@$$###@@++.....+++@##$$$#@$$$@@.......+@@#@#@@+........+@@@#@@@@@#@@@+....++$$###@@@#$$$$++...+++@@#@###++........++@#@$$$$$$$#@@++......++@#$$@@++............++@#@++...........+++@$$$++..............................................",
+".++@####@@+@+.+.........+.+++@@@@###@++...++#$#$$####$+++.....+@@@#@$#$#$@@@+........++@@$$$@@@@++.....++++#@$#$@##$#@@.......+++##@@++.........++@@@++@@@@++.....++#$$##@@@$#$#$++...++$$$$$$$$++........++@@##$#$#$##@@+.........+@@@@@++.............+++++............+@@@@@@++..............................................",
+".+@@$$$$$#@@+..............+@@#$$$$$@@+...++++@+@+@+@+++......+++@+@+@@@++++..........++++++@+++.........+++@+@+@+@+++.........++++++............+++++++++++......+++++++++++++@++....++$#$$$$$$@++........++++@+@@@+@+@++.........+++@#@+++............+.++.............++#@+@+................................................",
+"++@@$$$$$@@@.+.............+@@@$$$$$#@+....+++++++++++.........+.+++++++++.............+++++++.+...........+++++++++++..........+++.+.............+.+..............+++++++++++++++.....+@@@@@@@@+...........+++++++++++............+++++++.................................+++++................................................",
+".+@@@@@@@@@++..............++@@@@@@@@++.......+...+.......................................+...................+.+.+.+.................................................................++@@@@@@@+++..............+..+........................................................+...................................................",
+"..++@@@@@@++................+++@@@@@+++.................................................................................................................................................@@@@@@@+................................................................................................................................",
+"................................................................................................................................................................................................................................................................................................................................",
+"................................................................................................................................................................................................................................................................................................................................",
+"..................................................+.+.............................................................................+.................+++++++.....................................................................................................................................................................",
+".................................................+++++..............++++++..............................+++++.+.+++++...........+++++.............++++@@+@+++...............................++++.+...............+.+............................................................................++++.+..........................",
+"................................................++#@#++...........+++@@@@++...........................++@@@@@+++@@@@++.........++#@#++...........++@@$#$$$@#@+...........................++++@@@+++............++@+@++.......................................................................++++@@@+++...........+++++++.......",
+"...#############...............................+++###+++.........++@@@@@@@++..........................++@@@@@+@+@@@@@++........+@@##++..........++@#@$$#$$@#@++........++.++++..........+++@@@@@@@+++.........+++@@@@++.....................................................................+++@@@@@@@+++........++++@@++++.....",
+"..##$$$$$#$$$$$##.............................++@@$$$@@++.......+++#$$#$$$@@+.......++++.+.+.++++.....+@$$$$$@@@$$$$$@+........+@$$$++..........+@@$$@#@#####++.....+++@@+++@#+.......++@@@$$$$#$$@@@+.......++@@@@@$$++..................................................................++@@@$$$$#$$@@@+.......+@##$#$$@++....",
+"..##$$$$$$$$$$$$#............................+++@@$$$@@@++......++@$$$$$$$@++......+++@++++++++@++...++@$$$$$@@@$$$$$@+.......++@#$$@++........++@@$$#@@#@###++.....++@@@+++#@++.......+@@@$#$$$$$#@@++......++###@##$++...................................................................+@@@$#$$$$$#@@++.....++#@$$$$#@@+....",
+"..##$$$$$$$$$$$##............................++@@@$$$@@@++......+@@#$$$#$$@@+......+@@@@@@@@@@@@++....+@$$$$$@@@$$$$$@+........+@$$$++.........+@@@$$@#@#@###++.....+++@@+++#@+......+++@#@$$$$#$$@@@++......++@#@#@$$++.................................................................+++@#@$$$$#$$@@@++.....++@#$#$$#@++....",
+"..#$$$%%%$$$$$$$#...........+.++............+@@@$$$$$$$@@+.....+@@@$$@@@@@+++.....++@#@$$#$#$$#@#++..+++@@#$$@@@$$@@@++.......+++$$$@++.......++@@@$$@#@@@@@@++.....+++@+++++@+.......+@$$$#@$$$##$$$@+.....+@@#####$$@++..........+.+.+.+++........+++++++++++++.........................+@$$$$#$$$##$$$@+......+@@@@@@@+++....",
+"..##$$$$$$$$$$$##..........+@@@@@+.........++@@#$$$#$$$@@@.....++@@$#@@+@++++.....+@@##$$$$$$$#@#++...++@@#$$@@@$$#@@++........+@#$$+++.......++@##$$#@#@@@@@+.......++++++++++.....+++@#$$##$$$@#$$#@+.....++@@###@$#@++........+++++++++++++....+++@@@@@@@@@++++......................+++@#$$$$$$$@#$$#@+......++@@@@@@+++....",
+"..#$$$%%%$$$$$$$#..........++@@@@+.........++###@@@@@##@@++...++@@@##@+@+++.......++#@###@@@####@++....+@@@$$@#@$$@@@+........++@$$$@+.......++@#$$@#$$$##@@@+..............+........+#@###$$@@@##@#@#@.....@@@##@@@$$@++........+@@@##@@###@@+....@##$#$$#$#$$$$++......................+@#@#@$$@@@$$@#@#@........+++++++......",
+"..#$$$%%%$$$$$$$#.........+.@+@@@++........++####@@@@@#@@+.....+@@###@@+++........++###@##@@#####++.....++@$$@#@$$@+++.........++$$$++.......++@$$$#@$$$##@@@++.....................++@@##@$$##@####@#@....++@@##@#@$$@++......++@@##@#@@##@@@...++@$$$$$$$$$$$#$@+.....+++++++++++.....++@#@#@$$##@$$##@#@.....................",
+"..##$$$$$$$$$$$$#.........++@@#@@+........+++####@@+@#@+@++...+@@@@##@@@+++......++@@####@#@####@@+....+++@$$#@##$@@+.........++@#$$@++......++@#$$@#$$$##@@@++.....................++#@###$$@#@##@#@#@.....@@@##@@@$$@@++....+++@#@###@@###@@+...++$#$#$$$$#$$$$@+....++++@@@@@@@+++....@@@#@#$$@#@$$@#@#@.....................",
+"..#$$$$$$$$$$$$$#..........+#@@##++........+@@##@@@@+@@++.....+@$$$$$$#$@@........++###@#@@@@@###++.....+++##$$$##+@+..........++@@@++.......++@$$$##@#@##$$$@+.....................++#####$$@@@@@#@##@....++@@#######@@+.....+@@@$$@@@#####+++....+@@@@@@@@@@$$#@@...+@@##$#$#$#$$$++..++###@@$$#####@#@##.....................",
+"..##$$$$$%$$$$$##.........++@##@@@+.......++@####@@+@@+@++....++$$$$$$$#@@+.......++###@@@@@#@###@+.....++@@#$$$##@++..........+@@@@@+........++$$$##@#@##$$$@+.....................++@##@#$$@@@#@#@@##.....++@#####@#@@++...++@@@$$@@@#####@+....+++@@@@@@@@@$$$@+...+@@@$$$$$$$$#$++...@@@#@#$$#####@#@#@.....................",
+"..#$$$$$$$$$$$$##........+++#@###++........++@####@@@#@@++....++@@@$$@#@@++.......++@#####@@####@++.....++@##$$$@#@@+..........+@###++.......+++@@@##$$$##$$#@+.....................++@@$$$$$$$$$$###@@....+@@@#$$$$$$@@+....+@$$$##@#@$$@@@++......+.++++@@@@$$#@+...+@@@@@@@@@@@@@+...++@@###$$@@######@@.....................",
+"..#$$$$$$$$$$$$##.........++#@###++........++##@###@@##@@++...+@@@@$$#@@@++......++@#####@@###@##@+.....++@@#$$$##+@+..........++###@++........++@@##$$$##$$#@+......................+@@#$$#$$$$$$###@@.....+@@$#$$$#$@@++...++$$$@#@#@$$@@@@+.......+..+.++++$$$@@....++@@@@@@@@@@@++...+@@###$$#@@#####@@.....................",
+"..#$$$$$$$$$$$$##........++@$$$$$@++.......++@####@@@#@@@+....++@@#$$@#@@++++.....++@#####@#####@++....+++@##$$$@#@++..........++##@@+........+.++@@@@@@$$###++.....................++@@$$$$$$#$$$###@@.....++@$$$#$$#@@+....++$$$#@#@#$$@@@++.............+++#$#@+...++++@@@@@@@@++....++@@###$$@#@#####@@.....................",
+"..#$$$$$$$$$$$$##.........++$$$$$@+.........++@+##%$$##@++....+@@#@$$@@@@@@@++...+++#@##$$$$$$#@#++.....++@@@$$$@@@@++........++@$$$++.........+++@+@@#@$$###++.......................+@@######@####@++.....+++@@@#@@@+++....++@@@$$@@@#####@++.............++@@@++.....++.++++.+.++.....++@@#@$$#@#$$###++.....................",
+"..##$$$$$$$$$$$$#........++@#$$$$@++........+++@##$$$##+++....++@@#$$@@@@@@@+++...++@##$$#$#$$#@#++....+++@@#$$$@@@++.........+++$$$@++.......++@@#@@@@@$$@@@++.......................++@#@##########++.....+++@@@@@@@++.....++@@@$$#@######++..............+.@+@++...........+.+.........++###$$@@@$$#@#++.....................",
+"..#$$$$$$%%%%%$##.........+@$$$$$+++.........++++@$$$@@++.....+@$$$$$$$$$#$$$@+....+@@@@@@@@+@@@++.....++@@$$$%$$$@@+.........++@$$$@+........++#@#@@@@@$$@@@++.......................++@@@@@$#$#@@+@+.......+.++++++++.......++@@#@###@@###@@+................+...........................+++@@#$$$#@@@++......................",
+"+.##$$$$$$$$$$$$#.........+@$$$$$@++...........++@$$$+++.....++@$$$$$$#$$$$$$++....+++++++++++@@++.....++@@#$$$$$$@@+..........++$#$@++........@@##@@@@@$$@@@+.........................+++@#@$$$@#@+++...........++............+++@#@#@@@###@@+............................................++@@@@$$$@#@@++......................",
+"+.#$$$$$$$$$$$$##........+++$$$$$@+............++@#$$@++......+@$$$$$$$$$$#$$@+.....++++++.+.++++.......++@$$$$$$#@@++........++@$$$++........++###$$$$$$$@++...........................+++@@$#$@@+++...........................++@@#@#@+#@#@++.............................................+++#@#$$@@+++.......................",
+"..##$$$$$$$$$$$#..........++$$$$$+++............++@@+++.......++@@@@@@@@@@@@++.......++.................+++@@@@@@@+++..........++$$$@+........++@##$$$#$#$+@+............................++++@+@+@+..............................++++@+++@++++...............................................+.+@++@@++.........................",
+"...############..........+++@#@#@@+..............++@@+.........+@@@@@@@@@@@+@++.........................+++@@@@@@@++..........+++$$$+++.......++@@@@@@@@@@++...............................+++++++................................+++.+++++++..................................................++++.++..........................",
+"..........................++@@#@@++..............................+++++++@+++..............................+++++++++............++@@@+..........++@@@#@@@+++.......................................................................................................................................+.............................",
+"..........................++@@@#@+................+................+++++.....................................++.................++@+++..........++@@@@@@++......................................................................................................................................................................",
+"...........................++@++++..............................................................................................++@+...............++++.+.......................................................................................................................................................................",
+"....................................................................................................................................................................................................................................................+.+.................+.+................++++.................................",
+"................................................................................................................................+.++++++...........................................................................................................+++++...............+++++..............++++++++..............................",
+".......++@++++................................++@+@++.............++@+@++.....................................................++@+@@@+@@++..................................................++++.................................................++@@@@@+............++@@@@@+............+@@##@#+++.............................",
+".......++@@@++................................++@@@@++............++@@@@++..................................................+++@@@@@@@@@@+.................................................+++@++................+.+..............................@@###@@+............@@###@@+..........++@#@###@@++............................",
+".....+++@@@@@+++.............................++@@@@@@++..........++@@@@@@++...............+++..............................+++@@@@@@@@@@@+................................................++@@@@++............++++++++..........................++@@#@#@++..........++@@#@#@++.....+++..+@@##@##@@@+...+++......................",
+".....++##@@@##++............++@++...........++@#@@@##@++........++@#@@@##@++............+++@@@+...........................++@#@$$$%$$$$$$@+..............................................++@@$$$++............+@@#@#@@+...........................@@$$$@@+......+++...@@$$$@@++...+++@@.+@@@@#@#@@@+++++@@@..........++++.......",
+"...+.++###@###+++..........++@@++...........++##@#@##@@+........++##@#@##@@+...........++@@@@@+...........................+@@##$$$$$$$$$#@+..............................................+@@#$$$++..........+++@@#@#@@@+........................+++@$#$@@+...++++++.+++@$#$@@++.++@@@@@.+@@#@#@##@@+++++@@+..........+@##+......",
+"....@@@##@@@##@@+.........+++$$$+++..........+@@@@@#@@++.........+@@@#@$$+@+...........++#@#@++..........................+@@$$$@@$$$##@@@++...............................................++@$$$@++.........++@##@@@##@++........................++@###@@++...@@@#@..++@###@@+++++@@#@@.++@@@#$$@@@+@@@@#@@.........++#@@++.....",
+"....+@@##@@@##@@@.........++@$$$@++.........++@@@#@##@++........++@@#@@$$@++...........++###@++........+++......+++......++@$$$@@$$$##@@@++...............................................++@$$$@+.........++@@##@@@##@@+........................++@###@@+++++@@@#@..++@###@@+++@@###@@.++@@#@$$@@@@@@@@##+.........++@@@+......",
+"...++@@##@@@##@@+.......+++@+$$$@@+++........+@@@@@##@++.........+@@@#@$#@@++.........++@@#@++........+++++++.+++++++.....@@$$$#@$$$###@@+...............................................++++$$#@++........++@@##@@@##@@@+.......+.+..+...........+@###@@@+++@@@@#@...++###@@@++@@@##@@.++@@@#$$#@@@@@#@#@+.........++@@@++.....",
+"....++@##@@@##@++......+@@@@@$$$@@@@@........+@@###@@@++........++@@@#@##@@+...........++@@@++.......+@@###+@+++$$@#@+...++@$%$@#$$$##@@@+...........+.+..................................++@$$$@++........++@@##@@@##@@+.....+@+@++++@++++......++@###@@@++@@###@+..+@@###@@@@@@#@@@@+.+@@@@@#@###@@###@++.........+@@@@++.....",
+"....++@@#@#@#@@++.....++@@@@@$$$@@@@@++.....++@@###@@++.........++@@#@###@@++.........+.+++++........+@@#@#@@+++#$@#@++...@@$$$#@$$$##@@@++........++++++.................................+@+$$$@++.........@@@##@@@##@@@+....+@@@+@@@@@@+++.....+++###@@@@@@@##@@+..+++###@@@@@####@@+.+@@#@#@##@#@@##@@++........+++###@+.....",
+"......+@@@@@@@+++.....++$$$$$$$$$$$$$++.....++####@##@++........++$$@@###@@+.............++..........+@@$$$@@+@@@####++..++@###$$$$$##@@@+........++@#@#+.................................+@@$$$@@+.........+@@###@@##@++....++@###@@@@$$@@++....+@######@@###@#@@+..+@###############@.+@@#####@#@##@#@@++........+@+###++.....",
+".....+++@@@@@++.......+@#$$$$$$$$$$$#@+.....++@#@@##@@@+........+@#$#@@##@@++........................+@@#$$@@+++#@###@+...++@#@$$$$$##@@@+........+@@###++................................+@@$$$@@+........+++@##@#@##@@+....++#####@@@$$@@@+...++@@#######@###@#+@.++@@####@#####@##@#.++@######@#####@@@........++@@$$$@++....",
+".......++@@@++........++$#$$$$$$$$#$$++.....++####@#@@++.........+#$@@@##+@+.........................+@@$$#@@@+@@####++...++@##$$$$$###@@+........+@@#@#++................................+@@$$$@@+.........++@##@#@##@++....++@####@#@$$@@@@+..++@@####@######@#+@.++@##############@#.++@@###@#@###@#@@+......+++@@#$#$++.....",
+".........+.............++@+@@$$$@@@++++......+@@@@@@@++.........++@@@@@@@++...........................++###@@+++@@###@+....+++@@@$$$##@@@+.........@@$$#@+...............................++@@@@@@@++........+@+#@###@@@++.....+@@@$$###@@$$$@++..++@+@@@@###@@$$$@+..+++@@@#@#@#@#@@@$$..++@+@@@$$$#@$$$@@+.....++@@#@$$$+++....",
+".......................++++@@$$$@@+@+........++@@@@@@++..........++@@@@@+++..........................++@###@@@+@@@##@@+....+.++@@$$$##@@@+........++@#$$++................................+@@@@@@++.........++@@#@##@#@++.....++@@$$@####$$$@@...+.++@@@@####@$$$@+...+++@@#@##@#@@@@$$...+++@@@$$##@$$$+++.....+@@###@@@++.....",
+".........................+++@###@+++..........+++++++...............+++++.............................+@###@@+@+@@###@+.....+++@@$$$##@@@+.........++@+++...................................++.+++.........++@@$$$$$$$@@++...+.@+@###@#@@$$$@@+...++@+@##@@@#@$$$@@..+++@@@##@@@@@###@@....++@###@@#@$$$@@+....++#####@@@+++....",
+"........................++++@###@+++............++....................................................++#####@@@##$$#@+......+++@$$$##@@@+...........+.+................+++++................+.............++@@$$$$$$#@@+.....+@@@#####@@$$$@@+.....@+@####@#@$$$+@...+@@@@#@@@@@@###@@...+++@##@#@#@$$$@++....++@####@@@+++....",
+".......................+.+@+@###@@+++................................................................++@#####@#@#@$$$@+.......+@+$$$##@@@++............................++@#@++..............................+@+$#$$$$$@+@.....++@@######@$$$@@+....++@@##@@@#@$$$@+...+@@#@##+++@@###@@..++++@###@@#@$$$@@+...++@###@@@@@#@+@+..",
+".......................++@@@@@@@@@@++.................................................................++#####@@###$$$@+......+++@$$$###@@+............................++@@#@@+...............................+++@+++++@+.....++@####@@@$$@@@++....++@##@###@##$$$@@...+@###@@+@+@#@#@@@...+#@#@@##@##$$$@@+....++###@@@@+#@@@+..",
+"........................@@@@@@#@@@@@@+...............................................................+++###$$$$$###$$@@.....+++@@$$$##@#@++...........................+@@$$$@@+...............................++++@+++.......++#####@@@$$#@@+++...++#@##@@#@#@$$$@@..++@###+@++@##@#@@@..++@@##@@@@#@$$$@@+....++@####@@@##@@@+.",
+"......................++@@@@#@@#@@@@+++..............................................................++@@##$$$$###$#$@@.....++@@@$$$###@#++...........................+@@$$$@@+.................................+.++.+.......++@####@@@$$@@@+.....++@#@@@#@#@#$$$@@..++@@##+@+++##@#@@@..++#@#@@#@@#@$$$@@+....+@@####@@@##@@+..",
+".....................+.@#$$$$$$$$$#$$++...............................................................+@###@@@@@@+@@+++.....+@@$$$$$$$$$$@+..........................++@@$$$@@+..............................................++@@@@@@@@@@@++.......+@@@@+@+@@@$$$@@...++@++++++@#$#@#$$...+@@@@+++@@@#$$@@+....++@#@##@#@##@@@+.",
+"......................++$$$#$$#$$$$#$++..............................................................++@###@@@+++..++++....++@@$$$$$$$$#$+@..........................++@@$$$@@+..............................................++@@@++@+@+@+++.......++@+++++++@#$$@@...++++++.++@#$@#@#$...+++++++++@@$#$@@+.....++@@$$$$$$#@++..",
+".......................+++@@+@@@+@+@++................................................................++###@@+......+.......++@$#$$#$#$$$++...........................+#@$$$@@++.................................................+++.+.++.............+.....+++++++....+.+..+..+@+++@++.....++++...+++++++......++++$#$$#$$+++..",
+"........................++++++++++++.+.................................................................@@##@+++.............++++@+@@@@+++++...........................+@@@@@++...............................................................................+++++..............++++++..............++++.+.......++++++@+++++...",
+"...........................+...+.+....................................................................++@@@++.................+++++++++++..............................+@@@@+++...................................................................................................+................................+++++++++....",
+".......................................................................................................+@+@++........................+.................................++@@@+.......................................................................................................................................+.+++.......",
+"........+.......................+................+++........................................................+++++....................................................+@@+++..................++@@++...........++@@@++...................................+........................+..............+++++...........................",
+"....+++@@+...................+++@@+...........+++@@@+..............+++++++................................++@@@@++...................................................+@@@@++................++@@@+++..........++@@@+++..............................+++@@+....................++@@++..........+++#@@@+..........................",
+"....++@@@+++................++@@@@+...........++@@@@++...........++@@+@+++.................................@@#@#++..............+.+.+.+...............+.+...........++@@@@+++..............+++@@#@++.........++@@#@@+++..........++++++++...........++@@@+++.................++@@@+++.........++@##@@++.........................",
+"....++@@#+++...............++@@@@@+...........++@@#@++..........+++@@@@@@@+...........+++.+.+............++@@@#@@++...........+++@+@+@+@++........+++@+@+++++.......++@@###@++............++@@#@@++.........++@@#####++.........++@@+++@@+@+........++@@#@+++...............+++@@#@++........++@+###@@+...........+.+.+.+.+.....",
+".....+@@@#@@+.............++@@##@@+..........++#####@@+........++@@$#$$$#@++........+++@@+++@@+..........++@#@@@@@...........+@@@@@@@@@@@@+.....+++@+@@@@@@+@+......++@@##@@+++.........++++@#@##+++.......+++@@#####@++.......+++##@@@@@@@++........+@@@@@@++.............++@@#@@++.........++##@@#@#++........+@+@@+++@@+++...",
+"....++@@#@#@++...........+++@###@++........+++@#####@@+........+@@@$$$$###++........+@@@@@+@@@+.........+++@#@#@@@..........+++@@@@@@@@@@@+....+++@@@@@@@@@@@++...++@@@@@@#@@@@+.......++@@@@##@@@@++.....++@@@#@@@#@@@@+.....++@@@@@@@#@@@@+.......++@@##@@@+............+++@@#@#+++.......+++####@##@++.......+@+@@@+@@@@@+...",
+"...++@@@@#@#++..........++@@@@@@@+.........++@@@@@@@@@+........+@@@@@@##@@++.......+@+@#@@@@@@++.......++@@@@##@@++.........++$#$$$$$$$$$$+...+@@@#$$$$$$$$##@+...++@@@#@#@#@@@@+....++@+@@@##@@@@@@......+@@@##@#@#@@@@+.....+@@@##@#@#@@@@++.....++@@@@##@@+@++.......+++@@###@@@++......++@@@@@@@#@@@++.....+@@@#@@@@#@@@@+..",
+"....+@@@@##@@+..........++@@#@#@@++........+@@@##@#@@@+........+@@#@##@#@@++.......++@@#@@@@@@+.........+@@#@#@#@+..........++$$$$$$$$$$$$@..++@@@$$#$$$$$$$@#+..++@@@@@#@@#@@@@++....+@@@#@###@@@@@@+...++@@@#@#@@##@@@++....+@@@#@#@@##@@@++......+@@@@##@@@@++.......+@+@@#@#@@@@+......+@@@##@@@#@@@@......++@@#@@@@#@@@@+..",
+"...+@@@#@@#@@++........++@@#@#@@@++........+@@@#@#@@@@++......++@#@#@##@@@+........+@@@###@@@@+........+@@@#@##@@++.........++@#$$$#@@@@##+..++$$$@@@@+@+@####+..++$$$$$$$$$$$$$@+...++$$$$$$$$$$$$$@+...+@$$$$$$$$$$$$$@+..+++$$$$$$$$$$$$$@++....+@@@@@###@@@@++.....++@@@@###@@@@++.....+@@@@#@#@##@@@++...++@@#@##@@##@@@+..",
+"...+@@#$$$$$@@+........+@@#$$$$$@@+........+@##$$$$$@@+.......++@##$$$$$@@++.......+@@#$$$$$@@++.......+@@#$$$$$@@+........++@@#$$$@#@@@##@..+@#$$#@@++@@@#@#@+..+@$$$$$$$$$$$$$@++.++@$$$$$$$$$$$$$@++.+++$$$$$$$$$$%$$@@+..++$$$$$$$$$$$$$@+.....+@##$$$$$$$@#@+.....+@##$$$$$$$@#@+.....+@##$$$$$$$#@@+.....+@##$$$$$$$#@@+..",
+"...+#@#$$%$$@@++......++#@#$$%$$@@++......++@@#$$$$%@@++......++@@#$$$%$@@+.......++@#@$$$$$@@+.......++#@#$$$$$@@++........+@@#$$$#@@@@#@+.++@$#$@@@+++@@#@#@+..++@@@##@@@@@$$$@++...+@@@##@@@@@$$$@++..++@@@##@@@@@$$$@+..+++@@@##@@@@@$$$@@....++@@@$$$$$$$#@@+....++@@@$$$$$$$#@@+....++#@@$$$$$$$##@+....++@@@$$$$$$$##@++.",
+"....+@@@#$$$#@++........+@@@#$$$#@++.......+@+@@#$$$@#++.......+@@@@#$$$#@@+.......++@@##$$$#@@+........+@@@#$$$#@++.......+++$$########@@+..+@$$$@@++.+++@@@@+..++@@###@@@@@$$$+@...++@@@##@@@@@$$#@+...++@@@##@@@@@$$#@++..++@@@##@@@@@$$#@++....++@@@@$$$@@@+++.....++@@@@$$$@@@@++......+@@@@$$$@++@++.....++@@@@$$$@++@++..",
+"...+++@##$$$@#++.......++++#@$$$@#++........++@#@$$$#@++........++@#@$$$@#++........++@@#$$$@#++.......+++@##$$$@#++.......++@#$###@##@#@@+.++@$$$@+++..+++++++..++@@@##@@@#@#@@@++...+@@@##@@@##@@@+++...+@@@##@@@##@@@++....+@@@##@@@##@@@+++......++@@$$$+@+++.......++++@$$$@++.+......+.++@@$$$@@+++........+++@$$$@@++....",
+"....+++@#$$$##++........+@@@#$$$#@@+........++@@#$$$##++........++@@#$$$#@@+.......+++@@#$$$#@@+........++@@#$$$#@@+.......++@$$@######@@++.++@$$$@@+....+++++....+@@###@@@##@@@+.....+@@@##@@@@#@#@++...++@@@##@@@##@@@++....+@@@##@@@@#@@@+.........++@$$$@+++.........+++@$$$@+++..........++@$$$+@+..........+++@$$$+@++....",
+".....@@$$@@@$$@++........+@$$@@@$$@++.......++@$$@@@$$@++........+@$$@@@$$@++.......+@@$$#@@$$@++.......++@$$@@@$$+++.....+@@@#####$$$$$@+..++@#$#@++......+......+@@@##@@@###@@++...++@@@##@@@##@@@+.....+@@@##@@@##@@@+.....+@@@##@@@##@@@++.......++++$$$@++...........+++$$$@@+..........++++$$$@+++..........+++$$$@++.....",
+"...+@@@$$@@@$$@@@++...++@@@$$@@@$$@@@++...++@@@$$@@@$$@@@++....+@@@$$@@@$$@@@++...++@@@$$@@@$$@@@++....+@@@$$@@@$$@@@++....@@@###@#$$$$$@++.+@@$$$@++.............+@@@$$###$$@@++.....+@@@$$###$$@@++.....+@@@$$###$$@+++.....+@@@$$###$$@++.........+.++$#$@+.............+@$$$@+............+++$$$@++............+@#$$@+......",
+".+++###$$###$$##@++...++###$$###$$#@#++...++###$$###$$##@++...++###$$###$$#@#++...++###$$###$$#@#++...++###$$###$$##@++..++@#@$$$$$@#@@@@++..@@#$$@+++++++++.+....+@@@$$@##$$@++++....+@@#$$@#@$$@++++....+@@@$$@#@$$@+++.....+@@@$$@#@$$@@+++........++@$$$+++...........+++$$$@++...........++@$$$+++...........++@$$$@++.....",
+"..++@@#$$###$$###++...++#@#$$###$$##@++...++@@#$$###$$###++...++@##$$###$$##@++..+.@@@#$$###$$##@++..+++@##$$###$$###++.+++#@#$$$$$#@#@@++..+++$$$@@@++++@@@@@....+@@@$$#@@$$@@@++....+@@@$$#@#$$@@@++....+@@@$$@#@$$@@@++....+@@@$$##@$$@@+++.........@+$$$@++...........++@$#$@++...........++@#$$@++...........++@$#$@++.....",
+".++@###$$###$$#@#@+..+++###$$###$$###@+..++@###$$###$$#@#@+..++@#@#$$###$$###@+..++@###$$###$$###@+...+@#@#$$###$$#@#@+..++###$$$$$##@#@@++..++$#$#@@@@@@@@@@@+...+@@@$$@##$$@@@@++...+@@@$$#@#$$@@@@++...+@@@$$##@$$@@@@++...+@@@$$@#@$$@@@+++......+++@$$$@++...........++@$$$@++...........++@$$$@++...........++@$$$@++.....",
+".++@$$$##@#@##$$$@+..++@$$$##@@@##$$$@+..++@$$$##@@#@#$$$@+..++@$$$###@@##$$$@+..++@$$$##@@@##$$$@+..++@$$$###@@@#$$$@+.+@@#$$@@##@#@@@@@#+.+++@#@$$#####$$$@@+..++@@@##@@@@@@@@@@+..++@@@##@@@@@@@@#@+..++@@@##@@@@@@@@#@+..++@@@##@@@@@@@@#@+......++@@#$$@@++........+++@@$$$@@++.........++@+$$$@@++.........++@+$$$@@++....",
+".+@@$$$##@#@##$$$@@..+@@$$$####@#@$$$@+..+@@$$$@##@###$$$@+..+@@$$$#@#@@#@$$$@+..+@+$$$@###@#@$$$@+.++@@$$$#@#####$$$@+.++@$$$@@####@@@@#@+..++@@@$$#####$$#@@+..+@@@@##@@@#@##@##+..++@@@##@@@#@#@@#@+..+@@@###@@@#@#@@#@+..+@@@@##@@@####@##+....++++@@$$$+@+++.......+++@@#$$+@+++......++++@@$$$+@+++......++++@@$$$+@+++...",
+"++@@$$$##@@@##$$$@@.++@@$$$##@@@##$$$@@.++@@$$$##@@@##$$$#@.++@@$$$##@#@##$$$@@.++@@$$$##@@@##$$$@@..+@@$$$##@@@##$$$#@.+@@$$$##$$$$$###$$@...+@@@$$#####$$$@++..++$$$$$#####$$$#@+.++@$$$$$#####$$$##+.+++$$$$$#####$$$##+.+++$$$$$#####$$$#@+.....@@@##$$$###@@+.....+@@@##$$$###@@+.....+@@@##$$$###@@+.....+@@@##$$$###@@+..",
+"++@@$$$##@@@##$$$#@..+@@$$$##@@@##$$$#@.++@@$$$##@@@##$$$@@..+@@$$$##@@@##$$$#@.++@#$$$##@@@##$$$#@.++@#$$$##@@@##$$$@@.+@#$$$@@$$$$$###$$+....++@@@$$$@@@@+++..++@$$$$$#####$$$##+..+@$$$$$#####$$$@#+..+@#$#$$#####$$$@#+..+@$$$$$#####$$$#@@...++@@###$$$##@@@+.....+@@###$$$##@@@+.....+@@###$$$##@@@+.....+@@###$$$##@@@+..",
+".+#@$$$##@@@##$$$@@.++#@$$$##@@@##$$$@@..+#@$$$##@@@##$$$#@.++#@$$$##@@@##$$$@@.++@@$$$##@@@##$$$@@.++@@$$$##@@@##$$$#@.+@@$$$##$$$$$###$$@......+@@####@++......++$#$$$#####$$$@@+..++$#$$$#####$$$#@+.+++$$$$$#####$$$#@+.+++$#$$$#####$#$#@+....+@@@##$$$###@@++....+@@@##$$$###@@++....+@@@##$$$###@@++....+@@@##$$$###@@++.",
+".+@@@@@@#@@+@@@@@@@..+@@@@@@@@@@@@@#@@@..+@@@#@@@@@+@@@@@@@.++@@@@@@@@@@@@@#@@@..+@@@@@@@@@@@@@#@@@..+@@@@@@@@@+@@@@@@@.+@@@@@@@@@@@#@#@@@+......+@@###@#++......++@@@@#@@@@@@@@@@+...+@@@@#@@#@@@@@@@+..++@@@#@#@#@@@@@@@+..++@@@#@@@@@@@@@@@+....+@@@@@#@#@@@@@+....++@@@@#@#@@@@@@+....++@@@@@#@@@@@@@+.....+@@@@@#@@@@@@@+..",
+"..+@@@@@@++@@@@@@@+...+@@@@@@@++@@@@@@+...+@@@@@@++@@@@@@++...+@@@@@@+++@@@@@@+..++@@@@@@@++@@@@@@+.+.+@@@@@@++@@@@@@++.++@@@@@@@@@@@#@@@@+.....++@##$$@++........+@@@#@@#@#@@@@@++..++@@@@@@@@@@@@@@++...+@@@@@@@@#@@@@@++...+@@@@#@#@@#@@@@++....++@@@@@@@@@@@+.......+@@@@@@@@@@@+.......+@@@@@@#@@@@+......++@@@@@@#@@@@+...",
+"...++@++++++++@++++....+++@++++++++++++....+++++++++++@++++....++@+++++++++++++....++@+++++++++++++....+++@+++++++@++++...+++++++@++++@++++......+@@$#$@++........+++++++++++@+++.+...+++@+@+@+@+@+++......+++@+@++++@+++.....+++++++++++++++........+++@+++@+++.........++++@+@+++++........+++@++++++++........+++@++++++++...",
+".............+.+.........+.......+++.........++++....+.++.......+.+++....+++........+.++.....+++.........+.......+.++.......++.+++++++.++.........++@++++............++++++++.+..........++.+++.++..........++++.+.+++..........+++++++++++............+.+++...............++.++++.............+.+++++.............+.+++++......",
+"..................................................................................................................................................+.+++.........................................................................................................................................................................",
+"........................++@@###@@@@@+.........+++......................++...............++++................+.+.+.........................................................................+++......................++...............++++.....................................+++++..............................................",
+".......................+++#@#@##@#@@+........++++++..................+++++............+++@+++.............++++++++++.....................................................................++++++..................+++++............+++@+++...................................+++#@++.............................................",
+".......................+@@#####$$@@@+........+@@@@@+................+++#@++...........++#@#@@+...........+@@@##@@@@@.....................................................................+@@@@@+................+++#@++...........++#@#@@+.................................++@@##+++...............................++++++.......",
+"....++++++++++........+@@@@####$$@@@++.......+@##@@++..............++@@##+++.........++@###@@++.........++@@###@@@@@+........++++++++....................................................+@##@@++..............++@@##+++........+++@###@@++..........+++.++++.............++@@@##@++........+++++..................++@@@++......",
+".++++@@@@+@+++++.....++@@@#####$$@@@++......++@@#@#++.............++@@@#@@+.........+++@####@++.........+@@@#@##@#@@+........++++++@+++.................................................+@@@@#@@++............++@@@@#@++.........+@@####@+++.........++++++@++++........++++#@#@@+++.....++++++++++..............++@@@@@++++....",
+"..@@#@#@#####@@+++...++@###@@@@#@###@@+.....++@+###@@.............++#@#@@@+.........++@#@@@##@@+.......++@#####$$@@++.......++#@@@+@#@@+...................................+.+++........++@@###@++...........+++@##@@@++.......+++@#@@@##@@++......+++##+@+@#@@+.......++++@###@@@@++....++@####@@@+............+++#@$$$##++....",
+".+@@##########@@@++..+@#####@@@@####@@+......++@##@@@++..........+++###@@+++........+@@#@#@#@@@+......++@@@####$$@@++.......++##@@@#@@@++........+.........+............++++++++.......+++@@#@#@@++++......++++@###@@@+++......++@##@#@#@@@@+......++@##@@@#@@@@++...++++@@@###@@@++++...++#####@@@++...........++@##$$$##+++...",
+"+.@@$$$@#@@@#@$$$@+.+++$$$$$@@@@@$$$@@+.....+++@@##@@+++.........+@@###@@@++.......+++##@@@##@@@.......+@@#####$$@@++......++@@#@@@##@@@........@@@++...+.@@++.......++++@+@@@@@+....+++@@@@###@@@++++....+++@@@###@@@@+++....++@@@#@@@##@@@++...+++@+##@@@##@@@++..+@@@#@##@@@#####@@+...@@@#$$#@@@+++.........+@@$$@@@$$@@@...",
+".+@@$$$##@#@##$#$@+..++$#$$$@@@#@$$$@@+....++@@@#####@@++......+++@@#####+@++......++@@######@@+++....+++@@@####@@@@++.....++@#@#####@@@++....++@@@+++.+++@@@+.....+++@@#####$#$++....+#@#@#@@@@####@@+..++#####@@@#@###@@+..++@####@@@#@###@@+...+@####@@@@@###@@+.+@@#####@@@#####@@...++#@#$$@#@@@+++.......+@@@$$@@@$$@@@...",
+".++@$$$@##@#@#$$$@@.++@$$$$$@@@#@$$$@@+...+++@@#####@@@+++....++@@@@#####@@+++....+++@@@#####@@@++....+@@@#@#####@@+++...++++@@@#####@@@++.....+@@@@+++++@@@@++...++@@@@#####$$#@+..+++#####@@@@####@@...++#####@@@@####@@...+@#####@@@@####@@+.++@#####+@@#####@@+.+@@$$$@#@@@##$$$@@+.+.+#@#$$#@#@@@++++....+.@@@#$@@@$$@@@+..",
+".++@###@@@@@@@###@@..+@@#######@@$$$@++...+@#@$$@@@##$$$@+....+@@#$$#@@#@$$$@+...++@####@#@#@$$$@+...++@@####@@#@$$$@+....+@#####@@#@$$$@++...++$$$##@@@@#$$#++...+@@@$$@@@#$$$$@++..++$$$#@@+@@@$$$@@+..+@#$##@+@@@@$$$@@+.+++$$$@#+@@@@$$$@@+..++$#$#@@++@@$$$@@+.+@@$$$##@@@@#$$$@@+..++@@@$$$$$$$###+++....++@@##@@@$$@@@+..",
+"++++####@@@@+@####@..+@########@@$$$@@+.+++@##$$##@#@$$$@++.+++#@@$$@#@##$$$@++..+@@#####@@##$$$@++..+@##@##@#@##$$$@++.+++#@###@#@##$$$+++...++#$##@@@@###$$+..+++##@$$###$$$$$@++.+++$$##@@+@@@$$$@@+..+@$$$##++@@@$$$@@+..++$$$##++@@@$$$@@+..++$$$@#@@+@@$$$@@+.+@@%$$#@@@@##$$$@@+...+@@@$$$$$$$###@@+....+@@@###@@$$@@@+..",
+".+@@$$$$$@@@@@@@@##..+@###@@$$$@@$$#@@+..+@#@@$$@@@#@$$$@@+..+@@##$$#@@#@$#$@@+..+@@####@#@#@$#$@@+..++@####@@@#@$#$@@+..+@@#####@@@@$$$@@+...++@@@$$###$$@@@+...++@##$$@@@$$$$$@@+..++$$$##+@+@@$$$@@+..+@#$$#@@++@@$$$@@+.++@#$$@@@@+@@$$$@@+.++@$$$#@++@@@$$$@@+..++####@@@@@####+++...+@@@##@@@@@@#@#@+....+@@###$$$$$@@@+..",
+"++@@$$$$$#@@+@#@##@.+++###@##$$@@$$$@++.++@$$$@@@@@@@###@@+..+@$$$@@@@+@@###@@+.++@$$$@@@@+@@###@@+.++@$$$@@@@@@@###@@+.++@$$$@@@@@@@###@@+....++@@$$###$$@@+++.++@$$$@@@#@#@###@@+.++@@##@@++++@#$$@@+..+@###@@@+++@$#$@++..+@###@@++++@$$$@++..++###@@@++@@$$$@++.+++@#@##@@@#@##@@+...++@@@##@@+@@#@###+...++@@@##$$$$$#@@++.",
+"++@@$$$$$@@@@+@@@##..++####@$$$@@$$$@++..+@$$$@@++++@@##@#+.+@+$$$@@++++@###@#+.++@$$$@@++++@###@#+.++@$$$#@++++@###@#+.++@$$$@@++++@@##@#+....+++@$$###$$@++....@+$$$@#@@@######@+..+@###@@@+++@$$$@++.+++###@@+++@+$$$@@+.+++###@@++++@#$$@@+.++@@##@@+++++$$$@@+..++@@@$$@@@$$@@@++....+@@###@@@+@##@#@+....+@@@##$$$$$@@@++.",
+".+@@$$$@#@@@+@#@##@.++@###@@###@@$#$@++.++@$$#@++..++@#@##@.+@+$$$@+++.+@@#@#@+..@+$$$@++..+@@#@##@.++@$$$@+++.+@@#@#@+.+@@$$$@++.+++@#@##@.....+@+#@$$$@@@@++..+@@#$$@@@##@@@#@@#+.+++###@@+++++$#$@++.++@###@@++++@#$$@@+.+++###@@++++@$#$@++.+++###@@+++@+$$#@@+...+++@$$@#@$$@@++....++@@@##@@@@@#@###+....+@@@##@@@@@$$$@+.",
+"++@@$$$#@@@@++@@@##..++####@###@@$$$@++.+@@$$$@+++.+@@@##@+.+@@$#$@++..++@@###+.+@@#$$@+++.++@@#@#+.++@$#$@++..++@@###+.++@$$#@++..+@@@#@#+....++@@@#$$$##+++...++@$$$@@###@@@#@##+.++@@##@@++++@$$#@++..++###@@++++@$$$@++..++###@@++++@$$$@++..++###@@++.+@$$$@++...++@@#$@#@$$+++......+@@@##@+@@@@#@#@+....+@@@##@@@##$$$@+.",
+".+++###@@@++@@@###@.++@###@#@@###$$#@@+.++@$$$@@++++@@#@#@@..+@$$$@@+++++####@@..+@$$$@@++++@@###@+.++@$$$@@+++++####@@.++@$$$@@++++@@###@+....++@@$$###$$@@@+..++@$$$##@@@@@####@@..+@###@@+++++$$$@@..++@###@@++++@#$#@@..++@###@@++++@#$$@@+.++@###@@++@++$#$@+.....+++##$$$@@@++......+@@@$$#####$$$@@+....+@@@##@@@@@$$#@+.",
+".+@@###@@@+++@@#@#@..++###@@#@@##$$$@++..+@#$$@+++++@####@+.++@$$$@@+++@+#@#@@+.++@$$#@@++++@##@##+.++@$$$@++++@+#@#@@+.++@$$$@@++++@##@##+....+@@@$$#@#$$@@@+..++@$$$###@#@@###@@+..++###@@++@@+$$$@+...++###@@++@+@$$$@+...++###@@++@+@$$#@++..++###@@+++@@$$$@++.....++@#$$%#@@+.......+@@@$$###@#$$$@@+....+@@@##@+@+@$$$@+.",
+"..++####@@@@@@@#@#@.++@###@@@#@##$$$@++.++@$$$@@@+++@#@#@#+.++@#$$@@@+@+@#####+.+++$$$@@@++@+###@@+.+++$$$@@@+@+@#####+.++@#$$@@@++@@@##@@+...++@@@$$@#@$$@@@++.++@#$$##@@@@@@####+.+++###@@@@+@@$#$+@+..++###@@@@+@@$$$+@+..++###@@@@+@+$$$@@...++###@@@@+@+$$#@@......++@@$$$@@++......++@@@$$#####$$$@@+...++@@@##@@@@@#$$@@.",
+".+@@$$$@@@@+@@$$$@@.+++$$$#@@@@##$$$@++.+++@####@@@@@$$$@@+..+@###@#@@@@@$$$@++.+++@##@#@@@@@$$$@@+.+++@####@@@@@$$$@++.+++##@##@@@@@$$$@@+...+@$$$@#@@@@#$$$+..++@###$$@#@@#$$$@++..++@@###@@@@@$$$+++..++@@##@@@@@@$#$@+...++@@###@@@@@$$#@+...++@@###@@@@@$$$++......++@@$$$@@++......++@#@$$@#@#@@@@+++...+@@#@##@@@@#$$#@+.",
+".++@#$$#@@@@#@$$$@+.++@$$$@#@@@##$$$@@+..++#@#@#@@@@@$$$@++..++@####@@@@@$$$+@+..++#@###@@@@@$$$@++..++#@#@#@@@@@$$#@@+..++@####@@@@@$$$@++...++$#$@@++@@@$#$++..++###$$@@@@@$$$+@+...@@#@#@@@@@@$$#@+...++@#@##@@@@@$$#+++..++@#@@#@@@@@$$$+++...@@@@#@@@@@@$#$@++....++@@@$$$@@@++.....+@@@#$$###@@@+++.....++@@#####@#@$$$@@.",
+".+@#$$$$$$$$$$@@@++..+@#$$$$@@@@@$$$@++..+++@@##$$$$$@@@++...++@@@##$$$$$@@@+++..++@@@##$$$$$@@@@+...+++@@##$$$$$@@@+++..+++@@@#$$$$$@@@@+....++@@@+++++++@@++...++@####$$$$$@@@++....++@@$$$$$$$@#@@+....++@@$$$$$$$#@#++....++@@$$$$$$$@@#++....+@@@$$$$$$$#@@@......+@@$$$$$$$@++.....+@$$$$$@@#@+++.......@@$$$$$@#@$$$$#@+.",
+"++@@$$$$$$$$$$#@@++.++@$$$$$@@@#@$#$@+.....@+@@#$$$$$@@@++.....++@@#$$$$$#@@+......++@@#$$$$$@@@++.....@+@@#$$$$$@@@+.....+++@##$$$$$#@@++......+@++++..++++@.+.++@@@###$$$$$#@@++.....++@$$$$$$$#@@++....+++@#$$$$$$@#@++....+++@$$$$$$$#@@++.....++@$$$$$$$@#@++.....++@#$$$$$$@@++...++@$$$$$#@@+++.......+++$$$$$#@@$$$$$++.",
+".+@@$$$$$$$$$$@@@+...++$$$$$+++@@$$$++.....++@@#$$$$$@@@.......++@@#$$$#$@@@+......++@@#$$$$$@@+.+.....++@@#$$$$$@@@+.....++++@#$$$#$@@@+.......++++....+++++.....+#@###$$$$#@@@+......+++#$$#$$$@#@+......++@$#$$$$$@@@+......+++#$$$$$$@#@+......+++#$$$$$$@@@++....++@@$$$#$$$@@+....+++$$$$$@#@++.........+@$$#$$@@@$$##$++.",
+".+@+++++++@+@+@++....+++++++@+++@+++++......+++++++++++.+.......++++++@+@++++.......++++++++++++........+++++++++++.........++++++@@++++.........................++@@@+@@+@+@@++.......+.@+++@@+@+++........+++@+@++@@++.......+++++++++@+++........+@+++@+@+@@+.......+++++@@++++++......+++++@++++.........+.+++@++@@@+@@+++..",
+"..++++@+++++++++.+....+++++++.+.++++.........++++++@+.+..........+.++++++++...........+++++++............++++++++++..........++++++++++...........................+@@@+++++++++.+........+++++++++++.........+++++++++++........+++++@++++++.........+++++++++...........++++++++.........++++++++.............+++++++.++++++...",
+".....+.++++.+...........++........+............+++................+.+.+.................++++................++++................+..+...............................+.++++.+................++.+.+................++.................+.+.+................+.+...............+..++.............+.+..................++............",
+"................................................................................................................................................................................................................................................................................................................................",
+"................................................................................................................................................................................................................................................................................................................................",
+"................................................................................................................................................................................................................................................................................................................................",
+".......+..........................................+........................................................+++++.......................................................+.........................+................+....................................+.........................+...............+..............................",
+".....++@@+...................+++@@..............+@+@+...............++.+...................................+@@@@+....................................................++@@+.....................+@@++.............@@@+................................++@@+.....................+@@++...........+@+@+............................",
+"....+++@@+++................++@+@@+...........+++@@@+............++++++++++...............................+@@@#@++..................................................+++@@+++.................+++@@+++..........++@@@++..............................+++@@+++.................+++@@+++........+++@@@+............................",
+".....++@@@++...............+++@@@@+...........++@@@@++...........++@@@@@@++............+.+..+.............+@@#@#++...................................................++@@@++.................++@@@@+..........+++@@@+++.............+...+............++@@@++.................+++@@@+.........++@@@@++.............+.+..+........",
+"....++@@@@@@+..............++#@#@@+..........++@####@@+........++@@$$#$##@@+........+++@@+++@@+...........+@@@@@@@..................................................+++@#@@@+...............+@@@#@++..........+@@####@++........++@@@+++@@++........+++@#@@@+..............++@@@#@++........++@####@@..........+++@@+++@@.......",
+".....++##@#@++............++@###@++..........+@#####@@+.........@@@$$$$$##+++.......++@@@+@+@@+..........++@#@@@@@+..................................................+@@#@#@++.............++@@@#@@+.........++@@###@#++........+++@@+++@@+++........++#@#@@++.............++@@@#@++........+@#####@@+.........++@@@@++@@+......",
+".....++@@#@#++...........++@@@@@@++........+++@@@@@@@@++......++@@@@@##@@@++.......+++@@@@@@@@++.........+@@@##@@+.........++++++.++++++...........++++++++++........++@@#@#@++..........+++@@##@@++.........++@#@@#@@@++.......+@+@@@@@@@@++........++@@#@@++............++@@##@+++.......++@@@@@@@@+........+++@@@@@@@@+......",
+"....+++@@##@@++.........+++@@@#@@+++........++@##@@@#@++.......+@@#@@@##@@@+.......++@@#@@@@@@+........++++#@#@#@+++.......+++@++@++++@+++.......++++@@@@+@+++......+++@@##@@@++.........++@@##@@@@++.......++@#@#@@#@@@++.....+++@#@@@@@@@@++......+++@@@##++...........++@@#@@@++.......+++@@##@@@@+.........++@@@@@@@@++.....",
+"...++@@@@@##@+++.......++@@@#@#@@@+........+@@@@@@#@#@@+......++@@#@####@@++.......+@+@@#@@@@@@+.......++@+@###@@++......++@@@@@@@@@@@@@++.....+++@@@@@@@@@@+++...+.+@@@@###@@@+++.....++++@@@##@@@+++.....+++@@#@@@#@@@++.....+@@@@#@@@#@@@++.......++@@#@@@+...........++@@##@@+.........++@@@@#@@@+........++@@@#@@@@@.......",
+"...+@@@$$$$$##++.......+@@@$$$$$##++.......+@@#$$$$$##+++.....++#@#$$$$$##@++.....++@@#$$$$$##+++......+@@#$$$$$##@+.....++$$$$$@##$$$$$@@+...++@@@#$$$$$$$$$@+....+@@@$$$$$$$@@@+....++@#@$$$$$$$@@@+....++@#@$$$$$$$@#@++...++@@@$$$$$$$@#@++.....+@@$$$$$++..........++@$$$$$@++........@@@$$$$$@++.........+@@$$$$$@++......",
+"...+@##$$$$$##@++......+@##$$$$$##@++.....++@##$$$$$##@++.....++@#@$$$$$##@++......+#@#$$$$$##@++......+@#@$$$$$##+@.....++$$$$$####$$$$#@+...+@@##$$$$$$$$$$@+..+++@#@$$$$$$$#@@@+...++@@#$$$$$$$##@@+...++@@#$$$$$$$#@#++...+@@##$$$$$$$@#@@+.....+@@$$$$$@++.........+@@#$$$$@++........+@@$$$$$@++........++@@$$$$$@++......",
+"..++@@@@@@@@$$@@@.....+@@@@@@@@@$$@@@.....++@@@@@@@@$$@@++....++@@#@@@@@$$@@@.....++@@@#@#@@$$@@++....+@@@#@@@@@$$@@@+..+++@@@@@$$$@@@@@$$@...+@$$$@@@+@@@$$$@@...+@$$$@@@@@#@$$$@+...+@$$$@@@@@@@$$$@+..++@$$$##@@@@#$$$@+...+@$$$@#@@@##$$$@+......++@@$$$@+...........++@@$$$@+........+.+@@@$$$@+...........++@@$$$@++......",
+"..++@##@#@@@$$@@@......+@##@#@@@$#@@@.....++@##@#@@@$$@@@.....++@@@@#@@@$$@@@.....++@#@@@@@@$$@@@......+@@#@#@@@$$@@+....+@@####$$$@#@@@$$@..+++$$$@@++@@@$$$+@..+++$$$##@@@#@$$$@+..++@$$$#@@@@#@$$#@+...+@$$$@#@@@#@$$$++..++@$$$@#@@@@#$$#@+......+++@$$$@++..........+++@$$#@++..........+@@$$$@++..........++@@$$$++.......",
+"..+@@@#@@@@@$$@@@+....+@@@@@@@@@$$@@@+....+@@@#@@@@@$$@@@+....++@@#@@@@@$$@@@+....+@@@#@@#@@$$@@@+....+@@@#@@@@@$$@@@+..++@@@@@@$$$@@@@@$$@..+@@$#$@@+++@@@#@++..++@$$$#@@@@##$$$@@..++@$$$@#@@@#@$$$@@..+++$$$@#@@@@#$$$@@..+++$$$##@@@#@$$$@@.......+@+$$$++............+@+$$$@+...........+++$$#@+............+++$$$@++......",
+"..++@#@$$$$$$$@@@+....++###$$$$$$$@@@+....++@#@$$$$$$$@@@+....+@@#@$$$$$$$@@@+....++#@#$$$$$$$@@@+....++#@#$$$$$$$@@@+..++@###$$$$$#####$$+..++@$$$@+@++++@@@++..++@$$$#####@#$$$++..++@$$$#######$$$@+..+@@$$$#######$$$@+..+@@$$$#######$$$@+.......++@$$$@++...........++@$$$@++..........++@$$$@++...........+@+$$$@++......",
+".++@@##$$$$$$$@@@+....+@@@#$$$$$%$@@@+....+@@##$$$$$$$@@@+....++@##$$$$$$$@@@+....+@#@#$$$$$%$@@@+...++@#@#$$$$$$$@@@++.+@@###$$$$$#####$$@..++@$$$@@++++@@@@++..++@$$$##@####$$$@@..++@$$$#######$$$@@...+@$$$#######$$$@@..++@$$$@######$$$@+.......++@#$$@++...........+++$#$@++..........+@+$$$@++...........++@$#$@++......",
+".++@$$$@@@@@##@@@+...++@$$$@@@@@##@@@+...++@$$$@#@@@###@@+...++@$$$@@@@@##@@@+...++@$$$@@@@@##@@@+....+@$$$@@@@@###@@+..+@####@@$$$##@#@#@@...+@$$$@@@++@+@@+@+..++@$$$###@@#@#@#@+..+@@$$$##@#@@##@#++..++@$$$##@#@@@##@@+..++@$$$##@@@#@##@@+.......++@$$$@++...........+@@$$$+++..........++@$$#@++...........++@$$$+++......",
+".++@$$$#@@@@##@@@++..++@$$$@#@@@##@@@++..++@$$$@@@@@##@@@++..++@$$$@#@@@##@@@++...+@$$$@@@@@###@@++..++@$$$@#@@@##@@@+..+##@##@@$$$####@##+...++###$$#####$$$@@..++@$$$##@##@###@@@..++@$$$##@###@##@@@...@@$$$@##@##@#@#@+..++@$$$#####@##@#@@......++@+$$$@+++.........+++@$$$@@++.......+++@+$$$@@++........++++@$$$@@++.....",
+".++@$$$@@@@@###@@++..++@$$$@@@@@###@@++..++@$$$@@@@@##@@@++..++@$$$@@@@@###@@++..++@$$$@#@@@##@@@++..++@$$$@@@@@##@@@@..+@####@@$$$#@@##@#+...++@@#$$@#@##$#$#@..++@$$$###@##@##@@+..++@$$$###@@#@##@@+...+@$$%##@###@##@@+..++@$$$##@#@#@##@@+....++++@@$$$@@+++......+++@+@$$$@@+++......+++@@$$$@+@++.......++@@+$$$@@+++....",
+".+++$$$#####$$###@+..++@$$$#####$$###@+...@+$$$#####%$###@+..++@$$$#####$$###@+...@+$$$#####$$###@+...@+$$$#####$$###@+.+#@$$$$$$$$$$###$$+....+@+@@#$$$@#@#@++...+@###$$#####$$$@+...+@###$$#####$$$@+..+++###$$#@#$$$$$@+...++###$$#####$$$@+.....@@@#@$$$#@#@@+......@@@#@$$$##@@@+....+@@@#@$$$##@@@+.....+@@@@#$$$##@@@+...",
+".++@$$$#####$$###++..++@$$$#####$$###++...+@$$$#####$$###++..++@$$$#####%$###++..++@$$$#####$$###++...+@$$$#####%$###++.+@##$$$$$$$$$#@#$$+......++@@$$$#@#@@+....++@##$$##@##$$$@+...++###$$#####$$$@+...++@@#$$###$$$$$@+..+++###$$#####$$$@+...++@@###$$$##@@@+....++@@###$$$@##@@+....+@@###$$$##@@@+.....+@@###$$$@##@@+...",
+"..++@@@#@####@#@@++...++@@@#@###@@#@@++..+++@@@#@##@#@#@@@+...++@@@#@##@@@#@@@+...++@@@@#@###@#@@@+..+++@@@#@##@@@#@@@+.+@@#@#@#@@@@#@#@@++......++@@###@#@+++.....+@+@@@@@##@@@@++....+++@@@@#@#@@@@++....++@@@@#@@#@@@+++....+++@@@@@@#@@@@++....+@@@@#@#@#@#@@++....+@@@#@#@#@#@@@++...+@@@@#@#@@#@@@++....+@@@#@#@#@#@@@++..",
+"..++@@@#@#@@@@#@#++...++@@@@#@@#@@#@@++...++@@@#@@#@@@#@@++....+@@@#@#@#@@@#@++...++@@@#@#@@@@#@@++...++@@@#@#@#@@#@@++..++@@#@#@@@@#@#@@++......+++@####@+++.......+++@##@@#@@+++.....+++@@#@@#@#@+++.....++++@@#@@#@@@++......+++@###@#@@+++......@@@#@#@#@@@@@.......@@@#@#@#@#@@@......@@@#@###@#@@@.......@@@@##@#@#@@@....",
+"...+@@@@@@@#@@@@@+.....+@@@@@@#@@@@@@+.....+@@@@#@@@@@@@@+....++@@@@@@#@@@@@@+.....+@@@@@@#@@@@@@+.....+@@@@@@#@@@@@@+...+@@@@@@@+@@@@@@++........+@@$$$@@+..........++@@@@@@@@++........++@@#@@@@+@+........++@@@#@@@+++......+.++@@@@@@@+@+......++@@@#@@@#@@@@+......++@@#@#@@@@@@+....++@@@@@@@@@@@@+......+@@@@@#@@@@@@+...",
+"....+++@+@++@+@+.+......+++@+++@+++@++......+++++@+@+++++.......+++@++++@++++.......+++@++++@++++.......++++@++++++++.....+++@++++++++++.........++@@$$$@++............+++@+@++++.........++++@+++++..........++++++@+++...........++++@++++.........++++@@++@++........+++++++@++++........++@+@+@+@++.........++@+++@++++.....",
+"......+.+.++.+..+........+.++++.+++...........+++.++++++..........+.++++++............+.++++.++...........++.+++++++........+.+....++++...........+@++++++..............+++.+..............+.+.+++...............++++................+++++.............++..+++.............+++++++.............+++.++..............++++++.......",
+"...................................................................................................................................................++++++.......................................................................................................................................................................",
+"................................................................................................................................................................................................................................................................................................................................",
+".......+.+......................................................................................................................................................................................................................................................................................................................",
+"...+++++++++@++..............+.+........................................................+++++................+.+...................................................................................................++................+.+.................................................++@@++++...............................",
+"..+++@@@@@@@+@+++..........++++++++...........+++++...................+++++............++@@+++..............++++++++......................................................................+++++..................++++++............++++++.....................................+++++......++$$$#@++..............................",
+".+@@$#$$$@##$$@@@+......+++@@@@@@@++........+++#@+++.................++@#$++.........++@@$$$@@...........+++@#@#@@@@+...................................................................+++#@+++................+@@@@@+...........+@@#@#++...................................++@#$+++...++@$$$##++..............................",
+".+@@$$$$$##@$$#@@+.......+@@#@#@@@+++.......++@@#@@++...............+++@$#@++.........++@$$$@@++..........+@@##@@@@@@+...............................+..................................++@##@@++...............+@@@##++.........+.@@###+++.................................+++@$#@++....+@$$$##@++.............................",
+".+@@$$$$$###$$@#@+.....+++@@#@#@##+++.......++@##@++++.............++@@@$#@+.........++@@$$#@@++........+++@@###@@@@++.......++++++++++............++++++...............................++@@#@+@++...........++++@@#@@++........+++@@###@+++........+++++++++++...........+++@@@$$+++....++@@@##@@+++............+++++++++++....",
+"++@@@@@##$$$##@@+++...++@#@##$$$#@@+.........++@@###++............+++@##@@+++.......++@##@@@##@++.......++@@####$$@+@.......++@#@@+@@@+@+..........+@@#@+................++++++++......+++@@@##@++++.........++@@###@@@++......++@@##@@@@#++.......++@@@@+@+$$+++........++++#@#@@@@++...++@@@##@++++++........++++$$@++#@@@@+..",
+".+@@#@###$$$##@@++....++@#@##$$$##++.........++@@###@++...........+@@###@@++........++@##@@@##@++.......++@#####$$@@+......++@+#@@@@##@@+.........+@@@#@@+............++++++@++++++..+++@+@@@###@++++....++++++@@###@@++++...+++@@@#######+@+....++@@@@##+@@#$@+++....+++++@+###@@@@+++..++@#@#######@+@......+++@+$#@@@@#@@@++.",
+".+@@###@@@@@$$@#@++..+@@###@@##@#@@++.......++@#@####@++.........++@#@####@++.......@+@@#####@@++.......+@+#@####@@+++......+@@@##@#@@@+++........+@@$$$++...........++@#@##@@##@@@...@@@##@@@@@##@@@+....@@#@#@@+@@@##@@+....@@@@#@@@@@##@@@+....@@#@#@@@@@##@@@+...+@@#@#@@@@@#@#@#@@..++@@@##@#@#@@@@.+....@@#@##@@+@#@#@#@@.",
+".++@###@@@@@$$##@@...+@@###@@####@@++.......++@@##@#@#@++......+++@@###@#@@++.....+++@@######@@+++.....+++@#@#@##@@++.....+++@@#@#####@++........++@@$$$@++........+++@@##@###@##@@..+@@##@@@@+@@##@@++..+@@##@@@@+@##@@@++..+@@###@@@@@@##@@@...+@@###@@+@+###@@++..+@@###@@@+@@@##@@@...+@@@###@###@@@++..++@@##@#@@@+#@###@@.",
+"..@+###@#@@@$$#@#++.++@@###@@##@##@@++....+++@@#@####@@@++.....++@@#@###@#@@++.....+@@@#@#@###@@++.....++@@#######@@@+.....+@@@######@@@+++.....+++@@$$$+++........++@@@####@##@#@@.++@@###@@+@@##@#@++.++@@###@@+@@@###@++.++@@#@#@@+@@####@++..+@@@#@@@@@@##@#@++..+@@@###@+@@#@###@@...+@@@$$#####$$$@++..+@@###@#+@@@####@@.",
+"..++#@#$$$$$$$$$$@+..+@@$$$$$###$##@@+....++@##$$#@#$$###++...++@##$$@##$$##@++...++@##$$##@$$##@++...++#@#$$@#@$$##@@...+++@##$$@#@$$###++.....++@@@@@@@++++.....++#@#$$@##$$###@+..+@@$$$@@+@+#####++..+@@$$$@@@+@#####++..+@@$$$@@@+@@####++..+@@$$$@@+++#####++..+@@$$$@#@+@@#$$$@@...+@@#$$#####$$$@@+..+@@$$$@#+@@@@$$$@@.",
+".++@@##$$$$$$$$$$@+..+@@$$$$$@#@$$##@++...+@###$$@#@$$###++...+@###$$#@@$$###++...+@###$$#@#$$###@+...++###$$@#@$$###++...+@####$###$$###++...+++@@@@@@@@@@+++....++###$$@#@$$###@+..+@@$$$@@++@@####@+...@@$$$@@++@@####@+..+@@$$$@@@+@#####@+.++@@$$$@@@@@@####@+.++@@$$$#@+@@#@$$$@@...+@@@$%###@#$$$@@+...@@$$$#@@@@#@$$$@@.",
+".++@@@#$$$$$$$$$$@+..+@@$$$#$###$$@##++..+++###$$@#@$$###++..+++###$###@$$###@+..+++####$@#@$$###++..+++###$$#@#$$###@+...++###$$@@#$####++...++@@@@@@@@@+@@++...+++###$$#@#$$###@+..+@@$#$@@@+@@####++.++@@#$$@@@+@@####++..+@@$$$@@+++@####++..+@@$$$@@++@@####++..+@@$$$##@@+#@$$$@@...+@@@$$@@@@@####@+..+@@#$$@#@+@#@$$#@@.",
+"..+@$$$@#@@@@@$$$@+..+++####@@@@@@###++...+@$$$@@@@@@@$$$@+...+@$$$@@@@@@@$$$@+...+@$$$@@@@@@@$$$@+..++@$$$@@@@+@@$$$@+..++@$$$@@@@@@@$$$@+..+@@$$$$$$$$$$$$$++..++@$$$@@@#@##$$$@+..++@###@@++@@@###@+...+@###@@++@@@###@+..+++###@@+@@@@###@+..++@###@@@+@@@###@+...+@@@@##@@@##@#@++...+@@@$#@@@@@####@@...+@@@###@@@##@#@@+.",
+".++@$$$@@@@@@@$$$@+..++@####@@+@@@###++..++@$$$@@@+@@@$#$@@..++@$$$@@+++@@$#$@+..++@$$$@@@++@@$$$@@..++@$$$@@+@+@@$#$@+..++@$$$@@@+@@@$$$@@..+@@$$$$$$$$$$$$$++..++@$$$@@#@###$$$@+...+@###@@@+@@@###++..++@###@@@++@@##@@+..++@###@@+++@@##@@+..++@###@@++@@@###++...++@#@##@@@###@#++...+@@@##@@++@@@@##+...++#@@##@@@###@@++.",
+"..@@$$$@@@+@+@$#$@+...++###@@+@@@@###@+...@@#$$@+++++@$$$@@...@@#$$@+@+@+@$$$@@..+@@#$$@++@++@$#$@+..++@$#$@+@+@+@$$$@@..+@@#$$@+++++@$#$@+...++@+@@@@@@@@+@@+...+@@$$$#@###@@$$$@@..++@###@@+@+@@###@+...++###@@++@@@###@+..+++###@@@+@@@###@+...++###@@@++@@###@+...++@@@$$@@@$$@@++....+@@@$$@#@@@$$$@@+....+@@@$$@@@$$@@@+..",
+".++@$$$@+@+@+@$$$@+..++@###@@@+@@@###++..++@$$$@@++@@@$$#@+..++@$$#@@++@+@$$#@+..++@$$$@@++@+@$$$@+..++@$$$@+++@+@$$#@+..++@$$$@@+@+@@$$$@+...+.+++@@@@@@+++++...++@#$$@####@@$#$@+...++###@@@+@@@##@@+...+@###@@@+@@@###++..+++###@@@++@@###++...+@###@@+@+@@##@@+....+++@$$@@@$$@@+.....+@@@$$#@#@@$$$@@+....+++@$$@#@$$@@+...",
+"..@+$#$@@@+@@@$$$@@.+.++####@++@@@###@+..++@$#$@@@+@++$$$@@...@+$$$@+@@+@@$$$@@..++@$$#@@@+@@@$$#@@..++@#$$@@@+@@+$$$@@..++@$#$@+@+@+@$$#@@....+++@+@@@+@++.......@@$$$@@###@@$$$@+...+@####@+@@#@###@+..+++####@+@@@@###@+...++###@@@@@@@###@+..+++###@@@@@@@###@+.....++@@#$$$#@@++.....+@@@$$$$$$$#@#++......++@##$$$##+++...",
+"..+@$$$@#@@@@##$#@+..+@@###@@@@@@@###@+..++@$$$@@@@@#@$$#@+..++@$$$#@@@@@##$$++..++@#$$@#@@@@@$$$++..++@$$##@@@@@#$$#@+..++@$$$#@@@@@##$$++......++@@$$$+++.......+@$$$$$@@@##$$#@+...++###@#@@@@####@+...++####@@@@#@###@+..+++####@@@@#@###@+...++####@@@@#@###@+.....++@@@$$$@@++.....++@@@##@@@@@+@++........++@#$$$#@@+....",
+".++@#$$#@@@@##$$$@+..++@###@@@@@#@###@+...+@#$$##@@@##$$$++...++$#$##@@@##$$$++...+@$$$#@@@@##$$$@+..+++$$$##@@@#@$$$++...++$#$##@@@##$$$@+.......+@@$$$@+.......+@+$$$$$@@@#@$$$++...++####@@@@#@###@+...+@@##@#@@@#####@+....@@####@@@#####@+...++@####@@@#####@+......+@@#$$$@@+......+@@@@##@@@@++++.+......++@@@$$$@@+.....",
+"..++@@@$$$$$$$@@@@..++@#$$$$$@@@$$$$$#@...++@@@$$$$$$$@@@++..+++@@@$$$$$$$@@@++...++@@@$$$$$$$@@@++...++@@@$$$$$$$@@@++...++@@@$$$$$$$@@@++......++@@@#@++........+@###$$$$$$$@@@++....++@@$$$$$$$$$$@@....+@@@$$$$$$$$$$#@....+@@@$$$$$$$$$$#@...++@@@$$$$$$$$$$@@.....+++#@###@++......++###$$##@@++.........+++@@####@++.....",
+"..++@#@$$$$$$$#@@++.++@#$$$$$@@@$$$$$#@...++@#@$$$$$$$@@@++...++@#@$$$$$$$@@@++...++@#@$$$$$$$@@@++...++@#@$$$$$$$#@@++...+@@@@$$$$$$$#@@++.......++@@@@++.......+++###$$$$$$$#@@++...+++@@$$$$$$$$$$#@....++@@$$$$$$$$$$#@.....+++$$$$$$$$$$#@.....+++$$$$$$$$$$#@....+#@#$$$$$@++.....++@###$$#@@@.+.........+@##$$$$$++......",
+"...+@@@$$$$$$#@@@+...+@#$$$%$@@@$$$$$@@...++@@@$$$$$$$@@@+....++@@@$$$$$$$@@@+.....+@@@$$$$$$$@@@+....++@@@$$$$$$$@@@+.....+@@@$$$$$$#@@@+........++@@@@++.......++@###$$$$$$$@@@+.....+++@$$$$$$$$$$#@.....++@$$$$$#$$$$@@.....+@+$$$$$#$$$$@@....++@+$$$$$#$$$$#@...++@##$$$$#@+.......++###$$##@++.........++@##$$$$#@+......",
+"..+.++++++@+@+@++...+++++@+@+++++@@@@@+.....+++++@+@++@++.......++++++@+@+@++.......++@+@+@+@+@++.......+++++@@@+++++.......++++@+@@@+@++...........++++..........@@#@#@@@@@++@++........+++@+@++@@@@++......++++@+@@+@@@@+......++++@+@@+@@@@+......++++@+@@@@@@++...++#@#$$#$$++......+++@#@#@@#@++.........++#@#$$$$$+++.....",
+".....++++++++++.+....+++++++++++++++++.......++++++++++.+........++++++++++.+.........+++++++++.+........+++++++++++........+++++++++++.+............+............+@@#@@+++++++.+.........+++++++++++++.......++++++++++++........++++++++++++........+++++++++++++...++@#@#@#@@++.......++@@#@#@@@+..........++@#@#@@@@++......",
+".......++++++..........+.+++.+.+...............+.++++..............++++.+................+++...............+..+.++..............+.+.+............................+++++++++.++................++++.++.............++.+++..............++++++..............++.+.++.......+@@@#@@@@++........+++++@+++............+@@#@@#@@+.......",
+"...................................................................................................................................................................++++..+.............................................................................................++@++@@+++..............................++++@++@++.......",
+"................................................................................................................................................................................................................................................................................................................................",
+"........................................................................................................+++++++++++++.....................................................................................................................................................................+++++.................................",
+".......................+...............................................................................++++@+++@++++++...........................+++++++++..............++++............................................................................................................++++++++................................",
+"......................@+@@+......................................+..+.+.+.............................++#$$@##@#@#$$$++.............++++.........+@@@@@@@@@+............+@@@+.............................................................................................+++....++.....+@#$$$@@++++++..........................",
+"....................++@@@@@+.................................++++++++++++++++........................++@$#$##@#####$$@+..........+++@@++.......++@@@@@@@@@@++..........++@@@@+.................+++++++..........+++.................................+++++...............++++++++++++....+@#$#$@@++++@+++........................",
+".........++.........++@@@@@++................................++++@@@@@@@@@@@+++......+++++............++$$$####@##$$#@+...........++@@+++.......+@@@@#@@@#@++.........++@##@+++................+++@@+++........++++++.............+.+.+.+.+........+++++++++++.+........++@@@@@++@@++...+#@$$$@@@@@@@+@++++.......+++.....++....",
+"......++@+@++.......@@$$$$$@++..............+++++++++.......+@@$$$$$$$$$$$$$$#+......@@@@@+..........++@$$$@#@#@#@$$$@@.........++@@$$@@+.......+@@####@@$$++.......++++@$$$@++++.............++$$$$$@@......++@@$$$++........++++++++++++@+++....++@##@#@@@+++++++....++@@#@@@@@$$+++..+@#$$$#@@@@$$#@#@@@....+++@@+.+++@@@.+..",
+"......++@@@@@+......++$#$$$@@+.......+.....++++@@@@@++++....+@@$$$$#$$$$$$#$$$+.....+@@@#@++.........++@#$$###@###$$$@+......+.++@@@$$@@++.....++@@@##@#@$$@++....++++@@@$$$@@@+++...........++@$$$$$#@....++++@@$#$@++......++++@@@@@@@@+@@@+...++@@##@#@@@@@@@@++...+++#####@@@$$@@+..@@@#$$####@$$##@#@@....+@@@@+++++@@@@+..",
+"......+@$$$@@+......++@@$$$@@++...+++@@..++@@@$$$$$##@@+....++@@@+@@###@@@@++++.....+@@#@#++.........++@###$$$$$@#$$$@@..++@+@+++@@@$$@@++.....+@@@###@@@$$+++...++@@#@@#$$$@#@#@@+..........++@#@#@#@+..++@+@@@@##@@+@++....+@#$$$$$$$$$$$#$++.++@#$$$$$$$$$$$$$$#...+@@@@@##@@@$$@+++.+@@@@@$$@@@#@$$$#@@....++@$$@+++@#$#@@+.",
+"......@+$$$@@++.....++@@$$$#@+++.++@+@@..++@@@$$$$$##@@@++..++++@@@@###@+@+@+++......@@@#@++........+++@####$$$$##$$$@@..+@@@@@@+@@@$$@@@+...+++@@@@##@@@$$@@++..+@@####@$$$###@#@@..........++@@###@@@...@@@@@@#@##@@++++..++@@$$$$$$$$$$$$$@+..+@#$$$$$$$$$$$$$$$...+@@###@#@@@$$@@@+..++@@@$$@#@@#$$$##@....++@$$@@@@@$$$@@+.",
+".....++@$$$@@@+......++@$$$@#+++.+@@@@@.++@@#@$$$$$##@@@+++.+++++@@@###@@++++......+.@@##@@.........+@+@###$$$#$##$$$@+.++@@@@@@@@@@$$@@@++..+++@@#@##@@@$$@@+@.++@@#####$$$@##@#@@.........++@@#@##@@+.++@@@@#@#@#@@@@@@++.++##$$$$$$$$$$$$$++.++@@$$$$$#$$$$$$$#$.+++@@@#@##@@@$$@@@+.++@@@@$$@@@#@$$$@#+....++@$$@@@+@$$$@@+.",
+"......++@@@$$++......++@@##@@++++@##$@@.+@@$$$@@###@####@@+.+@@@@@+@###@@@+++++.....+@@@#@++........++$$$$$##@####$$$@#.+.$$$$$$$$$$$$###++.@+@#####$$###$$@#@@.++@@$$$##$$$#####@@........++@@#$$$$$@+.++$$$$$$$$$$$$$$$@@..+@@$$$@@@@@@@$$$@+..++@@@@$$##@$$@@@@+.++@$$$$$$$$$$$$$$#@...@@##$$@@@@@$$$@@+....++@#$@@@@@###$$+.",
+"......++@#@$$+@.......+@###@@@+++@$$$@@.+@@$$$@@####@###@@+.+@@@@@@@###@@@@++++.....++@##@@+........@@#$$$$##@#@##$$$#@.++$#$$$$$$$$$$###++.+@@@####$$##@$$###@.++#@$$$@#$$$#@####@........++##@$$$$$@@.++$$$$$$$$%$$$$$#@@..++@$$$@+@+@@@$$#@+..+.+@@@#$###$$@++++.+@@$$$$$$$$$$$$$$$@.++@@@@$$@@@+@#$$@@+.....+@#$@#@@@####$+.",
+".....+++@@@$$@++......++@@#$$@@+@@#$$@+.+$$@@@@@@@@##@@@$$+.+#@#@##@$$$##@#@#@@.....+@@#@#++.........@@@#@#@##@#$$###@@..++@@@@$$@@@@@###@+.@@@#@###$$###$$@@##.+@@@$$$@@$$$@@#@@#@.........@@####@@@@+.+@@##@#@@$$$@@@@@++..+@@#$#@@++@@@$$$@+....+.++@@###@@+@++....++@#@#@#@@@$$@@@+.++@$$$$$@++@@#@#@@+....+++#@$$$##@@@@++.",
+"......++@@@$$@@+......+@@#@$#@@+@@$$#@+.+$$#@@@@@@###@@@$$+.+@@##@##$$$##@#@#@@.....++@#@#++........++@#@#@#@##@$$###@@..+++@@@$$@@@@@###@+.@@@###@#$####$$##@@.++#@$$$@@$$$@@@#@#@........++@######@@+.++#@#@#@@$$$##@@@+...++@$$$@++++@@$$$@+......++++####@@+......++@@#@##@@@$$@@@+.+@@$$$$$@@+++#@#@@@.....++@@$$$##@#@++..",
+"...+++++@+@$$@@++......+@@@$$@@@@@$#$++.+$$@#@+@@@@##@@@$$@.+@@@@#@#$$$####@#@@.....+@@@#@@++........@@@#@##@#@#$$###@@....++@@$$@@@@@###@+.@@@@@###$$@##$$@#@#..@@##$$@@$$$@@@#@#@........++#@###@#@@@.+@@#@#@@@$$$@@@@@++..+@@#$$+@+++@@$$$@+.......++@###@@+++.....+++#@###@@@$$@@@+.+@@$$$$$@+++@@###@+......@@@$$$##@@@++..",
+"..++@@@#@+@##@@@+......++@@$$@@@@@+@++..@$$@#@@+@@@$$@@@##@.++@@+@@@###@++@++++.....++@$$$++.........+@@$$$$$$$$$$###@+.....+++#####@@@@+#@.+++@@@@@##@@@$$@@@+.++@#$$$#@$$$#####@#........++@@@$$###@#.++@####@@####@@++....++@$$$+@+++@@$$#@@.......+++@###@++.......++@#@##@@@$$@@++.+@@#@#$#@@@+@@@@#@+....+++@@$$$##@++.+..",
+".++@@@#@@@+##@@@++......+++$$@#@@++++...@$$#@@@+++@$$@@@##@....++++@###@@++++++......@@#$$@++........++@$$$$$$$$$$#@#++......+@@#@#@@+@+@@@...+++@#@##@@@$$@@++..@@@$$$##$$$#####@@.........++@@$$####@..@@@###@@####@@++.....@@$#$@++++@@$$$@+........++@@#@#+++.....++@@#@##@#@$$@@++.+#@@#@$$@@@+@@#@##+.....++@@$$$##@@++...",
+"++@#$$@@@@@@@##@++......+++@@$$$@++++...+####@@+@+@####@##@.....+++@###+@+++........++@$$#@+..........++###@#@@@@@###++.......+@@$$$@@@++++....++@@@##@@@$$@@@+..+@@###@@$$$@@@#@@@........+++@+###$$##..+@@$$$@@##@##@++....++@$$#@@+@+@@$$$@+........++@@@##++.......++@#@#@@@@$$@@+...+@+@@@#@@@@@@#@#@@...++@@@#$$$$$+@+....",
+"++@$$$#@@@@@@###@++......++@@$$$@@++....+##@##+@++@@#@####@.......+@@##@+++.........+++$$$@++........++@####@@@@#@@#@++......++@@$$$@@++++......+@@@##@@@$$@@@+.++@@###@@$$$@@#@@@@.....++++++@@##$$$##.+++@$$$@@#####@+++....@+$$$@+@+@@@$$$@+.........++@@##@++......++#@####@@$$@@++...+++@##@#@@@#@@#@+..+++@@##$$$$$@@++...",
+"+@+$$#@@@@@@@##@@@+.......+@@#$$+@+++...+@##@#@@+@@##@#@##@.......+@###@+++..........+@$$$@@++........++###@#@@@@@##@++........+@$$$@@++.+......+@@###@@@#$@#@+..++@@##@@$$$@+@@@@+..+++++@@@@@@##$$###..++@#$$@@#@###@+++...+@@#$$@@@@@@@$$#@+.........++@@##@@++.....++@#@@@@@@$$@@+.....+++@#@#@@@@#@#@+.++@@@@##$$$$$@@@++..",
+"+##$$$$$#####$$$#@@........++#@@##@@++..+@@$$$#@@+@@@$$$$$@......+++####@@++........+++@###@++.........@@@#$$#@#@@++++........+++@@@#@@++......+.@@@##@+@#@$$$@...+++++@@$$$@@@+++...+@@#@@$#$$$#####@@...+@###$$@@@@@###++...+@$$$#@#####$$$@@..........+++@#@@@++.....@@@#####@$$@@++......+@@#####$$$@@+.+@@$$$$$@@@@@$$#@++.",
+"+##$%$$$#####$$$#@@........++@####@@+++.+++$#$##@@@@@$$$#$+.......++###@#@++.........++##@##@++.......++@#@$$##@@@+++...........+@@@##+++.......+@@@##@++@@$#$@...++++++@$#$+++......+@@##@$$$$$#####@@...++###$%@@##@#@#++..++@$$$#######$$$++...........+@@##@@@.....++@####@#@$$@++.......++@###@#$$#@++.+@#$$$$#@+@#@$$$@++.",
+"+$$#@@@@@@@#@#@#$$@.........++++@@$$$@+..+++@@@@$#$@@@@@@++.......+@@###@@++..........++@@$##@@+.......+@@@$$###@+++.............+++@@@@@+.......+@@@@+@++@@@@#......++@+$$$@+++....++@@@###@@@@@@@@@#@....++@@@@@+@+@@#@#@...+@@@@+@++@+@###@+...........++@@###@@....++@@@#####$$@@+........++@@@#@@@@++..+@@#@@+@+++++@@@$$@.",
+"+$#@#@@@@#@#@##@$$@.........+++@@@$#$@@...+++@@#$$#@+@+@+++.......++@####@++...........+++$$@@@+.......++@@$$###++...............+++@@#@@.......++@@@#+++++@#@#........++$$$++.......+@@@#@#@@@+++@@@@#....+++@@#++++@@@@#@...++@#@@++++@+#@#++............+++@@#@+.....+@@@##@#@$$@@+........++@@@#@@@++...++@@@@@++++++@@@#$@.",
+"+$$@@@+@@@#@#@#@$$+...........++@@$$#@@.....++@@#$$++++++..........@@@@#@++...........+.+@#$#@@++.......++@#$@#@++................++@@@@@+.......+++@@++.++@@@@........++$$$+++......++@@@@#@@+@++++@@@.....+++@@+++++@@#@@...++@@@++++++@##@++.............+@@#@@@.....+@@@###@#$$+++..........+@@@@@++....++@@@@++....+++@$#@.",
+"++++++++++++++@++@+............++++@@@@.....++++++++++.............++@+++++.............++++@@@+.........+++@+@+++..................++++.+.......++++..+...++++........+++@@+.........++@+@++++++++++++......++.+...+++++@+...++++++....+.++++...............++++++......++++@@+@@@@++...........+++++++......+++........++++++.",
+".+++++..++++++++++...............++++++.......+++++++................++++.................++@@++..........++++++............................................+++.........++++.+...........+.+++.......+................+.+.................+++................+.++.........+++++++@@+...............+.+.......................++.",
+".................+..................++................................+...................++.+...........................................................................+++..................................................................................................++++.+............................................"};
index 25b376e45fe2ec9523c52772179f8d46642d615c..966214122173db5da2eaa89b0f10cceb75e00d27 100644 (file)
@@ -148,19 +148,19 @@ static unsigned char matrix0b_bits[] = {
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xdd, 0xdf, 0xdf,
-   0xfe, 0xfb, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xfe, 0xfb, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xdb, 0xff, 0xff, 0xff,
    0xfd, 0xff, 0xdf, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xff,
+   0xff, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x7f,
-   0xf7, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff,
+   0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x7f,
+   0xf7, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0x7f, 0xff, 0xff,
    0xfb, 0xbf, 0x7f, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x7f, 0xfb, 0xff, 0xff,
-   0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xbf, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xfe, 0xff, 0xbf, 0xff, 0xfd, 0xff,
-   0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
-   0xff, 0xff, 0xef, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff,
+   0xf7, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
+   0xff, 0xff, 0xef, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x7f, 0xff, 0xff,
    0xfd, 0xff, 0xbf, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0x7f, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xef, 0xff, 0x7f, 0xff,
    0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
index 3b5e1de3edf07fdf591fee1d5bbfec8dc8d51e42..66697f3e62be2d612fe44760847a44fbe2e930bb 100644 (file)
 /* XPM */
 static char * matrix0b_xpm[] = {
-"160 182 7 1",
+"160 182 16 1",
+"      c None",
 ".     c #000000",
 "+     c #030E03",
 "@     c #061406",
-"#     c #0B2A0B",
-"$     c #081E08",
+"#     c #081E08",
+"$     c #0B2A0B",
 "%     c #0F390F",
 "&     c #165016",
+"*     c #000100",
+"=     c #051205",
+"-     c #051405",
+";     c #061706",
+">     c #061806",
+",     c #061606",
+"'     c #020802",
+")     c #030B03",
 "...............+.................++@+......++++.............................................................................................................++..",
-".............+@@@+....+++@+++...+@@$$@+...++$$@++...+++++.......+.+......++++.......+@@+....+@@++......+@@++...............................................++@@+",
-".+..+..+..+..@##$++...@@$@@@+.+.+$$$$@++.++$##$@+.+.+@@++..+..+.@+++.+...+@@@+.+..++@$@++...+@$@+..+.++@##$+.+..+++@+.+..+..+..+..+..+..+..+..+..+..+..+...+$#$@",
-"...........+.$%%$@.+.+@#$##$+..+@$###$@..+@$###$@..+@$$$++....+@$$@+.....+$$@+.....+$$$+.+..+$$$++....+$%%#@+....+@$++..................................+..@$#$+",
-"..+..+...+..+@%%$@...+$####$@+.+$#%%#$@+.@$####$++.+$$$$@+....@$##$++..++@$$@+..+.+$$$@+.....@$$@+..++@#%%%$@+...@##$+..+..+..+..+..+..+..+..+..+...+.....+@$$@+",
-"...+...+.....$%%#++..+@####$+.+@$#%%%$@.+@$##$$$++.+@###@++.+.$$#$@++....+$@++....+$#$+...+..@$#$++..+$#%&%$@..++$%%#@++.+..+..+...+++++++++..+...+...+...+$$$+.",
-".....+...+..+$#%#+.+.++@@@@+...@#%%%#$@..@$####$+..+@$##$+...+$###$@+....+++...+..@##$++.....@$##@....$#%%%$@+.+$#%%%$@...........++$$#$#$@+....+...+..+.+@$$@+.",
-".+...........@#%$+......+++.+.+$#%%%%$++.+@$####@+.+@$#$$@+..+@#%#$$++.......+...+@#%$+.....+.$%#@+...+####$+.+@#%%&%%$@.+..+..+...@#%%%%#$++............+@$$+..",
-"...+.+..+.+.+@##@+............+$%%%%#$+.+@$$####@+.@@$##$@++.+$#%%%#@.+........+..@$#$+.+.+..+$$$+.+.++$$$$@+..+$#%%%#@+....+.+....+$$$$#$@+..+.++.+..+..$$$@+..",
-".............+@$$...+....+....+$##%##@+..+$##%%#$++.+@$$$$+.++$##%%#@+.+.+.+......+$$$++....++$#$@.....++++...+.+$%%$++..+.+@@++..+.++@@+++....++@@+...++@$$++..",
-".+....+...+..+@$@+....+....+...@$##$$++..+$#%##$+...+@$$$$+..@$##%##$+.......+.+..+@$$@+.....@$$++..........+....@##$+.....+$$@+............+..+@$@++..++$$@+...",
-"...+..........@@+..+.........+.@$$#$$+...++$#%$@.+...+$$@+++.+@$###$@+.+.+.........+@#@++.+.+$$@+..+......+...+..+$$@.+...+@$#@+..+..+.+.......+@$@+...+$$$@.+..",
-"......+.+.+.+.+.+...+.+.+.+....+$$$@@+.....+$$@+......+++.....++@@@@++.....+..+.+...@$@+....++$++...+...+......+..+++......@$@@..........+..+..++@+...+.$$@+....",
+".............+@@@+....+++@+++...+@@##@+...++##@++...+++++.......+.+......++++.......+@@+....+@@++......+@@++...............................................++@@+",
+".+..+..+..+..@$$#++...@@#@@@+.+.+####@++.++#$$#@+.+.+@@++..+..+.@+++.+...+@@@+.+..++@#@++...+@#@+..+.++@$$#+.+..+++@+.+..+..+..+..+..+..+..+..+..+..+..+...+#$#@",
+"...........+.#%%#@.+.+@$#$$#+..+@#$$$#@..+@#$$$#@..+@###++....+@##@+.....+##@+.....+###+.+..+###++....+#%%$@+....+@#++..................................+..@#$#+",
+"..+..+...+..+@%%#@...+#$$$$#@+.+#$%%$#@+.@#$$$$#++.+####@+....@#$$#++..++@##@+..+.+###@+.....@##@+..++@$%%%#@+...@$$#+..+..+..+..+..+..+..+..+..+...+.....+@##@+",
+"...+...+.....#%%$++..+@$$$$#+.+@#$%%%#@.+@#$$###++.+@$$$@++.+.##$#@++....+#@++....+#$#+...+..@#$#++..+#$%&%#@..++#%%$@++.+..+..+...+++++++++..+...+...+...+###+.",
+".....+...+..+#$%$+.+.++@@@@+...@$%%%$#@..@#$$$$#+..+@#$$#+...+#$$$#@+....+++...+..@$$#++.....@#$$@....#$%%%#@+.+#$%%%#@...........++##$#$#@+....+...+..+.+@##@+.",
+".+...........@$%#+......+++.+.+#$%%%%#++.+@#$$$$@+.+@#$##@+..+@$%$##++.......+...+@$%#+.....+.#%$@+...+$$$$#+.+@$%%&%%#@.+..+..+...@$%%%%$#++............+@##+..",
+"...+.+..+.+.+@$$@+............+#%%%%$#+.+@##$$$$@+.@@#$$#@++.+#$%%%$@.+........+..@#$#+.+.+..+###+.+.++####@+..+#$%%%$@+....+.+....+####$#@+..+.++.+..+..###@+..",
+".............+@##...+....+....+#$$%$$@+..+#$$%%$#++.+@####+.++#$$%%$@+.+.+.+......+###++....++#$#@.....++++...+.+#%%#++..+.+@@++..+.++@@+++....++@@+...++@##++..",
+".+....+...+..+@#@+....+....+...@#$$##++..+#$%$$#+...+@####+..@#$$%$$#+.......+.+..+@##@+.....@##++..........+....@$$#+.....+##@+............+..+@#@++..++##@+...",
+"...+..........@@+..+.........+.@##$##+...++#$%#@.+...+##@+++.+@#$$$#@+.+.+.........+@$@++.+.+##@+..+......+...+..+##@.+...+@#$@+..+..+.+.......+@#@+...+###@.+..",
+"......+.+.+.+.+.+...+.+.+.+....+###@@+.....+##@+......+++.....++@@@@++.....+..+.+...@#@+....++#++...+...+......+..+++......@#@@..........+..+..++@+...+.##@+....",
 ".+.+...........+.+..............++@++.+....++@+...+.....+..+...+..+.......+......+...++..+....+..+....+...+.+....+....+.+.+++@.+...+................+..+@@++.+..",
 "...++++.....+.+.......+.+++..+..+++++...+....++.....++++.+...+..+.+.+.+.+.@+@+....+++.+...+.+.++.+..+..............+........+........+...+.......+.......++.....",
-"...+@@@+++.++@@@++.+..+@@@@@+..++@$@+++....+@@@++..++@$@@++....+@$@@++.+@@@@@@++..++@@@@+....++@+++.....+....+.+...............+.+....+.....+.+.......+.+@@$@+..",
-".@@$$##@+..+@###@...++@$###$++.+$$##$@+....+$##+..++$##$$@+..+.$#%#$+..+$$$#$$@++++$##$$++.+@$$$$@++.+....+......+.+.+.+....+..+..+......+....+.+.+.+..+@###$@+.",
-".+@####$@+++@#%%$+...+@####$@+++$#%##$@.+.+$#%%$+..+$###$$++..@$%##$@+.+$$$$##@+++$###%$@+++@$###$@+.....+.+.......+.....+..++@@@+...+.++.+.++@@++.....+$#%%#$@.",
-".@$#$$#$@+.++$%#$+...@@$$###@+++$$###$@...+$#%#$+.+@$%%##$+.++$#%#$@+..++@$$$$@++@$#$##$@+.@$$$##%@+.+.+@@@+.+...++@@+....++@@$$@++++@@@@++.+@$$$@@+.+.+$####$@+",
-"+@$#$$$$@@..+@#%$+..+.++@$$$$+..+@$###@+.+@###%$+..@$#%%#$++.@$%###$++...++$$$+..@$##$##$+++$#$$%%$+...+@#@+...+.+@#@@.+..@@$#$@@+.+@$$$$@@+.@@$##$@+..+@$$##$@.",
-".@$#@@$$$++.++##$+....++@##$++.++$#%#$++.@$###%$++.+$$#%%#@+.@#%%###@+....+$$$++.+$####$@+++$###%%$+...+@$@@.....+@$@@..++$###$@+..@$#####@+.+@@####$+..+@$##$@.",
-"+@$$$$$#@@..+@#%$+...+.@##$@+...+@$##$@.+@##%#%$@.+.@@$$#%$++@##%#%%@+.+.++$$++.+@$#####@+.+@###%%$++...+@++.+....@@++...@$###@++.+@$#####@++.+@$#%#$+..+@###@+.",
-".@$#$$$$$++.+@#%$+...++$##$@+.+.@@$$#$@.+@###%%#@..+@@@$#%$.++#%###%$+...+@$$+...@$##$##$+.++$%%%%$...+.++.+...+..+.+..+.+$###$@+..@$$#$##@+.++@####@+..+@$#@+..",
-"+@$#$$$$@+..+@#%$@++.+$#%#$++.+@$@$$#$@+.@$###%#$+++$@$$%#$+.@$%##%%$+..++$$$++.+@#$#$#$@++.@$##%#@+....+@++......@@++....@$###@@+++$$$#$$@+++$$##$@+....@$$@...",
-".+$####$@+.+@$#%$@+..@#%##$@+.+$#$###$+..+@$##%#@.++$$#$##@+.+$#####@+...@$#@+...+$#####@++.+$####@.+..+@$@@..+.++$#@+.+...@@$#$@+.+@@@@@@++.@$$$$++.+..+@$@+.+.",
-"+.+$$#$@+..+@$###@+++@$###$$@.+@$#$$$++.+.+@$$#$@+.+@#$#$@+..++$$$#$@....+$$@+.+..+$$#$$+..+@$$$$++....+@#@++...+@##@+...+..++@@++...+..+...+@@@++.......+@++...",
-"...@@$@++..+@@$$$@+..+@$$$$@+...@$$@+......+@$$@+...+@@$@+.+..++$@@@+.....+++...+.++@$@+.+.++@$@@.+.+..++@+.....+@$@@.........+..............++.+...+.+..++.+...",
+"...+@@@+++.++@@@++.+..+@@@@@+..++@#@+++....+@@@++..++@#@@++....+@#@@++.+@@@@@@++..++@@@@+....++@+++.....+....+.+...............+.+....+.....+.+.......+.+@@#@+..",
+".@@##$$@+..+@$$$@...++@#$$$#++.+##$$#@+....+#$$+..++#$$##@+..+.#$%$#+..+###$##@++++#$$##++.+@####@++.+....+......+.+.+.+....+..+..+......+....+.+.+.+..+@$$$#@+.",
+".+@$$$$#@+++@$%%#+...+@$$$$#@+++#$%$$#@.+.+#$%%#+..+#$$$##++..@#%$$#@+.+####$$@+++#$$$%#@+++@#$$$#@+.....+.+.......+.....+..++@@@+...+.++.+.++@@++.....+#$%%$#@.",
+".@#$##$#@+.++#%$#+...@@##$$$@+++##$$$#@...+#$%$#+.+@#%%$$#+.++#$%$#@+..++@####@++@#$#$$#@+.@###$$%@+.+.+@@@+.+...++@@+....++@@##@++++@@@@++.+@###@@+.+.+#$$$$#@+",
+"+@#$####@@..+@$%#+..+.++@####+..+@#$$$@+.+@$$$%#+..@#$%%$#++.@#%$$$#++...++###+..@#$$#$$#+++#$##%%#+...+@$@+...+.+@$@@.+..@@#$#@@+.+@####@@+.@@#$$#@+..+@##$$#@.",
+".@#$@@###++.++$$#+....++@$$#++.++#$%$#++.@#$$$%#++.+##$%%$@+.@$%%$$$@+....+###++.+#$$$$#@+++#$$$%%#+...+@#@@.....+@#@@..++#$$$#@+..@#$$$$$@+.+@@$$$$#+..+@#$$#@.",
+"+@#####$@@..+@$%#+...+.@$$#@+...+@#$$#@.+@$$%$%#@.+.@@##$%#++@$$%$%%@+.+.++##++.+@#$$$$$@+.+@$$$%%#++...+@++.+....@@++...@#$$$@++.+@#$$$$$@++.+@#$%$#+..+@$$$@+.",
+".@#$#####++.+@$%#+...++#$$#@+.+.@@##$#@.+@$$$%%$@..+@@@#$%#.++$%$$$%#+...+@##+...@#$$#$$#+.++#%%%%#...+.++.+...+..+.+..+.+#$$$#@+..@##$#$$@+.++@$$$$@+..+@#$@+..",
+"+@#$####@+..+@$%#@++.+#$%$#++.+@#@##$#@+.@#$$$%$#+++#@##%$#+.@#%$$%%#+..++###++.+@$#$#$#@++.@#$$%$@+....+@++......@@++....@#$$$@@+++###$##@+++##$$#@+....@##@...",
+".+#$$$$#@+.+@#$%#@+..@$%$$#@+.+#$#$$$#+..+@#$$%$@.++##$#$$@+.+#$$$$$@+...@#$@+...+#$$$$$@++.+#$$$$@.+..+@#@@..+.++#$@+.+...@@#$#@+.+@@@@@@++.@####++.+..+@#@+.+.",
+"+.+##$#@+..+@#$$$@+++@#$$$##@.+@#$###++.+.+@##$#@+.+@$#$#@+..++###$#@....+##@+.+..+##$##+..+@####++....+@$@++...+@$$@+...+..++@@++...+..+...+@@@++.......+@++...",
+"...@@#@++..+@@###@+..+@####@+...@##@+......+@##@+...+@@#@+.+..++#@@@+.....+++...+.++@#@+.+.++@#@@.+.+..++@+.....+@#@@.........+..............++.+...+.+..++.+...",
 "+.+.+++..+..+++++++...++++++.+...+++++...+..+++++.+..+++.+......+++..+.+.+.+........++.+.....++++........+.+...+.+@+++.+..+.....+..+.+..+.+.....................",
 ".....+........+....+....+.+....+..+....+....+.........++.+..+.+...+........+.+..+.+..+.+..+..+..+......+.+.+....+.+........+.+...............+.+.+.+..+..+.+..+.",
 "+.++@@@+.+..++@@+....+@@@@+++....++@@@+..+@@@@++.+.+@++++++...+@@@+@+.+..+++@++..++@@+@+++..++@@+++.+..++@@+++.++@@@@@.+.++@+++..+.++@+.++@.+.+++.@+.+...++++...",
-".++$$#$@..+++@$@@+.+.+@$$$@@+.+++@$$$@@++@$$$$@@++.+$$$$$@@+++@$$$$$@+.+@@@$$@@+++$$$@$$@@++@@$$$@@..+++@$$@@.+@@$$@@$++.@$$$@+...+@$@@@@@$++@@$@@@$@+.+@@@$$@+.",
-".+@$###@+..+@###@++.+@#####$++.@$#$$##$++$###$##@++@$#####@++@###$##@@+@$$#$##$++$##$$$#$@.+@####@++..+@####@++$#####$@++@###@++.++$##$@$#$@@$##$$##$++@$##$##@+",
-".@$###%$@+.+@#%#$++.+@$###%%$++$##$$$#$++$##$$###@@@$###%#@++@$###$#$@@$##$$$#$@+$##$$$#$@.++#%%#@+...+@@##$@++$#####$@.+@$##@+...+$%####%#@@#%%##%%$@@$##$$##$+",
-"+@$#%%%#++..$$###@+..@$###%%$@@#%#$@@@@++@$#$@$##@+@$#####@.+@$#$##$@@@#%$$@$$@++@#$#$##$++.+@#%$+.+...+@$#@+.+@##%##@+..@$##++..++#%%##%%%$+$#%##%%#@@#%$$$#%$@",
-".@$##%%$@+.+@####$++.$$%##%%$$@#%$+++++.+@$$$@$$$@+@$#%%##++.@$%###@++@#%$@@@$@+++$###$$$+..+@#%$+...+.++$$$@.+@##&%$@+..+$#$@....+$%%%%%%%$@$$##%%%$@@#%$@@$#$@",
-"+@##%%%$@.++$#%%%$@.+@$%###%#@$#%$@..+.+.@$#@@@$$@+@$%%%%@@.+@$%%%#@.+$#%#@@$$@.+@$#$##$$++..$#%@@...+++@@#@++.@$%%%#@+..+@#$@++.++#%%%%%%#@@$###%%%$@$#%$@@$#$@",
-".@$###%$@+.@##%%%#$+.@$#####$@$#%$@+.++.+@$#@@$##@+@$#%%#$@+.@$%##$@..@###$$##$++@$#$$#$$++.+@#%$+.++@@@$$#@@.+@$##%#$+..@$##@@$+.@#%%##%%%$+$$##%%%#+$#%$@@$#$@",
-"++$####$@++$%%#%%%#$+$$##$##$@@$#$@@@@@++$##$$$##@@@######@@+@$###@+.++$##$###$++@####$#@@..+$%%$@+.@$##$##$+.+@#####$@++@$%####@++#%%#$#%#$@$##$%%%$++$#$$$#%$@",
-".@$#%##$@.+$%%##%%#@+$######$++@$##$#$@++@#%####$+@$###%##$@@$###$@+..+@$###$#$+@$##$###$@+.@$#%#@++@$####$@+.@@###$##$++@#%##%#$++$##$$#%#$@$####%%$++@$#####$+",
-".+@$#%#@+++@##$$##$@@$######@+.+@$$#$@+.+$$###$$+++$######$+@$###$++...+$$$#$$+++@##$$$#$+++@$###@+.+@$$##@@..+$##$@@#@+@@#####$@++$#$@@@#$@@$#$$$##$..+$$#$#$@.",
-"..+@$$@@..++@@@+@$@+.@@$@@@@+..+.@@@@++..@@$@$@+...+$@$$@@++++$@@++..+..++@@@+..++@$@@@@@+..@@@$@@+..+@@@@++..++@@@@@@+++@@@$@$@+..@@@+++@++++@@+++++....@@@@+..",
+".++##$#@..+++@#@@+.+.+@###@@+.+++@###@@++@####@@++.+#####@@+++@#####@+.+@@@##@@+++###@##@@++@@###@@..+++@##@@.+@@##@@#++.@###@+...+@#@@@@@#++@@#@@@#@+.+@@@##@+.",
+".+@#$$$@+..+@$$$@++.+@$$$$$#++.@#$##$$#++#$$$#$$@++@#$$$$$@++@$$$#$$@@+@##$#$$#++#$$###$#@.+@$$$$@++..+@$$$$@++#$$$$$#@++@$$$@++.++#$$#@#$#@@#$$##$$#++@#$$#$$@+",
+".@#$$$%#@+.+@$%$#++.+@#$$$%%#++#$$###$#++#$$##$$$@@@#$$$%$@++@#$$$#$#@@#$$###$#@+#$$###$#@.++$%%$@+...+@@$$#@++#$$$$$#@.+@#$$@+...+#%$$$$%$@@$%%$$%%#@@#$$##$$#+",
+"+@#$%%%$++..##$$$@+..@#$$$%%#@@$%$#@@@@++@#$#@#$$@+@#$$$$$@.+@#$#$$#@@@$%##@##@++@$#$#$$#++.+@$%#+.+...+@#$@+.+@$$%$$@+..@#$$++..++$%%$$%%%#+#$%$$%%$@@$%###$%#@",
+".@#$$%%#@+.+@$$$$#++.##%$$%%##@$%#+++++.+@###@###@+@#$%%$$++.@#%$$$@++@$%#@@@#@+++#$$$###+..+@$%#+...+.++###@.+@$$&%#@+..+#$#@....+#%%%%%%%#@##$$%%%#@@$%#@@#$#@",
+"+@$$%%%#@.++#$%%%#@.+@#%$$$%$@#$%#@..+.+.@#$@@@##@+@#%%%%@@.+@#%%%$@.+#$%$@@##@.+@#$#$$##++..#$%@@...+++@@$@++.@#%%%$@+..+@$#@++.++$%%%%%%$@@#$$$%%%#@#$%#@@#$#@",
+".@#$$$%#@+.@$$%%%$#+.@#$$$$$#@#$%#@+.++.+@#$@@#$$@+@#$%%$#@+.@#%$$#@..@$$$##$$#++@#$##$##++.+@$%#+.++@@@##$@@.+@#$$%$#+..@#$$@@#+.@$%%$$%%%#+##$$%%%$+#$%#@@#$#@",
+"++#$$$$#@++#%%$%%%$#+##$$#$$#@@#$#@@@@@++#$$###$$@@@$$$$$$@@+@#$$$@+.++#$$#$$$#++@$$$$#$@@..+#%%#@+.@#$$#$$#+.+@$$$$$#@++@#%$$$$@++$%%$#$%$#@#$$#%%%#++#$###$%#@",
+".@#$%$$#@.+#%%$$%%$@+#$$$$$$#++@#$$#$#@++@$%$$$$#+@#$$$%$$#@@#$$$#@+..+@#$$$#$#+@#$$#$$$#@+.@#$%$@++@#$$$$#@+.@@$$$#$$#++@$%$$%$#++#$$##$%$#@#$$$$%%#++@#$$$$$#+",
+".+@#$%$@+++@$$##$$#@@#$$$$$$@+.+@##$#@+.+##$$$##+++#$$$$$$#+@#$$$#++...+###$##+++@$$###$#+++@#$$$@+.+@##$$@@..+#$$#@@$@+@@$$$$$#@++#$#@@@$#@@#$###$$#..+##$#$#@.",
+"..+@##@@..++@@@+@#@+.@@#@@@@+..+.@@@@++..@@#@#@+...+#@##@@++++#@@++..+..++@@@+..++@#@@@@@+..@@@#@@+..+@@@@++..++@@@@@@+++@@@#@#@+..@@@+++@++++@@+++++....@@@@+..",
 "..+.++++........+.....+..++........++.....+..+..+...+..+.+...+.+++.....+...+.+....+.+.+++.....++++.....++.......+.++.+...++@+++...+.++.++......+..+...+...+.....",
 "..+.......+.+.+..+..+..+...+....+...+.+....+.++..+..++.+.+........+.+...+.+..++...+.+....+.+.+..+.+...+.+++.+...+.@@++...+++.........+@@@+...+..+...........+...",
-"++@@$@@++....@@@++...+@@$$++.+...@@$@@.+.+@@@@@@+.++++++++++++@@+++@+++++++++++++++@@@@@@+.+@@@@@@@+.++@@@@@.+..+@##@++.+@@@@.+.+..++@$#$++....++@++...+.....+..",
-"+@####$@++.++$##$@++.$####$@+..++$##%#$+.@##%#%#$++@#$@$$$@++@$$@@@$$++@$$@@$#$++@##$$##$@+@###$##$@++$#####@+..+@##$+...@@$@+......+$#%#@+..+.+$$@+.....+......",
-"@$%%%%#$++++$##%##@+@$%%%%$$@+.+@$#%%%#@+$%%&%%%#@@#%#$$#%$++$%#$$$%#@@$%%$$#%#$@$%%%#%%#@@$%%##%%#@@@#%%%%#@+..+$%%@+...+@$$++.+..+.+$%#@.+...$#%$++...........",
-"@$$###$#$++$$#$###$+@$%%###$@++@$####%#@@$%%%&%%#@@$%#$$#%$@+$##$$$##@@$%%###%#$@$#%%#%%#@@$#%##%%#@+@$##%%#@+..+$%#@+...+@$$@+......+$##@...++$###@+..+...+.+..",
-".@$#$$$$$@@#%$$$$#$++@$##$#$$@.@$#####$@+$#%%%%%#@@$#$@$#%#@+$$#$@$#$@@#%%%%%%#@++##%###@.+@$#####@++@$$###$@...+$%#@.+...+@##@.+..+.+$%#@+...+$$##@++...+......",
-".@$###$#$@$#%$@@$$$@+@$#%###@+.@$#####$+.@$#%%#$$+@$$$@$#%$++@$$$$$$$@+$%%%%%%#@++@#%%#$@..+@$#%#$+..+@$###@++..+@%#@+....+@$$$+.....+$##@+.+.+@$$$++..+...+....",
-"+@$#%###@@@##$@@$#$++$$%%%%$@+++$##%#%$@+.+$#%#@+.+$$$@@#%$+.+@#$$$$@++#%&%%&%#@.+@$###@++..+$#%#@+..+@###$@+...+$%#@..+...+@$@@++...+$%#@.....+++++.........+..",
-"+@##%##$@+@$%#$$##$++@##%#%$@..@$$$##%#@.++$#%$@.++$$$$$#%$+++@####$+.+$#%%%%%#@++@#####+.+.+$#%$@...@@###$@@...+$%#@+......@$#@+..+.+$%#$+.+......+.+.+..+.....",
-"+@$###$@..+$######$++$######$@+@###$#%#@...@#%#@..+@$$$$##@+..@$###@+..@#%####$++@######$@..+$#%$++.+@$%%###@+..+$%#@+.+..+.+@$$@+..++#%#@...+..+............+..",
-"@$###$++...@#%%%%%$++$%#$$##$@+$######$@+.@$#%$@+.+@$$$#$$@+..@$###+.++@$#$#$$$+@$%######@+.+$#%$@+.+@######@+..+@%%$+......+@$#@...++$%#@+............+.+.+.+..",
-"+@$#$@+..+.+$#%#%#$++@$$$$$$$+.@$#$$$$@+..+@#$$@...+@$$$$@++...@$$$+...+@$$@$$+++$$#$$$#$+..+@$#$++..@$##$##@+...@##$@.+.....+@@@+..+@##$++...+...+.+...++++++++",
-"+++@@++....+$$####@.++@@++++++.@+@@@@@+...++@@@++...+@@@@+...+.+@+++....++++++.+.++@@@@@+++.++@@++.+.++@@@@++..+.@$$@@...+...+++.+..+@$$$+.+..........++@@@@@@@+",
-"....+.....+.+@@@$@@...............+..................................+.......+...+.++.........+.+......+.+.......++@+++............+.+@@++......+....+.@@@$$$$@+",
+"++@@#@@++....@@@++...+@@##++.+...@@#@@.+.+@@@@@@+.++++++++++++@@+++@+++++++++++++++@@@@@@+.+@@@@@@@+.++@@@@@.+..+@$$@++.+@@@@.+.+..++@#$#++....++@++...+.....+..",
+"+@$$$$#@++.++#$$#@++.#$$$$#@+..++#$$%$#+.@$$%$%$#++@$#@###@++@##@@@##++@##@@#$#++@$$##$$#@+@$$$#$$#@++#$$$$$@+..+@$$#+...@@#@+......+#$%$@+..+.+##@+.....+......",
+"@#%%%%$#++++#$$%$$@+@#%%%%##@+.+@#$%%%$@+#%%&%%%$@@$%$##$%#++#%$###%$@@#%%##$%$#@#%%%$%%$@@#%%$$%%$@@@$%%%%$@+..+#%%@+...+@##++.+..+.+#%$@.+...#$%#++...........",
+"@##$$$#$#++##$#$$$#+@#%%$$$#@++@#$$$$%$@@#%%%&%%$@@#%$##$%#@+#$$###$$@@#%%$$$%$#@#$%%$%%$@@#$%$$%%$@+@#$$%%$@+..+#%$@+...+@##@+......+#$$@...++#$$$@+..+...+.+..",
+".@#$#####@@$%####$#++@#$$#$##@.@#$$$$$#@+#$%%%%%$@@#$#@#$%$@+##$#@#$#@@$%%%%%%$@++$$%$$$@.+@#$$$$$@++@##$$$#@...+#%$@.+...+@$$@.+..+.+#%$@+...+##$$@++...+......",
+".@#$$$#$#@#$%#@@###@+@#$%$$$@+.@#$$$$$#+.@#$%%$##+@###@#$%#++@#######@+#%%%%%%$@++@$%%$#@..+@#$%$#+..+@#$$$@++..+@%$@+....+@###+.....+#$$@+.+.+@###++..+...+....",
+"+@#$%$$$@@@$$#@@#$#++##%%%%#@+++#$$%$%#@+.+#$%$@+.+###@@$%#+.+@$####@++$%&%%&%$@.+@#$$$@++..+#$%$@+..+@$$$#@+...+#%$@..+...+@#@@++...+#%$@.....+++++.........+..",
+"+@$$%$$#@+@#%$##$$#++@$$%$%#@..@###$$%$@.++#$%#@.++#####$%#+++@$$$$#+.+#$%%%%%$@++@$$$$$+.+.+#$%#@...@@$$$#@@...+#%$@+......@#$@+..+.+#%$#+.+......+.+.+..+.....",
+"+@#$$$#@..+#$$$$$$#++#$$$$$$#@+@$$$#$%$@...@$%$@..+@####$$@+..@#$$$@+..@$%$$$$#++@$$$$$$#@..+#$%#++.+@#%%$$$@+..+#%$@+.+..+.+@##@+..++$%$@...+..+............+..",
+"@#$$$#++...@$%%%%%#++#%$##$$#@+#$$$$$$#@+.@#$%#@+.+@###$##@+..@#$$$+.++@#$#$###+@#%$$$$$$@+.+#$%#@+.+@$$$$$$@+..+@%%#+......+@#$@...++#%$@+............+.+.+.+..",
+"+@#$#@+..+.+#$%$%$#++@#######+.@#$####@+..+@$##@...+@####@++...@###+...+@##@##+++##$###$#+..+@#$#++..@#$$#$$@+...@$$#@.+.....+@@@+..+@$$#++...+...+.+...++++++++",
+"+++@@++....+##$$$$@.++@@++++++.@+@@@@@+...++@@@++...+@@@@+...+.+@+++....++++++.+.++@@@@@+++.++@@++.+.++@@@@++..+.@##@@...+...+++.+..+@###+.+..........++@@@@@@@+",
+"....+.....+.+@@@#@@...............+..................................+.......+...+.++.........+.+......+.+.......++@+++............+.+@@++......+....+.@@@####@+",
 ".....+.......+.....+.++...+.....+...+..+....+.+.+..+..+.+.+..+.+.+++..+...+......+....+.......+..........++.+..+.........+.++.+........+...+.+....+....+++++.++.",
-".+.++++...+.....+....+@$+....+...........+...+@@++..+..........++@@@++..+......+.@@@+....+.+.++@++.+.+..++@+..+@@@+.+.+...+@@@++.+.+............................",
-"..+@$@++......+....++$$$@+.......+...+.+...+.@$$@+....+....+..++@###@++...+.+...+$$#@+.......@@$+......++$$@..@@#@@.......@$##@......+.+....+.+.+.+.+......+....",
-"..+$##@...+.+.+.++...$##$++.+.+...++++....+.@$##$+++.+.+++....+$###$@+..+.+.++.++@##@@++....+@#$@+...+.+@#$@@.+@$#@@@.+.+.+$%#$+..+.++.++++....+.+....+.+++..+..",
-"...@#$@+....@@$$@+..+@$##$$++..+@@@@@@@++.+@$$$$$+.++@@@@@+.+++$%%#$@+.+@@@@@$+.+@##$$@@+..++$#$@+...++@$#$@+.@@$$$@@@....+@#%$+..+@@$$@@@@++@@@@@@@+..++@@$@@+.",
-".+.+@$++.+.+@####@+..@#####$++.+$#####$+++$###%#$+++$###$$@+.+$#%%#$++.@$###%#@++@##%##@@+..+$##@+....+@##%$++.@$####@@+...@##@+.+@$###%##@++$#####@++.+$####$@+",
-"....+++....@$#%%%$++.@#%#%##$@+@#%##%%#++@#%%#%#$++@#%#%%#$@++$#%%#$+++$###%%#$+.@$###%$@+..@$#%@+....@@$###+.+@$#%##@+..+.@#%$+..@#%%%%%##@@$#####$@++@$%####$@",
-"+.+..+.+.+.@$##%%#@.+@$####%#@+$#%#$$#$@+$#####$$++@%%%%%%#++.+###$@.+@#%##$##$++@####$#@++.+@%%$+..+..@@##$@+.@#%%%#@+...+@##$+.+@$###%##$@@@##$$$#@+@$#%#$#%#@",
-"..........+@#%##%#@.+@$$$$#%#@+$%#$@@$$++$%%$$#$$@@$%%%%%%#@+.+$#$@+.+@#%#$$#$@+.@$#$$$$$+..+@#%$@.....++@##+.+@$%%%$@+...+@%%$+.+@$######$@+@##$$$$$@+$%##$#%#@",
-"...+.....+.$#%#%%#$.+@#####%#@+$%%#$$$$@+$#%####$++$%%%%%%#@.++$##$@.+@#%#####@++@##$$$#$++.+$#%$@+.+...@$#$@.+@##%%#@++..+@#%$++.@$$#####$@+@$#$$$#$++$%%#$#%#@",
-".....+...+.$#%#%%#$++$######$++@####$#$@+$####%#$@+$#%%%##$@+.@$##$@+.@$#%###$@++@######$@.+@$%%#@@...@@@$#$@.+$######++.++$#%#@++@$##$####@@$######$@+@##%###$@",
-".+....+...+@##%###$++@###%#$@+.+@#####$+.+$#####$+++$$####@+.+@####@+++$$##%##+++$##$$##$@.+@$###@@+..+@$$#@+++@$$$##$@+.+@$###$++@$##$$$$$@@@##$$##$@.+@####$@+",
-"...+.......+@@$$$@++++@$$$@@...++@@$@@@+..+@$$$$++..+@$$$@++..@@$$$++..+@$###$@..@@@@@@@@+..+@$$@@+..+@@$$@@..+@@@@@$@@...@@$$@@.++@@$@@@@@+++@@@@@$@+.++@$$$+..",
-".......+....++++.+....+.++.+......++++.....+.+.++..+.+.+++...+.++++++.++@@@$@@+..+.+.+++++.+..++@.....++@@++....+...++.+.+..+++.+..++++++++...+++++.++.....+.+..",
+".+.++++...+.....+....+@#+....+...........+...+@@++..+..........++@@@++..+......+.@@@+....+.+.++@++.+.+..++@+..+@@@+.+.+...+@@@++.+.+............................",
+"..+@#@++......+....++###@+.......+...+.+...+.@##@+....+....+..++@$$$@++...+.+...+##$@+.......@@#+......++##@..@@$@@.......@#$$@......+.+....+.+.+.+.+......+....",
+"..+#$$@...+.+.+.++...#$$#++.+.+...++++....+.@#$$#+++.+.+++....+#$$$#@+..+.+.++.++@$$@@++....+@$#@+...+.+@$#@@.+@#$@@@.+.+.+#%$#+..+.++.++++....+.+....+.+++..+..",
+"...@$#@+....@@##@+..+@#$$##++..+@@@@@@@++.+@#####+.++@@@@@+.+++#%%$#@+.+@@@@@#+.+@$$##@@+..++#$#@+...++@#$#@+.@@###@@@....+@$%#+..+@@##@@@@++@@@@@@@+..++@@#@@+.",
+".+.+@#++.+.+@$$$$@+..@$$$$$#++.+#$$$$$#+++#$$$%$#+++#$$$##@+.+#$%%$#++.@#$$$%$@++@$$%$$@@+..+#$$@+....+@$$%#++.@#$$$$@@+...@$$@+.+@#$$$%$$@++#$$$$$@++.+#$$$$#@+",
+"....+++....@#$%%%#++.@$%$%$$#@+@$%$$%%$++@$%%$%$#++@$%$%%$#@++#$%%$#+++#$$$%%$#+.@#$$$%#@+..@#$%@+....@@#$$$+.+@#$%$$@+..+.@$%#+..@$%%%%%$$@@#$$$$$#@++@#%$$$$#@",
+"+.+..+.+.+.@#$$%%$@.+@#$$$$%$@+#$%$##$#@+#$$$$$##++@%%%%%%$++.+$$$#@.+@$%$$#$$#++@$$$$#$@++.+@%%#+..+..@@$$#@+.@$%%%$@+...+@$$#+.+@#$$$%$$#@@@$$###$@+@#$%$#$%$@",
+"..........+@$%$$%$@.+@####$%$@+#%$#@@##++#%%##$##@@#%%%%%%$@+.+#$#@+.+@$%$##$#@+.@#$#####+..+@$%#@.....++@$$+.+@#%%%#@+...+@%%#+.+@#$$$$$$#@+@$$#####@+#%$$#$%$@",
+"...+.....+.#$%$%%$#.+@$$$$$%$@+#%%$####@+#$%$$$$#++#%%%%%%$@.++#$$#@.+@$%$$$$$@++@$$###$#++.+#$%#@+.+...@#$#@.+@$$%%$@++..+@$%#++.@##$$$$$#@+@#$###$#++#%%$#$%$@",
+".....+...+.#$%$%%$#++#$$$$$$#++@$$$$#$#@+#$$$$%$#@+#$%%%$$#@+.@#$$#@+.@#$%$$$#@++@$$$$$$#@.+@#%%$@@...@@@#$#@.+#$$$$$$++.++#$%$@++@#$$#$$$$@@#$$$$$$#@+@$$%$$$#@",
+".+....+...+@$$%$$$#++@$$$%$#@+.+@$$$$$#+.+#$$$$$#+++##$$$$@+.+@$$$$@+++##$$%$$+++#$$##$$#@.+@#$$$@@+..+@##$@+++@###$$#@+.+@#$$$#++@#$$#####@@@$$##$$#@.+@$$$$#@+",
+"...+.......+@@###@++++@###@@...++@@#@@@+..+@####++..+@###@++..@@###++..+@#$$$#@..@@@@@@@@+..+@##@@+..+@@##@@..+@@@@@#@@...@@##@@.++@@#@@@@@+++@@@@@#@+.++@###+..",
+".......+....++++.+....+.++.+......++++.....+.+.++..+.+.+++...+.++++++.++@@@#@@+..+.+.+++++.+..++@.....++@@++....+...++.+.+..+++.+..++++++++...+++++.++.....+.+..",
 ".+.+....+....................+...............+..........................++.@++.+..................+.....+........+.+........+.........+............+..+....+....",
 ".....+...........+........+.+........+..+.+.+..+.+....+....+.+.....................+........+.+.....+......+..+...@+++.....+@@++....++@++...+...........+....+..",
-".......+.+....+....+..+.......++.+....+...++++.....+....+......+.+.+.....+....+.+....+.+.+......+.......+.......++@@@+.+...@@$@.+...++@@@+....+..+..+.+.........",
-".++++++...+.+.++++.+..+.+++.+...+.++++..++@$@@+.+...+++.+.+.+.+.+.++.++.++.++.+...++@.++....++.+.+@.+.+++++++...+@##@+....+@##@+....+@$#@+..............+....+..",
-".@@$$@@@+.+.@@$$$$++.++@@@$@++..+@$@+++..@$##$$@.+++@@@@@@+.+@$$@@$$@+++@@@+@$@@.+@$@@$$@@+@$@@@@$@+.+@@$$$@@...+@%#@+.+...@#%$+.+...@##@+.+..+.+.+.+.....+.....",
-"@$%%#%$$+++@$###%#$+++$#%##$@+++$###$$+.+@#%%%#@+.+$##@$#$@@+$#%###%#@@$##$$###@+@#%##%#$+@$##$$$##@.@$#%%%$@+..+$%%@.....+@#%@+....+@#%$+....+@+@@++.+.+....+..",
-"+$%%%###$+@$###%%#$+.+$#%%#$@+++$%%%#$@.+@#%##$@+.@$%#$$$$$+@$%%###%$@@#%####%#@+@$%%%%#@@+$%##$#%#@+@@#%%##@..+@$%#@+.+..+@#%$+.+...@#%$++.++@$#$$@@+....+.....",
-"+$#####%#$@#%#####@.+.@#%#$$+.+@#%%##$+.++$##$@+..+$##$$$#@++@$##$##$@+$#%#%%#$@.+@##%%$@+.@##%#%#@@.@$$#%#@@+..+$%%@+.....@%%@+....+@#%$+..+@##%%##@++......+..",
-".@#####%#$@#%##%##@+.+@###@++.++$%%%#$@+.+@$#@@+..+@#$$$$#$@+@@$#$#$@++@$%%%%#$@++@#%%#@@..@@#%%##@.++$#%%#@@...@$%#@...+.+@#%$+.+...@##$+..+@##$##$@...+.+.....",
-"+@$%####$+@$####%$@.+.$#%$+++.+@$###%#@+.+$##$@@++.@$#$$##$@.+@####@+..@###%%#@+..@##%#$@@..@$#%$@+..@$#%#$$@@..+$%#@@....+@##@+....+@#%@+....@@@$@@++.......+..",
-"+@$###$@+.++@$$###@+.+$#%$$++.+@$###%#@+..@$%#$$++.@$####%$@+.+$###@...+@#####@+++$##%##@@.+@$##@@...@$%%%#$@+..+@%#@+.....@$#@..+...@##@+.....+.+.+......+.....",
-"+$###$+++...+@$###@+++####$++++@$$###$+..++$$#$@+.+++$$$##$+..+@$$@+.+.+@$$$#@+..@$$#$##@@.@$#%#@+...+@##%#$@+...@$$@++.+..++@++....+@$$@+.+.+.........+.....+..",
-"+$#%$$+.....++$###$+.+@$@@@+..+++@@@@++....@@@@++...++$@$$++...+@@++....++@+@+..+.@@@@@@@..@$##$@+.+.++@@@@@+....@@@+........+...+..++@@.......+..+.+.....+.....",
-".@$$$+.+.+....+$$$++....+.+.......++.+.+.....+.........++.+.+.................+..+.......+.+@$@@@.....+.++....+...+.+.+.................+..............+.....+..",
+".......+.+....+....+..+.......++.+....+...++++.....+....+......+.+.+.....+....+.+....+.+.+......+.......+.......++@@@+.+...@@#@.+...++@@@+....+..+..+.+.........",
+".++++++...+.+.++++.+..+.+++.+...+.++++..++@#@@+.+...+++.+.+.+.+.+.++.++.++.++.+...++@.++....++.+.+@.+.+++++++...+@$$@+....+@$$@+....+@#$@+..............+....+..",
+".@@##@@@+.+.@@####++.++@@@#@++..+@#@+++..@#$$##@.+++@@@@@@+.+@##@@##@+++@@@+@#@@.+@#@@##@@+@#@@@@#@+.+@@###@@...+@%$@+.+...@$%#+.+...@$$@+.+..+.+.+.+.....+.....",
+"@#%%$%##+++@#$$$%$#+++#$%$$#@+++#$$$##+.+@$%%%$@+.+#$$@#$#@@+#$%$$$%$@@#$$##$$$@+@$%$$%$#+@#$$###$$@.@#$%%%#@+..+#%%@.....+@$%@+....+@$%#+....+@+@@++.+.+....+..",
+"+#%%%$$$#+@#$$$%%$#+.+#$%%$#@+++#%%%$#@.+@$%$$#@+.@#%$#####+@#%%$$$%#@@$%$$$$%$@+@#%%%%$@@+#%$$#$%$@+@@$%%$$@..+@#%$@+.+..+@$%#+.+...@$%#++.++@#$##@@+....+.....",
+"+#$$$$$%$#@$%$$$$$@.+.@$%$##+.+@$%%$$#+.++#$$#@+..+#$$###$@++@#$$#$$#@+#$%$%%$#@.+@$$%%#@+.@$$%$%$@@.@##$%$@@+..+#%%@+.....@%%@+....+@$%#+..+@$$%%$$@++......+..",
+".@$$$$$%$#@$%$$%$$@+.+@$$$@++.++#%%%$#@+.+@#$@@+..+@$####$#@+@@#$#$#@++@#%%%%$#@++@$%%$@@..@@$%%$$@.++#$%%$@@...@#%$@...+.+@$%#+.+...@$$#+..+@$$#$$#@...+.+.....",
+"+@#%$$$$#+@#$$$$%#@.+.#$%#+++.+@#$$$%$@+.+#$$#@@++.@#$##$$#@.+@$$$$@+..@$$$%%$@+..@$$%$#@@..@#$%#@+..@#$%$##@@..+#%$@@....+@$$@+....+@$%@+....@@@#@@++.......+..",
+"+@#$$$#@+.++@##$$$@+.+#$%##++.+@#$$$%$@+..@#%$##++.@#$$$$%#@+.+#$$$@...+@$$$$$@+++#$$%$$@@.+@#$$@@...@#%%%$#@+..+@%$@+.....@#$@..+...@$$@+.....+.+.+......+.....",
+"+#$$$#+++...+@#$$$@+++$$$$#++++@##$$$#+..++##$#@+.+++###$$#+..+@##@+.+.+@###$@+..@##$#$$@@.@#$%$@+...+@$$%$#@+...@##@++.+..++@++....+@##@+.+.+.........+.....+..",
+"+#$%##+.....++#$$$#+.+@#@@@+..+++@@@@++....@@@@++...++#@##++...+@@++....++@+@+..+.@@@@@@@..@#$$#@+.+.++@@@@@+....@@@+........+...+..++@@.......+..+.+.....+.....",
+".@###+.+.+....+###++....+.+.......++.+.+.....+.........++.+.+.................+..+.......+.+@#@@@.....+.++....+...+.+.+.................+..............+.....+..",
 "..+.++....+....+++.+.+..+.+...+.+..+.....+.+....+.+.++.........+.+.+....+.+++......+.+......++@...........+.............+..+.+.....+.+....+.+...+...+.....+.....",
-".......+...+.+...........++++....+++++.......+......+@++@@+.+...+++..+..+@@@@@@.+......+......@@@++.+..+.++.+.+.+.+.+...........+..............++@++...+.+.+.+..",
-".+...............+.+.+.+@$$+....++$$$@+...+.+.+.+.+@$$$$$$@+..++@$@.....+$###$@...+++@+.+.++@@$$@@....++@@@@..........+.+....+.......+.+....++@@$$$@+....@@$++..",
-"...+.+...+.+.+.+......+@$%#$@+.+@##%#@++.++@@@@@+.+@#%##%%#++..@##@+.+.+@#####@@+..@.@@@...@$#%%%#@@..+@$$#@+.......+.....+.+.+.+.+......+...+$%%%%$@+.+@$##$++.",
-".............+.++....++$#%%$@..+@####@+..+@####$@.+@#%#%%#$+..++##$+...@$%%##@@...@+++@.+.+@#%%%%#$@..@@##%$+.+.+++++++..+@@@@@@@...........+@#%&%%#$@..+$$$$+..",
-".+...+.+.....+@@+.+..+@$###$@+++$###@@.+.@$####$@@.+$#%#%#@.+..@##@+.++@#%%###@@.......+..+@#%%%%#$@.+@$###$@...@@@@$@@+.@$#####$@+.++@+@+.++@#%%%%##@+..+@@++..",
-".........+...+@$@+..++$$#$#$+..@$###@+...@$##$##$+.+@$%##$@+..++$#@+..+@#%%%##$@....+....+@$#%####$@+.@$#%%$@.+@@#$#$$@@.@$#%#%%#@.@@@@@@@+.@$#%%%%#$@+...+.....",
-"..+.+.......+@$$$++..+$$#$$@+++@#%%#@+..+@$#$##$@++.@$%%#@+....@$$@+..+@#%##%%$@++........@$%%%%%##@.@@##%%$@+.$$%###$@+.@@@$$#%#@+@@$###$@++@######$@+.........",
-"......+..+...$#%$@...+@$###$+..@#%%#@@+..@$#####$+.+@$%%%@@+..++$$@+..++@###%##+....+.....@$%%%%%#$@..@#%%#@@.@$%##%#$@...+.@@@#$@.@@@$$$@+.@@#%%###$@...+.+..+.",
-"+...........+$%%#@+..++$###$+++@$%%#$$@++@$$####@+..@$%%#$+....@##@+...+@$##%%@@.+.....+..+@$%#%#$@+@.@@#$$@+.+$#%####@@......@@@+..+@@++++.+@$##%%#@++.........",
-"..+.+.+..+..+@%&#@+...++$%#@+.+$#%%%%#$+.+@$$$$$++.+@#%%%$@+..+@#%$+...@$###%$@+....+......@@$###@@....+@@+....@@$$$$$@@....+..+............++@####$@.+...+.+...",
-"............+$%%#@+....+@$$@...@##%###@++.++++++..+.@$#%#@+....@##@+..++$##%#@@..+.....+....+@$$@@.+............@@@$@@@+.+........+.....+.....@@$#$++...........",
-"+......+.....@$#$++.....+@++.+.+@$@$$@@.............+@@@@++.+..@$#@+...+@$#$$@......+....+..++@@++........+..+..+++@@+.......+.+....+..........++@+...+.+..+.+..",
-"..+.+.....+..+$@@...+.+..........++.++.+..+.+..+...+..+++.....+.+@++....+@@+@.+..+.................+.+.+.................+.+......+...+...+.+.+.+..+............",
+"*======*...+.+...........++++....+++++.......+......+@++@@+.+...+++..+..+@@@@@@.+......+......@@@++.+..+.++.+.+.+.+.+...........+..............++@++...+.+.+.+..",
+"-=%%%%=-.........+.+.+.+@##+....++###@+...+.+.+.+.+@######@+..++@#@.....+#$$$#@...+++@+.+.++@@##@@....++@@@@..........+.+....+.......+.+....++@@###@+....@@#++..",
+";%%%%%%;.+.+.+.+......+@#%$#@+.+@$$%$@++.++@@@@@+.+@$%$$%%$++..@$$@+.+.+@$$$$$@@+..@.@@@...@#$%%%$@@..+@##$@+.......+.....+.+.+.+.+......+...+#%%%%#@+.+@#$$#++.",
+";%%%%%%;.....+.++....++#$%%#@..+@$$$$@+..+@$$$$#@.+@$%$%%$#+..++$$#+...@#%%$$@@...@+++@.+.+@$%%%%$#@..@@$$%#+.+.+++++++..+@@@@@@@...........+@$%&%%$#@..+####+..",
+">%%%%%%>.....+@@+.+..+@#$$$#@+++#$$$@@.+.@#$$$$#@@.+#$%$%$@.+..@$$@+.++@$%%$$$@@.......+..+@$%%%%$#@.+@#$$$#@...@@@@#@@+.@#$$$$$#@+.++@+@+.++@$%%%%$$@+..+@@++..",
+";%%%%%%>.+...+@#@+..++##$#$#+..@#$$$@+...@#$$#$$#+.+@#%$$#@+..++#$@+..+@$%%%$$#@....+....+@#$%$$$$#@+.@#$%%#@.+@@$#$##@@.@#$%$%%$@.@@@@@@@+.@#$%%%%$#@+...+.....",
+";%%%%%%;....+@###++..+##$##@+++@$%%$@+..+@#$#$$#@++.@#%%$@+....@##@+..+@$%$$%%#@++........@#%%%%%$$@.@@$$%%#@+.##%$$$#@+.@@@##$%$@+@@#$$$#@++@$$$$$$#@+.........",
+">%%%%%%,.+...#$%#@...+@#$$$#+..@$%%$@@+..@#$$$$$#+.+@#%%%@@+..++##@+..++@$$$%$$+....+.....@#%%%%%$#@..@$%%$@@.@#%$$%$#@...+.@@@$#@.@@@###@+.@@$%%$$$#@...+.+..+.",
+">%%%%%%,....+#%%$@+..++#$$$#+++@#%%$##@++@##$$$$@+..@#%%$#+....@$$@+...+@#$$%%@@.+.....+..+@#%$%$#@+@.@@$##@+.+#$%$$$$@@......@@@+..+@@++++.+@#$$%%$@++.........",
+";%%%%%%;.+..+@%&$@+...++#%$@+.+#$%%%%$#+.+@#####++.+@$%%%#@+..+@$%#+...@#$$$%#@+....+......@@#$$$@@....+@@+....@@#####@@....+..+............++@$$$$#@.+...+.+...",
+";%%%%%%;....+#%%$@+....+@##@...@$$%$$$@++.++++++..+.@#$%$@+....@$$@+..++#$$%$@@..+.....+....+@##@@.+............@@@#@@@+.+........+.....+.....@@#$#++...........",
+"-=%%%%='.....@#$#++.....+@++.+.+@#@##@@.............+@@@@++.+..@#$@+...+@#$##@......+....+..++@@++........+..+..+++@@+.......+.+....+..........++@+...+.+..+.+..",
+"*=====)...+..+#@@...+.+..........++.++.+..+.+..+...+..+++.....+.+@++....+@@+@.+..+.................+.+.+.................+.+......+...+...+.+.+.+..+............",
 "....+.+.......+.+......+++.+.+.+..+...........................+.@++++.+....+........+.+..+...+.+..........+.........+.+..@+@...+...@@++.....++@+++......+....+..",
-"+..++@+++..+.+.+..+....+@@@.....+@@@@+.+.....++.+.+..+.....+.++@$$$@@+..+.....+..+.........+..@@++.....++@.+.+.+.+......+@@$@+....+@@@@.+.+.+@$@@++.++....+.+...",
-".++@@@@+.....++@+...+.+@@$@@....+@$$@+...+.++++........+.....@@###%#@+.....+..........+.....+@$$@..+..+@@@@.............@@#$@.+++.@@#$@+++++@@##@@@+++....+.+.+.",
-"..@@#$$@++...@$$@++..++@$$@@.+..@@$#$@+....+@@@++...+.+.+++.+$#%%%%#$++.+......+.+.+.....+...@##$@....@@$$$@@....+.+.+..+@#$@@.@@@+$$#@+@@@@@$###@@@@+.+..+@+...",
-".+@@#$$@++.+@$#%$@+...@@$#$@...++$$#$@+....+@@@..+++@@++@++.+$%%%%#$@....+.+...+.+....+....+.$%%$+.+.+@$$$$$@.++.@.@.+..+@$#$@@@@@+@$#@@@$$@@@$##$$@@@...++@@+..",
-"..+@$$$@+..@$#%%%#@@..@$#$@++...@$##$@+.+.+.++++..+@$$@@$@@++@%%&%%$@@...+@@@.+.++.@........+@#%$@....$$##$@@..+$@$@$@@.+$$$$$$#@@@@$##$##$@@$######@++..+@$$++.",
-"..++@@@++.++#%%&%#$@.++@#$$@..+.@$$$$+............@$##$$#$@++@##&%#$@...+@@$@..+.++..+.+.....$##$@..+.@$#$$$@.@@$$###$@.@@#$#$##$@@@#$##$#$$@$$#####@+..++$#$+..",
-"....+++....+$#%%#$@+..+@$@@++...+@$@@++...+..+....+$##$@$#@@.+@#%%%$@@...@$@@++.++.+......+..@$#@++..+@##%$$++.@$###%#$++@$$###%#@@@$$#$##$$@@$##%%#$+.++@$#$@+.",
-"..+........++@###@+...+++++...+..+@+...........+...@###$###@.++$%%#$@....+@@..++.+++.@.+.....+@@+.....@#%%#@@.+@$###%%@+.@@$#$%%#@+@$#$$$#$@@@@###%%$@.+@$$$$++.",
-"........+..++$$#@@.+.................+..+.+.......+@$######@..+@%%%$@@+......+.++..@@$@+..+.....+....+@$##$@+.+@$###%#@+.@$$$##%%@+@$$$$$$$@+@$$##%%#+++@##$$@++",
-".+.+.+.....+@$##$$@+..+..+.+...+..+.........+..+..+@#######@+.@$%%%#$.....+.++.++.@@$#$@..........+....@$$@+..+@$$$##$@..@@$$##%%@+@@$@$$$$@+@$$$#%%$+.@@$#$#$@.",
-"........+.++$#####@+.................+.............@$##$@@@+..@#%%%#$@++..++.++.+..$#%$@+...+.+................@@@$$@@+..+@@@@$##+++@++@$$$@+@@@@@##$+.+@$###$@+",
-".....+.....++@$@$@@+...+...+.+..+.+....+.+..+..+.+.@$$@@+..+.++@###$$+...+.++.++.++@$#@+........+.+.+....+..+..+.@..+....+.++++@@+....++@@@+.+.++++@++..+@$#$@+.",
-".+.+..........++++..+....+..........+..............+@@@+.+.....@@@@@+..+.++.++.++..@$$@+..@...@.+......+.+..........................+...++....+..+.+......@@@+..",
+"+..++@+++..+.+.+..+....+@@@.....+@@@@+.+.....++.+.+..+.....+.++@###@@+..+.....+..+.........+..@@++.....++@.+.+.+.+......+@@#@+....+@@@@.+.+.+@#@@++.++....+.+...",
+".++@@@@+.....++@+...+.+@@#@@....+@##@+...+.++++........+.....@@$$$%$@+.....+..........+.....+@##@..+..+@@@@.............@@$#@.+++.@@$#@+++++@@$$@@@+++....+.+.+.",
+"..@@$##@++...@##@++..++@##@@.+..@@#$#@+....+@@@++...+.+.+++.+#$%%%%$#++.+......+.+.+.....+...@$$#@....@@###@@....+.+.+..+@$#@@.@@@+##$@+@@@@@#$$$@@@@+.+..+@+...",
+".+@@$##@++.+@#$%#@+...@@#$#@...++##$#@+....+@@@..+++@@++@++.+#%%%%$#@....+.+...+.+....+....+.#%%#+.+.+@#####@.++.@.@.+..+@#$#@@@@@+@#$@@@##@@@#$$##@@@...++@@+..",
+"..+@###@+..@#$%%%$@@..@#$#@++...@#$$#@+.+.+.++++..+@##@@#@@++@%%&%%#@@...+@@@.+.++.@........+@$%#@....##$$#@@..+#@#@#@@.+######$@@@@#$$#$$#@@#$$$$$$@++..+@##++.",
+"..++@@@++.++$%%&%$#@.++@$##@..+.@####+............@#$$##$#@++@$$&%$#@...+@@#@..+.++..+.+.....#$$#@..+.@#$###@.@@##$$$#@.@@$#$#$$#@@@$#$$#$##@##$$$$$@+..++#$#+..",
+"....+++....+#$%%$#@+..+@#@@++...+@#@@++...+..+....+#$$#@#$@@.+@$%%%#@@...@#@@++.++.+......+..@#$@++..+@$$%##++.@#$$$%$#++@##$$$%$@@@##$#$$##@@#$$%%$#+.++@#$#@+.",
+"..+........++@$$$@+...+++++...+..+@+...........+...@$$$#$$$@.++#%%$#@....+@@..++.+++.@.+.....+@@+.....@$%%$@@.+@#$$$%%@+.@@#$#%%$@+@#$###$#@@@@$$$%%#@.+@####++.",
+"........+..++##$@@.+.................+..+.+.......+@#$$$$$$@..+@%%%#@@+......+.++..@@#@+..+.....+....+@#$$#@+.+@#$$$%$@+.@###$$%%@+@#######@+@##$$%%$+++@$$##@++",
+".+.+.+.....+@#$$##@+..+..+.+...+..+.........+..+..+@$$$$$$$@+.@#%%%$#.....+.++.++.@@#$#@..........+....@##@+..+@###$$#@..@@##$$%%@+@@#@####@+@###$%%#+.@@#$#$#@.",
+"........+.++#$$$$$@+.................+.............@#$$#@@@+..@$%%%$#@++..++.++.+..#$%#@+...+.+................@@@##@@+..+@@@@#$$+++@++@###@+@@@@@$$#+.+@#$$$#@+",
+".....+.....++@#@#@@+...+...+.+..+.+....+.+..+..+.+.@##@@+..+.++@$$$##+...+.++.++.++@#$@+........+.+.+....+..+..+.@..+....+.++++@@+....++@@@+.+.++++@++..+@#$#@+.",
+".+.+..........++++..+....+..........+..............+@@@+.+.....@@@@@+..+.++.++.++..@##@+..@...@.+......+.+..........................+...++....+..+.+......@@@+..",
 ".+.@++.+...+..+++.....+++@.+..+.++@@+....+..+....+..++@++.......+...+..+.++.++.+.++@@@...+.+.++@@.@.+.+@@@@.+..+.@.++.+..+++++...+....++++.+..++@@++.+.+....+...",
-"..+@@@+.......+@@++....@@@++....+@@@@@+....+++@+.....@@@@+..+.++@@@@@+.++.@@@@++..@$$@@++.++.+@@@@....@@$$@@....+@@@+@+...+@@+++....+.+@@++....@$@@+.....++++++.",
-".++@$@++...+++@$@+..+++@$$@@..++@###$+..++@@@@@+.+.++@$$@+....@@####$@.@@$$$$$@.@+@$#$$@.+.@@@$$$$+.+@@$##$@@.+@@$$$$@@..+@@$$@+.+..++@$@@+..++@$$$@+.++++@@@++.",
-".+@$#$@.+...@@#$@+...+@$##@++..@@###$@+..+@$$$@@...+@$##@@...+@#%%%%#@@$$##%##$+@@##%##$@@.@###%#$@+.$###%#$@++@#####$@+..@$##$@+..++$$#$@@.++@$###@++..$$$$$$++",
-".+@#%##+...+@###$@...@$###$@...@$#%#$@...@$#%#$@...+@###$++...@#%%###@@$%#$$#$$@@$#%%%%%@+@@#%%%%#$++$#%%%%%@++$#%%%%%@+.@@####@@+.+@##%#$@..+$$#%#$+.++$#%%#$+.",
-".+@#%%#@.+.+@#%%$@++.+@#%%$@+.++@#%%$@+..@@$%%$@+..+@#%%$@+..@$#%#%$$@$#%#@@@$@+@@####%%@.+$####%#@.+@####%#$.@$####%#@+.+@$%%#@+..+@$%%#@++.+@$%%#@++..@$#%#@@.",
-".+@##%#@+..+@##%#@.+.+@##%#@+..+@#%##$+..+@#%%#@+..+@##%#@+..@@%#%##@+@#%$@++++..@$####$@.@+$####$@+.@$####$@.+@$####$@...@@%%#++...@@#%#@....+$#%#@..+.+$#%#+.+",
-"++$##%##@+.@$##%##@.++$#%#%#@+.+$#%%#$@@.@$#%#%$@+++$#%#%$@++@$%%%##@@@#%$@.+.@.@@$#%##$@..@##%##$@.+@##%##$@+.@##%##@@+..+@#%$+....+$#%$++...+@#%$++....@#%$+..",
-".@#%#%%#$@+@#%#%##$@+@##%#%#$@+@#%##%#$@.@##%#%#$++@##%#%#$@@@%%%%#$@+@#%#$@$$@.+@#%#%#$@+.@##%##$@.+@$%#%#$@.+@##%#%$@+..+@#%$@+...+@#%$+....+@#%$@..+.+$#%$+..",
-"@##%##%%#@@$#%##%%#@@$%%##%%#@@$#%##%%#@@$%%##%%#@@$#%%#%%#@@##%%%#$$@+$#%##$#@+@@#%####@@@@#%####$@+$######@@@@#%####@++.@$#%#++..+@$#%#@++.++$%%$@+...+$%%#@+.",
-"+$%%###%#@@$%%#$#%#@@$%%###%#@@#%%#$#%#@@$%##$#%#@@#%##$#%#@$#%#%%%##@+@$####$@+@$%###%#$@@$%%##%#$@@$#%##%#$@@$%####%$@++@##%#@@.+.@#%%$@+..+@$#%#@@++.$$%%#$+.",
-"@$##$$##$@@@##$$###@@@##$$###@@@$#$@###@@@##$$$##@+@##$$###@@$######$@..@$##$@+.@$#%####$@@$###$##$+@$###$##@@@$#%####@+.+@$###@++.@@$###$++.+@$#%$$+..+@$##$$++",
-".+@@@@@@@+++@@@@@@@+++@@@@@@@++@@@@@@@@+++@@@@@@+++@@@@@@@@@@@@@$$$$@@+.@$$$@....@@$@@$@@.+@$$$$@@@..@@$$$@$@.+@@@@@@@@...@@@@$+....+@$$@@+..+@@@$@+++..+@$$@+..",
+"..+@@@+.......+@@++....@@@++....+@@@@@+....+++@+.....@@@@+..+.++@@@@@+.++.@@@@++..@##@@++.++.+@@@@....@@##@@....+@@@+@+...+@@+++....+.+@@++....@#@@+.....++++++.",
+".++@#@++...+++@#@+..+++@##@@..++@$$$#+..++@@@@@+.+.++@##@+....@@$$$$#@.@@#####@.@+@#$##@.+.@@@####+.+@@#$$#@@.+@@####@@..+@@##@+.+..++@#@@+..++@###@+.++++@@@++.",
+".+@#$#@.+...@@$#@+...+@#$$@++..@@$$$#@+..+@###@@...+@#$$@@...+@$%%%%$@@##$$%$$#+@@$$%$$#@@.@$$$%$#@+.#$$$%$#@++@$$$$$#@+..@#$$#@+..++##$#@@.++@#$$$@++..######++",
+".+@$%$$+...+@$$$#@...@#$$$#@...@#$%$#@...@#$%$#@...+@$$$#++...@$%%$$$@@#%$##$##@@#$%%%%%@+@@$%%%%$#++#$%%%%%@++#$%%%%%@+.@@$$$$@@+.+@$$%$#@..+##$%$#+.++#$%%$#+.",
+".+@$%%$@.+.+@$%%#@++.+@$%%#@+.++@$%%#@+..@@#%%#@+..+@$%%#@+..@#$%$%##@#$%$@@@#@+@@$$$$%%@.+#$$$$%$@.+@$$$$%$#.@#$$$$%$@+.+@#%%$@+..+@#%%$@++.+@#%%$@++..@#$%$@@.",
+".+@$$%$@+..+@$$%$@.+.+@$$%$@+..+@$%$$#+..+@$%%$@+..+@$$%$@+..@@%$%$$@+@$%#@++++..@#$$$$#@.@+#$$$$#@+.@#$$$$#@.+@#$$$$#@...@@%%$++...@@$%$@....+#$%$@..+.+#$%$+.+",
+"++#$$%$$@+.@#$$%$$@.++#$%$%$@+.+#$%%$#@@.@#$%$%#@+++#$%$%#@++@#%%%$$@@@$%#@.+.@.@@#$%$$#@..@$$%$$#@.+@$$%$$#@+.@$$%$$@@+..+@$%#+....+#$%#++...+@$%#++....@$%#+..",
+".@$%$%%$#@+@$%$%$$#@+@$$%$%$#@+@$%$$%$#@.@$$%$%$#++@$$%$%$#@@@%%%%$#@+@$%$#@##@.+@$%$%$#@+.@$$%$$#@.+@#%$%$#@.+@$$%$%#@+..+@$%#@+...+@$%#+....+@$%#@..+.+#$%#+..",
+"@$$%$$%%$@@#$%$$%%$@@#%%$$%%$@@#$%$$%%$@@#%%$$%%$@@#$%%$%%$@@$$%%%$##@+#$%$$#$@+@@$%$$$$@@@@$%$$$$#@+#$$$$$$@@@@$%$$$$@++.@#$%$++..+@#$%$@++.++#%%#@+...+#%%$@+.",
+"+#%%$$$%$@@#%%$#$%$@@#%%$$$%$@@$%%$#$%$@@#%$$#$%$@@$%$$#$%$@#$%$%%%$$@+@#$$$$#@+@#%$$$%$#@@#%%$$%$#@@#$%$$%$#@@#%$$$$%#@++@$$%$@@.+.@$%%#@+..+@#$%$@@++.##%%$#+.",
+"@#$$##$$#@@@$$##$$$@@@$$##$$$@@@#$#@$$$@@@$$###$$@+@$$##$$$@@#$$$$$$#@..@#$$#@+.@#$%$$$$#@@#$$$#$$#+@#$$$#$$@@@#$%$$$$@+.+@#$$$@++.@@#$$$#++.+@#$%##+..+@#$$##++",
+".+@@@@@@@+++@@@@@@@+++@@@@@@@++@@@@@@@@+++@@@@@@+++@@@@@@@@@@@@@####@@+.@###@....@@#@@#@@.+@####@@@..@@###@#@.+@@@@@@@@...@@@@#+....+@##@@+..+@@@#@+++..+@##@+..",
 ".++.+.++....++@+@++....+.+.+....+.+.+.....++++.+....+++++++..+.+++.+.....@@@+.....+.+.+.....+++@++.....+++@+....+@@@++.+....+++.+..+..++@.+.....++.+......+.++..",
-"..+.+..+..+.@@$$@@@.+.++++........++@+.....++@.+.....++@+.+......+............+.........+...+++.....+...+++......+@@.....+..........+.@@@+...+.+.....+..+.+.....",
-"..+@++++.+.@$$###$++..+@@+++..+..++@@++.+.+@$@@+.+.+@@$$$@+..+.+@++@.+.+........+...+.......+@@@++......@@@@+.+.@@$$@+....+++++.+....@@$@++.+.++++.......+@@@+..",
-"+@@$@$@@@++@######@+..@@$@+.....++@$@+....+@#$$@....@$###@@..++@@@@@....+.+.+.+...+.++@++..+@$$@@+.+.++@@@@@...++@#$$@+.+.+@@@@@+.++@@$$$@+.++@@@++..+.++$$#$@+.",
-"+$###$##$@@$######@@.+@$$#@@++..@@$#$@@..+@$$#$@+.+@@$#%#$@+..@$$$$@@..+@@.+.@@.++.@@@$@++.+$$$$$@@+.@@@$#$@@.+@@#$#$$+++@@$$$$@++@@$$$#$$+++@##$@@++...@$###@+.",
-"@$%%##$##@@$#%##%%#@++$##$#$@.@@@####$@.++$#$###@.+@$#####@.@@$$$##$@+.@@$@@$$@.++@$$###@@+$$#$$##@@+@##$$##$@+$##$$##@++$#$$$##$@@$##$###$++@#%##$+++++$##%%$@+",
-"@$#%##$$$@@$###%%%$+@@######@++$######@++@$#####@+@@#$$###$.@@##$###$++@$##$##@++$####%%@@@###$$#%$@@$##$##%$@@$##$####@@$##$$#%$@@#%#####@++@$%###$@+.+$$%#%#@.",
-"@#%%#$$$#@@$##%%%%#@@###$$##$@@#%#$$##$@@###@$##$@@###$$##$@@###$$##$@.@$#%#%$@+@$%###%#$@@$#$$$#%$@@$#$@$%%$@@$#$@$%%$@@##$@$#%#@@$######@+.@$##$##$@++$#%%%#$+",
-"@$%%#$$$$$@$$###%%$@@#%#@@$#$@@#%#@@$$$@@#%#@@$#$@@#%#@@$$$@$#%$$@$#$@.+$$%%%$@+@#%%#$##$@@$$$@@##$@@$#$@@#%$@@$#$@$#%#@@@#$@$%%$++@$#%##@+.+@$#$$##$@.+$$###%$@",
-"+$##$$$$$$@$$###%%#@@###@@$#$@$#%$@@##$@@###@@$#$@$#%$@@##@@@#%$@@$#$@++$#%##$@.@#%#$$$#$@@$$$$$#%$@+@$$@$#%$@+@#@@$#%$@@@$$@$#%$+.+$#%%$@+..@$%####$@.@$####%#@",
-"+$###$$#$@@#####%##@@###$$##$@@###$$##$@@###$$##$@@$##$$##$@@###$$##$@.@$#####@@@##%###$$@@@#$$#%%@++$$#$#%#$++$$###%#$+@$#$##%#$+.+@#%%$++.+$#%%###@++@$####%#@",
-"+$%%%%%#$@@#%#$#%%$@+@$#####@++@$##%##@@+@$#####@+@@$##%##@@@@$##%##@+.@$$$@$$@@+$#%#%%#@.@@$#%%##@+.@$##%%#@+.@$##%%#@+.@$#%%%#@+.+@%%%$@+.@$%%##$@+..@####%%#@",
-"@$#%#%##$+@$%#$$##@+.+@##%#$@..@@$%##$@+.+@##%#$@.++@$#%#$@..@$$%##$@...@@@.@+@.@$$##%#$@..@@#%%#$@.++@#%##$++.+$#%##$@.+@$##%#$@..+$#%%#++.+$###@+...+@#%####$@",
-"+@@$$$@@+.+@$@@@@@++..+@@$@@.+.++@@$@@....+@@@@++..++@@@@++...+@@$@+..+..........@@$$@@@...++@@$@@...++@$@@+....@@$$@@...++$$@@@.+.++@$@@+..+@$@@+..+..+@@@@$@++",
+"..+.+..+..+.@@##@@@.+.++++........++@+.....++@.+.....++@+.+......+............+.........+...+++.....+...+++......+@@.....+..........+.@@@+...+.+.....+..+.+.....",
+"..+@++++.+.@##$$$#++..+@@+++..+..++@@++.+.+@#@@+.+.+@@###@+..+.+@++@.+.+........+...+.......+@@@++......@@@@+.+.@@##@+....+++++.+....@@#@++.+.++++.......+@@@+..",
+"+@@#@#@@@++@$$$$$$@+..@@#@+.....++@#@+....+@$##@....@#$$$@@..++@@@@@....+.+.+.+...+.++@++..+@##@@+.+.++@@@@@...++@$##@+.+.+@@@@@+.++@@###@+.++@@@++..+.++##$#@+.",
+"+#$$$#$$#@@#$$$$$$@@.+@##$@@++..@@#$#@@..+@##$#@+.+@@#$%$#@+..@####@@..+@@.+.@@.++.@@@#@++.+#####@@+.@@@#$#@@.+@@$#$##+++@@####@++@@###$##+++@$$#@@++...@#$$$@+.",
+"@#%%$$#$$@@#$%$$%%$@++#$$#$#@.@@@$$$$#@.++#$#$$$@.+@#$$$$$@.@@###$$#@+.@@#@@##@.++@##$$$@@+##$##$$@@+@$$##$$#@+#$$##$$@++#$###$$#@@#$$#$$$#++@$%$$#+++++#$$%%#@+",
+"@#$%$$###@@#$$$%%%#+@@$$$$$$@++#$$$$$$@++@#$$$$$@+@@$##$$$#.@@$$#$$$#++@#$$#$$@++#$$$$%%@@@$$$##$%#@@#$$#$$%#@@#$$#$$$$@@#$$##$%#@@$%$$$$$@++@#%$$$#@+.+##%$%$@.",
+"@$%%$###$@@#$$%%%%$@@$$$##$$#@@$%$##$$#@@$$$@#$$#@@$$$##$$#@@$$$##$$#@.@#$%$%#@+@#%$$$%$#@@#$###$%#@@#$#@#%%#@@#$#@#%%#@@$$#@#$%$@@#$$$$$$@+.@#$$#$$#@++#$%%%$#+",
+"@#%%$#####@##$$$%%#@@$%$@@#$#@@$%$@@###@@$%$@@#$#@@$%$@@###@#$%##@#$#@.+##%%%#@+@$%%$#$$#@@###@@$$#@@#$#@@$%#@@#$#@#$%$@@@$#@#%%#++@#$%$$@+.+@#$##$$#@.+##$$$%#@",
+"+#$$######@##$$$%%$@@$$$@@#$#@#$%#@@$$#@@$$$@@#$#@#$%#@@$$@@@$%#@@#$#@++#$%$$#@.@$%$###$#@@#####$%#@+@##@#$%#@+@$@@#$%#@@@##@#$%#+.+#$%%#@+..@#%$$$$#@.@#$$$$%$@",
+"+#$$$##$#@@$$$$$%$$@@$$$##$$#@@$$$##$$#@@$$$##$$#@@#$$##$$#@@$$$##$$#@.@#$$$$$@@@$$%$$$##@@@$##$%%@++##$#$%$#++##$$$%$#+@#$#$$%$#+.+@$%%#++.+#$%%$$$@++@#$$$$%$@",
+"+#%%%%%$#@@$%$#$%%#@+@#$$$$$@++@#$$%$$@@+@#$$$$$@+@@#$$%$$@@@@#$$%$$@+.@###@##@@+#$%$%%$@.@@#$%%$$@+.@#$$%%$@+.@#$$%%$@+.@#$%%%$@+.+@%%%#@+.@#%%$$#@+..@$$$$%%$@",
+"@#$%$%$$#+@#%$##$$@+.+@$$%$#@..@@#%$$#@+.+@$$%$#@.++@#$%$#@..@##%$$#@...@@@.@+@.@##$$%$#@..@@$%%$#@.++@$%$$#++.+#$%$$#@.+@#$$%$#@..+#$%%$++.+#$$$@+...+@$%$$$$#@",
+"+@@###@@+.+@#@@@@@++..+@@#@@.+.++@@#@@....+@@@@++..++@@@@++...+@@#@+..+..........@@##@@@...++@@#@@...++@#@@+....@@##@@...++##@@@.+.++@#@@+..+@#@@+..+..+@@@@#@++",
 "..+++++..+...+.+.+......++........++.+.+.....++.......++.........+.+...............+.+..+.....+.+.+....+.++.+.....+.+......+.++......+.+..+.+..+.+.......++.+...",
 "...........+...+...+.+.....+....+........+.........+...+..+...+.......+.+.+.+...+..+.......+............+.....+.+.....+....+...........+.....+....+...+.......+.",
 "+.++++.+.......+++.....++++..+...+++.+.....+.+..+....+@@+..+.......+..............+.@++.+....+.+@@+..+..+++........+.....+.+++.+.+.+...++++....+++.+.......+....",
-"..++@+...+.+.++@@@....++@@@....++@@$@+.+..+++++....+.+@@@.....+.+...++.+.++.@.....@@@+........@@@+....++@@@+....+++++.+...++@+......+.++@+...+++@@+.+..+++++....",
-"..+@$@@+.....@@$@@.+..+@$$@++..+@###$++...+@@@@++...+@@$@++..+.+.+.+.++.++..+.++..+@$$@+.+.+.+@@@@++...@$$@+++..+++@@++...+@$@++.....+@@@++..+@$$@+.....++@@++..",
-".++$$$@+..+++@$$$@..+.@$##$@...+@###$@+.++@$$$@@..+.@$##@@..+@@@@@@@@.+++@@$$@@.+.@$##$@...++@$#$@..++@$##$@+.+.@$$$$@@.+.+@#@@+..+.+@$$@+...+@$#$@+.+.+$$$$+.+.",
-"++@##%#@+..+@###$@+..@@####@+.++$#%%#@+..+@####@@..@@$%##@++.$$####$$@.@@#$###$@+@$##%#$$@.@@##%##@+.+$#####@++@$#####@+.+@$##@+....+$##@++..+@##$++...+@###@...",
-".+$##%#$@.++$####$@.++$###%$@..@$##%##+.+@$###%$@.++$##%#$@+@$#%%%###@@@#%#$###@+@#%##%%$@@@#%#%#%$@+@#%###%#++@%%##%%#+..+$#%@+..+.+$#%$....+@#%#@+.+.+@#%#@+..",
-"+@$###%#++.@$##%%$@+.@$###%$@.+@$#%#%$++.@$##%%$@+.@$##%%$@.@$$%%%###@@$%##$$#$@@$%%###%#@@$#%##%%#@+$#%##%##@@$%%###%#@+.+$#%$+....+$#%$+.+.+@$%#@.....+$%%$...",
-"+@#%%##$@++@###%##@.+@#%#%#$@+.@###%##++.@#%##%$@+.@#%###$$+@$#%%%###$+@%##$$$$@@$%%###%#@@#%%#####@+$%%#####@@$%%#####@..+@#%$@....+@%%$@....@$%#$.+.+.@$%#$+..",
-"+$#%###$@.+@%%###$@++$#%####@+@$%%###$@+@$#%#%##@.@$#%###$@@@##%%%%##@.@####$#$@@$#%####$@+$#%####$@@$#%%####@+$#%%###$@+.@$#%#@++.++$#%$@+..++#%#$+...+@$%#$++.",
-"+$#%##%#$+@@#%##%#@++$#%####@++@#%####@+.$######@@.@%%##%$$@@#%%%%%##@+.$$%%#$$..@#####%$@+@#######++@####%#$@+@#######+++@$%##@+..+@#%%#@@+.+@#%#$$++.+$#%%$@+.",
-"++$#$##$@++@$#$#$$@+.@$#$##$@++@$#$##$@++@$#$##$@++@$$#$#$@@+$###$#$$@..@@###@+@.+@$#$$$@+.+@$$##$@+.+@$####@+..@$$#$$@+.+@$###@++.+@$$#$$+.++$$##$@+..+@$##$$+.",
-".++$@@$@@..++@@@@@++.++@@@@@+.++@@@@@@+..++@@@@@@...@@$@@@+..@@@@@@@+....@##$@....++@@@@+...+@@@@@....++@@@+.....@@@@@....+@@@@@+...@@@$@@+.+.@@@$@++..++@@$@++.",
+"..++@+...+.+.++@@@....++@@@....++@@#@+.+..+++++....+.+@@@.....+.+...++.+.++.@.....@@@+........@@@+....++@@@+....+++++.+...++@+......+.++@+...+++@@+.+..+++++....",
+"..+@#@@+.....@@#@@.+..+@##@++..+@$$$#++...+@@@@++...+@@#@++..+.+.+.+.++.++..+.++..+@##@+.+.+.+@@@@++...@##@+++..+++@@++...+@#@++.....+@@@++..+@##@+.....++@@++..",
+".++###@+..+++@###@..+.@#$$#@...+@$$$#@+.++@###@@..+.@#$$@@..+@@@@@@@@.+++@@##@@.+.@#$$#@...++@#$#@..++@#$$#@+.+.@####@@.+.+@$@@+..+.+@##@+...+@#$#@+.+.+####+.+.",
+"++@$$%$@+..+@$$$#@+..@@$$$$@+.++#$%%$@+..+@$$$$@@..@@#%$$@++.##$$$$##@.@@$#$$$#@+@#$$%$##@.@@$$%$$@+.+#$$$$$@++@#$$$$$@+.+@#$$@+....+#$$@++..+@$$#++...+@$$$@...",
+".+#$$%$#@.++#$$$$#@.++#$$$%#@..@#$$%$$+.+@#$$$%#@.++#$$%$#@+@#$%%%$$$@@@$%$#$$$@+@$%$$%%#@@@$%$%$%#@+@$%$$$%$++@%%$$%%$+..+#$%@+..+.+#$%#....+@$%$@+.+.+@$%$@+..",
+"+@#$$$%$++.@#$$%%#@+.@#$$$%#@.+@#$%$%#++.@#$$%%#@+.@#$$%%#@.@##%%%$$$@@#%$$##$#@@#%%$$$%$@@#$%$$%%$@+#$%$$%$$@@#%%$$$%$@+.+#$%#+....+#$%#+.+.+@#%$@.....+#%%#...",
+"+@$%%$$#@++@$$$%$$@.+@$%$%$#@+.@$$$%$$++.@$%$$%#@+.@$%$$$##+@#$%%%$$$#+@%$$####@@#%%$$$%$@@$%%$$$$$@+#%%$$$$$@@#%%$$$$$@..+@$%#@....+@%%#@....@#%$#.+.+.@#%$#+..",
+"+#$%$$$#@.+@%%$$$#@++#$%$$$$@+@#%%$$$#@+@#$%$%$$@.@#$%$$$#@@@$$%%%%$$@.@$$$$#$#@@#$%$$$$#@+#$%$$$$#@@#$%%$$$$@+#$%%$$$#@+.@#$%$@++.++#$%#@+..++$%$#+...+@#%$#++.",
+"+#$%$$%$#+@@$%$$%$@++#$%$$$$@++@$%$$$$@+.#$$$$$$@@.@%%$$%##@@$%%%%%$$@+.##%%$##..@$$$$$%#@+@$$$$$$$++@$$$$%$#@+@$$$$$$$+++@#%$$@+..+@$%%$@@+.+@$%$##++.+#$%%#@+.",
+"++#$#$$#@++@#$#$##@+.@#$#$$#@++@#$#$$#@++@#$#$$#@++@##$#$#@@+#$$$#$##@..@@$$$@+@.+@#$###@+.+@##$$#@+.+@#$$$$@+..@##$##@+.+@#$$$@++.+@##$##+.++##$$#@+..+@#$$##+.",
+".++#@@#@@..++@@@@@++.++@@@@@+.++@@@@@@+..++@@@@@@...@@#@@@+..@@@@@@@+....@$$#@....++@@@@+...+@@@@@....++@@@+.....@@@@@....+@@@@@+...@@@#@@+.+.@@@#@++..++@@#@++.",
 "...++++.+....+++++......++++....+.+++.+...+.++++...+...+..+...+.+....+.+.+@@@+......+.++......+.+..+......+.+..+..+++..+....++++.....++++....+.+++.+.....++.+...",
 ".+.+.++..............+..............+................+.+..........+............+.........+....+......+.+..+.........+............+......+..+.+++.+...+..........",
-"+@$$$@@@+.+.+++@+++...++@+..+.+.+.+++++.+.++@@@@.+....@@@@@.+.+....+...+.+........+.+.......++++.+......++++.+.+.+@++...+.+........+.+.++++.+$$$+...........+...",
-"+@#%#%#$@..++@@$@+....+@@@+......++@@@.....@##@@...++@@$$@+...++++.@......@+.+.+.....+.+.+..+@@@.+....+++@@+....+@@@@+....++++++.....++@@@+++###@+++..++.+++.++.",
-"+$#%%##$@+.+@$##$@++..@@$@++.....+@$$@+..+@@###@++..@@#$#$@+...@@@@@++...+@@@.......++@@+..+@@$@@+++.++@@$@@+..+@$$#@+++.+@@@@@+++..+@@$$@+++@#$$@+++...@@@@@+++",
-"+$$##%##@+.@#####@..+.@$#$$@+.+.+@##$@+..+@$##$@+..+@$###$@.++@$$$$@+..+.@$$$+.+.+@@@$@@@@+@@$$$@@+.++@$$#$@@+++@#$#$@@.+@@$$$$$++++@@$$$$@++@$##$$@+.++$$$$$$@+",
-"+@##%%%#@@@$##%##$@+.@@####@@+.+@####$@+.@@###%$@+.+@####$@+.+$$###$@@..@$##@@+..+@$####$@+$##$$#$@++$##$$#$@+@@##$$$#@+@$##$@#$@+@$$#$$###++@$%####@++$##$$###@",
-".@#%%%%&#@@$%%####@.+@####%#@@+@######$++@####%#$@+@##%#%#$++@####%#$@+@$$###$@.+@###%%##@@$##$@$#@@+$##$$$#@@@$##$$$$$@+$###@$#@@+$###$###++@$%###%$++$%##$###@",
-"+$##%#%%#@@$######@++$#%#####@+$#######@+@%%###%#@@$%#####$@+$%%#$#%#@+@#%%%#$$++$%%##%%#@+@##$$$#@++@##$$$$@@@$##$$$#@@@$##$$$$@@+@######$@.@######$++@######$@",
-"+$%%#$#%#@@@###$$#@@+$%##$#%#@+$%#$$#%#@@#%##$#%#@@$%#$$#%#@@$%%#$#%#@.@$####$@.@$%%##%%#@@@$#$@$#@@+@$#$$$#$@+@$#$@$#@@+@##$$$#$+++$####$@+++#####%$+.+$####$@+",
-"+$%%###%#@@$###$##$+@$%%#####@+$#%###%#@+@%##$#%#@+$%%#$#%#@@$#%###%#@+.@$##$@+.+$%%%##%#@+@$#####$++@$#$##$$++@$###$#$++@$$###$$+.+@$%%#@+.+@$%###$++.+@$%%#$..",
-".@#%#%%#$@+$#######@+@#%%#%#$++@#%#%###@+@#%%%%#$@.@#%%%%#$@.$#%%#%#$@...@$$@...+@%%%%%#$@.@@###%##@.+@##%%#$@++@##%%##+.+$###%%$@+.@#%%$+..+@###$@@....$$%%$@..",
-"++$#%%##@+@$%####%$@.@@#%%##@+.@$#%%##@+.@$###%$@+++$##%#$@+.@@#%%%$@@...@@@@+..+@##%%##@.++@#%%%#$@++@#%#%%$+.+@$#%%#$@+.@##%%##+++$#%%$++.+$$%$$++..++$#%%$+..",
-".++@@$@@+.++$$@@@$@+.++@@$@@+...+@@$@@+...@@$$@@+...@@$$@@....@@@$@@+.....++....+@$$$$@@@...++@$$$@+..+@@$$$@+..+@@$$$@+..+@@$$$@+++$###@...+@$$$+..+..+$###@+..",
-"....+.+.....+.+.++......+++..+.+..+.+..+...++.+......++++++.....+.+....+...+.....++@+++.......+.++.+....++.+......++.+......++.+...+@$$@+.+..+@@+.+....+@$$@+...",
+"+@###@@@+.+.+++@+++...++@+..+.+.+.+++++.+.++@@@@.+....@@@@@.+.+....+...+.+........+.+.......++++.+......++++.+.+.+@++...+.+........+.+.++++.+###+...........+...",
+"+@$%$%$#@..++@@#@+....+@@@+......++@@@.....@$$@@...++@@##@+...++++.@......@+.+.+.....+.+.+..+@@@.+....+++@@+....+@@@@+....++++++.....++@@@+++$$$@+++..++.+++.++.",
+"+#$%%$$#@+.+@#$$#@++..@@#@++.....+@##@+..+@@$$$@++..@@$#$#@+...@@@@@++...+@@@.......++@@+..+@@#@@+++.++@@#@@+..+@##$@+++.+@@@@@+++..+@@##@+++@$##@+++...@@@@@+++",
+"+##$$%$$@+.@$$$$$@..+.@#$##@+.+.+@$$#@+..+@#$$#@+..+@#$$$#@.++@####@+..+.@###+.+.+@@@#@@@@+@@###@@+.++@##$#@@+++@$#$#@@.+@@#####++++@@####@++@#$$##@+.++######@+",
+"+@$$%%%$@@@#$$%$$#@+.@@$$$$@@+.+@$$$$#@+.@@$$$%#@+.+@$$$$#@+.+##$$$#@@..@#$$@@+..+@#$$$$#@+#$$##$#@++#$$##$#@+@@$$###$@+@#$$#@$#@+@##$##$$$++@#%$$$$@++#$$##$$$@",
+".@$%%%%&$@@#%%$$$$@.+@$$$$%$@@+@$$$$$$#++@$$$$%$#@+@$$%$%$#++@$$$$%$#@+@##$$$#@.+@$$$%%$$@@#$$#@#$@@+#$$###$@@@#$$#####@+#$$$@#$@@+#$$$#$$$++@#%$$$%#++#%$$#$$$@",
+"+#$$%$%%$@@#$$$$$$@++#$%$$$$$@+#$$$$$$$@+@%%$$$%$@@#%$$$$$#@+#%%$#$%$@+@$%%%$##++#%%$$%%$@+@$$###$@++@$$####@@@#$$###$@@@#$$####@@+@$$$$$$#@.@$$$$$$#++@$$$$$$#@",
+"+#%%$#$%$@@@$$$##$@@+#%$$#$%$@+#%$##$%$@@$%$$#$%$@@#%$##$%$@@#%%$#$%$@.@#$$$$#@.@#%%$$%%$@@@#$#@#$@@+@#$###$#@+@#$#@#$@@+@$$###$#+++#$$$$#@+++$$$$$%#+.+#$$$$#@+",
+"+#%%$$$%$@@#$$$#$$#+@#%%$$$$$@+#$%$$$%$@+@%$$#$%$@+#%%$#$%$@@#$%$$$%$@+.@#$$#@+.+#%%%$$%$@+@#$$$$$#++@#$#$$##++@#$$$#$#++@##$$$##+.+@#%%$@+.+@#%$$$#++.+@#%%$#..",
+".@$%$%%$#@+#$$$$$$$@+@$%%$%$#++@$%$%$$$@+@$%%%%$#@.@$%%%%$#@.#$%%$%$#@...@##@...+@%%%%%$#@.@@$$$%$$@.+@$$%%$#@++@$$%%$$+.+#$$$%%#@+.@$%%#+..+@$$$#@@....##%%#@..",
+"++#$%%$$@+@#%$$$$%#@.@@$%%$$@+.@#$%%$$@+.@#$$$%#@+++#$$%$#@+.@@$%%%#@@...@@@@+..+@$$%%$$@.++@$%%%$#@++@$%$%%#+.+@#$%%$#@+.@$$%%$$+++#$%%#++.+##%##++..++#$%%#+..",
+".++@@#@@+.++##@@@#@+.++@@#@@+...+@@#@@+...@@##@@+...@@##@@....@@@#@@+.....++....+@####@@@...++@###@+..+@@###@+..+@@###@+..+@@###@+++#$$$@...+@###+..+..+#$$$@+..",
+"....+.+.....+.+.++......+++..+.+..+.+..+...++.+......++++++.....+.+....+...+.....++@+++.......+.++.+....++.+......++.+......++.+...+@##@+.+..+@@+.+....+@##@+...",
 ".+......+..+..........+.........................+.++@@+@+++.......+.+...+.+.+.......+...+.+.........................................+++.+..+++@+..+.+.....+.+...",
-"...+.+....+@@++....+......+....++++++++..+..+......+$$$$$#@@+.+..+.@...+.@@@@@@.+..++@+.....+.+.++.+..+.++..+.+.+..+.+.+.+.+.+.+.+....++.+..+$$$@++.+...+....+..",
-"...++++...@@#@++.....+++++.+.++@@$$$$$@+..@+++....@@#%$##%#@....+@$@+..+@@$$$$@..+.@@$@++.....++@$@+..+++@+.....++++++...++@@@+++.+++@@@@@++@#%$$$$@++..++++.@+.",
-"+..@$@@+.+@###@+.++++.@$$@@++.@$%#%%##@@..+@@@.+..+$#%%#%%#@++@@@$#$@+..@$$$#$@+++@$#%#@+++...+@##$+++@@#$@++.+@$$$$$#@++@$###$$@@.+$$$$#$@+@#%#$###$+++@$@@$$@+",
-"..+@##@+..@#%#@@++@++@$#%#$@@+@@$##%#$@+.+@@$@...+@$#%%%%%%$@@@$$#%$@.@@$$##%#@@+@##%%#$@+....@@#%#@+@$####@@++$#%%%%%#@+$#%%%%%#$+@$#%#%%$@@$#%###%$+.+@#$$##$@",
-"...@###@+.+@##$@@$$@@###%###@@@$$###$@@+..@$$@+...@#%%#%%%#$@$####%#@@@$$#%%#%$@@#%%%%%#$@.+.+@####@@###%%##@@@#%%##%%#@@@##%%%%$@+$#%#%%%#$@$#%#$#%$@+.$####%$@",
-".+.@$##@..+@###$###$####$###$@@@$###$@@+.+@$$@+..+@$#%#%%%#@@$$%%###$@@$$%%#%#$@@#%%%%##$@+..+@###$@@$##%%##$+@#%#$$#%#@++@$###$+++@$###%%$@$#%%#$$#$+.++#%###@+",
-"++@@$##@@..+$###$#$@##$$@#$##@@$@$%##@@@..@##@+...@$#%#%%#$@.+@####$@@@@$###%##@@#%%&%##$@+...@####@@####%#$@++$%#$@#%%@..+@$$$@...+$####%$@@##%#$$$$++.@$%%#$@.",
-"+$$$$##$@..++$##$@@@$##$$##$#@++@@#$@@+..+@##$+...+@#%#%##$@..+$##$$@+.@@$###%$@@$#%%%##@@.+++@$###@@$#%###@+.@$%#$@#%#@+..+@$$@++.@$#####$++$$#$$$$$@+.$#%%#$+.",
-"$#%#$###@+..+$###@++@##$@$##$@+.+@$$@@.+..@$%$@+..+@$####$@++.+@##$@@.+.@$$$##$@@@##%%#$@++.@@$##%#$@$#%#$#@+++$%%#$#%#@+..++@$@.+.+@$##%#$.++$$#$#$$@@$$#%%#$++",
-"$#%%###%#@+..+$#$$@@@$##$####+..+@$$@@....@$$$@+...@$##$$@+....@$$$@@..+@@$$$#$@++@$%%#@+++@$#####$@@@$##$$$@++$##$$#%#@....+@$$@+.+@$##%#$...@@$##$$+@#######@+",
-"####$$###@+.+.+@$#$@+@@$$#$$@++..@$#@@+..+.@$#@@+..+$##$@++.....@@@@@+..+$@@@$$++.+@##$+..+@$$#$$$@++@$$$$@@@++@#$$@$$@@.+...+@$@+..@$$###@+...+$$$$+++$#$$@$$$@",
-"$@@@@@@$$@....++@$$+.++@@@@@+....+@@@.......@$@@...++$$$+...+....+@+....++++++++...+@$@+..++@@@@+@++..+++@+@@+.+@+@+@@@+......+@+++.++@$$$@.+..+++++..+++++.+@@@",
+"...+.+....+@@++....+......+....++++++++..+..+......+#####$@@+.+..+.@...+.@@@@@@.+..++@+.....+.+.++.+..+.++..+.+.+..+.+.+.+.+.+.+.+....++.+..+###@++.+...+....+..",
+"...++++...@@$@++.....+++++.+.++@@#####@+..@+++....@@$%#$$%$@....+@#@+..+@@####@..+.@@#@++.....++@#@+..+++@+.....++++++...++@@@+++.+++@@@@@++@$%####@++..++++.@+.",
+"+..@#@@+.+@$$$@+.++++.@##@@++.@#%$%%$$@@..+@@@.+..+#$%%$%%$@++@@@#$#@+..@###$#@+++@#$%$@+++...+@$$#+++@@$#@++.+@#####$@++@#$$$##@@.+####$#@+@$%$#$$$#+++@#@@##@+",
+"..+@$$@+..@$%$@@++@++@#$%$#@@+@@#$$%$#@+.+@@#@...+@#$%%%%%%#@@@##$%#@.@@##$$%$@@+@$$%%$#@+....@@$%$@+@#$$$$@@++#$%%%%%$@+#$%%%%%$#+@#$%$%%#@@#$%$$$%#+.+@$##$$#@",
+"...@$$$@+.+@$$#@@##@@$$$%$$$@@@##$$$#@@+..@##@+...@$%%$%%%$#@#$$$$%$@@@##$%%$%#@@$%%%%%$#@.+.+@$$$$@@$$$%%$$@@@$%%$$%%$@@@$$%%%%#@+#$%$%%%$#@#$%$#$%#@+.#$$$$%#@",
+".+.@#$$@..+@$$$#$$$#$$$$#$$$#@@@#$$$#@@+.+@##@+..+@#$%$%%%$@@##%%$$$#@@##%%$%$#@@$%%%%$$#@+..+@$$$#@@#$$%%$$#+@$%$##$%$@++@#$$$#+++@#$$$%%#@#$%%$##$#+.++$%$$$@+",
+"++@@#$$@@..+#$$$#$#@$$##@$#$$@@#@#%$$@@@..@$$@+...@#$%$%%$#@.+@$$$$#@@@@#$$$%$$@@$%%&%$$#@+...@$$$$@@$$$$%$#@++#%$#@$%%@..+@###@...+#$$$$%#@@$$%$####++.@#%%$#@.",
+"+####$$#@..++#$$#@@@#$$##$$#$@++@@$#@@+..+@$$#+...+@$%$%$$#@..+#$$##@+.@@#$$$%#@@#$%%%$$@@.+++@#$$$@@#$%$$$@+.@#%$#@$%$@+..+@##@++.@#$$$$$#++##$#####@+.#$%%$#+.",
+"#$%$#$$$@+..+#$$$@++@$$#@#$$#@+.+@##@@.+..@#%#@+..+@#$$$$#@++.+@$$#@@.+.@###$$#@@@$$%%$#@++.@@#$$%$#@#$%$#$@+++#%%$#$%$@+..++@#@.+.+@#$$%$#.++##$#$##@@##$%%$#++",
+"#$%%$$$%$@+..+#$##@@@#$$#$$$$+..+@##@@....@###@+...@#$$##@+....@###@@..+@@###$#@++@#%%$@+++@#$$$$$#@@@#$$###@++#$$##$%$@....+@##@+.+@#$$%$#...@@#$$##+@$$$$$$$@+",
+"$$$$##$$$@+.+.+@#$#@+@@##$##@++..@#$@@+..+.@#$@@+..+#$$#@++.....@@@@@+..+#@@@##++.+@$$#+..+@##$###@++@####@@@++@$##@##@@.+...+@#@+..@##$$$@+...+####+++#$##@###@",
+"#@@@@@@##@....++@##+.++@@@@@+....+@@@.......@#@@...++###+...+....+@+....++++++++...+@#@+..++@@@@+@++..+++@+@@+.+@+@+@@@+......+@+++.++@###@.+..+++++..+++++.+@@@",
 "+++.++++++......++++...+++......+..@.++......@@.+....+.+.+....+.....+..............+@@+.....++.+................+....+.....+.+..+.....++@++.......+.+......+..+."};
index b0d1974d39b7d0a462c73445326a02dcb2be86e9..3f05d0f85ab958360778f044372b0a7f3cbac7df 100644 (file)
@@ -595,74 +595,74 @@ static unsigned char matrix1_bits[] = {
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xfe, 0xff, 0xff,
    0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfb, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x5f, 0x55, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff,
    0xd7, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xf5, 0xff, 0xf4, 0xff, 0x8b, 0xf6,
    0xff, 0xff, 0xff, 0x57, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x7f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x7f, 0xed, 0xff, 0xff, 0xff, 0xff, 0x52, 0xfe, 0xff,
    0xff, 0xff, 0xd7, 0xff, 0x7f, 0xfd, 0xff, 0xff, 0xff, 0xfa, 0xef, 0xff,
    0xfd, 0xff, 0x2f, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xd7, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf1, 0xff, 0x87, 0xfc, 0xff, 0xff,
+   0x5f, 0xef, 0xff, 0xff, 0xff, 0x7f, 0xf1, 0xff, 0x87, 0xfc, 0xff, 0xff,
    0xff, 0xa4, 0xb0, 0xff, 0xf8, 0x7f, 0xb3, 0xfd, 0x7f, 0xad, 0xff, 0x06,
    0xfe, 0x7f, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f,
-   0x42, 0xff, 0x0b, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0xff,
+   0x42, 0xff, 0x0b, 0xfe, 0x3f, 0xb1, 0xfe, 0xff, 0xff, 0xff, 0xb5, 0xff,
    0x97, 0xf4, 0x6f, 0xbb, 0xfe, 0xe0, 0xe2, 0xff, 0xfa, 0xff, 0xe6, 0xf2,
    0xff, 0xbf, 0xff, 0x55, 0xe8, 0xff, 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xdf, 0x48, 0xff, 0x4b, 0xfe, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xdf, 0x48, 0xff, 0x4b, 0xfe, 0xbf, 0x82, 0xfe, 0xff,
    0xff, 0x7f, 0xf1, 0xff, 0x26, 0xfe, 0xff, 0xef, 0xff, 0xaa, 0xf0, 0xff,
    0xf8, 0xff, 0xb3, 0xfd, 0xff, 0xde, 0xff, 0x87, 0xf6, 0x7f, 0xcd, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xe5, 0xfe, 0x2f, 0xfd,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x82, 0xfe, 0xe7, 0xfd, 0x2f, 0x88,
+   0x5f, 0x48, 0xff, 0xff, 0xff, 0x6f, 0x82, 0xfe, 0xe7, 0xfd, 0x2f, 0x88,
    0xfe, 0xe6, 0xed, 0xff, 0xf2, 0xff, 0xa6, 0xeb, 0xff, 0xfd, 0xbf, 0x38,
    0xa5, 0x7f, 0x4b, 0xff, 0xef, 0xfd, 0xef, 0xf6, 0xff, 0xff, 0xff, 0x4f,
-   0x24, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xca, 0xff,
+   0x24, 0xfe, 0xfb, 0xff, 0xdf, 0xc0, 0xfc, 0xff, 0xff, 0x5f, 0xca, 0xff,
    0x75, 0xff, 0x5f, 0xd1, 0xff, 0xab, 0xf4, 0xff, 0xfc, 0x7f, 0xb1, 0xfd,
    0xff, 0xbf, 0xff, 0x8a, 0xf2, 0xdf, 0xea, 0xff, 0x7f, 0xef, 0xbf, 0xdf,
-   0xff, 0xff, 0xff, 0x2b, 0x59, 0xfd, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x5f,
+   0xff, 0xff, 0xff, 0x2b, 0x59, 0xfd, 0xaf, 0xff, 0xaf, 0x54, 0xff, 0x5f,
    0xff, 0xdf, 0x7e, 0xff, 0xe7, 0xff, 0x7f, 0x37, 0xfd, 0xa7, 0xfd, 0xff,
    0xf0, 0xff, 0x96, 0xfe, 0xff, 0xff, 0x7f, 0xd5, 0xaa, 0xff, 0x8e, 0xff,
    0xd7, 0xdb, 0x27, 0x10, 0xfe, 0xff, 0xff, 0x6f, 0x8a, 0xfd, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xeb, 0xff, 0xde, 0xff, 0x57, 0x6f,
+   0x5f, 0x22, 0xfe, 0xff, 0xff, 0x6f, 0xeb, 0xff, 0xde, 0xff, 0x57, 0x6f,
    0xff, 0x75, 0xfc, 0xff, 0xfa, 0x3f, 0x8c, 0xf5, 0xff, 0xff, 0xff, 0x62,
    0xf7, 0x5f, 0xeb, 0xff, 0xad, 0xfa, 0x47, 0x45, 0xff, 0xbf, 0xff, 0x5b,
-   0xd7, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xfe, 0x5f, 0x5f, 0xff,
+   0xd7, 0xfe, 0xff, 0xff, 0x3f, 0x00, 0xfe, 0xaf, 0xfe, 0x5f, 0x5f, 0xff,
    0x75, 0xfd, 0xaf, 0xaa, 0xfe, 0xc7, 0xe9, 0xff, 0xf8, 0x7f, 0x99, 0xfe,
    0xff, 0xff, 0xbf, 0x67, 0xad, 0xff, 0x4e, 0xff, 0xdb, 0xd5, 0x4f, 0x90,
-   0xfe, 0x77, 0xfb, 0x5b, 0xcc, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xfe, 0x77, 0xfb, 0x5b, 0xcc, 0xfa, 0xff, 0xff, 0xaf, 0x92, 0xfe, 0xff,
    0xff, 0xef, 0xf6, 0xff, 0x80, 0xff, 0xdf, 0xde, 0xfe, 0x1f, 0xfd, 0xff,
    0xff, 0x7f, 0x74, 0xf1, 0xff, 0xff, 0x7f, 0xd5, 0xd5, 0x5f, 0xf5, 0x7f,
    0x73, 0xfb, 0xff, 0x5f, 0x7f, 0x89, 0xf0, 0x77, 0x5a, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xdf, 0xfe, 0xaf, 0xfe, 0xff, 0x15, 0xfd, 0xbf, 0xbb,
+   0x1f, 0x40, 0xff, 0xdf, 0xfe, 0xaf, 0xfe, 0xff, 0x15, 0xfd, 0xbf, 0xbb,
    0xfe, 0x2f, 0xfd, 0xff, 0xf5, 0x7f, 0xd5, 0xd1, 0xff, 0xff, 0x7f, 0xa5,
    0xbd, 0xff, 0xa5, 0xfe, 0x53, 0xf5, 0xaf, 0x1b, 0xfd, 0x93, 0xf2, 0xd7,
-   0xd2, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xdf, 0xd5, 0xff,
+   0xd2, 0xfa, 0xff, 0xff, 0x2f, 0xc2, 0xfe, 0xbf, 0xff, 0xdf, 0xd5, 0xff,
    0xe6, 0xff, 0x57, 0xad, 0xff, 0x15, 0xff, 0xff, 0xfe, 0xff, 0x8b, 0xf4,
    0xff, 0xff, 0xff, 0x54, 0xd2, 0x5f, 0xd4, 0x7f, 0x7c, 0xfe, 0xff, 0x5f,
-   0xff, 0x7e, 0xff, 0x2f, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f,
+   0xff, 0x7e, 0xff, 0x2f, 0x5e, 0xff, 0xff, 0xff, 0x5f, 0x05, 0xff, 0x6f,
    0xfd, 0xbf, 0x5e, 0xff, 0xa7, 0xfe, 0x5f, 0x55, 0xfd, 0x37, 0xf5, 0xff,
    0xf5, 0xff, 0x7f, 0xf5, 0xff, 0xff, 0xff, 0x41, 0xf4, 0x7f, 0x41, 0xff,
    0x54, 0xea, 0xff, 0x1f, 0xff, 0xed, 0xf6, 0xef, 0x54, 0xfd, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x0f, 0xfe, 0x57, 0xd5, 0xff, 0xea, 0xff, 0xef, 0xae,
+   0x7f, 0x80, 0xff, 0x0f, 0xfe, 0x57, 0xd5, 0xff, 0xea, 0xff, 0xef, 0xae,
    0xfe, 0x4f, 0xfd, 0x7f, 0xfd, 0xff, 0x2d, 0xf6, 0xff, 0xff, 0x5f, 0x8a,
    0xaa, 0x7f, 0xea, 0x3f, 0x75, 0xfd, 0xff, 0x5f, 0xff, 0xff, 0xff, 0x1b,
-   0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xfd, 0xff, 0x71, 0xff,
+   0x5b, 0xff, 0xff, 0xff, 0x5f, 0x15, 0xff, 0x5f, 0xfd, 0xff, 0x71, 0xff,
    0xa7, 0xea, 0xaf, 0xa0, 0xff, 0x1f, 0xff, 0xff, 0xf1, 0xff, 0xfd, 0xfc,
    0xff, 0xff, 0xff, 0xbb, 0xf6, 0xff, 0x6f, 0x7f, 0x63, 0xf5, 0xff, 0xff,
-   0xfe, 0xdf, 0xff, 0x7f, 0x4e, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07,
+   0xfe, 0xdf, 0xff, 0x7f, 0x4e, 0xfd, 0xff, 0xff, 0x7f, 0xc2, 0xfe, 0x07,
    0xfe, 0xbf, 0xe4, 0x7f, 0xe5, 0xff, 0x5f, 0x55, 0xff, 0x95, 0xfa, 0x7f,
    0xfa, 0xbf, 0x36, 0xf7, 0xff, 0xff, 0xff, 0x6a, 0xed, 0x7f, 0xfd, 0xff,
    0xb5, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xaa, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x5f, 0xfd, 0xff, 0xd5, 0xff, 0x08, 0xc0, 0xff, 0xff,
+   0xdf, 0xa4, 0xff, 0x5f, 0xfd, 0xff, 0xd5, 0xff, 0x08, 0xc0, 0xff, 0xff,
    0xfe, 0x17, 0xec, 0xff, 0xf8, 0xff, 0x75, 0xfe, 0xff, 0xff, 0xff, 0x1f,
    0xfd, 0xff, 0xff, 0xff, 0xaf, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0x62, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xfe, 0xff, 0xf1, 0xff,
+   0x62, 0xff, 0xff, 0xff, 0xbf, 0xda, 0xfe, 0x0f, 0xfe, 0xff, 0xf1, 0xff,
    0xa2, 0xea, 0xdf, 0xde, 0xff, 0x47, 0xfd, 0xff, 0xfa, 0x7f, 0x8b, 0xf6,
    0xff, 0xff, 0xff, 0xab, 0xfe, 0xff, 0xff, 0xff, 0xdb, 0xfa, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x7f, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f,
+   0xff, 0xff, 0xff, 0x7f, 0xf5, 0xff, 0xff, 0xff, 0x5f, 0xad, 0xff, 0x5f,
    0xfe, 0xff, 0xf5, 0xff, 0x88, 0xe4, 0xff, 0xff, 0xff, 0x17, 0xf9, 0xff,
    0xf0, 0xff, 0x22, 0xfe, 0xff, 0xff, 0xff, 0x9f, 0xfa, 0xff, 0xff, 0xff,
    0xb7, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff,
+   0xbf, 0x52, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff,
    0xff, 0xff, 0xfe, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xff,
index 703cd03d4e35eee7a765f3f58b74d520fb939458..1488a1a1f5de73636d800959a71493eddaf72fcf 100644 (file)
 /* XPM */
-static char *matrix1_xpm[] = {
-/* width height ncolors chars_per_pixel */
-"320 377 11 1",
-/* colors */
-"  c #81DD81",
-". c #5AD25A",
-"X c #2BA02B",
-"o c #279027",
-"O c #217A21",
-"+ c #1B641B",
-"@ c #165016",
-"# c #0B2A0B",
-"$ c #081E08",
-"% c #030E03",
-"& c #000000",
-/* pixels */
-"&&&&&&&&&&&&&&&&&&&&&&&&&&%&%%%%%%&&&&&&&&&&&&%&%&%&%&%&&&&&&&&&&%%%%$$$$$%%%%&&&&&&&&%%$$$$$%%&&&&&&&&&&%&%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%%&&&&&&&&&&&&&&%%%$$$$$%%%&&&&&&&&%%$$$$$%%&&&&&&&&&&&&&%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$$$%%%&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%$$%%%%&&&&&&&&&%%%%%%%%%%&%&&&&&&&&%%$$#$###$$%%&&&&&&&%%$$###$$%%%&&&&&&&&%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%%%&&&&&&&&&&&%%$##@##$%%&&&&&%&%%$#####$%%%&&&&&&&&&&&%%%$%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$$$#$$%%&",
-"&&&&&&&&&&&&&&&&&&&&&&&&%&%$$###$$%%&&&&&&%%%%$$$$$$$$$%%%&&&&&%&$$#@+++++@##%%&&&&%&%$##OO+##$%%%&&&&&%%%$$$$$%%%&&&&&&&&&&&&&&%&%&&&&&&&&&&&&&&&&%%$$$$%%%&&&&&&&&&&%$##..+@@$%%&&&&&&%$@@+..##$%%&&&&&&&&&%%%$$#$$%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$#+O+#$%&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&%$###@@#$$%%&&&&&&%%$$#$#$#$#$$%%%&&&&&%%#@+++OOO@@#$%&&&&%%$##@Ooo@@#$%%%&&&%%%$#####$$%&&&&&&&&&&&%&%%%%%%%&%&&&&&&&&%&%$$####$%%&&&&&&&&%%$$#@..++@$%%&&&&&%%$@+O..@#$$%&&&&&&&&%&$$##@##$$%&&&&&&&&&&&&%%%%&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$#@OOO@$$&",
-"&&&&&&&&&&&&&&&&&&&&&&&%%$$@+.. +@$$%&&&&%%%$#@OO@@@OO@#$%%&&&&%%$#OOoXoXXO+@$%&&%&%$$@Oo...O+@##%%&&&%%$#+OoOO#$$%&&&&&&&&&&%%%$$$$$$%%&&&&&&&&%&%$#OOO@@$%%&&&&&&&%%$#@+..++@$%&&&&&&%%$@++..+@#$%%&&&&&%&%%$#@...@#$%%%&&&&&&&&%%%%$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$@@...@#$&",
-"&&&&&&&&&&&&&&&&&&&&&&&&%$#+O ..++#$%%&&&&%$#@+Oo+++oO+@#$%&&&&%$$#OoXoXXXO++#$&&&%$##@oo.  oO+@#$%&%%%$##OoooO@$$%%&&&&&&&&%%$$#####$$%%&&&&&&&&%$#@Ooo+@$%%&&&&&&%%$#+OOXo+#$$%%&&&&&&%%$@@XXOO+#$%%&&&&%%$$#@@...+##$$%%&&&&&&&%%$#$$$%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$#@+...@#$&",
-"&&&&&&&&&&&&&&&&&&&&&&&&%$#++. .O+#$%%&&%%%$@@+oo+++oo+@#$$&&%&%$#@oooXXXXo++#$&%%$$#@+oo ..oo+@#$%&&%$$#@oooXo@#$%%&&&&&&%%%$##@@@@@#$$%%&&&&&%%%$#@ooo+@#$%%&&&&&&$$#+OoXo@#$%&%&&&&&&%$$#@oXOO+#$%%&&&&%$$##@+...+@@#$$%&&&&&&%%$##@##$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$#@+...@#$&",
-"&&&&&&&&&&&&&&&&&&&&&&&&$$#Oo   oO#$%%&&&%$$++O. oOO  O++$%&&&%$$#@ooXoXXXOO+#$&&%$#OooXXXXX .O+@$$&%%$@++ooooOO+#$%%&&&&%&%$#@oo . oO#$%&&&&&&&%$#+O. .++$%%&&&&&&&$$@ooooo@#$%%&&&&&&&&%$#@OoXoo@$$%%&%%%$++O+O. .O+O+@$%&&&&%&%$$@...@$$%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$$#OoooO@$%&",
-"&&&&&&&&&&&&&&&&&&&&&&&%%$@oo. .oo@$%%&&&%$$++O .OOO. O+@$$&&%%$#@@ooXoXXXoO+@$&%$#@OoXXXXXX .O+@$$&%%$@+OoooooO+#$%%&&&&%%$$#@oX  .Xo#$$%&&&&&&%$#++. .O+$$%&&&&&%%$#@ooXoO@$$%&&&&&&&&&%$$@OooXo@#$&&&&%$$++OOO...O+OO+#$&&&&&&%$#@...@#$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$#@ooXoo##%&",
-"&&&&&&&&&&&&&&&&&&&&&&&&$##OO . oO##%%&&&%$#+OO..OOO .++@$%&&%$$++oXX.....XXo@#&%$$@XXXOo+++oo++@$%&%$$@+OooooooO@$$%%&&&&%$@+OXX+++oO@$%%&&&&&%$$#oXooO@#$%%&&&&&&&$#@oXooO#$%&&&&&&&&&&&$$#Ooooo@#$%%&%%$#+Oo..   ..OO+#$&&&&&%$$#+...@@$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%&%%&%%&%&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$#@..++@#$%&",
-"&&&&&&&&&&&&&&&&&&&&&&&%%$@Oo . OO@$$&&&&%%$++O..OOO. +@@$%&&%$#+OoXX. ...XXX@#&%$#@XXXoOO+OOo++@$%&%%$@+Oooooooo@#$%%&&&%%$@+OXXO++OO#$$%&&&&&&$$@ooOO+@$$%&&&&&&%%$#@...+@#$%%&&&&&&&&&&%$#@+...@#$%%&&%$$+OO.... ..oO+$$&&&%%%$#@+. .+@#$%%%&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$#@@..O+@$$%&",
-"&&&&&&&&&&&&&&&&&&&&&&&&$$#OO  .oO@$%%&&%%$$++O..O+O..+@#$%&&%$#+OoXX.. ..XXo@#&%$$@XXXOo+O+oO+@@$$&%$$@++ooooooo@#$$%%&&%%#@+OXX+++O+#$%%%&&&&%%$#OoO++#$%&%&&&&&&%$#+...+@$$%&&&&&&&&&&%&$#@@ ..+#$%&&&%$$++o... ...OO+$$&&%%%$$#@+...+@##$$%&&&&&&&&&&&&&&&&&&&&&&%%%$$#$$#$#$#$$$%%&&&&&&&&&&&&&&&&&&&&&&&&&%%%$#@+..+@#$%&&",
-"&&&&&&&&&&&&&&&&&&&&&&&%%$@Oo.  oO##%%&&&%$$@++O++++OO@#$%%&&%$#+Oo  XXX .XXo@#&%$$@ooX..XoXOO+@#$%&&%$$@@oooXooOO+@$%%&&%%$@+O..+++@@#$$%%&&&&%%$#@+###$$%&&&&&&&%%$#+...@@$%%&&&&&&&&&&&&%$@@...@@$%%&&%%$#@+OO . OO+@#$%&&%$$#@@++. .++@##$$&&&&&&&&&&&&&&&&&&&&&&%$$###@@#@#@#@##$$&&&&&&&&&&&&&&&&&&&&&&&&&%%$#+OOXo@@$$%&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&$$#Oo. .oO#$%&&&&&%$@@@++#@@O+#$$%&&%&$#+Oo..XXX. oXo@$&%%$#Ooo..oXoOO+@##$&&%%$#@oooXoooO+@$%%&%&$$@++..+++@@@#$$%&&&&&%%$@@#$$%%&&&&&&&&&$$#@. .+@$$&&&&&&&&&&&&%%##+. .+#$%&&&&$$#@+OO. .OO+@#$%&%$$#@@+++. .++++@#$&&&&&&&&&&&&&&&&&&&&&%$$#@@@+@+@+@+@@@#$&&&&&&&&&&&&&&&&&&&&&&&&&%%##OOOXo@#$%&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&%$#@+...+@#$%%&&&&%%$$$#$#$$#$$$%%&&%%$#@++..OoO..++@#$&%%$#@@+ooXXX..oo+#$&&%$$#@ooXXXoo+@#$%%&%%%$@++ .XXX+++++$$&&&&&&%%%$$%%%&&&&&&&&&&%##+...@#$$&&&&&&&&&&&&%%$@@...+##%%&&&%$#@+. OOO..++@$%&%$#@  .   .  . . @#&&&&&&&&&&&&&&&&&&&&&%$#@  . .  . .  .@#&&&&&&&&&&&&&&&&&&&&&&&&&%$#@XXXOO#$$%%&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&%$##+. .+@#$%&&&&&&%%$$$$$$$$$%%&&&&&%$#@+O..OOO .++@#$&&%$$#@+OOXXX..ooO#$&%&$$#@oXX.Xoo+@#$%%&&%$#@+O  XXXO+OO+$$&&&&&%&%%%%%&&%&&&&&&&&%%##@...+##%%&&&&&&&&&&&%$$#+...+#$%&&&%%$#@+..OOO .+@@$%&%$@@.  . .  .   .+#&&&&&&&&&%%%%%%&&&&&&%$@@.  .  .   .  +#&&&&&&&&&&%&%&%&&&&&&&&&%$#@OXXX@@$%%%&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&%$@@...@#$%%&&&&&&&&%&&%&%&%%%&&%&&%$$#@++. OOO..++@#$&&%$$#@+OOXXX..ooo@#&%&$$#@ooXXXXo+@@#$&&&%$#@+O..X.XOOoO+#$&&&&&&&&&&&%&&&&&&&&&&&%%$@@. .+##$%&&&&&&&&&&&%$#@+...+#$$&&&&%$#@+..OO+..++#$%&%$#@ .   . . ..  @#&&&&&&&%%%$$$$%%%&&&&%$#@ .  .  ..  . @#&&&&&&&&&%%%%%%&&&&&&&%&$$#+OXXX@#$%&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&%$$#@...+#$%&&&&&&&&&&&%&%&%&&&&&&&&%$#@.   . .   XXo#$&%%$#+Oo+O+O+ooXXX@#&&%$@+OOO.XXXXooO#$%&%%$#OOoXX... .ooo#$&&&&&&&&%&&&&&&&&&&&&&&%%$#@...+@$$%%&&&&&&&&&%&$##+ ..@#$%%&&%%$#@@OO@@+OO@@#$%&%$$#@+@++.. +++@@#$&&&&&&&%%$$#$$$%%%&&&&$$#@@@@+@@++@+@@#$&&&&&&&%%%%$$$%%%&&&&&&%$#@oXoOO@#$%%&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&%$#@...@#$%%&&&&&&&&&&&&&&&&&&&&&&&%$#+ . .  . . XXo#$&%%$#OOOOO+O+OoXXX##&%%%@@+OOXXXXXooO##%&%$#@Ooooo...  Xoo##&&&&&&&&&&&&&&&&&&&&&&&%%$#@oXXOO#$%%&&&&&&&&&%%$#OOXXo+#$%%&&&%%#@@++###++##$%%&&%$$##@++ ..++@@##$&&&&&%%%$#+OO@#$%&&&&&%$$##@#@@#@#####$$&&&&&&&%%$$#$$$%%&&&&&&%$#@oXOOO#$%%&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&%%##@+@#$$%&&&&&&&&&&&&&&&&&&&&&&&&%$##OOoXXXXXoo+@##$&%$#@oXX..oXX..Xoo@$&&%%$#@@+XXXOOooO@$%&%%#@XXXooooo..O++#$&&&&&&&&&&&&&&&&&&&&&&&&%$#@ooXoO##%%&&&&&&&&&&$$#OOXXo@#$%&&&&&%$$$$$##$#$$$$%&&&%%$$##@+. .+@##$%%&&&&&&%$##OOO+@$$&%&&&%%$$$$$$#$$###$$$%&&&&&&%%$@@OO+#$%%&&&%%$$#@oXOO+#$%&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&%%$#@@@#$$&&&&&&&&&&&&&&&&&&&&&&&&&&%$#OOOXXXoXoo+@#$%&%$##XXX. oXX..ooO#$&&%%%$##@ooX+Oooo##%&%$#@XXXoOOOo. O++@$&&&&&&&&&&&&&&&&&&&&&&&%%%#@OoOoo@#$%%&&&&&&&%%$#@oXOo+@$%%&&&&&&%%$$$%%%$$%%%&&&&&&%%$#@@...+@#$%%&&&&&&%$$#@ooo+@$$%&&&&&&%%$%$%$%$%%%%%&%&&&&&&%$$@+OOO#$$%&&&%%$@@O..@@#$%%%&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&&$$#@@@#$%%&&&&&&&&&&&&&&&&&&&&&&&&%$$#+OO.XoXXoo@#$%%&&%$#OOooo. .oo+@#$$&&&&%$$@@oXo+OooO@$%&%$$@XXXOoOoO .OO+@$&&&&&&&&&&&&&&&&&&&&&&&&&%$#+OoXX@#$%%&&&&&%&%%$#@oXoO+#$%%&&&&&%&%&%%%%&%%%&&&&&&&&&%$$@@ ..@#$%%&&&&&&&%$#++...O+$$%&&&&&&&&&%&%&%&&&%%&&&&&&&&&%$#@+ooO@#%%&&&%$#@++..@@$$%&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&%%##...##%%&&&&&&&&&&&&&&&&&&&&&&&&&%$#+OOXXXXXOO@#$%%&%%$#++OOo.  oO@##$%&&&&&%$##XXXXXooO##%&%$$@OXo .  .XX. .@#&&&&&&&&&&&&&&&&&&&&&&&&%%$#+OOXo+@#%%%&&&&&&%$#@+oXOO+#$%%&&&&&&&&&&&&%&&&%&&%&&&&&&&%$#@...@#$%%&&&&&&%%$#+O  .++$%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&%$#OO.. ##$%%&&%$$OOooo@#$%%&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&&%$#...#$%%&&&&&&&&&&&&&&&&&&&&&&&&%%$#@OOXXXXXOO@$$%&&&&%$$$$#@...+#$%%&%&&&&&%%$#ooXooooO#$%&&%$#Ooo  .  Xo.  @#&&&&&&&&&&&&&&&&&&&&&&&&&&%$#@+..++@$%&&&&&&%%$#+O..+@#$%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$$@...@#$%&&&&&&&%%$#oooOO@#$%%&&&&&&&&&&&&&&&&&&&&&&&&&&%&&$$+O ..@$%%&&&%$#Ooooo@#$%&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&%%$##@#$$%%&&&&&&&&&&&&&&&&&&&&&&&&&%$#@OOXXXoXoO#$%%&&%%%&%$$#@ooo@#$%%&&&&&&&%%$##@@@@###$%%&%%$$#@@@@+@@@+@@##$&&&&&&&&&&&&&&&&&&&&&&&&&%%$$#@..++@$%%&&&&&%%$@++..@@$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$##@##$%%&%&&&&&%%##oooOO##$%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$#@@@##$%%&&&%$#OoooO#$%%&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&&%%$$$$$%%&&&&&&&&&&&&&&&&&&&&&&&&&%&$$@+OXXXooOO#$%&&&&&&%&%$##oOO@#$%&&&&&&&&&%%$$#$###$$%%%&&&%$$$#####@#####$$&&&&&&&&&&&&&&&&&&&&&&&&&&&%$#@..+@@$%&&&&&&&%$@@+..@#$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$$$#$$%%&&&&&&&&%%$#ooO++#$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$$$###$$%&&&&$$#+OO+@#$%&&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$@@+oXoooO+#$%%&&&&&&&&%$#OO+#$%%%&&&&&&&&&%%%$$$%$%$%&&&&&&%$$$$#$$$#$$$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&%%%$##@##$%%%&&&&&&%%$#####$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$$%$%&&&&&&&&&&$$#@+@##$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$$$%%%&&&&&%$#@++@#$$%%&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$$###@@@###$%%&&&&&&&&%%%$##$$$&&&&&&&&&&&&&&%%&%%%%&&&&&&&&&&%%%%%$%%$%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$$$$$$%%%&&&&&&&&%%$$#$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%%&&%&&&&&&&&&%$$@@#$$%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&&%&%%%%&&&&&&%%#@@+##$%&&&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$$#$##$$$$%&&&&&&&&&&&%%$$$%%%&&&&&&&&&&&&&&%&&&&&&&&&&&&&&&&%%%&%&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$$%%%&&&&&&&&&%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$##$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$$$#$$%%&&&&&&&&&&",
-"&&&&&%%%%%%%%%%&&&&&&&&&&&%%%%%%%&&&&&&&&&&&&%%%%%%$%%%%&&&&&&&&%&%%%%$%%%%%%&&&&&&&&&&&%%%%%%%%%&&&&&&&%%%%%$$%%%%%%&&&&&&&&&&%%%%%%%%%%%&&&&%%%%%$%$%$%$%%%&&&&&&&&&%%%%%%%%%%&&&&&&&&&%%%%%%%%%&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%&%&%&&&&&&&&&",
-"&&&%&%%$$#$$$$%%%%&&&&&%%%%$$$$$%%%%&&&&&&&%%%$$$$#$$$$%%%&&&&&&%%$$$$$#$$%%%&&&&&&&&&&%&%$$$$$%%%&&&&%%%$$$#$#$#$$$%%%&&&&&&&&&%$$$$#$$%%%&%%%$$$$#$#$#$$$$%%%&&&&&%%%$$$$$$$%%%%&&&&&&%&%$$$$$$$%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%%%%&%&&&&",
-"&&&%%%$$##@##$$$%%&&&&%%$$$#####$$&%&&&&&&&%%$$##@@###$$%%%&&%%%%$$#@@@###$$$%%&&&&&&&&%%$$###$$%%&&%&%$$##@@#@#@##$$%&&&&&&%%%$$$###@##$$%&%%$##@#@@@#@@###$%%&&&%%%$$##@@###$$%%%&&&&&%%$$##@##$$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%$$$$$$$$%%&&&&",
-"&&%%$$#@+oOo+@#$$%%&&%%$$#@++OOO#$%%&&&&&%%$$##O+oooO+##$$%&&&&$$##+OOooOO##$$%&&&&&&%%$$#+++++#$%%&&%$#@@OOoOooOO++$$%&&&&&%%$$#@@ooOO+@$%&%$$++OooOoOooO++#$%&&%%%$##@+OOo+@##$%%&&&%%$$#@OOOO+@#$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%&&&&&&&&&&&&&&%&%$$###@###$$%%%&&",
-"&&%$$#@++ooo++@#$$%&&%$##@@OOooO@#%%%&&&&%%$#@@OoooooO@@#$%&%%%$#@@OOoooOO@@#$$&&&&&&&%$#@++OO+@$$%&%%$#@+oooooooOO+#$%&&&&&%$##@++ooooO@#$&%$#OOOoooooooOO+#$%&&%%$#@@+Oooo++@@#$$&&&&%$#@@oooOO+@##$%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%%%%%&%&&&&&&&&&&&&&&&&&&&&&&%%&%%%%%&&&&&&&&&&&&%%$$#@@+@+@@##$%%&&",
-"%%$$@+O..XXX..++@$%&%$$#oXX. ...@#$%&&&&%%$#+Oo..XXX..oOO#$&&%$#OOo..XXX..oO+#$&&&&&&%$#@+ . ..@#$%&%%$@+O..XXXXXoOO#$%&&&%%$$@+.....XXo@#$&$$@oXXXXXXXXXXXX@#$&%%$#+Oo..XXX..oO+#$&&%%$#@..oXXXXXXX#$%&&&&&&&&&&%&&&&&&&&&&&&&&&&&&&&&%&&&&&&&&&&&&&&&&&%%%%$%$%%%&&&&&&&&&&&&&&&&&&&&&%&%%$%$%%%&%&&&&&&&&&%%#@+.......+@#$%%&",
-"&%$#++O..XXX..OO+#$&&%$@oXX .  .+#$%%&&&%%$#oOo..XXX..ooO#$&&%$#Ooo. XXX .ooO#$&&&&&&%$#++  ...@#$%&%$#++O. XXXXXoo+#$%&&&%%$#++  ...Xoo@#$&$$@oXXXXXXXXXXXX##$&%%$@Ooo..XXX..ooO#$&&%%$#@..XXXXXXXX@#$&&&&&&&&%&%%%%&%&&&&&&&&&&&&&&%&%%%%&&&&&&&&&&%&%%%$$$###$$%&&&&%%%%%%%%%%%%%%&&&%%$$###$$$%%%&&&&&&&&%$#@+.  . ..++@$$%&",
-"%$$#+OO..XXX..OO+#$&%$$#ooX  . .@@$%&&&&%$$@Ooo .XXX. ooo@$&%%$#Ooo..XXX..ooo@#&&&%&%$$#+O.  ..+#$%&%$$+OO..XXXXXoOO#$%&&&%$#@+O.  ..XXo@#%&%$#oXXXXXXXX.XXX@$$&%$$@Ooo..XXX..ooO@#&%%$#@+..XXXXXXXX@#$&&&&&&%%%$$%$%%&&&&&&&&&&&&%&%%$$%$%%%&&&&&&&%&%%$$##@@#@#$$&&&&%%%$%$%$$%$%%%%&&%$###@@@##$$%%%%&&&&%$$#++.. . ..+++#$%&",
-"%$#@XXXoO+++oOXXX@#&&%$##@+++...@@$$%&&&&$$#XXXOO+++OoXXX@#&%%$#+oo+++++ooXXX##&&&&&%$#@oXooo..@#$$&%$#+OOXXO+++O++##$%&%&%$#@..ooo+++@##$%&%$##@@@@+++ooXoo@#%&%$#@XXXoO++OooXXX@$&%%$@+OXX++++O...+@$&&&&&&%%$$##$$$%%&&&&&&&&&&%&%$$##$$%%%&&&&&&%%$$##@+O...+@$&&%%%$$$#$#$#$#$$$$%&%$#...oo@@##$$%%&%&&&$$@+OXX+++XXXXo@$$&",
-"&$#@XXXOO+@+OoXXX@#&&%%$##@@+. .+#$%&&&&&$$#ooX++@@+OoXXX@#&&%$$++O++@++OoXXX@#&&&%%%$#@oXXoX..+#$%&%$#@OoXX+O+O++@@#$%&&%$#@+..ooo+++@@$$%&%%$$####@@+ooXoo#$$&%$$@XXXoo+++OoXXX@#&%$$++OXX+++++...+@#&&&&&%%$##@@##$%%&&&&&&&&&&&$$###@@#$%%&&%&%%$$$#@@+OO...++$&%&$$#@#@@@@@@@@##$%&%$#...Xo++@@#$$%%&&&%%#@+OXX+++oXXXX@#$&",
-"%$#@XXXOO@@@+OXXX@#&&&%%$$#@+...+##%%&&&&%$$#@#@@@@+ooXXX@#&&%%$###@@@++..Xoo@#&&&&%$#@+..OOO..+#$%&%%#++O. . ...oO+#$%&%%$@+O..ooooo+@@$$%&%&%%$$$##@+XXOO+#$$&%$#@oXooo+++ooXoo@#&%$$++OXX++@++...+@$&&&&&%$$++...##%%%&&&&&&&&%%$$+O...##$%&&%&%$$#++oXXXXO++@$$&%%$#OOoOOoooOOoOO#$&%$$#@@oo...O+##$$%%&%%$@@+Oo+++OOXXX@#$&",
-"%$#@XXXO+@@@+OXXX@#&&&&&%$#@@ ..+#$$&&&&%%%$$$####@@oXXXX@#&&&%%$$##@@++..Xoo@$&&&%$$#++..OOO..@@$$&%$#@Oo.. .  .oOO#$%&&$#@+O..oooXo++@#$%&&%%%%%%$#@@XXOO+#$%&%%##ooXoX+O+XoXoo@$&%$$+OoXX++@++...+@#&&&&&%$#+O...@#$%&&&&&&&&&&%$#+O...@$$%%&%%$$##+OXXXXXO++#$%&%$$#Ooooooooooooo#$&&$$#@+oo  .oO@@#$$%&%%$#@++O+@+OoXXX@#$&",
-"%$#+XXXo+##@+OXXX@#&&&&%%%$@+...@@$%%&&&&%%%$$$$#@@+ooXXo#$&&%%%%$$#@+++..Xoo##&&&%$#@++..OOO..+##%&%%$@+O... ...ooO@#$&%%#++O..oooooO++##%&&&&&%%%$$@+XXO+@$$&&%%$@ooXooO++ooXoo##&%$#@+OXX+++++...+@#&&&&&%$#+O...@#$%&&&&&&&&&&%$#+O...@#$&%&%$$@@@OOXXXXX+@@$$%&%$#@ooXoXoXXoXooo@#&&%%$##oo.. oO+@@##$&%%$#@@+++@+OOXXX@#%&",
-"%$#+XXXO+@#@+OXXX+#&&&&&&$$#@. .+#$$&&&&&&&%%%$##+OO..OO+#$&&&&&%$$++.   .OO+@$&&%%$#OooooOOO..+@#$&%%$@@+oXO+OoX...@#$&%$$+OO.....XX...@#$&&&&&&&%$#@+..+@#$%%&&$##++O . .  .OO+@$&&$$++o..+++oo . +@$&&&&%%$#+OoXo@$$%%&&&&&&&&%&$#+OoXo@#$%&&$$#ooX..ooo+@##$$%&&%$#+oXXXXXXXXXXXo@#&&&%%$##@++OXX...+@$&&&%$$##@+OO..XoO@$$&",
-"%$#@XXXO+@#@+OXXX@#&&&&&&%$@@...+#$$&&&&&&&&%%$#@+OO..++@#$&&&&%%$$++  ...O++@#&%%$#@OooXoO+O..+@#$&%%$##+oo+++oo...@#$&%$#+OO. ...XX...@#$&&&&&%%$$@@+..@@$$%&&%%#@+OO.. ....O++@$&&%$@+O..++Ooo   +@#&&&&&%%$@+ooO##%&%&&&&&&&&%%%$@+ooO#$%%&&$#@oXX. ooO@@#$$%%&&%$#@XXXXXXXXXXXXX@#&&&%%%$#@+++XX...O+#&&&%%$$@@OOO..ooO#$%&",
-"%$#+XXXO+##@+oXXX+#&&&&&%$$#+. .@@$%%&&&&&&%%$#++ . OO+#$$%&&&%&%$$#@++OoXXXo@#&&%$#@. .XXXXo .OO+#&&%%$###@#@@++...+@#&%$$+OO..OOOOO...+@$&&&&&&%$#+OoXX@#$%%&&%$$@XXXoXOOOXXXXX@#&%%$#@@XX . XX...+@$&&&&&%%$$####$$%%&&&&&&&&&&&%$$#####$%&&&$#@XXX..oOO@##$%%&&&%$#+OooooXoXooXoo@#&&&&%%$$#@+OXX ..O+#&&&&%%$#@...oO+@#$$%&",
-"%$#@XXXOO@#@+OXXX@#&&&&&&$$@@...+#$$%&&&&&&%$$#++. .OO##$%%&&&%%$$$##@++oXXXX@#&&%$#@...XXoXX..oO+#&&%%$$#####@@+...+@#&%$#++o. ++O++...+@#&&&&&&%$#+OOXo@#$%%&&%$#@XXXXoO+OoXXXX@#&%&%$#@oX  .XX...+@#&&&&&%%%$$##$$%&&&&&&&&&&&&%&%$$#$$$%%%&&$#@XXX..oOO+@#$%%&%&%$@@oooXoXoXooXoo@#&&&&%%$##@++XX. .O+#&&&&%%$#@. .O+@##$%%&",
-"%$#+XXXO+@@@+oXXX@#&&&&&%%##+...+@$%%%&&&&%%$#@OO. .O+@$$%%&&%%$$$###@@+oXXXX@#&%%$@@. .XXoXo .oOO#&%%$$#$##$#@@+...+@$&%$$+OO..O++++...+@$&&&&&%%$@OoOXo@#$%&&&%$#@XXXXoO++oXXXX@#&&%%$#@oo.  XX...+@$&&&&&&&%%$$$$%%%&&&&&&&&&&&&%%%$$$$%%&&&&$#@oXX..oOO@@#$$%%&&%$#+ooooXoXXXoXXo@#&&&%%$$#@@++XX...O+$&&&&&$$#@...O+#$$%&&&",
-"%$#@XXXo+@@@+OXXX+#&&&%%%$#@+. .+@#$%%&&%%%$@@+..ooo+@#$$%&&&%$$+++##@@+OoXXX@#&%%$@+oXXXXXXX .ooO@&%$$@++####@++ . +@#&%$#@OO..+++++. .+@#&&&&&%$$@OoXoo##%%%&&%$#@XXXoO+++OoXXX@#&&%%%$#@++OOOO...+@$&&&&&&%%%$$$$%%%&&&&&&&&&&&&%%%$$$$$%&&&&%$#@@+OO...XX+@#$$%&%$#@oXXXXXXXXXXoX@#&%%%$##OO. .Xo++@@#$&&&&&%$#@ooo+@#$%%&&&",
-"%$#@XXXOO+@+OOXXX@#&&%&%$$#@+...+@#$$%%&&%$#@++ .ooO+@#$$%%&%%$#++O@@@@+OoXXX@#&&%$#@ooXXX.XX. ooO@&%$#+O++@@@@+O...+@$&&$$++O .+++++...+@$&&&&&%$#@ooooO@$%%&&&%$#@XXXoO+++OoXXX@#&&&%$$#@+++OOO...@#$&&&&&%&$$$$##$%%%&&&&&&&&&&&%$$$##$$%%%&&%%$##@+O...XX+@@#$%&%$#@oXoXXXoXoXXoo@#&&%$##@Oo.. oo+@#$$$&&&&&%$#@ooo@#$%&&&&&",
-"%$#@XXXoO+++OOXXX##&&%%$$#@++ . ++@#$$%&%%$#++O. ooo++@##$%&%$##OOO+@+@+OoXXX@#&&%$#@ooXXXXX...XoO@&%$#+OO++@+++O. .+@$&%%$@+O..++++O...+@$&&&&&%$#@oXooO#$%&&&&%$#@XXXoOO++ooXXX@#&&&%$##@++OOOO...@#$&&&&&%%$#@@###$%%&&&&&&&&&%%%$##@@##$%%&&&%%$$#++...XXO+@@#$&%$#@OooooooXooooo@#&%$$@@+Oo. .oo##$$%%&&&&&%$#@ooo@#$%%&&&&",
-"&%$#+OO..ooo..OO+#$&&%$$++Ooo ..ooO++$$&%$$@.....XooooO+@$$&%$#@...XXooo..Xoo@$&&&%$##@@OOXXo .ooO@&%$#Ooo..ooo..XXX@#$&&%$##+. XXXXX ..+@$&&&&&%$#@...+@#$%%&&&%$$@ooX..ooo..Xoo@$&&%%$#@ooooo..Xoo@#$&&&&&&$$++...#$%%%&&&&&&&&&%$#+O...#$%%&&&&%%$$#@@@+oo...+@$&%%$##@@@@@@@@@@@#$$&%$#...XX+++@##$$%%&&&&&%%$$@ooO@#$%&&&&&",
-"%%$$++O..oXo..O++#$&&%$#+OOoo.  oooO+#$&%$#@... .XXoooOO+#$&%$#@...XXooX..ooO#$&&&%%$##@+OoXX..oOO#&%$#Ooo..ooo .XXX##$&%%%$#@..X.XXX...@#$&&&&&%$#@...@##%%&&&&&$$#Ooo..Xoo..ooO#$&%%$#@@oooXo..ooO#$%&&&&%%$#+O...@#$%&&&&&&&&%%$##OO...@$$%&&&&%&%$$$#@@Oo...+@$&&%%$$##########$$$%&%$#...XX+@@##$%%&&&&&&&&%$$@OoO@$$%%&&&&",
-"&%%$##@OOXXXoO@@$$%&%%$#OOoXXXXXXXoOO#$&%$#@oXXXXXXXXXooO#$&%%##+O+XXXXXXo+@#$$&&&&%%$##+OoXXXXooO#&%%$#@+ooXXXoX+@@#$%&&&%$##++oXoXXOO+@#$&&&&&%$#@ooo@#$%&&&&&&%$##@+ooXXXXo+@#$$&&%$@@+XXXXXOO+@#$$%&&&&&%$$+OXXo@#$%%&&&&&&&&%$#@..oOO@$%%&&&&&&&&%$$$##@@@@##$&&&%%%%$$$$$$$$$$$%%&%$##@@@@##$$$%%&&&&&&&&&%%##Ooo#$$&&&&&&",
-"&%&%$##+OoXoOO@#$$%&&%$#OOooXXoXXooOO$$&%$#+ooXoXXXXXooO+#$&%%$#@++XoXoXoo@##$%&&&&%&%$#++XoXoXooO#&&%$$#@ooXXXoo@@$$$&&&%&%$#@+oooXo++@#$%&&&&&%%$#ooO@$$%%&&&&&&%$##@ooXXooo@##$%&&%$#@+ooXoXO+###$%%&&&&&%$$++ooo@$$&&&&&&&&&%%$#@..oO+##%%&&&&&&&%&%%$$$$###$$%&&&&%%%&%%%%%%%&%%&%&%%$#@###$$$%%&%&&&&&&&&&%%$#OoO#$$&&&&&&",
-"&&%%$$#@+ooo++#$%%&&&%$$+OOoooXooooO+#$&%$##ooooooooooOO+$$&&&$$@@+oooooOO##$%&&&&&&%%%$@+oooooOO+#&&%%$##OoooooO##$$&%&&&&%%$#@Ooooo+@@$%%&&&&&&$$#+OO#$%%&&&&&&%&%$##OoooooO##$%%&&%%#@@ooooo++#$%%%&&&&&&&$$@+ooO#$%%%&&&&&&&%$$@@..OO+#$%&&&&&&&&&&&&%%$$$$%$%%&&&&&&&%&&&&&&&&&&&&&&%%$#$$$$%%&&&&&&&&&&&&&&$$#+O+#$%%&&&&&",
-"&&&&%%$$##@###$%%&&&&&%$##@@@@@@@@###$%&%%$##@@@@@@@@@@##$%&&&%%$###@@@@@#$$%%&&&&&&&%%$$##@@@@###$&&&%%$###@@#@#$$%%&&&&&&%%%$$##@####$%%%&&&&&&%$$#$#$$%&&&&&&&&&&%$###@@@##$$%%&&&%%$$##@@###$$$%&%&&&&&&&%$$####$$%&&&&&&&&&%$#++oo@##$%%%&&&&&&&&&&&&&&%&%%&&%&&&&&&&&&%&&&&%&&&&&&&%%%%%%%&&&&&&&&&&&&&&&&&%%$$#$$%%&%&&&&",
-"&&&&&%%$$$#$$$%%&&&&&%%%$$#$#####$#$$%%&&%%$$$########$$$$%&&%&%%$$$####$$$%%&&&&&&&&&%%$$#$####$$%&&&&&%$$$$##$$$%%&&&&&&&&&%%$$$##$$$%%%&&&&&&&&%%$$$%%&&&&&&&&&&&%%%$#$#$#$$%%&&&&&&%$$#$###$$%%&&&&&&&&&%&%$$$$$$%%&&&&&&&&&%%#@@OO##$%%&&&&&&&&&&&&&&&&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%&%&&&&&&&&&&&&&&&&&%$$$$$%&&&&&&&",
-"&&&&&%&%%$$%%%%&%&&&&&%%%%$$$%$$$$%%%%&&&&%%$$$$$$$$$$$%%&&&&&&%&%%$%$%$$%%&%&&&&&&&&&&&%%$%$%$%%%%&&&&&&%%$$%$%%%&&&&&&&&&&&%%%$%%$%%%&&&&&&&&&&&%%%%%%%&&&&&&&&&&&&%%%%$$$%%%&&%&&&&%&%%%$$%%%%%&&&&&&&&&&&&&%%$$%%&%&&&&&&&&&%%$$$##$$$%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%&&&&&&&&",
-"&&&&&&%%%%%%%%&&&&&&&&&&%&%%&&&%&&&&&&&&&%&%&%%%%%%&%&&&&&&&&&&&&&%%&%%&%&%&%&&&&%&%%%%&%%&&%&&%&&&&&&%&%%%%%%%%%%%&%&&&&%&%%%%%%%%&%%&%&&&&&&&&&&&&%&%&%&&%&&&&&&&&%&%%%&&%&%%%&&%&&&&%&%&%%%%%%&%&&&&&&&&&%&%%%%%%%%%&&&&&&%&%%&%%&%&%&%&%&%&&&&&&%&%%%&%&%&&%&&&&&&%&%&&&&&&&&%&%&&%&&&&%&%&%&&&%%&&%&&&&&&&&&&%&%&%%&&&&&&&&",
-"&&%&%%%%$$$%$%%%&&&&&&%&%%%%%$%%%%&&&&&&&&%%$%%%%%%%%%%%&&&&&&&&&%&%%%%%%%%%%%&&&%%%%%%$%%%%%&%&&&&&&&%%%%%%%$%%%%%%&%&&&&%%%%%$%%%$$%%%%%%&&&&&&%%%%%%$%%%%%%&&&%%%%$%%%%%%%%%%%%%&&&%%%%%%%%%%%%%%%%&&&&&&&&%%%%%%%%%%%%%&%&%%%$%%%%%%%%$%%&%&%&&%%%%%%$%%%%%&&&&&&&%%%%%%&&%&%%%%%%%&&&%%%%%%%%&%%%%%%%%&&&&&&%&%%%%%%%%&&&&&",
-"&&%&%%$$####$$%%%&&&&&%%%$$$$$$$%%%&&&&&%%%$$$#$#$#$$$%%%&&&&&&&%%%$$$#$$$$$%%%&%$$$$#$$#$#$$%%&%&&&%%%$$$#$#$#$#$$$%%%&%%%$$$$#$#$$#$$$$%%&&&&%&%%$$$$$$$$$%%%&&%%$$$$$$$$$$$$#$$%&%&%%$$#$#$#$#$$%%%%&&&&%%%$$$#$#$#$$$%%&%%%$$$$$$$$$$$$$$%%&&%%%$$$#$$$$$%%&&&&&%%%$$$$$%%%%%%$$$$%&%%%$$$$%%%%%$$$$$%%&&&&%&%%$$$$$$%%%&&&&",
-"&&&%$###@@@@@#$%%%&&&&%%$$##@###$$%&&&&&%%$##@#@@@###$$%%%%&&&%%%$$####@####$$%&%$##@#@@#@##$$$%%&&&%%$##@#@#@@@#@##$%%&%%$###@#@@@@#@@##$$&&&%%%$$###@#@###$$%&%$$###@###$#######$&%%$$####@@#@###$$%%&&&&&%$$##@#@@#@##$$&&$$###@###$######$%&&%%$##@#@@##$$%%&&&&%$$$###$$%%%$$###$$&%%$$###$$$$$#####$$&&&%%%$$$#####$$%%%&&",
-"&%%%##+oo...++#$%%&&%&%$@@+OOOOO#$$%&&&&%$$+OOOOOoOOO@##$%&&&&%%$$@@OOOoO+++@@$&$@@OOOOoOOOO+#$$%%&&%$#+OOoOoOOoOOOO#$%&%$#+OOoOOOOoOOOO+@$&&&%%$$@@OOoOO+++@@$&%$@+OOOOO@@@OOoOO+@&%%$++OOoOoOoO+++$%%&&&%%%$++OOOOoOOO+@$&%$@+OOOOO@@@OOOO+#$&&%$#+OOOOoOO@#$%%&&&%$@+OOO##$$$##OOO+@&%$#+O++@#$#@+OOO@@$&&&%%$#@+OOO++#$$%%%&",
-"&&$$#@+oX ..OO#$$%&&&%$#@+OooooO@#$%%&&&%##OooooooooO+@#$$%&%%$$##++oooooOO+++$&$++ooooooooOO@##$$%&$$#OOoooooooooOO@$$&%$#Ooooooooooooo++#&%%$$##++oooooOO++@#&$$@+OoooO+@+OoooO++&%$#+OOoooooooO++#$%&&&&%$#+OoooooooO+@$&$$@+ooooO+++OoooO#$&%%$#OooooooO+@$%%&&&$$++OOo@@#$#@+OoO+@&$##OOo++@##++oOo++$&%%$$##++OooOO@##$$%&",
-"%%$#@++XX.. Oo@#$%%&&%$$++Oooooo@##%%%&&$$@OoooXooooo+++#$$&%$$#@@OOoooooOOOO+#&#++oooXoooooO+@@#$%&$#@OooooXooXoooo@#$&$#@OoooXoXooXoooO+#&%$$#@@O+oooooOOOO+#&$#+Oooooo+++ooooo++&%$#+OOooooooooO+#$%&&&%%$#+OooooooooO+#&$#++ooooo+++ooooO@#&%$$#Oooooooo+@$$%&&&$#+Oooo+@@##@+oooO+&$#@oooOO@@@OOooo++#&%$$#@@+OooooO+@@#$$&",
-"%%$#OooXooOO..+@#$%&&%$#OOo.. . O+#$%&&&$#@XXX..XXXXX...@#$&%$#OOo..XXXXX...oo@&#+O...XXXXXXX...@#$&$#@XXX .XXXXX ..+@$&$#@XXX..XXXXX...Xo@&%$#OOo..XXXXX ..oo@&$#+O...XX++OXX...O+&%$#+OoXX . XXoo+#$%&&&&%$#OoXXX. XXXO+#&$#+O.. XXOOO  XXo@#&%$#@ooX .XXo+@$%%%&&$#+O. .oo@@+Oo . O+&$@@.....++@Oo ..o+#&%$#OOo..XXXXX...@#$&",
-"%$##OooXooOO..+@#$%&&%%$OOo.. . oO@$$%&&$#@XXX .XXXXX...@#$&$##ooo..XoXXX. .Xo@&#+o. .XXXXXXX...@@$&$#@XXX..XXXXX. .+@$&%#@XXX .XXXXX...Xo@&$##ooo..XoXXX.. Xo@&$#+O. .XXO++XX . O+&%%#+OooX. .XooO+$$%&&&%%$#OOoXX..XXXO+$&$#+O...XXOOO. XXo@#&&$$@ooX. Xoo+@$%%&&&$#Oo  .oo@+@oo . OO&$@+.. ..+++oo. .O+#&$$@Ooo..XoXXX...@##&",
-"&$#@XXXOoOoo..O++$%&&%$$#@+XXXXXXo@#$%&&$$@+ooXXOOOOO...+@$&$#@...OO++@++oooXo@&$@+XXXoO+++++...O+#&%##+ooXX+++++...+@$&$##OOoXX+++++ooooo#&$#@...oO++@++oooXo@&%#@+XXXoO+++ooXXX+@&%%$##@++...++@##$%&&&&&%%$#@@+OXXoOO@#$&%#@+XXXooXXXXX++@#$&%%$#@++..O++##$%&&&&$#@+.  XX+++XX.  ++&$#@XXX..OOO+O...++#&$#@...OO+++++...O+#&",
-"%$#@XXXooOoO..O++#$&&&%$#@+XXXXXXo@#$%%&%$#+OoXXO+++O...+@#&$#@...OO@@@#@ooooo#&$@@XX.OO@@@++...oO#&%$@+OOX.+O+OO...+@$&%$#+OoXXO++++oOooo#&$#@...OO@@@@@ooooo@&%$@+XXXoo+++OoXXX@@&%%%$##++. .+@@$$$%&&&&&%%%$##@+XXoO+@#$&%$@+XX.OOX.XXX+##$%&&%%$#@+..++@#$%%&&&&$#++ . XXO++XX . ++&$@+XXX .ooo+O...+@#&$#+...OO@@@++...oO#&",
-"%$#@XXXOOoOo..OO+$$&&%%$#@@XX.XXXX@@$%%&$$#+OoXX+OOO+...+@$&##+...O+@####+OOoo#&$#+XXXOO@@#@+...OO#&%$#+OoXXO++++...+#$&%$#+OoXX+++++OoOoo#&$#+...O+@###@Ooooo#&$$#+XXXoO+++oO.XX+#&&&%$$#@+...+@#$%%&&&&&&&&%$$#@+XXOO+#$%&$$#+XXXOoXXXXX@#$$%&&&%$##+..+@@$$%&&&&&$#++.  XX+OoXX  .+@&$#+XXX .OOOO+ ..++$&$#@...O+@##@+...OO@&",
-"%$#+XXXXo.. . O++#$&&%%$#@+..OoO..+@#$%&%$#+OO. oooXX ..+@#&$@+...+@#$$$######$&$#+XXXO+@###@oooXo@&%$#+OOXXOOO..++@#$$&%$#+OOXXOO+..++@##$&$@+...++####@@++@@#&%$#+XXXXXoooXXXXX@@&&&&%%$@@. .@@#$&%&&&&&&%&&%$$#+XXoO+#$%&%$#+XXX.....O@@#$%%&&&%%$@@..++#$%%%&&&&$$++.....OOO.....O@&$#@XX.oXXXXO+...+@#&#@+...+@##$#@ooooo@&",
-"%$#+XXXoo . ..OO+#$&&%%$@@O..OOO .+@@$%&%$$+Oo..oXoXX . +@#&#@+...+@#$$%$$$#$$$&$#@XXXO+##$#@ooooo@&%$#@OoXXOOO..O+@#$%&%$$+OoXXO+O..+@##$$&#@+...+@####@+@+@##&%$#+XXXoXoXoXXXXX+#&&&&%$$#+...+#$%%&&&&&&%&%%&$$#@XXO++#$%&$$#@XX......++#$%%&&&&&$$#+..+@#$%%&&&&&$#@+.. ..OOO.. ..+@&$#+XXXXo.XX+O ..+@$&#@+...+@#$$#@ooXoo#&",
-"%$#@XXXXXXXXXXo++#$&&%$$++OXXOO+XXo++#$&%$#++O. XXXXX...O+#&#@+. .+##%%%%%%$$%%&$@@XXXO+##$##OooXo@&%$#+OO  .. ..+@##%%&%$#+OO  . ...@@#$%%&#@+. .+@###OOooo++$&%$#@XX.XXXXXXX.XX@#&&&&&%##+...+#$$&&&&&%%%%%$%$$@@XXOO+#$%&%$@@XXX. . .O+#$$&%&&&&%$#+..+@#$$%%%%&&%#@+...Xo. .Xo...+@&$#+XXXOO...oO...+@#&$++...@##$$##OOoXo@&",
-"%$#+XX.XXXXXX.OO+#$&%%$#+OoXXOOOXXOO+#$&%$#+Oo..XXXXX. .O+@&#@+...@@$$%&%%%%%%%&$#+XXXO+##$$@OOOXo@&%$#@OO . ....+@#$$%&%$$+OO . . ..+#$%%&&#@+...+@##@OooooO+#&%$@+XXXXXXXXXXXXX@#&&&&&$$#@ ..@@$%%&&&&%%$$$$$$$@@XXO++$$%&%$#+XX.. ...O+@$$%&&&&%$$#@..++#$$$$$%%&$#@O...oX . oX ..+@&$#@XXXOo...OO...+@$&#@+...+@$$$#@OOoXo@&",
-"%$#@XXXoo. ...ooO#$&%$#@+OoXXO+OXXoO+##&%$#++O .XXXXX. .o+@&#@+...+@$$%%%%%$%%%&$#@XXXO+#$###OooXo@&%$#+OO. . ...++@#$$&%$#+OO . . ..@##%%&&$++...+@##@OooooO+#&%$#@XX.XXXXXX.XXX+#&&&&&%$@@. .+#$$&&&&&$$##@#####+XXOO+#$%&%$#@XXX.. . O+@#$$%&&&&%$@@..+@@#$$$$$%&%#@+...oo . oo...+@&$#+XX.OO...oO...++$&#@+. .+##$$#@OooXo@&",
-"$$#+XXXXX.. ..ooo##&%%#@XXX. . .  XXo@$&%%#+OOXX+++++XooXo@&#@+. .+@#$%%$$$$$$%&$@+XXXO+##$#@OOoXo#&%$#+OoXXoOO..O+++@$&%$#++oXXOOO..@#$%&&&$@+...++@@@XX...oo@&%$#+XXXoo+O+OoXXX+#&&&%%$##+...+@$%%%&&&$#@ooo####+XXO++#$%&%$@+XXXoooXo..+@#$%&&&%%##+..+@@##+++#$&$#@+. .O+XXX+O...++&$#+XXXoooooXX ..+@#&$@+...+@#$$#@oooXo@&",
-"%$#@XXXOooXoXXooO#$&$$#@XXX . . . XXo+#&%$#+OOXX+++++oooXo@&$@+...++##$$##@###$&$#@XXXO+@###@Ooooo@&%$#++OXXoOo..OO+++#&%$#+OOXXoOO..@$$%&%&$@+. .++@@@XX...oo@&%$@@XXXoO+++OoXXX@@&&&&%%##+...@@#$&%&%&$@@XXX+@@@+XXoO@#$%&%$#@XX.OoooX..O+@#$&&&%$$@+..O+@@@OO+@#&%#@+...O+oXX++. .+@&$#@XXXoooooXX...+@#&#@+. .++@##@@oXoXo#&",
-"$$#@XXXooooXXXooO@$&%#@+. .ooOOOOO...+@&$$#+OoXX++@++XXoXo#&##+XXXoo@@###OooOO#&$@+XXXOO@@@++...O+#&%$#+OoXX+O+O+ooooo#&%$#+OoXXO++++#$%%&&&$@@XXXoO+@+++XXXXo@&$$@+XXXOO+@+OoXXX@@&&&%$$#@+. .+@#$$%%&&$@+...++@@+..O++$%%&$$@+XXXOo++OXXooO#$&&%%$##+..++++@...@#&$#++...+++@++O...+@&$#+XXXOO+++... .+@#&$@@XXXoO@@#++...O+@&",
-"%$#+XXXoOXooXXooO#$&$#@+...oOOOOoo. .+@&%$@+OoXXO++++oXXoo@&$#@XXXoo+@@++ooooO#&$@+XXXoO@@@++...O+#&%##OOoX.+O+OOooooo@&%$@+OoXXO+++@#$%%&&&$#@XXXXo+++++XooXo@&$$@+XXXoO+@+OoXXX+@&%%$$#@@+. .+@@#$%%&&$@+...+++++..O++#$&&$$@+XXXoOO++XXooo@#&&%$$@@+..O++++...+@&$#++...++@@@++...O@&$@@XX.Oo+++... .+@#&$#@XXXXo++@++. .++#&",
-"%$#@oXXooOO+oOO+@#$&$#@O. .oOOOOOo...++&$#@OOoXX+++++XoXXo@&$$@XXXoo+++++ooooO#&#@+XXXOo++++O...+@#&$$@OOOXXO+OO+oooXo@&$$@OOoXXO+++@#$%&&&&$$@XXXoo+++++oXooo#&$#@+XXXOO+++OO.XX+@&%%$#@@++...++@@#$$%&$@+. .OO++O..O+@$%%&$#@+XXXOO+++XXooo+#&%%$#@++..OOOO+...+@&$#+O...++@@@++...++&$#+XXXOO+++.. ..+@$&$$@XXXoo+++OO...+@$&",
-"%$$#OooXo+O+oO++@$$&$#Oo  ...OOO..   oO&$#@. .  . . ....+@#&%$#++OXX. ...XXX+@#&#Oo   .. . . Xoo@#$&$#@.. . . . ... Xo@&$#@..  . ..++$$%&&&&%$#++O.....  XXX+@#&$#Oo  ...+++.... oO&%$$Ooo     ..ooO$$%&$#@oXX. ...XX@@$$%%&$#Oo   ..+++Oo . oO&%$#@. .  .... .  @@&$#Oo  .oo@#@oX   oO&$@+. . .+++oo   +@#&%$#++O...... ooo@#$&",
-"&%$#@+O... ...+@@$%&$#Oo.  ..O+O..  .oO&$#@ ... . .. ...@@$&%$$@++XX.. ..XXX@@$&#Oo . ... . .Xoo##$&$#+. . . . .. ..oo#&$#@. ... . ++$%%%&&&%$$@++.. ....XXX+@$&$#Oo.  ..++O . ..OO&%$#Ooo... . .ooo$$%&$$#ooo .. .Xo@#$%%&&$#Oo . ..+@@++. .oO&%%#@ . . .... . .+#&$#Oo.  oo#@#oo . oO&$#+.  . @@@oo.. @@$&%$$@++... ...oOO#$$&",
-"%%%$#@+.......+@#$%&$#@@+++++@@@++++++#&$$@@+O+O+++++++@@$$&&%$$##@@+++++@@##$$&$#@++O+O+++++@@##$%&$$#++++++++O++++@@#&%$#+++O++++@#$%&&&&&&%$$##@@++O+++@##$$&%#@@O++++@@@++++++#&%$$@@++++O+O++@#$$&&%$##@@++O+O@@#$$%&&&%$@@+O+++###@@+@+@@&%%$#@+++++O++O+++##&$$@+++++@###@@+++@@&$$#+++++@#@@@+++##$&&%$$##@@+++++@###$%&",
-"&%%$$##@@+++@@##$%&&%$#@@@+@@###@@+@@@#&%$#@@+@+@+@@@@@##$%&&%%%$###@+@+@@##$$%&$$#@@+@++@+@@##$$%%&%$$@@@+++++@+@@@@#$&$$$@@+@++@##$%%%&&&&&%%$$$#@@@+@@###$$%&%$#@@+@@@###@+@+@@#&&%$#@@@++@+++@@#$%%&%%$$#@@@+++##$%%&&&&$$#@@@@@@##$$##@@##&&%$$@@@+++@++@+@@#$&%$##@@@@##$###@@@##&%$#@@@@@#$$##@@@#$%&&%%%$###@@@@@##$$%%&",
-"&&&%%$$##@@@##$$%%&&%%$###@##$#$######$&&%$####@###@###$$%%&&%%%%$$$#####$$$%%%&%$$###@#@####$$$%&%&%%$###@###@######$%&%%$###@##@#$$%&&&&&&&&&%%$$$######$$%%&&%%$###@##$$$######$&%%%$$###@#@@###$%%&&%%%$$$#@#@#$$$%%&&&&%$$##@###$$%$$###$$&%%%$#####@#@#@###$%&%%$#####$$%$$#####$&%%$#####$$$$$##$$%%&&&%%%$$$#####$$%%&&&",
-"&&&&%%$$$$#$$$%%%%&&&%%$$$$$$$%%$$$$$$%&&%%%$$$$$$$$$$$%%%&&&&&&&%%$$$$$$$%%%&&&%%$$$$$$$$$$$$%%&%&&&%%$$$$$$$$$$$$%$%%&&%%%$$$$$$$%%&&&&&&&&&&&&%%$$$$$$%%%%&&&&%%$$$$$$%$%$$$$$%%&&&%%$$$$$$$$$$$%%&&&&&%%%$$$$$$$%%&&&&&&&%%$$$$$%%%%%%%%$$%&&&%%$$$$$$$$$$$$%%%&&%%$$$$$%%%%%$%$$%%&&%%$$$$%%%%%%%%$%%&&&&&&&%%$$$$$%%%%&&&&",
-"&&&&%&%%$%%$%%%&&&&&&%&%%%%%&%%%%%%%%%&&&&%%%%%%%%%%&%%&&%&&&&&&&%&&%%%%%&&&&&&&&&&%%%%%$%%%%&&&&&&&&&&%%%%$%%%$%%%%%&%&&&%%%%%%%%&&%&&&&&&&&&&&&&&&%%%%%%&&&&&&&&%&%%%%%%%&%%%%%%%&&&%&%%%%%%$%%%%%&&&&&&&&&&%%%%%%&&&&&&&&&%&%%%%%%&&&&%%&%&&&&&&&%%%$%%%%%%%%%&%&&%&%%%%%%%&%&%%%%%&&&&&%%%%%&&&%%%%&&%&&&&&&&&%&%%&%&&&&&&&&",
-"&&&%&%&%%%%&%%&&&&&&&&&&&&&%&%&%&%&&&&&&&&&%&%&%&&%&%&&&&&&&&&&&&&&%&%%%&&%&&&&&&&&%%&%%%&%&&%&%&&&&&&&&&&%&&&&&&%&%&&&&&&%&&%&%&&%&&%&&&%&&&&&&%&%&%&&%&%&%&&&&&%&&&%&&&%&&&%%&%&&&&&&%&%&%&&&%&%&%%&%&&&&&&%&%&%&%&%%&&&&&&&&&&%%$$$$$$%%&%&&&%&%%%%%%%&&&&&&&&&&&&&&&&%%%$$$$$%%&%&&&&&&&&&&%&%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"&&%%%%%%%%%%%%%%%&&&&&&&&%%%%%%%%&%&&&&&&%&%%%%%%%%%%%%&&&&&&&&&&%%%%%%%%%%%%&&&&&%%%%%%%%%%%%%%%%&&&%%%%%%%%%%%%%%%%%%&&&%%%%%%%%&%&%%%%%&&&&%%%%%%%&%&%%%%%%%&&&%%%%%%%%%%%%%%%%%&&&&%%%%%%%%%%%%%%%&&&&&&%%%%%%%%%%%%%%%&&&&%%%$#####$$%%&&&&&%%$$$$%%%%&&&&&&&&&&&%&%%$$#####$$&%&&&&&&&&&%%%$%$%%%&&&&&&&&&&&&&&&&&&&&&&&&&",
-"%%%$$$$$$$$$$$%%%%&&&&&%%%%$$$$$$%%%%&&&&%%$$$$$#$$$$%%%&&&&&&&%%%$$$$$$$$$$%%%&%%%$$$$$$$$$$$$$%%%&&%%$$$$$%%$%$$$$$%%&%%%$$$$$%%%%$$$$$$%&%%%$$$$$%%%%%$$$$$%&&%%$$$$$$%$$$$$$$$%&&%%$$$$$$$%$$$$$$$%&&%%%%$$$$$$$$$$$$%%&&&&&%$#++OO+@#$%%%&&%$$####$$%%&&&&&&&&&&&&%%$#@OOO++#$%&&&&&&&&&&%$$$#$$%%%&&&&&&&&&&&&&&&&&&&&&&&&",
-"&$$###@#@#@####$$%%&&&%%%$$#######$$%%%&%$$$#@#@######$$%%&&&%%%$$$##@#@###$$%%&&$$$###@@#@@####$%%&%$$######$$######$$&%$$$####$$$$$#####$&%$$$#####$$$$#####$&%$$#######$$######$&%$$######$#$######$&&&%$$###@#@#@####$$&&&&%$$@OOooO@#$$&&&&%$#Ooo+@$%%%&&&&&&&&&&&%$##@OoOOO##$%&&&&&&&&%%$#+++#$%%%&&&&&&&&&&&&&&&&&&&&&&&",
-"%$##@@+@+@@@@@@#$$%&%&%$$#@@@+@@@##$$%%&$$#@@@@+@+@@@##$$%%&&&%$$#@@@+@+@@@@#$$&%$#@@+@@+@+@+@@@#$%&%$##@@@@###@@@@@##$&%$#@@@@@@####@@@@@#&%$#@@@@@####@@@@@##&$$#@@+@@@@@@@@@@@@#&$$#@@@@@@@@@@@@@@@#&%%%$##@@+@+@+@@@@#$&&&%%$#@...XX+@#%%%&&%$#ooo++#$%%&&&&&&&&&&%%$#@+XX...@#$%&&&&&&&%%$#@+OO@#$%%&&&&&&&&&&&&&&&&&&&&&&&",
-"$#@..........ooO#$$&&%$#@@oo.....++@$$%&$#Oo........oo@##$%&%%$#@@..........@#$&$#@.............@#$&$#@.....+++oo...oO#&$#Oo...oo@#@oo...oO&$#Oo...oo@@@oo...oO&$#Oo.....+++.....OO&$#Oo.....+++.....oO&&$$#ooo..........@#&&&&%$#@  .XX+##%%&&&%$#+OOoo@$$%&&&&&&&&&&&%$#++XX...@#$%%&&&&&&%$#@+ ..+@$%%%&&&&&&&&&&&&&&&&&&&&&&",
-"$#+... . . ..ooo@#$&%$$#@+XX.....OO+#$%&$#Oo.. . .. Xo+@#$$&%%$#++..........@@$&$@+.. .. ... ...+@$&$@+.....++@Xo...oO#&$#Oo...oo@@@oX...oO&$#Oo...XX@+@XX...oO&$#Oo.. ..OOO.. ..oO&$#Oo.. ..O+O. ...oO&%$##oXX.. . .....+@&&&%%$@@.. XX@@#$&%&&%$#+Oooo@#$%&&&&&&&&&&%&$#@+XX ..+#$%&&&&&&&%$#++. .++#$%%&&&&&&&&&&&&&&&&&&&&&&",
-"$@@. ....... oXo@@#&%$#@++XX . ..OO+@#$&$#oo .... ..XX++@#$&%$#@++.. . .....+@$&$@+... . . ... .+@$&$#+.. ..+++XX. .oo@&##oo. .Xo@@@oo ..oo&##oo. .XX+++XX. .oo&$#oo... .+OO .. .oo&$#oo .. .OOO... .oo&&$#@oXX. .. .  ..+@&&&&%$@+...++#$$%&&&&%$#+OOXX@#$$%&&&&&&&&&%&%$##++...@@$$&&&&%&%$$#+O. .++#$%%&&&&&&&&&&&&&&&&&&&&&&",
-"$#@OooXXoOOOOXXXoO#&$#@oXXooOOOoO...+@$&$#@+...ooOOOXoXXX#$&%$#oXXXXOOOoo. .+@#&$@+...OO . Oo...+@#&$#+...oO@@@++...O+#&$#+O...++@@@++...O+&$#+O...OOooOOO...O+&$#@+ ..XX+++XX...++&$#@+...Xo+O+XX...++&%$#@XXXooOOOXo...+#&&&%$$#@. .+@#$%&%&&&%%$#@+..+@#$$&&&&&&&&&&%%%$#@+. .+#$%%&&&&&%$#@ooXXXXo@#$%&&&&&&&&&&&&&&&&&&&&&&",
-"$$#OooXXOOOOoXXXoo@&$#@XXXXoOO+Oo. .+@#&$#@+...ooOOOXXXXX@#&$#@ooXXXOOOOO. .+@$&#@+ ..oO.. OO...+@$&##@...Oo@@@++...++#&$#++...++@#@+O...++&$#+O...O+ooo+O ..++&%#@+. .oXOOOoX. .+@&$#@+.. oXO+OoX. .+@&&$$@XXXoooOOXX ..@@&&&&%$@+...+@#$%&&&&&&%$$#@..++@$$%%&&&&&&&&&%%$#@+...+#$%%&&&&%%$#@oo.XXXX@#$%%&&&&&&&&&&&&&&&&&&&&&",
-"%$#+OoXX++@@+oooXo@&$@+...O+@@@++XXXoo#&%#@+XXXoO+++OoXXX@#&$#@XXXoo++++OoXo+@$&$@+...+O ..O+ ..+@#&$@@XXXOO@##@+...++#&%$@+XXXO+@#@++XXX+#&$#@+...OO. .OO...++&%$#@+Oo..oXo. OOO@#&%$#@OOoXXOOO..OO+@#&%$$@OooOO+OO..OOO@$&&&&$$#@...@@$%%%&&&&&&$$#@ooooO#$%%&&&&&&&&&&%%$#+...@@$$&&&&&%$#@+..OOO..@@#%%&&&&&&&&&&&&&&&&&&&&&",
-"$$#+OoXX++@+@oooXo@&$@+. .O+@##@+XXXoo@&%$#+XXXOo+++OoXXX@#&$$@XXXoo+++++Xoo@#$&$@+...O+ . +O...+@$&$#+XXXO+###@+...++$&$$#+XXX++@##+OXXX@@&$#++. .oO. .oO ..+@&%$$#+OO. oXX..OO+#$&%$$#++oXXOOO..OO+#$&&$$#OOoOOO+O. OO+#$&&&%%$@+. .+#$$&&&&&&&&%$#@OoooO@#$%&&&&&&&&&&%%$@@ ..+#$$&&&&%&$#@+..+O+..+@#$%&&&&&&&&&&&&&&&&&&&&&",
-"%$#++oXX++@@+OooXo@&$@+...O+####@XXXXo#&%$#@XX.Oo+++oOXXX@#&$$@oXXooO++++Xoo@@$&$#@...++.. ++...@@$&$#@XXXo+@###+...+@#&%$#@XXXO+@@@+OXXX@#&$$@+...Oo . OO...+@&&%$#@+O..XoX .O++#$&&%$#++OXXOOO..O++#$&&%$#+OO+O+OO..O++#$&&&&%$@+. .+##%%&&&&&&&&%$#Ooooo@#$%%&&&&&&&&&&%$#+.. @@$%%&&&%%$#@+..+++..@@$$%&&&&&&&&&&&&&&&&&&&&&",
-"%$#+OoXX++@++XooXo@&#@+...+@#$$#@oooXo@&$$#+XXXXoooo..XoO@$&$$#+OO... .ooOO+@#$&$##@++++ ..++++@#$$&$#+XXXO+#$#@@...+@#&%$#@oXXoo@@@OoXXX@#&$#@+...Xo  .XX...+@&%%%$#@+oo. .oo@@#$%&&%%$#@+XX.. XX@@#$%&%%$$##@@+XXXXX@@#$%&&&&$$#@...+#$$&&&&&&&&&%%$#@oXXOO##%%%&&&&&&&%$$#@...+#$$&&&&&&$#@@Oo@+@OO+@#%%&&&&&&&&&&&&&&&&&&&&&",
-"%$$++OXXO++++oXoXo#&#@+...+##$$#@OoOXo@&%$#+XXXXXooo..Xoo#$&%$#+OO. .. oo+++@$$&%$$#@+++.. ++@@@$$%&$#+XXXO+@#$@+...+@#&%%$@ooooo+@+OoXoo@$&$#@+...Xo   XX...+@&&%%$$#@Oo . Oo@@$$%&&&%%$#@XX ..XX@#$%%&&&%$$#@@+XXXXX@#$$%&&&%$$#+...+#$%&&&&&&&&&&%$$@ooXoO@#$%&&&&&&&&&$$@+...+#$$&&&&%%%#@@++#@#O+@##%%&&&&&&&&&&&&&&&&&&&&&",
-"%$#+Oo. .....XXX++#&$@+...+@####@OooXo@&$$#+XXX.....XX++@#$&%$##@+O+Xoo.....@#$&%%$$$#@+...+@##$$%%&$#+XXXO+###@@...+@$&&$$#+OOXX+++XXOO+#$&%#@+.....OOo.. ..++&&&%$##+oXXXXXo+#$$%&&&&%$$@++.. +@@$$%&&&&&%$##OO...++@@$$%&&&%$$#+...+##$&&&&&&&&&&%%$#@++..@#$%%%&&&&&&&%$@+.. @@$%%&&&&&%%$$###$$##$$$%&&&&&&&&&&&&&&&&&&&&&&",
-"%$#+OO . . ..XXX+@#&#@+. .O+@@#@+XXXoO@&%$#@XXX... .XX+@##$&%$##@@O+ooX.....@#$&&%%$$#@+. .+@#$%%&&&$#@XXXO+####+...++$&&%$#+OOXX+++XXOO+#$&%#@+. ...ooO ....+@&&%%$#@@oXXXXXo+@#$%&&&&&$$#++ ..+@#$%%&&&%%%$#@Oo...++@##$$&&&&$$@@. .@@$%%&&&&&&&&&&%$$@++..+##$%&&&&&&&%$$#@...+#$$&&&&&%%%$%$%$$$%$$%%%&&&&%%&%%%%%&%%%%%&%&&",
-"%$#+OO. .. . XXX@#$&$@+...O++@@++XXXoO@&%##+X.X.... XX++@$$&%$#@@+OOooo.....@@$&&&&%$##+...@@#$%&%&&$#+XXXO+@##@+...+@#&%%%$@+OXXO+OXXO++$$&$$@+... .OOo.....+@&%%$$#@+Xo.XXoo+@#$$&&&&%%$#@+. .+@#$%&&&&&%$##@Oo. .+++@##$&&&&%$#+...+##%%%&&&&&&&&&&%$$@@XX++@$$%&&&&&&%$#@+...+#$$&&&&&&&&%%%%&%%%%%%&&&&%&%%%%%%%%%%%%%%%%%&",
-"%$#+OoXXoOOOO+@@#$$&$#@oXo..oOooo. .++#&%$@@XXXooOOO..o++#$&$#@XXX++++OOO...+@#&&&%%$#@+. .+@#$%&%&&$#@XXXOO@@@@+...+@$&&%%$#@+..OOO..+@#$%&%$#+XXX .OOO. XXX+#&%$$@+OO..OOO..oOO#$&&&&&%$#@+...+@#$%%&&%%%$#@+..ooo++XXo@#&&&&%##@. .+@#$%&&&&&&&&&&&%$$#@XXO+@#$%&&&&%&%$#@+ ..@@$%%&&&&&&&&&&%&&&&&&%&&&&%%%$$$$$$$#$$$#$$$%&",
-"$$#+OoXXOOOO+@##$$%&$$#ooX..ooOXo . +@#&$$@+XXXOO+OO .OOO@#&$@@XXX++O+++O...+@$&&%%%$#@+...+@#$$%&&&$#@XXXOO+++++ ..+@#&&&%%##@..OOO..@#$%%&$$#+XXX..OOO. XXX+#&%$#@Ooo .OOO .oOO@#&&&&%$$@@+. .+@#$$%&&&%$#@++ .ooo+OXXX+@&&&%%$@@...+@#$$%%&&&&&&&&&&%$#@oXO++#$%&&&&%&%$#@+.. @@$%%&&&&&&&&&&&&&&&&&&&&&&%$$###@@###@#@###$$&",
-"$#@oXX..XooO+##$%%%&%$##++XX . XXOOOO+#&$#+O.. Xo+++Xo...+@&$@+ . XooooXo ..+@$&&&%$#@Oo  .OO@#$%%&&%$#OooXXoooooXXX@#$&&&%%$#@oo. .Xo@@$%%&%$#@XX.XXO+OXX.XX@#&$#++ . XXOOOXX. .O+&&&%%$#@oo . OO@#$%%&%%$#oXX..oXooo...+@&&&%%$#+. .oo@#$%&&&&&&&&&&%&$$@+OXXX@#$&&&&&$$#@Oo...+#$%&&&&&&&&&&&&&&&&&&&&&&&$#@++OOOOOOOOOoO++$&",
-"$#@oXX..Xoo++#$%%&&&%$#@@+XX . XXOOOO+#&$#+O...oX+@+oX...++&#@+.  oXooooX ..+@$&&%$$@@oo.. oO@#$%%%&$$#+OoXXooooXXXX@#$&&&&%$#@oo. .oo@#$%&&%$#+XXXXX++OXXXXX@#&%#+O  .XX+O+XX. .O+&&%%%##+Oo ..oO@#$%%&%$$@ooX. oXooo ..+@&&&&%$#+...oo@@$$%%&&&&&&&&&&%$#+OXXX@#$&&&&%%#@@oo ..+##%%&&&&&&&&&&&&&&&&&&&&&&$@+OOOooOOOOOoooO+#&",
-"%#@oXX..ooo+@#$%%&&&%%$++o. XXX.....O+#&$#+O...Xo+@+oo...++&$@+ . XooooXo...@#$&&%$$@@oo . Oo+@#%%&&%$#+OOXXXooooXXX@#$&&&&%%$#Oo.. oo#$$%%&%$#@XXXXX+++XXXXX@#&$#+O.  XX+OOXX ..O+&&&%$#@@oo.  oO+@#%%&&$$#oXX. ooXoo...+@&&&%$$#@. .oo+@#$%&&&&&&&&&&%%$$@+...+#$&&&&%$#@+oo...@#$%&&&&&&&&&&&&&&&&&&&&&&&#@+OooooooooooooOO@&",
-"$#@oXXXXXXX++$%%&&&&%%$@+O. XX.. ...O+#&%#+OXXXXX@@@++XXXO+&$#@oooXXXXXXXOO+@#$&&&%#@@XXXXXXo+@#$%%&%$$##+XXXXXXXOO+#$%&&&&%%$#+OXXXO+#$%&&&%%$#Ooooo@@@ooooO@$&$#+OXXXXX+++XXXXXO+&&&&$#@+XXXXXXX+@#$%&%%##OOoXXXXXXXXXX@@&&&&%$#@oXXXX+@#$%%&&&&&&&&&&%%$#@...@#$&&&&%$#@+XXXXX@#$%%&&&&&&&&&&&&&&&&&&&&&&#+OXXXXXXXXXXXXXXX#&",
-"$#@oXXoXXXo+@$%%&&&&&$$@+O. XXX.....O+$&$$++XXXoo@##@@oXo++&$#@OooooXXXXX+++#$%&%%%$#@oXXXXXo@@#%%&&&&$$##ooXXXXX++@#$%&&&&%%$$@+oXo++#$%&&&%%$#OOOOO@#@OOOO+#$&%$++XXXXX@+@XXXXo++&&%%%#@@oXXXXXo@@#%%&%%$#OOoXXXXXXXXXo@#&&&&%$#@ooXXX++#$%&&&&&&&&&&&%%$##...@#$&&&%%$#@+XXXXX@#$%&&&&&&&&&&&&&&&&&&&&&&&#+OXX.XXXXXXXXXXXo@&",
-"%$##@@@@@@@#$$%&&&&&&%$$#@+++++OO+++##$&%$###@@@##$$##@#@#$&$$###@@@@@@@@@#$$%%&&&%$$##@@@@@@#$$%&%&&%&$$##@@@@@@@#$$%&&&&&&%%$##@#@#$$%%%&&&%$$##@##$#$#####$%&%$###@@@@####@@@@#$&&&&%$$#@@@@@@##$$%%&&%%$##@@@@@@@@@@@#$&&&&%%$#ooooo+@#$%%&&&&&&&&&&%&%$#@@@#$$&&&&%$#@+oXXXo##%%%&&&&&&&&&&&&&&&&&&&&&&$++XXXXXXXXXXXXXXo#&",
-"%%$$$####$$$$%%&%&&&&&%$$#@@#@#+@+@@#$%&%%$#####$$$$$$$#$$$&%%$$#########$$$%%%&&&&%$$$#####$$$%%&&&&&&%%$$######$$$%%&&&&&&%%%$$##$$$%%&&&&&&%%$$$$$$$$$$#$$$%&%%$$###$#$#$#$####$&&&&&%$$$#####$$$%&%&&&%%$$$####@####$$$&&&&&%$$#@@@##$$%&&&&&&&&&&&&&%%$$#@@$$%&&&&&%$$#@@@@##$%%&&&&&&&&&&&&&&&&&&&&&&&$$##@@@+++++++@@@#$&",
-"&%%$$$$$$$$%%%&&&&&&&&%%$$#@###@#@##$$%&&%%%$%$$$%&%%%%$$$%&&%%$%$$$$$$$$$%%%&&&&&%&%%$$$$$$$%%&&&&&&&&&%%%$$$$$%$%%%&&&&&&&&&&%%%$$$%%&&&&&&&%%%$%$%%%%%$%%%%&&&%%$%$$$%$%%$$$$$%%&&&&%%%%$$$$$$$%%&%&&&&&%%$$$$$$$$$$$$%%&&&&&%%$$$##$$$%%%&&&&&&&&&&&&&%%$$#$$%&&&&&%%%$$$#$#$$%%&&&&&&&&&&&&&&&&&&&&&&&&$$$###############$&",
-"&&&&%%%%%%%%&&&&&&&&&&&%%%$%%%$$$$$$%%&&&&&%%%&%&%&&%%&%&%&&&&&%&%%%%%&%&%&&&&&&&&&&%&&%%%%&%%&&&&&&&&&&&%&%%%%%%%&&&&&&&&&&&&&%%&%&&&%&&&&&&&&&&%&%&&&&&%&&&&&&&&&%%%%%%%%%%%%&%&&&&&&&&%&%&%%%%%&%&&&&&&&&&&%%%%%%%%%&%&&&&&&&&%%%$$$$%%%&&&&&&&&&&&&&&&&%%%%%%&%&&&&&&%%%$$$$%%%&&&&&&&&&&&&&&&&&&&&&&&&&%%%$$$$$$$$$$$$$$%%&",
-"&&&&&&&&%&%&&&%&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%%&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%&&&&&&&&&&&&&&&&&&&%&%%%&%&&&&&&&&&&&&%&%&%%%%&&&&&&&&&%%%%%%&&&&&&&&&&&&&&&%%%%%%%%&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&%&%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%$$$%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&$%$%$%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%$$$$$$$%%%&&&&&&&&&&&&&&&&&&&&&%%%$$$$%%%&&&&&&&&&&&&&&&&%%$%$%%%&&&&&&&&&&&&&%%%$$%%%&&&&&&%%%%$$$%%%%&&&&&&&&&&&&%%%$$$$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&%%%$$%%%&&&&&&&&&&&&&&&&&&&&&&&&&&%$$#$##$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$$##$$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&%%$$#######$%%&&&&&&&&&&&&&&&&&&&&&%$$$##$$$%%%&&&&&&&&&&&&%%%$$#$#$%%&&&&&&&&&&%%%$$#$$$$%%&&&&%%$$##$$$%&&&&&&&&&&&%%%$$###$$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&%%$$$##$%%%&&&&&&&&&&&&&&&&&&&&&&&&%$##@@@#$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$$##@@@#$$%&&&&&&&&&&&&&&&&&&&&&&&&&%%$##@@@+@@##$%&&&&&&&&&&&&&&&&&&&&&%$##@@@#$$%&&&&&&&&&&&&&&%$###@##$%%&&&&&&&&&&%$##@@#$$%%&&&%%$##@@@#$$%%&&&&&&&&%&%$$#@@@@@#$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&%$#@+++#$%%&&&&&&&&&&&&&&&&&&&&&&&&$#OO...+@$%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$#@..ooo#$%&&&&&&&&&&&&&%&&&&&&&&&%&%$##ooX.....@#%&&&&&&&&&&&&&&&&&&&&&$#OO...+@$$%%&&&&&&&&&&%%$$+O...#$$%&&&&&&&&%%$$@...O+$$%%&&%$#@...oO#$%%%&&&&&&&%%%#@+.....##$%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&&&&&&&&&",
-"&&%&%$$@@OO+@#$%%&&&&&&&&&&&&%%%%&&&&&&&$#Oo...+@#$%%&&&&&&&&&&&&&&%%&%&%%&%&&&&&&&&&%%$$@@..oXo##$&&&&&&&%&%%&%&%&&&&&&&&&%$$#+ooX.....@#$&&&&&&&&%&%&%%%&%&&&&$#Oo...+@#$%%&&&&&&&&&&&%$#+O...@#$%%&&&&&&&&%$#@...O+#$%&&&%$#@...oo@#$%%&%&&&&&&%$@@+.....@#$%&&&&&&&%&%&%&%%%&%&&%&&&&&&&%%&%&%&%&%&&&&&&&&&&&&&%&%&%&%&&&&&&",
-"&&&&%$$++. .+@$%%%&&&&%&%%%%%%%%%%&&&&&&$#@+XXXO+#$$%%%%&&&&&&&&%%%%%%%%%%%%%&&&&&&%&%%$$#+OoXXX@#$&&&&%&%%%%%%%%%&%&&&&&%%%$#+O...OOOO+#$$&&&%&%%%%%%%%%%%%%%%&$#@+XXXO+#$$%%%&&&&&&&&&%$#+OXXX@#$&&&&&&&%%%$$#@XXXO+#$%%&&%%#@OOoXX##$%%%%%%&&&&&%$#@+O...@#$%%&&&&&&%%%%%%%%%%%%%%%&&&%%%%%%%%%%%%%%&&%&&&&&%&%%%%%%%%%%&&&&&",
-"&&&&&$$+O. .+@#$%&&&&&&%%%$$$$$$$%%%%&&&%#@+XXXOO@##$$%%%%&&&&&%%%$$$$#$$$$$%%%&&&&%%%$$#@@ooXXX@#$&&%&%%%$$$$$$$$%%&&&&&%%$#@Oo. .oOO++#$%&&%&%%%$$$$$$$$$$$%%&%#@OXXXOO@#$$$%%%%&&&&&%$$#+OXXX@#$%%&&&&&&%%$#@+XXXO+#$%&&&%$$#OOoXX+##$$$$%%&&&&%%$$@+O...@@$%&&&&&%$%$$$$#$$$#$$$%%&&&%%$$$$$$$$$$$%%%&&&&&%%%%$$$$$$$$%%%%&&",
-"&&&%%$$++ . ++#$%%&&&%%%$$#######$$%%&&&%#@+XXXoO+@###$$$%%&%%%$$$####@#@##$$%%&%%%$$$##@@+OoXXX@#$&&%%$$$###@###$$$%%&&&%$##@Oo...OOO++#$%&&%%$$$###@@#@###$$$&$$@+XXXoO+@@##$$%%&&&%&%$#@+OXXX@#$%&&&&&%%$$#@@+XXXO+#$$&&&&$$#OOoXX+@####$$$%&&&&%%$#+O. .+#$$&&&&%%$$####@#@##@##$$%&%%$$##########$$%%%&%&%$$$###@###$$$%&&&",
-"&&&&%%$#@oXooo#$%&&&%&%$#@@+OOO+@@$$%%&&$$#+XXXooOOO++##$$%&&%$$##++OOOOO+++#$%&&%$$##++OOooXXXX+#$&%%$$##++OO+O+@#$$%%&%$$@+OXXXXXooOO+#$%&%%$$##++O+OO+OO+@@$&%$#+XXXooOOO++#$$%%&&&&$$#@OoooO@#$%%&&&%&$$@++OooooOO@$%%&&%%$#+OOXX++@O+++@$%&&&&&%$##+...@@$%%&&&%$@@+++OOOOOO+O+##$&%$@@+O+++OO+++#$$%%&%%$$##+++OOO+@#$$%%&",
-"&&&&%%$$#OoooO@$$&&&%%$$@@+OOOoO++#$$%%&%$@+XXXoooooOO@@#$$&%$$#@++OOOOoOOO+@#$&%$$@@+OOoOoooXXX@#$&%$$@@@OOOoOoO@@##$%&%$#++OXXX.XooOO+#$$&%$$@@@OOOoOOOoOo+@#&%$@@XXXooooOO+@@#$%&&%%$#@+OoooO@#$%%&&&%%$#++OOooooO+@#$%&&%%$#+OOXX+++OO+++#$&&&&&%%##+...+#$$&&&&$$@+OOOOoOoOOOOO@#$&$#@+OOO++OOo++@@#$%&%$$@@@OOOoOOO@@##$%&",
-"&&&&&%%$##@@OO#$%%&&&%$#ooo.......+##%%&%$#+XXX ......Xoo#$&$$#ooX..XXX.. . @@$&%$#ooo...... XXX+#$&$$#ooo..XXX..Xoo#$$&%$#ooo.... XXooO#$%&%$#ooX..XXX ....oO#&$$#+XXX ......O++$$&&&%$#@+XX ..+#$%&&&&&%$#OooXX.....@#$%&&&%$#+OoXXOoO. ooO#$&&&&&&%##+. .@@$%%&&&$#Oo............oo#&$#Oo...XXXXX..O++$$&$$#ooX..XXX..Xoo#$%&",
-"&&&&&%%%$##@++#$%%&&%$$#oXX.......+@#$%&%$#+XXX .... .XXo@#&$#@oXX. XXX . . +@$&$#@oXX. ... .X.X@#$&$#@oXX. XXX .XXo@#$&%$#OoX.. ..XXXoo#$%&$#@oXX..XXX . ..oO#&%$@@XX.. ... .oOO#$&&&%$#@+XX. .+#$$&&&&&%$#OooXX.....@#$%&&%%$#++OX.OOo. ooO#$&&&&&%%$#+...+#$%%&&&$#Oo. . ... . ..oo#&$#Oo. .XXXXX .oOO#$&$#@oXX. XXX .XXo@#$&",
-"&&&&&&&%%$$$++$$%&&&&$$@ooX.......+@@$%&%$#+XXX. .....XXX@#&$#@oXX. XXX..  .+@$&$#@oXX...... XXX+#$&$#@oXX...XX..XXo@#$&%$#Ooo...  XXoOO#$%&$#@ooX ..XX . ..oO#&%$#+XXX.......oOO@$&&&%$#@+XX . @@$%%&&&%%$#OooXX.....@#$%%&&%%#+OOXXooO .ooO#$&&&&%&%##@...@@$$&&&&$#Oo... . ... ..oo@&$#Oo. ..X.XX..oOO@$&$#@oXX..XXX..XXo@#$&",
-"&&&&&&&&%%$$$$$%%&&&%%#@+OOooooo..O++$$&%$#@XX.XX+++OO...+@&$@+...oOO++OO. .+@#&$@+...Oo++OXXXXX@#$&$@+.. Oo+OOoO...+@$&%%$#@+ooXXX++@@#$$%&$@+...oO++OXXXXX+@#&%$#+XXXXX+O+ooXXX@#&&&&$$#@@+...+#$%%&&&&%%$##@+++OO..+#$%%&%%$#+OO.....oo+@#$$&&&&&%%$@+. .+#$$&&&&$#@+XXXooXXXoXooXo@&$#@+XXXXXO+OooXXX@#&$@+...oo++OOO...+@$&",
-"&&&&&&&&&&%%%%%%&&&&&$$@++Oooooo..O++#%&%$#+XXXXX+++OO ..+@&$@+...OO@+@OO. .+#$&$@+.. OO+++XXXXX+#$&$@+...oOO+OOo. .+@$&%%$#@@OoXXX+@##$$%&&$@+...oO+@+XX.XX@#$&%$#+XXXXX+++ooXXX@#&&&&%%$#@+ ..+##%&&&&&&%%$$##@+++..@@$%&&&%$#@Oo... .oO@@#$%&&&&&&$$#@...@@$%&&&&$$#+XXXoooXoXXooXo@&$$#+XXXXX+++ooXXX@#&$@+. .OO+@+OO ..+@#&",
-"&&&&&&&&&&&%%&&&&%&&%$#@XXX..XXX  OO+$$&%$#+XXXOO+@+++...+@&$@+. .+@@##@@+O+@#$&$@+...++@@+OoXXX@@$&#@+   .... ..  .+@#&%&%$#@oooXo@@#$%%%&&#@+...oo+++XXXXX+#$&%$#@XX.OO@@++OXXX@#&&&&%%$#@+...+#$$&&&&&&%%%$$$#@++..+#$$&&&%$#+OO.  . O+@#$%%&&&&&&%$@+. .+#$$&&&&%$@@X.XoooXXooooXo@&$$@@XXXoO@@++oXXX@#&$@+...+@@@@++...+@$&",
-"&&&&&&&&&&&&&%&&&&&&%$#@XXX. X.X..OO+#$&$$#@XXXOO@@@@+...+@&#@+...+@@###@+++@$$&#@+...++@@@OoXXX@#$&#@+ . .. . ...  +@$&&%%$#@oooXo@#$%%&&&&$#+. .oo++OX.XXX@#$&%$#+XXXOO@@@OoXXX@#&&&&&%$##+...+@$%%%&&&&&&&&%%$#++..@#$%&&%%$#++o.. ..O+@#$%%&&&&&%$##@...+@$%%%&&$$#+XXXOooXoXoooXo@&%$#+XXXOO@@@OOXXX@#&#@+...+@@##@+...+@#&",
-"&&&&&&&&&&&&&&&&&&&&%$#+XX...XXX  OO+#$&%$@@XX.OO+@@++...+@&$@+...+@@####+@+##$&#@+...+@@@+OOX.X+#$&#@+ . ..... . . +@#&&%%$#@ooXoo+#$$%%&%&$#@ooo.......X.X@#$&%$#+XXXOO@@@+OXXX+#&&&&&%$#@@. .@@#$%&%&&&&&&%&$$#@+..@@$%%&&%$#+OO.. . O+@##%%&&&%&%$$@+...@@#$%&%&%$#+XXXooXoXooooXo@&%$@@XXXOO@@@OOXXX+#&$@+...+@@@@@+...+@#&",
-"&&&&&&&&&&&&&&&&&&&&$$@+...OOOOO..OO+#$&$$@+XXXXX+@+Oo. .+@&#@+. .oO@###@+++@#$&$@+. .oo+++XXXXX+##&$@+...XXoOOOooXo+#$&&%%$#@oooXo@@#$%%%&&$$#Ooo. . . .XXX+#$&$$#+XXXO+@@@+oXXX+#&%&%%%$#@+...+@#$$%&&&&&%&%%$#@@+..@#$%%&%%$#+OoXXoXo..+@#$%&&%&%$$#@+. .+@#$$%&&$$#+XXXOOXoXXoooXX@&$$@+XXXOO@@@OoXXX+#&$@+. .oO@@@Oo ..+@$&",
-"&&&&&&&&&&&&&&&&&&&&$$@+...+O+O+..OO+@$&$$@@XXXXX+++oo...+@&$@+...oO+@@@@OO++@$&$@+.. OO+++XXXXX@@$&#@+. .ooOoOoOXoo@@$&&%$##+ooXoX+@##$$%&&%$##++OOOOOooXXX@#$&$$@@XXXOO@@@OOXXX+@&&&%$$#@@+ ..+@@#$$%&&%&%$$$$#@+O..@@$%&&%$$#+OoX.oXX..++@#$&&&%$$#@@+. .+@@#$$%&$##+XX.OoXXoooooXo+&%$@@XX.OO@@@OOXXX+@&$@+.. oo+++Oo...+@$&",
-"&&&&&&&&&&&&&&&&&&&&$$@+...+O+OO..oOO##&$#@+XX.XXO++oo. .@@&$#+...oo+++++OOO++$&$@@...oo++OX.XXX+@#&$#+.. XXOOOoOXXo@#$&%$$#@+oooXo++@@#$%%&%%$$#@OOOOOooXXX@#$&$#@+XXXO+++++oXXX@@&%%$$#@@++. .++@@#$%&&%%%$##@@++O..@#$%%&&$#@OOoXXXoX..O++@#&&%%$#@@++...++@@#$%&%#@+XXXoOoXXXoooXX@&$#@+XXXOO+@+OoXXX@@&$#+...oo+++oo. .@@$&",
-"&&&&&&&&&&&&&&&&&&&&%$@+. ...... ....@#&$$Oo... . .. .ooo@#&$#@ooo..........OO#&$#@ooX........ .o+#&$#@ooo. . ......+#$&%$#OoX. . ...ooO#$%&&%%#@@OOoooXXXXo@$$&$#Oo  . .+++.. . OO&&%$$Ooo. .  ..ooO#$&&&$$@++OOoXXXX@#$%&&%$#@...XX+O+  ...O+&&%$$Ooo .   ..ooO#$&$#+o. .XXXoo .Xo. O&$#OO. ...+++..  .oO&$#@ooo.......ooo@#$&",
-"&&&&&&&&&&&&&&&&&&&&%$#@.. . . .. ...@#&$#+o . .......ooO#$&$$#Ooo ...... ..O+$&$$#Ooo. . . .. .OO#&%$#Ooo..... ....@#$&%$#OoX.. . ..ooO$$%&&%$$@+OooooXXXoo#$$&$$OO. ...+++... .OO&&%$#OoX.. . ..ooO$$&%%$#++OOoXXXXX@$$%%&%$#@...oX+++ . ..OO&%%$#OoX.. . ..ooO$$&$#Oo. .XXoXo..oX..O&$#Oo.. ..+++... .OO&$$#Ooo.. . . ooO#$%&",
-"&&&&&&&&&&&&&&&&&&&&%$$#+++OOOOO+OO++##&$$@++OOO+OOOO++@##$&%$##@@++O+OO+O++@#$&%$##@@O+OOOOOOO++#$&%$##@@O+OOOO+++@#$$&%$#@++OOOOOOO++@$$%&%$#@+XXXXXXXX+@##$%&$#@+OOOO+@@@OOOO++@&&%$$@@++OOOOOO++@$$&&%$#OooXXXXX++#$%%&&%$##O+O++@@@O+OOO@@&&%$$@@+O+OOOOO++@$$&%$@+OOO++++OOO++OO+&$$@+OOOOO@@+OOOO++@&%$##@@+O+O+O++@##$%&",
-"&&&&&&&&&&&&&&&&&&&&&$$$@@+@++++++++@#$&%$#@@++++++@++##$$%&%%$$##+++++++@@@#$$&%%$$#@@+++++@+++@#$&%%$$##+++++++@@@$$%&%%$@@+++OO+++@@#$%&&%$#@+XXXXX.oX@@#$%&&%$#@+O+++@#@+++++@#&&%%$#@@+++++++@@#$%&&%$#OooXXXXX+@#$%&&&&%$#+++@@@##+++++@#&%&$$#@@+++++++@@#$%&$$#@++++++@+++++++@&%$#@@++++@##+++++@#&%%%###+++++++##$$%%&",
-"&&&&&&&&&&&&&&&&&&&&&%%$##@@@@@@@@@@#$%&%$##@@@#@@@@@##$$%%&&%%$$$#@@@@@@@##$$%&&%%$$$@@@@@@@@@@##$&&%%$$$#@@@@@@##$$%%&%%$##@@@+++@@###$%&&%%#@+oXXXXXoO@#$%%%&%$##@@+@##$$@@@@@##&&%%$###@@@@@@@###$%&%%$$OooXXXXo@#$%%&&&%%%$@@@##$$##@+@@##&&&%$$##@@@@@@@###$%&%$$#@+@@#@#@@@##@@#&%%##@@@@@#$#@@@@###&&%%$$##@@@@@##$$%%&&",
-"&&&&&&&&&&&&&&&&&&&&&&%%%$$$$$#$#$$$$%%&&%%$$$$#$$$$$$%%%&&&&&&%$$$$$$$$$$$$%%&&&&&%%%$$$$$$$$$$$%%&&&&%$$$$$$$$$$$$%&&&&%%$$$$$$$#$$$$%%&%&%%$$#@@@@@@@#$$%%&&&&%%$#$$$$$$$$$$$$$%&&&&%%$$$$$#$$$$$%%&&&%$$##@@@@@##$$&%&&&&&%%$$$$$%$$$$$#$$%&&&&%$$$$$$#$$$$$%%&&%%$$$$$$$$$$$#$$$$$&&%%$$$$$$$$$$$$$$$%&&&&%&$$$$$$$$$%%&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&%%%%$%$$%$$%%%%&&&&%%%%%$%$$%%%%&%&&&&&&&&%%%$%$$%%%%&%&&&&&%&%%%$%$$%$%%%%%&&&&&&%%%$%$%%%%&%&%&&%%%%$$$$$$$$%%%&&&&&%%$$$######$$%%&&&&&%%%%$$%%%%%$$%%%%%&&&&%&%%$%$%$%%%%%&&&&&%%$$#####$$%%%&&&&&%%%%$%%%%&%$%$%%%%&&&&&%%%$$%$$%%%%%&&&%&%%$$$%%%%$%%$$%%%&&%%%%$$%%%%%%$%$%%%&&&&%&%%%$%%%%&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%&&&&&&&&&&%&%%%%%%%&&&&&&&&%&%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%$$$$%%&%&&&&&&&&&%%$$$%%&&&&&&&&%&%%$$$$%%&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$$$@@#$$%&&&&&&&&%%%$#@@$$%%&&&&&&%&$$$@@$$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%%%$$$%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$$##++#$$%%&&&&&&&&%$#@+@#$%&&&&&&&&%$##++##$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%$$$#$$%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$##@@++##$&%&&&&&&%%$$@+++#$$%&&&&&&&%$$#+O@@##$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&%&%&&&%&&&&&&&&&&&&&&&&%&%%&%&%&%&&&&&&%&%&&%&&&&&&&&&&&&&&&&&&&%&%&&%&&&&&&&%$#@@OO#$%%&%&&&&&&&&&%%&&&&&&%&&&&&&&&&&&%&&%&&%&&&%&&&%&&&&&&&%&&&%&&&&&%&&&&&&&%&%%&&&%&%&%&&&&&&&%&&%&&&&&%&&&&%&&&&&&&%&%&%%&%&%&%&&&&&&&%$$#ooooO#$%%&&&&&&&&%$#@...@#$%&&&&&&&%$$#Ooooo#$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"&&%%%%%%%%%%%%%%&&&&&&&&%%%%%%%%%%%%%%&&&&&%%%%%%%%%%%%%%&&&&&&&&%%%%%%%%%%%%&%&%%$$@++Oo##$$%%%&&&&&&%%%%%%&&%&%%%%&&&&&&%%%%%%%%%%%%%%%%%&&%%%%%%%%&%&%%%%%%&&%&%%%%%%%%%%%%%%&&&&%&%%%%%%%%&%%%%%%%&&&&&%&%%%%%%%%%%%%&&&&&&&%$#@oXXOO#$%%&%&&&&&&%$#@...@#$%%&&&&&&&%$#OOXXo@#$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"%%%$$$$$$$$$$$%%%%%&&&%%%%$$$$$$$$$%$%%&&&%%%$$$$$$$$$$%%%&&&&&%&%%%$$$$$$%$%%&&&%$#++OXX@@#$$%%%&%&%%$%$$%%%%%$$$$%%%%&%%%$$$$$$%$%$$$$$$%&&%%%$$$$%%%%%$$$$$%&&%%%$$$$%$%$$$$$%%%&%%%$$$$%%%%%$$$$$%%&&&%%%$$$$$$$$$$$%%%&&&&%%$#@...+@#$%&&&&&&&&%%$#+...+#$%&&&&&&&%%$#@+...@#$%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"%%$$####@#####$$%%%&%&%%$$##########$$%&%%$$$##$#$#####$$%%&&&&%%$$$#######$$$%&%%$#+OOXX+@@##$$%%&&$$$#$#$$$%$$$#$$$%%&%%$$#####$#$#####$$&%$$$###$$$$$$$##$#$&%$$#####$#$####$$%%&$$$##$#$$$$$$##$$$$&&&%$$$####@####$$$%&&&&&%$#+...+##$%&&&&&&&&%%$#+. .@@$$&&&&&&&%%%##+...+#$%%&&&&&&&&&&%&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"%$#@@@+@@@+@@@##$$%&&%$$##@@@+@+@+@@@#$&%$$#@@@@@@@@@@@##$%&&&&%$$#@@@+@@@@@#$$&%$#@OOoXX+++@@#$$%%&$##@@@##$###@@@#$$%&%$#@@@@@@@#@@@@@@@#&%$##@@@@#####@@@@##&%$##@@@@@#@@@@@@#$%&$##@@@@##$##@@@@@#$&%%$$#@@@+@+@+@@@#$$&&&&%%##@...+@$%%&&&&&&&&%%##@...+#$%%&&&&&&&&$$#+...+#$%&&&&&&&&&%%&%%%%%%%&%&%&&&&&&&&&&&&&&&&&&&&&",
-"$#+O...XX...XX++@$$&%$$@++XX...Xo...OO#&%$#Ooo..OOO..XXo#$%&&%%%#@@oX...Xoooo#$&%$#@... ......+@#%%&#OO...@@##@..ooo#$%&$#+O.....+++.....O+&$#OO...oo@@@oO...OO&$#@.....+++.....@#$&#OO...oO@#@Oo...O+#&%%$#ooX.......ooo#$&&&%&$#@+. .+##%%&&&&&&&&%%$@+...+#$$&&&&&&&&&%$@@ . @@#%%&&&&&%%%%$$$$%$%%$%%%%&&&&&&&&&&&&&&&&&&&&&",
-"$#Oo...XX...XXO++#$&%$#++OXX...XX...OO#&$$#ooX..ooO..XXo@#$&&&$$#@+XX...XXXoo@$&%$@+.. . .....+@#$%&#OO...++@@@..Xoo@$$&$#Oo.....+O+.....oO&$#Oo...oo+@+oo...oO&$#@.....+O+.....@#$&#OO...oo@@@oo...oO#&&$##ooX.......Xoo#$&&&&%$#@+...+#$%&&&&&&&&&&$$#@...@@$%%&&&&&&&&$$#+...+@#$%%&&&&%%$$$#$##$##$#$$%&&&&&&&&&&&&&&&&&&&&&",
-"$#Oo...XX...XXoO+@$&$#@+OOXX...XX...oO#&%$#ooX..ooo..XXX@#$&%%$#@++XX...XXXXo@#&%$#+... ......+@#$&&#Oo...++@@@..XXo@#$&$#Oo.....OOO.....oO&$#Oo...Xo+++XX...oO&$#@.....OOO.....@#$&#Oo...oo+++oo...oO#&%%#@oXX.......Xoo#$&&&&%$#++ ..+##%%&&&&&&&&&$$@+. .+#$$&&&&&&&&&%$#+. .O+#$%%&&%%$$##@@@@@@#@@###$&&&&&&&&&&&&&&&&&&&&&",
-"$#@+... .oOoXX...@#&$#@...XXoOo. ...+@#&$$#++O.....oOXoo@#$&&%$#ooX..ooOXXXXX@$&%$#@ooXXXoOOO+##$%%&#++...O+@@@OoXXX@#$&$#@+...oo+O+Xo...+@&$#+O. .OOXXXOO...O+&$$@OOo..OOO..oOO@$$&#@+...oo+++oX...+@$&%$##XXXooXoX. OO+#$&&&%%$#oX...+#$%&&&&&&&&&%%$#@...@@$%%&&&&&&&%$$@@...Xo##%%&&&%$#+OO..ooo++XXo##&&&&&&&&&&&&&&&&&&&&&",
-"%$@+XXXoo+++++...+@&#@+...O++++ooXXX+@$&%$$@+O. . .OOooo##%&&%$#oXX..OoOXXXXo@#&%$$@OooXXoO+++#$$%&&#@+...O+@@@ooXXX@#$&%#@+...ooO+Ooo ..+@&$#+O...OOXXXoO ..++&$$#+Oo..O+O..oO+#$%&$#@Ooo..+++..ooO@#$&&%$@oXXXoooX. O++#$&&&%$$@oo...@@$%%&&&&&&&&%%$@+. .+#$%%&&&&&&&&%$#+...Xo##%%&&%$$@+OO..ooo++XXX@#&&&&&&&&&&&&&&&&&&&&&",
-"%$#@XXXoo@+@+O. .+@&$@+ . +++@+OoXXX+#$&%%$#@+..OO++@@@##$%&%%$#+OO.....OoOO+#$&%%$#+OoXX++@##$$%&%&$#+XXXO+@@@OOXXX@#$&%$#@OooXX+++XXooO@#&$##+XXXoo  .OoXXX+@&&$$#@@oo...oO+@#$$%&%$@OOo..O++..oOO##%&%$$#++OOO  .oo+@#$%&&&&$$#oX...+#$%&&&&&&&&&&$$#@...@@$$&&&&&&&&%%##@...Xo#$%%&&%$#@...oo.. ..Xoo@#&&&&&&&&&&&&&&&&&&&&&",
-"%$#+XXXoo++++O...+@&#@+...+++++oXXXX@#$&%%$#@+..OO+@##$$$%%&%%$#+Oo.. ..oOOO+@$&%%$#+OoXX+@##$$%%&%&$@@XXXO+##@+OXXX+#$&%%$@+OoXX+++XXOO+@$&%$@@XX.oo. .ooXXX@#&&%$#@@Oo. .oO+##$%%&%$$@++. oOo..O+@$$%&&%$$@++OO...oO@@#$%&&&&%$#++...+##%&%&&&&&&&&$$@+. .+#$$&&&&&&&&%%$@@...++#$%%&&%$@+...oo... .XXo@$&&&&&&&&&&&&&&&&&&&&&",
-"%$#+XXX .oOoXX...@@&$@@...XXoOo. XXX+#$&&%$$#+..O++##$$$%%&&%%$#+OO.....ooOO+##&%%$#+OOXX+@##$$$%%&&$#+XXXO+@@@OOXXX@@$&&$$#+OOXX+O+XXoO+#$&%$#+XXXoo . oO.XX@@&%%$$#+Oo...oO@@$$%&&&&%$#@oo.  oo@#$%&&&&%$#@++OO  .oO+##$%&&&&&%$#+ ..+#$%%&&&&&&&&&$$#@...@@$%&&&&&&&&&$$#+. .@@$%%&&&%$#@ ..oo ....ooo#$&&&&&&&&&&&&&&&&&&&&&",
-"%$#+XXX .oooX....@#&$#@...XXooo .XXX+#$&&%$#@+..O++##$$%%%&&%%$#++OOoXoX..XXo@#&%%$$+OOXX+@@###$$$%&$#@XXXOO@@@OOXXX+#$&&%$$@++..OO+..+@#$$&%$#@XXXXX.....XXX@#&&%$#@@oo...oo+##$%%&&%%$#@oo . oo##$%%&&&%$$@++..XoXO+O+@$$&&&&%%##+...+##%%&&&&&&&&&%$@@. .+##%%&&&&&&&&%##+...+#$%%&&&%$$#+++@@+++OO+@@#$&&&&&&&&&&&&&&&&&&&&&",
-"%$#+XXXXX...XoO++#$&%$#++OXXXXXXXXXX@@$&%$$#@+..O++@#$$%%&&&&$##+OOOOXoX..XXX@#&&%$$++oXX++@@@@##$%&$#+XXXOO+++OO.XX+@$&&&%$#@+..OOO..@@$$%&%$#@XXX.X.....XXX@#&%$$#@+oo ..oo+@#$$%&&&%$$@OO. .++#$%&&&&%%$#@+O..oXoO+O++#$&&&&%%$#@. .@@$%%&&&&&&&&%$$#+...+#$%&&&&&&&&%$$@@ ..@@$$&&&&&%$$@@@@@@@@@+@@#$%&&&&&&&&&&&&&&&&&&&&&",
-"%$#+XX.XX...Xo+@@$$&%$$@++XXXXXXXXXX+#$&%$#+OO .ooOO+##$%%&&&$$@XXXXXooooo...+#&&%$$@+O. ooOXXoOO#$&$#@XXXXXOOOXX...++$&&%%%$#@oo.. oo@#$%%&%$#@Ooo. OOO  ooO@$&%$#OOo..OOO..ooO#$%&&%$$#@ooXXX@@$%%%&&&&%$@ooX..oooooXXo@$&&&&%%$@@...+##$%&&&&&&&&&%$#+...@#$$%&&&&&&&&%$@@.. @@$%%&&&&%%$$$$$$#$##$$$$%%&&&&&&&&&&&&&&&&&&&&&",
-"%##+XXXOo+++@@@#$$%&&%$$#@@+++Ooo.XX@@$&%$#OOo..ooOOO@#$%%%&%$#@XXX.XoooXo  .+@&&%%$@+O..oooXXooO#$&$$#oXXXXOooXX...++#&&&&%$#@oo ..Xo@#$%&&&%$#OOo .OOO..oOO#$&%##Ooo..OOO..ooO#$$&%%$#@+oXXXo+##%&&&&&%$##oXX .ooooXXXX@#&&&&&$$#@...++$$%%&&&&&&&%%$#@XXX+#$%&&&&&&&%%$#@+...@#$%&&&&&&%%%$$%$%$$$$$%%%&&&&&&&&&&&&&&&&&&&&&&",
-"%$@+XXXoo++@@#$$$%%&%%%$$$#@@++OOXXX+##&$$@OOo. oooOO@@#%%&&%%$@XXXXXooooo. .@#&&%%$#@+..oooXXooO#$&%$#ooXX.OoOXX...O@#&&&%%$$@oo...oo#$$%&&%%$#+OO..++O .OO+#$&$$@ooo .O+O..ooo@$$&%$#@++XoXXX@#$%%&&&&%%$@ooX..ooooXXXo@#&&&&&%$#+...+@#$%%&&&&&&&%%$#@oXo@#$%&&&&&&&%%$#++...@#$%%&&&&&&&&&%&%&%&%&%&&%&&&&&&&&&&&&&&&&&&&&&&",
-"$$@+XXXoO+@@#$$%%%&&&&&%%$$#@@+ooXXX+@$&$#@.....XXX..+@#$%%&%$$#ooXoX.....OO+@#&&&%$$#@OO...XXO+@$$&%$##@+XX...XX...O+$&&&&&%$#@+XXX+@#$%&&&&%$$@++oo++@oo++@$$&$#@...XXO+O.....@#$&$##... ....@#$%%&&&&%$$#ooo.......ooo#$&&&&%%$$@...++#$%%&&&&&&&&%%$#ooo#$%%%&&&&&%&$$#++...@#$%&&&&&&&%&&&&&&&%&%&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"$#Oo  ...oOO#$%%&&&&&&&%&%$#+oO.. . OO#&%##.....XXX..@@#%%&&&%$#OOooo.....+++#$&&&&%$$#+O...oo+@@$%&%%$##@oX...oo...++$&&&&&%%$#@Xoo@@$$%%&&&%%$#@+OO@#@OO+@@$%&%##...Xo+++.....##%&$#@...   ..@#$%&&&&&&%$#Ooo.......ooO#$&&&&&%$$#+++oo@#$%%&&&&&&&%%$##@##$%&&&&&&&%%$##ooO++#$$%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"$$OO.. ..oO+$$%&&&&&&&&&%%$#+Oo.. ..o+#&%$##@@@@@@@@##$$%&%&%%$$##@@@@@@@@@#$$%&&&%%%$$##@@@@###$$%&&%%$##@@@+@@@@@@##$&&&&&%%$$##@##$$%&&&&&&%$$$#########$$%%&%$##@@@@@##@@@@##$%&%$#+OOOOOO+@$$%&&&&&%%$$##@@+@+@@@@##$$&&&&&&%$$@@+OO##$%&&&&&&&&&%%$$$$$%%%&&&&&&&%$##OO+@@$$%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"$#@+OOOOO+@@$%%&&&&&&&&&&%%$@@+OOOOO+@$&%%$$##@#@####$$%%&&&&&%$$$$########$$$&&&&&&%%$$$####$$$%%&&&&%%%$$####@####$$%&&&&&&%%$$$#$$$%&&&&&&&&%%$$$$%$$$$$%%%%&%%$$###$#$#$###$$$%&%$#@+++O+++#$%&&&&&&&&%$$$######@###$$%&&&&&&&%$$####$$%%%&&&&&&&&%&%$%%%%&&&&&&&&&%%$$####$$%%&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"%$#@++OO+@@#$%%%&&&&&&&&&%%$#@@O+OO+@#$&&%%$$$$$$$$$$%%&&&&&&&%%%$$$$$$$$$$%%&%&&&&&&%%%$%$$$$%%%&&&&&&&%%$$$$$$$$$$$%%&&&&&&&%%%$%$%%&%&&&&&&&&%&%%%%%&%%%%%&&&%%%$$$$$$%$$$$$$%%&&%$$@+++++@@$$%%&&&&&&&&%%$$$$$$$$$$%%%%&&&&&&%%%%$$$$$%%&&&&&&&&&&&%&&%%&&&&&&&&&&&&%%$$$$$%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"%$##+@+@+##$$%&&&&&&&&&&&%%%$##@+@@@@#$&&%&%%%%%%%%%%&%&&&&&&&&%&&%%%%$%%&%&%&&&&&&&&&%&%%%%%%&&%&&&&&&&%&&%%%%%%%%&&&&&&&&&&&&%&%&%&&&&&&&&&&&&&&&&&&%&&&%&&&&&&%&&%&%%&%&%%&%%&%&&&&$$$$#$#$$$%&&&&&&&&&&%&&%%%%%%%%%%&&&&&&&&&&%%&%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%%&%&%&&&&&&&&&&&&&&&%&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%&&&&%&%&&&&&&&&&&&%%&%%&&&&&&&&&&&&&&%&%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%&%&&&&&&&&&&&&&&&&%&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%$%%%&&&&&&&&&&&&&&%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%&%&%%%%%&%&&&&&&&&%$%%%%%&&&&&&&&&&&%%$$$$$$$%%%&%&&&&&&&&&&&&&&&%&&&&&&&&&%&%%%%%%%%&%&&&&&&&&&&&%%&%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%%%&&&&&&&&&&&&&&%&&%&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%$$$$$%%%&&&&&&&&%%%%$$$$$%%%%&&&&&&&&&&&&&&&&&&&&&&&%%%%$$$$$%$%$%$$$%%&&&&&%%%$$$$$%%&&&&&&&&%%%$$$######$$$%%&&&&&&&&%&%%&%&%&&&&&&&&&%&%%$%$$%%%%&&&&&&&&%&%%%%$%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%$$$%%%%%&&&&&&&&%%%%%%%%%%&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%$##@##$%%&&&&&&&%&%$$$$###$$%%&&&&&&&&%&%&&&&%&%&%&&&&%%$#####$$$$###$$%&&&&&&%$##@#$$%%&&&&&&%&%$$#@@@@@@@@#$$%&&&&&&%%%%%%%%%%%&%&&&&&%%$$$$##$#$$%%%%&&&&&&%%$$$$$$$%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%$$#$#$#$$%%%&&&&&&%%%$$$$$$%%%%&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$##ooo@#$%%&&&&&&%%$$@@+++++#$$%%&&&%%%%%%%%&&%%%%%%&&%%$#+++++@#@++++@#$&&&&%%%$#ooo@$$%&&&&&&%%$$#OO.....ooO#$%&&&&%&%%$%$%$$$$%%%&&&%%%$$#@@+++@@#$$%%&&&&%&%$#@@++##$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%$$#@@+++@@#$$%%&&&%&%$$$#####$$%%&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&&&&&&&&&&&&&%$$@@XXX@##$%%%&&&%%%##@++OO++##$%&&&&&%%$%$%%%$%$%$%%%&%$##OoOO++@@++OO+@$&&&&&%$#@XXo@#$%&&&&&&&$$#@oo.....ooo#$$&&&%&%%$$#$$$$$#$$%&&%&%$##@+++O++@@@$$%&&&&&%$$@@++++@#$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$##@+++O++@@##$%&&&&%$$#@@@@@@#$$%%%&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&&&%&&%&&&&&&&&&&&%%%$#+O...O+##$%%&&&%$$@@.......+@#$%&%%%$####$$$$$####$%&%$#+... .+OO. ...@@&&&&&%$#@...@#$%%&&&&%%$@++..ooooXXXX@#%&&&%%$##@+O##@oo#$%%&%%$$++O.......O++#$&&&%%%$#OooOo..@$$%%&&&&&&&&&%&&&%&&&&&&&&&&%&%&&%&%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$$++O.......O++#$&&&&%$#oo.....@@#$&%&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&&%&%%%%%&%&&&&&&%&$$#@OO ..O+@##%%&&&%$#@+.......++#$%&&%$$@@@@@#@#@#+@@$%&%$@@ . . O+O .  .+#&&&&%$$#+...+#$%&&&&&%$$@+O..oooooXXX##$&&&&%%##@OO#@#oo#$%%&%$$#OOo.......oOO#$&&&&%$#@ooOoO..@#$%&&&&&&&%&%&%&%%%%%%%%&&&%%%%%%%%%%%%%%&%&&&&&&&&&&&&&&&&&&&&&&%$$#OOo.......oO+#$&&&%$$#oo.....+@#$%&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&&%&%%$%%%%&&&&&&%%$#@@OO. .OO+@#$%&%&%$#@+..... .+@#$%&&%$#@+++@+@+@+++@#$&%$#+. .. OOO. . .+#&&&&&%$@@. .@@$$&&&&&%$#@+O .oooXoXXX#$$&&&&%%#@@+O##@oo#$%%&%$#@OOo.......oOO@#&&%%%$#@ooooo..@#$%%&&&&&&%%$%$%%$%$%%%%&%%%%$$$$$$$$$$$$%%%&&&&&&&&&&&&%&&&&&&&&%$#@OOo.......ooO@#&&&&$$#oX.....+@#$%&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&&%$$$##$%%%&&&&%%$#+Oo..... .O+@$%&&%$$++O..O++++@##%%&%%##ooX.......Xoo##&%$#@OOo..+O+..oOO@#&&&&%%$#+...+#$%%&&&&$$#OOo. ooo+OO++@$%&&&%%$$##@@###@@#$%&&$$@+...XX...XX...@@&&&%$#@@XXXXX..@@$%%&&&&%%%$$#$#$$#$#$$%&%%$####@#@#@###$$%%&&&&&&&&&%&%&&%&&%&&&%##+..... ..XX...+@&&&%%$#+++OOOO@##%%%&",
-"&&&&&&&&&&&&&&&&&&&&&&&&%&%$###@#$%%%&&&%%$#OOo. .... ++@$$&&%$#+OO..++++@@#$%%&%$#@oXX.......XXo@#&%%$#OOo..O+O..oOO#$&&&&%%$#+...+#$%%&&&&$#@Ooo. oooO+OO+#$%&&&&&%$$$##$$#@#$$%%&$#@+...XX. .XX...+@&&&%$#@+oXXXX..+##%%&&&&%$$##@#@@#@@###$&%$##@@+@+@+@+@@@#$%&&&%%%%%%%%%%%%%%%&&&$#@+........XX...+@&&&&%$$@++++@+##$%%&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&%%$@+++@$%%&&&&%$#@oXXoo+++XXO+@$%&%%$#++oXX+@@##$$%%&&%%#@oXXXXoooXXXXo@#&&%$#@++..ooo..++@#$&&&&%%##@ ..@@$%&&&&&$#@...oo...XXO++#$%&&&&&%%$$$$$%$$$%%&&&$#OoXXX .oooXXXoooO&&%%$@+OXXOOO..+@#$%&&%%$$#+Oooo++XoX++$&$#@.............@#$&&&%%%$$$$$$$$$$$%%&&$#OoooX..ooo..ooooO&&&&&%$$$#####$$%%&%&",
-"&&&&&&&&&&&&&&&&&&&&&&&&%%$$+++O+#%%%&&&%$#@XXXoo+++oo++@$%&&%$#OOOXXO+@##$$%&&&%$#@oXXXXOOoXXXXo@#&%&%$#++..ooo..++#$$&&&&%%$#@...@#$$%&&&&$@+...Xo . XXOO+##%&&&&&&&&%%&%%%%%%&&%&$#OoXXX..oooXXoXooO&&%$$++OXXoOo..+@#$%&&%$$#@ooXoX++XXXO+#&$#@.............@@$&%%%$$#####@####$$$%&$#Ooooo .ooo. oXooO&&&&&%%$$$$$$%%%%&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&%$$+OO++#$%&&&&%$#@XXXoO+++oo+@#$%&%$##OOoXX+++@#$%%%&&%$#@XoXXXoooXXXXX@#&&%%$#@+..ooo..+@@$%&&&&&%$#@. .+#$%&&&&&$@+...oX.. XXOO+@$$&&&&&&&&&&&%&&&%&&&&&#@OoXXX .oooXXooooO&%&$$@+OXXOOO .+@#$%&%$$#@@ooXXXOOXXXO+$&$#@.............+@$&&%$##@@@+@@+@@@##$%&#@oooXo..ooo..ooooO&&&&&&&&&%%%%%%%&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&%$#@@+++#$%%&&&%$#@XXXoO+@++@@#$$%&%$#@... ....++$%%&&&%$#@XXXOO+O+ooXXX@#&&%%$#@+oX   XX+@#$%&&&&%%$#@OOO@#$%%&&&&$#+.. XXoooXX...+#$&&&&&&&&%&&&&&&&&&&&&$@oXoXX..+++oooooXo&&&%$@++XXXXXXXO+@$%&%$#+OO..OOOXXXXX@@$&%$#++OOOOOOoO...+@#&%$$OOo..........##%&$#oXooo .XXXXXoooXo&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&%%$#@++++#$%%&&&%$#+XXXOO+++@+@#$$%&%$#@. . ....O+$$%%&&%$#@XXXoo+O+ooXXX@#&&&&$$#@XX. .XX+@#$%&&&&&%$#@OOO@#$%&&&&&$#@...XXOoOXX ..+@$&&&&&&&&&&&&&&&&&&&&&##oXXXX..OO+OooooXo&%%$$@@+XXXXXXX++@$%&$$@Ooo .OoOXXXXX@#$&$$#@++++++OOo...+@$&%$$OOo..........@#$&#@ooooo. X.XXXoooXo&&&&&&&&&&&&%&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&%$#Ooooo##%%&&&%$#@oXXXXOOOoo+@#$%&%$#@OOO. ooO@@#$%%&&%$#@XXXXXOoOXXXXo@#&&%&$#@+oo . oo+@#$%&&&&&%$#@XXX@#$%%&&&&%$$@+OXX ..Xo ..+@$&&&&&&&&&&&&&&&&&&&&&$#+O..........XXXO+&&%%$@+O.......++@$%&$#@...oXooo. OO+@#$&%%$$####@#@@+...+@#&%$$@++OOOOOOOOO+#$%&$#OOXXX .oooXXXXXO+&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&%$$@Ooooo@$$%%&&%%#@oXXXXOOOXX++#$%&&$$@+oo..OoO+@#$$%%&%$#@oXXXXoooXXXXX@#&&&%$#@+oX. .Xo+@#$%&&&&%%$#@XXX@#$%&&&&&%$##@+++oOo. XXX@#$&&&&&&&&&&&&&&&&&&&&&$#+O.. .. . ..XXXO+&&%%$#++.......++@$%&%#@...ooooo..OO+@$$&&%%%$$$$$##@+...+@$&&$$@@+++OOOOO++@#$%&$#+OXXX..oooX.XXXO+&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&%$#@.. . @@$%&&&%%$#ooXXXooOXo+@#$%&%$$@+Oo. ooO+@##$$%&%$#@oXXXXOooXXXXo@#&&&%$#@+oo . oX+@#$%&&&&%%$#@XXX@#$%%&&&&%$##@+++OOo. XXX@#$&&&&&&&&&&&&&&&&&&&&&$#++......... XXXO+&&%%$#@+.......+@@$%&$#@.. oXooo .oO+@#$&&%%%%%%%%$$#@...@@$&&%$##@++@+@++@@@$$%&$#+OXX...oooXXX.XO+&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&%$#+... .+#$$&&&&%$#@++XX . XX+@#$%&&$#@Ooo..++++@+@@$$&&$$@ooX..... .Xoo@$&&&%$#@+oO . OO+@#$%&&&&&%$@@...+#$%&&&&&%$#OooOO+O+..oOO##%&&&&&&&&&&&&&&&&&&&&&%$#+oXXXXXXo.XXXo@#&&&%$#@@+OOoOOO@@$$%&$$#OOo..oOoXXXXX@#$&&&&&&%%%%%$$#+++@$$&&%%$$$$$######$$$%&&%$#@oXX..ooo..XXo@#&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&%$@@... .+##%&&&%%%$#@+XX . XX@#$$%&%$#@Ooo .O+++++++#$&%%$@ooo.......Xoo#$&&&%$#@+OO. .oO+@#$%&&&&%%$#+...@@$$&%&&&%$@OooOO++O..OO+#$%&&&&&&&&&&&&&&&&&&&&&%$##oXXXXXXXXXXXo@#&&%&%$##++O+O+@##$%%&%$#+OO..oOoXXXXX@#$&&&&&&&&&&%%$$@@@#$%&&%&%%$$$$$$%$$$%%&&&%$#@ooX..ooo..Xoo@#&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&%%$#+. . .+#$$&&&&&%$$##++...+@@$$%&&%$@@. .. ........+#&%%$#++++++@+@++++#$&&%%$#++.. . ..++@$%&&&&&%##@...+#$%%&&&&$$@ooXOO+O+..O+@#$%&&&&&&&&&&&&&&&&&&&&&%%$#@+Ooo...XX++@#$&&&%%%$$$######$$%%&&%$$#@+ooXXXOOXXXO+#&&&&&&&&&&&%$$$$$$%%&&&%%%&%&%&%%%%%&&&&&%%$#@++oo...oX++@#$&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&$$#@... .@@$%%&&&&&%%$#@+. .+@#$%%&&%$#+. . ...... ..@#&%%$$@@+@@@#@#@@@@$$&&%%$@@O..  ...+@@$%&&&&&%$@+. .@@$%&&&&&$##XXX.......+@@$%%&&&&&&&&&&&&&&&&&&&&&%%%$#@+Oo...oo+@#$$&&&&%&%$$$$$$$$%%%&%&&%$$#@OooXoO+XXXO+#&&&&&&&&&&&&%%$$%%%&&&&&&&&%&%&&&&&&%&&&&%%$$#@+oo...Xo+@#$$&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&%$#@. . .@#$%%&&&&&&%$$#@...@#$%%&&&%$#@.. . ........@#&&&%$#####$#$#$@##$%&&&%$#@+...  ..+@#$%&&&&%%$#@...+#$%%&&&&%$@oXX. .....@@$$%&&&&&&&&&&&&&&&&&&&&&&&%%$##@OO...oO@##$%&&&&&%%&%%%$%%%%%&&&&&%%$$#OOooo++XXX+@$&&&&&&&&&&&&&%&%&%&&&&&&&&&&&&&&&&&&&&&&&&&%$##@Oo...oO@@#$%&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&%$#@ooXoo@#$%&&&&&&&&%$$#+++##$%&&&&%$#@+OOOOOOOoOO++@$&&&%%$$$$$%$%%$$$%%%&&%%$##@+OOOOO+@@#%%&&&&%%$#@...@#$%&&&&&%$#++OooOOO++##$%%&&&&&&&&&&&&&&&&&&&&&&&&&%%$##@@@@@##$$%&&&&&&&&&%%&%&&&&&&&&&&&&%$$##@@#@#@#@##$&&&&&&&&&&&&&&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$$$#@@@@@##$%%%&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&%%%$#OOooo@$$%%&&&&&&&%%$#@+@#$%&%&&&%%$#@++++O+O+O++@#$&&&&&%%%%%%&%%&%%%&&&&&%%$##+++++++##$%%&&&&&%$#@...@#$%%&&&&%$$@++OOOO+@##$%%&&&&&&&&&&&&&&&&&&&&&&&&%&&%%$$$####$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&%$$$$$#$#$#$$$%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$$$####$$%%&&&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&$$#OOoOO#$%%&&&&&&&&%&%$$$$$%%&&&&&&%%$$##########$$$%&&&%&&&&&&%&&&&&&%&&&&&&%%$$$######$$%%&&&&&%%$$@+++@$$%&&&&&%%$#@@++++@@#$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%$$$$$$%$&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$$$$%$%$$%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%$$$%$$%%%%&&&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&&%%$#####$$%&&&&&&&&&&&%%%$%%%&&&&&&&&%%$$$$#$#$$$$$%%%&&&&&&%&&&&&&&&&&&&&&&&%&%%$$$$$$$$%%%&%&&&&&&%$#++@#$%&&&&&&&%%$$$$#$#$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&&%%&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&&&&%%%%&%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%&%%&&&&&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&&%&%%$$#$$$%&&&&&&&&&&&&&%&%%&&%&&&&&&&%&%%%%%%%%$%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%%%&&&&&&&&&%%%$#@@$%%%&&&&&&%&%$$$$$$%%%%&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&&&&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%%%%&&&&&&&&&&%%%%%%%%&&&&&&&&&&&&&&&&&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%$%$$$%$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$$$$$$$%&&&&&&&&&&%$$$$$$%%&&&&&&&&&&&%%$$#$#$$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"&&&&%%%$$$$$%%%&&&&&&&&&&&&&&&%&&&&&&&&&&&&&%%%$$$$$$%%&&&&&&&&%%%$$$$$$%%%&&&&&&&&&&&&&&&%&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$$$$#$#$#$$$%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%$%$%%&&&&&&&&&&&&&%%%%&%&&&&&&&&&&&&&&&&&&&&&&&&&&&%$$##@##$%%%&&&&&&&&$$##@##$%%%&&&&&%&&&%$#@#@@##$$%%%&%%&&&&&&&&&&&&&&&&&&&&&&&",
-"&&&&%$$#@@@#$$%%&&&&&&&&&&&%&&%&%&&&&&&&&&&&%$$#@@@@#$$%%&&&&&&%$$#@@@@#$%%%&&&&&&&&&&%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%$$$@@++++++@@$$&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$$###$$%%&&&&&&&&&%&%%%$%%%%&&&&&&&&&&&&&&&&&&&&&&&&&%$@+ooo@@$%%&&&&%&&&$@+ooo@@$%%&&%%%%%%&$@@ooooo+@#$%%%&%%%&&&&&&&&&&%&%%&&&&&&&",
-"&&%%$$#@+++@#$$%&&&&&&&&&&&%%%%%%&%&&&&&&&%%$$#@++++@$$%%&&&&%%%$#@+++@@#$%%%&&&&&&&&&&%%%$$$%%%&&&&&&&&&&&&&&&&&&&&&&&&%&%$$##++++O+O+++#$&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%$$@@+@$$%&&&&&&&&&%%$$$$$#$$%%%&&&&&&&&&&&&&&&&&&&&&&&$$++ooo+@$$%%%&%%%%&$++ooo+@$$%%%%%%$$%&$@+oXXXo++@$$%%%$$$&&&&&&&&&%%%%%%%%&&&&",
-"&&%%$#@@+O++@#$$%%&&&&&&&%&%$$$$$%%&&&&&&&&%$#@++OO++##$%%&&&&%$#@++OO++@#$%%&&&&&&&%%%$$$#$$$%%&%&&&&&&&&&&&&&&&&&&&&&&%%$##@++OOOOOOOO+#$&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$##@+++#$$%&&&&&&&&%%$##@#@##$$%%&&&&&&&&&&&&&&&&&&&&&&$#+OXXX++$$%&%%%$%$&#+OXXX++#$%%%$$#$$$&$++oXXXX++@#$$$$$$$&&&&&&&%&%$$$$$%%&&&&",
-"%%%$#@XXOoOXo@#$%&%&&&&&&&%$$@@@$$%%&&&&&&%%$#oXOOoXX+@#$%%&&&$$#oXOooXo+@#%%%&&&&&&&%$$@@@O+$$&%&&&&&%&&&%&&&&&&&&&&&&&%$$@ooX..   . ...@#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%$#@Oo. .@#$%%&&&&&%%$$#+Oooo++#$%%%&&&&&&&&&&&&&&&&&&&&&$$++...O+#$%%%$$$##&$++...O+#$$$$#@@oO$&$OoOoooXooO##$#@+O@&&&&&&&&%$$###$$%&&&&",
-"&%$$#@XXoooXX@##$%&&&&&&%%$$#+@+#$$%%&&&&&&%$#oXoooXX+@#$&&&&%%$#oXoooXX+@@$%&&&&&&&%%$#+++OO$$%&&&&&&%%%%%&%&&%%%%%&&&&%$#@oXX... . ....@#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$##Oo. .@#$%&&&&&&%%$##OOXoXOO@#$%%&&&&&&&&&&&%&&&&&&&&&$#++...O+#$$$$$#@@@&#+O...O+#$$$#@@+oO#&#+OoooXoooO@##@@OO+&&&&&&&&%$#ooo#$%%&&&",
-"%%$@+OXX++OXX++@$%%&&&&%&$$#@...@#$%%%%&&&&$$#+OOOOXX+@#$%%&&&$$#+OOoo..+@#$%%&&&&&%%$#@oXX+@#$%&&&&&%%%%$%%%%%%%%$%%%&&$$@+ . OO.. XXoOO@$&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$#@+...@@$%%&&&&%%$#@+XX+OOXX+@#$%&&&%&%%%%&%&%%&%&&&&&%##+XXXO+#$$$#++OoO&##@XXXO+###@@ooo++#&$@@OOo..OO+@@+OOoo@&&&&&&&%%$#ooo#$%%&&&",
-"%%$@+OXXO+OXXO+@$%%&&%&%$$#@@...+@#$$%%&&&%%$#+O+OOXX+##$&%&&&%$@+Oooo..+@#$%%&&&&&&%$#@XXo+@$%%%&&&%%$$#$#$$$$$$#$#$$%&$$@+ . Oo ..XXoO+##&&&&&&&&&%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$#@+. .+#$%%&&&&%%$@++XXOOOXX++@$%&%&%%%%%$%%%%%%%%&&&&%$@@XXXO+@#$##OOOoo&$@+XXXOO@##@+oXXO+#&$#+Ooo..OOO+@OOooo@&&&&&&&%$$@+O+##%%&&&",
-"&$$@+OXXO+OXXO+@$%&&%&$$$#@++ ..+@@#$$%&&&&%$#+OOOOXX+@#%%&&&%$$#+OOoo..++#$%%&&&&&%%$#@oXo@#$%%&&&&%$##@@##$$$##@@##$%&$#@+.  OO. ..XOO+#$&&&&&&&&%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$#@+...@@#%%&&&&&$$@+OXX+OOXX++@$$&%%$$$#$$$$$$$$%%%&&&$$@+XXXOO@###@OOooo&$#+XXXOO@@@++XoX++#&##@Ooo .OOO++Ooooo#&&&&&&&%$$@+O+@$%%&&&",
-"&%$#@+XXoOoXX+@#$%&&%%$#@++OO. .OOO+@#$&&&%%$#@+XXXO+@#$$%&&&&%$#++oooXXO+@$%%&&&&&&%$#@@++##$%&&&&&$$+OoXo+@##@..OoO#$&%#@+ . Oo.. XXoO+#$&&&&&&%&%$$$#$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$$@+. .+##%%&&&%&$$@+OXXO+OXXO+@$$&%$$@+@@#@@@@@#$$%%&&$$@+XXXO++@@OOXoX+@&#@+XXXOO@+@Xoooo@@#&#+oOOoooXoooOXXX+@#&&&&&&&%$#@+OO@#$%&&&",
-"%%$$#@XXOOOXX@##$%%&%$$#+OOOO ..oOOO+#$&&&&$$#+OXXXOO@#$%%%&&%%##+OoooXX++@$$&%&&&&&%%$#@@#$$%&&&&&&$#OoXXX++@#@..ooo##&$$@+  .oo ..XXOO+#$&&&&&&&%$$#@##$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&$##+...+@$$%&&&&%%$@+OXX+OOXXO+@$%&%$#++O@@+@+++@#$$%%&$#@@.XXOO+++OOXXo@@&$@+XXXOO+++XXooo+@#&#OOOOooXoXXOooXo+##&&&&&%%$$#@XXX@$$%%&&",
-"&&%$##@+OoO+@##$%&&&%$#@.....   .....@@&&&%%##XXXXoXo+@#$%&&&%$$@..OooXXO+@$%%&&&&&&%%%$$$$$%%&&&&&&$#@+...O+@@@OoXXX@#&%$#@oXX... .XXo++#$&&&&&%%%$@+oXo#$$%&&&&&&&&&&&&&&&&&&&&&&&&&&%%$#+O . O+#$%&&&&%%$@@+XXoOoXXO@@$%&%$#oXXXoOOO..++@$$%&$#OoXXXXXoooXXooo+@&#ooXX.XXXXXXXXXXoO#&$++XXXXXoooXXXoo+#$&&&&&&%$#@+XXX@#$%&&&",
-"&&%%$#@@O+O@@$$%%&&&%$#@....... .....@#&&&%$$@oXoooXX+@#%%%&&%$##..OOoXX++#$%%&&&&&&&&%%%%%%&&&&&&&&$#+O...O+@@@ooXXX@#&%$#@ooX.. . XXOO+#$&&&&&&%$#++XXX@#%%%&&&&&&&&&&&&&&&&&&&&&&&&&&%$#+O. .O+#$%%&&&%%$#@OXXoooXX+@#$%&$##XXXXXOOO..OO+#$$&$#OXXXXXXoooXXXoo+@&#OXXXXXXXXXXXXXXoo@&$@+XXXXXoooXXooo+@$&&&%%%$#@Oo...@#$%%&&",
-"&&&%%$##+++##$%%&&&&%$#@.....   .....@#&&&&$$@oXooooo+@#$&%&&&%$#..OOOXX+@#$%%&&&&&&&&&%&%&%&&&&&&&&%#@+...O+@@@ooXXX@#&%$$@ooX... ..XOO+$$&&&&&&%$#++XXo@#$%&&&&&&&&&%&%%&%&&&&&&&&&&%&%$#++. .++#$%%&&&%%$#@+XXoOoXX+@#$%&%##oXXXXooO .OOO@#$&$#OOXXXXXXoXXXXoo@@&#OoXXXXXX.X.XXXXoo@&$@+XXXXXoooX.ooo+@$&&&&%$##@oo...@#$%%&&",
-"&&&&%%$$$$$$$%%&%&&&%%$#@@+++...+++@@#$&&&%%$#++OoOOO##$%%&&&%$$#@+OOO++##$%&&&&&&&&&&&&&&&&&&&&&&&&$$@+XXXO+@@@OoXXX@#&&%$##@+Oo...XXO++#$&&&&%&%%#+O...@$$%%&&&&&&&&%%%%%%&&&&&&&&&&&%$$#+O+OOO+#$$&%&&&%$#@@ooXXXoO+@$$%&%$#@+O..XoXoo ..+@$&$$#@+++OOXXXoo...+@&$#@++OoXoXoooOOO..@&$$#@++OO...oo...+@$&&&%$##@+oo ..@#$%&&&",
-"&&&&&%%%$$$%%%&&&&&&%%$$##@++. .++@##$$&&&%%$$@++O+++#$%%%&&&&%$$#@++O+@#$$%%&&&&&&&&&&&&&&&&&&&&&&&%$#+XXXo+@@@+OXXX+#&&%%$$#@+O . XXoO+#$&&&&&&%$$++...##%%&&&&&&&%%%$$$$$%%&&&&&&&&&%$$#+++++++#$$%&&&&%$$@+OooXooo@@#$%&%$#@++..XoXoo...++#&%$$#@@+OOX.Xoo ..+@&$#@@++oXoXoooOOO..#&%$$#@++O...oo ..+@#&&%%$#oooXXOO+@#$$%&&",
-"&&&&&&&%%&%%&&&&&&&&&&%$$#@@+XXX+@##$%%&&&&%%$$#####$$%%&&&&&&&%$$$##$#$$%%&&&&&&&&&&&&&&&&&&&&&&&&&$$#+XXXOO+++OoXXX+#&&&&%$##++.. XXO++#$&&&&&&%%$##@###$%&&&&&&&&&%$$####$%%%&&&&&&&&%%$$$###$$$%%&&&&%%$@+O.......O+@$%&%$#@+OXXXXXOo. .O+#&%%$#@@+XXooooo...+@&$$@OooXX++++OXXXO+@&%$$##+XXooooo...+@#&&%$$@oXXXX+++@#$$%%&",
-"&&&&&&&&%&&&&&&&&&&&&&%$$$#@+XXX+@#$$%%&&&&%%%%$$$$$$%%%&&&&&&&&%$$$$$$%%%&&&&&&&&&&&&&&&&&&&&&&&&&&%$#+XXXXXOOOXX...+@&&&&%%$#@+....Xo++$$&&&&&&&%%$$##$$%%%&&&&&&&%$##ooO##$%&&&&&&&&&%%%$$$$$$$%%%&&&&&%$@@O.. . ..++@$%&%$#@++XXXXXoO. .++$&%%$#@++XXooooo. .O@&$##OOOXo++@++XXXOO#&%%$#@+XXooooo. .++$&&%$#@oXXXXO++@##$$%&",
-"&&&&&&&&&&&&&&&&&&&&%&%$$##++XXX++##$%%&&&&&&%%%%%%%%%&&&&&&&&&&&&&%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&$$#@X.XXXOoOXX...+@&&%&%$$#@+. .XXoO+@$&&&&&&&&%%%$%$%%&&&&&&&%&%$#@oXo@#$$&&&&&&&&&&&%%%%%%%%%&&&&&&%%$#++.......+@@$%&%$#@+OXXXXXOo...++#&&%$#@+OXXooooo...++&$#@OooXo@@@++.XXO+#&%$##++XXooooo...++#&&%$#@XXXoo++@Oo@@#$&",
-"&&&&&&&&&&&&&&&&&&&&%&%$@++OOooOO++@@$%&&&&&&&&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$#+XXXXXOoOXX...+@&&&%%$#@+O. ..XooO@$&&&&&&&&&%&%%&%&&&&&&&&&%$#+O...++#$%%&&&&&&&&&&&&%%&&&&&%&&&&%%$$##@@+@@@@##$%%&%$@oXXXXoOO. ooO@#$&&%$#OXXooXooXX. .O+&$@+XXX++@@@oXoooO+#&%$#ooXoooooXX. .OO#&&%$#@XXXoO+++oo+@@$&",
-"&&&&&&&&&&&&&&&&&&&&&$$#++OOOoOoOO++@$$&&&&&&&&&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$$#@XXX.....XX...oO&&%%$#@+OO. .XXXoo@#&&&&&&&&&&&&&&&&&&&&&&&%%$#+O. .O+#$%&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$$###@###$$%%%&$$@XXXXXOOO..oOO@$$&%$$#ooXOoooooX...oO&$@@XXX+@@@+ooooOO+#&$$#ooXOoOoOoX. .OO#&&&$#@oXXXXOOOXXO+@$&",
-"&&&&&&&&&&&&&&&&&&&&%%$#+OOOoOoOOOO++#$&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$#+XX.. ...XX...O+&&%%$@++..........@#&&&&&&&&&&&&&&&&&&&&&&&&%$#+O...O+#$%%&&&&&&&&&&&&&&&&&&&&&&&&&&%%%$$$$$$$$$%%&&&$$@oXXXXOOO..O++#$%&&$$#oooOOooooo ..OO&$@+ooo@@#@@oXooo++#&%$#oooOOOOOoo...o+#&%%%#@oXXXXOOOXXO+@$&",
-"&&&&&&&&&&&&&&&&&&&&%$#@.............@#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$$#@XXXoO+++@@@@@##&&%%$@+O... ......+#&&&&&&&&&&&&&&&&&&&&&&&%$$@Oo ..O+#$%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%%%$%%%&%&&&&$$#+oO+++++O+@##$%%&%%$#@++@@@@@++...O+&$@@@+@###@@..ooo..#&%$#+++@@#@@++...OO#&&%%$#ooXXXOOoXXO++$&",
-"&&&&&&&&&&&&&&&&&&&&%%##.............##&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$#@XXXOO@@@#@###$$&&&%$#@+..........@#&&&&&&&&&&&&&&&&&&&&&&&&%$#oo. .O+$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&&%&%&&&&&&&%$#+++##@@@+@##$%%%&%%$$@@@##$##++...O+&%#####$$##@..ooo..#&%%$@@@#####@+...++$&&%%$#@@+.......+@#$&",
-"&&&&&&&&&&&&&&&&&&&&&%$##@@@@++@+@@@##$&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$$@XXX++$$%%%&%%%&&&&%$$##@@+++@+@@##$&&&&&&&&&&&&&&&&&&&&&&&&%$#@+OOO@##%&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$$$##$#$$#$$$%%%&&&&%$$$$$$$$$###@@#$&%$$$$$$%$$##@@@@@#$&&%$$$$$%$$$###@@##$&&&%%$#@@.......@##$&",
-"&&&&&&&&&&&&&&&&&&&&%%%$$##@####@###$$%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$#+++##$%%&&&&&&&&&&&&$$###########$$&&&&&&&&&&&&&&&&&&&&&&&%%%$@@OO+@$$%%&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%$$$$%$%$$%%%&&&&&&&%%$$%%%%%%$$#$#$$&&%%$%%%%%$$$###$#$$&%&%%$%%%%%$$$#$#$$$&&&%%$$##@@@+@@@#$$%&",
-"&&&&&&&&&&&&&&&&&&&&&&%%$$$$$$$$$$$$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$#@@+#$$%&&&&&&&&&&&%&%%%$$$$$#$$$$%%&&&&&&&&&&&&&&&&&&&&&&&&%%$##+++$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%%%%%%&%%&%&&&&&&&&&&%%%%%%%%$$$$%&&&%&%%&&&%%$%%$$$$%&&%&&%%%&&&%%%$$%$%%&&&&&%%$$#######$$%&&",
-"&&&&&&&&&&&&&&&&&&&&&&%&%%%%$%$%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%$@@@$$&%&&&&&&&&&&&&&&&%%%$%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$$$$$$$%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&&&&&&%&&&&&&&&&&&&&&&&&&&&&%%&&%&&&&&&&&&&&&&&%%%&&&%&&&&&&&&&&&&&%&%%%&&&&&&&&%&%%$$$$$$$%%%&&",
-"&&&%%$$$$$$%&%&&&&&&&&&&&&&%%$$$$$$%%&&&&&&&&%%$$$#$$%%&&&&&&&&%%%%%$$$$$%%%&&&&&&&&%&%&&%&%&&%&&&&&&&&%&$$####$$%%%&&&&&&&&&&&%&%%&%&%%%&%&&&&&&&%&%&%&%&%%&&&&&&&%%$$$$$$%%&&&&&&&&&&&&&&&%$$$#$$%%&&&&&&&&&$$$##$$%%&&&&&&&&%%%%%%%%%%%%&&&&&&&&%%$$$$$%%%&&&&&&&&&&&&&%&%%$$$$$$%%%&&&&&&%%$####$$%%%&&&&&&&&&%&&%&&%&%%&&&&",
-"&&&%$#@+O#$$%%&&&&&&&&&&&&%%$##@O+#%%&%&&&&%&%$#@+O+#$%%&&&&&&&&%$$######$$%%&%&&&&&%&%%%%%%%%%&&&&&&&&%%$@+OOO##%%&&&&&&&&&&%%%$%%$%$%%%%%&&&&&%&%%%$%$%%%%%%&&&&&%$$+O@##$%%&&&&&&&&&&&%%%$$#++##$%%&&&&&%%%$#++O##$%%&&&&&&%&%%$$$$$$$$%%%&&&&&&%$##OO#$$%%%&&&&&&&&&&&%&%$$#O+##$%%&&&&%&%$#@ooo@#$%%%&&&&&&%&%%%%%%%%%%%&&&",
-"%&%$$#@OO@#$%%&&&&&&&&&&%%%$$@@+OO#$%%&&&&&&%$$@@OOO##$%%&&&&&%%$$#@+@@@@#$$%%&&&&%%%%$$$%$%$%%%%&&&&&%%$#@+ooO@#$%%&&&&&&&%%%$$$$$#$$$$$$%&&&&&%%%$$$$$$$$$%%%&&&%%$#OO@@@$$%%&%&&&&&&&%&%$$##oO@##%%&&&&&%%$$@OOO@@$$%%&&&&&%%$$$##$$#$$$$%%&&&%%%##@OO##$$%&%&&&&&&&&&&%%$$#@OO@#$%&&&&&&%$#@@ooo+@#$%&&&&&&%%$%$$%%$%$%%%%%&",
-"&&%%##@oo@@#$$%%&&&&&&&&&%$$#+++OO$$%&&&&&%%%$#@+ooo@#$%%%&&&&%$$#@++++++@#$%&%&&&&%$$$$#$#$$$$%%&&&&&%%$#+Oooo+#$%%&&&&&&%&%$#@@@@@@+@@@#$&&%%%%$##@@@@@@###$%&&&%%$#Oo++@#$$%%&&&&&%&&%%$$#@@oo@##%%%&&%&%$##@ooo+@#$$%&&&&%%$$#OO@@@+O@@#$%%&&&%%##@oo@@#$$%%&&&&&&&&&%%$$#@@oo@@#%%&&&%%%$#@+XXo+@#$$%&&&%&%$$$$#$$$$#$$$%%&",
-"&&&$$#@OooOO#$%&&&&&&&&%%$$@@oXX+@#$%%&&&%&$$#@XXXXoO+$$%&&&%%%$@+O.....Xo@#$%&&&%%$#@@OO##@OO$$%%&&&%%$$@OoOOOO+$$%%&&&&&%%$#@++++O+++++@#&&%%$$##@++++++@@@#$&&&%$##++XXX@@$$%%&%&&&%%%$##Ooooo@#$$%&&&%%$$#OOoXXXX@#$%%%&&%%$#@oo+++Oo+@@$%%&&&%%$#@OoooO#$$%%%&&&%&%%%$$#OOooO@#$%%&&&%%$#@XXoooXX@#$%%&&&%$#@@++##@++@@#$%&",
-"&%%$$#@ooooO#$$%&&&&&%&%$$#@+XXX+@$$&%&&&%%$$@@XXXXXO+#$%&%&&%$#@+O... .Xo@#$%&&&&%$#@+Oo@@@oO#$%&&&&%%$#@oooOO++$%%&&&&&&%%$#++OOOOOOOO++#&%%$##@++O+O+O+++@@#&%%%$#@++XXX+@##$$%&&%%$$$##@OoooO@@$$%%&&%$$#@OoXXXXX@@#$%%&%$$@++ooOOOooO++#$%&&&%$##@ooooO@#$$%%%&&%&%%$##@ooooO@#$$&&&&%$$#@XXXooXX@##$%&%%%$#++OO+@@OO+@#$%&",
-"%&%$@+++Oooo@#$%%&&&&&%%#@@OOOoO@#$%%&&&&%%$@+OooOOOO+#$%%&&%%$#+OoOooXoO+#$%%%&&%$$@++oo+++++#$%%&&%%$@@+OooXo@@$%%%&&&&&%$$@... ......  @&%$$+++..........oo#&%%$@@+OOooooO+@@$%%&%%$#@++OoooOO++@$$%&%$$@++ooOOOooO++$$%&%$#@+OoooOOooOO+#$$&%%%$#+++OXoo++@##%%&&&%%##@+OooXO++@#$%&%%$$@+OOoOOoooO+@$%&&%$$@++oo+O+ooO++$$&",
-"%%$$@++OOXoo@#$%%&&&%%$$#@+OoooO+##%%%&&&%$#++OoooOOO+#$%&&&%%$#OOoOoXoX++##%&%&&%$$@+OooOO+O@#$%%&&%$$@+OOoXoX@@$$%&&&&&&%$##...    ... .@&$$#+OO.... . ...Xo@&$$#++OoOoooooOO+@#$&$$#++OOOXoXOOOO+##$&$$@+OOXoOoOXooOO@#$&$##+OOooooOXoOOO@#$&&%$$@++OOXoXO++@#$%&%%%$#@++OXoXOO+@#$$&&%$#++OooOOOooO++#$&&%$#+OOooOOOooO++#$&",
-"&%$#@+OOOoXo@@$$%&&&&&$$@++ooooO+@$$%&&&%%$#+OOXoooOO+#$%%&&&$$#OOooOXoX++#$%%&&%%$#++OooOOOO+#$%&&&%$#@+OoooXo+@#%%%&&&&&%$#@oo ..oo+O+XX@&$#@...oo+++++XXoXo@&$#@.... ..... . @@$&$#@... ...... . +#$&$#@.... ..... . @@$&$#@... ...... . +#$&%%$#++OOOXXoOO++@$$&&%$$@++OOXoXOO++@$$&%%$#+OOooOoOXoOO+#$&%%$#+OOooOOOooOO+#$&",
-"&%$#ooX..   O+#$%&&&%%$#OoX.. . ++#$%%&&&%$#OoX.. . O+#$%%&&&$$#ooX. .  O+@$%%&&&%$#OoX. . .O+@$$&%&%$#ooX.. . O+#$%%&&&&&&$#@oo. .XoO+OXX@&$#@...oO+@@@+ooooo@&$#@. . . . ..  .+@$&$#@.... ... .  .+@$&$#@. .. ..... . +@$&$@@.... .....  .+@$&&%$$Ooo... ...ooO#$&&%$#Ooo.. . ..XoO#$&&%$#OoX.. . ..XoO#$&%%$#OoX.. . ..Xoo#$&",
-"%%$#OoX .. .O+#$%%&&&%$#Ooo . . OO#$%%&&%%$#ooX..  .O+@#%%&&%%$#ooX. . .O+@$%%&&%%$#ooX..   O+@$%%&&%$#Ooo..  .O+#$%&&&&&%%$#@oo . ooO+OXX#&$@@...OO@###@oooXo#&$#@+OOXX+++++...+@$&$#@+oOXXO++O+...+@#&$##OOoXXO+O++...+@$&%#@OOoXXO+O+O...+@#&%%$#Ooo .    .ooO$$&%%$$OoX...  ..ooO$$&%%$#Ooo.. . ..ooO#$&&%$#ooX..   ..ooO#$&",
-"&&$$#@+oX. .oo@#$%%&&%%$#@+oo.. oo@#$%&&&&$$#@+oo. .oo@#$%%&&&$$#@+oo ..oo@#$%%&&%%##@+oX. .oo@#$%%&%%$#@+oX . oO@#$%%&&&&%$#@..XXXXXXXX++#&$@+...++###$#@+@+@#&%$#+OoXXO++++...@@$&%$#+OOXXO++O+...@#$&%$#+OOX.++++O...@#$&%$#+OOX.++++O...+#$&&%%$#@+++...+++@#$%&&%$$#@@++...++@@#$%&&%%$#@+++. .+++@#$$&%%%$##+++...O+@@#$$&",
-"&&%$##+oX. .oo@#$%%&&%%$$@@oX ..Xo@#$%%&&&%$$@+oX.. Xo@#$%%&&&%$##+oo. .oo@#$%&&&%%$#@+oX. .oo@#$%%&%%%$@+oo. .oo@#$%&%&%%$$@@..XXXoXXXo+@#&$@+. .+@#$$$$#@@@@$&%$#+OoXX+++XXoOO@#$&%$#+OoXX+++XXooO@#$&%$#+OoXXO++XXOO+@#$&$$#+OOXXO++XXOO+@#$&&&$$$#@@+. .+@@#$$%&&&%$$##++. .++@#$$%&&%%$$##++...+@@#$$%&&&%$$##++. .++@#$$%&",
-"&&%$#@+..OOO .+@#$%&&%%$#@+ .OoO .+@#$%&&%%$#@+..OoO .+@#$%&%%%$#@+..OOO..+@#$%&%%$$@+O..OOO .+@#$%&%%$#@+..OoO .+@#$%%&&%$#@+..XXXXoXXX+@#&#@+...+@$%%%$$####$&%$#++OXXO++XXoOO#$%&%$#+OOXXO++XXOOO#$$&%$#++OXXO++XXOO+#$$&%$#+OOXXO++XXOO+#$$&&&&%$$#@+...+@#$$%%&&&&%$$#@+. .+@#$$%%&&%&%$$#@+ . +@#$$%%&&%&%$$#@+...+@#$$%%&",
-"%%$#++O..+O+..O++#$&&%$#++O..+O+..O++#$&&%$$++O..+O+..O++#$&&%$#++O..OOO..OO+#$&&%$#++O..OO+..O++#$&%$#++O..O+O..OO+#$%&%%$@++XXXXX. .. +@$&$@+...+@#$$%$$$$$$%&%$#+OoXXOO+XXOO+#$%&%$$+OoXX+O+XXoO+#$%&%$#+OoXX+O+XXO++#$%&%$#+OoXX+O+XXO++#$%&&&&&%$##+. .@@#$%%&&&&&&%$##+...@@#$%%&&&&%%%$##+...@@$$%&&&&&&%%$#@@ ..@@$$%&&&",
-"%%$#+OO..O+O..OO+#$&%%$#+OO..O+O..OO+#$&%$$#+OO..O+O..OO+#$&%%$#+OO..+++..OO+#$&%%$#+OO .++O..OO+#$&%$#+Oo..+O+..OO+#$%&%$#++OXXXXX . ..+@$&$@+...+@@##$#####$$&%$$+OO .XXX..++##$%&%$#+OO  XXX..+@@#$%&%$$++o. XXX .+@#$$%&%$$++o. XXX..+@#$$%&&&&&%%$@@. .@@$%%&&&&&&&%%$@@...@@$%%&&&&&&&%%##@. .+#$$&&&&&&&&%%$@@...+#$$&&&&",
-"%$$@oXX .XXX .XXo@#&%$$@oXX. XXX .Xoo@#&%$#@oXX .XXX .XXo@$&%$$@oXX .X.X .Xoo@#&%$#@oXX. XXX .XXo@#&$#@oXX. XXX .Xoo@#$&$$#ooX. ...oooOO@#$&$@@...OO@@#@@++++@$&%$#@OO..XoX..++@#$$&%$#+OO..XoX..++@#$%&%$#+OO..oXX..++@#$$&%$#+OO..oXX..++@#$$&&&&&%$$@@...+#$$%&&&&&&&%$$#+. .+#$$%&&&&&&&%%$@+...+#$$&&&&&&&&%$$#+. .+#$$%&&&",
-"%$#@ooX ..XX .XXo@#&%$#@oXX. XXX .XXo@#&&$#@oXX...XX .XXo@#&%$#@oXX. XXX..XXo@#&%$#@oXX...XX .XXo@#&$#@oXX...XX..XXo@#$&$#@ooX... .XooOO@@$&$#@...oo++@++OoOO+#&%$#+Oo..ooo..++@@#$&%$#+Oo..oXo .++@@#$&%$#+Oo..ooo..++@@#$&%$#++o..ooo..++@@#$&&&&&%%##+ ..+@#%%&%&&&&&%%#@@...+@#%%%&&&&&&%$$#+...+@$$%%&&&&&&&$##+...+@$%%%&&",
-"%$#+XXX..XXX. XXo@#&%$#+oXX. X.X..XXX@@&%$#@XoX .XXX. XXX@#&%$#+oXX..X.X .XXX@@&%$#+oXX. XX...XXo+#&$#@oXX .XX.. XXo+#$&$#@oXo . . oooOO@@#&%#@Ooo..XXXXX...++$&%$#+OO..XoX. O++@@$&%$#+OO..ooo..O++@@#&%$#+OO..XXo. +++@@$&%$#+OO..XoX. O++@@$&&&&%%$#@+...+##$$&%&&%&%%$#@+. .@@#$%%&&&&%%%$#@+ ..+@#$%%%&&&%%%$#@+. .+@#$%%%&",
-"$#@+...XXoXooX...+@&$#@+...XXoooXX...+@&$#@+...XXoXoXo...+@&$#@+.. XXoooXX...+@&$#@+...XXooooX...+@&#@+...XXooooX...+@#&#@+...OOoXoXo+O+oo#&%$#+OO..XXXXX...O+$&$$@+OoXX+O+oOooooo#&$$#+OoXXOOOooooOoo#&$$#+OoXX+O+ooooOoo#&$$@+OoXXO+OOOooOoo#&&%%%$##@+. .++##$%%&&&%%$##@+...+@##$%%&&%%%$#@@+. .+@##$%%&&&%%$##@+...+@@#$%%&",
-"$#@+. .XooooXX. .+@&$#@+ . oXooooX ..++&$#@+ . oXoooXo ..++&$#@+...XoooooX. .+@&$#@+ . oXoooXo ..+@&#++. .XooooXX. .+@#&#@+...OOXoXoX+O+Xo@&%$#+OO..XX.XX...++$&$$@+OoX.+O+oOooOXo@&$#@+OoXXO++OOooooo@&$#@+OoX.+O+oOooooo@&$$@OOoXXO+OoOooooo@&&%%$#@@++. .++@@#$%&%%%$#@@++ . ++@@#$$&&&%$##@++...++@@#$%&%&$$#@@++ . ++@@#$%&",
-"$#Oo . XXOOOXX . oO&$#Oo. .XXOOOXX. .oO&$#Oo. .XX+OOXX  .oO&$#Oo . XXOOOXX. .oO&$#Oo. .XXOOOXX.  oO&#Oo . XXOOOXX. .oO#&#Oo.  oo.. ..XXX .@&&%$##++O...XoO+@##$&$@@.....XXXXX...oo@&$#@... .X.XXX...Xo@&$#@.....XXXXX...Xo#&$#@...  XXXXX...Xo#&%%$$+OoXX . XXoO+$$&&%$$+OoXX . XXoO+$%&%%$#+OoXX   XXoO+$$&&%$$+OoXX . XXOO+$$&",
-"$#Oo. .XXO+OXX. .oO&$#Oo. .XXO+OXX  .oO&$@Oo. .XXOOOXX. .oO&$#Oo . XXO+OXX . oO&$@Oo. .XXO+OXX ..oO&#Oo. .XXO+OXX . oO#&#Oo ..Xo ... X.X. @&&&%%$#+OXXXoO@#$%%&&$#+... .X.X.X...Xo@&$@@.... XXX.X...Xo@&$#+... ..XX.X...Xo@&$@@.....X.X.X...Xo@&&%$#OOoXX   XXoOO#$&&%$#OOoXX  .XXoOO#$&&%$#+OoXX . XXooO#$&&%$#+OoXX  .XXooO#$&",
-"$#OO . XX++OXX . oO&$#Oo . XX++OXX. .oO&$#Oo.  XX++OXX. .oO&$#Oo.. XX++OXX. .oO&$#Oo . XX++OXX . oO&#Oo.. XX++OXX. .oO#&#Oo . oo. ...XXX..@&&&%%$#+OXX.oO#$$%&&&$#@... .XXXXX ..oo#&$@@.....XXXXX ..oo@&$#@.....XXXXX...oo#&$#@... .XXXXX ..oo#&%%$#+ooXX.. XXoo+#$&%%$#+ooXX.  XXoOO#$&%%$#OooXX.  XXoO+#$&%%$#OooXX.  XXoO+#$&",
-"$#@+OoOoO+++OOoOO++&$#@+OoOoO+++OOoOO++&$$@+OoOoO+++OoOoO+@&$#@+OoOoO+++OoOoO+@&$$@+OoOoO+++OOoOO++&#@+OooOo+++OoOoO++#&#@+OOOOOOooooooooO#&&&&$$#Oo...+@#$%&&&&$$@OOOoooooooOoO++#&%$@OOooXooooooOO++#&$##OOooooooooooO++#&$$@OOooooooooOoO++#&&%$$++OOooOooO+++$$&%%%#@+OooOooooO+@#$&&%$$@+OooOoOoOO++$$&&%$$@+OOoOoooOO++$$&",
-"%$@@O+OO+@@@++OO+@#&%$@@O+OO+@@@++OO+@#&$$@@O+OO+#@@+O+O+@@&%$@@+O+O+@@@+O+O+@@&$$@@+O+O+@@@+O+OO@#&$@@+O+O+#@@+++O+@@$&$@@+OO+++O+OOoOo++#&&&&%$#Oo...@@$$%%&&&%$#++OoOOOOOOO+O@@$&$$#++OOOOOO+OOO+@@$&%$#++OOoOOOOO+OO@@$&%$#++OoOOOOOOOOO@@$&&%%$@@+O+OO+OO++@$%&&&$$@@++OOO+O++@@$%&&&$$@@++OOOOO++@@$%&&&$$@@++OO+OO+++@$%&",
-"%$$######$$#######$&%$$$#####$$#######$&%$$#######$#######$&%$$######$$$######$&%$$######$$#######$&$$#######$######$$$&%$######@#@##@####$&&&%%%$##@@@#$$%&&&&&%%$###@#@####@###$$&%%$###@#@#@######$$&%%$######@#######$$&%%$####@#########$$&&%%%$$####@####$$$%&&&%$$$####@#####$$%&&&%$$$######@###$$%&&&%$$####@#####$$$%&",
-"&%%$$$$$$$$$$$$$$$$&&%%$$$$$$$$$$$$$$$$&&%%$$$$$$$$%$$#$$$%&&%%$$$$$$$$$$$$$$$%&&%%$$$$$$$$$$$$$$$%&%%$$$$$$%$$$$#$$$%%&%%$$$$$$$$$$#$#$$$%&&&&%%%$$#$#$$%%&&&&&&%%$$$$$$#$#$$$$$%%&&%%$$$$#$#$#$#$$$%%&&%%$$$##$$#$#$$$$%%&&%%$$$$#$##$#$$$$%%&&&&%$$$$#$$#$$$$%%&&&%&%%$$$$$$#$$$$%%&&%&&%%$$$#$#$$$$$%%&&&%&%%$$$$$$#$$$$%%&&",
-"&&%%%%%%%%%%%%$%%%&&&%%%%$%%%%%&%$%%%%&&&%&%%%$%%&%%%%%%%%%&&%&%%$%%%%%%%$%%%%%&&%&%%$%%%%&%%%$%%%%&%&%%$%%%%%%%%%%%%%&&&%&%%$%$%$$%$%$$%%&&&&&&&%$$$$$%%&&&&&&&&&%%%$$$%$%%$%%%%&%&&&%%%$%%%$%%$%%%%&%&&&%%%$%$$%$%$%%%%%&&&&%%%$%$%%%%%$%%%%%&&&%&&%%%%$%%$%%%%&&&&&&%%%%$$%%$%%%%&%%&&&%%&%%%%%$%$%%%&%&&&&&&%%%$$$%$$%%%%&%&",
-"&&&&%&&%&&&%%&&%&&&&&&&&%%$$$#$$$$$$%%&&&&&%%%###$$%%&&&&&&&&&&&&&&%%$$#$$%%%&&&&&&&%%%$####$%%%&&&&&&&%%%$$#$$#$$$$%%&&&&&&&%&&%&%&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%&%%&%&%&&&&&%%$$##$$%%%&&&&&&&&&&&&&%%$$#$$%%%&&&&&&&%&$$####$%%%&&&&&&&&&%&%%&%&%&%&&&&&&&&&&&&&%%$$##$%%%&&&&&&%&&&&&&&&&&&&&&&&&&&&&&%%%%%%%&&&&&&",
-"&&%%%%%%%%%%%%%&&&&&&&%%%$##@@@@###$$%%&&&&%$$#@###$$%&&&&&&&&&&&&%%$$#@##$%%%&&&&&&%$$#@@@##$%%&&&&&&&%%$###@@#@##$$%%&&&&&&%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%%%%%%%$%%%&&&&&%$$#@###$%%&&&&&&&&&&&%&%$$##@$$%%&&&&&&&%%$#@@@##$%%%&&&&&&%&%%%%%%%%%%&&&&&&&&&&&%&%$$####$%%&&&&&&%%%%%&%%&&&&&&&&&&&&&%%%$$$$%%%%&&&&",
-"%&%%$$$$$$$$%%%%%%&&&%&%$$++oooO+OO+$$%&&&%%$#OOOO+#$%%&&&&&&&&&&%%$#@@oo@#$%&&&&&&%%$#@oXoO+#$%%&&&&&%%$#++oooO+OO+$$%&&&&%%%$$%$$$$%%%%&&&&&&&&&&&&&&&&&&%&&&&&&&&&%%%$$$$$##$$%%&&%&%$#OOOO+#$%%%&&&&&&&&&%%$#@@oo@#$%%&&&&&%$$#@XoXO+#$%&%&&&&&&%%$$$%$$$%%%&%&&&&&&&&%%$#@@oo@#$%%&%%%%$$$$$%%%&&&&&&&&&&&&&%$$##@#$$%%%&&&",
-"&$$$$#########$$%%%&&%%$##OOoXoOOoO+#$%&&&&%$#OoooO##%%&&&&&&&&&&%$$@@+Xo@#$$&&&&&&%$$@+XXXO+@$$%%&&&&%$$#OOXoXOOOO+#$%&&&&%$$##$$###$$%%&&&&&&&&&%&&&&&&&%&&%&&&&%%%$$#$##@#@@#$$%&&&&%$#OoooO##%%%&&&&&&%&%%$$@++Xo@#$%%&&&&&%$#@@XXXO+@$$%%%&&%%%$$##$$###$$$%%&&&&&&%&%$$@++Xo@#$%%&&%$#$#$#$$$%%%&&&&&&&&&%%$$#@@++##$%%&&&",
-"%$##@@@@@@@@@###$$%&&%$$#@OOXXXoOoOO#$%&&&%%$#Ooooo@#$%%%&&&&&%&%%$#@++XX@#$%%&&&&%%$#@+XXXoO@#$%&%&%%%$#@OOXXXOOoOO$$%&&&%%$$@@@##@@##$$%&&&&%%%&%%&&&&%&%%&%&&%&%$$$##@@@@+++@#$%&&%%$##Ooooo@#$$%%%%&&%&%%$$#@++XX+@#$%%&&%%%$#++XXXoO@#$$%&&&&&$$$@@@##@@##$$%%&&%&%%%$$#@++XX+@#$%&%$$#@@@@##$$%%%&&&&&&&&%%$@@++++@@#$$%%&",
-"%$+OoXXXXXXXoo@@@$$&%%$@@+XXXXX..O+@#$$&&&%%$#@+oXo+@#$%%&%&&&&&%$#@XXXO+@#$%%&&&&%%$@ooooOXo+@#$%%&&%$#@+XXXXX..O+@$$%&&&%%$#oo+++oo+@@$%%&&%&%%$%%%%&%%%%%%%%&&%$$#@+OXXXXX...@#$&&%%$#@@+XXo++#$$%%%&&%%$$##@XXXO+@#$$%%&&%$$#@oXOoOXX++@$$%&%%%$#@oo+@+oo++@$$%&&%%%$$##@XXXO+@##$%&%$#ooXXXO++#$%%&%&&&&%%%$#@XX...Xo@#$%%&",
-"$$+OXXXXXXXXXX++@#$&%$#@+OXo.XX..O++#$$&&&%%$#@+XXXO+#$$%%&&&&%%$$#@XXXOO@#$%%&&&%%$$@oXOOoXX++@$%%&&%$@@+oXX.X..+@@#%%&&%%$##XX+++oX++@$$%&&%%$$$$$%%%%%$$$$$%&%%$#@@OoXXXXX...@#$&%%$$#@++oXXO+@##$$%&%%$$##@+XXXOO+@@$$%&%%$#@@oXOoOXXO++#$$&%%$#@@XX+++ooO++#$%&%%$$$##@+XXXOO+@#$$&$#@XXXXXoO+@$$$%%&&&&&%$$@@XX. .XX@@$$%&",
-"$#@+...XXooooX...@@&%$#++OXXXX...O++@#$&&%%$$#@+oXX+O@#$$%%&%&%$$#@+XXXOO@@#$%%&&%%$#@oXoOOXXO+@$$%&&%$@++XXXXX..O+@$$%&&%$$#@XXOOOXXO++$$%&%&$$@++#$$$$$#++@$$&$$#Ooo..ooo.....+@$&%$#@@+++XXoO++@@##$&%$##@@++XXXOO+@@##$&%$##++XXOOOXX+O+@#$&%$#@@+XX+++XXOOO@#$&%$##@@+@+XXXoO++@##&$$#ooX..ooO+@#$$%%&&&%$$@+O..OOO..O+@$%&",
-"$#+O...XooooXo. .+@&$#@XXXXXO+OooXXXO+#&%%$##@OoXXXXo+@@$$%&&%$$#@OoXXXoX+@@$$%&%%$#@+ooXXXXX++@#$%&%$$#@+ooX.XXX++@#$%&%%$#@+OoXXXXX+++#$%&%%$#+++@#$$###+++#$&$#@ooo..ooo.. ..+@#&$$#ooXXX+++ooXXX++$&$$#oXXXX+O+ooXXXO+$&%##oXXXXO++ooXXXO+$&$##oXXXX+++ooXXXO+#&$$++ooXXXOOOXXXXXO+&$##ooX..ooOO+@##$$%&&%$$++O..OOO..O++$$&",
-"$$++...oXooooX...+@&$#@XXXoX+O+XoXXXO+#&%%$#@+OoXXXXXO+@##%&%$$@@@OoX.XXX+++##%&%$##@+OoX.XXXO++@$$&%$#@++ooXXXXXO++##$&%$##@+ooXXXXXO++@#$&&$##OOO@@@#@@+OOO#$&$#@oXX..ooo... .++#&$#@XXXXX+++ooXXXO+#&$#@XXXXX+++ooXXXO+#&$#@XXXXX+++ooXXXO+#&$#@XXXXX+++ooXXXO+#&$#+OXXXXXOOOXXXXXO+&%##ooo .oooO++@@#$$&&&$#@OO..OOO..O++#$&",
-"$#@+XXXoO+++++XXXoO&$#@.....OOOoo ..O+#&%$#Ooo..oooXo...+#$&%$#Ooo..ooooX...+#$&$$#ooXXXooooX...@@$&$$#ooXXXXoooX...+#$&$$#ooXXXooooX...@#$&%%#@...Xo+@+oX...@$&$#+...OOoOOXXXXXoO#&$#@...Xo+++Oo...O+#&$#@...Xo+@+Oo...O+#&$#@...Xo+@+Oo ..O+#&$#@...Xo+@@Oo ..O+#&$#+O.. XX+++XX ..O+&%$#+Oo. .....XXo+#$&%%$#++OXXOOO .oO+$$&",
-"$#@+X.XOo+++++.XXoo&$#@... .OOOOo. .O+#&$#@OoX..ooooX...+@#&$$@ooX..oooXo...+@#&$#@oXXXXooooX. .+@#&$#@oXXXXoooXo ..+@#&$#@oXXXXoooXo ..+@#&%$#@...XX+++oX...#$&$@+.. OOOoOXo.XXoo@&$#+...Xo@@@+O ..O+#&$#@...Xo+@@+O. .O+#&$#+...Xo+@@+O...O+#&$#+...Xo@@@OO.. O+#&$$++.  oX+++Xo . ++&$$#+OO . .. .XXX+@#&&%%#+OoXXOoO .OO+#$&",
-"$#+o.....oOO++OooXo&$#+... .OOOOo...O+#&$#@oXo..oOOXo. .+@#&$#@oXo..OOOoX. .+@#&$#@oXXXXOOooo...+@#&$#@oXXXXOOOXo...+@#&$#@oXXXXOoOoX. .+@#&&%$#@++..XXX..++@#$&$@+...OOXXXOOoooXo@&$#@...oo@@@+O. .O+#&$#+...oo@@@OO...O+#&$#@...oo@@@OO. .O+#&$#@...oo@@@+O...O+#&%$#+oXXXoO++XoXXX@#&%$#+OOXX++++OXoXoo#&&%$$+OOX......OO+#$&",
-"$#OO . ..oOO@+OooXo&$#+XXXXXXoX+O. .++$&$@+...OO@@@++XXXoO#&$@@...OO+@+@+XXXoO#&$@+...oO+@+++XXXoO#&$@+...oO+@@++XXXoO#&$@+...oo+@@++XXXoO#&%%$#@+O. XXX .O+@#$&#@+...++XXXoOoooXo@&$@+XXXoO@#@@+...++#&$#+XXXo+@##@+...+@#&$#+XXXOO@##@+...O+#&$#+XXXoO@#@@+...++#&%$#@ooXXoO++XXXXX@#&%$#++oXX+++++XoXXo@&&%$#+OoXX... .oO+@$&",
-"$#OO.. ..oOO@@OoOXo&$#+XXXXXoXXO+...+@#&$#+. .O+@@@@+XXXoo@&$@+...O+@#@@+XXXoo@&$@+. .OO@@#@+XXXoo@&$@+. .OO@@@@+XXXoo@&$@+. .O+@@#@+XXXoo@&&%%$#@+...XX .+@@$%&#@+...O+XXXOOoooXo@&$#+XXXO+@##@+...+@#&$#@XXXOO@##@+...+@#&$#+XXXO+@##@+...+@#&$#+XXXO+@##@+...+@#&&%$#+++..ooO..O+@##&%$#+OOXXO++++oXoXo@&&%$$++OXX.... OOO@#&",
-"$#+O...Xo+++@@OOoXo&$#@XXXoo...+O...+@#&#@+...+@##$#@oooXo@&$@+...+@####@oooXo@&$@+...+@####@oooXo@&$@+...+@##$#@oooXo@&$@+...+@####@OooXo@&&&$$#@+oX. .Xo+@#$$&#@+...O+XXX+OoooXo@&$#+XXXO+##$#+...+@$&$#+XXXO+####+...+@$&$#+XXXO+##$@+...+@#&$#+XXXO+#$##+...+@$&%%$#@++..oOo..++@$$&%$$+OoXX++@++oooXo@&&%$#+OoXXO++oo...+#&",
-"$#+O...XoO+@@@oooXo&$#+XXXoO.XXOo...+@$&#@+...+##$$#@OoOXo@&$@+...+@$$$#@OoOXo@&#@+...+@#$$#@OooXo@&#@+...@@#$$#@OoOXo@&#@+...+##$$#@OOoXo@&%&$$#@+oo  .oo+@#$%&#@+. .+OXXX++oooXo@&$#@XXXO+###@@...+@#&$#@XXXo+###@@...+@#&$#@XXXOO####+...+@$&$#@XXXo+@###+...+@#&&%%$#@+..OoO..+@#$%&%$#++oXXO++++XooXo@&&%$#+OOXXO++oo...+@&",
-"%##+XXXOO@@@@@Ooooo&$#+XXXooXX.Oo...++$&#@+...++#$##@oXXoo@&#@+. .++##$#@oXXoo@&$@+. .+@#$##@ooXoo@&$@+ ..+@#$##@oXXoo@&$@+...++#$##@oXXoo@&&%$#+OO..XXX..O++#$&$@+. .XXOOOO+XXXoo@&$#+XXXO+@##@+...+@$&$#+XXXO+@##@+...+@$&$#+XXXO+@##@+...++$&$#+XXXO+###@+...+@$&&&%%##@oo.  oo@#$%%&%$#+Oo. XXXXX...O+#&&%$$+OoXX+++++...+@&",
-"%##+XXXoO+@#@+ooooo&$#+XX.OOoOoX....++$&#@+ . ++@##@+oXXoo@&$@+...++#@#@+oXXoo#&$@+...O+@##@+XXXoo#&$@+.. O+@##@+oXXoo@&#@+...++@##@+oXXoo@&%%$#++O. ooX .OO+#$&#@+...XXooO++XXXoo@&$#@XXXO+@@#@+. .+@$&$#@XXXO+@#@@+...+@$&$#@XXXO+@#@@+...+@$&$#@XXXO+@@#@+...+@$&&&%%$#@oX . oo@#$%%&%$#++o..XXXXX ..O+#&&%$#+OOXX+++++...+@&",
-"$$@+XXXOO+@@@+oXooO&$#+XXXOOOooXX...+@#&$@+...O+@@@@+XXXoo#&$@+. .O+@@@@+XXXoo@&$@+ ..O+@@@@+oXXoo@&$#+...O+@@@@+XXXoo#&$@+. .O+@@@@@XXXoo#&&$$#+Oo..oXo..OO+#$&$@+. .XXOoOO+XXXoo#&$#@XXXOO@@@++...+@$&$#@XXXO++@@@+...+@$&$#@XXXOO@@@@+...+@$&$#@XXXOO@@@++...+@$&&&&%%##@+. .+@@$%%%&%$#+OO ..XXXX...++#&%$$#+OoXX+++++...+@&",
-"$##+. .oo+O+OO...++&$#+...oo+++XX  .+@#&$#@oXXXXO+OOO...+@#&$#@XXXXXO+OOO...+@#&$#@oXXXXO+OOO...+@#&$#@oXXXXO+OOO...++#&$#@oXXXXO+OOO...+@#&%$#@...oo+++oo...@$&$#@XXX. OOOOO...+@#&%#@OooXX+++OO...@@$&%#@OooXX++OOO. .@@$&%#@OooXX+O+OO...+#$&%#@OooXX+++OO...@@$&&&&%$#@+O...O+@#$%%&$#@Ooo..XXooo+++##$&%$#@OooXXooooo...+@&",
-"$#@+...ooOOOOO ..+@&##@...oo+OOXX . +@$&$#@oooXXOOOOO...+@#&$#@oXXXXOOOOO...+@$&$$#ooXoXOOOOO ..+@$&$#@oooXXOOOOO...+@$&$$@ooXXXOOOOo...+@#&&$#@...O+@@@OO...#$&$#+XXX..OoOoo ..+@#&%$#OooXXOOOOo...@#$&%$#OooXXO+OOo...@#$&%$#OooXX+OOOo...@#$&%$#OooXXOOOOo...@#$&%&%$$#@OO . O+@#$$%&$$@OOo .ooooo+@##$%&%$$@OOXXXooooo ..+@&",
-"$#Oo. ...... .ooO@#&$@+.. ..O++oo...+@#&%$#@++XX.....oO+@#$&%$#@++XX.... oOO@#$&%$#@++XX.....OOO@#$&%$#@++XX.....OO+@#$&%$#@++oX.....oOO@#$&&%$#@++@@####@++@##&$#@oXXXX.....oOO@#$&%$#@++.... ..ooo@#$&%$#@++... .. ooo@#$&%$#@++.... ..ooo@#$&%$#@++.... . ooo@#$&&&%$@@O.... ..++@%%&$@+.... oXo@@##$$%%&%$@+.. . ooO.....@@&",
-"$#oo... .... .OOO#$&$#+.....+++Oo...+@$&&$$@@+oo . ..OO+#$%&%$$@@+oX. ...oOO#$$&%$##@+oX.. ..O++#$$&%%$@@+oX. . .OO+#$$&%$$#@+oX.. ..oOO#$$&%%$#@@@#$$$$##@@@$$&$$@ooo.X. ...oOO#$%&%%$#@+..... .ooO#$$&%%$#@+.......oOO#$%&%%$#@+.. ... ooO#$$&%%$#@+.. ....ooO#$%&%&%$@++.. .. .++@$%&$#+.. ..ooO@#$$$%%&&%$#+.....Ooo ....@#&",
-"$#Oo..... ... O++#$&$#@... .+@@OO...@#$&%%$##@oo.....++@#$%&&%$##@oo.....O++#$%&&%$##@oo.....O+@#$%&%%$##@oo.....++@#$%&&%$#@@oo.....O++#$%&%%%$###$$%%%$$###$%&$$#oooXX.....O++#$%&%%$##@.......oOO#$%&%%$##+... ...oOO#$%&%%$##@.......oOO#$%&%%$##@..... .oOO#$%&&&%$#++.......+@@$%&$#@.....oOO#$$%&&&&&%$#@.....OOO.....##&",
-"$$#@@+@+@+@+@@@##$%&$##@@@@@@###@@@@#$$&&&%$$#@@@@@@@@#$$%%&&%%$$##@@+@@@@#$$%%&&&%$$##@@@+@@##$$%&&&&%$$##@@+@@@@#$$%&&&%%$$##@@+@@@@#$$%&&&&%%$$$%%%%%%%$$$%%&%$#+OO+++@+@@@#$$%%&&&%$##@@+@+@@@##$%%&&&%$$#@@@+@+@@##$$%&&&%$##@@@@+@@@##$%%&&&%$##@@@+@@@@##$$%&&&%%$##@@+@+@@@#$%%&$$#@@+@@@##$$%&%&&&&%$$#@@@+@@@@@@@@##$&",
-"%$$######@#####$$%%&%$$#####$$$$$##$$$%&&&&%$$$##@###$$$%&%&&&%%$$########$$$&&&&&&%$$#######$$$%%&&&&&%%$#######$$$%%&&&&&%$$########$$$%&&&&&%&%%%&&&&%%%%%&%&%$$+++########$$$%&&&&%%$$$#######$$$%&&&&%%$$########$$%%&&&&%%$$####@###$$$%&&&&%%%$####@###$$%%&&&&%%%$$#######$$$%%&%$$$#####$$$%%&&&&&&&%$$############$$%&",
-"&%%$$$$#$$$#$$$$%%&&&%%$$$$$$%$%$$$$%%&&&&&&%%$$$$$$$$%%&%&&&&&&%%%$$$$$$$%%&%&&&&&&%%$$$$$$$$%%&&&&&&&%%%%$$$$$$$%%&&&&&&&&%%%$$$$$$$%%&&&&&&&&%&&&&&&&&&&&&%&&%%$$$$###$$$$$%%%&&&&&&&%$$$$$$$$$$%%&&&&&&&%%$$$$$$$$$%%&&&&&&&%%$$$$$$$$$%%&&&&&&&%%$$$$$$$$$%%&&&&&&&%%$$$#$$$$$%%&&&&%$$$$$$$$%%&&&&&&&&&%%%$$$$$$$$$$$$$%%&",
-"&&&%%%%%%$%%%%&&&%&&&%&%%%%%%&%&%&%%%&&&&&&&&&%%%%%%%%&&&&&&&&&&&%&%%%%%%%%&&&&&&&&&&&&%%$%%%%&&&&&&&&&&&%&%%%%%%%&&&&&&&&&&&%&%%%%%%%%%&&%&&&&&&&&&&&&&&&&&&&&&&&%$$$%%%$%%%%%&&&&&&&&&&&%%$%$%%%&&%&&&&&&&&%%%%$%%%%%&%&&&&&&&&%%%%%%%%%&&%&&&&&&&%&%%%%%%%%%&%&&&&&&%&%%%%%%$%%&&%&&&&&&%%%%%%%&&&&&&&&&&&&%&%%%%%%%%%%%%%&&&",
-"&&&&%%%%%%&&&&&&&&&&&&&&&&&&%&%%%%&%&&&&&&&&&&&&%%%&%&&&&&&&&&&&&&&&&&&&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%%%%%&&&&&&&&&&&&&&&&&&&%%%%%&%&&&&&&&&&&%%&%%&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%%%&&&&&&&&&&&&&&&&&&&&%%%%%&%&&&&&&&&&&%%&%%%&%&&&&&&&&&&&&&&&&&&&&&&&&&",
-"&&&&%%%%%%%%&&&&&&&&&&&&&&&&%%%%%%%&&&&&&&&&&%%%%%%%&%&&&&&&&&&&&&%%&&%&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$$$$%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%%%&%&&&&&&&&&&&&&&&%&%%%%%%%&%&&&&&&&%&%$%%%%%&&&&&&&&&&&%&&&&&&&&&&&&&&&&%%%$%%%%%%&&&&&&&&&&&&&&&%&%%%%%%%&&&&&&&&&&%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"&&%&%$$$$$%%%&&&&&&&&&&&&%%%%$$$$$%%%&&&&&&&&%$$$$$$%%%&&&&&&&&%%&%%$%$%%%%&&&&&&&&&&&%&%%&&%&&&&&&&&&&&&%$$####$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%$$$$$$%&&&&&&&&&&&&&&&&%%%$$$$$%%&&&&&&&&%%$$$$$%%%&&&&&&&&&&%&&%%&%&&&&&&&&&&&%%$$$$%%&&&&&&&&&&&&&&&&%%%$$$$$%%&&&&&&%%%%$$$$$%%&&&&&&&&&&%&%&%&%%&&&&&&&",
-"&&&%$##++#$$%%&&&&&&&&&&&&%%###++$%%&&&&&&&%%$$$+++$$%&&&&&&&&&&%%$$$$$$#$%%%&&&&&&%%%%%%%%%%%%&&&&&&&&%%%$@+OOO#$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$##++$$$%&&&&&&&&&&&&%&&%%$#++##$%%&&&&&&%%$#@++$$%%&&&&&&&%%%%%%%&%%%%&%&&&&&%%$##++$$$%&&&&&&&&&&&&%&&%%$#++##$%%&&&&&&&$$#+@+$$%%&&&&&&&&%&%%%%%%%%&%&&&&",
-"&%%%$#@+O##$%%%&&&&&&&&%%%$$#@@++$$%%&&&&&&%%$#@+++#$$%&&&&&&%%%$$#@@#@#@#$$%%&&&%&%%%$%%%%%%%%%&&&&&&&&%$$@+ooO##$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%$#@+O##$$%%&&&&&&&&&&&&%$$##O+@#$%%&&&&&&%$$#+++@#$%%%&&&%&%%%$%%%%%%%%%%&&&&&%%$#@OO##$$%&&&&&&&&&&&&&%$$##O+@#$%%&&&&%%%$##O++#$$%%&&&&&%&%%%$%%%%%$%%&&&&",
-"&&&$$#@OO@@#$%%&&&&&&&&&&$$#@++OO#$%&&&&&&%%$#@@OOO@#$%%%&&&&&%$$##@+@+@@@#$%%%&%&%%$$$#$$#$$$%&%&&&&&&&%$#++ooo@#$%&&&&&&&&%&%&%&&&%&%&%&&&&&&&&&&&&%&%&%&%&&&&&&%%##@OO@@#$%%%&&&&&&&&&%%%$$@@OO@##%&&&&&%%%$#@OOO@##$%&&&&&%%$$$$$$$$$$$%%&&&&&&$$#@OO@@#$%%&&&&&&&&&&%%%$##@OO@#$%%&&&&&%$#@@OOO@#$%%&&&&&&%%$$$#$$$$$$%%%&&",
-"&&&%$#@oooOO#$%%&&&&&&%%%$#@oXX+@$$%%&&&&&%$$#oXXXX++$$%&&&&&%%$@+O.....Xo@#$%&&%%%##@++###++$$%&&&&&&&%%$#OoOO+++$%%&%&&%&%%%%%%%%%%%%%&&&&&&&&%%%%%%%%%%%%&%&&&&%%$##oooOO#$%%%&&&&&&&&&%$#+OOoo@$$%&&&&&&%$#+OXXXXo#$$%&&%%%##@++###++##$%%&&&&&%$##oooOO#$%&&&&&&&&&&%%$#+OOoo@#$%%&&&%%$$#oXXXX+@$$%%&&&%%$$@@++###++$$&%&&",
-"&&%%$$#ooooO#$$%&&&&&%&%$#@+XXX++#$%&&&&%%%$#@XXXXXO+#$%%&&&&%$$++O.....XX@@$%%&&%$#@@OO@@@OO#$%%&&&&&%%$$@OoOOO++$$%%&&%&%%$%$%$%%$%$%$%%%&&&&%%%%$$$$$$%$%%%&&&&&%$##ooooO@#$%%%&&&&&&%%$##OOOXo@#$%%&&&&%$$#+oXXXoo@#$%%&&%$#@@OO@@@O+@##$%%&&&%%$$@OooOO#$$%&&&&&&&&%%$##+Oooo#$%%&&&&&%$#@XXXXXO+#$%&&&&&%$##@OO@@@OO$$%&&&",
-"&&%%$#@++ooo@#$%%&&&&%%$$#++oOO+#$$%%&&&&%$#@+OoOOOoO#$%%&&&&%$#+OoOOXXoOO@#$%%&&%$#@++O+++O+#$%%&&&&&&%$#@OOoXo@@$$&&&&%%$$#####$$#####$$%&%%%%$$#########$$%%&&&%%$#@++ooo@@#$%%&&&&%%$$$@@ooX++##$%&&&%%%$#@ooOoOoO+@#$%&%%$#@@OO+++OO+@#$%%&&&&%$$@++ooO@$$%&&&&&&&&%$$@+ooo+@#$%%&&&%%$#@+OoOOOO+$$%%&&&&%$#@++O+++++#$%%&&",
-"&%%$$#@++XXo@@$$%%&&&&$$#@+OooO+@#$%&&&&%%$@@+OoOOOoO@#$%&&&%%$#+OoOOoXXO+@#$%&&%$$@++OoOOOOO@$$%&&&&%%$##@OooXo+@#$%%&&%$$#@@@@@@@@@@@@#$$&&%$$$#@@+@++@@@@$$%&&%%$$#@++XXo++##$$%&&&%$$##++ooX++@##$%&&&%$##@ooOOOoO+@@$%&&$$#@+OO+++OO+@@$%%&&&%%$#@+OooO@#$%&&&&&&%%$$#@+oXo@@$$%&&&&&%%#@+ooOOOO+#$%&&&&%%$#@+OoOOOO+#$%&&&",
-"&%%$#@++OoXo+@#$$%&&%%$#@+OOooo+@#$$%%&&%$$@+OooOOOoo@#$%%&&%%$@OOoOooXooO@#$%%&%$#@++ooOOOOO@#$%%&&&%$$#@+ooXoX+@##%%%&%$#@++++@+@+++++@#$&%$$#@@+++++++++@##%&&%$$#@++OoXoO+@@#$$&%%$$#@@+OXoXO++@#$$&&%$$#@+oooOOoo++@#$&%$#@++ooOOOoO++@#$%&&&%%$#@+Oooo@#$%&&&&&&&%$#@++oXo@#$%%&&&&&%$#@+OoOOOO+#$%&&&&%%$#@+oOOO+O+#$%&&&",
-"%%$#Ooo .. .XX@#$%%&%$#OOo. ...XX@#$%&%&%$#Ooo. ...XX@#$%%%&%$$#ooo. . .XX@#$%%&%$#Ooo.. ..XX@#$%%&&%%$#Ooo.. ..XX@#$%%&$#@... .XXX.. ..oO#&%$#OOO.... ... .+#$&%%$#OOo.......oOO#$&&%$#OOo... ...ooO#$&%%$#Ooo.... ..ooO#$&$$#Ooo... ...ooO#$$&&%&$@@+ .. .@#$%%&&&&%%$#@+.. ..+@$$&&&&&%%$@+O. . .+@$%%%&&&%%$@++ .. .+@$$%%&&",
-"%%$#Ooo. . .XX@@$$%&%$#OoX. . .XX+##$%&&$$#ooo .  .XX+@#$%&&&$$#ooX. . .XX+@#$%&%$#ooX . . XX+@#$%&&&%$#Ooo . . XX@@#$%&$#@... .XXX... .oo@&$#@Ooo.  . .. ..+@$&%$#@Ooo.  . ..ooo@#&%$#@Ooo. . . .ooO@#&%$#@Ooo . . . ooo@#&$#@Ooo . .  .ooo@#$&&%%%#@+. . .+#$%%&&&&&%%@@+.. . @#$$&&&&&&%$#@+. . .@@#%%&&&&%%$@++. . .@@$$&%&&",
-"&$$#OOoOOOOO..O+@$%&%##OOoOOOOO..O+@$%%&$$#OOoOOOOO..O+@$%%&%%##+OOOOOOO..O+@$%&%##OOoOOOOO..O+@$%%&%%$#OooOOOOO..O+@$%&$#@Ooooo  .oOOOO..@&$#+...oo+++oo   +@#&%$#@.. ooO+OoX...+#&%$#+...oo+O+oo...+#&%$#@...oX+O+Xo...+@&$#+...oo+O+Xo ..+@$&&&&$$#@++...@@$%&&&&&&%%$#@++...+@$%%&&&&&%$$#@++...+#$%%&&&&&%%$#@++...@@$%%&&&",
-"%%##OooOoOOO..O++$$&%$@OOoOOOOO..O++$$&&%##OooOOOOO..O++$$%&%%$@+OoOOOOO..O++$$&%$@OOoOOOOO .O++$$%&%$$@OOoOOOOO..O++$$&$#@OooOo.. OOOOO .@&$@+...oO@@@OO.  +@$&%$#+...XoO+Ooo ..+@&$$@+. .oo+O+oo ..+@&%$#+.. ooO+OoX. .+@&$@+. .XoO+Ooo...+##&&&%%$$#@+. .+#$$&&&&&&%%%$#@+. .@#$%%&&&&&&%$$#@+. .+##%&&&&&&%%$$#++. .+#$$&&&&",
-"%$$@OOoOOOOO..OO+#$&$##OoooOOOO..O++#$%&$##OOoOOOOO..OO+#$%&%%##OOOoOOOO..OO+#$&$##OOooOOOO..OO+#$%&%%##OOooOOOO..O++#$&$#+OOooO  .oOOOO. @&$@+...++###@@OOO@#$&%##+. .oo+O+Xo...+@&$#@+.. ooO+Ooo ..+@&%##+...XoO+Ooo...+@&#@+.. ooO+OoX ..+@$&&&&&%$#@+...@@$%%&&&&&&%%$#@+...+@$$&&&&&&%%%$#@+...@@$%%&&&&&&&%$$@+...@@$%&&&&",
-"%$#@ooo.. .   O++$$&$#@Ooo.. .   OO+$$%&$#@OoX.. .   O++$$%&%$#@Ooo. .    O++$$&$#@ooo. ..   O++$$%&%$#@ooo.. .   OO+$$&#@+XXX. .. XXXXX .+&#@+...+@@##@@OO+@#$&$$@+. .XXXXXXX  .+@&$$@+ ..XXXXXXX. .+@&%$@+  .XXXXXXX ..+@&$@+ . XXXXXXX. .+@$&&&&%%$##+. .+##%%&&&&&&%%$$@+...@@$%%&%&&&&%%$##+. .+##%%&&&&&&%%$##+. .+##%%&&&",
-"%$#@ooX. . .. OO+#$&$#@ooo. . .. OO+#$%&$#@ooo. . .. OO+#$%&%$#@oXo.. ... OO+#$&$#@ooo.. ... OO+#$%&%$#@ooo . .. .OO+#$&#@OXXX .  .XXXXX .+&$@+. .OO++@+@++++@#&$#@+ . XXXXXXX. .+@&$#@+.  XX.XXXX. .+@&$#@+.. XXXXXXX  .+@&#@+. .XXXXXXX. .+@$&&&&&%$$@+...@@$$%%&&&&&&%$$#+. .+##$%%&&&&&&%$$@+...@@$$%%&&&&&&%$$@+...+@$$%%&&",
-"%$@+.. OO+OOXXoO+#$&$@+. .OO+O+XXo++#$%&$@+.. OO+O+XXOO+#$%&%$@+.. OO+OOXXoO+#$&$@+.. OO+OOXXoO+#$%&%$@+.. OO+O+XXo++#$&@oXXXX+O.  oXooooo@&$#@ooX..oXoXX...OO$&$$@+ . XXoooooXoo+@&%#@+ . XXoXoXoXoo+@&$#@+  .XXoooooXoo+@&#@+ . XXooooXoXo+@#&&&%%%$#@+. .+@#$%%%&&&&%%$#@@...+@#$%%&&&&%%%$#@+. .+@#$%%&&&%%%%$#@+. .@@#$%%%&",
-"$$@+...OOO+OXXOO+#$&$@+. .OO+OOXXoO+@$%&$@+...OOO+O.XOO+#$%&$$@+...OOO+OXXOO+#$&$@+...OOO+OXXOO+#$%&$$@+...OO+OOXXoO+#$&#ooXoXO+. .XXoXoXo@&%$#oXo .XXXXX...oO#&%#@+.  XXXXoXoXXo+@&%#@+. .XXXooooXXo+@&$$@+ . XXoXXoXoXo+@&$@+  .XXXoXoXoXo+@$&&&%%$##@+...+@##$%%&&&%%$#@@+ ..+@##$%%&&&%%$##@+...+@##$%%&&&%%$##@+...+@##$%%&",
-"%$@+.. +O+OOXXoOO@#&#@+...OO+O+XXoO+@#$&$@+. .OO+O+XXoOO@#%&$$@+. .O+O+OXXoOO@#&$@+. .O+O+OXXoOO@#%&%$@+.. +O+OOXXoOO@#&#oXoXoO+ . oXoooXo@&$$##@+oo...XoooO@#$&%$@+ . XXoooXooXo+@&%$@+ . XXoXoXoXoo+@&%$@@  .XXoooooXXo+@&$@@.  XXooXooXoo+@$&%&%$$@@++ ..++@##$%&%%%$$#@++. .++@##$%&&%%$$@@++. .++@##$%&&%%$$@@++ . ++@##$$&",
-"$$@+...XXXXX .XXX@#&$@+.. XXX.X  XXX@#$&#@+...XXXXX  XXX@#$&$$@+...XXXXX  XXX@#&#@+...XXXXX  XXX@#$&$#@+...XXXXX  XXX@#&@oo...... ...XXX..@&%%$##@Oo...XooOO@#$&$$#@XXX..XXXXX. .@@&%$#@XXX..XXXXX . @@&%$#@oXX. XXX... .@@&$#@XXX..XXXXX . @@$&&%$$+OooX.  XXoO+$$&&%$$+OooX . XooO+$$&&%$$+OooX . XXoO+$$&&%$$+OooX. .XXoO+$%&",
-"$$@+. .XXX.X .XXX@#&$@+...XXXXX .XXX@#$&$@+.. XXX.X. XXX@#$&%$@+. .XXX.X .XXX@#&$@+. .XXX.X. XXX@#$&%$@+. .XXX.X. XXX@#&#oo..... . ..XXX..#&&%$$#@OO...XoOO+#$%&%$$@oXX .XXXXX . @#&%$$@oXX..XXXXX ..@@&%$$#ooX..XXX.. . @#&$##oXX. XXXXX . @#$&&%$#+OoXX. .XoooO#$&&%$#+OoXX. .XXoOO#$&&%$#+OoXX. .XoooO#$&&%$#+OoXX. .XoooO#$&",
-"%$$@OoOXoooXooooO@$&$#@OOooXoXoooooO@$$&$#@OOoooooXOoooO@$$&%$$@OOooXoooooooO@$&$#@OOooXooXOoooO@$$&%$$@OoooXooXOoooO@$&#@+oooooO+Oooooo+@#&&&%%$#++XXXoo+##$$%&%%$#@@+OooooXoO++@$&&%$#@@+ooooXooO++#$&%%$##@+Ooooooo++@@$&%$#@@+OooooXo+O@@$$&&%$$++OoooooooOO+#$&&%$#++OooooooooO+#$&&%$$++OoooooooOO+#$&&%$$++OoXoooooOO+#$&",
-"%$$#+OOoooooooooO#$&%$#+OOoooooOOooO#$$&%$#+OOoooooOOoOO#$%&%$$#+OOoooooOOoOO#$&%$#OOOoooooOOoOO#$$&%$$#+OOoooooOOoOO#$&$@@ooooo+++ooooO@#$&&&&%$#@+X.XoO@#$%&&&&%%$##@OOooooo+@@#$&%%%$##@ooooooo+@@#$&%%%$##@OOooooo+@@$$&%$$##@OOooooo+@@#$%&&%$$++OoXoooooO++#$&&%%$@+OoXoooooO++$$&&%$$++OoXoooooOO+$$&&%$$@+OoooooooOO+$$&",
-"&%$#++OOOoOOO+OO+#$&%$#++OOOOOO++OO+#$%&%$#++OOOoOO++OO+#$%&&%$#++OOOOoO++OO+#$&%$$++OOOoOO++OO+#$%&%%$#++OOOoOO++OO+#$&$##OOOOO@@@OOOOO##$&&&%%$#oo...++#$%&%&&&&%%$##+OOOOOO@@#$%&&&%%$##+OOOOOO@@#$%&&&%%$$#+OOoOOO@##$%&&%%$##++OoOOO@@#$%%&&%%$@@+OoOoOoOO+@$%&%&$$@@+OoOooOOO++$$&&%%$@@+OoOoOoO+++$%&&&$$@@+OoOoooO+++$%&",
-"&%%$$###@@@#@####$$&&%$$##@@@@#@###$$%%&&%$$##@@#@@#@###$$%&%&%$$##@@#@#@####$%&%%$$###@#@@#@###$%%&&%%$$###@#@#@####$$&%$$#############$$%&&&%%$#oo...+@$$%&&&&&&&%%%$$##@###$$$%%&&&%%%$$##@@####$$%%&&&%&%$$$#######$$%%&&&%%$$########$$%%&&&&%%$$##@#@@####$$%&&&%$$###@#@#@###$$%&&&%%$$##@#@@#@##$$%&&&%%$###@@##@###$$%&",
-"&&%%$$#$$$$#$#$$$%%&%%%$$$$$$#$$$$$$%%%&%%%$$$$$#$$$$$$$%%&&&%%%$$$$$#$#$$$$$%%&&%%$$$$$#$$$$$$$%%&&&&%%$$$$$#$#$$$$$%%&%%$$$#$$$$$$$$$$%%&&&&&%$$#@@@@##$%%&&&&&&&&&%$$$$$#$$$%%%&&&&&&%%$$$$$#$$$$%%&&&&&&%%%$$#$#$$$%%&&&&&&&%%$$#$#$$$$%%&&&&%&%%$$$$#$#$#$$$%&&&%&%%$$$$#$#$$$$$%&&&%&%$$$$$#$$$$$$$%%&&%&%%$$$$#$#$$$$$%%&",
-"&&&%&%%$%$%$%%%%%&&&&&%&%%$%%$%$%$%%%&&&&%&%%$%$%$$$%%%%&%&&&&%&%%%$%%%$%$%%%&&&&%&%%$$%$%$$%%%%%%&&&&&%%%$$%%%$%$%%%&&&&&%%%%$%%%%$%%%%%&%&&&&&%$$####$$%%&&&&&&&&&&&%%%$%%$%%%&&&&&&&&&&%%%$%$%%%&&&&&&&&&&%&%%%%$%%%&%&&&&&&&&%%%%$%$%%&&&%&&&&%%%%$$%$%$%$%%%%&&&&&%&%%$%$%$%$%%%&%&&&&&%%$$%$$$$%%%&&%&&&&%&%%$%$%$$$%%%&%&",
-"&&%%%%%%%%%%%%%%%%&&&&&&&&&%&%&%&%&&%&&&&&&&&&%&&&&&&&&&&&&&&&&&&&&&%&%%&%&&%&&&&&&&&&%%%%%%%&&&&&&&&&&&&&%&%%%%&%&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&&%&%&&&&&&&&&&&&&&&&&%&%%%%&%&&&&&&&&&%&%%%%&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"%%%%$$$#$$$$$$$%%%&&&&&&&%%%%%%%%%%%&&&&&&&%%%%%%%%&&&&&&&&&&&&&&&&%&%%%%%%%&&&&&&&&%%%$$$$$%%&&&&&&&&&&&%%%%%%%%%%&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%&&&&&&&&&&&&&&&&&%%%%%%%&%&&&&&&&&%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&&%%%%%%%&&&%%$$$$$$%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"%%$$###@@@#@@##$$$&&&&&%&%%$$$$#$$%%%%&&&%&%%$$$$%%%&&&&&&&&&&&&&&&%%%$$$$%%%&&&&&&&%%$$###$$$%%&&&&&&&&%%$$$#$$$$$%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%$$$$%%%&&&&&&&&&&&&&&%%$$$##$%%&&&&&&%&%$$$#$$%%%&&&&&&&&&&&&&%&&&&&&&&&&&&&&&&&&%&%$$$$$%%&&&%$$#@@##$%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&",
-"%$##@+@++@+@@+@##$%&&&&%%$$##@####$$%%&&&&%%$$###$$%%&&&&&&&&&&&&&%%$$###$$%%%&&&&&%%$##+@+##$%%&&&&&&&%%$$#@#@###$$%%%&&&&%&&%&&%&%%%&%&&&&&&&&&&&&%&%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%$$###$$%%%&&&&&&&&&&&%%$$####$%%%&&&&&%%$$#@###$%%&&&&&&&&&%&&%&&%%&%&%&&&&&&&&&&&%%$$####$%%%&$##@+@@##$%&&&&&&&&&&&&&&&%%%%%&%%%&%&&&",
-"$$+O.....XoX..oO+$$&&&%%$$#OOOO+OO##$%%&&%%##@oo@##$%%&&&&&&&&&&%&%$##@..@#$%%&&&&&%$$++...++$$%%&&&&&&%$$@+ooo++++@$%%&&&&%%%%%%%%%%%%%&&&&&&&&&%&%%%%%%%&&&&&&&&&&&&&&&&%&%%&&&&&&&&&%##@oo@##$%%&&&&&&&&&%&%$#++OoO#$%%&&&&%%$#@+oXo##$%&&&&&&&&&%%%%%%%%%%%%&&&&&&&&&&%%$##@..@#$%%&$#@. .Xo@$$%%&&&&&&&&&&%%%%%%%%%%%%%%%&&",
-"$#+O... .XXX..oOO#$&&%%$##@ooOoOoO@##%%&&%%$@@oX+@#$$%&&&&&&&&&&&%$$@@+..@#$%&&&&%%$$#+O...O+#$%%%&&&%%%$#+OoXoO++++$%%&&%%%$$$$$$$$$$$%%%&&&&&&&&%$$$$$$%%%&&&&&&&&&&&%%%%%%%%%&%&&&%%$#@@oX+@#$$%%&%&&&&&%%%$$#+OOoo@$$%&&%%%$$#+OXXX@#$$%%&&&&%%%$$$$$$$$$$$%%%%&&%&%%%%$$#@+..@##$%&$@@ ..XX@#$%%%&&&&&&&&&%%%$$$$$$$$$$$%%&",
-"$#+O... .XXX..oo+#$&&%$$#@+oXOoooo@##%%&&%%##+oX+++#$$%%&&&&&&&%%$$#+++..@@$$&&&&&%$#@+O. .OO@#$%&&&&&%$#@+OXXXOOO++$$%&&%%$$########$$$%%&&&&&&%%%$##@#$$%&&&&&&&&&&%%%%$%$$%$$%$%&&%%$#@+XX+++##$$%%&&%%%%$$$#@Ooooo@#$%%&%%$$#@OOXXX+@#$$%%&&&%$$$##########$$%&&&%%%%$$##+@+..+@#$%&$#+. .XX@@#$$%%%&&&&%%%$$$##########$$%&",
-"$#OOoooXX . XX++@#$&%$$#OOoXX...oX@#$%&&&%%$#@+OXXX@#$%%%&&&&&%%%$#@oXXOO@#$%%%&&%%##+XXOOOXX@@$%%%&&%%##@XXXXX..++@$%%&%%$#@@oo@@@Oo+@#%%%&&&&%&$$@+ooo#$%%%&&&&&&&%%$$$##$####$$$&%%$##@@+OXXo@##$$%%&%%$$###++XXX++@#$$%&%$#@@+XXoooXo@#$$%%&%%$#@++oO@@@..@#$$%&%%$$$###@XXXOO+@#$$&$#@OOoXX+@##$$$%%%&&%%$$##@..@@@oo++@#$&",
-"$#+OoooXX . XXO+@#$&%$#@oooXX. .Xo@#$$&&&%%$#@OOXXX+@#$%%&&&&&%%$#@+XXXO+@#$%&%&&%$#@+XXO+OXX+@#%%&&&%$#@+XXXX...+@@$%&&%%$@++oo+++oo++@$%&&&&&&%$$@+ooo@#$%&&&&&&%%%$$##@@@@@@@##$&%$$#@++OOXXX+@@##$%&%$$#@@@++XXX++@@#$$&$##+++XXooOXX@@#$%%&%$#@++Ooo+++..@@#$%&%$$#@#@@@XXXOO+@@@#&%$#+OoXX++@@@##$%%&&%$##@@+..@+@ooOO+@#&",
-"%#@+XXXoOOOO .ooo@$&$#+OoXXOOXoXXo+@$$%&&%$##@ooXXXoO@#$%%&&&%%$#@OoXXXXo@#$$%&&%%$#@+oXXXXXo@@#$%%&%%$##+oXXXXXX+@#$%%&%%##++oXoXXXo@@#$%%&&&&%%$#+O...@#$%%&&&&&%%$$@Oooooooooo++&$$+OooX+++++XooO+#$&$$++ooo+++++XXoO+#$&$+OoXXOO+O+XXoOO#$%&$$+OoXX++@++oXoOO#$&$$++ooXOO+++oOXXo++&$##+OoXXoXooo+@@$$%&$$@OoXooo+@+oooXoO+&",
-"$$@+XXXoOOOO. Xoo@#&$#+OXXXOOXXooo+##$%&&%$#@+oXXXXoo@@#$$%&%%$##+ooXXXoo+@#$$%&%$#@++XoXXXoX+@#$$%&%%$#@+oXXXXoo+@@$$%&%$#@++XoXXXoX+@#$$%&&&&%$$@OO. .@#$%%%&&%%%$#@@ooXXXooXXoO+&$#+OXXX+++@+XoooO#$&$#+OXXo++@++oXooO#$&#+OoXoO++++XXooO#$$&$#+OXoXO++++XXooO##&$#+OXoXOO+++OoXXoO+&%$#+OOX.oXoXo+++#$%&$#+OoXXoo+@+ooXXoO+&",
-"%$@+XXXOOOOO..oXo@#&$#OOoXXOOoXXXo+@#$$&%$#@@+ooXXXoX+@##$%&%$#@@+XoXXXXX+@@#$%&%$#@++XoXXXXo++@#$%&%$#@++XoXXXXX++@#$%&%$#@+OoXXXXXo++@#$%&%&%%$##Oo...@@#$%%%&&%$#@@+ooXXXXXXXXO+&$#+OoXXO+@+@XXooo@#&$#+OoXXO+@@+XXooo@#&#+OXXXO++++XXooo@$$&$#+OXXX++@++oXooo@$&$#+OXXXoo@@+oOXXXO+&%$#+OoXXoXXXXO++@#$&$#+OXXXoo+@+ooXXXOO&",
-"%$#@oXX....  . ..+#&$#+O.....XoX..XoO#$&$$#XXX..ooX..XXo@$$&$$#XXX..ooo..XXo#$$&$$@oXX..Xoo..XXo##$&$$@oXX..ooo..XXo@$$&$$@oXX..oXo..XXX##%&%%$$#@@++OO++@###%%&%$$#oXX..ooo..XXX+@&$#+O...O+@@+oXXXX@#&$#+O...OO@@@oXXXX@#&#+O...OO@+@XXXXX@#$&$#+O...OO@@+XXXXX@#&$$++...oo+++oo. .++&%$#+OO  XXXXX.  ++#&$$++...oo+++oo ..O@&",
-"$$#@ooo. . .. ...+@&$#+O.. ..XoX..ooo@$&$#@XXX..Xoo..XXX@#$&$#@XXX..oXo..XXX@#$&$#@XXX..XXX..XXX@#$&$#@XXX..oXo..XXX@#$&$#@XXX..XoX..XXX@#$&%$$#@@+++OO+++@@#$$&%$#@XXX..oXo. XXX@@&$#+O...OO@@@XXXXX@#&$#+O...OO@@@XXXXX@#&#+O...OO@@+oXXXX@#$&$#+O. .OO@@@oXXXX@#&%$#@ooXXX+++XXooo@#&%$$+OO..OO+++XXXXo@&%$#@ooXXX++OXXooo@#&",
-"%$@@ooX. . . . ..+@&$#+O.....XoX..Xoo@#&$#@XXX .ooo. XXX@#$&$#@XXX..ooo..XXX@#$&$@@XXX..ooo. XXX@#$&$#@XXX .ooo..XXX@#$&$@@XXX..ooX..XXX@#$&%$##+++OO+OO++++@#$&%$@@XXX .XoX..XXX+#&$#++...O+@@@oXXXX@#&$#+O...O+@@+oXXXX@#&#++...O+@@@oXXXX@#$&$#+O...OO@@@XXXXX@#&%$##oooXXOO+XXXoO@#&%$#+OO..++@++XXXoo@&%$$@OooXXO++XXXoO@#&",
-"$$@+. .oo++++O. .+@&$$#+XXXoo+++OoXXX@#&#@+...OO+++OO...+@$&#@+...OO+++OO ..+@$&$@+. .O+++++O...+@#&#@+...OO+++OO ..+@#&$@+. .OO+++OO ..+@#&$$OO .. . . ... .@#&$$@+. .OOooo.X ..+@&$$@+XXXOO@@@OoXXX@#&$$#+XXXOO@@@+oXXX@#&$@+XXXOO@@@OoXXX+#$&$$#+XXXO+@@@+oXXX+#&&%%$#++..OOO .+@#$%&%$#@OoXX+++++OoOXo@&&&%$#@+..OoO..++#$%&",
-"%$@+...oO++++O...+@&%$@+XX.oo+++OOXXX@#&#@+. .++@@@+O. .+@#&$@+. .O+@@@+O.. +@#&#@+...O+@@++O. .+@$&$@+. .++@@@+O...+@$&$@+.. ++@@@++...+@$&$$OO. . .   . . .@#&%#@+...OOoooXX ..+@&%$#+XXXOO@@@+OXXX+#&%$@@XXXO+@@@OOXXX+#&$#+XXXO+@@@+OXXX@#$&%$@@XXXOO@@@OOXXX@#&&%%$$#+XX. .XX@@$$%&%$#+OO  oOoOO. .O+#&&&%$$@@XX...XX@#$$%&",
-"$#@+...++@@@++...+@&$$#+XXXoO@@@OoXXX@#&#@+...++@@@++...+@$&#@+...+@@@@++...+@$&#@+ ..++@@@@+...+@$&#@+...++@@@@+ ..+@$&#++...++@@@++ ..+@$&%$#@@@+++++++++@@$$&$$++. .OoXXXOO...+@&$$#+XXXO+@@@OoXXX@#&$$#+XXXO+@@@+OXXX@@&$#+XXXO+@@@+oXXX@@$&$$#+XXXO+@@@+OXXX+#&&&&%$#@oX...Xo@#$%&&%$#+OO..oooOO. .O+#&&&&%$#@oX. .Xo@#$%&&",
-"$$@+...++@@@++. .+@&%$#+XXXOO@@@OOXXX+#&#@+...++@@@@+...+@#&#@+...++@@@@+...+@#&#@+...+@@@@++...+@#&#@+...++@@@++...+@#&$@+...+@@#@++...++$&%$$##@@++++++@###$%&$$@+...ooXXXOO...++&%$#@XXXoO@@@OOXXX+@&%$#+XXXoO@@@OOXXX+#&$#@XXXO+@@@+OXXX+#$&%$#+XXXO+@@@OOXXX+#&&&%%$#@OO  .O+@$$%&&%$$+OO.. .. .XXX+@#&&&%%$#@OO. .O+@#$%%&",
-"$#@+. .+++@@++...+@&$##+XXXOO+@@OoXXX@@&$@+...++@@@++...+@$&#@+...++@@+++...+@$&$@+...++@@@++...+@$&#@+ ..++@@@++...+@$&#@+...++@@@++...+@$&&%%$$#@@++++@@#$$$%&$#@+...OoX.X++ ..+@&%$#+XXXOO+++OoXXX@@&%$#@XXXOO@+@OoXXX@@&$#+XXXOO+@+OoXXX@@#&%$#@XXXOO+@++oXXX@@&&%%%$#@OO. .++#$%&&&%$#+OO. . . .ooo@#$&&%%%$#@OO . ++#$%&&&",
-"%$@+...oo+++oX...+@&%#@+XXXoO+@+OOXXX+@&#@+...ooO++XX. .+##&$@+...oo+++oX...+#$&#@+.. ooO++oX. .+##&$@+...oo+++oX. .+#$&$@+.. oo+++oX...@@$&&%&%$$#Oo. .@#$$%&%&%$@+. .. OOOXX...+#&%$#@XXXoo+++oXXXX+@&%$#@XXXXo+O+oXXXX+@&$#@XXXXo+++oXXXX+##&%$#@XXXXo++OoXXXX+@&&&%$#@@oXXXX+@$$%%&&$$#+OoXXO+++++@##$%&&&%$#@@ooXXX@@$%%%&&",
-"$$#@...XXOOOoX...+#&$#@+XXXOO+++OO.XX+@&$#+. .XoO+Ooo...@#$&$#+...XXOOOoX...@#$&$#+...XoO+OXo...@#$&$#+...XXOOOXo...@#$&$#+...XX+++oX...@#$&&&%%%$#Oo. .@#$%&%&&$#@+.....OOOoX...@#&%%##XXXXoOOOXo.XX+@&%$$@XXXoX+OOXo.XX+@&$$#XXXoXOOOXo.XX+@#&%$$@XXXoXOO+Xo.XX+@&%%$$#@+ooXXX@@$%&&&&$#@+OoXXO+++@##$$%%&%%$$#@+oXXXX+##%%&&&",
-"%$#@Ooo.. . . oOO@#&$#oX   . ++O. . .oO&$#@OOo.. . . oOO@$$&$#@Ooo... . .ooO@#%&$#@Ooo.. . . oOO@$$&$##Ooo... .. oOO@#$&$#@OOo..   ..ooO@$$&&&&%%$#@+ooO@#$%&&&&%$@+XXX ... ..oOO@#&%%$#++O........ .oO&&%$#++O........ .oO&%$#@+O........  oO#&&%$#@+O... .... .oO&&%$#ooX  ...+#$%%&&&$#@XXX .Xoo@##$$%%&&&%$#ooX. ...+#$%&&&&",
-"&$$#+OO.. . ..oO+#$&$#OX. . .OOO. .  oo&%$#OOO . . ..oOO#$%&%$#+OO.. . ..OO+#$$&%$#+OO .. ...OOO#$%&$$#+OO.. . ..oO+#$%&%$#OOO.. . . OO+#$%&&&&&%$$@+OOO#$%&%&&&$$#+XXX.  . . Oo+#$&&%$$@++..   ...  oo&%%$$@++.. . ..   oo&%$##++. .  .. . oo#&%%$$@@+.... ..   oo&%$$@ooX.. ..@#$%%&&&$#+XXX .Xoo@#$%%&%&&%$$@ooX ....@#$$&&&&",
-"&%$#+OO... ...OO+#$&$#oo..  .+++. . .oO&%$$+OO.... ..O++#$%&%$#++O... ...OO+$$%&%$#++O.. . ..O++#$%&%$#+OO.. ....OO+#$%&%$$+OO.. . ..OO+#$%&&&&&%%$#@OO+#$$&&&&&%##+XXX ... ..O++#$&&%%$#@+....... . oO&&%%$#@+.. . ... .oO&&%$##+.... ... .oO#&&&%$#@@.. . ... .oO&&$$@ooX ....@#$%&&&&$#@XXX..Xoo#$$%&&&&&&$$@ooX. ...@#$%&&&&",
-"%%%$$#@@@@+@@@@#$$%&$##@@+@@@@@@@@+@@@#&%%$$#@@+@+@@@@#$$%%&%%$##@@@@@+@@@##$%%&%%$##@@@@+@@@@#$$%%&%%$$#@@@@@+@@@#$$%&&%%$$#@@@@+@@@@#$$%%&&&&&&%$$#$##$%%&&&&&$$++XXX+++@+@@@#$$%&&&%%$$#@@+@++@+@@@#&&&%%$$#@@@+@+@+@@@#&&%%$$#@@+@@+++@@@#$&&&%%$##@@@+@@++@@@#&%%$#oooooooO@#$%%&&&$#@OoXoooOO#$%%&&&&&%%$#oooooooO@$$%&&&&",
-"&&%%$$#####@###$$$%&%$$###@###########$&%%%$$####@####$$$&&&&%%$$###@#####$$%%&&&%%$$####@#@##$$$%&&%%%$$###@#####$$$%&&%%%$$####@####$$$&%&&&&&&&%%$$$%$&%&&&&&%$++ooo@@@#@###$$$&&&&%%%$$#######@###$&&&%%$$$######@####$&&&%%$$###@####@##$$&&&&%%$$###@#@##@##$&&$$#OOooOoO+#$%&&&&&%$#OOoooOOO#$%%&&&&&&$$#OOoooOOO#$%%&&&&",
-"&&&%%%$$$$$$$$$%%%&&&%$$$$$$$%$$$#$$$$%&&&%%%$$$$$$$$$%%&%&&&&%%%$$$$#$$$$%%%&&&&&%%%$$$$$$$$$%%%&&&&&%%%$$$$#$$$$%%%&&&&&%%%$$$$$$$$$%%&%&&&&&&&&&%%%%%&%&&&&&&%$$#######$$$$$%%&%&&&&&%$%$$$#$#$$$$$%&&&&&&%$$$#$#$$#$$$%&&&&%%%$$$$$$#$$$$%%&&&&&%%$$$$$$$$$$$$%&&%%$##@@#@##$$%&&&&&%$$#@#@@###$$&%&&&&&&%%$##@#@###$$%&&&&&",
-"&&&&%&%%$%$%%%%%&&&&&&%%%$%%%%%%%%$%%%%&&&&%&%%%$%$%%%%%&&&&&&&%&%%%%%$%%%%&%&&&&&&%&%%%$%%%%%%&%&&&&&&%&%%%%%%%%%%&&&&&&&%%&%%$%$$%%%%%&&&&&&&&&&&&&&&%&&&&&&&&&%$$$#$$$$%$%%%%%&&&&&&&&%&%%%%%%$%%%%%&&&&&&&&%%%%%$%%$%%%&&&&&%&%%$%$%%$%%%%&&&&&&&&%%%$%$$$%%%%%&&&%$$$$$#$$$$%&&&&&&%%$$$$#$#$$%%%&&&&&&&&%$$$$#$#$$%%&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&&&%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%$$$$$$$$$$$$%%&&&&&&&&&&&&&%%&%&&&&&&&%&%%%%%%%%%%%&&&&&&&&&&&%%%%%%%&&&&&&&&&&&&&&&&&&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%&&&&%&&&&&&%%$$$%%%%%&&%&&%&&&&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&%%%&%&%%&%&%&&&&&&&&&&&&&&&&&&&&&&&&%%$#$#####$####$$%&&&&&&&&&&&%%%%%%%%&&&&&%%%$$$$$$$$%%%&&&&&&&&&%%%$$$%%&&&&&&&&&&&&&&&&&&%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&&%%&%&%%&%&%&&&$$$###$$%%%%%&%&&&&&&&&&&&&&&&&&&&&&&&&&",
-"&&&&&&&&&&&&&&&&&&&&&%$$#$$$%%%&&&&&&&&&&&&&&&&&&&&%&&&&&&&&%%%%%%%%%%%%%%%%%%%&&&&&&%&%%%&&&&&&&&&&&%$##@@@@@@@@@@@@#$&&&&&&&&&%&%%$$%%%%&&&%&%$$$#####$$$%%&&&&&&&&&%$$$##$$%%&&&&&&&&&&&&&%%%%%%%%%&&&&&&&%&%%%%%&%&&&&&&&&&&&&&&&%&&&&&&&&&&&%&%%%%%%&&%&&&&&&&&&&&%%%%$%%%%%%%%%&&&$#@@@@##$$$%$%%%%%&&&&&&&%&%&%&&&%&&&&&&",
-"&&&&&&&%&%%%&&&&&&&&%$$++@@#$%%&%&&&&&&&&&&&&&&&&%&&&&%&&&&&%%$$$$$$$#$#$$$$$$%&&&&&%%%%%%%&&&&&&&&&%$##...ooooooo...@#&&&&&&&&&%%$$#@#$$%&&&&%%$+++++++O+$$%%&&&&&&%%%$#OO+#$%%&&&&&&&&&&&&&%%$$$$$$%%&&&&&&&%%%%$%%%&&&&&&%&&%%&%&%&&&%%%%&%&&&%%%$%$%%%%%&%%&%&&&&&%%%$##$#$$$##$%%&&#oo...++##$##$$$$%%&&&&&%%%%%&%&%%%%%%&&",
-"&&&&&&&%%$%$%%%&&&&&$$#+O+++#$$%&&&&&%&&&&&%%%%%%%%%%&%&&&&&%$###@#@###@#@###$$&&&%&%$$$$$$%%&&&&&&&%$#@...XXoXoXX...+#&&&&%&%&%%$$#+@@#$$&&&&%$$++OOOO+OO#$$&&&&&%&%%$##Ooo##$%%&&&&&&&&&&%%%$######$$&&&&%%%%$$#$#$%%&%&&&&&%%%%%%%$%%%%%%%%%&%%$$#$##$$$$%%%%%%&&&&%%$##@#@###@##$%%&@oo...O+@@@@+###$$$&&%&%%$%$%%%%%$%$%%%&",
-"&&&&&%%%$$#$$%%%&&&&$#@OOO++@#$%%&&%%&%&&&%&%%$$$$$$$$%&%&&&$##@@@+@+++@+@+@@#$&&&&%$$###$$%%&&&&&&&%$#@...XXoXXXX...+@&&&%&%%%%$$#@++@##$%&&%%$#+OoooOOoo@$$%%&&&%%$$#@@ooo@##$$%%&&&&&&&&%%$#@@+@@##$&&&%%%$$#@#@##$%%&&&&%%%$$$$$$$#$#$#$$$%&%$##@@@#@###$#$$$$%&&%%$#@++@@@@@++#$$%&@oX...OO@+@+++@@@#$&&&%%$$#$$$%$$$#$$$%&",
-"&&&&&%%$#++@#$%%&&&&#@+.....+@#$%%&%%%%&&&%%$$##@####$$%%%&&$Oo. ..... .......#&&%%%$@+OOO#$%%&&&&&&%$@+...XXoooXo...+@&%%%%%%$$$@++ .+@#$%&&%%$#OOOXXoo..@#$%&&%%$$$##@+...+@##$$%&&&&&&&&%$## ....oO#&%%%%$$#+O...@#$$%&%&%$$##@@@@#@#@#@@#$$&$#@ooooo+++@@#@###$&&%$$#ooooo+OO..+##$&#oo...XooOo..oooOO@&%%%##@OO##$$#+++#$$&",
-"&&&&%%$##+++@$$%%&&&##+.. ..++#$%%%%$$$&&%%$$#@@@+@@@##%%%&&#+O .. . . . .....#&&&%$$+OooO#$%%&&&&&&$$@+. .XoXooXX . +@&%%$$$$$$#++O. ++@$$&&%$$#OOoXXoo..+#$%%&%$$#@@@++. .++@@##$&&&&&&&%%$#@.  ..oO#&%%$$##@+O...+@$$%%%&$$#@@@@+@+@+@+++@#$&$@@oXoXoOOO++@+@@##&%$$#@oXXXoOOO..+@#$&#Oo...Xoooo  oXooo+&&%$$@@oO@####+O+@#$&",
-"&&&&&%$@+..OO#$%&&&&$#@++. .oO#$$$$#@++&%%$#+OO.. .XX++#$%%&$@@+++++XXX++++@@#$&&&%$#@+ooo@#$%&&&&&&$#@@XXX.....XX  .+@&$$@@@@@@#++O..O+@$$&&%$#@+OoXXOO..+@#$$&%$@+ooXoX. .oXooo+@&&&&&&&%$$@+ooXXo+@#&$$@@+++oOooo@@@##$%&$#Oo. . .. ......@#&#Oo . ....... . ..#&%$#@+oooXoOOO..++@$&#@@OOO..OOOoo...Xo+&&%$#@+..+@@@+...O+#&",
-"&&&&%$$@+..OO##%%%&&%$#++...oO@$$$$#@O+&%$##OOo. . XXO+#$$%&$##@@++OXXX+++@@##$&&&%$$+Oooo##%%&&&&&&$#@+XXX. ...XX.  ++&$#+++++@+++O..O++#$&$$##@OOoXX+O..+@##$&$#+OoXXXo . XoXoo++&&&&&&%%$#@+oXoXo+@$&$#++++OooXXX+++@##$&$#Oo  . . .   ...@#&#oo.  .......  ...@&$$#+OoooXXO+O .O++#&$#@+OO..OOOoX...Xo+&&%$#@+..+++@@...OO#&",
-"&&&&&%$@+ .oO@#$%&&&%$#@+ . oo@####@+OO&$$@@OOo  ..XXoO@#$%&$#@@@+++X.X++@###$$&&&%$#@+Xoo@#%%%&&&&&#@++X.X... .XX . ++&$#+OOOO+++OO. OO+#$&$##@+OOOXXOO..++@@#&$#+OXXXoX. .XoXoX++&&&&&&%$$@@+oXoXo@@$&$#+OOOOoooXo++++@@#&$@oo.  . .... . .@#&#Oo . .. . .. . ..#&$#@+OoooXoOOO..O++@&$#@OOO .OOOoo. .Xo@&&%$#@+..+++++...oO#&",
-"&&&&%%$#@oo..@#$%%&&%%$#+XXXOO@###@..O+&$#+O...+XXXXoXXO+#$&#+O++++OXXXOO@@@##$&%&&$$++ooo@#$%&&&&&&@@... .XXXooXX...oo&##..... . . ..XXX@#&@++oXXXX..oX .XooOO&##oo...Xo ..XXXXXoO&&&&&%%$#ooX... .+@$&#@... ... . .....+@&$#++...+++++OO...+@&$#@++O..XXX..++@@##&#@+... ......  ...+&$#@ooo. O++++...O+@&&%%$#@..oOoOoXXX..@&",
-"&&&&%%$##Oo..@#$$%&&%%$#@XXXOO@@#@@..O+&$@OO...+XX.ooXXOO@$&#OOOO++OXXXOO+@@@@#&&&%$$++Xoo@$$%&&&&&&@+.... XXoXXX.. .oo&$#.. .  . ....XXX@#&@+OoXX.X .Xo. oXooO&##oo. .XX.. oXXXXXO&&&&&%$$@oXX.. ..+@$&#@.. .  .   . ...O+&$#@+...+++++OO...+@&$$#@++..XXX..++@##$&@@+... ...... ....O&$#@ooX..+++++...++#&&%%$#+..oOOoOXXX..#&",
-"&&&&%%$##++..+#%%%&&&%$#@ooo..+@@+O..+@&#@..ooo+OOoXXO+..@#&#OoooXoX  .XXooooO+&&%&$#@+ooo@#$%%&&&&&#@ooXooXoooo..XXXOO&$#@@++O..OOOOOXXX+@&+OOXoXXX..Xo..XoooO&$@oo...++...O+XoooO&&&&&%%##oXXXXooo+@$&#@oXooo+O...oooO+@#&$#++...+@#@@+o. .@@&%$$##@++XXXoO@@#$$$&$##++oooXXOOO. OO+#&#@+... .+@@@@oXooO#&&&%$#@Oo...XXoOO@@#&",
-"&%%%%$$#@+O..+#$%&&&&%%$#Ooo..+@@OO..@#&#@..ooo+OOOXXOO..@#&@OoooXoX.. XXooooo+&&%&$$++Xoo@#$&&&&&&&$@OooXooXoXo..XXXOO&%$#@+++ .OOOOOXXX+@&++OoXXXX..Xo. ooooO&$@Oo.. O+ ..O+ooooO&&&&&%$$@ooXXXooO+@#&#@Xoooo+O. .ooOO+#$&%$@+...+@##@OO...+#&&%%$$#@+XXXoo@#$$%&&%$#@+ooXooO+O..OO+#&#++.... +@@@@ooXOO@&&%%%$@OO...X.OOO##$&",
-"&&%$$###@++ .+@$$%%&&&$$#Ooo..++++O..##&#@..oOO++OoXXOO..+@&#OoooooX. .XXooooo+&&&%$$++oXo@#$%%&&&&&$#OoooXoXooX..XXXO+&%%$$@++..OOOOOXXX+@&@+OooXXX..Xo..oooO+&$@oo...+O. .+Oooooo&&&&&&$$#oXX.Xooo+@#&#@oXoooO+. .oOO+@#$&$#@+...@@###+O. .@@&&%%%$$#+XXXoO@#$%&%&%$$#@oooXXOOO .O++#&#+O.....+@@#+ooooO#&&&%$##Oo...XXO++#$%&",
-"%%$$@@+oo@+XXO+#$%%&&&%$$#@+..oOO+@@@#$&@@. oOO@@++..OOXXO+&$##@@+++XXX+++@@###&&&%$$@+...@#$%%&&&&&$#@+... .  .  XXo+@&%%%$$@@XXoXo+++++oO&$##@@OOoXXOO. +++@#&$@Oo . Xo. .XXXXXoO&&%&%&%$#@++..XXXXo@&$@ooXXXO+XXXoo@@#$%&$#@+...+@##@+O...+@&&&&%%$#@oXooO@#$%&&&&%$#@oooXoOO+. ++@$&#OooXX..++@@@Ooooo@&&&%%##++ . XX+@@$$%&",
-"%$$@@++XX++XXo+#$%%&&&&%$$@@..ooO@@@$$%&#+..ooo@@++..OOXXO+&%$$###@+XXX+@@####$&&&%%#@+...+#$%&&&&&&$##+.. . .. ..XXX@#&&&%%$#@oXXoX++++@OO&$$##@OOoXXOO..++@#$&$@Oo...XX . XXXXXoo&%&%%%$$#@++..XXXXo@&$#OoXXX+O.XXoO+#$$%&$$++...@@##@+O. .+@&&&&&%$$#ooXoO@#$%&&&%%$$#oooXoOOO. +@@$&#Ooooo..+++@+OooXo@&&%$$#@++ ..XX+@#$%%&",
-"%$@@...OO@+oOXo@#$$&&&%%%$#@+O...+@#$$%&#@XXXoo@@@+XXooXXoO&%%%$$#@+XXX+@#$$$$%&&&%%$@@...+@$$%&&&&&%$#+XXXoO+O+OOXoo@#&&&%%%$#++.. ++@####&%%$$#+OOXXO+..OO+##&$#+OXXX++. .O+ooo++&%%%$$$$#@++XX...XX#&$#++. .oOoXXXX+##$%&$$@+...+@@#@OO...+#&&&&&&%$#++OXX@#$$%&&&%$#@OoooXOOO..O+@$&$##@++oXoOO@+OoOoo@&%$$#@+XX. ...++@$$%&",
-"$#@+...OO++OOXo+@#$&&&&&%$$#+O...+@@$%%&#@XXoXo+@@@oXoXXXOO&&&%%$##+XXX+@#$$%%%&&&&$$#+...+@#$%%&&&&%$#@XXXOoO+OOOXXo@$&&&&&$$#@+...O+@##$$&&%$$#+OoXX++..OOO#$&$#+OXXX+O...++OOO+@&%$$$###@@+OXX...XX@&$#@O...OOXoXXX+@#$$&$#++...++@@@OO. .+@&&&&&%%$$@+OXX+@#$%%&&&$$#ooXoo+OO .++#$&$$###+ooOoO++ooooo#&%##@++XX.. ..++@#$%&",
-"$#++...oO++ooXX+@##&&&&&&%$#@+...+@@#$%&##XXXoX@@++XXooXXOO&&&&%%$#@XXX++##%%&%&&&&%$#@. .+@#$$%%&&&%$#@XXXoOO++O+ooO#$&&&&&%%$@+. .O+@#$$%&&&%$#+OOXXO+..oOO@#&$$@+XXX++  .++O+++#&$##@@@+@+++X....XX@&%#@+...OOXoXXX+@@#$&%$@+...+++++Oo...@@&&&&&%&$$@@+XX+@#$$%&&%$$@OooXoOOO..++@$&%%$$#@ooooo++ooooO#&$#@++OXX .. .O+@##$&",
-"#@XX    .XXXX..oo+@&&&&&&&$$#@oXoXX+##$&$#@+...X+@++O....+#&&&&&%$#+XXXoo@##%%&&&&%%$#@XXXoo@#$$%%&&%$#@oXX..XoXO+@@##$&&&&&%%$#@+OOoX@#$$%&&%%$$++oXX+@OO...+@&%$$#@@+++...+@@##$$&$OOooo... .XXXXX++@&%$#@XXX .oOoooXoo@#&$#@+. .XXXXXXX. .+@&&&&&&&%$$@@ooooO#$%&&&$$@OoXXXooo .++#$&%%%$$#+OXXXXX...+@#&#Oo.  ..+++oo...@##&",
-"#@XX. ...XXXX..XoO+&&&&&&&%$$#OooXX++##&$$@@...X+++OO....@#&&&&%%$#@XXXXo+##%%&&&&%%$$@oXXXo+@#$%%&&&%$#ooo..Xoo++##$$%&&&&&%%%$#++OXo+@#$$&&%%$$++OXX+@OO...+@&%%$$$##@+...+@#$$$%&#Ooooo.... XXXXXO+#&%$#@oXX  OOOooXXo@@&%$@+...XoXXXXX...+@&&&&&&&&%$#@oXooo@#$&&%%$@OooXXooo. ++#$&&%&%$$@+XXXXX...+@$&#Oo . ..+++Oo...+@#&",
-"#@..oooO+ooooXX..++&&&&&&&%%$##@+Oo..+@&%$##@@+o...+++O@@#$&&&&&%$#@XXXXX@@#%%%&&&&&%$#@@+..oO+#$%%&%%$#@+O. XXX@@#$$%%&&&&&&&%%$##@OOOO+#%&&&%%$@++oo@@#+OOOXX&&%%$$$#@+ ..+##$%%%&$+OoXXoXOOO++OOOoo#&%%$#@++Oo+@@@@ooooo&%$@@ooo++@+@+OXXX@#&&&&&&&%%%$#@+XooO+$&&&$$#OOoXXXoX..++#$&&&%%%$#@+OOooO++##$&#+OOoO+@@#@@@+OO..+&",
-"$@..OOO++ooXoXo .+@&&&&&&&%%%$$#@OO..++&&%$$#@@o...+@++##$$&&&&&%$##ooXXX@##%&%&&&&%%%$#@@..ooO#$%&&%%%$@@+..XXX@#$%%&&&&&&&&&%%%$##OOOO+$$&&&%%$#++OO###@OOOXo&&&&&%$$#@...@#$$%&%&#@+ooooo+++@@+++oo#&&%$$@@+OO@#@@@Ooooo&%$#@OOO@@#@@@+XXX@#&&&&&&&&%%$$@@oXoO+$&&&%$#+OoXXXoX..+@#$&&&&%%%$#++OooO+@#$%&$++OOO@##$$##+++..@&",
-"##..OO+@@OOoooo..+@&&&&&&&&&%%$$#+O..++&%&%$$##O...@#@@$$%%&&&&&&%$#oooXo@#$%%&&&&&&&%$$#@..oO+#$%%&&%%$#@+..XXo#$$%&&&&&&&&&&&&%%$#@+O++$%&&&&%$##@OO#$$$++Ooo&&&&%&%$#@...@#$%&&&&$@+Ooooo++@##@@+OO#&&%%$$#@++##$$#+OOOO&%%#@+OO##$$#@@ooo#$&&&&&&&&&%%$#@Ooo++$&&%&$$++OXXooo..+@#$&&&&&&%$$@++OO@@@$%%&$@@+++##$$$$$@@+..@&",
-"$##@######@#@@@@@##&&&&&&&&&%%%$$##@@++&&&&%%$$#@#@##$$$%%&&&&&&%%$$##@#@#$$%&&&&&&&&&%$$##@O++#$%&&&%%%$$#@@@@##$%%&&&&&&&&&&&%&%%$$####$%&&&&%%$$$#$$$$$#####&&&&&&%%$#++@#$%%&&&&$$###@###$#$$$###$$&&&&%%$$$$$$$$$#####&%%%$##$$$$$$$##@##$&&&&&&&&&%%%$#####$$&&&&%$$##@+@++OO@#$%&&&&&&%%$$$####$$$%%&%$$#$$$%%%%%$$###@#&",
-"$$$$#$$$$$$#$####$$&&&&&&&&&&&%%$$###+@&&&&&%%$$##$$$%%%%&&&&&&&&%%$$$##$$%%&&&&&&&&&&&%$$##++@$%%%&&&&%%$$####$$%%&&&&&&&&&&&&&&&%%$$$$$%%&&&&&%%%$$$%%%%$$#$$&&&&&%&%$$#@@#$%&&&&&%$$$#$#$$$%$$%$$$$%&&&&%%%$$$%%%%$$$#$$&&%%%%$$$%%&%$$$$$$%&&&&&&&&&&&%%$$$$$$%&&&%%%$$######O+#$%%&&&&&&&&%$$$$$$$%%&&&%$$$$$%%%&&%%%$$$$$&",
-"%%$$$%%%%$%$$$%$$$%&&&&&&&&&&&&&%%$$$$$&&&&&%&%$$$%%%%%&&&&&&&&&&&%%$$%$%%%%&&&&&&&&&&&&%%$$$#$$%&%&&&&%%%%$$$$$%%&&&&&&&&&&&&&&&&&%&%%%%&&&&&&&&%%%&%%&&%&%%%$&&&&&&%%%$$$$%%%%&&&&&%%%%$$%%%&&%&%%%%%&&&&&%&&&%&&%&%%%%%%&&&%%%%&%&%&&%%$%%%%&&&&&&&&&&&%&%$$%%%%&&&&%%%%$$$$#$#$$$%%&&&&&&&&&%%%$%%%&&&&&&&%&%%&&&&&&%%%$$%%&"
-};
+static char * matrix1_xpm[] = {
+"320 377 12 1",
+"      c None",
+".     c #000000",
+"+     c #030E03",
+"@     c #081E08",
+"#     c #0B2A0B",
+"$     c #165016",
+"%     c #1B641B",
+"&     c #217A21",
+"*     c #5AD25A",
+"=     c #279027",
+"-     c #81DD81",
+";     c #2BA02B",
+"..........................+.++++++............+.+.+.+.+..........++++@@@@@++++........++@@@@@++..........+.++++.....................................+.++..............+++@@@@@+++........++@@@@@++.............++++++..................................................................................................++@@@+++.",
+"..........................++++@@++++.........++++++++++.+........++@@#@###@@++.......++@@###@@+++........++++++++..................................++++++++...........++@##$##@++.....+.++@#####@+++...........+++@++++..............................................................................................++@@@#@@++.",
+"........................+.+@@###@@++......++++@@@@@@@@@+++.....+.@@#$%%%%%$##++....+.+@##&&%##@+++.....+++@@@@@+++..............+.+................++@@@@+++..........+@##**%$$@++......+@$$%**##@++.........+++@@#@@+++..............................................................................................+@#%&%#@+.",
+".........................+@###$$#@@++......++@@#@#@#@#@@+++.....++#$%%%&&&$$#@+....++@##$&==$$#@+++...+++@#####@@+...........+.+++++++.+........+.+@@####@++........++@@#$**%%$@++.....++@$%&**$#@@+........+.@@##$##@@+............++++.+..........................................................................++@#$&&&$@@.",
+".......................++@@$%**-%$@@+....+++@#$&&$$$&&$#@++....++@#&&=;=;;&%$@+..+.+@@$&=***&%$##++...++@#%&=&&#@@+..........+++@@@@@@++........+.+@#&&&$$@++.......++@#$%**%%$@+......++@$%%**%$#@++.....+.++@#$***$#@+++........++++@@++..........................................................................++@$$***$#@.",
+"........................+@#%&-**%%#@++....+@#$%&=%%%=&%$#@+....+@@#&=;=;;;&%%#@...+@##$==*--=&%$#@+.+++@##&===&$@@++........++@@#####@@++........+@#$&==%$@++......++@#%&&;=%#@@++......++@$$;;&&%#@++....++@@#$$***%##@@++.......++@#@@@+++........................................................................+@#$%***$#@.",
+"........................+@#%%*-*&%#@++..+++@$$%==%%%==%$#@@..+.+@#$===;;;;=%%#@.++@@#$%==-**==%$#@+..+@@#$===;=$#@++......+++@##$$$$$#@@++.....+++@#$===%$#@++......@@#%&=;=$#@+.+......+@@#$=;&&%#@++....+@@##$%***%$$#@@+......++@##$##@++........................................................................+@#$%***$#@.",
+"........................@@#&=---=&#@++...+@@%%&*-=&&--&%%@+...+@@#$==;=;;;&&%#@..+@#&==;;;;;-*&%$@@.++@$%%====&&%#@++....+.+@#$==-*-=&#@+.......+@#%&*-*%%@++.......@@$=====$#@++........+@#$&=;==$@@++.+++@%%&%&*-*&%&%$@+....+.+@@$***$@@+.......................................................................+@@#&===&$@+.",
+".......................++@$==*-*==$@++...+@@%%&-*&&&*-&%$@@..++@#$$==;=;;;=&%$@.+@#$&=;;;;;;-*&%$@@.++@$%&=====&%#@++....++@@#$=;--*;=#@@+......+@#%%*-*&%@@+.....++@#$==;=&$@@+.........+@@$&==;=$#@....+@@%%&&&***&%&&%#@......+@#$***$#@++......................................................................+@#$==;==##+.",
+"........................@##&&-*-=&##++...+@#%&&**&&&-*%%$@+..+@@%%=;;*****;;=$#.+@@$;;;&=%%%==%%$@+.+@@$%&======&$@@++....+@$%&;;%%%=&$@++.....+@@#=;==&$#@++.......@#$=;==&#@+...........@@#&====$#@++.++@#%&=**---**&&%#@.....+@@#%***$$@++...........................+.+.++.++.+.+.............................++@#$**%%$#@+.",
+".......................++@$&=-*-&&$@@....++@%%&**&&&*-%$$@+..+@#%&=;;*-***;;;$#.+@#$;;;=&&%&&=%%$@+.++@$%&=======$#@++...++@$%&;;&%%&&#@@+......@@$==&&%$@@+......++@#$***%$#@++..........+@#$%***$#@++..+@@%&&****-**=&%@@...+++@#$%*-*%$#@+++........................+++++++++++++++............................+@#$$**&%$@@+.",
+"........................@@#&&--*=&$@++..++@@%%&**&%&**%$#@+..+@#%&=;;**-**;;=$#.+@@$;;;&=%&%=&%$$@@.+@@$%%=======$#@@++..++#$%&;;%%%&%#@+++....++@#&=&%%#@+.+......+@#%***%$@@+..........+.@#$$-**%#@+...+@@%%=***-***&&%@@..+++@@#$%***%$##@@+......................+++@@#@@#@#@#@@@++.........................+++@#$%**%$#@+..",
+".......................++@$&=*--=&##++...+@@$%%&%%%%&&$#@++..+@#%&=--;;;-*;;=$#.+@@$==;**;=;&&%$#@+..+@@$$===;==&&%$@++..++@$%&**%%%$$#@@++....++@#$%###@@+.......++@#%***$$@++............+@$$***$$@++..++@#$%&&-*-&&%$#@+..+@@#$$%%*-*%%$##@@......................+@@###$$#$#$#$##@@.........................++@#%&&;=$$@@+..",
+"........................@@#&=*-*=&#@+.....+@$$$%%#$$&%#@@+..+.@#%&=**;;;*-=;=$@.++@#&==**=;=&&%$##@..++@#$===;===&%$@++.+.@@$%%**%%%$$$#@@+.....++@$$#@@++.........@@#$*-*%$@@............++##%*-*%#@+....@@#$%&&*-*&&%$#@+.+@@#$$%%%*-*%%%%$#@.....................+@@#$$$%$%$%$%$$$#@.........................++##&&&;=$#@+...",
+"........................+@#$%***%$#@++....++@@@#@#@@#@@@++..++@#$%%**&=&**%%$#@.++@#$$%==;;;**==%#@..+@@#$==;;;==%$#@++.+++@$%%-*;;;%%%%%@@......+++@@+++..........+##%***$#@@............++@$$***%##++...+@#$%*-&&&**%%$@+.+@#$--*---*--*-*-$#.....................+@#$--*-*--*-*--*$#.........................+@#$;;;&&#@@++..",
+"........................+@##%*-*%$#@+......++@@@@@@@@@++.....+@#$%&**&&&-*%%$#@..+@@#$%&&;;;**==&#@.+.@@#$=;;*;==%$#@++..+@#$%&--;;;&%&&%@@.....+.+++++..+........++##$***%##++...........+@@#%***%#@+...++@#$%**&&&-*%$$@+.+@$$*--*-*--*---*%#.........++++++......+@$$*--*--*---*--%#..........+.+.+.........+@#$&;;;$$@+++...",
+".........................+@$$***$#@++........+..+.+.+++..+..+@@#$%%*-&&&**%%$#@..+@@#$%&&;;;**===$#.+.@@#$==;;;;=%$$#@...+@#$%&**;*;&&=&%#@...........+...........++@$$*-*%##@+...........+@#$%***%#@@....+@#$%**&&%**%%#@+.+@#$-*---*-*-**--$#.......+++@@@@+++....+@#$-*--*--**--*-$#.........++++++.......+.@@#%&;;;$#@+.....",
+"........................+@@#$***%#@+...........+.+.+........+@#$*---*-*---;;=#@.++@#%&=%&%&%==;;;$#..+@$%&&&*;;;;==&#@+.++@#&&=;;***-*===#@........+..............++@#$***%$@@++.........+.@##%-**$#@++..++@#$$&&$$%&&$$#@+.+@@#$%$%%**-%%%$$#@.......++@@#@@@+++....@@#$$$$%$$%%$%$$#@.......++++@@@+++......+@#$=;=&&$#@++....",
+".........................+@#$***$#@++.......................+@#%-*-*--*-*-;;=#@.++@#&&&&&%&%&=;;;##.+++$$%&&;;;;;==&##+.+@#$&====***--;==##.......................++@#$=;;&&#@++.........++@#&&;;=%#@++...++#$$%%###%%##@++..+@@##$%%-**%%$$##@.....+++@#%&&$#@+.....+@@##$#$$#$#####@@.......++@@#@@@++......+@#$=;&&&#@++.....",
+".........................++##$%$#@@+........................+@##&&=;;;;;==%$##@.+@#$=;;**=;;**;==$@..++@#$$%;;;&&==&$@+.++#$;;;=====**&%%#@........................+@#$==;=&##++..........@@#&&;;=$#@+.....+@@@@@##@#@@@@+...++@@##$%*-*%$##@++......+@##&&&%$@@.+...++@@@@@@#@@###@@@+......++@$$&&%#@++...++@@#$=;&&%#@+......",
+".........................++@#$$$#@@..........................+@#&&&;;;=;==%$#@+.+@##;;;*-=;;**==&#@..+++@##$==;%&===##+.+@#$;;;=&&&=*-&%%$@.......................+++#$&=&==$#@++.......++@#$=;&=%$@++......++@@@+++@@+++......++@#$$***%$#@++......+@@#$===%$@@+......++@+@+@+@+++++.+......+@@$%&&&#@@+...++@$$&**$$#@+++.....",
+"..........................@@#$$$#@++........................+@@#%&&*;=;;==$#@++..+@#&&===*-*==%$#@@....+@@$$=;=%&==&$@+.+@@$;;;&=&=&-*&&%$@.........................+@#%&=;;$#@++.....+.++@#$=;=&%#@++.....+.+.++++.+++.........+@@$$-**$#@++.......+@#%%***&%@@+.........+.+.+...++.........+@#$%==&$#++...+@#$%%**$$@@+.......",
+".........................++##***##++.........................+@#%&&;;;;;&&$#@++.++@#%%&&=*--=&$##@+.....+@##;;;;;==&##+.+@@$&;=-*--*;;*-*$#........................++@#%&&;=%$#+++......+@#$%=;&&%#@++............+...+..+.......+@#$***$#@++......++@#%&--*%%@+++...........................+@#&&**-##@++..+@@&&===$#@++.......",
+"..........................+@#***#@++........................++@#$&&;;;;;&&$@@+....+@@@@#$***%#@++.+.....++@#==;====&#@+..+@#&==--*--;=*--$#..........................+@#$%**%%$@+......++@#%&**%$#@+.............................+@@$***$#@+.......++@#===&&$#@++..........................+..@@%&-**$@++...+@#&====$#@+........",
+".........................++@##$#@@++.........................+@#$&&;;;=;=&#@++..+++.+@@#$===$#@++.......++@##$$$$###@++.++@@#$$$$%$$$%$$##@.........................++@@#$**%%$@++.....++@$%%**$$@@++............................++@##$##@++.+.....++##===&&##@+.............................++@#$$$##@++...+@#&===&#@++........",
+"..........................++@@@@@++.........................+.@@$%&;;;==&&#@+......+.+@##=&&$#@+.........++@@#@###@@+++...+@@@#####$#####@@...........................+@#$**%$$@+.......+@$$%**$#@++..............................+@@@#@@++........++@#==&%%#@++..............................+@@@###@@+....@@#%&&%$#@+.........",
+"...........................++@@@++............................+@$$%=;===&%#@++........+@#&&%#@+++.........+++@@@+@+@+......+@@@@#@@@#@@@@++..........................+++@##$##@+++......++@#####@++................................++@@+@+..........@@#$%$##@++................................++@@@+++.....+@#$%%$#@@++........",
+"............................+.+.+............................++@@###$$$###@++........+++@##@@@..............++.++++..........+++++@++@++++.............................+@@@@@@+++........++@@#@@++..................................+.++..+.........+@@$$#@@+++..............................+..+.++++......++#$$%##@+..........",
+"..............................+................................++@@#@##@@@@+...........++@@@+++..............+................+++.+..+..................................++@@+++.........++++++++++..................................................++@##@@++...............................................++@@@#@@++..........",
+".....++++++++++...........+++++++............++++++@++++........+.++++@++++++...........+++++++++.......+++++@@++++++..........+++++++++++....+++++@+@+@+@+++.........++++++++++.........+++++++++.+............................................................................................................+.+.+.+.........",
+"...+.++@@#@@@@++++.....++++@@@@@++++.......+++@@@@#@@@@+++......++@@@@@#@@+++..........+.+@@@@@+++....+++@@@#@#@#@@@+++.........+@@@@#@@+++.+++@@@@#@#@#@@@@+++.....+++@@@@@@@++++......+.+@@@@@@@++++...........................................................................................................+++++++++.+....",
+"...+++@@##$##@@@++....++@@@#####@@.+.......++@@##$$###@@+++..++++@@#$$$###@@@++........++@@###@@++..+.+@@##$$#$#$##@@+......+++@@@###$##@@+.++@##$#$$$#$$###@++...+++@@##$$###@@+++.....++@@##$##@@@++........................................................................................................++++@@@@@@@@++....",
+"..++@@#$%=&=%$#@@++..++@@#$%%&&&#@++.....++@@##&%===&%##@@+....@@##%&&==&&##@@+......++@@#%%%%%#@++..+@#$$&&=&==&&%%@@+.....++@@#$$==&&%$@+.+@@%%&==&=&==&%%#@+..+++@##$%&&=%$##@++...++@@#$&&&&%$#@@++......................................................+..............................+.+..............+.+@@###$###@@+++..",
+"..+@@#$%%===%%$#@@+..+@##$$&&==&$#+++....++@#$$&=====&$$#@+.+++@#$$&&===&&$$#@@.......+@#$%%&&%$@@+.++@#$%=======&&%#@+.....+@##$%%====&$#@.+@#&&&=======&&%#@+..++@#$$%&===%%$$#@@....+@#$$===&&%$##@+...................................................+.+++++.+......................++.+++++............++@@#$$%$%$$##@++..",
+"++@@$%&**;;;**%%$@+.+@@#=;;*-***$#@+....++@#%&=**;;;**=&&#@..+@#&&=**;;;**=&%#@......+@#$%-*-**$#@+.++@$%&**;;;;;=&&#@+...++@@$%*****;;=$#@.@@$=;;;;;;;;;;;;$#@.++@#%&=**;;;**=&%#@..++@#$**=;;;;;;;#@+..........+.....................+.................++++@+@+++.....................+.++@+@+++.+.........++#$%*******%$#@++.",
+".+@#%%&**;;;**&&%#@..+@$=;;-*--*%#@++...++@#=&=**;;;**==&#@..+@#&==*-;;;-*==&#@......+@#%%--***$#@+.+@#%%&*-;;;;;==%#@+...++@#%%--***;==$#@.@@$=;;;;;;;;;;;;##@.++@$&==**;;;**==&#@..++@#$**;;;;;;;;$#@........+.++++.+..............+.++++..........+.+++@@@###@@+....++++++++++++++...++@@###@@@+++........+@#$%*--*-**%%$@@+.",
+"+@@#%&&**;;;**&&%#@.+@@#==;--*-*$$@+....+@@$&==-*;;;*-===$@.++@#&==**;;;**===$#...+.+@@#%&*--**%#@+.+@@%&&**;;;;;=&&#@+...+@#$%&*--**;;=$#+.+@#=;;;;;;;;*;;;$@@.+@@$&==**;;;**==&$#.++@#$%**;;;;;;;;$#@......+++@@+@++............+.++@@+@+++.......+.++@@##$$#$#@@....+++@+@+@@+@++++..+@###$$$##@@++++....+@@#%%**-*-**%%%#@+.",
+"+@#$;;;=&%%%=&;;;$#..+@##$%%%***$$@@+....@@#;;;&&%%%&=;;;$#.++@#%==%%%%%==;;;##.....+@#$=;===**$#@@.+@#%&&;;&%%%&%%##@+.+.+@#$**===%%%$##@+.+@##$$$$%%%==;==$#+.+@#$;;;=&%%&==;;;$@.++@$%&;;%%%%&***%$@......++@@##@@@++..........+.+@@##@@+++......++@@##$%&***%$@..+++@@@#@#@#@#@@@@+.+@#***==$$##@@++.+...@@$%&;;%%%;;;;=$@@.",
+".@#$;;;&&%$%&=;;;$#..++@##$$%*-*%#@+.....@@#==;%%$$%&=;;;$#..+@@%%&%%$%%&=;;;$#...+++@#$=;;=;**%#@+.+@#$&=;;%&%&%%$$#@+..+@#$%**===%%%$$@@+.++@@####$$%==;==#@@.+@@$;;;==%%%&=;;;$#.+@@%%&;;%%%%%***%$#.....++@##$$##@++...........@@###$$#@++..+.++@@@#$$%&&***%%@.+.@@#$#$$$$$$$$##@+.+@#***;=%%$$#@@++...++#$%&;;%%%=;;;;$#@.",
+"+@#$;;;&&$$$%&;;;$#...++@@#$%***%##++....+@@#$#$$$$%==;;;$#..++@###$$$%%**;==$#....+@#$%**&&&**%#@+.++#%%&*-*-***=&%#@+.++@$%&**=====%$$@@+.+.++@@@##$%;;&&%#@@.+@#$=;===%%%==;==$#.+@@%%&;;%%$%%***%$@.....+@@%%***##+++........++@@%&***##@+..+.+@@#%%=;;;;&%%$@@.++@#&&=&&===&&=&&#@.+@@#$$==***&%##@@++.++@$$%&=%%%&&;;;$#@.",
+"+@#$;;;&%$$$%&;;;$#.....+@#$$-**%#@@....+++@@@####$$=;;;;$#...++@@##$$%%**;==$@...+@@#%%**&&&**$$@@.+@#$&=**-*--*=&&#@+..@#$%&**===;=%%$#@+..++++++@#$$;;&&%#@+.++##==;=;%&%;=;==$@.+@@%&=;;%%$%%***%$#.....+@#%&***$#@+..........+@#%&***$@@++.++@@##%&;;;;;&%%#@+.+@@#&============#@..@@#$%==--*=&$$#@@+.++@#$%%&%$%&=;;;$#@.",
+"+@#%;;;=%##$%&;;;$#....+++@$%***$$@++....+++@@@@#$$%==;;=#@..++++@@#$%%%**;==##...+@#$%%**&&&**%##+.++@$%&***-***==&$#@.++#%%&**=====&%%##+.....+++@@$%;;&%$@@..++@$==;==&%%==;==##.+@#$%&;;%%%%%***%$#.....+@#%&***$#@+..........+@#%&***$#@.+.+@@$$$&&;;;;;%$$@@+.+@#$==;=;=;;=;===$#..++@##==**-=&%$$##@.++@#$$%%%$%&&;;;$#+.",
+"+@#%;;;&%$#$%&;;;%#......@@#$*-*%#@@.......+++@##%&&**&&%#@.....+@@%%*---*&&%$@..++@#&====&&&**%$#@.++@$$%=;&%&=;***$#@.+@@%&&*****;;***$#@.......+@#$%**%$#@++..@##%%&-*-*--*&&%$@..@@%%=**%%%==-*-%$@....++@#%&=;=$@@++........+.@#%&=;=$#@+..@@#==;**===%$##@@+..+@#%=;;;;;;;;;;;=$#...++@##$%%&;;***%$@...+@@##$%&&**;=&$@@.",
+"+@#$;;;&%$#$%&;;;$#......+@$$***%#@@........++@#$%&&**%%$#@....++@@%%--***&%%$#.++@#$&==;=&%&**%$#@.++@##%==%%%==***$#@.+@#%&&*-***;;***$#@.....++@@$$%**$$@@+..++#$%&&**-****&%%$@..+@$%&**%%&==---%$#.....++@$%==&##+.+........+++@$%==&#@++..@#$=;;*-==&$$#@@++..+@#$;;;;;;;;;;;;;$#...+++@#$%%%;;***&%#...++@@$$&&&**==&#@+.",
+"+@#%;;;&%##$%=;;;%#.....+@@#%*-*$$@++......++@#%%-*-&&%#@@+...+.+@@#$%%&=;;;=$#..+@#$*-*;;;;=-*&&%#..++@###$#$$%%***%$#.+@@%&&**&&&&&***%$@......+@#%&=;;$#@++..+@@$;;;=;&&&;;;;;$#.++@#$$;;-*-;;***%$@.....++@@####@@++...........+@@#####@+...@#$;;;**=&&$##@++...+@#%&====;=;==;==$#....++@@#$%&;;-**&%#....++@#$***=&%$#@@+.",
+"+@#$;;;&&$#$%&;;;$#......@@$$***%#@@+......+@@#%%*-*&&##@++...++@@@##$%%=;;;;$#..+@#$***;;=;;**=&%#..++@@#####$$%***%$#.+@#%%=*-%%&%%***%$#......+@#%&&;=$#@++..+@#$;;;;=&%&=;;;;$#.+.+@#$=;--*;;***%$#.....+++@@##@@+............+.+@@#@@@+++..@#$;;;**=&&%$#@++.+.+@$$===;=;=;==;==$#....++@##$%%;;*-*&%#....++@#$*-*&%$##@++.",
+"+@#%;;;&%$$$%=;;;$#.....++##%***%$@+++....++@#$&&*-*&%$@@++..++@@@###$$%=;;;;$#.++@$$*-*;;=;=-*=&&#.++@@#@##@#$$%***%$@.+@@%&&**&%%%%***%$@.....++@$&=&;=$#@+...+@#$;;;;=&%%=;;;;$#..++@#$==*--;;***%$@.......++@@@@+++............+++@@@@++....@#$=;;**=&&$$#@@++..+@#%====;=;;;=;;=$#...++@@#$$%%;;***&%@.....@@#$***&%#@@+...",
+"+@#$;;;=%$$$%&;;;%#...+++@#$%*-*%$#@++..+++@$$%**===%$#@@+...+@@%%%##$$%&=;;;$#.++@$%=;;;;;;;-*==&$.+@@$%%####$%%-*-%$#.+@#$&&**%%%%%*-*%$#.....+@@$&=;==##+++..+@#$;;;=&%%%&=;;;$#..+++@#$%%&&&&***%$@......+++@@@@+++............+++@@@@@+....+@#$$%&&***;;%$#@@+.+@#$=;;;;;;;;;;=;$#.+++@##&&*-*;=%%$$#@.....+@#$===%$#@++...",
+"+@#$;;;&&%$%&&;;;$#..+.+@@#$%***%$#@@++..+@#$%%-*==&%$#@@++.++@#%%&$$$$%&=;;;$#..+@#$==;;;*;;*-==&$.+@#%&%%$$$$%&***%$@..@@%%&-*%%%%%***%$@.....+@#$====&$@++...+@#$;;;=&%%%&=;;;$#...+@@#$%%%&&&***$#@.....+.@@@@##@+++...........+@@@##@@+++..++@##$%&***;;%$$#@+.+@#$=;=;;;=;=;;==$#..+@##$&=**-==%$#@@@.....+@#$===$#@+.....",
+"+@#$;;;=&%%%&&;;;##..++@@#$%%-*-%%$#@@+.++@#%%&*-===%%$##@+.+@##&&&%$%$%&=;;;$#..+@#$==;;;;;***;=&$.+@#%&&%%$%%%&*-*%$@.++@$%&**%%%%&***%$@.....+@#$=;==&#@+....+@#$;;;=&&%%==;;;$#...+@##$%%&&&&***$#@.....++@#$$###@++.........+++@##$$##@++...++@@#%%***;;&%$$#@.+@#$&======;=====$#.+@@$$%&=*-*==##@@++.....+@#$===$#@++....",
+".+@#%&&**===**&&%#@..+@@%%&==-**==&%%@@.+@@$*****;====&%$@@.+@#$***;;===**;==$@...+@##$$&&;;=-*==&$.+@#&==**===**;;;$#@..+@##%*-;;;;;-**%$@.....+@#$***%$#@++...+@@$==;**===**;==$@..++@#$=====**;==$#@......@@%%***#@+++.........+@#%&***#@++....++@@#$$$%==***%$@.++@##$$$$$$$$$$$#@@.+@#***;;%%%$##@@++.....++@@$==&$#@+.....",
+"++@@%%&**=;=**&%%#@..+@#%&&==*--===&%#@.+@#$***-*;;===&&%#@.+@#$***;;==;**==&#@...++@##$%&=;;**=&&#.+@#&==**===-*;;;##@.+++@#$**;*;;;***$#@.....+@#$***$##++.....@@#&==**;==**==&#@.++@#$$===;=**==&#@+....++@#%&***$#@+........++@##&&***$@@+....+.+@@@#$$&=***%$@..++@@##########@@@+.+@#***;;%$$##@++........+@@$&=&$@@++....",
+".++@##$&&;;;=&$$@@+.++@#&&=;;;;;;;=&&#@.+@#$=;;;;;;;;;==&#@.++##%&%;;;;;;=%$#@@....++@##%&=;;;;==&#.++@#$%==;;;=;%$$#@+...+@##%%=;=;;&&%$#@.....+@#$===$#@+......+@##$%==;;;;=%$#@@..+@$$%;;;;;&&%$#@@+.....+@@%&;;=$#@++........+@#$**=&&$@++........+@@@##$$$$##@...++++@@@@@@@@@@@++.+@##$$$$##@@@++.........++##&==#@@......",
+".+.+@##%&=;=&&$#@@+..+@#&&==;;=;;==&&@@.+@#%==;=;;;;;==&%#@.++@#$%%;=;=;==$##@+....+.+@#%%;=;=;==&#..+@@#$==;;;==$$@@@...+.+@#$%===;=%%$#@+.....++@#==&$@@++......+@##$==;;===$##@+..+@#$%==;=;&%###@++.....+@@%%===$@@.........++@#$**=&%##++.......+.++@@@@###@@+....+++.+++++++.++.+.++@#$###@@@++.+.........++@#&=&#@@......",
+"..++@@#$%===%%#@++...+@@%&&===;====&%#@.+@##==========&&%@@...@@$$%=====&&##@+......+++@$%=====&&%#..++@##&=====&##@@.+....++@#$&====%$$@++......@@#%&&#@++......+.+@##&=====&##@++..++#$$=====%%#@+++.......@@$%==&#@+++.......+@@$$**&&%#@+............++@@@@+@++.......+..............++@#@@@@++..............@@#%&%#@++.....",
+"....++@@##$###@++.....+@##$$$$$$$$###@+.++@##$$$$$$$$$$##@+...++@###$$$$$#@@++.......++@@##$$$$###@...++@###$$#$#@@++......+++@@##$####@+++......+@@#@#@@+..........+@###$$$##@@++...++@@##$$###@@@+.+.......+@@####@@+.........+@#%%==$##@+++..............+.++..+.........+....+.......+++++++.................++@@#@@++.+....",
+".....++@@@#@@@++.....+++@@#@#####@#@@++..++@@@########@@@@+..+.++@@@####@@@++.........++@@#@####@@+.....+@@@@##@@@++.........++@@@##@@@+++........++@@@++...........+++@#@#@#@@++......+@@#@###@@++.........+.+@@@@@@++.........++#$$&&##@++.................+..............................+++.+.................+@@@@@+.......",
+".....+.++@@++++.+.....++++@@@+@@@@++++....++@@@@@@@@@@@++......+.++@+@+@@++.+...........++@+@+@++++......++@@+@+++...........+++@++@+++...........+++++++............++++@@@+++..+....+.+++@@+++++.............++@@++.+.........++@@@##@@@+........................................................................+++++........",
+"......++++++++..........+.++...+.........+.+.++++++.+.............++.++.+.+.+....+.++++.++..+..+......+.+++++++++++.+....+.++++++++.++.+............+.+.+..+........+.+++..+.+++..+....+.+.++++++.+.........+.+++++++++......+.++.++.+.+.+.+.+......+.+++.+.+..+......+.+........+.+..+....+.+.+...++..+..........+.+.++........",
+"..+.++++@@@+@+++......+.+++++@++++........++@+++++++++++.........+.+++++++++++...++++++@+++++.+.......+++++++@++++++.+....+++++@+++@@++++++......++++++@++++++...++++@+++++++++++++...++++++++++++++++........+++++++++++++.+.+++@++++++++@++.+.+..++++++@+++++.......++++++..+.+++++++...++++++++.++++++++......+.++++++++.....",
+"..+.++@@####@@+++.....+++@@@@@@@+++.....+++@@@#@#@#@@@+++.......+++@@@#@@@@@+++.+@@@@#@@#@#@@++.+...+++@@@#@#@#@#@@@+++.+++@@@@#@#@@#@@@@++....+.++@@@@@@@@@+++..++@@@@@@@@@@@@#@@+.+.++@@#@#@#@#@@++++....+++@@@#@#@#@@@++.+++@@@@@@@@@@@@@@++..+++@@@#@@@@@++.....+++@@@@@++++++@@@@+.+++@@@@+++++@@@@@++....+.++@@@@@@+++....",
+"...+@###$$$$$#@+++....++@@##$###@@+.....++@##$#$$$###@@++++...+++@@####$####@@+.+@##$#$$#$##@@@++...++@##$#$#$$$#$##@++.++@###$#$$$$#$$##@@...+++@@###$#$###@@+.+@@###$###@#######@.++@@####$$#$###@@++.....+@@##$#$$#$##@@..@@###$###@######@+..++@##$#$$##@@++....+@@@###@@+++@@###@@.++@@###@@@@@#####@@...+++@@@#####@@+++..",
+".+++##%==***%%#@++..+.+@$$%&&&&&#@@+....+@@%&&&&&=&&&$##@+....++@@$$&&&=&%%%$$@.@$$&&&&=&&&&%#@@++..+@#%&&=&=&&=&&&&#@+.+@#%&&=&&&&=&&&&%$@...++@@$$&&=&&%%%$$@.+@$%&&&&&$$$&&=&&%$.++@%%&&=&=&=&%%%@++...+++@%%&&&&=&&&%$@.+@$%&&&&&$$$&&&&%#@..+@#%&&&&=&&$#@++...+@$%&&&##@@@##&&&%$.+@#%&%%$#@#$%&&&$$@...++@#$%&&&%%#@@+++.",
+"..@@#$%=;-**&&#@@+...+@#$%&====&$#@++...+##&========&%$#@@+.++@@##%%=====&&%%%@.@%%========&&$##@@+.@@#&&=========&&$@@.+@#&============%%#.++@@##%%=====&&%%$#.@@$%&===&%$%&===&%%.+@#%&&=======&%%#@+....+@#%&=======&%$@.@@$%====&%%%&===&#@.++@#&======&%$@++...@@%%&&=$$#@#$%&=&%$.@##&&=%%$##%%=&=%%@.++@@##%%&==&&$##@@+.",
+"++@#$%%;;**-&=$#@++..+@@%%&=====$##+++..@@$&===;=====%%%#@@.+@@#$$&&=====&&&&%#.#%%===;=====&%$$#@+.@#$&====;==;====$#@.@#$&===;=;==;===&%#.+@@#$$&%=====&&&&%#.@#%&=====%%%=====%%.+@#%&&========&%#@+...++@#%&========&%#.@#%%=====%%%====&$#.+@@#&=======%$@@+...@#%&===%$$##$%===&%.@#$===&&$$$&&===%%#.+@@#$$%&====&%$$#@@.",
+"++@#&==;==&&**%$#@+..+@#&&=**-*-&%#@+...@#$;;;**;;;;;***$#@.+@#&&=**;;;;;***==$.#%&***;;;;;;;***$#@.@#$;;;-*;;;;;-**%$@.@#$;;;**;;;;;***;=$.+@#&&=**;;;;;-**==$.@#%&***;;%%&;;***&%.+@#%&=;;-*-;;==%#@+....+@#&=;;;*-;;;&%#.@#%&**-;;&&&--;;=$#.+@#$==;-*;;=%$@+++..@#%&*-*==$$%&=-*-&%.@$$*****%%$&=-**=%#.+@#&&=**;;;;;***$#@.",
+"+@##&==;==&&**%$#@+..++@&&=**-*-=&$@@+..@#$;;;-*;;;;;***$#@.@##===**;=;;;*-*;=$.#%=*-*;;;;;;;***$$@.@#$;;;**;;;;;*-*%$@.+#$;;;-*;;;;;***;=$.@##===**;=;;;**-;=$.@#%&*-*;;&%%;;-*-&%.++#%&==;*-*;==&%@@+...++@#&&=;;**;;;&%@.@#%&***;;&&&*-;;=$#..@@$==;*-;==%$@++...@#&=--*==$%$==-*-&&.@$%**-**%%%==*-*&%#.@@$&==**;=;;;***$##.",
+".@#$;;;&=&==**&%%@+..+@@#$%;;;;;;=$#@+..@@$%==;;&&&&&***%$@.@#$***&&%%$%%===;=$.@$%;;;=&%%%%%***&%#.+##%==;;%%%%%***%$@.@##&&=;;%%%%%=====#.@#$***=&%%$%%===;=$.+#$%;;;=&%%%==;;;%$.++@##$%%***%%$##@+.....++@#$$%&;;=&&$#@.+#$%;;;==;;;;;%%$#@.++@#$%%**&%%##@+....@#$%*--;;%%%;;*--%%.@#$;;;**&&&%&***%%#.@#$***&&%%%%%***&%#.",
+"+@#$;;;==&=&**&%%#@...+@#$%;;;;;;=$#@++.+@#%&=;;&%%%&***%$#.@#$***&&$$$#$=====#.@$$;;*&&$$$%%***=&#.+@$%&&;*%&%&&***%$@.+@#%&=;;&%%%%=&===#.@#$***&&$$$$$=====$.+@$%;;;==%%%&=;;;$$.+++@##%%*-*%$$@@@+.....+++@##$%;;=&%$#@.+@$%;;*&&;*;;;%##@+..++@#$%**%%$#@++....@#%%-*-;;&%%;;-*-%%.@$%;;;-*===%&***%$#.@#%***&&$$$%%***=&#.",
+"+@#$;;;&&=&=**&&%@@..++@#$$;;*;;;;$$@++.@@#%&=;;%&&&%***%$@.##%***&%$####%&&==#.@#%;;;&&$$#$%***&&#.+@#%&=;;&%%%%***%#@.+@#%&=;;%%%%%&=&==#.@#%***&%$###$&====#.@@#%;;;=&%%%=&*;;%#...+@@#$%***%$#@++........+@@#$%;;&&%#@+.@@#%;;;&=;;;;;$#@@+...+@##%**%$$@@+.....@#%%*--;;%&=;;--*%$.@#%;;;-*&&&&%-**%%@.@#$***&%$##$%***&&$.",
+"+@#%;;;;=**-*-&%%#@..++@#$%**&=&**%$#@+.+@#%&&*-===;;-**%$#.@$%***%$#@@@######@.@#%;;;&%$###$===;=$.+@#%&&;;&&&**%%$#@@.+@#%&&;;&&%**%%$##@.@$%***%%####$$%%$$#.+@#%;;;;;===;;;;;$$....++@$$*-*$$#@.+......+..+@@#%;;=&%#@+.+@#%;;;*****&$$#@++...++@$$**%%#@+++....@@%%*****&&&*****&$.@#$;;*=;;;;&%***%$#.#$%***%$##@#$=====$.",
+"+@#%;;;==-*-**&&%#@..++@$$&**&&&-*%$$@+.+@@%&=**=;=;;-*-%$#.#$%***%$#@@+@@@#@@@.@#$;;;&%##@#$=====$.+@#$&=;;&&&**&%$#@+.+@@%&=;;&%&**%$##@@.#$%***%$####$%$%$##.+@#%;;;=;=;=;;;;;%#....+@@#%***%#@++......+.++.@@#$;;&%%#@+.@@#$;;******%%#@++.....@@#%**%$#@++.....@#$%**-**&&&**-**%$.@#%;;;;=*;;%&-**%$@.#$%***%$#@@#$==;==#.",
+"+@#$;;;;;;;;;;=%%#@..+@@%%&;;&&%;;=%%#@.+@#%%&*-;;;;;***&%#.#$%*-*%##++++++@@++.@$$;;;&%##@##&==;=$.+@#%&&--**-**%$##++.+@#%&&--*-***$$#@++.#$%*-*%$###&&===%%@.+@#$;;*;;;;;;;*;;$#.....+##%***%#@@.....+++++@+@@$$;;&&%#@+.+@$$;;;*-*-*&%#@@.+....+@#%**%$#@@++++..+#$%***;=*-*;=***%$.@#%;;;&&***=&***%$#.@%%***$##@@##&&=;=$.",
+"+@#%;;*;;;;;;*&&%#@.++@#%&=;;&&&;;&&%#@.+@#%&=**;;;;;*-*&%$.#$%***$$@@+.+++++++.@#%;;;&%##@@$&&&;=$.+@#$&&-*-****%$#@@+.+@@%&&-*-*-**%#@++..#$%***%$##$&====&%#.+@$%;;;;;;;;;;;;;$#.....@@#$-**$$@++....++@@@@@@@$$;;&%%@@+.+@#%;;**-***&%$@@+....+@@#$**%%#@@@@@++.@#$&***=;-*-=;-**%$.@#$;;;&=***&&***%$@.#$%***%$@@@#$&&=;=$.",
+"+@#$;;;==*-***==&#@.+@#$%&=;;&%&;;=&%##.+@#%%&-*;;;;;*-*=%$.#$%***%$@@+++++@+++.@#$;;;&%#@###&==;=$.+@#%&&*-*-***%%$#@@.+@#%&&-*-*-**$##++..@%%***%$##$&====&%#.+@#$;;*;;;;;;*;;;%#.....+@$$*-*%#@@.....@@##$#####%;;&&%#@+.+@#$;;;**-*-&%$#@@+....+@$$**%$$#@@@@@+.+#$%***==-*-==***%$.@#%;;*&&***=&***%%@.#$%*-*%##@@#$&==;=$.",
+"@@#%;;;;;**-**===##.++#$;;;*-*-*--;;=$@.++#%&&;;%%%%%;==;=$.#$%*-*%$#@++@@@@@@+.@$%;;;&%##@#$&&=;=#.+@#%&=;;=&&**&%%%$@.+@#%%=;;&&&**$#@+...@$%***%%$$$;;***==$.+@#%;;;==%&%&=;;;%#...++@##%***%$@+++...@#$===####%;;&%%#@+.+@$%;;;===;=**%$#@+...++##%**%$$##%%%#@.@#$%*-*&%;;;%&***%%.@#%;;;=====;;-**%$#.@$%***%$#@@#$===;=$.",
+"+@#$;;;&==;=;;==&#@.@@#$;;;-*-*-*-;;=%#.+@#%&&;;%%%%%===;=$.@$%***%%##@@##$###@.@#$;;;&%$###$&====$.+@#%%&;;=&=**&&%%%#.+@#%&&;;=&&**$@@+.+.@$%*-*%%$$$;;***==$.+@$$;;;=&%%%&=;;;$$....++##%***$$#@.+.+.@$$;;;%$$$%;;=&$#@+.+@#$;;*&===;**&%$#@...+@@$%**&%$$$&&%$#.+#$%***&%=;;%%*-*%$.@#$;;;=====;;***%$#.#$%*-*%%$##$$=;=;=#.",
+"@@#$;;;====;;;==&$@.+#$%*-*==&&&&&***%$.@@#%&=;;%%$%%;;=;=#.##%;;;==$$###&==&&#.@$%;;;&&$$$%%***&%#.+@#%&=;;%&%&%=====#.+@#%&=;;&%%%%#@++...@$$;;;=&%$%%%;;;;=$.@@$%;;;&&%$%&=;;;$$...+@@#$%*-*%$#@@++..@$%***%%$$%**&%%@++.@@$%;;;&=%%&;;==&#@..++@##%**%%%%$***$#.@#%%***%%%$%%&***%$.@#%;;;&&%%%***-*%$#.@$$;;;=&$$#%%***&%$.",
+"+@#%;;;=&;==;;==&#@.@#$%***=&&&&==*-*%$.+@$%&=;;&%%%%=;;==$.@#$;;;==%$$%%====&#.@$%;;;=&$$$%%***&%#.+##&&=;*%&%&&=====$.+@$%&=;;&%%%$#@++...@#$;;;;=%%%%%;==;=$.@@$%;;;=&%$%&=;;;%$.++@@#$$%*-*%$$#@++..@$%***%%%%%**&%%#@..@@$%;;;=&&%%;;===$#..+@@$$%**&%%%%***%$.@#%%***%%$$$%%***&$.@$$;;*&=%%%***-*%$#.@#$;;;;=%%$%%*-*%%#.",
+"+@#$=;;==&&%=&&%$#@.@#$&*-*=&&&&&=***%%.@#$&&=;;%%%%%;=;;=$.@@$;;;==%%%%%====&#.#$%;;;&=%%%%&***%$#.@@$&&&;;&%&&%===;=$.@@$&&=;;&%%%$#@+....@@$;;;==%%%%%=;===#.@#$%;;;&&%%%&&*;;%$.++@#$$%%***%%$$#@@+.@$%*-*&&%%&**&%$@++.@#$%;;;&&%%%;;===%#.++@#$%%**&&&&%***%$.@#%&***%%$$$%%***%%.@#%;;;&&%%%**-**%$@.@@$;;;==%%%&&***%$@.",
+"+@@#&==;=%&%=&%%$@@.@#&=--***&&&**---=&.@#$*-*--*-*-****%$#.+@#%%&;;*-***;;;%$#.#&=---**-*-*-;==$#@.@#$**-*-*-*-***-;=$.@#$**--*-**%%@@+....+@#%%&*****--;;;%$#.@#&=--***%%%****-=&.+@@&==-----**==&@@+.@#$=;;*-***;;$$@@++.@#&=---**%%%&=-*-=&.+@#$*-*--****-*--$$.@#&=--*==$#$=;---=&.@$%*-*-*%%%==---%$#.+@#%%&******-===$#@.",
+".+@#$%&***-***%$$@+.@#&=*--**&%&**--*=&.@#$-***-*-**-***$$@.+@@$%%;;**-**;;;$$@.#&=-*-***-*-*;==##@.@#%*-*-*-*-**-**==#.@#$*-***-*-%%@+++...+@@$%%**-****;;;%$@.@#&=*--**%%&-*-**&&.+@#&==***-*-*===@@+.@@#===-**-*;=$#@++..@#&=-*-**%$$%%*-*=&.++#$-*-*-****-*-*%#.@#&=*--==#$#==-*-=&.@#%*--*-$$$==**-$$@.+@@$%%***-***=&&#@@.",
+"+++@#$%*******%$#@+.@#$$%%%%%$$$%%%%%%#.@@$$%&%&%%%%%%%$$@@..+@@##$$%%%%%$$##@@.@#$%%&%&%%%%%$$##@+.@@#%%%%%%%%&%%%%$$#.+@#%%%&%%%%$#@+......+@@##$$%%&%%%$##@@.+#$$&%%%%$$$%%%%%%#.+@@$$%%%%&%&%%$#@@..+@##$$%%&%&$$#@@+...+@$$%&%%%###$$%$%$$.++@#$%%%%%&%%&%%%##.@@$%%%%%$###$$%%%$$.@@#%%%%%$#$$$%%%##@..+@@##$$%%%%%$###@+.",
+".++@@##$$%%%$$##@+..+@#$$$%$$###$$%$$$#.+@#$$%$%$%$$$$$##@+..+++@###$%$%$$##@@+.@@#$$%$%%$%$$##@@++.+@@$$$%%%%%$%$$$$#@.@@@$$%$%%$##@+++.....++@@@#$$$%$$###@@+.+@#$$%$$$###$%$%$$#..+@#$$$%%$%%%$$#@++.++@@#$$$%%%##@++....@@#$$$$$$##@@##$$##..+@@$$$%%%$%%$%$$#@.+@##$$$$##@###$$$##.+@#$$$$$#@@##$$$#@+..+++@###$$$$$##@@++.",
+"...++@@##$$$##@@++..++@###$##@#@######@..+@####$###$###@@++..++++@@@#####@@@+++.+@@###$#$####@@@+.+.++@###$###$######@+.++@###$##$#@@+.........++@@@######@@++..++@###$##@@@######@.+++@@###$#$$###@++..+++@@@#$#$#@@@++....+@@##$###@@+@@###@@.+++@#####$#$#$###@+.++@#####@@+@@#####@.++@#####@@@@@##@@++...+++@@@#####@@++...",
+"....++@@@@#@@@++++...++@@@@@@@++@@@@@@+..+++@@@@@@@@@@@+++.......++@@@@@@@+++...++@@@@@@@@@@@@++.+...++@@@@@@@@@@@@+@++..+++@@@@@@@++............++@@@@@@++++....++@@@@@@+@+@@@@@++...++@@@@@@@@@@@++.....+++@@@@@@@++.......++@@@@@++++++++@@+...++@@@@@@@@@@@@+++..++@@@@@+++++@+@@++..++@@@@++++++++@++.......++@@@@@++++....",
+"....+.++@++@+++......+.+++++.+++++++++....++++++++++.++..+.......+..+++++..........+++++@++++..........++++@+++@+++++.+...++++++++..+...............++++++........+.+++++++.+++++++...+.++++++@+++++..........++++++.........+.++++++....++.+.......+++@+++++++++.+..+.+++++++.+.+++++.....+++++...++++..+........+.++.+........",
+"...+.+.++++.++.............+.+.+.+.........+.+.+..+.+..............+.+++..+........++.+++.+..+.+..........+......+.+......+..+.+..+..+...+......+.+.+..+.+.+.....+...+...+...++.+......+.+.+...+.+.++.+......+.+.+.+.++..........++@@@@@@++.+...+.+++++++................+++@@@@@++.+..........+.+++++..........................",
+"..+++++++++++++++........++++++++.+......+.++++++++++++..........++++++++++++.....++++++++++++++++...++++++++++++++++++...++++++++.+.+++++....+++++++.+.+++++++...+++++++++++++++++....+++++++++++++++......+++++++++++++++....+++@#####@@++.....++@@@@++++...........+.++@@#####@@.+.........+++@+@+++.........................",
+"+++@@@@@@@@@@@++++.....++++@@@@@@++++....++@@@@@#@@@@+++.......+++@@@@@@@@@@+++.+++@@@@@@@@@@@@@+++..++@@@@@++@+@@@@@++.+++@@@@@++++@@@@@@+.+++@@@@@+++++@@@@@+..++@@@@@@+@@@@@@@@+..++@@@@@@@+@@@@@@@+..++++@@@@@@@@@@@@++.....+@#%%&&%$#@+++..+@@####@@++............++@#$&&&%%#@+..........+@@@#@@+++........................",
+".@@###$#$#$####@@++...+++@@#######@@+++.+@@@#$#$######@@++...+++@@@##$#$###@@++..@@@###$$#$$####@++.+@@######@@######@@.+@@@####@@@@@#####@.+@@@#####@@@@#####@.+@@#######@@######@.+@@######@#@######@...+@@###$#$#$####@@....+@@$&&==&$#@@....+@#&==%$@+++...........+@##$&=&&&##@+........++@#%%%#@+++.......................",
+"+@##$$%$%$$$$$$#@@+.+.+@@#$$$%$$$##@@++.@@#$$$$%$%$$$##@@++...+@@#$$$%$%$$$$#@@.+@#$$%$$%$%$%$$$#@+.+@##$$$$###$$$$$##@.+@#$$$$$$####$$$$$#.+@#$$$$$####$$$$$##.@@#$$%$$$$$$$$$$$$#.@@#$$$$$$$$$$$$$$$#.+++@##$$%$%$%$$$$#@...++@#$***;;%$#+++..+@#===%%#@++..........++@#$%;;***$#@+.......++@#$%&&$#@++.......................",
+"@#$**********==&#@@..+@#$$==*****%%$@@+.@#&=********==$##@+.++@#$$**********$#@.@#$*************$#@.@#$*****%%%==***=&#.@#&=***==$#$==***=&.@#&=***==$$$==***=&.@#&=*****%%%*****&&.@#&=*****%%%*****=&..@@#===**********$#....+@#$--*;;%##++...+@#%&&==$@@+...........+@#%%;;***$#@++......+@#$%-**%$@+++......................",
+"@#%***-*-*-**===$#@.+@@#$%;;*****&&%#@+.@#&=**-*-**-;=%$#@@.++@#%%**********$$@.@$%**-**-***-***%$@.@$%*****%%$;=***=&#.@#&=***==$$$=;***=&.@#&=***;;$%$;;***=&.@#&=**-**&&&**-**=&.@#&=**-**&%&*-***=&.+@##=;;**-*-*****%$...++@$$**-;;$$#@.+..+@#%&===$#@+..........+.@#$%;;-**%#@+.......+@#%%*-*%%#@++......................",
+"@$$*-*******-=;=$$#.+@#$%%;;-*-**&&%$#@.@#==-****-**;;%%$#@.+@#$%%**-*-*****%$@.@$%***-*-*-***-*%$@.@#%**-**%%%;;*-*==$.##==*-*;=$$$==-**==.##==*-*;;%%%;;*-*==.@#==***-*%&&-**-*==.@#==-**-*&&&***-*==..@#$=;;*-**-*--**%$....+@$%***%%#@@+....+@#%&&;;$#@@+.........+.+@##%%***$$@@....+.+@@#%&*-*%%#@++......................",
+"@#$&==;;=&&&&;;;=&#.@#$=;;==&&&=&***%$@.@#$%***==&&&;=;;;#@.+@#=;;;;&&&==*-*%$#.@$%***&&-*-&=***%$#.@#%***=&$$$%%***&%#.@#%&***%%$$$%%***&%.@#%&***&&==&&&***&%.@#$%-**;;%%%;;***%%.@#$%***;=%&%;;***%%.+@#$;;;==&&&;=***%#...+@@#$*-*%$#@+.+...++@#$%**%$#@@..........+++@#$%*-*%#@++.....+@#$==;;;;=$#@+......................",
+"@@#&==;;&&&&=;;;==$.@#$;;;;=&&%&=*-*%$#.@#$%***==&&&;;;;;$#.@#$==;;;&&&&&*-*%$@.#$%-**=&**-&&***%$@.##$***&=$$$%%***%%#.@#%%***%%$#$%&***%%.@#%&***&%===%&-**%%.+#$%*-*=;&&&=;*-*%$.@#$%**-=;&%&=;*-*%$..@@$;;;===&&;;-**$$....+@$%***%$#@+......+@@#$**%%$@@++.........++@#$%***%#@++....++@#$==*;;;;$#@++.....................",
+"+@#%&=;;%%$$%===;=$.@$%***&%$$$%%;;;==#.+#$%;;;=&%%%&=;;;$#.@#$;;;==%%%%&=;=%$@.@$%***%&-**&%-**%$#.@$$;;;&&$##$%***%%#.+@$%;;;&%$#$%%;;;%#.@#$%***&&*-*&&***%%.+@#$%&=**=;=*-&&&$#.+@#$&&=;;&&&**&&%$#.+@@$&==&&%&&**&&&$@....@@#$***$$@+++......@@#$====&#@++..........++@#%***$$@@.....+@#$%**&&&**$$#++.....................",
+"@@#%&=;;%%$%$===;=$.@$%*-*&%$##$%;;;==$.+@#%;;;&=%%%&=;;;$#.@@$;;;==%%%%%;==$#@.@$%***&%-*-%&***%$@.@#%;;;&%###$%***%%@.@@#%;;;%%$##%&;;;$$.@#%%*-*=&*-*=&-**%$.+@@#%&&*-=;;**&&%#@.+@@#%%=;;&&&**&&%#@..@@#&&=&&&%&*-&&%#@...++@$%*-*%#@@........+@#$&===&$#@+..........++@$$-**%#@@....+.@#$%**%&%**%$#@+.....................",
+"+@#%%=;;%%$$%&==;=$.@$%***&%####$;;;;=#.+@#$;;*&=%%%=&;;;$#.@@$=;;==&%%%%;==$$@.@#$***%%**-%%***$$@.@#$;;;=%$###%***%$#.+@#$;;;&%$$$%&;;;$#.@@$%***&=-*-&&***%$..+@#$%&**;=;-*&%%#@..+@#%%&;;&&&**&%%#@..+@#%&&%&%&&**&%%#@....+@$%*-*%##++........+@#&====$#@++..........+@#%**-$$@++...++@#$%**%%%**$$@@+.....................",
+"+@#%&=;;%%$%%;==;=$.#$%***%$#@@#$===;=$.@@#%;;;;====**;=&$@.@@#%&&***-*==&&%$#@.@##$%%%%-**%%%%$#@@.@#%;;;&%#@#$$***%$#.+@#$=;;==$$$&=;;;$#.@#$%***;=--*;;***%$.+++@#$%==*-*==$$#@+..++@#$%;;**-;;$$#@+.++@@##$$%;;;;;$$#@+....@@#$***%#@@.........++@#$=;;&&##+++.......+@@#$***%#@@......@#$$&=$%$&&%$#++.....................",
+"+@@%%&;;&%%%%=;=;=#.#$%***%##@@#$&=&;=$.+@#%;;;;;===**;==#@.+@#%&&*-**-==%%%$@@.+@@#$%%%**-%%$$$@@+.@#%;;;&%$#@$%***%$#.++@$=====%$%&=;==$@.@#$%***;=---;;***%$..++@@#$&=-*-&=$$@@+...++@#$;;-**;;$#@++...+@@#$$%;;;;;$#@@+...+@@#%***%#@+..........+@@$==;=&$#@+.........@@$%***%#@@....+++#$$%%#$#&%$##++.....................",
+"+@#%&=*-*****;;;%%#.@$%***%$####$&==;=$.@@#%;;;*****;;%%$#@.+@##$%&%;==*****$#@.++@@@#$%***%$##@@++.@#%;;;&%###$$***%$@..@@#%&&;;%%%;;&&%#@.+#$%*****&&=**-**%%...+@##%=;;;;;=%#@@+....+@@$%%**-%$$@@+.....+@##&&***%%$$@@+...+@@#%***%##@..........++@#$%%**$#@+++.......+@$%**-$$@++.....++@@###@@##@@@+......................",
+"+@#%&&-*-*-**;;;%$#.#$%*-*&%$$#$%;;;=&$.+@#$;;;***-*;;%$##@.+@##$$&%==;*****$#@..++@@#$%*-*%$#@++...@#$;;;&%####%***%%@..+@#%&&;;%%%;;&&%#@.+#$%*-***==&-****%$..++@#$$=;;;;;=%$#@+.....@@#%%-**%$#@++...+++@#$&=***%%$##@@....@@$$*-*$$@++..........+@@$%%**%##@+.......+@@#$***%#@@.....+++@+@+@@@+@@+++....++.+++++.+++++.+..",
+"+@#%&&*-**-*-;;;$#@.@$%***&%%$$%%;;;=&$.+##%;*;****-;;%%$@@.+@#$$%&&===*****$$@....+@##%***$$#@+.+..@#%;;;&%$##$%***%$#.+++@$%&;;&%&;;&%%@@.@@$%***-*&&=*****%$.++@@#$%;=*;;==%$#@@....++@#$%*-*%$#@+.....+@##$&=*-*%%%$##@....+@#%***%##+++..........+@@$$;;%%$@@+......+@#$%***%#@@........++++.++++++....+.+++++++++++++++++.",
+"+@#%&=;;=&&&&%$$#@@.@#$=;=**=&===*-*%%#.+@$$;;;==&&&**=%%#@.@#$;;;%%%%&&&***%$#...++@#$%*-*%$#@+.+..@#$;;;&&$$$$%***%$@..++@#$%**&&&**%$#@+.+@#%;;;-*&&&*-;;;%#.+@@$%&&**&&&**=&&#@.....+@#$%***%$#@++..+++@#$%**===%%;;=$#....+##$*-*%$#@+...........+@@#$;;&%$#@+....+.+@#$%-**$$@++..........+......+....+++@@@@@@@#@@@#@@@+.",
+"@@#%&=;;&&&&%$##@@+.@@#==;**==&;=-*-%$#.@@$%;;;&&%&&-*&&&$#.@$$;;;%%&%%%&***%$@..+++@#$%***%$#@@+...@#$;;;&&%%%%%-**%$#...++##$**&&&**$#@++.@@#%;;;**&&&*-;;;%#.+@#$&==-*&&&-*=&&$#....+@@$$%*-*%$#@@+...+@#$%%-*===%&;;;%$...++@$$***%$#@@++..........+@#$=;&%%#@+....+.+@#$%**-$$@++......................+@@###$$###$#$###@@.",
+"@#$=;;**;==&%##@+++.+@##%%;;-*-;;&&&&%#.@#%&**-;=%%%;=***%$.@$%-*-;====;=-**%$@...+@#$&=--*&&$#@++..+@#&==;;=====;;;$#@...++@#$==*-*;=$$@++.+@#$;;*;;&%&;;*;;$#.@#%%-*-;;&&&;;*-*&%...++@#$==-*-&&$#@++.++@#=;;**=;===***%$...++@#%*-*==$#@+..........+.@@$%&;;;$#@.....@@#$&=***%#@+.......................@#$%%&&&&&&&&&=&%%@.",
+"@#$=;;**;==%%#@++...+@#$$%;;-*-;;&&&&%#.@#%&***=;%$%=;***%%.#$%*--=;====;-**%$@..+@@$$==**-=&$#@+++.@@#%&=;;====;;;;$#@....+@#$==*-*==$#@+..+@#%;;;;;%%&;;;;;$#.+#%&--*;;%&%;;*-*&%..+++##%&=-**=&$#@++.+@@$==;*-=;===-**%$....+@#%***==$$@@++..........+@#%&;;;$#@....++#$$==-**%##++......................@$%&&&==&&&&&===&%#.",
+"+#$=;;**===%$#@++...++@%%=*-;;;*****&%#.@#%&***;=%$%==***%%.@$%-*-;====;=***$#@..+@@$$==-*-&=%$#++..+@#%&&;;;====;;;$#@....++@#&=**-==#@@++.+@#$;;;;;%%%;;;;;$#.@#%&*--;;%&&;;-**&%...+@#$$==*--=&%$#++..@@#=;;*-==;==***%$...+@@#$*-*==%$#@+..........++@@$%***%#@....+@#$%==***$#@+.......................#$%&============&&$.",
+"@#$=;;;;;;;%%@++....++@$%&*-;;**-***&%#.+#%&;;;;;$$$%%;;;&%.@#$===;;;;;;;&&%$#@...+#$$;;;;;;=%$#@++.+@@##%;;;;;;;&&%#@+....++@#%&;;;&%#@+...++@#&====$$$====&$@.@#%&;;;;;%%%;;;;;&%....@#$%;;;;;;;%$#@+.++##&&=;;;;;;;;;;$$....+@#$=;;;;%$#@++..........++@#$***$#@....+@#$%;;;;;$#@++......................#%&;;;;;;;;;;;;;;;#.",
+"@#$=;;=;;;=%$@++.....@@$%&*-;;;*****&%@.@@%%;;;==$##$$=;=%%.@#$&====;;;;;%%%#@+.+++@#$=;;;;;=$$#++....@@##==;;;;;%%$#@+....++@@$%=;=%%#@+...++@#&&&&&$#$&&&&%#@.+@%%;;;;;$%$;;;;=%%..+++#$$=;;;;;=$$#++.++@#&&=;;;;;;;;;=$#....+@#$==;;;%%#@+...........++@##***$#@...++@#$%;;;;;$#@+.......................#%&;;*;;;;;;;;;;;=$.",
+"+@##$$$$$$$#@@+......+@@#$%%%%%&&%%%##@.+@###$$$##@@##$#$#@.@@###$$$$$$$$$#@@++...+@@##$$$$$$#@@+.+..+.@@##$$$$$$$#@@+......++@##$#$#@@+++...+@@##$##@#@#####@+.+@###$$$$####$$$$#@....+@@#$$$$$$##@@++..++@##$$$$$$$$$$$#@....++@#=====%$#@++..........+.+@#$$$#@@....+@#$%=;;;=##+++......................@%%;;;;;;;;;;;;;;=#.",
+"++@@@####@@@@++.+.....+@@#$$#$#%$%$$#@+.++@#####@@@@@@@#@@@.++@@#########@@@+++....+@@@#####@@@++......++@@######@@@++......+++@@##@@@++......++@@@@@@@@@@#@@@+.++@@###@#@#@#@####@.....+@@@#####@@@+.+...++@@@####$####@@@.....+@@#$$$##@@+.............++@@#$$@@+.....+@@#$$$$##@++.......................@@##$$$%%%%%%%$$$#@.",
+".++@@@@@@@@+++........++@@#$###$#$##@@+..+++@+@@@+.++++@@@+..++@+@@@@@@@@@+++.....+.++@@@@@@@++.........+++@@@@@+@+++..........+++@@@++.......+++@+@+++++@++++...++@+@@@+@++@@@@@++....++++@@@@@@@++.+.....++@@@@@@@@@@@@++.....++@@@##@@@+++.............++@@#@@+.....+++@@@#@#@@++........................@@@###############@.",
+"....++++++++...........+++@+++@@@@@@++.....+++.+.+..++.+.+.....+.+++++.+.+..........+..++++.++...........+.+++++++.............++.+...+..........+.+.....+.........++++++++++++.+........+.+.+++++.+..........+++++++++.+........+++@@@@+++................++++++.+......+++@@@@+++.........................+++@@@@@@@@@@@@@@++.",
+"........+.+...+..........................+++++++.+.......................................+.+++++................................+.+++++++.........................++++++...................+.+++.+............+.+.++++.........++++++...............++++++++.+..................................................................",
+"......+.++++++..........................++++@@@+++......................................+.@+@+@++++..........................++++@@@@@@@+++.....................+++@@@@+++................++@+@+++.............+++@@+++......++++@@@++++............+++@@@@@++..................................................................",
+"......+++@@+++..........................+@@#@##@@++.....................................++@@##@@@++..........................++@@#######@++.....................+@@@##@@@+++............+++@@#@#@++..........+++@@#@@@@++....++@@##@@@+...........+++@@###@@@++.................................................................",
+".....++@@@##@+++........................+@##$$$#@@++...................................+@@##$$$#@@+.........................++@##$$$%$$##@+.....................+@##$$$#@@+..............+@###$##@++..........+@##$$#@@++...++@##$$$#@@++........+.+@@#$$$$$#@++................................................................",
+".....+@#$%%%#@++........................@#&&***%$@+++..................................+@#$**===#@+.............+.........+.+@##==;*****$#+.....................@#&&***%$@@++..........++@@%&***#@@+........++@@$***&%@@++..+@#$***=&#@+++.......+++#$%*****##@+......................................................+.........",
+"..+.+@@$$&&%$#@++............++++.......@#&=***%$#@++..............++.+.++.+.........++@@$$**=;=##@.......+.++.+.+.........+@@#%==;*****$#@........+.+.+++.+....@#&=***%$#@++...........+@#%&***$#@++........+@#$***&%#@+...+@#$***==$#@++.+......+@$$%*****$#@+.......+.+.+.+++.+..+.......++.+.+.+.+.............+.+.+.+......",
+"....+@@%%*-*%$@+++....+.++++++++++......@#$%;;;&%#@@++++........+++++++++++++......+.++@@#%&=;;;$#@....+.+++++++++.+.....+++@#%&***&&&&%#@@...+.+++++++++++++++.@#$%;;;&%#@@+++.........+@#%&;;;$#@.......+++@@#$;;;&%#@++..++#$&&=;;##@++++++.....+@#$%&***$#@++......+++++++++++++++...++++++++++++++..+.....+.++++++++++.....",
+".....@@%&*-*%$#@+......+++@@@@@@@++++...+#$%;;;&&$##@@++++.....+++@@@@#@@@@@+++....+++@@#$$==;;;$#@..+.+++@@@@@@@@++.....++@#$&=*-*=&&%%#@+..+.+++@@@@@@@@@@@++.+#$&;;;&&$#@@@++++.....+@@#%&;;;$#@++......++@#$%;;;&%#@+...+@@#&&=;;%##@@@@++....++@@$%&***$$@+.....+@+@@@@#@@@#@@@++...++@@@@@@@@@@@+++.....++++@@@@@@@@++++..",
+"...++@@%%-*-%%#@++...+++@@#######@@++...+#$%;;;=&%$###@@@++.+++@@@####$#$##@@++.+++@@@##$$%&=;;;$#@..++@@@###$###@@@++...+@##$&=***&&&%%#@+..++@@@###$$#$###@@@.@@$%;;;=&%$$##@@++...+.+@#$%&;;;$#@+.....++@@#$$%;;;&%#@@....@@#&&=;;%$####@@@+....++@#%&*-*%#@@....++@@####$#$##$##@@+.++@@##########@@+++.+.+@@@###$###@@@+...",
+"....++@#$=;===#@+...+.+@#$$%&&&%$$@@++..@@#%;;;==&&&%%##@@+..+@@##%%&&&&&%%%#@+..+@@##%%&&==;;;;%#@.++@@##%%&&%&%$#@@++.+@@$%&;;;;;==&&%#@+.++@@##%%&%&&%&&%$$@.+@#%;;;==&&&%%#@@++....@@#$&===&$#@++...+.@@$%%&====&&$@++..++@#%&&;;%%$&%%%$@+.....+@##%***$$@++...+@$$%%%&&&&&&%&%##@.+@$$%&%%%&&%%%#@@++.++@@##%%%&&&%$#@@++.",
+"....++@@#&===&$@@...++@@$$%&&&=&%%#@@++.+@$%;;;=====&&$$#@@.+@@#$%%&&&&=&&&%$#@.+@@$$%&&=&===;;;$#@.+@@$$$&&&=&=&$$##@+.+@#%%&;;;*;==&&%#@@.+@@$$$&&&=&&&=&=%$#.+@$$;;;====&&%$$#@+..++@#$%&===&$#@++...++@#%%&&====&%$#@+..++@#%&&;;%%%&&%%%#@.....++##%***%#@@....@@$%&&&&=&=&&&&&$#@.@#$%&&&%%&&=%%$$#@+.+@@$$$&&&=&&&$$##@+.",
+".....++@##$$&&#@++...+@#===*******%##++.+@#%;;;-******;==#@.@@#==;**;;;**-*-$$@.+@#===******-;;;%#@.@@#===**;;;**;==#@@.+@#===****-;;==&#@+.+@#==;**;;;-****=&#.@@#%;;;-******&%%@@...+@#$%;;-**%#@+.....+@#&==;;*****$#@+...+@#%&=;;&=&*-==&#@......+##%*-*$$@++...@#&=************==#.@#&=***;;;;;**&%%@@.@@#==;**;;;**;==#@+.",
+".....+++@##$%%#@++..+@@#=;;*******%$#@+.+@#%;;;-****-*;;=$#.@#$=;;*-;;;-*-*-%$@.@#$=;;*-***-*;*;$#@.@#$=;;*-;;;-*;;=$#@.+@#&=;**-**;;;==#@+.@#$=;;**;;;-*-**=&#.+@$$;;**-***-*=&&#@...+@#$%;;*-*%#@@.....+@#&==;;*****$#@+..++@#%%&;*&&=*-==&#@.....++@#%***%#@++...@#&=*-*-***-*-**==#.@#&=*-*;;;;;-*=&&#@.@#$=;;*-;;;-*;;=$#@.",
+".......++@@@%%@@+....@@$==;*******%$$@+.+@#%;;;*-*****;;;$#.@#$=;;*-;;;**--*%$@.@#$=;;******-;;;%#@.@#$=;;***;;**;;=$#@.+@#&==***--;;=&&#@+.@#$==;-**;;-*-**=&#.+@#%;;;*******=&&$@...+@#$%;;-*-$$@++...++@#&==;;*****$#@++..++#%&&;;==&-*==&#@....+.+##$***$$@@....@#&=***-*-***-**==$.@#&=*-**;*;;**=&&$@.@#$=;;**;;;**;;=$#@.",
+"........++@@@@@++...++#$%&&=====**&%%@@.+@#$;;*;;%%%&&***%$.@$%***=&&%%&&*-*%$#.@$%***&=%%&;;;;;$#@.@$%**-&=%&&=&***%$@.++@#$%==;;;%%$$#@@+.@$%***=&%%&;;;;;%$#.+@#%;;;;;%&%==;;;$#....@@#$$%***%#@++....++@##$%%%&&**%#@++.++@#%&&*****==%$#@@.....++@$%*-*%#@@....@#$%;;;==;;;=;==;=$.@#$%;;;;;&%&==;;;$#.@$%***==%%&&&***%$@.",
+"..........++++++.....@@$%%&=====**&%%#+.+@#%;;;;;%%%&&-**%$.@$%***&&$%$&&*-*%#@.@$%**-&&%%%;;;;;%#@.@$%***=&&%&&=*-*%$@.++@#$$&=;;;%$##@@+..@$%***=&%$%;;*;;$#@.+@#%;;;;;%%%==;;;$#....++@#$%-**%##+......++@@##$%%%**$$@+...+@#$&=***-*=&$$#@+......@@#$***$$@+....@@#%;;;===;=;;==;=$.@@#%;;;;;%%%==;;;$#.@$%*-*&&%$%&&-**%$#.",
+"...........++....+..+@#$;;;**;;;--&&%@@.+@#%;;;&&%$%%%***%$.@$%*-*%$$##$$%&%$#@.@$%***%%$$%&=;;;$$@.#$%---****-**--*%$#.+.+@#$===;=$$#@+++..#$%***==%%%;;;;;%#@.+@#$;;*&&$$%%&;;;$#....++@#$%***%#@@......+++@@@#$%%**%#@@...+@#%&&*--*-&%$#@++......+@$%*-*%#@@....+@$$;*;===;;====;=$.@@$$;;;=&$$%%=;;;$#.@$%***%$$$$%%***%$@.",
+".............+......+@#$;;;*-;*;**&&%#@.@@#$;;;&&$$$$%***%$.#$%***%$$###$%%%$@@.#$%***%%$$$&=;;;$#@.#$%-*-**-*-***--%$@..++@#$===;=$#@++....@#%*-*==%%&;*;;;$#@.+@#%;;;&&$$$&=;;;$#.....+@##%***%$@+++........++@#%%**$#@+..++@#%%=**-**&%$#@++.....+@##$***%$@+++..@@#%;;;&==;=;===;=$.+@#%;;;&&$$$&&;;;$#.#$%***%$$##$%***%$#.",
+"....................+@#%;;***;;;--&&%#@.+@$$;;*&&%$$%%***%$.@$%***%$$####%$%##@.#$%***%$$$%&&;*;%#@.#$%-*-*****-*-*-%$#..++@#$==;==%#@@++.+.@#$===*******;*;$#@.+@#%;;;&&$$$%&;;;%#.....+@#$$*-*$$#@+.+......+.@@#$%**$$@++..+@#%&&**-*-&%$##++...+.+@@$%***$$#@+.+.+@#%;;;==;=;====;=$.+@$$;;;&&$$$&&;;;%#.@$%***%$$$$$%***%$#.",
+"....................@@$%***&&&&&**&&%#@.@@$%;;;;;%$%&=*-*%$.#$%*-*=&$###$%%%$#@.@$%*-*==%%%;;;;;%##.@$%***;;=&&&==;=%#@..++@#$===;=$$#@+++..@@#&==*-*-*-*;;;%#@.@@#%;;;&%$$$%=;;;%#.+.+++@#$%***%$#@@+.....+.++@#$$%**$#@++.++@#%&=;;=;=**%$#@+..+.+@@#$%*-*%$#@@+..@@#%;;;&&;=;;===;;$.@@$%;;;&&$$$&=;;;%#.@$%*-*=&$$$&=-**%$@.",
+"....................@@$%***%&%&%**&&%$@.@@$$;;;;;%%%==***%$.@$%***=&%$$$$&&%%$@.@$%**-&&%%%;;;;;$$@.#$%*-*==&=&=&;==$$@..+@##%==;=;%$##@@+..+@##%%&&&&&==;;;$#@.@@$$;;;&&$$$&&;;;%$...+@@#$$%-**%$$#@@+..+.+@@@@#$%&**$$@+..+@@#%&=;*=;;**%%$#@...+@@#$$%*-*%$$#@@+.@##%;;*&=;;=====;=%.+@$$;;*&&$$$&&;;;%$.@$%**-==%%%&=***%$@.",
+"....................@@$%***%&%&&**=&&##.@#$%;;*;;&%%==*-*$$.@#%***==%%%%%&&&%%@.@$$***==%%&;*;;;%$#.@#%**-;;&&&=&;;=$#@.+@@#$%===;=%%$$#@++.++@@#$&&&&&==;;;$#@.@#$%;;;&%%%%%=;;;$$.++@@#$$%%*-*%%$$#@+..+++@##$$%%&**$#@++..@#$&&=;;;=;**&%%$#..++@#$$%%***%%$$#@+.+#$%;;;=&=;;;===;;$.@#$%;;;&&%$%&=;;;$$.@#%***==%%%==*-*$$@.",
+"....................+@$%*-******-****$#.@@&=***-*-**-*===$#.@#$===**********&&#.@#$==;********-*=%#.@#$===*-*-******%#@.+@#&=;*-*-***==&#@+..++#$$&&===;;;;=$@@.@#&=--*-*%%%**-*-&&..+@@&==*-*--**==&#@...@@$%%&&=;;;;$#@+..+@#$***;;%&%--***&%..+@@&==-*---**==&#@.@#%=*-*;;;==-*;=*-&.@#&&*-***%%%**--*=&.@#$===*******===$#@.",
+"....................+@#$**-*-*-**-***$#.@#%=-*-*******==&#@.@@#&==-******-**&%@.@@#&==*-*-*-**-*&&#.+@#&==*****-****$#@.+@#&=;**-*-**==&@@+..+@@$%&====;;;==#@@.@@&&*-***%%%***-*&&..+@#&=;**-*-**==&@@.++@#%%&&=;;;;;$@@++.+@#$***=;%%%-*-**&&.++@#&=;**-*-**==&@@.@#&=*-*;;=;=**=;**&.@#&=**-**%%%***-*&&.@@#&==**-*-*-==&#@+.",
+"....................+@@#%%%&&&&&%&&%%##.@@$%%&&&%&&&&%%$##@.+@##$$%%&%&&%&%%$#@.+@##$$&%&&&&&&&%%#@.+@##$$&%&&&&%%%$#@@.+@#$%%&&&&&&&%%$@@+.+@#$%;;;;;;;;%$##@+.@#$%&&&&%$$$&&&&%%$..+@@$$%%&&&&&&%%$@@..+@#&==;;;;;%%#@++..+@##&%&%%$$$&%&&&$$..+@@$$%&%&&&&&%%$@@.+@$%&&&%%%%&&&%%&&%.@@$%&&&&&$$%&&&&%%$.+@##$$%&%&%&%%$##@+.",
+".....................@@@$$%$%%%%%%%%$#@.+@#$$%%%%%%$%%##@@+.++@@##%%%%%%%$$$#@@.++@@#$$%%%%%$%%%$#@.++@@##%%%%%%%$$$@@+.++@$$%%%&&%%%$$#@+..+@#$%;;;;;*=;$$#@+..+@#$%&%%%$#$%%%%%$#..++@#$$%%%%%%%$$#@+..+@#&==;;;;;%$#@+....+@#%%%$$$##%%%%%$#.+.@@#$$%%%%%%%$$#@+.@@#$%%%%%%$%%%%%%%$.+@#$$%%%%$##%%%%%$#.+++###%%%%%%%##@@++.",
+".....................++@##$$$$$$$$$$#@+.+@##$$$#$$$$$##@@++..++@@@#$$$$$$$##@@+..++@@@$$$$$$$$$$##@..++@@@#$$$$$$##@@++.++@##$$$%%%$$###@+..++#$%=;;;;;=&$#@+++.+@##$$%$##@@$$$$$##..++@###$$$$$$$###@+.++@@&==;;;;=$#@++...+++@$$$##@@##$%$$##...+@@##$$$$$$$###@+.+@@#$%$$#$#$$$##$$#.++##$$$$$#@#$$$$###..++@@##$$$$$##@@++..",
+"......................+++@@@@@#@#@@@@++..++@@@@#@@@@@@+++......+@@@@@@@@@@@@++.....+++@@@@@@@@@@@++....+@@@@@@@@@@@@+....++@@@@@@@#@@@@++.+.++@@#$$$$$$$#@@++....++@#@@@@@@@@@@@@@+....++@@@@@#@@@@@++...+@@##$$$$$##@@.+.....++@@@@@+@@@@@#@@+....+@@@@@@#@@@@@++..++@@@@@@@@@@@#@@@@@..++@@@@@@@@@@@@@@@+....+.@@@@@@@@@++....",
+".......................++++@+@@+@@++++....+++++@+@@++++.+........+++@+@@++++.+.....+.+++@+@@+@+++++......+++@+@++++.+.+..++++@@@@@@@@+++.....++@@@######@@++.....++++@@+++++@@+++++....+.++@+@+@+++++.....++@@#####@@+++.....++++@++++.+@+@++++.....+++@@+@@+++++...+.++@@@++++@++@@+++..++++@@++++++@+@+++....+.+++@++++.......",
+"......................................................................................................................................................................................................................................++++++..........+.+++++++........+.++++++.................................................",
+"....................................................................................+.+..+........................................................................................................................................++++@@@@++.+.........++@@@++........+.++@@@@++.+..............................................",
+"....................................................................................+.++++.........................................................................................................................................+@@@$$#@@+........+++@#$$@@++......+.@@@$$@@@++..............................................",
+".................................................................................+.+++@@@++++....................................................................................................................................++@@##%%#@@++........+@#$%$#@+........+@##%%##@@++.............................................",
+"..................................................+..............................+.+@@@#@@+++....................................................................................................................................+@##$$%%##@.+......++@@$%%%#@@+.......+@@#%&$$##@++............................................",
+".....+.+...+................+.++.+.+.+......+.+..+...................+.+..+.......+@#$$&&#@++.+.........++......+...........+..+..+...+...+.......+...+.....+.......+.++...+.+.+.......+..+.....+....+.......+.+.++.+.+.+.......+@@#====&#@++........+@#$***$#@+.......+@@#&====#@++............................................",
+"..++++++++++++++........++++++++++++++.....++++++++++++++........++++++++++++.+.++@@$%%&=##@@+++......++++++..+.++++......+++++++++++++++++..++++++++.+.++++++..+.++++++++++++++....+.++++++++.+++++++.....+.++++++++++++.......+@#$=;;&&#@++.+......+@#$***$#@++.......+@#&&;;=$#@++...........................................",
+"+++@@@@@@@@@@@+++++...++++@@@@@@@@@+@++...+++@@@@@@@@@@+++.....+.+++@@@@@@+@++...+@#%%&;;$$#@@+++.+.++@+@@+++++@@@@++++.+++@@@@@@+@+@@@@@@+..+++@@@@+++++@@@@@+..+++@@@@+@+@@@@@+++.+++@@@@+++++@@@@@++...+++@@@@@@@@@@@+++....++@#$***%$#@+........++@#%***%#@+.......++@#$%***$#@+............................................",
+"++@@####$#####@@+++.+.++@@##########@@+.++@@@##@#@#####@@++....++@@@#######@@@+.++@#%&&;;%$$##@@++..@@@#@#@@@+@@@#@@@++.++@@#####@#@#####@@.+@@@###@@@@@@@##@#@.+@@#####@#@####@@++.@@@##@#@@@@@@##@@@@...+@@@####$####@@@+.....+@#%***%##@+........++@#%*-*$$@@.......+++##%***%#@++..........+.+..............................",
+"+@#$$$%$$$%$$$##@@+..+@@##$$$%$%$%$$$#@.+@@#$$$$$$$$$$$##@+....+@@#$$$%$$$$$#@@.+@#$&&=;;%%%$$#@@++.@##$$$##@###$$$#@@+.+@#$$$$$$$#$$$$$$$#.+@##$$$$#####$$$$##.+@##$$$$$#$$$$$$#@+.@##$$$$##@##$$$$$#@.++@@#$$$%$%$%$$$#@@....++##$***%$@++........++##$***%#@++........@@#%***%#@+.........++.+++++++.+.+.....................",
+"@#%&***;;***;;%%$@@.+@@$%%;;***;=***&&#.+@#&==**&&&**;;=#@+..+++#$$=;***;====#@.+@#$***-******%$#++.#&&***$$##$**===#@+.@#%&*****%%%*****&%.@#&&***==$$$=&***&&.@#$*****%%%*****$#@.#&&***=&$#$&=***&%#.++@#==;*******===#@...+.@#$%*-*%##++........++@$%***%#@@.........+@$$-*-$$#++.....++++@@@@+@++@++++.....................",
+"@#&=***;;***;;&%%#@.+@#%%&;;***;;***&&#.@@#==;**==&**;;=$#@...@@#$%;;***;;;==$@.+@$%**-*-*****%$#@+.#&&***%%$$$**;==$@@.@#&=*****%&%*****=&.@#&=***==%$%==***=&.@#$*****%&%*****$#@.#&&***==$$$==***=&#..@##==;*******;==#@....+@#$%***%#@+..........@@#$***$$@++........@@#%***%$#@++....++@@@#@##@##@#@@+.....................",
+"@#&=***;;***;;=&%$@.@#$%&&;;***;;***=&#.+@#==;**===**;;;$#@.++@#$%%;;***;;;;=$#.+@#%***-******%$#@..#&=***%%$$$**;;=$#@.@#&=*****&&&*****=&.@#&=***;=%%%;;***=&.@#$*****&&&*****$#@.#&=***==%%%==***=&#.++#$=;;*******;==#@....+@#%%-**%##++.........@@$%*-*%#@@.........+@#%*-*&%#@++..++@@##$$$$$$#$$###@.....................",
+"@#$%***-*=&=;;***$#.@#$***;;=&=*-***%$#.@@#%%&*****=&;==$#@..+@#==;**==&;;;;;$@.+@#$==;;;=&&&%##@++.#%%***&%$$$&=;;;$#@.@#$%***==%&%;=***%$.@#%&*-*&&;;;&&***&%.@@$&&=**&&&**=&&$@@.#$%***==%%%=;***%$@.+@##;;;==;=;*-&&%#@...++@#=;***%#@+.........++@#$***$$@++.......+@@$$***;=##++...+@#%&&**===%%;;=##.....................",
+"+@$%;;;==%%%%%***%$.#$%***&%%%%==;;;%$@.+@@$%&*-*-*&&===##+..+@#=;;**&=&;;;;=$#.+@@$&==;;=&%%%#@@+..#$%***&%$$$==;;;$#@.+#$%***==&%&==-**%$.@#%&***&&;;;=&-**%%.@@#%&=**&%&**=&%#@+.@#$&==**%%%**==&$#@..+@$=;;;===;*-&%%#@...+@@$==***$$@++........++@$%*-*%#@++........+@#%***;=##++..+@@$%&&**===%%;;;$#.....................",
+"+@#$;;;==$%$%&*-*%$.@$%-*-%%%$%&=;;;%#@.++@#$%**&&%%$$$##@+.++@#%&&*****&=&&%#@.++@#%&=;;%%$##@@+.+.@#%;;;&%$$$&&;;;$#@.+@#$&==;;%%%;;==&$#.@##%;;;==--*&=;;;%$..@@#$$==***=&%$#@@+.+@$&&=**&%%**=&&##+.+@@#%%&&&--*==%$#@+....@@#=;***%#@+..........@@#$***$$@@........++##$***;=#@++..+@#$***==**-**;==$#.....................",
+"+@#%;;;==%%%%&***%$.#$%***%%%%%=;;;;$#@.++@#$%**&&%$##@@@++.++@#%&=**-**=&&&%$@.++@#%&=;;%$##@@++.+.@$$;;;&%##$%&;;;%#@.++@$%&=;;%%%;;&&%$@.+@$$;;*==*-*==;;;$#..+@#$$&=*-*=&%##@++.+@@$%%*-=&=**&%$@@+..+@@$%%&&***=&$$#@+....+@#%%***%##+.+........@@$%*-*%#@@........++@$$***%%#@++..+@$%***==***-*;;=$@.....................",
+"+@#%;;;-*=&=;;***$$.@$$***;;=&=*-;;;%#@..+@@#%**&%%##@@@++..++@#%&&*****==&&%##.++@#%&&;;%$##@@@++..@#%;;;&%$$$&&;;;$$@..@@#%&&;;%&%;;=&%#@.+@#%;;;==-*-=&*;;$$.++@@#%&=***=&$$@@+....+@#$==*--==$#@+....+@#$%%&&--*=&%##@+.....+@#%-**%#@++.........@@#$***$$@+.........@@#%*-*$$@++...+@#$-**==-****===#@.....................",
+"+@#%;;;-*===;****$#.@#$***;;===-*;;;%#@..+@#$%**&%%##@@+++..++@#%%&&=;=;**;;=$#.++@@%&&;;%$$###@@@+.@#$;;;&&$$$&&;;;%#@..+@@$%%**&&%**%$#@@.+@#$;;;;;*****;;;$#..+@#$$==***==%##@++..++@#$==-*-==##@++...+@@$%%**;=;&%&%$@@....++##%***%##++.........+@$$*-*%##++........+##%***%#@++...+@@#%%%$$%%%&&%$$#@.....................",
+"+@#%;;;;;***;=&%%#@.+@#%%&;;;;;;;;;;$$@.+@@#$%**&%%$#@@++....@##%&&&&;=;**;;;$#..+@@%%=;;%%$$$$##@+.@#%;;;&&%%%&&*;;%$@...+@#$%**&&&**$$@@+.+@#$;;;*;*****;;;$#.+@@#$%==-**==%$#@@+...+@@$&&*-*%%#@+....++@#$%&**=;=&%&%%#@....++@#$*-*$$@++........+@@#%***%#@+........+@@$$-**$$@@.....+@@$$$$$$$$$%$$#@+.....................",
+"+@#%;;*;;***;=%$$@@.+@@$%%;;;;;;;;;;%#@.+@#%&&-*==&&%##@++...@@$;;;;;=====***%#..+@@$%&*-==&;;=&&#@.@#$;;;;;&&&;;***%%@..+++@#$==**-==$#@++.+@#$&==*-&&&--==&$@.+@#&&=**&&&**==&#@+..+@@#$==;;;$$@+++....+@$==;**=====;;=$@....++@$$***%##@+.........+@#%***$#@@+........+@$$**-$$@++....++@@@@@@#@##@@@@++.....................",
+"+##%;;;&=%%%$$$#@@+..+@@#$$%%%&==*;;$$@.+@#&&=**==&&&$#@+++.+@#$;;;*;===;=--*%$..++@$%&**===;;==&#@.@@#=;;;;&==;;***%%#....+@#$==-**;=$#@+...+@#&&=-*&&&**=&&#@.+##&==**&&&**==&#@@.++@#$%=;;;=%##+.....+@##=;;-*====;;;;$#.....@@#$***%%@@++.......++@#$;;;%#@+.......++@#$%***$#@+......+++@@+@+@@@@@+++......................",
+"+@$%;;;==%%$$#@@@++.+++@@@#$$%%&&;;;%##.@@$&&=*-===&&$$#++..++@$;;;;;=====*-*$#..++@#$%**===;;==&#@.+@#==;;*&=&;;***&$#...++@@$==***==#@@+..++@#%&&**%%&-*&&%#@.@@$===-*&%&**===$@@.+@#$%%;=;;;$#@++....++@$==;**====;;;=$#.....+@#%***%$#@++.......++@#$=;=$#@+.......++@#%%***$#@++.........+.+.+.+.+..+......................",
+"@@$%;;;=&%$$#@@+++.....++@@#$$%==;;;%$@.@#$*****;;;**%$#@++.+@@#==;=;*****&&%$#...+@@#$&&***;;&%$@@.+@##$%;;***;;***&%@.....+@#$%;;;%$#@+....+@@$%%==%%$==%%$@@.@#$***;;&%&*****$#@.@##***-****$#@++....+@@#===*******===#@....++@@$***%%#@++........++@#===#@+++.....+.@@#%%***$#@+.......+.......+.+..........................",
+"@#&=--***=&&#@++.......+.+@#%=&**-*-&&#.+##*****;;;**$$#++...+@#&&===*****%%%#@....+@@#%&***==%$$@+.++@##$=;***==***%%@.....++@#$;==$$@@++...++@#$%&&$#$&&%$$@+.+##***;=%%%*****##+.@#$***---**$#@+......+@#&==*******==&#@.....+@@#%%%==$#@++.......++@##$##@+.......++@##==&%%#@@+............................................",
+"@@&&**-**=&%@@+.........++@#%&=**-**=%#.+@##$$$$$$$$##@@+.+.++@@##$$$$$$$$$#@@+...+++@@##$$$$###@@+..++@##$$$%$$$$$$##@.....++@@##$##@@+......+@@@#########@@++.+@##$$$$$##$$$$##@+.+@#%&&&&&&%$@@+.....++@@##$$%$%$$$$##@@......+@@$$%&&##@+.........++@@@@@+++.......+@##&&%$$@@+.............................................",
+"@#$%&&&&&%$$@++..........++@$$%&&&&&%$@.++@@##$#$####@@++.....+@@@@########@@@......++@@@####@@@++....+++@@####$####@@+......++@@@#@@@+........++@@@@+@@@@@++++.++@@###@#@#@###@@@+.+@#$%%%&%%%#@+........+@@@######$###@@+.......+@@####@@+++........+.+@++++.........++@@####@@++.+...........................................",
+"+@#$%%&&%$$#@+++.........++@#$$&%&&%$#@..++@@@@@@@@@@++.......+++@@@@@@@@@@++.+......+++@+@@@@+++.......++@@@@@@@@@@@++.......+++@+@++.+........+.+++++.+++++...+++@@@@@@+@@@@@@++..+@@$%%%%%$$@@++........++@@@@@@@@@@++++......++++@@@@@++...........+..++............++@@@@@+++..............................................",
+"+@##%$%$%##@@+...........+++@##$%$$$$#@..+.++++++++++.+........+..++++@++.+.+.........+.++++++..+.......+..++++++++............+.+.+..................+...+......+..+.++.+.++.++.+....@@@@#@#@@@+..........+..++++++++++..........++.+++++...............................+++++++................................................",
+"+++++++++++++++...............................+.++.+.+...............+..+................................+.+....+.+...........++.++..............+.+++++++++................................+.+.+................+..+...........................................................................+.+.............................",
+"+++++++++++++++................................+++@+++..............++++++++...........................++++++.+.+++++.+........+@+++++...........++@@@@@@@+++.+...............+.........+.++++++++.+...........++.+++.........................................................................++++++++..............+..+........",
+"+++++++$$+$$$@@+.............................+++@@@@@+++........++++@@@@@++++.......................++++@@@@@+@+@+@@@++.....+++@@@@@++........+++@@@######@@@++........+.++.+.+.........+.++@+@@++++........+.++++@+++++....................................................................+++++@@@+++++........++++++++++.....",
+"@++++$$%%%%$$%$$+...........................+.+@##$##@++.......+.+@@@@###@@++........+.+....+.+.+....++@#####@@@@###@@+......+@##$#@@++......+.+@@#$$$$$$$$#@@+......+++++++++++.+.....++@@@@##@#@@++++......++@@@@@@@+++..................................................................+++@@#@#@#@@+++......+++@@@@@@++++...",
+"@++$%%%===%$$%%%%...........................++@##===$#@++......++@@$$%%%%%#@@++...++++++++..++++++..++@#%%%%%$#$%%%%$#@....+++@#===$@@+......++@@#&&*****==&#@+....+.++@+@+@@@@+++...+++@@#$$%%%$$#@@++....+.+@#$$%%##@++................................................................+++@@#$$%%%$$#@@++...+.+@@@#####@@++...",
+"@++%%=********=%%+............+.............+@@$$;;;$##@+++...+++##$%%&&%%##@+.....++@+@+++@+@+@+++.+@##&=&&%%$$%%&&%$@.....+@#$;;=$#@+.......@@#$==*****===#@@...+.++@@#@@@@@#@@+..+.+@##$%%%&%%$$$@@+.....+@@$$%%%%$#@++................................................................+@##$%%%&%%$$##@+....+@@#$$$$$$#@@+++.",
+"##$%=**********=%$.........+..+...........+++@#%&***&%##@++...+@@$$*******%$#@+.+++@####@@@@@####@+.+@#%***-*%&&*-***$$.....+@#$***$#@++....++@$%%**====;;;;$#+...++@##$%&##$==#@++.++@@%%&*******&%%#@...+++@#&==&=**$@@++.........+...+..........+.+..+.++............................++@@%%&*******&%%#@....+@#==*****$$#@.+.",
+"@##%=******-*-*=%$+.......+.+++++.+......+.@@#$&&-**&%$##++...+@#$%*******%%#@+..+@@$$$$$#$#$#%$$@+.+@$$-*-*-&%&-*--*%#....+@@#%***%#@+.....+@@$%&**=====;;;##@....++##$&&#$#==#@++.+@@#&&=*******=&&#@....+@#$==&=&**$#@+.......+.+.+.++++++++...++++++++++++++.+......................+@@#&&=*******=&%#@...+@@#==*****%$#@+..",
+"@@$$**---*******%%+.......+.++@++++......++@#$$&&*-*&&%$#@+.+.+@#$%*****-*%$#@+..+@#$%%%$%$%$%%%$#@.+@#%*-**-&&&*-*-*%#.....+@$$*-*$$@@.....+@#$%&-*===;=;;;#@@....++#$$%&##$==#@++.+@#$&&=*******=&&$#..+++@#$=====**$#@++......++@+@++@+@++++.++++@@@@@@@@@@@@+++............+........+@#$&&=*******==&$#....@@#=;*****%$#@+..",
+"+@#%*****-----**%$........+@@@##@+++....++@#%&=*****-*&%$@+..+@@%%&**&%%%%$##++.++##==;*******;==##.+@#$&&=**%&%**=&&$#....++@#%***%#@++....@@#&&=*-===%&&%%$@+...++@@##$$###$$#@+..@@$%***;;***;;***$$...+@#$$;;;;;**$$@++....+++@@#@#@@#@#@@+.++@####$#$#$###@@++.........+.+..+..+...+##%*****-**;;***%$...++@#%%%&&&&$##+++.",
+"+@$$******----**%%+.....+.+@###$#@+++...++@#&&=*-****-%%$@@..+@#%&&**%%%%$$#@++.+@#$=;;*******;;=$#.++@#&&=**&%&**=&&#@....++@#%***%#@++....@#$&==*-===&%&&%#@+.....+@@@##@@#$#@@++.@#$%***;;*-*;;***%$...+@#$%=;;;;**%##++....+@@##$#$$#$$###@.+@##$$%$%$%$%$$$#@+...+++++++++++++++...@#$%********;;***%$....+@@$%%%%$%##@++..",
+"+@#%***-**-*-***%$.......++@$%%%$@++....+@#$=;;==%%%;;&%$@+.++@#%%=;;%$$##@@++..++#$=;;;;===;;;;=$#..+@#$%%**===**%%$#@....++##$-**$$@+.....@#$***==***;;&%%#@+.....++@@@@@+@@@++...@#&=;;;-*===;;;===&..++@$%&;;&&&**%$#@+..++@@#%&===%%;=;%%@.@#$*************$#@...+++@@@@@@@@@@@++..@#&===;**===**====&.....+@@@#####@@++.+.",
+".@#%************%+......++@@%%%&%#+++...+@#$;;;==%%%==%%$@+..+@#&&&;;&%$##@@+...+@#$=;;;;&&=;;;;=$#.+.+@#%%**===**%%#@@....++@#$***$#@@+....@$%***;=-*-;;&&%##+........++.++++++..+.@#&=;;;**===;;=;==&..+@@%%&;;=&=**%$#@+..+@@#$==;=;%%;;;&%#.@#$*************$$@.+++@@#####$####@@@+.@#&====-*===*-=;==&.....++@@@@@@++++....",
+".@#%***-**-*-*-*%+.......+@@%&&%%#@+....+@#$;;;=&%%%==%$#@+.+@##&&=;;%%%$#@+++..+@#$;=;;;===;;;;;$#..++@#$%**===**%$$@+.....+@#$*-*%#@+.....@$%***=;**-;;&&%$@@...........+...+.....#$&=;;;-*===;;====&.+.@@$%&;;&&&-*%$#@+.+@@#$$==;;;&&;;;&%@.@#$*************%$@..+@##$$$%$$%$$$##@+.#$===;=**===**====&.........+++++++.....",
+"+@#%*****----***%$.......+@#$$%%%#@++...+@#$;;;=&%$%%$$#@@+.+@#$***-****%%@++...+@#$;;;&&%&%==;;;$#..++@#$%=;---;;%$#@+....++@#$&&&$#@++....@#%**-;;===;;***%#@........+............@$=;=;;**%%%=====;=...+@$%%;;;;;;;&%$@+.+@#%&&**&&&;;;;;$$@.+@#%%&&&&&&=&***%$#.+@@&&=**********##+.@#=;===-*;;;;;===;=.....................",
+".@$$****-*******%$......++@#$%%%%#@++...+@#%;;;&&%%%$%$#@@+.+@#$*-*-****&%@@++..+@#$;;;==%&%==;;;$#....@@#$;;*-*;;%$#@+.....+@#$&&&$#@+.....@#$***;;&=&;;-**%$@.....................##=;;;;**&&%&====;=.++@@$$%;;;;;;;%%$@+.@@$&==-*&=&;;;;;$#@.@@#$%%%%%%&&=***%$@.+@@&&=**********$#@.#$=====*-;*;;;===;=............+........",
+"+##%*-*****--***%@.......+@#&====##++...+@#$=;;;;&&&==%$#@+.+@#$&&&*-==&$$#@++..+@#$;;;;;&=&;;;;=$#..+.@#$%==-*-==%$#@+.....+@#$;;;$#@++....+@@$%&;;-**;=-**%$@.....................@#%&**********;;;&%..++@$%&*******%%$@+.@#$***=;===*-&&%$#@.++@@####$#$$%***%$#.+@@$%%&&&&&&&&&%#@+.@#&&;;;-*===;;;;;&%.....................",
+"+##%***---******%@......+@@$&====$@@++..++#$=;;;;&&&;;%%#@+..@@$%==**&=&%$#@@++.+@#$=;;;;===;;;;;$#...+@#$%=;*-*;=%$#@+....++@#$;;;$#@+.....+@##$%%%=&=*-;;;$#@.....................@#%&**-**-*-**;;;&%..++@#%%*******%%$@+.+#$***=====**&&%$@@..+++@@@@@##$%***%$@..@@$$%%%&&&&&%%$#@+.@#%&;;;**===;*;;;&%.....................",
+"+##%*----***--**$#......+@#$**-*-$$@+...++@#==;;;==&;=%$#@+.+@@$%&=*-==&%$##@@+.+@#$=;;;;&==;;;;=$#...+@#$%==-*-=;%$#@+....++@#$;;;$#@++....+@##$%%%&&=*-;;;$#@.....................@#%%*********-;;;&%..++@#$%*******%$$@+.@#$**-=;===-*=&%$#@..++++++++@@#$***$$@..+@##$%%$%$%%$$$@@+.@#%&;;***===;;;*;&%.....................",
+"@+$%**-*****-***%$......+@#%***-*%#@@....+@#$%%;;-*-;;%$#@+..@#$&==**%%%%$%$$@@..@@$==;*****-*;==$@...+@#$%=&-*-&&%$#@+.....+@$$***%#@+.....+@#&==&&%&%**=&&##+.....................+@#%=;;;;;;=*;;;=$#...+@#$$%&&=&&&$$@@+.@@#&&=**=&=;;;;;$#@......+++++@@#%%%$@@..++@@@@@######@@@+..+@#$=;;**===**;;=$#.....................",
+"@+%%******-*****%$......+@$$***-*%##+...+++@#$%;;-*-;;$#@@+.+@#$&==-*&%%%%%%%#@.++@$===*******;==#@...+@#$%&&*-*=&%$#@+....++@#%***$$@@.+...+@$&==&&%%&**&&%#@+.....................+@##=;;;;;;;;;;;=$#..+.+@##%%&%&%$##@++.+@#%&&**=&=;;;;;$#@..........++@@$$$#@+..+.++@@@@@@+@@@++...+@#$==;**===**;==$#.....................",
+"#+$%=**********=$$.....++@#%*-*-*%#@@.....+@@##%%***%$$@@+..+@$$*-**-********%#.++@#%%%%%%$%$%%%%#@..++@#%%**-*-**%%$@+.....+##$***%#@++....@@$==;&&%&%**&%$#@+.....................++@#$%&==***;;%%$#@...+++@@@######@@++..+@@#$%==;;;&&;;;&%#...........+@@@@@@++...+++.+.+.+++++.....++@#$%%==***=;%%$#@.....................",
+"#+%%==********=%%#......@@#$***-*$$@++.....++@#$%*-*%$#@++..+@#%*-*-******-**$#.++@@$$%$$$#$#$$$$@@..++@$$&**--***%$$@+.....+@$%*-*$$@+.....@##;;;*******%$$@++.....................+++@#$%&=***==%$#@@....+.+@@@@@@@@+++.+..+@@#$&==;=&%;;;&%#............++@@+++........+.+......+....++@@#$%==***;=%$#@@.....................",
+"@+$%%%%&&%%&&%%%##......+@#$*-*-*$#@++......+@@#$***$#@++...+@#$**-*-********$#...+@#####@#@#@$##@+...+@#$%***--**%$#@+....++@#$***%#@++....+@$=;;*-*****$$@@+.......................++@##$&&***=&$##@+.....++.+++@+++++.....++@@#&&===%%;;;%$@.............+.+.+.........................+@##$&=***=&$$#@+.....................",
+"@++$$%%$$%%$$%$+#@......+@#$==;==$#@+........+@@#%%%##@+....+@#$%&&&&&&&=&&%%$@...++@@@@@+@++@@@+++..++@##$%&&&&&%$$#++....++@#$***$#@+.....+@#%%&==&&&%%##@++.........................++@##$$$$$##@@+.........++.+............+@@##$$#$#$#$##@...............+............................+@@@#$$$$$##@+++.....................",
+"+#####$##$#$$###@+.....+++@#&&===$@@++.......++@#$%$#@+.+...++@#$%%%%&%&%&%%$#@.....++++++.++.+++.....++@##%%%%%%%##@++.....+@#$***$#@++....+@@$%%&&&&%$##@++........................+..++@@@####@@++...........................+@@@@@#@#@#@@@+.............................................++@@@####@@++.......................",
+"+@@@@@@@@@@@@@@+++.......@@#&&=&&#@++........+.+@@@@@++......++@@##########@@@+...+......+......+......++@@@######@@++.....++@@$%%%$@@+.....++@#$$%%%%$$#@++............................+.+@@@@@@+@.+............................++@@@@+@+@@+++.............................................+++@@@+@@++++.......................",
+".........................++@#####@@+...........+++@+++........++@@@@#@#@@@@@+++......+................+.++@@@@@@@@+++.+......+@#%%$#@+.......++@@@@#@#@@++...................................+..++.+..............................+....++++.++...................................................+++.++.........................",
+"........................+.++@@#@@@+.............+.++..+.......+.++++++++@++++..............................++++++++.........+++@#$$@+++......+.+@@@@@@++++.+.................................+......................................+.....+........................................................+............................",
+"......++++++++................................+++++++++..........++++++++..................+................................+++++@+@@@+@++.................................................+.++++...............................................++@@@@@@@+..........+@@@@@@++...........++@@#@#@@@++............................",
+"....+++@@@@@+++...............+.............+++@@@@@@++........+++@@@@@@+++...............+.+................................+@@@@#@#@#@@@+..............................................++++@+@++.............++++.+...........................+@@##$##@+++........@@##$##@+++.....+...+@#$#$$##@@+++.++.......................",
+"....+@@#$$$#@@++...........+..+.+...........+@@#$$$$#@@++......+@@#$$$$#@+++..........++++++++...........................+++@@@$$%%%%%%$$@@..............................................++@@###@@++.........+.+++@++++.........................+@$%===$$@++....+...@$%===$$@++..++++++.@$$=====%$#@+++.+++..........+.++.......",
+"..++@@#$%%%$#@@+...........++++++.+.......++@@#$%%%%$@@++....+++@#$%%%$$#@+++..........+++@@@+++........................+.+@@##%%%%&%&%%%#@............................................+++@@$$%$@@+.........++@@@@@#@@+++.......................@@%%===%$@@+++.++++.@%%===%$@@++++++@@+.@$%=;;;=%%$@@+++@@@.........++++++++....",
+"..++@#$$%&%%$#@@++.......+.+@@@@@++........+@#$%%&&%%##@++....+@#$%%&&%%$#@++.......+++@@@#@@@++.+......................++@##$%%&&&&&&&&%#@............................................++@##$%%%#@@+........++@##$#$##@@++......................@#%&;;;%%@@+.+++@+@.#%&;;;%%#@+++@@#@@@.@%%=;;;;%%$#@@@@@@@.......+.+@@@@@++....",
+"+++@#$;;&=&;=$#@+.+.......+@@$$$@@++......++@#=;&&=;;%$#@++...@@#=;&==;=%$#+++.......+@@$$$&%@@.+.....+...+.............+@@$==;**---*-***$#..........................................+.+@#$&=*-*$#@++.....++@@#%&===%%#@+++.....................@@%%***&%#@+++@@@##.@%%***&%#@@@@#$$=&@.@&=&===;==&##@#$%&$........+@@###@@+....",
+".+@@#$;;===;;$##@+......++@@#%$%#@@++......+@#=;===;;%$#@....++@#=;===;;%$$@+.......++@#%%%&&@@+......+++++.+..+++++....+@#$=;;***-*-****$#............................................+@##&=*-*$#@+......++@##&&;=;&&$#@++...........+.........@#%%***&%#@@@@@#$$$.#%&***&%#@@@#$$%=&#.#%&===;===&$##$$&&%........+@#===#@++...",
+"++@$%&;;%%&;;%%$@++....+.@@#$***$#@++++....@@#%&&&&;;%$#@++...@@#%&&==**%$#@++.....++@#$=;;%$#@+.....++++@++++++++@+++..@@$%-*-&&**-;;=&&$@............................................++@#$%***$$@++....++@#$%;;%&&;;%$#@+...+.++++.+.++.+.....+##%;;;&%#@@@#%%&=&.##$;;;&%###$$===%%#.@$$&&=**&&%$$%&&==$.......++@#===#@++...",
+"++@$%&;;&%&;;&%$@++..+.+@@#$$***%$#@@++...++@#%&%&&;;%##@.+...+@$%&===**%$#@++......+@#$;;=%$@+++...++@@#@#@@@@@@#@#@@+.@@$%-*-&=-**;;=&%##.........+++++..............................++@#$%*-*%#@++....++@$%%;;&&&;;%%$@+.+.+++++@++++++++....+@$$;;;&%$#@##&&&==.@$%;;;&&$##$%=;;&%#.@#%&==**&&&%$&&===$.......+@@$%&%##++...",
+".@@$%&;;&%&;;&%$@+..+.@@@#$%%-**%$$#@@+....+@#%&&&&;;%$#++...+@@#%&&==**%%#@++.....++@#$=;=$#@++....+@##$$##@@@##$$##@+.@#$%*--&&*-**;&&%#@........+++++++++............................+@#$%***$$#++.....@@$%&;;%&&;;%%$@@.++@@@#@@@@@@@@+++...@@$%;;;&&$###$&&===.@#%;;;&&$$$%%;=;%%#.##$&==-*&&&%%&====#.......+@@$%&%$@++...",
+".+@#$%;;=&=;;%$#@+..++@#$%%&&*-*&&&%$#@...++@#$%;;;&%$#@@+....+@#%%===;;&%$@++......+@#$$%%##@+.....@@%&=;=%$##$**&=&#@.+#$%-*-&=**-;;=&%#@......+.+@@@#@@++............................+@@$%*-*%##++...+.@@$%&;;&%&;;&%$@@.+@@$%$$#$$$$$#@@++..@@$%;;;&%%$$&&;=;%$.#$%;;;&&$%$;====$$#.#%=&&===;===&;;;%$#.......+@#$%&&$#@+...",
+"++@@#$;;&&&;;$##@++.+@@#%&&&&-**=&&&%#@....@@#%&;;;&&$#@+++..++##%&===;;%%$@@.+.....++@#$$#@@+......@#&=;;;%%$#$**===##.@@$%--*==-**;;&&%#@.......+@@#$##@@++............................@##%***%$@@+....++@$%&;;%&&;;&%$@+.+@#%%&$$%$%%%$#@@++.@#$$*;;&&%%%&&;;=$$.@$%;;;&&%%%;;===%$#.#&&&&==;=;;&==;=%##.....++@@#$;;;$@@++..",
+"..+@##$%&=&%$##@+...+@#$*****---*****$$...++##;;;;=;=%$#@+...+@@$**&==;;&%$@++......+++@@@@@++......@#$%***&%$$$&=;;;$#.+@#$=;;***-*;;=%%#@.....+++@$%=;=#@@+..........................++@#%&-*-&%#@+....++@$$%;;=&=;;&$$@+.+@#=;;;=&&&**%%$@@+.@#&=;;;;;===;;===%$.#==;;*;;;;;;;;;;=&#.@%%;;;;;===;;;==%#@......+@#$%;;;$#@+...",
+"..++@#$$&%&$$@@++...+@#$*******-*****$#...+@@$=;===;;%$#+++..+@##**&&=;;%%#@++........++++++........@#%&***&%$$$==;;;$#.+@#$==;**-*-;;&&%#@......+@#%%;;;$#+++..........................+@#%&*-*&%#@++...++@#$&;;===;;%$#@+.@##;;;;;&&&**&&%#@@.@#&;;;;;;===;;;==%$.#&;;;;;;;;;;;;;;==$.@$%;;;;;===;;===%$@...+++@#$&=***$#@++..",
+"...++@##%%%##@++....+@#$*****---*****$#....@@$=;=====%$#@.+...+@#**&&&;;%$#@++.........+.+.+........+#$%***&%$$$==;;;$#.+@@$==;***-**;&&%@@......+@#%%;;=$#@+.........+.++.+..........+.+@#%%*-*%%#@++...++@#$%;;=&=;;%$#@+.+##=;;;;==&-*&&&$#@.@#&&;;;;;;=;;;;==$$.#&=;;;;;;*;*;;;;==$.@$%;;;;;===;*===%$@....+@##$==***$#@++..",
+"....++@@@@@@@++.+...++@#$$%%%***%%%$$#@...++@#%%&=&&&##@++...+@@#$%&&&%%##@+........................@@$%;;;&%$$$&=;;;$#..+@##$%&=***;;&%%#@....+.++#%&***$@@++........++++++...........+@@#%&%&&&%#@@.+...+@#$$==;;;=&%$@@+.+@#$%&**;=;==-**%$@.@@#$%%%&&;;;==***%$.@#$%%&=;=;===&&&**$.@@#$%%&&***==***%$@...+@##$%==-**$#@+...",
+".....+++@@@+++......++@@##$%%*-*%%$##@@...++@@$%%&%%%#@+++....+@@#$%%&%$#@@++.......................+@#%;;;=%$$$%&;;;%#..++@@#$%&-*-;;=&%#@......+@@%%***##++.......+++@@@@@++.........+@@#%%%%%%%#@@+....+@@$%&==;===$$#@+.+@#$%%**;=;==***%%#.+@@#$$%&&;*;==-**%$.@#$$%%=;=;===&&&**#.+@@#$%%&***==-**%$#..++@#===;;&&%$#@@+..",
+".......++.++..........+@@#$$%;;;%$##@++....++@@#####@@++.......+@@@##@#@@++.........................@@#%;;;&&%%%&=;;;%#....+@##%%**-;;&%%#@......++@##$###@+.........+@@####@+++........++@@@###@@@++....++@$%&*******&%$@+.+@#$%&;;;;;&=*-*&%#.++@#$$%;;=====***%$.@@$&==;;%%%%&;;;&%$.+@@##%;;=====***%$#..+@@$=;;;;%%%$#@@++.",
+"........+.............+@@@#$%;;;%$#@@++....++++@@@@@@+++........+@@@@@@+++..........................+@#%;;;;;&&&;;***%$....++@#$%****;=%%@@.......++@@##@@+++.......+@##==&##@+.........+++@@@@@@@+++.....+@$$&**-*-**%%$@+.+@#$%%;;;;;=&*-*%%@.++@#$%%;;=====*-*&$.@##&&&;=%%$%%;;;&&#.++@#$%;;=====*-*%%@..+@#$=;;;;&%%$##@@+.",
+"....................+.+@@##%%;;;%%##@++......+++++++++.............++++++...........................@@#$;*;;;&=&;;***%$..+.+@@#$%*-*;;=&%$@........+++@+@++.......+.+@#$=;=$#@@...........+++++++++......++@#%%*******%$$@+.+@#$%&;;;;;&=***%%#..+@#$%&;;=====***%%.@#$&==;=$$$%%*;;&%#.+@##%%;;=====***%%#..+@#$;;;==%%$&=$$#@.",
+"....................+.+@$%%&&==&&%%$$@+.........+...................................................+@#%;;;;;&=&;;***%$...++@#$%&*-**;==&$@.........+.++.+.........+@#%&***%%#@++............++.....+....++@@##$$%$$$$##@++.+@$=;;;;=&&*-==&$#@..+@#&;;==;==;;*-*&%.@$%;;;%%$$$=;===&%#.+@#==;=====;;*-*&&#..+@#$;;;=&%%%==%$$@.",
+".....................@@#%%&&&=&=&&%%$@@..........+..................................................@@#$;;;*****;;***=&..++@#$%&&*-*;;;==$#.......................++@#%&*-*&%#@+...........................++@@###$###@@+++.@@$;;;;;&&&**=&&$@@.+@@#==;&=====;***=&.@$$;;;%$$$%====&&%#.@@#==;&=&=&=;*-*&&#...@#$=;;;;&&&;;&%$@.",
+"....................++@#%&&&=&=&&&&%%#@.............................................................+@#%;;**-***;;***&%..++@$%%**********$#........................+@#%&***&%#@++..........................+++@@@@@@@@@++...@@$=;;;;&&&**&%%#@+..@@#===&&=====-**&&.@$%===$$#$$=;===%%#.+@#===&&&&&==***=%#.+++#$=;;;;&&&;;&%$@.",
+"....................+@#$*************$#.............................................................@@#$;;;=&%%%$$$$$##..++@$%&***-******%#.......................+@@$&=-**&%#@+.............................+.+++@+++.+....@@#%=&%%%%%&%$##@++.++@#$%%$$$$$%%***&%.@$$$%$###$$**===**#.+@#%%%$$#$$%%***&&#..++@#==;;;&&=;;&%%@.",
+"....................++##*************##.............................................................+@#$;;;&&$$$#$###@@...+@#$%**********$#........................+@#==*-*&%@@++..............................+..+.+.......+@#%%%##$$$%$##@+++.++@@$$$##@##%%***&%.+#####@@##$**===**#.++@$$$#####$%***%%@..++@#$$%*******%$#@.",
+".....................+@##$$$$%%$%$$$##@.............................................................+@@$;;;%%@@+++.+++....+@@##$$%%%$%$$##@........................+@#$%&&&$##+.+...........................................++@@@##@#@@#@@@+++....+@@@@@@@@@###$$#@.+@@@@@@+@@##$$$$$#@..+@@@@@+@@@###$$##@...++@#$$*******$##@.",
+"....................+++@@##$####$###@@+.............................................................++@#%%%##@++............@@###########@@.......................+++@$$&&%$@@++.+..........................................+++@@@@+@+@@+++.......++@@++++++@@#@#@@..++@+++++@@@###@#@@.+.++@+++++@@@#@#@@@...++@@##$$$%$$$#@@+.",
+"......................++@@@@@@@@@@@@@++.............................................................++@#$$%#@@+...........+.+++@@@@@#@@@@++........................++@##%%%@@++................................................+.++++++.++.+..........++++++++@@@@+...+.++...++@++@@@@+..+..+++...+++@@+@++.....++@@#######@@+..",
+"......................+.++++@+@+++++++..............................................................+++@$$$@@.+...............+++@+++++++...........................++@@@@@@@+.................................................+......+.....................++..+..............+++...+.............+.+++........+.++@@@@@@@+++..",
+"...++@@@@@@+.+.............++@@@@@@++........++@@@#@@++........+++++@@@@@+++........+.+..+.+..+........+.@@####@@+++...........+.++.+.+++.+.......+.+.+.+.++.......++@@@@@@++...............+@@@#@@++.........@@@##@@++........++++++++++++........++@@@@@+++.............+.++@@@@@@+++......++@####@@+++.........+..+..+.++....",
+"...+@#$%&#@@++............++@##$&%#++.+....+.+@#$%&%#@++........+@@######@@++.+.....+.+++++++++........++@$%&&&##++..........+++@++@+@+++++.....+.+++@+@++++++.....+@@%&$##@++...........+++@@#%%##@++.....+++@#%%&##@++......+.++@@@@@@@@+++......+@##&&#@@+++...........+.+@@#&%##@++....+.+@#$===$#@+++......+.+++++++++++...",
+"+.+@@#$&&$#@++..........+++@@$$%&&#@++......+@@$$&&&##@++.....++@@#$%$$$$#@@++....++++@@@+@+@++++.....++@#$%==&$#@++.......+++@@@@@#@@@@@@+.....+++@@@@@@@@@+++...++@#&&$$$@@++.+.......+.+@@##=&$##++.....++@@$&&&$$@@++.....++@@@##@@#@@@@++...+++##$&&##@@+.+..........++@@#$&&$#@+......+@#$$===%$#@+......++@+@@++@+@+++++.",
+"..++##$==$$#@@++.........+@@#%%%&&@@+.....+++@#$%===$#@+++....+@@#$%%%%%%$#@+.+....+@@@@#@#@@@@++.....++@#%&===%#@++......+.+@#$$$$$$%$$$#@..++++@##$$$$$$###@+...++@#&=%%$#@@++.....+..++@@#$$==$##+++..+.+@##$===%$#@@+....++@@#&&$$$%&$$#@++...++##$==$$#@@++.........++@@#$$==$$#++...+++@#$%;;=%$#@@+...+.+@@@@#@@@@#@@@++.",
+"...@@#$&==&&#@+........++@@$$=;;%$#@++...+.@@#$;;;;=&%@@+...+++@$%&*****;=$#@+...++@#$$&&##$&&@@++...++@@$&=&&&&%@@++.....++@#$%%%%&%%%%%$#..++@@##$%%%%%%$$$#@...+@##%%;;;$$@@++.+...+++@##&====$#@@+...++@@#&&=;;;;$#@+++..++@#$==%%%&=%$$@++...++@#$&===&#@@+++...+.+++@@#&&==&$#@++...++@#$;;===;;$#@++...+@#$$%%##$%%$$#@+.",
+".++@@#$====&#@@+.....+.+@@#$%;;;%$@@.+...++@@$$;;;;;&%#@+.+..+@#$%&***-*;=$#@+....+@#$%&=$$$=&#@+....++@#$===&&%%@++......++@#%%&&&&&&&&%%#.++@##$%%&%&%&%%%$$#.+++@#$%%;;;%$##@@+..++@@@##$&===&$$@@++..+@@#$&=;;;;;$$#@++.+@@$%%==&&&==&%%#@+...+@##$====&$#@@+++..+.++@##$====&$#@@....+@@#$;;;==;;$##@+.+++@#%%&&%$$&&%$#@+.",
+"+.+@$%%%&===$#@++.....++#$$&&&=&$#@++....++@$%&==&&&&%#@++..++@#%&=&==;=&%#@+++..+@@$%%==%%%%%#@++..++@$$%&==;=$$@+++.....+@@$***-******--$.+@@%%%**********==#.++@$$%&&====&%$$@++.++@#$%%&===&&%%$@@+.+@@$%%==&&&==&%%@@+.+@#$%&===&&==&&%#@@.+++@#%%%&;==%%$##++...++##$%&==;&%%$#@+.++@@$%&&=&&===&%$@+..+@@$%%==%&%==&%%@@.",
+"++@@$%%&&;==$#@++...++@@#$%&===&%##+++...+@#%%&===&&&%#@+...++@#&&=&=;=;%%##+.+..+@@$%&==&&%&$#@++..+@@$%&&=;=;$$@@+......+@##***----***-*$.@@#%&&****-*-***;=$.@@#%%&=&=====&&%$#@.@@#%%&&&;=;&&&&%##@.@@$%&&;=&=&;==&&$#@.@##%&&====&;=&&&$#@..+@@$%%&&;=;&%%$#@+.+++@#$%%&;=;&&%$#@@..+@#%%&==&&&==&%%#@..+@#%&&==&&&==&%%#@.",
+".+@#$%&&&=;=$$@@+.....@@$%%====&%$@@+...++@#%&&;===&&%#@++...@@#&&==&;=;%%#@++..++@#%%&==&&&&%#@+...+@#$%&===;=%$#+++.....+@#$==-**==%&%;;$.@#$***==%%%%%;;=;=$.@#$****-*****-*-$$@.@#$***-******-*-%#@.@#$****-*****-*-$$@.@#$***-******-*-%#@.++@#%%&&&;;=&&%%$@@..+@@$%%&&;=;&&%%$@@.++@#%&&==&=&;=&&%#@.++@#%&&==&&&==&&%#@.",
+".+@#==;**---&%#@+...++@#&=;**-*-%%#@++...+@#&=;**-*-&%#@++...@@#==;*-*--&%$@++...+@#&=;*-*-*&%$@@.+.+@#==;**-*-&%#@++......@#$==*-*;=&%&;;$.@#$***=&%$$$%=====$.@#$*-*-*-*-**--*%$@.@#$****-***-*--*%$@.@#$*-**-*****-*-%$@.@$$****-*****--*%$@..+@@&==***-***==&#@..+@#&==**-*-**;=&#@..+@#&=;**-*-**;=&#@.++@#&=;**-*-**;==#@.",
+"++@#&=;-**-*&%#@++...+@#&==-*-*-&&#@++..++@#==;**--*&%$#++..++@#==;*-*-*&%$@++..++@#==;**---&%$@++..+@#&==**--*&%#@+.....++@#$==-*-==&%&;;#.@$$***&&$###$===;=#.@#$%&&;;%%%%%***%$@.@#$%=&;;&%%&%***%$#.@##&&=;;&%&%%***%$@.+#$&&=;;&%&%&***%$#.++@#&==-*----*==&@@.++@@&=;***--**==&@@.++@#&==**-*-**==&#@..+@#==;**---**==&#@.",
+"..@@#$%=;*-*==$#@++..++@#$%==**-==$#@+....@@#$%==*-*==$#@++...@@#$%==-**==$#@++..++##$%=;*-*==$#@++.++@#$%=;-*-=&$#@++....+@#$**;;;;;;;;%%#.@$%***%%###@#$%$%$#.+@#%&=;;&%%%%***$$@.+@#%&&;;&%%&%***$#@.+@#%&&;*%%%%&***$#@.+@#%&&;*%%%%&***%#@..++@#$%%%***%%%$#@+..+@@#$$%%***%%$$#@+..++@#$%%%*-*%%%$#@@.+++@##%%%***&%$$#@@.",
+"..+@##%=;*-*==$#@++..++@@$$=;-**;=$#@++...+@@$%=;**-;=$#@++...+@##%==*-*==$#@+...++@#$%=;*-*==$#@++.+++@$%==*-*==$#@+.+.++@@$$**;;;=;;;=%$#.@$%*-*%$#@@@@#$$$$@.+@#%&=;;%%%;;=&&$#@.+@#%&=;;%%%;;==&$#@.+@#%&=;;&%%;;&&%$#@.@@#%&&;;&%%;;&&%$#@...@@@#$$%*-*%$$#@@+...+@@##%%*-*%%$#@@+..++@@##%%***%$$#@@+...+@@##%%*-*%%$#@@+.",
+"..+@#$%**&&&-*%$#@+..++@#$%-*&=&-*%$#@+..++@#$%**&=&-*%$#@+.+++@#$%**&&&**%$#@+.++@@$%&**&&&-*%$#@+.++@#$%**&=&-*%$#@++..+@#$%**;;;;=;;;%$#.#$%***%$@+++@@####@.+@#%%&;;&%%;;=&&#@+.+@#%&&;;&%%;;&&&#@@.+@#%%&;;&%%;;&&%#@@.+@#%&&;;&%%;;&&%#@@....+@@#$%***%$#@@++....+@@#$%*-*%$#@@++..+.+@@#$%-*-%$#@@++..+.+@@#$%***%$#@@++.",
+"++@#%%&**%&%**&%%#@..+@#%%&**%&%**&%%#@..+@@%%&**%&%**&%%#@..+@#%%&**&&&**&&%#@..+@#%%&**&&%**&%%#@.+@#%%&**&%&**&&%#@+.++@$%%;;;;;*-**-%$@.@$%***%$#@@+@@@@@@+.+@#%&=;;&&%;;&&%#@+.+@@%&=;;%&%;;=&%#@+.+@#%&=;;%&%;;&%%#@+.+@#%&=;;%&%;;&%%#@+.....+@##%*-*$$#@++......+@##%***$$#@++....+++@##%***$$@@+......++@#$$-**$$@@+...",
+"++@#%&&**&%&**&&%#@.++@#%&&**&%&**&&%#@.+@@#%&&**&%&**&&%#@.++@#%&&**%%%**&&%#@.++@#%&&-*%%&**&&%#@.+@#%&=**%&%**&&%#@+.+@#%%&;;;;;-*-**%$@.@$%***%$$##@#####@@.+@@%&&-*;;;**%%##@+.+@#%&&--;;;**%$$#@+.+@@%%=*-;;;-*%$#@@+.+@@%%=*-;;;**%$#@@+.....++@$$*-*$$@++.......++@$$***$$@++.......++##$*-*%#@@........++@$$***%#@@....",
+"+@@$=;;-*;;;-*;;=$#.+@@$=;;*-;;;-*;==$#.+@#$=;;-*;;;-*;;=$@.+@@$=;;-*;*;-*;==$#.+@#$=;;*-;;;-*;;=$#.@#$=;;*-;;;-*;==$#@.@@#==;*-***===&&$#@.@$$***&&$$#$$%%%%$@.+@#$&&**;=;**%%$#@@.+@#%&&**;=;**%%$#@+.+@#%&&**=;;**%%$#@@.+@#%&&**=;;**%%$#@@.....+@@$$***%#@@+.......+@@#%*-*%#@@+.......++@$%***%#@@........+@@#%*-*%#@@+...",
+"+@#$==;-**;;-*;;=$#.+@#$=;;*-;;;-*;;=$#..@#$=;;***;;-*;;=$#.+@#$=;;*-;;;**;;=$#.+@#$=;;***;;-*;;=$#.@#$=;;***;;**;;=$#@.@#$==;***-*;==&&$$@.@#$***==%%$%%&=&&%#.+@#%&=**===**%%$$#@.+@#%&=**=;=-*%%$$#@.+@#%&=**===**%%$$#@.+@#%%=**===**%%$$#@.....++##%-**%$#++.+.....++#$$***%$#+++......+@@#%***%$@@++.......@##%***%$@+++..",
+"+@#%;;;**;;;*-;;=$#.+@#%=;;*-;*;**;;;$$.+@#$;=;-*;;;*-;;;$#.+@#%=;;**;*;-*;;;$$.+@#%=;;*-;;***;;=%#.@#$=;;-*;;**-;;=%#@.@#$=;=-*-*-===&&$$#.+#$&==**;;;;;***%%@.+@#%&&**;=;*-&%%$$@.+@#%&&**===**&%%$$#.+@#%&&**;;=*-%%%$$@.+@#%&&**;=;*-&%%$$@....++@#$%***%##@@.+..+.++@#$%*-*$$#@++....+++@#$%-**%$#@+++...+++@#$%*-*%$#@+++.",
+"@#$%***;;=;==;***%$.@#$%***;;===;;***%$.@#$%***;;=;=;=***%$.@#$%**-;;===;;***%$.@#$%***;;====;***%$.#$%***;;====;***%$#.#$%***&&=;=;=%&%==#.+@#%&&**;;;;;***&%@.@@$%&=;;%&%=&=====#.@@#%&=;;&&&====&==#.@@#%&=;;%&%====&==#.@@$%&=;;&%&&&==&==#..+++@##$%*-*%%##@++...++@##$%***%$##@++..+++@#$$%*-*%$##@++...++@##$%***%$$#@++.",
+"@#$%*-*;====;;*-*%$.@#$%-*-=;====;-**%%.@#$%-*-=;===;=-**%%.@#$%***;=====;*-*%$.@#$%-*-=;===;=-**%$.#%%*-*;====;;*-*%$#.#$%***&&;=;=;%&%;=$.+@#%&&**;;*;;***%%@.@@$%&=;*%&%=&==&;=$.@#$%&=;;&%%&&=====$.@#$%&=;*%&%=&=====$.@@$&&=;;&%&=&=====$..++@#$$%%*-*%%$$#@+.+++@#$$%%-*-%%$$#@@...+@##$%%***%%$$#@+.+.@@#$$%%-*-%%$$#@+.",
+"@#&=-*-;;&&&;;-*-=&.@#&=*-*;;&&&;;*-*=&.@#&=*-*;;%&&;;--*=&.@#&=-*-;;&&&;;*-*=&.@#&=*-*;;&&&;;*--=&.#&=-*-;;&&&;;*-*=&#.#&=*--==**-**;;;-*$..+@##%%&***;=&%$##@.@$$*****;;;;;***==$.@#$***-*;*;;;***;=$.@#$*****;;;;;***;=#.@#$***--;;;;;***;=#.++@@%&=;;-*-;;=&%@@..+@@%&=;;-*-;;=&%@+.++@#%&=;;---;;=&%@@..+@@%&=;;-*-;;&&%@@.",
+"@#&=*-*;;&%&;;*-*=&.@#&=*-*;;&%&;;--*=&.@$&=*-*;;&&&;;*-*=&.@#&=-*-;;&%&;;-*-=&.@$&=*-*;;&%&;;-**=&.#&=*-*;;&%&;;-*-=&#.#&=-**;=-***-;*;*-$...++@#%&;;;=&$#@++..@#%***-*;*;*;***;=$.@$$****-;;;*;***;=$.@#%***-**;;*;***;=$.@$$*****;*;*;***;=$..+@#&&=;;---;;=&&#@..+@#&&=;;--*;;=&&#@..+@#%&=;;-*-;;==&#@..+@#%&=;;--*;;==&#@.",
+"@#&&-*-;;%%&;;-*-=&.@#&=-*-;;%%&;;*-*=&.@#&=*--;;%%&;;*-*=&.@#&=**-;;%%&;;*-*=&.@#&=-*-;;%%&;;-*-=&.#&=**-;;%%&;;*-*=&#.#&=-*-==*-***;;;**$...++@#%&;;*=&#@@+...@#$***-*;;;;;-**==#.@$$*****;;;;;-**==$.@#$*****;;;;;***==#.@#$***-*;;;;;-**==#.++@#%==;;**-;;==%#@.++@#%==;;*--;;=&&#@.++@#&==;;*--;;=&%#@.++@#&==;;*--;;=&%#@.",
+"@#$%&=&=&%%%&&=&&%%.@#$%&=&=&%%%&&=&&%%.@@$%&=&=&%%%&=&=&%$.@#$%&=&=&%%%&=&=&%$.@@$%&=&=&%%%&&=&&%%.#$%&==&=%%%&=&=&%%#.#$%&&&&&&========&#....@@#&=***%$#@+....@@$&&&=======&=&%%#.+@$&&==;======&&%%#.@##&&==========&%%#.@@$&&========&=&%%#..+@@%%&&==&==&%%%@@.+++#$%&==&====&%$#@..+@@$%&==&=&=&&%%@@..+@@$%&&=&===&&%%@@.",
+"+@$$&%&&%$$$%%&&%$#.+@$$&%&&%$$$%%&&%$#.@@$$&%&&%#$$%&%&%$$.+@$$%&%&%$$$%&%&%$$.@@$$%&%&%$$$%&%&&$#.@$$%&%&%#$$%%%&%$$@.@$$%&&%%%&%&&=&=%%#....+@#&=***$$@@++...+@#%%&=&&&&&&&%&$$@.@@#%%&&&&&&%&&&%$$@.+@#%%&&=&&&&&%&&$$@.+@#%%&=&&&&&&&&&$$@..++@$$%&%&&%&&%%$@+...@@$$%%&&&%&%%$$@+...@@$$%%&&&&&%%$$@+...@@$$%%&&%&&%%%$@+.",
+"+@@######@@#######@.+@@@#####@@#######@.+@@#######@#######@.+@@######@@@######@.+@@######@@#######@.@@#######@######@@@.+@######$#$##$####@...+++@##$$$#@@+.....++@###$#$####$###@@.++@###$#$#$######@@.++@######$#######@@.++@####$#########@@..+++@@####$####@@@+...+@@@####$#####@@+...+@@@######$###@@+...+@@####$#####@@@+.",
+".++@@@@@@@@@@@@@@@@..++@@@@@@@@@@@@@@@@..++@@@@@@@@+@@#@@@+..++@@@@@@@@@@@@@@@+..++@@@@@@@@@@@@@@@+.++@@@@@@+@@@@#@@@++.++@@@@@@@@@@#@#@@@+....+++@@#@#@@++......++@@@@@@#@#@@@@@++..++@@@@#@#@#@#@@@++..++@@@##@@#@#@@@@++..++@@@@#@##@#@@@@++....+@@@@#@@#@@@@++...+.++@@@@@@#@@@@++..+..++@@@#@#@@@@@++...+.++@@@@@@#@@@@++..",
+"..++++++++++++@+++...++++@+++++.+@++++...+.+++@++.+++++++++..+.++@+++++++@+++++..+.++@++++.+++@++++.+.++@+++++++++++++...+.++@+@+@@+@+@@++.......+@@@@@++.........+++@@@+@++@++++.+...+++@+++@++@++++.+...+++@+@@+@+@+++++....+++@+@+++++@+++++...+..++++@++@++++......++++@@++@++++.++...++.+++++@+@+++.+......+++@@@+@@++++.+.",
+"....+..+...++..+........++@@@#@@@@@@++.....+++###@@++..............++@@#@@+++.......+++@####@+++.......+++@@#@@#@@@@++.......+..+.+..+...................................++.++.+.+.....++@@##@@+++.............++@@#@@+++.......+.@@####@+++.........+.++.+.+.+.............++@@##@+++......+......................+++++++......",
+"..+++++++++++++.......+++@##$$$$###@@++....+@@#$###@@+............++@@#$##@+++......+@@#$$$##@++.......++@###$$#$##@@++......++++++++++..............................+.+++++++@+++.....+@@#$###@++...........+.+@@##$@@++.......++@#$$$##@+++......+.++++++++++...........+.+@@####@++......+++++.++.............+++@@@@++++....",
+"+.++@@@@@@@@++++++...+.+@@%%===&%&&%@@+...++@#&&&&%#@++..........++@#$$==$#@+......++@#$=;=&%#@++.....++@#%%===&%&&%@@+....+++@@+@@@@++++..................+.........+++@@@@@##@@++..+.+@#&&&&%#@+++.........++@#$$==$#@++.....+@@#$;=;&%#@+.+......++@@@+@@@+++.+........++@#$$==$#@++.++++@@@@@+++.............+@@##$#@@+++...",
+".@@@@#########@@+++..++@##&&=;=&&=&%#@+....+@#&===&##++..........+@@$$%;=$#@@......+@@$%;;;&%$@@++....+@@#&&;=;&&&&%#@+....+@@##@@###@@++.........+.......+..+....+++@@#@##$#$$#@@+....+@#&===&##+++......+.++@@$%%;=$#@++.....+@#$$;;;&%$@@+++..+++@@##@@###@@@++......+.+@@$%%;=$#@++..+@#@#@#@@@+++.........++@@#$$%%##@++...",
+"+@##$$$$$$$$$###@@+..+@@#$&&;;;=&=&&#@+...++@#&====$#@+++.....+.++@#$%%;;$#@++....++@#$%;;;=&$#@+.+.+++@#$&&;;;&&=&&@@+...++@@$$$##$$##@@+....+++.++....+.++.+..+.+@@@##$$$$%%%$#@+..++@##&====$#@@++++..+.++@@#$%%;;%$#@++..+++@#%%;;;=&$#@@+.....@@@$$$##$$##@@++..+.+++@@#$%%;;%$#@+.+@@#$$$$##@@+++........++@$$%%%%$$#@@++.",
+"+@%&=;;;;;;;==$$$@@.++@$$%;;;;;**&%$#@@...++@#$%=;=%$#@++.+.....+@#$;;;&%$#@++....++@$====&;=%$#@++..+@#$%;;;;;**&%$@@+...++@#==%%%==%$$@++..+.++@++++.++++++++..+@@#$%&;;;;;***$#@..++@#$$%;;=%%#@@+++..++@@##$;;;&%$#@@++..+@@#$=;&=&;;%%$@@+.+++@#$==%$%==%%$@@+..+++@@##$;;;&%$##@+.+@#==;;;&%%#@++.+....+++@#$;;***;=$#@++.",
+"@@%&;;;;;;;;;;%%$#@.+@#$%&;=*;;**&%%#@@...++@#$%;;;&%#@@++....++@@#$;;;&&$#@++...++@@$=;&&=;;%%$@++..+@$$%=;;*;**%$$#++..++@##;;%%%=;%%$@@+..++@@@@@+++++@@@@@+.++@#$$&=;;;;;***$#@.++@@#$%%=;;&%$##@@+.++@@##$%;;;&&%$$@@+.++@#$$=;&=&;;&%%#@@.++@#$$;;%%%==&%%#@+.++@@@##$%;;;&&%$#@@.@#$;;;;;=&%$@@@++.....+@@$$;;*-*;;$$@@+.",
+"@#$%***;;====;***$$.+@#%%&;;;;***&%%$#@..++@@#$%=;;%&$#@@++.+.+@@#$%;;;&&$$#@++..++@#$=;=&&;;&%$@@+..+@$%%;;;;;**&%$@@+..+@@#$;;&&&;;&%%@@+.+.@@$%%#@@@@@#%%$@@.@@#&==**===*****%$@.+@#$$%%%;;=&%%$$##@.+@##$$%%;;;&&%$$##@.+@##%%;;&&&;;%&%$#@.+@#$$%;;%%%;;&&&$#@.+@##$$%$%;;;=&%%$##.@@#==;**==&%$#@@++...+@@$%&**&&&**&%$@+.",
+"@#%&***;====;=*-*%$.@#$;;;;;&%&==;;;&%#.++@##$&=;;;;=%$$@@+..+@@#$&=;;;=;%$$@@+.++@#$%==;;;;;%%$#@+.+@@#$%==;*;;;%%$#@+.++@#$%&=;;;;;%%%#@+.++@#%%%$#@@###%%%#@.@#$===**===**-**%$#.@@#==;;;%%%==;;;%%@.@@#=;;;;%&%==;;;&%@.+##=;;;;&%%==;;;&%@.@##=;;;;%%%==;;;&%#.@@%%==;;;&&&;;;;;&%.@##==;**==&&%$##@@+..+@@%%&**&&&**&%%@@.",
+"@@%%***=;====;***%$.@#$;;;=;%&%;=;;;&%#.++@#$%&=;;;;;&%$##+.+@@$$$&=;*;;;%%%##+.+@##$%&=;*;;;&%%$@@.+@#$%%==;;;;;&%%##@.+@##$%==;;;;;&%%$#@..@##&&&$$$#$$%&&&#@.@#$=;;**===***-*%%#.@#$;;;;;%%%==;;;&%#.@#$;;;;;%%%==;;;&%#.@#$;;;;;%%%==;;;&%#.@#$;;;;;%%%==;;;&%#.@#%&;;;;;&&&;;;;;&%.+##===-*===&%%$$#@@...@#$&&**&&&**&%%#@.",
+"@#$%;;;=&%%%%%;;;=&.@#$*****&&&==-**&%#.+@#&==**===;=***%#@.+@#&==**====;***%#@.@@#==;;;====;***$$@.@@#==;;;;===;***%#@.@@#==;;;====;***$#@.++#$***;=%$%=;***$@.@#%***&&=&&;;;;;=&#.@#$***;=%%%&=***&%#.@#$***;=%$%&=***&%#.@#$***;=%$%&=-**&%#.@#$***;=%$$&=-**&%#.@#%&**-;;%%%;;-**&%.+@#%&=*-*****;;=%#@.++@#%%&;;&&&-*=&%@@.",
+"@#$%;*;&=%%%%%*;;==.@#$***-*&&&&=*-*&%#.@#$&=;**====;***%$#.@@$==;**===;=***%$#.@#$=;;;;====;*-*%$#.@#$=;;;;===;=-**%$#.@#$=;;;;===;=-**%$#.+@#$***;;%%%=;***#@.@$%**-&&&=&;=*;;==$.@#%***;=$$$%&-**&%#.@#$***;=%$$%&*-*&%#.@#%***;=%$$%&***&%#.@#%***;=$$$&&**-&%#.@@%%*--=;%%%;=-*-%%.@@#%&&-*-**-*;;;%$#..++#%&=;;&=&-*&&%#@.",
+"@#%=*****=&&%%&==;=.@#%***-*&&&&=***&%#.@#$=;=**=&&;=*-*%$#.@#$=;=**&&&=;*-*%$#.@#$=;;;;&&===***%$#.@#$=;;;;&&&;=***%$#.@#$=;;;;&=&=;*-*%$#..+@#$%%**;;;**%%$#@.@$%***&&;;;&&===;=$.@#$***==$$$%&*-*&%#.@#%***==$$$&&***&%#.@#$***==$$$&&*-*&%#.@#$***==$$$%&***&%#.+@#%=;;;=&%%;=;;;$#.+@#%&&;;%%%%&;=;==#..+@@%&&;******&&%#@.",
+"@#&&-*-**=&&$%&==;=.@#%;;;;;;=;%&*-*%%@.@$%***&&$$$%%;;;=&#.@$$***&&%$%$%;;;=&#.@$%***=&%$%%%;;;=&#.@$%***=&%$$%%;;;=&#.@$%***==%$$%%;;;=&#.++@#$%&*-;;;-*&%$#@.#$%***%%;;;=&===;=$.@$%;;;=&$#$$%***%%#.@#%;;;=%$##$%***%$#.@#%;;;&&$##$%***&%#.@#%;;;=&$#$$%***%%#.+@#$==;;=&%%;;;;;$#.+@#%%=;;%%%%%;=;;=$..+@#%&=;;***-*=&%$@.",
+"@#&&**-**=&&$$&=&;=.@#%;;;;;=;;&%***%$#.@#%*-*&%$$$$%;;;==$.@$%***&%$#$$%;;;==$.@$%*-*&&$$#$%;;;==$.@$%*-*&&$$$$%;;;==$.@$%*-*&%$$#$%;;;==$..++@#$%***;;-*%$$@+.#$%***&%;;;&&===;=$.@#%;;;&%$##$%***%$#.@#$;;;&&$##$%***%$#.@#%;;;&%$##$%***%$#.@#%;;;&%$##$%***%$#..+@#%%%**==&**&%$##.+@#%&&;;&%%%%=;=;=$..+@@%%&;;****-&&&$#.",
+"@#%&***;=%%%$$&&=;=.@#$;;;==***%&***%$#.#$%***%$##@#$===;=$.@$%***%$####$===;=$.@$%***%$####$===;=$.@$%***%$##@#$===;=$.@$%***%$####$&==;=$...@@#$%=;*-*;=%$#@@.#$%***&%;;;%&===;=$.@#%;;;&%##@#%***%$@.@#%;;;&%####%***%$@.@#%;;;&%##@$%***%$#.@#%;;;&%#@##%***%$@.++@#$%%**=&=**%%$@@.+@@%&=;;%%$%%===;=$..+@#%&=;;&%%==***%#.",
+"@#%&***;=&%$$$===;=.@#%;;;=&*;;&=***%$@.#$%***%##@@#$&=&;=$.@$%***%$@@@#$&=&;=$.#$%***%$#@@#$&==;=$.#$%***$$#@@#$&=&;=$.#$%***%##@@#$&&=;=$.+.@@#$%==--*==%$#@+.#$%*-*%&;;;%%===;=$.@#$;;;&%###$$***%$#.@#$;;;=%###$$***%$#.@#$;;;&&####%***%$@.@#$;;;=%$###%***%$#..++@#$%**&=&**%$#@+.+@#%%=;;&%%%%;==;=$..+@#%&&;;&%%==***%$.",
+"+##%;;;&&$$$$$&====.@#%;;;==;;*&=***%%@.#$%***%%#@##$=;;==$.#$%*-*%%##@#$=;;==$.@$%*-*%$#@##$==;==$.@$%-**%$#@##$=;;==$.@$%***%%#@##$=;;==$..+@#%&&**;;;**&%%#@.@$%*-*;;&&&&%;;;==$.@#%;;;&%$##$%***%$@.@#%;;;&%$##$%***%$@.@#%;;;&%$##$%***%%@.@#%;;;&%###$%***%$@...++##$==*--==$#@++.+@#%&=*-;;;;;***&%#..+@@%&=;;%%%%%***%$.",
+"+##%;;;=&%$#$%=====.@#%;;*&&=&=;****%%@.#$%-*-%%$##$%=;;==$.@$%***%%#$#$%=;;==#.@$%***&%$##$%;;;==#.@$%**-&%$##$%=;;==$.#$%***%%$##$%=;;==$.++@#%%&*-==;-*&&%#@.#$%***;;==&%%;;;==$.@#$;;;&%$$#$%*-*%$@.@#$;;;&%$#$$%***%$@.@#$;;;&%$#$$%***%$@.@#$;;;&%$$#$%***%$@...++@#$=;-*-==$#@++.+@#%%=**;;;;;-**&%#..+@#%&&;;%%%%%***%$.",
+"@@$%;;;&&%$$$%=;==&.@#%;;;&&&==;;***%$#.@$%***&%$$$$%;;;==#.@$%*-*&%$$$$%;;;==$.@$%-**&%$$$$%=;;==$.@#%***&%$$$$%;;;==#.@$%*-*&%$$$$$;;;==#..@@#%&=**=;=**&&%#@.@$%*-*;;&=&&%;;;==#.@#$;;;&&$$$%%***%$@.@#$;;;&%%$$$%***%$@.@#$;;;&&$$$$%***%$@.@#$;;;&&$$$%%***%$@....++##$%*-*%$$@+++.+@#%&&-**;;;;***%%#.+@@#%&=;;%%%%%***%$.",
+"@##%*-*==%&%&&***%%.@#%***==%%%;;--*%$#.@#$=;;;;&%&&&***%$#.@#$;;;;;&%&&&***%$#.@#$=;;;;&%&&&***%$#.@#$=;;;;&%&&&***%%#.@#$=;;;;&%&&&***%$#.+@#$***==%%%==***$@.@#$;;;*-&&&&&***%$#.+#$&==;;%%%&&***$$@.+#$&==;;%%&&&*-*$$@.+#$&==;;%&%&&***%#@.+#$&==;;%%%&&***$$@....+@#$%&***&%$#@++.@#$&==**;;===%%%##@.+@#$&==;;=====***%$.",
+"@#$%***==&&&&&-**%$.##$***==%&&;;-*-%$@.@#$===;;&&&&&***%$#.@#$=;;;;&&&&&***%$@.@@#==;=;&&&&&-**%$@.@#$===;;&&&&&***%$@.@@$==;;;&&&&=***%$#..@#$***&%$$$&&***#@.@#%;;;**&=&==-**%$#.+@#&==;;&&&&=***$#@.+@#&==;;&%&&=***$#@.+@#&==;;%&&&=***$#@.+@#&==;;&&&&=***$#@.+.+@@#$&&-*-&%$#@@+.@@$&&=-*=====%$##@+.+@@$&&;;;=====-**%$.",
+"@#&=*-******-*==&$#.@$%**-**&%%==***%$#.+@#$%%;;*****=&%$#@.+@#$%%;;****-=&&$#@.+@#$%%;;*****&&&$#@.+@#$%%;;*****&&%$#@.+@#$%%=;*****=&&$#@..+@#$%%$$####$%%$##.@#$=;;;;*****=&&$#@.+@#$%%****-**===$#@.+@#$%%***-**-===$#@.+@#$%%****-**===$#@.+@#$%%****-*-===$#@...+@$$&****-**%%$++.@$%****-=;=$$##@@++.+@$%**-*-==&*****$$.",
+"@#==***-****-*&&&#@.@#%*****%%%&=***%$@..@@$$%==-*-**&&%#@+.+@@$$%=;*-***=&&#@@.+@##$%=;**-**&%%#@@.++@$$%=;*-*-*&&%#@@.+@@#$%=;**-**=&&#@@.++@#$$$#@@@@##$$$@@.@@$===*;*-***=&&#@+.++@#$%*****-*==&#@@.++@#$%*******=&&#@+.++@#$%**-***-==&#@@.++@#$%**-****==&#@+.+.+@$%%**-**-*%%$@+.@#%**-**==&$#@@@++..+@#%*****&==-****$#.",
+"@#&=*****-***-&%%#@.@#$***-*%$$&&***$#@.++@##$==*****%%$#@+..+@##$==*****&%%#@+..+@##$==*****&%$#@+.++@##$==*****%%$#@+..+@#$$==*****&%%#@+.+++@###@@+++@@###@+.@@#===;;*****&%%#@+.++@##$*******=&&#@+.++@##%***-***=&&#@+.++@##$*******=&&#@+.++@##$*****-*=&&#@+...+@#%%*******%$$@+.@#$*****=&&#@@+.....+@#$*****&&&*****##.",
+"@@#$$%$%$%$%$$$##@+.@##$$$$$$###$$$$#@@...+@@#$$$$$$$$#@@++..++@@##$$%$$$$#@@++...+@@##$$$%$$##@@+....+@@##$$%$$$$#@@+...++@@##$$%$$$$#@@+....++@@@+++++++@@@++.+@#%&&%%%$%$$$#@@++...+@##$$%$%$$$##@++...+@@#$$$%$%$$##@@+...+@##$$$$%$$$##@++...+@##$$$%$$$$##@@+...++@##$$%$%$$$#@++.@@#$$%$$$##@@+.+....+@@#$$$%$$$$$$$$##@.",
+"+@@######$#####@@++.+@@#####@@@@@##@@@+....+@@@##$###@@@+.+...++@@########@@@......+@@#######@@@++.....++@#######@@@++.....+@@########@@@+.....+.+++....+++++.+.+@@%%%########@@@+....++@@@#######@@@+....++@@########@@++....++@@####$###@@@+....+++@####$###@@++....+++@@#######@@@++.+@@@#####@@@++.......+@@############@@+.",
+".++@@@@#@@@#@@@@++...++@@@@@@+@+@@@@++......++@@@@@@@@++.+......+++@@@@@@@++.+......++@@@@@@@@++.......++++@@@@@@@++........+++@@@@@@@++........+............+..++@@@@###@@@@@+++.......+@@@@@@@@@@++.......++@@@@@@@@@++.......++@@@@@@@@@++.......++@@@@@@@@@++.......++@@@#@@@@@++....+@@@@@@@@++.........+++@@@@@@@@@@@@@++.",
+"...++++++@++++...+...+.++++++.+.+.+++.........++++++++...........+.++++++++............++@++++...........+.+++++++...........+.+++++++++..+.......................+@@@+++@+++++...........++@+@+++..+........++++@+++++.+........+++++++++..+.......+.+++++++++.+......+.++++++@++..+......+++++++............+.+++++++++++++...",
+"....++++++..................+.++++.+............+++.+....................+...............................+++++++++..................................................+.+++++...................+++++.+..........++.++.+...............................+.+++....................+++++.+..........++.+++.+.........................",
+"....++++++++................+++++++..........+++++++.+............++..+.+.................................++@@@@+++................................................++++++++.+...............+.+++++++.+.......+.+@+++++...........+................+++@++++++...............+.+++++++..........+++++++..........................",
+"..+.+@@@@@+++............++++@@@@@+++........+@@@@@@+++........++.++@+@++++...........+.++..+............+@@####@++.................................................+@@@@@@+................+++@@@@@++........++@@@@@+++..........+..++.+...........++@@@@++................+++@@@@@++......++++@@@@@++..........+.+.+.++.......",
+"...+@##%%#@@++............++###%%@++.......++@@@%%%@@+..........++@@@@@@#@+++......++++++++++++........+++@$%&&&#@++..............................................++@##%%@@@+............+..++@#%%##@++......++@#$%%@@++.......+++++++.++++.+.....++@##%%@@@+............+..++@#%%##@++.......@@#%$%@@++........+.++++++++.+....",
+".+++@#$%&##@+++........+++@@#$$%%@@++......++@#$%%%#@@+......+++@@#$$#$#$#@@++...+.+++@+++++++++........+@@$%==&##@++.............................................++@#$%&##@@++............+@@##&%$#@++......+@@#%%%$#@+++...+.+++@++++++++++.....++@#$&&##@@+.............+@@##&%$#@++....+++@##&%%#@@++.....+.+++@+++++@++....",
+"...@@#$&&$$#@++..........@@#$%%&&#@+......++@#$$&&&$#@+++.....+@@##$%$%$$$#@+++.+.++@@@#@@#@@@+.+.......+@#%%===$#@+........+.+.+...+.+.+............+.+.+.+......++##$&&$$#@+++.........+++@@$$&&$##+.....+++@#$&&&$##@+.....++@@@@@@@@@@@++......@@#$&&$$#@++..........+++@##$&&$#@++.....+@#$$&&&$#@++......++@@@#@@@@@@+++..",
+"...+@#$===&&#@++......+++@#$=;;%$@@++.....+@@#=;;;;%%@@+.....++@$%&*****;=$#@+..+++##$%%###%%@@+.......++@#&=&&%%%@++.+..+.+++++++++++++........++++++++++++.+....++@##===&&#@+++.........+@#%&&==$@@+......+@#%&;;;;=#@@+..+++##$%%###%%##@++.....+@##===&&#@+..........++@#%&&==$#@++...++@@#=;;;;%$@@++...++@@$$%%###%%@@.+..",
+"..++@@#====&#@@+.....+.+@#$%;;;%%#@+....+++@#$;;;;;&%#@++....+@@%%&*****;;$$@++..+@#$$&&$$$&&#@++.....++@@$&=&&&%%@@++..+.++@+@+@++@+@+@+++....++++@@@@@@+@+++.....+@##====&$#@+++......++@##&&&;=$#@++....+@@#%=;;;==$#@++..+@#$$&&$$$&%$##@++...++@@$&==&&#@@+........++@##%&===#@++.....+@#$;;;;;&%#@+.....+@##$&&$$$&&@@+...",
+"..++@#$%%===$#@++....++@@#%%=&&%#@@++....+@#$%&=&&&=&#@++....+@#%&=&&;;=&&$#@++..+@#$%%&%%%&%#@++......+@#$&&=;=$$@@....++@@#####@@#####@@+.++++@@#########@@++...++@#$%%===$$#@++....++@@@$$==;%%##@+...+++@#$==&=&=&%$#@+.++@#$$&&%%%&&%$#@++....+@@$%%==&$@@+........+@@$%===%$#@++...++@#$%&=&&&&%@@++....+@#$%%&%%%%%#@++..",
+".++@@#$%%;;=$$@@++....@@#$%&==&%$#@+....++@$$%&=&&&=&$#@+...++@#%&=&&=;;&%$#@+..+@@$%%&=&&&&&$@@+....++@##$&==;=%$#@++..+@@#$$$$$$$$$$$$#@@..+@@@#$$%$%%$$$$@@+..++@@#$%%;;=%%##@@+...+@@##%%==;%%$##@+...+@##$==&&&=&%$$@+..@@#$%&&%%%&&%$$@++...++@#$%&==&$#@+......++@@#$%=;=$$@@+.....++#$%==&&&&%#@+....++@#$%&=&&&&%#@+...",
+".++@#$%%&=;=%$#@@+..++@#$%&&===%$#@@++..+@@$%&==&&&==$#@++..++@$&&=&==;==&$#@++.+@#$%%==&&&&&$#@++...+@@#$%==;=;%$##+++.+@#$%%%%$%$%%%%%$#@.+@@#$$%%%%%%%%%$##+..+@@#$%%&=;=&%$$#@@.++@@#$$%&;=;&%%$#@@..+@@#$%===&&==%%$#@.+@#$%%==&&&=&%%$#@+...++@#$%&===$#@+.......+@#$%%=;=$#@++.....+@#$%&=&&&&%#@+....++@#$%=&&&%&%#@+...",
+"++@#&==-**-*;;$#@++.+@#&&=*-***;;$#@+.+.+@#&==*-***;;$#@+++.+@@#===*-*-*;;$#@++.+@#&==**-**;;$#@++..++@#&==**-**;;$#@++.@#$***-*;;;**-**=&#.+@#&&&****-***-*%#@.++@#&&=*******=&&#@..+@#&&=***-***==&#@.++@#&==****-**==&#@.@@#&==***-***==&#@@..+.@$$%-**-*$#@++....++@#$%**-**%$@@.....++@$%&*-*-*%$@+++...++@$%%-**-*%$@@++..",
+"++@#&==*-*-*;;$$@@+.+@#&=;*-*-*;;%##@+..@@#===-*--*;;%$#@+...@@#==;*-*-*;;%$#@+.+@#==;-*-*-;;%$#@+...+@#&==-*-*-;;$$#@+.@#$***-*;;;***-*==$.@#$&==*--*-**-**%$@.+@#$&==*--*-**===$#.+@#$&==*-*-*-*==&$#.+@#$&==-*-*-*-===$#.@#$&==-*-*--*===$#@..+++#$%*-*-*%#@++.....++$$%**-*-$#@@......+@#$%*-*-*$$#++....++@$%%*-*-*$$@@.+..",
+".@@#&&=&&&&&**&%$@+.+##&&=&&&&&**&%$@++.@@#&&=&&&&&**&%$@++.++##%&&&&&&&**&%$@+.+##&&=&&&&&**&%$@++.++@#&==&&&&&**&%$@+.@#$&====--*=&&&&**$.@#%***==%%%==---%$#.+@#$**-==&%&=;***%#.+@#%***==%&%==***%#.+@#$***=;%&%;=***%$.@#%***==%&%;=-**%$@....@@#$%%***$$@+......++@#$%%***%$@++.....+@@#$%%***%#@++.....++@#$%%***$$@++...",
+"++##&==&=&&&**&%%@@.+@$&&=&&&&&**&%%@@..+##&==&&&&&**&%%@@+.++@$%&=&&&&&**&%%@@.+@$&&=&&&&&-*&%%@@+.+@@$&&=&&&&&**&%%@@.@#$&==&=**-&&&&&-*$.@$%***=&$$$&&*--%$@.+@#%***;=&%&==-**%$.@@$%*-*==%&%==-**%$.+@#%**-==&%&=;*-*%$.@$%*-*;=&%&==***%##...++@@#$%*-*%#@@......+++@#$%*-*$#@++......+@@#$%*-*%##+......++@@#%%*-*%#@@....",
+"+@@$&&=&&&&&**&&%#@.@##&===&&&&**&%%#@+.@##&&=&&&&&**&&%#@+.++##&&&=&&&&**&&%#@.@##&&==&&&&**&&%#@+.++##&&==&&&&**&%%#@.@#%&&==&--*=&&&&*-$.@$%***%%###$$&&&$#@.+##%*-*==%&%;=***%$.@#$%**-==&%&==-**%$.+##%***;=&%&==***%$.#$%**-==&%&=;-**%$@.....+@#$%***$$@++......++@#$%***%$@@......+++@#$%***$$@++.......+@@$%***$$@+....",
+"+@#$===**-*---&%%@@.@#$&==**-*---&&%@@+.@#$&=;**-*---&%%@@+.+@#$&==*-*----&%%@@.@#$===*-**---&%%@@+.+@#$===**-*---&&%@@.#$%;;;*-**-;;;;;-*%.#$%***%$$##$$&&%$#@.@@$%*-*;;;;;;;--*%$.@@$%-**;;;;;;;*-*%$.+@$%--*;;;;;;;-**%$.@$%-*-;;;;;;;*-*%$@....++@##%*-*%##++......++@@$%***$$@++.+....++@##%*-*%##++......++@##%*-*%##++...",
+"+@#$==;*-*-**-&&%#@.@#$===*-*-**-&&%#@+.@#$===*-*-**-&&%#@+.+@#$=;=**-***-&&%#@.@#$===**-***-&&%#@+.+@#$===-*-**-*&&%#@.#$&;;;-*--*;;;;;-*%.@$%*-*&&%%$%$%%%%$#.@#$%-*-;;;;;;;*-*%$.@#$%*--;;*;;;;*-*%$.@#$%**-;;;;;;;--*%$.#$%*-*;;;;;;;*-*%$@.....+@@$%***$$@@++......+@@#%*-*%##@++......+@@$%***$$@@++......+@@$%***%$@@++..",
+"+@$%**-&&%&&;;=&%#@.@$%*-*&&%&%;;=%%#@+.@$%**-&&%&%;;&&%#@+.+@$%**-&&%&&;;=&%#@.@$%**-&&%&&;;=&%#@+.+@$%**-&&%&%;;=%%#@.$=;;;;%&*--=;=====$.@#$==;**=;=;;***&&@.@@$%-*-;;=====;==%$.+#$%-*-;;=;=;=;==%$.@#$%--*;;=====;==%$.#$%-*-;;====;=;=%$#...+++@#$%*-*%$#@+++....++@#$$***%$#@++....+++@#$%*-*%$#@++...++++@#$%*-*$$#@+++.",
+"@@$%***&&&%&;;&&%#@.@$%*-*&&%&&;;=&%$@+.@$%***&&&%&*;&&%#@+.@@$%***&&&%&;;&&%#@.@$%***&&&%&;;&&%#@+.@@$%***&&%&&;;=&%#@.#==;=;&%*-*;;=;=;=$.+@#=;=-*;;;;;***=&#.+#$%*--;;;;=;=;;=%$.+#$%*-*;;;====;;=%$.@@$%-*-;;=;;=;=;=%$.@$%--*;;;=;=;=;=%$@...++@##$%***%$##@++...++@#$$%-**%$##@++...++@##$%***%$##@++...++@##$%***%$##@++.",
+"+@$%**-%&%&&;;=&&$#.#$%***&&%&%;;=&%$#@.@$%*-*&&%&%;;=&&$#+.@@$%*-*&%&%&;;=&&$#.@$%*-*&%&%&;;=&&$#+.+@$%**-%&%&&;;=&&$#.#=;=;=&%-*-=;===;=$.@@##$%==***;===&$#@.+@$%-*-;;===;==;=%$.+@$%-*-;;=;=;=;==%$.+@$$--*;;=====;;=%$.@$$*--;;==;==;==%$@.+.+@@$$%%-**%%$##@+.+++@@#$%%*-*%%$##@+..++@@$$%%*-*%%$##@+..++@@$$%%-*-%%$##@@.",
+"@@$%***;;;;;-*;;;$#.@$%**-;;;*;--;;;$#@.#$%***;;;;;--;;;$#@.@@$%***;;;;;--;;;$#.#$%***;;;;;--;;;$#@.@#$%***;;;;;--;;;$#.$==******-***;;;**$.++@##$&=***;==&&$#@.@@#$;;;**;;;;;*-*$$.+@#$;;;**;;;;;-*-$$.+@#$=;;*-;;;***-*$$.@#$;;;**;;;;;-*-$$@..+@@%&==;*--;;=&%@@..+@@%&==;-*-;==&%@@..+@@%&==;-*-;;=&%@@..+@@%&==;*-*;;=&%@+.",
+"@@$%*-*;;;*;-*;;;$#.@$%***;;;;;-*;;;$#@.@$%**-;;;*;*-;;;$#@.+@$%*-*;;;*;-*;;;$#.@$%*-*;;;*;*-;;;$#@.+@$%*-*;;;*;*-;;;$#.#==*****-*-**;;;**#..+@@#$&&***;=&&%#@+.+@@$=;;-*;;;;;-*-$#.+@@$=;;**;;;;;-**$$.+@@#==;**;;;**-*-$#.@##=;;*-;;;;;-*-$#@..+@#%&=;;*-*;===&#@..+@#%&=;;*-*;;=&&#@..+@#%&=;;*-*;===&#@..+@#%&=;;*-*;===&#@.",
+"+@@$&=&;===;====&$@.@#$&&==;=;=====&$@@.@#$&&=====;&===&$@@.+@@$&&==;=======&$@.@#$&&==;==;&===&$@@.+@@$&===;==;&===&$@.#$%=====&%&=====%$#...++@#%%;;;==%##@@+.++@#$$%&====;=&%%$@..+@#$$%====;==&%%#@.++@##$%&======%%$$@.+@#$$%&====;=%&$$@@..+@@%%&=======&&%#@..+@#%%&========&%#@..+@@%%&=======&&%#@..+@@%%&=;=====&&%#@.",
+"+@@#%&&=========&#@.+@#%&&=====&&==&#@@.+@#%&&=====&&=&&#@+.+@@#%&&=====&&=&&#@.+@#&&&=====&&=&&#@@.+@@#%&&=====&&=&&#@.@$$=====%%%====&$#@....+@#$%;*;=&$#@+....++@##$&&=====%$$#@.+++@##$=======%$$#@.+++@##$&&=====%$$@@.+@@##$&&=====%$$#@+..+@@%%&=;=====&%%#@..++@$%&=;=====&%%@@..+@@%%&=;=====&&%@@..+@@$%&=======&&%@@.",
+".+@#%%&&&=&&&%&&%#@.+@#%%&&&&&&%%&&%#@+.+@#%%&&&=&&%%&&%#@+..+@#%%&&&&=&%%&&%#@.+@@%%&&&=&&%%&&%#@+.++@#%%&&&=&&%%&&%#@.@##&&&&&$$$&&&&&##@...++@#==***%%#@+.+....++@##%&&&&&&$$#@+...++@##%&&&&&&$$#@+...++@@#%&&=&&&$##@+..++@##%%&=&&&$$#@++..++@$$%&=&=&=&&%$@+.+.@@$$%&=&==&&&%%@@..++@$$%&=&=&=&%%%@+...@@$$%&=&===&%%%@+.",
+".++@@###$$$#$####@@..+@@##$$$$#$###@@++..+@@##$$#$$#$###@@+.+.+@@##$$#$#$####@+.++@@###$#$$#$###@++..++@@###$#$#$####@@.+@@#############@@+...++@#==***%$@@+.......+++@@##$###@@@++...+++@@##$$####@@++...+.+@@@#######@@++...++@@########@@++....++@@##$#$$####@@+...+@@###$#$#$###@@+...++@@##$#$$#$##@@+...++@###$$##$###@@+.",
+"..++@@#@@@@#@#@@@++.+++@@@@@@#@@@@@@+++.+++@@@@@#@@@@@@@++...+++@@@@@#@#@@@@@++..++@@@@@#@@@@@@@++....++@@@@@#@#@@@@@++.++@@@#@@@@@@@@@@++.....+@@#$$$$##@++.........+@@@@@#@@@+++......++@@@@@#@@@@++......+++@@#@#@@@++.......++@@#@#@@@@++....+.++@@@@#@#@#@@@+...+.++@@@@#@#@@@@@+...+.+@@@@@#@@@@@@@++..+.++@@@@#@#@@@@@++.",
+"...+.++@+@+@+++++.....+.++@++@+@+@+++....+.++@+@+@@@++++.+....+.+++@+++@+@+++....+.++@@+@+@@++++++.....+++@@+++@+@+++.....++++@++++@+++++.+.....+@@####@@++...........+++@++@+++..........+++@+@+++..........+.++++@+++.+........++++@+@++...+....++++@@+@+@+@++++.....+.++@+@+@+@+++.+.....++@@+@@@@+++..+....+.++@+@+@@@+++.+.",
+"..++++++++++++++++.........+.+.+.+..+.........+.....................+.++.+..+.........+++++++.............+.++++.+.+.....................................................................+..+.+.................+.++++.+.........+.++++..+......................................................................................",
+"++++@@@#@@@@@@@+++.......+++++++++++.......++++++++................+.+++++++........+++@@@@@++...........++++++++++.+....................................................................++++++.................+++++++.+........++++++++..................................+..+++++++...++@@@@@@++..............................",
+"++@@###$$$#$$##@@@.....+.++@@@@#@@++++...+.++@@@@+++...............+++@@@@+++.......++@@###@@@++........++@@@#@@@@@+++..................................+..............................+++@@@@+++..............++@@@##@++......+.+@@@#@@+++.............+..................+.+@@@@@++...+@@#$$##@+++............................",
+"+@##$%$%%$%$$%$##@+....++@@##$####@@++....++@@###@@++.............++@@###@@+++.....++@##%$%##@++.......++@@#$#$###@@+++....+..+..+.+++.+............+.++..............................+++@@###@@+++...........++@@####@+++.....++@@#$###@++.........+..+..++.+.+...........++@@####@+++.@##$%$$##@+...............+++++.+++.+...",
+"@@%&*****;=;**=&%@@...++@@#&&&&%&&##@++..++##$==$##@++..........+.+@##$**$#@++.....+@@%%***%%@@++......+@@$%===%%%%$@++....+++++++++++++.........+.+++++++................+.++.........+##$==$##@++.........+.+@#%%&=&#@++....++@#$%=;=##@+.........++++++++++++..........++@##$**$#@++.@#$*-*;=$@@++..........+++++++++++++++..",
+"@#%&***-*;;;**=&&#@..++@##$==&=&=&$##++..++@$$=;%$#@@+...........+@@$$%**$#@+....++@@#%&***&%#@+++...+++@#%&=;=&%%%%@++..+++@@@@@@@@@@@+++........+@@@@@@+++...........+++++++++.+...++@#$$=;%$#@@++.+.....+++@@#%&&==$@@+..+++@@#%&;;;$#@@++....+++@@@@@@@@@@@++++..+.++++@@#$%**$##@+.@$$-**;;$#@+++.........+++@@@@@@@@@@@++.",
+"@#%&***-*;;;**==%#@..+@@#$%=;&====$##++..++##%=;%%%#@@++.......++@@#%%%**$$@@.....+@#$%&*-*&&$#@+.....+@#$%&;;;&&&%%@@+..++@@########@@@++......+++@##$#@@+..........++++@+@@+@@+@+..++@#$%;;%%%##@@++..++++@@@#$&====$#@++.++@@#$&&;;;%$#@@++...+@@@##########@@+...++++@@##%$%**%$#@+.@#%*-*;;$$#@@+++....+++@@@##########@@+.",
+"@#&&===;;-*-;;%%$#@.+@@#&&=;;***=;$#@+...++@#$%&;;;$#@+++.....+++@#$=;;&&$#@+++..++##%;;&&&;;$$@+++..++##$;;;;;**%%$@++.++@#$$==$$$&=%$#+++....+.@@$%===#@+++.......++@@@##@####@@@.++@##$$%&;;=$##@@++.++@@###%%;;;%%$#@@+.+@#$$%;;===;=$#@@++.++@#$%%=&$$$**$#@@+.++@@@###$;;;&&%$#@@.@#$&&=;;%$##@@@+++..++@@##$**$$$==%%$#@.",
+"@#%&===;;-*-;;&%$#@.+@#$===;;*-*;=$#@@...++@#$&&;;;%$#@++.....++@#$%;;;&%$#@+.+..+@#$%;;&%&;;%$#++...+@#$%;;;;***%$$@+..++@$%%==%%%==%%$@+......+@@$%===$#@+......+++@@##$$$$$$$##@.+@@#$%%&&;;;%$$##@+.+@@#$$$%%;;;%%$$#@@.@##%%%;;==&;;$$#@++.+@#$%%&==%%%**$$#@+.+@@#$#$$$;;;&&%$$$#.+@#%&=;;%%$$$##@++..+@##$$%**$%$==&&%$#.",
+"+#$%;;;=&&&&-*===$@.@#%&=;;&&;=;;=%$@@+..+@##$==;;;=&$#@++...++@#$&=;;;;=$#@@+..++@#$%=;;;;;=$$#@++.++@##%=;;;;;;%$#@++.++##%%=;=;;;=$$#@++....++@#%&***$#@++.....++@@$&=========%%.@@%&==;%%%%%;==&%#@.@@%%===%%%%%;;=&%#@.@%&=;;&&%&%;;=&&#@+.@@%&=;;%%$%%=;=&&#@.@@%%==;&&%%%=&;;=%%.@##%&=;;=;===%$$@@+.@@$&=;===%$%===;=&%.",
+"@@$%;;;=&&&&*-;==$#.@#%&;;;&&;;===%##@+..+@#$%=;;;;==$$#@@+.++@##%==;;;==%$#@@+.+@#$%%;=;;;=;%$#@@+.++@#$%=;;;;==%$$@@+.+@#$%%;=;;;=;%$#@@+....+@@$&&*-*$#@+++..+++@#$$==;;;==;;=&%.@#%&;;;%%%$%;===&#@.@#%&;;=%%$%%=;==&#@.#%&=;=&%%%%;;==&#@@.@#%&;=;&%%%%;;==&##.@#%&;=;&&%%%&=;;=&%.+@#%&&;*=;=;=%%%#@+.@#%&=;;==%$%==;;=&%.",
+"+@$%;;;&&&&&**=;=$#.@#&&=;;&&=;;;=%$#@@.+@#$$%==;;;=;%$##@+.+@#$$%;=;;;;;%$$#@+.+@#$%%;=;;;;=%%$#@+.+@#$%%;=;;;;;%%$#@+.+@#$%&=;;;;;=%%$#@+.+.++@##&=***$$#@+++..+@#$$%==;;;;;;;;&%.@#%&=;;&%$%$;;===$#.@#%&=;;&%$$%;;===$#.#%&;;;&%%%%;;===$@@.@#%&;;;%%$%%=;===$@.@#%&;;;==$$%=&;;;&%.+@#%&=;;=;;;;&%%$#@.@#%&;;;==%$%==;;;&&.",
+"+@#$=;;****--*-**%#.@#%&*****;=;**;=&#@.@@#;;;**==;**;;=$@@.@@#;;;**===**;;=#@@.@@$=;;**;==**;;=##@.@@$=;;**===**;;=$@@.@@$=;;**=;=**;;;##+.++@@#$$%%&&%%$###++.+@@#=;;**===**;;;%$.@#%&***&%$$%=;;;;$#.@#%&***&&$$$=;;;;$#.#%&***&&$%$;;;;;$#@.@#%&***&&$$%;;;;;$#.@@%%***==%%%==*-*%%.+@#%&&--;;;;;*--%%#.@@%%***==%%%==-**&$.",
+"@@#$===*-*-**-***%$.@#%&**-**;=;**===$@.@#$;;;**;==**;;;$#@.@#$;;;**=;=**;;;$#@.@#$;;;**;;;**;;;$#@.@#$;;;**=;=**;;;$#@.@#$;;;**;=;**;;;$#@.+@@#$$%%%&&%%%$$#@@.+@#$;;;**=;=*-;;;$$.@#%&***&&$$$;;;;;$#.@#%&***&&$$$;;;;;$#.#%&***&&$$%=;;;;$#@.@#%&*-*&&$$$=;;;;$#.+@#$==;;;%%%;;===$#.+@@%&&**&&%%%;;;;=$.+@#$==;;;%%&;;===$#.",
+"+@$$==;*-*-*-*-**%$.@#%&*****;=;**;==$#.@#$;;;-*===*-;;;$#@.@#$;;;**===**;;;$#@.@$$;;;**===*-;;;$#@.@#$;;;-*===**;;;$#@.@$$;;;**==;**;;;$#@.+@##%%%&&%&&%%%%$#@.+@$$;;;-*;=;**;;;%#.@#%%***&%$$$=;;;;$#.@#%&***&%$$%=;;;;$#.#%%***&%$$$=;;;;$#@.@#%&***&&$$$;;;;;$#.+@##===;;&&%;;;=&$#.+@#%&&**%%$%%;;;==$.+@@$&==;;&%%;;;=&$#.",
+"@@$%*-*==%%%%&*-*%$.@@#%;;;==%%%&=;;;$#.#$%***&&%%%&&***%$@.#$%***&&%%%&&-**%$@.@$%*-*&%%%%%&***%$#.#$%***&&%%%&&-**%$#.@$%*-*&&%%%&&-**%$#.@@&&-**-*-*-***-*$#.@@$%*-*&&===*;-**%$.@@$%;;;&&$$$&=;;;$#.@@#%;;;&&$$$%=;;;$#.@$%;;;&&$$$&=;;;%#@.@@#%;;;&%$$$%=;;;%#..++@#%%**&&&-*%$#@+.+@#$&=;;%%%%%&=&;=$...+@#$%**&=&**%%#@+.",
+"+@$%***=&%%%%&***%$.+@$%;;*==%%%&&;;;$#.#$%*-*%%$$$%&*-*%$#.@$%*-*&%$$$%&**-%$#.#$%***&%$$%%&*-*%$@.@$%*-*%%$$$%&***%$@.@$%**-%%$$$%%***%$@.@@&&*-*-*---*-*-*$#.+#$%***&&===;;-**%$.+@#%;;;&&$$$%&;;;%#.+@$$;;;&%$$$&&;;;%#.@#%;;;&%$$$%&;;;$#@.+@$$;;;&&$$$&&;;;$#..++@@#%;;*-*;;$$@@+.+@#%&&--=&=&&*-*&%#...+@@$$;;***;;$#@@+.",
+"@#$%***%%$$$%%***%$.@@#%;;;=&$$$&=;;;$#.#$%***%%$$$%%***%$@.#$%***%$$$$%%***%$@.#$%-**%%$$$$%***%$@.#$%***%%$$$$%-**%$@.#%%***%%$$$%%-**%$@.+@#$$$%%%%%%%%%$$@@.@@%%*-*&=;;;&&***%$.@@#%;;;&%$$$&=;;;$#.@@#%;;;&%$$$%&;;;$$.@#%;;;&%$$$%=;;;$$@.@@#%;;;&%$$$%&;;;%#....+@#$=;***;=$#@+..+@#%&&**===&&*-*&%#....+@#$=;*-*;=$#@+..",
+"@@$%***%%$$$%%*-*%$.+@#%;;;&&$$$&&;;;%#.#$%***%%$$$$%***%$#.#$%***%%$$$$%***%$#.#$%***%$$$$%%***%$#.#$%***%%$$$%%***%$#.@$%***%$$#$%%***%%@.+@@##$$%%%%%%$###@+.@@$%***==;;;&&***%%.+@#$;;;=&$$$&&;;;%$.+@#%;;;=&$$$&&;;;%#.@#$;;;&%$$$%&;;;%#@.+@#%;;;&%$$$&&;;;%#...++@#$&&--*&%$@@+..+@@%&&**-**-*;;;%$#...++@#$&&*-*&%$#@++.",
+"@#$%*-*%%%$$%%***%$.@##%;;;&&%$$&=;;;$$.@$%***%%$$$%%***%$@.#$%***%%$$%%%***%$@.@$%***%%$$$%%***%$@.#$%-**%%$$$%%***%$@.#$%***%%$$$%%***%$@..++@@#$$%%%%$$#@@@+.@#$%***&=;*;%%-**%$.+@#%;;;&&%%%&=;;;$$.+@#$;;;&&$%$&=;;;$$.@#%;;;&&%$%&=;;;$$#.+@#$;;;&&%$%%=;;;$$..+++@#$&&*-*%%#@+...+@#%&&*-*-*-*===$#@..+++@#$&&-*-%%#@+...",
+"+@$%***==%%%=;***%$.+#$%;;;=&%$%&&;;;%$.#$%***==&%%;;*-*%##.@$%***==%%%=;***%#@.#$%**-==&%%=;*-*%##.@$%***==%%%=;*-*%#@.@$%**-==%%%=;***$$@..+.+@@#&=*-*$#@@+.+.+@$%*-**-&&&;;***%#.+@#$;;;==%%%=;;;;%$.+@#$;;;;=%&%=;;;;%$.@#$;;;;=%%%=;;;;%##.+@#$;;;;=%%&=;;;;%$...+@#$$=;;;;%$@@++..@@#%&=;;&%%%%%$##@+...+@#$$==;;;$$@+++..",
+"@@#$***;;&&&=;***%#.@#$%;;;&&%%%&&*;;%$.@#%*-*;=&%&==***$#@.@#%***;;&&&=;***$#@.@#%***;=&%&;=***$#@.@#%***;;&&&;=***$#@.@#%***;;%%%=;***$#@...+++@#&=*-*$#@+.+..@#$%*****&&&=;***$#.++##;;;;=&&&;=*;;%$.+@@$;;;=;%&&;=*;;%$.@@#;;;=;&&&;=*;;%$#.+@@$;;;=;&&%;=*;;%$.++@@#$%==;;;$$@+....@#$%&=;;&%%%$##@@++.++@@#$%=;;;;%##++...",
+"+@#$&==**-*-*-=&&$#.@#=;---*-%%&*-*-*=&.@#$&&=**-*-*-=&&$@@.@#$&==***-*-*==&$#+.@#$&==**-*-*-=&&$@@.@##&==***-**-=&&$#@.@#$&&=**---**==&$@@....++@#$%==&$#@+....+@$%;;;-***-**=&&$#.++@#%%&********-*=&..+@#%%&********-*=&.+@#$%&********--=&#..+@#$%&***-****-*=&..+@#==;--***%#@++...@#$;;;-*;==$##@@++...+@#==;*-***%#@+....",
+".@@#%&&**-*-**=&%#@.@#&;*-*-*&&&*-*--==.+@#&&&-*-*-**=&&#@+.+@#%&&**-*-**&&%#@@.+@#%&&-**-***&&&#@+.@@#%&&**-*-**=&%#@+.+@#&&&**-*-*-&&%#@+.....+@@$%&&&#@+.+...@@#%;;;*--*-*-&=%#@..+@@$%%**---***--==.++@@$%%**-*-**---==.+@##%%*-*--**-*-==#.++@@$$%****-**---==.+@@$==;**-**$#@++...@#%;;;-*;==$#@++.+..+@@$==;-****$#@@....",
+".+@#%&&***-***&&%#@.@#==**--*%%%*-*-*=&.+@@%&&****-**&%%#@+.+@#%%&***-***&&%@@+.+@#%%&**-*-**&%%#@+.+@#%&&**-****&&%#@+.+@@%&&**-*-**&&%#@+.....++@#$&&%#@@.....+##%;;;-***-**&%%#@..++@#$%*******-*-=&..++@#$%**-*-***-*=&..+@##%****-***-*=&#...+@#$$**-*-***-*=&..@@$==;-****$#@+....@#$;;;**;==#@@+......@@$==;*-***$#@+....",
+"+++@@#$$$$%$$$$#@@+.@##$$%$$$$$$$$%$$$#.++@@#$$%$%$$$$#@@++.++@##$$$$$%$$$##@++.++@##$$$$%$$$$#@@++.++@@#$$$$$%$$$#@@+..++@@#$$$$%$$$$#@@++......+@@#@##@++.....@@%%;;;%%%$%$$$#@@+...++@@#$$%$%%$%$$$#...++@@#$$$%$%$%$$$#..++@@#$$%$$%%%$$$#@...++@##$$$%$$%%$$$#.++@#=======&$#@++...@#$&=;===&&#@++.....++@#=======&$@@+....",
+"..++@@#####$###@@@+.+@@###$###########@.+++@@####$####@@@....++@@###$#####@@++...++@@####$#$##@@@+..+++@@###$#####@@@+..+++@@####$####@@@.+.......++@@@+@.+.....+@%%===$$$#$###@@@....+++@@#######$###@...++@@@######$####@...++@@###$####$##@@....++@@###$#$##$##@..@@#&&==&=&%#@+.....+@#&&===&&&#@++......@@#&&===&&&#@++....",
+"...+++@@@@@@@@@+++...+@@@@@@@+@@@#@@@@+...+++@@@@@@@@@++.+....+++@@@@#@@@@+++.....+++@@@@@@@@@+++.....+++@@@@#@@@@+++.....+++@@@@@@@@@++.+.........+++++.+......+@@#######@@@@@++.+.....+@+@@@#@#@@@@@+......+@@@#@#@@#@@@+....+++@@@@@@#@@@@++.....++@@@@@@@@@@@@+..++@##$$#$##@@+.....+@@#$#$$###@@.+......++@##$#$###@@+.....",
+"....+.++@+@+++++......+++@++++++++@++++....+.+++@+@+++++.......+.+++++@++++.+......+.+++@++++++.+......+.++++++++++.......++.++@+@@+++++...............+.........+@@@#@@@@+@+++++........+.++++++@+++++........+++++@++@+++.....+.++@+@++@++++........+++@+@@@+++++...+@@@@@#@@@@+......++@@@@#@#@@+++........+@@@@#@#@@++......",
+".......................+++++.........................................................................++++@@@@@@@@@@@@++.............++.+.......+.+++++++++++...........+++++++...................+........................................................................+.+....+......++@@@+++++..+..+........................",
+".....................+++++++++.................................+.+++.+.++.+.+........................++@#@#####@####@@+...........++++++++.....+++@@@@@@@@+++.........+++@@@++..................+......................................................................+..++.+.++.+.+...@@@###@@+++++.+.........................",
+".....................+@@#@@@+++....................+........+++++++++++++++++++......+.+++...........+@##$$$$$$$$$$$$#@.........+.++@@++++...+.+@@@#####@@@++.........+@@@##@@++.............+++++++++.......+.+++++.+...............+...........+.++++++..+...........++++@+++++++++...@#$$$$##@@@+@+++++.......+.+.+...+......",
+".......+.+++........+@@%%$$#@++.+................+....+.....++@@@@@@@#@#@@@@@@+.....+++++++.........+@##***=======***$#.........++@@#$#@@+....++@%%%%%%%&%@@++......+++@#&&%#@++.............++@@@@@@++.......++++@+++......+..++.+.+...++++.+...+++@+@+++++.++.+.....+++@##@#@@@##@++..#==***%%##@##@@@@++.....+++++.+.++++++..",
+".......++@+@+++.....@@#%&%%%#@@+.....+.....++++++++++.+.....+@###$#$###$#$###@@...+.+@@@@@@++.......+@#$***;;=;=;;***%#....+.+.++@@#%$$#@@....+@@%%&&&&%&&#@@.....+.++@##&==##@++..........+++@######@@....++++@@#@#@++.+.....+++++++@+++++++++.++@@#@##@@@@++++++....++@##$#$###$##@++.$==***&%$$$$%###@@@..+.++@+@+++++@+@+++.",
+".....+++@@#@@+++....@#$&&&%%$#@++..++.+...+.++@@@@@@@@+.+...@##$$$%$%%%$%$%$$#@....+@@###@@++.......+@#$***;;=;;;;***%$...+.++++@@#$%%$##@+..++@#%&===&&==$@@++...++@@#$$===$##@@++........++@#$$%$$##@...+++@@#$#$##@++....+++@@@@@@@#@#@#@@@+.+@##$$$#$###@#@@@@+..++@#$%%$$$$$%%#@@+.$=;***&&$%$%%%$$$#@...++@@#@@@+@@@#@@@+.",
+".....++@#%%$#@++....#$%*****%$#@++.++++...++@@##$####@@+++..@&=*-*****-*******#..+++@$%&&&#@++......+@$%***;;===;=***%$.++++++@@@$%%-*%$#@+..++@#&&&;;==**$#@+..++@@@##$%***%$##@@+........+@##-****=&#.++++@@#%&***$#@@+.+.+@@##$$$$#$#$#$$#@@.@#$=====%%%$$#$###@..+@@#=====%&&**%##@.#==***;==&=**===&&$.+++##$&&##@@#%%%#@@.",
+"....++@##%%%$@@++...##%**-**%%#@++++@@@..++@@#$$$%$$$##+++..#%&-**-*-*-*-*****#...+@@%&==&#@++......@@$%*-*;=;==;;-*-%$.++@@@@@@#%%&*-%%$@@..+@@#&&=;;==**%#@++.+@@#$$$%%*-*%%$$##@.......++@#$*--**=&#.++@@##$%&***%$@@+++.@@#$$$$%$%$%$%%%$#@.@$$=;=;=&&&%%$%$$##.+@@#$=;;;=&&&**%$#@.#&=***;====--=;===%..+@@$$=&$####%&%$#@.",
+".....+@$%**&&#@+....@#$%%*-*=&#@@@@#$%%.++@#%&&**-*;;%%#@++.@$$%%%%%;;;%%%%$$#@...+@#$%===$#@+......@#$$;;;*****;;--*%$.@@$$$$$$#%%&**&%$@@..+@#$%&=;;&&**%$#@@.+@$%==;=;*-*=;===%$.......+@@$%==;;=%$#.@@$$%%%=&===$$$##@+.@#&=*-*-**-******$#.#&=-*-*******-*-**#.+@#$%===;=&&&**%%$@.#$$&&&**&&&==***;=%..+@#$%**%$$$%***&%#.",
+"....+@@$%**&&##+++..+@#%%***=&$@@@@#$&%.+@##&&=*-*-;;&%#@@+.@##$$%%&;;;%%%$$##@...+@@%&===##++......@#$%;;;*-***;;*--%%.@#%%%%%$%%%&**&%%#@.@@##$&&=;;%&**%$##@.@#%&=;;;=-*-;=;==%%......++@#$%=;=;=%$@.@#%%%%&==;;;%%%$##@.@#&=--*-*-*---***$#.#==*--*******--***$.@@#%&===;;&%&-*&%%#.@#$%&&**&&&=;***;=%..+@#$%**%%%$$***&&#.",
+".....+@$%-*=&$#@+...+@#$%-*-==$####$%&&.@@$$&&=--**;;=&$#@+.@#$$$%%%;*;%%$###@@...+@#$%;==$#+++.....#$%%;*;***-*;;-*-%%.@#%&&&&%%%&&*-&&%#@.@##$%&&&;;&&**%%$$#.@#%&;;;=;*-*;=;=;%%......+@@$$%=;=;=$$@.@#%&&&&===;=%%%%$$#.@$==*--*-****-*-*$#.#&=-*-**-*-**-*-**#.@#$%&===;=&&&**&%%$.@#$&&&-*&&&==*-*;=$..+@#$%**%%%%%***=&#.",
+"....++@#$==**$#@++..++@#%;;;&&$###$**&%.@#%&***%;;;;=;;&%#@.#%&%%%%&;;;&&$$$##@.+..@@%%===$#@+......$$***-*;;;==;;***==.##*****-*-*-**;;;$#.$%%=;;;;**=;-*;==&&.##==***;=-**;;;;;=&.....++@#==;***-*%$@.#$***-***-*-*****%$.@#%%***%%%%%&&***%$.@#$%%&**;;;**%%$$##.#$%***-******--***%.@#$===*-&%%%%***&%$..++@#$**=&=&=;;;**$.",
+"....++@##&=**$#@@+..++@#$;;;&&$$#$$**&%.@$&&***%;;*==;;&&$@.#&&&&%%&;;;&&%$$$$#...+@@%%;==$@@+......$%****-;;=;;;**-*==.@#**-*--*-****;;;$#.$%&=;;*;-*;=*-=;==&.##==*-*;;**-=;;;;;&.....+@@$=;;**-**%$@.#$**-*--*---*-***&%.@#$%***%%%%%&&***%$.@@#$%%**;;;**%%$##@.$$%***-******-****&.@#$==;**%%%%%***%%#..++@#%**=&&=&;;;**#.",
+"....++@##%%**%#+++...+@#$===**%$$%&**%$.#$**===%&&=;;&%**$#.#&===;=;--*;;====&%..+.@#$%===$#@++.....#$==;==;====**;;;&&.@#$$%%&**&&&&&;;;%$.%&&;=;;;**;=**;===&.@$==***%%***&%;===&.....++##=;;;;===%$@.#$=;===%&***===&%$#.@#%%***%$#$$%=*-*$$.+@@##$%%;;;=&$$#@@@.@##%%===;;&&&*-&&%#.#$%***-*%$$$$=;==&#...+@#$&=***;;=&&$$#.",
+".++++@@#$%&**%#@+....++@#&==**%$$&&**$#.#$**===%&&&;;&&**$#.$&===;=;**-;;=====%..+.@@%%;==$#@.......@$&==;==;=;=**;;;&&.+@#$%%%-*&&&&&;;;%$.%%&=;;;;**;=*-====&.@$&=**-&%-**&%====&.....+@@$==;;;==&%$#.#$;====%&*-*==&&%#@.+@$%***%$##$&&***%#..++@@#$%;;;==$#@@+..+@#$%==;==&%&**&&%#.#%%****-%$$$$==;&&$..+++@$&&***;*&&&##@.",
+"..+@@###$%%-*%$@@++...@@#&==**%%%%&**##.#$**=&&%%&=;;&&**%$.#&=====;*-*;;=====%...+@@%%=;=$#@++.....@#&===;=;==;**;;;&%.++@@$%%**&&&&&;;;%$.$%&==;;;**;=**===&%.@$==***%&*-*%&=====......@@#=;;*;===%$#.#$=;===&%*-*=&&%$#@.@#$%***$$###%&*-*$$..+++@@#%;;;=&$#@+.+.+@@#$===;;&&&-*&%%#.#%&*****%$$#%====&#...+@##&=***;;&%%#@+.",
+"++@@$$%==$%;;&%#@++...+@@#$%**=&&%$$$#@.$$*-=&&$$%%**&&;;&%.@##$$%%%;;;%%%$$###...+@@$%***$#@++.....@#$%***-*--*--;;=%$.+++@@$$;;=;=%%%%%=&.@##$$&&=;;&&*-%%%$#.@$&=-*-;=*-*;;;;;=&..+.+.+@#$%%**;;;;=$.@$==;;;&%;;;==$$#@+.@#$%***%$##$%&***%$....++@#$=;==&$#@+....+@#$===;=&&%*-%%$@.#&==;;**%%$$$&====$...++##%%-*-;;%$$@@+.",
+"+@@$$%%;;%%;;=%#@++....+@@$$**==&$$$@@+.#%**===$$%%**&&;;&%.+@@###$%;;;%$$####@...++#$%***%#@+......@##%**-*-**-**;;;$#...++@#$=;;=;%%%%$&&.@@##$&&=;;&&**%%$#@.@$&=***;;-*-;;;;;==.+.+++@@#$%%**;;;;=$.@#&=;;;%&*;;=&%#@@+.@@%%***$$##$%&*-*%$.....+@@#==;=&$#@+...++@@#===;=&&&*-%$$@.#&====**%%%$%&==;=$..+@@#$%%-**;;%$#@++.",
+"+@$$***&&$%=&;=$#@@...+++@#$%&***%$#@@+.#$;;;==$$$%;;==;;=&.+++@@#$%;;;%$#@@@@+...++@$$***%$@@+.....+@#%;;;=&%&%&&;==$#...+++@#%%**-%%$####.++@@#%&&;;&%**&&%##.@#%&;;;%%*-*&%===%%.+++@@@@#$%%;;***;;#.@#%%*-*=&=;;;;%##@+.@@$%***%$$#$&&***%#......+@#%%&;;$#@@+...+@#$&===;&&&**&%$@.@##$%%=;=&&$%&=&==$.+@@#$%;;*-***%%$@@+.",
+"@#$%***&&%%&&;=%$#@.....+@@#%&***%$$@++.#$;;=;=%$$$=;=;;;&&...++@##%;;;%$#@@+++....@@#%***%$#@++....+@#$;;;&=&%&&&;;=$@.....@@#$%***&%$##@@..+@@#%&=;;%%**&&&#@.@#%&;;;%&***%%&&&%$.+@@@###$$%&;;***;;$.@#$&***&&;=;;;%$#@@.@#%%***%%$$$&&*-*%$.....++@@$%&;;%$#@++...@@#==;==%&&-*%%#@.@@###%==&=&%%=====#.+##$%%;;**-**%%$#@+.",
+"@#%%***=&%%==;;%$##......+@#$%***%$$#@+.##;;;=;$$%%;;==;;&&....++@#$;;;%%##++.+....+@#$*-*%$#@@++...+@#$;;;=&&%%&%==&#@.....++@$%*-*&%$#@@+...+@#%&&;;&%**=&&$#.@@$%;;;%%--*%%&%%%#.@##$$$%$%%%;****;;$.+#$%***&&;=;;;%$$#@.+@$%***%%%%%&=***$$.....+.@@$$%;;%$#@@+..+@@$&==;=&&&**%%$@.++@@#$=====%%====&#.@#$%%&;;-**-*&%$##@.",
+"#$;;----*;;;;**==%$.......@@#$=;=;;%##@.@#$%***;%$%%&****%#.....+@#%;;;==$##++....++@#$;;;==$#@@++..+@#$=;;**;=;&%$$##@.....++@#$%&&=;$#@@+..++@@%%=;;%$&&***%$.+@@#$$%%%***%$$##@@.@&&===***-*;;;;;%%$.+@#$;;;-*=&===;==$#.@#$%*-*;;;;;;;*-*%$.......+@@$$====&#@+...@@$&=;;;===-*%%#@.+++@@#%&;;;;;***%$#.#&=*--**%%%==***$##.",
+"#$;;*-***;;;;**;=&%.......+@@#&==;;%%##.@@$$***;%%%&&****$#....++@#$;;;;=%##++....++@@$=;;;=%$#@++...+@#===**;==%%##@@+.....+++@#%%&;=%$#@@..++@@%%&;;%$&&***%$.++@@@##$%***%$#@@@+.#&====****-;;;;;&%#.+@#$=;;--&&&==;;=$$.+@$%***;=;;;;;***%$........+@#$=;===$#@..++@$&==;;===*-%%#@..+.+@@$%;;;;;***%$@.#&=-*-**%%%&=***%$#.",
+"#$**===&%====;;**%%.......++@##$%&=**%$.+@##$$%=***%%%&$$#@.....+@#$;;;;;$$#+++.....+@#$$%**=&%#@++.++@#$%&*-;;;$$#@@++.......++@##$&&&&%#+...++@$%%==$$#%&&&;;..++@@@#$%-**%##@+++.@%&=;;=;&&&%%&&&==#.++@#$%%&=%$$$$=====.+@$$===%%$%$%&;;;$#.......+++@#$%;==&%@...@@#&&=;;;=;**%%#@...+++@#$%&&==&%%##@.#%&&=&%$$#$$$%&&**%.",
+"@$**&&&%%==;=;=-*%$.......+++@@#$&&**%%..+@@#$$=***%$%%##@@.....+@##==;;;$##+.+....+++@#$$**==&#@+..+++@$$%**;;;$#@++.........+++@##&&&&%@@...++@#%%&&###$&&&;=.....+@@#$***$#@@+.+.#$%=====%%%$$%%%==#..+@@$$%&&$#$$$&====.+@#$&&&$$#$$$%;;;$#........++@@$$=;=&%@...+@#%&=;;;=;**%$#@....+++@#%%&==&%$#@+.@%%&&&$##@@##%%%**$.",
+"##**&&%$$&&====**%$.........++@@#%&**%%.+.+@@##&***$#$$@@++......+@#===;=$#@++.......+@@#$**=&%#@++..++@#$%**;;=#@@+............++@#$%&%%@+....+@##$&&#@@@%%&==....+.+@#$***$#@+....@$%&====%%$##$$%&&#..++@@#$%%##@@#%&&&&.++#$%&&##@@#$$===#@.........++@#$&==%%@..+.@@%%&;;===**%$#@......+@@$%%&&$$$@++.@$$%%%##@@@@@$$%**$.",
+"@##$######$#$$$$$##.........+++@@##$$%%....++@@#$#$##@@@++......++@@##$#$#@@+.........+@@##$&%%#@+...+++@@#$$$$##@++...........+.++@@####@+....++@@@#@@@@@#####......++@#%%$#@++....@@###$###@#@@@###@@....++@@@@@@@@@#####.+++@##@@@@@@@##$##@.........+++@#####@@....+@@##$%$%%&&$#@+......++@@@####@@@++.+@@#@@@+++++@@###$#.",
+"@@@@#@@@@@@#@####@@...........++@@###%$.....++@@##@@@++++........++@@@##@@++...........+@@##%%$@+++....++@@####@@++...............++@@@@@++.....+++@@@++++@@#@@.....+.+@@#$$#@+.....+@@@#@#@@@+@@+@@@@+....+++@@@++++@@@#@@..++++@@@++.+@@@@@@+...........++@@@@@@+...+++@@######&%#@++........+@@@@@@@++...+@@@@@+++..+++@@@@@.",
+"++@@@++++@+@@@+@@@+.............++@@@@@.....+.+@@@+++++...........++@@+@++++............++@@@#@@+.+....++++@@@@@++.................+.++++........+++.++..+.+++@......+++@@@@++++.....++++@@+++..+.+++++.....+...+..+.++++++...++++.+.+..++@++++...........+.+@@++++....++++@@@@#@#@@@++.........+++@+++.......+.++......+++@@++."};
index 9bca70a282183d7452b859cb0d98c67142bb2e26..5ba394131a1a038da2eb32f2e0c822f1db798f7e 100644 (file)
@@ -145,24 +145,24 @@ static unsigned char matrix1b_bits[] = {
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf7, 0xff, 0xff, 0xfd,
+   0xff, 0xff, 0xff, 0xff, 0x8b, 0xff, 0xff, 0xfd, 0xf7, 0xff, 0xff, 0xfd,
    0xfe, 0xe9, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff,
-   0xff, 0xff, 0xff, 0xfd, 0xe7, 0xff, 0x4f, 0xfd, 0xfd, 0xeb, 0xff, 0x5f,
-   0xfe, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf7, 0xff, 0xff, 0x7f, 0xfa,
+   0x01, 0xff, 0xff, 0xfd, 0xe7, 0xff, 0x4f, 0xfd, 0xfd, 0xeb, 0xff, 0x5f,
+   0xfe, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf7, 0x83, 0xff, 0x7f, 0xfa,
    0xfd, 0x57, 0xdf, 0xfe, 0xfe, 0xfd, 0xff, 0x8f, 0xfa, 0xfb, 0xff, 0xff,
-   0xff, 0x3f, 0xea, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xb7, 0xbf, 0xfc,
+   0xff, 0x3f, 0xea, 0xfb, 0x01, 0xff, 0xff, 0xfb, 0xfb, 0xb7, 0xbf, 0xfc,
    0xfd, 0xe9, 0xff, 0xbf, 0xfe, 0xfa, 0xf7, 0x4b, 0xff, 0x7f, 0xfa, 0xff,
-   0xff, 0xff, 0xbf, 0xfe, 0xfe, 0x6f, 0x9f, 0xfe, 0x7e, 0xea, 0xff, 0xcf,
-   0x7d, 0xfb, 0xdd, 0x97, 0xff, 0xff, 0xea, 0xff, 0xff, 0x7f, 0xff, 0xff,
+   0x83, 0xff, 0xbf, 0xfe, 0xfe, 0x6f, 0x9f, 0xfe, 0x7e, 0xea, 0xff, 0xcf,
+   0x7d, 0xfb, 0xdd, 0x97, 0xff, 0xff, 0xea, 0xff, 0x03, 0x7f, 0xff, 0xff,
    0xf1, 0x6f, 0x3f, 0xff, 0xff, 0xca, 0xff, 0x1f, 0xfb, 0xfa, 0xeb, 0x7f,
-   0x2f, 0xbd, 0xfc, 0xff, 0xff, 0xff, 0x7f, 0xfd, 0xfd, 0xbb, 0x3f, 0xff,
+   0x2f, 0xbd, 0xfc, 0xff, 0x81, 0xff, 0x7f, 0xfd, 0xfd, 0xbb, 0x3f, 0xff,
    0xfe, 0xf7, 0xff, 0x4f, 0xfe, 0x7c, 0xea, 0xbf, 0xff, 0x7f, 0xeb, 0xff,
-   0xff, 0x3f, 0xfe, 0xf9, 0xea, 0x57, 0x7f, 0xfe, 0xfd, 0xcf, 0xff, 0xdf,
-   0xfd, 0xfb, 0xdd, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0x3f, 0xff, 0xfe,
+   0x03, 0x3f, 0xfe, 0xf9, 0xea, 0x57, 0x7f, 0xfe, 0xfd, 0xcf, 0xff, 0xdf,
+   0xfd, 0xfb, 0xdd, 0xff, 0xff, 0xff, 0xfa, 0xff, 0x81, 0x3f, 0xff, 0xfe,
    0xa8, 0xff, 0x3f, 0xff, 0xfe, 0xf2, 0xff, 0x3f, 0xff, 0xff, 0xeb, 0xff,
-   0xff, 0x7f, 0xfd, 0xff, 0xff, 0x7f, 0xff, 0xfd, 0xeb, 0xff, 0x7f, 0xfe,
+   0xff, 0x7f, 0xfd, 0xff, 0x01, 0x7f, 0xff, 0xfd, 0xeb, 0xff, 0x7f, 0xfe,
    0xfe, 0xfd, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
index 4340bf2e83dfe06bbb23735baaeaac3a455caa0f..037eb64c668fe0b691d963faefda7e7d78364d9a 100644 (file)
 /* XPM */
 static char * matrix1b_xpm[] = {
-"160 182 15 1",
+"160 182 42 1",
+"      c None",
 ".     c #000000",
-"+     c #061406",
-"@     c #279027",
-"#     c #0F390F",
-"$     c #081E08",
-"%     c #217A21",
-"&     c #2BA02B",
+"+     c #030E03",
+"@     c #061406",
+"#     c #081E08",
+"$     c #0B2A0B",
+"%     c #0F390F",
+"&     c #165016",
 "*     c #1B641B",
-"=     c #165016",
-"-     c #0B2A0B",
-";     c #030E03",
-">     c #34BB34",
+"=     c #217A21",
+"-     c #279027",
+";     c #34BB34",
+">     c #2BA02B",
 ",     c #5AD25A",
 "'     c #81DD81",
 ")     c #A7E7A7",
-".............;+$+;.....++++;....;$--#$+....+-#$+....;++;..................;+;......+-##$;...;-##$;.....;+++................................................+--$;",
-"............+$#=-+...+$----$$...+#=**=$+.++#*%=$$..++---$.......;++......+--$$....+$=@*-+...$#%*#+....+$##-$......++......................................+$**-+",
-".;..;..;..;.$#@>*-+..+#***%=$+.+$=%@@*#+.$-*&>%=$+;$#*%=-+.;..$$##-+.;..+$*%=$+.;.+#*@*-+...+=%@=-+.;;$#@&=-+.;..;$-$+.;..;..;..;..;..;..;..;..;..;..;..;.$#@&=+",
-"...........;$*&,%-;.+-=@@@&*#+++#*&&&%=$+-*@&>&*-+;-=%@%#$...+$=%@*-+...+#%&*$;..;$*@%#$.;..+-*@%#+;;+=*&>%*-+..;-*%#+...................................;$*@@#+",
-"..;..;......$*>,%#+.;-*&&@>*#+;-=@>,>@*$+#%@@@&*#++#*@@%*-+..$=%@@%-+..+$=@@=$...;-%@%#;.....$=@@#$.;$*@,'&%#$..$#@&*$+..;..;..;..;..++.;..;..;..;...;...;#%@*-+",
-"...;..;;....$*>'%#+;.-*@@@&*-;;-*@>>,&*$$#%&@@%*#++#*@@@*#+.+$=%@%=#$+..$=*=#+...;#@&*$+.....$#@>=$.;-=@>'>%#+++$=&>*#$$..;..;..;..+$-----$;;..;...;....+$=@@=-.",
-"........;..+$=&,%-;..$#====-+;+#*&>&,%*$+#*&&&@*#+;$=%@@%#$;;-*&&%*#$+..;-#-+..;.;#@>*$+.;...+#@>=$..$=%>,&*#++#*@>'&%=$..........+#*%%%%%=$.....;...;..+#*%*-+.",
-".;.;........+=@>*-+..;$$-$$+..;#%&>&>%#++$=%@@>@=$+$=@&&%=$.;-*&>&@*#;+..;;;.....+#@>*$...;..+#@>*$..$#%@@&*#++=&>,',>%$..;.;+;..;+=>&,,>>%$.;..;;;....;-*@%#$+.",
-".....;.;.;..+-@&=+.........;..+#&,>,,%=$+-*%@@&@*$+-=%&&@*#.+-%&>>>@=+...........;#%&%-+.....$=@&=++.+#***%=$++-*%>,%%=$...+-#-+..;-**%***=$...++$$+.;.+#%%*-;..",
-"............;-=*#+.;..........+#@&&&&*-++#%&&&>@=$;+#*@@@%#++=%@&&>@=$.....;.;...;-*@%#+..;..-=@@#+..;$----$+..$$=%,*#$;;.+$**=$;;.+$----$$;...+==#+..;-*&*#+...",
-".;......;.;..-=%-+...;...;....;-%&&&%=+;;-*@>>@=-+.;$=%@@%-++#@&>>>&*$+.;.....;...$=%@=$;...;#%%*#;....+;+;;....+#@&=++...+#@&*$;....++.+..;.;;$*@*-;.+#%@*-+...",
-"...;.;.......+=%-+....;...;...+-*@&@%#+.;$-#%@*-+...;-***=-;+-=%&&@@*$...;.;......;-*@*#+..+$#@%=$..............+$*%#+...+-=@%#+....;.;........-=%*$;.$=%%#+.;..",
-"..........;..+$-+...;.......;..$=%@%*-+...;$=*#+.....$---$+.;+-#####-+.......;.;...+#%=$+...+#*=$+..;........;...+$-+;;...$=*=-+;........;.....+-#$;;.$#*=-+....",
-".;...;.;.......;;.;....;.;......$###-$.....+--$;;....+++++.....+++++;;.;..+.;...;...$$$+....++$$+;;...;..;.;..;..;.;......+$#$+...;...;....;.;...;;...;-#-+..;..",
-"..++$$$++..;+++++;..;.+$$$$++...+$--$++.....+$$++.;++$$$$$+.....+$$$+.;$$$-$-+;..;++$$$++;..;$$$++.....;...........;..;.;..;;..................;....;...++++;...",
-".+$#=*#-+..+-#*=$;...+$#**=#$+++-#**=#$+...+-==#+;;$#=**==$.;.+-#=*=-++#=****=$;.+-#**=#$;.+$#=*#-$.;....;.;...;..............;.;...;..;.;.......;.....+$-=#-$+.",
-";$=%@@@*-++-*&>&#$..+-*%@@&*#+;$*%@&&*#+.;.$=&&%$;+-*&&@@*#;.+$=@&@%#$$=%@@@@%#+;-*%@@&*#+.+#%@%%*#;.........;......;....;..++$++.;.....;..;++$$++..;.+$=%&&*#$.",
-"+#%@&&&%=$+-%&,>*$..;-%&&&>@*$+-*&&&>@*$..+#%>>@#++#%>&@@*-;.$#%>,&%#+$*%@@&&@#++#%>&&>@*$+$*&&@&@=+..;++$+....;.;++$+;...;+$#==-+.+++$$$+;;+#==#$+;..;-*>>>&*-+",
-"+#@@%%%@*$;$#*&>=$+.+-*%%%@@*$+-=**%&@*$;+$=@&>@#+$#%>&@%*-+;-*&&@%=-++$##*%@%#;+#@@%%@@*$$#%@%%&&*$..+-==-+.....+-==-+..+$-=%@@=++$#====#-+$*@%%=#$+.+#*@%@@@#+",
-"$#@@**%@*-..+#@>*$..;$-##*@@*$.+-#*%>&*$.+-*&@&@#++#%>,>&%#++-%,&@%*-+.+$-#%%*-;$#%@@%@@*$+#%@%*&,*$;.+=@@=+.;...+=@&#+++$#%%@@*-++-*%@%@%=$+-*@&&*#-+;$=%*%@@#+",
-"$=@%==%@%$;.+#@,=-;..++-=%>%=$..$#%>>@*$;$=%&@>@=++#*%@&>>#$+#%>>>&&#$..+$=@@#$.+#@&>,>@*$+#%&@%>>*$..+#%%#+...;.+#%@#+.$=%>@%=#+++=%&&@&@*$+;-=@&&&=$;+-=%&&%#$",
-"$#@@*#%@%$;.+#@>*$+...$#@>@=$;;;+#=@@@*$+#@>&@>&*$;$#==*&>*$$#%>&@>>*+..;-=@*#;+$#%&@&&@*$+-*&>>>,*$+..-##$+.....+$##-++-*@,@*=$+.+=@@&&@&%$.+$#*@>>*$.+$=&&%=-;",
-"$#@@*=%@%$;.+#@>=-...+#%&>*#+..$##=*@@*$+#%>&&,&%-$-###*&>*+$#%,*%&>*$;.+#*@*-;.+=@@%%@@%$++#%>&>>*+.;.+--+;...;.++$$+.;$=%&&%=-+++=%@&&&@*-.;-=@@&&*$..$=>&=-;.",
-"$#%@%%%@*$;+-*@,%#$;+-*&>&*#$++-**=%@@%-+-*&@>,>%#+=**=%&>*$+#*>%%&>*$..+=%@=$.;+#@&@%@@*-;+#*%@>&=$..+$##$+.....;-##$+.+-=%&&@*-+$#%%@@@@*$+#=%&&%#-;..+#%%#+..",
-"+#*@@&&%=++$=%&>@*#++=&,&&@*#;+#&&@@>%=$;+#=%&>>*#+=%&@&&@#++$*&&@,&=$..+=&@#$..+#%&&&>@=$+$#@@&&@#+..+#%@#+;...+$=@@#+..;$#*%&@=++$#=====-+$*@@%*#$;...+#%*$+..",
-";$#*%@@=-++-*@@&@%=++#@&&@@%#$+-%@@@@*-+.;$-*@&@*$+-*@&@%=-..+-*@@@%#+;.+#@*-;...$#%@@@*-++$=@@@*#$+.;+#%@#+....;#%&%#+....+$#==-+.+++$+$++++#==#$+;.;..+#*=$;..",
-".;+#=*=$;.;$==%%**-++-=%%%**#+.$#=*%=#+...++#=%*=+.+-=%*#-+;.++#=*=#$;..+$=#$;.;.;$#**=#+.;$#=*=#$+...+-==-+;...+#%%=$+;.....++$++..........;+$$+.....;.;-##+...",
-"..++$$$+...;$$---$$..+----#$$...+$---++....+$$-$++.++$--++..;.++$-$++....+++;;....++--$++..;+-$-+......+$-++..;.;-=#-+...;....................+..;;;.....+$+;;..",
-"..;;$$++....+++++.;;.++$$+++;.;..++++++.+++;++++...++++++++..++++++++....+++++;;.;+++++++;.++++++++;...++++++.+;;+$++++..++++++..;.+++.+++++.+++;;;+;.;..;++;...",
-";;$#==#++;.+--##++..+$####-++..++-##--$+$-####$++.+$##=##-+.+$##=###-++++$###-$++$-##--#-++$-###--++.;+-####$++$##--#-$+++-##-$+..+---$;$--++$-$$$#-$;;;+----$+.",
-".+#%&&%#+.+$=%%%#+..$=%@%%*=$;++#*%%%*=-#%%@%%*#$.-=%%@%@%#++=%@%@@%*$;$#*%%%*=$-=%%*=%%*-$=*@@@*=-+.+-=%@%%=$-=%@**%%=++#*@%%#$+;-=%*#-=%*#-=%*#=%%=$;$#**%=#$;",
-";#*@&&&=-+;$*@,>*-++-*&>&&@&#+$#%@&@&&%#=@&&@@@@#+-*@>&&&&=+-*@>&@&&%-$#%&&&&&%#-%&&%*@&@#+=*@>>@*-+.;#*@>&@*--*&&@@&@*$+#%&>@=-;.-%>@*=%>@##%&&%*&&%$$#%&&@&@#$",
-"+#%@@&,*-+.$=@&>%=+.-*@&&@&>=--%&&%*@&%##@&@%%&>*--*@&@@>>*$-*@&@%@&%-#%&@%%@&%#-*&&%%@&@#+-=%'&*#$..+$=*@&@=$-*&&@&&%=++-*&&%#++.-*',%%&,&=#%>>%%>>*$-%&@%%&>*$",
-"+=@@@@,%#+;+=%&&@=$+$=%&@@>,*-#@>%##=%*-#%&%*=@>%-+=%&%%&&=++=%&%@%%*-#@>%==%%%-$*@&%%&&%-++$*>@=$+...+$=%%%#+-=&&&>@#-+;-=@&=-+.++*>,&%&'&##%&>&@&,*-#@>%==@>%-",
-"$=@&>,>%=++$=@&@>*#+$#%,@&,>*-=@>*-+$-$+-%@%##*@%#$#%&&>@*#++#%&&&@*-+#&>*##**=$$=@&&@&&*-.;-*,@-+...++$#%%*-+$=@',,*#+..+#@@=++..-*,,&>>,@##%@&&&>>*-#@>*-#*@%#",
-"$#@&&,>%=++-*@@@&%=$$=%>&&&>%##@>*-+++++-%@%#-*%@#$#%,,'&=-+$#%,,,@#++#@>%#*@@*-$=@>@&&@%-..;=>@#+;.+$-$#%%*-;$=@>,'@#$..+#@@=-$++-=>>,,&,@##*&@>>>,*$=@>*-#*%@#",
-"$=@&&>>@=$$#@>>,>@*-$=%&%%@&%#=@&*#$$#$$#*@%##*@%--=%&&&@*=+$=%&&&%-;;#@>%=%&>%#$=@&%%@&*-;;$*>@#++;-*%=#%@*-+$=@@&@&*#+.+#@@*=*=+-*,&@@@>@##%@@&&>>*-#@&*-#%@%#",
-"$#@&@@&@=$$*&,@@&,@#-=%&%%@&%##%&@===**$#%&%=*@>%-$=%@@@@@%--=%&@%=$+;-%@@*%@&%#-*@@%%@&%#.$-*,&=-;;#@&%*@@*$;$*@&%@&@=$.$=@&*%&%#$*,&%%*,&##%@%%@,,*-#%&%**@>%-",
-"$#%&@@@%#$-%'>@%&,@#-%&,&@&&*--=%@@@%@*-#@>&@&&&=$-*&>&&&&@--%&>&%#$..-=@&&@&@*--*>&%%@&@#+#*@,&%=$;-%>&@&@=+.-*>&@*@&%#+#%>'@&,%##%&&*=%>&=#%>@%@>>*$-=@&@@&&=$",
-";-=@&>&*-+-*&&@*@>%#-*&&&&&@=$+-=%&@@*#$#@&&&&@*#+-*@&&&&&*--*&&&%#+..+-=@@&@%#$-*&&%*&&%#$#*@&>%=-.-=%&&@*-+.-*&&*=*@%#+#@@&&&&%$-*@@==*&%##%&@=*%@=++#=%&&%*-+",
-".;$#**=#+.+##=##==#$+#=*===#-+++$-==##$+$#*===#-+.$#==*===#++-===#$+...+-##=##+;+#==##==#$+-#==*=#+.+$#==#-+..$#==#--##$+$==*===#+$###-$###$+#==-###$;.+-##=#-;.",
-"..++$-+++.++$$+++++;.+$$$$++;...;+$$$;..++$$-$++.;.++$$-$++;.+$$++;.;....+$$++..;+$$$+$$++.++-$$$+....+$$$+.;.++$+++$++..++-$$$$++.+$$$++$$...++++++;....++++;..",
-".;+++$++.....++++....++++++.....++++++...$+++++++..;+++;++;..++++;+++..+++;+++;..++++;+++..++++++++...+++++++...+----+..++$++.......+$---+;....++++.............",
-"+$#=###-+..+$--#-$+.+-#=##-+$..;+####-$++-#=#=##+;+--#--#--++--#$$-#-$+$-#$$-#-+$$-#--##-++--#--##-+++$##=##-+..-=%*#$+;+#=#++...;.+$#*%=-..;..+#=-+;.......;...",
-"-*@&&&%*#++$#%@@*=-+-=@&&@%#$+;$#@@&@@#+-*&@&&&@#+-=@@=*%@=--*@%*#%@%#-*@%=#*@%#-*@@%*@@%#-*@@%*@@%#+-*%&&&@*-+;#@>@=$+.+=*%-+;....+-=@>%#+...$#%@=$+.;.;.....;.",
-"-%&,,,&%=$$#*@&,&%#+-%>,,>&*#+$#*>>>,>*$#@,,',,,*$#%,>*%&,%--%>&*=%>&##%>>%%@>&=-*>,@%>,&#-%@'&%>'&#$#%>>,>,@#.+#@,%#$..+#*@=-+..;.++=*,@#+..;-=@>*-+....;......",
-"-*@@%%@@%##*&@%%&&*--*>&@%@@*-$*@&@%&&*$=@&@,&>&*-#%>%=*&>*--*>&*=%>@##*,&&&@,@=-=&>@@&>%#-=>&@@&>%#$#@@@@&>%-.+#@>=-+;.+-*@*#+.....+$*,%#+..+#%@&@=+.;...;.;...",
-"$=%@**%@@##@,%==%&%-$=@@%%&&*--*@@%%%@=$#@&%>,&,=$#%@%=#@,*$-=@@*=*@%--*>,>,@>@#+#%&>&>@=$+#*@@@&@=$+#*%%@&%=+.+#@>*$....+#%@*-+.....$=>&#+;.+#@@@&=$;..........",
-"$=%&%%%@%#=@&%##*@@#-=@&@@>@*$-=%>>@@%#+-=%%,@%*-+-%@%#=@>*$$=@@*=%@*--*,>,,@'@#+$#%>,@*-+.$#%&'&=-++$#=%&&*#+.+#@'=-.;..+-=%%=-+.;..$*>@#+..+#***%=$+;...;.;...",
-"+=%>,,>@*-#@,*=#*@%#$=&&,,&%#++#*@&&,&=++$#=,@=#$+#*@%##@,*$;-*@%%@%=$$*&,>&>,@#+$#*&&@=-+.+-*&,%#$..+#=@,%=-+.+$@>*$+....+-*@%#+....+='@#+..+$-#-#-+.....;.;...",
-"$=%,>>&%#$#%>@%*@&%-$=&>>>>%#$-=%%@&,&*$.+-*>@=+;.#*@%==@,=$+$=%@@@*#+-=,,&@'>@-+-*@&&&*#+..+=&>*#+..+#%&>%*#-.+#@>=-;.....$#%%=-.;.+$*&@#+;..;;;;;.;.++++$$$$$.",
-"$=@&&%*#-+-=@&,&&,*--*&&@%>&*##%&@%%>,*$.+-*,&=-+.-*@@%%@>=$.+#@&&&=$+$#@>@%>&%-$=@'&@>&%-.+$=@'*#+;+-*&,@@&%#.+#@>%#+..;...-*%%#+..+#*,@#+..;....;..+$##=#===#+",
-"-*&,@%#$..$#%,>,,@*-#%,&%%@>@#=@'@@&,@=$;$=@,&*-+.$=%@@@&@#+.+-*&'@#+.+#@@%%@@*--*,&@%&)@#++#%>,%=+++-%>>@&>@#.+#@,%=-......+=%&#+..$=@>%#+..........;#*%%%%%%*-",
-"#*%@@*#+.;+#*&&&,>*$$=@@*#*@%#-*@@@%@%#++$#%@@*#+.+$=%@@%*-+..+#%@*-+.;#*%*=%%=$$=@@%*%@%#..#*%@%=$;+-*@@@@@*-;.-*@@=-+...;.+#%@=+;+-=@@%#+;..;.;..;.;#%&&@@@&%#",
-"+-#=##$+...$#*****#++-###$-##$$-###=#-$..+-#=##$+..+$#####+..+;$###++..+###-##$++-#####=#$..$#=##-+..+-#==###+..$#**#-+;....;+#=$+..$#**=$...........+#**%%%%*=$",
-".+++$++....++-$---+..++$+.+++..++$++++.....+$$++;...++$+++.....+++++;..+.++;.++..++$+++++;.;.++$++....+++$$+++..++$-+;.......+$$+....$--++.;....;.....+$-----#-+",
-"..;.+++;.;.;...;..;+.+$++...;.;.;...;.;.;..;+++++........;.;...;+$+++..;........++$++........++++.;....++$+..;.++$++...;.;+++++..;...........;....;....;.;;;....",
-"...+$-$+............$#=#$+..................+#=#$+;.;........;;-#===-+.......;.;+#=#$+......+-##-+..;..+#=#++.+$==-+.....+$===-+...;.....;..........;...........",
-"..+-**#+...;.+.+....-*&@#$+.....;..+.+.....+#%@%#;...++;+....;$=@&>@#+.;.;+.+...-*&@#$+;.;..+=@@#$....+-%@*-+.+#@&*-+....+#%>&=+.....;+.+..;.;++......;..;.++.;.",
-".;+#%,*-+..++$-$$+.;$*&@*#-++;.++$-$-$+.;++$#%&@#+.++$$-$+.;;$#*>>@*#+.;+$$--$$+-*@@*#$++...$=@@=+;..+$#%&%-+.+#%@*#--+;.+$*&'*$.;.$$$--$-+.;$$$$--++..;+$-$$+;.",
-"..+-%@*#;.++#=**=-++$=@&%*=#$++$#=***=#++$#**@&@=++$#=**=#+.+#*@,@%*-++$#=****#$$*@&%*=#++.+-*@@#++.+$=*@@%#+.+#*@%=*=#+..+#@>=$..$#******#++#*==*=-$+;$#=**=#+.",
-"...$#**#+.+-*@&>@=$+$=@&,,,%=$$=%,@&>'=+$=%&>,>@=+$=%&&&@*#+$=%>,>@*#+$=%&&&,&*-$=&&,>>*#+;+#%&>=$..;-*@&'&=+.+-*@@@&%=+..+#%,*$+.$%&'&,'&*--%&&@@&*#$$=%&&&@*#+",
-"...++##$+.+#@&',&*#+$=&>>&>&%-#%&,%&'&*$#%&'&>&@#+#%>,&>>@=++=@,>&@*$+#*&,@>,>*-$=@,&>,%*$.+#*>>=$..+-=%&,&=+.+-*@&>&%=+..+#@>=$;.-%,,,>,>%##%>>@@>@=-#%&>&&>@=$",
-".;...+++;.+#%@&&'%#+$=@&%%%,@##@>@**@&*$#@>@%@&@=$#%,>&&,,*$+$=@&%=#++#@&&%%,@*$$#@&%*@@*$.;$=@'*$...+-#=%>=$.+-*&,)@=-+;.+#%'*-..$=@@@&&&@#-=@&%%@@*-#@>@*%&>*$",
-"..........$=@,>>,%=+$=@@%=%,%#=@,*##**#$#@,*=*@@=$=&'>'',&*$++#@@%-+..#%,&&&>@#+$=@@**%&*-..+#@>=-+...++#*,=$.+-*>,&%=++..+#@@=-+.$=@@@&@@@#-=@@**%@%-=@>%**&>*$",
-".;.;.....;$*&>@%,@=$$*@&%*%,@##%,@*=**=-#%,@%@&@=$#%,&@&&&=$+$=@@%=-+.$=%&,>>@=+-=@@**%&%-++-=@,*#+;..+$#*&=+.+#*&@'&*#+.+-=@'*#++$*@&@&@@@#-=&@**%@%-=@>@**>>*$",
-".....;....$*,&&&,@*--*&'&&&,*##%&&@@@@*$#%&&@&,&*-#%>&&&>&=++#*&>@%=$.+-*%@@@@#+-*,&%*&&%#+$=%,'%*#+.+#=*%&=$.+#@&@@,@*-+$=%,>%*-+$*&&@&&&@=-*&>%%@>%##%&&&&&>=$",
-".......;..+#@>&&&&*$-=@>&&&%=$-#%&&&&@=$$=%&&&>&=$$#%&&&&%#++=%&&&@*$++-*%@@@*-+$=>&%*@>%#+$*%@'&*#++#*@@&%#+.+=@@%*&&%#+$*%&,&*#$-*&@%@&@@=-*&&@*&>@#$=%&&&@*#;",
-".;.;.....;+$#=****#+$#==**=-$++$#=**=#-+++#=**=*#++$#***==$++-=*%*=#+.+#*@@@*#$.$#**##**=$;+#=**=#-;;-*@@%=-+.+$==##=*=+.$#=***#-+$#**==*==-$#=*=#**=$+$-=**#-+.",
-".....;.....+$-$--$+..+$$$$$+.;..+$$-$++...+$$-$$++..++-$$++..+$$-$$-...$-###-+..++$-$+$+++.+;$$$-++..+####$+...+$$$$$$++..+$$-$++.+$$-$$$$++++$$$+$$++.++$-$$;..",
-".......;...;....;.;.;........................+.......................;...+.+..;........+...............++.;......+++$+.;..;+$++....+++++;.......................",
-".;.;..................;....;..;.......;.;.+$++....;........;............;......................;...;.........;...+-##$+....+#=-+;..;$##-++...........;.;....;...",
-".....;.;.;.;..;+........;.+.....;.;......+#=#$+;....+;.;.....;+;.;.+.;.....;..;.;.;+.;.;.;.;.........;...+;....;+#**=$+...+-*@#$...;$=**#+.;.;.;.;......;.;...;.",
-"++$---$++..++-$--$-.;+$--$$-+...+$$--$+.+-=%*#-+..+$$++$$++.++$-$$$-$++$$-++$$-.++$-$$--+.++--++--+..++--$-$+...+=&@#+.;.;+#@,=$.;..+=@@=+.........;............",
-"$#****=#$++$-=****#++-=*=*==$+.+$#=*==#++#@&@%*#+.-=*#-#=#-+$#**==**=-$#*=##=*=-$=**#=*=#+-=*###=*#++$#=***=#+..$*&@#$....+#@&*$....+#@>=-....++++++....;.;.;...",
-"-%&>&>@%=+-=*@>&>>*-$=%&&&&%#+;$#%&>@@=$+=&','&*-+=&&*=@&%#+-*>>@%&'@##*>&%*%>&##%&>%@'&#$=&&@=%&>*$+#%@'>'%=+;+-*)@#+.....#@>*-.;..;#@'*-+;.+--#-#-$+..........",
-"-*',@@@'*##%>@@&'>*$$=%)>&&%#$+#*&'&&@*-+=@&&%%=++=@'**%&@#$-*'&@%&,@##%'&@@@'@=-*&'@@&@#+#@,@%@>'=$+#@@&@,*=+.+-%,%#+;.;.+#@'=$....+#@>%#+.+-*%@%%%=+;....;....",
-";=@&@%*,@#=%'%%%&&=$+$=,&%*=-.+-%&,,&%=++#%@@*#-+.#%&%=*@@=++-%@%%@@%-$=&&&,@&@#$$*@,>%=-+$=@&@&@%#++-*@&,&*#+.+$%,&#+....+#%>*$.;..;#@,@-+.+=&>>>>@*$..;....;..",
-"$=&,&@@>%##@&@@&&&=++-*&%*-$+.+-*&,&&@*++-*@%=#$$.#%@%**@@=++#*@@%&%#+$=&&,>&>%-+-=@,&%#+.+-=&)&%#+.+-*%>&@=#+.;-*&@#+....+#@,=$....+#@&*$+.+=@@@&&%=+.....;....",
-"+=@>&,@%=$$=%@@&&@=$+#*,%*#$+.+#*@&&&>%-+-*@@**=#+#*&@*@&&*$.$#%&&&*-+$#@&>&,&*$$#*&,>@=-+.$#%,&=$..+-*&,@@*=+..$=,@#+;.;..#%&=$.;..+#@'=-.;.$==#==#$+;.;...;...",
-"$=@&@*=#$++$#=%%&@*$$=@,%%*-+.+#@&&&&)%-.$=@>@@%#$-=@&@@'>*+.+-%&,%#+.+#*&&@&%=$-*@>@&&@#++#*&&%#+;.+#%,&&@@*$..$=&@#$+...+#%%=+...++=@@=+...++++++++........;..",
-"-*>>@*#$+..+$-*@>&*$-*@,&&%#+.+#%@&&&%=$.+-*&&@*#++#=@&&&&*$..$#%%*-+.+$=%**%*#+$%&@%@>&#+-*,&,%#+..+-%&&,>%=$;.+#@%=$+.;..+==-+....$=%@#+.......;......;.;.....",
-"$*&&%*$+....+$=%&&*$+#====#$+.++##**=#$+..+-==#-$..+-#*=*=-+..+$-#-+...+$---#$+++#=###==$+$=%%*=$.;.+$#=*==#-+...$#=#++....+$$++;..++#=#-+;.;.......;........;..",
-"+#=*=-++.;...+#=*=#+.+$+$+++....++$$$++.....+$+++...+$;$$$+.;..++++.;....+++++...+$++$+++.+$###-+.....++$$$++.....++++..;.........;.;++++......;......;.........",
-".;++...........+++.....++++;......+++.;.;.......;...+.+.++.....++++.....++$+$+..............+++++.......++.+.;.;.............;..............;..++++.....;.;..;..",
-".......;...;.......;...+-#$+..;.+$---++...;.......;$---$-#$+;.+$#-+.;.;+$#=*=#$+...+++++;...+$---++;.;.$$-++..........;.;.;.....;........;....+$--$$+...;+$$+;..",
-"...;.....;...;..;....;$#*@=-+..+$=%%%#+.+++$+++++++#*%**%%=$..+#%*#....$=%,&&%#+;++$-$--+.++#=%%*#-+.++#=*=-...;.;.;.........;....;.;.;.....++#=%%*#-+.+$#=*#-+.",
-";....;........++.....+-*&,%#$+.$#@&,&*-++$#=====-+$=&,&@&)%-..$*>@#+..+#*&&@&%#+..$#=#==$++#%&>)>%=+.+-=@@&=-.....+.+++..+++++++..........;.+-%&>'>%=$.;#%&&%#+.",
-".......;.;.;.+$--+;.+-*@,>&*-++$=&&@%=$++-*@&&@%=++#@>&&'@*-;.$=,%#+;.-=@'&@%%-+.+$#####+.$=&,,>>&%-.+#%@&'=$+..$--#---++-#=#=##-.....++....-=&',,>&%-+;-*@@*#+.",
-".;.;........+$#=#+..+#%@&&&*#++-*&@*=-+.+#@&&&>&*-+-*&&@,%#$..+#>@#+..#%&>)&@*-+;.+$$+-++;#*&>,&&&@#+$=%@@>*$+.--=%***=+-*@&>&&@=+;+-$---$++-%@,>@'&%#..+###-$;.",
-".....;......+-=*#$..+#@@%%%=-++#@&&%#$+.$#@@@@&@*-++=@,&>*-+;.$=&%#+;.#@'&,&&@#+.....+...+#%&,&&&&%#+$=@@&&*-++#=@@@@@=$-*&'>',>=$+-=*%***-+#%@&>&>&%=...+++;;..",
-".......;.;.;.#*%=$+.+=@@%**=-++=@,,&=-+.+=@&@%@&%$.+#*,)&*-+..+#@*#+.+$*&&&&,'=$...;......#%>,,&&@@#+$*%>>'*#+-*@>@&&%=++#==*%@'*$$#*@&&&@#+#%&>,&&@%#+.........",
-";.;.........$#@&%-+.+#%&@@@*$++#%>&@*-+.+#@&&@&&*$.$#%,,%*#+;.$=@%-+..$#%%@>>%#+;....;....-*>,>,>&%#+$=@,>@*#+-%'@&&>%#+++$--=@&=$+-=*%%*=-+-*&>>&>&@#+...;.;...",
-".....;......$=,)@#+.+$=@&'@=$+$#@&,%%==++#%&&,>@*$.+#%&)@*-+..+=&@#+;.$=%%%@>%#+........;.$#%&&&>&*#.+#=%%%#$++=%'@&&@=+....+-=*#+++------+;+=@&>&>@*-..........",
-"..;....;.;..$=,,%#+..+-=&>*#+.$=,,,&,&%-+-=*****#++$=@,'&*#+;.$*'%#+..$*@&&>@=$+;.;..;....+-=%&,@*#+.++-##-$+;+$=%@@@@=+.....+$-+...++++;...+-=%&>&*#$;.;..;..;.",
-"............+#@,@#+...+#*@#$..+-@&&&>&*$;$-#-$--$+.+#*@'&=-.+.+#&@#+..$*%,&&*#+............+-=%@*#$+..+.++++...+#=*=**=$;.;....;.............+-=%@*#$;..........",
-"..;.;....;..+#%%=$+;...+-#-+;.+$==*===#+..+.+..+...+$#===-+.;.$#@*-+..+-**%=#+.....;.;.;....+$-#-++;............+$--$-+;........;.......;.;...+$#--$;....;.;....",
-"......;......+-#$+......+++.....+$$--++..;.....;.;..;++$$+....+$=#++;..+$-$$+...;........;....+.+.....;.;..;.;......;+....+;.;.....+.;.......;;;;+....;.....;...",
-";.++$$+..;.........;.;+$$$$.;...+$$$+.......;+..............;.+$----+........;...............++++..;....+..............;+-##++..;++##-+...;.+-##-$+..........;..",
-".+$#==#+...;.++++....+$#==#$+.;+-===-+.;.;.++$++.;.......;...$-=****#$...........;.;.;.;...;+-#=$+.....$$-$+..;.;.;.....-=%*#++.;+#*%=$+++$+#*@%*-++$+;.;.++;;..",
-";$#*%*=-+....+-#-+...+-*%%*#+..$=%%%=-+...+$#=-+...;.;......$#%@&)>&*$;.;..;.;.............++=%@=+.;.+$#**=-+.......;...-*&@=$+$-$=%&*-$-#=-=%@@%=-##-...;$#-+..",
-"+-*@%@*=$;..$#*@=-+;.+#*%@*#$..$=%@>*-+...+#**#+...+++++$-+;$=&,&,,&*$.........;.......;.;.+$=@>=$...-#*%@%=$+..++..+.;.$*&&=-$=*#=@&%##***$#%@&%*=*%-+.;;#*=$+.",
-"+-*@%@%=+.++#=&'==$+.+-*%@*#+;.$=%@'=#+;..+#%*-+;.+#=#--=#-+$*',>,&%=$...;+$+....;.;........+=@'=$+..$=@@%@*#++$----$+..-=@@*#=*%##%@%=*%@*-#%@>@%%%%-...+#*=$+.",
-"+$#%@%=#+.+-%@>'&%=$.+#*@@*#+..-=@@@*#+...+-#-+...-*@@==@@*$$=&>,'&%=$;..+-=#-.......;...;..$#%,*-+;+$=%@@@*#++=*****#$.-*&@%*%@%#=%@@%%@@*-#%@&@@@@=$+.+$=@*-+.",
-".+-=**#+;.+#&'',>>%-.+#%@@*#+..-%@@@=-+;...+++..;.-*>&**@@*$$#@&,,&%=$..+$=@*-$.............$=&,=-+..+=%@@@*-+$=@@@&@*#+#*@&@@@@%#=@@&&&&@%##%%&@&&@=++;$#%&@#+.",
-"...$--++..+-=%@'@%=$.+#***=-+;.$=%**#$............$=&@**%@%-+-=%>,&%=$;.+$*@%-+.;.;+$+.;..;+$=*%=-+..+#%&&@=-++=%&&&>&=$$=*%@@&>@##*%@@@@@&#-=%%>>>>*$.+#*@>%#+.",
-";...++..;..$-=@@*#$+..+-##$+...+$#-#++.;.;.;.;..;.-=&@%%@&%-.+-*@'@%=+...+#=#+....+-=#$+....+$-#-$+;.$=@',>*#++#%&@&,,=$+-=%@&@'@#-*%@%%@@@-$-=@&@>>*$+$*@@%*#$;",
-"..;........;#*%@*#$+...;+++......;++..............$=&&@@@'@#++-=@,>@*$....+$+.....$=@%#+..;...+.+....+#*@&@=-+$=%@@@>&=$+#*@@@%'&##*@%**@&*-$#%@@@>,*$;#*@@**=#+",
-"........;.+-*%@&@*#-.......;.;.......;........;.;.$#@',&&&@#++=%>,>&%$;......;.;.+-%'@=+...........;.++##=#$+.-*@@@&&%#++-%%%@@>&=#*%*=%@@*--=%%%@&'%$;-*@&@@%=+",
-";.;..;....+#@&,&'&*$.;.........;.......;.;.;......$#%@%*=*#$.+=%&@'>%-..;........+-*'&=$;...;.;.;.......+++..++=**=*=-+;+-====*&&#-#=##%@@@-+#=##=@&*$;$=%&&&%=+",
-"........;.+$======#$...;.........;................$#**#-$++..+$=*===#+....;......+$=**#+.................;....+$----$+;..+$$+$##=$+$++$-=##$++-$+-###+.;$=%@@*-+",
-"..+.+;.....++$-$-$+......+.;.;....;;.;......;.;.;..$##-+.......+$$$$+.;......;.;..+##-+...;.....+.;.;.;.;.;;...+.;;++.....+++++++......+$$$...+.+;+$;...;+###-+.",
-".+$##$+.;....+$##$+;.;+$#=$+...;+$-#$+.;.;++++++..;+-#=#$+;...++++++++..;+$++++..+$=#$++....;+##-$;...+$=#$+...+++$+$+;..++-#++..;..;++-#-++..+$==-$;;..;;+++++.",
-".+-=*#$+....+$#**-+..++=*%=++..+#=**=-$..+$--$-++..+-*%*-+..;++######+.++-###-$+.+-**#$+;...+$#*=-+..+$#%%#$+;.+-=#==#+..+-===$+.....+-=%=$..+$#%%*-+;.;$-$--$+;",
-".+#*%*#+;.;+$#%%=-+.++#*@@*-+.+-=@>&%#+..+#====-+.+$#%%%#+...+-%%%%%%-+$#*%%%*=-+$#*@%=-$+++#=%%*=+++-=*@@%#$++-=%%%**-+.+#*%%#-+.++$#*%%#-..+#*@@%=$;;$#===*=-+",
-"+-=%@@#$+..$#*@@=$+.;-*@@@*-+.;-%@&&*#+.+$*%%%*-+.+#*@&%#+;..+#&')&'&#-=%'&>>,%--=%@&&@%#+$=*@&&@%#+$=%&&&&%#+-=@&&&@@#++-=%@@%=-+.+#*@&%*-++-=%@@&*#+;-*@%@@*=+",
-";-*&',*$+.+$*@'&%-+.+-*&',%#+.+#%&),*#+.+-*&'&%#+.$=%',@=+...$=@'&@@%##@>%**%@*##%>'@'>&=$#%,,&'>&=$#%&'@',&=$-%>'&,>&=$+-*@>,&%#$+$*@'>&%=++-%@>,>%=+;-*&>,>%=+",
-".-=@@)@#$;+-=%,'@#+..-=@>)@=+..-=@>'@=+.+-=@,)@#+.+$*@'&*-+;.+=&,&&@*##%)%#-#*=$$=%@%%@'=+$#%@%@&>=+$=@&%%&&=+-=%&%%&>=+;+=%&'@*-+;-#%&,@*-;;$=%&,@*-;+$=%&>@*-+",
-".-=&>@>=-++$*@&@&*#+.-=&@&&*-++$=@>@&*#++-=&@&&*#++#*>&>@=+++-*,@&,&*-#@>*-$-#-$$=%&%@@*#+$=%@%%@%#+$=%@%@@%#++=%&%@@*#+.+$=&>*#+..+-=&>*#+..+$=&>*#+..+-=&,*#+.",
-";#*&>@'%=++#%&,@'%=$+-%&,@'%=++#*@,@'%=+;#%&,@'%=$$=%,@>&%-+$=*>>,'>*$=*'%#####++#*,&&@*-++=%,&&@*#+$#%,&&@=-++=*,&&@=-+..+#@>=-+...;#@>*-+...+-@>*$;...+#@>*$;.",
-"+=@,,@,@%$$#@>>&,@*-$=@,>&'@%$+=@'&>,@*-$#@>>&>@%-#%&,&,&@#$-*&,>@@%=+#%&@%%%@=-$=%>@&&*#$$=%&&&&*#$$=%&@&&*#++=%&@>@*#+..$=@,=-+;..+=@,=-+;..$#@>=-+..;+#&>*$+.",
-"$*&>&@&,@#-=,>&@&'@#-=>,&@@'@#-*&,&@&'@#-*&,&@&,@#=%,&@&,>*$#%,&&&@@%-$=%&&&&&*$-=%,@@&@%--=@&@@@@%--=%,@@@@%--*@&@&@@%-++-=@'%#-+.+#=@,%#$+.+-*@,%#-+.+#=&>%#$+",
-"#*',@%&'@=#%,&@%&'&=#%'&@%&'@=#%,,@%&'&=-%'&@%&'@==&'@@@,,*-=&,@',&&&#+-=%'&%*-+-%,>@&>,%##%'&&&'@%##%,&&&&,%-#%,'@&>>%-+$*@,,@*=++$=@,,@%#$+-=@,,@*=+;$*%,,@%#$",
-"-*&&%*%>@#-*>&%*%&@#-=,&%*@&@#-*@&%*@&@#-=,&%*%&@==@&@**@&%-=%&@&>&&@#.+$*&&*-+.$*@,&@&&*$-*&>@@&&%--*&&&@@&*$$*@,@@&&*$+-=%&&@*=++$=%@&@*=+;-=%@>@%#$.-*%@>@*=+",
-"+#==##===$$#===#=*#-$#==##===-+#==##=*=-$#===#=*=$-=*=#===#$-===*=**=+.+-*%*-+..+#=*==*=#$+#=**=*=#$$#***===#$+#=*==*=#+;+#=*===-;.$#==*==-+.$#=====-+.$#=*===-;",
-"++$$$$$$+++$$$$+$-$.++$-$$$$+++;-$+$$$++++$$$$$$+++$$$$---$.+$$$$$-$$...+$-$+....++--$-$++.+---$$$+..+$----$$..;$----$++..++$-$++..;+$---++..;++$$$+;...+$--$++.",
-".;++++++...+$####-$...$##$+......+-##++...+-##-+...+$-###-$...++$++.;.;......;...;.++++++..+$##-+......+$#-$+...+-##-+....+++++;......+-#$+;..++;;;......++-+;+.",
-"+$--#--$+..+-*@%%*-+.+-=%=-+..;.+$=**-+..+$=%%=-+..+#*%@%*-+.++---$$+........+...++$####$+.+-*%=$++;..+$=**-+;.+-=%%=-+.;++----$+;...$-**#+++---$+;;;...+-#=#$;.",
-"+=*%*%*=-$+-=@&&@*-+.+#*%*#$+...+#%@*-+;.+#*@@*#$.+$=@&&@*$+.+-*=**#+.;+-++.+++.+$#**%&@=++$#*@*=$+.++-#%@*#$+++#%@@*=-.;+#*====-+++$#=%%=-++=*%=#$+.;.$-*@@%#$;",
-"-=,&&@@&*-$=%@&>@%#+.+#*@@*#+..+#=@@*#$.++=%@@@*-++#*@&>@*$+.$=%%%%*-++$=#---#-+$=%&&&,'*+$#**@%*=-$+#=*@@%*#++#*@%@@*=++=*%%%%%#++-=*%@@*=$-*@>@*#$+;.$=@&&&*-;",
-"-*>>@@@,%##*&&%@&@*-+#*@&@@%#+$#*@@&@%#++#*@@&@%#+$#*@&&@%#+$#*@&@@%#++#%**#*%*$#*&>@>,&*$-*&@%%@@*$-*@@*%&@*--*@@%%&@*--*&@*%&&*--=@&@%&&%#-=@,&@%=-+.$*@&&>%#+",
-"-%&&@%*&@=#@>,@%&,%$-=@>@@&&=$-=@>@@&&=$-*@@@@&&*$-*@&@@>&=$-*@@@@>&*++#@&@%@@*-#%,@@@&&%##@>@**&'*-#%,@**&,%-#@>@**&,%-#@>@**&>%$-*>&%%&>@#$=*,>>&@*$+-*@&&,%=$",
-"#%,,&%*@@=#@&&@@>>*-#%,%**&&%-#@&@**&&%-#@,%**@&%-#@,%**@&%-#@,%**@&%-+-*&,&'*#$=@,*@@@@@##%&%==&>*$#@&%==&&*$#%&%==&>*$#%&%==&,=-+#@&@%&@*$$=%@%%%&%-+-*@>,>%=$",
-"-%&,@**%@=#%&&&@&,*-#%,%##%@%#=@'%##%@%##%,%#=%@%##%,%##%@%##%,%##*@%-+$#%,,&*#$#%,@@@%@@##%@%#=@,*--%@%#=@,*-#%@%##@,*$#%&%#=%'*$+-=@&&>*#++#%@%%%&%#+-*%@@&>%#",
-"-=&@%=*%@=#%&@&&,>*$=@>*##%&%##@&%##%&%#=@&%##%&%#=@>*##%&%#=@>*##%@%#+-*@>&,%#$#@,@@%%&%##%@%#=@,=$#*@%#=@,=$#*&%==@>*$-%@%==@>*+.+#%>,@=$+$=%>@@&>%-+$%%%%%,@#",
-"-*&&%*%&@##@&@%@>'*$-%,%**@&*##%,%**@&%-#%&%**@&%--%,%**@&%-#%>%**@&%-+#%&@@&@*$#%,&@@@&%--*@@**@>*$-*@%**&&*$-*@%*%@>*+-*@@**@,=$.+-*&,%#$+-=%,&&&@=$+#%@@%%>@#",
-"-%,,&@&,*##@,&%@,&*$-=%@&&>&=$-=%@&&>&=$-=%@&&&&=$-=%@&&&&=$-=%@&&>&=$+#%%*=*@=$#*&>&&>&=$$=%&&&,@#+$=%&&&,@=+$=%&&&>@=++=%&&&>@=+.+#%,,@=-+-%>,@%*=$++=@>&&>,@#",
-"#*@'&'&%=$#%&>**&>=$+-=%>&@*#++#=%>&&*#++-=%&,&*#++-=%&'@*#++-=%,&&%-++-##$$-##+$*@&>>&%-++-=&,&@%#++-*&,&&%-++-*&&,&*-++-*&>>&%-+.+#%&,&*#+#%&>%*-+;.+=@>@@&&%-",
-"$#======$+$#==#-=#$+.+$#==#-+..+-#===-+..+-#==##+..+-#=##-+..+$#==##+..+++++++++$#*====-+..$-====-+..+$#===-+..+-===##+..+$===##+.++-#===-+;$#==##+...+$===#==-+",
-"++$$-$+++.+++++++++...+$+$$+....++++++....+++$++.....$$$$+.....+++++............+$--$$++.....+$-+++...+$$$+++....++$+++...++$$+;;...+$$$+++..+$++$.....++++$+++.",
-"..++++.......;++++.;.;.++++.;....+.+.+;...;.....;....+$$+.;.........;.............++++..;......++++;...++++.;.........;...++++.........++++...+.+++.;...........",
-".+$#-$+.;....+$#-+....+-##$...;.+$$-$+.....++++....;+$=#-+...;........;.;.;.;.;..+$##$.....;..+-#-+....+##-+...;++.++...;.$-#$..;.;...+-#-+.;.;$##$+....++++++..",
-".+-=*#$...;.+-=*#$...+$=**-+...+#=**=-+;++$-$$$+;...$#%%#+;....;..;..............+-=*#$+;....+-=*#+;..+#**=-+..+$--$$$...+-==#$.....;+-#*#++..+#**#$+..++$-$-++.",
-".+$*%*#$...+-=%%#$.;+$#@@%=$;.+$=@>>%=$.+$=*=*#$...+-=%%=-+.++$$$$$$+...+$-$$++.;+-*%%#$+...+$=*%#$..;$=%@%#$;+$=*===--..+-*%*#+....+$=%*#+..+-*%@*-+..+#====-;.",
-".+#*@@=-;..$#%@%#$..+#*@@@*-..+#%@&&%#+.+#*%%%*-+;.+#%@@*-+.+#==#===#++$#=*=*#-..$#*%@*#-+++#=%&%=-.++#%@@@*#++#=%%%%=-..+-*@@#+;..+$=%@=-.;.+#%&@*$+..$#*@%*-+.",
-"+-*@&,%=$+$#%&,&*-+.+=@&'&%#+;+-%&&)@=$++=@&'&%#+.+$*@>'@#$+-*@>@@'&%--=%@,&)&=$+-*@>'&%=$+-*@&)&%=$+-%@,>'@=$$=%,&'&%#+.+#%>>=$...+-%>>*$+..+=@>>*-+.;+=@>>*-+.",
-";-%@&&>*-+$=@@@>@=-.$=%&&>@=$.+#%@@&>*#+$=@@&>@=+.+#*@@@>*#+-%&&)&@&&##%'@%@,&*+$=&,@@&,%-$*>>@@&,%-$=&>@@@,%##%'@@&>&=$.+-*&'=$.;.+-*&,=$...+-*&,=$+..+-*>>=$+.",
-"+#%@&@)%#$$*@&&)&*$+$*@&&'&*-.+#%@&&,%#$$*@&&'&*-++#%&&@)%#$-%@@,,@@)=#%'%=*%@=+$=>,@@@,@#$=,,&@@)@#$=,,@@@'@##%'&@@,)*-..$#@>*$...+$#@>*-..;;$#@,=-....+#@>*-..",
-"$=&>,,&%=$#%>,>,&*-+#%&'>,&*-+$=&,,>>%=+#%&>>,&*-+$=&'>&>%=$=%&,'>&&&##%&@%%%@=$-*',@@&>%#-*'&&&&&@--*'&&@&>%#=@'@@&&@*$..$=@,=-+;..$#@,=$+..;$=@>*$+..+$=@,=$+.",
-"-*>&@@&%=$#%>@@&&*#+#@>@@&@%#+$*>&@@&%=$#%,@%&&*#+$*&,@@&%=-*&@@''&&@#-=@&>&&&*$$=>'&&@&%#$=,'>@&&%#$#,'>&&&%##%'&@&&@*$.+-=@,*#$+.+-=@,%#$;.+-=@,%#$+.+-=@>%#$+",
-"$*&,@&,@*-#@'@@,&@#$#@>@@>>%#+-*&,@&)@*-#@>@&&,%#+-*&&&&'@*-*&,>'&>&@#+-=%'&@%#+$=@,&&&,%-$#@&&&&>%#$#@&&&'&@##*&>&&,&=$+$=@&'%*=++$=@&,%*=+;$=@&,%*=+;$=@>,%*#$",
-"$#%%@%@%*$$=%@%@@%#+$*%@@%@%-++#*@%%@%*--=@@%@@*#+$#%@%%%@=$#*%%%@@%*$.+-*>&*#$..$#%@%%%=$+$=%@@%%=$+$=*@%%%=$+#=%@%%*-++$=%@@@*=+.-=%@&%%#++$*%@@@*=+;-=%%&@%=+",
-";$==*=*=#++#=*===#$++#=*====$++$=*=*==#++#=**===$.+$==**==#+$#======-+.+-%&%=+...+-#=*=#$+.+$#=*=#$+.+$#=*=#$..$#====-+..$#==*==-+.$#==**=-;.+#=**==-;.$#=*=*#-+",
-".+$$--$$+..++--$-$+..+$--$+$....+$--$++..+$$-$$++...$$$-$$+.+$$$+$+++...+-=#$+.;...++$$++...+;-$$++...++$$$$.+..+$-$$+;...+$---++;..+$-$$++.;.+$$--++;..+$--$$+;",
-";++--$-++....+++++....+++.........++++....++$$+.;....+++++...........;...+...............;..++++...;....++++....+.+++.................++++..++$++...............",
-"+-***=*=-;.++-##-$+;.+$--++.;.;..+$#-$+;..+#=#-+..;.$-##-$+.......+......+..+;...;.........++--$+......+$-#$+.;++##-$+;.;.....+..;...++-#-+++===$+;......;++++..",
-"-*&,&&>%#$.+#=%%*#$++$=*=#+.....+$#%%-+..+#*&@=-+..+-*%%*=$;.+$$$$$++;.;.+$-++.....+;+++.;.+#**#-+.;.;+$=**#+.++#*%*#+...$+--$-++..;++#*@=++#%&@#$+;.;.$+$$$$$+.",
-"#%&&,,,%=++#=@&>@#$..$#%%*#+...+$=%@*#+.;$=%&&*#+..$=%&&@*$++$#====#+...+-**-+;.;.+$-#-#-$+$=*%%=-$.+--=*@%=$+$#=%@@*#+++-====%=$++--#=%@*#+-%@&=#-++.+$#**===#$",
-"$*@&@&&@*$-=@@&&@=-++$=%@@*--.;$#%@&*#+++-*@@&%#$++-=@&&@=$.+#*%@%%=$...-=@&=$...+-=*%***-$=*%%%%*#+$=*%*%%*#$#*@%%%%*$+$=@%**@%#+$=*%%%%@*#-=%&@**=-.$=%%%*%@*#",
-"-=@&&&'&*-#*&&&&&*-+$#*&&@@=-+$#*@&&@*$+$=%&&&@*-+$#%&&&@*-+$=%&&&@*-+++-*&&*-+.+-=@@&&@%##*&@%*@@*$#*@@*%@@=-=@&%*%&%#+-%&@%*@@=$-=&@%%@&%#$=%&&@@%#$$=&&%%@&%#",
-"$=@>,',,%##%,,&&>@=$-*&>@&>@#$-*&,@&>@#$-%&,@&>@#+-*&,@&>@#$-%&>@&>@#++#=%@@%=#++=@>&&'&%##*>&**@@*-#%>&**@@*-=@,%*%@@=+#%>&**@@*-+=@@@%@&*-$#%,%%@&%#$=@@%%@&*-",
-"$*&&%%@,@#$=&>@%@&*-=%'@%%&,=-#@&@%%&>*$#%>@%%&>*-#@>@*@&,*$#%'@%%&'*$-=&@'&)&%$$=&,@@&,@#-=&@**%@*$$*&@%=%@%-#%&%=*@%=+$*&@**%@%$+$=@&&>*#++#%>@%&&%-;$=@&&&*#+",
-"-*,@%*%,%#-=@@%*%@%-#@,***&,=-#&'*=*&,=-=@,***&'=-#@,%=*&'=-#@>***&>=$+#*%%%%=#$-*'&&&@,%#-=@@**%&%--=@@**%@%-#%&%**@@=+$=@@**%@*-.+#%&,%=+++=%,&&>&*$;+#*>>@#$.",
-"$=,&%=%,@#-*@@**%@%#=%,@*%@,=-#%,@*%@,*$#%,@%%&,=-#%,@*%&>*$=%,@*%&,*++$#=%@=#++$*>,&@%,@#$#@@%*@&%#$#@@*%@&%##*@@*@&&=$+=@@%%@&%#++#*@,%-+.$=%,,&@%#+.+-%&>*-+.",
-"$=@>&&>&%--%,&@%&,@##%,&&,&&#$#%&>&>>@#$#%&&&&,@#$#%&&&,&&#$#%&>&&,%=+.+$=@&=+..-*&,>>&&*-+#%&&&,>@#$#%&&&>,@#-=@&&>>'*$+-*&>&>'@#+-*&>&=$;.-*@&@*=#+;;-*@>&*$..",
-"+#*&&'>%=$-%&'@%@'@#$=%&&,&*#+$=*,&,&%-+$=%&'>&*#+$=%,&,&%-+$=*'&'@%-+..+-**#+..$=@,>,,%=++$=@&>&'&#+$=@&,&'@#$-*&&,&,%$+-=%&'&,@#+#%&'&=;.;-*@>@*-+..;#%>,&=$+.",
-";+##==##$+$#==#===#$+$#*==##+.+$##==#-+.+$#====-+.+$##===-+;+$##==#-++...+-$+;..$=%**=##$..+$#=*===$.+$#====#$.+-=====#+.+-#=====$+#%@%*#+..-=%@*=++..;-%%%%-;..",
-"..++$$$+...$$$+++$$+.++$$$$+...++$$$+++...++$++++..+$$$$$$....++$$++..;...++.+..+-#--$$++.;.++$$$+++..;++$$$$+...$$$$$+....+$$$+++.+-##-$.;.+-##-$+....+-#--+;..",
-".........;.+$++.............;....+.+..;.........;.++-##-##-+....+.$+...++$+$$+.....++$+........+.+.;.........;.........;....+.....;.+++++...$##-++++.....+......",
-";...;+;...+###$+...;..........+$-$-$-$++;.+++.....+#%%%*%@*$;...+$#$-..+-====$+...+$#=$++...;.++$$+....++$+.....;++.+++.++$+++.+....+-$$$-++#%@=--$$++..+;+++$+.",
-"...+$-$+..-*%%#$;.+..++--$$+;.-=**%***=$.+$-#$..;.+=,&&&&,%#.+++$#*#$+.$=*%%%#+;.+$#*%=$+;...++#==#$;++-#=-+.;++-$--$-$++#=###-$$.++#===*=$$*&>%***=#+.$$-$+$-$+",
-".;+$=*#$;+-%&'*-++$$;+#=**#$++=%&&)&,&@-.+#**#+...+=&,&&@'@#+$$-=*&*-+;$=%@@&*$++#=*@>%=#$...+#%&>*$+$#=@@*-++$#*%**%*=$#%@@%%*%=$+#*@@%&%=$=@,&@&&@%#+$=%##**#+",
-"..+#%@*$..$*&,%#-#=#$#%&)&@=$+#=%%@%**#+.+#*%#+.;.#*&,,>&'@#-***%@'%#$$#*%&@,*#$-*@&,)@%*#;..$#@&&*$-**%&&%=#$#%)'&),>%#=@',','&@#-=%@&@>&*-#*@>@@>,%#$-*&%=@>%-",
-"..+#%&%#+.+-%&%=#*%##*&&>>@%=$#**%&&**#$.$#%%#+..+=@>&>>&'&=#@&,,&'@*-#*@@,@,@*##%>&&'&&%#+.+-%&'&*$#@>,,,'&%--=,&@%@'@##*@&&'&@*$#%&,,&,,@##*@,%%@>%#+-=>@%@>@#",
-"..+-*@@#+.+-*@>=*@@#=&&%@@@@%-=%%@'&@%*-++#%@#$...#@&&&&,&@##*@,@@@@*#*%@&'@,@%#=%'>>>@@@#;.+#%&&&*$=@&&&,@@*--*,@**%,%#$-=%&@%=$+-*@&&@>>%##@,&%*%&%-.+=@>>@%*$",
-";+-=*@@#+..$#*,%*%*-#,@%%@&@@#=*%%>>%%*-.+#%&=$.;+-%&>>>,>%#+$=@&@%@*#=%%@,@,@*##%>,>,@@@#+.+-%&&@*-#%@@@,@*#$$=,@==*,@#.+-=@%*#+.+#*@@@&>*-=%>,%**@%-;+#%,>@*-+",
-"$#%%%%@=-+.+$=@@%*#$=&@**@&@%#$-#*@%=#-+.-#@,=$...$*&'&,&&%-.+-*@&%==-$#*%@@&%=-#%>&,,%@%#++$#*&,&@##%&&&&@=-;-*,%==%,%#..+#%%*-+.+-*@@@&&=$#*%&%*%%%#+$#@,,@=-+",
-"-*,>%%@%#$..+#*,@=-+=@&%*%&&@#++-=@%=$++.+#@&%-+..$#@&@%@%*$..+=@&%#-++$=%@%&@=$-=@%&'%**-$-#*%@>,@#-*,>&@@*#+$=,&*=%'@#+..$=%%=$..-=@@@&&=$-#=%@%@@%--=*@>,&*#+",
-"#@,>&&&&%-...$#%@%=$$*&&%%@>%-..$=@@%-+..+$*@@=-+.+#%&&@*=-+..+$=%%=-+.$#%@*@&@#$-=*@>*#-$=*@&,@&@%-+#@&&@%%*--*&&@@@>@-;..$#*%*#+.-*@@&>@=+++#*@@&&*-=&,&%%&&*$",
-"=&@%%@&>%#+..+$=*@%#$-*%&@**=$..+#%@*#+;..$#%&%=$.+$*@,@=-+.;..+-#**#+.+-=%==%%#++$#@>=-++#*@@%**%*-+$*%**=%%#-=@%=**@*-...+$#%%=$;+=%@&&@=+.++#*%@*#$#%%*=#*%@#",
-"#**#=**%*-;...+$#%*#++$=%=#-+;..+-=*=$+....$#%%#+.++#*%*-+......+$##-+.+$##-$==#..+-*%#+..-=**=####$.+$##--==-+-##--#*#$;..;+-==#$.+-=*%%%#+..+$#==#++-##$+$-=*-",
-"$--$$-#--+......+-#$..+$--$+.....+-$-+.;..;.$-#-++..$$--$.;.;....+$$+...++++++$+..+$-#$+;..$$-$+++$+..+++.++$+.+$$+.+-$+.....+$-$+.;+--#=#$+....$$$+..+$+;..+$-+"};
+"!     c #124412",
+"~     c #144A14",
+"{     c #175517",
+"]     c #144814",
+"^     c #0E330E",
+"/     c #010401",
+"(     c #0E340E",
+"_     c #1E6F1E",
+":     c #3EA63E",
+"<     c #40B140",
+"[     c #399639",
+"}     c #0E360E",
+"|     c #64D564",
+"1     c #185A18",
+"2     c #144C14",
+"3     c #6ED86E",
+"4     c #1A5F1A",
+"5     c #77DA77",
+"6     c #134713",
+"7     c #124112",
+"8     c #4DC24D",
+"9     c #3CA03C",
+"0     c #0F380F",
+"a     c #0C2C0C",
+"b     c #124212",
+"c     c #081D08",
+".............+@#@+.....@@@@+....+#$$%#@....@$%#@....+@@+..................+@+......@$%%#+...+$%%#+.....+@@@................................................@$$#+",
+"............@#%&$@...@#$$$$##...@%&**&#@.@@%*=&##..@@$$$#.......+@@......@$$##....@#&-*$@...#%=*%@....@#%%$#......@@......................................@#**$@",
+".+..+..+..+.#%-;*$@..@%***=&#@.@#&=--*%@.#$*>;=&#@+#%*=&$@.+..##%%$@.+..@#*=&#@.+.@%*-*$@...@&=-&$@.++#%->&$@.+..+#$#@.+..+..+..+..+..+..+..+..+..+..+..+.#%->&@",
+"...........+#*>,=$+.@$&--->*%@@@%*>>>=&#@$*->;>*$@+$&=-=%#...@#&=-*$@...@%=>*#+..+#*-=%#.+..@$*-=%@++@&*>;=*$@..+$*=%@...................................+#*--%@",
+"..+..+......#*;,=%@.+$*>>-;*%@+$&-;,;-*#@%=--->*%@@%*--=*$@..#&=--=$@..@#&--&#...+$=-=%+.....#&--%#.+#*-,'>=%#..#%->*#@..+..+..+..+..@@.+..+..+..+...+...+%=-*$@",
+"...+..++....#*;'=%@+.$*--->*$++$*-;;,>*##%=>--=*%@@%*---*%@.@#&=-=&%#@..#&*&%@...+%->*#@.....#%-;&#.+$&-;';=%@@@#&>;*%##..+..+..+..@#$$$$$#++..+...+....@#&--&$.",
+"........+..@#&>,=$+..#%&&&&$@+@%*>;>,=*#@%*>>>-*%@+#&=--=%#++$*>>=*%#@..+$%$@..+.+%-;*#@.+...@%-;&#..#&=;,>*%@@%*-;'>=&#..........@%*=====&#.....+...+..@%*=*$@.",
+".+.+........@&-;*$@..+##$##@..+%=>;>;=%@@#&=--;-&#@#&->>=&#.+$*>;>-*%+@..+++.....@%-;*#...+..@%-;*#..#%=-->*%@@&>;,',;=#..+.+@+..+@&;>,,;;=#.+..+++....+$*-=%#@.",
+".....+.+.+..@$->&@.........+..@%>,;,,=&#@$*=-->-*#@$&=>>-*%.@$=>;;;-&@...........+%=>=$@.....#&->&@@.@%***=&#@@$*=;,==&#...@$%$@..+$**=***&#...@@##@.+.@%==*$+..",
+"............+$&*%@.+..........@%->>>>*$@@%=>>>;-&#+@%*---=%@@&=->>;-&#.....+.+...+$*-=%@..+..$&--%@..+#$$$$#@..##&=,*%#++.@#**&#++.@#$$$$##+...@&&%@..+$*>*%@...",
+".+......+.+..$&=$@...+...+....+$=>>>=&@++$*-;;-&$@.+#&=--=$@@%->;;;>*#@.+.....+...#&=-&#+...+%==*%+....@+@++....@%->&@@...@%->*#+....@@.@..+.++#*-*$+.@%=-*$@...",
+"...+.+.......@&=$@....+...+...@$*->-=%@.+#$%=-*$@...+$***&$+@$&=>>--*#...+.+......+$*-*%@..@#%-=&#..............@#*=%@...@$&-=%@....+.+........$&=*#+.#&==%@.+..",
+"..........+..@#$@...+.......+..#&=-=*$@...+#&*%@.....#$$$#@.+@$%%%%%$@.......+.+...@%=&#@...@%*&#@..+........+...@#$@++...#&*&$@+........+.....@$%#++.#%*&$@....",
+".+...+.+.......++.+....+.+......#%%%$#.....@$$#++....@@@@@.....@@@@@++.+..@.+...+...###@....@@##@++...+..+.+..+..+.+......@#%#@...+...+....+.+...++...+$%$@..+..",
+"..@@###@@..+@@@@@+..+.@####@@...@#$$#@@.....@##@@.+@@#####@.....@###@.+###$#$@+..+@@###@@+..+###@@.....+...........+..+.+..++..................+....+...@@@@+...",
+".@#%&*%$@..@$%*&#+...@#%**&%#@@@$%**&%#@...@$&&%@++#%&**&&#.+.@$%&*&$@@%&****&#+.@$%**&%#+.@#%&*%$#.+....+.+...+..............+.+...+..+.+.......+.....@#$&%$#@.",
+"+#&=---*$@@$*>;>%#..@$*=-->*%@+#*=->>*%@.+.#&>>=#+@$*>>--*%+.@#&->-=%##&=----=%@+$*=-->*%@.@%=-==*%+.........+......+....+..@@#@@.+.....+..+@@##@@..+.@#&=>>*%#.",
+"@%=->>>=&#@$=>,;*#..+$=>>>;-*#@$*>>>;-*#..@%=;;-%@@%=;>--*$+.#%=;,>=%@#*=-->>-%@@%=;>>;-*#@#*>>->-&@..+@@#@....+.+@@#@+...+@#%&&$@.@@@###@++@%&&%#@+..+$*;;;>*$@",
+"@%--===-*#+#%*>;&#@.@$*===--*#@$&**=>-*#+@#&->;-%@#%=;>-=*$@+$*>>-=&$@@#%%*=-=%+@%--==--*##%=-==>>*#..@$&&$@.....@$&&$@..@#$&=--&@@#%&&&&%$@#*-==&%#@.@%*-=---%@",
+"#%--**=-*$..@%-;*#..+#$%%*--*#.@$%*=;>*#.@$*>->-%@@%=;,;>=%@@$=,>-=*$@.@#$%==*$+#%=--=--*#@%=-=*>,*#+.@&--&@.+...@&->%@@@#%==--*$@@$*=-=-=&#@$*->>*%$@+#&=*=--%@",
+"#&-=&&=-=#+.@%-,&$+..@@$&=;=&#..#%=;;-*#+#&=>-;-&@@%*=->;;%#@%=;;;>>%#..@#&--%#.@%->;,;-*#@%=>-=;;*#..@%==%@...+.@%=-%@.#&=;-=&%@@@&=>>->-*#@+$&->>>&#+@$&=>>=%#",
+"#%--*%=-=#+.@%-;*#@...#%-;-&#+++@%&---*#@%-;>-;>*#+#%&&*>;*##%=;>-;;*@..+$&-*%+@#%=>->>-*#@$*>;;;,*#@..$%%#@.....@#%%$@@$*-,-*&#@.@&-->>->=#.@#%*-;;*#.@#&>>=&$+",
+"#%--*&=-=#+.@%-;&$...@%=>;*%@..#%%&*--*#@%=;>>,>=$#$%%%*>;*@#%=,*=>;*#+.@%*-*$+.@&--==--=#@@%=;>;;*@.+.@$$@+...+.@@##@.+#&=>>=&$@@@&=->>>-*$.+$&-->>*#..#&;>&$+.",
+"#%=-===-*#+@$*-,=%#+@$*>;>*%#@@$**&=--=$@$*>-;,;=%@&**&=>;*#@%*;==>;*#..@&=-&#.+@%->-=--*$+@%*=-;>&#..@#%%#@.....+$%%#@.@$&=>>-*$@#%==----*#@%&=>>=%$+..@%==%@..",
+"@%*-->>=&@@#&=>;-*%@@&>,>>-*%+@%>>--;=&#+@%&=>;;*%@&=>->>-%@@#*>>-,>&#..@&>-%#..@%=>>>;-&#@#%-->>-%@..@%=-%@+...@#&--%@..+#%*=>-&@@#%&&&&&$@#*--=*%#+...@%=*#@..",
+"+#%*=--&$@@$*-->-=&@@%->>--=%#@$=----*$@.+#$*->-*#@$*->-=&$..@$*---=%@+.@%-*$+...#%=---*$@@#&---*%#@.+@%=-%@....+%=>=%@....@#%&&$@.@@@#@#@@@@%&&%#@+.+..@%*&#+..",
+".+@%&*&#+.+#&&==**$@@$&===**%@.#%&*=&%@...@@%&=*&@.@$&=*%$@+.@@%&*&%#+..@#&%#+.+.+#%**&%@.+#%&*&%#@...@$&&$@+...@%==&#@+.....@@#@@..........+@##@.....+.+$%%@...",
+"..@@###@...+##$$$##..@$$$$%##...@#$$$@@....@##$#@@.@@#$$@@..+.@@#$#@@....@@@++....@@$$#@@..+@$#$@......@#$@@..+.+$&%$@...+....................@..+++.....@#@++..",
+"..++##@@....@@@@@.++.@@##@@@+.+..@@@@@@.@@@+@@@@...@@@@@@@@..@@@@@@@@....@@@@@++.+@@@@@@@+.@@@@@@@@+...@@@@@@.@++@#@@@@..@@@@@@..+.@@@.@@@@@.@@@+++@+.+..+@@+...",
+"++#%&&%@@+.@$$%%@@..@#%%%%$@@..@@$%%$$#@#$%%%%#@@.@#%%&%%$@.@#%%&%%%$@@@@#%%%$#@@#$%%$$%$@@#$%%%$$@@.+@$%%%%#@@#%%$$%$#@@@$%%$#@..@$$$#+#$$@@#$###%$#+++@$$$$#@.",
+".@%=>>=%@.@#&===%@..#&=-==*&#+@@%*===*&$%==-==*%#.$&==-=-=%@@&=-=--=*#+#%*===*&#$&==*&==*$#&*---*&$@.@$&=-==&#$&=-**==&@@%*-==%#@+$&=*%$&=*%$&=*%&==&#+#%**=&%#+",
+"+%*->>>&$@+#*-,;*$@@$*>;>>->%@#%=->->>=%&->>----%@$*-;>>>>&@$*-;>->>=$#%=>>>>>=%$=>>=*->-%@&*-;;-*$@.+%*-;>-*$$*>>-->-*#@%=>;-&$+.$=;-*&=;-%%=>>=*>>=##%=>>->-%#",
+"@%=-->,*$@.#&->;=&@.$*->>->;&$$=>>=*->=%%->-==>;*$$*->--;;*#$*->-=->=$%=>-==->=%$*>>==->-%@$&='>*%#..@#&*->-&#$*>>->>=&@@$*>>=%@@.$*',==>,>&%=;;==;;*#$=>-==>;*#",
+"@&----,=%@+@&=>>-&#@#&=>--;,*$%-;=%%&=*$%=>=*&-;=$@&=>==>>&@@&=>=-==*$%-;=&&===$#*->==>>=$@@#*;-&#@...@#&===%@$&>>>;-%$@+$&->&$@.@@*;,>=>'>%%=>;>->,*$%-;=&&-;=$",
+"#&->;,;=&@@#&->-;*%@#%=,->,;*$&-;*$@#$#@$=-=%%*-=%#%=>>;-*%@@%=>>>-*$@%>;*%%**&##&->>->>*$.+$*,-$@...@@#%==*$@#&-',,*%@..@%--&@@..$*,,>;;,-%%=->>>;;*$%-;*$%*-=%",
+"#%->>,;=&@@$*--->=&##&=;>>>;=%%-;*$@@@@@$=-=%$*=-%#%=,,'>&$@#%=,,,-%@@%-;=%*--*$#&-;->>-=$..+&;-%@+.@#$#%==*$+#&-;,'-%#..@%--&$#@@$&;;,,>,-%%*>-;;;,*#&-;*$%*=-%",
+"#&->>;;-&##%-;;,;-*$#&=>==->=%&->*%##%##%*-=%%*-=$$&=>>>-*&@#&=>>>=$++%-;=&=>;=%#&->==->*$++#*;-%@@+$*=&%=-*$@#&-->->*%@.@%--*&*&@$*,>---;-%%=-->>;;*$%->*$%=-=%",
+"#%->-->-&##*>,-->,-%$&=>==->=%%=>-&&&**#%=>=&*-;=$#&=-----=$$&=>-=&#@+$=--*=->=%$*--==->=%.#$*,>&$++%->=*--*#+#*->=->-&#.#&->*=>=%#*,>==*,>%%=-==-,,*$%=>=**-;=$",
+"#%=>---=%#$=';-=>,-%$=>,>->>*$$&=---=-*$%-;>->>>&#$*>;>>>>-$$=>;>=%#..$&->>->-*$$*;>==->-%@%*-,>=&#+$=;>->-&@.$*;>-*->=%@%=;'->,=%%=>>*&=;>&%=;-=-;;*#$&->-->>&#",
+"+$&->;>*$@$*>>-*-;=%$*>>>>>-&#@$&=>--*%#%->>>>-*%@$*->>>>>*$$*>>>=%@..@$&-->-=%#$*>>=*>>=%#%*->;=&$.$&=>>-*$@.$*>>*&*-=%@%-->>>>=#$*--&&*>=%%=>-&*=-&@@%&=>>=*$@",
+".+#%**&%@.@%%&%%&&%#@%&*&&&%$@@@#$&&%%#@#%*&&&%$@.#%&&*&&&%@@$&&&%#@...@$%%&%%@+@%&&%%&&%#@$%&&*&%@.@#%&&%$@..#%&&%$$%%#@#&&*&&&%@#%%%$#%%%#@%&&$%%%#+.@$%%&%$+.",
+"..@@#$@@@.@@##@@@@@+.@####@@+...+@###+..@@##$#@@.+.@@##$#@@+.@##@@+.+....@##@@..+@###@##@@.@@$###@....@###@.+.@@#@@@#@@..@@$####@@.@###@@##...@@@@@@+....@@@@+..",
+".+@@@#@@.....@@@@....@@@@@@.....@@@@@@...#@@@@@@@..+@@@+@@+..@@@@+@@@..@@@+@@@+..@@@@+@@@..@@@@@@@@...@@@@@@@...@$$$$@..@@#@@.......@#$$$@+....@@@@.............",
+"@#%&%%%$@..@#$$%$#@.@$%&%%$@#..+@%%%%$#@@$%&%&%%@+@$$%$$%$$@@$$%##$%$#@#$%##$%$@##$%$$%%$@@$$%$$%%$@@@#%%&%%$@..$&=*%#@+@%&%@@...+.@#%*=&$..+..@%&$@+.......+...",
+"$*->>>=*%@@#%=--*&$@$&->>-=%#@+#%-->--%@$*>->>>-%@$&--&*=-&$$*-=*%=-=%$*-=&%*-=%$*--=*--=%$*--=*--=%@$*=>>>-*$@+%-;-&#@.@&*=$@+....@$&-;=%@...#%=-&#@.+.+.....+.",
+"$=>,,,>=&##%*->,>=%@$=;,,;>*%@#%*;;;,;*#%-,,',,,*#%=,;*=>,=$$=;>*&=;>%%=;;==-;>&$*;,-=;,>%$=-'>=;'>%#%=;;,;,-%.@%-,=%#..@%*-&$@..+.@@&*,-%@..+$&-;*$@....+......",
+"$*--==--=%%*>-==>>*$$*;>-=--*$#*->-=>>*#&->-,>;>*$%=;=&*>;*$$*;>*&=;-%%*,>>>-,-&$&>;-->;=%$&;>-->;=%#%---->;=$.@%-;&$@+.@$*-*%@.....@#*,=%@..@%=->-&@.+...+.+...",
+"#&=-**=--%%-,=&&=>=$#&--==>>*$$*--===-&#%->=;,>,&#%=-=&%-,*#$&--*&*-=$$*;,;,-;-%@%=>;>;-&#@%*--->-&#@%*==->=&@.@%-;*#....@%=-*$@.....#&;>%@+.@%--->&#+..........",
+"#&=>===-=%&->=%%*--%$&->--;-*#$&=;;--=%@$&==,-=*$@$=-=%&-;*##&--*&=-*$$*,;,,-'-%@#%=;,-*$@.#%=>'>&$@@#%&=>>*%@.@%-'&$.+..@$&==&$@.+..#*;-%@..@%***=&#@+...+.+...",
+"@&=;,,;-*$%-,*&%*-=%#&>>,,>=%@@%*->>,>&@@#%&,-&%#@%*-=%%-,*#+$*-==-=&##*>,;>;,-%@#%*>>-&$@.@$*>,=%#..@%&-,=&$@.@#-;*#@....@$*-=%@....@&'-%@..@#$%$%$@.....+.+...",
+"#&=,;;>=%#%=;-=*->=$#&>;;;;=%#$&==->,>*#.@$*;-&@+.%*-=&&-,&#@#&=---*%@$&,,>-';-$@$*->>>*%@..@&>;*%@..@%=>;=*%$.@%-;&$+.....#%==&$.+.@#*>-%@+..+++++.+.@@@@#####.",
+"#&->>=*%$@$&->,>>,*$$*>>-=;>*%%=>-==;,*#.@$*,>&$@.$*--==-;&#.@%->>>&#@#%-;-=;>=$#&-'>-;>=$.@#&-'*%@+@$*>,-->=%.@%-;=%@..+...$*==%@..@%*,-%@..+....+..@#%%&%&&&%@",
+"$*>,-=%#..#%=,;,,-*$%=,>==-;-%&-'-->,-&#+#&-,>*$@.#&=--->-%@.@$*>'-%@.@%--==--*$$*,>-=>)-%@@%=;,=&@@@$=;;->;-%.@%-,=&$......@&=>%@..#&-;=%@..........+%*======*$",
+"%*=--*%@.+@%*>>>,;*##&--*%*-=%$*---=-=%@@#%=--*%@.@#&=--=*$@..@%=-*$@.+%*=*&==&##&--=*=-=%..%*=-=&#+@$*-----*$+.$*--&$@...+.@%=-&@+@$&--=%@+..+.+..+.+%=>>--->=%",
+"@$%&%%#@...#%*****%@@$%%%#$%%##$%%%&%$#..@$%&%%#@..@#%%%%%@..@+#%%%@@..@%%%$%%#@@$%%%%%&%#..#%&%%$@..@$%&&%%%@..#%**%$@+....+@%&#@..#%**&#...........@%**====*&#",
+".@@@#@@....@@$#$$$@..@@#@.@@@..@@#@@@@.....@##@@+...@@#@@@.....@@@@@+..@.@@+.@@..@@#@@@@@+.+.@@#@@....@@@##@@@..@@#$@+.......@##@....#$$@@.+....+.....@#$$$$$%$@",
+"..+.@@@+.+.+...+..+@.@#@@...+.+.+...+.+.+..+@@@@@........+.+...+@#@@@..+........@@#@@........@@@@.+....@@#@..+.@@#@@...+.+@@@@@..+...........+....+....+.+++....",
+"...@#$#@............#%&%#@..................@%&%#@+.+........++$%&&&$@.......+.+@%&%#@......@$%%$@..+..@%&%@@.@#&&$@.....@#&&&$@...+.....+..........+...........",
+"..@$**%@...+.@.@....$*>-%#@.....+..@.@.....@%=-=%+...@@+@....+#&->;-%@.+.+@.@...$*>-%#@+.+..@&--%#....@$=-*$@.@%->*$@....@%=;>&@.....+@.@..+.+@@......+..+.@@.+.",
+".+@%=,*$@..@@#$##@.+#*>-*%$@@+.@@#$#$#@.+@@#%=>-%@.@@##$#@.++#%*;;-*%@.+@##$$##@$*--*%#@@...#&--&@+..@#%=>=$@.@%=-*%$$@+.@#*>'*#.+.###$$#$@.+####$$@@..+@#$##@+.",
+"..@$=-*%+.@@%&**&$@@#&->=*&%#@@#%&***&%@@#%**->-&@@#%&**&%@.@%*-,-=*$@@#%&****%##*->=*&%@@.@$*--%@@.@#&*--=%@.@%*-=&*&%@..@%-;&#..#%******%@@%*&&*&$#@+#%&**&%@.",
+"...#%**%@.@$*->;-&#@#&->,,,=&##&=,->;'&@#&=>;,;-&@#&=>>>-*%@#&=;,;-*%@#&=>>>,>*$#&>>,;;*%@+@%=>;&#..+$*->'>&@.@$*--->=&@..@%=,*#@.#=>'>,'>*$$=>>-->*%##&=>>>-*%@",
+"...@@%%#@.@%->',>*%@#&>;;>;>=$%=>,=>'>*#%=>'>;>-%@%=;,>;;-&@@&-,;>-*#@%*>,-;,;*$#&-,>;,=*#.@%*;;&#..@$&=>,>&@.@$*->;>=&@..@%-;&#+.$=,,,;,;=%%=;;--;-&$%=>;>>;-&#",
+".+...@@@+.@%=->>'=%@#&->===,-%%-;-**->*#%-;-=->-&#%=,;>>,,*#@#&->=&%@@%->>==,-*##%->=*--*#.+#&-'*#...@$%&=;&#.@$*>,)-&$@+.@%='*$..#&--->>>-%$&->==--*$%-;-*=>;*#",
+"..........#&-,;;,=&@#&--=&=,=%&-,*%%**%#%-,*&*--&#&>';'',>*#@@%--=$@..%=,>>>;-%@#&--**=>*$..@%-;&$@...@@%*,&#.@$*;,>=&@@..@%--&$@.#&--->---%$&--**=-=$&-;=**>;*#",
+".+.+.....+#*>;-=,-&##*->=*=,-%%=,-*&**&$%=,-=->-&#%=,>->>>&#@#&--=&$@.#&=>,;;-&@$&--**=>=$@@$&-,*%@+..@#%*>&@.@%*>-'>*%@.@$&-'*%@@#*->->---%$&>-**=-=$&-;-**;;*#",
+".....+....#*,>>>,-*$$*>'>>>,*%%=>>----*#%=>>->,>*$%=;>>>;>&@@%*>;-=&#.@$*=----%@$*,>=*>>=%@#&=,'=*%@.@%&*=>&#.@%->--,-*$@#&=,;=*$@#*>>->>>-&$*>;==-;=%%=>>>>>;&#",
+".......+..@%-;>>>>*#$&-;>>>=&#$%=>>>>-&##&=>>>;>&##%=>>>>=%@@&=>>>-*#@@$*=---*$@#&;>=*-;=%@#*=-'>*%@@%*-->=%@.@&--=*>>=%@#*=>,>*%#$*>-=->--&$*>>-*>;-%#&=>>>-*%+",
+".+.+.....+@#%&****%@#%&&**&$#@@#%&**&%$@@@%&**&*%@@#%***&&#@@$&*=*&%@.@%*---*%#.#%**%%**&#+@%&**&%$++$*--=&$@.@#&&%%&*&@.#%&***%$@#%**&&*&&$#%&*&%**&#@#$&**%$@.",
+".....+.....@#$#$$#@..@#####@.+..@##$#@@...@##$##@@..@@$##@@..@##$##$...#$%%%$@..@@#$#@#@@@.@+###$@@..@%%%%#@...@######@@..@##$#@@.@##$####@@@@###@##@@.@@#$##+..",
+".......+...+....+.+.+........................@.......................+...@.@..+........@...............@@.+......@@@#@.+..+@#@@....@@@@@+.......................",
+".+.+..................+....+..+.......+.+.@#@@....+........+............+......................+...+.........+...@$%%#@....@%&$@+..+#%%$@@...........+.+....+...",
+".....+.+.+.+..+@........+.@.....+.+......@%&%#@+....@+.+.....+@+.+.@.+.....+..+.+.+@.+.+.+.+.........+...@+....+@%**&#@...@$*-%#...+#&**%@.+.+.+.+......+.+...+.",
+"@@#$$$#@@..@@$#$$#$.+@#$$##$@...@##$$#@.@$&=*%$@..@##@@##@@.@@#$###$#@@##$@@##$.@@#$##$$@.@@$$@@$$@..@@$$#$#@...@&>-%@.+.+@%-,&#.+..@&--&@.........+............",
+"#%****&%#@@#$&****%@@$&*&*&&#@.@#%&*&&%@@%->-=*%@.$&*%$%&%$@#%**&&**&$#%*&%%&*&$#&**%&*&%@$&*%%%&*%@@#%&***&%@..#*>-%#....@%->*#....@%-;&$....@@@@@@....+.+.+...",
+"$=>;>;-=&@$&*-;>;;*$#&=>>>>=%@+#%=>;--&#@&>','>*$@&>>*&->=%@$*;;-=>'-%%*;>=*=;>%%=>;=-'>%#&>>-&=>;*#@%=-';'=&@+@$*)-%@.....%-;*$.+..+%-'*$@+.@$$%$%$#@..........",
+"$*',---'*%%=;-->';*##&=);>>=%#@%*>'>>-*$@&->>==&@@&-'**=>-%#$*'>-=>,-%%='>---'-&$*>'-->-%@%-,-=-;'&#@%-->-,*&@.@$=,=%@+.+.@%-'&#....@%-;=%@.@$*=-===&@+....+....",
+"+&->-=*,-%&='===>>&#@#&,>=*&$.@$=>,,>=&@@%=--*%$@.%=>=&*--&@@$=-==--=$#&>>>,->-%##*-,;=&$@#&->->-=%@@$*->,>*%@.@#=,>%@....@%=;*#.+..+%-,-$@.@&>;;;;-*#..+....+..",
+"#&>,>--;=%%->-->>>&@@$*>=*$#@.@$*>,>>-*@@$*-=&%##.%=-=**--&@@%*--=>=%@#&>>,;>;=$@$&-,>=%@.@$&>)>=%@.@$*=;>-&%@.+$*>-%@....@%-,&#....@%->*#@.@&--->>=&@.....+....",
+"@&-;>,-=&##&=-->>-&#@%*,=*%#@.@%*->>>;=$@$*--**&%@%*>-*->>*#.#%=>>>*$@#%->;>,>*##%*>,;-&$@.#%=,>&#..@$*>,--*&@..#&,-%@+.+..%=>&#.+..@%-'&$.+.#&&%&&%#@+.+...+...",
+"#&->-*&%#@@#%&==>-*##&-,==*$@.@%->>>>)=$.#&-;--=%#$&->--';*@.@$=>,=%@.@%*>>->=&#$*-;->>-%@@%*>>=%@+.@%=,>>--*#..#&>-%#@...@%==&@...@@&--&@...@@@@@@@@........+..",
+"$*;;-*%#@..@#$*-;>*#$*-,>>=%@.@%=->>>=&#.@$*>>-*%@@%&->>>>*#..#%==*$@.@#&=**=*%@#=>-=-;>%@$*,>,=%@..@$=>>,;=&#+.@%-=&#@.+..@&&$@....#&=-%@.......+......+.+.....",
+"#*>>=*#@....@#&=>>*#@%&&&&%#@.@@%%**&%#@..@$&&%$#..@$%*&*&$@..@#$%$@...@#$$$%#@@@%&%%%&&#@#&==*&#.+.@#%&*&&%$@...#%&%@@....@##@@+..@@%&%$@+.+.......+........+..",
+"@%&*&$@@.+...@%&*&%@.@#@#@@@....@@###@@.....@#@@@...@#+###@.+..@@@@.+....@@@@@...@#@@#@@@.@#%%%$@.....@@###@@.....@@@@..+.........+.+@@@@......+......+.........",
+".+@@...........@@@.....@@@@+......@@@.+.+.......+...@.@.@@.....@@@@.....@@#@#@..............@@@@@.......@@.@.+.+.............+..............+..@@@@.....+.+..+..",
+".+#!~{]^/..+.......+...@$%#@..+.@#$$$@@...+.......+#$$$#$%#@+.@#%$@.+.+@#%&*&%#@...@@@@@+...@#$$$@@+.+.##$@@..........+.+.+.....+........+....@#$$##@...+@##@+..",
+".(_:<[[_}+...+..+....+#%*-&$@..@#&===%@.@@@#@@@@@@@%*=**==&#..@%=*%....#&=,>>=%@+@@#$#$$@.@@%&==*%$@.@@%&*&$...+.+.+.........+....+.+.+.....@@%&==*%$@.@#%&*%$@.",
+"+&<,,||<1.....@@.....@$*>,=%#@.#%->,>*$@@#%&&&&&$@#&>,>->)=$..#*;-%@..@%*>>->=%@..#%&%&&#@@%=>;);=&@.@$&-->&$.....@.@@@..@@@@@@@..........+.@$=>;';=&#.+%=>>=%@.",
+".2,3333,4+.+.@#$$@+.@$*-,;>*$@@#&>>-=&#@@$*->>-=&@@%-;>>'-*$+.#&,=%@+.$&-'>-==$@.@#%%%%%@.#&>,,;;>=$.@%=->'&#@..#$$%$$$@@$%&%&%%$.....@@....$&>',,;>=$@+$*--*%@.",
+".2,|,55,4...@#%&%@..@%=->>>*%@@$*>-*&$@.@%->>>;>*$@$*>>-,=%#..@%;-%@..%=>;)>-*$@+.@##@$@@+%*>;,>>>-%@#&=--;*#@.$$&=***&@$*->;>>-&@+@$#$$$#@@$=-,;-'>=%..@%%%$#+.",
+".6,|,|||%...@$&*%#..@%--===&$@@%->>=%#@.#%---->-*$@@&-,>;*$@+.#&>=%@+.%-'>,>>-%@.....@...@%=>,>>>>=%@#&-->>*$@@%&-----&#$*>';',;&#@$&*=***$@%=->;>;>=&...@@@++..",
+".2,,33|,1+.+.%*=&#@.@&--=**&$@@&-,,>&$@.@&->-=->=#.@%*,)>*$@..@%-*%@.@#*>>>>,'&#...+......%=;,,>>--%@#*=;;'*%@$*-;->>=&@@%&&*=-'*##%*->>>-%@%=>;,>>-=%@.........",
+"+6||3||,7...#%->=$@.@%=>---*#@@%=;>-*$@.@%->>->>*#.#%=,,=*%@+.#&-=$@..#%==-;;=%@+....+....$*;,;,;>=%@#&-,;-*%@$='->>;=%@@@#$$&->&#@$&*==*&$@$*>;;>;>-%@...+.+...",
+".&|5|,5,2...#&,)-%@.@#&->'-&#@#%->,==&&@@%=>>,;-*#.@%=>)-*$@..@&>-%@+.#&===-;=%@........+.#%=>>>;>*%.@%&===%#@@&='->>-&@....@$&*%@@@$$$$$$@+@&->;>;-*$..........",
+".48,,|,8{+..#&,,=%@..@$&>;*%@.#&,,,>,>=$@$&*****%@@#&-,'>*%@+.#*'=%@..#*->>;-&#@+.+..+....@$&=>,-*%@.@@$%%$#@+@#&=----&@.....@#$@...@@@@+...@$&=>;>*%#+.+..+..+.",
+".4=9999_0...@%-,-%@...@%*-%#..@$->>>;>*#+#$%$#$$#@.@%*-'>&$.@.@%>-%@..#*=,>>*%@............@$&=-*%#@..@.@@@@...@%&*&**&#+.+....+.............@$&=-*%#+..........",
+".ab2222ac+..@%==&#@+...@$%$@+.@#&&*&&&%@..@.@..@...@#%&&&$@.+.#%-*$@..@$**=&%@.....+.+.+....@#$%$@@+............@#$$#$@+........+.......+.+...@#%$$#+....+.+....",
+"......+......@$%#@......@@@.....@##$$@@..+.....+.+..+@@##@....@#&%@@+..@#$##@...+........+....@.@.....+.+..+.+......+@....@+.+.....@.+.......++++@....+.....+...",
+"+.@@##@..+.........+.+@####.+...@###@.......+@..............+.@#$$$$@........+...............@@@@..+....@..............+@$%%@@..+@@%%$@...+.@$%%$#@..........+..",
+".@#%&&%@...+.@@@@....@#%&&%#@.+@$&&&$@.+.+.@@#@@.+.......+...#$&****%#...........+.+.+.+...+@$%&#@.....##$#@..+.+.+.....$&=*%@@.+@%*=&#@@@#@%*-=*$@@#@+.+.@@++..",
+"+#%*=*&$@....@$%$@...@$*==*%@..#&===&$@...@#%&$@...+.+......#%=->);>*#+.+..+.+.............@@&=-&@.+.@#%**&$@.......+...$*>-&#@#$#&=>*$#$%&$&=--=&$%%$...+#%$@..",
+"@$*-=-*&#+..#%*-&$@+.@%*=-*%#..#&=-;*$@...@%**%@...@@@@@#$@+#&>,>,,>*#.........+.......+.+.@#&-;&#...$%*=-=&#@..@@..@.+.#*>>&$#&*%&->=%%***#%=->=*&*=$@.++%*&#@.",
+"@$*-=-=&@.@@%&>'&&#@.@$*=-*%@+.#&=-'&%@+..@%=*$@+.@%&%$$&%$@#*',;,>=&#...+@#@....+.+........@&-'&#@..#&--=-*%@@#$$$$#@..$&--*%&*=%%=-=&*=-*$%=-;-====$...@%*&#@.",
+"@#%=-=&%@.@$=-;'>=&#.@%*--*%@..$&---*%@...@$%$@...$*--&&--*##&>;,'>=&#+..@$&%$.......+...+..#%=,*$@+@#&=---*%@@&*****%#.$*>-=*=-=%&=--==--*$%=->----&#@.@#&-*$@.",
+".@$&**%@+.@%>'',;;=$.@%=--*%@..$=---&$@+...@@@..+.$*;>**--*##%->,,>=&#..@#&-*$#.............#&>,&$@..@&=---*$@#&--->-*%@%*->----=%&-->>>>-=%%==>->>-&@@+#%=>-%@.",
+"...#$$@@..@$&=-'-=&#.@%***&$@+.#&=**%#............#&>-**=-=$@$&=;,>=&#+.@#*-=$@.+.+@#@.+..+@#&*=&$@..@%=>>-&$@@&=>>>;>&##&*=-->;-%%*=----->%$&==;;;;*#.@%*-;=%@.",
+"+...@@..+..#$&--*%#@..@$%%#@...@#%$%@@.+.+.+.+..+.$&>-==->=$.@$*-'-=&@...@%&%@....@$&%#@....@#$%$#@+.#&-',;*%@@%=>->,,&#@$&=->-'-%$*=-==---$#$&->-;;*#@#*--=*%#+",
+"..+........+%*=-*%#@...+@@@......+@@..............#&>>---'-%@@$&-,;-*#....@#@.....#&-=%@..+...@.@....@%*->-&$@#&=---;>&#@%*---='>%%*-=**->*$#%=---;,*#+%*--**&%@",
+"........+.@$*=->-*%$.......+.+.......+........+.+.#%-',>>>-%@@&=;,;>=#+......+.+.@$='-&@...........+.@@%%&%#@.$*--->>=%@@$===--;>&%*=*&=--*$$&===->'=#+$*->--=&@",
+"+.+..+....@%->,>'>*#.+.........+.......+.+.+......#%=-=*&*%#.@&=>-';=$..+........@$*'>&#+...+.+.+.......@@@..@@&**&*&$@+@$&&&&*>>%$%&%%=---$@%&%%&->*#+#&=>>>=&@",
+"........+.@#&&&&&&%#...+.........+................#%**%$#@@..@#&*&&&%@....+......@#&**%@.................+....@#$$$$#@+..@##@#%%&#@#@@#$&%%#@@$#@$%%%@.+#&=--*$@",
+"..@.@+.....@@#$#$#@......@.+.+....++.+......+.+.+..#%%$@.......@####@.+......+.+..@%%$@...+.....@.+.+.+.+.++...@.++@@.....@@@@@@@......@###...@.@+@#+...+@%%%$@.",
+".@#%%#@.+....@#%%#@+.+@#%&#@...+@#$%#@.+.+@@@@@@..+@$%&%#@+...@@@@@@@@..+@#@@@@..@#&%#@@....+@%%$#+...@#&%#@...@@@#@#@+..@@$%@@..+..+@@$%$@@..@#&&$#++..++@@@@@.",
+".@$&*%#@....@#%**$@..@@&*=&@@..@%&**&$#..@#$$#$@@..@$*=*$@..+@@%%%%%%@.@@$%%%$#@.@$**%#@+...@#%*&$@..@#%==%#@+.@$&%&&%@..@$&&&#@.....@$&=&#..@#%==*$@+.+#$#$$#@+",
+".@%*=*%@+.+@#%==&$@.@@%*--*$@.@$&-;>=%@..@%&&&&$@.@#%===%@...@$======$@#%*===*&$@#%*-=&$#@@@%&==*&@@@$&*--=%#@@$&===**$@.@%*==%$@.@@#%*==%$..@%*--=&#++#%&&&*&$@",
+"@$&=--%#@..#%*--&#@.+$*---*$@.+$=->>*%@.@#*===*$@.@%*->=%@+..@%>')>'>%$&='>;;,=$$&=->>-=%@#&*->>-=%@#&=>>>>=%@$&->>>--%@@$&=--=&$@.@%*->=*$@@$&=-->*%@+$*-=--*&@",
+"+$*>',*#@.@#*-'>=$@.@$*>',=%@.@%=>),*%@.@$*>'>=%@.#&=',-&@...#&-'>--=%%-;=**=-*%%=;'-';>&#%=,,>';>&#%=>'-',>&#$=;'>,;>&#@$*-;,>=%#@#*-';>=&@@$=-;,;=&@+$*>;,;=&@",
+".$&--)-%#+@$&=,'-%@..$&-;)-&@..$&-;'-&@.@$&-,)-%@.@#*-'>*$@+.@&>,>>-*%%=)=%$%*&##&=-==-'&@#%=-=->;&@#&->==>>&@$&=>==>;&@+@&=>'-*$@+$%=>,-*$++#&=>,-*$+@#&=>;-*$@",
+".$&>;-;&$@@#*->->*%@.$&>->>*$@@#&-;->*%@@$&>->>*%@@%*;>;-&@@@$*,->,>*$%-;*$#$%$##&=>=--*%@#&=-==-=%@#&=-=--=%@@&=>=--*%@.@#&>;*%@..@$&>;*%@..@#&>;*%@..@$&>,*%@.",
+"+%*>;-'=&@@%=>,-'=&#@$=>,-'=&@@%*-,-'=&@+%=>,-'=&##&=,-;>=$@#&*;;,';*#&*'=%%%%%@@%*,>>-*$@@&=,>>-*%@#%=,>>-&$@@&*,>>-&$@..@%-;&$@...+%-;*$@...@$-;*#+...@%-;*#+.",
+"@&-,,-,-=##%-;;>,-*$#&-,;>'-=#@&-'>;,-*$#%-;;>;-=$%=>,>,>-%#$*>,;--=&@%=>-===-&$#&=;->>*%##&=>>>>*%##&=>->>*%@@&=>-;-*%@..#&-,&$@+..@&-,&$@+..#%-;&$@..+@%>;*#@.",
+"#*>;>->,-%$&,;>->'-%$&;,>--'-%$*>,>->'-%$*>,>->,-%&=,>->,;*#%=,>>>--=$#&=>>>>>*#$&=,-->-=$$&->----=$$&=,----=$$*->->--=$@@$&-'=%$@.@%&-,=%#@.@$*-,=%$@.@%&>;=%#@",
+"%*',-=>'-&%=,>-=>'>&%='>-=>'-&%=,,-=>'>&$='>-=>'-&&>'---,,*$&>,-',>>>%@$&='>=*$@$=,;->;,=%%='>>>'-=%%=,>>>>,=$%=,'->;;=$@#*-,,-*&@@#&-,,-=%#@$&-,,-*&@+#*=,,-=%#",
+"$*>>=*=;-%$*;>=*=>-%$&,>=*->-%$*->=*->-%$&,>=*=>-&&->-**->=$&=>->;>>-%.@#*>>*$@.#*-,>->>*#$*>;-->>=$$*>>>-->*##*-,-->>*#@$&=>>-*&@@#&=->-*&@+$&=-;-=%#.$*=-;-*&@",
+"@%&&%%&&&##%&&&%&*%$#%&&%%&&&$@%&&%%&*&$#%&&&%&*&#$&*&%&&&%#$&&&*&**&@.@$*=*$@..@%&*&&*&%#@%&**&*&%##%***&&&%#@%&*&&*&%@+@%&*&&&$+.#%&&*&&$@.#%&&&&&$@.#%&*&&&$+",
+"@@######@@@####@#$#.@@#$####@@@+$#@###@@@@######@@@####$$$#.@#####$##...@#$#@....@@$$#$#@@.@$$$###@..@#$$$$##..+#$$$$#@@..@@#$#@@..+@#$$$@@..+@@###@+...@#$$#@@.",
+".+@@@@@@...@#%%%%$#...#%%#@......@$%%@@...@$%%$@...@#$%%%$#...@@#@@.+.+......+...+.@@@@@@..@#%%$@......@#%$#@...@$%%$@....@@@@@+......@$%#@+..@@+++......@@$@+@.",
+"@#$$%$$#@..@$*-==*$@.@$&=&$@..+.@#&**$@..@#&==&$@..@%*=-=*$@.@@$$$##@........@...@@#%%%%#@.@$*=&#@@+..@#&**$@+.@$&==&$@.+@@$$$$#@+...#$**%@@@$$$#@+++...@$%&%#+.",
+"@&*=*=*&$#@$&->>-*$@.@%*=*%#@...@%=-*$@+.@%*--*%#.@#&->>-*#@.@$*&**%@.+@$@@.@@@.@#%**=>-&@@#%*-*&#@.@@$%=-*%#@@@%=--*&$.+@%*&&&&$@@@#%&==&$@@&*=&%#@.+.#$*--=%#+",
+"$&,>>-->*$#&=->;-=%@.@%*--*%@..@%&--*%#.@@&=---*$@@%*->;-*#@.#&====*$@@#&%$$$%$@#&=>>>,'*@#%**-=*&$#@%&*--=*%@@%*-=--*&@@&*=====%@@$&*=--*&#$*-;-*%#@+.#&->>>*$+",
+"$*;;---,=%%*>>=->-*$@%*->--=%@#%*-->-=%@@%*-->-=%@#%*->>-=%@#%*->--=%@@%=**%*=*#%*>;-;,>*#$*>-==--*#$*--*=>-*$$*--==>-*$$*>-*=>>*$$&->-=>>=%$&-,>-=&$@.#*->>;=%@",
+"$=>>-=*>-&%-;,-=>,=#$&-;-->>&#$&-;-->>&#$*---->>*#$*->--;>&#$*----;>*@@%->-=--*$%=,--->>=%%-;-**>'*$%=,-**>,=$%-;-**>,=$%-;-**>;=#$*;>==>;-%#&*,;;>-*#@$*->>,=&#",
+"%=,,>=*--&%->>--;;*$%=,=**>>=$%->-**>>=$%-,=**->=$%-,=**->=$%-,=**->=$@$*>,>'*%#&-,*-----%%=>=&&>;*#%->=&&>>*#%=>=&&>;*#%=>=&&>,&$@%->-=>-*##&=-===>=$@$*-;,;=&#",
+"$=>,-**=-&%=>>>->,*$%=,=%%=-=%&-'=%%=-=%%=,=%&=-=%%=,=%%=-=%%=,=%%*-=$@#%=,,>*%#%=,---=--%%=-=%&-,*$$=-=%&-,*$%=-=%%-,*#%=>=%&='*#@$&->>;*%@@%=-===>=%@$*=-->;=%",
+"$&>-=&*=-&%=>->>,;*#&-;*%%=>=%%->=%%=>=%&->=%%=>=%&-;*%%=>=%&-;*%%=-=%@$*-;>,=%#%-,--==>=%%=-=%&-,&#%*-=%&-,&#%*>=&&-;*#$=-=&&-;*@.@%=;,-&#@#&=;-->;=$@#=====,-%",
+"$*>>=*=>-%%->-=-;'*#$=,=**->*%%=,=**->=$%=>=**->=$$=,=**->=$%=;=**->=$@%=>-->-*#%=,>--->=$$*--**-;*#$*-=**>>*#$*-=*=-;*@$*--**-,&#.@$*>,=%#@$&=,>>>-&#@%=--==;-%",
+"$=,,>->,*%%-,>=-,>*#$&=->>;>&#$&=->>;>&#$&=->>>>&#$&=->>>>&#$&=->>;>&#@%==*&*-&#%*>;>>;>&##&=>>>,-%@#&=>>>,-&@#&=>>>;-&@@&=>>>;-&@.@%=,,-&$@$=;,-=*&#@@&-;>>;,-%",
+"%*-'>'>=&#%=>;**>;&#@$&=;>-*%@@%&=;>>*%@@$&=>,>*%@@$&=>'-*%@@$&=,>>=$@@$%%##$%%@#*->;;>=$@@$&>,>-=%@@$*>,>>=$@@$*>>,>*$@@$*>;;>=$@.@%=>,>*%@%=>;=*$@+.@&-;-->>=$",
+"#%&&&&&&#@#%&&%$&%#@.@#%&&%$@..@$%&&&$@..@$%&&%%@..@$%&%%$@..@#%&&%%@..@@@@@@@@@#%*&&&&$@..#$&&&&$@..@#%&&&$@..@$&&&%%@..@#&&&%%@.@@$%&&&$@+#%&&%%@...@#&&&%&&$@",
+"@@##$#@@@.@@@@@@@@@...@#@##@....@@@@@@....@@@#@@.....####@.....@@@@@............@#$$##@@.....@#$@@@...@###@@@....@@#@@@...@@##@++...@###@@@..@#@@#.....@@@@#@@@.",
+"..@@@@.......+@@@@.+.+.@@@@.+....@.@.@+...+.....+....@##@.+.........+.............@@@@..+......@@@@+...@@@@.+.........+...@@@@.........@@@@...@.@@@.+...........",
+".@#%$#@.+....@#%$@....@$%%#...+.@##$#@.....@@@@....+@#&%$@...+........+.+.+.+.+..@#%%#.....+..@$%$@....@%%$@...+@@.@@...+.#$%#..+.+...@$%$@.+.+#%%#@....@@@@@@..",
+".@$&*%#...+.@$&*%#...@#&**$@...@%&**&$@+@@#$###@+...#%==%@+....+..+..............@$&*%#@+....@$&*%@+..@%**&$@..@#$$###...@$&&%#.....+@$%*%@@..@%**%#@..@@#$#$@@.",
+".@#*=*%#...@$&==%#.+@#%--=&#+.@#&-;;=&#.@#&*&*%#...@$&==&$@.@@######@...@#$##@@.+@$*==%#@...@#&*=%#..+#&=-=%#+@#&*&&&$$..@$*=*%@....@#&=*%@..@$*=-*$@..@%&&&&$+.",
+".@%*--&$+..#%=-=%#..@%*---*$..@%=->>=%@.@%*===*$@+.@%=--*$@.@%&&%&&&%@@#%&*&*%$..#%*=-*%$@@@%&=>=&$.@@%=---*%@@%&====&$..@$*--%@+..@#&=-&$.+.@%=>-*#@..#%*-=*$@.",
+"@$*->,=&#@#%=>,>*$@.@&->'>=%@+@$=>>)-&#@@&->'>=%@.@#*-;'-%#@$*-;--'>=$$&=-,>)>&#@$*-;'>=&#@$*->)>=&#@$=-,;'-&##&=,>'>=%@.@%=;;&#...@$=;;*#@..@&-;;*$@.+@&-;;*$@.",
+"+$=->>;*$@#&---;-&$.#&=>>;-&#.@%=-->;*%@#&-->;-&@.@%*---;*%@$=>>)>->>%%='-=-,>*@#&>,-->,=$#*;;-->,=$#&>;---,=%%='-->;>&#.@$*>'&#.+.@$*>,&#...@$*>,&#@..@$*;;&#@.",
+"@%=->-)=%##*->>)>*#@#*->>'>*$.@%=->>,=%##*->>'>*$@@%=>>-)=%#$=--,,--)&%='=&*=-&@#&;,---,-%#&,,>--)-%#&,,---'-%%='>--,)*$..#%-;*#...@#%-;*$..++#%-,&$....@%-;*$..",
+"#&>;,,>=&#%=;,;,>*$@%=>';,>*$@#&>,,;;=&@%=>;;,>*$@#&>';>;=&#&=>,';>>>%%=>-===-&#$*',-->;=%$*'>>>>>-$$*'>>->;=%&-'-->>-*#..#&-,&$@+..#%-,&#@..+#&-;*#@..@#&-,&#@.",
+"$*;>-->=&#%=;-->>*%@%-;-->-=%@#*;>-->=&#%=,-=>>*%@#*>,-->=&$*>--''>>-%$&->;>>>*##&;'>>->=%#&,';->>=%#%,';>>>=%%='>->>-*#.@$&-,*%#@.@$&-,=%#+.@$&-,=%#@.@$&-;=%#@",
+"#*>,->,-*$%-'--,>-%#%-;--;;=%@$*>,->)-*$%-;->>,=%@$*>>>>'-*$*>,;'>;>-%@$&='>-=%@#&-,>>>,=$#%->>>>;=%#%->>>'>-%%*>;>>,>&#@#&->'=*&@@#&->,=*&@+#&->,=*&@+#&-;,=*%#",
+"#%==-=-=*##&=-=--=%@#*=--=-=$@@%*-==-=*$$&--=--*%@#%=-===-&#%*===--=*#.@$*;>*%#..#%=-===&#@#&=--==&#@#&*-===&#@%&=-==*$@@#&=---*&@.$&=->==%@@#*=---*&@+$&==>-=&@",
+"+#&&*&*&%@@%&*&&&%#@@%&*&&&&#@@#&*&*&&%@@%&**&&&#.@#&&**&&%@#%&&&&&&$@.@$=>=&@...@$%&*&%#@.@#%&*&%#@.@#%&*&%#..#%&&&&$@..#%&&*&&$@.#%&&**&$+.@%&**&&$+.#%&*&*%$@",
+".@##$$##@..@@$$#$#@..@#$$#@#....@#$$#@@..@##$##@@...###$##@.@###@#@@@...@$&%#@.+...@@##@@...@+$##@@...@@####.@..@#$##@+...@#$$$@@+..@#$##@@.+.@##$$@@+..@#$$##@+",
+"+@@$$#$@@....@@@@@....@@@.........@@@@....@@##@.+....@@@@@...........+...@...............+..@@@@...+....@@@@....@.@@@.................@@@@..@@#@@...............",
+"@$***&*&$+.@@$%%$#@+.@#$$@@.+.+..@#%$#@+..@%&%$@..+.#$%%$#@.......@......@..@+...+.........@@$$#@......@#$%#@.+@@%%$#@+.+.....@..+...@@$%$@@@&&&#@+......+@@@@..",
+"$*>,>>;=%#.@%&==*%#@@#&*&%@.....@#%==$@..@%*>-&$@..@$*==*&#+.@#####@@+.+.@#$@@.....@+@@@.+.@%**%$@.+.+@#&**%@.@@%*=*%@...#@$$#$@@..+@@%*-&@@%=>-%#@+.+.#@#####@.",
+"%=>>,,,=&@@%&->;-%#..#%==*%@...@#&=-*%@.+#&=>>*%@..#&=>>-*#@@#%&&&&%@...@$**$@+.+.@#$%$%$#@#&*==&$#.@$$&*-=&#@#%&=--*%@@@$&&&&=&#@@$$%&=-*%@$=->&%$@@.@#%**&&&%#",
+"#*->->>-*#$&-->>-&$@@#&=--*$$.+#%=->*%@@@$*-->=%#@@$&->>-&#.@%*=-==&#...$&->&#...@$&*=***$#&*====*%@#&*=*==*%#%*-====*#@#&-=**-=%@#&*====-*%$&=>-**&$.#&===*=-*%",
+"$&->>>'>*$%*>>>>>*$@#%*>>--&$@#%*->>-*#@#&=>>>-*$@#%=>>>-*$@#&=>>>-*$@@@$*>>*$@.@$&-->>-=%%*>-=*--*#%*--*=--&$&->=*=>=%@$=>-=*--&#$&>-==->=%#&=>>--=%##&>>==->=%",
+"#&-;,',,=%%=,,>>;-&#$*>;->;-%#$*>,->;-%#$=>,->;-%@$*>,->;-%#$=>;->;-%@@%&=--=&%@@&-;>>'>=%%*;>**--*$%=;>**--*$&-,=*=--&@%=;>**--*$@&---=->*$#%=,==->=%#&--==->*$",
+"#*>>==-,-%#&>;-=->*$&='-==>,&$%->-==>;*#%=;-==>;*$%-;-*->,*#%='-==>'*#$&>-'>)>=##&>,-->,-%$&>-**=-*##*>-=&=-=$%=>=&*-=&@#*>-**=-=#@#&->>;*%@@%=;-=>>=$+#&->>>*%@",
+"$*,-=*=,=%$&--=*=-=$%-,***>,&$%>'*&*>,&$&-,***>'&$%-,=&*>'&$%-;***>;&#@%*====&%#$*'>>>-,=%$&--**=>=$$&--**=-=$%=>=**--&@#&--**=-*$.@%=>,=&@@@&=,>>;>*#+@%*;;-%#.",
+"#&,>=&=,-%$*--**=-=%&=,-*=-,&$%=,-*=-,*#%=,-==>,&$%=,-*=>;*#&=,-*=>,*@@#%&=-&%@@#*;,>-=,-%#%--=*->=%#%--*=->=%%*--*->>&#@&--==->=%@@%*-,=$@.#&=,,>-=%@.@$=>;*$@.",
+"#&-;>>;>=$$=,>-=>,-%%=,>>,>>%#%=>;>;;-%#%=>>>>,-%#%=>>>,>>%#%=>;>>,=&@.@#&->&@..$*>,;;>>*$@%=>>>,;-%#%=>>>;,-%$&->>;;'*#@$*>;>;'-%@$*>;>&#+.$*->-*&%@++$*-;>*#..",
+"@%*>>';=&#$=>'-=-'-%#&=>>,>*%@#&*,>,>=$@#&=>';>*%@#&=,>,>=$@#&*'>'-=$@..@$**%@..#&-,;,,=&@@#&->;>'>%@#&->,>'-%#$*>>,>,=#@$&=>'>,-%@%=>'>&+.+$*-;-*$@..+%=;,>&#@.",
+"+@%%&&%%#@#%&&%&&&%#@#%*&&%%@.@#%%&&%$@.@#%&&&&$@.@#%%&&&$@+@#%%&&%$@@...@$#@+..#&=**&%%#..@#%&*&&&#.@#%&&&&%#.@$&&&&&%@.@$%&&&&&#@%=-=*%@..$&=-*&@@..+$====$+..",
+"..@@###@...###@@@##@.@@####@...@@###@@@...@@#@@@@..@######....@@##@@..+...@@.@..@$%$$##@@.+.@@###@@@..+@@####@...#####@....@###@@@.@$%%$#.+.@$%%$#@....@$%$$@+..",
+".........+.@#@@.............+....@.@..+.........+.@@$%%$%%$@....@.#@...@@#@##@.....@@#@........@.@.+.........+.........+....@.....+.@@@@@...#%%$@@@@.....@......",
+"+...+@+...@%%%#@...+..........@#$#$#$#@@+.@@@.....@%===*=-*#+...@#%#$..@$&&&&#@...@#%&#@@...+.@@##@....@@#@.....+@@.@@@.@@#@@@.@....@$###$@@%=-&$$##@@..@+@@@#@.",
+"...@#$#@..$*==%#+.@..@@$$##@+.$&**=***&#.@#$%#..+.@&,>>>>,=%.@@@#%*%#@.#&*===%@+.@#%*=&#@+...@@%&&%#+@@$%&$@.+@@$#$$#$#@@%&%%%$##.@@%&&&*&##*>;=***&%@.##$#@#$#@",
+".+@#&*%#+@$=>'*$@@##+@%&**%#@@&=>>)>,>-$.@%**%@...@&>,>>-'-%@##$&*>*$@+#&=-->*#@@%&*-;=&%#...@%=>;*#@#%&--*$@@#%*=**=*&#%=--==*=&#@%*--=>=&#&-,>->>-=%@#&=%%**%@",
+"..@%=-*#..#*>,=%$%&%#%=>)>-&#@%&==-=**%@.@%*=%@.+.%*>,,;>'-%$***=-'=%##%*=>-,*%#$*->,)-=*%+..#%->>*#$**=>>=&%#%=)'>),;=%&-',','>-%$&=->-;>*$%*-;--;,=%#$*>=&-;=$",
+"..@%=>=%@.@$=>=&%*=%%*>>;;-=&#%**=>>**%#.#%==%@..@&-;>;;>'>&%->,,>'-*$%*--,-,-*%%=;>>'>>=%@.@$=>'>*#%-;,,,'>=$$&,>-=-'-%%*->>'>-*#%=>,,>,,-%%*-,==-;=%@$&;-=-;-%",
+"..@$*--%@.@$*-;&*--%&>>=----=$&==-'>-=*$@@%=-%#...%->>>>,>-%%*-,----*%*=->'-,-=%&=';;;---%+.@%=>>>*#&->>>,--*$$*,-**=,=%#$&=>-=&#@$*->>-;;=%%-,>=*=>=$.@&-;;-=*#",
+"+@$&*--%@..#%*,=*=*$%,-==->--%&*==;;==*$.@%=>&#.+@$=>;;;,;=%@#&->-=-*%&==-,-,-*%%=;,;,---%@.@$=>>-*$%=---,-*%##&,-&&*,-%.@$&-=*%@.@%*--->;*$&=;,=**-=$+@%=,;-*$@",
+"#%====-&$@.@#&--=*%#&>-**->-=%#$%*-=&%$@.$%-,&#...#*>'>,>>=$.@$*->=&&$#%*=-->=&$%=;>,,=-=%@@#%*>,>-%%=>>>>-&$+$*,=&&=,=%..@%==*$@.@$*--->>&#%*=>=*===%@#%-,,-&$@",
+"$*,;==-=%#..@%*,-&$@&->=*=>>-%@@$&-=&#@@.@%->=$@..#%->-=-=*#..@&->=%$@@#&=-=>-&#$&-=>'=**$#$%*=-;,-%$*,;>--*%@#&,>*&='-%@..#&==&#..$&--->>&#$%&=-=--=$$&*-;,>*%@",
+"%-,;>>>>=$...#%=-=&##*>>==-;=$..#&--=$@..@#*--&$@.@%=>>-*&$@..@#&==&$@.#%=-*->-%#$&*-;*%$#&*->,->-=$@%->>-==*$$*>>---;-$+..#%*=*%@.$*-->;-&@@@%*-->>*$&>,>==>>*#",
+"&>-==->;=%@..@#&*-=%#$*=>-**&#..@%=-*%@+..#%=>=&#.@#*-,-&$@.+..@$%**%@.@$&=&&==%@@#%-;&$@@%*--=**=*$@#*=**&==%$&-=&**-*$...@#%==&#+@&=->>-&@.@@%*=-*%#%==*&%*=-%",
+"%**%&**=*$+...@#%=*%@@#&=&%$@+..@$&*&#@....#%==%@.@@%*=*$@......@#%%$@.@#%%$#&&%..@$*=%@..$&**&%%%%#.@#%%$$&&$@$%%$$%*%#+..+@$&&%#.@$&*===%@..@#%&&%@@$%%#@#$&*$",
+"#$$##$%$$@......@$%#..@#$$#@.....@$#$@.+..+.#$%$@@..##$$#.+.+....@##@...@@@@@@#@..@#$%#@+..##$#@@@#@..@@@.@@#@.@##@.@$#@.....@#$#@.+@$$%&%#@....###@..@#@+..@#$@"};
index 5ed00843253625e32d666b91630d522182908121..515a1bcaf3209d156ec8dd3335810be50264220f 100644 (file)
@@ -585,94 +585,94 @@ static unsigned char matrix2_bits[] = {
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xaf, 0xea, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xef, 0xeb,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x5e, 0xff, 0xff,
    0xff, 0xff, 0xfb, 0xff, 0x5f, 0xff, 0xff, 0xff, 0x7f, 0x6f, 0xed, 0xff,
    0xf7, 0xff, 0xbf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xed, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xab, 0xff, 0xfb, 0xfa, 0xff, 0xff,
+   0xa7, 0xd2, 0xfe, 0xff, 0xff, 0xff, 0xab, 0xff, 0xfb, 0xfa, 0xff, 0xff,
    0xff, 0xed, 0xdb, 0xff, 0xee, 0xff, 0xab, 0xd4, 0xff, 0xff, 0xff, 0xab,
    0xfa, 0xff, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xdd, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x61, 0xff,
+   0xdd, 0xff, 0xbf, 0xff, 0x05, 0x00, 0xfd, 0xff, 0xff, 0x7f, 0x61, 0xff,
    0x17, 0xfd, 0xef, 0xff, 0xbf, 0xa8, 0xf4, 0xff, 0xf5, 0xff, 0x06, 0xe0,
    0xff, 0xd6, 0xff, 0xad, 0xff, 0x5f, 0x75, 0xff, 0xff, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x57, 0x69, 0xff, 0x6b, 0xfb, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x57, 0x69, 0xff, 0x6b, 0xfb, 0x03, 0x40, 0xff, 0xff,
    0xff, 0xff, 0xc3, 0xfe, 0xab, 0xd4, 0xbf, 0x6d, 0xff, 0xa9, 0xa1, 0xbf,
    0xd1, 0xff, 0x0b, 0xa0, 0xdf, 0x5e, 0xff, 0x0b, 0xe9, 0xff, 0xd2, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xd5, 0xfe, 0xaf, 0xfe,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xa0, 0x7f, 0x05, 0xf8, 0x6f, 0xdf,
+   0x0b, 0x00, 0xfa, 0xff, 0xff, 0xbf, 0xa0, 0x7f, 0x05, 0xf8, 0x6f, 0xdf,
    0x5e, 0x40, 0xa0, 0xff, 0xe4, 0xff, 0xa2, 0xe2, 0xbf, 0x94, 0xbf, 0x00,
    0xf4, 0x3f, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07,
-   0x40, 0x7f, 0x01, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0xfd,
+   0x40, 0x7f, 0x01, 0xfa, 0x05, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x02, 0xfd,
    0x03, 0xe0, 0x5e, 0x55, 0xbd, 0x40, 0xc0, 0xff, 0xa1, 0x7f, 0x05, 0xa0,
    0xbf, 0x9d, 0xbe, 0x05, 0xd0, 0xff, 0x80, 0xfe, 0xff, 0xff, 0xff, 0xef,
-   0xff, 0xff, 0xff, 0x5f, 0x00, 0xfd, 0x03, 0xf0, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x5f, 0x00, 0xfd, 0x03, 0xf0, 0x0d, 0x00, 0xf9, 0xff,
    0xff, 0x57, 0xa0, 0x7e, 0x05, 0xfc, 0xab, 0x54, 0x7f, 0x80, 0xa0, 0xbf,
    0xf0, 0xff, 0x40, 0xe2, 0x7f, 0x94, 0x7f, 0x10, 0xb2, 0x57, 0xc2, 0xff,
    0xb7, 0xfd, 0x57, 0xbd, 0xff, 0xff, 0xff, 0x05, 0x20, 0xff, 0x05, 0xfe,
-   0xff, 0xff, 0xff, 0xaf, 0xfe, 0x5f, 0x01, 0xfa, 0x41, 0xe9, 0x0f, 0x00,
+   0x0b, 0x00, 0xfe, 0xaf, 0xfe, 0x5f, 0x01, 0xfa, 0x41, 0xe9, 0x0f, 0x00,
    0xfa, 0xa2, 0xe4, 0xff, 0xa1, 0xef, 0x02, 0xc8, 0xdf, 0xb6, 0xee, 0x00,
    0xe0, 0x3f, 0x82, 0xfe, 0xbf, 0xd5, 0x7f, 0x6b, 0xfd, 0xff, 0xff, 0x0f,
-   0x00, 0xfa, 0xad, 0xf4, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x17, 0x80, 0x7e,
+   0x00, 0xfa, 0xad, 0xf4, 0x0b, 0x00, 0xf9, 0xdf, 0xff, 0x17, 0x80, 0x7e,
    0xaa, 0xf6, 0x0b, 0x00, 0x5e, 0x01, 0xd0, 0xbf, 0xd0, 0xbf, 0xa4, 0xb2,
    0xff, 0xdd, 0x3f, 0x00, 0xa0, 0x2f, 0x40, 0xff, 0x6a, 0xfb, 0x57, 0x95,
-   0xfe, 0xff, 0xff, 0x85, 0x00, 0xfe, 0x53, 0xfb, 0xff, 0xff, 0xff, 0x1b,
+   0xfe, 0xff, 0xff, 0x85, 0x00, 0xfe, 0x53, 0xfb, 0x0b, 0x00, 0xfe, 0x1b,
    0xfc, 0x2f, 0x14, 0xfa, 0xa1, 0xfe, 0x2f, 0x0a, 0xfa, 0x45, 0xd4, 0xbf,
    0xb1, 0xff, 0x00, 0xe4, 0xff, 0xdf, 0x6f, 0x41, 0xc4, 0x5f, 0x8a, 0xfe,
    0x03, 0x80, 0x0d, 0x00, 0xfa, 0xb7, 0xea, 0x15, 0x44, 0xf8, 0x5f, 0xff,
-   0xff, 0xff, 0xff, 0xaf, 0xfe, 0x0f, 0x49, 0xbd, 0x44, 0xfb, 0x05, 0x80,
+   0x0b, 0x00, 0xf8, 0xaf, 0xfe, 0x0f, 0x49, 0xbd, 0x44, 0xfb, 0x05, 0x80,
    0x7c, 0x23, 0xe8, 0xff, 0xe0, 0x5f, 0x00, 0xa8, 0xdf, 0xff, 0x3f, 0x08,
    0xd0, 0x2b, 0x40, 0xdf, 0x4a, 0xd1, 0x07, 0x00, 0xfa, 0xee, 0xff, 0x41,
-   0x00, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xfa, 0x1d, 0x14, 0xbd,
+   0x00, 0xfd, 0xff, 0xff, 0x07, 0x00, 0xfe, 0x9f, 0xfa, 0x1d, 0x14, 0xbd,
    0x81, 0xf6, 0x0f, 0x0a, 0xfd, 0x85, 0xd8, 0xff, 0xd1, 0xbf, 0x10, 0xe0,
    0xff, 0xff, 0x5f, 0x40, 0x82, 0x5f, 0x44, 0xfd, 0x02, 0xd1, 0x0f, 0x00,
-   0xfa, 0x15, 0xd1, 0x0b, 0x24, 0xf8, 0xf7, 0xfe, 0xff, 0xff, 0xff, 0x55,
+   0xfa, 0x15, 0xd1, 0x0b, 0x24, 0xf8, 0xf7, 0xfe, 0x0f, 0x00, 0xfc, 0x55,
    0xfd, 0x17, 0xd9, 0x7f, 0x00, 0xfe, 0x85, 0x08, 0xfa, 0x02, 0xf4, 0xbf,
    0xb2, 0x7f, 0x44, 0xa2, 0xff, 0xff, 0x1f, 0x20, 0xc8, 0x17, 0x81, 0x3e,
    0x51, 0xd0, 0x55, 0x15, 0x7c, 0x00, 0xa0, 0x21, 0x80, 0xfe, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x9f, 0xfa, 0x17, 0x92, 0xfa, 0x08, 0xf8, 0x0f, 0x2a,
+   0x05, 0x00, 0xfe, 0x9f, 0xfa, 0x17, 0x92, 0xfa, 0x08, 0xf8, 0x0f, 0x2a,
    0xfe, 0x0f, 0xd4, 0xff, 0xe5, 0xef, 0x40, 0xa0, 0xff, 0xff, 0xbf, 0x40,
    0x81, 0x3f, 0x80, 0x7e, 0x00, 0xd0, 0x3f, 0x29, 0xf8, 0x05, 0xe0, 0x43,
-   0x10, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0b, 0xfe, 0x0f, 0x08, 0x5f,
+   0x10, 0xf8, 0xff, 0xff, 0x0f, 0x00, 0xfc, 0x0b, 0xfe, 0x0f, 0x08, 0x5f,
    0xa1, 0xfe, 0x0b, 0x00, 0xfc, 0x00, 0xf9, 0xbf, 0xd0, 0xbf, 0x02, 0xc0,
    0xff, 0xff, 0x5f, 0x00, 0xd0, 0x57, 0x40, 0x5b, 0x24, 0xf2, 0xd7, 0x17,
-   0xfe, 0x54, 0xa5, 0x0b, 0x02, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5b,
+   0xfe, 0x54, 0xa5, 0x0b, 0x02, 0xfe, 0xff, 0xff, 0x0b, 0x00, 0xfe, 0x5b,
    0xfa, 0x5f, 0x20, 0xfd, 0x82, 0xea, 0x1b, 0x04, 0xfa, 0x17, 0xd0, 0xff,
    0xb1, 0x7f, 0x05, 0xa2, 0xff, 0xff, 0x5f, 0x02, 0xd0, 0x2f, 0x44, 0x7e,
    0x00, 0xd2, 0xbf, 0x36, 0xf8, 0x4a, 0xea, 0x06, 0x04, 0xf8, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x07, 0xfe, 0x17, 0x94, 0xbe, 0x00, 0xfd, 0x87, 0x48,
+   0x0b, 0x00, 0xfc, 0x07, 0xfe, 0x17, 0x94, 0xbe, 0x00, 0xfd, 0x87, 0x48,
    0xfe, 0x02, 0xf5, 0xbf, 0xe0, 0xff, 0x02, 0xc1, 0xff, 0xff, 0xbf, 0x00,
    0xa0, 0x5f, 0x80, 0x5f, 0x24, 0xf4, 0xff, 0x2f, 0xfe, 0x95, 0xea, 0x0b,
-   0x40, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, 0xf4, 0xbf, 0x00, 0xbd,
+   0x40, 0xfd, 0xff, 0xff, 0x07, 0x00, 0xfe, 0x2f, 0xf4, 0xbf, 0x00, 0xbd,
    0x25, 0xa5, 0x1f, 0x00, 0xfa, 0x15, 0xd4, 0xff, 0xd1, 0xff, 0x2d, 0xc0,
    0xff, 0xff, 0xbf, 0x48, 0xe1, 0x5f, 0xa9, 0xbe, 0x40, 0xa0, 0xff, 0xbf,
-   0xfa, 0xff, 0xfe, 0x2b, 0x04, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x85,
+   0xfa, 0xff, 0xfe, 0x2b, 0x04, 0xfe, 0xff, 0xff, 0x0d, 0x00, 0xff, 0x85,
    0xfa, 0x6f, 0x80, 0x7f, 0xa0, 0xe8, 0x0b, 0x80, 0x7e, 0x03, 0xfa, 0xbf,
    0xd0, 0xbf, 0x4a, 0xe0, 0xff, 0xff, 0x7f, 0x02, 0xb4, 0x7f, 0x52, 0x7f,
    0x11, 0xd0, 0xff, 0x6f, 0xff, 0xdb, 0xf7, 0x07, 0x40, 0xfb, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x0f, 0xf6, 0xff, 0x43, 0xfd, 0x00, 0xa0, 0x5f, 0x3d,
+   0x03, 0x00, 0xfc, 0x0f, 0xf6, 0xff, 0x43, 0xfd, 0x00, 0xa0, 0x5f, 0x3d,
    0xfa, 0x06, 0xd0, 0xff, 0xa1, 0xff, 0x90, 0xd4, 0xff, 0xff, 0xff, 0x12,
    0xf4, 0xf7, 0xf7, 0x7f, 0x03, 0xc1, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x5f,
-   0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x05, 0xfc, 0x5f, 0xa2, 0x5f,
+   0x09, 0xff, 0xff, 0xff, 0x0b, 0x00, 0xff, 0x05, 0xfc, 0x5f, 0xa2, 0x5f,
    0x00, 0xa0, 0xb7, 0xe5, 0xfd, 0x02, 0xf4, 0xbf, 0xf0, 0xbf, 0x00, 0xe8,
    0xff, 0xff, 0xff, 0x85, 0xea, 0xff, 0xde, 0xff, 0x92, 0xd0, 0xff, 0xbf,
-   0xff, 0xff, 0xff, 0x6f, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+   0xff, 0xff, 0xff, 0x6f, 0xe0, 0xff, 0xff, 0xff, 0x03, 0x00, 0xfc, 0x0f,
    0xf4, 0xff, 0x62, 0xff, 0x00, 0xc0, 0x6f, 0x5f, 0xff, 0x25, 0xd4, 0xff,
    0xa1, 0x7f, 0x01, 0xf8, 0xff, 0xff, 0xff, 0x0b, 0xfc, 0xff, 0xff, 0xff,
    0x87, 0xc2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xa0, 0xfe, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x05, 0xfe, 0xff, 0xab, 0xbf, 0xaa, 0xea, 0xff, 0xff,
+   0x07, 0x00, 0xff, 0x05, 0xfe, 0xff, 0xab, 0xbf, 0xaa, 0xea, 0xff, 0xff,
    0xff, 0x8a, 0xf4, 0x7f, 0xf5, 0xff, 0x54, 0xf7, 0xff, 0xff, 0xbf, 0xf7,
    0xff, 0xff, 0xfd, 0xff, 0xbd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
-   0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xf4, 0xff, 0xeb, 0xff,
+   0xdf, 0xff, 0xff, 0xff, 0x45, 0x2a, 0xfd, 0x5f, 0xf4, 0xff, 0xeb, 0xff,
    0xa5, 0xaa, 0xff, 0xfb, 0xff, 0x5b, 0xfd, 0xff, 0xd5, 0xff, 0x23, 0xed,
    0xff, 0xff, 0xff, 0x5f, 0xf5, 0xff, 0xff, 0xff, 0xf7, 0xea, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0b,
+   0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0x57, 0xaa, 0xfe, 0x0b,
    0xff, 0xff, 0xfd, 0x7f, 0x5b, 0xfd, 0xdf, 0xff, 0xff, 0x6f, 0xf7, 0xff,
    0xf5, 0xdf, 0x56, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0x7f, 0xfd, 0xff, 0xbf, 0xff, 0xff, 0xfb, 0xff, 0xff,
+   0xbf, 0xbb, 0xff, 0x7f, 0xfd, 0xff, 0xbf, 0xff, 0xff, 0xfb, 0xff, 0xff,
    0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xee, 0xfe, 0xff, 0xff, 0xff, 0xef,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xef, 0xff,
index c3134b3c7a76a35227ebe3d374489fd49d01ffae..f2f687fdb7844e7b8d1482d459ccdc712b74103a 100644 (file)
 /* XPM */
-static char *matrix2_xpm[] = {
-/* width height ncolors chars_per_pixel */
-"320 377 12 1",
-/* colors */
-"  c #81DD81",
-". c #5AD25A",
-"X c #2BA02B",
-"o c #279027",
-"O c #217A21",
-"+ c #E0F7E0",
-"@ c #1B641B",
-"# c #165016",
-"$ c #0B2A0B",
-"% c #081E08",
-"& c #A7E7A7",
-"* c #000000",
-/* pixels */
-"***************************%%%%%%****************%**%************%%%$$###$$%%%*******%%%$###$%%************%*%%**************************************%*%*%*************%$#####$%********%$##@##$%***************%%%%%*************************************************************************************************%%$$#$$%**",
-"**************************%%$$#$$%%**********%%%%%%%%%%%*********%$##@@@O@@#$%%******%%#@@O@@#%%%*********%%$%$%%%**********************************%%%%%%************%%#@OoO@#$%******%$#@OOO@#%%************%%%$$$%%%***********************************************************************************************%$#@@@#$%*",
-"************************%*$$@@O@@$$%*******%%$$#$#$#$#$$%%*****%*%#oXX....oO@$%*****%%#@o. .o@#$%*******%%$$##@#$%********************************%%$###$$%**********%%#@o++.Xo#%%****%%#oX.++o@#%%***********%$#@@@#$%*********************************************************************************************%%%#O...@#$*",
-"************************%%$@OXoXO@$%%*****%%$#@@O@@@O@##$%%****%%$@X.... .XXO#%****%%#@oX & XoO#$%%****%%$#@OOO@#$%%***********%%$%%%%%**********%%$#@OO@#$%********%%$@oX++..X#%%****%%#o..++Xo@$%*********%%$#@Ooo@#$%%**********%*%%%*****************************************************************************%#@o   o@$*",
-"************************%$@X.+++.X@$%*****%%@Oo. XXX .oO@%%****%%#O. &&&++..X#$***%%#@o &+++ .XO@%%****%%#O.    O#$%*********%%$$###$$%%*********%$@O.  Xo#%%*******%$#Oo.++.XX#%%****%%#XX.++XXO#$%*******%%$#Oo+++oO#$%%*********%%$$$%%**************************************************************************%%@oX++&o@$*",
-"***********************%%#@X.+++.X@#%****%%#OXX& .X.&&XXO#%****%$@o &&&&++ .X@$**%%$@OX &+++& XXO$%***%%#@o  && o@$%%*******%%#@OOOOO##%%*******%%#@o & .o@$%******%%$@.. &&Xo@$%******%$@XX&+ ..@$%%*****%%$#OoX+++Xo@#$%%*******%$#@@@#$%************************************************************************%%$@X.+++XO#*",
-"***********************%%#o..+++..O#$****%%#oX.&&...&&.Xo#%***%%#@o &&&&++ ..O#**%$@OX.&&+++& .Xo#$***%$@OX &&&&XO@$%*****%%$#@OXXXXoO@$%*******%$#oX&&&.X@$%******%$#O. &&&XO@$%*****%%$#OX&&& .O#$%****%%$@@oX.+++.XoO#$%******%%#@ooo@#$%***********************************************************************%%#OX.+++X@#*",
-"***********************%$#O &+++& o@%%***%$@X. ++   ++..X#$***%$#oX&&&&&++ ..O#*%$#O &&+++++++..X#$**%%#XX.&&&& ..@$%*****%%#@o&&+++& O#%%******%$OX.+++..@$%%******$@o &&& X@#%********%#OX &&&&o@$%****%$#X....+++....X#$******%#@o+++o@$%***********************************************************************%$@o  &&&X@$*",
-"************************$@o &+++& o@$%**%%$@.. ++   ++ .X@$**%%#OoX&&&&&++  .o@*%$@o &&+++++++ .X@$**%$#X..&&&&& .O#$%****%$@OX&&+++&&o@$******%%#O..+++.X@$%******%$OX&&&& o@$%*******%%$#o &&&&o@#%****%#@.. . +++ . ..@$*****%%#OX+++XO#%%**********************************************************************%$@o &&& O@$*",
-"***********************%$@o &+++  o@$***%%$OX. ++ . ++..o#%*%%$#.  ++++++++&&XO*%#@o+++ &...& ..X#$*%%$#X. &&&& & o@$%***%%#o..++...  O#$%*****%$@o&&&  XO#%%*****%%#@X&&&& O#%%*********$#O &&&&XO#%***%%$@.  +++++++ ..@#******$#oX+++Xo#$%***************************%*%*%*%**%%*******************************%$#oX++..XO#%*",
-"***********************%%@o. +++&.o#$%***%#@.. ++. .++.Xo#%**%#@.. ++++++++&&Xo*%#@X&++ &...& .Xo#%**%$#X..&&&&&& oO#$%**%$#X..++...  O#$%*****%$#o&&  .o@$%%******%#OX+++.oO#%%*********%#@XX+++XO#%%**%%#@.. +++++++& .@#***%%%#@o.+++.o@#%%*************************%%%$%$%$$%%$%%%****************************%#@oX++..o@$%*",
-"***********************%$@o &+++  o@$***%%$@X..++...++.XO$%*%%#@. &++++++++&&XO*%$Oo+++ &...  .Xo#$**%$#o..&&&&&&&XO@$%**%$#X..++..X .O#$%%*****$#O &...@#$%******%$#oX+++.o@$%*********%%$@o.+++Xo#$****%$#.  +++++++ ..@$**%%$#@OX.+++.Xo@#$%**********************%%$$##@#@#@@@##$$%**************************%$#OX.++.XO#%%*",
-"************************%#o &+++& O@%%***%$#X........ oO#$%*%%#O.. ++++++++&&X@*%$@o&&&++&&& ..XO#$***%$@OX&&&&&& ..X$%**%$@o..++..XXoO@$$%*****%#@X.oO@#$%********%#oX+++Xo@$%**********%$@oX+++Xo#%%**%%$#OX.. +++  .XO#$**%#@OoXX.+++.XXoO@$**********************%$@@OoooooooooOO@$*************************%$#o.  &&X@#%%**",
-"***********************%$#O &+++& O#$****%%#oXX.XooX..O#$%***%$@. &++++++++&&o@*%$#O &&++&&& ..Xo@$**%%$#OX&&&&&&&..X#%**%$#XX.++...XXOO@$%****%%$#oo@#$%%%*******%$#oX+++Xo@%***********%%@oX+++Xo@%****%%#@XX  +++ .XXO#$*%$#OXX...+++...XXO@*********************%$@OXXXX.XX.XXXXoO@*************************%#@X&++ .o@$%***",
-"************************%#@X.+++.XO$%*****%%$#@@@@@@@##$$%**%%#Oo..++   ++..XO#**%#@oX.  +++++  .O#***%$#OX &+++&&XXO#%**%$#X..+++++....X@$******%$$#$$$%**********%@oX+++Xo#$***********%%@oX+++Xo#$%***%%#OX.++   ++.XX#%*%#OX+++++++++++++XO*********************%#OX+++++++++++++XO************************%%#OX+++..O#$%***",
-"************************%$@XX+++.o@#%%****%%$$$#$$$$#$$%****%$#OXX.++   ++.XXO#*%%$@oXX &+++++&& O@***%$#OX&&+++&&.XO@$*%%$@X..+++++.. ..@#******%%%%%%***********%%#oX+++Xo@%%**********%%@oX+++Xo#%*****$$oX.++   ++.Xo#%*%#oX+++++++++++++XO************%********%#oX+++++++++++++Xo************************%$@oX+++..@$%****",
-"************************%$#oX+++Xo@$********%%%%%%%%%%%%****%$#oX..++   ++..XO#**%$@OX.. +++++&& o@**%%$#OX &+++&&.Xo@$*%%#@X..+++++..  .O#*******%%%*%***********%%#oX+++Xo@$%**********%$@o.+++Xo#%*****%#OX.++...++.Xo#%*%#OX+++++++++++++XO********%%%%%%%******%$OX+++++++++++++XO********%%%%%%*********%%#@..+++Xo@$%%***",
-"************************%%#oX+++XO#%%***********%*%*%*******%$OX+++++++++++&&O#*%%#O.. . ...& +++X@**%%$X..  ++++&&& O#*%$#o.&&&&+++++&& o#***********************%%#oX+++.o@$%**********%$@oX+++Xo#$%***%%$OXX. XXX .XoO$%*%$@OXX...+++...XXO@*******%%$$##$%%%****%$@OXXX.X.X.X.XXXO#******%%%$###%%%*******%$@o&&&  o@$%*****",
-"*************************%#@X+++X@#%************************%#OX+++++++++++&&@#*%$#O. &. ...  +++oO**%%$oX.. +++++&& O@*%$@o &&&&+++++&& O#***********************%%#oX+++.oO$%**********%$@X.+++XO#%****%%$@oX..ooo..oO@$%**%$@OoXX.+++.XXoO@$*******%$#@@@@#%%****%%$@@ooooooooooOO#$******%$#@@@@#$%******%%#OX&&  .O@$%*****",
-"************************%%$@oXXXO@$%************************%$@X.  ++&&&&&.Xo@$*%$@o&+++++&+++&&&X@***%$#@OX.&&&..&& o#*%$@X+++  & &++...o@************************%#OX&&& .O#$%********%%#O. &+&XO#%*****%%$###@#@#@@##%%%**%%$#@oX.+++.Xo@#$%******%%#@...oo#%%****%%$####@#@@#@@##$%*****%%#oX...@#%*****%%$@oX&+ ..@$%******",
-"*************************%$#OXXXO#$%************************%$@O.  ++&&&&&XX@#$*%$Oo&++++&&&++&& o@**%*%$#@oX&&&..&& o@*%#@X&++&  & ++ ..O#***********************%%$@o&&+ .o@$%*******%%$@o. +&&X@#%%*****%%$$$$$$$$$$%%*%****%$#@o.+++XX@#$%*******%#@o   .o#$%******%%%$$$$$$$%%%%%******%$@o.   O@$%****%$#oX.++.oO#$%******",
-"*************************%%#OXXXO@%%*************************$#O.  ++&&&&&XO#$%*%$@o&++++&&&++&& O#***%%%$@OX&&&..&& o#*%#@o&++ &  &++...o@************************%$@o. &&&oO$%%******%%#@X&&   o@$%********%%%%%*%%%%*%*******%$#oX+++Xo@$%*******%$@OX&& .X@$%********%******%%%%*******%%#@X.&& o@$%****%$@o..++Xo@$%%******",
-"*************************%$#O+++O#$*************************%%#O.. ++&++  oO$%%*%$#o.  &&+++&&XXO#$*****%%$@o&++++&& O#*%$@o&&&++++++++++XO*************************$#O. &&&Xo#$%******%$#OX&&& .O#$**********%*%*****%*********%%#OX+++XO#%%*******%$OX.+++.X@$%***********%***************%$O. +++o@$%****%#O.  &&XO#$%*******",
-"*************************%%#O+++O#$%*************************%$@.. +++++  o@$%***%#@..  &+++&&XO@#%******%$@O&&&&&&  @#**$#O &&+++++&&+++oO*************************%#@.. &&Xo@$%%*****%$@oX&& ..@$%%****************************%$@o+++o@$%*******%$#O..+++ X@$%%*************************%%$@. +++o@$%%***%#O.&&& X@$%********",
-"**************************%#@OOO@$%%************************%%$@X. ++&&&& O@$%**%%%%#@OX.+++XX@#%%********%#@OoXoXoOO#$**%$#OoXXX.XXXXXXoO#***********************%*%%#OX.++..X#%*****%%#X..++XXO#$%*****************************%$#Oooo@#$%********$#o&&&  XO#$%***************************%$#@ooXo@#$*****%#O  && O@$%********",
-"**************************%%##@#$$%**************************%$@X. ++&&& .O#%******%%#@oX+++Xo#$%********%%%$#@@@@@##$%**%%$#@OoOooooooO@#$*************************%%$@OX++..X#%%****%%#X..++Xo@$%*******************************%$##@@#$%********%$@O&&  .o@$%*****************************%$#@O@@#$%%****$#O. ..X@#%*********",
-"***************************%%$$$%%***************************%%#oX.&&&&& .@#%%*******%$#O. .@#$%***********%$$$##$$$%%***%%%$$$###@######$%**************************%%#Oo++.Xo#%*****%%$oX.++o@#%%********************************%%$$$%%%********%%#o &...@#%%*****************************%%%$$#$%%******%$@...XO#$%*********",
-"****************************%%%%%****************************%%$#@OooXooO@#%%*********%$#@@@#$%**************%%%%%%%%%******%%%%$%$%$%$%%%****************************%$#@OOO@#$%%*****%$#@OoOO#$%**********************************%%%*%**********%%#OX.oO@#$%%*******************************%%%%%%%******%$#XXXOO$%%*********",
-"**************************************************************%%$##@@@@@##$%%**********%$$##$%%****************%*%************%*%*%*%*%********************************%$##@##$%%******%%$##@#$$%*************************************%************%%$#XXO@#%%**********************************%*%*********%%$#@##$$%**********",
-"******%%%$$%%%%*********%*%%%$%%%%**********%%%$%$$%$%%%*********%%%%$$$%%%*************%%%$%%%********%%%$$$$$$$%%%%************%%%%$$%%*****%%$%$$$$$$$$%%%*********%%%$%$%%%***********%%%$$%$%******************************************************************************************************************%*%*********",
-"*****%$$##@##$%%%*******%%$$####$%**********%%$###@@##$%%*******%%$#@#@@@#$%%**********%$$$##$%%%*****%%$###@@@@@##$%%*********%$$##@###$$%**%$$#@@@@@@@@##$$%******%%$$##@###%%%*******%%%$#####$%%%************************************************************************************************************%%%%%$%%%%*****",
-"**%%%$#@OOoOO@#$%%****%$$#@OOOO@#$%%******%%$#@OOoooOO@#$%%***%%$#@@OoooOO@#$%%******%%$#@O@O@#$%***%*%$#@Oooooooo@@$$******%%%$#@OOooO@@$%*%%#@OOooooooooO@#$****%%%##@OOoOO@@$$%******%$#@OOOOO@#$$%*********************************************************************************************************%%$######$$%%****",
-"**%%$@@X. & .XO@$%%**%%#@OoX.   O#%%*****%%$#@o..&&&..o@#$%***%$#@o..&&&..OO#$%******%$#OX....@#%****%$OoX & & &&..X@$%*****%%#@OoX &  .O@$*%#@.. &&& &&&...@#%***%$#@oX. & .XO@#$%****%$#@o   ..oO@#%%*******************************************************************************************************%%$@@OoooOO##%%***",
-"**$$@Oo..&&&..oO@$%*%%#@oXX..&  oO$%*****%$#OoX  &&&  XoO#$**%$#OoX  &&&  XoO#$*****%%#Oo... .O@$%**%$#OX.&&&&&&&  .@#%*****$$@oXX.&&&& X@$*%#O.  &&&&&&&  .O@$**%$#@oX..&&&..XoO#$**%%$#OoX&&&  XXo@#%****************************************************%%%%%%*************************%%%%%%*************%%#@OoXXXXXXO@#$%**",
-"*%$@X..+++++++..X@$*%%#O&+++++++XO#%****%%#@. &+++++++& .O#*%$$@. &+++++++& .O#*****%$@X.+++++X@#%%*%%@X..++++++&& .O#%***%%$@X.+++++&&&XO#*$@o&&+++++&++++&o@$*%$$O.  +++++++& .@#***%#@X++&&&++++&o@$**************************************************%%%$#$$$%%**********************%%$$#$$$%%**********%$@XX+++++++.XO#%%*",
-"*%#@...++++&++ ..@#*%$#o&+++++++Xo#$%***%%@O &&+++++++&& O@**%#O  &+++++++&& O@****%$#O..+++++XO#%**%$@X. +++++++&& O#%***%$#OX.++++++&&XO#*$@o&&+++++++++++oO$**$@O &&+++++++&& o@**%$@OX++++++++++oO$*********%%%%*****************%%%%%%***********%%%$$#@@@@##$*****%%%%%%%%%%%%****%$$@@@@@#$$%%*******%%#OX.+++++++.XX@$%*",
-"%$#O.  +++++++ ..O@**$#O&&++++++Xo#%*****$@o &&+++++++&& o@*%$#O &&+++++++&& o@****%$#O..+++++Xo#%%*%#@.. +++++++& .O#%**%%$Oo. +++++&&&o@$*%#O&&+++&&++++++XO$*%$@o &&+++++++&& o@*%%$@XX++++++++++XO@*******%$$$$$$%%*************%%$#$$$%**********%$$@@OooXoO#$****%%%$$$$$$$$$%$%**%$@OoXooO@#$$%%*****%$#oX.+++++++..XO#$*",
-"%$Oo&++  ...  ++&o@**%$@oXX..+++Xo@$****%%@O&&+  ...  +++XO**$#O.  ..... &++&o@****%#@X&+&&&++Xo#$**%#@.. ++......Xo@#%**%$#OX++&&&...XoO#$*%$@OoXXXX..&&&&&o@$*%$OX&++  ... &+++X@*%$#X..++.....+++.o@*****%%$#@@O@#$%************%$##@@@#$%*******%$$#@Oo  +++.X@**%%$##@@@@@@@@@##$%*$#@+++&&Xoo@#$%%****%$#X..++...&&++&o@$*",
-"%$OX+++  XXX  +++XO*%%$$@oXX.+++XO@%%***%$#O&&&..XX.  +++XO*%%$#. ..XX.. &+++XO***%$#OX&+&&&++Xo#%%*%$@.. ++ .....XX@#%*%%$@XX++&& ...Xo@$%*%$$@@OOooX.&&&&&o@$*%$@o+++& ...  ++&X@*%$@X. ++.X.X.+++XX@*****%%#@oooo@#$%**********%$#@OXoo@#$%****%%$#@OXXX  +++.X#**%$#OOooooXooooOO#$*%#O+++&&.XXoO@$$%***%$@X. ++...&&++&XO$*",
-"$#OX+++ .XXX..+++XO***%%##oX.+++.O@%%****%$@OoooooXX&&+++X@**%$#@OOoXXX.++&&&o@**%%$OX.++ . ++Xo#$**%#@X. +++++++& .O#$*%$#X..++&&&&&.Xo@$%**%%$$##@OXX++ ..O#$*%#@X&&&&&...&&&&&oO*%$@.. ++.X.X.+++.X@*****%$@..+++o@$%**********%$@..+++o@$%***%%$#OX.&++++...oO#**$#@  &&&&&&& &  O#*%$@oX.&&+++ .O@#$$**%%#XX.  .X.. +++X@#*",
-"%#OX+++ .XoX..+++XO****%%#@XX+++Xo#$*****%$$#@@@OoX.&&++&X@***%%##OOoX..++&&&oO**%$#oX.++   ++Xo@%%*%#@.. +++++++  .O@%*%$@X. ++&&&& ..X@#%***%%%%$#@oX++ ..@#%*%$@o&&&&&...&&&&&o@*%$@.. +&.X.X.+++.X@****%%#@. +++X@#%*********%%#@. +++X@#%**%%#@Oo..+++++..XO#$*%$@o &&&&&&&&&&& O@*%$#@oX&&+++  XoO@#$*%%#OX....X.. +++XO#*",
-"%#OX+++ .ooo..+++XO*****%$#o.+++Xo@%%*****%%$##@OoXX&&++&o@***%%$$@OXX..++&&&o@**%#@X..++. .++Xo@$%*%$#X..+++++++&  o@$*%#@.. ++&&&&&...O@$*****%%%$@o.++ .X@$%*%$@o &&&&...&&&&&o@*%$@X. ++..X..+++.X@****%%$O. +++X@#%*********%%#@. +++X@#%**$$@OXX. +++++.XX#$%*%$@o&&&&&&&&&&&&&o@**%$#@o &+++& .XXO@$*%%$OoX..XX.. +++oO$*",
-"%#oX+++..oOo..+++XO******$#oX+++Xo#$*******%%$#@O.. ++...O#****%%$@..+++++ ..o@*%$@O  &&& . ++.X@$%*%$#oX.&&...&&+++XO#*%$@.. ++++++++++X@#******%$#OX.++XX@#%%*%$@o.. +++++++...o@*%$@X..++...&&+++.XO*****%#@X.&&&oO$%%*********%#@..&&&X@$$**$@O&&&++&& .XoO#$%%*$#oX&&++++++++++&XO***%$#@oX...+++++.X@**%%$#@oX.. ++&&&o@$*",
-"%#OX+++..oOo..+++Xo******$#oX+++Xo@%%*******%$#OX.  ++..o@$****%%$#X.+++++...o@*%$@o &&&&. .++.XO@$**%$OoX&&...&&+++Xo#*%#@.. ++++++++++XO#******%$@oX.++Xo@$%**%$@o...+++++++ ..o@*%$#X..++... &+++.X@****%%$@X.&& O@$***********%$#X. & O@$***$@o&&+++&  XoO#$$***$#oX&&+++++++++&&Xo****%$#@oX..+++++..@**%%%$@OX.  ++&& O#$*",
-"%#oX+++..ooo. +++XO*****%$#oX+++Xo#$********%#@X.+++ .Xo@$$****%%#@Oo...&&++&oO*%#OX+++++&&&++ ..@$*%%$#@OOoooX..+++.X@*%$@.. ++ ....+++.X@******%$@.  &&XO#$%**%$@o&++&&. .&&++&oO*%%#@XX&&++++++++.X@******%##OOOO@$%%**********%%$@@oOO@$%%**#oX+++++   Xo@#%%%**%#oX&&&&&&&&&&&&&XO****%%$@OX..+++++ .O****%$#OX+++  XXO@$%*",
-"%#OX+++..ooo. +++Xo******$@oX+++Xo@$******%%$@O..+++ .oO#%%***%%$#@@oX..&&+++XO*%#OX+++++&&&++& .O#*%%$#@OOO@OoX.+++.X#*%#@.. ++.....+++.o@*****%%#O.  +&XO#%%**%#OX+++&&...&&+++XO**%$#OX&+++++++++.X@*****%%%$#@@#$$%************%%##@###$*%**#OX+++++   Xo@#$%***%#oX&&&&&&&&&&&&&X@****%%#@oXX.&++++ .O*****$#OX+++ .XO##%%*",
-"%#oX&++ .XoX..+++XO*****%$@XX+++.o@$%*****%$#OX. +++ .O@$%%**%%##@@@OoX.&&+++XO*$#oX+++++&&&++& .O#*%%##@@@@@@oX.+++.X@*%$@.. ++.....+++.X@*****%$#o. &&&X@$%***%$OX+++&&...&&+++XO***%#Oo&&++++++++.X@******%%$#$#$$%*************%%%$##$%%%***$OX&++++& ..Xo@#$%%*$#oX&&&&&&&&&&&&&XO***%$$@OXX..+++++..@****%%#OX+++..O@$%%**",
-"%#OX+++ .XoX..+++XO****%%#@o.+++XX@#%%**%%%#oX.++&& .oO#$%%*%%$@X..oooXX  +++XO*%#oX+&++++++++&& o#*%$#X..ooOOoX.+++.X@*%#@X. ++..XX.+++.X@*****%$@o&&&& o@$%%**$#OX+++  ...  +++XO**%%%@OX...   +++Xo#*******%$$###$%%************%%$$###$%****%#@oX.  ++++&XoO#$%*%#oX&&+++++++++&&XO*%%%#@O..+++&&.XXo@#*****%#OX&&&Xo@#%%***",
-"%#@X+++ ..XX..+++X@***%%$@OX.+++.Xo@$$%**%#@X..++&& .Xo@#$%*%$#O...XoXX.  +++XO*%#oX&&++++++++&& o@*%#@...XXoXX..+++.X@*%$@.. ++.....+++XX@****%%#@X&&&& o@$%***%$OX+++  ...  +++XO***%$#OXX. .. +++XO#******%$#@O@@#$%***********%%$#@@@@#$%***%$#@OX..+++++..o@#$*%#OX&&++&++&&&&&&XO**$#@oX  +++&&XXo@#$****%%#@X&&&XO#$%****",
-"%$@o&++  ...  ++&o@**%%#@OXX.+++.XXO@$%*%$#OX..++&& .XXO#$$*%$@o.. .XX.X  ++&X@*%$Oo&&&+++++++&& o#*%#O.. ..XX...+++.o@*%%#X..++.....+++.X#*****%#@X&&&& O#%%***%#@X&++  .X.  +++o@**%%$@OX...  .+++XO#*****%%#@Oooo@#%%**********%$#OoXoO@#$***%%$#@O..+++++..Xo@#*%$@o&&&&&&&&&&&& o@*%$@oX. &+++& oO##%%*****%$@X&&&XO#%%****",
-"%%@O.. ++&&&++  .O@*%%$@X..&&+++&& ..@$*%#@X+++++&&&&&..X@$*%#OX+++&&&&&++&&&o@*%%#@oXX. &&&++&  o@*$#@  &++& &++++&XO#*%%#@XX+++++&&+++XX#*****%#OX+++XX@#%****%$@o &&++&&&++&&&o@**%$@OX &&&&++&&&o@$****%%$#..+++o@$%*********%$#O..+++o#$%****%%$#@oXXX&&+++.X#*%%#@OoooXoXXoXooO@#*$#@&++++...Xo@#$%%*****%%$@o & o@$%*****",
-"%%$@X..++&&&++..X@$*%%#@..&&&+++&& ..@#*%#OX+++++&&&&&  .@#*%#OX+++++&&&++&& O#*%%$#@oX..&&&++&  O@*%#@.&&++&&&++++&o@$**%$#OX++++++++++Xo#*****%#OX+++Xo@%%****%%#O &&++&&&++&& O#**%$OoX&&&&&++&& O@$*****%#@..+++o@$%*********%$@o. +++o@$%******%$#@OoX  +++.X#*%%%$#@O@O@O@OO@@##%*%#O&++&&.XoO@#$%%*******%$@o & o@$%*****",
-"*%$#@oX. &+&& XoO#$*%%#O. &+++++++& .O#*%#OX&+++++++++& .O#*%$@O...+++++&&XXO@#***%%$@O..&++++&& O@*%$#OX.&&+++&&.Xo@#$***%$@O..&&&++ ..o@$****%%$@o&&&XO#%%****%%$@OX.&&+++&&XXO@$*%%#oX.&&++&  XXO@$%****%%#@..&&&XO#%%*******%%#@X++ &.o@$%********%$#@@ooXXoO@#***%%$$$#$###$#$$$%%*%#@XXXXoOO@#$%%*********%$@o & o@$%*****",
-"**%$#@o..&&& .oO#$%*%%#O.&&&++++&&&  @#*%#OX&&++&+++&&&  O#**%#@X..&&&&&&&Xo@$%****%%#@..&&&&&&  O#*%%#@OX &&&&&&XoO#$%***%%#@XX&&&&&..XO#$*****%$@o   o@$%%*****%%$@OX &&&&&&Xo@#%*%%$OX.&&&&&..oO##%%*****%$@X.&&&o@$%********%%#OX++  .O#$%********%%%$##@@O@@$$***%*%%%%%%%%%%%%%***%$#OooO@##$%%%**********%%#O   O#$%*****",
-"***%$#@X.&&&..@#$%***%$@.. &&&&&&& ..@$*%$Oo&&&&&&&&&& ..@$*%%$@oX.&&&&&  O@#$%****%%$#XX&&&&& ..@$**%%$@O  &&&& o@#$%*****%$#OX  && .Xo#$%*****%%#@.  @#$%*******%%#@O  &&&  O@#%%*%%$OoX&&&&&.XO#$%%*****%%$#X.&& O#$%********%$@oX++ ..@$%***********%%%$$#$$$%**********%**%*%*******%$##@##$%%%*************$#@...@#%******",
-"****%$#@OOooO@#$%***%%$#@OooXoXoXooO@#$*%%#@OooXXoXXoXoO@#$**%%$#@OoXoXooO#$%%*******%#@OooooooO@#$***%%##OooXooO@#%%%******%$#@OooooO@#$%%*****%%$#@@@#$%********%%%#@OoooooO@$%%%**%$$@OoooooO@#$%%*******%%##@OO@@$%*********%$oX. &XoO#$%************%%%%%%%%%************************%%$$%%%%***************%$#@@@#$%******",
-"*****%%$##@@##%%%*****%%##@@@O@O@@@@$$%**%%##@@@OO@O@@@##%%***%%$$##@O@@@##%%******%*%%$#@@@O@@##%%****%%$##@@@##$%%*********%$$##@@##$$%%*******%%$###$%%**********%%$#@@O@##$%%*****%%$$@@@@@#$%%%*********%%$#@##$%%********%%$OXX .o@#$%*****************%*%**************************%%*%%******************%%$$#$$%%******",
-"******%%$$$%$%%*******%%%$$#$#$#$$$%%%%**%%%$$#$#$#$#$$%%%%*****%%$$$$$$$%%%***********%%$$$#$$%$%*****%%%$$$#$$$%%%**********%%$$$$$$%***********%%%%%%**************%%$$$$$$%%*******%%$$$$$$%$%***********%%%%$%$%%**********%%$@@@@@#%%%***********************************************************************%%%%%********",
-"*************************%*%*%*%***********%*%%%%*%*%****************%%%%*%*******%%%*%%%*%************%*%%%*%%%%*%*********%%*%%%*%%%*%************%%%%*%*********%*%%*%****%*%%*%******%*%%*%%%%*%**********%*%%%*%%%*%******%*%%%***%*%%**%******%%%*%*%************%***********%%*%*****%********%%************%**%*********",
-"******%%%%%%%***********%%%%$%$%%%********%%%$%$$$$$%%%***********%%$%%%$%%%%%**%%%%%$%$$$$$%%********%%$%$$$$$$$$%%%%***%%%%$$$$$$$$$$%$%********%%%$%$$%$%%%%**%%%%$%$%%%%%$%$%%%*****%%$%$$$%$%$%%*********%$%$$$$$%$%%****%%$%$%$%%%$%%$%%****%%%%$$$$%%%*********%%$%$%**%**%%%%%%***%%%%%%%*%%%%%$%%%*******%%%%$%%%******",
-"*****%%$####$$%%******%%$$##@###$%******%%$$#@@#@@###$%%%*******%%$$#@@####$$%%*%$##@@@@#@##$$%%****%%%$#@#@@@@@@#@$$%***%$$##@@#@@@#@###$%*****%%$$#######$$%%**%$###@###$###@###$**%%%$##@#@@@@###$$*****%%%$##@#@#@###$%*%%$###@###$######$%*%%$##@#@####%%******%%$$###$%%%%$$####$*%%$$###$%%$$#####$%*****%%$$####$$%*****",
-"**%%%$#@@OO@@#$%*****%%$#@OOOoO@#$%*****%$#@OOoooooOO@#$%%****%%%$#@OOoooOO@@#$*$#@OOoooooOO@#$%%***%$#@OoooooooooO@#$%*%$#@OooooooooooO@#$***%%$$#@OooooOO@@#$*%$#@OoOOO@@@@OOoO@#**%%##@OOooooooO@#$$****%%#@@OooooooO@#$*%$#@OOOOO@@@OOOO@#$*%%#@Oooooo@@#$%*****%$#@@OO##$%$##@OO@#*%$#@@O@@#$##@OOO@#$***%%%$#@OOOO@##%%***",
-"**%%$#OOXXXoo@#$%****%%#oX.    .O#$%****%#@.     &  .XO@$%%***%$#@XX     ..XXX#*#XX    &   ..O@#$%%*%#@.     &     .O#$*%#@.   & & & &  .X#***%$#@XX     ..XXX#*$#XX     XXX     XX**%$#X..    &  ..X@$****%$#X.  & &   XX#*%#XX     XXX   ..@#*%#@.       oO#%%****$#XX  .oO###Oo . XX*%#@.. .X@@@X.. .XX#***%$#@XX   ..O@#$%**",
-"**%$OoX&&+++ .@#%%***%$@X..&&& &oO#$%***$@O  &&&&&&& .Xo@$%*%%$@@oX. &&&&. ..X@*@X. &&&&&&& .Xo@#$%*$@O  &&&&&&&&&  o@$*$@O  &&&&&&&&&& ..@*%%$#@oX. &&&&. ..X@*$@X. &&  X.X  && .X*%%$O.. &&&&&&& ..@$***%%#O..&&&&&&&&.X@*$@X.&&&& .X. &&  O#*$#O. &&&&& .o#$%****$@..  &Xo@@@oX  &.X*$@o   ..oOO.. &&.X@**$$#OoX. &  .oo@#$%*",
-"*%$#oX.&++++ .o@$%%**%$@...&&&&&Xo@$%***$@o &&&&&&&&&..XO#$*%$@OoX. &&&&&   ..O*@..&&&&&&&&& .XXO#$*$@o &&&&&&&&&&&&XO#*$@o &&&&&&&&&&&&..O*%$@OoX. &&&&&   ..O*#@..&&&&&...&&&&&..*%%#@..&&&&&&&&& .@#***%%#O. &&&&&&&&..@*#@..&&&&&...&&&& o@*$@o &&&&&& .X#$%****#@..&&&.XoOoX.&&&..*#@X &&..XXX..&&&..O*%$@OoX. &&&& .XXO#$*",
-"%%#@X..&++++& XO#%%*%%#@. &+++++ .O#%%**#OX+++++++++++++X@#*$#O  &++++++++++&&o*O. +++++++++++++oO#*#OX+++++++++++++.o@*$OX+++++++++++++&&o*$#O  &++++++++++&&o*$O. +++++...+++++ .*%%#@. &+&++++&& .O#***%%#O &&+++++++..@*#O. +++++. .++++&XO*$@o&&+++++&.X@$%****#O. +++&&XXX &+++ .*#oX+++++.XX&&+++ .O*%#O  &++++&+++++oO#*",
-"*$#O. &&&   ++.oO$%**%$@. &+++++&.o@$%**$OX&++++++++++++XO#*$@o &&++&&&&&+++&&o*@. +++++&&++++++Xo@*$OX&++++++++++++.X@*$OX&+++++++++++++&o*$@o &&+++&&&++++&&o*#@. +++++...+++++ .*%%$@.. &+++++&  .#$***%%$@. &&++++++ .@*$@. +++++. .++++&o@*$@o&&&+++&&.X#%%****#O. +++&&X.X&&+++ .*#o.+++++...&&+++ .O*$@o &&+++&&+++++Xo@*",
-"%$@o &&&&   ++.Xo#%*%%$@OX.+++++&&X@$%**$@o.  ++.....+++.X@*#OX+++  .X.X.&&&&&o*@o.+++  ..X..+++ .O*$#o.  ++.....+++XX@*$@o.  ++.....&&&&&X*#OX+++  .X.X.&&&&&o*$@oX+++ ....  +++.o**%$#@oXX.+++..Xo@#$****%$#@oXX.++  .oO#*$@XX+++  +++++.Xo@#*%#@oX.++..XO@$$*****#O..+++++...+++++..*#oX+++++.  ..+++.XO*#OX+++  ..X..+++ .O*",
-"$$OX+++   & ++ ..@#***%#Oo.&++++&&XO#%%*%#O.  ++.....+++.X@*#OX+++ .XXoXX &&&&o*#oX+++ .XXXX.+++ .O*$#O.  ++.....+++.o@*%#O.. ++.....   &&O*#OX+++ .XXXXX&&&&&o*$@oX+++  .X.  +++Xo***%$#@oX.+++.XO@#$%****%%$#OoX.++  .o@$*$@oX+++  +++++XXO#$*%$@OX.++..XO#%%*****#@X.+++++...+++++.X*#oX+++++   ..+++.XO*#OX+++ .XXXX.+++ .O*",
-"%#OX+++&&+++++ ..@$**%%#@XX&&++++&Xo@$%*$#O.. ++.....+++.X@*@oX+++ .oO@Oo.  & O*#oX&++ .XooXX+++& o*$#@.. ++.....+++Xo#*$#O.  ++.X...&  & O*@oX+++ .oOOoX  &&&O*%#XX+++  ...  +++Xo****%$#Oo.+++XXO#%%%*****%%$#@XX++ ..o#$*%#oX+++  +++++XO@$%**%$@XX++.Xo#$%%*****#OX.+++++...+++++.X*#oX+++++& &..+++.X@*@oX+++ .oOoXX+++& o*",
-"%#OX+++&&+++++ ..O#**%%#OX.++   ++.XO$%*%#@.. ++&&&+++++.XO*@X.+++.XO@###@OoOO#*#oX+++ .oO@oX&&&&&o*%#O.. ++.. ++..Xo@$*%#@.. ++...++.XXo@@*@X.+++.XoO@OoX.XXX@*%#OX+++&&&&&+++++Xo*****%$@oX+++XX@$%*******%%%$@oX++ ..O#%*$#oX++++++++.XX@$%%**%$@oX++.Xo#$*%*****$OX.+++++ . +++++.X*#OX+++&&+++..+++.X@*@X.+++.XO@@OX&&&&&o*",
-"%#oX++++++++++ ..@#**%$#XX.++   ++.Xo#%*%#@.. ++&&&+++++.XO*@X.+++.X@#%$$###@#$*#oX+++..O@@OX &&&&o*%#@.. ++. .++..X@#$*%#@.. ++...++XXo@#$*@X.+++.XO@OoXX..Xo@*%@oX+++&&&&&+&+++XO*****%$@oX+++Xo#$%*****%%%%%$#oX++ ..@#%*%#oX++++++++.XO@$%***%%#oX++.XO#$%******$OX.+++++ . +++++.X*#oX+++&&+++..+++.X@*@X.+++Xo@##OX &&&&o*",
-"%#OX++++++++++ ..O#**%$@X. ++...++ ..@$*%#@.. ++++++++++..O*@X.+++Xo@$%%%$$$$$%*#OX+++..O@#@o  &&&X*%#@.. +++++++.XO@$%*%#@.. +++++++XX@#$%*@X.+++XXO@O.    ..@*%#OX+++++&+++++++Xo******%@oX+++Xo@%%***%%%%$$%$#oX++ ..@#%*%#OX++++++++..o#$%***%%@oX++.XO#$%$%%***$@X.+++&&+++&&+++.X*#oX+++  +++  +++.X@*@X.+++XX@##@o  &&&X*",
-"%#oX++++++++++ ..O#*%$#O.. ++...++ ..O#*%#@.. ++++++++++ .o*@X.+++Xo@$%%%%%%%%%*#oX+++..O##@o  &&&X*%#@.. +++++++.XO@$%*%#@.. +++++++XO@$%%*@X.+++.XOOo &&& ..O*%#oX+++++++++++++Xo*****%$#oX+++Xo#$****%$##@###@oX++ ..@#%*%#oX++++++++..o@$%%**%%#oX++.Xo#$#$$$%%*$OX.+++&&+++&&+++.X*#oX+++  +++  +++.X@*@X.+++Xo@$#@o  &&&o*",
-"%#OX+++&&+++++&& o@*%$@o.  ++...++  .o@*%#O.. ++++++++++ .o*@X.+++.o@$%%%$$$$%%*#OX+++..O@#@o. &&&X*%#@.. +++++++.XoO##*%#@.. +++++++Xo#%%**@X.+++XXooX &&&&..O*%#oX+++++++&+++++Xo******$@oX+++Xo@%%***%#@OoOO@@oX++ ..@#%*%#oX++++++++ .XO#$%**%%#oX++.Xo@@@@##$%*$@X.+++&&+++&&+++.X*#OX+++  +++  +++.X@*@X.+++.o@##@X  &&&X*",
-"%#OX+++&&+++++&& O#*%#OX&++++++++++&&o@*%$@.. ++.....&&&&&o*@X.+++.XO#$$$##@@#$*#oX+++..O@@Oo  &&&o*%#@.. ++   ++...XX#*%#@.  ++   ++XO#%***@X.+++..ooX+++++& o*%#oX+++  ...  +++XO*****%%@o.+++Xo@$%***#OX&&&oOOXX++...@#%*%#oX+++& &&&++.XO#$***$@oX++.XXOO...@#$*#@X.+++..+++..+++.X*#oX+++  &&&+++++.X@*@X.+++.XO@@OX&&&&&o*",
-"$#OX+++  &&&++&& o@*%#OX++++++++++++&Xo*%#O.. ++..X..&&&&&o*#X.+++.Xo@#@@OoOO@#*#oX+++..oOOoX & &&o*%#O.. ++   ++ ....O*%#O.. ++   ++o@$%***#X.+++.XXXX+++++&&o*%#oX+++  .X.. +++Xo*****%$@oX+++.o@$%***#oX++&XooX.++ ..@$%*%#oX+++  &&&++..o@$*%%$@oX++..XXo...O@$*$OX.+++..&&&..+++.X*#OX+++& &&&+++++.XO*#X.+++.XoOOoX&&&&&o*",
-"%#OX+++ &&&&++&& O#*$@X.+++&     &+++.X*$#O.  +&...X.&&&&&X*#OX+++& XoOOo     @*@oX+++ .XooX.+++..O*%#O.  ++... .&& & o*$#O.. ++....XO@$%***#OX&++& .XX..&&&&&X*$@O.+++ ..X.  +++Xo***%$$#OX.+++.XO#$$%*@X.+++..XX.++ .X@#%*%@oX+++& ...++&  o@**%#OX.++...X.+++.o#*$OX.+++..X.X..+++.X*#oX+++  ...+++++.X@*#OX+++& XoXX.+++..o*",
-"%$@o&&&&&...& ..X@#*$@X.+++   .   +++.X*$#o.. ++..X..&&&&&o*#OX+++&&XXXXX&&&& O*@o.+++  .XX..+++..@*$#o.. ++.... &&&&&o*$#o.  ++....XO#%%***#OX&++&&.....&&&&&o*$@oX+++ ..X.. +++.o***%$@OoX.+++.XXO#$%*@o.+++.....++...#$%*$@o.+++  ...++&& oO*%$@OX.++.....+++.o@*#OX.+++..XXX..+++..*#oX+++  ...+++++.XO*#OX+++&&.XX..+++.XO*",
-"%$#o &&&&...  ..X@$*#OX.+++&  .  &+++..*$@o.  +&.....&&&&&o*#@o&++&&.....&&&& O*@o.+++ ......+++.X@*#@o.  ++.....&&&+&X*$@o.  ++..X.o@#%****$@X&++& .....&&&&&o*$Oo.+++ ..X.  +++XX**%$#@XX..+++..XoO#$*#o.+++.....++..X#$%*#@o.+++  X..++&&&Xo*$#OXX.++.....+++.X#*#oX.+++.XXXXX.+++.X*#oX+++ ....+++++.X@*#@o&++& .....+++.X@*",
-"%%#OX. +++++++.XX#$*#O &+++++   +++++& *#oX+++++++++++++.XO*%#O...+++++++++&.X@*O  +++++++++++&&Xo#*#OX+++++++++++++&&o*#OX++++++++..#$%****$#OX. ++++++++++.X@*#O  +++++...+++++& *%%$@  &+++++++&& @$*#Oo&&++++++++Xo@#%%*#O &+++++..X. +++& *$Oo+++++++++++++XX#*#O &+++&&XoX &+++& *#o.+++++XX.&&+++.X@*%#O...+++++++&& XO#*",
-"%%$@X..+++++++.Xo#%*#O &+++++...+++++& *$oX+++++++++++++Xo@*%##XX.++++++++&&Xo@*@.&++++++++++&&&O@$*#oX+++++++++++++&&O*$OX++++++++..@$%%***%$@XX.++++++++&&Xo@*#@ &+++++...+++++& **%#@ &&+++++++&& @#*$@o&&&++++++&oO#%%**#@.&+++++.XX..+++  *$@X+++++++++++++Xo#*#O &+++& ooo&&+++& *#OX+++++XXX &+++Xo#*%##XX.+++++++& .O@$*",
-"*%$#oX.&++++++.XO$%*$@oX.....XXX.....XX*$@OX...........Xo@#**%##OoXX.....XXoO#$*@Oo..........XXO@#%*$@OX............XX@*$#OX......Xo@#%%****%%##OoXX.....XXoO@$*$@oX.....oXX.....Xo*%%$#oX.........Xo#$*%#@OXX.....XoO#$%***$@oX....XooOoXX.XXo*$#OX............O@$*$@oX...XXOOOXX..XXX*$@oX...XXOooX..Xo@#*%%$@OoXX....XXoO@$%*",
-"**%$#@OoX...XXO@#$%*$#OoXXXXXOOOXXXXXoO*%#@XXXXXXXXXXXoo@#%*%%%$#@OOXXXXXoO@#$%*$@OXXXXX.XXXoo@@#$%*%#OoXX.X.X.XXXXXoO#*%#@oXXX.XXXO#$%******%%$#@OoXXXXXoO@#$%*$#OoXXXXXOOOoXXXXoO**%$#@ooXX.X..XXoO#$*%%##OoXX.X.OO#$%%***$#OoXXXXX@##@OoXXoO*%#@oXXX.X.XX.XXo@#%*$#OoXXXoo##@OoXXXoO*%#OoXXXX@@@@OoXX@#%**%%$#@OOXXXXXO@#$%%*",
-"***%$#@OOoXoOO#$$%**%$@@OoOOO###OOoOO@@*%$$OOooXoOoOOO@@$%%***%%%$#@OOoOO##$$%%*%$#OooXooooOO##$%*%**%#OOooooooooOOO@@$*%$#OOooooO@#$%%******%%%%$##OooOO@##$%%*%$#OOoOOO###OoooO@#***%$#@OoooooooO@#%%**%%$##oooXo##$%%****%$#OOooO@#$$$#@@@@#*%%#OOoooooooooOO#$%*%$@@OoO@@$$$@@OO@@#*%$#OOoO@#$$##O@@#$%**%*%%$#@OOOO@##$%%**",
-"****%%$###@###$%%****%$$####$$$$$####$%**%%$######$##$$$%%******%%%$$###$$$%%%**%%$$#######$$%%%%***%%%$$#########$$$%%***%$######$%%%**********%%%$$#$#$$%%%***%%%$####$$$$$$$##$$****%%$#$###@##$$$%****%%%$$####$$%******%%%$#$##$$%%%%$$$$%**%%$###########$%%**%%$$#$#$$$%%%$$$$$%**%%$$$$$$%%%$$$$%%%*****%%%$$$#$$%%%****",
-"******%%$$$$%%%%******%%%%%%%%%%%%%%%%%***%%%%%%%%%%%%%%*%********%%%%%%%%%*******%%%%$%%%%%%%%*******%%%%%$%$%%%%$%%*****%%%%%%%%%%*************%*%%%%%%%%******%%%%%%%%%%%%%%%%%%****%*%%%%$%$$%%%%******%%%%%%%%%%********%%%%%%%%%**%*%%%%****%%%%$%$$%$%%%%%*****%%%%%%%*%%%%%%%%%***%%%$%%%*%*%%%%**********%%%%%%%%******",
-"****%***%*%**********************************%**%***%*****************%**************%**%*%*%************%*********%***************************%**********%**********%*%********%*********%**********************%*%*%***********%%%%%$%%********%%%%$%%******************%%%%%%%%**************%%%%%***************************",
-"**%%%%%$%$%%%%%%**********%%$%%%%%%*******%%%%%$%$%%%%***********%%%%$%$%$%%%******%%%%$%%$%%$%%%%****%%%%%%%*%%%%%%%%****%%%%%%%*%*%%%%%%%****%%$%%%%%*%%%%%%%***%%%%%%%%%%%$%%%%%***%%%%%%%%%%%$%$%%%*****%%%$%%$%%$%%%%*******%%#####$$%*****%%$####$%%**************%%%$#@###%%***********%%$$$$%%%*************************",
-"%%$$#####@####$$%******%%%$$####$$%%****%%$$########$$$%*******%%$$########$%%%**%%%$###@##@##@#$$%**%$$###$$$$$####$$%*%%$$###$$$%$$####$%*%%$$###$$%%$$$###$%*%%$$#####$$#$####$$*%%$$#####$$#$####$$***%%$$#####@####$$%****%%$#@OOOO##$*****%$#@OO@@$%%*************%$#@@OOO@#$%*********%%$#@@@#$%*************************",
-"%$#@OOooOoOoO@@#$%%***%%$#@OOOoOO@#$%%**%$#@OOoooooOO@#$%%****%%$#@OOOooOOO@#$%*%%$#@OoOooOooOOO@#$*%$#@OOO@@@#@@OOO@#$*%$#@OOO@@###@@OO@O#*%$#@@OO@@###@@OO@O#*%$#@OOOOO@@@OOOOO@#*%$#@OOOOO@@@OOOOO@#**%%$#@OOooOooOoO@#$****%%#@...  o@#%%***%$O &&Xo@$%************%%#@o. ...O#%%********%$#@...O#$%************************",
-"$#OoXXXXX.XXXXoO@$%*%%%$#OOXXXXXXoO@$$%*$@OoXXXXXXXXoo@#$%%*%*%#@OoXXXXXXXXoO#$*%$@OoXXXXX.XX.XXoO#*$@OoXXXXoOooXXXXoO@*$@OoXXXXOO@@ooXXXoO*$@OoXXXXoOOOoXXXXoO*$@OoXXXXXoooXXXXXoO*$@OoXXXXXoooXXXXXoO**%#@OoXXXXXXX.XXoO#****%$@o.    Xo@$****$#O &&.XO#$************%$OoX &  .o@$%*******%%#Oo...o@#$************************",
-"$OX++++++++++&& O@$**%#@oX&&+++++..X@$%*#@ &++++++++&&XoO$%**$$@oX++++++++++XO#*%#OX+++++++++++++Xo*$OX+++++.XX&&+++& O*#@ &+++&&ooo&&+++  *#@ &+++&&Xoo&&+++  *#@ &+++++...+++++& *#@ &+++++...+++++& *%%#O&&&++++++++++XO***%%#OX++++&.o@$%%**%#O.  &&o@$%**********%%$oX.+++++X@#%******%%$@X.+++.X@$%***********************",
-"#oX++++++++++&&&oO#*%$@oX.&&+++++ ..O@$*@O &++++++++&&.Xo@$*%$@oX.++++++++++Xo#*%#oX+++++++++++++.o*#oX+++++...&&+++& O*#O &+++&&XXX&&+++& *#o &+++&&X.X&&+++& *#O &+++++...+++++& *#O &+++++...+++++& *%$@o&&+++++++++++.o***%%#OX++++&XX@$%***%#O.  &&X@#$**********%%$oX.+++++XO#%%*****%%#O..+++.XO#%%**********************",
-"#oX++++++++++&&&.o@*$#OX..&++++++  .oO#*#O &+++++++++&..XO#*%#@X..++++++++++.X@*$@X.+++++++++++++XX*@o.+++++...&++++&&O*@O&&+++&&XXX&&+++&&*#O &++++&...+++++& *@O &+++++ . +++++& *@O &+++++ . +++++&&*%#@o&&+++++++++++.o***%%@oX+++++Xo@$%%**%$@.. &&Xo@$%%*********%$OX.+++++Xo@%******%$@O..+++..o#$%**********************",
-"$OX &&++     +++& O*$@o&&+&&     +++.o@*#OX.+++&&   &&+&&o@*$@o&&&++     +++.o@*$@X.+++  +++  +++.X*#oX+++& XXX..+++..O*#O..+++..ooX..+++..*#o..+++ .& &. +++..*#OX.+++&&...&&+++.X*#OX.+++&&...&&+++.X*%#OX&++&&   &&+++XX***%%#o.+++.XX@$%****%$#OXX++.XO#$*********%%%#@oX.+++Xo#$*****%%$@o&&+++&&o@$%%*********************",
-"$@o.  ++ ....+++&&o*#OX+++&&...  +++.XO*#@X.+++&& . &&++&X@*$@o&&+++     +++.X#*$@X.+++  +++  +++.X*#oX+++  XoXX.+++..O*#OX.+++..ooXX.+++.X*#O..+++ .&&& .+++..*$@X.+++&&...&&+++.X*$@X.+++&&...&&+++.X*%$@o&++&&   &&+++Xo****$#oX+++.XO#$%%****%$@oX++..X@$%%*********%$#OX.+++Xo#%%*****$#OX&&+++&&XO#%**********************",
-"%#O.  ++..X.X&&&&&o*#o.+++ .XXXX.+++& O*$@oX+++  ...  +++XO*#@X+++&&.....&&&XX#*$#X.+++..+++..+++.o*#oX+++ .XOoX.+++.XO*$@o.+++..oOo..+++XX*#@X.+++  +++  +++.X*%#OX.  ++++&++  .X@*%#OX.  ++. .++  .XO*%$@o && .. .++  .X@****$#oX+++XX@$%******%%#OX && .O#$***********%#@o.+++Xo#$****%%$OX.++...++.oO$%*********************",
-"$#O.. ++.XXX.  &&&X*@o.+++..oooXX+++&&o*$#oX+++ ....  ++&XO*$Oo&++& .....&&&Xo#*$#XX+++..+++..+++.o*#oX+++..oOOoX+++.XO*$#OX+++..ooo..+++Xo*#OX.+++  +++  +++.X*%$#O.. ++&&&++ ..O@*%$#O.. ++ . ++ ..O@*%$@O  &. .. ++ ..O#***%%#oX+++Xo@$%*******%$#o &&&&XO#%%*********%$@oX+++Xo@%%****%$Oo.++ ..++XX@$%*********************",
-"%#@.. ++.XXX. &&&&o*@X.+++..O@@oX+++&&o*%#oX+++  ...  +++o@*$@o&++ &.....&&&Xo#*$#oX+++..+++..+++Xo*#OX+++ .O@OoX+++.X@*%#OX&++..ooo..+++XO*$@X.+++  +++  +++.X*%%#@X. ++&&&++ .X@#*%%#@X. ++. .++ .X@$**%#@.. . .. ++ .XO$***%$#oX+++Xo@%%*******%%#@X.+++XO@%%**********$#oX+++Xo@%%***%%#OXX++...++.oO$%*********************",
-"%#@.  ++...X.&&&+&X*@X.+++.oO##@X  &&&X*$#oX+++&&  &++&&&o@*$#O.. +++++ &...o@$*%$#oX....+++....XO@*#oX+++..o@@XX+++.X@*%#@X&&&& XXX  &+&XO*$OX.+++&&++++++++.X**%$#Oo. &+++&&XXO#$**%%#OoX+++++++Xo@#$*%%$#@oXX.&+&++XXO#$***%%@oX+++Xo#$*********%$@X.+++.o@$%**********$@oX+++Xo#$****%%$OX.  XXX  XXO$%*********************",
-"%#@.. ++.....&&&&&o*@X.+++Xo@##@o  &&&X*%#OX+++&&&&&++&& O@*%#OX. +++++&&...X@#*%%##ooXX.+++.XXXo@$*#OX+++ .O@OoX+++.XO*%$@o &&&&.X.  +&&o@*$@X.+++&&++++++++.X***%$@oX &+++& Xo@$%**%%$#OX+++++++XO#$%***%$#@oX.&++++Xo#$%***%%@oX+++Xo@%%********%$#OX&&& .O#%%********%%#o.+++Xo@%%****%$OOX..ooo..XoO$%*********************",
-"%#@.. ++++++++++.XO*#X.+++.Xo@OOX &&&&o*$#oX++++++++++..oO#*%#@oX...&&&+++++XO#**%%$#@oX.+++.Xo@#$%*#oX+++..o@@XX+++.X@*%%#O.. +&.X.++  .O#*$@X.+++++& &+++++.X**%%$@oX&&+++&&Xo@$%****%$@o..+++.Xo@$%****%$#Oo. +++..XO@#%****$@oX+++.O@$**********%#@X&&&  o@$*********%$#oX+++Xo#$*****%%$#@@@@#@@@@#$%%*********************",
-"%#@.. ++++++++++.X@*@o.+++..oooXX+++& o*%#oX++++++++++.Xo@$*%#@oXX..&&&+++++XO#**%%%$#Oo.+++XX@#$%%*#OX+++..OOOoX+++.X@*%%#@.. ++...++ ..O#*$@X.+++++ & +++++.X**%$#@o.&&+++&&XX@#$****%$#OX.+++.XO#$%****%%#OX  +++.XXo@#$***%%#oX+++Xo#$**********%$@o&&+  o@$%%********$#oX+++Xo@%%*****%%%$$$$$$$$$%%%*******%*%%*%*%%%*%***",
-"%#O.. +++++++++&Xo#*#XX+++...XX..+++& o*$#oX++++++++++.Xo@#*$#OXX...&&&+++++Xo#****%%#@o.+++.o@#%%**#OX+++..oOoX.+++.X@**%$#X..++...++..X@$*$@o.+++++  &+++++.X*%%$@oX.&&+++&&.Xo@$****%%#OX.+++XXO#%****%%$@OX &+++..XXoO#****$@oX+++Xo@%%**********%$@XX.++Xo@#%%******%%@oX+++Xo#$*******%%%$%%%%%%%%%****%%%$$%$%$%$%%$%%%%*",
-"%#O.  ++    ..XoO#$*#OX&&&++   &&+++.XO*%@oX+++   . ++  .O@*#OX&&+.......+++.X@****%%#Oo.+++.X@#%%**#OX+++ .XXXX.+++.X@**%%#OXX++.. ++.oO#%*%#oX+++++  .+++++XO*%$@O.. ++...++  .O@****%$#OX.+++.X@#%%***%$#oX.++&&&..+&&XO****%#oX+++.o@$%***********%$@oX++..o#$%*****%%$@o.+++Xo@%%**********%%*%%*******%%$$####@###@@#@#$%*",
-"$@o.  ++   ..XOO#$%*$@X&&&++ &&&&+++.XO*$@o.+++  ...++  .o@*#oX+++.......+++.X@****%$@OX.+++.XO#$%**#@X+++ ..XX..+++.X@***%$#oX++   ++XO@$%*$#oX+++++.  +++++Xo*$#OX  &++.  ++&  XO****%$@oX.+++.XO#$%**%%#@X..++&&&..++&Xo***%%@oX+++XX@#%%*********%%$@oX++..X@#%*****%%#Oo.+++Xo#$***********************$$@@OooOoOoOooOo@@#*",
-"$@o&&+++&&&..O@#$%%*$#O &&++&&&&&+++.XO*$O..+++&&...&&+++.X*@X.+++&& &&&&+++.o@***%%#OX  +++ .XO#%%*$@o.&&++&& &&+++XO#***%%#OX &+++&&XO#%%*%#OX+++++...+++++Xo*$@X.+++++ ..+++++..****%#OX &+++ .XO#%%*%%#o &&++&&&& +++.X***%%#o.+++.Xo#$%***********%$@X&+ ..O@$*****%$#OX.+++Xo#$***********************$oo...  . . .   .X@*",
-"$@X&&+++&&&.XO#$%%**%#Oo..+++++++   ..@*#@..+++&&.X.&&+++.X*#X.+++&&& &&&+++XX#****$@OX&&+++  XO@$%*%#O.  ++&&&&&++&XO#***%%#@X &+++&&XO#%**$#OX+++++...+++++XO*#O. +++++ . +++++..**%%$@oX&&+++  XO@$%*%$@o&&+++&&&&&+++.X****$#oX+++& XO#%%**********%$@O. ++&o@$****%%#OX &+++Xo#%%**********************#XX   &&    &&&& .O*",
-"#@X&&+++&&&.XO$%%***%$@oX.+++++++   ..O*#@..+++&&.XX&&+++.X*@o.+++&&&&&&&+++Xo#**%%$@oX &+++& Xo@$%*%#@.. ++&&&&&++&o@#****%$#o &+++& o@$%**%#@X&++++.X.++++&X@*#O..+++++...+++++..***%$@oX&&+++& XX@$%*%$@o&&+++&&&&&+++.o***%%#oX+++&&Xo@$%**********%%#O..+++XO#****%$@oX &+++Xo@%***********************@X.  &&&&&& &&&& .o*",
-"$OX&+++&+++.X@$%****%$@X. ++++++++++ .@*#@. ++++&XXXX.+++..*#oX&&&&++++++  .o@#***%%@XX&+++++&.XO$%*%%#@XX&&+++++ ..O#$****%%#O..+++..O#%%**%$@o  && XXX&&&  o@*#@. +++++...+++++..**%%#OX.+++++++XXO$%*%%#O  &+++++++++&Xo***%%#OX+++&&.XO$%%**********%$@XX+++.o#***%%$Oo.&&+++XO#%%**********************@..++++++++++++++&o*",
-"$@o&&&&&&&&.X#$%****%$#X..++++++++++..O*$#..&&&&&oOOXX&&&..*#Oo  &&&+++&&..XO#%***%$#OX&&+++&&XoO$%**%$#@X&&++++&..X@$%*****%$@X.&&&.X@$%%***%#@.  . ooo.   .@#*$@X.++++&X.X&&++&..***%$OoX&&++++&XX@$%*%%#@.  ++++++++&&XO****%#OX&++++.Xo$%***********%$#OX+++Xo#***%%#oX.&++++Xo#%%**********************@. &+++++++++++++&o*",
-"$#@ooXXXXooO@$%******$#X..++++++++++..@*$#@OoXXoO@@@@OoooO@*%#@OooXXXXXXXoO@#$%***%%$#OooXXXXoO@$%%**%%$#@ooXXXXooO@#%%*****%%#@OoooO@#%%***%%$#@OoOO@@@OOOO@#$*$#@ooXXXooOoooXXoO@***%%$@OoXXXXXoO##%%**%$#@ooXXXXXXXXooO#***%%#@o&&&+&.XO#%%***********%#Oo+++XO#***%%$oX.&+++&X@#%***********************@X.&&+++++++++++&&O*",
-"%$$@@@OOO@@#$%%******%$#Oo...X.....Xo@#*%%#@@@O@@#$$##@@@#$*%$$@@@@@OO@O@@#$%%%****%%$#@@OOO@@#$$*****%%%##@@OOO@##$$%******%%%##@@@##$%*****%%$#####$$$##@##$%*%$##@@O@@##@@@O@@@#****%%$#@@OOOO@#$%%***%%$##@@OOOoOOO@@#$****%$#o &&&&XXO$%%***********%$#OXXXO#$***%%$OoX&&&&&O@$%***********************#@OoXXXXXXXXXXXXoO@*",
-"*%%$#$#$#$$$%%*******%%##OXXooXX.XXXO#$**%%$$$#$$%%%%%$$$$%**%%%$$##$##$$$$%%*******%%%$$##$#$%%*%******%%$$$#$#$$$%**********%%$$$$$%%*******%%%$$$%%$%%$%$%%%**%%$$#$#$$$$$$##$$%***%*%%$$$##$$$$%%*****%%%$#$######$#$%%*****%$@OooooO##%%*************%##ooo##%****%$#@OoXXoO@#%%***********************$##@@OOOoOoOOoOOO##*",
-"*%*%%%%%%%%%*********%%%$#Oo@@OoooOO#$%***%%%%%%%%%*%*%%%%****%%%%%%%%%%%%**%*********%%%%%%%%%%********%*%%%%%%%%*%************%%%%***************%%**%%%*%*****%%%%%%%%%%%%%%%%%********%%%%%%%%%*********%*%%%%%%$%%%%*******%%$#@@O@#$$%**************%%$@@@$%%******$$#@@@O##%%************************%%$$##########$#$$%*",
-"******************************************%%%%%%******************************************%%%%%%********************************%%%%%%%%%%***********************%%%%%%%*******************%%%%%%****************%*%%%********%%%%%%*****************%%%%%%%%*******************************************************************",
-"*******%%%%%%****************************%$$$#$$%%***************************************%%$#$$$%%*****************************%%$$#####$%%**********************%$$##$$%%****************%%$$$%$%**************%%$$$$%%****%%%$#$$$%**************%%%$$###$%%******************************************************************",
-"******%%$##$$%**************************%$#@O@@#$$%************************************%%$#@@@@#$%%**************************%%$$@@OOoOO@#$*********************%$#@@@@@$%%**************%%#@@@@#$%************%$#@@@@$$%***%$#@@O@#$%%************%$$@@OO@@#$%*****************************************************************",
-"*****%$$@@@@#$%*************************$#OooXXO@$%%***********************************%$#@ooXoO@$%**************************%%#@OXXXXXXoO#*********************$#OoXXoO@$%%************%%#@OooO@#%%**********%%#@oooo@#%%**$#@ooXoO@$%**********%%%#@OoXXXo@#%%****************************************************************",
-"****%%$Oo...@#$%************************$@.&+++.o@$%**********************************%%#OX++&&&O@$*************************%%#@o&&&+++++oO*********************$@. +++.X#$%************%$@..+++o@$%**********%$@O+++..@$%**$Oo+++& O#$%**********%$OX.++++&o@$%****************************************************************",
-"*****$@oX. .oO#%%*********%**%%*********#O &+++.X@#%%****************%%*%%************%$@oX++&&&o@$********%***%*%*********%%$@oX&&++++++oO*********%*%*%*%*****#@ &+++.X@#%%**********%%#@..+++o@#%%********%%#@X+++..@#%%*$OX+++&&o@$%%%********%$oX.+++++XO#%%*****%***%*%***%**********%*%%*%*%%**************%***%*********",
-"***%%$@X.+++.o@$%*******%%%%%%$%%%******#@X.+++..o@$$%%*********%%%%%$%$%%%%%*******%%%$@OX &+++XO$******%*%%$%%%%%%*******%$#O. +++   ..o@******%%%$%$%$%$%%%**#@X.+++ .o@$$%%********%%#O..+++XO#%*********%#@oX+++ .O#%%*$@o  &+&XO#$%%%%*%***%*$#@X..+++XO#%%****%%%%$%$%$$%$%%%******%%%%%%%%%%$%%*********%*%$$%%$%%%*****",
-"****%$@..+++.X@$%******%%$$#####$$%%****$@X.+++ .oO@#$$$%%****%%%$####@#@##$%%%***%%%$##OXX &+++XO#*****%%$###@###$%%%****%$#@o  +++  ...O#***%%%$$##@######$$%*#@X.+++ .XO@#$%%%******%$@O. +++XO#%*******%%$#@XX+++..O#$**$@o.& ++Xo@@###%%*****%%$@o. +++Xo@%****%%$#####@######$%%***%$$#########$$%%*****%%%$$##@###$%%%***",
-"****%$@X.+++.Xo#%%****%%##@OOoOO@#$$%***$@o.+++  XXoO@@#$%%*%*%$#@@OOoOoOOO@#$%**%%$#@@ooX. &+++XO#**%%%$#@@OOoOOO@#$%%***%$@oX &+++   .XO#**%%$#@@OOOooooOO@#$*$@o.&++  XXoO@@$%%****%%$@o. +++XO#%******%%$#OoX.+++ .O#$**%@O. &++XXoO@@@#$%%****%$#O..+++Xo#$%***$#@@OoooOoooOO@@$$**%$#@@OOOOOOO@@#$$%***%%$#@@OOOOO@@#$%%**",
-"****%$#oX&&&&&O#$****%%#OoX.....Xo@#%%**$#oX+++&&   ..OO##%*%$$@@o... . ....@#%*%$$@OO..   &&+++Xo#***$$@OO.... ..oO@#%*%%$@X..&&+++&& ..O#*%$$@Oo... ... ..Xo#*$#oX+++&&  ...O@#$%***%$@oX  && XO#$******%$#X..  &&& .o@$%*%#O.. ++.XX....X#$%*****%$@o.+++Xo#%****#oX....  ... ..O@#%*$#oX....X.....O@#$%*%$$@OO...  ..oO@#%%*",
-"*****%$@o &&& o#$%**%%#@oX.  &  .Xo@$$**%#oX+++&& & ..XXO@$*%$@OXX.. &    ..oO$*%$@OXX.. & &&+++Xo#*%%#@OXX..&    XXO@$*%%#O.. +++++&  ..O#*%$@OoX..  &     .X@*%#oX+++ && &..Xo@#$***%$@oX &&  XO$%*****%%#@X..& &&  .o@$%*%#O.. ++...  ..XO#%*****%$@oX+++Xo@$****@X...    &     Xo@$*#@X.   .. & ..XO@#$*%$@OXX..     XXO@$$*",
-"*****%%#@OXX  O#%%**%%#O&&&+++++++Xo@$%*$#oX++++++++++&&&O@*$@O&&&++++++++++Xo#*$@O&&&++++++++++XO#**$#O&&&+++++++&&&O@**$$O &&+++++++&& O#*$@O&&&++++++++++  O*$#oX++++++++++ ..@$**%%$oX.+++++XO#$%*****$#O &&+++++++XO#%*%$@.. ++   ++&& O#%*****%%@oX+++Xo#%%***O. ++++++++++++& O#*#O  ++++++++++ ..@#*$@O&&&+++++++&&&o#$*",
-"*****%%%#@Oo..O#%%**%$#o&&&+++++++.XO$$*%#OX+++++++++++&&o@*$@o&&+++++++++++.X@*$@o&&+++++++++++Xo#*%#@o&&+++++++++&&X@*%%#O &&+++++++&& O#*$@o&&+++++++++++& O*%#OX++++++++++  .O#**%%#oX.+++++Xo#$*****%%#O &&+++++++XO#%*%#@.. ++   ++&& O#$******$#oX+++Xo@%%***O &++++++++++++&&o@*#O &++++++++++  .O#*$@o&&+++++++++&&o@$*",
-"*******%%$#@.X#$%***%$@o&&++++++++.Xo#%*%#oX+++++++++++&&XO*#OX&&+++++++++++.X@*#OX&++++++++++++XO#*%#oX&++++++++++&&XO*%%#@  &+++++++&  @#*#OX&++++++++++++  O*%#oX++++++++++& .o@***%$OX.+++++Xo#%*****%%#@. &+++++++XO#%*%#@.. ++  &++&& @#%*****%$@oX+++Xo#$****O.&++++++++++++&&o@*#O.&++++++++++&  o@*#OX&+++++++++++&Xo#*",
-"*******%%%$$###%%****$@o.. &&&&&++ .X@$*%#oX+++++...  +++.o*@o.+++  .... +++.o@*@o.+++  ...+++++Xo#*%@o.+++  ...& +++.o**%$#oX. &+++.XXoO#$*@XX+++  ...&++++.oO*%#oX+++++...&&+++o@***%%$@oX.+++Xo@$******%$#@ooXX...++Xo#$*%#@.. +++++& .oO@$%******%@oX+++Xo@%%***@X.+++&&&&&&&&&&&X@*#@X.++++&... &++&o@*#XX+++  ...  +++.o@*",
-"*********%%%$$%%****%$@o...&&&&&++ ..@$*%#oX++++&.X.  +++.X*@o.+++ .XXX. +++Xo#*@o.+++ ..X.&&+++XO#*$@o.+++ &... &+++.X***$$@oX &++&.XoO#$%*#X.+++ ..X.++++&.o@*%#oX++++&... &+++XO****%$@OX.+++Xo#$%*****%%$#@Ooo...++Xo#%*%#@.. +++++  Xo@#%%*****%$#oX+++.O@$****@oX+++&&&&&&&&&&&oO*$@oX++++&.X. &+++XO*@X.+++ .XXX  +++.o@*",
-"**********%*%%*%****%$Oo&+++++++++ ..@#*%#OX+++  XXX..+++.X*@X.+++.XXoooX...XO#*@X.+++..XX.. +++Xo#*$@X.+++++++++++++.X***%%#OX&&&&&Xo@#$%%*@X.+++.XXX.. +++Xo@*%#OX+++  XXX. +++XO****%%$Oo.+++Xo@%*******%%%$##OXX.++Xo#%*%#@.. +++++ .XO#$%*******$@oX+++Xo#$****@oX+++  &&&&&&&&&XO*$#oX+++ ..XX  +++XO*@X.+++.XXXXX.+++.X@*",
-"********************%#OX&+++++++++ ..@#*$#oX+++ ..XXX.+++.X*@X.+++.Xo@OOo...o@$*@X.+++.XXXX  +++XO#*$@X.+++++++++++++.X***%%#Oo &&&&XO@$%%**@X.+++.XXXX  +++Xo#*%#oX+++ .XXX. +++XO*****%$@oX+++Xo@$%********%%$$#XX.++Xo#$*%#@.  +++++..oO#%%%*****%%@o.+++Xo@$%***#oX+++& &&&&&&&&&XO*%#oX+++ .XXX. +++XO*@X.+++.XoooX.+++.X@*",
-"********************%#oX++++++++++ ..O#*%#oX+++  XXX..+++.X*@X.+++.XoO@OOX.XO@#*@X.+++..XXX  +++Xo#*$OX.+++++++++++++.o***%%$OX&&&&&Xo#$%%**#XX+++& ...+++++XO#*%#oX+++ .XXX. +++Xo***%%%#@X.+++.o@$%%*********%%#OX.++Xo#%*%#O.. +++++..XO@$%*****%%$@oX+++.o@$%%**#oX+++  &&&&&&&&&X@*%#oX+++ .XXX. +++Xo*@X.+++.XXoXX.+++.X@*",
-"********************$#X.+++.....++ ..O#*%@oX++++&..X  +++.X*@o.+++ .XoOoo...Xo#*@o.+++  X..+++++Xo@*$@X.+++&&   & &&&Xo***%$#OX&&&&&Xo@#$%%*#@X&&&++++++++++Xo#*%@oX+++ .XoX..+++Xo****%$#Oo.+++XXO#$%%*******%%$#oX.++XO#$*$#O.  ++&&&++.Xo#$%****%$#OX.+++XXO@$%%*@O.+++& &&&&&&&&&Xo*$@oX+++ .XXX. +++Xo*@o.+++  XXX  +++.X@*",
-"********************$@X.+++.....++  .O@*$@oX+++++.X. &+++XX*#XX+++& XXXXX....X#*#XX+++& ...+++++Xo@*$#X.+++&&    &&&&Xo**%%#@oX&&&&&.Xo@@$%*$@O &&++++++++++XO#*$@o.+++ .XXX. +++Xo**%%$#OoX.+++.XXO#$$*****%%%$$@oX.++Xo#%*$#o.. ++&&&++.XXO#$**%%$@OoX.+++.XoO#$%*@oX+++  &&&&&&&+&Xo*$@o.+++  XXX  +++XX*#XX+++  .X. &+++XX#*",
-"********************$#o.+++.....++  .o@*$Oo.+++++... &+++Xo*#XX+++& ..X.. ...X@*#XX+++& ...+++++.o@*$#oX+++&&     &&&XO**%$@OX.&&&&&..XoO#$*%#@oX..    &&+++Xo#*$@o.+++...X...+++.o*%%$#OXX..+++..XoO#$****%%%##@oX..++Xo#%*$@o.  ++&&&++...oO#**%$#OoX..+++..XoO#$*@o.+++& &&&&&&&+&.o*$@XX+++ ..X.. +++.o*#XX+++& ...&&+++Xo#*",
-"********************$#oX+++++++++++++XO*$O. ++++++++++&&&XO*#@X&&&++++++++++ .@*#@X&&&++++++++++  O*%#OX&&&++++++++++Xo*%%#@ &&+++++++&& @$*%%#@oX..   & +++XO#*#@. +++++...+++++  **%#@.&&+++++++&& @$****%$#@OoX...++XO#$*#oX++++&.. +++++ .@**%$@ &&+++++++&& @$*O. +++++&&++&&&++ .*$@. +++++...+++++  *$OX&&&+++++++&&&XO$*",
-"********************%#oX+++++++++++++XO*#@. ++++++++++&& O@*$@O &&++++++++++ .@*$@O &&++++++++++ .@*%$#O &&++++++++++XO*%%#O &&+++++++&& @#**%$@oX  &&&++&&&o@$*#@  +++++...+++++ .*%$$@ &&+++++++&& @$**%%$#XX...&&&+&XO#%*$oX+++&&...+++++ .@*%%#@ &&+++++++&& @#*@  ++++&&&++&&&++ .*#@  +++++X..+++++ .*$#O &&+++++++&& O@$*",
-"********************%$@oX... . . . ..O@*$@X....... ...XXO@$*%#@OXX..........oO#*%#@OXX... ... ...o@**%#@OXX.. . ....XO#*%%$@X...    ...XX@$*%%$@oX & &&++&&&O@$*$@X..  ..XXX. ....o**%#@oX...  ....XX@$**%%#O... &++++&o@$%*$@o....XXXX..  .Xo@**%$@oX...  ....XX@$*@X..  ..... ......o*$@XX.. ..XXX. ....o*%#@OXX.......XXO@$%*",
-"********************%%#@XXX........XX@#*%#OXX........XOO##%*%%$#OoX......XXoO#$*%%$#OoX.....X..XXO#*%%%$#OoX......XXO@#*%%$#XX........XoO#$*%%#oX.++++++&.Xo@$%*%#OX....XoOo....XXO***$#OXX.......XXO#$**%%#O.&&+++++.XO#$%*%#OX..XXOOoX....oO#*%%$#oXX.......XXO#$*#OX....XXX..X.X..XO*$#OX.....ooo....XXO*%%$#OoX.....XOO##%%*",
-"********************%%%$OOoXXXXXXXXoo#%*%$@OoXoooXXoXo@#$%%**%$$#@ooXXXXXooO#$%**%$$#@ooXoXXXXXoO@$***%$$#@ooXXXoXO@@$%**%$$OooXX.X.XXoO@$%*%%$OX.&++++&&XoO#$%*%$@OXXXXo@@@oXXXoO@**%%$@OOoXXXXXoOO@$%**%%#O &&+++++.X@#%**%$#XXXoO@#@oXXXXO@$***%$@OOXoXXXXoOO@$%*$@OXXXoooXXXoooXX@@*%$@OooXXX@#@oXXXXO@*%%%$#@ooXXXoX@#$%%**",
-"**********************%%$####@#@#@##$$%*%%$###@#@#@###$%%%*****%%$####@####$$%%****%%$####@######$%*****%%$####@####%%%***%$$#@#@@@@###$%%***%$OXX&&+++& o@#%%**%$$#@@@##$$###@###$***%%%#####@#@##$%%***%%#@. &+++&&XO#$*%*%%$####$$$$##@@##$%***%%$$##@@#@@##$%%**%$###@####@#@#####$*%%$###@##$#######$$***%%%$######$$%%%***",
-"**********************%*%%$$$$$$$$$$%%****%%$%$$$$$%$%%%*******%%%%$$$$$$%%%%******%%%%$$$$$$$$%%%******%%%%$$$$$%%%%%*****%%%$$$$#$$$$%%%**%%%$@OoXXXXoo@#$%%***%%%$$$$%%%%$$$$%%%***%%%%$$$$$$$$%%%%%***%$#OooXXXooO#$%*****%%$%$%%%%$$$$%%%%*****%%$%$$$$$$%$%%**%%%$$$$$%$$$$$$%%%%**%%%$$$$$%%%$$$$%%%****%%%%$$$$$%%%*****",
-"********************************************************************************************************************************************************************************************************************************************************************************************************************************",
-"*************************************************************************************%*%********************************************************************************************************************************************%%%%%$%************%%%%%%*%*********%%%%%%%*************************************************",
-"*************************************************************************************%%%%%%****************************************************************************************************************************************%%$$##$$%%*********%%$###$%*********%%%###$$%%***********************************************",
-"***********************************************************************************%%$$#$%%***************************************************************************************************************************************%%$#@XX@#$%*********%$#ooo#$%********%$#@XX@#$%%**********************************************",
-"*********************************************************************************%%%##@@@#$%%************************************************************************************************************************************%%#@@oX.O@#%%*******%%#@X.X@#%%******%%#@OX.OO@#%%*********************************************",
-"*****%****%*******************%******************%*%******************************%#OXX .O#$%**********************************%***************************************%****%*************%******************%**%****************%#@OXX..O@#%********%$@o...o@$%*******%#@o..Xoo@$%%********************************************",
-"**%%%%$%$%%%$%%*********%%%%%%%$%%%%%%******%%%%%%%%%%%%%*********%%%%%$%%%%%***%%$@oX.  o@#$%%%*******%%%%%***%%%%%%*****%%%%%%%%%%%%%$%%%***%%%%%%%%*%%%%%%%*****%%%%%%%%%%%%%%%****%%%%%%%**%%%%$%%%****%%%%%%$$%$%%%********%$@O&&&  O#$%********%#@X+++X@#%*******%$#O. &&&O@$%********************************************",
-"*%%$$########$$$%******%%$$#########$%%***%%%$##$#$$###$$%%*****%%%$#######$%%%**%#@.. ++XoO##$%%****%$$$#$$%%%%$$#$%%%**%%$####$$$$#####$%**%%$$##$$%%%$#$##$$***%%$###$$$$$###$%%**%%$#$#$$$%%$#$#$$$**%%%$#########$$%*******%$@X&&&  O#$%*******%%#OX+++XO#%%******%%#O  &&&X@$%********************************************",
-"%$#@@OOOoOOOO@@#$%%*%%%$#@@OOoOoOOOO@#$**%%##@@O@O@O@OO@@#$****%%$#@@OOOOO@@#$%*%$#O.. ++.XXO@@$%%**%$#@@@@##$##@@@@#$%*%$#@OOOO@@@@@OOO@@#*%$#@O@O@@####@O@@@#*%%$#@OOO@@@@@OOO@#$*%$#@@O@@#####@@O@@#**%##@OOoOoOOO@@##%%****%%#OX+++.oO$%********%%#oX+++Xo#%*******%%#Oo.+++XO#$********************************************",
-"$#OoXXXXXXXXXoo@@$%*%%$@@OXXXXXXXXXXo@#**%$#OoXXXoXXXXXoO@#***%%$@OoXXXXXXXoO@$*%#@X.  ++...XoO@#%%*$#@oXXoO@@@@ooXoO@$*$#@oXXXXXoooXXXXXoO*$#OoXXXoOO@@ooXXXo@*%$#OOXXXXoooXXXXoO#*$#@oXXXoO@@@ooXXXo@*%$@OoXXXXXXXXXoO@$%****%%#OX+++XX@$%%*******%%#oX+++Xo#$********%$@oX+++Xo#%%********%%%%%%%%*%%%***********************",
-"#@. +++&+++++&..X@$*%$@X..&+++++&+++ .@*%%#O &&++   +++&&O@***%$OoX&++++&&&&&O#*%#OX++++++++++XXO$%*#@. +++.XOOo++&&&O@*#@. +++++...+++++ .*#@. +++& XoX &+++ .*%$OX+++++...+++++XO*#@. +++& ooo &+++ .*$#O&&&+++++++&& O#%****%%@oX+++Xo@$%********%%@oX+++Xo@%%*******%$@XX+++Xo#%******%%%$$$#$$$$$$$$%%*********************",
-"#O  ++++++++++..XO#*%#@...++++++++++& O*%$#O&&&++& &++++&o@**%$#oX.+++++++&&&o@*$#XX++++++++++.Xo$%*#O.&+++.XooX++&&&o@*#O &+++++...+++++  *#O  +++&&X.X&&+++  *%#OX+++++...+++++XO*#O  +++&&XXX&&+++  *$@o&&&+++++++&&&O@%*****$#oX+++Xo#%%********%%#oX+++Xo#%%********%#oX+++Xo@$******%$##@O@O@@@@@@##%*********************",
-"#O.&++++++++++  .o@*$@o.. ++++++++++&.O**$#O&&&++&& ++++&X@**%$@XX.++++++++&&o@*%#o.++++++++++.oO$%*#O &+++..XXX+++&&X@*#O. +++++.. +++++&.*#O &+++&&...&&+++& *%#OX+++++ . +++++XO*#O  +++&&.XX&&+++&.*$@o&&+++++++++&&O#$***%%#OX.+++Xo#$**********$@oX+++Xo#$********%%#oX+++.X@#$***%%$#@OoXXXooooooO@#*********************",
-"$OX.+++++&  &++++XO*#@X+++++ & +++++.XO*%%#OX. +++++  &&&XO*%$#O&&+++ & +++++XO*%#@X&&&++   ..oO#$%*$OX.+++ .oXX&&+++XO*$OX.+++&&...&&+++.X*#O. +++ .+++  +++..*%$@o. &++. .++& .o@*#@X.+++& ...&&+++.X*#@o&++&&&&&++ ..O#%****%#O..+++Xo#%%********%%#o.+++Xo@%%*******%%@oX+++..O#%%**%%#O.. ++&&&..&&&oO*********************",
-"$OX.+++++   &++++XO*#oX+++++   +++++.XO**%$@X..+++++  && o@**$#O &+++& &++++&o@*%$@o &&++  ..XO#$%%*$@X.+++..XoX &+++XO*$@X.+++&&...&&+++.X*#@..+++  +++  +++.X*%%#O.. ++ . ++  .O#*$@X.+++&&.X.&&+++.X*$@o&++&&&&&++ .X@#%***%$@O&&+++Xo#$**********$#oX+++.O@$*********$#oX+++&&o@$%**%$@o. &++&&&..++&XO*********************",
-"$@oX+++& .X...+++.X*@o.+++.....&&+++Xo@**%%#OX.++  .XXXoO@#*%%#O.  +++++   ..o@*%$#o.  ++.XXo@#$%%**$@oX+++..ooX. +++XO*%#@X  &++...++& .oO*$@XX+++&&+++& +++.o**%$#OX. &+++&&XXO@$*%#@X  &++...++& .XO*%#OX..  +++& .XO#$%***%%@o&&+++Xo#$*********%%#oX+++Xo#$********%%@oX+++&&o#$%**%#oX+++&&++++++&&X@*********************",
-"$@oX+++& .XX..+++.X*@X.+++..XX.  +++.O@***%$@oX++ ..XoO@##%*%%#O.. +++++&  ..o#*%%#O.. ++.XO@##%%%**$#oX+++..ooo..+++Xo*%$@o. &&+...&+  .o@*$#oX+++ &+++  +++Xo**%%#@oX &+++& Xo@#%*%$@o. &++...++&  o@*%#@X..  +++& XoO#%%***%$#o&&+++Xo#%%*********$@oX+++XO@%%*******%%#oX+++&&o@%%**%#oX+++&&++++++&&o@*********************",
-"%#oX+++&......+++XX*#X.+++..X..&&+++XO#***$$Oo.++ ..o@##$%%*%$#O.  +++++ & ..o@*%%#@.  ++XXo@@#$$%%*%#oX+++..XXX. +++Xo*%%#@.  &&...++  .@#*$#oX+++&&+++& +++XO**%%$@oX &+++&&Xo@$%**%$#o..++  &++.Xo@$*%$@XX.  +++ &Xo@#%%****%#OX.+++Xo@%*********%%#oX+++Xo@%%*******%%@oX+++.XO#%%**%#OX+++  +++++&&&O@*********************",
-"%#OX+++++ . +++++Xo*#oX+++++   +++++Xo#**%%#Oo.++..Xo@#$$%%**$#O..   &&&+++&&oO**%#@X. ++.XooO@@#$%*$#OX+++ .XXX. +++Xo**%$@oX.++...++.XO#$*%#OX+++++++++++++XO**%%#@oX&&+++&&XX@#%**%$#OX.++&  ++.XO#%*%#@X..++&&& ...X@$%****%$#oX+++Xo#$*********%%@oX+++Xo@%%*******%%@oX+++Xo@$%***%$@O...X.......XX@$*********************",
-"%#oX+++++&&&+++++X@*#@X+++++& &+++++Xo#**%$#OX.++...oO@#%%**%$#O..   &&&+++&&XO*%%$@.. ++..XXXoo@#$*%#OX+++ ....  +++Xo**%%#OX.++.  ++Xo@$%*%$OX&+++++++++++&XO**%$#oX.&&+++&&.XO@$***%$#oX&&+++&&Xo@$%*%#@X..++&&&....XO#$****%$#oX+++Xo@%%********%%#oX+++Xo#%%*******%%@oX+++Xo@%%***%%$#oXXOOoXXX.ooO#$*********************",
-"%#oX++++++++&&...O#*$#O...++++++&+++XO#*%%#O.. ++&  ..O@#%%*%$@o&++++&&&&&+++.o**%$@X..++   &&&  @#*%#OX&&+++ . +++++.X***%$#oX&&+++&&XO#$%*%$@o  &++ . ++&  o@*%%#O. &++ . ++& .O#****$#OX&&+++&&XO#%%*$#o &&++&&&&&++&o@$****%%@oX+++.o@$%********%%@oX+++Xo#$********%%@o.+++Xo#$*****%$$##@@@@@@O@@#$$%*********************",
-"%#oX++++++++&&.XX#$*%$@o..&+++++++++.O@**$#O. &++&&  .XO@$%*%#@X&++++&&&&&+++Xo**%$#o..++&&&++&  O#*%$@o&&&++   +++++.X***%%$Oo&&+++&&X@#%**%$#o. &++. .++  .o#*%$#o &&++. .++&& O@****%$Oo&&+++& o@$%%*$@o&&+++&&&&&++&o@$****%%@oX+++Xo@$%********%%#oX+++Xo#%%*******%$@oX+++Xo#%%*****%%$$$%$$$$$$$%%%**********************",
-"$@oX+++& ...XooO##%*%$$@@oXX...  +++Xo#*%$@o. &++&&   Xo@$%*%$@o&++++ &&&&+++Xo***%#oX.++& &++&& @#*%%#O&&&++   +++++..***%%$@O &+++& o@$%***%#O.. ++...++  .O#*%$@o &&++.. ++&& o@**%%$@OX&&+++Xo@$%%**$@o&&+++&&&&&++&X@$*****%#oX+++.X@$%********%%#OX&++XO#%*******%%$@X.+++XO#$*********%%%*%%%%%%%************************",
-"$@o.&++& .XXoO@#$%%**%%$#@OoXX.  +++XX@*%$@X++++++++++.oO$%*%$@o &&&&+++++  .o@**%%$#OX  ++++&..X@$*%%#@OX.+++++&&+++..****%%#OX.+++.X@#%***%%$#X..&&.X.&&.XX@$*$$OX&++++...+++++XO*%$#@XX.&&++&XO#%%***$#o &&+++++++&& o@$****%%#OX+++.XO#$%********%#@X&&&X@#%%******%%#OX.+++XO#%***************%****************************",
-"$@o.+++  .XXO@$%%%****%%$$#OXX. &+++.o@*%$Oo&+++++++++XoO$%*%%#O  &&&+++++...@#***%%$@O..+++&&.Xo#$**%%#@Oo&++++&&+++..*****%$#oX&&&Xo#$%****%%#OXX  ooo  XXo$$*%$@o++++&...&++++o@*%$Oo++++++++XO#%****%#O  &+++++++&& O#$*****%$@o+++.XO#$%%*******%$@O&&&O@$%*******%$#oX.+++oO$%%*******************************************",
-"$O. +++++& .@#$%********%$#@. &+++++ .O*%%#@OXXXXXXXXoO@$%**%%$#@oooXXXXXXoO@#$****%%$#OooXXooO@#$%***%$$@OoXXXXXXXXXO@*****%%$#OOoO@@$%%****%%%##O@O@O@OO@@#%%*%$#@ooXXooOooXXoo@#*%$@X++++++++XO#%%***%$#@oXXXXXXXXooO#$%*****%$@O...&&oO#%*********%#@OOO@$%%******%%#Oo &...O@$%********************************************",
-"$@  +++++  .@$%%*********%#@. &+++++  @**%$#@@OooOOO@@#$$%***%%$#@@@OOOOO@@##$%*****%%$#@@OO@@##$%%****%%$#@@OOOOOO@@@$******%%$#@@@#$%%******%%$$###$#$##$$%%%**%$#@@O@@@@@@OO@@#$*%%#OX.......@#$*****%%$#@@OooooOOO@#$%%******%$#XXX  o@#%%*******%%%$#@#$$%********%#@o ..Xo@$%*********************************************",
-"#@XX    ..Xo#$%**********%$#oX..    XX@**%%%$########$$%%*****%%%$$#$#####$$%%*****%*%%%$$#$#$$%%*******%%%$$#######$$%*******%%%%$$%%%**********%%%%%%%%%%%%****%%%$$##$$$$$$##$%%**%$#XX.X.XXX#$%%*****%%$$$#######$$%%%*******%%##OOO@#$%%**********%%$%$%%********%%%##@OO@##%%*********************************************",
-"%$@OXX.XXoO@%%***********%%$@OoX.XXXo@$***%%%%%%%$%%%%%********%*%%%%%%%%%%***********%*%%%%%%************%%%%%%%%%%%%%********%%%%%%*************%%%*%*%%%********%%%%%%%%%%%%%%****%%$#@@@O@@#$%*********%%%%%%%%%%%%%********%*%%$$###$$%%************%%*%**********%%%#$###$%%**********************************************",
-"************************************************%*%%%*%*****************%********************************%******%**%*******************************%%%%$%%%%********************************************************************************************************************************************************************",
-"************************************************%%%$$%%************%%%%%%%%****************************%%%$%%%*%%%%%%%**********%*%%*************%%%$######$$%%***************************%%%%%%%***************%%%%%************************************************************************%*%%%%%%***************%***********",
-"***********************************************%$#####%%*********%%$$###$$%%**************************%$$###$$$$$##$$%%********%%%$$%%**********%%##@@OOOO@@#$%************%*%*********%*%%$$$$$$%%%**********%%%$$$$%%**********************************************************************%%$$##$$%%***********%%%%%%%%******",
-"***********************************************$#@OoO@#$%*******%%$#@@@O@@#$%%*******%**********%****%$#@@OO@@#@@@O@@#$******%*$#####$%********%%$@OoXXXXXoo@@$*******%%%%%%%%$%%******%%$##@@@@##$%%********%$$#@#@##$%%******************************************************************%%$##@@@@##$$%*******%%$$####$$%%****",
-"*********************************************%%#@o&&&o@#$*****%*$$@oX....XO#$%****%*%%%%%*%*%%%%%***%$#O....XoOoX...X@#*******$$@OoO@$%%*******%#@O  +++++&& O#****%%%$$#$$#$#$$%%****%$$@@XX..oo@@$$%*****%%%#OoXXXoO#$%*****************************************************************%$$@@oX..oo@##$%*****%%$@@OOOO@##%%***",
-"********************************************%%$@oX+++Xo@#$%***%%$@OX......oO#$%***%%$$$$$%$$$$$$$%%*%$@o.  . XXX.....o@******%$@O&&&o@$%*****%%$#OX &+++++&& o@*****%$##@@#@@@@#$%***%%#@OXX....XXO@#%%****%%$@oX...XXO#%%***************************************************************%$#@oo.....XXO@#$%***%%$@OoXXXXoO@#$%**",
-"********************************%***********%$#O..+++..o@#%***%$@oX+++++++.XO$%**%%#Ooo@@#@#@@oOO$$*%#oX+++++...+++++Xo******%#Oo&&&X@#%*****%%#oX.++& &&&++&o@***%%$@oo..OOO&&@#$**%%#@.. ++++++ ..@$$****%$#O &  &++o@$%******************************%**%*%*%************************%%$@.. ++++++ ..@$%***%%#O &+++++XXO$%%*",
-"***************************%%%%%%*********%%$#OX. +++..Xo@$**%%#@X.+++++++.Xo#%*%%$#oXXoooOoooXXo@$*$#o.+++++ . +++++Xo*****%%#OX+++XO#%%****%$@X..++&&&&&+++o@****%$OoX. Ooo&&O#$%*%$#O.  ++++++  .O@$***%%$@o & &&++XO#%*********%%%%*%%%%%******%%%$%%$$%$%%%%***********************%$@O.  ++++++  .O@$***%%@O&&+++++.Xo$%**",
-"***************************%%$$$%%%*******%$#OoX  +++ ..oO#**%%#oX.+++++++.XO$%*%%#OX..XX.XX.X..XO#*%#oX+++++ . +++++Xo*****%%#oX+++Xo#%****%%#OX. ++&&&&&++&o@****%$@oX..Ooo&&O#%%*%#OX.& ++++++&  oO#***%$#OX&&&&&++XO#%%*****%%%%$$$$$$$$$%%**%%$$###########$$%*********************%#@X.&&++++++&  oO#***%$#O&&+++++.XO$$**",
-"*************************%%$#@@@@$%******%%#@.  +++++++..X#**%$@X. ++.....Xo@$%*%$@o&&&+++++++&&&O@*%$Oo  &++...++&& X@*****%%#oX+++Xo#$****%$#o. &++&&&.. ..o#***%%$@@OooO@OXX@#$**$#XX++++++++++++.o@***%$Oo.&&&+&++XO@$******%$#@#@@@@@@@#$$**%$#@@OOoOoOoOOO@#$*********************$#XX++++++++++++.o#****%#OX......Xo@$%%*",
-"*************************%%#@Ooo@#%%*****%$@O.  +++++++ .X@**%#@...++..XXXOO#$%*%$@o&&+++++++++&&o@*%$#o. &++...++  .o@*****%%#oX+++Xo#%%***%#@X  &++&&&.....O#****%%##@OO##@oo#$%**#OX.++++++++++++.X@**%%#OX.&++++++.o@$%***%%$#@oooooooooO@#*%%#@oXXXXXXX.XXXo@#****%*%%%$%$%$%$%%%**#@X.++++++++++++.X@***%%$@X.....XO@#$***",
-"************************%%$#X...X#$%*****%$@X&++&&...&&.XX#*%%#O.. ++X.XoO##%%**%#@X&++++&  +++&&XO**%#@X..++&&&++..X@#*****%%@oX+++XO@%****%#oX+++&&+++++...O#*****%%$$$$$$$#$$%%**#O  &++++&&++&&&  O**%$#X..++   ++.XO$%**%%$@O. &&&..&&&..#*%#@X+++++++++++++XO****%$$$########$$$%*#O.&&&&++&&++&&&& O****%%$#@@O@O@##%%%**",
-"*************************%$@.....@$%%****%#@X+++ &...&&..o#*%$#O.. ++..Xo@#$%%**%#OX&++++ & +++&&X@*%*$#oX.++&&&++.Xo@$*****%%#OX+++Xo#%%***%#o.+++&&+++++...O#******%%%%$%%%%%%****@O &+++++&&++&&&& o**%$#X..++   ++.oO$%*%%$@Oo &&&&..+++..@*%#OX+++++++++++++Xo**%%$$@@@OOOoOOOO@$$*@o &&&&++&&++&&&& o*****%%$$###$$$%%****",
-"************************%%$@X....O#%*****%#OX+++& X.X& .Xo$*%$@o.  ++..XoO#$%***%#@X&++++&  +++&&XO**%%#OX.++&&&++.XO#%******$#OX+++XO#%****$@o.+++&&+++++ ..o@*******%*%*%*%%%*****@o &+++++&&++&&&& o***$@X..++   ++.Xo#$*%$#OXX&&+++..+++..@*%$OX+++++++++++++.X***$#@OXXXXXXXXXoo@#*@o &&&&++&&++&&&& o*******%%%%%%%*%*****",
-"*************************$$OXX..XO#$****%%#OX+++  .XX.XoO@$*%#OX++++++++.X@$%***%#OX+++  ...  ++&XO***%$@oX&+++++&.XO#%******%#OX  .XO#%%***%#oX+++++   +&+++XX*********************@o&&+++++..& &&&&&o*%%$#oX.+&++++&..o#$*%#O.  ++   +++++Xo@*%$@O...       +++.X*%%$@. &++++++++++o@*#o&+&&&++++&&&&&&&o*********%*%%********",
-"************************%%#@X....O#$%****%$OX+++ ...X.XXO@#*%$oX++++++++..@$%%**%#OX+++ &...& +++XO**%%$@oX&++++&&.XO#%******%#@X.  X@#%****$#oX+++++& &+++++.o*********************@o&++++++..& &&&&&o**%%#XX.++++++&..X#%*$@o. &++   +++++XO#*%%#@XX......  +++.X**%$@  &++++++++++o@*@o&&&&&++++&&&&&&&o*********************",
-"************************%%#O. && O@%%***%%#@X&++++.. &&.XO$*%$@X.  ++&  .o@#%%**%$OX&++++&  ++&+&XO***%$OX.&&+++&&.XO#%*****%%#@X+++XO#%****%$@X.. +++++&&+++.o*********************#o. ++++++++++++ .o**%$#o..+++++++.XX#$*$Oo+++&&&&&++ ..o@$**%$#@O@OOOoXX.+++.o*%%$@X...     . ..o#*#o. +++++&&+++++ .O*********************",
-"************************%$@o &&&&o@$%%***%$@o&&+++   &&.Xo#*%$@o.  ++&  XX@#$%%*%#Oo&++++ & ++++&X@**%%$@X.&&+++&&.XO#%******%#OX+++XO#%****%$#OX..+++++&&+++.X*********************#O. ++++++++++++..O**%%#XX.+++++++..o#$*#OX+++&&&&&++  .X@$***%%$$####@OXX+++.X**%$#oX..........X@#*#@..+++++& +++++..O*********************",
-"************************%$@o &&&&XO$%****%$@o&&&++&  +&.Xo$*%$@o. &++&& .XoO@$$*%$OX&++++&  ++&&&X@**%%#OX.&&+++&&.XO$$*****%%#OX+++XO#%%****%#@X..+++++&&+++.o*********************$@..++++++++++++..@**%%$oX.+++++++.Xo#%*$@X+++&&&&&++ ..X@#*****%%%%$%$@OX+++Xo**%%$OooX.....X.XX#$*#@X.+++++&&+++++..@*********************",
-"***********************%%#@X&&+&&XO#$*****%#@o..+++++++XX@$*%$@X  &++....XXXX@#*%$@o&&+++++++++&&o@**%%$Oo.  +++ ..XO#%******$#oX+++Xo#$****%%$@oXX.. & ++++&XO*********************$#OX&++++&&++++&XO#**%%$@oX..   ..Xo@$%*$@o  &++ & +++++XO#******%*%%%%$#O...o@***%$$#@#@@@@@@@@#$%*%@oX&&+++&&++&&&XO#*********************",
-"************************%#OX&&+&&XO#%*****%$#OX.&+++++&Xo@$*%#Oo &&++........O@*%$@O&&&+++++++&&&o@**%%#OX..&+++& XXO#%******$#oX+++Xo#$****%%#@oX.X.   +++++XO*********************%#@o&&&++&&++&&&o@#***%$#@o... ..XoO#$%*%#@.. ++  &+++++Xo@***********%$#@XXX@#****%%%$$$#$##$$$%%%*%$@o&&&++&&+++&&o@#*********************",
-"************************%#OX+++++XO#$%*****%$#@XX.+++.Xo@$%*%#oX+++++++++++++XO**%#OX....XXXXX..XO#**%%#oX.+++++++.Xo#%*****%%#oX+++Xo#%%***%$@o&&&  ...++ .X@$*********************%$#OX..&&++&&..XO#%****%$$##OOoOO@#$%%**%$@OXX&&++& .+++ .@************%%$###$%*****%%%%%%%%%%%%%%**%$#OX..&&++&&..XO#$*********************",
-"***********************%$#oX+++++.o#$%*****%%$#OXX+++.oO#%%*%@o.+++++++++++++XO*%%$@oXXXXoooooXXo@$**%%#oX.+++++++..o#%******%#OX+++XO#%%***%$@o&+++++++++.Xo#$**********************%$#OXX&&++&&XXO@$%*****%%$$#####$$$%***%%$#OX &&&&..+++..@*************%$$$$%%********%*%*%*%*******%$#OXX&&++&&XXO#$%*********************",
-"***********************%$#oX+++++Xo#$%*******%$#oX+++XO#$%**%#OX+++++++++++++XO***$$OOoOO@@@@@ooO$%**%%#oX.++++++&.Xo#%*****%%#OX+++XO#%****%$@o&+++++++++Xo@$%**********************%%$@OX  ++& Xo@$%%******%%%%%%$%%%%******%##O. &&&..&&&..#***************%%%%***********************%%$@OX  ++& XoO$%%*********************",
-"************************%#OX+++++XO#%********%%$@o...O@#%%**%$@o..        ...O@***%$$$#$$$$$$$$$$%%***%$@oX..  . .XO@$%******%$@O...O@$%****%%#O...&    .Xo@#%%***********************%%$#@OoXXoo@#$%%*********%%%%%%**********%$#@OoooOooooO##*******************************************%%$#@OooXoo@#$%%**********************",
-"***********************%%#@X&&&&&XO#%%********%$$@XXX@#%%***%$#OX..........XX@#****%%%%%%*%*%%%%%%%**%%$#@oX.....Xo@@%%******%%#OX.X@#%%****%%$@XX.  ...Xo@#$%*************************%%$$#@@O@##$%%*************************%%%$#@#@@@@@@@#$$********************************************%%$$#@OO@##$%%***********************",
-"*************************%#O.   .O#$%**********%%##@#$$%*****%$#@@OOOOOoOOO@@$$*****%%%%******%********%$##@OOOOO@#$$%********%$#ooX#$%%*****%$#OXX...XXo@#%%****************************%%$$##$$%%%****************************%%%$$$$$$$$$$%%**********************************************%%$$$$#$%%*************************",
-"************************%%$#@OoOO#$%************%%%$$%%*******%%$##########$$%%*************************%%$$####$#$%%**********%$##$$%********%%##@@@O@@#$%%*******************************%%%%%%%********************************%%*%*%*%%%%%*************************************************%%%%%*%**************************",
-"**************************%$#####$%%*************%%%%*********%%%%%$$$%$$%%%%****************************%%%%%%$%%%*%*********%*%%%%%%*********%%$$#$#$$%%%**********************************%*%*************************************************************************************************%*%****************************",
-"*****%%%$%$%%%******************************%%%%%$%$%%***********%%%%%$%%%***************************************************%%%$$$#$#$$%%%************************************************%%%%%%************************************************%$%$$%%************%%%$%$%*************%%$$$$$$%%******************************",
-"****%%$$###$$%%******************************%$#####$$%*********%%$#####$$%%****************%******************************%%%$#@@@@@@@@#$%***********************************************%%$$$$%%%***********%*%%*%****************************%$#####$%%**********$#@###$%************$#@@@@##$$%******************%*%********",
-"***%%$@OXXX@@$%%*************%*************%%$@@XXXoO#$%*******%%$@OXXXoo$$%************%%%%%%****************************%%$#@oX.....XXX#$*********************************************%%$$@ooO#$%*********%%%$$$$$%%**************************$@@ooO@#$%**********#OOoO@#$%***********#@OooooO##$%*****%*********%%%$%%%******",
-"***%$#Oo.X.XO@$%%**********%%%$$%%*********%$#Oo...XX@#$%******%$#Oo...XX@#$%*********%%$$#$$%%**************************%%#@Oo.X........O#********************************************%%%#@OXXX@#%%*******%%$$##@###$$*************************#X. &&Xo#%%%*****%**X.&&&Xo#$%**%%%%$*%*oX&&&&&XXO#%%%%%%%%*******%%$###$%%*****",
-"**%$#OXX...XXO#$%*********%%####$%%********%#@XX.. ..o@#%%*****%#@XX.. ..o@#%%*******%%$#@@@@$$%************************%%#@ooX..      ..O@********************************************%%#@OX...O@$%*******%$#@OoooO@#$%************************@X.&&&.X@$%***%%%%%*X.&&&.X@$%%%%$#$$$%*X.&&&&&..o@$$$$$#$$*******$$#OO@@$%*****",
-"*%$#Oo&+& &+&oO#%%*******%%##ooo@#%*******%%#O&& & +&.XO$%****%%#O&&   +&.XO$%******%%##XXX .#$%************************%$@o&&&++++++++++XO********************************************%#@o &+++X@#%*****%%$#O..&&&..O#$%%**********************@..&&&.XO$$%%%$$$$$*..&&&.XO$$%$##@@@#$*X.&&++&..XO####@@##*******%#O&&&@#%%****",
-"*%$@oX++&&&++Xo@$%%******%$@O..XO@$%%*****%$#O&& &&++.XO$%%***%$#O&+&&&++.Xo$$******%$#OX.. .@$%******%%%%%****%*%%%****%#OX&&&++++++++++XO********************************************%#@o &+++XO#%%****%$#@o  &&& .oO#$%**********************@..+++..@#%$%##@OO#*..+++..O#$##Ooo  @$*.  &&&&&  O@@@O..Xo******%$#O&&&O@%%****",
-"%%#o..++...++..X#%%****%%$#Oo+++XO#$%%*****$#O..   +&.XO#%%***%%@O.  &&++.XO#%%*****%$OX&&&.X@#%%****%%$$$$$%%%$$$$$$%**$@o.+++  +++++  .o@********************************************%$#OX.+++Xo@%****%%$oX.++...++.XO#%%****%%%%%*%*%%*******@..+++..O#$$#@@oXo@*..+++ .O@##OXX.  @#*.  &&&&&& oOooX  .X******%$@O...o#$%****",
-"%$#X..++...++ .X#$****%$$#OoX+++XXO#$$*****$#O..   ++XX@$%****%%#O..&&&++.Xo#%%****%%#OX&+&XX#$%****%$##@@@##$$##@@##$$*$@X.+++  +++++  .o@*********%%%%*%******************************%#@XX+++Xo#$****%$#o..++  .++..o#%%*%%%$$$$$%$$%$%%*****@oX+++ .O@##@...&&@*oX+++..o@@OX&&&..O#*oX  &++ ..XX.. &&X@******%$@o...o@$%****",
-"*$#X..++...+&..X#%%**%%#@OXX.+++.XoO@#$***%%#O... .+&.o@$%%****$#O.   &++.Xo#%%****%%#OX&&&Xo#%%****%#@OoooO@#@OOoooO@$*$@X.+++  +++++ ..O#*******%%%$$%$******************************%%$Oo.+++.o@$%***%$#o..++ ..++..X#$%*%%$##@########$%%***#o.&++ .o@@@o.  & O*oX+++ .oooX.&&&..@#*OX& &++  .XX   &&o@******%#Oo. .o@$%****",
-"%%#OX.&+   ++XXO#%***$$@X..  +++  ..X@$***%%#OX.+++..XO@$%****%$#O..&&&++..o#$******%$OoX.XO@$%*****$@. &&&XXO@o++&  @#*$@X.+++& +++++  .@#******%$$##@##%%*****************************%$@o.+++Xo@$%***%$@X..++...++ .X@%%*%$@XXXoooooXo@##%%**@oX+++ .XOOoX   &&O*o.+++ .XoXX.&&&..@#*oX &&++   .. & &&o@****%%$#oX&+&X@#%****",
-"*%$@OX&+   ++Xo@$%%*%$@o..   +++   ..o@***%$#O..+++..XO#$%*****$@O.. &&++..X#$%*****%%@OoXo##%%*****#@  +++..ooX++&&&o@*$#X.+++ &+++++ ..O#*****%%$@OooO@#$****************************%%#@XX+++.X@$%***%%#X..++...++..X#$%*$#@...XX.X...oO@#%%*@o.+++ .XXX..&&&XXO*oX+++ ..X.&&&& XXO#*.    &&&&&  ++&XX@#****%%#Oo.+++XO#%****",
-"**%#@OX.   .Xo@$%%**%$OX+++++++++++++XO****$@o&+&&&+&.XO$%%**%%$@o&+   ++.XX#%%*****%%%####$%%******#O..+++..ooX&&++&oO*%#OX&+++++++++ ..@#*****%$#X.&&&O#$*****************************%#@..+++..@#%%**%%#OX.++ & ++.Xo#%%*$@O&++&& . ++..X@$$*OXX+++ ...X  &++Xo@*X.+++ ....+&&& .XO#*.  & &&&&&  &++Xo@$***%%#@o &+++XO#%%***",
-"**%%#@XX...Xo@#%%***%#OX+++++++++++++XO***%$@o&+&&&&&.Xo$%****%$@o++ & ++.Xo#%%******%%%$%%%%*******$@X.+++ .XXX&&+++XO*%#OX&&++++++++ ..@#****%%$@X.+++o@#%%***************************$#O. +++..O#%***%$#OX.++   ++.XO$$**$@o&+++&   ++ ..O#$*O &++++&&&&++&&&.o@* &+++&+++++++++& O@*X.+++++&&&++&&&.X@$**%$#@oX &+++XO#%%***",
-"**%%%#@o..XoO$$%****%$OX+++++++++++++XO***%$#o&+&&&&&XXO$%%***%$@O++   +&.Xo$%**********%%%*********#@X.+++..ooX &+++XO*%$#O &&+++++++ ..@#*****%#O..+++X@#%**************************%*$#O..+++..O#$%***%$OX.&+ & ++.XO$%**$@O&++++   ++  .X@#*O &+++++&&&++&& .o#* &+++++++++++++&&o@*X.&++++&&&++&&&Xo#$**%$@oX.&&+++XO#%****",
-"****%$$##@@#$$%*****%%#OoXX..+++...XoO#****$#@..    .o@#%%*****%#@X..  ..o@#$%%*********************$@XX+++ .XoX. +++XO*%%#@oXX  +++++...@#****%%$@..+++o@#%**************%%***********%$#O. . ...O@$%**%%$@oX &&&&& Xo@#%%*%#OX..++&&&&&+++.X@*@. +++&+&&&++&&&.o@* &+++++++++++++&&oO*oX&++++&&&++&&&.X@%*%$#O &&++...o@#$%***",
-"*****%%$$$$$%%******%%$#OoX..+++.XXo@#$****%$@XX.....@#$%%****%%$#Oo...XXO#$%***********************%#OX+++ .XXX  +++Xo**%%#@OX  +++++ ..@#*****%$@X.&&+o#$%***********%%$%%%%*********%$#@X.....X@#$%%*%%#@o. &&&&& .o@#%%*%#OX..++&&&&&+++.XO*@OoX.. .+++&&+++.X@*oXX..&&&&&&& . ++X@*@OXX.. +++&&+++.X@$*%$@o&&&++...XO##%%**",
-"*******%%%%*%********%%$#OOX.+++.Xo@#$%***%%$$@@OOO@@#$%*******%%$#@@@O@@$$%%***********************$#oX+++  ...  +++Xo***%%$@OX.+++++ ..@#*****%$#@OooO@#$%**********%$$####%%********%%$#@@@@O@@#$%***%%#o..+++++++..X#$**%$@o..+++++  +++..@*$@OoX...+++&&+++.X@*@o...&&&&&&&  .++o@*#@OXX. +++&&+++.X@$*%$Oo&&+++..XXoO##%%*",
-"*********%***********%%$#@OX.&++.oO@#$%*****%%$$###$$%%%********%%%$#$#$$%%*************************%#oX++++& . &++++.o****%%#Oo.+++++ ..@#******%$##@@@#%%**********%%#@OOO@#%%********%%%$####$$%%%***%$#XX.+++++++..o#%%*%#@X..+++++&&+++..@*%#@XX.++&&&&&+++.X@*@o.  +&.X...+++ .o@*$#OX.++&&&&&+++.X@#*%#OX+++  ..X  XXO#%*",
-"*********************%%$#@oX.++&.Xo@#$%******%%%%%$%%%***********%%%%%%%%%**************************%#oX+++++   +++++.X*****%$@o.+++++ ..@#********$$$$$%%***********%$@o &&O@#%%*********%%%%$%%%%%****%%$XX.+++++++.Xo$$**$#OX..+++++  +++.X@*%#@XX.++ &&&&+++.XO*@o. &&&.XX..+++ .o#*$#OXX++&&&&&+++.XO#*%#@X+++  ...&&.Xo#%*",
-"*********************%$#XX...   ..XXo$$********%%*%*%**************%*%%*****************************%#OX+++&+&  +++++.X****%$@OX.+++++ ..o#*********%%%%%***********%$@OX&&&XO#$%**********%*%*%*********%$#OooXXXXXXOO#$%**$@o&&+++   ++&& XO@*%#OX..++&&&&&+++.XO*Oo & &&XXXX.+++..O#*$@oX.++&&&&&+++.XO#*%$Oo&+++&.. ++..X#$*",
-"********************%$#@...   &   ..X@#*************************************************************%#oX+++++++++++++ .**%%$@OX..+++++&& o@************************%%$@..+++..@$%************************%%$$@OOoooO@@#$%%**$@o&++++   ++  .o@$*%#O &&&&&&&&&+++ .O*X.&++..XXX&&&& ..O#*#O &&&& & &&+++ .O#*%$@o&&+++   ++ .X@$*",
-"*********************$@O..  &  &  ..XO#*************************************************************%#OX++++++++&&+++ .***%$@oX. +++++&& XO*************************$#O..+++..O#%%*************************%%$$#####$$%%%***$@o&++++.. ++ ..@#$*$@O&&&  &&&&&+++  O*o.++&.XoXX&&&&&..O#*@O&&&& & &&&+++  o#*%$@O&&&++   ++..X#$*",
-"********************%$@X+++++++++++++X@*************************************************************%#oX+++  ..XXXXXoo@**%$#X..++++++++++Xo*************************%#O. +++..O#%**************************%%%%%%%$%%%%*****%#O.  XX.....Xo@#$%*%#O &&   &&&&+++ .O*oX&&&XXOoX&& & ..O@*#O && . . &&+++ .O#**%#@XX.+++++++.XO#%*",
-"********************%$@o+++++++++++++o@*************************************************************%#OX+++ .XO@####$$%**%%#o..++++++++++Xo************************%%#o &+++ .@#%%****************************%*%**%********%#@X..ooXXXXXO@#$%%*$#OX..XXooX..+++ .O*oXXXXO@OXX++&&&+&O@*#OX..XoooX..+++ .O#*%%$#OXX++++++&Xo@$%*",
-"********************%%#OOXXXXXXXXXXXo@#*************************************************************%#OX+++..O##$%%$%%***%%#oX.++++++++++XO*************************$#O &+++..@#%*******************************************%%#@@@@@#@@@@#$%%***%$#XXX@O@OOX.&++..@*OoOOO@#@OX&&&&&&+O#*$#XXX@@@@OXX+++..@$***%$#@ooXXXXXoO@$$**",
-"*********************%$#@@OoooooooO@@#$*************************************************************%$#O...oO#$%**********%$#@ooXXXXXXXXoO#************************%%#@X.   XO@$%*******************************************%%%$$#$$$$$$$%%%%***%%$########@OoXoO@#*$$###$$$#@oooXooO@$*%$######$@@ooooO@#$***%%$##@OOOOO@#$%*%*",
-"*********************%%%$###########$%%*************************************************************%%#@XXXO#$%***********%%$##OOoooooOO@#$*************************%$@oX...o@$%**********************************************%%%%%%%%%%%%*******%%%$%%%%%$##@@@@$$*%%%%%%%$$#@@@@@@#$$*%%%$$%%%%$$@@@@@$$%******%$$#####$$%%***",
-"***********************%%%%%$%$%%%%%%%***************************************************************%$#oXo#$%%************%%$$########$$$%**************************%$Oo..X@#$%**********************************************%*******************%%%%%%%%%%$$$$$%%*%%%%%%**%%$$##$$$%%**%*%*%%*%%%%$#$$%%********%%%%%%%%%%****",
-"***%%%$$$$%%***************%%%$$$$%%**********%%$$#$$%***********%*%%$%%%%******************************%%%$####$%%************%%%%%%%%*%*********%%%$%$%$%%%%%****%%%$$$$%%****************%%$$$$$%**********%%$#$$$***********%%%%%%%%%%%********%%%$$$%%******************%%$$$$%%********%%$$####$%*********%%%%%%%%%%%%****",
-"***%%##@##$%%**************%%$##@##$%********%%##@@@#$%**********%$$$###$$%%***************%*************%$#@OO@@$%%*********%%%$%$$$$$$$%%***%%%%$$########$%%****%%##@@#$%%**************%%$##@#$$%%*******%$#@@@#$$%********%%$##$##$#$$%%******%$$#@@#$%%***************%%$##@#$$%*******%%#@OOO@#$%*******%%%$#$$$$$$$$%%**",
-"**%%#@o..@#$$*************%%#@oo..#$%%*****%%%#Oo...@#$%*******%%$#ooOO@O@$$********%%%$%%%%%%%********%%$#XX   o@$%*******%%$$##@#@#####$$****%$#@OoXXXXooO@@$***%%$@..oOO$$************%%%$#O..O@#%%*****%%%#@...oO#%%******%%$#@@O@@@@@#$$%*****%#OO..@@$%%*************%%$#O..o@#%%****%%%#OX & oO#$*****%%%##@@@@#@@@@#$$%*",
-"**%$@OX  oO#$%%**********%$$@oXX  @#$*******%$@oX   o@$%******%%##OXXXXXXo#$%%*****%%$$$#$$$$$$%*******%%$OX.&& XO#%%*******$$ooXXXXXXXXoo#**%$$#OoX.....XXXoO#***%%#@. XXo@$$%***********$$@Oo  XO@%%*****%%#@o & Xo@#%%****%%$@O  XXX..XoO$%****%%@OX  oO@$%%***********%%$@Oo  XO@$%****%%$@XX&&&.o@#%%****%$Ooo..OOO..XoO$%*",
-"**%%@oX&&XXO#$%*********%%$@O...  @#%******%$@OX.&& XO#$%****%%$@Oo.....XXO#$%****%%$#@@@@@@##$$%******%$#O..&&&Xo@%%*****%%#@XX........XX@*%$#@OXX..... ...XX@**%%$@O..++&Xo@#$%%****%%$#@O  &&&XO@$%%**%%$@O. &&&+&oO#$%***%$@Oo&&.X.  .XX#$%**%%$@OX &XXO@$%%*********%$$@OoX& XO@%%****%$@OX.&&&.XO#$%***%$#oX.. XXX  XXo#$*",
-"**%$#OX && .@#%%******%%%$#oX&&&.X@$%%****%%#Oo&+&&&..@$%%**%*$#X..++++++&o@#%***%%$OoX. OOO  @$%%****%%$@o &   ..@$%******$#O.... . .....o*%$@...++++++++++&&O**%$#Oo..+++.XO@#$%**%%$$@@oX &&& Xo@$$***$$@OX. +++++Xo@#$**%$#XX. &   &&...O#%***%$#OX && .O@#%%%*****%%%#@O  && XO#$%***%%#Oo&+&&&++oO#$%*%%$@X..&&... & .X@$*",
-"*%%$@OX &&& o@$*%*****%%$@OX.+++.X@$%****%%#@oX++++& .@$%****%$@X. ++++++&X@#%***%$#OX.  XXX  @$%%****%$#OX &   .X@%%****%%$@o&+++++++++++o*$#O.. ++++++++++&&o*%$#oX..  &   .Xo#$%*%%#oXX..&&&  .XX@$%*%$@X..&&   && .X@#%*%#@X..&&   && ..O@$***%$@OX &&& XO@#$%%***%%$#@OX &&& XO#$%***%$@oX++&&&++Xo@$%*%%#O...&&   && ..O#*",
-"*%%#oX.. &&&o@#%*****%%$@oX. &  Xo#$%%***%$#X. &&   ..O#%%**%%#O.    &&&..o@$%%**%$#XX.&&.....O#%****%%#oX. &&&&Xo@$%%****%#@X++++++++++++X*#@X+++ &.....&&&&&o*$#o..   &&&&&...o@$*$@O...  &&&   ..o@$*$@O.  && & &&  .oO#*$@o.. &&& &&&  .X@#**%$@X... &&&..XXO#%**%%#oXX. &&& ..Xo#$**%#@X.  &   && ..@$*%%#@.. &&.  && ..O#*",
-"*%$@X... &&&XO#$*****%$#oX.  && Xo#$*****%#@X. && & ..@#%%**%$#O. & &&&&.XO#$****%#@X..&& ...XO#$****%$@X.. &&&&Xo@$%*****%$OX &+++&&...++X*#OX+++  XXXXX&&&&&o*#Oo+++++++++++++.o#*$OX+++++++++++++.o#*$OX+++++++++++++.o#*#OX+++++++++++++.o#*%%#@X..  &&& ..XX@$**%$@o..  &&& ...X@$*%%#O.. &&   && ..O#*%%#O &&+++++++&& O#*",
-"%%#@X..  &&&Xo@$%****%$@XX. & &&Xo@$%%**%%#O.. &&   ..O#$***%%#o. &  &&&..O#$%**%%#OX..&&   ..O#%%**%%#@X.. &&&&.o@$%****%%#@X&&+++&&...++X*#OX+++&.XOOoX &&&&o*#OX+++++++++++++.X@*$OX+++++++++++++.X#*#OX+++++++++++++.X@*$oX+++++++++++++.X@*%%#@ &&+++++++&& @#*%%#@ &&+++++++&& @#*%%#O &&+++++++&& O#*%%#@ &&+++++++&& @#*",
-"%%#O &&+++++ .O#%%**%%#@ &&+++++ .O#%%**%%#O &&+++++ .O#$%**%$#O&&++++++ .o#$***%%#O &++++++ .o#$%**%%#O &&+++++..O#%%****%#OX&&+++&&. .+&o*@X.+++.Xo@#@OXXX.X@*$@o.  ++.....+++XX#*$@o.  ++.....+++XX@*$@o.  ++.....+++XX#*$Oo.  ++.....+++.o@**%#@ &&+++++++&& @#**%$@ &&+++++++&& @#*%%#@ &&+++++++&& @#**%$@OoX..+++..XXO#$*",
-"*%#@ &&+++++..o#$%***%#@ &&+++++..o#%%**%%#@ &&+++++ .o@$%**%%#O &&+++++ .o#$%**%%$O &&+++++ .o@%%**%%#@ &&+++++ .o#$****%$#OX+++++&&+++.Xo*#X.+++.XO#$$#ooXXo@*$@o.  ++.....+++.o@*$#o.  ++.....+++.o#*$@o.  ++.....+++.o@*$@o.  ++.....++&.X#**%$#OoX..+++..XXO#$*%%$#OoX..+++..XoO#$**%$#OoX..+++..XoO#$***%$@OXX.+++.XoO##%*",
-"%%$@OX.&&+++&&o@$%**%%$@oX.&&+++&&o@$%***%$@oX.&&+++&&o@$%***%$@oX.&&+++&&o@$%***%$@oX.&&+++&&o@$%***%$@oX.&&+++& o@$%***%$@oX+++++&&+++.XO*@o.+++.X@$$$$@O@OO$*%#O.. ++.....+++Xo#*%#O.. ++.....+++Xo@*%#O.. ++.....+++Xo#*%#O.. ++.....+++Xo#**%%$#OXX.+++.XoO#$%**%%$#OoX.+++.XoO@$%**%%$@OXX.+++.XXO##%**%*%$#OX.+++.XO#$%%*",
-"**%$@oX&&+++&&XO#$***%%$@oX&&+++&&XO#%%***%$@o.&&+++&&XO#$***%%$@oX&&+++&&XO#$****%#@oX&&+++&&XO#%%***%$@oX&&+++&&XO#%**%%$Oo.+++++&&++&.X@*@X.+++Xo@$%%%%$$$$%*%#@.. ++...&+&  oO$*%#@.. ++...&+&  X@#*%#@.. ++...&+  .o@$*%#@.  +&...&&  .o@#***%%$#OX.+++.XO#$$****%%$#OX.+++.XO#$%%***%%$#OX.+++.XO#$%%***%%%$@oX+++Xo@#%%**",
-"*%%$@XX++   ++XO@%%***%$@XX++   ++XO@%%**%%$@oX++   ++Xo@%%***%$@XX++   ++XO#$%**%%#oX.++   ++XO@%%**%%$@XX++   ++XO#$%*%$@X..++++++++++.X@*@X.+++Xo@$%%%%$$$%%*%$@.. ++...++  .@#%*%$@.. ++...+&  .@#%*%#@.. ++...++...@$%*%#@.. ++...+& ..@$%****%%$@oX+++Xo@#%%*****%%#@oX+++Xo@#%%*****%%$@oX+++Xo@#%%******%$@oX+++.o#$%***",
-"*%%#@X.++. .++.o@$%**%%$@o.++   ++.o@$%**%%$@XX++   ++.o@$%**%%$@o.++   ++.o@$%**%%#oX.++   ++.o@$%**%%#@o.++   ++.o@$%*%#OX..++++++++++.o#*#X.+++.XO##$$####$$*%#@.. +++++++.Xo@$$*%#@.. +++++++.Xo@$%*%#@.. +++++++.XO@$$*%#@.. +++++++.XO@$%****%%$@o.+++.o#$%*******%$#o.+++.o#$%*******%$@o.+++Xo@$%*******%%@oX+++Xo@%%***",
-"%%$@...++...++ ..@$**%$OX. ++...++ ..@$**%#@.. ++...++...@$**%#@...++...++ ..@$**%#@.. ++...++ ..@$*%%$@...++...++...@$*$@O &&+++++&&  .Xo#*@o.+++.XoO@@@OO@@#$*%#@.. +++++++.XO@$%*%#@.. +++++++.Xo@#%*%#@.. +++++++.XO@$%*%#@.. +++++++.XO@#%*****%%#o.+++.o#$%*******%$#oX+++Xo@%%*******%%@oX+++XX#$%*******%%#o.+++Xo@%%***",
-"%$#O.  ++...++ ..O@*%$#O.. ++ ..++ ..O@*%%#O.. ++...++ ..O@*%$#O.  ++...++ ..O#*%$#O.  ++ ..++ ..O@*%$#O.. ++...++ ..O@*$@X&&&+++++&&&  XO@*#oX+++ .XXooo....X#*%#@.. ++&&&++.XXO@$*%#@.. ++&&&++.XXO@$*%#@.. ++&&&++.XXO@%*%#@.. ++&&&++.XXO@$****%%$@oX+++Xo@$%%******%$@o.+++Xo@$%*******%$@o.+++Xo@$%*******%$@XX+++Xo@$%***",
-"%$@o&&+++++++++&&o@*%$@o&&+++++++++&&o@*%$@o&&+++++++++&&o@*%$@o &+++++++++&&o@*%$@o&&++++++++&&&o@*%$@o&&+++++++++&&o@*#oX&&&+++++&&   XX@*#OX+++& .X.X.   ..@*%#O.. ++&&&++...Xo@*$#O.. ++&&&++...Xo@*$#O.. ++&&&++...Xo@*%#O.. ++&&&++..XXo@***%%$#OX.+++.oO#$%****%%$#Oo.+++.XO#$%****%%$#@XX+++.X@#$%*****%$#OX.+++.XO#$%**",
-"%#OX&+++++++++++&Xo*$@OX&+++++++++++&Xo*%#OX&+++++++++++&Xo*%#oX&+++++++++++&Xo*$@OX&+++++++++++&Xo*%#OX&+++++++++++&Xo*@o.+++. &&&&&...&&o*$@o  &++++++++++..O*$@o.  ++...& &  &&O*$@o.  ++...&    &&O*$@o.  ++...     &&O*$@O.  ++...   & &&O***%$#@oX.+++.Xo@#$%***%$#@oX.+++.Xo@#$%***%$#OoX.+++.Xo@#$%**%%$#@oX.+++.Xo@#$%*",
-"#@X.+++&&&&&&&+++.X*$@X.+++&&&&&&&+++.X*#@X.+++&&&&&&&+++.X*$@X.+++&&&&&&&+++.X*$@X.+++&&&&&&&+++.X*#@X.+++&&&&&&&+++.X*OX.+++ .&&&&&...&&X*$#O.  ++++++++++.X@*$@o.  ++...  &&&&&o*$@o.  ++... &&&&&&o*$@o.  ++...&&&& &&o*$@o.  ++...&&&& &&o**%%#@oX..+++..Xo@#$*%*$#@oX..+++..Xo@#%**%%#@oX..+++..XoO#$**%%#@oX..+++..Xo@#%*",
-"#OX.+++&&&&&&&+++.X*#OX.+++&&&&&&&+++.X*#OX.+++&&&&&&&+++.X*#OX.+++&&&&&&&+++.X*#OX.+++&&&&&&&+++.X*#OX.+++&&&&&&&+++.X*O &+++&&++++++++++X*%#@.. ++++++++++.X@*#oX+++++++++++++&&o*#oX+++++++++++++&&o*#oX+++++++++++++&&o*#oX+++++++++++++&&X*%%$@.. +++++++  .@$**%$@.. +++++++& .@$*%%$@.. +++++++  .@$**%$@.. +++++++  .@$*",
-"#O &+++++...+++++& *#O &+++++...+++++& *#O &+++++. .+++++& *#O &+++++. .+++++& *#O &+++++...+++++& *#O &+++++. .+++++& *O &+++&&++++++++++X*%%#@oX..+++&&..XX@#*#oX+++++++++++++&&o*#OX+++++++++++++&&o*#OX+++++++++++++&&o*#oX+++++++++++++&&o*%%#@. &+++++++& .O#*%%#@. &+++++++& .O#**%#@. &+++++++& .@#*%%#@. &+++++++& .O#*",
-"#O &+++++ . +++++& *#O  +++++ . +++++& *#O &+++++...+++++& *#O &+++++...+++++& *#o  +++++ . +++++& *#O &+++++...+++++& *O  +++&&++++++++++o**%%$#o..+++&&XoO#$%*#OX+++++++++++++&&o*#oX+++++++++++++&&o*#oX+++++++++++++&&o*$oX+++++++++++++&&o*%%#O. &+++++++&&.@#*%%#O. &+++++++&  @#*%%#O. &+++++++&&.O#*%%#O. &+++++++&&.@#*",
-"#O  +++++...+++++  *#O &+++++...+++++  *#O  +++++...+++++  *#O. +++++...+++++  *#O.&+++++...+++++&.*#O  +++++...+++++  *@X.   .   &  &&&  o****$#O..+++& o#$%***$@o.  &&  &     .XO*$@o.  &&  &     .XO*$@o.  && & &    .XO*$@o.  &&&   &   .XO**%$@X.. & &   ..X@#**%$@X.. & &   ..X@#*%%$@X..   & & ..X@$**%$@X.. & &   ..X@#*",
-"#@X.     .X.   & .X*#@X.     .X.   & .X*#@X.     X...    .X*#@X.     X...    .X*$@X.     .X.     .X*#@X.     X...    .X*#oX...... .     ..@***%%#O &+++.XO#%%***%#@...    .   ..Xo#*%#@..    . .  ..XX#*%#@..    . .  ..Xo@*%#@..     . . ..Xo#*%%$#XX... . ...XX#$*%%$#XX.... . ..XX#$**%$#XX... . ...XX#$*%%$#XX... . ...XX#$*",
-"$#oX. ...XoX.....Xo*$#oX. ...XoX.....Xo*$#oX. ...ooX.. ..Xo*$@oX. ...ooX.. ..Xo*$@oX. ...XoX.. ..XX*$#oX. ...ooX.. ..Xo*$#@OOOOOoOooooooO@#****%#@. +++Xo#$%****%$#@OoooooooOooO@@$*%$#@OOooooooOooO@#$*%$#@OOooooooOoOOO#$*%$#@OOooooooOooO@@$**%%$#@OOooooOOO@#$%**%%$#@OOoooOoOO@#$%**%%$#@OOoOooOOO@#$%**%%$#@OOoooooOO@#$%*",
-"%$#@OOOO@@@@@OOoO@@*%$#@OOOO@@@@@OOoO@@*%$#@OOoOO@@@@OOoO@@*%$#@OOoOO@@@@OOoO@@*%$#@OOOO@@@@@OOOO@#*%$#@OOoOO@@@@OOoO@@*%$$######@##@#@###$****%$#OoXXoO@#%%****%%$$###@#@#@####$$%*%%%$##@#@#@#@###$$%*%%%$##@#@#@#@###$$%**%%$##@#@#@#@###$$%***%%$$####@#@##$$%%***%%$$#####@###$$%%***%%$$###@#@###$$%****%%$$$########$$%%*",
-"%%$$#####$$$#####$%*%%$$#####$$$#####$%*%%$$#####$$$#####$%*%%$$#####$$$#####$$*%%$$#####$$$#####$$*%%$$#####$$$#####$%*%%%%$$%$%$$$$$$$%%%*****%$#@@@@#$%%*******%%%$$$$$$%$$%%%%***%%%$%$$$$$%$%%$%%***%%%$%$$$$$%$$%$%%***%%%$%$$$$$%$%%$%%*****%%%%%$%$%$%%%%******%%%%$$$%$$%%%%%*****%%%%$%$%$%$%%%%*****%%%$%$$$$$%%%%***",
-"************************%%%%$$$%$%%%%*******%%%$$$%%%***************%%%$$%%%*********%%$$#$$$%**********%%%%$$$$%$%%%*****************************************************%*%%%%*%******%%$$$$%%%***************%%%$%$%*%********%%$$##$$%***********************************%%%$%$%*********%********************%%%%%%%*******",
-"**%%%%%%%%%%%%**********%%###@@@@###%%*****%%#@@@##$%**************%$$#@@#$%********%%$#OOO@#$%%********%%##@#@@@###%%%*********%**%%**********************************%%%%$$$$%%******%%$@@@##$%%************%%%$#@@#$%********%%$#OOO@#$%%************%*%*%***************%%$#@@$$%%*****%%%%%%%****************%$$###$%%*****",
-"%%$$#######$$%%%*******%$#@OooooOO@@#%%****%$#oooO@#$%************%%$@@oo@#$%*******%$#OoXXO@#$%******%%$#@OooooOO@@$$******%%%%%%%%%%%*****************************%%%$$####O@@$$%****%$@oooO@#$%************%%#@@oo@#$%*******%$#OoXXO@#$%********%%%%%%%%%%%************%%#@@oo@#$%***%%$$#$$$%%%************%%$@Oooo@$$%****",
-"$$@@OOOOOOO@@##%%%***%%%#@..&&&.. ..@$%***%%#@.   .@#%%**********%%#OoX&&oO#%%*****%%#OX&&&..@#%%*****%%#@..&&&.. ..@$%****%%%#@$$###$$%%*************************%%$$#@@OOOoXoo@$%***%%#@.   .@#%%**********%%#OoX&&oO#%%*****%$#OX&&&..@#%%******%%$#@$$$@#$%%%*********%%#OoX&&oO#%%*%%##@O@O@#$$%**********%%$@OXX.XOO#$%%**",
-"#@OoXXXXXXXooO@@$%%***%##O. &&&    .@#%***%%#O &   o@$%**********%$@o..&&XO@%******%$@XX+++ .o@$%%****%$#O. &&&    .@$%****%$#@O@@@OO##$%%*****%%%%******%%%%*%***%$#@OooXXXX..XO#$***%%#O &   o@$%%********%%##o..&&XO@%%*****%$@XX+++ .o@$$%*****%$#@O@@#OO@#$%%******%%%#@o..&&XO@%%*%#@ooXXooO@#$%*********%$@OXX...XoO#$%**",
-"#..&+++++++&&XXo@#%*%%$@OX  +++  & .O#%****$#O &&& XO#$%********%$#OX..+&XO@%%****%$#OX.+++  XO#%%***%$#Oo  +++  & .@#%***%%#@ooOoOXXO@#$%****%%$%$%%%**%%%$%%%*%%$@@o. ++++&+++o@$***%$@O &&& XO@$%%%****%%%$@OX..++Xo@$%%**%%$#oX.+++  XO@$%%**%%$#@ooOOooXO@@$%%***%*%%##OX..++Xo@$%*$#O&&&+& ..@#$%*%*****%$#@X&+++++&oO#$%*",
-"@..++++++++&&..XO@$*%$#oX.&++++++..XO#$***%%#@X.&+&.X@$%%******%%#@o&&+ .oO#%%*****$#o&&   &&.Xo$%%**%$oX.&++++++..o@$%***%$@O&&.X.&&.Xo#$**%*%$####$%%%$##@#$%*%$@OXX  ++++++++Xo#*%%$#@oX.&+&.XO@$$%%**%%$#@OX&++ .Xo@#%%**%$#OX&&   +&.XX#$%**%$#Oo&&X.X&&..X@$%**%%$$#@OX&&+ .Xo@#%*$@o&++++  .O@#$%%****%%$@oX+++++++Xo@$%*",
-"OX.+++&&&&&&&+++Xo#*%$OX..&&+++++...o@$**%*$#Oo.&&&..o@$%%****%%$@oX+++ .XO#$%***%%#@o&& & +&.XX#%%*%%#oX.&&+++++.XX@$%**%%#@o&&...&&..X#$%**$$@X.X@##$##@.XX@$*$#O &&++&&&+++++.X@*%%#@oXX.&+&..XOO@#%*%%#@OoXX+++  XXO@#$*%$#OoX&+ & +&...O@$*%$#OXX+&...&&...O@$*%%##@OoXX+++ ..Xo@#*$@o&&&++&  .X@@$$%%*%*$#X..++.  ++..X@%*",
-"OX.+++&&& &&&+++.X@*$#O...+++++++...oO#**%%$@OX.&+&..oO@$$%**%%$@Oo.+++..Xo@$$***%$#OX&&  &++..X@$%*%%#o..&&+++++..o@#%**%$@OX&+...+& ..@#%*%%#O...oO@@@Oo...O#*$@o &&++&&&+++++.X@*%#@oX...&+&..XXXO@#*%#@OXX..+++ ..XXo@#*%#@oX.&+   ++ ..oO#*%#@oX.++...&& ..XO#*$$@OoXX..+++  .XXo@*$@o&&&++&  ..oo@#$%**%$@X. ++ ..++ .X@$*",
-"O..+++&&&&&&&+++.XO*$@o&++&&...&&+++..@*$#O &&++&&&&&+++Xo#*$#O &&++&&&&&+++Xo#*$#o &&++&&&&&+++Xo#*$#o&&+++ &&&&+++Xo#*$#o&&&++&&&&&+++Xo@*%$@O.  XXoooXX  .o#*#OX&&&++&&&+++++.XO*$@O&&&++...&&++&..@*$@o&&+++...&&++&..@*$@o&++++...&&+++..@*$@o&&++&.X.&&+++..@*$#..&&&++ ..++++&..*$#o&&&++&&& .XXoO@#*%%#@.. ++ . ++ ..@$*",
-"@X.+++  .....+++& O*#OX&++&&...&&+++ .@*$@o &&++&& &&+++.X@*$@o &&++& &&&+++.X@*#@o&&+++& &&&+++.X@*#@X&&+++& &&&+++.X@*#@o&&+++& &&&+++.X@*%$OX+++&&XX.&&++&o@*#oX+++     &&+++& o*$OX&++++..X&&+++ .@*$@X&++++... &+++ .@*$OX&++++.X.&&+++ .@*$OX&++++.X. &+++ .O*#@..&&+++.. +++++ .*%@O.  +++++++++&Xo@**%$@.. ++   ++ ..@#*",
-"@o.+++  .X.X.+++& o*#OX+++++ .  &+++ .O*#OX&&&++   &&+++.XO*#OX&&&++   &&+++.XO*#OX&&+++   &&+++.XO*#OX&+&++   &&+++.XO*#OX&++++   &&+++.XO*%$@X&+++&...&&+++o#*@X.+++     &&+++& o*#OX+++&&.X.. +++..O*#OX+++& .XX  +++..O*#OX+++&&..X. +++..O*#OX+++&&.XX. +++..O*#O. +++&&...&&+++..*%#O.  ++++++++++.X@**%#@.. ++   ++ ..O#*",
-"O. +++++   .X &&&&o*#oX+++++ .   +++..O*#o.+++ .XXX..+++& o*#oX+++ .XXX..+++& O*#o.+++  XXX..+++& o*#o.+++ ..XX..+++& o*@o.+++  XXX..+++& o*%$#OX..+++++++..XO#*@X.+++..+++  &&&&&o*#OX+++ .XOoX.+++.XO*#oX+++ .XOoX.+++.XO*#oX+++ .XooX.+++.XO*#oX+++ .XooX.+++.XO*$#OX&&+&&...&&+++Xo*%#@.. ++.....&&&&&o**%$@.. +++++++ ..O#*",
-"O. +++++  .X.  &&&X*#OX+++++&&&..+++.XO*@o.+++ .XooXX+++& o*@X.+++..XooXX+++& o*@o.+++ .XooXX+++& o*@o.+++ .XooXX+++& o*#o.+++ .XooXX+++& o**%#Oo..+++++++.XX@$*@X.+++..+++  &&&&&X*#oX+++ .oOOXX+++.X@*#oX+++ .oOOoX+++.X@*#oX+++ .oOOoX+++.X@*#oX+++ .oOOoX+++.X@*%#OX&&&&&...&&++&XO*%#@.. ++.....&&&&&o*%%#@.. +++++++  .o@*",
-"O. +++++  .XX &&&&X*@oX+++++&&+..+++.X@*@X.+++XoO##Oo  &&&X*#X.+++XoO##Oo  &&&X*@X.+++.oO##Oo  &+&X*#X.+++.oO##Oo  &&&X*@o.+++XoO##Oo  &&&X*%%$#oX.+++++++.XX#$*@X.+++..+++  &&&&&o*#oX+++..o@OoX+++.X@*#OX+++ .oOOo.+++.XO*#OX+++..o@OXX+++.XO*#OX+++ .oOOo.+++.XO*%$#OX..++   ++..XO#*%#@.. ++.X.X.&&&&&o*%%#@.. +++++++  .o@*",
-"O. +++&&...XX  &&&X*#OX+++&&+++..+++.X@*@X.+++.o@##@o  &&&X*@XX+++.o@#$@o. &&&X*@o.+++Xo@##@o  &&&X*@XX+++Xo@##@o  &&&X*@X.+++.o@##@o  &&&X***$#OX.&&+++&&.XO#%*@X.+++. +++.. &&+&X*#oX+++..o@OXX+++.X@*#oX+++..o@OoX+++.X@*#oX+++..o@@XX+++.X@*#oX+++..O@OoX+++.X@**%$@X..++& &++.XX@$*%#@.. ++..X..&&&+&X**%$@.. ++...&&+++Xo*",
-"O..+++&&..XXX  &&&o*#oX+++  +++ &+++.X@*@X.+++Xo@#$@o  &&&o*@X.+++Xo@##@o.& &&o*@X.+++.o@$#@o  &&&o*@X.+++Xo@$#@o  &&&X*@X.+++Xo@$#@o  &&&o*%*$#OXX&&+++&&.oO@$*@X.+++..+++..&& +&o*#oX+++..O@@XX+++.X@*#OX+++..O@@XX+++.X@*#OX+++..O@OXX+++.X@*#oX+++..O@OXX+++.X@**%%$#OX&&+++& XO#$%*%#@.. ++.....&&&&&o*%%#@.. ++... &+++.X*",
-"@o.+++ .XXooX&&&&&X*#oX+++ &+++  +++.X@*@X.+++.o@##@o  &&&X*@X.+++XX@##Oo  &&&X*@X.+++XoO##@o  &&&X*@X.+++.o@##@o  &&&o*@X.+++.o@##@o  &&&X**%$@.. ++&&&++ .X@$*@o.+++++&  ..+++&&X*#OX+++ .oOOoX+++.X@*#OX+++ .o@OoX+++.X@*#oX+++ .o@OoX+++.X@*#OX+++ .o@OoX+++.X@***%%#@o&&+++&&oO$%%*%#@.. +++&+&&+++ .o*%%#@.. ++.X...+++.o*",
-"@oX+++  XXXXX&&&&&o*#oX+++     +++++.X@*@X.+++..oOooX&+&&&o*#o.+++..oOooX&++&&o*#X.+++..oOooX&&+&&o*@o.+++..ooOXX&+&&&o*@X.+++..oOooX&++&&o*%$#O.. ++&&&++ ..O#*@o.+++++&  ..+++&&o*#oX+++..OOOo.+++.X@*#OX&++..oOoo.+++.X@*#OX+++..oOOXX+++.X@*#oX+++..oOOX.+++.X@****%$@oX.+++.XO#$%**%#O.. ++++++++++..@*%%#O.. ++...X.+++.o*",
-"#XX+++ ..XXX.&&&& O*#OX+++   & +++++.XO*#o.+++..XXXX.&++& O*@o.+++..XXXX.&+&& o*#oX+++..XXXX.++&& O*#oX+++..XXXX.+++& O*#o.+++..XXXX.+&+& O*%$#O.. ++&&&++  .o#*@o.++++&&  ..+++& O*$@X+++..XXXX.+++XX#*#@X&++..XXX..+++.o@*$@X+++ .XXXX.+++.X@*$@X&++ .XXXX.+++XX#****%$@OX.+++.XO@$%**$#O.  ++++++++++.X@*%$#O.. +&.....+++.X*",
-"@X.+++& .... +++.XO*#oX+++  &  +++++.X@*#OX&&&+&...  +++.XO*#OX&++&&...  +++.XO*#OX&&+&&... .+++.XO*#OX&&&+&.... +++.XO*#OX&&&+&... .+++.XO*%$OX+++& .X.  ++&o@*#oX+++++     +++.XO*$@o &&++.... +++Xo#*$@o &&++.....+++Xo#*$@o &&&&.... +++XO#*$@o &&+&.... +++Xo#****%$@o..+++..o@#%%*$@o. &++&&&&&..XoO#*%$@o. &++    &+++.o*",
-"Oo.+++&&...  +++XX@*#oX+++ &...+++++.X@*$@o&&+++  .  +++.X@*$@o&+++&  .  +++.X@*$@o&&&++ .   +++.X@*$@o&&++& .   +++.X@*$@o&&+++ .   +++.X@*%$OX+++ .XXX. +++O@*#OX+++++    &+++.X@*$#O &&&+..   +++XO#*$#O &&+&...  +++XO#*$#O &&++...  +++XO#*$#O.&&++..   +++XO#**%%$@OX. +++ .XO@$%*#OX  &++&&&& XXo@#$*%#@X  &++& &&&+++.X*",
-"O &++++++++++&  XO#*#XX+++++... &+++.X@*$#OX..&&+++++  .oO#*$#OX..&++++++&  oO#*%#OX..&++++++  .oO#*$#OX..&++++++  .oO#*$#OX..&++++++&  oO#*%$#OX..XoOOOoX..XO#*#OX&&&+++++++&  oO#*%#@X..+++++++&& X@#*%#@X..+++++++&& X@#*%#@XX.+++++++&& X@#*%#@X..+++++++&& X@#**%%#o..+++++++.XX#%*#oX+++++&&&XXoO##%%*%#o.+++++&&&+++++XO*",
-"O &++++++++++  .O@$*#XX+++++...  +++Xo@*%$#OX.&&+++++ ..O@$*%##oX.&&+++++  .O@$*%$#OX.&&+++++ ..O@$*%$#OX.&&+++++ ..O@$*%$#OX.&&+++++  .O@$**%#@oXXO@###@OXXX@$*$@o&&&+++++++  .O@$*%%#OX.+++++++&  o@$*%%#OX.+++++++&  O@$*%%#oX.+++++++&& o@$*%$#OX.+++++++&& O@$**%%#o..+++++++..o#%*#o.+++++&& XO@#$%%**$#oX+++++  &+++++XO*",
-"@.&++++++++++ ..@#%*#OX+++++XXX. +++XO#*%%#@oX&&+++++..X@$%**%#@oX&&+++++...@#%*%%#@oX&&+++++..X@$%*%%#@oX &+++++..X@$%*%%#@oX&&+++++...@#%*%*$#OOO#$$%$$#OOO$$*$@o &&+++++++...@#%*%%$@oX+++++++& .@#%*%%$OoX+++++++& .O$%*%%$OoX+++++++  .@#%**%$OoX+++++++  .O$%**%%#oX.+++++++.Xo#%*#OX+++++  .O#$%%****%#oX+++++   +++++o@*",
-"@OoXXX.XX.XXXoo@#%%*$#OoXXXXoOOOoXXoO@$**%%$#@oXXXXXXoO##%%*%%%##@oXXXXXXoO@#%%**%%$#OOXXXXXXoO##%%**%%$#@oXXXXXXo@@$$%**%%$#@oXXXXXXoO@#%%***%%$$$%%%*%%%$$$%%*%#@....X.XXXXoO@#$%**%$$@OoXXXXXXoo@#$%**%%$#OoXXXXXXXOO#$%**%%$@OoXX.XXXoo@#$%**%%$#OoXXXXXXXOO#$%***%$#@oXXXXXXXoO#$%*$#OoXXXXXoO#$%%*****%$#OoXXXXXXXXXXXo@#*",
-"$#OOoOoooOooO@@$$%%*%$@@OOO@@##@@@@@#$%***%%$##OOoOO@##$%%****%%$#@@OooOO@##%%%***%%$#@@OoOO@##$%%****%%$#@@OoOO@@#$%%****%%$##OOooOO@##$%%****%%%%%%***%%%%%%%*%#@X..ooOooOO@#$$%****%%$#OOooooO@@#$%****%$##OOooooO@@#$%%**%%%$#@OOOooO@@#$%%***%$##OOooooO@@#$%%****%$#@@ooooO@@#$%%*%$@@OoOO@##$%%*******%$@@OoOOO@OOOOO@#$*",
-"%$$#####@####$$%%***%%$$####$$%%$$#$$%%****%%%$$#####$$%%******%%%$$#####$$%%******%%%$######$$%%******%%%$######$%%%******%%%$$#####$%%%*******%*%*******%%****%%$##@@@#####$$%*******%%$$#######$%%%******%%$######$$%%%*****%%$$#######$%%%******%%$######$$%%%****%%%%$$#####$$%%%**%%$$#####$%%%********%%$$######$####$%%*",
-"*%%%%$%%$%$%%%%%******%%%%%%*%%%%%%%%*******%%%%%%%%%%%*********%%%%%%%%%%%*%********%%%%%%%%%%*********%*%%%%%%%%%*********%%%%%%%%%%%*************************%%%$$$$$$%%%%%%%*********%%%%$%%%%%*********%%%%%%%%%%%%********%%%%$%$%%%%*********%%%%%%%%$%%%********%%%%%$%$%%%%******%%%%%%%%%************%%%%%%%%%%%%%%%**",
-"*****%%%%%********************%%*%**************%%%%******************************************************%%%%%$%***************************************************%%%%%%********************%%%%%************%%%%%*********************************%%%%%********************%%%%%%************%%%%****************************",
-"****%%%$$%%%****************%%%%$$%%***********%%%$$%%***********%**%*%**%*******************************%%$###$$%%*************************************************%%%$$%%%*****************%%%$$$%%**********%%%$$%%******************************%%%$$%%%*****************%%%$$%%%%********%%%%$$%%**************************",
-"**%%%$####$%****************%$####$%%********%%$####$$***********%%%$%$$%%%***************%*************%%$#@OO@#$%***********************************************%*$$####$%*****************%$####$$%********%%#####$%***********%****%**%*******%%%$####$%*****************%$####$%%********%$####$$%***********%****%*%******",
-"***%@@O..@#$%%***********%%%$@OO..#$%%******%%$#@X.X@#%%*******%%%#@@@##@#$%%********%%%%%%%%%***********$#XX  .O#$%***********************************************%#@O..@#$%%*************%%$#@..O@#%%******%%#@X.X@#$%*********%%%%%%%%%%********%@@O..@#$%%*************%%$#@..o@#%%*****%%$#@X.X@$%%*********%%%%%%%%%%*****",
-"*%%%#Oo..oO#$%***********%%##ooX..##%*******%$#Oo...O#$%******%%$#@ooooooO@$%%*****%%%$$$$$$$$%%*******%%$@X.&& O@$%%********************************************%%%@Oo..oO#$%*************%$#@o..oO@%%*****%%$@O...o@#$*******%%%$$$$%$$$%$%%***%%%#Oo..o@@$%*************%$#@o..oO@%%*****%$#Oo...O@$%*******%%%$$$$$$$%%%****",
-"**%%@OX  XoO#$%**********%$#OXX...@#%%*****%%#OoX  .XO#$%****%%$@OoX.XXXXoO#$%****%%$##@@######%%******%%#O..&&&o@#$*********%******%****************%***%********%%@OX  XoO@$%***********%$#@oX  XO@%%*****%$#OX.  Xo@#%%****%%$##@#######$%%%***%%@OX  XoO#$%***********%$#@oX  XO@%%****%%#OoX   oO#%%*****%%$##@@######%%***",
-"**%%#@o && .O#%%********%%#OX&&&.X@#%%*****%$@O&++++.X@$%****%$#XX.++++++&XO#%%***%%@oo..OOO..#$%******%%#O.&. ...#%%*****%%%%%%%%%%%%%%%********%%%%%$%%%%%******%%$@o && .@#$%*********%%#@.. &&o@#%%****%%#@..+++&&O@$%****%%@Oo..O@O..OO#%%***%%#@o &  .@#%%*********%%#@...&&o@$%%****%$@O&++++.X@$%*****%%@Oo..OOO..#$%***",
-"**%%$@o &&  o@$%*******%%#@XX+++.X@$%****%%$#OX&++++..O#%%***%$@X. ++++++&XO@%***%%#OoX..oXo .@#%%*****%$@o &  ..X@$%%****%%$$#$$$$$$#$$%%%****%%%$#$#$##$$$%%****%%#@o &&& o@#$%*******%%#@o.  &&o@#%*****%$@O. +++&&o@#$%**%%$OoX..ooo..oo@$%***%%$@o&&&& O#%%********%%#@o.  & O@$%****%%#@X+++++..@$%%***%%$OoX..oXo .@#%%**",
-"**%$#Oo..&&&oO#%%*****%%$@O..&  XX@$%*****%$Oo.   ..& O#$%**%%#O.    &&& .X@#%%**%$#oX.. .....O@$%****%$#@X. &&&Xo@$%***%%$@OOOO@@@OOOOO#$%*%*%$$#@OooOOOO@@$$****%%#@o..&&&.o@#$%****%%$#@oX&&&..X@#$%**%%%#@X &     .oO$%**%%#OoX  .... XXO#%****%$@o..&& o@$%*******%%$@oX&&&XX@#%%****%$OoX &    .@#%%***%%#OXX  .....@#%%**",
-"*%%$@OX..&&&Xo@#%%***%%##OX. && .oO#%%***%$#oX.    .& o@$%***$#O. &  &&& .XO#%***%$#oX.   .. .o@$%***%%$@oX &&&&XXO#%%**%$@OoXXXoooXXXXXO@#*%%$#@OoXXX.XXXXo@#%**%%$@OX..&&&.XoO#$%**%%$#@oX.&&&..Xo@$%***%$@oX&&   & .Xo#$**%$@oX. ....  .Xo@$***%%#@o..&& X@#%******%%$#oX.&&&Xo@$%****%%$OX. &  . .@#%****%%#OX.  .....O#%***",
-"*%$#OXX..&&&.XO#$%***%$#OoX   & .Xo@$%***%#@X..&&.  &&XO#%%*%%@O. &  &&&  oO#$**%%#@X..&&   & o@#%%**%$#OX. &&&&.Xo@$%%*$#OX....XX.X...XXO@*%#@OoX........XXo@$**%#@OXX..&&&..XXO@$**%#@OXX..&&&..XXO@$*%%#@OXX&&   & ..XO#*%%#@X.. &...& ..XO#***%$#OX..&&&XO#%%*****%$#Oo..&&&Xo@$%****%%#oX. &  . .@#%****%%#oX. & . ..@$%%**",
-"%%#@. &++++++&XO#%%*%%$O.&&++++++&oO#$%*%%#O.&&+++++++Xo#$%*%%@o &&+++++++Xo#$%*%%#O &&+++++++Xo#$%*%%#@  &++++++&XO#%%*$OX+++++++++++++  O*$#O   ++++++++++Xo#*%$#O. &+++++++&  O#*%$#O. &+++++++&  O#**$#O &&+++++++&& O@*%$@o. &+++++++&& O@**%%$oX.+++++XO#%******%$oX.+++++Xo#%*****%%#o..+++++Xo@$%****%%#o..+++++Xo@$%***",
-"%%#O &&+++++++Xo@#%*%%#O &&+++++++Xo@$%*%%#o &&+++++++.o@#%*%$#o&&&+++++++Xo@#%*%$#O &&+++++++XX@#%*%%#O &&++++++&Xo@#%*#OX+++++++++++++& X*$@o &&++++++++++.o@*%$@o &&+++++++&& oO*%#@o&&&+++++++&& X@*%$@o &&+++++++&& X@*%#@o&&&+++++++&& X@***%$oX.+++++Xo#$%*****%$OX.+++++Xo#$%****%%#oX.+++++.o@$%****%%#oX.+++++.o@$%***",
-"%$#o. &   . ++..X#%*%$@o. &   . ++..X#%*%$@O  &     ++..X#%*%%#O.     . ++ .X#%**$@o. &     ++ .X#%*%$#o. &     ++..X#%*#@X  && +++     ++X*#XX+++&&...&&+++.X@*%#OX+++&&...&&+++Xo*%#XX+++&&...&&+++Xo*%#OX+++&&...&&+++.o*%#XX+++&&...&&+++.o***%%#@XX.+++Xo#%******%%#@XX.+++Xo#$******%$#OXX.+++Xo@$%*****%$#Oo..+++Xo@$%***",
-"%$@o  &    .++ .X@$**$#o  &    .++ .X@$*%$@O. &  . .++ .X@$*%$@O..&    .++ .X@$*%$#o  &  . .++ .X@$*%$@O  &  .. ++ .X@$*#OX  &  +++  .. ++X*@o.+++ .XXX  +++.o@*%@OX+++&&. .&&+++.X*$@o.+++&&. .&&+++.X*%@OX+++&&. .&&+++.o*$@o.+++&&. .&&+++.o***%%$@oX.+++Xo@%%*****%%$#oX.+++Xo@%%*****%%$@oX.+++Xo#%%*****%%#@OX.+++Xo#$****",
-"%$@o  &  .  ++ ..@#*%$@o  &  .  ++ ..@#*%$@o  &  .  ++ ..@#*%$@o.    .  ++ ..@#*%$@o  &  .  ++ ..@#*%$@o  &     ++ ..@#*#OX && &+++   . ++X*@X.+++.XXOooX  .XO#*$@XX+++&&...&&+++.X*$@X.+++&&...&&+++.o*$@XX+++&&...&&+++.X*$@X.+++&&...&&+++.X****%%$Oo.+++Xo#$*******%$#@o.+++Xo#$*******%%#Oo.+++Xo@$*******%%#Oo.+++Xo@%%***",
-"%$@o &&+++++++ ..@#*%$@X &&+++++++ ..@#*%$Oo&&&+++++++ ..@#*%$@o &&+++++++ ..@#*%#@o &&+++++++ ..@#*%$@X &&+++++++ ..@#*@X.+++++++++++++++X*@X.+++.XoOOoX. .o@#*$#X.+++++++++++++.o*$@X.+++++++++++++.o*$#X.+++++++++++++XX*$@X.+++++++++++++.o*****%$@oX+++XX#$%*******%$@oX+++Xo@$%******%%$@oX+++Xo@%%*******%$@oX+++Xo@%%***",
-"$#OX&&&+++++++ ..O#*$#OX&&&+++++++ ..O#*%#OX&&&+++++++ ..O#*%#OX&&&+++++++ ..O#*%#OX&&&+++++++ ..O#*$#OX&&&+++++++ ..O#*OX.+++++++++++++++X*#X.+++..ooOoo.X.XO#*$@X.+++++++++++++.o*$@X.+++++++++++++.X*$@X.+++++++++++++.X*$@o.+++++++++++++.o****%%$Oo.+++Xo@$%******%%$Oo.+++.o@$%******%%$Oo.+++Xo@$%%*****%%#@o.+++Xo@$%***",
-"%@X.+++ ....++ ..@#*%@o.+++ ....++ ..O#*$#X.+++ ....++ ..O#*$#o.+++ ....++ ..O#*$@X.+++ ....++ ..O#*%@o.+++ ....++ ..@#*o&&&&&..+++&&&&&&&X*#oX+++  .XX.X...XX@*$@X.+++++&&&&&&&&.o*$@X.+++++&&&&&&&&.o*$@X.+++++&&&&&&&&XX*$@X.+++++&&&&&&&&.o***%%$#Oo.+++.X@#$%*****%$#Oo.+++XX@#$%*****%$#Oo.+++.XO#%%*****%$#OXX+++.XO#$%**",
-"$#o.+++.  ..++ ..O@*$@o.+++.  ..++ ..O#*$@o.+++.  ..++ ..o#*$#X.+++.  ..++ ..O#*$#o.+++.  ..++ ..o#*$#X.+++.  ..++ ..o@*o&&&&+..+++&&&&&&&X*#OX&&&+++&&&&+++&.@*$@o.+++++&&&&&&&&.X*$@X.+++++&&&&&&&&.X*$@o.+++++&&&&&&&&.o*$@X.+++++&&&&&&&&.o***%%#@oX.+++.Xo@#$%**%%%#@oX.+++.Xo@#$%**%%%#@oX.+++.Xo@#$%**%%%#@oX.+++.Xo@#$%*",
-"$@X.+++ ....++  .o@*$@X.+++ ....++  .o@*%@X.+++ ....++  .o@*$@X.+++ ....++  .o@*$@X.+++ ....++  .o@*$@X.+++ ....++  .o@*o&&&&&..+++&&&&&&&X*$@O&&&++++++++++  @*$@o.+++++&&&&&&&&XX*$#o.+++++&&&&&&&&Xo*$#o.+++++&&&&&&&&.o*$#o.+++++&&&&&&&&.o*%%%#@OXX.+++..Xo@#$**%%#@OXX.+++..Xo@#$**%%#@OXX.+++.XXo@#%**%%#@OX..+++.XXo@#%*",
-"$@o.++++++++++++&XO*%@o.++++++++++++&XO*$#o.++++++++++++&XO*$#o.++++++++++++&XO*$@o.++++++++++++&XO*$#o.++++++++++++&XO*o&&+++++++++++++++X*%#@oX. &+++&&&  XO@*%#OX+++++++++++++Xo*$#OX+++++++&+++++.o*$#OX&++++++++++++Xo*%#OX+++++++++++++.o**%$#.  &&+++&&  .@$*%%$#.  &&+++&&  .@$*%%$#.  &&++++&  .@$*%%$#.. &&++++&  .@$*",
-"%#o.+++++++++++++XO*%#o.+++++++++++++XO*$#o.++++++++++++&XO*$#o.+++++++++++++XO*%#o.++++++++++++&XO*$#o.+++++++++++++XO*O &+++++++++++++++o**%$#@X.&+++&& ..O#$*%$@o&++++++++++++Xo*%$@o&++++++++++++Xo*%$#o &&++++++++++Xo*%$@o&++++++++++++Xo*%%#@. &&+++++&& .@#**%#@. &&++++++& .@#**%#@. &&++++++& .@#**%#@. &&+++++&& .@#*",
-"$#@o  &&&&&&&&&& o@*$#@o  &&&&&&  && o@*%#@o  &&&&&&  && o@*%#@o  &&&&&&  && o@*$#@o  &&&&&&  && o@*%#@o  &&&&&&  && o@*OX.&&&&& ..&&&&&.oO***%%#O..+++& XO@$%%*%$#OoX. &&&&&&...o@*%%#OoX.&&&&&&&..Xo@*%$#@oX. &&&&&&..XO@*%$#@oX. &&&&&&..XO@**%$@.. &&&&&&&  .O#*%%$@.. &&&&&&&  .O#*%%$@.. &&&&&&&  .O#*%%$@...&&&&&&&  .O#*",
-"%$@O.  &&&&&  && o@*%$@O.. &&&&&  &  o@*%$@O.  &&&&&  &  O@*%$@O.  &&&&&  &  o@*%$@O.  &&&&&  &  o@*%$@O.  &&&&&  &  O@*#oX &&& ...&&&  oO@***%%#OX.+++& o@$%%***%$#@oX. &&&&&.Xo@#*%%$#OoX &&&&&&.XX@#***$#@Oo. &&&& .XX@#**%$#@oX.  &&&&.XXO#**%$@X..&&&&&&& ..@$**%$@X..&&&&&&& ..@$**%$@X..&&&&&&& ..@#**%$@X..&&&&&&& ..@#*",
-"%%$OX..      . ..@#**$$@...     .. ..@#*%$$OX..     .. ..@#*%$$OX..     .. ..@#*%%#@X..     .. ..@#*%$$OX..     .. ..@#*#@o..   XXX.   .O@$***%$#O &+++..O#$%*****%$$@@..    .XoO#$***%$#@O.     .XoO#%***%%$@O..    .oo@#%***%$$@@..    .XoO#%*%%$#oX. &     ..X#$*%%$#oX. &     ..X#$*%%$#oX. &     ..X#$*%%$#oX. &     ..X#$*",
-"*%$#@@OoooooooOO@#$**%%##OOooooOoOOO@#$**%%#@OOooooOoOOO@#$**%%#@OOooooOoOOO@#$**%%#@OOooooOoOO@@#$**%%#@OOooooOOOOO@#$*%#@@OOOOOO@OOOO@#$$****%#O &+++.o@$%*******%%$#@@OoOoO@##%%****%%##@OOoooO@@$$%***%%%$#@OOooOO@#$%%****%%$#@OOOoOOO#$$%***%$#@OOoooooOO@@#%***%$#@OOoooooOO@@#%***%$#@OOooooooO@@$$***%$#@OOooooooO@@$%*",
-"**%%$##@#@@@#@##$%%***%$$$##@#@#@###$%%***%%$$##@#@#@###$$%***%%$$##@#@#@###$%%**%%%$$##@#@#@###$%%***%%$$#@#@#@@###$%%*%%$#@###$#######$%****%%$#OoXXoO@#%%********%%$$##@####$%%******%%$###@###$$%%******%%%$###@###$%%******%%$$###@##$$%%****%%%###@@@@@@##$%%***%%%###@@@#@@##$%%***%%%###@@@@@###$%%***%%%###@@@#@###$%%*",
-"**%%%%%$$%$$$$%$%%*****%%%$%$$$%$%$%%%****%%%%$%$$$%$$%$%%****%%%%$%$$$%$%$%%%****%%%%$%$$$%$$$%$%****%%%%%$$$$%$$%$%%%**%%%%$$$%%%$$$%%%%*****%%##@OO@@$$%***********%%$%$$$%%%*%*******%%%$$$$$%%%%********%%%%$$$%%%%**********%%$$$$$%$%*%*****%%%%$%$$%$$%%%******%%%%$%$$$$$%%%%*****%%%$%$$$$$$%%%%*****%%%%$$$$$$$%$%%**",
-"**%%%%$$%$%%$%$%*%*********%*%*%*%************%*%**********************%**%************%%%%$%%*************%*%%%%%************************************************************************%***********************%%*%***************%%%*%**************************************%*%******%%%$%%%%*******************************",
-"*%%$##########$$%%********%%%$%$%%%%*********%%%%%%%******************%%$%%%%*********%%$##$$%%************%%$%$%$%%%%*****************************************************************%%%%%%%%*****************%%%$$$%%**********%%$%$$%%***********************************%%%%$%%%***%%$####$%%******************************",
-"%$#@@OooXooOoo@@#$%****%%%$###@###$%%%*****%%$$##$$%%***************%%$####$%********%$#@Ooo@#$%*********%%$#@#@###$%%%****************************************************************%$####$%***************%%%###@@$$*********%%$#@##$$%********************************%*%$###$$%***%#@OooO@#$%*****************************",
-"%#@oXXX..XXX.XXO@#%*****%##@OOoOOO##%%****%%$#@OO@#$%%*************%%$@@OO@#$%%*****%$#@oXXXo@#$%*******%$$@OOooOO@@#$%******%*%**%*%%*************%*%%******************************%%$#@@O@#$%%**************$$@OOoO@$%%******%%#@OooO@#%%*********%*%*%**%*%************%$$@@OO@#$%%*$@OX.XXo@#%%***************%*%*%*%*%****",
-"$@..+++++&+&++  .@$**%%%$@O  . . .oO#%%****%@Oo&&Xo@$$***********%*$#@oX++oO#%%*****%$@X.+++.X@$%%******%$@X.&&&...XX#%****%*%%$%%%%%$%%%**********%%%$%%%***************************%%@OX&&Xo@#%%**********%%%#@...& O#%%****%%%#@X.&&&o@#%%*****%*%%%$%%$%$%%%%*******%*%%$OoX++oO#%%*#OX++++&o@$%%***********%%%%%$%%%$%%%***",
-"#@. +++++&+&++& .@#**%%$@Oo&&     XO@%%***%%@oX&&.Xo@$%%*********%%$@oX.++XO@%****%%$#o. +++ .o#$%****%%$#O..&&&....X#$****%$$#########$%%%******%%$#@##$%%**********%*%%%%%%%%%****%%$@oX&&.Xo@#%%********%%%$@O.. &&O@$%****%%$@O..++&XO@$%%****%$$#########$$%*******%%$$@oX.++XoO$%*#oX++++&XO#$%**********%%$##########$$%*",
-"#O. ++++++++++&&.O#**%#@OXX&&&&&& Xo@$%***%%@oX&+..XO@$%*********%$@OX..++Xo@%%***%%#@o. +++ .o@#%%***%%#@o..++& . ..@$**%%%##OOOOOOO@@@$%%******%$#OOOO@$$*********%%%$$#$#$#$$$%%*%$#OX.&+..XO@#$$%****%%$$#@Oo   &&o@#%%**%$$@OX. +++.XO@$%%*%%$##@OOO@OOOO@#$$**%%%%$$#@OX..++.oO#%*#oX+++++Xo@#$$%%****%%%$#@OOOO@OOOOO##$*",
-"#O. &&&+++++++..XO#*%$@O  &&&++++&XO#%%***%%#OX..++&XO#$%*******%$#OX&++ .X@#$****%$@XX&+. .++Xo@%%****$@oX&++++++.Xo#$**%%$oXX &XoX&&XXo$%****%%$#XX&& o#$%%******%%$#@@@@O@@@@#$%*$#@OXX..+&&XOO@$$%%*%%$#@@oX.&++..XO@$%*%%#@oX.++&& &&oO#$%*%$#OX..& XXX++oO@$%*%%##@@Ooo&&+ ..Xo@#*$@o.  ++..XXoO@#$%%*%$$@@oo++XXX& ..X@#*",
-"#@.  &&+++++++..oO#*$#OX &&+++++&&XO#$%**%%$#Oo. +++XX@@$%*****%$#OoX+++ .XO#%%***%$OX.&+. .++.X@$%**%%$OX.&++++++.XX#%**%%#X..&&.X.&&.Xo#%*****%$@X.&&&o@#%*****%%$#@OooXXoXXooO@$*#@oXX.. +++.Xoo@#$%*$#@OoXX..&++..XoO@$*$#@oX..++ &&&&.oO@$*%#@o...&&X..++XXO#$*%#@OooXXX+++. .XXO@*$#O.  ++&&&&&.Xo#$%*%#@OXXX++.XX&&...oO*",
-"$@X.+++    .++&& o@*$@. &&+  &&&&&Xo@$%***%$#oX&&+++&&o@#$%***%$#Oo&&&++&&XO@$%**%$#OX.&&+++&&XoO#%***%$@oX&&+++&&.XO#$*%%$#oX.&&+&&&&XXO#%****%$#O. +++XO#%%****%$#@O &&&&&&&&&.X#*@X.&&&.....&&  .@#%*$@X.&&&..X..&&& .@#*$#..&&+.....&&& .@#*$@..&&&...X.&&& .O#*$#..&&&  ...  &&&..*%#@.. ++&&&&&..Xo#$*$#..&&&& .X.&&&&&..*",
-"$@o.&++  .  ++&&&o@*#@..+++  &&&&&.o@#%*%%$#OXX&&+++&&XoO#$*%%%#@oX&&+++&&XXO#$**%$@XX.&&+++&&.XO@$**%$@OX.&&+++&&.Xo@$**%#@X..&&+++&&.XO@$****%$@O. +++XO@%%***%%#@oX&&&&&&&&&& .@*@. &&&..XX.&+&& o#$*#@..&&&..X.X&+&& O@*#O..&&+.....&+&& o#*#@..&&&..X..&+&& O@*#@..&&+  .X. &&+&..*%#@.. ++&&&+& ..o@#*#@..&&+&&X.X&&++& .*",
-"$#o.+++   . ++&&&XO*#O. +++  &&&&&.Xo@$**%#OoX.&&+++&&.Xo@#*%%#OoX.&&+++&&.Xo@#*%$#OX..&&+++&&.XoO#*%%#OXX.&&+++&&.XoO#*%$#OX..&&+++&&.XXO#**%%$#@o  +++Xo@#$%%*%#OoX.&&+++&&+&&..@*O. ++&..XX.&&&& o@$*#O. &+&..XX.&+&& o@*#O. +++.....&+&& o@*#O. ++&..X..&+&&&o@*#O. &+&&..X. &++& .*%#@.. ++++++++++.X@*#O. ++&& .X.&&+&& .*",
-"$#OX &&++++++++++.o*#O..+++++&&&++&& O#*%$@o&++++&&&++++&o@*%$@o&++++&&&++++&o@*%$@o&++++&&&++++&o@*%$@o&++++&&&++++&o@*%$@o&++++&&&++++&o@**%$#OoX... .XXoO@$%*$@o&&+++&&&+++++XX@*O..+++..XXX&++++XO#*#O..+++..XX.&++++XO*#O..+++ .XX.&&+++XO*#O..+++ .XXX&++++XO*$@X.+++&&... &+++.X*%#@.. +++++&++++..O*$@. +++& .X.&&+++..*",
-"%#OX&&&++++++++++.o*#@. +++++&&&++&& o@*%#@X+++++&&&++++&XO*%#@X+++++&&&+++++XO*%#OX+++++&&&++++&XO*%#@X+++++&&&++++&XO*%#OX+++++&&&++++&XO*%$@@XX... ...XXXo@$*#@X+++++&&&+++++Xo@*@. +++ .XXX&&+++XO#*#@. +++ .XXX&&+++XO*#@. +++ .XXX&&+++XO*#@. +++ .XXX&++++XO*$@OX&&&+&...++&&&Xo*%#@.. ++.....+++&&o*$@X.+++&&... &+++.X*",
-"%@OX&&&++++++++++.X*#@..+++++&&&++&&&o@*%@OX+++++&&&+++++XO*%@OX+++++&&&+++++XO*%@OX+++++&&&+++++XO*%@OX+++++&&&+++++XO*%#OX+++++&&&+++++XO*$#OoX..... ....XXO#*@OX+++++&&&+++++.o@*@..+++ .XXX&&+++XO#*$@..+++ .XXX&&+++XO*$@..+++ .XXX&&+++XO*#@..+++ .XXX&++++XO*%#@o &&++...++&& o@*%#@.. ++.XX..&++&&o*$#OX&&&+&...++&&&XO*",
-"$#X.+++&&.... +++.X*$@oX+++&&...  +++XO*$#X.+++ ..X...+++.X*$@X.+++...X...+++.X*$@X.+++...X...+++.X*$@X.+++ ..X.. +++.X*$@X.+++ .X....+++.X*$@. +++++++++++++oO*@X.+++. &&&+++++.X@*@oX+++ .XXX  +++XO#*$@oX+++..XoX. +++XO*$@oX+++..XoX. +++XO*$@o.+++ .XXX. +++XO*%$#OX..++.  ++..XO#*%#@.. ++..XX.& &&&X*%#@o &&++...++&& o@*",
-"$@X.+++  .X...+++.X*%@o.+++&&.X.. ++&XO*$@X.+++..XXX..+++.X*$#X.+++..XXX..+++.X*$@X.+++..XXX..+++.X*$@X.+++..XXX..+++.X*$@X.+++..XXX..+++.X*$@. +++++++++++++o@*#X.+++ .&&&+++++.o@*@o.+++ .XoX. +++Xo#*$#oX+++ .XoX. +++Xo*$#o.&++..XoX. +++Xo*$#oX+++ .ooX. +++Xo**%%#OX.++   ++.Xo#%*%#@.. +&...X.  &&&o*%$#OX..++.  ++..XO#*",
-"$#X.+++..XXXX.+++.X*$#oX+++ .XXX  +++XO*$#X.+++.XXXXX.+++.X*$@X.+++.XXoXX.+++.X*$@X.+++.XXXXX.+++.X*$#X.+++.XXXXX.+++.X*$#X.+++.XXoXX.+++.X*%#OoXX.......X.XoO#*@X.+++& +++..+++.X@*#OX+++ .XXX. +++XO#*%@oX+++ .XoX. +++XO*$#oX+++..XoX. +++Xo*$#oX+++..XoX. +++XO**%%$@OX&+++++&Xo#$%*%#@.. ++   ..+++ .o**%%#OX.++   ++.XO#%*",
-"$@X.+++.XXXX..+++.X*%#oX+++  XXX. +++Xo*$@X.+++.XXoXX.+++.o*$@X.+++.XXXXX.+++.X*$@X.+++.XXoXX.+++.X*$@X.+++.XXoXX.+++.X*$@X.+++.XXoXX.+++.X*%$#@ooXX....XXXO@#$*@X.+++  +++..+++.X@*#OX+++ .XXX  +++Xo@*%#OX+++ .XXX..+++Xo*%#OX+++ .XXX..+++Xo*%#OX+++ .XXX..+++Xo****%#OX. +++ .o@$%**%#O.. +++++++++&.X@***%$@OX&+++++&Xo@$%*",
-"$#X.+++...XX..+++.X*$@oX+++  XXX  +++Xo*$@X.+++..XXX..+++.X*$@o.+++..XXX..+++.X*$@o.+++..XXX..+++.X*$#X.+++..XXX..+++.o*$#X.+++..XXX..+++.X*%%$##OXX....Xo@@#$%*#X.+++& +++..+++.X#*#OX+++  X.X  +++Xo#*$#OX+++ ..X.. +++XO*%#OX+++...XX. +++Xo*$#OX+++...XX. +++Xo***%$#oX. +++.XO#%***%#@.  ++++++++&&Xo#***%%#@X. +++ .o@$%**",
-"$#o.+++&&... &+++XX*$@X.+++ ..X.. +++.o*$#oX+++&&...&&+++Xo*%@o.+++&&...&&+++Xo*$#o.+++&&...&&+++XO*$#o.+++&&...&&+++Xo*$#o.+++&&..X&&+++XO**%%%$@O. +++XO@$%%**@XX+++++ . &++++XO#*#OX&++&&...&&+++.o@*%#OX&++&&...&&+++.o*%#@X+++&&...&&+++.o*%#OX&++&&...&&+++.o**%$#@oX&&+++.o@$%***%#O.. +++++++&&&XO$****%#Oo  +++..O#$%**",
-"$#oX+++&&...&&+++Xo*#Oo.+++ ..X.  +++.X*%#o.+++&&...&&+++XO*$#oX+++&&...&&+++XO*$#oX+++&&...&&+++XO*$#oX+++&&...&&+++XO*$#oX+++&&...&&+++XO****%$#O. +++XO#%%***#X.+++++ ..&&+++XO#*$@o&++&&...&&+++.XO*%$@o&++&&...&&+++.X*%$@o&++&&...&&+++XX*%$@o&++&&...&&++&.X**%$@oX.&&+++Xo@$%***$#O.  ++.....XXO@#$**%%#OoX&&+++.o@$%%**",
-"%#@X. &+++++++&  X@*#o &+++++...+++++& *%#@o  &+++++++&  o@*%#@X.&&+++++++&  o@*%#Oo  &+++++++&  o@*%#@o  &+++++++&  o@*%#@X. &+++++++& .o@*****%#@..&& o@$%%***@oX++++++++++& .o@#*%#OX..++++++++++& O**$#OX..++++++++++& *%%#OX..++++++++++& **%#OX..++++++++++& *%$#O &&+++++Xo#%****$@o.  ++...XXoO##%%**%$@oX.&&+++Xo@$%***",
-"%$#o.  +++++++  .o#*#O&&+++++...+++++& *%$@O.  +++++++  .O#*%$@O.  +++++++  .O#*%%@O.  +++++++  .O@*%$@o.  +++++++  .O@*%$#o.  +++++++  .O@****%%$@o.   O@$%****@oX++++++++++  .O#$*%$@o..++++++++++& O**%$@XX.++++++++++& **%$@oX.++++++++++& *%%$@oX.++++++++++& *%$@o&&++++++XO#$****#oX&++++&&&XO@#$%%**%$#O &&+++++Xo#%****",
-"%%#@.. +++++++ ..@$*#O &+++++...+++++& **%#@.. +++++++ ..@#**%$@.. +++++++ ..@#*%%#@.. +++++++ ..@$**%$@.. +++++++ ..@$*%%#@.. +++++++ ..@$*****%%#oX...@#%%****#oX++++++++++ ..@$%*%$#Oo.++++++++++& O**%%#OX.++++++++++& **%%$OoX++++++++++& **%%#OoX++++++++++& **$@o&&++++++XO#%****#oX+++++&& o@$%%*****$@o&&++++++XO#%%***",
-"*%%#@OoXXX.XXXoO@#$*$@OXXXXXXXoXXXXXXoO*%%%#@OoXXX.XXXoO@#%**%$#@OoXXX.XXXoO@#%**%%#@OoXXX.XXXoO@#$*%%$#@OoXXX.XXXoO@#$**%%#@OoXXX.XXXoO@#$******%$$@@@@#$%*****@..&&&..X.XXXoO@#$%**%$#@OXXXX.XX.XXoO@**%%%#@OXXXX.XX.XXoO***%%#@OXXXX.XX.XXoO***%%#@OXXXX.XXXXXoO*%%@O &&&&&& o@$%****$@o&&&&&&  O#%%*****%%#o &&&&&& o@$%****",
-"**%%##@OooOooO@#$$%*%#@@ooooO@O@OoooO@@***%%##OOooOooO@#$$%***%%##@OooOooO@##%%***%%##OOooOooO@#$$%***%%##@OooOooO@#$$%***%%##OOoOoooO@@$%%*******%$$##$%%%*****#X. &&XXooooO@@$$%****%%##@OooOooOoO@@$***%%%##@OooOooOoO@@***%%%##OOooOooOoO@@****%%#@@Ooooooooo@#*%%#O   &   .@#$%****$#O  & & ..@#%******%$#@   &   .@#%%****",
-"***%%$$#######$$%%**%%$$######$######$$****%%$$$#######$%%*****%%$$#######$$%%****%%%$$$######$$%%*****%%$$#######$$%%***%*%%$$#######$$%%%*****%**%%%%%%%******##OooOO@@@###$%%%******%%$####@#@###$$%*****%%$####@#@###$$*****%%$$###@#@###$$*****%%$####@#@####$**%$#@oooooOO#$%*****%$#OOooooOO#$%%******%$#OOooooOO#$%*****",
-"***%*%%%%$%$%%%%*%***%%%%$%%%%%%%%$%$%%*****%%%%%$%$%%%%*%*****%*%%%%$%$%%%%%********%%%%$$%%%%%%*******%%%%%$%$%%%%*******%*%%%$$%$%%%%%***********%%%*********%$##@###$$%%%%%%********%%%%$%$%$$$%%%%******%%%%$%$%$$$%%%*******%%%$%$%$$$%%%********%%%%$%$%$%%%***%$##@@@@##$%%*****%$$#@@@@@##$%%********%$#@@@@@##$%%*****",
-"*********************%%%%%***************************************************************************%%%$$####$###$$%%***************%*********%%%%%%%%$%%%************%%%$%%***********************************************************************************************************%$$#$$$%%%******************************",
-"********************%%%$$$%%%**************************************%*%*%**%**************************%$#@O@O@@O@OOO@#$%***********%%%%%********%%$$#####$$$%%*********%%$#$#$%%******************%***********************************************************************%%%%*%%%%******$@@OO@@#$%%%%***************************",
-"********************%##@###$%********************************%%%$%%$%$%$%%$%%*********%*%************%#@ooXXXXXXXXooO#$**********%$$#$$%%******%$#@O@O@@@@$$%*********%$#@@@#$%**************%%%%%%%%**********%%%%%*******************************%*%%%%%*%**********%%%%$$$$%%$%$%****@OoXXoO@##$$$$%%%*********%******%******",
-"*********%%%********$@X.XXo#$%%*****************************%$$##@##@#@#@###$$%*****%%%$%%%*********%$@o&++&&&&&&+++XO#*********%%#ooO##%*****%$#X........@#%%*******%$#O. .O#$%*************%$$###$$%%*******%%$$$$$%************%**%%*%%*%******%%$$$$$$$%%**%*******%$@@@@###O@#%%***O &+++..O@@oO@#$$%%*****%%%%%**%%%%%****",
-"******%%%$$$$%******@O...XXO#$%*************%%%%%%%$%*******$#@OOoOooOooOoo@@$$****%%$####$%%*******%#OX++++&&&&&+++Xo#*******%*$$OX.o@@%%***%%#@...  ..  O#$******%%%#@o & o@$%************%$#@OoO@#$%*****%%$##@@##$%%*****%%%%$%$%$$$%$%%%***%%%##@@@@##$$$%$%%***%%$#OoooO@OXo@#$%**o&&+++..XooXXO@@#$$**%*%$$$$$%%%$$$$%%**",
-"******%$#@@##$%%****Oo.  ..oO#%%*%*%%%%****%%$$#####$$%%****#OoXXXXXX.XX.XXXO@$***%%$@@OO@#$%*******$#OX+++++&&+++++.X@****%%%%%$@o..XoO$%%**%%#@.   &  & o@$****%%%$#@oX&&&Xo#$$%%********%$#OoXXXoO#$***%%%$#@oooo@#$%%****%$###@#@##@@@@#$%%*%$#@ooXoooO@@#@##$$**%%#@XX.XoXo.XO@$%**o&&+++ ..XX..XXoO@#***%$#@@@#$$#@@@#$%%*",
-"*****%%#@XXXO#%*****X.+++++.X@$%%*%%$%%***%$$#OOOoOOO@$%%***#. ++++++++++++++O#***%$#X.   @#%%******%@o.+++&&&&&&+++.o@*%%%%$$$##X.++.XO#%***%%#O.  ++&&++XO#%**%%$#@OoX.+++.X@@#$%********%$@o++++& @#*%%%$#@O..+++XO#%%***%$@@OOoooooooooo@$%*%#Oo&&&&&..ooooOO@#**%$@o&&&&. .++XoO$%*o &+++&&  &++&&  Xo*%%%@Oo. O#@@.X.O#$%*",
-"****%%#@o...X@%*****o.+++++..O#$%%#####**%$#@OoXX.XXoo@$%%**@. ++++++++++++++O#**%%$@.. & o#$%******$@o.+++&&&&&&+++.X@*%$###@#@OX.++.Xo#$%**%$@O.  ++&&++Xo@%**%$@OoXXX.+++..XO@#$*******%$#OX++++&&@#*%$#@@Oo. +++Xo@#$%%*$#OXXXX.XXX.X..XO#$*$@oX&&&&&  .X.XXXo@*%$#@X&&&&   ++.XO#%*O &+++&&& &++&&& .X**%$OoX  XOOo...XO#$*",
-"****%%#X.++ .O$*****@o..+++& O@$$#Oo.X@*%%#@.. ++++++.X@$%%*@OXX....+++...XXO@$***%$@X.&&&o@$%******$OoX++++++++++++.XO*$#oXXXXooX.++ .X@$%*%$#@o.  +&..++XX@$%*$@X.&&&&&+++&&& .X#*******%$@oX&&&&.o@#*$#oX... &&&&.XoO@#$*#O  ++++++++++++oO$*@O &++++++++++++++O*%#@X.&&&&. .++.XX@$*@oX   ++   &&++&&XX**%$OX.++.XoX+++..O#*",
-"****%$#o.++ .o$%****#oX.+++& o@##@XX..@*%#@o.  ++++++..O@$%*#OXXXX..+++...XOO#$***$$OX.&&&o@$%******#OX.++++++++++++.XO*#OX....XX..++...O#%*$#@oX   ++  ++.Xo#$*#@..&&+&&+++&&&&..@******%%#OX.&&&&.o@$*#OX.... &&&&.X.Xo@#*#O &++++++++++++XO#*#O &++++++++++++++o*$@O..&&&& . ++..XO#*#OX.  ++   &&+++&.o*%%$OX.++..X.+++ .O#*",
-"****%$#X.++& o$%****#@X.+++& oO@@O.. .O*$@oX  &++++++ .XO@$*@OoXX.X.+++.XXoO@#$***%$OX.&&&oO$%******@oX.++++++++++++..O*#o........ ++ ..O@$*#@oXX   ++..++..XO#*#O..+++&&+++&&&&..O******%#@oX.&&&&Xo@$*@o...  &&&&&....Xo@*@O&&++++++++++++Xo#*#O &++++++++++++++O*#Oo..&&&&. .++ ..o@*#Oo.. ++ . &&+++&Xo*%%$OX.++....+++  o@*",
-"****%%#@X &++X#$%***$@oX+++  XOOOX++ .O*#O. +++..++&&&&..O#*@.......+++..XXO@@#**%%$OX.&&&X@$%%*****o.&++++++&&+++++& o*@O+++++++++++++&X@$*XX.&&++++++&++&&& @*@o &+++&&+++&&++  o*****%$#O &&++++.o@$*@o+++++++++++++++.X*#oX.+++....  +++.o@*$#OX...++++++...XoO*oX.++++++++++++++..*#@X&&&++.....++..XO**%$#OX++ .  ++++&o@*",
-"****%%#@o. ++X#$%***%#OX+++  XoooX++ .O*@o. +++..++&&+&  o@*O. .....+++ ..XXoO@***%$@X.&&&oO$%******o.&++++++&&+++++& o*@O++++++++++++++XO#*X..&++++++&&++&&& O*@o&&+++&&+++&&++& o*****%$@o&&+++++.o@$*OX+++++++++++++++..*#@X.+++.XX.. +++.o@*%#@OX..++++++.XoO@#*OX.++++++++++++++.X*#OX &&++..XX.++..O@**%%#OX++    +++++O#*",
-"****%%#@oX.++.O$%***%#@X&&&++XXX..++Xo@*@X++&& ..  ++..++XO*o &&&&&&++++&&&& ..**%%$OX.&&&X@#%******OX &&&&&&&&+++++  O*#OoX.. ++   .+++.o@*.. &&&++++&&++&&& o*@o &+++..+++..&&& o*****%$@o&&+++& .o@$*OX&+&&&..+++&&  .oO*#OX.+++.XXX. +++Xo@*%%$#@OXX.++  XoO@$$*#@oX.&&&& . ++ ..X@*@X.+++++.XXXX&& .o#**%%#@X  ++++   Xo@#*",
-"**%%$##OoX.++.o#%%**%$@O &&++.XX. ++Xo#*OX++&& .X. ++..++Xo*O &&&&&&++++&&&&&..***%$@X.&&&XO#%******@o &&&&&&&&+++++ .O*$#Oo...++.. .+++.X@*X. &&+++++&&++&&& O*@o&&+++..+++..&&& o*****%$@o&&+++& .X@$*@X&&&&&..+++&& ..O@*$@X.+++.XOX. +++Xo@**%%$$@OX.&+& XO#$%%*$#OoX&&&&. .++ ..O@*OX.+++++.XXoX&& .o@***%$@o  ++++ ..XO#$*",
-"*%%##@OoXX.++.o@$%***%#O. &++.....++o@$*OX++ &..X. ++  ++.o*O. &&&&&++++&&&&...**%%$OX.&&&XO#%******@O &&&&&&&&+++++ .O*%$$@XX.++  . ++&.X@*X..&&+++++&&++&&&.@*@o &+++..+++..&&& o*****%$#o&&&++& .XO@*Oo&&&&&..+++& ..X@$*#@X.+++XoOo. +++Xo@****%%$@OX++  X@#%%**%$#oX&&&& . ++..X@#*O..+++++.XoXX&&  o@**%%$@o.&++++ ..O#$%*",
-"%%$@oXX&&X.&+ .@#$***%$@OX.++   X.XoO#$*oX++&  XXX.++..++..*#OooXX..+++..XXooO@***%$@X.+++XO#%%*****#@XX+++++++++++&Xo@**%$$@oX&+&&.....  @*@OOXX  &++..++..XO#*@o&&++++++++++++& o*****%$#OX..++++&&o@*@o &+++..+++ &XXO#$*$@X.+++XXOo..+++.X#****%%%#OX&&& X@#%***%%#Oo&&&&. .++..X@$*O &&&&++.XXXX &&&o@**%%$@oX.+++&.XO##%%*",
-"%$@oX..+&X.++ .O@$%**%%$@oX++ & XXO@#$%*oX++&& XoX.++..++ .*$##@OoX.++&.XXO@###***%$@X.+++Xo#$******$@o.+++++++++++&Xo#***%$#OX&&&&.X.XX  @*$#@OX.  ++  ++..X@#*@o &+++&&++++&++& O**%%%%$#@X..++++&&o@*#o &+++..+++& Xo@$%*$@X.+++XoOo. +++.o@******%$#o && X@#%%**%%$@o &&& . ++.XX#$*@ &&&&++..XXX &&&o@**%$#OX..+++&.XO#$%**",
-"$#oX+++  .X  +&XO#$***%$#@X. +++.o@#$%%*OX++&&&XXoX&+&&&+  *%%$##OoX+++.XO@#$$%***%$#oX+++XX@$%*****%@OX+++ &..  +&&XO$****%$#O..++..XoO@@$*%$#@O.. ++..++ ..@$*#O. +++..+++..& ..O*%%$$$#@OoX.++++++X@*#OX.+++ .&&&++Xo@$%*$@X.+++.XoX. +++Xo@******%%#O..+&Xo#$%***%$@o&&&& . ++..o#$*#OoXX.&&   ..  &&o@*%##oXX++++++.Xo@$%**",
-"#OX.+++ ...  +&Xo@#****%$#O..+++.X@#$%**OX++&&&XXXX&&&&++ .**%%%##XX++&.XO#$%%*****$#oX+++XX@#%%****%#oX+++ &..  &&&o@$****%%#@X.++..oO@#$$**%$#O.  ++..++ ..@$*#@..+++..+++.. ..X@*$##@OOOXX..+++++&XO*$OX.+++  &&&++.XO@$*#@X.+++.XXX. +++Xo@******%%$#X.++Xo@#%%**%$@o &&&. .++.Xo#%*$#@OXX&&&  X. && o@*$@OX..++++++..X@#$%*",
-"#OX.+++  ..  ++.Xo@****%%#@X.+++.XO@$$%*@o&+&&&.XX.&+&&++ .***%*%#OX+++.Xo@#%%****%%#OX+++.Xo@$%****%#@X+++ &... && O#$*****%$@o.++..XO##$%***%#@...++..++  .O#*$@X.&++..+++.X..Xo#*#@OoXXXX...+++++&o@*$@X.+++. &&&++.XoO#*$@X.+++....  +++Xo@*******%$#oX++.Xo@$$**%$@o &&&. .++..o#%*%%##OX & & ..  & O#*@OX...++++++..Xo@#$*",
-"OX&++++++&+++++&&.X*****%$#OX&&&++Xo@#$*#OX.+++&&....++++Xo****%$#OX+++& XO@%%%***%%#OX+++&&XO@$%%**%#@o&&&++&&..XoO@$%*****%%#@o. &&Xo@$%%**%%$@X. +&..  +++o@*%$@OoXX..+++.XO@@#$*@.  &&+++++++++..o@*%#OX&++++   &&&&&o@*$@X.+++&&&++++++.o@*******%%$@o&&&  O@$**%$@o &&+&&&++.Xo#%**%%$#O..+++++++.X@#*@. +++++..&&+++Xo@#*",
-"@X+++++++++++++&&..******%##o &&++.Xo@$*$@oX+++&&... ++++XO*****%#OX+++&&Xo@$%*****%$@o&++&&XXO#$%**%$@O &&++&&..o@#$$%*****%%%#OX.&&XoO#$%***%$@X. +&XX. +++XO*%%$#@OoX.+++.o@#$$%*O &&&&+++++++++..o@*%$@o&&+++  .&&&&&Xo*$#X.++++&++&++++.o#********%%#@&&&& oO#**%%@O &&+&&&++.XX#%**%%%#@X.+++&+++Xo@$*O &+++++XX& +++.XO@*",
-"OX++&& ..&&&&&&++.X******%%#@OXX  ++.X@*%#@OXX.&&++....XoO@****%%#OX&&&+&.o@$%%****%%#@XX.++& .@$%%**%#OX..+++&Xo@#$%%********%$#OX   ..@$%**%%$#X..&&XoXX   &O**%%$$#OoX+++Xo$$%*%*@..&&&&&. .....&&o#*%$#OX..&&XXXX.&&&&&*%#oX & ..XX..++&XO#*********%$@X.&&&..@***$#O.  +&&&++.Xo#%****%%#@X.. &&..o@#%*@..   .XXoXX...++.o*",
-"@X++   .. &&&&&++..*******%%#@OX  ++.X@*%%##OoX &++XX.XoO#$*****%$@o&&&+&Xo@$*******%$#OoX++&  O#%%**%$#oX.+++&XO#$%%*********%%$#o..  .@$%***%$#oX.  o@Oo.  &o**%*%%$#oX+++XO$%%***@X.&&&&&...oX..& O#**%$@OXX  Xoooo  && *%#OX   XoooX.&+&XO#**********%$oX&&&.X@**%%#@.  +&&&++.XO#%****%%$#O...&&.XO#$%*@X. ..XoO@OO...++.X*",
-"@o++ ..oX.  &&&++XX********%%##O..++..@**%%$#Oo. ++XoXo##$%*****%%#O &&&&XO@%%******%%$#OX&+& .O#%***%%#OXX++&&O@$%%************%$@.....#$%****%$OoX..@#@@...&O*****%%#Oo+++X@%*****#X.  &  .XXOOXX  @#**%%$@Oo..@@@@O.. & *%$@o...O@@OoX&&&O@$**********%$OX &&.X#***%$@X. &&&&++.XO$%*****%%$#XX.  Xo#$%**#XX...O##$##oX.++Xo*",
-"#@OoooOOOOoooXXXoo@*********%%$#OoXX.X@***%%%#@OoXoO@##$%%*******%$@OooXO@#$%%*******%%$#OoX...@#%%***%$#@oXXoo@#%%**************%##@O@##%%****%%$#@@@#$$##OOO#*****%%$#O.X.O#%*****$#@OoooOO@####O@@#$**%%%$##@##$$##OOOo@*%%$#@O@##$##OOoO@$%***********%#@OoOO@#***%%#@OoXXX.  o@#%%******%%##@OOOO#$%%**$#@@@##$%%$$#@OoOO@*",
-"$##@@##$##@@@@@O@##**********%%$#@OoXX#****%%%$#@@@##$%%%%******%%%$#@@@@#$%**********%%$#@O..X#$%*****%%$#@@@@#%%****************%$####%%******%%$$#$$%%$$#@#$******%%##Xoo##%*****$$##@@@@#$$$%$$##$%****%%$$$$$%%%$##@##**%%$$#$$%%%$####$$%************$$##@#$%****%%$#@ooOo..O#$%********%%$$####%%****%%$#$$%%%*%%$$##@#$*",
-"%$$$$$%%%%$$#$$#$$%***********%%%$####$******%%%$#$$%%************%%$$$$$%%%***********%%$$##@##%%******%%$$#$$%%*****************%%%%%%%%******%*%%%%%*%%%%$$%*******%%$###$%%*****%%%$$$$%$%%%%%%%%%%******%%%%%%*%%%%$%$**%%%%%%%%%%%%$$$%%*************%%$$$%%%****%%%%$$#@@@##$%%*********%%%%%%%%%****%%%%%%%****%%%$$$%%*"
-};
+static char * matrix2_xpm[] = {
+"320 377 13 1",
+"      c None",
+".     c #000000",
+"+     c #081E08",
+"@     c #0B2A0B",
+"#     c #165016",
+"$     c #1B641B",
+"%     c #217A21",
+"&     c #279027",
+"*     c #2BA02B",
+"=     c #5AD25A",
+"-     c #81DD81",
+";     c #E0F7E0",
+">     c #A7E7A7",
+"...........................++++++................+..+............+++@@###@@+++.......+++@###@++............+.++......................................+.+.+.............+@#####@+........+@##$##@+...............+++++.................................................................................................++@@#@@+..",
+"..........................++@@#@@++..........+++++++++++.........+@##$$$%$$#@++......++#$$%$$#+++.........++@+@+++..................................++++++............++#$%&%$#@+......+@#$%%%$#++............+++@@@+++...............................................................................................+@#$$$#@+.",
+"........................+.@@$$%$$@@+.......++@@#@#@#@#@@++.....+.+#&**====&%$@+.....++#$&=-=&$#@+.......++@@##$#@+................................++@###@@+..........++#$&;;=*&#++....++#&*=;;&$#++...........+@#$$$#@+.............................................................................................+++#%===$#@.",
+"........................++@$%*&*%$@++.....++@#$$%$$$%$##@++....++@$*====-=**%#+....++#$&*->-*&%#@++....++@#$%%%$#@++...........++@+++++..........++@#$%%$#@+........++@$&*;;==*#++....++#&==;;*&$@+.........++@#$%&&$#@++..........+.+++.............................................................................+#$&---&$@.",
+"........................+@$*=;;;=*$@+.....++$%&=-***-=&%$++....++#%=->>>;;==*#@...++#$&->;;;-=*%$++....++#%=----%#@+.........++@@###@@++.........+@$%=--*&#++.......+@#%&=;;=**#++....++#**=;;**%#@+.......++@#%&;;;&%#@++.........++@@@++..........................................................................++$&*;;>&$@.",
+".......................++#$*=;;;=*$#+....++#%**>-=*=>>**%#+....+@$&->>>>;;-=*$@..++@$%*->;;;>-**%@+...++#$&-->>-&$@++.......++#$%%%%%##++.......++#$&->-=&$@+......++@$==->>*&$@+......+@$**>;-==$@++.....++@#%&*;;;*&$#@++.......+@#$$$#@+........................................................................++@$*=;;;*%#.",
+".......................++#&==;;;==%#@....++#&*=>>===>>=*&#+...++#$&->>>>;;-==%#..+@$%*=>>;;;>-=*&#@...+@$%*->>>>*%$@+.....++@#$%****&%$@+.......+@#&*>>>=*$@+......+@#%=->>>*%$@+.....++@#%*>>>-=%#@+....++@$$&*=;;;=*&%#@+......++#$&&&$#@+.......................................................................++#%*=;;;*$#.",
+".......................+@#%->;;;>-&$++...+@$*=-;;---;;==*#@...+@#&*>>>>>;;-==%#.+@#%->>;;;;;;;==*#@..++#**=>>>>-==$@+.....++#$&>>;;;>-%#++......+@%*=;;;==$@++......@$&->>>-*$#+........+#%*->>>>&$@+....+@#*====;;;====*#@......+#$&;;;&$@+.......................................................................+@$&-->>>*$@.",
+"........................@$&->;;;>-&$@+..++@$==-;;---;;-=*$@..++#%&*>>>>>;;--=&$.+@$&->>;;;;;;;-=*$@..+@#*==>>>>>-=%#@+....+@$%*>>;;;>>&$@......++#%==;;;=*$@+......+@%*>>>>-&$@+.......++@#&->>>>&$#+....+#$==-=-;;;-=-==$@.....++#%*;;;*%#++......................................................................+@$&->>>-%$@.",
+".......................+@$&->;;;--&$@...++@%*=-;;-=-;;==&#+.++@#=--;;;;;;;;>>*%.+#$&;;;->===>-==*#@.++@#*=->>>>->-&$@+...++#&==;;===--%#@+.....+@$&>>>--*%#++.....++#$*>>>>-%#++.........@#%->>>>*%#+...++@$=--;;;;;;;-==$#......@#&*;;;*&#@+...........................+.+.+.+..++...............................+@#&*;;==*%#+.",
+".......................++$&=-;;;>=&#@+...+#$==-;;=-=;;=*&#+..+#$==-;;;;;;;;>>*&.+#$*>;;->===>-=*&#+..+@#*==>>>>>>-&%#@+..+@#*==;;===--%#@+.....+@#&>>--=&$@++......+#%*;;;=&%#++.........+#$**;;;*%#++..++#$==-;;;;;;;>-=$#...+++#$&=;;;=&$#++.........................+++@+@+@@++@+++............................+#$&*;;==&$@+.",
+".......................+@$&->;;;--&$@...++@$*==;;===;;=*%@+.++#$=->;;;;;;;;>>*%.+@%&;;;->===--=*&#@..+@#&==>>>>>>>*%$@+..+@#*==;;==*-=%#@++.....@#%->===$#@+......+@#&*;;;=&$@+.........++@$&=;;;*&#@....+@#=--;;;;;;;-==$@..++@#$%*=;;;=*&$#@+......................++@@##$#$#$$$##@@+..........................+@#%*=;;=*%#++.",
+"........................+#&->;;;>-%$++...+@#*========-&%#@+.++#%==-;;;;;;;;>>*$.+@$&>>>;;>>>-==*%#@...+@$%*>>>>>>-==*@+..+@$&==;;==**&%$@@+.....+#$*=&%$#@+........+#&*;;;*&$@+..........+@$&*;;;*&#++..++@#%*==-;;;--=*%#@..+#$%&**=;;;=**&%$@......................+@$$%&&&&&&&&&%%$@.........................+@#&=-->>*$#++..",
+".......................+@#%->;;;>-%#@....++#&**=*&&*==%#@+...+@$=->;;;;;;;;>>&$.+@#%->>;;>>>-==*&$@..++@#%*>>>>>>>==*#+..+@#**=;;===**%%$@+....++@#&&$#@+++.......+@#&*;;;*&$+...........++$&*;;;*&$+....++#$**--;;;-=**%#@.+@#%**===;;;===**%$.....................+@$%****=**=****&%$.........................+#$*>;;-=&$@+...",
+"........................+#$*=;;;=*%@+.....++@#$$$$$$$##@@+..++#%&==;;---;;==*%#..+#$&*=--;;;;;--=%#...+@#%*->;;;>>**%#+..+@#*==;;;;;====*$@......+@@#@@@+..........+$&*;;;*&#@...........++$&*;;;*&#@+...++#%*=;;---;;=**#+.+#%*;;;;;;;;;;;;;*%.....................+#%*;;;;;;;;;;;;;*%........................++#%*;;;==%#@+...",
+"........................+@$**;;;=&$#++....++@@@#@@@@#@@+....+@#%**=;;---;;=**%#.++@$&**->;;;;;>>-%$...+@#%*>>;;;>>=*%$@.++@$*==;;;;;==-==$#......++++++...........++#&*;;;*&$++..........++$&*;;;*&#+.....@@&*=;;---;;=*&#+.+#&*;;;;;;;;;;;;;*%............+........+#&*;;;;;;;;;;;;;*&........................+@$&*;;;==$@+....",
+"........................+@#&*;;;*&$@........++++++++++++....+@#&*==;;---;;==*%#..+@$%*==-;;;;;>>-&$..++@#%*->;;;>>=*&$@.++#$*==;;;;;==--=%#.......+++.+...........++#&*;;;*&$@+..........+@$&=;;;*&#+.....+#%*=;;===;;=*&#+.+#%*;;;;;;;;;;;;;*%........+++++++......+@%*;;;;;;;;;;;;;*%........++++++.........++#$==;;;*&$@++...",
+"........................++#&*;;;*%#++...........+.+.+.......+@%*;;;;;;;;;;;>>%#.++#%==-=-===>-;;;*$..++@*==--;;;;>>>-%#.+@#&=>>>>;;;;;>>-&#.......................++#&*;;;=&$@+..........+@$&*;;;*&#@+...++@%**=-***-=*&%@+.+@$%**===;;;===**%$.......++@@##@+++....+@$%***=*=*=*=***%#......+++@###+++.......+@$&>>>--&$@+.....",
+".........................+#$*;;;*$#+........................+#%*;;;;;;;;;;;>>$#.+@#%=->=-===--;;;&%..++@&*==-;;;;;>>-%$.+@$&->>>>;;;;;>>-%#.......................++#&*;;;=&%@+..........+@$*=;;;*%#+....++@$&*==&&&==&%$@+..+@$%&**=;;;=**&%$@.......+@#$$$$#++....++@$$&&&&&&&&&&%%#@......+@#$$$$#@+......++#%*>>--=%$@+.....",
+"........................++@$&***%$@+........................+@$*=--;;>>>>>=*&$@.+@$&>;;;;;>;;;>>>*$...+@#$%*=>>>==>>-&#.+@$*;;;-->->;;===&$........................+#%*>>>-=%#@+........++#%=->;>*%#+.....++@###$#$#$$##+++..++@#$&*=;;;=*&$#@+......++#$===&&#++....++@####$#$$#$$##@+.....++#&*===$#+.....++@$&*>;-==$@+......",
+".........................+@#%***%#@+........................+@$%=--;;>>>>>**$#@.+@%&>;;;;>>>;;>>-&$..+.+@#$&*>>>==>>-&$.+#$*>;;>-->-;;-==%#.......................++@$&>>;-=&$@+.......++@$&=-;>>*$#++.....++@@@@@@@@@@++.+....+@#$&=;;;**$#@+.......+#$&---=&#@+......+++@@@@@@@+++++......+@$&=---%$@+....+@#&*=;;=&%#@+......",
+".........................++#%***%$++.........................@#%=--;;>>>>>*%#@+.+@$&>;;;;>>>;;>>-%#...+++@$%*>>>==>>-&#.+#$&>;;->-->;;===&$........................+@$&=->>>&%@++......++#$*>>---&$@+........+++++.++++.+.......+@#&*;;;*&$@+.......+@$%*>>-=*$@+........+......++++.......++#$*=>>-&$@+....+@$&==;;*&$@++......",
+".........................+@#%;;;%#@.........................++#%==-;;>;;--&%@++.+@#&=-->>;;;>>**%#@.....++@$&>;;;;>>-%#.+@$&>>>;;;;;;;;;;*%.........................@#%=->>>*&#@+......+@#%*>>>-=%#@..........+.+.....+.........++#%*;;;*%#++.......+@%*=;;;=*$@+...........+...............+@%=-;;;&$@+....+#%=-->>*%#@+.......",
+".........................++#%;;;%#@+.........................+@$==-;;;;;--&$@+...+#$==-->;;;>>*%$#+......+@$%>>>>>>--$#..@#%->>;;;;;>>;;;&%.........................+#$==->>*&$@++.....+@$&*>>-==$@++............................+@$&;;;&$@+.......+@#%==;;;-*$@++.........................++@$=-;;;&$@++...+#%=>>>-*$@+........",
+"..........................+#$%%%$@++........................++@$*=-;;>>>>-%$@+..++++#$%*=;;;**$#++........+#$%&*&*&%%#@..+@#%&***=******&%#.......................+.++#%*=;;==*#+.....++#*==;;**%#@+.............................+@#%&&&$#@+........@#&>>>--*%#@+...........................+@#$&&*&$#@.....+#%-->>-%$@+........",
+"..........................++##$#@@+..........................+@$*=-;;>>>-=%#+......++#$&*;;;*&#@+........+++@#$$$$$##@+..++@#$%&%&&&&&&%$#@.........................++@$%*;;==*#++....++#*==;;*&$@+...............................+@##$$#@+........+@$%>>--=&$@+.............................+@#$%$$#@++....@#%=-==*$#+.........",
+"...........................++@@@++...........................++#&*=>>>>>-=$#++.......+@#%=-=$#@+...........+@@@##@@@++...+++@@@###$######@+..........................++#%&;;=*&#+.....++@&*=;;&$#++................................++@@@+++........++#&->===$#++.............................+++@@#@++......+@$===*%#@+.........",
+"............................+++++............................++@#$%&&*&&%$#++.........+@#$$$#@+..............+++++++++......++++@+@+@+@+++............................+@#$%%%$#@++.....+@#$%&%%#@+..................................+++.+..........++#%*=&%$#@++...............................+++++++......+@#***%%@++.........",
+"..............................................................++@##$$$$$##@++..........+@@##@++................+.+............+.+.+.+.+................................+@##$##@++......++@##$#@@+.....................................+............++@#**%$#++..................................+.+.........++@#$##@@+..........",
+"......+++@@++++.........+.+++@++++..........+++@+@@+@+++.........++++@@@+++.............+++@+++........+++@@@@@@@++++............++++@@++.....++@+@@@@@@@@+++.........+++@+@+++...........+++@@+@+..................................................................................................................+.+.........",
+".....+@@##$##@+++.......++@@####@+..........++@###$$##@++.......++@#$#$$$#@++..........+@@@##@+++.....++@###$$$$$##@++.........+@@##$###@@+..+@@#$$$$$$$$##@@+......++@@##$###+++.......+++@#####@+++............................................................................................................+++++@++++.....",
+"..+++@#$%%&%%$#@++....+@@#$%%%%$#@++......++@#$%%&&&%%$#@++...++@#$$%&&&%%$#@++......++@#$%$%$#@+...+.+@#$%&&&&&&&$$@@......+++@#$%%&&%$$@+.++#$%%&&&&&&&&%$#@....+++##$%%&%%$$@@+......+@#$%%%%%$#@@+.........................................................................................................++@######@@++....",
+"..++@$$*=->-=*%$@++..++#$%&*=---%#++.....++@#$&==>>>==&$#@+...+@#$&==>>>==%%#@+......+@#%*====$#+....+@%&*->->->>==*$@+.....++#$%&*->--=%$@.+#$==->>>->>>===$#+...+@#$&*=->-=*%$#@+....+@#$&---==&%$#++.......................................................................................................++@$$%&&&%%##++...",
+"..@@$%&==>>>==&%$@+.++#$&**==>--&%@+.....+@#%&*-->>>--*&%#@..+@#%&*-->>>--*&%#@.....++#%&===-=%$@+..+@#%*=>>>>>>>--=$#+.....@@$&**=>>>>-*$@.+#%=-->>>>>>>--=%$@..+@#$&*==>>>==*&%#@..++@#%&*>>>--**&$#+....................................................++++++.........................++++++.............++#$%&******%$#@+..",
+".+@$*==;;;;;;;==*$@.++#%>;;;;;;;*%#+....++#$=->;;;;;;;>-=%#.+@@$=->;;;;;;;>-=%#.....+@$*=;;;;;*$#++.++$*==;;;;;;>>-=%#+...++@$*=;;;;;>>>*%#.@$&>>;;;;;>;;;;>&$@.+@@%=--;;;;;;;>-=$#...+#$*;;>>>;;;;>&$@..................................................+++@#@@@++......................++@@#@@@++..........+@$**;;;;;;;=*%#++.",
+".+#$===;;;;>;;-==$#.+@#&>;;;;;;;*&#@+...++$%->>;;;;;;;>>-%$..+#%-->;;;;;;;>>-%$....+@#%==;;;;;*%#+..+@$*=-;;;;;;;>>-%#+...+@#%*=;;;;;;>>*%#.@$&>>;;;;;;;;;;;&%@..@$%->>;;;;;;;>>-&$..+@$%*;;;;;;;;;;&%@.........++++.................++++++...........+++@@#$$$$##@.....++++++++++++....+@@$$$$$#@@++.......++#%*=;;;;;;;=**$@+.",
+"+@#%=--;;;;;;;-==%$..@#%>>;;;;;;*&#+.....@$&->>;;;;;;;>>-&$.+@#%->>;;;;;;;>>-&$....+@#%==;;;;;*&#++.+#$==-;;;;;;;>-=%#+..++@%&=-;;;;;>>>&$@.+#%>>;;;>>;;;;;;*%@.+@$&->>;;;;;;;>>-&$.++@$**;;;;;;;;;;*%$.......+@@@@@@++.............++@#@@@+..........+@@$$%&&*&%#@....+++@@@@@@@@@+@+..+@$%&*&&%$#@@++.....+@#&*=;;;;;;;==*%#@.",
+"+@%&>;;--===--;;>&$..+@$&**==;;;*&$@....++$%>>;--===--;;;*%..@#%=--=====->;;>&$....+#$*>;>>>;;*&#@..+#$==-;;======*&$#+..+@#%*;;>>>===*&%#@.+@$%&****==>>>>>&$@.+@%*>;;--===->;;;*$.+@#*==;;=====;;;=&$.....++@#$$%$#@+............+@##$$$#@+.......+@@#$%&--;;;=*$..++@##$$$$$$$$$##@+.@#$;;;>>*&&$#@++....+@#*==;;===>>;;>&$@.",
+"+@%*;;;--***--;;;*%.++@@$&**=;;;*%$++...+@#%>>>==**=--;;;*%.++@#=-==**==->;;;*%...+@#%*>;>>>;;*&#++.+@$==-;;-=====**$#+.++@$**;;>>-===*&$@+.+@@$$%%&&*=>>>>>&$@.+@$&;;;>-===--;;>*$.+@$*=-;;=*=*=;;;**$.....++#$&&&&$#@+..........+@#$%*&&$#@+....++@#$%***--;;;=*#..+@#%%&&&&*&&&&%%#@.+#%;;;>>=**&%$@@+...+@$*=-;;===>>;;>*%@.",
+"@#%*;;;-=***==;;;*%...++##&*=;;;=%$++....+@$%&&&&&**>>;;;*$..+@#$%%&***=;;>>>&$..++@%*=;;-=-;;*&#@..+#$*=-;;;;;;;>-=%#@.+@#*==;;>>>>>=*&$@+..++@@##$%**;;-==%#@.+#$*>>>>>===>>>>>&%.+@$==-;;=*=*=;;;=*$.....+@$==;;;&$@+..........+@$==;;;&$@+...++@#%*=>;;;;===&%#..@#$-->>>>>>>->--%#.+@$&*=>>;;;-=%$#@@..++#**=--=*==-;;;*$#.",
+"+#%*;;;-=*&*==;;;*%....++#$**;;;*&#@.....+@@#$$$%&*=>>;;>*$...++##%%&*==;;>>>&%..+@#&*=;;---;;*&$++.+#$==-;;;;;;;--=%$+.+@$*=-;;>>>>-==*$#+...++++@#$&*;;-==$#+.+@$&>>>>>===>>>>>&$.+@$==-;>=*=*=;;;=*$....++#$=-;;;*$#+.........++#$=-;;;*$#+..++#$%&==;;;;;==*%#@.+@$&->>>>>>>>>>>-%$.+@#$&*>>;;;--*&%$#@.++#%*====*==-;;;*%#.",
+"+#%*;;;-=&&&==;;;*%.....+@#&=;;;*&$++.....++@##$%&**>>;;>&$...++@@$%**==;;>>>&$..+#$*==;;=-=;;*&$@+.+@#*==;;;;;;;>--&$@.+#$==-;;>>>>>===%$@.....+++@$&=;;-=*$@+.+@$&->>>>===>>>>>&$.+@$*=-;;==*==;;;=*$....++@%=-;;;*$#+.........++#$=-;;;*$#+..@@$%**=-;;;;;=**#@+.+@$&>>>>>>>>>>>>>&$..+@#$&->;;;>-=**%$@.++@%&*==**==-;;;&%@.",
+"+#&*;;;==&%&==;;;*%......@#&*;;;*&#@.......++@#$%==-;;===%#....++@$==;;;;;-==&$.+@$%-->>>-=-;;=*$@+.+@#&*=>>===>>;;;*%#.+@$==-;;;;;;;;;;*$#......+@#%*=;;**$#++.+@$&==-;;;;;;;===&$.+@$*==;;===>>;;;=*%.....+#$*=>>>&%@++.........+#$==>>>*$@@..@$%>>>;;>>-=*&%#@++.@#&*>>;;;;;;;;;;>*%...+@#$&*===;;;;;=*$..++@#$&*==-;;>>>&$@.",
+"+#%*;;;==&%&==;;;*&......@#&*;;;*&$++.......+@#%*=--;;==&$@....++@#*=;;;;;===&$.+@$&->>>>=-=;;=*%$@..+@%&*>>===>>;;;*&#.+#$==-;;;;;;;;;;*%#......+@$&*=;;*&$@+..+@$&===;;;;;;;-==&$.+@#*==;;===->;;;=*$....++@$*=>>-%$@...........+@#*=->-%$@...@$&>>;;;>--*&%#@@...@#&*>>;;;;;;;;;>>*&....+@#$&*==;;;;;==$..+++@$%*=--;;>>-%#@.",
+"+#&*;;;==&&&=-;;;*%.....+@#&*;;;*&#@........+#$*=;;;-=*&$@@....++#$%&===>>;;>&%.+#%*;;;;;>>>;;-==$@.++@#$%%&&&*==;;;=*$.+@$==-;;-====;;;=*$......+@$=-->>*%#@+..+@$&>;;>>=-=>>;;>&%.++#$**>>;;;;;;;;=*$......+##%%%%$@++..........++@$$&%%$@++..#&*;;;;;---*&$#+++..+#&*>>>>>>>>>>>>>*%....++@$%*==;;;;;-=%....+@#%*;;;--**%$@+.",
+"+#%*;;;==&&&=-;;;*&......@$&*;;;*&$@......++@$%==;;;-=&%#++...++@#$$&*==>>;;;*%.+#%*;;;;;>>>;;>-=%#.++@#$%%%$%&*=;;;=*#.+#$==-;;=====;;;=&$.....++#%=--;>*%#++..+#%*;;;>>===>>;;;*%..+@#%*>;;;;;;;;;=*$.....+++@#$$#@@+............++##$###@.+..#%*;;;;;---*&$#@+...+#&*>>>>>>>>>>>>>*$....++#$&**=>;;;;-=%.....@#%*;;;-=*%##++.",
+"+#&*>;;-=*&*==;;;*%.....+@$**;;;=&$@+.....+@#%*=-;;;-=%$@++..++##$$$%&*=>>;;;*%.@#&*;;;;;>>>;;>-=%#.++##$$$$$$&*=;;;=*$.+@$==-;;=====;;;=*$.....+@#&=->>>*$@+...+@%*;;;>>===>>;;;*%...+#%&>>;;;;;;;;=*$......++@#@#@@+.............+++@##@+++...@%*>;;;;>-==*&$#@++.@#&*>>>>>>>>>>>>>*%...+@@$%**==;;;;;==$....++#%*;;;==%$@++..",
+"+#%*;;;-=*&*==;;;*%....++#$&=;;;**$#++..+++#&*=;;>>-=&%#@++.++@$*==&&&**--;;;*%.+#&*;>;;;;;;;;>>-&#.+@#*==&&%%&*=;;;=*$.+#$*=-;;==**=;;;=*$.....+@$&>>>>-&$@++..@#%*;;;--===--;;;*%..+++$%*===---;;;*&#.......+@@###@++............++@@###@+....+#$&*=--;;;;>*&%#@+.+#&*>>;;;;;;;;;>>*%.+++#$%==;;;>>=**&$#.....+#%*>>>*&$#++...",
+"+#$*;;;-==**==;;;*$...++@$%*=;;;=*&$@@+..+#$*==;;>>-=*&$#@+.+@#%===*&**=--;;;*%.+#&*>>;;;;;;;;>>-&$.+#$===**&**==;;;=*$.+@$==-;;=====;;;**$....++#$*>>>>-&$@+...+@%*;;;--===--;;;*%...+@#%**=-==-;;;*%#......+@#$%$$#@+...........++@#$$$$#@+...+@#$%*==;;;;;==&$#@.+#%*>>;;>;;>>>>>>*%..@#$&*--;;;>>**&$#@....++#$*>>>*%#@+....",
+"+@$&>;;--===--;;>&$..++#$%**=;;;=**%$@+.+@#%*==;;>>-=**%#@@.+@$&==-=**=*--;;>*$.+@%&>>>;;;;;;;>>-&#.+#%==-==**===;;;=&$.++#*==;;=====;;;=*#.....+#$*>>>>-%#++...+#$*>;;--=*=--;;;&$..++@$%*===--=;;;*%#.....++#$%&&&$#++..........+@#%&*&%$#@...++@#$%==;;;;;==*&$#.+@$&>>>>>>>>>>>>-&$.+@$&*=->;;;>-&%##++.....+@$*>>>*%#++....",
+"++$%==-;;>>>;;--=%$.++@$*==>>;;;>>-==$@.+#$*;;;;;>>>>>==*$@.+#%*;;;>>>>>;;>>>&$.++#$&**=->>>;;>--&$.@#$-->;;>->;;;;>*%#.++#$**;;;;;>>;;;**#.....+#%*;;;**$#+....+@$&->>;;>>>;;>>>&$..+@$%*->>>>;;>>>&$@....++@#==;;;&$@+.........+@#%==;;;&#@+....++@#$&***>>;;;=*#.++#$%&&&*&**&*&&%$#.@#$>;;;;===*&$#@++.....++@$&->-&$@+.....",
+"++@$*==;;>>>;;==*$@.++#$==>>>;;;>>-==$#.+#%*;;;;;>>>>>--=$#.+#%*;;;;;>>>;;>>-%#.++@#$&*==>>>;;>--%$.+#$=>>;;>>>;;;;>&$@..+@#%*;;;;;;;;;;*&#.....+#%*;;;*&$++....++#%->>;;>>>;;>>-%#..+@%&*>>>>>;;>>-%$@.....+#$==;;;&$@+.........+@$&=-;;;&$@+......+@#$%&*--;;;=*#.+++@#$%$%$%$%%$$##+.+#%>;;>>=*&%$#@++.......+@$&->-&$@+.....",
+".+@#$&*=->;>>-*&%#@.++#%=->;;;;;;;>-=%#.+#%*>;;;;;;;;;>-=%#.+@$%===;;;;;>>**%$#...++@$%==>;;;;>>-%$.+@#%*=>>;;;>>=*&$#@...+@$%==>>>;;-==&$@....++@$&>>>*%#++....++@$%*=>>;;;>>**%$@.++#&*=>>;;>--**%$@+....++#$==>>>*%#++.......++#$*;;->=&$@+........+@#$$&&**&%$#...++@@@#@###@#@@@++.+#$****&%%$#@++.........+@$&->-&$@+.....",
+"..+@#$&==>>>-=&%#@+.++#%=>>>;;;;>>>--$#.+#%*>>;;>;;;>>>--%#..+#$*==>>>>>>>*&$@+....++#$==>>>>>>--%#.++#$%*->>>>>>*&%#@+...++#$**>>>>>==*%#@.....+@$&---&$@++.....++@$%*->>>>>>*&$#+.++@%*=>>>>>==&%##++.....+@$*=>>>&$@+........++#%*;;--=%#@+........+++@##$$%$$@@...+.+++++++++++++...+@#%&&%$##@+++..........++#%---%#@+.....",
+"...+@#$*=>>>==$#@+...+@$==->>>>>>>-==$@.+@%&>>>>>>>>>>-==$@.++@$&*=>>>>>--%$#@+....++@#**>>>>>-==$@..++@$%-->>>>-&$#@+.....+@#%*-->>-=*&#@+.....++#$=--$#@+.......++#$%-->>>--%$#++.++@%&*>>>>>=*%#@++.....++@#*=>>-%#@+........+@$&*;;-==$@+...........+++@@#@@@+..........+..+.+.......+@##$##@+++.............@#$===$#+......",
+"....+@#$%%&&%$#@+...++@#$%&&*&*&*&&%$#@.++#$%&&**&**&*&%$#@..++@#$%&*&*&&%#@++.......+#$%&&&&&&%$#@...++##%&&*&&%$#+++......+@#$%&&&&%$#@++.....++@#$$$#@+........+++#$%&&&&&%$@+++..+@@$%&&&&&%$#@++.......++##$%%$$@+.........+@&*=->*&%#@+............+++++++++........................++@@++++...............+@#$$$#@+......",
+".....++@##$$##+++.....++##$$$%$%$$$$@@+..++##$$$%%$%$$$##++...++@@##$%$$$##++......+.++@#$$$%$$##++....++@##$$$##@++.........+@@##$$##@@++.......++@###@++..........++@#$$%$##@++.....++@@$$$$$#@+++.........++@#$##@++........++@%**-=&$#@+.................+.+..........................++.++..................++@@#@@++......",
+"......++@@@+@++.......+++@@#@#@#@@@++++..+++@@#@#@#@#@@++++.....++@@@@@@@+++...........++@@@#@@+@+.....+++@@@#@@@+++..........++@@@@@@+...........++++++..............++@@@@@@++.......++@@@@@@+@+...........++++@+@++..........++@$$$$$#+++.......................................................................+++++........",
+".........................+.+.+.+...........+.++++.+.+................++++.+.......+++.+++.+............+.+++.++++.+.........++.+++.+++.+............++++.+.........+.++.+....+.++.+......+.++.++++.+..........+.+++.+++.+......+.+++...+.++..+......+++.+.+............+...........++.+.....+........++............+..+.........",
+"......+++++++...........++++@+@+++........+++@+@@@@@+++...........++@+++@+++++..+++++@+@@@@@++........++@+@@@@@@@@++++...++++@@@@@@@@@@+@+........+++@+@@+@++++..++++@+@+++++@+@+++.....++@+@@@+@+@++.........+@+@@@@@+@++....++@+@+@+++@++@++....++++@@@@+++.........++@+@+..+..++++++...+++++++.+++++@+++.......++++@+++......",
+".....++@####@@++......++@@##$###@+......++@@#$$#$$###@+++.......++@@#$$####@@++.+@##$$$$#$##@@++....+++@#$#$$$$$$#$@@+...+@@##$$#$$$#$###@+.....++@@#######@@++..+@###$###@###$###@..+++@##$#$$$$###@@.....+++@##$#$#$###@+.++@###$###@######@+.++@##$#$####++......++@@###@++++@@####@.++@@###@++@@#####@+.....++@@####@@+.....",
+"..+++@#$$%%$$#@+.....++@#$%%%&%$#@+.....+@#$%%&&&&&%%$#@++....+++@#$%%&&&%%$$#@.@#$%%&&&&&%%$#@++...+@#$%&&&&&&&&&%$#@+.+@#$%&&&&&&&&&&%$#@...++@@#$%&&&&%%$$#@.+@#$%&%%%$$$$%%&%$#..++##$%%&&&&&&%$#@@....++#$$%&&&&&&%$#@.+@#$%%%%%$$$%%%%$#@.++#$%&&&&&$$#@+.....+@#$$%%##@+@##$%%$#.+@#$$%$$#@##$%%%$#@...+++@#$%%%%$##++...",
+"..++@#%%***&&$#@+....++#&*=----=%#@+....+#$=----->--=*%$@++...+@#$**-----==***#.#**---->---==%$#@++.+#$=----->-----=%#@.+#$=--->->->->--=*#...+@#$**-----==***#.@#**-----***-----**..+@#*==---->--==*$@....+@#*=-->->---**#.+#**-----***---==$#.+#$=-------&%#++....@#**--=&%###%&-=-**.+#$==-=*$$$*==-=**#...+@#$**---==%$#@+..",
+"..+@%&*>>;;;-=$#++...+@$*==>>>->&%#@+...@$%-->>>>>>>-=*&$@+.++@$$&*=->>>>=-==*$.$*=->>>>>>>-=*&$#@+.@$%-->>>>>>>>>--&$@.@$%-->>>>>>>>>>-==$.++@#$&*=->>>>=-==*$.@$*=->>--*=*-->>-=*.++@%==->>>>>>>-==$@...++#%==>>>>>>>>=*$.@$*=>>>>-=*=->>--%#.@#%=->>>>>-=&#@+....@$==-->*&$$$&*-->=*.@$&---==&%%==->>=*$..@@#%&*=->--=&&$#@+.",
+".+@#&*=>;;;;-=&$@++..+@$===>>>>>*&$@+...@$&->>>>>>>>>==*%#@.+@$%&*=->>>>>---==%.$==>>>>>>>>>-=**%#@.@$&->>>>>>>>>>>>*%#.@$&->>>>>>>>>>>>==%.+@$%&*=->>>>>---==%.#$==>>>>>===>>>>>==.++#$==>>>>>>>>>-=$#...++#%=->>>>>>>>==$.#$==>>>>>===>>>>-&$.@$&->>>>>>-=*#@+....#$==>>>=*&%&*=>>>==.#$*->>==***==>>>==%.+@$%&*=->>>>-=**%#@.",
+"++#$*==>;;;;>-*%#++.++#$=->;;;;;-=%#++..#%*;;;;;;;;;;;;;*$#.@#%-->;;;;;;;;;;>>&.%=-;;;;;;;;;;;;;&%#.#%*;;;;;;;;;;;;;=&$.@%*;;;;;;;;;;;;;>>&.@#%-->;;;;;;;;;;>>&.@%=-;;;;;===;;;;;-=.++#$=->;>;;;;>>-=%#...++#%->>;;;;;;;==$.#%=-;;;;;=-=;;;;>*%.@$&>>;;;;;>=*$@+....#%=-;;;>>***->;;;-=.#&*;;;;;=**>>;;;-=%.+#%-->;;;;>;;;;;&%#.",
+".@#%=->>>---;;=&%@+..+@$=->;;;;;>=&$@+..@%*>;;;;;;;;;;;;*%#.@$&->>;;>>>>>;;;>>&.$=-;;;;;>>;;;;;;*&$.@%*>;;;;;;;;;;;;=*$.@%*>;;;;;;;;;;;;;>&.@$&->>;;;>>>;;;;>>&.#$=-;;;;;===;;;;;-=.++@$==->;;;;;>--=#@...++@$=->>;;;;;;-=$.@$=-;;;;;=-=;;;;>&$.@$&>>>;;;>>=*#++....#%=-;;;>>*=*>>;;;-=.#&=;;;;;===>>;;;-=%.@$&->>;;;>>;;;;;*&$.",
+"+@$&->>>>---;;=*&#+.++@$%*=;;;;;>>*$@+..@$&=--;;=====;;;=*$.#%*;;;--=*=*=>>>>>&.$&=;;;--==*==;;;-=%.@#&=--;;=====;;;**$.@$&=--;;=====>>>>>*.#%*;;;--=*=*=>>>>>&.@$&*;;;-====--;;;=&..+@#$&**=;;;==*&$#@....+@#$&**=;;--=&%#.@$**;;;--;;;;;=*&$#.+#$&*=;;==*%$@@.....#%==;;;;;===;;;;;==.#&*;;;;;=--==;;;=*%.#%*;;;--==*==;;;-=%.",
+"@@%*;;;--->-;;-==$#...+#%&=>;;;;>>*%#++.+#%=--;;=====;;;=*$.#%*;;;-=**&**->>>>&.#&*;;;-=****=;;;-=%.@#%=--;;=====;;;=&$.+#%==-;;=====--->>%.#%*;;;-=*****>>>>>&.@$&*;;;--=*=--;;;*&...+@#$&*=;;;=*%$#@+....++@#%&*=;;--=&$@.@$&*;;;--;;;;;**%#@.+@$%*=;;==*%#++.....#$*=;;;;;===;;;;;=*.#&*;;;;;---==;;;=*%.#%*;;;-=****=;;;-=%.",
+"+#%*;;;>>;;;;;-==$@..++#$**>>;;;;>*&$@+.@#%==-;;=====;;;=*$.$&*;;;-=&%$%&=-->-%.#&*>;;-=*&&**;;;>-&.@#$==-;;=====;;;*&#.@#%=--;;=*===>-->-%.$&*;;;-=&%%&*-->>>%.+#**;;;--===--;;;*&....+@#%&=;;;**%#+++.....++@#$**;;-==&#@.+#&*;;;--;;;;;*%$@+..+@$**;;=*&#@++.....#%*=;;;;;===;;;;;=*.#&*;;;;;>->==;;;=*$.$&*;;;-=&%&**;;;>-&.",
+"+#%*;;;>>;;;;;-==%#..++#%*=;;---;;=*%@+.+#$==-;;>>>;;;;;=*%.$*=;;;=*%$###$%&%%#.#&*;;;-=&%$&*>>>>>&.+#%==-;;==-;;==*&$@.+#$==-;;===;;=**&$$.$*=;;;=*&%$%&*=***$.+#%*;;;>>>>>;;;;;*&.....+@$&*;;;**$@+.......+++@$&*;;-==%#+.@#&*;;;;;;;;=**$@++..+@$&*;;=*&#@.+.....@%*=;;;;;-=-;;;;;=*.#%*;;;>>;;;==;;;=*$.$*=;;;=*%$$%*>>>>>&.",
+"+#&*;;;;;;;;;;-==$#..+@#**=;;---;;=*&#+.+#$==-;;>>>;;;;;=*%.$*=;;;=*$#+@@###$#@.#&*;;;==%$$%*->>>>&.+#$==-;;=-=;;==*$#@.+#$==-;;===;;**&$#@.$*=;;;=*%$%&**==*&$.+$&*;;;>>>>>;>;;;*%.....+@$&*;;;*&#@+.....+++++@#&*;;-==$#+.+#&*;;;;;;;;=*%$@+...++#&*;;=*%#@+......@%*=;;;;;-=-;;;;;=*.#&*;;;>>;;;==;;;=*$.$*=;;;*&$##%*->>>>&.",
+"+#%*;;;;;;;;;;-==%#..+@$*=-;;===;;-==$@.+#$==-;;;;;;;;;;==%.$*=;;;*&$@+++@@@@@+.#%*;;;==%$#$&-->>>*.+#$==-;;;;;;;=*%$@+.+#$==-;;;;;;;**$#@+.$*=;;;**%$%=----==$.+#%*;;;;;>;;;;;;;*&......+$&*;;;*&$++...++++@@+@#&*;;-==$#+.+#%*;;;;;;;;==&#@+...++$&*;;=*%#@+@++...@$*=;;;>>;;;>>;;;=*.#&*;;;--;;;--;;;=*$.$*=;;;**$##$&-->>>*.",
+"+#&*;;;;;;;;;;-==%#.+@#%==-;;===;;-==%#.+#$==-;;;;;;;;;;-=&.$*=;;;*&$@+++++++++.#&*;;;==%##$&-->>>*.+#$==-;;;;;;;=*%$@+.+#$==-;;;;;;;*%$@++.$*=;;;=*%%&->>>-==%.+#&*;;;;;;;;;;;;;*&.....+@#&*;;;*&#@....+@##$###$&*;;-==$#+.+#&*;;;;;;;;==&$@++..++#&*;;=*&#@#@@@++.@%*=;;;>>;;;>>;;;=*.#&*;;;--;;;--;;;=*$.$*=;;;*&$@#$&-->>>&.",
+"+#%*;;;>>;;;;;>>-&$.+@$&=--;;===;;--=&$.+#%==-;;;;;;;;;;-=&.$*=;;;=&$@+++@@@@++.#%*;;;==%$#$&=->>>*.+#$==-;;;;;;;=*&%##.+#$==-;;;;;;;*&#++..$*=;;;**&&*->>>>==%.+#&*;;;;;;;>;;;;;*&......@$&*;;;*&$++...+#$%&%%$$&*;;-==$#+.+#&*;;;;;;;;-=*%#@+..++#&*;;=*&$$$$##@+.@$*=;;;>>;;;>>;;;=*.#%*;;;--;;;--;;;=*$.$*=;;;=&$##$*-->>>*.",
+"+#%*;;;>>;;;;;>>-%#.+#%*>;;;;;;;;;;>>&$.+@$==-;;=====>>>>>&.$*=;;;=*%#@@@##$$#@.#&*;;;==%$$%&-->>>&.+#$==-;;---;;===**#.+#$=--;;---;;*%#+...$*=;;;==&&*;;;;;>-&.+#&*;;;--===--;;;*%.....++$&=;;;*&$@+...#%*>>>&%%**;;===$#+.+#&*;;;>->>>;;=*%#@...@$&*;;=**%%===$#@.#$*=;;;==;;;==;;;=*.#&*;;;-->>>;;;;;=*$.$*=;;;=*%$$%*>>>>>&.",
+"@#%*;;;-->>>;;>>-&$.+#%*;;;;;;;;;;;;>*&.+#%==-;;==*==>>>>>&.#*=;;;=*&$#$$%&%%$#.#&*;;;==&%%&*->->>&.+#%==-;;---;;-====%.+#%==-;;---;;&$@+...#*=;;;=****;;;;;>>&.+#&*;;;--=*==-;;;*&.....+@$&*;;;=&$@+...#&*;;>*&&*=;;-==$@+.+#&*;;;-->>>;;==&$@.++@$&*;;==**&===%$@.@%*=;;;==>>>==;;;=*.#%*;;;>->>>;;;;;=*%.#*=;;;=*&%%&*>>>>>&.",
+"+#%*;;;->>>>;;>>-%#.@$*=;;;>----->;;;=*.@#%=--;>===*=>>>>>*.#%*;;;>-*&%%&-----$.$&*;;;-=*&&*=;;;==%.+#%=--;;===-=>>->-&.@#%==-;;====*%$@+...#%*>;;>-=**==>>>>>*.@$%=;;;-==*=--;;;*&...+@@#%*=;;;=*%#@@+.$*=;;;==**=;;-=*$#+.+$&*;;;>-===;;>--&$..+#%*=;;===*=;;;=&#.@%*=;;;==*=*==;;;=*.#&*;;;--===;;;;;=*$.#%*;;;>-*&**=;;;==&.",
+"+@$&>>>>>===>-==*$#.@$*=;;;---=---;;;=*.@#&==-;;==*==>>>>>&.#%*;;;>>*****>>>>-%.$&=;;;--=**==;;;==$.@#&==-;;====->>>>>&.@#&=--;;====*%#++...#%*>;;>>=====>>>>>&.@$&*;;;-==*==-;;;=&...+@$%&*=;;;=**%#@+.$&=;;;=====;;===#@+.@$&=;;;--===;;>>-&%.+@$%*=;;=====;;;=&$.#%*=;;;==***==;;;==.#&*;;;--===;;;;;=*%.#%*;;;>>=**==;;;=*%.",
+"+@#&->>>>===--==*$@.#%*=;;;>--=-->;;;==.@$&=--;>=====>>>>>&.#$&>;;>>=====>>>>-%.$&=;;;-======;;;=*$.#$&=--;;=====>>>;>*.@$&=--;;==*=&$#+....@$*>;;>-=====>>>>>&.@%&=;;;-==*=--;;;**..+@#$**==;;;==*&%#@.#&=;;;=====;;==*#@+.#$&=;;;--*==;;>>>*&.@#%**=;;=====;;;=*#.#&*=;;;=*****=;;;=*.#&*;;;-====;;;;;=*$.#$&>;;>-=====;;;=*$.",
+"++#%*=-;;;;;;;=**#@.#%->;;;;;---;;;;;>-.#&*;;;;;;;;;;;;;=*%.+#%===;;;;;;;;;>=*$.%--;;;;;;;;;;;>>*&#.#%*;;;;;;;;;;;;;>>&.#%*;;;;;;;;==#@+....@#%*=-;;;;;;;;;;=*$.#%--;;;;;===;;;;;>-.++@$-->;;;;;;;>>-$@.#%&>>;;;;;;;;*&$#++.#%->;;;;;==*=-;;;>-.@%&;;;;;;;;;;;;;**#.#%->;;;>>*&*->;;;>-.#&=;;;;;**=>>;;;=*$.+#%===;;;;;;;>>-*%#.",
+"++@$*==;;;;;;;=*&#+.#%->;;;;;===;;;;;>-.@&*;;;;;;;;;;;;;*&$.+##**=;;;;;;;;>>*&$.$=>;;;;;;;;;;>>>%$@.#&*;;;;;;;;;;;;;>>%.@%*;;;;;;;;==$@++...+@$**=;;;;;;;;>>*&$.#$->;;;;;===;;;;;>-..+#$->>;;;;;;;>>-$#.@$&>>>;;;;;;>&%#++..#$=>;;;;;=**==;;;--.@$*;;;;;;;;;;;;;*&#.#%->;;;>-&&&>>;;;>-.#%*;;;;;***->;;;*&#.+##**=;;;;;;;>-=%$@.",
+".+@#&*=>;;;;;;=*%@+.@$&*=====***=====**.@$%*===========*&$#..+##%&**=====**&%#@.$%&==========**%$#+.@$%*============**$.@#%*======*&$#++....++##%&**=====**&%$@.@$&*=====&**=====*&.++@#&*=========*&#@.+#$%**=====*&%#@+...@$&*====*&&%&**=**&.@#%*============%$@.@$&*===**%%%**==***.@$&*===**%&&*==*&$#.++@$%&**====**&%$@+.",
+"..+@#$%&*===**%$#@+.@#%&*****%%%*****&%.+#$***********&&$#+.+++@#$%%*****&%$#@+.@$%*****=***&&$$#@+.+#%&**=*=*=*****&%#.+#$&***=***%#@+......++@#$%&*****&%$#@+.@#%&*****%%%&****&%..+@#$&&**=*==**&%#@.++##%&**=*=%%#@++...@#%&*****$##$%&**&%.+#$&***=*=**=**&$#+.@#%&***&&##$%&***&%.+#%&****$$$$%&**$#+..++@#$%%*****%$#@++.",
+"...+@#$%%&*&%%#@@+..+@$$%&%%%###%%&%%$$.+@@%%&&*&%&%%%$$@++...+++@#$%%&%%##@@++.+@#%&&*&&&&%%##@+.+..+#%%&&&&&&&&%%%$$@.+@#%%&&&&%$#@++......++++@##%&&%%$##@++.+@#%%&%%%###%&&&%$#...+@#$%&&&&&&&%$#++..++@##&&&*&##@++....+@#%%&&%$#@@@#$$$$#.++#%%&&&&&&&&&%%#@+.+@$$%&%$$@@@$$%%$$#.+@#%%&%$#@@##%$$#@+..+.++@#$%%%%$##@++..",
+"....++@###$###@++....+@@####@@@@@####@+..++@######@##@@@++......+++@@###@@@+++..++@@#######@@++++...+++@@#########@@@++...+@######@+++..........+++@@#@#@@+++...+++@####@@@@@@@##@@....++@#@###$##@@@+....+++@@####@@+......+++@#@##@@++++@@@@+..++@###########@++..++@@#@#@@@+++@@@@@+..++@@@@@@+++@@@@+++.....+++@@@#@@+++....",
+"......++@@@@++++......+++++++++++++++++...++++++++++++++.+........+++++++++.......++++@++++++++.......+++++@+@++++@++.....++++++++++.............+.++++++++......++++++++++++++++++....+.++++@+@@++++......++++++++++........+++++++++..+.++++....++++@+@@+@+++++.....+++++++.+++++++++...+++@+++.+.++++..........++++++++......",
+"....+...+.+..................................+..+...+.................+..............+..+.+.+............+.........+...........................+..........+..........+.+........+.........+......................+.+.+...........+++++@++........++++@++..................++++++++..............+++++...........................",
+"..+++++@+@++++++..........++@++++++.......+++++@+@++++...........++++@+@+@+++......++++@++@++@++++....+++++++.++++++++....+++++++.+.+++++++....++@+++++.+++++++...+++++++++++@+++++...+++++++++++@+@+++.....+++@++@++@++++.......++#####@@+.....++@####@++..............+++@#$###++...........++@@@@+++.........................",
+"++@@#####$####@@+......+++@@####@@++....++@@########@@@+.......++@@########@+++..+++@###$##$##$#@@+..+@@###@@@@@####@@+.++@@###@@@+@@####@+.++@@###@@++@@@###@+.++@@#####@@#@####@@.++@@#####@@#@####@@...++@@#####$####@@+....++@#$%%%%##@.....+@#$%%$$@++.............+@#$$%%%$#@+.........++@#$$$#@+.........................",
+"+@#$%%&&%&%&%$$#@++...++@#$%%%&%%$#@++..+@#$%%&&&&&%%$#@++....++@#$%%%&&%%%$#@+.++@#$%&%&&%&&%%%$#@.+@#$%%%$$$#$$%%%$#@.+@#$%%%$$###$$%%$%#.+@#$$%%$$###$$%%$%#.+@#$%%%%%$$$%%%%%$#.+@#$%%%%%$$$%%%%%$#..++@#$%%&&%&&%&%$#@....++#$===--&$#++...+@%->>*&$@+............++#$&=-===%#++........+@#$===%#@+........................",
+"@#%&*****=****&%$@+.+++@#%%******&%$@@+.@$%&********&&$#@++.+.+#$%&********&%#@.+@$%&*****=**=**&%#.@$%&****&%&&****&%$.@$%&****%%$$&&***&%.@$%&****&%%%&****&%.@$%&*****&&&*****&%.@$%&*****&&&*****&%..+#$%&*******=**&%#....+@$&=----*&$@....@#%->>=*%#@............+@%&*->--=&$@+.......++#%&===&$#@........................",
+"@%*;;;;;;;;;;>>-%$@..+#$&*>>;;;;;==*$@+.#$->;;;;;;;;>>*&%@+..@@$&*;;;;;;;;;;*%#.+#%*;;;;;;;;;;;;;*&.@%*;;;;;=**>>;;;>-%.#$->;;;>>&&&>>;;;--.#$->;;;>>*&&>>;;;--.#$->;;;;;===;;;;;>-.#$->;;;;;===;;;;;>-.++#%>>>;;;;;;;;;;*%...++#%*;;;;>=&$@++..+#%=-->>&$@+..........++@&*=;;;;;*$#+......++@$*=;;;=*$@+.......................",
+"#&*;;;;;;;;;;>>>&%#.+@$&*=>>;;;;;-==%$@.$%->;;;;;;;;>>=*&$@.+@$&*=;;;;;;;;;;*&#.+#&*;;;;;;;;;;;;;=&.#&*;;;;;===>>;;;>-%.#%->;;;>>***>>;;;>-.#&->;;;>>*=*>>;;;>-.#%->;;;;;===;;;;;>-.#%->;;;;;===;;;;;>-.+@$&>>;;;;;;;;;;;=&...++#%*;;;;>**$@+...+#%=-->>*$#@..........++@&*=;;;;;*%#++.....++#%==;;;=*%#++......................",
+"#&*;;;;;;;;;;>>>=&$.@#%*==>;;;;;;--=&%#.#%->;;;;;;;;;>==*%#.+#$*==;;;;;;;;;;=*$.@$*=;;;;;;;;;;;;;**.$&=;;;;;===>;;;;>>%.$%>>;;;>>***>>;;;>>.#%->;;;;>===;;;;;>-.$%->;;;;;-=-;;;;;>-.$%->;;;;;-=-;;;;;>>.+#$&>>;;;;;;;;;;;=&...++$&*;;;;;*&$@++..+@$==->>*&$@++.........+@%*=;;;;;*&$+......+@$%==;;;==&#@+......................",
+"@%*->>;;-----;;;>-%.@$&>>;>>-----;;;=&$.#%*=;;;>>--->>;>>&$.@$&>>>;;-----;;;=&$.@$*=;;;--;;;--;;;=*.#&*;;;>-***==;;;==%.#%==;;;==&&*==;;;==.#&==;;;-=>->=-;;;==.#%*=;;;>>===>>;;;=*.#%*=;;;>>===>>;;;=*.+#%*>;;>>--->>;;;**...++#&=;;;=**$@+....+@#%**;;=*%#@.........+++#$&*=;;;*&#@.....++@$&>>;;;>>&$@++.....................",
+"@$&=--;;-====;;;>>&.#%*;;;>>===--;;;=*%.#$*=;;;>>-=->>;;>*$.@$&>>;;;-----;;;=*#.@$*=;;;--;;;--;;;=*.#&*;;;--*&**=;;;==%.#%*=;;;==&&**=;;;=*.#%==;;;-=>>>-=;;;==.@$*=;;;>>===>>;;;=*.@$*=;;;>>===>>;;;=*.+@$&>;;>>--->>;;;*&....@#&*;;;=*%#@++....+@$&*;;==*$@++.........+@#%*=;;;*&#++.....@#%*>>;;;>>*%#+......................",
+"+#%=--;;==*=*>>>>>&.#&=;;;-=****=;;;>-%.@$&*;;;--===--;;;*%.#$*;;;>>=====>>>**#.@#*=;;;==;;;==;;;=&.#&*;;;-=*%&*=;;;=*%.@$&=;;;==&%&==;;;**.#$*=;;;--;;;--;;;=*.+#%*=--;;;;>;;--=*$.+#%*=--;;=-=;;--=*%.+@$&->>-==-=;;--=*$....@#&*;;;**$@+......++#%*->>-=%#@...........+#$&=;;;*&#@....++@%*=;;===;;=&%@+.....................",
+"@#%==-;;=***=-->>>*.$&=;;;==&&&**;;;>>&.@#&*;;;-====--;;>*%.@%&>;;>-=====>>>*&#.@#**;;;==;;;==;;;=&.#&*;;;==&%%&*;;;=*%.@#%*;;;==&&&==;;;*&.#%*=;;;--;;;--;;;=*.+@#%==-;;>>>;;-==%$.+@#%==-;;-=-;;-==%$.+@$%-->=-==-;;-==%#...++#&*;;;*&$@+.......+@#&->>>>*%#++.........+@$&*;;;*&$++....+@%&=;;-==;;**$@+.....................",
+"+#$==-;;=***=->>>>&.$*=;;;==%$$&*;;;>>&.+#&*;;;--===--;;;&$.@$&>;;->=====>>>*&#.@#&*;;;==;;;==;;;*&.#%*;;;-=%$%&*;;;=*$.+#%*>;;==&&&==;;;*%.@$*=;;;--;;;--;;;=*.++#$*=-;;>>>;;-=*$#.++#$*=-;;=-=;;-=*$@..+#$==-=-==-;;-=*%@...+@#&*;;;*&$++.......++#$*=;;;*%$++..........@#&*;;;*&$++...++#%**;;===;;=&%@+.....................",
+"+#$=--;;===*=>>>;>*.$*=;;;=&%##$*-->>>*.@#&*;;;>>-->;;>>>&$.@#%==-;;;;;->===&$@.+@#&*====;;;====*%$.#&*;;;==&$$**;;;=*$.+#$*>>>>-***-->;>*%.@%*=;;;>>;;;;;;;;=*..+@#%&=->;;;>>**%#@..++#%&*;;;;;;;*&$#@.++@#$&**=>;>;;**%#@...++$&*;;;*&#@.........+@$*=;;;=&$@+..........@$&*;;;*&#@....++@%*=--***--**%@+.....................",
+"+#$==-;;=====>>>>>&.$*=;;;*&$##$&-->>>*.+#%*;;;>>>>>;;>>-%$.+#%*=-;;;;;>>===*$#.++##&&**=;;;=***&$@.#%*;;;-=%$%&*;;;=*%.+@$&->>>>=*=--;>>&$.@$*=;;;>>;;;;;;;;=*...+@$&*->;;;>-*&$@+..++@#%*;;;;;;;*%#@+...+@#$&*=>;;;;*&#@+...++$&*;;;*&$++........+@#%*>>>-=%#++........++#&=;;;*&$++....+@%%*==&&&==*&%@+.....................",
+"+#$==-;;;;;;;;;;=*%.#*=;;;=*&$%%*->>>>&.@#&*;;;;;;;;;;==&%#.+#$&*===>>>;;;;;*%#..++@#$&*=;;;=*&$#@+.#&*;;;==&$$**;;;=*$.++#%==-;>=*=;;--=%#.@$*=;;;;;>->;;;;;=*..++@$&*>>;;;>>*&$@+....+@$&==;;;=*&$@+....+@#%&=-;;;==*%$#+....@$&*;;;=%$@..........+#$*>>>--&$@.........+@#&*;;;*&#@.....++@#$$$$#$$$$#@++.....................",
+"+#$==-;;;;;;;;;;=*$.$&=;;;==&&&**;;;>-&.+#&*;;;;;;;;;;=*&$@.+#$&**==>>>;;;;;*%#..+++@#%&=;;;**$#@++.#%*;;;==%%%&*;;;=*$.++#$==-;;===;;-==%#.@$*=;;;;;->-;;;;;=*..+@#$&=>>;;;>>**$#@....+@#%*=;;;=*%#@+....++#%*--;;;=**&$#@...++#&*;;;*&#@..........+@$&>>;--&$@++........@#&*;;;*&$++.....+++@@@@@@@@@+++.......+.++.+.+++.+...",
+"+#%==-;;;;;;;;;>*&#.#**;;;===**==;;;>-&.@#&*;;;;;;;;;;=*&$#.@#%**===>>>;;;;;*&#....++#$&=;;;=&$#++..#%*;;;==&%&*=;;;=*$..+@#*==;;===;;==*$@.@$&=;;;;;-->;;;;;=*.++@$&*=>>;;;>>=*&$@....++#%*=;;;**%#+....++@$%*->;;;==**&%#....@$&*;;;*&$++..........+@$**=;;*&$#++......++$&*;;;*&#@.......+++@+++++++++....+++@@+@+@+@++@++++.",
+"+#%=--;;----==*&%#@.#%*>>>;;--->>;;;=*%.+$&*;;;---=-;;--=%$.#%*>>;=======;;;=*$....++#%&=;;;=*$#++..#%*;;;-=****=;;;=*$..++#%**;;==-;;=&%#+.+#&*;;;;;--=;;;;;*%.+@$%==-;;===;;--=%$....+@#%*=;;;=*$#++...+@#&*=;;>>>==;>>*%....+#&*;;;=&$@+...........+@$&*;;==&#@+.....++@$&=;;;*&$++..........++.++.......++@@####$###$$#$#@+.",
+"@$&=--;;---==*%%#@+.@$*>>>;;->>>>;;;=*%.@$&=;;;--===;;--=&$.#&*;;;=======;;;=*$....+@$%*=;;;=*%#@+..#$*;;;-==**==;;;=*$...+@#&*;;---;;*%$@+.@#&*;;;;;=--;;;;;*&.@#%*-->;;=--;;>--*%....+@$&*=;;;=*%#@+..++#$*==;;>>>==;;>*&...++$&*;;;**$#++.........++@$&*;;==*$#+.....++#%&=;;;*&#@.......................@@$$%&&%&%&%&&%&$$#.",
+"@$&>>;;;>>>==%$#@++.@#%->>;;>>>>>;;;=*%.@%==;;;>>===>>;;;=*.$*=;;;>>->>>>;;;=&$...++#%*--;;;-=*%#++.@$&=>>;;>>->>;;;*%#...++#%*->;;;>>*%#++.+#%*;;;;;===;;;;;*&.@$*=;;;;;-==;;;;;==....+#%*->;;;-=*%#++.++#&->>;;>>>>-;;;=*...++#&=;;;=*&#@+...........+@$*>;-==%$@.....+@#%*=;;;*&#@.......................@&&===--=-=-=---=*$.",
+"@$*>>;;;>>>=*%#@++..+#%&==;;;;;;;---==$.#$==;;;>>=*=>>;;;=*.#*=;;;>>>->>>;;;**#....@$%*>>;;;--*%$@+.+#%=--;;>>>>>;;>*%#...++#$*->;;;>>*%#+..@#%*;;;;;===;;;;;*%.#%=-;;;;;-=-;;;;;==..++@$&*>>;;;--*%$@+.+@$&>>;;;>>>>>;;;=*....@#&*;;;>-*%#++..........+@$%=-;;>&$@....++#%*->;;;*&#++......................#**--->>---->>>>-=%.",
+"#$*>>;;;>>>=*%@++...+@$&*=;;;;;;;---==%.#$==;;;>>=**>>;;;=*.$&=;;;>>>>>>>;;;*&#..++@$&*->;;;>-*&$@+.+#$==-;;>>>>>;;>&$#....+@#&->;;;>-&$@+..+#$*>;;;;=*=;;;;>*$.#%==;;;;;===;;;;;==...+@$&*>>;;;>-**$@+.+@$&>>;;;>>>>>;;;=&...++#&*;;;>>*&$@+..........++#%==;;;*%#....+@$&*->;;;*&$+.......................$*=-->>>>>>->>>>-=&.",
+"@%*>;;;>;;;=*$@+....+@$*=-;;;;;;;;;;-=$.#$=-;;;;>****=;;;==.#&*>>>>;;;;;;--=&$#...++$**>;;;;;>=*%@+.++#$**>>;;;;;-==%#@....++#%==;;;==%#++..+@$&-->>-***>>>--&$.#$=-;;;;;===;;;;;==..++#%*=;;;;;;;**%@+.++#%-->;;;;;;;;;>*&...++#%*;;;>>=*%@++..........+@$**;;;=&#...++@%&=>>;;;*%#++......................$==;;;;;;;;;;;;;;>&.",
+"@$&>>>>>>>>=*#@+....+@#*==;;;;;;;;;;==%.@#==>>>>>&%%**>>>==.#%&-->>>;;;>>==*%#+...+@#%*>>;;;>>*&%@+..+@#$*>>;;;;>==*$@+.....+@$*=>>>=*$@++...+#$=--=-&&&=---=$#.@$*=;;;;>*=*>>;;>==...+@%&*>>;;;;>**$@+.++#$=--;;;;;;;;>>*%....+#%*>;;;;=*&@+...........+@#%*;;;*&#...++#&*=>;;;;*&#++......................$=->;;;;;;;;;;;;;>&.",
+"@#$&&****&&%$@+......@#*==;;;;;;;;;;==$.@#$%&**&%$$$$%&&&%$.+#$%&&*******&%$#@+...++@#%&&****&%$@++..++@#$&&****&&%$#++.....++#$%&&&%$#++...++@#$%&%%$$$%%%%$#@.@#$&&***&&%&&&**&%$...++@$%&*****&%##++..+@#$&&********&&%#...++#$&>>>;>=*%#++...........+#%&;;;*%#...++@&*=>;;;>*$#+.......................$*=>>;;;;;;;;;;;>>%.",
+"+@@$$$%%%$$#@++......+@#%&===*=====*&$#.++#$$$%$$#@@##$$$#@.+@@$$$$$%%$%$$#@+++....++@#$$%%%$$#@@.....+++##$$%%%$##@@+......+++##$$$##@+.....++@#####@@@##$##@+.+@##$$%$$##$$$%$$$#....++@#$$%%%%$#@++...++@##$$%%%&%%%$$#@....+@#&->>>>**%@++...........+@#%***%#@...++@%&*>>>>>%$@+.......................#$%&************&%$.",
+".++@#@#@#@@@++.......++##%**&&**=***%#@..++@@@#@@+++++@@@@+..+++@@##@##@@@@++.......+++@@##@#@++.+......++@@@#@#@@@+..........++@@@@@++.......+++@@@++@++@+@+++..++@@#@#@@@@@@##@@+...+.++@@@##@@@@++.....+++@#@######@#@++.....+@$%&&&&%##++.............+##&&&##+....+@#$%&**&%$#++.......................@##$$%%%&%&%%&%%%##.",
+".+.+++++++++.........+++@#%&$$%&&&%%#@+...+++++++++.+.++++....++++++++++++..+.........++++++++++........+.++++++++.+............++++...............++..+++.+.....+++++++++++++++++........+++++++++.........+.++++++@++++.......++@#$$%$#@@+..............++@$$$@++......@@#$$$%##++........................++@@##########@#@@+.",
+"..........................................++++++..........................................++++++................................++++++++++.......................+++++++...................++++++................+.+++........++++++.................++++++++...................................................................",
+".......++++++............................+@@@#@@++.......................................++@#@@@++.............................++@@#####@++......................+@@##@@++................++@@@+@+..............++@@@@++....+++@#@@@+..............+++@@###@++..................................................................",
+"......++@##@@+..........................+@#$%$$#@@+....................................++@#$$$$#@++..........................++@@$$%%&%%$#@.....................+@#$$$$$@++..............++#$$$$#@+............+@#$$$$@@+...+@#$$%$#@++............+@@$$%%$$#@+.................................................................",
+".....+@@$$$$#@+.........................@#%&&**%$@++...................................+@#$&&*&%$@+..........................++#$%******&%#.....................@#%&**&%$@++............++#$%&&%$#++..........++#$&&&&$#++..@#$&&*&%$@+..........+++#$%&***&$#++................................................................",
+"....++@%&===$#@+........................@$=>;;;=&$@+..................................++#%*;;>>>%$@.........................++#$&>>>;;;;;&%.....................@$=-;;;=*#@+............+@$==;;;&$@+..........+@$%;;;==$@+..@%&;;;>-%#@+..........+@%*=;;;;>&$@+................................................................",
+".....@$&*=-=&%#++.........+..++.........#%->;;;=*$#++................++.++............+@$&*;;>>>&$@........+...+.+.........++@$&*>>;;;;;;&%.........+.+.+.+.....#$->;;;=*$#++..........++#$==;;;&$#++........++#$*;;;==$#++.@%*;;;>>&$@+++........+@&*=;;;;;*%#++.....+...+.+...+..........+.++.+.++..............+...+.........",
+"...++@$*=;;;=&$@+.......++++++@+++......#$*=;;;==&$@@++.........+++++@+@+++++.......+++@$%*->;;;*%@......+.++@++++++.......+@#%=-;;;---==&$......+++@+@+@+@+++..#$*=;;;-=&$@@++........++#%==;;;*%#+.........+#$&*;;;-=%#++.@$&-->;>*%#@++++.+...+.@#$*==;;;*%#++....++++@+@+@@+@+++......++++++++++@++.........+.+@@++@+++.....",
+"....+@$==;;;=*$@+......++@@#####@@++....@$*=;;;-=&%$#@@@++....+++@####$#$##@+++...+++@##%**->;;;*%#.....++@###$###@+++....+@#$&--;;;--===%#...+++@@##$######@@+.#$*=;;;-=*%$#@+++......+@$%=-;;;*%#+.......++@#$**;;;==%#@..@$&=>-;;*&$$###++.....++@$&=-;;;*&$+....++@#####$######@++...+@@#########@@++.....+++@@##$###@+++...",
+"....+@$*=;;;=*&#++....++##$%%&%%$#@@+...@$&=;;;--**&%$$#@++.+.+@#$$%%&%&%%%$#@+..++@#$$&&*=->;;;*%#..+++@#$$%%&%%%$#@++...+@$&*->;;;---=*%#..++@#$$%%%&&&&%%$#@.@$&=>;;--**&%$$@++....++@$&=-;;;*%#+......++@#%&*=;;;-=%#@..+$%=->;;**&%$$$#@++....+@#%==;;;*&#@+...@#$$%&&&%&&&%%$$@@..+@#$$%%%%%%%$$#@@+...++@#$$%%%%%$$#@++..",
+"....+@#&*>>>>>%#@....++#%&*=====*&$#++..@#&*;;;>>---==%%##+.+@@$$&===-=-====$#+.+@@$%%==--->>;;;*&#...@@$%%====-==&%$#+.++@$*==>>;;;>>-==%#.+@@$%&===-===-==*&#.@#&*;;;>>--===%$#@+...+@$&*-->>-*%#@......+@#*==-->>>-=&$@+.+#%==-;;=**====*#@+.....+@$&=;;;*&#+....#&*====--===-==%$#+.@#&*====*=====%$#@+.+@@$%%===--==&%$#++.",
+".....+@$&->>>-&#@+..++#$&*=-->--=*&$@@..+#&*;;;>>->-==**%$@.+@$%**==->----==&%@.+@$%**==->->>;;;*&#.++#$%**==>----**%$@.++#%==-;;;;;>--==%#.+@$%&*==-->-----=*$.+#&*;;;->>->==*&$#@...+@$&*->>--*%@+.....++#$*==>->>--=&$@+.+#%==-;;===--==*%#+.....+@$&*;;;*&$@....$*===---->-----*&$@.#$*=---==->-==*%$#@.+@$%**==-----**%$@@.",
+".....++#$%**--%#++..++#%>>>;;;;;;;*&$@+.@#&*;;;;;;;;;;>>>%$.@$%>>>;;;;;;;;;;*&#.@$%>>>;;;;;;;;;;*%#..@#%>>>;;;;;;;>>>%$..@@%->>;;;;;;;>>-%#.@$%>>>;;;;;;;;;;--%.@#&*;;;;;;;;;;-==$@..++@&*=;;;;;*%#@+.....@#%->>;;;;;;;*%#+.+@$==-;;---;;>>-%#+.....++$&*;;;*&#++...%=-;;;;;;;;;;;;>-%#.#%--;;;;;;;;;;-==$#.@$%>>>;;;;;;;>>>&#@.",
+".....+++#$%&==%#++..+@#&>>>;;;;;;;=*%@@.+#%*;;;;;;;;;;;>>&$.@$&>>;;;;;;;;;;;=*$.@$&>>;;;;;;;;;;;*&#.+#$&>>;;;;;;;;;>>*$.++#%->>;;;;;;;>>-%#.@$&>>;;;;;;;;;;;>-%.+#%*;;;;;;;;;;--=%#..++#&*=;;;;;*&#@.....++#%->>;;;;;;;*%#+.+#$==-;;---;;>>-%#@......@#&*;;;*&$++...%->;;;;;;;;;;;;>>&$.#%->;;;;;;;;;;--=%#.@$&>>;;;;;;;;;>>&$@.",
+".......++@#$=*#@+...+@$&>>;;;;;;;;=*&#+.+#&*;;;;;;;;;;;>>*%.#%*>>;;;;;;;;;;;=*$.#%*>;;;;;;;;;;;;*%#.+#&*>;;;;;;;;;;>>*%.++#$-->;;;;;;;>--$#.#%*>;;;;;;;;;;;;--%.+#&*;;;;;;;;;;>-=&$...+@%*=;;;;;*&#+.....++#$=->;;;;;;;*%#+.+#$==-;;-->;;>>-$#+.....+@$&*;;;*&#@....%=>;;;;;;;;;;;;>>&$.#%=>;;;;;;;;;;>--&$.#%*>;;;;;;;;;;;>*&#.",
+".......+++@@###++....@$&==->>>>>;;-=*$@.+#&*;;;;;===--;;;=&.$&=;;;--====-;;;=&$.$&=;;;--===;;;;;*&#.+$&=;;;--===>-;;;=&..+@#&*=->;;;=**&%#@.$**;;;--===>;;;;=&%.+#&*;;;;;===>>;;;&$...++@$&*=;;;*&$@......+@#$&&**===;;*&#@.+#$==-;;;;;>-=&%$@+......+$&*;;;*&$++...$*=;;;>>>>>>>>>>>*$.#$*=;;;;>===->;;>&$.#**;;;--===--;;;=&$.",
+".........+++@@++....+@$&===>>>>>;;-==$@.+#&*;;;;>=*=--;;;=*.$&=;;;-=***=-;;;*&#.$&=;;;-==*=>>;;;*%#.@$&=;;;->===->;;;=*...@@$&*->;;>=*&%#@+.#*=;;;-==*=;;;;>=&$.+#&*;;;;>===->;;;*%....+@$%*=;;;*&#@+.....++@#$%&&===;;*&#+.+#$==-;;;;;--*&$#++.....+@#&*;;;=%$@....$&*;;;>>>>>>>>>>>&%.@$&*;;;;>=*=->;;;*%.$*=;;;-=***--;;;=&$.",
+"..........+.++.+....+@%&>;;;;;;;;;-==$#.+#%*;;;--***==;;;=*.$*=;;;=**&&&*===*%#.$*=;;;==**==-;;;*&#.@$*=;;;;;;;;;;;;;=*...++#%*>>>>>*&$#@++.$*=;;;=***==-;;;*&$.+#%*;;;--***=-;;;*%....++@%&=;;;*&$+.......+++@##%**=;;*&#+.+#$==-;;;;;-=*%#@+.......@$&*;;;*&#@....$&*;;;-->>>>>>>>>*%.@#&*;;;-==**--;;;*%.$*=;;;=*****=;;;=*$.",
+"....................+#%*>;;;;;;;;;-==$#.@#&*;;;-==***=;;;=*.$*=;;;=*&$%%&===&$@.$*=;;;=****--;;;*%#.@$*=;;;;;;;;;;;;;=*...++#%&->>>>*%$@++..$*=;;;=****--;;;*&#.+#&*;;;-=***=-;;;*%.....+@$&*;;;*&$@+........++@@#**=;;*&#@.+#$=--;;;;;==&%#+++.....++$&=;;;*&$@+...#&*;;;>->>>>>>>>>*%.+#&*;;;-=***=-;;;*%.$*=;;;=*&&&*=;;;=*$.",
+"....................+#&*;;;;;;;;;;-==%#.+#&*;;;--***==;;;=*.$*=;;;=*&%$%%*=*%$#.$*=;;;==***--;;;*&#.@%*=;;;;;;;;;;;;;=&...++@%*>>>>>*&#@++..#**;;;>-===;;;;;*%#.+#&*;;;-=***=-;;;*&...+++#$*=;;;=&$@++.........++#%*=;;*&#+.+#%==-;;;;;==*%$@+.....++@$&*;;;=&$@++..#&*;;;-->>>>>>>>>*$.+#&*;;;-=***=-;;;*&.$*=;;;=**&**=;;;=*$.",
+"....................@#*=;;;=====;;-==%#.+$&*;;;;>==*--;;;=*.$&=;;;-=*&%&&===*&#.$&=;;;--*==;;;;;*&$.@$*=;;;>>--->->>>*&...+@#%*>>>>>*&$#@++.#$*>>>;;;;;;;;;;*&#.+$&*;;;-=*&*==;;;*&....+@#%&=;;;**%#@++.......++@#&*=;;*%#@.@#%=--;;>>>;;=*&#@+....+@#%*=;;;**%$@++.$%=;;;>->>>>>>>>>*&.@$&*;;;-=***=-;;;*&.$&=;;;--***--;;;=*$.",
+"....................@$*=;;;=====;;--=%$.@$&*;;;;;=*=->;;;**.#**;;;>-*****====*#.#**;;;>-===;;;;;*&$.@#*=;;;>>---->>>>*&..++#$&*>>>>>=*&$$@+.@$%->>;;;;;;;;;;*%#.@$&=;;;-=***=-;;;*&..++@#%&*=;;;=**%#@@.....+++@@$&*=;;*&#+.@#&==-;;>>>;;=**%#@..++@$%&*=;;;=*&%#@+.$&*;;;-->>>>>>>;>*&.@$&=;;;--***--;;;**.#**;;;--=*=->;;;**#.",
+"....................@#&=;;;=====;;--=&$.@%&=;;;;;===->;;;*&.#**;;;>-==*==-===*$.#**;;;>-===;;;;;=&$.@#&*;;;>>----->>>*%..+@$%*=>>>>>==*&%#@.+#$&*==---->>;;;*&#.@$&=;;;===*===;;;=&.++@#%**==;;;==*&%#@....+++##$&*==;;*&#+.@$&=--;;>>>;;===&%#..+@#%&*==;;;==*&%#@.$&=;;;>->>>>>>>;>=&.@$**;;;-==*==-;;;=&.#**;;;>-===>>;;;*&#.",
+"....................@#&*;;;;;;;;;;;;;*%.@%=-;;;;;;;;;;>>>*%.#$*>>>;;;;;;;;;;-=$.#$*>>>;;;;;;;;;;--%.+#%*>>>;;;;;;;;;;*&.++#$->>;;;;;;;>>-$@.++#$&*==--->-;;;*%#.#$=-;;;;;===;;;;;--..+#$=>>;;;;;;;>>-$@....+@#$%&*===;;*%#@.#&*;;;;>==-;;;;;-=$..+@$->>;;;;;;;>>-$@.%=-;;;;;>>;;>>>;;-=.@$=-;;;;;===;;;;;--.@%*>>>;;;;;;;>>>*%@.",
+"....................+#&*;;;;;;;;;;;;;*%.#$=-;;;;;;;;;;>>-%$.@$%->>;;;;;;;;;;-=$.@$%->>;;;;;;;;;;-=$.+@#%->>;;;;;;;;;;*%.++#%->>;;;;;;;>>-$#..+@$&*-->>>;;>>>&$@.#$--;;;;;===;;;;;-=.+@@$->>;;;;;;;>>-$@..++@#**===>>>;>*%#+.@&*;;;>>===;;;;;-=$.++#$->>;;;;;;;>>-$#.$--;;;;>>>;;>>>;;-=.#$--;;;;;*==;;;;;-=.@#%->>;;;;;;;>>-%$@.",
+"....................+@$&*===-=-=-=-==%$.@$*=======-===**%$@.+#$%**==========&%#.+#$%**===-===-===&$..+#$%**==-=-====*%#.++@$*===----===**$@.++@$&*->->>;;>>>%$@.@$*==--==***=-====&..+#$&*===--====**$@..++#%===->;;;;>&$@+.@$&====****==--=*&$..+@$&*===--====**$@.$*==--=====-======&.@$**==-==***=-====&.+#$%**=======**%$@+.",
+"....................++#$***========**$#.+#%**========*%%##+.++@#%&*======**&%#@.++@#%&*=====*==**%#.+++@#%&*======**%$#.++@#**========*&%#@.++#&*=;;;;;;>=*&$@+.+#%*====*&%&====**%...@#%**=======**%#@..++#%=>>;;;;;=*%#@+.+#%*==**%%&*====&%#.++@#&**=======**%#@.#%*====***==*=*==*%.@#%*=====&&&====**%.++@#%&*=====*%%##++.",
+"....................+++@%%&********&&#+.+@$%&*&&&**&*&$#@++..+@@#$&&*****&&%#@+..+@@#$&&*&*****&%$@...+@@#$&&***&*%$$@+..+@@%&&**=*=**&%$@+.++@%*=>;;;;>>*&%#@+.+@$%****&$$$&***&%$..++@$%%&*****&%%$@+..++#%->>;;;;;=*$#+..+@#***&%$#$&****%$@...+@$%%*&****&%%$@+.@$%***&&&***&&&**$$.+@$%&&***$#$&****%$.+++@#$&&***&*$#@++..",
+"......................++@####$#$#$##@@+.++@###$#$#$###@+++.....++@####$####@@++....++@####$######@+.....++@####$####+++...+@@#$#$$$$###@++...+@%**>>;;;>-&$#++..+@@#$$$##@@###$###@...+++#####$#$##@++...++#$=->;;;>>*%#@.+.++@####@@@@##$$##@+...++@@##$$#$$##@++..+@###$####$#$#####@.++@###$##@#######@@...+++@######@@+++...",
+"......................+.++@@@@@@@@@@++....++@+@@@@@+@+++.......++++@@@@@@++++......++++@@@@@@@@+++......++++@@@@@+++++.....+++@@@@#@@@@+++..+++@$%&****&&$#@++...+++@@@@++++@@@@+++...++++@@@@@@@@+++++...+@#%&&***&&%#@+.....++@+@++++@@@@++++.....++@+@@@@@@+@++..+++@@@@@+@@@@@@++++..+++@@@@@+++@@@@+++....++++@@@@@+++.....",
+"................................................................................................................................................................................................................................................................................................................................",
+".....................................................................................+.+............................................................................................................................................+++++@+............++++++.+.........+++++++.................................................",
+".....................................................................................++++++........................................................................................................................................++@@##@@++.........++@###@+.........+++###@@++...............................................",
+"...................................................................................++@@#@++.......................................................................................................................................++@#$**$#@+.........+@#&&&#@+........+@#$**$#@++..............................................",
+".................................................................................+++##$$$#@++....................................................................................................................................++#$$&*=%$#++.......++#$*=*$#++......++#$%*=%%$#++.............................................",
+".....+....+...................+..................+.+..............................+#%**-=%#@+..................................+.......................................+....+.............+..................+..+................+#$%**==%$#+........+@$&===&$@+.......+#$&==*&&$@++............................................",
+"..++++@+@+++@++.........+++++++@++++++......+++++++++++++.........+++++@+++++...++@$&*=--&$#@+++.......+++++...++++++.....+++++++++++++@+++...++++++++.+++++++.....+++++++++++++++....+++++++..++++@+++....++++++@@+@+++........+@$%>>>--%#@+........+#$*;;;*$#+.......+@#%=->>>%$@+............................................",
+".++@@########@@@+......++@@#########@++...+++@##@#@@###@@++.....+++@#######@+++..+#$==-;;*&%##@++....+@@@#@@++++@@#@+++..++@####@@@@#####@+..++@@##@@+++@#@##@@...++@###@@@@@###@++..++@#@#@@@++@#@#@@@..+++@#########@@+.......+@$*>>>--%#@+.......++#%*;;;*%#++......++#%-->>>*$@+............................................",
+"+@#$$%%%&%%%%$$#@++.+++@#$$%%&%&%%%%$#@..++##$$%$%$%$%%$$#@....++@#$$%%%%%$$#@+.+@#%==-;;=**%$$@++..+@#$$$$##@##$$$$#@+.+@#$%%%%$$$$$%%%$$#.+@#$%$%$$####$%$$$#.++@#$%%%$$$$$%%%$#@.+@#$$%$$#####$$%$$#..+##$%%&%&%%%$$##++....++#%*;;;=&%@+........++#&*;;;*&#+.......++#%&=;;;*%#@............................................",
+"@#%&*********&&$$@+.++@$$%**********&$#..+@#%&***&*****&%$#...++@$%&*******&%$@.+#$*=--;;===*&%$#++.@#$&**&%$$$$&&*&%$@.@#$&*****&&&*****&%.@#%&***&%%$$&&***&$.+@#%%****&&&****&%#.@#$&***&%$$$&&***&$.+@$%&*********&%$@+....++#%*;;;**$@++.......++#&*;;;*&#@........+@$&*;;;*&#++........++++++++.+++.......................",
+"#$=-;;;>;;;;;>==*$@.+@$*==>;;;;;>;;;-=$.++#%->>;;---;;;>>%$...+@%&*>;;;;>>>>>%#.+#%*;;;;;;;;;;**%@+.#$=-;;;=*%%&;;>>>%$.#$=-;;;;;===;;;;;-=.#$=-;;;>-*&*->;;;-=.+@%*;;;;;===;;;;;*%.#$=-;;;>-&&&->;;;-=.@#%>>>;;;;;;;>>-%#+....++$&*;;;*&$@+........++$&*;;;*&$++.......+@$**;;;*&#+......+++@@@#@@@@@@@@++.....................",
+"#%--;;;;;;;;;;==*%#.+#$===;;;;;;;;;;>-%.+@#%>>>;;>->;;;;>&$..+@#&*=;;;;;;;>>>&$.@#**;;;;;;;;;;=*&@+.#%=>;;;=*&&*;;>>>&$.#%->;;;;;===;;;;;--.#%--;;;>>*=*>>;;;--.+#%*;;;;;===;;;;;*%.#%--;;;>>***>>;;;--.@$&>>>;;;;;;;>>>%$+.....@#&*;;;*&#++........++#&*;;;*&#++........+#&*;;;*&$@......+@##$%$%$$$$$$##+.....................",
+"#%=>;;;;;;;;;;--=&$.@$&==-;;;;;;;;;;>=%..@#%>>>;;>>-;;;;>*$..+@$**=;;;;;;;;>>&$.+#&=;;;;;;;;;;=&%@+.#%->;;;==***;;;>>*$.#%=-;;;;;==-;;;;;>=.#%->;;;>>===>>;;;>-.+#%*;;;;;-=-;;;;;*%.#%--;;;>>=**>>;;;>=.@$&>>;;;;;;;;;>>%#@...++#%*=;;;*&#@..........@$&*;;;*&#@........++#&*;;;=*$#@...++@#$%&***&&&&&&%$#.....................",
+"@%*=;;;;;>-->;;;;*%.#$*;;;;;->-;;;;;=*%.++#%*=-;;;;;-->>>*%.+@#%>>;;;->-;;;;;*%.+#$*>>>;;---==&%#@+.@%*=;;;-=&**>>;;;*%.@%*=;;;>>===>>;;;=*.#%=-;;;-=;;;--;;;==.+@$&=->;;=-=;;>-=&$.#$*=;;;>-===>>;;;=*.#$&>;;>>>>>;;-==%#+....+#%==;;;*&#++........++#&=;;;*&$++.......++$&*;;;==%#++..++#%==-;;>>>==>>>&%.....................",
+"@%*=;;;;;--->;;;;*%.#&*;;;;;---;;;;;=*%..+@$*==;;;;;-->>-&$..@#%->;;;>->;;;;>&$.+@$&->>;;--==*%#@++.@$*=;;;==*&*->;;;*%.@$*=;;;>>===>>;;;=*.#$==;;;--;;;--;;;=*.++#%==-;;-=-;;--=%#.@$*=;;;>>=*=>>;;;=*.@$&>;;>>>>>;;-=*$#+...+@$%>>;;;*&#@..........@#&*;;;=%$@.........@#&*;;;>>&$@+..+@$&=->;;>>>==;;>*%.....................",
+"@$&*;;;>-=*===;;;=*.$&=;;;=====>>;;;*&$..++#%*=;;--=***&%$#.++#%=--;;;;;---==&$.+@#&=--;;=**&$#@++..@$&*;;;==&&*=-;;;*%.+#$*-->;;===;;>-=&%.@$**;;;>>;;;>-;;;=&..+@#%*=->;;;>>**%$@.+#$*-->;;===;;>-=*%.+#%*==--;;;>-=*%#@+...++$&>>;;;*&#@.........++#&*;;;*&#@........++$&*;;;>>&#@+..+#&*;;;>>;;;;;;>>*$.....................",
+"@$&*;;;>-=**==;;;=*.$*=;;;==**=--;;;=%$...+@$&*;;-==*&%$##+.++#%==-;;;;;>--==&#.++#%==-;;=*%$##+++..@#&*;;;==&&&==;;;*&.+@$&=->>;===>;--=&$.@#&*;;;->;;;--;;;*&..++#$&*->;;;>-*&$#+.+@$&=->;;===;;>--&$.+#$*==--;;;>-*&%#++...+@#&>>;;;*&#++.........@$&*;;;*%$++.......++#&*;;;>>&$++..+#&*;;;>>;;;;;;>>&$.....................",
+"+#&*;;;>======;;;**.#*=;;;==*==>>;;;*%#...@@%&=;;-==&$##@++.+@#%=--;;;;;->-==&$.++#$=--;;**&$$#@@++.+#&*;;;==***=-;;;*&.++#$=-->>===;;--=$#.@#&*;;;>>;;;>-;;;*%..++@$&*->;;;>>*&$@+..+@#&==;;-->;;=*&$@.+@$**=--;;;->*&$#++....+#%*=;;;*&$+.........++#&*;;;*&$++.......++$&*;;;=*%#++..+#%*;;;--;;;;;>>>%$.....................",
+"+#%*;;;;;-=-;;;;;*&.#&*;;;;;---;;;;;*&#..++#%&=;;==*&$#@@++..@#%==--->>>;;;>>&%..+#$*=-;;=*&&%$$#@+.@#%*;;;-=***=-;;;*&..+@$&*=;;===;;=*%#@.+#%*;;;;;;;;;;;;;*%..++#$&*>>;;;>>**$#+..+@#%*=;;>--;;=*%#+.+#$*==;;>>>-===*$@+....+@#&*;;;*&#@.........++$&*;;;*&$++.......++$&*;;;*&$@+...+@$%===*=======**$@.....................",
+"+#&*;;;;;>>>;;;;;*$.#$*;;;;;>->;;;;;*&#..+@#%*=;;===&%$#++..+@#%==--->>>;;;>>*%.++@$==-;;==***&&$#@.+#%*;;;-====--;;;*&..++#%*=;;=--;;*&$@+.+@%*>;;;;;;;;;;;>*%..+@#&*=>>;;;>>=*%$@...+@#&*>>;;;>>*&$@+.+#$*==;;>>>====*%#@....+@#&*;;;*&$++........++#&*;;;*&#++.......++$&*;;;*&$++...++@#&**%%&***=&&%#@.....................",
+"+#&*;;;;;;;;>>===%#.@#%===;;;;;;>;;;*%#.++#%==-;;>--==%$#++.+@$&>;;;;>>>>>;;;=&..+@$*==;;--->>>--$#.+#%*>>;;;-=-;;;;;=*...+@#&*>>;;;>>*%#@+.+@$&-->;;-=-;;>--&$.++#%=->;;-=-;;>-=%#....@#%*>>;;;>>*%#++.@#&->>;;>>>>>;;>&$@....++$&*;;;=&$@+........++$&*;;;*&#@........++$&=;;;*&#@.....+@@##$$$$$$%$$#@@+.....................",
+"+#&*;;;;;;;;>>=**#@.+@$&==>;;;;;;;;;=%$..@#%=->;;>>--=*%$@+.+#$*>;;;;>>>>>;;;*&..+@#&==;;>>>;;>--%#.+@$&>>>;;---;;;;;=*...++@%&>>;;;>>*$#+..+@#&=->;;=-=;;--=&#.+@#&->>;;=-=;;>>-%$....+@%&>>;;;>-&$@++.@$&>>;;;>>>>>;;>&$@....++$&*;;;*&$@+........++#&*;;;*&#++.......+@$&*;;;*&#++.....++@@@+@@@@@@@+++......................",
+"@$&*;;;>-===*&&%##+.+@@$$&**===--;;;*&#.+@$&=->;;>>---*&$@+.+@$&>;;;;->>>>;;;*&...+#&*=;;>->;;>>-$#.++#%>>>;;---;;;;;==...++@$%->;;;>-&$@+...+#%==-;;===;;--=%#.+@$&->>;;==-;;>>-&$..++@$%*>>;;;*&$@++..@$&>>;;;>>>>>;;>*$@.....+#&*;;;=*$@+........++#%*>;;*%#+.......++@$*=;;;*%#@.........+++.+++++++........................",
+"@$&=>;;>-=**&%$#@++..++@#$%&**=--;;;**$.+@$*;;;;;;;;;;=&%@+.+@$&->>>>;;;;;--=&$..++@#%*--;;;;>==*$@.++#$%*=;;;;;>>;;;==....++#%*=;;;=*$#+...++@#*==>>=*=>>=**$@.@@%*>;;;;===;;;;;*%.+@#$**=>>;;>*%#++...@#&->>;;;;;;;>>-&$@....++#%*;;;=*%#@+........+#$*>>>*$#++......++#%*=;;;*%#+...............+............................",
+"@$&=;;;--=**%$@+++....++@@#%**=->;;;=&$.+@%&>;;;;;;;;;*&%@+.++#%-->>>;;;;;===$#...++@$%==;;;>>=*&#@..++#$%&>;;;;>>;;;==.....+@#&*>>>*&#@+....++#%**--&&&--**&@@.+@$&;;;;>===>;;;;&$.+@%&;;;;;;;;*%#+....+#%-->;;;;;;;>>-%#@.....+@$&;;;=*%#@++.......+@$%>>>%$@+.......+@#&*=;;;&%@++...........................................",
+"@%=-;;;;;>-=$#@+........+@#$=->;;;;;-=%.++#$%********&%$@+..++@#$&&&******&%$#@....++@#%&&**&&%$#@+...+@@$%&*********%$.....++@#%%&%$$@++....+++##%$%$%$%%$$#++.+@#$&&**&&%&&**&&$#.+@$*;;;;;;;;*%#++...+@#$&********&&%#@+.....+@$%===>>&%#+.........+#$%%%$@++......++#%&->===%$@+............................................",
+"@$--;;;;;--=$@++.........+#$=->;;;;;--$..+@#$$%&&%%%$$#@@+...++@#$$$%%%%%$$##@+.....++@#$$%%$$##@++....++@#$$%%%%%%$$$@......++@#$$$#@++......++@@###@#@##@@+++..+@#$$%$$$$$$%%$$#@.++#%*=======$#@.....++@#$$%&&&&%%%$#@++......+@#***--&$#++.......+++@#$#@@+........+#$&-==*&$@+.............................................",
+"#$**----==*&#@+..........+@#&*==----**$..+++@########@@++.....+++@@#@#####@@++.....+.+++@@#@#@@++.......+++@@#######@@+.......++++@@+++..........++++++++++++....+++@@##@@@@@@##@++..+@#**=*=***#@++.....++@@@#######@@+++.......++##%%%$#@++..........++@+@++........+++##$%%$##++.............................................",
+"+@$%**=**&%$++...........++@$%&*=***&$@...+++++++@+++++........+.++++++++++...........+.++++++............+++++++++++++........++++++.............+++.+.+++........++++++++++++++....++@#$$$%$$#@+.........+++++++++++++........+.++@@###@@++............++.+..........+++#@###@++..............................................",
+"................................................+.+++.+.................+................................+......+..+...............................++++@++++....................................................................................................................................................................",
+"................................................+++@@++............++++++++............................+++@+++.+++++++..........+.++.............+++@######@@++...........................+++++++...............+++++........................................................................+.++++++...............+...........",
+".......@@@@@...................................+@#####++.........++@@###@@++..........................+@@###@@@@@##@@++........+++@@++..........++##$$%%%%$$#@+............+.+.........+.++@@@@@@+++..........+++@@@@++......................................................................++@@##@@++...........++++++++......",
+"......@@$$$$@@.................................@#$%&%$#@+.......++@#$$$%$$#@++.......+..........+....+@#$$%%$$#$$$%$$#@......+.@#####@+........++@$%&*****&&$$@.......++++++++@++......++@##$$$$##@++........+@@#$#$##@++..................................................................++@##$$$$##@@+.......++@@####@@++....",
+"...++$$$$$$%$$++.............................++#$&>>>&$#@.....+.@@$&*====*%#@+....+.+++++.+.+++++...+@#%====*&%&*===*$#.......@@$%&%$@++.......+#$%--;;;;;>>-%#....+++@@#@@#@#@@++....+@@$$**==&&$$@@+.....+++#%&***&%#@+.................................................................+@@$$&*==&&$##@+.....++@$$%%%%$##++...",
+"..@$%%=====-=%%$..+.........................++@$&*;;;*&$#@+...++@$%*======&%#@+...++@@@@@+@@@@@@@++.+@$&=--=-***=====&$......+@$%>>>&$@+.....++@#%*->;;;;;>>-&$.....+@##$$#$$$$#@+...++#$%**====**%$#++....++@$&*===**%#++...............................................................+@#$&&=====**%$#@+...++@$%&****&%$#@+..",
+".@%&&==>>>>>>=&&%@@.............+...........+@#%==;;;==&$#+...+@$&*;;;;;;;=*%@+..++#%&&$$#$#$$&%%@@.+#&*;;;;;===;;;;;*&......+#%&>>>*$#+.....++#&*=;;>->>>;;>&$...++@$&&==%%%>>$#@..++#$==-;;;;;;-==$@@....+@#%->-->;;&$@+..............................+..+.+.+........................++@$==-;;;;;;-==$@+...++#%->;;;;;**%@++.",
+".@%*=>;;;;;;;;=*%@.........++++++.........++@#%*=-;;;==*&$@..++#$*=;;;;;;;=*&#+.++@#&**&&&%&&&**&$@.@#&=;;;;;-=-;;;;;*&.....++#%*;;;*%#++....+@$*==;;>>>>>;;;&$....+@%&*=-%&&>>%#@+.+@#%=--;;;;;;--=%$@...++@$&->->>;;*%#+.........++++.+++++......+++@++@@+@++++.......................+@$%=--;;;;;;--=%$@...++$%>>;;;;;=*&@+..",
+".#&*>;;;;;;;;;>*&#.........++@@@+++.......+@#%&*--;;;-==&%#..++#&*=;;;;;;;=*%@+.++#%*==**=**=*==*%#.+#&*;;;;;-=-;;;;;*&.....++#&*;;;*&#+....++#%*=-;;>>>>>;;>&$....+@$&*==%&&>>%#++.+#%*=>-;;;;;;>--&%#...+@#%*>>>>>;;*%#++.....++++@@@@@@@@@++..++@@###########@@+.....................+#$*=>>;;;;;;>--&%#...+@#%>>;;;;;=*%@@..",
+".$&=>;;;;;;;;;>=&$.......++@#$$$$@+......++#$=--;;;;;;;==*#..+@$*=-;;=====*&$@+.+@$&>>>;;;;;;;>>>%$.+@%&-->;;===;;>>-*$.....++#&*;;;*&#@....+@#&=->;;>>>==-==&#...++@$$%&&%$%**$#@..@#**;;;;;;;;;;;;=&$...+@%&=>>>;>;;*%$@......+@#$#$$$$$$$#@@..+@#$$%%&%&%&%%%$#@.....................@#**;;;;;;;;;;;;=&#....+#%*======*&$@++.",
+".$*=>;;;;;;;;;>=*$.......++#$%&&$#++.....+@$%=--;;;;;;;-=*$..+#$===;;==***%%#@+.+@$&>>;;;;;;;;;>>&$.+@#&=->;;===;;--=&$.....++#&*;;;*&#++...+#$*-->;;>>>=====%#....++##$%%##$&&#@+..#%*=;;;;;;;;;;;;=*$..++#%*=>;;;;;;=&$@+...++@#$&&&&&&&&&%$#.++#$&*******=***&$#....+.+++@+@+@+@+++..#$*=;;;;;;;;;;;;=*$...++@$*=====*%$#@...",
+".$&=>;;;;;;;;;;=&$......++@#*===*#@+.....+@$*>;;>>===>>=**#.++#%==-;;*=*&%##++..+#$*>;;;;>--;;;>>*%..+#$*==;;>>>;;==*$#.....++$&*;;;*%$+....+#&*;;;>>;;;;;===%#.....++@@@@@@@#@@++..#%-->;;;;>>;;>>>--%..+@#*==;;---;;=*%@+..++@$%=->>>==>>>==#.+#$*;;;;;;;;;;;;;*%....+@@@########@@@+.#%=>>>>;;>>;;>>>>-%....++@#$$%$%$##+++..",
+".$*=;;;;;;;;;;;=*$.......+@$=====$@++....+#$*;;;->===>>==&#.+@#%==-;;==*&$#@++..+#%*>;;;;->-;;;>>*$.+.@#&*=;;>>>;;=*&$@.....++#%*;;;*&#++...+#&=;;;>>;;;;;===%#......++++@++++++....$%->;;;;;>>;;>>>>-&..+@#*==;;---;;=&%@+.++@$%&->>>>==;;;==$.+#%*;;;;;;;;;;;;;*&..++@@$$$%%%&%%%%$@@.$&->>>>;;>>;;>>>>-&.....++@@###@@@++....",
+".%*=;;;;;;;;;;;=*%......++@$*====%#+.....+#%*;;;>-*=*>-=*&@.+@$&=--;;==*&%#@+...+#$*>;;;;>--;;;>>*%..++#%*=;;>>>;;=*%#+......@#%*;;;*%#+....@$&=;;;>>;;;;;-==&$.......+.+.+.+++.....$&->;;;;;>>;;>>>>-&...@$*==;;---;;=*&#@.+@#%**>>;;;==;;;==$.+@%*;;;;;;;;;;;;;=*...@#$%*********&&$#.$&->>>>;;>>;;>>>>-&.......+++++++.+.....",
+".%*=;;;;;;;;;;;=*%.......@@%**==*%#@....++#%*;;;--=**=*&%$@.+#%*;;;;;;;;=*$@+...+#%*;;;--===--;;>*%...+@$&*>;;;;;>=*%#+......+#%*--=*%#++...+#&*;;;;;---;>;;;**.....................$&>>;;;;;==>->>>>>&.++@#&*=;>;;;;>==&#@.+#%=--;;---;;;;;*&$.+@$%===-------;;;=*.++@$=->;;;;;;;;;;&$.#&>;>>>;;;;>>>>>>>&.........+.++........",
+".%*=;;;;;;;;;;;=*%......++#$*====%#@+....+@%*;;;-===*=**%$#.+@&*;;;;;;;;==$@++..+#%*;;;->===>-;;;*%..++@$&*>;;;;>>=*%#+......+#$*=--*$#+....@#&*;;;;;>->;;;;;=&.....................$&>;;;;;;==>->>>>>&..++#**=;;;;;;>==*#+.@$&=->;;---;;;;;*%#.++#$**======--;;;=*..+@$-->;;;;;;;;;;&$.$&>>>>>;;;;>>>>>>>&.....................",
+".$*=;;;;;;;;;;;=*$......++#%=->>-%$++...++#$*>;;;;==->>=*%@.+@$*=--;;>--=&$#++..+@%*>;;;;>--;;>;>*%...+@%*=>>;;;>>=*%#+.....++#$*;;;*%#+....+@$*==-;;;;;>>;;;=&.....................#&=-;;;;;;;;;;;;-=&..+@#&==;;;;;;;=**#@.@%&;;;>>>>>;;-==&$@..+@#$%$%%%&**=;;;=&.++@$*===-----=-==&#.#&=-;;;;;>>;;;;;-=%.....................",
+".%*=;;;;;;;;;;>=*%......+@$&->>>>&$@++...+@$&>>;;;--->>=*&#.+@$&=--;;>--**$#@++.+#%&>;;;;->-;;;;>*$..++@$*=>>;;;>>=*%#+......+#%*;;;*%#+....+@#%*==;;;;;>>;;;=*.....................#%=-;;;;;;;;;;;;==%..++#**=;;;;;;;==&#@.#%*;;;>>>>>;;--=*$@...++@@####$%**;;;=*..+@#&*==========*$#.#$==;;;;;>-;;;;;==%.....................",
+".$*=;;;;;;;;;;>=*$......+@$&->>>>*%@+....+@$&>>>;;>--;>=*&@.+@$&=->;;>>-=*&%$@@.+@%*>;;;;>--;;>>>*$..++#%*=>>;;;>>=*%@@.....++#%*;;;*%#++....+#$*==;;;;;>>;;;=&.....................@$==;;;;;;;;;;;;==$..++@&*=;;;;;;;=*&#+.@$*;;;>>>>>;;-==*$#.....++++@+@$%*;;;*&..++@%&&*=====*=**#@.#$*=;;;;;>>;;;;;==$.....................",
+".$&=;;;;;;;;;;>=&$.....++#$*>>;>>*%#@.....+#$&==;;;;;;;**$@.+@$*-->;;====****$#.+@$&>>;;;;;;;;;>>&$..++@%&=--;;;-==*%#+......@#&*;;;*&#@....++@$&**==->-;;;;>*%.....................@#%*>;;;;>>;;;;>*%#..++@$&*==---==*&$@+.@$&-->;;->-;;;;;*%#......+.++++@#%===&$...+@@#$#$$$$$$$$#@+.+$&*>>;;;>>;;>>>*%#.....................",
+".$*=>;;;;;;;;;>=*$......+#%*>>;>>*%#+.....+@#%*=>;;;;;>*&$@.+#%&->>;;========%$.+@$%>>>;;;;;;;>>>&$..++#%*==>;;;>-**%#+......@#&*;;;*&#@....++#$&*=*=---;;;;;*%.....................+#$&>>>;;>>;;>>>&$#...+@#$&===-==*&%#@+.+#$==-;;-->;;;;;*&$...........+@#$***$#....+++@@@#@##@@@+++.+@$&>>>;;>>;;;>>&$#.....................",
+".#&*>;;;;;;;;;>*&#......+#%*;;;;;*%#@+.....+@#$**=;;;=*&$@+.+#&*;;;;;;;;;;;;;*%..+#%*====*****==*%#..++#&*=;;;;;;;=*&#+.....++#&*;;;*&#++...+@$&>>>--===;;-=*$@.....................+@#%*==>>;;>>==*%#+....+@@##%%&%%$#@++..+@$%**>>;;>-=;;;-=$............++@###@+.....++++++++++++++..+@#%*==>>;;>>==*%#@.....................",
+".@%*=>;;;;;;;;=*%@.....+@#&*;;;;;=&#@+.....++@#%**;;;=&%#++.+$&=;;;;;;;;;;;;;*%.++@$&****&&&&&**&$@..++#&*=;;;;;;;==&#+......+#%*;;;*%#++...+@$&>;;;;;;;;;=*&#@......................+@#%**>>;;>>**%$@+.....++@@#####@@@+...++@#%*->>>>==;;;==$.............+@@@@++........+.+.+.+.......+@#%**>>;;>>**%#@+.....................",
+".@%&&==>>>>>>=&&%......+@#&*;;;;;*&#@+.......+@#&*;;;*%#@+..+#%*;;;;;;;;;;;;;*%...@@%%&%%$$$$$&&%@+..++#&*=;;;;;;>=*&#+.....++#%*;;;*%#+....+@$&>;;;;;;;;;*&$@+......................++@$%*--;;>-*&$@++......++++++@++++......+##%=->>>==>>>==#...............++++.......................++@$%*--;;>-*&%@++.....................",
+"..@$%========$%$@.+.....+#%*;;;;;*%#+........++@$&===%$#++..+@$&==--------===%$...+@@@#@@@@@@@@@@++...+@$&*==--=-=*%$@+......+@$%===%$@+....++#%===>----=*&$#++.......................++@#$%&**&&$#@++.........++++++..........+@#$%&&&%&&&&%##...........................................++@#$%&&*&&$#@++......................",
+"...++$$$$$$$$$++.......++#$*>>>>>*%#++........+@@$***$#++...+@#%*==========**$#....++++++.+.+++++++..++@#$&*=====*&$$++......++#%*=*$#++....++@$**=--===*&$#@+.........................++@@#$$%$##@++.........................+++@#$#$$$$$$$#@@............................................++@@#$%%$##@++.......................",
+".......@$$$@@............+#%=---=%#@+..........++##$#@@+.....+@#$$%%%%%&%%%$$@@.....++++......+........+@##$%%%%%$#@@+........+@#&&*#@++.....+@#%**===**&$#++............................++@@##@@+++............................+++@@@@@@@@@@++..............................................++@@@@#@++.........................",
+"........................++@#$%&%%#@+............+++@@++.......++@##########@@++.........................++@@####@#@++..........+@##@@+........++##$$$%$$#@++...............................+++++++................................++.+.+.+++++.................................................+++++.+..........................",
+"..........................+@#####@++.............++++.........+++++@@@+@@++++............................++++++@+++.+.........+.++++++.........++@@#@#@@+++..................................+.+.................................................................................................+.+............................",
+".....+++@+@+++..............................+++++@+@++...........+++++@+++...................................................+++@@@#@#@@+++................................................++++++................................................+@+@@++............+++@+@+.............++@@@@@@++..............................",
+"....++@@###@@++..............................+@#####@@+.........++@#####@@++................+..............................+++@#$$$$$$$$#@+...............................................++@@@@+++...........+.++.+............................+@#####@++..........@#$###@+............@#$$$$##@@+..................+.+........",
+"...++@$%***$$@++.............+.............++@$$***&%#@+.......++@$%***&&@@+............++++++............................++@#$&*=====***#@.............................................++@@$&&%#@+.........+++@@@@@++..........................@$$&&%$#@+..........#%%&%$#@+...........#$%&&&&%##@+.....+.........+++@+++......",
+"...+@#%&=*=*%$@++..........+++@@++.........+@#%&===**$#@+......+@#%&===**$#@+.........++@@#@@++..........................++#$%&=*========%#............................................+++#$%***$#++.......++@@##$###@@.........................#*=->>*&#+++.....+..*=>>>*&#@+..++++@.+.&*>>>>>**%#++++++++.......++@###@++.....",
+"..+@#%**===**%#@+.........++####@++........+#$**==-==&$#++.....+#$**==-==&$#++.......++@#$$$$@@+........................++#$&&*==------==%$............................................++#$%*===%$@+.......+@#$%&&&%$#@+........................$*=>>>=*$@+...+++++.*=>>>=*$@++++@#@@@+.*=>>>>>==&$@@@@@#@@.......@@#%%$$@+.....",
+".+@#%&>;>->;>&%#++.......++##&&&$#+.......++#%>>->-;>=*%@+....++#%>>---;>=*%@+......++##***-=#@+........................+@$&>>>;;;;;;;;;;*%............................................+#$&->;;;*$#+.....++@#%==>>>==%#@++......................$==>>>=*%@@+++@@@@@.==>>>=*%@@+@##$$$#@.*=>>;;>==*%####$$##.......+#%>>>$#++....",
+".+@$&*;;>>>;;*&$@++......+@$%==*%$@++.....+@#%>>->>;;=*%@++...+@#%>;>>>;;=*&@@......+@#%*==-=$@+......+++++....+.+++....+#%*>>>;;;;;;;;;;*%............................................+#$&->;;;*%#++....+@#$&-->>>-=&%#@+......................$==;;;==$#+@+##$%%#.==;;;==%#@##%&&--$@.=-->>>>>--%$$$%==*&......+@#%>>>%$++....",
+"++#&==;;===;;==*#++....++@#%&;;;*%#@++.....@#%==---;>=*%#++...++$%=-->>;;=*%#++.....+@%*>>>=*$#++....++@@@@@+++@@@@@@+..@$&=;;;--;;;;;--=&$............................................+@#%*=;;;*&$+....++@&*=;;===;;=*%#++....+++++.+.++.......$==;;;==%#@@#$$&*&$.==;;;-=%$##%**=--$#.=-->>>>>>-&%&&*--=*......+@$%===&#@+....",
+"+@#*==;;===;;-=*#@....+@@#%&*;;;**%#@@.....@#%==---;;**$@+....++#%==>>>;;=*&#++....++#%*>;>**#@+....+@##$$$##@@##$$##@@.@$*=;;;--;;;;;--=&$.........++++.+..............................+#$**;;;*&#@....+@#&==;;--=;;==&#++.+++@@@@@+@@+@++.....$&*;;;-=%$##$===>>$.&*;;;==&$$%*>>>==%#.&*-->;;-==**==->>*$......+@$&===&$@+....",
+".@#*==;;===;>==*#++..++#$%**=;;;=*&%$#@...++#%===-=;>=&$@++....@#%=--->;;=*&#++....++#%*>>>*&#++....+#$%&&&%$#$%%&&&%$@.@$*=;;;--;;;;;-==%#.......+++@@+@..............................++@%&=;;;=&$@+...+@#&==;;-==;;==*#@+.++@##$########@++...#&=>;;-=&$$$&=-->-%.&*;;;-=&&&*=>>>==$#.%*>->;;--=**--->>&$......+#%&=-=&$@+....",
+"++#%*=>;---;;**%#+...@@$*==--;;;--==*$@...++#%*=;;;==*%$@+....+@#%==>>>;;==&#@......+@%&*=*%$@+.....@$=->>>**%$&;;>--$#.@$*=;;;>-;;;;;--=$#......+@@##$##++.............................+@$&=;;;*&$@+...+@$*==;;===;;-=*$++.+@$***&&&&&*&$##++..$&*;;;-=*%%&*--->>%.&=;;;-=*&**=>>>==$#.&*->>;;---==->->>&$....++@#&*>;>*$#+....",
+".+@$%*>;---;;*&$@++.+@$&==---;;;---==&$...+@#%==;;;==*%#@+.....@$%==->>;;==*#@+.....++$%&*&##++.....#$--;;;==&&*;;>>>&$.@#*=;;;->;;;;;-==%#.....++@$%&&%$#@............................++#$**;;;=*$@+...++#*==;;===;;==*#@+.@#$===**=*===&%$#++.$&=;;;-=***==>>>**%.&*;;;-==*=>>>>-**%#.=---->>>>>--;;>**$#....++#%&=;;;*%#+....",
+"..+#$%*=---=*&$@++..+@%*;;;;;;;;;;;;;*%....@$&>;>>>;>=*%@++..++@$&>;---;;=**#++.....+++####@++......#%==;;;==&&*>>;;>&%.+#%*>;;;;;;;;;-==$#.....+@#*=>>>%#@.............................+#$==;;;==$#++..++#%*=;;->-;;=*&#++.@$%>;;>>-=-;;==*$@@.%**;;;-===*-->;;*&$.*=;;;-====;>>>-=*%#.=-->->>>>>-->;;*&$@...++#$&->;;;*%#++...",
+"..++#$**===*&$#++...+#%*;;;;;;;;;;;;;*%...+@$&>;>>>>>=*&@+....+@$&;;->-;;=*&#++......+++@++++.......@$*=;;;-=***>>;;;*%.+#%*>>;;;;;;;;-==$#....++@$*=;;;&$#++...........................@#%=-;;;==%#+...+@#%*=;;---;;=*%@@..@$&>;;;>---;;-==%#@.%->;;;;>>>>;;>>>=&$.->;;;>;;;;;;;;;>-%$.*=;;;;;>>>;;>>>=*$@..+@#$&*->;;;*%#++...",
+"..+++#$&==*&%@@+....+@%*;;;;;;;;;;;;;*%...+@#&>;>>>>>**%@++...+@$%;;---;>=*&@+..........+++.........#$*=;;;==&&*->;;;*%.+@#%->>;;;;;;;-==$#.....+#%==;;;*$#+..........................+.@#%==;;;==%#@+...+@%*=>;->-;;=*%@+..@$%>;;;;---;;--=*$#.%->;;;;;>>>;;>>-=&#.->;;;;;;;;;;;;;>>&$.*=>;;;;>>>;;>>>*&#@..+@$&*=>>;;;*%#+....",
+"....+@@##$$#@@+.....++#%&**==;;;===*&%#....@#$==----=&$#++.....+#$*==--==&$#@++.....................@$**;;;-=*&*=-;;;*%.++#$&**--;;;;;===$#....++@$==;;;&$#+..............++...........+@#%=-=-===%$@+..++@$&*->>>>>-*&$#++.+#%*==;;>>>>>;;;=*$.$=-;;;>;>>>;;>>>=&$.->;;;;;;;;;;;;;>>&%.&*>;;;;>>>;;>>>=*$+.+@#%->>;;===&$#@+...",
+".....++@@@@@++......++@#%&*==;;;=**&$#@....+@$**=====$#@++....++@#%&===**%#@+.......................+#%*;;;-=***--;;;*&..++#$%*--;;;;;-==$#.....+@$*=>>;&#@+...........++@++++.........+@#$*=====*$#@++.++#$&=->>>>>-=&$#++.+#%*==;;>>>>>;;;=*%.$%&*==-=;;;>>;;;=*$.&**==>>>>>>>-=-;;*$.$%**==-;;;>>;;;=*$@.+@$&>>>;;===*%##++..",
+".......++++.+........++@#%%*=;;;=*&$#@+...++@@$$%%%$$#@+.......++@#$$$%$$@@++.......................@#&*;;;--===--;;;*&...++@$%*=;;;;;-==$#.....+@#$%&&%$#@+..........+@@####++........++@#$$$$%$$#@+...++#&==;;;;;;;==*#@..+@$&==;;;;;--;;;==$.@$%&*===;;;>>;;;=*$.$&===>>>>>>>--=;;&$.#$%**=-;;;>>;;;=*$@.+@%&>>;;;==**&%##++.",
+".........+...........++@#$%*=>;;=&%$#@+.....++@@###@@+++........+++@#@#@@++.........................+#&*;;;;>-=->;;;;=&....++#%&=;;;;;-==$#......+@##$$$#++..........++#$%%%$#++........+++@####@@+++...+@#**=;;;;;;;==&#++.+#$*==;;;;;>>;;;==$.+#$**=;;>>>>>;;;=*$.$&=--;>=*===;;;-=&$.@#%*=;;>>>>>;;;=*$#.+#%*;;;--==*--**%#+.",
+".....................++@#$&*=;;>=*&$#@+......+++++@+++...........+++++++++..........................+#&*;;;;;---;;;;;=*.....+@$&=;;;;;-==$#........@@@@@++...........+@$&->>%$#++.........++++@+++++....++@**=;;;;;;;=*&@@..@#%*==;;;;;--;;;=*$.+#$**=;;->>>>;;;=*%.$&=->>>=**==;;;-=&#.@#%**;;>>>>>;;;=*%#.+#$*;;;--===>>=*&#+.",
+".....................+@#**===---==**&@@........++.+.+..............+.++.............................+#%*;;;>;>--;;;;;=*....+@$%*=;;;;;-==&#.........+++++...........+@$%*>>>*%#@+..........+.+.+.........+@#%&&******%%#@+..@$&>>;;;---;;>>-*%$.+#%*==;;>>>>>;;;=*%.%&->->>****=;;;==%#.@$&*=;;>>>>>;;;=*%#.+@%&>;;;>==-;;==*#@.",
+"....................+@#$===--->---==*$#.............................................................+#&*;;;;;;;;;;;;;-=..++@$%*==;;;;;>>-&$........................++@$==;;;==$@+........................++@@$%%&&&%$$#@++..@$&>;;;;---;;--=&$@.+#%->>>>>>>>>;;;-=%.*=>;;==***>>>>-==%#.#%->>>>->->>;;;-=%#.+@$&>>;;;---;;-=*$@.",
+".....................@$%==-->-->--==*%#.............................................................+#%*;;;;;;;;>>;;;-=...+@$&*=-;;;;;>>-*%.........................@#%==;;;==%#++.........................++@@#####@@+++...@$&>;;;;==-;;-==$#@.@$%>>>-->>>>>;;;--%.&=;;>=*&**>>>>>==%#.$%>>>>->->>>;;;--&#.+@$%>>>;;---;;==*#@.",
+"....................+@$*;;;;;;;;;;;;;*$.............................................................+#&*;;;--==*****&&$..+@#*==;;;;;;;;;;*&.........................+#%=-;;;==%#+..........................+++++++@++++.....+#%=--**=====*&$#@+.+#%->>--->>>>;;;-=%.&*>>>**%&*>>->-==%$.#%->>-=-=->>;;;-=%#..+#$**=;;;;;;;=*%#+.",
+"....................+@$&;;;;;;;;;;;;;&$.............................................................+#%*;;;-=*%$####@@+..++#&==;;;;;;;;;;*&........................++#&->;;;-=$#++............................+.+..+........+#$*==&&*****%$#@++.@#%*==**&&*==;;;-=%.&****%$%**;;>>>;>%$.#%*==*&&&*==;;;-=%#.++@#%**;;;;;;>*&$@+.",
+"....................++#%%***********&$#.............................................................+#%*;;;==%##@++@++...++#&*=;;;;;;;;;;*%.........................@#%->;;;==$#+...........................................++#$$$$$#$$$$#@++...+@#***$%$%%*=>;;==$.%&%%%$#$%*>>>>>>;%#.@#***$$$$%**;;;==$@...+@#$&&*****&%$@@..",
+".....................+@#$$%&&&&&&&%$$#@.............................................................+@#%===&%#@+..........+@#$&&********&%#........................++#$*=---*%$@+...........................................+++@@#@@@@@@@++++...++@########$%&*&%$#.@@###@@@#$&&&*&&%$@.+@######@$$&&&&%$#@...++@##$%%%%%$#@+.+.",
+".....................+++@###########@++.............................................................++#$***%#@+...........++@##%%&&&&&%%$#@.........................+@$&*===&$@+..............................................++++++++++++.......+++@+++++@##$$$$@@.+++++++@@#$$$$$$#@@.+++@@++++@@$$$$$@@+......+@@#####@@++...",
+".......................+++++@+@+++++++...............................................................+@#&*&#@++............++@@########@@@+..........................+@%&==*$#@+..............................................+...................++++++++++@@@@@++.++++++..++@@##@@@++..+.+.++.++++@#@@++........++++++++++....",
+"...+++@@@@++...............+++@@@@++..........++@@#@@+...........+.++@++++..............................+++@####@++............++++++++.+.........+++@+@+@+++++....+++@@@@++................++@@@@@+..........++@#@@@...........+++++++++++........+++@@@++..................++@@@@++........++@@####@+.........++++++++++++....",
+"...++##$##@++..............++@##$##@+........++##$$$#@+..........+@@@###@@++...............+.............+@#$%%$$@++.........+++@+@@@@@@@++...++++@@########@++....++##$$#@++..............++@##$#@@++.......+@#$$$#@@+........++@##@##@#@@++......+@@#$$#@++...............++@##$#@@+.......++#$%%%$#@+.......+++@#@@@@@@@@++..",
+"..++#$&==$#@@.............++#$&&==#@++.....+++#%&===$#@+.......++@#&&%%$%$@@........+++@+++++++........++@#**---&$@+.......++@@##$#$#####@@....+@#$%&****&&%$$@...++@$==&%%@@............+++@#%==%$#++.....+++#$===&%#++......++@#$$%$$$$$#@@+.....+#%%==$$@++.............++@#%==&$#++....+++#%*->-&%#@.....+++##$$$$#$$$$#@@+.",
+"..+@$%*--&%#@++..........+@@$&**--$#@.......+@$&*---&$@+......++##%******&#@++.....++@@@#@@@@@@+.......++@%*=>>-*%#++.......@@&&********&&#..+@@#%&*=====***&%#...++#$=-**&$@@+...........@@$%&--*%$++.....++#$&->-*&$#++....++@$%--***==*&%@+....++$%*--&%$@++...........++@$%&--*%$@+....++@$**>>>=&$#++....+@%&&==%%%==*&%@+.",
+"..++$&*>>**%#@+.........++@$%===--$#+......+@$%*=>>-*%#@+....++@$%&=====**%#@+....++@#$$$$$$##@@+......+@#%==>>>*&$++.....++#$**========**$.+@#$%**=====-===**$..++@$%==;;>*&$#@++....++@#$%-->>>*%$@++..++@$%=->>>;>&%#@+...+@$%&>>=*=--=**#@+..++@$%*->**%$@++.........+@@$%&*>-*%$++....+@$%*=>>>=*%#@+...+@#&*==-***--**&#@.",
+"..+@#%*->>-=$#++......+++@#&*>>>=*$@++....++#%&>;>>>==$@++..+.@#*==;;;;;;>&$#+...++@%&*=-%%%--$@++....++@$&->---==$@+......@#%====-=-=====&.+@$===;;;;;;;;;;>>%..+@#%&==;;;=*%$#@+..++@@$$&*->>>-*&$@@...@@$%*=-;;;;;*&$#@..+@#**=->--->>===%#+...+@#%*->>-=%$#+++.....+++#$%-->>-*%#@+...++#%&>;>>>;;&%#@+.++@$*==>>===->-=*$@.",
+".++@$%*->>>-&$@.+.....++@$%*=;;;=*$@+....++#$&*;;;;>-=$@+....+@$*=-;;;;;;>*$#+...+@#%*=--***--$@++....+@#%*->---=*$++....++@$&>;;;;;;;;;;;&.@#%==-;;;;;;;;;;>>&.+@#&*==-->---=*&#@+.++#&**==>>>--=**$@+.+@$*==>>--->>-=*$#+.+#$*==>>--->>-==%$@...+@$%*->>>-*%$#@++...++@#$%*->>>-*%#@+...+@$&*;;>>>;;*&$@+.++#%===>>--->>-==%#.",
+".++#&*==->>>&$#+.....++@$&*=->--*&#@++...+@#*=->>---==%#++..++#%=---->>>==&$@++..+@#**=>>=====%#+....++#&*=->>>>*&$@++....+#$*;;;;;;;;;;;;*.#$*;;;->=====>>>>>&.@#&==--->>>>>===&$@.@$%===-->>>---==&$@.@$%=-->>->->>--=&%#.@$&==->>>->>>--=*$#..+@$*===->>>==**%#+..++#&**=->>>-==*&#@..+#$*=-->--->>-==$@.++#$==->>=-->>-==%#.",
+".+@$*===->>>*%#@.....+@#&*=-->>-*&#@.....+#$*=->>->-==$#++..+@#%=->->>>>=*%#@....+#$*==>>-===*%#@....+@$*==->>>>*&$@+.....+@%*->;;;>>===;;*.#%*;;;--*****>>>>>&.#%&;;;;;;;;;;;;;=&#.@%*;;;;;;;;;;;;;=&#.@%*;;;;;;;;;;;;;=&#.#%*;;;;;;;;;;;;;=&#.++#$*==-->>>-==**$@..+@$&==-->>>-===*$@.++#%==->>--->>-==%#.++#%->>;;;;;;;>>-%#.",
+"++#$*==-->>>*&$@+....+@$**=->->>*&$@++..++#%==->>---==%#@...++#&=->-->>>==%#@+..++#%*==>>---==%#++..++#$*==->>>>=&$@+....++#$*>>;;;>>===;;*.#%*;;;>=*%%&*->>>>&.#%*;;;;;;;;;;;;;=*$.@%*;;;;;;;;;;;;;=*#.#%*;;;;;;;;;;;;;=*$.@&*;;;;;;;;;;;;;=*$.++#$->>;;;;;;;>>-$#.++#$->>;;;;;;;>>-$#.++#%->>;;;;;;;>>-%#.++#$->>;;;;;;;>>-$#.",
+"++#%->>;;;;;-=%#++..++#$->>;;;;;-=%#++..++#%->>;;;;;-=%#@+..+@#%>>;;;;;;-=&#@...++#%->;;;;;;-=&#@+..++#%->>;;;;;==%#++....+#%*>>;;;>>=-=;>&.$*=;;;=*&$#$%***=*$.@$&=--;;=====;;;**#.@$&=--;;=====;;;**$.@$&=--;;=====;;;**#.@%&=--;;=====;;;=&$..+#$->>;;;;;;;>>-$#..+@$->>;;;;;;;>>-$#.++#$->>;;;;;;;>>-$#..+@$%&*==;;;==**%#@.",
+".+#$->>;;;;;==&#@+...+#$->>;;;;;==&#++..++#$->>;;;;;-=&$@+..++#%->>;;;;;-=&#@+..++@%->>;;;;;-=&$++..++#$->>;;;;;-=&#@....+@#%*;;;;;>>;;;=*&.#*=;;;=*%#@@#&&**&$.@$&=--;;=====;;;=&$.@#&=--;;=====;;;=&#.@$&=--;;=====;;;=&$.@$&=--;;=====;;>=*#..+@#%&*==;;;==**%#@.++@#%&*==;;;==*&%#@..+@#%&*==;;;==*&%#@...+@$%**=;;;=*&%##+.",
+"++@$%*=>>;;;>>&$@+..++@$&*=>>;;;>>&$@+...+@$&*=>>;;;>>&$@+...+@$&*=>>;;;>>&$@+...+@$&*=>>;;;>>&$@+...+@$&*=>>;;;>-&$@+...+@$&*;;;;;>>;;;=*%.$&=;;;=*$@@@@$%$%%@.+#%==-;;=====;;;*&#.+#%==-;;=====;;;*&$.+#%==-;;=====;;;*&#.+#%==-;;=====;;;*&#..++@#%**=;;;=*&%#@+..++@#%&*=;;;=*&%$@+..++@$%**=;;;=**%##+..+.+@#%*=;;;=*%#@++.",
+"..+@$&*>>;;;>>*%#@...++@$&*>>;;;>>*%#++...+@$&=>>;;;>>*%#@...++@$&*>>;;;>>*%#@....+#$&*>>;;;>>*%#++...+@$&*>>;;;>>*%#+..++@%&=;;;;;>>;;>=*$.$*=;;;*&$@++++@@@@+.+#$==-;;===>;>--&%@.+#$==-;;===>;>--*$#.+#$==-;;===>;--=&$@.+#$=--;>===>>--=&$#...++@#%*=;;;=*%#@@....++@#%*=;;;=*%#@++...++@#%*=;;;=*%#@++...+++@$&*;;;*&$#++..",
+".++@$**;;---;;*%$++...+@$**;;---;;*%$++..++@$&*;;---;;*&$++...+@$**;;---;;*%#@+..++#&*=;;---;;*%$++..++@$**;;---;;*%#@+.+@$*==;;;;;;;;;;=*$.$*=;;;*&$@++++@@@++.+@$==-;;===;;--=$#+.+@$==-;;===;>--=$#+.+#$==-;;===;;===$@+.+#$==-;;===;>-==$@+....++@$&*;;;*&$#++.....++#$&*;;;*&$#++.....++@$&*;;;*&$#++......+@$&*;;;=&#@+...",
+".++#$*=;;=-=;;=&$@+..++@$&=;;---;;=&$@+..++@$**;;---;;=&$@+..++@$&=;;---;;=&$@+..++#&*=;;---;;=&$@+..++#$&=;;---;;=&$@+.+#%*==;;;;;;;;;;=&#.#*=;;;=*%##@@####@@.+#$==-;;;;;;;=*&$@@.+#$==-;;;;;;;=*&$@+.+#$==-;;;;;;;=*%$@@.+#$==-;;;;;;;=*%$@+....++@$&=;;;=&#@+.......+@#&=;;;=&#@+.......+@$&=;;;*&$@+.......++$&*;;;*&$++...",
+"++@$===;;===;;-==$@..+@%*=-;;===;;-==$@..+#$==-;;===;;===$@..+#$===;;===;;-==$@..+#$==-;;===;;-==$@.++@$===;;===;;===$@.@$%->>;;;;;>>--=*&#.$&=;;;=*&%$$$%%$$#@.+#$==-;;;;;;;=*%$@+.+#$==-;;;;;;;=*&$#+.+#$==-;;;;;;;=*%$@+.+#$==-;;;;;;;=*%$#+.....++#&=;;;=&#@+.......+@#&*;;;*&$++.......++$&*;;;**#@+.......++#&=;;;*&$++...",
+"+@#%=--;;===;;-==%$.+@#%==-;;-==;;-==%$.++#%==-;;===;;-==%$.+@#%=--;;===;;-==%#.+@#%=--;;-==;;-==%$.+@#%==-;;===;;-==%$.@$*>>>;;;;;>>>--*%$.#&*;;;-=**&&&====*#.+#$==-;;>>>;;=**%$@.+#$==-;;>>>;;=**%$@.+#$==-;;>>>;;=**%$+.+#$==-;;>>>;;=**%$@....++@$&*;;;*&$@++......+@$&=;;;*&$@+.......+@$&=;;;*&$@+.......+@$**;;;*&$@+...",
+"+@$&>>;;;;;;;;;>>&$.+@$&>>;;;;;;;;;>>&$.+@$&>>;;;;;;;;;>>&$.+@$&->;;;;;;;;;>>&$.+@$&>>;;;;;;;;>>>&$.+@$&>>;;;;;;;;;>>&$.#&*>>>;;;;;>>---**$.#%*;;;>-=*=*=---==$.+#%==-;;>>>;;===*&$.@#%==-;;>>>;;===*&$.@#%==-;;>>>;;===*&$.+#%==-;;>>>;;==**&$...++@#%*=;;;=&%#@+....++@#%&=;;;=*%#@+....++@#$**;;;=*$#@+.....+@#%*=;;;=*%#@+..",
+"+#%*>;;;;;;;;;;;>*&.@$%*>;;;;;;;;;;;>*&.+#%*>;;;;;;;;;;;>*&.+#&*>;;;;;;;;;;;>*&.@$%*>;;;;;;;;;;;>*&.+#%*>;;;;;;;;;;;>*&.$&=;;;=->>>>>===>>&.@$&-->;;;;;;;;;;==%.@$&=--;;===>->-->>%.@$&=--;;===>---->>%.@$&=--;;===----->>%.@$%=--;;===--->->>%...+@#$&*=;;;=*&$#@+...+@#$&*=;;;=*&$#@+...+@#%&*=;;;=*&$#@+..++@#$&*=;;;=*&$#@+.",
+"#$*=;;;>>>>>>>;;;=*.@$*=;;;>>>>>>>;;;=*.#$*=;;;>>>>>>>;;;=*.@$*=;;;>>>>>>>;;;=*.@$*=;;;>>>>>>>;;;=*.#$*=;;;>>>>>>>;;;=*.%*=;;;-=>>>>>===>>*.@#%=--;;;;;;;;;;=*$.@$&=--;;===-->>>>>&.@$&=--;;===->>>>>>&.@$&=--;;===>>>>->>&.@$&=--;;===>>>>->>&..++#$&*==;;;==*&$#@.+.@#$&*==;;;==*&$#+..++#$&*==;;;==*&%#@..++#$&*==;;;==*&$#+.",
+"#%*=;;;>>>>>>>;;;=*.#%*=;;;>>>>>>>;;;=*.#%*=;;;>>>>>>>;;;=*.#%*=;;;>>>>>>>;;;=*.#%*=;;;>>>>>>>;;;=*.#%*=;;;>>>>>>>;;;=*.%->;;;>>;;;;;;;;;;*.+#$==-;;;;;;;;;;=*$.#&*;;;;;;;;;;;;;>>&.#&*;;;;;;;;;;;;;>>&.#&*;;;;;;;;;;;;;>>&.#&*;;;;;;;;;;;;;>>*.++@$==-;;;;;;;--=$@..+@$==-;;;;;;;>-=$@.++@$==-;;;;;;;--=$@..+@$==-;;;;;;;--=$@.",
+"#%->;;;;;===;;;;;>-.#%->;;;;;===;;;;;>-.#%->;;;;;=-=;;;;;>-.#%->;;;;;=-=;;;;;>-.#%->;;;;;===;;;;;>-.#%->;;;;;=-=;;;;;>-.%->;;;>>;;;;;;;;;;*.++#$&*==;;;>>==**$#.#&*;;;;;;;;;;;;;>>&.#%*;;;;;;;;;;;;;>>&.#%*;;;;;;;;;;;;;>>&.#&*;;;;;;;;;;;;;>>&.++#$=->;;;;;;;>-=%#.++#$=->;;;;;;;>-=%#..+#$=->;;;;;;;>-=$#.++#$=->;;;;;;;>-=%#.",
+"#%->;;;;;-=-;;;;;>-.#%--;;;;;-=-;;;;;>-.#%->;;;;;===;;;;;>-.#%->;;;;;===;;;;;>-.#&--;;;;;-=-;;;;;>-.#%->;;;;;===;;;;;>-.%--;;;>>;;;;;;;;;;&..++@#&==;;;>>*&%#@+.#%*;;;;;;;;;;;;;>>&.#&*;;;;;;;;;;;;;>>&.#&*;;;;;;;;;;;;;>>&.@&*;;;;;;;;;;;;;>>&.++#%=->;;;;;;;>>=$#.++#%=->;;;;;;;>--$#.++#%=->;;;;;;;>>=%#.++#%=->;;;;;;;>>=$#.",
+"#%--;;;;;===;;;;;--.#%->;;;;;===;;;;;--.#%--;;;;;===;;;;;--.#%=-;;;;;===;;;;;--.#%=>;;;;;===;;;;;>=.#%--;;;;;===;;;;;--.$*=---=--->-->>>--&....@#%==;;;>-&#@+...@$&=-->>-->-----=*%.@$&=-->>-->-----=*%.@$&=-->>->->----=*%.@$&=-->>>--->---=*%..+@$*==->->---==*$#..+@$*==->->---==*$#.++@$*==--->->-==*$@..+@$*==->->---==*$#.",
+"#$*=-----=*=--->-=*.#$*=-----=*=--->-=*.#$*=-----*===----=*.#$*=-----*===----=*.@$*=-----=*=-----=*.#$*=-----*===----=*.#&*======-=-----==$...++#%->;;;=*%#++...+#$===----=---==*&#.+#$==----=-=--==**#.+#$==----=-=--==*&$.+#$==-----=-=-==*&#.++@#**===-=-===**#@.++@#**====-=-==**#@..+@#**===-=-===**#@.++@#**===-=-===**#@.",
+"@#&*=-===*&*=====*&.@#&*=-===*&*=====*&.@#&*=-===&&*==-==*&.@$&*=-===&&*==-==*&.@$&*=-===*&*==-==**.@#&*=-===&&*==-==*&.@#$%%%%%&%&&&&&&%$#....+#$=-;;;*&#@+....+@#$%&&&&&&&%&&%$$@.+@#$%%&&&&&&%&&%$#@.+@#$%%&&&&&&%&%%%#@.+@#$%%&&&&&&%&&%$$@..++@#$%%&&&&%%%$#@+..++@#$%%&&&%&%%$#@+..++@#$%%&%&&%%%$#@+..++@#$%%&&&&&%%$#@+.",
+"+@#$%%%%$$$$$%%&%$$.+@#$%%%%$$$$$%%&%$$.+@#$%%&%%$$$$%%&%$$.+@#$%%&%%$$$$%%&%$$.+@#$%%%%$$$$$%%%%$#.+@#$%%&%%$$$$%%&%$$.+@@######$##$#$###@....+@#%&**&%$#++....++@@###$#$#$####@@+.+++@##$#$#$#$###@@+.+++@##$#$#$#$###@@+..++@##$#$#$#$###@@+...++@@####$#$##@@++...++@@#####$###@@++...++@@###$#$###@@+....++@@@########@@++.",
+"++@@#####@@@#####@+.++@@#####@@@#####@+.++@@#####@@@#####@+.++@@#####@@@#####@@.++@@#####@@@#####@@.++@@#####@@@#####@+.++++@@+@+@@@@@@@+++.....+@#$$$$#@++.......+++@@@@@@+@@++++...+++@+@@@@@+@++@++...+++@+@@@@@+@@+@++...+++@+@@@@@+@++@++.....+++++@+@+@++++......++++@@@+@@+++++.....++++@+@+@+@++++.....+++@+@@@@@++++...",
+"........................++++@@@+@++++.......+++@@@+++...............+++@@+++.........++@@#@@@+..........++++@@@@+@+++.....................................................+.++++.+......++@@@@+++...............+++@+@+.+........++@@##@@+...................................+++@+@+.........+....................+++++++.......",
+"..++++++++++++..........++###$$$$###++.....++#$$$##@+..............+@@#$$#@+........++@#%%%$#@++........++##$#$$$###+++.........+..++..................................++++@@@@++......++@$$$##@++............+++@#$$#@+........++@#%%%$#@++............+.+.+...............++@#$$@@++.....+++++++................+@@###@++.....",
+"++@@#######@@+++.......+@#$%&&&&%%$$#++....+@#&&&%$#@+............++@$$&&$#@+.......+@#%&**%$#@+......++@#$%&&&&%%$$@@......+++++++++++.............................+++@@####%$$@@+....+@$&&&%$#@+............++#$$&&$#@+.......+@#%&**%$#@+........+++++++++++............++#$$&&$#@+...++@@#@@@+++............++@$%&&&$@@+....",
+"@@$$%%%%%%%$$##+++...+++#$==>>>==-==$@+...++#$=---=$#++..........++#%&*>>&%#++.....++#%*>>>==$#++.....++#$==>>>==-==$@+....+++#$@@###@@++.........................++@@#$$%%%&*&&$@+...++#$=---=$#++..........++#%&*>>&%#++.....+@#%*>>>==$#++......++@#$@@@$#@+++.........++#%&*>>&%#++.++##$%$%$#@@+..........++@$%**=*%%#@++..",
+"#$%&*******&&%$$@++...+##%=->>>----=$#+...++#%->---&$@+..........+@$&==>>*%$+......+@$**;;;-=&$@++....+@#%=->>>----=$@+....+@#$%$$$%%##@++.....++++......++++.+...+@#$%&&****==*%#@...++#%->---&$@++........++##&==>>*%$++.....+@$**;;;-=&$@@+.....+@#$%$$#%%$#@++......+++#$&==>>*%$++.+#$&&**&&%$#@+.........+@$%**===*&%#@+..",
+"#==>;;;;;;;>>**&$#+.++@$%*--;;;-->-=%#+....@#%->>>-*%#@+........+@#%*==;>*%$++....+@#%*=;;;--*%#++...+@#%&--;;;-->-=$#+...++#$&&%&%**%$#@+....++@+@+++..+++@+++.++@$$&=-;;;;>;;;&$@...+@$%->>>-*%$@+++....+++@$%*==;;*&$@++..++@#&*=;;;--*%$@++..++@#$&&%%&&*%$$@++...+.++##%*==;;*&$@+.@#%>>>;>-==$#@+.+.....+@#$*>;;;;;>&%#@+.",
+"$==;;;;;;;;>>==*%$@.+@#&*=>;;;;;;==*%#@...++#$*=>;>=*$@++......++#$&>>;-=&%#++.....@#&>>--->>=*&@++..+@&*=>;;;;;;==&$@+...+@$%>>=*=>>=*&#@..+.+@####@+++@##$#@+.+@$%**--;;;;;;;;*&#.++@#$&*=>;>=*%$@@++..++@#$%*>;;-=*&$#++..+@#%*>>---;>=**#@+..+@#%&>>*=*>>==*$@+..++@@#$%*>>;-=*&$#+.@$&>;;;;--=%$#@++....++@$&*;;;;;;;*&$@+.",
+"%*=;;;>>>>>>>;;;*&#.+@%*==>>;;;;;===&$@..+.@#%&=>>>==&$@++....++@$&*;;;-=*%#@+...++#$&>>->-;>=**#++.++#&*=>>;;;;;=**$@+..++#$&>>===>>==*#@+..@@$*=*$##@##$=**$@.@#%->>;;>>>;;;;;=*$.++#$&**=>;>==*%%$#+.++#$%&**;;;--**%$#@.+@#%&*>;->-;>===%$@.+@#%**;>===>>===%$@.++##$%&**;;;-==*&$#.@$&>>>;;>--=*$$@@++.+.@#*==;;=--;;==*$+.",
+"%*=;;;>>>->>>;;;=*$.@#%===;;;;;;;===&%#..++@$%*=>;>==&%$@@+..++@$%&=;;;==*&$@@...+@#%*>>-->;;==*$@+.++#&==>>;;;;;==&$#+..+@$%*>;===;>-==$#+.++#%===&%$$$%&===%#.@$&->>;;>>>;;;;;=*$.+#$&*===>;>==***%$#.+#$%**==;;;-==**&$#.+#$&*=>;---;;-==&%#.+#$&*=;;===>>-==*%#.@@$%&**==;;;--=**&$.@$&>>>;;>--==&&$#@+..+@$*=-;;-==;;-=*$@.",
+"%==;;;>>>>>>>;;;=*%.@$&>;;>>===>>;;;==$.@#%->>;;>>>>>;;;*&#.@#%->>;;>>>>>;;;*&#.@#&->>;;>>>>>;;;*&#.@#&>>;;;->>>>;;;*&#.@#&>>>;;>>>>>;;;*&$.+@$%=--**&&&**--=&#.#%*>>>;;>>>;;;;;=*%.@$%>>>;;===>>;;>==$.@$&>>;;;===>>;;>==$.@$&>;;;;===>>;;;==$.@$&>>;;>=*=>>;;;==$.@#==>>>;;-==;;;;>==.@#&>>>;;>>>-=**&%$#.++#$==-;;-=-;;-==$@.",
+"$*=;;;--=====;;;>-%.#%*>;;>>===>>;;;-=$.@$&->>;;>>->>;;;=*$.@$&->>;;>->>>;;;=*$.#$&>>;;;>->>>;;;=*$.#$*>>;;;>->>>;;;=*$.#$&>>;;;>->>>;;;=*$.+@%*;;;>>**=>>;;>&$.#&*;;;----->>;;;>-&.@%*>;;;;==*>>;;;-=$.@$*>;;;;===->;;;-=$.@%*>;;;;=*=>>;;;-=$.@%*>;;;;=*=->;;;-=%.#$==>>;;;==-;;;;;-=.+$%=--;;;;;;;;;>*&$..+@$==-;;---;;-==$#.",
+"$&=;;;--=*=*=;;;>-&.#%*;;;;;-=-->;;;-=%.#%*>>>;;--->>;;;=*%.#%*>>>;;--->>;;;=*%.#%*>>;;;--->>;;;=*%.#%*>;>;;--->>;;;=*%.#%*>;;;;--->>;;;=*%.+@$*>;;;>===>>;;;&#.$*=;;;----->>;;;>-&.#%*;;;>>=*==-;;;==%.#%*;;;>-=**--;;;==%.#%*;;;>>==*=-;;;==%.#%*;;;>>=**=-;;;==%.#%=-;;;>>===>>;;;==.+#%=--;;;;;;;;;;=*$..+#$==-;;---;;-==%#.",
+"%=-;;;;;---=*->>>>&.#&*;;;;;-=---;;;==%.#&=;;;-=***==;;;>-&.#&*;;;-=***==;;;>-%.#&=;;;--***==;;;>-&.#&=;;;-==**==;;;>-&.$&=;;;--***==;;;>-&.+@#%*==;;;;;;;==*%#.$*=;;;==;;;-->>>>>&.#%*;;;-=*%&*=;;;=*%.#&*;;;-=*%&*=;;;=*%.#&*;;;-=*&&*=;;;=*%.#&*;;;-=*&&*=;;;=*%.@#%*>>;>>===>>;;;*&.+#$==-;;=====>>>>>&..+@$==-;;;;;;;-==%#.",
+"%=-;;;;;--=*=-->>>*.#%*;;;;;>>>==;;;=*%.$&=;;;-=*&&**;;;>-&.$*=;;;==*&&**;;;>-&.$&=;;;-=*&&**;;;>-&.$&=;;;-=*&&**;;;>-&.#&=;;;-=*&&**;;;>-&..+#%&==;;;;;;;=**$@.$*=;;;==;;;-->>>>>*.#&*;;;-=&%%**;;;=*$.#&*;;;-=&%%&*;;;=*$.#&*;;;-=&%%&*;;;=*$.#&*;;;-=&%%&*;;;=*$.+#%*>>>>>===>>;;>*%.+#$==-;;=====>>>>>&.++#$==-;;;;;;;--=&$.",
+"%=-;;;;;--=**->>>>*.$&*;;;;;>>;==;;;=*$.$*=;;;*&%##%&-->>>*.#*=;;;*&%##%&-->>>*.$*=;;;=&%##%&-->;>*.#*=;;;=&%##%&-->>>*.$&=;;;*&%##%&-->>>*.++@#&*=;;;;;;;=**#@.$*=;;;==;;;-->>>>>&.#&*;;;==&$%&*;;;=*$.#%*;;;-=&%%&=;;;=*%.#%*;;;==&$%**;;;=*%.#%*;;;-=&%%&=;;;=*%.+@#%*==;;---;;==*%#.+#$==-;;=*=*=>>>>>&.++#$==-;;;;;;;--=&$.",
+"%=-;;;>>===**-->>>*.#%*;;;>>;;;==;;;=*$.$*=;;;=&$##$&-->>>*.$**;;;=&$#@$&=->>>*.$&=;;;*&$##$&-->>>*.$**;;;*&$##$&-->>>*.$*=;;;=&$##$&-->>>*...@#%*=>>;;;>>=*%#+.$*=;;;=-;;;==->>;>*.#&*;;;==&$%**;;;=*$.#&*;;;==&$%&*;;;=*$.#&*;;;==&$$**;;;=*$.#&*;;;==%$%&*;;;=*$..+@$*==;;>->;;=**$@.+#$==-;;==*==>>>;>*..+@$==-;;===>>;;;*&.",
+"%==;;;>>==***-->>>&.#&*;;;--;;;->;;;=*$.$*=;;;*&$#@$&-->>>&.$*=;;;*&$##$&=>->>&.$*=;;;=&$@#$&-->>>&.$*=;;;*&$@#$&-->>>*.$*=;;;*&$@#$&-->>>&.+.@#%**>>;;;>>=&%$@.$*=;;;==;;;==>>-;>&.#&*;;;==%$$**;;;=*$.#%*;;;==%$$**;;;=*$.#%*;;;==%$%**;;;=*$.#&*;;;==%$%**;;;=*$..++@#%*>>;;;>-*%#@+.+#$==-;;=====>>>>>&.++#$==-;;===->;;;=*.",
+"$&=;;;-=**&&*>>>>>*.#&*;;;->;;;--;;;=*$.$*=;;;=&$##$&-->>>*.$*=;;;**$##%&-->>>*.$*=;;;*&%##$&-->>>*.$*=;;;=&$##$&-->>>&.$*=;;;=&$##$&-->>>*..+@$==-;;>>>;;-=*$@.$&=;;;;;>--==;;;>>*.#%*;;;-=&%%&*;;;=*$.#%*;;;-=&$%&*;;;=*$.#&*;;;-=&$%&*;;;=*$.#%*;;;-=&$%&*;;;=*$...++#$&>>;;;>>&%@++.+#$==-;;;>;>>;;;-=&.++#$==-;;=*===;;;=&.",
+"$&*;;;--*****>>>>>&.#&*;;;-----;;;;;=*$.$*=;;;==&%&&*>;>>>&.#&=;;;==&%&&*>;;>>&.#*=;;;==&%&&*>>;>>&.$&=;;;==&&%**>;>>>&.$*=;;;==&%&&*>;;>>&.+@#%==-;;>>>;;-==%#.$&=;;;;;>--==;;;>>&.#&*;;;==%%%&=;;;=*$.#%*>;;==&%&&=;;;=*$.#%*;;;==&%%**;;;=*$.#&*;;;==&%%*=;;;=*$....+@$&*=;;;=*%#@+..+#%==-;;;;;;;;;;==$.++#%==-;;===*=;;;=&.",
+"#**;;;-==***=>>>>-%.#%*;;;--->-;;;;;=*%.#&=;;;==****=>;;>-%.$&=;;;==****=>;>>-&.#&*;;;==****=;;>>-%.#&*;;;==****=;;;>-%.#&=;;;==****=;>;>-%.+@#%==-;;>>>;;--=&#.$&=;;;;>>--==;;;>-%.@$*;;;==****=;;;**#.#$*>;;==***==;;;=&$.@$*;;;-=****=;;;=*$.@$*>;;-=****=;;;**#....+@$%*=;;;=*%$@+..@#%=--;;;;;;;;;;=*$.+@#%==-;>=====;;;=*.",
+"$*=;;;>-====-;;;=*%.#&*;;;-->--;;;;;=*$.#%*>>>;>===--;;;=*%.#%*>;;>>===--;;;=*%.#%*>>;>>===-=;;;=*%.#%*>>>;>====-;;;=*%.#%*>>>;>===-=;;;=*%.+@%*;;;>-=*=--;;>&$.#&*;;;;;-----;;;=*%.@$&->>;;====-;;;*&#.@$&->>;;=====;;;*&#.@$&->>>>====-;;;*%#.@$&->>;>====-;;;*&#....+@$&==;;;==&$#++.@$&=->;;>>>>>==*&%#.+@$&=->;;---->;;;=&.",
+"%&=;;;>>===--;;;**$.#&*;;;->===;;;;;=*$.@$&>>;;;--=--;;;=*$.@$&>;;;>--=--;;;=*$.@$&>>>;;-=---;;;=*$.@$&>>;;>-=---;;;=*$.@$&>>;;;-=---;;;=*$.+@%*;;;-=***=-;;;%$.#%*;;;;;---->;;;=*$.@#%->>>;==---;;;*%#.@#%->>;>===--;;;*%#.@#%->>;;===--;;;*%#.@#%=>>;;==---;;;*%#..++@$%*=-;;;-=*%$@+.#%*-->;;>>>>-**&$#@.+#$*-->;;>->>>;;;=*.",
+"%->;;;;;;;;;;>--*%#.#**;;;;;===->;;;=*$.@#%*==>>;;;;;--=&%#.@#%*==>;;;;;;>--&%#.+#%*==>;;;;;;--=&%#.@#%*==>;;;;;;--=&%#.@#%*==>;;;;;;>--&%#.+@#%*==*&%%%&*==*%#.#%*>>>;;;;;;;>--&%#.+#$*==;;;;;;;>>-*$#.+#$*==;;;;;;;>>-*$#.+#$**=;;;;;;;>>-*$#.+#$*==;;;;;;;>>-*$#..++#&==;;;;;;;=**#+.#&*;;;;;>>>**&%##++.+#&=;;;;;>>>;;;;;*%.",
+"%->;;;;;;;;;;--=%$@.#**;;;;;===--;;;*&$.+@#%*=>>;;;;;-==%$@.+##&*=>>;;;;;--=%$@.+@#%*=>>;;;;;-==%$@.+@#%*=>>;;;;;-==%$@.+@#%*=>>;;;;;--=%$@..+#$&**%$###$%***$@.@$&>>>;;;;;;;--=%$@.++#%*=;;;;;;;>--&$@.++#%*=;;;;;;;>--%$@.++#&*=;;;;;;;>>-&$@.+@#%*=;;;;;;;>>-%$@..++#&==;;;;;;;==&#+.#&=;;;;;>>-*%$#@++..@#&*;;;;;-->;;;;;*%.",
+"$=>;;;;;;;;;;-==$#+.#%*;;;;;***=-;;;*%#.++#$&*>>;;;;;==*$@+..+#$&*>>;;;;;===$#+.++#$&*>>;;;;;==*$@+.++#$&*->;;;;;==*$@+.++#$&*>>;;;;;===$#+.+.@#%%%#@@+@@#%%%@@.@$&->>;;;;;;;===$#+.++@$&*;;;;;;;>-=$#+.++@%&*;;;;;;;>-=%@+.++@%&*;;;;;;;--=$#+..+@%&*;;;;;;;--=%@+..++#&*=;;;;;;;=*&#+.#%*;;;;;--=%#@++....+#&*;;;;;---;;;;;&$.",
+"$%&***=**=***&&$#++.@#%&****&%%%&**&%$@..++@#$&******&%##++.+++##$&******&%$#++..++@#%%******&%##++..++@#$&******&$$@@+..++@#$&******&%$#++...++@@@+++.+++@@@++.+#$====*=****&%$#@+..+@@$%&******&&$#@+..++@#%&*******%%#@+..++@$%&**=***&&$#@+..++@#%&*******%%#@+...+@#$&*******&%#@+.@#%&*****&%#@++.....+@#%&***********&$#.",
+"@#%%&%&&&%&&%$$@@++.+@$$%%%$$##$$$$$#@+...++@##%%&%%$##@++....++@#$$%&&%%$##+++...++@#$$%&%%$##@++....++@#$$%&%%$$#@++....++@##%%&&%%$##@++....++++++...+++++++.+#$*==&&%&&%%$#@@+....++@#%%&&&&%$$#@+....+@##%%&&&&%$$#@++..+++@#$%%%&&%$$#@++...+@##%%&&&&%$$#@++....+@#$$&&&&%$$#@++.+@$$%&%%$##@++.......+@$$%&%%%$%%%%%$#@.",
+"+@@#####$####@@++...++@@####@@++@@#@@++....+++@@#####@@++......+++@@#####@@++......+++@######@@++......+++@######@+++......+++@@#####@+++.......+.+.......++....++@##$$$#####@@+.......++@@#######@+++......++@######@@+++.....++@@#######@+++......++@######@@+++....++++@@#####@@+++..++@@#####@+++........++@@######@####@++.",
+".++++@++@+@+++++......++++++.++++++++.......+++++++++++.........+++++++++++.+........++++++++++.........+.+++++++++.........+++++++++++.........................+++@@@@@@+++++++.........++++@+++++.........++++++++++++........++++@+@++++.........++++++++@+++........+++++@+@++++......+++++++++............+++++++++++++++..",
+".....+++++....................++.+..............++++......................................................+++++@+...................................................++++++....................+++++............+++++.................................+++++....................++++++............++++............................",
+"....+++@@+++................++++@@++...........+++@@++...........+..+.+..+...............................++@###@@++.................................................+++@@+++.................+++@@@++..........+++@@++..............................+++@@+++.................+++@@++++........++++@@++..........................",
+"..+++@####@+................+@####@++........++@####@@...........+++@+@@+++...............+.............++@#$%%$#@+...............................................+.@@####@+.................+@####@@+........++#####@+...........+....+..+.......+++@####@+.................+@####@++........+@####@@+...........+....+.+......",
+"...+$$%==$#@++...........+++@$%%==#@++......++@#$*=*$#++.......+++#$$$##$#@++........+++++++++...........@#**--=%#@+...............................................+#$%==$#@++.............++@#$==%$#++......++#$*=*$#@+.........++++++++++........+$$%==$#@++.............++@#$==&$#++.....++@#$*=*$@++.........++++++++++.....",
+".+++#%&==&%#@+...........++##&&*==##+.......+@#%&===%#@+......++@#$&&&&&&%$@++.....+++@@@@@@@@++.......++@$*=>>-%$@++............................................+++$%&==&%#@+.............+@#$&==&%$++.....++@$%===&$#@.......+++@@@@+@@@+@++...+++#%&==&$$@+.............+@#$&==&%$++.....+@#%&===%$@+.......+++@@@@@@@+++....",
+"..++$%*--*&%#@+..........+@#%**===$#++.....++#%&*--=*%#@+....++@$%&*=****&%#@+....++@##$$######++......++#%==>>>&$#@.........+......+................+...+........++$%*--*&%$@+...........+@#$&*--*%$++.....+@#%*=--*&$#++....++@##$#######@+++...++$%*--*&%#@+...........+@#$&*--*%$++....++#%&*---&%#++.....++@##$$######++...",
+"..++#$&->>-=%#++........++#%*>>>=*$#++.....+@$%>;;;;=*$@+....+@#**=;;;;;;>*%#++...++$&&==%%%==#@+......++#%=>=-===#++.....+++++++++++++++........+++++@+++++......++@$&->>-=$#@+.........++#$==->>&$#++....++#$==;;;>>%$@+....++$%&==%$%==%%#++...++#$&->--=$#++.........++#$===>>&$@++....+@$%>;;;;=*$@+.....++$%&==%%%==#@+...",
+"..++@$&->>--&$@+.......++#$**;;;=*$@+....++@#%*>;;;;==%#++...+@$*=-;;;;;;>*%$+...++#%&*==&*&-=$#++.....+@$&->--==*$@++....++@@#@@@@@@#@@+++....+++@#@#@##@@@++....++#$&->>>-&$#@+.......++#$&=-->>&$#+.....+@$%=-;;;>>&$#@+..++@%&*==&&&==&&$@+...++@$&>>>>-%#++........++#$&=-->-%$@+....++#$*;;;;;==$@++...++@%&*==&*&-=$#++..",
+"..+@#%&==>>>&%#++.....++@$%==>--**$@+.....+@%&=---==>-%#@+..++#%=---->>>-=*$#++..+@#&*==-=====%$@+....+@#$*=->>>*&$@+...++@$%%%%$$$%%%%%#@+.+.+@@#$%&&%%%%$$@@....++#$&==>>>=&$#@+....++@#$&*>>>==*$#@+..+++#$*->-----=&%@+..++#%&*--====-**%#+....+@$&==>>-&$@+.......++@$&*>>>**$#++....+@%&*->----=$#++...++#%**--=====$#++..",
+".++@$%*==>>>*&$#++...++##%*=->>-=&%#++...+@#&*=----=>-&$@+...@#%=->-->>>-=*%#+...+@#&*=---==-=&$@+...++@$&*->>>>**%#++..+@$%&***&&&*****%$#.++@#$%&***=****&$#+..++@$%*==>>>=*&%#@+..++@#$&*=>>>==*&$@+...+@$&*>>--->-=*&#@..+@$&*=-====--=*&$@...++#$&==>>-*$#+......++@#&*=>>>*&$@+....++@%*=->--=-=$#+....++#%*=--=====%#+...",
+".+@#%**==>>>=*%#@+...+@#%&*--->-=*&$@+...+#$*==>>=-->>*%#++.++$%=->-->>>--&%#@..++#$*==>>--->-&$#++..+@#%*=->>>>=*&$@++.@#%*====**=*===**%$.+#$%&*========**&$@..+#$%**==>>>==**%$@..+#$%**==>>>==**%$@.++#$%**>>--->-==*%#.++#$*==->===>-==*%#...+@#%*==>>>*%#++.....+@#%&==>>>*&$@+....++#&*=->--=-=$#+....++#&*=->-=-==$@++..",
+"++#$=->;;;;;;>*%#++.++@%=>>;;;;;;>&%#@+.++#%=>>;;;;;;;*&#@+.++$&->>;;;;;;;*&#@+.++#%->>;;;;;;;*&#@+.++#$-->;;;;;;>*%#++.@%*;;;;;;;;;;;;;--%.@#%---;;;;;;;;;;*&#.+@#%=->;;;;;;;>--%#.+@#%=->;;;;;;;>--%#..@#%->>;;;;;;;>>-%$.+@$&=->;;;;;;;>>-%$..++@&*=;;;;;*%#+......+@&*=;;;;;*&#+.....++#&==;;;;;*&$@+....++#&==;;;;;*&$@+...",
+"++#%->>;;;;;;;*&$#+.++#%->>;;;;;;;*&$@+.++#&->>;;;;;;;=&$#+.+@#&>>>;;;;;;;*&$#+.+@#%->>;;;;;;;**$#+.++#%->>;;;;;;>*&$#+.#%*;;;;;;;;;;;;;>-*.@$&->>;;;;;;;;;;=&$.+@$&->>;;;;;;;>>-&%.+#$&>>>;;;;;;;>>-*$.+@$&->>;;;;;;;>>-*$.+#$&>>>;;;;;;;>>-*$...+@&*=;;;;;*&#@+.....+@%*=;;;;;*&#@+....++#&*=;;;;;=&$@+....++#&*=;;;;;=&$@+...",
+"+@#&=->---=-;;==*#+.+@$&=->---=-;;==*#+.+@$%-->-----;;==*#+.++#%=-----=-;;-=*#+..@$&=->-----;;-=*#+.+@#&=->-----;;==*#+.#$*-->>-;;;-----;;*.#**;;;>>===>>;;;=*$.+#%*;;;>>===>>;;;*&.+#**;;;>>===>>;;;*&.+#%*;;;>>===>>;;;=&.+#**;;;>>===>>;;;=&...++#$**=;;;*&#+......++#$**=;;;*&#@......+@#%**=;;;*&$@+.....+@#%&==;;;*&$@+...",
+"+@$&-->----=;;-=*$@..@#&-->----=;;-=*$@.+@$%=->--=-=;;-=*$@.+@$%==>----=;;-=*$@.+@#&-->--=-=;;-=*$@.+@$%-->--==-;;-=*$@.#%*-->--;;;--==-;;*.$&=;;;-=***--;;;=&$.+$%*;;;>>=-=>>;;;=*.@$&=;;;>>=-=>>;;;=*.+$%*;;;>>=-=>>;;;=&.@$&=;;;>>=-=>>;;;=&...++@$&*=;;;*&$++.....++@#&*=;;;*&$++.....++@$&*=;;;*&#++.....++#$%*=;;;*&#@....",
+"+@$&-->--=--;;-==$#.+@$&-->--=--;;-==$#.+@$&-->--=--;;-==$#.+@$&=----=--;;-==$#.+@$&-->--=--;;-==$#.+@$&-->-----;;-==$#.#%*->>->;;;---=-;;*.$*=;;;=**%&&*--=*%#.@$**;;;>>===>>;;;=*.@$*=;;;>>===>>;;;=&.@$**;;;>>===>>;;;=*.@$*=;;;>>===>>;;;=*....++@%&=;;;*&#@.......+@#$&=;;;*&#@.......++#%&=;;;*&$@.......++#%&=;;;*&$++...",
+"+@$&->>;;;;;;;-==$#.+@$*->>;;;;;;;-==$#.+@%&>>>;;;;;;;-==$#.+@$&->>;;;;;;;-==$#.+#$&->>;;;;;;;-==$#.+@$*->>;;;;;;;-==$#.$*=;;;;;;;;;;;;;;;*.$*=;;;=*&%%&*=-=&$#.@#*=;;;;;;;;;;;;;=&.@$*=;;;;;;;;;;;;;=&.@#*=;;;;;;;;;;;;;**.@$*=;;;;;;;;;;;;;=&.....+@$&*;;;**#@+.......+@$&*;;;*&$@+......++@$&*;;;*&$++.......+@$&*;;;*&$++...",
+"@#%*>>>;;;;;;;-==%#.@#%*>>>;;;;;;;-==%#.+#%*>>>;;;;;;;-==%#.+#%*>>>;;;;;;;-==%#.+#%*>>>;;;;;;;-==%#.@#%*>>>;;;;;;;-==%#.%*=;;;;;;;;;;;;;;;*.#*=;;;==&&%&&=*=*%#.@$*=;;;;;;;;;;;;;=&.@$*=;;;;;;;;;;;;;=*.@$*=;;;;;;;;;;;;;=*.@$&=;;;;;;;;;;;;;=&....++@%&=;;;*&$@+......++@%&=;;;=&$@+......++@%&=;;;*&$@++.....++#$&=;;;*&$@+...",
+"+$*=;;;-====;;-==$#.+$&=;;;-====;;-==%#.@#*=;;;-====;;-==%#.@#&=;;;-====;;-==%#.@$*=;;;-====;;-==%#.+$&=;;;-====;;-==$#.&>>>>>==;;;>>>>>>>*.#&*;;;--=**=*===**$.@$*=;;;;;>>>>>>>>=&.@$*=;;;;;>>>>>>>>=&.@$*=;;;;;>>>>>>>>**.@$*=;;;;;>>>>>>>>=&...++@#%&=;;;=*$#@+.....+@#%&=;;;**$#@+.....+@#%&=;;;=*%#++.....+@#%**;;;=*%#@+..",
+"@#&=;;;=--==;;-==%$.@$&=;;;=--==;;-==%#.@$&=;;;=--==;;-==&#.@#*=;;;=--==;;-==%#.@#&=;;;=--==;;-==&#.@#*=;;;=--==;;-==&$.&>>>>;==;;;>>>>>>>*.#%*>>>;;;>>>>;;;>=$.@$&=;;;;;>>>>>>>>=*.@$*=;;;;;>>>>>>>>=*.@$&=;;;;;>>>>>>>>=&.@$*=;;;;;>>>>>>>>=&...++#$&*=;;;=*&$#@+..+++#$&*=;;;=*&$#@+..+++#$&*=;;;=*&$#@+..+++#$&*=;;;=*&$#@+.",
+"@$*=;;;-====;;--=&$.@$*=;;;-====;;--=&$.+$*=;;;-====;;--=&$.@$*=;;;-====;;--=&$.@$*=;;;-====;;--=&$.@$*=;;;-====;;--=&$.&>>>>>==;;;>>>>>>>*.@$%>>>;;;;;;;;;;--$.@$&=;;;;;>>>>>>>>**.@#&=;;;;;>>>>>>>>*&.@#&=;;;;;>>>>>>>>=&.@#&=;;;;;>>>>>>>>=&.+++#$%**=;;;==*&$#@..++#$%**=;;;==*&$#@..++#$%**=;;;=**&$#+..++#$%*==;;;=**&$#+.",
+"@$&=;;;;;;;;;;;;>*%.+$&=;;;;;;;;;;;;>*%.@#&=;;;;;;;;;;;;>*%.@#&=;;;;;;;;;;;;>*%.@$&=;;;;;;;;;;;;>*%.@#&=;;;;;;;;;;;;>*%.&>>;;;;;;;;;;;;;;;*.+#$&*=->;;;>>>--*%$.+#%*;;;;;;;;;;;;;*&.@#%*;;;;;;;>;;;;;=&.@#%*>;;;;;;;;;;;;*&.+#%*;;;;;;;;;;;;;=&..+@#=-->>;;;>>--=$@.++@#=-->>;;;>>--=$@.++@#=-->>;;;;>--=$@.++@#==->>;;;;>--=$@.",
+"+#&=;;;;;;;;;;;;;*%.+#&=;;;;;;;;;;;;;*%.@#&=;;;;;;;;;;;;>*%.@#&=;;;;;;;;;;;;;*%.+#&=;;;;;;;;;;;;>*%.@#&=;;;;;;;;;;;;;*%.%->;;;;;;;;;;;;;;;&..+@#$*=>;;;>>-==%#@.+@$&>;;;;;;;;;;;;*&.+@$&>;;;;;;;;;;;;*&.+@#&->>;;;;;;;;;;*&.+@$&>;;;;;;;;;;;;*&.++#$=->>;;;;;>>-=$#..+#$=->>;;;;;;>-=$#..+#$=->>;;;;;;>-=$#..+#$=->>;;;;;>>-=$#.",
+"@#$&-->>>>>>>>>>-&$.@#$&-->>>>>>-->>-&$.+#$&-->>>>>>-->>-&$.+#$&-->>>>>>-->>-&$.@#$&-->>>>>>-->>-&$.+#$&-->>>>>>-->>-&$.%*=>>>>>-==>>>>>=&%...++#%==;;;>-*%$@++.+@#%&*=->>>>>>===&$.++#%&*=>>>>>>>==*&$.+@#$&*=->>>>>>==*%$.+@#$&*=->>>>>>==*%$..+@$==->>>>>>>--=%#.++@$==->>>>>>>--=%#.++@$==->>>>>>>--=%#.++@$===>>>>>>>--=%#.",
+"+@$%=-->>>>>-->>-&$.+@$%==->>>>>-->--&$.+@$%=-->>>>>-->--%$.+@$%=-->>>>>-->--&$.+@$%=-->>>>>-->--&$.+@$%=-->>>>>-->--%$.#&*->>>-===>>>--&%$...++#%*=;;;>-&$@++...+@#$&*=->>>>>=*&$#.++@#%&*->>>>>>=**$#...@#$%&=->>>>-=**$#..+@#$&*=-->>>>=**%#..+@$*==>>>>>>>-==$@..+@$*==>>>>>>>-==$@..+@$*==>>>>>>>-==$#..+@$*==>>>>>>>-==$#.",
+"++@%*==------=-==$#..@@$===-----==-==$#.+@@%*==-----==-==$#.+@@%*==-----==-==$#.++#$*==-----==-==$#.+@@%*==-----==-==$#.#$&==---***=---=%$@...+@#%->;;;==%#@+.....+@@$$==----=*&%#@...+@#$%=-----=*&%#+...++@$%==----=&&$#+...+@@$$==----=*&%#+.++@#&*=->-----==*#@.++@#&*=->-----==*#@.++@#&*=->-----==*#@.++@#&*=->-----==*#@.",
+".+@#$$%&&&&&&&%%$#@..++##%%&&&&%&%%%$#@..++#$%%&&&&%&%%%$#@..++#$%%&&&&%&%%%$#@..++#$%%&&&&%&%%$$#@..++#$%%&&&&%%%%%$#@.+#$$%%%%%%$%%%%$#@@....+#%->;;;=&$@+.......++@#$$%&%&%$##++....++##$%%&&&%$$@@+...+++@#$%%&&%%$#@++....++@#$%%%&%%%#@@+...+@#$%%&&&&&%%$$#+...+@#$%%&&&&&%%$$#+...+@#$%%&&&&&&%$$@@...+@#$%%&&&&&&%$$@+.",
+"..++@##$#$$$#$##@++...+@@@##$#$#$###@++...++@@##$#$#$###@@+...++@@##$#$#$###@++..+++@@##$#$#$###@++...++@@#$#$#$$###@++.++@#$###@#######@+....++@#%&**&%$#++........++@@##$####@++......++@###$###@@++......+++@###$###@++......++@@###$##@@++....+++###$$$$$$##@++...+++###$$$#$$##@++...+++###$$$$$###@++...+++###$$$#$###@++.",
+"..+++++@@+@@@@+@++.....+++@+@@@+@+@+++....++++@+@@@+@@+@++....++++@+@@@+@+@+++....++++@+@@@+@@@+@+....+++++@@@@+@@+@+++..++++@@@+++@@@++++.....++##$%%$$@@+...........++@+@@@+++.+.......+++@@@@@++++........++++@@@++++..........++@@@@@+@+.+.....++++@+@@+@@+++......++++@+@@@@@++++.....+++@+@@@@@@++++.....++++@@@@@@@+@++..",
+"..++++@@+@++@+@+.+.........+.+.+.+............+.+......................+..+............++++@++.............+.+++++........................................................................+.......................++.+...............+++.+......................................+.+......+++@++++...............................",
+".++@##########@@++........+++@+@++++.........+++++++..................++@++++.........++@##@@++............++@+@+@++++.................................................................++++++++.................+++@@@++..........++@+@@++...................................++++@+++...++@####@++..............................",
+"+@#$$%&&*&&%&&$$#@+....+++@###$###@+++.....++@@##@@++...............++@####@+........+@#$%&&$#@+.........++@#$#$###@+++................................................................+@####@+...............+++###$$@@.........++@#$##@@+................................+.+@###@@+...+#$%&&%$#@+.............................",
+"+#$&***==***=**%$#+.....+##$%%&%%%##++....++@#$%%$#@++.............++@$$%%$#@++.....+@#$&***&$#@+.......+@@$%%&&%%$$#@+......+.+..+.++.............+.++..............................++@#$$%$#@++..............@@$%%&%$@++......++#$%&&%$#++.........+.+.+..+.+............+@@$$%%$#@++.@$%*=**&$#++...............+.+.+.+.+....",
+"@$==;;;;;>;>;;--=$@..+++@$%--=-=-=&%#++....+$%&>>*&$@@...........+.@#$&*;;&%#++.....+@$*=;;;=*$@++......+@$*=>>>===**#+....+.++@+++++@+++..........+++@+++...........................++$%*>>*&$#++..........+++#$===>-%#++....+++#$*=>>>&$#++.....+.+++@++@+@++++.......+.++@%&*;;&%#++.#%*;;;;>&$@++...........+++++@+++@+++...",
+"#$=-;;;;;>;>;;>-=$#..++@$%&>>-----*%$++...++$&*>>=*&$@++.........++@$&*=;;*%$+....++@#&=-;;;-=&#@+....++@#%==>>>====*#@....+@@#########@+++......++@#$##@++..........+.+++++++++....++@$&*>>=*&$#++........+++@$%==->>%$@+....++@$%==;;>*%$@++....+@@#########@@+.......++@@$&*=;;*&%@+.#&*;;;;>*%#@+..........++@##########@@+.",
+"#%=-;;;;;;;;;;>>=%#..+#$%**>>>>>>-*&$@+...++$&*>;==*%$@+.........+@$%*==;;*&$++...++#$&=-;;;-=&$#++...++#$&==;;>-=-==$@..+++##%%%%%%%$$$@++......+@#%%%%$@@.........+++@@#@#@#@@@++.+@#%*=>;==*%$#@@+....++@@#$%&--->>&$#++..+@@$%*=-;;;=*%$@++.++@##$%%%$%%%%$#@@..++++@@#$%*==;;=&%#+.#&*;;;;;*&$#@@++....+++@#$%%%%$%%%%%##@.",
+"#%=->>>;;;;;;;==*%#.+@$%-->>>;;;;>*%#++...++#%*==;;>*%#@+.......+@#%*>;;-=*$#@....+@$**>;=-=;;*&$++....@$&*>;;;;;;=*&#@..++@&**->*&*>>**&@+....++@#**>>-&#@++......++@#$$$$%$$$$#@+.@#$%**==;>>*%%$@@++.++@#$$&*=>;;==*%$@+.++#$&*=;;>>->>&%#@+.+@#%*==>-***;;&%$@+.++##$$%&&>>;-==*&$#.@$&=--;;==**&%$#@++.+@@$$&&;;***>-==*$#.",
+"#$=-->>;;;;;;;==&%#.@#%*->>;;;;;>>*%#@+..++@#%&=-;;;**$$@+.....+@#%&*;;;-=*%#++...+@%*=>;=-=;;=*$@+..++@%*=>;;;;;;=**#+..++#*==>>=*=>>=*&#+.....+@$*=>>>&$#+.....++@#$%&&**&**&&%$@.#$&**==-;;;=*&&$#@+.@#$%&**==>;;==*&%$@.@#$&*==;;->>>>=&%$@.+#$&===>>*==;;**%#@.+#$%&&***;;;=-=**%$.@#%=--;;>>>>>=*&#@+.+#$%***;;=**>>===&%.",
+"@$*=;;;----=;;>>-&$.@$=->>;-->>>>>*&$@+...+@#&*>>;;;>>&$#@+...+@#%&>>>;;>>*%$@+..+@#%*=>>;;;>>*&%#+...+@$&*>>;;;>>=*%#@.++@#&*=>>;>>>>**%#+....+@#%=-;;;*%#++....+@#$%->>>>>>>>>=*#.$*=>>>=====>>--=$#+.@$*=>>>==*==>>>-=$#.@#==>>;=====>>>-=$#.@$==>>>===*=>>>-=%#.@#==>>>--===-->>>==.+#$==-;;>>>>>==*&#@.@#==>>>>-=*=>>>>>==.",
+"@$&=>;;--=--;;>>>&$.#$==;;;-->>>>>=&$#+.++@#%**>>;;;>>*&%#@.+++#$&*>>;;;>>**%#@..+@$**=>>;;;>>=*%$@..+@$%*=>>;;;>>=*&$@..+#$*==>>;;;>>=*%$@....+@$%=-;;;*%$++...++#$&*>>>>>>>>>>-=$.$=->>>==**=>;>>-&#@.#$==>>>==*=*>;>>-%$.#%==>>;=====>;>>-&#.#$==>>>==*==>;>>-%$.#$==>>;--=*=->>;>==.+#$==-;;>>>;>-==&$#.#$==>>;>>*=*>>;;>-=.",
+"@#&=;;;---=-;;>>>*%.#%=-;;;-->>>>>=*&$@..+#%&*=>>;;;>>=*&$#.++#%&*=>>;;;>>=*&$#.+@#%*==>>;;;>>=*&%#.++#%**=>>;;;>>=*&%#.+@#%*==>>;;;>>=**%#..++@#$&--;;;*&$#@++.+#%&*=>>;;;>>;>>==$.%=-;;>==**=>>>>-&$@.#%=->;>==**=>;>>-&$.#%=-;;;=====>;>>-&$.#%=-;;>==*==>;>>>&$.#%=->;>>==*=->;;>-=.+#$==-;;;;;;;;;;=*$.#%=-;;>>-=*=>>;>>-=.",
+"@#%*->>;;;;;;;;;;=&.#%==;;;;;>>>;;>>-%#.+@$&>;;;;>>>;;;;>&$.+@$&>;;;;>>>;;;;>&$.+@$&>;;;;>>>;;;;>&$.+@$&>;;;;>>>;;;;>&$.+@$&>;;;;>>>;;;;>&$..+@#%&*===-=**&%$@+.@$&>>;;;>>>;;;;;**$.%==;;;==***>;;;;*%#.#%==;;;==**=>;;;;*%.#%==;;;-=**=>>;;;*%.#%==;;;-=***>;;;;*%.@$*=;;;>>===->;;;=*.+#$==-;;;;;>;;;;==%.@$=-;;;>-=*=>>;;;==.",
+"+#%*>>>;;;;;;;;;;=&.#$=-;;;;;>>>;;>>-&$.+#$*;;;;;>>>;;;;>*%.+#$*;;;;;>>>;;;;;*%.+#%*;;;;;>>>;;;;>*%.+#$*;;;;;>>>;;;;>*%.+#%*;;;;;>>>;;;;>*%.+@$$**===-===***&$@.#$*;;;;;>>>;;;;;*&$.$=-;;;-=***>>;;;*%#.#$=-;;;-=***>>;;;*%.#$=-;;;-=***>>;;;*%.#$=-;;;-=***>;;;;*%.@$%*>>>;>===;;>>>*&.+#$==-;;=====;;;>>&.@$*=;;;>>===->;;;=*.",
+"+$%*>>>;;;;;;;;;;=*.#$==;;;;;>>>;;>>>&$.+$%*;;;;;>>>;;;;;*%.+$%*;;;;;>>>;;;;;*%.+$%*;;;;;>>>;;;;;*%.+$%*;;;;;>>>;;;;;*%.+#%*;;;;;>>>;;;;;*%.@#%&*=====-====**%#.$%*;;;;;>>>;;;;;=&$.$==;;;-=***>>;;;*%#.@$==;;;-=***>>;;;*%.@$==;;;-=***>>;;;*%.#$==;;;-=***>;;;;*%.+#$&->>;;===;;>>-&$.+#$==-;;=**==>;;>>&.@#%*>>>;>===;;>>>*%.",
+"@#*=;;;>>====-;;;=*.@$&*;;;>>===--;;;*%.@#*=;;;-==*===;;;=*.@$*=;;;===*===;;;=*.@$*=;;;===*===;;;=*.@$*=;;;-==*==-;;;=*.@$*=;;;-=*====;;;=*.@$=-;;;;;;;;;;;;;&%.$*=;;;=->>>;;;;;=*$.$&*;;;-=***--;;;*%#.@$&*;;;==*&*=-;;;*%.@$&*;;;==*&*=-;;;*%.@$&=;;;-=***=-;;;*%.+@#%*==;;=--;;==*%#.+#$==-;;==**=>->>>*.+#$&->>;;===;;>>-&$.",
+"@$*=;;;--=*===;;;=*.+$&=;;;>>=*==-;;>*%.@$*=;;;==***==;;;=*.@#*=;;;==***==;;;=*.@$*=;;;==***==;;;=*.@$*=;;;==***==;;;=*.@$*=;;;==***==;;;=*.@$=-;;;;;;;;;;;;;&$.#*=;;;-=>>>;;;;;=&$.$&=;;;-=*&*=-;;;*&#.@#&*;;;-=*&*=-;;;*&.@#&=>;;==*&*=-;;;*&.@#&*;;;-=&&*=-;;;*&..++#%*=;;---;;=*&#+.+#$==-;>===*=-->>>&.+@#%*==;;=--;;==*%#.",
+"@#*=;;;==****=;;;=*.@#&*;;;-=***--;;;*%.@#*=;;;=*****=;;;=*.@$*=;;;=**&**=;;;=*.@$*=;;;=*****=;;;=*.@#*=;;;=*****=;;;=*.@#*=;;;=**&**=;;;=*.+#%&**=======*=*&%#.$*=;;;>-;;;==;;;=*$.#%*;;;-=***=-;;;*%#.+$&*;;;-=*&*=-;;;*%.@#&*;;;==*&*=-;;;*&.@#&*;;;==*&*=-;;;*%..++@$%*>;;;;;>*&#@+.+#$==-;;---==;;;-=&..++#%*=;;---;;=*%#+.",
+"@$*=;;;=****==;;;=*.+#&*;;;--***=-;;;*&.@$*=;;;=**&**=;;;=&.@$*=;;;=*****=;;;=*.@$*=;;;=**&**=;;;=*.@$*=;;;=**&**=;;;=*.@$*=;;;=**&**=;;;=*.+@#$&&**====***%$#@.$*=;;;--;;;==;;;=*$.#%*;;;-=***--;;;*&$.+#%*;;;-=***==;;;*&.+#%*;;;-=***==;;;*&.+#%*;;;-=***==;;;*&....+#%*=-;;;-=&$@+..+#%==-;;;;;;;;;>=*$...+@$%*>;;;;;>*&$@+.",
+"@#*=;;;===**==;;;=*.@$&*;;;--***--;;;*&.@$*=;;;==***==;;;=*.@$&=;;;==***==;;;=*.@$&=;;;==***==;;;=*.@#*=;;;==***==;;;=&.@#*=;;;==***==;;;=*.++@##%**====*&$$#@+.#*=;;;>-;;;==;;;=*#.#%*;;;--*=*--;;;*&#.@#%*;;;-==*==-;;;*%.+#%*;;;===**=-;;;*&.@#%*;;;===**=-;;;*&...+@#&*=-;;;=*%#+...+#$=--;;;;;;;;>>*&#...++#$*=-;;;-=&$@+..",
+"@#&=;;;>>===->;;;**.@$*=;;;-==*==-;;;=&.@#&*;;;>>===>>;;;*&.+$&=;;;>>===>>;;;*&.@#&=;;;>>===>>;;;*%.@#&=;;;>>===>>;;;*&.@#&=;;;>>==*>>;;;*%..+++@$%=-;;;*%$@++..$**;;;;;-=->;;;;*%#.#%*>;;>>===>>;;;=&$.+#%*>;;>>===>>;;;=&.+#$*;;;>>===>>;;;=&.+#%*>;;>>===>>;;;=&..+@#$&*>>;;;=&$@+...+#%==-;;;;;;;>>>*%@....+#%&--;;;==%#@+..",
+"@#&*;;;>>===>>;;;*&.#%&=;;;-==*=--;;;=*.+#&=;;;>>===>>;;;*%.@#&*;;;>>===>>;;;*%.@#&*;;;>>===>>;;;*%.@#&*;;;>>===>>;;;*%.@#&*;;;>>===>>;;;*%....+@#%=-;;;*%#++...#*=;;;;;-==>>;;;*%#.@$&>;;>>===>>;;;=*%.+@$&>;;>>===>>;;;=*.+@$&>;;>>===>>;;;**.+@$&>;;>>===>>;;>=*..+@$&*=>>;;;*&$@+...@#%=--;;=====**%$#@..++#%&*>>;;;=&$@++..",
+"+#$*=->;;;;;;;>--*$.#&->;;;;;===;;;;;>-.+#$&-->;;;;;;;>--&$.+#$*=>>;;;;;;;>--&$.+#%&-->;;;;;;;>--&$.+#$&-->;;;;;;;>--&$.+#$*=->;;;;;;;>-=&$.....+#$==>>-&$@++...$&*;;;;;;;;;;>-=&$#.+#%*==;;;;;;;;;;>-%..@#%*==;;;;;;;;;;>-.++#%*==;;;;;;;;;;>-..+#%*==;;;;;;;;;;>-.+@#%->>;;;;;*&#+....@$&=--;;===**&%##++..+@$&*=>>;;;*&$@+...",
+"+@#&=--;;;;;;;--=&#.#%>>;;;;;===;;;;;>-.+@$%=--;;;;;;;--=%#.+@$%=--;;;;;;;--=%#.++$%=--;;;;;;;--=%$.+@$&=--;;;;;;;--=%$.+@#&=--;;;;;;;--=%$....++@$&=---%$@+....$&*;;;;;;;;;;--=%#@.+@$&==;;;;;;;;;;>-%..+@$**=;;;;;;;;;;>-..+@$&*=;;;;;;;;;;>-.++@$&*=;;;;;;;;;;>-.+@$&>>;;;;;;*%#@....#&*>;;;;>>>*%$#@++..+@#%->>;;;;;*&#+....",
+"++#$==-;;;;;;;-==$@.#%->;;;;;===;;;;;>-..+#$==-;;;;;;;-==$#..+@$==-;;;;;;;-==$#.++#$==-;;;;;;;-==$@..+@$==-;;;;;;;-==$@.++#$==-;;;;;;;-==$@.....++#&*===$#++....#&*;;;;;;;;;;-==$@+.+@#%&=;;;;;;;;;;>-%..++#%*=;;;;;;;;;;>-..++@%&*;;;;;;;;;;>-..++#%&*;;;;;;;;;;>-..@$&>>;;;;;;*%#+....#&*;;;;;>>-&$@++.....@$&>>;;;;;;*%#++...",
+".++#$%&***=***&%$#@.@$%*******&******&%.+++#$%&***=***&%$#+..+@#$%&***=***&%$#+..++#$%&***=***&%$#@.++@#$%&***=***&%$#@..++#$%&***=***&%$#@......+@@$$$$#@+.....$==>>>==*=***&%$#@+..+@#$%****=**=**&%$..+++#$%****=**=**&%...++#$%****=**=**&%...++#$%****=*****&%.++$%->>>>>>-&$@+....@$&>>>>>>--%#++.....++#&->>>>>>-&$@+....",
+"..++##$%&&%&&%$#@@+.+#$$&&&&%$%$%&&&%$$...++##%%&&%&&%$#@@+...++##$%&&%&&%$##++...++##%%&&%&&%$#@@+...++##$%&&%&&%$#@@+...++##%%&%&&&%$$@++.......+@@##@+++.....#*=->>**&&&&%$$@@+....++##$%&&%&&%&%$$@...+++##$%&&%&&%&%$$...+++##%%&&%&&%&%$$....++#$$%&&&&&&&&$#.++#%--->---=$#@+....@#%-->->-==$#+......+@#$--->---=$#++....",
+"...++@@#######@@++..++@@######@######@@....++@@@#######@++.....++@@#######@@++....+++@@@######@@++.....++@@#######@@++...+.++@@#######@@+++.....+..+++++++......##%&&%%$$$###@+++......++@####$#$###@@+.....++@####$#$###@@.....++@@###$#$###@@.....++@####$#$####@..+@#$&&&&&%%#@+.....+@#%%&&&&%%#@++......+@#%%&&&&%%#@+.....",
+"...+.++++@+@++++.+...++++@++++++++@+@++.....+++++@+@++++.+.....+.++++@+@+++++........++++@@++++++.......+++++@+@++++.......+.+++@@+@+++++...........+++.........+@##$###@@++++++........++++@+@+@@@++++......++++@+@+@@@+++.......+++@+@+@@@+++........++++@+@+@+++...+@##$$$$##@++.....+@@#$$$$$##@++........+@#$$$$$##@++.....",
+".....................+++++...........................................................................+++@@####@###@@++...............+.........++++++++@+++............+++@++...........................................................................................................+@@#@@@+++..............................",
+"....................+++@@@+++......................................+.+.+..+..........................+@#$%$%$$%$%%%$#@+...........+++++........++@@#####@@@++.........++@#@#@++..................+.......................................................................++++.++++......@$$%%$$#@++++...........................",
+"....................+##$###@+................................+++@++@+@+@++@++.........+.+............+#$&&********&&%#@..........+@@#@@++......+@#$%$%$$$$@@+.........+@#$$$#@+..............++++++++..........+++++...............................+.+++++.+..........++++@@@@++@+@+....$%&**&%$##@@@@+++.........+......+......",
+".........+++........@$*=**&#@++.............................+@@##$##$#$#$###@@+.....+++@+++.........+@$&>;;>>>>>>;;;*%#.........++#&&%##+.....+@#*========$#++.......+@#%=-=%#@+.............+@@###@@++.......++@@@@@+............+..++.++.+......++@@@@@@@++..+.......+@$$$$###%$#++...%->;;;==%$$&%$#@@++.....+++++..+++++....",
+"......+++@@@@+......$%===**%#@+.............+++++++@+.......@#$%%&%&&%&&%&&$$@@....++@####@++.......+#%*;;;;>>>>>;;;*&#.......+.@@%*=&$$++...++#$===--==--%#@......+++#$&->-&$@+............+@#$%&%$#@+.....++@##$$##@++.....++++@+@+@@@+@+++...+++##$$$$##@@@+@++...++@#%&&&%$%*&$#@+..&>>;;;==*&&**%$$#@@..+.+@@@@@+++@@@@++..",
+"......+@#$$##@++....%&=--==&%#++.+.++++....++@@#####@@++....#%&******=**=***%$@...++@$$%%$#@+.......@#%*;;;;;>>;;;;;=*$....+++++@$&==*&%@++..++#$=--->-->-&$@....+++@#$&*>>>*&#@@++........+@#%&***&%#@...+++@#$&&&&$#@++....+@###$#$##$$$$#@++.+@#$&&*&&&%$$#$##@@..++#$**=*&*&=*%$@+..&>>;;;-==**==**&%$#...+@#$$$#@@#$$$#@++.",
+".....++#$***%#+.....*=;;;;;=*$@++.++@++...+@@#%%%&%%%$@++...#=-;;;;;;;;;;;;;;%#...+@#*=---$#++......+$&=;;;>>>>>>;;;=&$.++++@@@##*=;;=*%#+...++#%=--;;>>;;*%#+..++@#$%&*=;;;=*$$#@+........+@$&;;;;>-$#.+++@#$%==;;;*%#++...+@$$%%&&&&&&&&&&$@+.+#%&>>>>>==&&&&%%$#..+@$&>>>>=-=;;*&%@+.&->;;;>>-->;;>>--*&.+++$%&=-%#$$=*=%#@+.",
+"....++#$&===*$+.....&=;;;;;==%#@++#####..+@#$%&**=**&&$@++..$=-;;;;;;;;;;;;;;%#..++@$==->-&#@+......@$&=;;;>>>>>>;;;=*$.+@###$#$%*=;;=*&#@+..+@$%=--;;>>;;*&$+..+@$%&***=;;;==*%$#@.......+@#%*;;;;>>$#.+@#$$%&=-;;;*&$#@++.@#%****=***=*==*%#@.@$&*>>>>>--=*=***&$.+@#$*>>>>---;;=*%#+.%->;;;>>>->;;>>>-=*..+@%&*--*%%&===*%#@.",
+"....++#*=;;-=%@.....$&==;;;>-%$@@#%&=*$.++#$==-;;;;;;=*$@++.$%**====;;;===**%$@...+@$*=>>>&$@+......@%&*;;;;;;;;;;;;=*%.@#&****&&*=;;-=*$@+.+@#$&=--;>==;;**$@+.@$*=>>>>>;;;>>>-=*#.......+@$&*>>>>=&$#.@#&*===->>>>=*&%$#@.#%--;;;;;;;;;;;;&%@.$%->;;;;;;;;;;;;;;%.+#$*=>>>>=-=;;=**$@.$&*---;;--->>;;>>**..+@%*=;;=*&*;;;==%#.",
+"....+@#&=;;-=&@+....#&*=;;;>-&$##$**==$.+#$&=--;;;;;;==%$@+.#%****==;;;===*%%#@...@@%*=>>>&$@+......#%*=;;;;;;;;;;;;=*%.#%*====**==;;===%#+.@#$&*---;;--;;=*&#@.#$==>>;>>;;;>>>>==$......++#%*=>>>>=&$@.#%*====->>>>=*=*&$#.#%->;;;;;;;;;;;;*%#.#%->;;;;;;;;;;;;;;&.@$%==>>>>-=-;;==*%#.#%*=--;;--->>;;;>=&.++@%*=;;==*=;;;-=%#.",
+"....+@#*=;;>-&@+....#$*=;;;>-&%$$%==-=%.@$&*-->;;;;;;-=*%$@.$%&**=*=;;;=**&%$#@...+@%*=>>>&%@+......$&*=;;;;;;;;;;;;==%.#&========-;;-==%$@.#$&**---;;==;;==*%#.#%==;;;>>;;;>>>>==%......+#$&*=>>>>*&$@.$&===-->>>>>====*&$.$%>>;;;;;;;;;;;;*&#.#%->;;;;;;;;;;;;;;%.#%&==>>>>=-=;;-==&$.#%&==-;;-=->>;;;>*&.++@%*=;;====;;;--&$.",
+"....++#$*->;;*#@+...@$&*;;;--*%%%*;;-=%.#%=-;;;==;;>>>>==%#.$=======;;;==**%$$#..++@%*=>>>*$@++.....&=>;;;;;;>>;;;;;>-&.$%;;;;;;;;;;;;;>*$@.**=>>;;;;;;>;;>>>-$.$&->;;;>>;;;>>;;--&.....+@#%->>;;;;=&$@.$&;;;;;;;;;;;;;;;=*.#&*=;;;====--;;;=&$.@#%*===;;;;;;===*&%.&*=;;;;;;;;;;;;;;==.#$*>>>;;=====;;==*%..+@#%*;;-=--;;;;>&$.",
+"....++#$&=-;;*#@+...+#%*;;;--*&&&*;;-=%.$&=-;;;==;;>>;>--&$.%=-=====;;;-==**&%$...+@$*=>>>&%@+......&=>;;;;;;>>;;;;;>-&.$%;;;;;;;;;;;;;;*%#.*==>;;;;;;>>;;>>>-%.$&>>;;;>>;;;>>;;>-&.....+@$&>>;;;;;=&$@.%*;;;;;;;;;;;;;;;==.#$*=;;;=**==-;;;=&$.+#$%*==;;;;;;=*&%$#.%*=;;;;;;;;;;;;;;=*.#%*->>;;==**=;;==%$..++#%*;;----;;;;;%#.",
+"....++#$&*=;;=%@+...+#$*>>>;;***==;;*&$.$*;;>>-==--;;==;;*%.&->>>>>>;;;;>>>>-==..++@%*=>>>*$#+......%*->>>>>>>>;;;;;--%.#%&*==-;;---=;;;=&$.==->>>;;;;>>;;>>>-&.$&->;;;==;;;==>>>-&.....+@$&>>;;;>-=&$@.%*>;>>>==;;;>>--=&%.#%*=;;;=***=-;;;*&$.++@#$%**=;;--*&%$@@.#$&*=>>>>-=-;;-==*$.$*=;;;;;=****>>-=&#..++#$*--;;;;---*&$#.",
+"..++@##%&*=;;=&#++..+@$%->>;;=**=-;;*&#.%*;;>>-=*=-;;==;;*&.%->>>>>>;;;;>>>>>==...+@$*=>>>*%#+......$&->>>>>>>>;;;;;-=%.@#%&===;;==-=;;;=*$.*=->>;;;;;>>;;>>>-%.$&>>;;;==;;;==>>>-&.....+@$&>>;;;>-=*$@.$*>>>>>==;;;>>-==%$.@$*=;;;=*%*=-;;;*&$..++@@$%*=>;>-*%#@++.@#%&*>>>>=-=;;-==%$.%*=;;;;;=**&*>>-=&$...+@$&--;;;;-==*%#@.",
+".++##$%&**=;;=&$@+...+#%=->;;=====;;&$@.%*;;->==*=-;;--;;=&.%=->>>>>;;;;>>>>===..++@%*=>>>*%#+......$%->>>>>>>>;;;;;-=%.+@@$**=;;--=-;;>=*$.*==>>;;;;;>>;;>>>=$.$&->;;;==;;;==>>>-&.....+@#&>>>;;>-=*%$.%&>>>>>==;;;>-==*$@.#$*=;;;*&%&=-;;;*&$....++@$%*;;--*$#++..+@#&*>>>>-=-;;==*$#.%==;;;;;=*&**>>--&$..++@$&=>;;;;-==%#@+.",
+"++@$&**>>*=>;-=$#@...+@$%*=;;---*=*&%#@.&*;;>--***=;;==;;==.#%&&**==;;;==**&&%$...+@$*=;;;*%#++.....#$**;;;;;;;;;;;>*&$..+@@$&*>;>>=====--$.$%%**-->;;==;;==*%#.$&>>;;;;;;;;;;;;>-&.....+@#%*==;;;;>>&$.$&->;;;==;;;->**%#@.@$*=;;;**%&==;;;=*#....+++#%*>>>-*$#+...++#%&>>>>=-=;;==*$@.%->>>>;;=****->>>&$..++@$&*=;;;>=*%##++.",
+"+@$&*==;>*=;;-=%$@+..++@$&*;;->-**%$#@+.&*;;>>-*&*=;;==;;-=.@##$%&*=;;>=**%$###...+@$*=;;;*&#@......@$&=;;;;;;;;;;;>*&#...+@#%*>>>>=*=**--$.@#$%*=--;;--;;==*$#.$&->;;;>>;;;;>;;>-%..++++@#$*==;;;;>>&$.#&->;;;==;;;>-*&$@+.@$*=;;;*&%&=-;;;=&$......+@#&->>-*$#++..++@$&->>>-=-;;=**#@.$->>>>;;==***->>>&$..+@#%*==;;;>=*%#@+..",
+"@#&*;;;--=*--;>*%#@...+@#$*=-;;;=&$#@++.%*;;>>>**&*>;>>>;--.++@##%&*;;;=*%$#@@+...+@#&*;;;**$@+.....+$%*;;;->==--;>>*%@....+@#%==;;==*&%$$@.+@#$%==-;;==;;-==$@.#%=-;;;==;;;==>-==%.++@@@#$%&*=;;;;;;*$.#%*=;;;-=>>>;;*&$@+.@$*=;;;=*&*=-;;;*&$......++#%==;>*&#@+...+@$&>>>>-=-;;==&#@.#%&**=>>---==-->>&$.+##&**;;;;;;=*&$@+..",
+"#%*=;;;-===--;>*&$#....+@#%==;;;=*$#@+..%*;;>>>****>>>>;;-=..+++##**;;>=*%#@++.....@#&*;;;**$#++....+#&*;;;->==-->>>&$@....++#$*=;;==&%$#@@..+@#%=--;;==;;-==$@.#$==;;;==;;;==-==*$.@##$%%%**==;;;;;>*%.@%*=;;;-->>>;;=*%$@.#$*=;;;=***=-;;;*&$......++@#*=;;*&$#++..+@$&->>>=-=;;=*&#+.@#$%**>>>--*=->>-&$.@$%*==;;;;;;==*$#@+.",
+"#%*=;;;--==--;;=*&$....++#$*=;;;=*%$@@+.$&>;>>>=**=>;>>;;-=...+.+#%*;;;=*&$#++....++#%*;;;=*&$@+....+#$*;;;->===->>-%#@.....+@$&=;;==*%##@+...+#$===;;==;;--=%#.@$*=>;;==;;;=*==*&#.#$%&****===;;;;;>&$.@$*=;;;=->>>;;=*&%#.@$*=;;;====--;;;*&$.......+@#&*;;=*&$@@..+@$&->>>=-=;;==&#+.++##%*->->-==-->-%#.$%*===;;;;;;==*&$#@.",
+"%*>;;;;;;>;;;;;>>=*.....+@#%*>>>;;*&$#@.#%*=;;;>>====;;;;*&....+@#%*;;;>-*%$+++...++#%*;;;>>*%$@++..+#$&>>>;;>>==*&%$@+.....++#$&=->>*&$@++..++@$*=-;>==--;;;&$.+@$%&**==;;;=*%$$#@.$=-->>;;;;;;;;;==&$.+#%*>;;;;--->>>>>&$.@$*=;;;>>>;;;;;;=&$.......++@$&>>>--%$@..+@$&->>;>>>;;=*&#+..++@#%==;;;;;;;=*$#.$=-;;;;;==>>;;;*&$#.",
+"$*;;;;;;;;;;;;;>>==......+##&->>;;=*&$@.@$&*;;;>>===-;;;;*%.....+#%*;;;>>*&$@+.....+@$&>;;>>**%#@+..+@$%->>;;>>==&$#@@+.....+++#%*=>>*&%#@+...+@$*=-;>**=-;;;*%.++@#$%&*=;;;=&$#@@+.%->>>>;;;;;;;;;==&$.+@$&>>;;;--=>>>>>*&.@#*=;;;;>;;>;;;;=&#........++#$>>>>-&%#..++$%->>;>>>;;=**#+..+++#$*=;;;>;;;*&$@.%->;;;;;**>-;;;=*%$.",
+"%*;;>>-==>>>>>>;;=*......++#$%**--;;=*$.+#$%**=>>;;====*&%$....++#%*>>>;>=&$@++....++#$**=;;>-=$@++..+#%*==;;;>*&$#@++........+@#%*---==$@+..++@#*==>>*&**--->%..++@@#%&*;;;*&@@+.+.$==>>>>>=-=====>>&#.+@#%*==>>****=>>>>>.+#&*->-==**==;;>*%#.........+@$*=>>>==$...@#%=--;>>>;;=*&#+....++#$*==->>==&$#+.$==---=**&**===;;=&.",
+"$*;;---==->>>>>;;==.......++#$%*--;;=*$.++##%&*->;;**=*&%#@.....+@$&>>>;>*&$@.......+@#%&*;;>--%#++..+@#&*=;;;>*%#@++.........++@#&==--=$@+...+@#&*=--&$%&=-->&..+.++@#&*;;;*%@++...$*=>>>>>===&*==>-%#..+@$%**--*&&&&-->>-.+#%*---*&&&*=>;>*%#..........+@&*>>>=*$..++#$=--;>>>;;=*%#+....++@#%===>>=*%#@+.$*=-==*&%$%%===;;=*.",
+"$&;;-==&*=-->>>;;**........++##%==;;==$..++@#%&=-;;*&*&##@+.....++#%->>>>*%$++......++@#%*>;>-=%#+...++#%**;;>>%$@++............+@$=====#@+....+@%&*==$#$$===>%.....++#%&;;;*$+.....#*=-->--=**%%**--$#..++@$%&==$$$$%==->-.+@$&===%$$%&*>>>%$@..........+@%*->>=*#...+@$*=->>>>;;=*%@+.....++@#**=--*&#@+..#**===%##@##&*=;;*&.",
+"#$%&&&%%%%&&&***&&$.........++@#%&**=*$...+++#$%&*&%$##@++.......+@$%&&*%$#@++.......++@#%&*===$#++...+@#$&**&&$#++..............+##$%$##++....++@#$$$#@@##%%%#.....++@#%=*=%#+.....@#$%&&&%%$####%$$#@..+++@##$##@@##%%%&$.++@#$%$##@##%%&%$@+...........+#$%&%%$#...++#$%&***=--&$#++......++##$%%%%#@++..@#$$$##@++@@#$%&%%$.",
+"@##$$##@##$$$$$%$##..........++@#$%&**#....+++@#$$$##@++++......+++@#$$$$#@+..........++@#$%==*#@+.....++@#$$$$#++................+@####++......++@@#@@++@@#$#@......++##*&&##+.....@@##$$$$#@@@+@@##@+....++@@@@@+++@##$##..++@@#@@+++@####@@+............@@##$#@+....++@#$&&%&==%#@+........++@@####++....++@#@@+++.++@@##$#@.",
+"+@@@@@++++@@#@@#@@+...........+++@####@......+++@#@@++............++@@@@@+++...........++@@##$##++......++@@#@@++.................++++++++......+.+++++.++++@@+.......++@###@++.....+++@@@@+@++++++++++......++++++.++++@+@..++++++++++++@@@++.............++@@@+++....++++@@#$$$##@++.........+++++++++....+++++++....+++@@@++."};
index 0cfc10e6d3404826928cec6a3f25f9e1eea254fe..d67c5b0a41e88a5d33f57b6599daa12a0f90405e 100644 (file)
@@ -145,25 +145,25 @@ static unsigned char matrix2b_bits[] = {
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa,
    0xeb, 0xff, 0x57, 0xfd, 0xff, 0xab, 0xff, 0x7f, 0xff, 0xfd, 0xff, 0xff,
-   0xff, 0xbf, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xe9, 0xaa, 0xff, 0x4f, 0xf5,
+   0xff, 0xbf, 0xfd, 0xff, 0x0b, 0xfe, 0xff, 0xe9, 0xaa, 0xff, 0x4f, 0xf5,
    0xf4, 0xc0, 0x57, 0xaf, 0x7e, 0xf5, 0xff, 0xff, 0xff, 0x7f, 0xf4, 0xe9,
-   0xff, 0xff, 0x7f, 0xf1, 0xc1, 0x53, 0x0e, 0xf8, 0xfc, 0x83, 0x6f, 0x0f,
-   0xf8, 0xf0, 0xff, 0xef, 0xff, 0xbf, 0xe0, 0xc1, 0xff, 0x7f, 0xbf, 0xe8,
+   0x01, 0xfc, 0x7f, 0xf1, 0xc1, 0x53, 0x0e, 0xf8, 0xfc, 0x83, 0x6f, 0x0f,
+   0xf8, 0xf0, 0xff, 0xef, 0xff, 0xbf, 0xe0, 0xc1, 0x03, 0x7e, 0xbf, 0xe8,
    0xe8, 0x01, 0x47, 0x7c, 0x79, 0xc8, 0x57, 0x07, 0x3c, 0xfa, 0xd5, 0x5d,
-   0xff, 0x1f, 0xf8, 0xf5, 0xff, 0x7f, 0x3e, 0xe0, 0xd1, 0x07, 0x9e, 0xf8,
+   0xff, 0x1f, 0xf8, 0xf5, 0x01, 0x7c, 0x3e, 0xe0, 0xd1, 0x07, 0x9e, 0xf8,
    0xf8, 0x80, 0xff, 0x0f, 0x78, 0xe8, 0x93, 0x03, 0x6e, 0x3d, 0xc0, 0xeb,
-   0xff, 0x5f, 0x3f, 0x75, 0xf4, 0x11, 0x0e, 0xfe, 0x7e, 0xa0, 0xff, 0x43,
-   0x38, 0x70, 0xc0, 0x01, 0x9e, 0x0a, 0xe0, 0xff, 0xff, 0x7f, 0x3e, 0xea,
+   0x01, 0x5c, 0x3f, 0x75, 0xf4, 0x11, 0x0e, 0xfe, 0x7e, 0xa0, 0xff, 0x43,
+   0x38, 0x70, 0xc0, 0x01, 0x9e, 0x0a, 0xe0, 0xff, 0x03, 0x7e, 0x3e, 0xea,
    0xe0, 0x53, 0x3e, 0xfa, 0xf8, 0x81, 0xff, 0x0f, 0x79, 0xe1, 0x84, 0x5f,
-   0x16, 0x58, 0xe4, 0xff, 0xff, 0x1f, 0x3f, 0xf0, 0xd0, 0x01, 0x0f, 0x7e,
+   0x16, 0x58, 0xe4, 0xff, 0x03, 0x1c, 0x3f, 0xf0, 0xd0, 0x01, 0x0f, 0x7e,
    0x7c, 0x82, 0xff, 0x07, 0x38, 0x78, 0xe0, 0x37, 0xae, 0x1e, 0xf0, 0xff,
-   0xff, 0x3f, 0xfc, 0xe0, 0xa9, 0x03, 0x3e, 0xf8, 0xf8, 0x8a, 0xff, 0x17,
-   0xfa, 0x72, 0x85, 0xff, 0xfe, 0x7d, 0xe0, 0xff, 0xff, 0x1f, 0x7f, 0x7d,
+   0x01, 0x3e, 0xfc, 0xe0, 0xa9, 0x03, 0x3e, 0xf8, 0xf8, 0x8a, 0xff, 0x17,
+   0xfa, 0x72, 0x85, 0xff, 0xfe, 0x7d, 0xe0, 0xff, 0x03, 0x1c, 0x7f, 0x7d,
    0x80, 0xb7, 0x0e, 0xfe, 0xfc, 0xa0, 0xff, 0x2f, 0x7e, 0xff, 0xc0, 0x7f,
-   0xbf, 0x9f, 0xf8, 0xff, 0xff, 0x3f, 0xfc, 0xf1, 0x80, 0xef, 0x5f, 0xfc,
+   0xbf, 0x9f, 0xf8, 0xff, 0x01, 0x3e, 0xfc, 0xf1, 0x80, 0xef, 0x5f, 0xfc,
    0xf9, 0xe2, 0xff, 0xaf, 0xfc, 0xff, 0x8d, 0xff, 0xff, 0x7f, 0xf5, 0xff,
-   0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xfe, 0xf4, 0xff, 0xff,
-   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x7f,
+   0x01, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xfe, 0xf4, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x13, 0x7e, 0xff, 0x7f,
    0xeb, 0xff, 0xbf, 0xfd, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff,
    0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff,
index d7e0373aeb018e48487c643734ede688bd89f9db..4792744ed98d54da9b177992bd822cba4bbba0c1 100644 (file)
 /* XPM */
 static char * matrix2b_xpm[] = {
-"160 182 16 1",
+"160 182 48 1",
+"      c None",
 ".     c #000000",
-"+     c #A7E7A7",
-"@     c #E0F7E0",
-"#     c #0F390F",
-"$     c #81DD81",
-"%     c #061406",
-"&     c #5AD25A",
-"*     c #030E03",
-"=     c #081E08",
-"-     c #0B2A0B",
-";     c #165016",
-">     c #217A21",
-",     c #34BB34",
-"'     c #1B641B",
-")     c #2BA02B",
-"!     c #279027",
-".............%--=*....*%=%%%....*-;''#=*..%-;'#=*....%==%.................==%......%;>'#*..*#'>;%......%=-=*...............................................=;;#*",
-"............%#>!'-%..%#;';'#-%.%=>,&&);%.%->&$!;=%.%=;>>#=.....%%%%%....%-;>;=....%#!@&>=..=>&@!#=....%#'!;=%....%*=......................................%;&$'%",
-".*..*..*..**-!+@,;%.%->&&,$);%.%#,++@&>%*-'&@@$);%.=;,$$>-%.*.=;'';-%.*.=;,$)#%.**-!&+)'%..%')@&!-%.*=#>$@!;-%.*.=;;#%.*..*..*..*..*..*..*..*..*..*..*..**->$@>=",
-"...........*#,+@$>=.%#,++$@&>%.-'&++@$,-='&+@@+&>%*-!$++,;%..=;,$+&'%...-!$@&;%..*;&++!#%..%#!++&;*.*#)&+@&,'%..%;&+>-...................................*#,++>=",
-"..*..*.....%;&+@$>=.=;&++$@&>%%#&+@@@+&#->+++$+&>%%#,$++$>-.%#)$+$$'=..%#&++)#%..%;&+$'=....='$+&'%.=;&+@@+$)=..='$@)#%.*..*..*..*..%%%%%*.*..*..*...*...='$+&'%",
-"...*..**...*#&+@$>=.%;&+$&@,;%='&+@@@@&#->@+$&$,'%*#)$+++);%*#,++&&'-%..#,$&'=...='$@,;=....%;)@$'=.%;&+@@@$!=%-;!+@,>#*.*..*..*..%-#;;;;;#**..*...*....%;)$$!#*",
-"........*..*#,+@$'%.*#!,))&'-.%;&+@@@+&#='$+++$&>=*-'&+++&>**#,++$,!;%.*-'>;-*...=>$@)#..*..*#)@$>=.%#!&+@$,'%='&&+@$&)-..........='&&&&&&)-.....*...*..#>++,;%.",
-".*.*........->$@,;=..%-####-*.=',++$@&!-%;!&+@@+,#.-'&@@+,>%=;,+@@&$)-..*==%..*..=>$@)#%....*#)@$>=..-!++$@,>*#!@@@@@@$#.*..%%**..#!@@@@@@$#.*..**.....%;)@+)-*.",
-".....*..*...='$@!#*...******..-!+@@@@+&-='&$$$+@$#*-)&+@@$,-=>$+@@@+&-...%......*=>$@,;%...**;)@$'=.*-!&&)$);*=',&+@$&)-...=#;#%.*=',&&&&,!-..*-#;-%.*.->++&;%..",
-"............%;),>-............->$+@++&>=->+@++@+&#*='!$+$+&-->@+++@$,#......*....%'&+&'=*...='&@&'=..=#;';';=**=;!+@,>#%..%#)&!#*.*=;;;;;;#%..=',&'%..=;)@&!-...",
-".*...*.*.*..%#,&'=.*..........='&+@++!#%->++@+@$)=.%-'&+$+&-->++++@$&#.*.....*...*#,++!-*..*#!+$&;*...*==*%%*...-'$@!#%.*.=>$+,;*...*.*.%%..*%-!$+>-..-!&@);=.*.",
-"..*.........*#&$;=...*..*..*..%;&+@@$>-.%#)&+@$>#*..*#)$$&!=%;&$+$$$&#..*.*......*-!&+,'%..%',+&!-%.............%;&$>-...*#,++,#%............*-!$$'=%.#,++>-....",
-"........*.*..=#;-%............=#,+++$'%..*-'&+>#*...*=#;;;#%*=;'>>>>;%......*.*...%#!@&>%..='&@!#%..*........*...=#;-%*..%#&$&'=*.*.*.*...*...%-;;-%*.#)&,;%....",
-"*..*.*........%%*.*.*.*.*..*..*=;>>>'-=....=;'#=......*=%%*...%%====%.*.*..........=;>'#=..%#'>;=.....*.*..*..*...%%*....*->)'-*...............*%=*...='>'-**...",
-"..%-##-=%.*.%-##=.....=##;#=%...=-#;#=*....%-#-=%.*%-#;;#-%....%=###=**-#;;;;-=*.**-###=*...%=###%%......*.....*.*.....*..............*...*.*.......*...%%==%%..",
-".=#>,&)'-**#'!,&;=..*=;)&&,'#%.=;!&&,'#=..%#>,,;%.%#>&&&&)#%..=#>,&,'%->,&&&&,;*.=;>,&)'#%.%#'&,)'#**.*....*........*..........*.*.*...*......*.*......=#'>>;-%.",
-"*#)$+@+,'%='$+++!-*.=;&++@+&!==;&++@+&!=..->$++>-*=>&@@@+$'%.=#)++++!=#&+@@+++>%=;&$+@+&!=*->$+++$'%.........*.*.*.....*.*.*%=#-=*..........%-#-=%..*.%#!$++&>-*",
-"='$+@+@$,-='+@@@)#*.=>++@@@+&#='$+@@@+&#.*#,+@@!#*-!$@@@+$'**->&@@++>=#&+@+@@@!%=>++@@@+&#=;)@@@@@!-...=--=%......=#-=.....-#'!)'=.%-------.-')!'#=*..=',@@@+&'%",
-"-!@+&,$@$#%#>)+@!#%.='$$&,$@$#=;&&,&+@$#.='$++@)#*-)$@$$&)'%=;)@+$&);%=;>!)$++>%->@+$&$@$#->&@&&+@,#*.='!);=.....='!);=..%#')&+@,-%#>)))!!'%#&@+&)'-%.=>&@&$+@!=",
-"#!@+,)&@$#.%#!$@)#*.*-'>!,+@$#.-;>)&@+&#%#)++$@)#*#!&@@@+$>%-!&@++$,;%.=-#>$+&'%->++$&++&#-)$@,,+@,#.%-)+@>#*.*.%#)+@>#.-;>&@@+,'==>++++++$-=')+@+&>;%=',&,&+@!-",
-"#!@+,!&@$#*.=>$@)#%..%-')&@$,-.%-!$+@$,#='$+$$@,;%=',+$+@@!--)$@@@@+>-.*%#!+$!#*->&+@+@$,#->&@&&+@,#.%-!$+>-*....#)++>-.#,$++$,'-%#!+@@@@@&#.-',$+++,-%-')&+++>%",
-"#!@+,!&@$#..=>$@)#...*#!$@$);=.%#'&$++&##!@@++@&)==#>)),+@,--)$@$$+@,#..%;&+$'=.->+++$+@&#=;)++@@@,#..=;!!;=..*..=;!!;%.'$@@$&>#=.#)++++++&#.*->,+@@&#.*#!@+&);%",
-"#!@+,!&@$#*.->$@);%**->&+@&>-*%#>>!,+@$##!@@@+@+,-=;!>')+@,#-)$@&&+@,#..=>$+&;%.-!@+$&+@$#*->$++@@,-..%-#;-%.....%-#;-%.;&+++$)'-%#)++++++&#%-;)$+++&#.*#!@$);=.",
-"->@+&,&@$#.-;!+@,>#*=;,+@$,>#%='&&),$@$#-!+@@@@+&-#)&,!,+@,#-!&@&&+@,-**#>++&#%.-!@+$&$@$#*=',&$+@!-*.%#>>#%..*..=;>'#%.-;!&@@$,'=-!+@++++&#=')$@@&!;%.*->+&'-..",
-"='&+++@$)-=;,$+@+&!=#>@@@++&!=#!@+++@+&-=;)&++@+&##)+@$+@@!==;)@@+@@)-..#!@$!-*.->++++@+&-*;!$++++>=.*-!$@>=....%#)+@>=..%#>)$+@,-=;!!)))!>=#&@+&,>#=..%->+&;%..",
-"*#>&$+$!;%='$+@@+$,-#!+@@@+$,-='&+@++)'=.=;)$+@+&--',+++$);%.-'&+++&>%.*->+&'=..%#!$+++)'%=',++$&!;%.*-!++>-%...='$+$>-....-;>!)'=.=-####-=*->)!>;-%....=>$&#%..",
-".*#>&&,;=.%#,&$$&&>%=>&$&$&&>%%#>&&&&'-*.*=',&&&>%*-'&&&);=..*#>&&&>#%..=;,!#**..=;)&&&'-*%#!&&&>#=..*='&&;=.*..-!$$,#%*....%-#--.....***...*#;#-%..*...%;)>-...",
-"..*=#;#%**.=#;;;;;-*%-#;';;#-*.%-#;;#-*..**=#;;#-*.%=#;##=.*..*-#;#=%*.**=#-%.....%-;;#=*..%-;;#-%.*..%%##=*...%=')!;=...*....*%.............***........*=--%*..",
-"...%%%*.....%===%....%=-===*.....%====%.%==-==%....%=-=-==%.*%==-=-=%....%===%%%*====%===%..===--=%...*=-=-==..==-%====..%====*..*.%%%.%%==%.%=%*%==%%...%%=%...",
-"*%=;'';=..*=;>>'#**.=;>>!>'#=..%-;>>>';%#'>!>>;-*.=;>>!>>'#*=;>!>!>>;%.%-;>>>';%=;>>';'>'-%-;>>!>'#%.*-;>>>>;%=;>>';>>;%=;>>>'#%..=;';#-#''-=;';##'>;%.%-;>>;-%.",
-".-',$$&;=.%#,$+$>#**#,$+++&!#%%#>,$+$&,->&+++$,>#%#,$++++$>%#,$++++$&-%#>,$+$&,-;,$$&,$+&;=;&$+++&!%.=;&++++,-#,++&,+$,-#)+++&'=..;,+&>'!$$;#,$&>)&$,-%#>,$$,>#*",
-"%;,$@@$!#*%;&+@@&'=.;&@@@@++>=#)&+++++$;)+@@+@++>-;&@@@@@@)-;&@@@@@@+;#)&+@+@+$;;&@@$&@@+>=;&++@+$)-.='$+@@@$#'&@@$&@@$#;&+@@$>=.*'&@+&)$@+>'$@+,&+@&##)&+@+++>-",
-"=>++$$@,>%%#,+@@+>-.;&+@$$+@,-'$@+&&$++;!+@+&$+@&##&+@$$+@,#;&+@$$+++;'$@+&&+++;;,@+$&+@+;%#!&+@$,'%.%#)&+++)-;,@+++@$!=#!&@$,;%..'&@@$&@@+'>$@@&$+@&#'$@+$&+@&#",
-"#!@++@@$)=*#!$@@+);*#)$@&$+@,#>$@&!>)$$#>$@$!!$@$;#)$@&&++)-#)$@&&$$$#>$@&!!&$$##)@+$&+@$;.%#!+@)'-%..=#!$+&>%#)@++@+!;%%;)@&>-%..',@@+&@@+;'$@@+$+@,#>$@&!!$@$;",
-"#!@@@@@$)-*#)++$@&>%#)$@+@@@,#>+@,'-#;;='$@&>'&++;#)$@$++,'%#)$@$+$!'=>+@,>!,&)##!@@++@@$#..=>$@)#*.%%=->$+&'*#!@@@@,>-.*#)@,'=%..;,@@+$@@+;'$@+@++@,#>+@)''&++;",
-"#!@@@@@$,-='&++&@$,-#)$@@@@@&;>+@);==-=%'$@&''&$+;#)$@@@+!;%#)$@@@$>-*>+@,>&++&##!@@@@@@$;..=>$@)#*.-;';>$+&'*#!@@@@&>-**#)@,>##-*;,@@@@+@+;'$@$@++@,#>+@);'&$+;",
-"#!@++@@+&-#!+@@@@+&#-)$@$&$++;>+@,'#;';='$@&>>&$+;#)$@$++&)-#)$@$+$'%.>+@&!$@@$;#)@+$&$@$#..=>$@);%.'&+!!$+&;*#)@+++@,'%*#)@&!)&'%;,@++@&@+;'$@$++@@,#>+@,>>&++;",
-"#!@++$@$)-;,@+$$+@+;#,$@&,$++;'$@$!>&$$#>$@$))$@&##,$@&$$$$;#,$@&&)#**'$@$,&$++;;)@+&,$@$;*=;!+@,>-%>+@&,++&;*#)@+$&@$,#=',@&,$@,-;,@+&,&@+''$@$&+@@,#'$@$))+@&;",
-"='$++$+&>='&@@$$+@+>;&+@$$++$;;&++$$++$#!+@+$$+@,-'&+@$$+++;;&+@$&!-..;&++$$++$#;&@+$&+@+'%#,$+@$&>%'$@$$+$)#*'&@+$&++$'#,$@$$+@,-'&@+,)&@+'>$@+,$@@,#;&++$$++,#",
-"%;,$@@@,'%;&++$&++$';&++++++!--')$+++$!-!$++++$$'%'&++++++$#;&+++&>=*.-')$+++$!-;&++$,++$'%;&++++$!=#)$+++,;=.;&++&),+$'#&++++++!=;&+$,!$+$';&++),$+!--')$++$&'%",
-".=;>,&)'#*#>)!>'!)!#-'))))!>#%%-#'!)>'#%#>)),)>;-*->),,,)!>=->),)>#%*.%-#>))!'#%#>)!>'!)!#*#'!,,,!;%=#>),!;=*.#>))>#'>>#->),,),!;%#>)!';>!>#->)!;;>!;%%=#'!!>;-*",
-"..%-###=*.*-##---#-%*=###---%...%=-#-=%.%-###-=%*.*=-####-=*.=###=%.....%=---=*.%=##-----%.%=-###-=..%=-#-=...%=-#-%%--**=#####-%.%---===--%%=--=%--%*..%=--=%..",
-".%=%==%%.....%%%%*...%=%=%%...*.%%%=%%%..*=%===%%..%=%*%%=%..%%%**%%%%.%%%%*%=%*.%==%%%%=%.%%=%%%%%%..%%===%%...%-##=*..%-#-%.......%-##-*...*.%--=%............",
-"-;'>>>';=*.=#;'>;#%.-;'>>>;#%..=#''>''#%=#'>>>>>;%=;'';;'';%-;'';#;''=-;'';#;''=-;''';'''=-;''';'''=%-;'>>>>;%.*-!,&'-%.-!&>#%..*..%->,,!-%...%#!);=...*....*...",
-";&++++$&'%%;!$++$)#%;&++++$>#%%;!$+++$>=->$+++++&#;&++)&$+&#;&+$,>$+$';&+$,!$+$';&++&,++$';&++&,++$'='$$++++&#.=;&++);%.#,$$>=.....=;,++&;%*.*->$+);%....*....*.",
-"'$@@@@++,##!&+@@+$!-'$@@@@+&!-#!&@@@@@,-#,@@@@@@$;>$@@&$@@+#'+@+&)+@+>'$@@$&+@+>'$@@+&@@+>'$@@+&@@+>->+@@@@@+;*=>$@+)#%.-)&+!;%..*.%;,@@$>%..%#,+@&'=*.*........",
-";,$@$&+@+;'$@+&&+@&#',@+$$+@&#;&+@$$+@,-;,@++@$@+;>$@$))+@&#'&@+,!&@+''&@+$+$@+';,@+$&+@$;;,@+$&+@$;->++$$+@$;.=>$@,'=%.%;)@$>-%...%-',@$>=*.='$+@+!#*..*.*.*...",
-"#)$@&)&++;>+@&!!$@+;#)@+&&$@$#;&@+&&$+)-#)@++@&@+;'$@&>!$@,##)@+,!&@$;',@++@$@+;->&+@+@$)#->&++$@$)-='$$&$@$)-.=>$@);%...->$+&'%....*;)@$>=.*-!++&@);*..........",
-"#)$@&,$++;>+@,''&++;#!@+$$@+&##,$@++$$>=->&&+@&$)#'$@&>>$@,##>++&)$@&#;,@++@@@+;*#!$@@+,'=%#!$@+@,'%%#!,$+@,'%.=>$@)#*...%;,@+!-*....#)@$>=.%-!&&,$);*....*.*...",
-"#)$@++@@&#>+@,>>&++;#!@@@@@&!-#>,$+@@+!-%-'!+@,>#%'$@&>>$@,#='&+$&@$,-;,@@++@@+;*->&@@+);%.%;,+@&>-..=',+@$!;%.=>$@)#..*..#>++&#%.*.*#)@$>=..=#'';>;-%.*....*...",
-"#)$@++++!->$@$&&+@$;#)@@++@&!-;)&&$+@@)-.%#>+@,'=.'$@&!!+@,#%#,++&@&>%#,@@+$@@+;=;)$+++&>=.%#!+@,'%.%->&+@&&)-.%>$@)#%....*;)+$>#*..%#)@$>=...%====%*.%=#-#-##-%",
-";&+@$$,>#%;&+@++@@,#;,@+$&@+&#>$@$$$+@,#.%;)+@&>-.;&@+&&+@,-.->$++@!;*#!@@+$@@$;#)+@+&@+&;.*;)+@&>-.='&+@+$@$;.=>$@,'=..*.*='$+&'%..=',@$>%*.*........#>))))))>-",
-";&@@+$!#=.-!&@@@+$&#;&@@$,+@+;>+@+++@@)-*=>&+@$!;*#)$@++@@!-.=;&@@+!-*#!@@+&@@$#'&@@+&@@+>%=>&@@$!;%=>+@@++@+;.=>$@$!#%....%#,++>=**#!$@$>%....*....*.>&$+$$++&#",
-";&@++$>-..->&@@@@@&#;&@@&!,@$>'&++@@+&>=.=>&@@+);*=;)+@@+&'%.*-)+@&'=.='$$&)$$,-;&@@$&@@$>*-!$@@@);*='$+@@@@&;.%'$@+,;%.....->$@)-.=',+@$'=......*....)+@@@@@@+;",
-"#'!!!>#%*.%',+++++,--'!!';'>>-#'>!)!!'#%.%#>!)!'=**=;>!)>'-%..=;>>'-*.%#'>';'>;%#'!!>>>!>#.%#>!)!;-*%#'!)))!>=.%;&++,'=*....%;&$>=.=;,+@&;%*........*.>&$$$$$$&#",
-"%=----*...%-;!>!)!;%%=--=%%--**=-#---%%...*=---=*...%----=...*.%--%*...*%=%===%*%=-----#-%.**----=*..%=-###-=%..=;>>;-%...*..-'>#%.*-;>!'-%..*.*.*....-#'''''';=",
-"...%%%*........*....*-#-%.............*.*..**---%...*..........%=-##-%..........%-#-%........=--=.......==-%..%-#-%......%%-#-=.....................*...*.......",
-"*.%-;'#%.*.*.*..*...#>!>#=......*.*.*......%#>!>#%.......*.*.*%#'!))>=.*..*.....#>!>#=......=;>!;=.*...=;!!;=*#>!>#%....%=;>)!;=.*...............*........*.....",
-"..='&$>-*....***.*.*;$@+!-%.*.....**%......=>$@+>%..*%.%*....*->$+@@$#....%%%%..;$@+>-%.*.**-)+@>-*..**#>@+)-*;$@+>-%*...=!+@@!-*..%.%%.%.*.*%%**%..*....*.%.*..",
-"..-!+@,;%..%-#;;-%..;,@+,'#-%.*%-#;;;#=%*%-;>&@@!=..=#;;#-%..=;,+@$&,-.%-#;;;;-%;,@+,'#=*..%#,+@!#...*=')@+,#.;,$@!'##%..%;,+@!#%.-#;;;;;#%.*-#####=*.*%-#;;#=%.",
-"..=>$+$'=.*#>,&&!;=.#)@+$&,>;%=#>,&&&,;%=#>,&$@@!-%-')&&&>;%%#,$@@+$)-=#>,&&&&!-#)@++&,'#%.='&++!#*..-',+++,#%#,$@,,,)#%..-!+@)#..')$&&&$);*#!$,,$,'#%=#>,&&)'#*",
-"*.*#>&$'=*='$+@@+!#*#!@@@@+$,-#,$+@@@+)-#,$+@@@@!-='$+@@@+,-='$+@@@+,-#,$+@@@@$##!@@@@+&!=%-!$@@!#%.%#)$@@@$'*-)$@++++'%*.=>$@)#%.)++@@@@+,-'$@++@+&!-#,$+@@+$'%",
-"...%-;,;%.=>$@@@@&'%#!@@@+@@$#'$@@++@@,#'$@@+@@@!-#)+@++@@$#=;$+@@+$)-'&@@+@@@$##!@@@+@+&#.->$@@)#..*#!$++@$'%#)$@+++$;*..=>$@)#%.)+@@@@@+&#'$@@@+@+&#'&@@++@+)-",
-"*...*=-=..=>$+++@$)=#!@@$,$@+;>+@&),$+)->+@&,$@@!-;,@++$+@+;.->&++,>#%>+@&,$@@,##!@@$&$@+#.%#!+@)#%..=#'!&+$>%#)$@@+&>#%..=>$@)#..>$@+++++&#;!@@$,$@$#>+@&,&+@,#",
-"..*.....*.#!@@@@@$)-#!@+&)&@+;>+@,>>)&>=>+@&)&+@!-;,@@@@@@+;.='&++!;=.>+@&,&+@!-#!@+,)$@$#.%->$@);%...*=#)+$>%#)$@@+,'=*..=>$@);%.>$@$++++&##)@+,)$@$#>+@,!)+@,#",
-"....*.....#,@+$$@$,-#)@@$,$@+;>+@$)!,&)->+@$,$@@)#;,@@+$++$;.-'&++)'-%;&+@@@@@!-#)@+,)&@$;.=;!+@,>-%..*=#!+$'%#,$@++$!;**%;!+@,>-*>$@$++++&;;)@+,)$@$;>+@$)&+@,-",
-"........*.#,@+$$@+&#;&@@+$+@$;'$@+$$+$&#'$@+$+@@&##)@@++++$#%;&+++$&>%->,$$++@!-;&@+$&$@+'%;,$+@$&>%.%-;>,+$'%;&+@$++$)-*#,$+@$&>%!+@++++@$;;,@+$&+@+''$@+$+@@!=",
-"*.*..*....-!++++++&#;&+++++$)-#)$+++++&-#)$+++++&#='&$++++&#=;$++++$)=%;)$++++>*;&++$,++$'=;&++++$)%*-!&$+@&;%;&+$,$++&#%;&++++$)=)$++$+$+$';&++&,++$'#)$+++$&'%",
-"........*.=#!,,,,,>=->,,,,,'#%=#>),,,!;%=#>),,,,>=%-;!,,,!'=%#!,&&,!;%=',@@@$!;%->,,!>,,!#*#>),,,!;%*#,+@@+!#*-!,!'!,,>=%#!),,,!;%;),)),),)##>,,)>,,)#=#>),,!;-*",
-"..*..*.....%-#####-*%-#####=*..%=####-=*.%=#####-*..=-####=%.=-#;;##=.%#!&$$);=.=-;#--###%.=-####-=**->&$$,;%**-##-###-*.*-#;###=.=########%%-######-%.%=###-%*.",
-"........*.....*.*...........*..........*.*%*......................................................................%%%*.....%%%**....%%%*..............*.........",
-"*.*..*.............*...*.......*.........*=#-%....*......*...*..*...*.........*..........*.......................=#''#%*...='>#*...%#''#=................*......",
-"..%..%..*.*....%........%%..*....*.*....%->)!#%*....*.*........%......*.*.*.....*.*%.*%....*.%.*.*.*.*%.%.*.*.*.%;!,,;%...%#)&'-*..%;),!;=*.*.*.*.*...*.....*.*.",
-"%-#;;##-*..%-#;;##-**%-##-##-%..%-#;##=*%;,++>;-%.%-#-==-#=%%-##--#;#%*-##-=###%.=##--##-*%-##-=##-%*=#;;;;-%...->++,#%...='$@!#%..*#,++>-...............*......",
-"#!,,,,)>;%=;>),,,,!-%#!))),)>-*=;!,,))>%->$++&)'#*#!)!''))>=#!,,)!,,)##!,)>'!,)#='),)!,,!-#!,)>'!,)#=>),,,)!;%.%#!@$>-%...=>$@)#....->$@!#%...%%=%%%%.*...*.*...",
-"'+@@@@@$!-#)&@@@@@$#='+@++@@&#*#!+@@@+&-#)@@@@@,;*'$@+)!@+$#'$@@+$@@+>'$@@$,+@+>#!@@+&@@+#'+@@&)+@+>#&+@@@@+'%.*;)@$>=..*.=>$@)#%*..=>+@);..%-;''''';%..........",
-";&@@@+@@$#'++@++@@&#='&+@@++&#='$@++@@$##!+@++$!#*;&@+,)+@$#;&@@$&+@+''+@+++$@+'->$@+$@+&#;&@@+,+@+';&@++@+&'%.='&@$>=....=>$@)#*...=>$@&'=.='$$+$&$&#*.*..*....",
-";)@@$,$@+;>+@$&+@@)#*#!++$,)>-%'$+@@+$,-=>$++)>;=.#)@+,!$@$##!$++&@+&#;)@++@+@+;%;)$+@+,>%#!$@+&@+&##)$$@@$!#%.=>+@$>=*...=>$@)#..*.=>$@+>=.#!@@@@+@&#.......*..",
-"#!@@$&$@$;>+@$&$@@!-.->++&>;-%='&+@@+$&#='&+$!';-%#!@+,)&@$;=;&+$&@&!-#!@@@@+@$#*->&@@+);*%;,++$@&>=->&+@+&!#%.%'&@$>%..*.=>$@!#%...=>$@&'=.-!+$+++$,-...*.*....",
-"#!@@@+@+&#;&+@+@@@!-%;)++&)'-*='$+++@@$#%;&++&&,>=#!@+$&+@$;*#>$++@);*-!+@@+@@&#%;,++++&>=.%>$@@+);*#)$@+$$$'%.*#)@+>=....=>$@)#%...=>$@)#%.=#!!!!)>;%*.....*...",
-"#)@@++$,>%-',$++@@)-='&+@$$!;*->@@+++@$;*#)+++@+,-->+@+$@@+'.=;&@@+>-.='&++&@$,-->$@+$@+&#%='&@@&'-*;&+@++@@>%.*#)@$>-....='$@!#%..%->$@!#%..%------%........*..",
-";,@+$)>;-**-;>)$+@)#->@@@@@);*=>$++@@$,#*='&+@+&>%%;!$@@+@+>.*->$@,;%.*#,$$,+,>%->@@$&@@$#='$+@@!#*.#&+@@@@+>%.*=!@+!#%.*.%;&+>=%..*#!+@!-*....*.%....*.*.*.....",
-";$@@+&;=....='&+@@$#%;>))!!;-.%#>>!!!>;%.*=;>!>'#%.=#>!!!!>-..%#>>;=%.*=#'';';-%=;>!>>!!>==>++++>-%.=;!)))!>#%.*=;&&&'%...*-'>#%...%'&$,'=.*.................*..",
-"#!&&,>-*....*->,&&!-*=-###-=*..%=--##=%..**%---%*...%=-###-%...%=-%*....*=%%=%*.*%-#---#=**#>!!>-*..*=-###-=%...*-;';-%....*==%..*.%-;';-*...*......*...........",
-".......*.*..............=-=%.....%%%=*...........*.%=%%*==%.*...*%..*...*=-##-%*.............%%%*.......%%*..........*.*......*..........*....%%%%%...*.*.%.*.*.",
-".......................%;>'#%*..=#'';#%*..%.....%.*#'>;;'';%..%%##-*..**-'!))!'%...%%==%**.%=#;;#-%...%-;;#=%.*..........*.................*.%=#''#=%...%-##-%..",
-".*.*.....*.*.*.*.*.*.*=;!@$>#*.=#!&&&>#%.=------=*->$$&)&&)#..%#)$'-..*='&+@@+&-*%-;';';-.%#')&&)'-%.%->,&);=...*..*.......*..*.*.*.*.......%#>,$&)>#%.=#!))>;=.",
-"......*......*%%%....%#>&@+,>%%->+@@@,'%=#)!>>!)>=#)@@+&@@$;..='$@!#%.%;,+@++@$#.%;!&>&&#*-'&+@@+$'=.=;&++@!-....%%%%%%*.%==---=*......*.*..-'&+@@+$'%.='+@@+!-.",
-"...*........%=;;#%..%#!&+@@$,-*;,++$$);*=>+++++$,--!+@+&@+&#..=>$@)#..->&+@+$$&-.%#>)>)!#.#)+@@@@+)-.->$++@!#%..-;;;;;#%%#'>>>>>;%..*.%***..#)+@@@@+)-.='&$$&>-*",
-"*......*.*..%#,$>=..*;&@+$+$,-='&+$,!;-.#>+@@+@@&#%',++$@&!-*.=>$@!#*.#)@@@@+&,-..=###;#=.'$@@@@@+$#%#,+++@,;*%-'&+&&+,-->++++++$#.%-#;;;#-%'$+@@@@++#.%-'!!'#%.",
-"...*........=;,&)#..%'$@$&&&!=->$++&!#%.#!@@+$@@&#*#!$@+@,'%..%'$+!#*.#,@@+@@$&#...%%*%*..>+@@+++++;*#,+++@,'%->,++++@&#-!++@@@@+;%#!,$&&&!->++@@@+++;..%=--%%..",
-"*....*...*..='&$)#%.%;$@$&&,>=-!+@@@&;=.#!@+$&+@$#*->$@@+,'%..%'&+!#..#!+@@+@@+;*.......*.>+@@+++++;%#)+@@@$>%;&+@$+@+!-=;)&&&$@+;%;&+@@++&=>++@@@+++;.....%....",
-"............=>$+&;%.%;&+@$+$!=->$+@$,'-*-!@@+$@@&#*-!$@@+,'%..%'$@!#..=',+@@+@+;..........'&@@@@@@&#*#)+@@@&>%;$@++@+&>=.=#;;')@+;%#)&&&&&!='&@@@+@@&#..........",
-".*.*...*.*.*#!++&'%..#>&@@@$>%->$@+&&,!-->+@@@@+&#*-!&+@$,'%*.%>$@!#*.=;)&$+@@+#..*.*.*...#!+@@@@+!-*->&$$&!;*#&$@$+@@!-..**%-'&,#.%#;''''#%#!+@@@@+!-*.*.*..*..",
-"...........%#!@@$'=..%#>,@+);%#)@@@@@@$#%',&,,,&!=*#!+@@@&>*..%'$@!#%.->+++$@&!=........*.=;,$@@$,'%.%-;>>'#=.-')++$+@&#.....*-;#%*.%====%%.=;,$@@$,;%.....*....",
-"....*.*....*#!@@$'=*..%#!+&'=.-!++++++&#.-;';;;'#%*-!$+++,'%..%;&+>-..=>+++++!#%*.........*-')$$,'-*..*==-=%...=;,&&&+)-*......%%...........*-')$$,'-%..........",
-"*.......*..*->$+&;%....=#>'-*.=;!,,,,)'=.%==**%=%**=;>,,)'#%..%->,;=..%#)&&,!;=...*.*...*..%=#;;#=*...........*%=#;;;;#%..*.............*....*=#;;#=*..*..*.*...",
-"..*.........%-'';=.*....%==%...=-####-=%............%-##-=*....%--=.*..%#;;;-%...............*%%%...*......*.....******......*...*.*.*....*....*%%*..........*..",
-"..%-##-*.*...........*%-##-*....%###-%........%.............**=#;;;;#%........*.*...*...*....=--=%....*%%%..............-##-%.....-##=......-;;#-*...*..*.%*....",
-"*%#>,)'-%....%==%*...*#>,,>#%*.%#>,,>#%...*%-#-**.*.........*-'),&&,!=...............*.....%=;!);=...*-#;##%*.*.*.......'&$>-%*.%.)$,'=*%%%%>&&,>-%%=*...=##-%..",
-"*#>+$+&;=.*.%-'>;%.*.='$$+&>=..='$$+&>=*..=#!)>-....*.*.*...->$$++++&#*.*.*.*...*.*.....*..%;)$+>-*.%=;,$&!#%.....*.*...!$+,;=%--%&+$!--;';%,++$,'#;'-...#)&;=..",
-"=',@$++)-%.*='$+!#=..='$$+$!-%.='$+@+!#%..->$+!-%.%---==---.#)@++@@+$#...............*.....*;)+@!#..=;,+$++!-%.%%%**%.*.)+@$'-;>)=&@+,;')&,=&$++$>!&$;*.%#,$>-..",
-"=>&@&+$,#**#')+@,!;%.='&$+$>-%.='&+@+)#%.%#!+&'=..#>)!'')!'=;,@++@@$,-...%---.*...*.....*..*->+@)#%.->&@$++,#*=#;;;;;-*.>$@$>',++#)@+,>,+$)-!$@+&)$$&#..%',$>-..",
-"*;!+$++>-*=>$$+@++,-.='&@+&>-..=>$+++,#*..='!'#%..;$@+)!@+$##,@+@@@$)-..-;!);%.......*.....*#!+@,;%.=>&@&++,#*#)&,,$,>#*>$@$),$+&#)@+$,$+&!-&$+++$+$!-.%#!+@!#..",
-".-;)&,'#*.-!@@@@@@$#.=>@++$!-%.->@$++)#%..%%-=*...;&@+,)+@$##>+@@@@$)-.%-!+@>-%.*.*.....*...#)+@&'=.=',@$++!-.;$@@$++&'=,+@+$+++,#$@@++@@+,#&@@++@+$>%%#>&@@!#%.",
-".*%#''-%..%',&+@$&!-.%'&$$,'=..=;&&$,'%%....*.....;)@+,)$@$#=;)&+@@&)-.*-)+@>#......%%%....*#)$$&'-.=;)+++&>#*-)$@+++@,#)$+++@@+,#$+@@@@++&#!++++@+$>%='$++$>#%.",
-"...*=%*..*%-'!$@,>#%.%-'>>;-...%-;'';=%...*...*...#!@+$&+@$;.=;!+@@$)-..=;!);=.....-;;#%*..%-;>>'#%.=>&@@@$,#%->&@@++@&#;!,$@+@@,#>&$+$$++&#;!&+@+@+>=-!+@$,,>#*",
-".*........*=>,$+&!;%..*====.*...*===%...........*.#!@@+$@@+;.*#>+@@$)-...%--=..*.*%;&+>#%....==-%%..=;)+++$!-.#)$@+++@,##!&@++@@,#>$+$)&@+,-#!$@++@+!--!@+$&+,>%",
-"....*.*...='&$$$$&>-..................*...*.*.....#!@@@@@@+'%=>,+@@+$#*.....*....%-)+@&;%........*..*=#'>>;#=.;&@@$++&>=#&++++@@$#,@$,)++$,-'$++++@+,-->+@+$@&>%",
-".*......*.=>@@@@@@+#*.....*...*...............*...#!@+&)!!>-*#,+@@@@$;...........*#,+@$'%..*.........*%===%*..#)$),&,>#*#)$&&$+@$#)$,>)+++,#'$$&&$@+,-%;)+@@@,;%",
-"..........%;>))))!>%..*.....*...*.*..*.*..........->+$!#%%%.*->&$$$$&#.*....*....%#)++,;%....*...*............=#;;;;#-%.='>''>&$,-'';;>&&&)=#>'''!$&>%.=;>!!!;=*",
-"..*.*.*.*.*%-#####=%....*.................*.*...*.%;)>#%.....%-;'>>'#%...*....*...%',&'-.*.........*.......*.*.**%%%%...*====-#;#*===%-;;;#%%==%=#;;-*..*-##-=*.",
-".%-;#=*......%-#;-*.*.%-;;#%.*..%=##-%.*.....%......%#''#%*...%=---==%.%%-####-%.%-;;=*....*.%=;;-%..*%-;;-*...%=####=*..*-;;=*.......%#;#=...%#'>;=.*.*=#----%.",
-".='$,;=**...*->)$;=..%->&+'-...-#!)!!#%..%--#--=...*-!$$!-%..*-'!!>>'=%=;!&,&)>=*=;&)>-%....%-'&$'=..%#>+&>-%.*-'&!))'-..=',,'-**....=#>$!#%.*->&+);%.*->)!>,>#%",
-".=>&$&;%..*%-'&$&;%..='$++,#%.%#)++++>-.%-'))>$#=*.=;,$$,#%..='&&$$&$#-!,++++++-%#>&@$!;-*%-'!++&>-%%#!$+@$>#.=',+&$$,;%*-'&$&'#%.*%=;)&$!#%.='&+++>#*=;,$$&$&>=",
-"*#!&++>-..*-',++)#%.*#!$++$;=.='&++++>-%*#)+$&&'%.%#!&++);%..->@@@@@@;;$++$$+++;#)$$++$$'%#)&$++$&>%#)$++++$>=;,$++++$>=*#)&++&!;%*->)$+$,'%*;,$+$+&>%='&++$+$,-",
-"=;&$++);%.%;,$++);%.='&+++&'=.='$+++&'=.='&$+$&'=.=;&$++,;%.%-!+@@$&@;'$@$>!&$$;'+@@@@@@,-;+@@@@@@,-;$@@@@@@,-'$@@@@@@,-='$+@@+$)=%;$+@@+$)=='$+@+@+,-='$+@@@$)-",
-"*;$+@@$>=.%;$+@@$>-.=;$+@@$>-.='$+@@$>=.=;$+@@$>=.=;$+@@$>=.*#!@@@++&#>+@,'#>!)=#,$@&&+@)--,$@&&+@)-#,$@&&+@)-;,$@&&+@,-*#)&+@$,>=%#)&+@$,>=%#)&+@$,>=*-')+@&!;%",
-"*->$+@+!#.%->$+@+!#*%->$+@+!#.%=>$+@+!#.%#!$+@+!#%*->$+@+!#.=',@@@@@,#>+@);=-##%#)$@&$++>=#)$@&$++>-#)$@&$+$>=#)$@&$+$>=.=#!+@,'-..=;!+@,'-%.=#!+@,'-*.%->$@);=.",
-"%#)++$@,'%*#!++$@,'%*#)$+$@,'%%#)++$@,'%*#,++$@,'%%#)++$@,'%#)$@@@@+,->+@,'#;;#%#)$@+@+);%#)$@+@+);*#)$@+@+);%#)$@+@+);*.*=>+@,#%...->$@);%...=>$@);%...=>$@)#*.",
-"='$++$@$,-='$++$@$,-='$++$@$,-='$++$@+,-%'$++$@$,-='$++$@+,-;&+@@@+$!#>$@+!),&,-#)$@+@+,>=#)$@+@+,>=#)$@+@+,>=#)$@+@+)>=.%->$@);=*.%->+@);%*.%->$@);%*..->$@);%.",
-"#)@@@@@@$;#)@@@@@@$;#)@@@@@@$;#)@@@@@@$;#)@@@@@@$;#)@@@@@@$;>+@$++$&+;;&+@@@@@&#;,$@&$+$+#;,$@&$$$+#;,$@&$$$+#;,$@&$$$+#.-')+@&>#*.-')+@&>#*.-')+@&>;*%-')+@&>#%",
-"'&@@+$+@+''&@@+$+@+''&@@+$+@+''&@@+$+@+''&@@+$+@+''&@@+$+@+',+@+@@@@@;-!&+@@++)-'$@@@@@@+;'$@@@@@@+;'$@@@@@@+;'$@@@@@@+;=;&+@@@$)=%;&+@@@$)=%;&+@@@$)=%;&+@@@$)=",
-"'$@@+&@@+>'$@@+&@@+>'$@@+&@@+>'$@@+&@@+>'$@@+&@@@>'$@@+&@@+>)++$+++@+;*=>&@@&'-*;&+@++++$#'&+@++++$#'&+@++++$#;&+@++++$#%;&++++$!-%;&++++$)-=;&++++$)=%;&++++$!-",
-";,$$&,$$&;;,$$&,$$&;;,$$&,&$&;;,$$&,&$&;;,$$&,$$&;;,$$&,&$&;;),,,&&&,-.%'$@$>-*.->,&&&&,>=->,&&&&,>=->,&&&&,>-->,&&&,,>=%#>,&&,)'%%#>,,,,)'%%#>,,&,)'%%#>,&&,)'%",
-"=#'';;'';==#'';;'';==#'';;'';=%#'';;'';-=#'';;'';==#'';;'';==-#######%.*-'>'#%..*-######-*%=######-*%=######-**=######-%.%-####-=%.%-####-=*.%-####-=..%--###-=*",
-".%*%%%%.....=#;;##=..*-;;-%..*...*-##=....%#';#%....=#;;##=*....***..*.............*%=--%..*-;;-%......%-##=*...%#''#%......%**.......=#;-%..*=%%........-##=*..",
-"-;'''';#%.%=;,$&&,#%.%;&&!-%....*->,,;%..%->$&!-%..=;,$&&,#%.%=#-##=*....*....*..%-;''!>#%.%;&&!-%....*->,,;%..%#>$&!-%..%-#-##=%....=;!$>-*=#';;-**.*.%-'),'#%.",
-">&+++$&!;%%;!$@+$&'%.='$+&'=.*..='&+&'=..=',@+&'=.%#>$@+$&;*.=;!>!!;-*.=-=%*=-=%%#>&++++>=.-'$+&'-%*.%-'&+$>-%*=',@+&'-%*=;!>!!'-%.%=;!&+!;%#,$$&!#**..=;&++$>#*",
-"!+@+++++!--!&+@@+&>=%=',+$)#=..=;!@+,'=.%->+$+$)#*=',+@@+);*%#>+&$$,#%%#)>;#;)>%#)$++@@@,-=;!,@$,';%=;>)@+&!;%=')+$+$&'%=')+&$$&'%=;'!$@$,>=;&+@$&>#=%*#)+++@&'%",
-")+@+$++@&#;&++$+++&-#!$+++++>=#!$+++++>=#)$@++++!=#,+@++++!=#)$@$+++!-=>$&)!,$,-'&+@++@@&##,$+$$++,-#,++$$++&-#&+@&$++&-#&+@&$++&##,$++$++&'#&+@++&,'=%;&++&@$)=",
-"!+@+&&+@+;'$@@&$+@&#'&+@$$+@&#'&+@$$+@&#'$@@$$+@&#'$@@$$+@&#'$@@$$+@&#->+@$$++&->+@$+++@+;'$@+,&+@&#'$@+,&+@&#'$@+,&+@&#'$@+,,+@&#;&+@$&+@+'#)$@++@@&#%;&+++@$)-",
-",+@@$&&++;'$@@+$+@&#>+@&!!$@+;>+@&!!+@+;>+@&!!$@+;>+@&!!$@+;>+@&!!$@+;=',+@@@&>=>+@&@+$++;'$@&>!$@,#'$@$!!$@,#'$@&!!$@,#'$@$!!$@,##>$+$&++&##)$@&&$++;=;&+@@@$,#",
-",+@+&,&++;'$@+@++@,#>+@)';&$+;>$@)';,$+;>+@);'&$+;>$@);'&$+;>+@);'&$+;*#!$@@+,'%>+@&@+$++;>$@&>!$@,#'$@&>>$@,#'$@&>!$@,#'$@&>!$@,#%#)$++@,>=#)$@&&$++;%;&++$+@$;",
-">+@$))&++;>$@$++@@,#>+@,''&++;>+@,'>&++;>+@,''&++;>+@,''&++;>+@,''&++;%;&+@+@&!=>+@@+$+@+;'$@&>!$@,#'$@&>!$@,#'$@&>!$@,#'$@&>!$@,#.=;&+@$>-*#)$@+++@$#='&++&&@+;",
-">$@$,,$+$#'$@$$+@@,#>$@$,,$@$#>$@$,,$@$;'$@$,,+@$#'$@$,,+@$#>$@$,,+@$#->$++$++&->+@@$$+@$#;$@$,,+@)-;&@$,,+@,-;$@$,,+@,-;&@$,,+@)-.*;)+@&>-.#,$@@@++,-='&++&&@+;",
-")+@+$+++)->$@+&$@@,#;,+@++++)-;,++++++)-#,$@++++)-;,+@++++)-;,+@++++)-->+$,!&+&-'$@@++++)-#)$@$+++!-#)$@$+++!-#)$@$+++!-#)$@$+++!-%-!&+@+);*'&+@+$,!;%#!+@+++@$;",
-",@@@@@+&'%>$@@,&+@!--',+@@+&'%-',+@@+&'%=',+@@+&'%-',+@@+&'%-',+@@+&'%%;!>;#'!'%;&+@@@+&'%=',@@@@$'%=',@@@@$'%=',@@@+$'%=',@@@+$'%*#)+@@@&>*'$@@+&'#%.#)@@+$@@$#",
-";!),))!'-*#>!!>'!!;%*-;!)!>;-*%-;!))!'-**-;>)!>;-**-;>)!>;-**-;!))!'-*.=--%*=--%#!&,))!'#**-;!))!>#**-'!))!>#*%-;!))!>#%*-'!))!>#%.=;>))!>#*#>)!>;=%..=;!)!!!!>=",
-"=-####-=*.*=##==--=%.%==##-=*..*==##-=%..*%-##-=*..*%-##-%%..*==##-%%...*%...*..=-#;##-=...*=-###=%...=-##-=%..*=-###=*...=-##-=*..*==##-=*.*=##-%*...*=-##-##=*",
-"..%--%........%==%.....%=-%.....*.***...............*=##=*........................=--%........%=-=*....%=-%...............%--%...*....%=-=%....%=-%.............",
-".%;!>#%.*...%%#')#%...=#>!;%.*.*=#;;;=%...%%%=%..*..=')&;=............*....*..*..%;!>#%*.*...*=;)'-**.%->!;=....%=%=%%..*%;!>#%......*=;)'-*..%#>!#=..*.%=%==%..",
-"*='&&!#%....%#!,&;=*.%#>&$!#%.%-'),,)'-*.=#;;;;-%..%-)$+>#%.*.%.*.%.*...*.%.%...%='&&!#*.....=;)$!#*..-'&$);%*.=#;;#;#=%*='&&!#%.*...=;!$!#%.*#>&$>#%..=#;;;;-%.",
-".=;&+$>-.*.%->$+,;%.*='&@@&'=.%;,+@@+!#*%-!,,)&;=..%;,$$,#%..-##-###=%.%=####-%..=;&+$>#%..*=;,$+>#%.%;,+@+>#*%->,,!$!;*.=;&++'=...*=;,$$>=.*='$@@&;=.%->,,)&;=.",
-"*->,$+);=.*-',$$,'=.%#)$$&+>-.='$$$+$!#.%#)&+&$>-.%->&++)'=.-'))!!))'==#')),)!;%*->,$+,>#%*-'!$+&!;%%->&$+$,'%%;)&&&$,>%.=;,$+>#...=#!$+);%.*-!&$$$'%.*#!&$&&'%.",
-"=;&+@@+>#%=;&+@@+!#*='$+@@@)#*=>$+@@@!#%='$+@@@!#%=;&+@@+!#%;$++++++&##)$+++++)-='&+@@+$)-='&+@@+$)-='$+@@@$,-->$+@+@$,-%-!$@@!#%*.-!$@@)#*.*#)$@+,;%.*#)$@+,;%.",
-"=>$++$@&>%=>$++$@&>%=>$+$$@&>%='$++$@&>%=>$+$$@&>%='$+$$@$>*'&++@++$@;'$@+$+@@,##!@@+$+@$;#)@@+$+@$;#!@@+$+@$##)@@+$+@$#.=',+@)#*..=',+@)#%..-',+@)#*..->&+@);%.",
-"->$+++@$)-=>$+++@$)-->$+$+@$)-->$+++@$)-->$+$+@$)-->$+++@$)-'&++@++$@;>+@&!)&$!-#)@@+$+@+;;,@@+$+@+;#)@@+$+@+;;,@@+$+@+;.*-!+@)#%..%#>+@)#*..%#!+@)#%..%#>+@)#*.",
-"#)++++@$)-#)++++@$)-#)++++@$)-#)++++@$)-#)++++@$)-#)++++@$)-)+@+@@@@@;>+@&)),&!-;,@@@@@@$;;,@@@@@@$;;,@@@@@@$;;,@@@@@@$;.%->+@);%..*->+@);%*.*->+@);=..*#>$@);%.",
-"#,@+&&@$,#;,@+&&@$,-#,@+&&@$,-#,@+&&@$,-#,@+&&@$,-#,@+&&@$,#&++&@@+++;'&+@+++@$#;,@@@+++$;#,@@@+++$;#,@@@+++$;#,@@@+++$;*-')+@&>#*%-')+@,>#**-')+@,>#*%-')+@,>#%",
-"#,@@@@@@$##,@@@@@@$##,@@@@@@&##,@@@@@@$##,@@@@@@&##,@@@@@@$#&+@@@@@@@;-',$@@+$!--!@@@@@@$;#!@@@@@@$;#!+@@@@@$;-!@@@@@@$;%;&$@@+$)=%;&$@@+$)=%;&$@@+$)=%;&$@@+$)=",
-"#>$+++++&##>$+++$+&#->$+++$+&#->$+++$+&##>$+++$+&#->$+++$+&#>$++$$++,#.='&@@&'-*=;!&+++&)-=;)$+++&!-%;!&+++&!-=;!&+++&!-%;&$+++$)=%;&$+++$)=%;&$+++$)-%;&$+++$)-",
-"%;!,&&&,>=%#),&&,,>==;),&&,,>==;),&&,,>=%;),&&,,>==;),&&,,>=;!,&!)&,;%.='$@+!#*..=#>,&,>;%.=;!&&,>;%.=#!,&,>#%.=#>,&,>;%%#>,&&&)'%%#>,&&&)'%%#>,&&&)'%%#>,&&&)'%",
-".=-##;##=%.==#####=%.==#####=%.==#####=**==#####=*.==#####=*%=##-###=..%#'!>#%....*=###-%...%-###=%...%=###-%...*=###-%..%-###;#=*.%-###;#=*.%-#;;##=*.%-#;###=*",
-"*-#####-=....====%....%==%.........=%=*....=##-*.....%=--%%.*.................*..........*.%%=%*...*....%-=%.....%=-=.................*%==**=###=...............",
-"->),,),!;%.%-;>>>#=..%#''#=......%-;>;=%..=;!)>#**..=#>!>'#*..%%.%%..*...*%%....*.........*=;>;=%......=;>!#%.*.=;>>;=.*..*%%.%%.*..*%=;>;=*#!,!;=...*...%*%*%..",
-";&@@@@@$)=%-'&$$$!#%.=>&$!#%*.*.%->,@!#*.%#)+@&'-..%#)$+&&>%.%-;####=%..%=;;-%....%%%%%%..=;)+,>#%.*.%=;,&+'-..=;)++!;=..=#;#;;-%...=-',@!;*'$@@!#=....%-#;#;#-%",
-"'$+@@@@$!-='&++@+!#%.='&++!#*...='&++!#**=>&+++!#**=>&@@+&>%%-!,&!+!;%.%='&&'=%..%-;''';#%#>,$+&>;=%=#'!$+$!;%=;!$+++!#%-')&,)+>#%=#;>&++,>=;&+@&)>;=%-#>&&!&,>-",
-";&++++@$,-;&+++++);%*->&+@$>#%%='&+@+!;%*#!$+++)'%*->$@@+,>%%#)$+$+,'%.*#)+@!#%.%#>+$+$$,->&$&$$$&;%;,$&&$++!-;,$+$$+$)=;,$$&&+$)-#,$$$$$$&'#)$@++$,'%#,$+$,++$'",
-"#,@+$$@+$#'&@++++&>==',$@@+&!-=',$@@+&!-='&+@@+&!-=',+@@+&!-='&+@@+&!-%-',+@!'-%#!&+++++$#)++&)$++>='&+$,,@+&#'&@+&&++$#'&@$,&@+&#'&++&,$@$'#)$@@@@+,#'&@+&,+@+>",
-"#!+@@@@@+;'&@@@+@+&##>@@@+@@$##>@@@+@@$##!@@@+@@$##>@@@+@@$##!@@@+@@$#-')&&&,)>='$@@+@@@)#)+@&)&@@!-;&@+,)+@$#;&@+,)+@$#'&@+,)@@$##!+@$&@+$;#)$@$&+@$;;,@@$&+@$;",
-"#,@+$$$@+;;,@@$&$@$##,@+&&$@+;#,@+&&$@+;;,@+&&$@+;;,@+&&$@+;#,@+&&$@+;;&+@@@@+&#>+@$+@@@,#>$@$)&+@!-#)@+,)$@$##,@+,)$@$#;,@+,)$@$#=',++$@&!-#)$@&,$++;#>$++&@$,#",
-"#,@+,)&@+;#)@+&)$@$##,@+)),@+;;,@+)),@+;;,@+)),@+;#,@+)),@+;#,@+)),@+;#!,&$$&&!->+@$@++@,#'$@$),+@!-#!@+,)&@$##)@+,)&@$;#!@+,)&@$#*=>&@@+!#*#)$@+$+@&#*#!$++@,'%",
-"#,@+&,$@$;;)@+&)$@$;#,@+&,$@$;;,@+&,$@$;#,@+&,$@$;#,@+&,$@$;#,@+&)$@$;=#')$$!'#*>$@++++@,-'$@$,&+@)-#!@+&,$@$##!@+&,$@$;#!@+&,$@$;*->&+@,'%.#)$@@@@+)-.='&+@$>-.",
-"#!+@+$++$#'&@@$&+@+'#)+@+$++$##!+@+$++$##!+@+$++$##!+@+$++$##!+@+$++&#.*#)++!-%.>$@@++@+!-#,++$+@@&#=>$++$+@+'->$++$+@+'=>$++$+@+'=;&+@@)#*.#,$@&&,!;%*#!$+@,;=.",
-"='&+@@@$,='+@@+&@@@>='&+@@@$)-='&+@@@$)-='&+@@@$)-='&+@@@$)-='&+@@@$)-.*=>&$'=..>$@@@@+&;%->&@@@@@$#%#)+@@@@@>%#!$@@@@@>%#!$@@@@@>=>+@@@!#..'$@@+&'#%.='+@@@!#%.",
-"*-'!)))>;%#>))!!))!#%-'!)))>;%*-'!)))>;%*-'!)))>;%%-'!)))>;%*-'!),)>#%..*-;;-%..!$+,,)!'#**-'!))))>-*=;>))))!#.=;>))))!#.=;>),))!#='$++$'-*.#&++$,#*..='$++$'=..",
-".*=-###=%.%=###-##-%.*==###-%..*=-###=%..*==###=%..*=-###-%.**=-###=%%..**=%%.*.#''';#-=*..*=#####=*..%-####-%..*=####-%..%-#####%*-'>>'-*..-;>>';=%..*-'>>'-*..",
-"..........=--%*..................***.*............%-;'''';#*.....%=*...%=###-=*....%-#=*........*............*.........*............*%*%%.*.#';#-%*.............",
-"....%%..*.;)>'=%...*.........*=#;#;;;#=%..%==%....=>$$$$$$>=....=;'#%..=',,,,;%...*#!,;=.*....%-##=%*..=--=......**%%%...=---=%%...%#;;#;#*.)$$,'';#=%..%=*%==..",
-".*.-;;#%..!$&,;=%%%*.%-#;;-%..'),,,,,)>=*=#>>#%*..#!@@++@@,-*%%=#,&>-%*#)$+$+>=**=#>&+!#=%.*.%#>,)'%.%-'!!;-**%#;;;;;;=%-;!!!';;#%*#>,)!&'-.&@@$,,,!'-%=;'##';-%",
-"..=;,$>%..,@@+)#=;;=%#>)$,);=.!+@@@@@+&-*-!$$'=...;,@@++@@,#-;;'!++)#*%;,$@+@!#.-'),+@&!'%...='$@+,--;>,+@);-*#!,&,&&&'%;)+++$&,)#='&+$$@,'%,+@+$+@+&;%;)$!>&&'%",
-"..=>++,=..>&@@&;;)&##>&+@@+)#%'),&@+&!'%.-!$+>-*..',@@@@@@,#',&,,++&'%#>&$@&@,'%;&++@@++&#..%#!$+$>=',&$++,,>-'$@@@@@@!='+@@@@@@@#;)$+$$@&!-',$@$$@@$;=;,@&,@+,-",
-"*.='&+$#%.;)@+&>!+$#'&@++@++)-!&&&@+,!'-%-!$+>-%..)+@@@@@@$;>++++@@+>=!&+@@+@$$#>$@@@@+@+;..='$+@$>%>++@@@++$;'&@+$$+@,-;)$+@@+$&#!$@@@+@+$;'&+@&&++&#%#)@&$@@&#",
-".*-')++;%.#>++$)&@,#>@+$&+++$#&+$+@@$$&'*-!$+!#...!++++@@@$#'&$++++@,#&$+@@+@+$#>+@++@&+$;..->+@@$>%!++++@+$&;',@+),+@)#=#>,++&>;=',$++$@$&#>$@@,)$+,-%#>+@@$$!-",
-"%#'),$+>-.%'&++&&+>=!@+&,++++;)$$$@@$$&'*-!$+!#.*.'$+++@@@&#=;)$+$$+&#)&+@@$@$&#>+@++@$+$;*.->$+@$)->++$+@+&>=;,@$!,+@)-.%->$+&'=.->&+$$@&!-)+@@,)&+&#*->&@@&)#%",
-"->$+&$+,;%*->$++,>#%!@+&)$+++>#;>,@$)>;=.->+@)#%..;)@@++@+!-.='&+$,)&-#',$@&@&!=>$@++@+@$#%=-',+@@$#'$@+$@+);%;,@$!,+@,#..%#&+&'=.=;&+$$@&>%)$$@&,&+&#=;!$@@,'-.",
-"',@+&&++>-.%#)+@,'-*!@+$)$+++>*=;)@$!;=..='$@)'=..#!@+$&++>%.*-!++,'#%*#)$@&@$)=;&@++@&&,##'>!,+@@&#;,@+$+@,>=;,@+,&+@)#..*->$$>#%*;&+$$@&>%#')+$&$+&-;)&@@@&!;%",
-"!+@@@@@+$'..='$+@)'%',@+$&+@$;.*#!@+&>=%.%;$@+!;=.->+++$,>#%..=;,$&>#**-!&@,$@$#-'!,+@,>;%)$+@@@@+,#-!+@+$++&##,@@+@@@,-*..=;&+$>=*;&+++@,>%%-'&@@@$>=)+@@&+@$>-",
-"!@+$$++@+'..*=')$@,#-')$+$&,>-.*-!+@$>=%.*->,@+)-%%;,+@&>#=....=;&$&;**->&+!)$$#%=#>$@!-%%!$++&&&$&-=;,$&),++>#!$&,,+@!-....=>$+&#*#)$@+@,'*.%->&$$);%!$$,!!&++;",
-"'$&))&&$&;..**-;,$&#*=;!&&>;-*..%;&&);=...%#>$$)#**->&$)#%.*....=>))#*.%#>);;)&#..=;&$>%..',&&)>>)!=%=;!>;',&'=')!;',&'%*...%;)&)-.=>,&$+);*..=#>,);=.'!);-#>&&#",
-"-##-#;;;#=....*=#'>=.*%-;#-**...*=#;#=.....%-;)'=..%=#;#%....*...=##=...%=-==-#%..*-;>#%..=#;#-==--*.*===%=##=*=-===##=*..*..%-#-*.*=#'>);=....%=##=..=-=%*%=##%"};
+"+     c #061406",
+"@     c #0B2A0B",
+"#     c #081E08",
+"$     c #030E03",
+"%     c #165016",
+"&     c #1B641B",
+"*     c #0F390F",
+"=     c #217A21",
+"-     c #279027",
+";     c #34BB34",
+">     c #5AD25A",
+",     c #2BA02B",
+"'     c #81DD81",
+")     c #E0F7E0",
+"!     c #A7E7A7",
+"~     c #040E04",
+"{     c #0E350E",
+"]     c #155015",
+"^     c #1B651B",
+"/     c #114011",
+"(     c #0D320D",
+"_     c #227C22",
+":     c #45B245",
+"<     c #7ADB7A",
+"[     c #80DC80",
+"}     c #8BDF8B",
+"|     c #52B552",
+"1     c #217B21",
+"2     c #0B280B",
+"3     c #1A5F1A",
+"4     c #4EB74E",
+"5     c #C6F0C6",
+"6     c #D5F4D5",
+"7     c #77D777",
+"8     c #D9F5D9",
+"9     c #83DB83",
+"0     c #DDF6DD",
+"a     c #8EDE8E",
+"b     c #268C26",
+"c     c #248624",
+"d     c #77D877",
+"e     c #54C954",
+"f     c #51B051",
+"g     c #0A270A",
+"h     c #0C2E0C",
+"i     c #144C14",
+".............+@@#$....$+#+++....$@%&&*#$..+@%&*#$....+##+.................##+......+%=&*$..$*&=%+......+#@#$...............................................#%%*$",
+"............+*=-&@+..+*%&%&*@+.+#=;>>,%+.+@=>'-%#+.+#%==*#.....+++++....+@%=%#....+*-)>=#..#=>)-*#....+*&-%#+....+$#......................................+%>'&+",
+".$..$..$..$$@-!);%+.+@=>>;',%+.+*;!!)>=+$@&>))',%+.#%;''=@+.$.#%&&%@+.$.#%;',*+.$$@->!,&+..+&,)>-@+.$#*=')-%@+.$.#%%*+.$..$..$..$..$..$..$..$..$..$..$..$$@=')=#",
+"...........$*;!)'=#.+*;!!')>=+.@&>!!)';@#&>!))!>=+$@-'!!;%+..#%;'!>&+...@-')>%+..$%>!!-*+..+*-!!>%$.$*,>!)>;&+..+%>!=@...................................$*;!!=#",
+"..$..$.....+%>!)'=#.#%>!!')>=++*>!)))!>*@=!!!'!>=++*;'!!'=@.+*,'!''&#..+*>!!,*+..+%>!'&#....#&'!>&+.#%>!))!',#..#&'),*+.$..$..$..$..+++++$.$..$..$...$...#&'!>&+",
+"...$..$$...$*>!)'=#.+%>!'>);%+#&>!))))>*@=)!'>';&+$*,'!!!,%+$*;!!>>&@+..*;'>&#...#&');%#....+%,)'&#.+%>!)))'-#+@%-!);=*$.$..$..$..+@*%%%%%*$$..$...$....+%,''-*$",
+"........$..$*;!)'&+.$*-;,,>&@.+%>!)))!>*#&'!!!'>=#$@&>!!!>=$$*;!!';-%+.$@&=%@$...#='),*..$..$*,)'=#.+*->!)';&+#&>>!)'>,@..........#&>>>>>>,@.....$...$..*=!!;%+.",
+".$.$........@=');%#..+@****@$.#&;!!')>-@+%->!))!;*.@&>))!;=+#%;!))>',@..$##+..$..#='),*+....$*,)'=#..@-!!');=$*-))))))'*.$..++$$..*-))))))'*.$..$$.....+%,)!,@$.",
+".....$..$...#&')-*$...$$$$$$..@-!))))!>@#&>'''!)'*$@,>!))';@#='!)))!>@...+......$#=');%+...$$%,)'&#.$@->>,',%$#&;>!)'>,@...#*%*+.$#&;>>>>;-@..$@*%@+.$.@=!!>%+..",
+"............+%,;=@............@='!)!!>=#@=!)!!)!>*$#&-'!'!>@@=)!!!)';*......$....+&>!>&#$...#&>)>&#..#*%&%&%#$$#%-!);=*+..+*,>-*$.$#%%%%%%*+..#&;>&+..#%,)>-@...",
+".$...$.$.$..+*;>&#.$..........#&>!)!!-*+@=!!)!)',#.+@&>!'!>@@=!!!!)'>*.$.....$...$*;!!-@$..$*-!'>%$...$##$++$...@&')-*+.$.#='!;%$...$.$.++..$+@-'!=@..@->),%#.$.",
+"..$.........$*>'%#...$..$..$..+%>!))'=@.+*,>!)'=*$..$*,''>-#+%>'!'''>*..$.$......$@->!;&+..+&;!>-@+.............+%>'=@...$*;!!;*+............$@-''&#+.*;!!=@....",
+"........$.$..#*%@+............#*;!!!'&+..$@&>!=*$...$#*%%%*+$#%&====%+......$.$...+*-)>=+..#&>)-*+..$........$...#*%@+$..+*>'>&#$.$.$.$...$...+@%%@+$.*,>;%+....",
+"$..$.$........++$.$.$.$.$..$..$#%===&@#....#%&*#......$#++$...++####+.$.$..........#%=&*#..+*&=%#.....$.$..$..$...++$....$@=,&@$...............$+#$...#&=&@$$...",
+"..+@**@#+.$.+@**#.....#**%*#+...#@*%*#$....+@*@#+.$+@*%%*@+....+#***#$$@*%%%%@#$.$$@***#$...+#***++......$.....$.$.....$..............$...$.$.......$...++##++..",
+".#*=;>,&@$$*&-;>%#..$#%,>>;&*+.#%->>;&*#..+*=;;%+.+*=>>>>,*+..#*=;>;&+@=;>>>>;%$.#%=;>,&*+.+*&>;,&*$$.$....$........$..........$.$.$...$......$.$......#*&==%@+.",
+"$*,'!)!;&+#&'!!!-@$.#%>!!)!>-##%>!!)!>-#..@='!!=@$#=>)))!'&+.#*,!!!!-#*>!))!!!=+#%>'!)!>-#$@='!!!'&+.........$.$.$.....$.$.$+#*@#$..........+@*@#+..$.+*-'!!>=@$",
+"#&'!)!)';@#&!))),*$.#=!!)))!>*#&'!)))!>*.$*;!))-*$@-')))!'&$$@=>))!!=#*>!)!)))-+#=!!)))!>*#%,)))))-@...#@@#+......#*@#.....@*&-,&#.+@@@@@@@.@&,-&*#$..#&;)))!>&+",
+"@-)!>;')'*+*=,!)-*+.#&''>;')'*#%>>;>!)'*.#&'!!),*$@,')''>,&+#%,)!'>,%+#%=-,'!!=+@=)!'>')'*@=>)>>!);*$.#&-,%#.....#&-,%#..+*&,>!);@+*=,,,--&+*>)!>,&@+.#=>)>'!)-#",
+"*-)!;,>)'*.+*-'),*$.$@&=-;!)'*.@%=,>)!>*+*,!!'),*$*->)))!'=+@->)!!';%+.#@*='!>&+@=!!'>!!>*@,');;!);*.+@,!)=*$.$.+*,!)=*.@%=>))!;&##=!!!!!!'@#&,!)!>=%+#&;>;>!)-@",
+"*-)!;->)'*$.#='),*+..+@&,>)';@.+@-'!)';*#&'!'');%+#&;!'!))-@@,'))))!=@.$+*-!'-*$@=>!)!)';*@=>)>>!);*.+@-'!=@$....*,!!=@.*;'!!';&@+*-!)))))>*.@&;'!!!;@+@&,>!!!=+",
+"*-)!;->)'*..#='),*...$*-')',%#.+*&>'!!>**-))!!)>,##*=,,;!);@@,')''!);*..+%>!'&#.@=!!!'!)>*#%,!!)));*..#%--%#..$..#%--%+.&'))'>=*#.*,!!!!!!>*.$@=;!))>*.$*-)!>,%+",
+"*-)!;->)'*$.@='),%+$$@=>!)>=@$+*==-;!)'**-)))!)!;@#%-=&,!);*@,')>>!);*..#='!>%+.@-)!'>!)'*$@='!!));@..+@*%@+.....+@*%@+.%>!!!',&@+*,!!!!!!>*+@%,'!!!>*.$*-)',%#.",
+"@=)!>;>)'*.@%-!);=*$#%;!)';=*+#&>>,;')'*@-!))))!>@*,>;-;!);*@->)>>!);@$$*=!!>*+.@-)!'>')'*$#&;>'!)-@$.+*==*+..$..#%=&*+.@%->))';&#@-!)!!!!>*#&,'))>-%+.$@=!>&@..",
+"#&>!!!)',@#%;'!)!>-#*=)))!!>-#*-)!!!)!>@#%,>!!)!>**,!)'!))-##%,))!)),@..*-)'-@$.@=!!!!)!>@$%-'!!!!=#.$@-')=#....+*,!)=#..+*=,'!);@#%--,,,-=#*>)!>;=*#..+@=!>%+..",
+"$*=>'!'-%+#&'!))!';@*-!)))!';@#&>!)!!,&#.#%,'!)!>@@&;!!!',%+.@&>!!!>=+.$@=!>&#..+*-'!!!,&+#&;!!'>-%+.$@-!!=@+...#&'!'=@....@%=-,&#.#@****@#$@=,-=%@+....#='>*+..",
+".$*=>>;%#.+*;>''>>=+#=>'>'>>=++*=>>>>&@$.$#&;>>>=+$@&>>>,%#..$*=>>>=*+..#%;-*$$..#%,>>>&@$+*->>>=*#..$#&>>%#.$..@-'';*+$....+@*@@.....$$$...$*%*@+..$...+%,=@...",
+"..$#*%*+$$.#*%%%%%@$+@*%&%%*@$.+@*%%*@$..$$#*%%*@$.+#*%**#.$..$@*%*#+$.$$#*@+.....+@%%*#$..+@%%*@+.$..++**#$...+#&,-%#...$....$+.............$$$........$#@@+$..",
+"...+++$.....+###+....+#@###$.....+####+.+##@##+....+#@#@##+.$+##@#@#+....+###+++$####+###+..###@@#+...$#@#@##..##@+####..+####$..$.+++.++##+.+#+$+##++...++#+...",
+"$+#%&&%#..$#%==&*$$.#%==-=&*#..+@%===&%+*&=-==%@$.#%==-==&*$#%=-=-==%+.+@%===&%+#%==&%&=&@+@%==-=&*+.$@%====%+#%==&%==%+#%===&*+..#%&%*@*&&@#%&%**&=%+.+@%==%@+.",
+".@&;''>%#.+*;'!'=*$$*;'!!!>-*++*=;'!'>;@=>!!!';=*+*;'!!!!'=+*;'!!!!'>@+*=;'!'>;@%;''>;'!>%#%>'!!!>-+.#%>!!!!;@*;!!>;!';@*,!!!>&#..%;!>=&-''%*;'>=,>';@+*=;'';=*$",
+"+%;'))'-*$+%>!))>&#.%>))))!!=#*,>!!!!!'%,!))!)!!=@%>)))))),@%>))))))!%*,>!)!)!'%%>))'>))!=#%>!!)!',@.#&'!)))'*&>))'>))'*%>!))'=#.$&>)!>,')!=&')!;>!)>**,>!)!!!=@",
+"#=!!'');=++*;!))!=@.%>!)''!);@&')!>>'!!%-!)!>'!)>**>!)''!);*%>!)''!!!%&')!>>!!!%%;)!'>!)!%+*->!)';&+.+*,>!!!,@%;)!!!)'-#*->)';%+..&>))'>))!&='))>'!)>*&')!'>!)>*",
+"*-)!!))',#$*-'))!,%$*,')>'!);*=')>-=,''*=')'--')'%*,')>>!!,@*,')>>'''*=')>-->''**,)!'>!)'%.+*-!),&@+..#*-'!>=+*,)!!)!-%++%,)>=@+..&;))!>))!%&'))!'!);*=')>--')'%",
+"*-)))))',@$*,!!')>=+*,')!)));*=!);&@*%%#&')>=&>!!%*,')'!!;&+*,')'!'-&#=!);=-;>,**-))!!))'*..#='),*$.++#@='!>&$*-))));=@.$*,);&#+..%;))!'))!%&')!)!!);*=!),&&>!!%",
+"*-)))))';@#&>!!>)';@*,')))))>%=!),%##@#+&')>&&>'!%*,')))!-%+*,')))'=@$=!);=>!!>**-))))))'%..#='),*$.@%&%='!>&$*-))))>=@$$*,);=**@$%;))))!)!%&')')!!);*=!),%&>'!%",
+"*-)!!))!>@*-!))))!>*@,')'>'!!%=!);&*%&%#&')>==>'!%*,')'!!>,@*,')'!'&+.=!)>-'))'%*,)!'>')'*..#='),%+.&>!--'!>%$*,)!!!);&+$*,)>-,>&+%;)!!)>)!%&')'!!));*=!);==>!!%",
+"*-)!!')',@%;)!''!)!%*;')>;'!!%&')'-=>''*=')',,')>**;')>''''%*;')>>,*$$&')';>'!!%%,)!>;')'%$#%-!);=@+=!)>;!!>%$*,)!'>)';*#&;)>;');@%;)!>;>)!&&')'>!));*&')',,!)>%",
+"#&'!!'!>=#&>))''!)!=%>!)''!!'%%>!!''!!'*-!)!''!);@&>!)''!!!%%>!)'>-@..%>!!''!!'*%>)!'>!)!&+*;'!)'>=+&')''!',*$&>)!'>!!'&*;')''!);@&>)!;,>)!&=')!;'));*%>!!''!!;*",
+"+%;')));&+%>!!'>!!'&%>!!!!!!-@@&,'!!!'-@-'!!!!''&+&>!!!!!!'*%>!!!>=#$.@&,'!!!'-@%>!!';!!'&+%>!!!!'-#*,'!!!;%#.%>!!>,;!'&*>!!!!!!-#%>!';-'!'&%>!!,;'!-@@&,'!!'>&+",
+".#%=;>,&*$*=,-=&-,-*@&,,,,-=*++@*&-,=&*+*=,,;,=%@$@=,;;;,-=#@=,;,=*+$.+@*=,,-&*+*=,-=&-,-*$*&-;;;-%+#*=,;-%#$.*=,,=*&==*@=,;;,;-%+*=,-&%=-=*@=,-%%=-%++#*&--=%@$",
+"..+@***#$.$@**@@@*@+$#***@@@+...+#@*@#+.+@***@#+$.$#@****@#$.#***#+.....+#@@@#$.+#**@@@@@+.+#@***@#..+#@*@#...+#@*@++@@$$#*****@+.+@@@###@@++#@@#+@@+$..+#@@#+..",
+".+#+##++.....++++$...+#+#++...$.+++#+++..$#+###++..+#+$++#+..+++$$++++.++++$+#+$.+##++++#+.++#++++++..++###++...+@**#$..+@*@+.......+@**@$...$.+@@#+............",
+"@%&===&%#$.#*%&=%*+.@%&===%*+..#*&&=&&*+#*&=====%+#%&&%%&&%+@%&&%*%&&#@%&&%*%&&#@%&&&%&&&#@%&&&%&&&#+@%&====%+.$@-;>&@+.@->=*+..$..+@=;;-@+...+*-,%#...$....$...",
+"%>!!!!'>&++%-'!!',*+%>!!!!'=*++%-'!!!'=#@='!!!!!>*%>!!,>'!>*%>!';='!'&%>!';-'!'&%>!!>;!!'&%>!!>;!!'&#&''!!!!>*.#%>!!,%+.*;''=#.....#%;!!>%+$.$@='!,%+....$....$.",
+"&'))))!!;**->!))!'-@&'))))!>-@*->)))));@*;))))))'%='))>'))!*&!)!>,!)!=&'))'>!)!=&'))!>))!=&'))!>))!=@=!)))))!%$#=')!,*+.@,>!-%+..$.+%;))'=+..+*;!)>&#$.$........",
+"%;')'>!)!%&')!>>!)>*&;)!''!)>*%>!)''!);@%;)!!)')!%=')',,!)>*&>)!;->)!&&>)!'!')!&%;)!'>!)'%%;)!'>!)'%@=!!''!)'%.#=');&#+.+%,)'=@+...+@&;)'=#$.#&'!)!-*$..$.$.$...",
+"*,')>,>!!%=!)>--')!%*,)!>>')'*%>)!>>'!,@*,)!!)>)!%&')>=-');**,)!;->)'%&;)!!)')!%@=>!)!)',*@=>!!')',@#&''>')',@.#='),%+...@='!>&+....$%,)'=#.$@-!!>),%$..........",
+"*,')>;'!!%=!);&&>!!%*-)!'')!>**;')!!''=#@=>>!)>',*&')>==');**=!!>,')>*%;)!!)))!%$*-'))!;&#+*-')!);&++*-;'!);&+.#='),*$...+%;)!-@$....*,)'=#.+@->>;',%$....$.$...",
+"*,')!!))>*=!);==>!!%*-)))))>-@*=;'!))!-@+@&-!);=*+&')>==');*#&>!'>)';@%;))!!))!%$@=>))!,%+.+%;!)>=@..#&;!)'-%+.#='),*..$..*=!!>*+.$.$*,)'=#..#*&&%=%@+.$....$...",
+"*,')!!!!-@=')'>>!)'%*,))!!)>-@%,>>'!)),@.+*=!);&#.&')>--!);*+*;!!>)>=+*;))!'))!%#%,'!!!>=#.+*-!);&+.+@=>!)>>,@.+='),*+....$%,!'=*$..+*,)'=#...+####+$.+#*@*@**@+",
+"%>!)'';=*+%>!)!!));*%;)!'>)!>*=')'''!);*.+%,!)>=@.%>)!>>!);@.@='!!)-%$*-))!'))'%*,!)!>)!>%.$%,!)>=@.#&>!)!')'%.#=');&#..$.$#&'!>&+..#&;)'=+$.$........*=,,,,,,=@",
+"%>))!'-*#.@->)))!'>*%>))';!)!%=!)!!!)),@$#=>!)'-%$*,')!!))-@.#%>))!-@$*-))!>))'*&>))!>))!=+#=>))'-%+#=!))!!)!%.#=')'-*+....+*;!!=#$$*-')'=+....$....$.=>'!''!!>*",
+"%>)!!'=@..@=>)))))>*%>))>-;)'=&>!!))!>=#.#=>))!,%$#%,!))!>&+.$@,!)>&#.#&''>,'';@%>))'>))'=$@-'))),%$#&'!))))>%.+&')!;%+.....@='),@.#&;!)'&#......$....,!))))))!%",
+"*&---=*+$.+&;!!!!!;@@&--&%&==@*&=-,--&*+.+*=-,-&#$$#%=-,=&@+..#%==&@$.+*&=&%&=%+*&--===-=*.+*=-,-%@$+*&-,,,-=#.+%>!!;&#$....+%>'=#.#%;!)>%+$........$.=>''''''>*",
+"+#@@@@$...+@%-=-,-%++#@@#++@@$$#@*@@@++...$#@@@#$...+@@@@#...$.+@@+$...$+#+###+$+#@@@@@*@+.$$@@@@#$..+#@***@#+..#%==%@+...$..@&=*+.$@%=-&@+..$.$.$....@*&&&&&&%#",
+"...+++$........$....$@*@+.............$.$..$$@@@+...$..........+#@**@+..........+@*@+........#@@#.......##@+..+@*@+......++@*@#.....................$...$.......",
+"$.+@%&*+.$.$.$..$...*=-=*#......$.$.$......+*=-=*+.......$.$.$+*&-,,=#.$..$.....*=-=*#......#%=-%#.$...#%--%#$*=-=*+....+#%=,-%#.$...............$........$.....",
+"..#&>'=@$....$$$.$.$%')!-@+.$.....$$+......#=')!=+..$+.+$....$@='!))'*....++++..%')!=@+.$.$$@,!)=@$..$$*=)!,@$%')!=@+$...#-!))-@$..+.++.+.$.$++$$+..$....$.+.$..",
+"..@-!);%+..+@*%%@+..%;)!;&*@+.$+@*%%%*#+$+@%=>))-#..#*%%*@+..#%;!)'>;@.+@*%%%%@+%;)!;&*#$..+*;!)-*...$#&,)!;*.%;')-&**+..+%;!)-*+.@*%%%%%*+.$@*****#$.$+@*%%*#+.",
+"..#='!'&#.$*=;>>-%#.*,)!'>;=%+#*=;>>>;%+#*=;>'))-@+@&,>>>=%++*;'))!',@#*=;>>>>-@*,)!!>;&*+.#&>!!-*$..@&;!!!;*+*;');;;,*+..@-!),*..&,'>>>',%$*-';;';&*+#*=;>>,&*$",
+"$.$*=>'&#$#&'!))!-*$*-))))!';@*;'!)))!,@*;'!))))-@#&'!)))!;@#&'!)))!;@*;'!))))'**-))))!>-#+@-'))-*+.+*,')))'&$@,')!!!!&+$.#='),*+.,!!))))!;@&')!!)!>-@*;'!))!'&+",
+"...+@%;%+.#='))))>&+*-)))!))'*&'))!!));*&'))!)))-@*,!)!!))'*#%'!))!',@&>))!)))'**-)))!)!>*.@=')),*..$*-'!!)'&+*,')!!!'%$..#='),*+.,!)))))!>*&')))!)!>*&>))!!)!,@",
+"$...$#@#..#='!!!)',#*-))';')!%=!)>,;'!,@=!)>;'))-@%;)!!'!)!%.@=>!!;=*+=!)>;'));**-))'>')!*.+*-!),*+..#*&->!'=+*,'))!>=*+..#='),*..=')!!!!!>*%-))';')'*=!)>;>!);*",
+"..$.....$.*-)))))',@*-)!>,>)!%=!);==,>=#=!)>,>!)-@%;))))))!%.#&>!!-%#.=!)>;>!)-@*-)!;,')'*.+@='),%+...$#*,!'=+*,'))!;&#$..#='),%+.=')'!!!!>**,)!;,')'*=!);-,!);*",
+"....$.....*;)!'')';@*,))';')!%=!)',-;>,@=!)';')),*%;))!'!!'%.@&>!!,&@+%>!)))))-@*,)!;,>)'%.#%-!);=@+..$#*-!'&+*;')!!'-%$$+%-!);=@$=')'!!!!>%%,)!;,')'%=!)',>!);@",
+"........$.*;)!'')!>*%>))!'!)'%&')!''!'>*&')!'!))>**,))!!!!'*+%>!!!'>=+@=;''!!)-@%>)!'>')!&+%;'!)'>=+.+@%=;!'&+%>!)'!!',@$*;'!)'>=+-!)!!!!)'%%;)!'>!)!&&')!'!))-#",
+"$.$..$....@-!!!!!!>*%>!!!!!',@*,'!!!!!>@*,'!!!!!>*#&>'!!!!>*#%'!!!!',#+%,'!!!!=$%>!!';!!'&#%>!!!!',+$@->'!)>%+%>!';'!!>*+%>!!!!',#,'!!'!'!'&%>!!>;!!'&*,'!!!'>&+",
+"........$.#*-;;;;;=#@=;;;;;&*+#*=,;;;-%+#*=,;;;;=#+@%-;;;-&#+*-;>>;-%+#&;)))'-%+@=;;-=;;-*$*=,;;;-%+$*;!))!-*$@-;-&-;;=#+*-,;;;-%+%,;,,;,;,**=;;,=;;,*#*=,;;-%@$",
+"..$..$.....+@*****@$+@*****#$..+#****@#$.+#*****@$..#@****#+.#@*%%**#.+*->'',%#.#@%*@@***+.#@****@#$$@=>'';%+$$@**@***@$.$@*%***#.#********++@******@+.+#***@+$.",
+"........$.....$.$...........$..........$.$+$......................................................................+++$.....+++$$....+++$..............$.........",
+"$.$..$.............$...$.......$.........$#*@+....$......$...$..$...$.........$..........$.......................#*&&*+$...#&=*$...+*&&*#................$......",
+"..+..+..$.$....+........++..$....$.$....+@=,-*+$....$.$........+......$.$.$.....$.$+.$+....$.+.$.$.$.$+.+.$.$.$.+%-;;%+...+*,>&@$..+%,;-%#$.$.$.$.$...$.....$.$.",
+"+@*%%**@$..+@*%%**@$$+@**@**@+..+@*%**#$+%;!!=%@+.+@*@##@*#++@**@@*%*+$@**@#***+.#**@@**@$+@**@#**@+$#*%%%%@+...@=!!;*+...#&')-*+..$*;!!=@...............$......",
+"*-;;;;,=%+#%=,;;;;-@+*-,,,;,=@$#%-;;,,=+@='!!>,&*$*-,-&&,,=#*-;;,-;;,**-;,=&-;,*#&,;,-;;-@*-;,=&-;,*#=,;;;,-%+.+*-)'=@+...#='),*....@=')-*+...++#++++.$...$.$...",
+"&!)))))'-@*,>)))))'*#&!)!!))>*$*-!)))!>@*,)))));%$&')!,-)!'*&'))!'))!=&'))';!)!=*-))!>))!*&!))>,!)!=*>!))))!&+.$%,)'=#..$.#='),*+$..#=!),%..+@%&&&&&%+..........",
+"%>)))!))'*&!!)!!))>*#&>!))!!>*#&')!!))'**-!)!!'-*$%>)!;,!)'*%>))'>!)!&&!)!!!')!&@=')!')!>*%>))!;!)!&%>)!!)!>&+.#&>)'=#....#='),*$...#=')>&#.#&''!'>'>*$.$..$....",
+"%,))';')!%=!)'>!)),*$*-!!';,=@+&'!))!';@#='!!,=%#.*,)!;-')'**-'!!>)!>*%,)!!)!)!%+%,'!)!;=+*-')!>)!>**,''))'-*+.#=!)'=#$...#='),*..$.#=')!=#.*-))))!)>*.......$..",
+"*-))'>')'%=!)'>'))-@.@=!!>=%@+#&>!))!'>*#&>!'-&%@+*-)!;,>)'%#%>!'>)>-@*-))))!)'*$@=>))!,%$+%;!!')>=#@=>!)!>-*+.+&>)'=+..$.#=')-*+...#=')>&#.@-!'!!!';@...$.$....",
+"*-)))!)!>*%>!)!)))-@+%,!!>,&@$#&'!!!))'*+%>!!>>;=#*-)!'>!)'%$*='!!),%$@-!))!))>*+%;!!!!>=#.+='))!,%$*,')!'''&+.$*,)!=#....#='),*+...#='),*+.#*----,=%+$.....$...",
+"*,))!!';=+@&;'!!)),@#&>!)''-%$@=))!!!)'%$*,!!!)!;@@=!)!'))!&.#%>))!=@.#&>!!>)';@@=')!')!>*+#&>))>&@$%>!)!!))=+.$*,)'=@....#&')-*+..+@=')-*+..+@@@@@@+........$..",
+"%;)!',=%@$$@%=,'!),*@=))))),%$#='!!))';*$#&>!)!>=++%-'))!)!=.$@=');%+.$*;'';!;=+@=))'>))'*#&'!))-*$.*>!))))!=+.$#-)!-*+.$.+%>!=#+..$*-!)-@$....$.+....$.$.$.....",
+"%'))!>%#....#&>!))'*+%=,,--%@.+*==---=%+.$#%=-=&*+.#*=----=@..+*==%#+.$#*&&%&%@+#%=-==--=##=!!!!=@+.#%-,,,-=*+.$#%>>>&+...$@&=*+...+&>';&#.$.................$..",
+"*->>;=@$....$@=;>>-@$#@***@#$..+#@@**#+..$$+@@@+$...+#@***@+...+#@+$....$#++#+$.$+@*@@@*#$$*=--=@$..$#@***@#+...$@%&%@+....$##+..$.+@%&%@$...$......$...........",
+".......$.$..............#@#+.....+++#$...........$.+#++$##+.$...$+..$...$#@**@+$.............+++$.......++$..........$.$......$..........$....+++++...$.$.+.$.$.",
+".~{]&^/~...............+%=&*+$..#*&&%*+$..+.....+.$*&=%%&&%+..++**@$..$$@&-,,-&+...++##+$$.+#*%%*@+...+@%%*#+.$..........$.................$.+#*&&*#+...+@**@+..",
+"(_:<[}|12$.$.$.$.$.$.$#%-)'=*$.#*->>>=*+.#@@@@@@#$@=''>,>>,*..+*,'&@..$#&>!))!>@$+@%&%&%@.+*&,>>,&@+.+@=;>,%#...$..$.......$..$.$.$.$.......+*=;'>,=*+.#*-,,=%#.",
+"345)))643....$+++....+*=>)!;=++@=!)));&+#*,-==-,=#*,))!>))'%..#&')-*+.+%;!)!!)'*.+%->=>>*$@&>!))!'&#.#%>!!)-@....++++++$.+##@@@#$......$.$..@&>!))!'&+.#&!))!-@.",
+"_78)))87_...+#%%*+..+*->!))';@$%;!!'',%$#=!!!!!';@@-!)!>)!>*..#='),*..@=>!)!''>@.+*=,=,-*.*,!))))!,@.@='!!)-*+..@%%%%%*++*&=====%+..$.+$$$..*,!))))!,@.#&>''>=@$",
+"_90))))a_$..+*;'=#..$%>)!'!';@#&>!';-%@.*=!))!))>*+&;!!')>-@$.#=')-*$.*,))))!>;@..#***%*#.&')))))!'*+*;!!!);%$+@&>!>>!;@@=!!!!!!'*.+@*%%%*@+&'!))))!!*.+@&--&*+.",
+"ba)))))ab...#%;>,*..+&')'>>>-#@='!!>-*+.*-))!'))>*$*-')!);&+..+&'!-*$.*;))!))'>*...++$+$..=!))!!!!!%$*;!!!);&+@=;!!!!)>*@-!!))))!%+*-;'>>>-@=!!)))!!!%..+#@@++..",
+"ca)))))ac$..#&>',*+.+%')'>>;=#@-!)))>%#.*-)!'>!)'*$@='))!;&+..+&>!-*..*-!))!))!%$.......$.=!))!!!!!%+*,!)))'=+%>!)'!)!-@#%,>>>')!%+%>!))!!>#=!!)))!!!%.....+....",
+"ca)))))ac$..#='!>%+.+%>!)'!'-#@='!)';&@$@-))!'))>*$@-'))!;&+..+&')-*..#&;!))!)!%..........&>))))))>*$*,!)))>=+%')!!)!>=#.#*%%&,)!%+*,>>>>>-#&>)))!))>*..........",
+"ca))))8dc..$*-!!>&+..*=>)))'=+@=')!>>;-@@=!))))!>*$@->!)';&+$.+=')-*$.#%,>'!))!*..$.$.$...*-!))))!-@$@=>''>-%$*>')'!))-@..$$+@&>;*.+*%&&&&*+*-!))))!-@$.$.$..$..",
+"_90)))87_$.+*-))'&#..+*=;)!,%+*,))))))'*+&;>;;;>-#$*-!)))>=$..+&')-*+.@=!!!')>-#........$.#%;'))';&+.+@%==&*#.@&,!!'!)>*.....$@%*+$.+####++.#%;'))';%+.....$....",
+"345)))643..$*-))'&#$..+*-!>&#.@-!!!!!!>*.@%&%%%&*+$@-'!!!;&+..+%>!=@..#=!!!!!-*+$.........$@&,'';&@$..$##@#+...#%;>>>!,@$......++...........$@&,'';&@+..........",
+"(_e<[[f_g..$@='!>%+....#*=&@$.#%-;;;;,&#.+##$$+#+$$#%=;;,&*+..+@=;%#..+*,>>;-%#...$.$...$..+#*%%*#$...........$+#*%%%%*+..$.............$....$#*%%*#$..$..$.$...",
+".~hi&]{~....+@&&%#.$....+##+...#@****@#+............+@**@#$....+@@#.$..+*%%%@+...............$+++...$......$.....$$$$$$......$...$.$.$....$....$++$..........$..",
+"..+@**@$.$...........$+@**@$....+***@+........+.............$$#*%%%%*+........$.$...$...$....#@@#+....$+++..............@**@+.....@**#......@%%*@$...$..$.+$....",
+"$+*=;,&@+....+##+$...$*=;;=*+$.+*=;;=*+...$+@*@$$.$.........$@&,;>>;-#...............$.....+#%-,%#...$@*%**+$.$.$.......&>'=@+$.+.,';&#$++++=>>;=@++#$...#**@+..",
+"$*=!'!>%#.$.+@&=%+.$.#&''!>=#..#&''!>=#$..#*-,=@....$.$.$...@=''!!!!>*$.$.$.$...$.$.....$..+%,'!=@$.+#%;'>-*+.....$.$...-'!;%#+@@+>!'-@@%&%+;!!';&*%&@...*,>%#..",
+"#&;)'!!,@+.$#&'!-*#..#&''!'-@+.#&'!)!-*+..@='!-@+.+@@@##@@@.*,)!!))!'*...............$.....$%,!)-*..#%;!'!!-@+.+++$$+.$.,!)'&@%=,#>)!;%&,>;#>'!!'=->'%$.+*;'=@..",
+"#=>)>!';*$$*&,!);-%+.#&>'!'=@+.#&>!)!,*+.+*-!>&#..*=,-&&,-&#%;)!!))';@...+@@@.$...$.....$..$@=!),*+.@=>)'!!;*$#*%%%%%@$.=')'=&;!!*,)!;=;!',@-')!>,''>*..+&;'=@..",
+"$%-!'!!=@$#=''!)!!;@.#&>)!>=@..#='!!!;*$..#&-&*+..%')!,-)!'**;)!)))',@..@%-,%+.......$.....$*-!);%+.#=>)>!!;*$*,>;;';=*$=')',;'!>*,)!';'!>-@>'!!!'!'-@.+*-!)-*..",
+".@%,>;&*$.@-))))))'*.#=)!!'-@+.@=)'!!,*+..++@#$...%>)!;,!)'**=!))))',@.+@-!)=@+.$.$.....$...*,!)>&#.#&;)'!!-@.%'))'!!>&#;!)!'!!!;*'))!!))!;*>))!!)!'=++*=>))-*+.",
+".$+*&&@+..+&;>!)'>-@.+&>'';&#..#%>>';&++....$.....%,)!;,')'*#%,>!))>,@.$@,!)=*......+++....$*,''>&@.#%,!!!>=*$@,')!!!);*,'!!!))!;*'!))))!!>*-!!!!)!'=+#&'!!'=*+.",
+"...$#+$..$+@&-');=*+.+@&==%@...+@%&&%#+...$...$...*-)!'>!)'%.#%-!))',@..#%-,%#.....@%%*+$..+@%==&*+.#=>)))';*+@=>))!!)>*%-;')!));*=>'!''!!>*%->!)!)!=#@-!)';;=*$",
+".$........$#=;'!>-%+..$####.$...$###+...........$.*-))!'))!%.$*=!))',@...+@@#..$.$+%>!=*+....##@++..#%,!!!'-@.*,')!!!);**->)!!));*='!',>)!;@*-')!!)!-@@-)!'>!;=+",
+"....$.$...#&>''''>=@..................$...$.$.....*-))))))!&+#=;!))!'*$.....$....+@,!)>%+........$..$#*&==%*#.%>))'!!>=#*>!!!!))'*;)';,!!';@&'!!!!)!;@@=!)!')>=+",
+".$......$.#=))))))!*$.....$...$...............$...*-)!>,--=@$*;!))))'%...........$*;!)'&+..$.........$+###+$..*,',;>;=*$*,'>>'!)'*,';=,!!!;*&''>>')!;@+%,!)));%+",
+"..........+%=,,,,-=+..$.....$...$.$..$.$..........@=!'-*+++.$@=>''''>*.$....$....+*,!!;%+....$...$............#*%%%%*@+.#&=&&=>';@&&%%=>>>,#*=&&&-'>=+.#%=---%#$",
+"..$.$.$.$.$+@*****#+....$.................$.$...$.+%,=*+.....+@%&==&*+...$....$...+&;>&@.$.........$.......$.$.$$++++...$####@*%*$###+@%%%*++##+#*%%@$..$@**@#$.",
+".+@%*#$......+@*%@$.$.+@%%*+.$..+#**@+.$.....+......+*&&*+$...+#@@@##+.++@****@+.+@%%#$....$.+#%%@+..$+@%%@$...+#****#$..$@%%#$.......+*%*#...+*&=%#.$.$#*@@@@+.",
+".#&';%#$$...$@=,'%#..+@=>!&@...@*-,--*+..+@@*@@#...$@-''-@+..$@&--==&#+#%->;>,=#$#%>,=@+....+@&>'&#..+*=!>=@+.$@&>-,,&@..#&;;&@$$....#*='-*+.$@=>!,%+.$@=,-=;=*+",
+".#=>'>%+..$+@&>'>%+..#&'!!;*+.+*,!!!!=@.+@&,,='*#$.#%;'';*+..#&>>''>'*@-;!!!!!!@+*=>)'-%@$+@&-!!>=@++*-'!)'=*.#&;!>'';%+$@&>'>&*+.$+#%,>'-*+.#&>!!!=*$#%;''>'>=#",
+"$*->!!=@..$@&;!!,*+.$*-'!!'%#.#&>!!!!=@+$*,!'>>&+.+*->!!,%+..@=))))))%%'!!''!!!%*,''!!''&+*,>'!!'>=+*,'!!!!'=#%;'!!!!'=#$*,>!!>-%+$@=,'!';&+$%;'!'!>=+#&>!!'!';@",
+"#%>'!!,%+.+%;'!!,%+.#&>!!!>&#.#&'!!!>&#.#&>'!'>&#.#%>'!!;%+.+@-!))'>)%&')'=->''%&!))))));@%!))))));@%'))))));@&'))))));@#&'!))!',#+%'!))!',##&'!)!)!;@#&'!)))',@",
+"$%'!))'=#.+%'!))'=@.#%'!))'=@.#&'!))'=#.#%'!))'=#.#%'!))'=#.$*-)))!!>*=!);&*=-,#*;')>>!),@@;')>>!),@*;')>>!),@%;')>>!);@$*,>!)';=#+*,>!)';=#+*,>!)';=#$@&,!)>-%+",
+"$@='!)!-*.+@='!)!-*$+@='!)!-*.+#='!)!-*.+*-'!)!-*+$@='!)!-*.#&;)))));*=!),%#@**+*,')>'!!=#*,')>'!!=@*,')>'!'=#*,')>'!'=#.#*-!);&@..#%-!);&@+.#*-!);&@$.+@='),%#.",
+"+*,!!');&+$*-!!');&+$*,'!');&++*,!!');&+$*;!!');&++*,!!');&+*,'))))!;@=!);&*%%*+*,')!)!,%+*,')!)!,%$*,')!)!,%+*,')!)!,%$.$#=!);*+...@='),%+...#='),%+...#='),*$.",
+"#&'!!')';@#&'!!')';@#&'!!')';@#&'!!')!;@+&'!!')';@#&'!!')!;@%>!)))!'-*=')!-,;>;@*,')!)!;=#*,')!)!;=#*,')!)!;=#*,')!)!,=#.+@='),%#$.+@=!),%+$.+@='),%+$..@='),%+.",
+"*,))))))'%*,))))))'%*,))))))'%*,))))))'%*,))))))'%*,))))))'%=!)'!!'>!%%>!)))))>*%;')>'!'!*%;')>'''!*%;')>'''!*%;')>'''!*.@&,!)>=*$.@&,!)>=*$.@&,!)>=%$+@&,!)>=*+",
+"&>))!'!)!&&>))!'!)!&&>))!'!)!&&>))!'!)!&&>))!'!)!&&>))!'!)!&;!)!)))))%@->!))!!,@&'))))))!%&'))))))!%&'))))))!%&'))))))!%#%>!)))',#+%>!)))',#+%>!)))',#+%>!)))',#",
+"&'))!>))!=&'))!>))!=&'))!>))!=&'))!>))!=&'))!>)))=&'))!>))!=,!!'!!!)!%$#=>))>&@$%>!)!!!!'*&>!)!!!!'*&>!)!!!!'*%>!)!!!!'*+%>!!!!'-@+%>!!!!',@#%>!!!!',#+%>!!!!'-@",
+"%;''>;''>%%;''>;''>%%;''>;>'>%%;''>;>'>%%;''>;''>%%;''>;>'>%%,;;;>>>;@.+&')'=@$.@=;>>>>;=#@=;>>>>;=#@=;>>>>;=@@=;>>>;;=#+*=;>>;,&++*=;;;;,&++*=;;>;,&++*=;>>;,&+",
+"#*&&%%&&%##*&&%%&&%##*&&%%&&%#+*&&%%&&%@#*&&%%&&%##*&&%%&&%##@*******+.$@&=&*+..$@******@$+#******@$+#******@$$#******@+.+@****@#+.+@****@#$.+@****@#..+@@***@#$",
+".+$++++.....#*%%**#..$@%%@+..$...$@**#....+*&%*+....#*%%**#$....$$$..$.............$+#@@+..$@%%@+......+@**#$...+*&&*+......+$$.......#*%@+..$#++........@**#$..",
+"@%&&&&%*+.+#%;'>>;*+.+%>>-@+....$@=;;%+..+@='>-@+..#%;'>>;*+.+#*@**#$....$....$..+@%&&-=*+.+%>>-@+....$@=;;%+..+*='>-@+..+@*@**#+....#%-'=@$#*&%%@$$.$.+@&,;&*+.",
+"=>!!!'>-%++%-')!'>&+.#&'!>&#.$..#&>!>&#..#&;)!>&#.+*=')!'>%$.#%-=--%@$.#@#+$#@#++*=>!!!!=#.@&'!>&@+$.+@&>!'=@+$#&;)!>&@+$#%-=--&@+.+#%->!-%+*;''>-*$$..#%>!!'=*$",
+"-!)!!!!!-@@->!))!>=#+#&;!',*#..#%-)!;&#.+@=!'!',*$#&;!))!,%$+*=!>'';*++*,=%*%,=+*,'!!)));@#%-;)';&%+#%=,)!>-%+#&,!'!'>&+#&,!>''>&+#%&-')';=#%>!)'>=*#+$*,!!!)>&+",
+",!)!'!!)>*%>!!'!!!>@*-'!!!!!=#*-'!!!!!=#*,')!!!!-#*;!)!!!!-#*,')'!!!-@#='>,-;';@&>!)!!))>**;'!''!!;@*;!!''!!>@*>!)>'!!>@*>!)>'!!>**;'!!'!!>&*>!)!!>;&#+%>!!>)',#",
+"-!)!>>!)!%&'))>'!)>*&>!)''!)>*&>!)''!)>*&'))''!)>*&'))''!)>*&'))''!)>*@=!)''!!>@=!)'!!!)!%&')!;>!)>*&')!;>!)>*&')!;>!)>*&')!;;!)>*%>!)'>!)!&*,')!!))>*+%>!!!)',@",
+";!))'>>!!%&'))!'!)>*=!)>--')!%=!)>--!)!%=!)>--')!%=!)>--')!%=!)>--')!%#&;!)))>=#=!)>)!'!!%&')>=-');*&')'--');*&')>--');*&')'--');**='!'>!!>**,')>>'!!%#%>!)))';*",
+";!)!>;>!!%&')!)!!);*=!),&%>'!%='),&%;'!%=!),%&>'!%='),%&>'!%=!),%&>'!%$*-'))!;&+=!)>)!'!!%=')>=-');*&')>==');*&')>=-');*&')>=-');*+*,'!!);=#*,')>>'!!%+%>!!'!)'%",
+"=!)',,>!!%=')'!!));*=!);&&>!!%=!);&=>!!%=!);&&>!!%=!);&&>!!%=!);&&>!!%+%>!)!)>-#=!))!'!)!%&')>=-');*&')>=-');*&')>=-');*&')>=-');*.#%>!)'=@$*,')!!!)'*#&>!!>>)!%",
+"=')';;'!'*&')''!));*=')';;')'*=')';;')'%&')';;!)'*&')';;!)'*=')';;!)'*@='!!'!!>@=!))''!)'*%')';;!),@%>)';;!);@%')';;!);@%>)';;!),@.$%,!)>=@.*;')))!!;@#&>!!>>)!%",
+",!)!'!!!,@=')!>'));*%;!)!!!!,@%;!!!!!!,@*;')!!!!,@%;!)!!!!,@%;!)!!!!,@@=!';->!>@&'))!!!!,@*,')'!!!-@*,')'!!!-@*,')'!!!-@*,')'!!!-@+@->!)!,%$&>!)!';-%+*-!)!!!)'%",
+";)))))!>&+='));>!)-@@&;!))!>&+@&;!))!>&+#&;!))!>&+@&;!))!>&+@&;!))!>&++%-=%*&-&+%>!)))!>&+#&;))))'&+#&;))))'&+#&;)))!'&+#&;)))!'&+$*,!)))>=$&'))!>&*+.*,))!'))'*",
+"%-,;,,-&@$*=--=&--%+$@%-,-=%@$+@%-,,-&@$$@%=,-=%@$$@%=,-=%@$$@%-,,-&@$.#@@+$#@@+*->;,,-&*$$@%-,,-=*$$@&-,,-=*$+@%-,,-=*+$@&-,,-=*+.#%=,,-=*$*=,-=%#+..#%-,----=#",
+"#@****@#$.$#**##@@#+.+##**@#$..$##**@#+..$+@**@#$..$+@**@++..$##**@++...$+...$..#@*%**@#...$#@***#+...#@**@#+..$#@***#$...#@**@#$..$##**@#$.$#**@+$...$#@**@**#$",
+"..+@@+........+##+.....+#@+.....$.$$$...............$#**#$........................#@@+........+#@#$....+#@+...............+@@+...$....+#@#+....+#@+.............",
+".+%-=*+.$...++*&,*+...#*=-%+.$.$#*%%%#+...+++#+..$..#&,>%#............$....$..$..+%-=*+$.$...$#%,&@$$.+@=-%#....+#+#++..$+%-=*+......$#%,&@$..+*=-*#..$.+#+##+..",
+"$#&>>-*+....+*-;>%#$.+*=>'-*+.+@&,;;,&@$.#*%%%%@+..+@,'!=*+.$.+.$.+.$...$.+.+...+#&>>-*$.....#%,'-*$..@&>',%+$.#*%%*%*#+$#&>>-*+.$...#%-'-*+.$*=>'=*+..#*%%%%@+.",
+".#%>!'=@.$.+@='!;%+.$#&>))>&#.+%;!))!-*$+@-;;,>%#..+%;'';*+..@**@***#+.+#****@+..#%>!'=*+..$#%;'!=*+.+%;!)!=*$+@=;;-'-%$.#%>!!&#...$#%;''=#.$#&'))>%#.+@=;;,>%#.",
+"$@=;'!,%#.$@&;'';&#.+*,''>!=@.#&'''!'-*.+*,>!>'=@.+@=>!!,&#.@&,,--,,&##*&,,;,-%+$@=;'!;=*+$@&-'!>-%++@=>'!';&++%,>>>';=+.#%;'!=*...#*-'!,%+.$@->'''&+.$*->'>>&+.",
+"#%>!))!=*+#%>!))!-*$#&'!))),*$#='!)))-*+#&'!)))-*+#%>!))!-*+%'!!!!!!>**,'!!!!!,@#&>!))!',@#&>!))!',@#&'!)))';@@='!)!)';@+@-'))-*+$.@-')),*$.$*,')!;%+.$*,')!;%+.",
+"#='!!')>=+#='!!')>=+#='!'')>=+#&'!!')>=+#='!'')>=+#&'!'')'=$&>!!)!!')%&')!'!));**-))!'!)'%*,))!'!)'%*-))!'!)'**,))!'!)'*.#&;!),*$..#&;!),*+..@&;!),*$..@=>!),%+.",
+"@='!!!)',@#='!!!)',@@='!'!)',@@='!!!)',@@='!'!)',@@='!!!)',@&>!!)!!')%=!)>-,>'-@*,))!'!)!%%;))!'!)!%*,))!'!)!%%;))!'!)!%.$@-!),*+..+*=!),*$..+*-!),*+..+*=!),*$.",
+"*,!!!!)',@*,!!!!)',@*,!!!!)',@*,!!!!)',@*,!!!!)',@*,!!!!)',@,!)!)))))%=!)>,,;>-@%;))))))'%%;))))))'%%;))))))'%%;))))))'%.+@=!),%+..$@=!),%+$.$@=!),%#..$*='),%+.",
+"*;)!>>)';*%;)!>>)';@*;)!>>)';@*;)!>>)';@*;)!>>)';@*;)!>>)';*>!!>))!!!%&>!)!!!)'*%;)))!!!'%*;)))!!!'%*;)))!!!'%*;)))!!!'%$@&,!)>=*$+@&,!);=*$$@&,!);=*$+@&,!);=*+",
+"*;))))))'**;))))))'**;))))))>**;))))))'**;))))))>**;))))))'*>!)))))))%@&;'))!'-@@-))))))'%*-))))))'%*-!)))))'%@-))))))'%+%>'))!',#+%>'))!',#+%>'))!',#+%>'))!',#",
+"*='!!!!!>**='!!!'!>*@='!!!'!>*@='!!!'!>**='!!!'!>*@='!!!'!>*='!!''!!;*.#&>))>&@$#%->!!!>,@#%,'!!!>-@+%->!!!>-@#%->!!!>-@+%>'!!!',#+%>'!!!',#+%>'!!!',@+%>'!!!',@",
+"+%-;>>>;=#+*,;>>;;=##%,;>>;;=##%,;>>;;=#+%,;>>;;=##%,;>>;;=#%-;>-,>;%+.#&')!-*$..#*=;>;=%+.#%->>;=%+.#*-;>;=*+.#*=;>;=%++*=;>>>,&++*=;>>>,&++*=;>>>,&++*=;>>>,&+",
+".#@**%**#+.##*****#+.##*****#+.##*****#$$##*****#$.##*****#$+#**@***#..+*&-=*+....$#***@+...+@***#+...+#***@+...$#***@+..+@***%*#$.+@***%*#$.+@*%%**#$.+@*%***#$",
+"$@*****@#....####+....+##+.........#+#$....#**@$.....+#@@++.$.................$..........$.++#+$...$....+@#+.....+#@#.................$+##$$#***#...............",
+"@=,;;,;-%+.+@%===*#..+*&&*#......+@%=%#+..#%-,=*$$..#*=-=&*$..++.++..$...$++....$.........$#%=%#+......#%=-*+.$.#%==%#.$..$++.++.$..$+#%=%#$*-;-%#...$...+$+$+..",
+"%>)))))',#+@&>'''-*+.#=>'-*+$.$.+@=;)-*$.+*,!)>&@..+*,'!>>=+.+@%****#+..+#%%@+....++++++..#%,!;=*+.$.+#%;>!&@..#%,!!-%#..#*%*%%@+...#@&;)-%$&'))-*#....+@*%*%*@+",
+"&'!))))'-@#&>!!)!-*+.#&>!!-*$...#&>!!-*$$#=>!!!-*$$#=>))!>=++@-;>-!-%+.+#&>>&#+..+@%&&&%*+*=;'!>=%#+#*&-'!'-%+#%-'!!!-*+@&,>;,!=*+#*%=>!!;=#%>!)>,=%#+@*=>>->;=@",
+"%>!!!!)';@%>!!!!!,%+$@=>!)'=*++#&>!)!-%+$*-'!!!,&+$@='))!;=++*,'!'!;&+.$*,!)-*+.+*=!'!'';@=>'>'''>%+%;'>>'!!-@%;'!''!',#%;''>>!',@*;''''''>&*,')!!';&+*;'!';!!'&",
+"*;)!'')!'*&>)!!!!>=##&;'))!>-@#&;'))!>-@#&>!))!>-@#&;!))!>-@#&>!))!>-@+@&;!)-&@+*->!!!!!'*,!!>,'!!=#&>!';;)!>*&>)!>>!!'*&>)';>)!>*&>!!>;')'&*,'))))!;*&>)!>;!)!=",
+"*-!)))))!%&>)))!)!>**=)))!))'**=)))!))'**-)))!))'**=)))!))'**-)))!))'*@&,>>>;,=#&'))!))),*,!)>,>))-@%>)!;,!)'*%>)!;,!)'*&>)!;,))'**-!)'>)!'%*,')'>!)'%%;))'>!)'%",
+"*;)!''')!%%;))'>')'**;)!>>')!%*;)!>>')!%%;)!>>')!%%;)!>>')!%*;)!>>')!%%>!))))!>*=!)'!)));*=')',>!)-@*,)!;,')'**;)!;,')'*%;)!;,')'*#&;!!')>-@*,')>;'!!%*='!!>)';*",
+"*;)!;,>)!%*,)!>,')'**;)!,,;)!%%;)!,,;)!%%;)!,,;)!%*;)!,,;)!%*;)!,,;)!%*-;>''>>-@=!)')!!);*&')',;!)-@*-)!;,>)'**,)!;,>)'%*-)!;,>)'*$#=>))!-*$*,')!'!)>*$*-'!!);&+",
+"*;)!>;')'%%,)!>,')'%*;)!>;')'%%;)!>;')'%*;)!>;')'%*;)!>;')'%*;)!>,')'%#*&,''-&*$=')!!!!);@&')';>!),@*-)!>;')'**-)!>;')'%*-)!>;')'%$@=>!);&+.*,'))))!,@.#&>!)'=@.",
+"*-!)!'!!'*&>))'>!)!&*,!)!'!!'**-!)!'!!'**-!)!'!!'**-!)!'!!'**-!)!'!!>*.$*,!!-@+.='))!!)!-@*;!!'!))>*#='!!'!)!&@='!!'!)!&#='!!'!)!&#%>!)),*$.*;')>>;-%+$*-'!);%#.",
+"#&>!)))';#&!))!>)))=#&>!)))',@#&>!)))',@#&>!)))',@#&>!)))',@#&>!)))',@.$#=>'&#..='))))!>%+@=>)))))'*+*,!)))))=+*-')))))=+*-')))))=#=!)))-*..&'))!>&*+.#&!)))-*+.",
+"$@&-,,,=%+*=,,--,,-*+@&-,,,=%+$@&-,,,=%+$@&-,,,=%++@&-,,,=%+$@&-,;,=*+..$@%%@+..-'!;;,-&*$$@&-,,,,=@$#%=,,,,-*.#%=,,,,-*.#%=,;,,-*#&'!!'&@$.*>!!';*$..#&'!!'&#..",
+".$#@***#+.+#***@**@+.$##***@+..$#@***#+..$##***#+..$#@***@+.$$#@***#++..$$#++.$.*&&&%*@#$..$#*****#$..+@****@+..$#****@+..+@*****+$@&==&@$..@%==&%#+..$@&==&@$..",
+"..........#@@+$..................$$$.$............+@%&&&&%*$.....+#$...+#***@#$....+@*#$........$............$.........$............$+$++.$.*&%*@+$.............",
+"....++..$.%,=&#+...$.........$#*%*%%%*#+..+##+....#=''''''=#....#%&*+..#&;;;;%+...$*-;%#.$....+@**#+$..#@@#......$$+++...#@@@#++...+*%%*%*$.,'';&&%*#+..+#$+##..",
+".$.@%%*+..-'>;%#+++$.+@*%%@+..&,;;;;;,=#$#*==*+$..*-))!!));@$++#*;>=@+$*,'!'!=#$$#*=>!-*#+.$.+*=;,&+.+@&--%@$$+*%%%%%%#+@%---&%%*+$*=;,->&@.>))';;;-&@+#%&**&%@+",
+"..#%;'=+..;))!,*#%%#+*=,';,%#.-!)))))!>@$@-''&#...%;))!!));*@%%&-!!,*$+%;')!)-*.@&,;!)>-&+...#&')!;@@%=;!),%@$*-;>;>>>&+%,!!!'>;,*#&>!'');&+;!)!'!)!>%+%,'-=>>&+",
+"..#=!!;#..=>))>%%,>**=>!))!,*+&,;>)!>-&+.@-'!=@$..&;))))));*&;>;;!!>&+*=>')>);&+%>!!))!!>*..+*-'!'=#&;>'!!;;=@&'))))))-#&!)))))))*%,'!'')>-@&;')''))'%#%;)>;)!;@",
+"$.#&>!'*+.%,)!>=-!'*&>)!!)!!,@->>>)!;-&@+@-'!=@+..,!))))))'%=!!!!))!=#->!))!)''*='))))!)!%..#&'!)'=+=!!)))!!'%&>)!''!);@%,'!))!'>*-')))!)!'%&>!)>>!!>*+*,)>'))>*",
+".$@&,!!%+.*=!!',>);*=)!'>!!!'*>!'!))''>&$@-'!-*...-!!!!)))'*&>'!!!!);*>'!))!)!'*=!)!!)>!'%..@=!))'=+-!!!!)!'>%&;)!,;!),*#*=;!!>=%#&;'!!')'>*='));,'!;@+*=!))''-@",
+"+*&,;'!=@.+&>!!>>!=#-)!>;!!!!%,'''))''>&$@-'!-*.$.&'!!!)))>*#%,'!''!>*,>!))')'>*=!)!!)'!'%$.@='!)',@=!!'!)!>=#%;)'-;!),@.+@='!>&#.@=>!'')>-@,!));,>!>*$@=>))>,*+",
+"@='!>'!;%+$@='!!;=*+-)!>,'!!!=*%=;)',=%#.@=!),*+..%,))!!)!-@.#&>!';,>@*&;')>)>-#=')!!)!)'*+#@&;!))'*&')!')!,%+%;)'-;!);*..+*>!>&#.#%>!'')>=+,'')>;>!>*#%-'));&@.",
+"&;)!>>!!=@.+*,!);&@$-)!','!!!=$#%,)'-%#..#&'),&#..*-)!'>!!=+.$@-!!;&*+$*,')>)',#%>)!!)>>;**&=-;!))>*%;)!'!);=#%;)!;>!),*..$@=''=*+$%>!'')>=+*&,!'>'!>@%,>)))>-%+",
+"-!)))))!'&..#&'!),&+&;)!'>!)'%.$*-)!>=#+.+%')!-%#.@=!!!';=*+..#%;'>=*$$@->);')'*@&-;!);=%+,'!))))!;*@-!)!'!!>**;))!)));@$..#%>!'=#$%>!!!);=++@&>)))'=#,!))>!)'=@",
+"-)!''!!)!&..$#&,');*@&,'!'>;=@.$@-!)'=#+.$@=;)!,@++%;!)>=*#....#%>'>%$$@=>!-,''*+#*=')-@++-'!!>>>'>@#%;'>,;!!=*-'>;;!)-@....#='!>*$*,')!);&$.+@=>'',%+-'';-->!!%",
+"&'>,,>>'>%..$$@%;'>*$#%->>=%@$..+%>>,%#...+*='',*$$@=>',*+.$....#=,,*$.+*=,%%,>*..#%>'=+..&;>>,==,-#+#%-=%&;>&#&,-%&;>&+$...+%,>,@.#=;>'!,%$..#*=;,%#.&-,%@*=>>*",
+"@**@*%%%*#....$#*&=#.$+@%*@$$...$#*%*#.....+@%,&#..+#*%*+....$...#**#...+#@##@*+..$@%=*+..#*%*@##@@$.$###+#**#$#@###**#$..$..+@*@$.$#*&=,%#....+#**#..#@#+$+#**+"};
diff --git a/hacks/interference.man b/hacks/interference.man
new file mode 100644 (file)
index 0000000..3bf78f0
--- /dev/null
@@ -0,0 +1,78 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+interference - decaying sinusoidal waves
+.SH SYNOPSIS
+.B interference
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-gridsize \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-radius \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-color-shift \fInumber\fP]
+[\-no-db]
+.SH DESCRIPTION
+Another color-field hack, this one works by computing decaying sinusoidal
+waves, and allowing them to interfere with each other as their origins
+move.
+.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 \-count \fInumber\fP
+Number of Waves.  0 - 20.  Default: 3.
+.TP 8
+.B \-gridsize \fInumber\fP
+Magnification. 1 - 20.  Default: 4.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 30000 (0.03 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Wave Speed.  1 - 100.  Default: 30.
+.TP 8
+.B \-radius \fInumber\fP
+Wave Size.  50 - 1500. Default: 800.
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors.  Default: 128.
+.TP 8
+.B \-color-shift \fInumber\fP
+Color Contrast.  0 - 100.  Default: 60.
+.TP 8
+.B \-db | \-no-db
+Whether to double buffer.
+.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 Hannu Mallat.  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
+Hannu Mallat.
diff --git a/hacks/juggle.man b/hacks/juggle.man
new file mode 100644 (file)
index 0000000..e43ea04
--- /dev/null
@@ -0,0 +1,56 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+juggle - juggling man screen saver.
+.SH SYNOPSIS
+.B juggle
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-trail \fInumber\fP]
+[\-solid]
+.SH DESCRIPTION
+Draws a juggling stick-man.
+.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 \-count \fInumber\fP
+Speed. 50 - 1000.  Default: 150.
+.TP 8
+.B \-trail \fInumber\fP
+Trail Length.  0 - 100.  Default: 0.
+.TP 8
+.B \-solid | \-no-solid
+Whether to draw checkered balls.
+.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 Tim Auckland.  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
+Tim Auckland.
diff --git a/hacks/kumppa.man b/hacks/kumppa.man
new file mode 100644 (file)
index 0000000..518b48b
--- /dev/null
@@ -0,0 +1,61 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+kumppa - spiraling, spinning, splashes of color rush toward the screen.
+.SH SYNOPSIS
+.B kumppa
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-speed \fInumber\fP]
+[\-random]
+[\-dbuf]
+.SH DESCRIPTION
+Spiraling, spinning, and very, very fast splashes of color rush toward the
+screen.
+.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 (0.01 seconds.).
+.TP 8
+.B \-speed \fInumber\fP
+Density.  0.0001 - 0.2.  Default: 0.1.
+.TP 8
+.B \-random | \-no-random
+Whether to randomize.
+.TP 8
+.B \-dbuf | \-no-dbuf
+Whether to double buffer.
+.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 Teemu Suutari.  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
+Teemu Suutari.
diff --git a/hacks/lissie.man b/hacks/lissie.man
new file mode 100644 (file)
index 0000000..40c2949
--- /dev/null
@@ -0,0 +1,65 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+lissie - lissajous figure.
+.SH SYNOPSIS
+.B lissie
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-size \fInumber\fP]
+.SH DESCRIPTION
+Another Lissajous figure. This one draws the progress of circular shapes
+along a path.
+.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 \-count \fInumber\fP
+Count. 0 - 20.  Default: 1.
+.TP 8
+.B \-cycles \fInumber\fP
+Timeout.  0 - 800000.  Default: 2000.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors.  Default: 64.
+.TP 8
+.B \-size \fInumber\fP
+Size.  -500 to +500.  Default: -200.
+.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 Alexander Jolk.  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
+Alexander Jolk.
diff --git a/hacks/loop.man b/hacks/loop.man
new file mode 100644 (file)
index 0000000..d24698f
--- /dev/null
@@ -0,0 +1,61 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+loop - cellular automaton.
+.SH SYNOPSIS
+.B loop
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-size \fInumber\fP]
+.SH DESCRIPTION
+Another cellular automaton.
+This one produces loop-shaped colonies that spawn, age, and eventually die.
+.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 \-cycles \fInumber\fP
+Timeout.  0 - 8000.  Default: 1600.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 100000 (0.10 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors.  Default: 15.
+.TP 8
+.B \-size \fInumber\fP
+Size.  -50 - 50.  Default: -12.
+.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.
diff --git a/hacks/moire2.man b/hacks/moire2.man
new file mode 100644 (file)
index 0000000..3834e13
--- /dev/null
@@ -0,0 +1,59 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+moire2 - circular interference patterns.
+.SH SYNOPSIS
+.B moire2
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-thickness \fInumber\fP]
+.SH DESCRIPTION
+Another example of the fun you can have with moire interference patterns;
+this hack generates fields of concentric circles or ovals, and combines the
+planes with various operations. The planes are moving independently of one
+another, causing the interference lines to ``spray.''
+.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: 50000 (0.05 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors.  Default: 150.
+.TP 8
+.B \-thickness \fInumber\fP
+Thickness of lines, in pixels.  Default: 0.
+.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 Jamie Zawinski.  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
+Jamie Zawinski.
diff --git a/hacks/mountain.man b/hacks/mountain.man
new file mode 100644 (file)
index 0000000..6a39d51
--- /dev/null
@@ -0,0 +1,56 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+mountain - random 3D plots that look vaguely mountainous.
+.SH SYNOPSIS
+.B mountain
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+.SH DESCRIPTION
+Generates random 3d plots that look vaguely mountainous.
+.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 \-count \fInumber\fP
+Count. 0 - 100.  Default: 30.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 0 (0.00 seconds.).
+.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 Pascal Pensa.  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
+Pascal Pensa.
diff --git a/hacks/polyominoes.man b/hacks/polyominoes.man
new file mode 100644 (file)
index 0000000..d5eed87
--- /dev/null
@@ -0,0 +1,61 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+polyominoes - fill a rectangle with irregularly-shaped blocks.
+.SH SYNOPSIS
+.B polyominoes
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-identical]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+.SH DESCRIPTION
+Repeatedly attempts to completely fill a rectangle with irregularly-shaped
+puzzle pieces.
+.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 \-identical | \-no-identical
+Whether to use identical pieces.
+.TP 8
+.B \-cycles \fInumber\fP
+Duration.  500 - 5000. Default: 2000.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 10000 (0.01 seconds.).
+.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 Stephen Montgomery-Smith.  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
+Stephen Montgomery-Smith.
diff --git a/hacks/ripples.man b/hacks/ripples.man
new file mode 100644 (file)
index 0000000..caa2686
--- /dev/null
@@ -0,0 +1,82 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+ripples - interference patterns.
+.SH SYNOPSIS
+.B ripples
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-rate \fInumber\fP]
+[\-fluidity \fInumber\fP]
+[\-light \fInumber\fP]
+[\-water]
+[\-stir]
+[\-oily]
+[\-colors \fInumber\fP]
+[\-no-shm]
+.SH DESCRIPTION
+This draws rippling interference patterns like splashing water. With the
+-water option, it manipulates your desktop image to look like something is
+dripping into it.
+.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: 50000 (0.05 seconds.).
+.TP 8
+.B \-rate \fInumber\fP
+Drizzle.  1 - 100.  Default: 5.
+.TP 8
+.B \-fluidity \fInumber\fP
+Small Drops.  0 - 16.  Default: 6.
+.TP 8
+.B \-light \fInumber\fP
+Lighting Effect.  0 - 8.  Default: 0.
+.TP 8
+.B \-water | \-no-water
+Grab Screen Image.  Boolean.
+.TP 8
+.B \-stir | \-no-stir
+Moving Splashes.  Boolean.
+.TP 8
+.B \-oily | \-no-oily
+Psychedelic Colors.  Boolean.
+.TP 8
+.B \-colors \fInumber\fP
+Colors Two.  Default: 200.
+.TP 8
+.B \-shm | \-no-shm
+Use Shared Memory.  Boolean.
+.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 Tom Hammersley.  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
+Tom Hammersley.
diff --git a/hacks/rotor.man b/hacks/rotor.man
new file mode 100644 (file)
index 0000000..0e982d7
--- /dev/null
@@ -0,0 +1,64 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+rotor - screen saver.
+.SH SYNOPSIS
+.B rotor
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-size \fInumber\fP]
+.SH DESCRIPTION
+This draws a line segment moving along a complex spiraling curve.
+.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 \-count \fInumber\fP
+Count. 0 - 20.  Default: 4.
+.TP 8
+.B \-cycles \fInumber\fP
+Length.  2 - 100.  Default: 20.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 10000 (0.01 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors.  Default: 200.
+.TP 8
+.B \-size \fInumber\fP
+Size.  -50 - 50.  Default: -6.
+.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 Tom Lawrence.  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
+Tom Lawrence.
index 9d11b350f665b7bb8bc8d73362ed9abdcaa42a93..2dfd9781856d302045f56d5fc894b2deccd9c6f2 100644 (file)
@@ -293,10 +293,10 @@ visual_warning (Screen *screen, Window window, Visual *visual, Colormap cmap,
   if (window == RootWindowOfScreen (screen))
     strcpy (win, "root window");
   else
-    sprintf (win, "window 0x%x", (unsigned long) window);
+    sprintf (win, "window 0x%lx", (unsigned long) window);
 
   if (window_p)
-    sprintf (why, "-window-id 0x%x", (unsigned long) window);
+    sprintf (why, "-window-id 0x%lx", (unsigned long) window);
   else
     strcpy (why, "-root");
 
@@ -315,7 +315,7 @@ visual_warning (Screen *screen, Window window, Visual *visual, Colormap cmap,
         {
           fprintf (stderr, "%s: ignoring `-visual %s' because of `%s'.\n",
                    progname, visual_string, why);
-          fprintf (stderr, "%s: using %s's visual 0x%x.\n",
+          fprintf (stderr, "%s: using %s's visual 0x%lx.\n",
                    progname, win, XVisualIDFromVisual (visual));
         }
       free (visual_string);
@@ -327,7 +327,7 @@ visual_warning (Screen *screen, Window window, Visual *visual, Colormap cmap,
     {
       fprintf (stderr, "%s: ignoring `-install' because of `%s'.\n",
                progname, why);
-      fprintf (stderr, "%s: using %s's colormap 0x%x.\n",
+      fprintf (stderr, "%s: using %s's colormap 0x%lx.\n",
                progname, win, (unsigned long) cmap);
     }
 
@@ -502,12 +502,14 @@ main (int argc, char **argv)
       xgwa.your_event_mask |= KeyPressMask;
       XSelectInput (dpy, window, xgwa.your_event_mask);
 
-      /* Select ButtonPress events on the external window, if no other
-         app has already selected it (only one app can select ButtonPress
-         at a time: BadAccess results.)
+      /* Select ButtonPress and ButtonRelease events on the external window,
+         if no other app has already selected them (only one app can select
+         ButtonPress at a time: BadAccess results.)
        */
-      if (! (xgwa.all_event_masks & ButtonPressMask))
-        XSelectInput (dpy, window, xgwa.your_event_mask | ButtonPressMask);
+      if (! (xgwa.all_event_masks & (ButtonPressMask | ButtonReleaseMask)))
+        XSelectInput (dpy, window,
+                      (xgwa.your_event_mask |
+                       ButtonPressMask | ButtonReleaseMask));
     }
   else if (root_p)
     {
@@ -605,7 +607,8 @@ main (int argc, char **argv)
         XWindowAttributes xgwa;
         XGetWindowAttributes (dpy, window, &xgwa);
         XSelectInput (dpy, window,
-                      xgwa.your_event_mask | KeyPressMask | ButtonPressMask);
+                      (xgwa.your_event_mask | KeyPressMask |
+                       ButtonPressMask | ButtonReleaseMask));
         XChangeProperty (dpy, window, XA_WM_PROTOCOLS, XA_ATOM, 32,
                          PropModeReplace,
                          (unsigned char *) &XA_WM_DELETE_WINDOW, 1);
diff --git a/hacks/shadebobs.man b/hacks/shadebobs.man
new file mode 100644 (file)
index 0000000..9f2ed3e
--- /dev/null
@@ -0,0 +1,61 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+shadebobs - oscilating vapor trails.
+.SH SYNOPSIS
+.B shadebobs
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-ncolors \fInumber\fP]
+[\-count \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-cycles \fInumber\fP]
+.SH DESCRIPTION
+This draws smoothly-shaded oscilating oval patterns, that look something
+like vapor trails or neon tubes.
+.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 \-ncolors \fInumber\fP
+Number of Colors.  Default: 64.
+.TP 8
+.B \-count \fInumber\fP
+Count. 0 - 20.  Default: 4.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 5000 (0.01 seconds.).
+.TP 8
+.B \-cycles \fInumber\fP
+Duration.  0 - 100.  Default: 10.
+.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 Shane Smit.  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
+Shane Smit.
diff --git a/hacks/thornbird.man b/hacks/thornbird.man
new file mode 100644 (file)
index 0000000..1f5755c
--- /dev/null
@@ -0,0 +1,60 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+thornbird - Bird in a Thornbush fractal.
+.SH SYNOPSIS
+.B thornbird
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-cycles \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+.SH DESCRIPTION
+Displays a view of the "Bird in a Thornbush" fractal.
+.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 \-count \fInumber\fP
+Points.  10 - 1000.  Default: 800.
+.TP 8
+.B \-cycles \fInumber\fP
+Thickness.  2 - 500.  Default: 16.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 10000 (0.01 seconds.).
+.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 Tim Auckland.  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
+Tim Auckland.
diff --git a/hacks/triangle.man b/hacks/triangle.man
new file mode 100644 (file)
index 0000000..4159f20
--- /dev/null
@@ -0,0 +1,52 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+triangle - random mountains using iterative subdivision of triangles.
+.SH SYNOPSIS
+.B triangle
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+.SH DESCRIPTION
+Generates random mountain ranges using iterative subdivision of triangles.
+.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 (0.01 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors.  Default: 128.
+.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 Tobias Gloth.  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
+Tobias Gloth.
diff --git a/hacks/truchet.man b/hacks/truchet.man
new file mode 100644 (file)
index 0000000..3f91512
--- /dev/null
@@ -0,0 +1,135 @@
+.TH XScreenSaver 1 "27-May-97" "X Version 11"
+.SH NAME
+truchet - draws curved or angular Truchet patterns
+.SH SYNOPSIS
+.B truchet
+[\-display \fIhost:display.screen\fP]  [\-foreground \fIcolor\fP] [\-background \fIcolor\fP]
+[\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP]
+[\-min\-width \fIinteger\fP] [\-min-height \fIinteger\fP] [\-max-width \fIinteger\fP] 
+[\-max-height \fIinteger\fP] [\-max\-linewidth \fIinteger\fP] [\-min-linewidth \fIinteger\fP] 
+[\-erase] [\-no\-erase] [\-erase\-count \fIinteger\fP] [\-square] [\-not\-square] [\-curves]
+[\-no\-curves] [\-angle] [\-no\-angles] [\-scroll] [\-scroll\-overlap \fIinteger\fP] 
+[\-anim\-delay \fIinteger\fP] [\-anim\-step\-size \fIinteger\fP]
+
+.SH DESCRIPTION
+The \fItruchet\fP program draws arc and line based Truchet patterns.
+.SH OPTIONS
+.l truchet
+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 \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.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 \-delay \fImicroseconds\fP
+How long to wait between drawing each screenful. Default is 3 seconds.
+
+.TP 8 
+.B \-min-width \fIinteger\fP
+The minimum width in pixels of each square. Default is 40.
+
+.TP 8
+.B \-min-height \fIinteger\fP
+The minimum height in pixels of each square. Default is 40.
+
+.TP 8
+.B \-max-width \fIinteger\fP
+The maximum width in pixels of each square. Default is 150.
+
+.TP 8
+.B \-max-height \fIinteger\fP
+The maximum height in pixels of each square. Default is 150.
+
+.TP 8
+.B \-max-linewidth \fIinteger\fP
+The maximum width of the lines used to draw. Default is 25.
+
+.TP 8
+.B \-min-linewidth \fIinteger\fP
+The minimum width of the lines used to draw. Default is 2.
+
+.TP 8
+.B \-erase
+
+.TP 8
+.B \-no-erase
+Whether to clear the screen after each screenful is drawn. Default is True (erase).
+
+.TP 8
+.B \-erase-count \fIinteger\fP
+The number of screenfuls to draw before erasing. Default is 25.
+
+.TP 8
+.B \-square
+
+.TP 8
+.B \-not-square
+Whether to force the tiles to be square. Defualt is False (not-square).
+
+.TP 8
+.B \-curves
+
+.TP 8
+.B \-no-curves
+Whether to draw the arc based Truchet pattern. Default is True (curves).
+
+.TP 8
+.B \-angles
+
+.TP 8
+.B \-no-angles
+Whether or not to draw the line based Truchet pattern. Default is True (angles)
+
+.TP 8
+.B \-scroll
+Use the scroll mode. Default is False.
+
+.TP 8
+.B \-scroll-overlap
+The amount to scroll from one side to another. Default is 400.
+
+.TP 8
+.B \-anim-delay
+The time to pause between each animation step. Default is 100.
+
+.TP 8
+.B \-anim-step-size
+The amount of steps to skip between each animation step. Default is 3.
+
+
+.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 1998 by Adrian Likins.
+
+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. 
+.SH AUTHOR
+Adrian Likins, 1998.
+
diff --git a/hacks/vermiculate.man b/hacks/vermiculate.man
new file mode 100644 (file)
index 0000000..f6e4b5d
--- /dev/null
@@ -0,0 +1,44 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+vermiculate - to move in a worm-like manner.
+.SH SYNOPSIS
+.B vermiculate
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+.SH DESCRIPTION
+Draws squiggly worm-like paths.
+.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.
+.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 Tyler Pierce.  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
+Tyler Pierce.
index 8308cccac8236abd0d961c259c9106b546be1e4e..688895b8e323dda278831496ed81059c16e09d97 100755 (executable)
@@ -21,7 +21,7 @@ use diagnostics;
 use strict;
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.19 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my $version = q{ $Revision: 1.20 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
 
 my $verbose = 0;
 my $use_stdin = 0;
@@ -54,6 +54,10 @@ my @displayer_programs = (
 # "xsri       -scale -keep-aspect -center-horizontal -center-vertical",
 );
 
+# apparently some versions of netpbm call it "pamoil" instead of "pgmoil"...
+#
+my $pgmoil = (which("pamoil") ? "pamoil" : "pgmoil");
+
 
 # List of interesting PPM filter pipelines.
 # In this list, the following magic words may be used:
@@ -68,7 +72,7 @@ my @displayer_programs = (
 my @filters = (
   "ppmtopgm FILE1 | pgmedge | pgmtoppm COLORS | ppmnorm",
   "ppmtopgm FILE1 | pgmenhance | pgmtoppm COLORS",
-  "ppmtopgm FILE1 | pgmoil | pgmtoppm COLORS",
+  "ppmtopgm FILE1 | $pgmoil | pgmtoppm COLORS",
   "ppmtopgm FILE1 | pgmbentley | pgmtoppm COLORS",
 
   "ppmrelief FILE1 | ppmtopgm | pgmedge | ppmrelief | ppmtopgm |" .
@@ -110,7 +114,7 @@ my @filters = (
   " pnmflip -tb FILE3 | ppmnorm > FILE2 ; " .
   " pnmarith -multiply FILE1 FILE2",
 
-  "ppmshift 30 FILE1 | ppmtopgm | pgmoil | pgmedge | " .
+  "ppmshift 30 FILE1 | ppmtopgm | $pgmoil | pgmedge | " .
   "   pgmtoppm COLORS > FILE2 ; " .
   " pnmarith -difference FILE1 FILE2",
 
@@ -157,6 +161,19 @@ sub pick_displayer {
 }
 
 
+# returns the full path of the named program, or undef.
+#
+sub which {
+  my ($prog) = @_;
+  foreach (split (/:/, $ENV{PATH})) {
+    if (-x "$_/$prog") {
+      return $prog;
+    }
+  }
+  return undef;
+}
+
+
 # Choose random foreground and background colors
 #
 sub randcolors {
diff --git a/hacks/wander.man b/hacks/wander.man
new file mode 100644 (file)
index 0000000..5755ce8
--- /dev/null
@@ -0,0 +1,72 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+wander - colorful random-walk.
+.SH SYNOPSIS
+.B wander
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-density \fInumber\fP]
+[\-reset \fInumber\fP]
+[\-length \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-circles]
+[\-size \fInumber\fP]
+[\-advance \fInumber\fP]
+.SH DESCRIPTION
+Draws a colorful random-walk, in various forms.
+.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 \-density \fInumber\fP
+Density.  1 - 30.  Default: 2.
+.TP 8
+.B \-reset \fInumber\fP
+Number of frames before resetting.  Default: 2500000.
+.TP 8
+.B \-length \fInumber\fP
+Number of iterations.  Default: 25000.
+.TP 8
+.B \-delay \fInumber\fP
+Sustain.  0 - 60.  Default: 1.
+.TP 8
+.B \-circles | \-no-circles
+Whether to draw spots.
+.TP 8
+.B \-size \fInumber\fP
+Size.  0 - 100.  Default: 1.
+.TP 8
+.B \-advance \fInumber\fP
+Color Contrast.  1 - 100.  Default: 1.
+.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 Rick Campbell.  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
+Rick Campbell.
index 9489f22f6d1d3b58390c986c3358eec97f4a100d..260230abba83d01c820af5991d726579efbcc9f9 100755 (executable)
@@ -35,7 +35,7 @@ use POSIX qw(strftime);
 
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.90 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my $version = q{ $Revision: 1.93 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
 my $copyright = "WebCollage $version, Copyright (c) 1999-2002" .
     " Jamie Zawinski <jwz\@jwz.org>\n" .
     "            http://www.jwz.org/xscreensaver/\n";
@@ -141,6 +141,8 @@ my %warningless_sites = (
   "yimg.com"                => 1,  # This is where dailynews.yahoo.com stores
   "eimg.com"                => 1,  # its images, so pick_from_yahoo_news_text()
                                    # hits this every time.
+
+  "driftnet"                => 1,  # builtin...
 );
 
 
@@ -182,6 +184,12 @@ my $min_gif_area = (120 * 120);
 my $no_output_p = 0;
 my $urls_only_p = 0;
 
+my @pids_to_kill = ();  # forked pids we should kill when we exit, if any.
+
+my $driftnet_magic = 'driftnet';
+my $driftnet_dir = undef;
+my $default_driftnet_cmd = "driftnet -a -m 100";
+
 my $wordlist;
 
 my %rejected_urls;
@@ -352,6 +360,10 @@ sub get_document {
   my ( $url, $referer, $timeout ) = @_;
   my $start = time;
 
+  if (defined($referer) && $referer eq $driftnet_magic) {
+    return get_driftnet_file ($url);
+  }
+
   my $orig_url = $url;
   my $loop_count = 0;
   my $max_loop_count = 4;
@@ -1013,9 +1025,8 @@ sub pick_from_alta_vista_images {
   foreach my $u (@subpages) {
 
     # altavista is encoding their URLs now.
-    next unless ($u =~
-    m@^/r\?ck_sm=[a-zA-Z0-9]+\&ref=[a-zA-Z0-9]+(\&uid=[a-zA-Z0-9]+)?\&r=(.*)@);
-    $u = url_unquote($2);
+    next unless ($u =~ m@^/r.*\&r=([^&]+).*@);
+    $u = url_unquote($1);
 
     next unless ($u =~ m@^http://@i);    #  skip non-HTTP or relative URLs
     next if ($u =~ m@[/.]altavista\.com\b@i);     # skip altavista builtins
@@ -1182,8 +1193,7 @@ sub pick_from_alta_vista_text {
     # onMouseOver to make it look like they're not!  Well, it makes it
     # easier for us to identify search results...
     #
-    next unless ($u =~
-      m@^/r\?ck_sm=[a-zA-Z0-9]+\&ref=[a-zA-Z0-9]+\&uid=[a-zA-Z0-9]+\&r=(.*)@);
+    next unless ($u =~ m@^/r.*\&r=([^&]+).*@);
     $u = url_unquote($1);
 
     LOG ($verbose_filter, "  candidate: $u");
@@ -1267,7 +1277,13 @@ sub pick_from_lycos_text {
     # Lycos plays exact the same redirection game as hotbot.
     # Note that "id=0" is used for internal advertising links,
     # and 1+ are used for  search results.
-    next unless ($u =~ m@^http://click.hotbot.com/director.asp\?id=[1-9]\d*&target=([^&]+)@);
+    next unless ($u =~ m@^http://click.hotbot.com/director.asp
+                         .*
+                         [?&]id=[1-9]\d*
+                         .*
+                         \&target=([^&]+)
+                         .*
+                        @x);
     $u = url_decode($1);
 
     LOG ($verbose_filter, "  candidate: $u");
@@ -1315,6 +1331,113 @@ sub pick_from_yahoo_news_text {
 
 
 
+\f
+############################################################################
+#
+# Pick images by waiting for driftnet to populate a temp dir with files.
+# Requires driftnet version 0.1.5 or later.
+# (Driftnet is a program by Chris Lightfoot that sniffs your local ethernet
+# for images being downloaded by others.)
+# Driftnet/webcollage integration by jwz.
+#
+############################################################################
+
+# driftnet
+sub pick_from_driftnet {
+  my ( $timeout ) = @_;
+
+  my $id = $driftnet_magic;
+  my $dir = $driftnet_dir;
+  my $start = time;
+  my $now;
+
+  error ("\$driftnet_dir unset?") unless ($dir);
+  $dir =~ s@/+$@@;
+
+  error ("$dir unreadable") unless (-d "$dir/.");
+
+  $timeout = $http_timeout unless ($timeout);
+  $last_search = $id;
+
+  while ($now = time, $now < $start + $timeout) {
+    local *DIR;
+    opendir (DIR, $dir) || error ("$dir: $!");
+    while (my $file = readdir(DIR)) {
+      next if ($file =~ m/^\./);
+      $file = "$dir/$file";
+      closedir DIR;
+      LOG ($verbose_load, "picked file $file ($id)");
+      return ($id, $file);
+    }
+    closedir DIR;
+  }
+  LOG (($verbose_net || $verbose_load), "timed out for $id");
+  return ();
+}
+
+
+sub get_driftnet_file {
+  my ($file) = @_;
+
+  error ("\$driftnet_dir unset?") unless ($driftnet_dir);
+
+  my $id = $driftnet_magic;
+  my $re = qr/$driftnet_dir/;
+  error ("$id: $file not in $driftnet_dir?")
+    unless ($file =~ m@^$re@o);
+
+  local *IN;
+  open (IN, $file) || error ("$id: $file: $!");
+  my $body = '';
+  while (<IN>) { $body .= $_; }
+  close IN;
+  unlink ($file);
+  return ($id, $body);
+}
+
+
+sub spawn_driftnet {
+  my ($cmd) = @_;
+
+  # make a directory to use.
+  while (1) {
+    my $tmp = $ENV{TEMPDIR} || "/tmp";
+    $driftnet_dir = sprintf ("$tmp/driftcollage-%08x", rand(0xffffffff));
+    LOG ($verbose_exec, "mkdir $driftnet_dir");
+    last if mkdir ($driftnet_dir, 0700);
+  }
+
+  if (! ($cmd =~ m/\s/)) {
+    # if the command didn't have any arguments in it, then it must be just
+    # a pointer to the executable.  Append the default args to it.
+    my $dargs = $default_driftnet_cmd;
+    $dargs =~ s/^[^\s]+//;
+    $cmd .= $dargs;
+  }
+
+  # point the driftnet command at our newly-minted private directory.
+  #
+  $cmd .= " -d $driftnet_dir";
+  $cmd .= ">/dev/null" unless ($verbose_exec);
+
+  my $pid = fork();
+  if ($pid < 0) { error ("fork: $!\n"); }
+  if ($pid) {
+    # parent fork
+    push @pids_to_kill, $pid;
+    LOG ($verbose_exec, "forked for \"$cmd\"");
+  } else {
+    # child fork
+    nontrapping_system ($cmd) || error ("exec: $!");
+  }
+
+  # wait a bit, then make sure the process actually started up.
+  #
+  sleep (1);
+  error ("pid $pid failed to start \"$cmd\"")
+    unless (1 == kill (0, $pid));
+}
+
 \f
 ############################################################################
 #
@@ -1326,7 +1449,6 @@ sub pick_from_yahoo_news_text {
 # Picks a random image on a random page, and returns two URLs:
 # the page containing the image, and the image.
 # Returns () if nothing found this time.
-# Uses the url-randomizer 1 time in 5, else the image randomizer.
 #
 
 sub pick_image {
@@ -1551,6 +1673,11 @@ sub save_recent_url {
   $_ = $url;
   my ($site) = m@^http://([^ \t\n\r/:]+)@;
 
+  if ($base eq $driftnet_magic) {
+    $site = $driftnet_magic;
+    @recent_images = ();
+  }
+
   my $done = 0;
   foreach (@recent_images) {
     if ($_ eq $url) {
@@ -1703,6 +1830,24 @@ sub bellrand {
 }
 
 
+sub signal_cleanup {
+  my ($sig) = @_;
+  print STDERR blurb() . (defined($sig)
+                          ? "caught signal $sig."
+                          : "exiting.")
+                       . "\n"
+    if ($verbose_exec);
+
+  x_cleanup();
+
+  if (@pids_to_kill) {
+    print STDERR blurb() . "killing: " . join(' ', @pids_to_kill) . "\n";
+    kill ('TERM', @pids_to_kill);
+  }
+
+  exit 1;
+}
+
 ##############################################################################
 #
 # Generating a list of urls only
@@ -1739,12 +1884,8 @@ my $img_height;
 
 my $delay = 2;
 
-
 sub x_cleanup {
-  my ($sig) = @_;
-  print STDERR blurb() . "caught signal $sig.\n" if ($verbose_exec);
   unlink $image_ppm, $image_tmp1, $image_tmp2;
-  exit 1;
 }
 
 
@@ -1923,17 +2064,6 @@ sub x_or_pbm_output {
   #
   $ppm_to_root_window_cmd = pick_root_displayer();
 
-
-  $SIG{HUP}  = \&x_cleanup;
-  $SIG{INT}  = \&x_cleanup;
-  $SIG{QUIT} = \&x_cleanup;
-  $SIG{ABRT} = \&x_cleanup;
-  $SIG{KILL} = \&x_cleanup;
-  $SIG{TERM} = \&x_cleanup;
-
-  # Need this so that if giftopnm dies, we don't die.
-  $SIG{PIPE} = 'IGNORE';
-
   if (!$img_width || !$img_height) {
     $_ = "xdpyinfo";
     which ($_) || error "$_ not found on \$PATH.";
@@ -2342,12 +2472,29 @@ sub paste_image {
 }
 
 
+sub init_signals {
+
+  $SIG{HUP}  = \&signal_cleanup;
+  $SIG{INT}  = \&signal_cleanup;
+  $SIG{QUIT} = \&signal_cleanup;
+  $SIG{ABRT} = \&signal_cleanup;
+  $SIG{KILL} = \&signal_cleanup;
+  $SIG{TERM} = \&signal_cleanup;
+
+  # Need this so that if giftopnm dies, we don't die.
+  $SIG{PIPE} = 'IGNORE';
+}
+
+END { signal_cleanup(); }
+
+
 sub main {
   $| = 1;
   srand(time ^ $$);
 
   my $verbose = 0;
   my $dict;
+  my $driftnet_cmd = 0;
 
   $current_state = "init";
   $load_method = "none";
@@ -2399,6 +2546,13 @@ sub main {
       $http_proxy = shift @ARGV;
     } elsif ($_ eq "-dictionary" || $_ eq "-dict") {
       $dict = shift @ARGV;
+    } elsif ($_ eq "-driftnet" || $_ eq "--driftnet") {
+      @search_methods = ( 100, "driftnet", \&pick_from_driftnet );
+      if (! ($ARGV[0] =~ m/^-/)) {
+        $driftnet_cmd = shift @ARGV;
+      } else {
+        $driftnet_cmd = $default_driftnet_cmd;
+      }
     } elsif ($_ eq "-debug" || $_ eq "--debug") {
       my $which = shift @ARGV;
       my @rest = @search_methods;
@@ -2418,11 +2572,13 @@ sub main {
       LOG (1, "DEBUG: using only \"$which\"");
 
     } else {
-      print STDERR "$copyright\nusage: $progname [-root]" .
-                 " [-display dpy] [-root] [-verbose] [-timeout secs]\n" .
-                 "\t\t  [-delay secs] [-filter cmd] [-filter2 cmd]\n" .
-                 "\t\t  [-dictionary dictionary-file]\n" .
-                 "\t\t  [-http-proxy host[:port]]\n";
+      print STDERR "$copyright\nusage: $progname " .
+              "[-root] [-display dpy] [-verbose] [-debug which]\n" .
+        "\t\t  [-timeout secs] [-delay secs] [-filter cmd] [-filter2 cmd]\n" .
+        "\t\t  [-no-output] [-urls-only] [-background color] [-size WxH]\n" .
+        "\t\t  [-dictionary dictionary-file] [-http-proxy host[:port]]\n" .
+        "\t\t  [-driftnet [driftnet-program-and-args]]\n" .
+        "\n";
       exit 1;
     }
   }
@@ -2502,6 +2658,10 @@ sub main {
     pick_dictionary();
   }
 
+  init_signals();
+
+  spawn_driftnet ($driftnet_cmd) if ($driftnet_cmd);
+
   if ($urls_only_p) {
     url_only_output;
   } else {
index 99bd78292b5637315165057467270e6c06af0ea3..5713bdaffaf4a6b0358a44dab405b4e84c432a41 100644 (file)
@@ -33,6 +33,31 @@ static int verbose_p = 0;
 static void add_jpeg_comment (struct jpeg_compress_struct *cinfo);
 static void write_pixbuf (GdkPixbuf *pb, const char *file);
 
+static GdkPixbuf *
+load_pixbuf (const char *file)
+{
+  GdkPixbuf *pb;
+#ifdef HAVE_GTK2
+  GError *err = NULL;
+
+  pb = gdk_pixbuf_new_from_file (file, &err);
+#else  /* !HAVE_GTK2 */
+  pb = gdk_pixbuf_new_from_file (file);
+#endif /* HAVE_GTK2 */
+
+  if (!pb)
+    {
+#ifdef HAVE_GTK2
+      fprintf (stderr, "%s: %s\n", progname, err->message);
+      g_error_free (err);
+#else  /* !HAVE_GTK2 */
+      fprintf (stderr, "%s: unable to load %s\n", progname, file);
+#endif /* !HAVE_GTK2 */
+      exit (1);
+    }
+
+  return pb;
+}
 
 static void
 paste (const char *paste_file,
@@ -48,20 +73,8 @@ paste (const char *paste_file,
   int paste_w, paste_h;
   int base_w, base_h;
 
-  paste_pb = gdk_pixbuf_new_from_file (paste_file);
-
-  if (!paste_pb)
-    {
-      fprintf (stderr, "%s: unable to load %s\n", progname, paste_file);
-      exit (1);
-    }
-
-  base_pb = gdk_pixbuf_new_from_file (base_file);
-  if (!base_pb)
-    {
-      fprintf (stderr, "%s: unable to load %s\n", progname, base_file);
-      exit (1);
-    }
+  paste_pb = load_pixbuf (paste_file);
+  base_pb  = load_pixbuf (base_file);
 
   paste_w = gdk_pixbuf_get_width (paste_pb);
   paste_h = gdk_pixbuf_get_height (paste_pb);
@@ -210,7 +223,7 @@ write_pixbuf (GdkPixbuf *pb, const char *file)
 
   if (channels != 3)
     {
-      fprintf (stderr, "%s: %d channels?\n", progname);
+      fprintf (stderr, "%s: %d channels?\n", progname, channels);
       exit (1);
     }
 
@@ -350,6 +363,10 @@ main (int argc, char **argv)
   if (w < 0) usage();
   if (h < 0) usage();
 
+#ifdef HAVE_GTK2
+  g_type_init ();
+#endif /* HAVE_GTK2 */
+
   paste (paste_file, base_file,
          from_scale, opacity,
          from_x, from_y, to_x, to_y,
index 3e8872d411fdb84cd73d8a41e314b82385c22a11..51dbb18a1c0e633aa6840d15d77fdf739bf28f6d 100644 (file)
 webcollage - decorate the screen with random images from the web
 .SH SYNOPSIS
 .B webcollage
-[\-display \fIhost:display.screen\fP] [\-root] [\-verbose]
-[\-delay \fIsecs\fP] [\-timeout \fIsecs\fP] [\-background \fIbg\fP]
-[\-filter \fIcommand\fP] [\-filter2 \fIcommand\fP]
+[\-display \fIhost:display.screen\fP]
+[\-root]
+[\-verbose]
+[\-timeout \fIsecs\fP]
+[\-delay \fIsecs\fP]
+[\-background \fIbg\fP]
+[\-no-output]
+[\-urls-only]
+[\-size \fIWxH\fP]
+[\-filter \fIcommand\fP]
+[\-filter2 \fIcommand\fP]
 [\-http\-proxy host[:port]]
+[\-dictionary \fIdictionary-file\fP]
+[\-driftnet [\fIcmd\fP]]
 .SH DESCRIPTION
 The \fIwebcollage\fP program pulls random image off of the World Wide Web
 and scatters them on the root window.  One satisfied customer described it
@@ -38,22 +48,33 @@ tools.
 \fIwebcollage\fP is written in
 .BR perl (1)
 and requires Perl 5.
+
+It will be an order of magnitude faster if you also have
+the \fIwebcollage-helper\fP program installed (a GDK/JPEG image
+compositor), but \fIwebcollage\fP works without it as well.
 .SH OPTIONS
 .I webcollage
 accepts the following options:
 .TP 8
 .B \-root
-Draw on the root window.  This option is manditory: drawing to a window
-other than the root window is not yet supported.
+Draw on the root window.  This option is manditory, if output is being
+produced: drawing to a window other than the root window is not yet
+supported.
 .TP 8
 .B \-verbose \fRor\fP \-v
 Print diagnostics to stderr.  Multiple \fI-v\fP switches increase the
-amount of output.  \fI-v\fP will print out only the URLs of the 
-images; \fI-vv\fP will print all the commands being run; and \fI-vvv\fP
-will print more than you care about.
+amount of output.  \fI-v\fP will print out the URLs of the images,
+and where they were placed; \fI-vv\fP will print out any warnings,
+and all URLs being loaded; \fI-vvv\fP will print information on
+what URLs were rejected; and so on.
+.TP 8
+.B \-timeout \fIseconds\fP
+How long to wait for a URL to complete before giving up on it and
+moving on to the next one.
+Default 30 seconds.
 .TP 8
 .B \-delay \fIseconds\fP
-How long to sleep between images.  Default 1 second.  (Remember that
+How long to sleep between images.  Default 2 seconds.  (Remember that
 this program probably spends a lot of time waiting for the network.)
 .TP 8
 .B \-background \fIcolor-or-ppm\fP
@@ -61,10 +82,18 @@ What to use for the background onto which images are pasted.  This may be
 a color name, a hexadecimal RGB specification in the form '#rrggbb', or 
 the name of a PPM file.
 .TP 8
-.B \-timeout \fIseconds\fP
-How long to wait for a URL to complete before giving up on it and
-moving on to the next one.
-Default 30 seconds.
+.B \-size \fIWxH\fP
+Normally, the output image will be made to be the size of the screen.
+This lets you specify the desired size.
+.TP 8
+.B \-no-output
+If this option is specified, then no composite output image will be
+generated.  This is only useful when used in conjunction 
+with \fB\-verbose\fP.
+.TP 8
+.B \-urls-only
+If this option is specified, then no composite output image will be
+generated: instead, a list of image URLs will be printed on stdout.
 .TP 8
 .B \-filter \fIcommand\fP
 Filter all source images through this command.  The command must take
@@ -83,6 +112,32 @@ final, full-screen image.
 If you must go through a proxy to connect to the web, you can specify it 
 with this option, or with the \fB$http_proxy\fP or \fB$HTTP_PROXY\fP 
 environment variables.
+.TP 8
+.B \-dictionary \fIfile\fP
+Webcollage normally looks at the system's default spell-check dictionary
+to generate words to feed into the search engines.  You can specify an
+alternate dictionary with this option.
+.TP 8
+.B \-driftnet \fI[ args ]\fP
+.BR driftnet (1)
+is a program that snoops your local ethernet for packets that look
+like they might be image files.  It can be used in conjunction 
+with \fIwebcollage\fP to generate a collage of what other people on
+your network are looking at, instead of a search-engine collage.
+If you have \fIdriftnet\fP installed on your $PATH, just use 
+the \fI\-driftnet\fP option.  You can also specify the location
+of the program like this:
+.EX
+-driftnet /path/to/driftnet
+.EE
+or, you can provide extra arguments like this:
+.EX
+-driftnet '/path/to/driftnet -extra -args'
+.EE
+Driftnet version 0.1.5 or later is required.  Note that 
+the \fIdriftnet\fP program requires root access, so you'll have
+to make \fIdriftnet\fP be setuid-root for this to work.
+Please exercise caution.
 .SH ENVIRONMENT
 .PP
 .TP 8
@@ -110,11 +165,7 @@ visual specification (see the
 .BR xscreensaver (1)
 manual for more details.)
 
-Only the GIF and JPEG image formats are supported.
-
-Transparent and animating GIFs are not supported.
-
-It's slow.
+Animating GIFs are not supported.
 
 Too many of the images that it finds are text, not pictures.  This is 
 because most of the web is pictures of text.  Which is pretty sad.
@@ -133,9 +184,10 @@ because most of the web is pictures of text.  Which is pretty sad.
 .BR xdpyinfo (1),
 .BR perl (1),
 .BR vidwhacker (1),
-.BR dadadodo (1)
+.BR dadadodo (1),
+.BR driftnet (1)
 .SH COPYRIGHT
-Copyright \(co 1998, 1999 by Jamie Zawinski.  Permission to use, copy, modify, 
+Copyright \(co 1998-2002 by Jamie Zawinski.  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
diff --git a/hacks/worm.man b/hacks/worm.man
new file mode 100644 (file)
index 0000000..c5fef30
--- /dev/null
@@ -0,0 +1,61 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+worm - multicolored worms that crawl around the screen.
+.SH SYNOPSIS
+.B worm
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-count \fInumber\fP]
+[\-delay \fInumber\fP]
+[\-ncolors \fInumber\fP]
+[\-size \fInumber\fP]
+.SH DESCRIPTION
+An ancient hack that draws multicolored worms that crawl around the screen.
+.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 \-count \fInumber\fP
+Count. -100 - 100.  Default: -20.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 17000 (0.02 seconds.).
+.TP 8
+.B \-ncolors \fInumber\fP
+Number of Colors.  Default: 150.
+.TP 8
+.B \-size \fInumber\fP
+Size.  -20 - 20.  Default: -3.
+.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 Brad Taylor, Dave Lemke, Boris Putanec, and
+Henrik Theiling.  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
+Brad Taylor, Dave Lemke, Boris Putanec, and Henrik Theiling.
index 28828beb1e25439958dcd026bb421fb0f645630c..12d31ffef519a10e73872545b0fe98311809b0e4 100644 (file)
@@ -1,5 +1,6 @@
 /* xlockmore.c --- xscreensaver compatibility layer for xlockmore modules.
- * xscreensaver, Copyright (c) 1997, 1998, 2001 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1997, 1998, 2001, 2002
+ *  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
@@ -213,7 +214,8 @@ xlockmore_read_resources (void)
 
 static void
 xlockmore_handle_events (ModeInfo *mi, 
-                         void (*reshape) (ModeInfo *, int, int))
+                         void (*reshape) (ModeInfo *, int, int),
+                         Bool (*hook) (ModeInfo *, XEvent *))
 {
   while (XPending (mi->dpy))
     {
@@ -224,6 +226,9 @@ xlockmore_handle_events (ModeInfo *mi,
           XGetWindowAttributes (mi->dpy, mi->window, &mi->xgwa);
           reshape (mi, mi->xgwa.width, mi->xgwa.height);
         }
+      else if (hook && hook (mi, &event))
+        {
+        }
       else
         {
           screenhack_handle_event (mi->dpy, &event);
@@ -238,9 +243,11 @@ xlockmore_screenhack (Display *dpy, Window window,
                      Bool want_uniform_colors,
                      Bool want_smooth_colors,
                      Bool want_bright_colors,
+                      unsigned long event_mask,
                      void (*hack_init) (ModeInfo *),
                      void (*hack_draw) (ModeInfo *),
                      void (*hack_reshape) (ModeInfo *, int, int),
+                     Bool (*hack_handle_events) (ModeInfo *, XEvent *),
                      void (*hack_free) (ModeInfo *))
 {
   ModeInfo mi;
@@ -249,11 +256,22 @@ xlockmore_screenhack (Display *dpy, Window window,
   int i;
   time_t start, now;
   int orig_pause;
+  Bool root_p;
 
   memset(&mi, 0, sizeof(mi));
   mi.dpy = dpy;
   mi.window = window;
   XGetWindowAttributes (dpy, window, &mi.xgwa);
+  root_p = (window == RootWindowOfScreen (mi.xgwa.screen));
+
+  /* If this is the root window, don't allow ButtonPress to be selected.
+     Bad Things Happen. */
+  if (root_p)
+    event_mask &= (~(ButtonPressMask|ButtonReleaseMask));
+
+  /* If this hack wants additional events, select them. */
+  if (event_mask && ! (mi.xgwa.your_event_mask & event_mask))
+    XSelectInput (dpy, window, (mi.xgwa.your_event_mask | event_mask));
 
   color.flags = DoRed|DoGreen|DoBlue;
   color.red = color.green = color.blue = 0;
@@ -343,7 +361,7 @@ xlockmore_screenhack (Display *dpy, Window window,
                                             mi.xgwa.colormap);
 
   mi.wireframe_p = get_boolean_resource ("wireframe", "Boolean");
-  mi.root_p = (window == RootWindowOfScreen (mi.xgwa.screen));
+  mi.root_p = root_p;
   mi.fps_p = get_boolean_resource ("showFPS", "Boolean");
 #ifdef HAVE_XSHM_EXTENSION
   mi.use_shm = get_boolean_resource ("useSHM", "Boolean");
@@ -366,7 +384,7 @@ xlockmore_screenhack (Display *dpy, Window window,
   do {
     hack_draw (&mi);
     XSync(dpy, False);
-    xlockmore_handle_events (&mi, hack_reshape);
+    xlockmore_handle_events (&mi, hack_reshape, hack_handle_events);
     if (mi.pause)
       usleep(mi.pause);
     mi.pause = orig_pause;
index b6ae538db35c125d0dee66e717ee2a1bf941fbb6..3b390f039a16783bae5754b60c226538434865f3 100644 (file)
@@ -1,5 +1,5 @@
 /* xlockmore.h --- xscreensaver compatibility layer for xlockmore modules.
- * xscreensaver, Copyright (c) 1997, 1998, 2001 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1997-2002 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
@@ -136,6 +136,12 @@ extern void HACK_DRAW(ModeInfo *);
 # define HACK_RESHAPE 0
 #endif
 
+#ifdef HACK_HANDLE_EVENT
+  extern Bool HACK_HANDLE_EVENT(ModeInfo *, XEvent *e);
+#else
+# define HACK_HANDLE_EVENT 0
+#endif
+
 
 /* Emit code for the entrypoint used by screenhack.c, and pass control
    down into xlockmore.c with the appropriate parameters.
@@ -171,9 +177,16 @@ void screenhack (Display *dpy, Window window)
                        False,
 #endif
 
+#ifdef EVENT_MASK
+                       EVENT_MASK,
+#else
+                       0,
+#endif
+
                        HACK_INIT,
                        HACK_DRAW,
                        HACK_RESHAPE,
+                       HACK_HANDLE_EVENT,
                        HACK_FREE);
 }
 
index ad1ac8d2dfc49d8b530254675cf9c7fe1aec4fdf..500de7a4c1ff970e528c653001ca65b240a163ec 100644 (file)
@@ -1,5 +1,5 @@
 /* xlockmore.h --- xscreensaver compatibility layer for xlockmore modules.
- * xscreensaver, Copyright (c) 1997, 1998, 2001 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1997-2002 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
@@ -108,9 +108,12 @@ extern void xlockmore_screenhack (Display *dpy, Window window,
                                  Bool want_uniform_colors,
                                  Bool want_smooth_colors,
                                  Bool want_bright_colors,
+                                  unsigned long event_mask,
                                  void (*hack_init) (ModeInfo *),
                                  void (*hack_draw) (ModeInfo *),
                                  void (*hack_reshape) (ModeInfo *, int, int),
+                                  Bool (*hack_handle_events) (ModeInfo *,
+                                                              XEvent *),
                                  void (*hack_free) (ModeInfo *));
 
 #endif /* __XLOCKMORE_INTERNAL_H__ */
index 016ec771f225f2075e1a0565e16be6275d15a44a..1cd608010aef21d777cdf90b9a7352a79ddead7b 100644 (file)
@@ -111,6 +111,8 @@ static unsigned char char_map[256] = {
   176,177,178,195,180,181,182,183,184,185,186,187,188,189,190,191   /* 240 */
 };
 
+#define CURSOR_GLYPH 97
+
 typedef enum { TRACE0, TRACE1, TRACE2,
                KNOCK0, KNOCK1, KNOCK2, KNOCK3,
                KNOCK4, KNOCK5, KNOCK6, KNOCK7,
@@ -124,6 +126,7 @@ typedef struct {
   int grid_width, grid_height;
   int char_width, char_height;
   m_cell *cells;
+  m_cell *cursor;
   m_feeder *feeders;
   int nspinners;
   Bool small_p;
@@ -331,6 +334,7 @@ init_matrix (Display *dpy, Window window)
 
   state->cells = (m_cell *)
     calloc (sizeof(m_cell), state->grid_width * state->grid_height);
+  state->cursor = NULL;
   state->feeders = (m_feeder *) calloc (sizeof(m_feeder), state->grid_width);
 
   state->density = get_integer_resource ("density", "Integer");
@@ -500,6 +504,97 @@ feed_matrix (m_state *state)
     }
 }
 
+
+static void
+redraw_cells (m_state *state, Bool active)
+{
+  int x, y;
+  int count = 0;
+
+  for (y = 0; y < state->grid_height; y++)
+    for (x = 0; x < state->grid_width; x++)
+      {
+        m_cell *cell = &state->cells[state->grid_width * y + x];
+
+        if (cell->glyph)
+          count++;
+
+        if (state->mode == TRACE2 && active)
+          {
+            int xx = x % strlen(state->tracing);
+            Bool dead_p = state->tracing[xx] > 0;
+
+            if (y == 0 && x == xx)
+              cell->glyph = (dead_p
+                             ? state->glyph_map[state->tracing[xx]-'0'] + 1
+                             : 0);
+            else if (y == 0)
+              cell->glyph = 0;
+            else
+              cell->glyph = (dead_p ? 0 :
+                             (state->glyph_map[(random()%state->nglyphs)]
+                              + 1));
+
+            cell->changed = 1;
+          }
+
+        if (!cell->changed)
+          continue;
+
+        if (cell->glyph == 0 && cell != state->cursor)
+          XFillRectangle (state->dpy, state->window, state->erase_gc,
+                          x * state->char_width,
+                          y * state->char_height,
+                          state->char_width,
+                          state->char_height);
+        else
+          {
+            int g = (cell == state->cursor ? CURSOR_GLYPH : cell->glyph);
+            int cx = (g - 1) % CHAR_COLS;
+            int cy = (g - 1) / CHAR_COLS;
+            int map = ((cell->glow > 0 || cell->spinner) ? GLOW_MAP :
+                       (cell->glow < 0) ? FADE_MAP :
+                       PLAIN_MAP);
+
+            XCopyArea (state->dpy, state->images[map],
+                       state->window, state->draw_gc,
+                       cx * state->char_width,
+                       cy * state->char_height,
+                       state->char_width,
+                       state->char_height,
+                       x * state->char_width,
+                       y * state->char_height);
+          }
+
+        cell->changed = 0;
+
+        if (cell->glow > 0)
+          {
+            cell->glow--;
+            cell->changed = 1;
+          }
+        else if (cell->glow < 0)
+          {
+            cell->glow++;
+            if (cell->glow == 0)
+              cell->glyph = 0;
+            cell->changed = 1;
+          }
+
+        if (cell->spinner && active)
+          {
+            cell->glyph = (state->glyph_map[(random()%state->nglyphs)] + 1);
+            cell->changed = 1;
+          }
+      }
+
+  if (state->cursor)
+    {
+      state->cursor->changed = 1;
+    }
+}
+
+
 static int
 densitizer (m_state *state)
 {
@@ -528,19 +623,29 @@ hack_text (m_state *state)
   int i;
   int x = 0;
   const char *s;
+  Bool typing_delay = False;
+  Bool transmit_delay = False;
+  Bool visible_cursor = False;
   switch (state->mode)
     {
-    case TRACE0: s = "Call trans opt: received.\n"
-                     "2-19-98 13:24:18 REC:Log>_"; break;
-    case TRACE1: s = "Trace program: running_"; break;
-
+    case TRACE0: if (state->grid_width >= 52)
+                   s = "Call trans opt: received. 2-19-98 13:24:18 REC:Log>";
+                 else
+                   s = "Call trans opt: received.\n2-19-98 13:24:18 REC:Log>";
+                 transmit_delay = True;
+                 visible_cursor = True;
+                 break;
+    case TRACE1: s = "Trace program: running";
+                 transmit_delay = True;
+                 visible_cursor = True;
+                 break;
     case KNOCK0: s = "Wake up, Neo..."; break;
     case KNOCK1: s = ""; break;
-    case KNOCK2: s = "The Matrix has you..."; break;
+    case KNOCK2: s = "The Matrix has you..."; typing_delay = True; break;
     case KNOCK3: s = ""; break;
-    case KNOCK4: s = "Follow the white rabbit..."; break;
+    case KNOCK4: s = "Follow the white rabbit."; typing_delay = True; break;
     case KNOCK5: s = ""; break;
-    case KNOCK6: s = "Knock knock, Neo."; break;
+    case KNOCK6: s = "Knock, knock, Neo."; break;
     case KNOCK7: s = ""; break;
 
     default: abort(); break;
@@ -580,11 +685,31 @@ hack_text (m_state *state)
               cell->glyph = char_map[(unsigned char) *s] + 1;
               if (*s == ' ' || *s == '\t') cell->glyph = 0;
               cell->changed = 1;
+              if (visible_cursor)
+                {
+                  m_cell *next = &state->cells[i + 1];
+                  next->changed = 1;
+                  state->cursor = next;
+                }
               i++;
             }
           x++;
         }
       s++;
+      if (typing_delay || transmit_delay)
+        {
+          redraw_cells (state, False);
+          XSync (state->dpy, False);
+          screenhack_handle_events (state->dpy);
+          if (typing_delay)
+            {
+              usleep (50000);
+              if (typing_delay && 0 == random() % 3)
+                usleep (0xFFFFFF & ((random() % 250000) + 1));
+            }
+          else
+            usleep (20000);
+        }
     }
 }
 
@@ -663,9 +788,38 @@ roll_state (m_state *state)
 
   if (delay)
     {
-      XSync (state->dpy, False);
-      sleep (delay);
+      if (state->cursor)
+        {
+          int blink_delay = 333000;
+          int tot_delay = 0;
+          m_cell *cursor = state->cursor;
+          while (tot_delay < delay * 1000000)
+            {
+              if (state->cursor)
+                {
+                  usleep (blink_delay * 2);
+                  tot_delay += (2 * blink_delay);
+                  state->cursor = NULL;
+                }
+              else
+                {
+                  usleep (blink_delay);
+                  tot_delay += blink_delay;
+                  state->cursor = cursor;
+                }
+              cursor->changed = 1;
+              redraw_cells (state, False);
+              XSync (state->dpy, False);
+              screenhack_handle_events (state->dpy);
+            }
+        }
+      else
+        {
+          XSync (state->dpy, False);
+          sleep (delay);
+        }
     }
+  state->cursor = NULL;
 }
 
 
@@ -744,88 +898,9 @@ hack_matrix (m_state *state)
 static void
 draw_matrix (m_state *state)
 {
-  int x, y;
-  int count = 0;
-
   feed_matrix (state);
   hack_matrix (state);
-
-  for (y = 0; y < state->grid_height; y++)
-    for (x = 0; x < state->grid_width; x++)
-      {
-        m_cell *cell = &state->cells[state->grid_width * y + x];
-
-        if (cell->glyph)
-          count++;
-
-        if (state->mode == TRACE2)
-          {
-            int xx = x % strlen(state->tracing);
-            Bool dead_p = state->tracing[xx] > 0;
-
-            if (y == 0 && x == xx)
-              cell->glyph = (dead_p
-                             ? state->glyph_map[state->tracing[xx]-'0'] + 1
-                             : 0);
-            else if (y == 0)
-              cell->glyph = 0;
-            else
-              cell->glyph = (dead_p ? 0 :
-                             (state->glyph_map[(random()%state->nglyphs)]
-                              + 1));
-
-            cell->changed = 1;
-          }
-
-        if (!cell->changed)
-          continue;
-
-        if (cell->glyph == 0)
-          XFillRectangle (state->dpy, state->window, state->erase_gc,
-                          x * state->char_width,
-                          y * state->char_height,
-                          state->char_width,
-                          state->char_height);
-        else
-          {
-            int cx = (cell->glyph - 1) % CHAR_COLS;
-            int cy = (cell->glyph - 1) / CHAR_COLS;
-            int map = ((cell->glow > 0 || cell->spinner) ? GLOW_MAP :
-                       (cell->glow == 0) ? PLAIN_MAP :
-                       GLOW_MAP);
-
-            XCopyArea (state->dpy, state->images[map],
-                       state->window, state->draw_gc,
-                       cx * state->char_width,
-                       cy * state->char_height,
-                       state->char_width,
-                       state->char_height,
-                       x * state->char_width,
-                       y * state->char_height);
-          }
-
-        cell->changed = 0;
-
-        if (cell->glow > 0)
-          {
-            cell->glow--;
-            cell->changed = 1;
-          }
-        else if (cell->glow < 0)
-          {
-            cell->glow++;
-            if (cell->glow == 0)
-              cell->glyph = 0;
-            cell->changed = 1;
-          }
-
-        if (cell->spinner)
-          {
-            cell->glyph = (state->glyph_map[(random()%state->nglyphs)] + 1);
-            cell->changed = 1;
-          }
-      }
-
+  redraw_cells (state, True);
   roll_state (state);
 
 #if 0
@@ -854,7 +929,7 @@ char *progclass = "XMatrix";
 
 char *defaults [] = {
   ".background:                   black",
-  ".foreground:                   green",
+  ".foreground:                   #00AA00",
   "*small:                ",
   "*delay:                10000",
   "*insert:               both",
diff --git a/hacks/xml2man.pl b/hacks/xml2man.pl
new file mode 100755 (executable)
index 0000000..e6b69d7
--- /dev/null
@@ -0,0 +1,250 @@
+#!/usr/bin/perl -w
+# Copyright © 2002 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.
+#
+# Created: 30-May-2002.
+#
+# This creates man pages from the XML program descriptions in 
+# xscreensaver/hacks/config/.
+#
+# They aren't necessarily the most accurate or well-written man pages,
+# but at least they exist.
+
+require 5;
+use diagnostics;
+use strict;
+
+use Text::Wrap;
+
+my $progname = $0; $progname =~ s@.*/@@g;
+my $version = q{ $Revision: 1.2 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+
+my $verbose = 0;
+
+my $default_args = ("[\\-display \\fIhost:display.screen\\fP]\n" .
+                    "[\\-visual \\fIvisual\\fP]\n" .
+                    "[\\-window]\n" .
+                    "[\\-root]\n");
+my $default_options = (".TP 8\n" .
+                       ".B \\-visual \\fIvisual\\fP\n" .
+                       "Specify which visual to use.  Legal values " .
+                       "are the name of a visual class,\n" .
+                       "or the id number (decimal or hex) of a " .
+                       "specific visual.\n" .
+                       ".TP 8\n" .
+                       ".B \\-window\n" .
+                       "Draw on a newly-created window.  " .
+                       "This is the default.\n" .
+                       ".TP 8\n" .
+                       ".B \\-root\n" .
+                       "Draw on the root window.\n");
+
+my $man_suffix = (".SH ENVIRONMENT\n" .
+                  ".PP\n" .
+                  ".TP 8\n" .
+                  ".B DISPLAY\n" .
+                  "to get the default host and display number.\n" .
+                  ".TP 8\n" .
+                  ".B XENVIRONMENT\n" .
+                  "to get the name of a resource file that overrides " .
+                  "the global resources\n" .
+                  "stored in the RESOURCE_MANAGER property.\n" .
+                  ".SH SEE ALSO\n" .
+                  ".BR X (1),\n" .
+                  ".BR xscreensaver (1)\n" .
+                  ".SH COPYRIGHT\n" .
+                  "Copyright \\(co 2002 by %AUTHOR%.  " .
+                  "Permission to use, copy, modify, \n" .
+                  "distribute, and sell this software and its " .
+                  "documentation for any purpose is \n" .
+                  "hereby granted without fee, provided that " .
+                  "the above copyright notice appear \n" .
+                  "in all copies and that both that copyright " .
+                  "notice and this permission notice\n" .
+                  "appear in supporting documentation.  No " .
+                  "representations are made about the \n" .
+                  "suitability of this software for any purpose.  " .
+                  "It is provided \"as is\" without\n" .
+                  "express or implied warranty.\n" .
+                  ".SH AUTHOR\n" .
+                  "%AUTHOR%.\n");
+
+sub xml2man {
+  my ($exe) = @_;
+  my $cfgdir = (-d "config" ? "config" : "../config");
+  my $xml = "$cfgdir/$exe.xml";
+  my $man = "$exe.man";
+
+  error ("$exe does not exist") if (! -f $exe);
+  error ("$xml does not exist") if (! -f $xml);
+  error ("$man already exists") if (-f $man);
+
+  local *IN;
+  open (IN, "<$xml") || error ("$xml: $!");
+  my $xmltxt = "";
+  while (<IN>) { $xmltxt .= $_; }
+  close IN;
+
+  my $args = "";
+  my $body = "";
+  my $desc;
+
+  $xmltxt =~ s/\s+/ /gs;
+  $xmltxt =~ s/<!--.*?-->//g;
+  $xmltxt =~ s@(<[^/])@\n$1@gs;
+
+  foreach (split ('\n', $xmltxt)) {
+    next if m/^$/;
+    next if m/^<\?xml\b/;
+    next if m/^<screensaver\b/;
+    next if m/^<command\b/;
+    next if m/^<[hv]group\b/;
+    next if m/^<select\b/;
+
+    my ($x,$arg) = m@\barg(|-unset|-set)=\"([^\"]+)\"@;
+    my ($label)  = m@\b_?label=\"([^\"]+)\"@;
+    my ($low)    = m@\blow=\"([^\"]+)\"@;
+    my ($hi)     = m@\bhigh=\"([^\"]+)\"@;
+    my ($def)    = m@\bdefault=\"([^\"]+)\"@;
+
+    $arg =~ s@\s*\%\s*@ \\fInumber\\fP@g if ($arg);
+                         
+    my $carg = $arg;
+    my $boolp = m/^<boolean/;
+
+    if ($arg && $arg =~ m/^-no(-.*)/) {
+      $arg = "$1 | \\$arg";
+    } elsif ($boolp && $arg) {
+      $arg = "$arg | \\-no$arg";
+    }
+
+    if ($carg && $carg =~ m/colors/) {
+      $hi = $low = undef;
+    }
+
+    if (!$carg) {
+    } elsif ($carg eq '-move' || $carg eq '-no-move' ||
+             $carg eq '-wander' || $carg eq '-no-wander') {
+      $label = "Whether the object should wander around the screen.";
+    } elsif ($boolp && ($carg eq '-spin' || $carg eq '-no-spin')) {
+      $label = "Whether the object should spin.";
+    } elsif ($carg eq '-spin X') {
+      $carg = '-spin \fI[XYZ]\fP';
+      $arg = $carg;
+      $label = "Around which axes should the object spin?";
+    } elsif ($carg eq '-fps' || $carg eq '-no-fps') {
+      $label = "Whether to show a frames-per-second display " .
+               "at the bottom of the screen.";
+    } elsif ($carg eq '-wireframe' || $carg eq '-wire') {
+      $label = "Render in wireframe instead of solid.";
+    } elsif ($carg =~ m/^-delay/ && $hi && $hi >= 10000) {
+      $label = "Per-frame delay, in microseconds.";
+      $def = sprintf ("%d (%0.2f seconds.)", $def, ($def/1000000.0));
+      $low = $hi = undef;
+    } elsif ($boolp) {
+      $label .= ".  Boolean.";
+    } elsif ($label) {
+      $label .= ".";
+    }
+
+    if (m/^<(number|boolean|option)/) {
+
+      next if (!$arg && m/<option/);
+      if (!$label) {
+        print STDERR "$progname: ERROR: no label: $_\n";
+        $label = "???";
+      }
+
+      $args .= "[\\$carg]\n";
+
+      $label .= "  $low - $hi." if (defined($low) && defined($hi));
+      $label .= "  Default: $def." if (defined ($def));
+      $label = wrap ("", "", $label);
+
+      $body .= ".TP 8\n.B \\$arg\n$label";
+      $body .= "\n";
+
+    } elsif (m@^<_description>\s*(.*)\s*</_description>@) {
+      $desc = $1;
+    } else {
+      print STDERR "$progname: ERROR: UNKNOWN: $_\n";
+    }
+  }
+
+  $desc = "Something pretty." unless $desc;
+
+  my $author = undef;
+  if ($desc =~ m@^(.*?)\s*(Written by|By) ([^.]+\.?\s*)$@s) {
+    $desc = $1;
+    $author = $3;
+    $author =~ s/\s*[.]\s*$//;
+  }
+
+  if (!$author) {
+    print STDERR "$progname: $exe: WARNING: unknown author\n";
+    $author = "UNKNOWN";
+  }
+
+  $desc = wrap ("", "", $desc);
+
+  $body = (".TH XScreenSaver 1 \"\" \"X Version 11\"\n" .
+           ".SH NAME\n" .
+           "$exe - screen saver.\n" .
+           ".SH SYNOPSIS\n" .
+           ".B $exe\n" .
+           $default_args .
+           $args .
+           ".SH DESCRIPTION\n" .
+           $desc . "\n" .
+           ".SH OPTIONS\n" .
+           $default_options .
+           $body .
+           $man_suffix);
+
+  $body =~ s/%AUTHOR%/$author/g;
+
+#print $body; exit 0;
+
+  local *OUT;
+  open (OUT, ">$man") || error ("$man: $!");
+  print OUT $body || error ("$man: $!");
+  close OUT || error ("$man: $!");
+  print STDERR "$progname: wrote $man\n";
+}
+
+
+sub error {
+  ($_) = @_;
+  print STDERR "$progname: $_\n";
+  exit 1;
+}
+
+sub usage {
+  print STDERR "usage: $progname [--verbose] programs...\n";
+  exit 1;
+}
+
+sub main {
+  my @progs = ();
+  while ($_ = $ARGV[0]) {
+    shift @ARGV;
+    if ($_ eq "--verbose") { $verbose++; }
+    elsif (m/^-v+$/) { $verbose += length($_)-1; }
+    elsif (m/^-./) { usage; }
+    else { push @progs, $_; }
+  }
+
+  usage() if ($#progs < 0);
+
+  foreach (@progs) { xml2man($_); }
+}
+
+main;
+exit 0;
index a4b3e2afcd96b33eba34a110b83ec4fcb512df5e..251c036220dbb9ef9145dbb28372e998b60aac92 100644 (file)
@@ -26,7 +26,12 @@ extern char *progname;
 #if defined(HAVE_GDK_PIXBUF)
 
 # include <gdk-pixbuf/gdk-pixbuf.h>
-# include <gdk-pixbuf/gdk-pixbuf-xlib.h>
+
+# ifdef HAVE_GTK2
+#  include <gdk-pixbuf-xlib/gdk-pixbuf-xlib.h>
+# else  /* !HAVE_GTK2 */
+#  include <gdk-pixbuf/gdk-pixbuf-xlib.h>
+# endif /* !HAVE_GTK2 */
 
 
 /* Returns a Pixmap structure containing the bits of the given XPM image.
@@ -42,17 +47,27 @@ xpm_to_pixmap_1 (Display *dpy, Window window,
   GdkPixbuf *pb;
   static int initted = 0;
   XWindowAttributes xgwa;
+#ifdef HAVE_GTK2
+  GError *gerr = NULL;
+#endif /* HAVE_GTK2 */
   XGetWindowAttributes (dpy, window, &xgwa);
 
   if (!initted)
     {
+#ifdef HAVE_GTK2
+      g_type_init ();
+#endif /* HAVE_GTK2 */
       gdk_pixbuf_xlib_init (dpy, screen_number (xgwa.screen));
       xlib_rgb_init (dpy, xgwa.screen);
       initted = 1;
     }
 
   pb = (filename
-        ? gdk_pixbuf_new_from_file (filename)
+#ifdef HAVE_GTK2
+        ? gdk_pixbuf_new_from_file (filename, &gerr)
+#else  /* !HAVE_GTK2 */
+       ? gdk_pixbuf_new_from_file (filename)
+#endif /* !HAVE_GTK2 */
         : gdk_pixbuf_new_from_xpm_data ((const char **) xpm_data));
   if (pb)
     {
@@ -81,7 +96,12 @@ xpm_to_pixmap_1 (Display *dpy, Window window,
     }
   else if (filename)
     {
+#ifdef HAVE_GTK2
+      fprintf (stderr, "%s: %s\n", progname, gerr->message);
+      g_error_free (gerr);
+#else /* !HAVE_GTK2 */
       fprintf (stderr, "%s: unable to load %s\n", progname, filename);
+#endif /* !HAVE_GTK2 */
       exit (-1);
     }
   else
diff --git a/hacks/xrayswarm.man b/hacks/xrayswarm.man
new file mode 100644 (file)
index 0000000..f24a58e
--- /dev/null
@@ -0,0 +1,49 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+xrayswarm - swarms with color trails.
+.SH SYNOPSIS
+.B xrayswarm
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+.SH DESCRIPTION
+Draws a few swarms of critters flying around the screen, with nicely faded
+color trails behind them.
+.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: 0 (0.00 seconds.).
+.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 Chris Leger.  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
+Chris Leger.
index 78d7e1e2ccc47efd4e60ad046ef9a00d6157631d..0e3c4a15f7a4629afb89c36b96697c7064ba06d5 100644 (file)
+2002-05-25  Jacob Berkman  <jacob@ximian.com>
+
+       * Makefile.in.in (MKINSTALLDIRS): maybe fix build
+
+2002-05-17  Wang Jian  <lark@linux.net.cn>
+
+       * zh_CN.po: Added Simplified Chinese translation by
+       He Qiangqiang <carton@linux.net.cn>.
+       
+2002-05-06  jacob berkman  <jacob@ximian.com>
+
+       * POTFILES.in: update
+
+2002-05-01  Germán Poo-Caamaño  <gpoo@ubiobio.cl>
+
+       * es.po: Updated Spanish translation from
+       Guillermo Movia <gmovia@hotpop.com> and converted to UTF-8
+
+2002-04-29  Pablo Saratxaga  <pablo@mandrakesoft.com>
+
+       * wa.po: Updated Walloon file
+
 2002-04-27  Duarte Loreto <happyguy_pt@hotmail.com>
 
         * pt.po: Added Portuguese translation.
 
+2002-04-26  Tõivo Leedjärv  <toivo@linux.ee>
+
+        * et.po: Updated Estonian translation.
+
+2002-04-26  Ole Laursen  <olau@hardworking.dk>
+
+       * da.po: Updated Danish translation.
+
+2002-04-22  Jacob Berkman  <jacob@ximian.com>
+
+       * POTFILES.in: add cubenetic.xml (marcel telka <marcel@telka.sk>
+
 2002-04-21  Kjartan Maraas  <kmaraas@gnome.org>
 
        * no.po: Updated Norwegian (bokmål) translation.
-       
+
 2002-04-19  jacob berkman  <jacob@ximian.com>
 
        * POTFILES.in: add some files
 
+2002-04-08  Stanislav Visnovsky  <visnovsky@nenya.ms.mff.cuni.cz>
+
+       * sk.po: Updated Slovak translation by Marcel Telka <marcel@telka.sk>.
+
+2002-04-06  Ole Laursen  <olau@hardworking.dk>
+
+       * da.po: Updated Danish translation.
+
+2002-04-02  Stanislav Visnovsky  <visnovsky@nenya.ms.mff.cuni.cz>
+
+       * sk.po: Updated Slovak translation by Marcel Telka <marcel@telka.sk>.
+
+2002-04-01  Duarte Loreto <happyguy_pt@hotmail.com>
+
+        * pt.po: Updated Portuguese translation.
+
+2002-03-31  Christian Rose  <menthos@menthos.com>
+
+       * sv.po: Updated Swedish translation (not complete yet).
+
+2002-03-29  Zbigniew Chyla  <cyba@gnome.pl>
+
+       * pl.po: Updated Polish translation by
+       GNOME PL Team <translators@gnome.pl>.
+
+2002-03-27  Duarte Loreto <happyguy_pt@hotmail.com>
+
+        * pt.po: Updated Portuguese translation.
+
+2002-03-27  Abel Cheung  <maddog@linux.org.hk>
+
+       * zh_TW.po: New traditional Chinese translation.
+
+2002-03-25  Stanislav Visnovsky  <visnovsky@nenya.ms.mff.cuni.cz>
+
+       * sk.po: Added initial Slovak translation Marcel Telka <marcel@telka.sk>.
+
+2002-03-24  jacob berkman  <jacob@ximian.com>
+
+       * POTFILES.in: remove demo-Gtk-widgets.c, add demo-Gtk.c (not a
+       permanent fix)
+
+2002-03-23  Ole Laursen  <olau@hardworking.dk>
+
+       * da.po: Added Danish translation.
+
+2002-03-23  Zbigniew Chyla  <cyba@gnome.pl>
+
+       * pl.po: Updated Polish translation by
+       GNOME PL Team <translators@gnome.pl>.
+
+2002-03-22  Tõivo Leedjärv  <toivo@linux.ee>
+
+       * et.po: Added Estonian translation.
+
+2002-03-19  jacob berkman  <jacob@ximian.com>
+
+       * POTFILES.in: add xscreensaver-demo.glade2
+
+2002-03-18  Vincent van Adrighem <V.vanAdrighem@dirck.mine.nu>
+
+       * nl.po: Added dutch translation (from stable controlcenter)
+       
+2002-03-18  Kjartan Maraas  <kmaraas@gnome.org>
+
+       * no.po: Updated Norwegian (bokmål) translation.
+       
+2002-03-18  Valek Filippov  <frob@df.ru>
+
+       * ru.po: updated russian translation.
+
+2002-03-18  Christophe Merlet <redfox@eikonex.org>
+
+       * fr.po: Updated French translation.
+
+2002-03-18  Carlos Perelló Marín <carlos@gnome-db.org>
+
+       * es.po: Fixed a dup string.
+       * POTFILES.in: Added missing files.
+
+2002-03-15  jacob berkman  <jacob@ximian.com>
+
+       * Makefile.in.in (DESTDIR): set to $(install_prefix)
index ca1ab6b297c193e5ec9a70cf5004bd254d2b0832..d01dcdd49e8b4fd61583b4e59df1451d8d23ed0b 100644 (file)
@@ -106,9 +106,16 @@ localedir = $(datadir)/locale
 gnulocaledir = $(localedir)
 #gettextsrcdir = $(prefix)/share/glib-2.0/gettext/po
 subdir = po
+DESTDIR = $(install_prefix)
 
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
+
+# #### NO.  This gets me "..//usr/bin/install: No such file or directory".
+# The @MKINSTALLDIRS@ variable must have the absolute (or unqualified)
+# path of the install program.  --jwz.
+# MKINSTALLDIRS = $(top_builddir)/@MKINSTALLDIRS@
+
 MKINSTALLDIRS = @MKINSTALLDIRS@
 
 CC = @CC@
index 20509bfb55cde30f68084a677aec52822f7051e4..256102d73bec5da6bb29ef0026a3e9ef1633ffdc 100644 (file)
@@ -1,10 +1,11 @@
-# Auto-generated: Sat May 11 02:41:43 PDT 2002
+# Auto-generated: Fri May 31 20:43:52 PDT 2002
 driver/demo-Gtk-conf.c
 driver/demo-Gtk-support.c
 driver/demo-Gtk-widgets.c
 driver/demo-Gtk.c
 driver/screensaver-properties.desktop.in
 driver/xscreensaver-demo.glade
+hacks/config/anemone.xml
 hacks/config/ant.xml
 hacks/config/apollonian.xml
 hacks/config/atlantis.xml
@@ -74,6 +75,7 @@ hacks/config/kaleidescope.xml
 hacks/config/kumppa.xml
 hacks/config/lament.xml
 hacks/config/laser.xml
+hacks/config/lavalite.xml
 hacks/config/lightning.xml
 hacks/config/lisa.xml
 hacks/config/lissie.xml
@@ -100,6 +102,7 @@ hacks/config/polyominoes.xml
 hacks/config/pulsar.xml
 hacks/config/pyro.xml
 hacks/config/qix.xml
+hacks/config/queens.xml
 hacks/config/rd-bomb.xml
 hacks/config/ripples.xml
 hacks/config/rocks.xml
diff --git a/screenblank.txt b/screenblank.txt
deleted file mode 100644 (file)
index 1762158..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-From mrapple@quack.kfu.com Mon Apr 26 18:31:07 1993
-Newsgroups: alt.hackers
-From: mrapple@quack.kfu.com (Nick Sayer)
-Subject: screenblank and xautolock living in harmony
-Organization: The Duck Pond public unix: +1 408 249 9630, log in as 'guest'.
-Date: 23 Apr 1993 19:26:57 UTC
-
-
-I have a Sun and use xinit to start X. This presented a problem.
-If I use xautolock or xscreensaver to save the screen, then after
-a period of inactivity screenblank would turn the video off despite
-'xset s off'. If I didn't run screenblank, then who would take care of
-the display when X wasn't running?
-
-The hack that saved the day was to include this in .xinitrc:
-
-(
-
-while true ; do
-sleep 360
-touch /dev/console
-done
-
-) &
-killblank=$!
-
-[start up all the clients, etc, etc. Wait for the window manager
-to die, then ]
-
-kill $killblank
-
-The result is that screenblank is kept safely out of the way when X
-is running and left to do its job otherwise.
-
-Yes, I know using XDM would solve this problem.
-
-No, I'm probably not the first to think of this.
-
-You're welcome.
-
--- 
-Nick Sayer <mrapple@quack.kfu.com>   | "Dear Sexy Nickers. I don't half fancy
-N6QQQ @ N0ARY.#NOCAL.CA.USA.NOAM     | you. Meet me at the lift at 5:30 and
-+1 408 249 9630, log in as 'guest'   | we'll get it together."
-PGP 2.2 public key via finger        |               -- Mr. Lucas
-
index 1261a42efaf3376ea17596b5ea777625868701a0..5bd4e30d96a4cd59590ceffaeb435a34d783dbc9 100644 (file)
--- a/setup.com
+++ b/setup.com
@@ -3,6 +3,7 @@ $ set NOON
 $ set def [.HACKS]
 $ mydisk = f$trnlmn("SYS$DISK")
 $ mydir  = mydisk+f$directory()
+$ anemone      :== $'mydir'anemone
 $ ant          :== $'mydir'ant
 $ apollonian   :== $'mydir'apollonian
 $ attraction   :== $'mydir'attraction
index 2af9dea0b11299ce0c1f8801acef651124889bd7..93407d9601e06630c75947f42c68afeafd0b9494 100644 (file)
@@ -1,2 +1,2 @@
 static const char screensaver_id[] =
-       "@(#)xscreensaver 4.03 (30-Apr-2002), by Jamie Zawinski (jwz@jwz.org)";
+       "@(#)xscreensaver 4.04 (28-May-2002), by Jamie Zawinski (jwz@jwz.org)";
index bb108225a996eaac679fb4c5d47a2187fd7e7a97..50c641451ffe64c101ee1afaaa6664e57bc91001 100644 (file)
@@ -13,7 +13,6 @@
 #define __XSCREENSAVER_INTL_H__
 
 #ifdef ENABLE_NLS
-
 # include <libintl.h>
 # define _(String) dgettext(GETTEXT_PACKAGE,(String))
 # ifdef gettext_noop
@@ -34,8 +33,4 @@
 
 #endif /* !ENABLE_NLS */
 
-#ifndef HAVE_BINDTEXTDOMAIN_CODESET
-# define bindtextdomain_codeset(Domain,Codeset) (Domain)
-#endif
-
 #endif /* __XSCREENSAVER_INTL_H__ */
index 13e5944999d4db3170c50427ca4baf240daadf40..52c4e93e859f4f6e2071bea5d1d5b5cd021b9fe5 100644 (file)
@@ -1,7 +1,7 @@
 Begin3
 Title:          xscreensaver
-Version:        4.03
-Entered-date:   11MAY02
+Version:        4.04
+Entered-date:   31MAY02
 Description:    A modular screen saver and locker for the X Window System.
                 Highly customizable: allows the use of any program that
                 can draw on the root window as a display mode.
@@ -10,16 +10,16 @@ Keywords:       screen saver, screen lock, lock, xlock, X11
 Author:         jwz@jwz.org (Jamie Zawinski)
 Maintained-by:  jwz@jwz.org (Jamie Zawinski)
 Primary-site:   http://www.jwz.org/xscreensaver/
-                2879K xscreensaver-4.03.tar.gz
-                58K   xscreensaver.README
+                 xscreensaver-4.04.tar.gz
+                59K   xscreensaver.README
                 1K    xscreensaver.lsm
 Alternate-site: sunsite.unc.edu /pub/Linux/X11/screensavers/
-                2879K xscreensaver-4.03.tar.gz
-                58K   xscreensaver.README
+                 xscreensaver-4.04.tar.gz
+                59K   xscreensaver.README
                 1K    xscreensaver.lsm
 Alternate-site: ftp.x.org /contrib/applications/
-                2879K xscreensaver-4.03.tar.gz
-                58K   xscreensaver.README
+                 xscreensaver-4.04.tar.gz
+                59K   xscreensaver.README
                 1K    xscreensaver.lsm
 Platforms:      Linux, Irix, SunOS, Solaris, HPUX, AIX, FreeBSD, NetBSD,
                 BSDI, SCO, OSF1, Ultrix, VMS.
index 982686185cc9b6a01189cca116bd1bf30805332b..088bacbc1f453d06322272c036a044d984777d4d 100644 (file)
@@ -1,15 +1,11 @@
 %define        name            xscreensaver
-%define        version         4.03
+%define        version         4.04
 %define        release         1
 %define        serial          1
 %define        x11_prefix      /usr/X11R6
 %define        gnome_prefix    /usr
 %define        kde_prefix      /usr
-
 %define gnome_datadir  %{gnome_prefix}/share
-%define gnome_ccdir    %{gnome_datadir}/control-center/Desktop
-%define gnome_paneldir %{gnome_datadir}/gnome/apps/Settings/Desktop
-%define gnome_icondir  %{gnome_datadir}/pixmaps
 
 # By default, builds the basic, non-GL package.
 # To build both the basic and GL-add-on packages:
@@ -60,11 +56,6 @@ More than 140 display modes are included in this package.
 %build
 RPMOPTS=""
 
-# Is this really needed?  If so, why?
-# %ifarch alpha
-#  RPMOPTS="$RPMOPTS --without-xshm-ext"
-# %endif
-
 # On Solaris, build without PAM and with Shadow.
 # On other systems, build with PAM and without Shadow.
 #
@@ -90,22 +81,12 @@ make
 
 archdir=`./config.guess`
 
-# Most xscreensaver executables go in the X bin directory (/usr/X11R6/bin/)
-# but some of them (e.g., the control panel capplet) go in the GNOME bin
-# directory instead (/usr/bin/).
-#
-mkdir -p $RPM_BUILD_ROOT%{gnome_prefix}/bin
-mkdir -p $RPM_BUILD_ROOT%{gnome_ccdir}
-mkdir -p $RPM_BUILD_ROOT%{gnome_paneldir}
-
-# Likewise for KDE: the .kss file goes in the KDE bin directory (/usr/bin/).
+# We have to make sure these directories exist,
+# or nothing will be installed into them.
 #
 export KDEDIR=%{kde_prefix}
 mkdir -p $RPM_BUILD_ROOT$KDEDIR/bin
-
-# This is a directory that "make install" won't make as needed
-# (since Linux uses /etc/pam.d/* and Solaris uses /etc/pam.conf).
-#
+mkdir -p $RPM_BUILD_ROOT%{gnome_datadir}
 mkdir -p $RPM_BUILD_ROOT/etc/pam.d
 
 cd $archdir
@@ -114,29 +95,39 @@ make  install_prefix=$RPM_BUILD_ROOT \
       GNOME_BINDIR=%{gnome_prefix}/bin \
       install-strip
 
-# Make a pair of lists, of the GL and non-GL executables.
-# Do this by parsing the output of a dummy run of "make install"
-# in the driver/, hacks/ and hacks/glx/ directories.
+# This function prints a list of things that get installed.
+# It does this by parsing the output of a dummy run of "make install".
 #
 list_files() {
   make -s install_prefix=$RPM_BUILD_ROOT INSTALL=true           \
           GNOME_BINDIR=%{gnome_prefix}/bin                      \
           "$@"                                                  |
-    sed -n -e 's@.* /\([^ ]*\)$@/\1@p'                          |
+    sed -n -e 's@.* \(/[^ ]*\)$@\1@p'                           |
     sed    -e "s@^$RPM_BUILD_ROOT@@"                            \
-           -e "s@/bin/\.\./@/@"                                 |
+           -e "s@/[a-z][a-z]*/\.\./@/@"                         |
     sed    -e 's@\(.*/man/.*\)@\1\*@'                           |
     sort
 }
 
-( cd hacks ; list_files install ; \
-  cd ../driver; list_files install-program install-scripts ) \
-   > $RPM_BUILD_DIR/xscreensaver-%{version}/exes-non-gl
+# Collect the names of the non-GL executables and scripts...
+# (Including the names of all of the Gnome, KDE, and L10N-related files,
+# whereever they might have gotten installed...)
+# For the translation catalogs, prepend an appropriate %lang(..) tag.
+#
+(  cd    hacks ; list_files install ; \
+   cd ../driver; list_files install-program install-scripts \
+                            install-gnome install-kde ; \
+ ( cd ../po;     list_files install | grep '\.' \
+    | sed 's@^\(.*/\([^/]*\)/LC.*\)$@%lang(\2) \1@' ) \
+) > $RPM_BUILD_DIR/xscreensaver-%{version}/exes-non-gl
+
+
+# Collect the names of the GL-only executables...
+#
 ( cd hacks/glx ; list_files install ) \
    | grep -v man1/xscreensaver-gl-helper \
    > $RPM_BUILD_DIR/xscreensaver-%{version}/exes-gl
 
-
 # This line is redundant, except that it causes the "xscreensaver"
 # executable to be installed unstripped (while all others are stripped.)
 # You should install it this way so that jwz gets useful bug reports.
@@ -166,26 +157,18 @@ fi
 if [ -d $RPM_BUILD_ROOT    ]; then rm -r $RPM_BUILD_ROOT    ; fi
 if [ -d $RPM_BUILD_ROOT-gl ]; then rm -r $RPM_BUILD_ROOT-gl ; fi
 
-%files -f exes-non-gl
-%defattr(-,root,root)
-
 # Files for the "xscreensaver" package:
 #
-%doc                README README.debugging
-%dir                %{x11_prefix}/lib/xscreensaver
-%config             %{x11_prefix}/lib/X11/app-defaults/*
-                    %{x11_prefix}/man/man1/xscreensaver*
-                    /etc/pam.d/*
-
-%config(missingok)  %{kde_prefix}/bin/*.kss
-
-%config(missingok)  %{gnome_prefix}/bin/*-capplet
-%config(missingok)  %{gnome_ccdir}/*.desktop
-%config(missingok)  %{gnome_paneldir}/*.desktop
-%config(missingok)  %{gnome_icondir}/*
+%files -f exes-non-gl
+%defattr(-,root,root)
 
-%config(missingok)  %{gnome_prefix}/share/locale/
+%doc    README README.debugging
+%dir    %{x11_prefix}/lib/xscreensaver
+%config %{x11_prefix}/lib/X11/app-defaults/*
+        %{x11_prefix}/man/man1/xscreensaver*
+%config /etc/pam.d/*
 
 # Files for the "xscreensaver-gl" package:
 #
 %{?USE_GL:%files -f exes-gl gl}
+%{?USE_GL:%defattr(-,root,root)}