From 13dbc569cdc6e29019722c0ef9b932a925efbcad Mon Sep 17 00:00:00 2001 From: Zygo Blaxell Date: Mon, 2 Mar 2009 00:42:55 -0500 Subject: [PATCH] http://packetstormsecurity.org/UNIX/admin/xscreensaver-4.04.2.tar.gz -rw-r--r-- 1 zblaxell zblaxell 2901618 Jun 3 2002 xscreensaver-4.04.2.tar.gz 9b5ebf93c0ad4373d84b66a68c9b05559d0c5672 xscreensaver-4.04.2.tar.gz --- Makefile.in | 5 +- README | 22 + config.h.in | 7 +- configure | 790 ++++++-- configure.in | 586 ++++-- driver/Makefile.in | 104 +- driver/XScreenSaver.ad.in | 7 +- driver/XScreenSaver_ad.h | 3 + driver/demo-Gtk-conf.c | 4 +- driver/demo-Gtk.c | 441 ++++- driver/screensaver-properties.desktop.in | 2 + driver/windows.c | 2 +- driver/xscreensaver-command.man | 2 +- driver/xscreensaver-demo.glade | 2 + driver/xscreensaver-demo.glade2 | 2162 ++++++++++++++++++++++ driver/xscreensaver-demo.man | 2 +- driver/xscreensaver-getimage-file.man | 2 +- driver/xscreensaver-getimage-video.man | 2 +- driver/xscreensaver-getimage.c | 257 ++- driver/xscreensaver-getimage.man | 2 +- driver/xscreensaver.man | 15 +- hacks/Makefile.in | 96 +- hacks/anemone.c | 414 +++++ hacks/anemone.man | 60 + hacks/ant.man | 83 + hacks/apollonian.man | 66 + hacks/blaster.man | 61 + hacks/ccurve.man | 56 + hacks/compass.man | 53 + hacks/compile_axp.com | 1 + hacks/compile_decc.com | 1 + hacks/config/README | 4 +- hacks/config/anemone.xml | 38 + hacks/config/blitspin.xml | 2 +- hacks/config/coral.xml | 3 +- hacks/config/fluidballs.xml | 1 + hacks/config/lavalite.xml | 63 + hacks/config/queens.xml | 20 + hacks/config/rotor.xml | 4 +- hacks/config/t3d.xml | 2 +- hacks/coral.man | 60 + hacks/crystal.man | 77 + hacks/cynosure.man | 60 + hacks/deluxe.c | 8 +- hacks/deluxe.man | 68 + hacks/demon.man | 65 + hacks/discrete.man | 57 + hacks/euler2d.man | 65 + hacks/fadeplot.man | 61 + hacks/flow.man | 89 + hacks/fluidballs.man | 89 + hacks/glx/Makefile.in | 155 +- hacks/glx/atlantis.man | 78 + hacks/glx/boxed.man | 56 + hacks/glx/bubble3d.man | 53 + hacks/glx/cage.man | 53 + hacks/glx/circuit.man | 72 + hacks/glx/cubenetic.c | 204 +- hacks/glx/cubenetic.man | 89 + hacks/glx/dangerball.c | 208 +-- hacks/glx/dangerball.man | 72 + hacks/glx/engine.man | 60 + hacks/glx/extrusion.c | 235 +-- hacks/glx/extrusion.man | 71 + hacks/glx/flipscreen3d.man | 57 + hacks/glx/fps.c | 8 +- hacks/glx/gears.c | 132 +- hacks/glx/gears.man | 65 + hacks/glx/gflux.c | 26 +- hacks/glx/glplanet.c | 180 +- hacks/glx/glplanet.man | 66 + hacks/glx/gltext.c | 231 +-- hacks/glx/gltrackball.c | 75 + hacks/glx/gltrackball.h | 41 + hacks/glx/lament.c | 179 +- hacks/glx/lavalite.c | 1597 ++++++++++++++++ hacks/glx/lavalite.man | 162 ++ hacks/glx/marching.c | 671 +++++++ hacks/glx/marching.h | 48 + hacks/glx/menger.c | 199 +- hacks/glx/menger.man | 78 + hacks/glx/moebius.c | 161 +- hacks/glx/moebius.man | 65 + hacks/glx/molecule.c | 215 +-- hacks/glx/morph3d.man | 57 + hacks/glx/pipes.man | 85 + hacks/glx/pulsar.man | 102 + hacks/glx/queens.c | 488 +++++ hacks/glx/queens.man | 59 + hacks/glx/rotator.c | 243 +++ hacks/glx/rotator.h | 60 + hacks/glx/rubik.man | 69 + hacks/glx/sierpinski3d.c | 206 +-- hacks/glx/sierpinski3d.man | 67 + hacks/glx/spheremonics.c | 272 ++- hacks/glx/spheremonics.man | 92 + hacks/glx/sproingies.man | 64 + hacks/glx/stairs.man | 56 + hacks/glx/stonerview.man | 49 + hacks/glx/superquadrics.man | 70 + hacks/glx/trackball.c | 325 ++++ hacks/glx/trackball.h | 82 + hacks/glx/xpm-ximage.c | 24 +- hacks/images/matrix0.xbm | 18 +- hacks/images/matrix0.xpm | 775 ++++---- hacks/images/matrix0b.xbm | 16 +- hacks/images/matrix0b.xpm | 335 ++-- hacks/images/matrix1.xbm | 42 +- hacks/images/matrix1.xpm | 785 ++++---- hacks/images/matrix1b.xbm | 22 +- hacks/images/matrix1b.xpm | 413 +++-- hacks/images/matrix2.xbm | 54 +- hacks/images/matrix2.xpm | 787 ++++---- hacks/images/matrix2b.xbm | 24 +- hacks/images/matrix2b.xpm | 428 +++-- hacks/interference.man | 78 + hacks/juggle.man | 56 + hacks/kumppa.man | 61 + hacks/lissie.man | 65 + hacks/loop.man | 61 + hacks/moire2.man | 59 + hacks/mountain.man | 56 + hacks/polyominoes.man | 61 + hacks/ripples.man | 82 + hacks/rotor.man | 64 + hacks/screenhack.c | 23 +- hacks/shadebobs.man | 61 + hacks/thornbird.man | 60 + hacks/triangle.man | 52 + hacks/truchet.man | 135 ++ hacks/vermiculate.man | 44 + hacks/vidwhacker | 23 +- hacks/wander.man | 72 + hacks/webcollage | 216 ++- hacks/webcollage-helper.c | 47 +- hacks/webcollage.man | 92 +- hacks/worm.man | 61 + hacks/xlockmore.c | 26 +- hacks/xlockmore.h | 15 +- hacks/xlockmoreI.h | 5 +- hacks/xmatrix.c | 255 ++- hacks/xml2man.pl | 250 +++ hacks/xpm-pixmap.c | 24 +- hacks/xrayswarm.man | 49 + po/ChangeLog | 119 +- po/Makefile.in.in | 7 + po/POTFILES.in | 5 +- screenblank.txt | 46 - setup.com | 1 + utils/version.h | 2 +- utils/xscreensaver-intl.h | 5 - xscreensaver.lsm | 16 +- xscreensaver.spec | 79 +- 153 files changed, 16254 insertions(+), 4156 deletions(-) create mode 100644 driver/xscreensaver-demo.glade2 create mode 100644 hacks/anemone.c create mode 100644 hacks/anemone.man create mode 100644 hacks/ant.man create mode 100644 hacks/apollonian.man create mode 100644 hacks/blaster.man create mode 100644 hacks/ccurve.man create mode 100644 hacks/compass.man create mode 100644 hacks/config/anemone.xml create mode 100644 hacks/config/lavalite.xml create mode 100644 hacks/config/queens.xml create mode 100644 hacks/coral.man create mode 100644 hacks/crystal.man create mode 100644 hacks/cynosure.man create mode 100644 hacks/deluxe.man create mode 100644 hacks/demon.man create mode 100644 hacks/discrete.man create mode 100644 hacks/euler2d.man create mode 100644 hacks/fadeplot.man create mode 100644 hacks/flow.man create mode 100644 hacks/fluidballs.man create mode 100644 hacks/glx/atlantis.man create mode 100644 hacks/glx/boxed.man create mode 100644 hacks/glx/bubble3d.man create mode 100644 hacks/glx/cage.man create mode 100644 hacks/glx/circuit.man create mode 100644 hacks/glx/cubenetic.man create mode 100644 hacks/glx/dangerball.man create mode 100644 hacks/glx/engine.man create mode 100644 hacks/glx/extrusion.man create mode 100644 hacks/glx/flipscreen3d.man create mode 100644 hacks/glx/gears.man create mode 100644 hacks/glx/glplanet.man create mode 100644 hacks/glx/gltrackball.c create mode 100644 hacks/glx/gltrackball.h create mode 100644 hacks/glx/lavalite.c create mode 100644 hacks/glx/lavalite.man create mode 100644 hacks/glx/marching.c create mode 100644 hacks/glx/marching.h create mode 100644 hacks/glx/menger.man create mode 100644 hacks/glx/moebius.man create mode 100644 hacks/glx/morph3d.man create mode 100644 hacks/glx/pipes.man create mode 100644 hacks/glx/pulsar.man create mode 100644 hacks/glx/queens.c create mode 100644 hacks/glx/queens.man create mode 100644 hacks/glx/rotator.c create mode 100644 hacks/glx/rotator.h create mode 100644 hacks/glx/rubik.man create mode 100644 hacks/glx/sierpinski3d.man create mode 100644 hacks/glx/spheremonics.man create mode 100644 hacks/glx/sproingies.man create mode 100644 hacks/glx/stairs.man create mode 100644 hacks/glx/stonerview.man create mode 100644 hacks/glx/superquadrics.man create mode 100644 hacks/glx/trackball.c create mode 100644 hacks/glx/trackball.h create mode 100644 hacks/interference.man create mode 100644 hacks/juggle.man create mode 100644 hacks/kumppa.man create mode 100644 hacks/lissie.man create mode 100644 hacks/loop.man create mode 100644 hacks/moire2.man create mode 100644 hacks/mountain.man create mode 100644 hacks/polyominoes.man create mode 100644 hacks/ripples.man create mode 100644 hacks/rotor.man create mode 100644 hacks/shadebobs.man create mode 100644 hacks/thornbird.man create mode 100644 hacks/triangle.man create mode 100644 hacks/truchet.man create mode 100644 hacks/vermiculate.man create mode 100644 hacks/wander.man create mode 100644 hacks/worm.man create mode 100755 hacks/xml2man.pl create mode 100644 hacks/xrayswarm.man delete mode 100644 screenblank.txt diff --git a/Makefile.in b/Makefile.in index ba7f47d8..5268e770 100644 --- a/Makefile.in +++ b/Makefile.in @@ -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 1d05026f..811c4a31 100644 --- 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'. diff --git a/config.h.in b/config.h.in index 05c8ed2f..98d8560c 100644 --- a/config.h.in +++ b/config.h.in @@ -139,12 +139,17 @@ */ #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 diff --git a/configure b/configure index de9a8afe..8bd58380 100755 --- 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 2>&1 | \ + if ( ( gcc -E -std=c89 - /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 @@ -12510,17 +12695,17 @@ fi 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" @@ -12730,6 +12906,25 @@ fi 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" @@ -12737,6 +12932,12 @@ fi #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 @@ -12931,10 +13177,10 @@ fi 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 which is the new way... - # + # first try 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 which is the old way... - # - if test "$have_xml" = no; then + # if that didn't work, then try just which is the old way... + # + if test "$have_xml" = no; then ac_save_CPPFLAGS="$CPPFLAGS" if test \! -z "$includedir" ; then @@ -13057,9 +13303,11 @@ fi 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 < #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 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 @@ -15116,25 +15356,82 @@ fi 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 @@ -15179,10 +15476,10 @@ fi 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 @@ -15322,9 +15638,10 @@ fi 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 +_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 +_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" @@ -15464,13 +15904,13 @@ fi # 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" @@ -15548,13 +15987,13 @@ fi # 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" @@ -15619,11 +16056,13 @@ 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" cat >>confdefs.h <<\_ACEOF #define HAVE_GDK_PIXBUF 1 _ACEOF + else + have_gdk_pixbuf2=no fi fi @@ -17023,16 +17462,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 @@ -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.' diff --git a/configure.in b/configure.in index ae0e4930..901b5a23 100644 --- a/configure.in +++ b/configure.in @@ -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 2>&1 | \ + [if ( ( gcc -E -std=c89 - /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 which is the new way... - # - AC_CHECK_X_HEADER(libxml/xmlIO.h, [have_xml=yes],, - [#include ]) + 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 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 ]) + 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 which is the new way... + # + AC_CHECK_X_HEADER(libxml/xmlIO.h, [have_xml=yes],, + [#include ]) + + # if that didn't work, then try just 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 ]) + 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 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]) @@ -2595,47 +2754,122 @@ fi 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.' diff --git a/driver/Makefile.in b/driver/Makefile.in index fde4e63c..f7012a66 100644 --- a/driver/Makefile.in +++ b/driver/Makefile.in @@ -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 diff --git a/driver/XScreenSaver.ad.in b/driver/XScreenSaver.ad.in index ffd0cd53..10b60265 100644 --- a/driver/XScreenSaver.ad.in +++ b/driver/XScreenSaver.ad.in @@ -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/ @@ -281,6 +281,7 @@ 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)" \ @@ -327,6 +328,8 @@ @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 \ diff --git a/driver/XScreenSaver_ad.h b/driver/XScreenSaver_ad.h index 6d33f018..0d91e8f3 100644 --- a/driver/XScreenSaver_ad.h +++ b/driver/XScreenSaver_ad.h @@ -184,6 +184,7 @@ 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)\" \ @@ -230,6 +231,8 @@ 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 \ diff --git a/driver/demo-Gtk-conf.c b/driver/demo-Gtk-conf.c index 91a305cf..44726c70 100644 --- a/driver/demo-Gtk-conf.c +++ b/driver/demo-Gtk-conf.c @@ -40,9 +40,9 @@ * workaround. */ #ifdef HAVE_OLD_XML_HEADERS -#include +# include #else /* ! HAVE_OLD_XML_HEADERS */ -#include +# include #endif /* HAVE_OLD_XML_HEADERS */ /* diff --git a/driver/demo-Gtk.c b/driver/demo-Gtk.c index 32440ba8..486e4a48 100644 --- a/driver/demo-Gtk.c +++ b/driver/demo-Gtk.c @@ -16,6 +16,8 @@ #ifdef HAVE_GTK /* whole file */ +#include + #include #ifdef HAVE_UNISTD_H @@ -78,6 +80,18 @@ #include +#ifdef HAVE_GTK2 +#include +#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() */ @@ -96,6 +110,13 @@ #include #include +#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 /* 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 */ /* 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. */ { diff --git a/driver/screensaver-properties.desktop.in b/driver/screensaver-properties.desktop.in index ea0489db..436ec83d 100644 --- a/driver/screensaver-properties.desktop.in +++ b/driver/screensaver-properties.desktop.in @@ -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; diff --git a/driver/windows.c b/driver/windows.c index cbc72d76..2ecfdfc0 100644 --- a/driver/windows.c +++ b/driver/windows.c @@ -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; } diff --git a/driver/xscreensaver-command.man b/driver/xscreensaver-command.man index 05bcc5b2..a3622c7a 100644 --- a/driver/xscreensaver-command.man +++ b/driver/xscreensaver-command.man @@ -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 diff --git a/driver/xscreensaver-demo.glade b/driver/xscreensaver-demo.glade index e9b298eb..71f91d4d 100644 --- a/driver/xscreensaver-demo.glade +++ b/driver/xscreensaver-demo.glade @@ -25,6 +25,7 @@ GtkWindow xscreensaver_demo + False XScreenSaver GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE @@ -1879,6 +1880,7 @@ Random Screen Saver GtkDialog xscreensaver_settings_dialog + False XScreenSaver: Mode-Specific Settings GTK_WINDOW_DIALOG GTK_WIN_POS_NONE diff --git a/driver/xscreensaver-demo.glade2 b/driver/xscreensaver-demo.glade2 new file mode 100644 index 00000000..4e519896 --- /dev/null +++ b/driver/xscreensaver-demo.glade2 @@ -0,0 +1,2162 @@ + + + + + + + XScreenSaver + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + xscreensaver + XScreenSaver + True + False + + + + True + False + 5 + + + + True + + + + True + _File + True + + + + + + + True + _Blank Screen Now + True + + + + + + + True + _Lock Screen Now + True + + + + + + + True + _Kill Daemon + True + + + + + + + True + _Restart Daemon + True + + + + + + + True + + + + + + True + _Quit + True + + + + + + + + + + + True + _Help + True + + + + + + + True + _About... + True + + + + + + + True + _Documentation... + True + + + + + + + + + + 0 + False + False + + + + + + True + True + True + True + GTK_POS_TOP + False + 2 + 2 + False + + + + + 10 + True + 2 + 2 + False + 0 + 0 + + + + True + 3 + 4 + False + 2 + 0 + + + + True + _Cycle After + True + False + GTK_JUSTIFY_RIGHT + False + False + 1 + 0.5 + 8 + 0 + cycle_spinbutton + + + 1 + 2 + 1 + 2 + fill + + + + + + + True + Whether a password should be required to un-blank the screen. + + + + True + True + _Lock Screen After + True + GTK_RELIEF_NORMAL + False + False + True + + + + + + 0 + 2 + 2 + 3 + fill + + + + + + + True + _Blank After + True + False + GTK_JUSTIFY_RIGHT + False + False + 1 + 0.5 + 8 + 0 + timeout_spinbutton + + + 1 + 2 + 0 + 1 + fill + + + + + + + True + How long before the monitor goes completely black. + True + 15 + 0 + True + GTK_UPDATE_ALWAYS + True + False + 1 1 720 1 15 15 + + + + + + 2 + 3 + 0 + 1 + fill + + + + + + + True + minutes + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 3 + 4 + 0 + 1 + + + + + + + True + minutes + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 3 + 4 + 1 + 2 + + + + + + + True + minutes + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 3 + 4 + 2 + 3 + + + + + + + True + How long before the monitor goes completely black. + True + 15 + 0 + True + GTK_UPDATE_ALWAYS + True + False + 0 0 720 1 15 15 + + + + + + 2 + 3 + 2 + 3 + 10 + fill + + + + + + + True + How long before the monitor goes completely black. + True + 15 + 0 + True + GTK_UPDATE_ALWAYS + True + False + 1 1 720 1 15 15 + + + + + + 2 + 3 + 1 + 2 + fill + + + + + + 0 + 1 + 1 + 2 + fill + fill + + + + + + True + GTK_BUTTONBOX_SPREAD + 30 + + + + True + True + True + _Preview + True + GTK_RELIEF_NORMAL + + + + + + + True + True + True + _Settings... + True + GTK_RELIEF_NORMAL + + + + + + 1 + 2 + 1 + 2 + fill + fill + + + + + + 10 + True + False + 0 + + + + True + False + 0 + + + + True + _Mode: + True + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + mode_menu + + + 0 + False + False + + + + + + True + True + 0 + + + + True + + + + True + Disable Screen Saver + True + + + + + + True + Blank Screen Only + True + + + + + + True + Only One Screen Saver + True + + + + + + True + Random Screen Saver + True + + + + + + + 4 + True + True + + + + + 10 + False + True + + + + + + True + True + GTK_POLICY_NEVER + GTK_POLICY_ALWAYS + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + False + True + False + True + + + + + 0 + True + True + + + + + + True + True + 0 + + + + True + False + 0 + + + + True + True + GTK_RELIEF_NORMAL + + + + + True + GTK_ARROW_DOWN + GTK_SHADOW_OUT + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + + True + True + GTK_RELIEF_NORMAL + + + + + True + GTK_ARROW_UP + GTK_SHADOW_OUT + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + 0 + False + False + + + + + 0 + False + True + GTK_PACK_END + + + + + 0 + 1 + 0 + 1 + fill + + + + + + True + Description + 0 + GTK_SHADOW_ETCHED_IN + + + + True + True + True + False + GTK_POS_BOTTOM + False + 2 + 2 + False + + + + 8 + True + 0 + GTK_SHADOW_ETCHED_IN + 0.5 + 0.5 + 1.33 + False + + + + True + + Preview of screen saver + + + + + + False + True + + + + + + True + preview + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + tab + + + + + + True + No Preview +Available + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + False + True + + + + + + True + no preview + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + tab + + + + + + + 1 + 2 + 0 + 1 + 6 + expand|shrink|fill + expand|shrink|fill + + + + + False + True + + + + + + True + _Display Modes + True + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 0 + 0 + + + tab + + + + + + True + 2 + 2 + True + 0 + 0 + + + + 10 + True + Image Manipulation + 0 + GTK_SHADOW_ETCHED_IN + + + + 8 + True + False + 8 + + + + True + screensaver-snap.xpm + 0 + 0 + 4 + 8 + + + 0 + False + False + + + + + + True + False + 0 + + + + True + True + Grab Desktop _Images + True + GTK_RELIEF_NORMAL + False + False + True + + + + 0 + False + False + + + + + + True + True + Grab _Video Frames + True + GTK_RELIEF_NORMAL + False + False + True + + + + 0 + False + False + + + + + + True + True + Choose _Random Image: + True + GTK_RELIEF_NORMAL + False + False + True + + + + 0 + False + False + + + + + + True + False + 0 + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 8 + 0 + + + 0 + False + False + + + + + + True + True + True + True + 0 + + True + * + False + + + + + 0 + True + True + + + + + + True + True + _Browse + True + GTK_RELIEF_NORMAL + + + + 0 + False + False + + + + + 0 + False + False + + + + + 0 + True + True + + + + + + + 0 + 1 + 0 + 1 + + + + + + 10 + True + Diagnostics + 0 + GTK_SHADOW_ETCHED_IN + + + + 8 + True + False + 8 + + + + + 0 + False + False + + + + + + True + False + 0 + + + + True + True + _Verbose Dialognostics + True + GTK_RELIEF_NORMAL + False + False + True + + + + 0 + False + False + + + + + + True + True + Display Subprocess _Errors + True + GTK_RELIEF_NORMAL + False + False + True + + + + 0 + False + False + + + + + + True + True + Display _Splash Screen at Startup + True + GTK_RELIEF_NORMAL + False + False + True + + + 0 + False + False + + + + + 0 + True + True + + + + + + + 0 + 1 + 1 + 2 + fill + + + + + + 10 + True + Display Power Management + 0 + GTK_SHADOW_ETCHED_IN + + + + 8 + True + False + 8 + + + + + 0 + False + False + + + + + + True + False + 0 + + + + True + True + _Power Management Enabled + True + GTK_RELIEF_NORMAL + True + False + True + + + + 0 + False + False + + + + + + True + 3 + 3 + False + 2 + 4 + + + + True + Stand_by After + True + False + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 10 + 0 + dpms_standby_spinbutton + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + Sus_pend After + True + False + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 10 + 0 + dpms_suspend_spinbutton + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + _Off After + True + False + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 10 + 0 + dpms_off_spinbutton + + + 0 + 1 + 2 + 3 + fill + + + + + + + True + minutes + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 2 + 3 + 0 + 1 + fill + + + + + + + True + minutes + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 2 + 3 + 1 + 2 + fill + + + + + + + True + minutes + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 2 + 3 + 2 + 3 + fill + + + + + + + True + True + 15 + 0 + True + GTK_UPDATE_ALWAYS + True + False + 0 0 1440 1 15 15 + + + + + + 1 + 2 + 2 + 3 + + + + + + + + True + True + 15 + 0 + True + GTK_UPDATE_ALWAYS + True + False + 0 0 1440 1 15 15 + + + + + + 1 + 2 + 1 + 2 + + + + + + + + True + True + 15 + 0 + True + GTK_UPDATE_ALWAYS + True + False + 0 0 1440 1 15 15 + + + + + + 1 + 2 + 0 + 1 + + + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + + 1 + 2 + 0 + 1 + fill + + + + + + 10 + True + Colormaps + 0 + GTK_SHADOW_ETCHED_IN + + + + 8 + True + False + 8 + + + + True + screensaver-colorselector.xpm + 0.5 + 0 + 0 + 0 + + + 0 + False + False + + + + + + True + False + 0 + + + + True + True + Install _Colormap + True + GTK_RELIEF_NORMAL + False + False + True + + + + 0 + False + False + + + + + + True + + + 4 + False + False + + + + + + True + True + Fade to Black when _Blanking + True + GTK_RELIEF_NORMAL + False + False + True + + + + 0 + False + False + + + + + + True + True + Fade from Black When _Unblanking + True + GTK_RELIEF_NORMAL + False + False + True + + + + 0 + False + False + + + + + + True + False + 0 + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 3 + 0 + + + 0 + False + False + + + + + + True + F_ade Duration + True + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + fade_spinbutton + + + 10 + False + False + + + + + + True + True + 1 + 0 + True + GTK_UPDATE_ALWAYS + True + False + 0 0 10 1 1 1 + + + + + + 0 + True + True + + + + + + True + seconds + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + + 1 + 2 + 1 + 2 + fill + fill + + + + + False + True + + + + + + True + _Advanced + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + tab + + + + + 0 + True + True + + + + + + + + dialog1 + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + False + + + + 2 + True + False + 0 + + + + 5 + True + GTK_BUTTONBOX_END + 10 + + + + True + True + True + _Advanced >> + True + GTK_RELIEF_NORMAL + 0 + + + + + + + True + True + True + _Standard << + True + GTK_RELIEF_NORMAL + 0 + + + + + + + True + True + True + gtk-cancel + True + GTK_RELIEF_NORMAL + -6 + + + + + + + True + True + True + gtk-ok + True + GTK_RELIEF_NORMAL + -5 + + + + + + 0 + False + True + GTK_PACK_END + + + + + + True + False + 8 + + + + True + Settings + 0 + GTK_SHADOW_ETCHED_IN + + + + 12 + True + True + True + False + GTK_POS_BOTTOM + False + 2 + 2 + False + + + + + True + False + 0 + + + + + + + False + True + + + + + + True + Standard + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + tab + + + + + + True + 4 + 2 + False + 0 + 0 + + + + + 0 + 1 + 0 + 1 + fill + fill + + + + + + True + _Command Line: + True + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + cmd_text + + + 1 + 2 + 1 + 2 + fill + + + + + + + True + True + True + True + 0 + + True + * + False + + + 1 + 2 + 2 + 3 + + + + + + + True + False + 0 + + + + True + _Visual: + True + False + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 3 + 0 + visual_entry + + + 0 + False + False + + + + + + True + False + True + False + True + False + + + + True + True + True + True + 0 + + True + * + False + + + + + + True + GTK_SELECTION_BROWSE + + + + True + True + Any + + + + + + True + True + Best + + + + + + True + True + Default + + + + + + True + True + Default-N + + + + + + True + True + GL + + + + + + True + True + TrueColor + + + + + + True + True + PseudoColor + + + + + + True + True + StaticGray + + + + + + True + True + GrayScale + + + + + + True + True + DirectColor + + + + + + True + True + Color + + + + + + True + True + Gray + + + + + + True + True + Mono + + + + + + + 0 + True + True + + + + + 1 + 2 + 3 + 4 + fill + fill + + + + + False + True + + + + + + True + Advanced + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + tab + + + + + + + 0 + True + True + + + + + + True + Description + 0 + GTK_SHADOW_ETCHED_IN + + + + 5 + True + False + 5 + + + + True + True + + False + False + GTK_JUSTIFY_LEFT + True + True + 0.5 + 0.5 + 0 + 0 + + + 0 + True + True + + + + + + True + True + _Documentation... + True + GTK_RELIEF_NORMAL + + + + 0 + False + False + + + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + + diff --git a/driver/xscreensaver-demo.man b/driver/xscreensaver-demo.man index f393acb5..b39b13d8 100644 --- a/driver/xscreensaver-demo.man +++ b/driver/xscreensaver-demo.man @@ -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 diff --git a/driver/xscreensaver-getimage-file.man b/driver/xscreensaver-getimage-file.man index b0480bc5..71861cf0 100644 --- a/driver/xscreensaver-getimage-file.man +++ b/driver/xscreensaver-getimage-file.man @@ -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 diff --git a/driver/xscreensaver-getimage-video.man b/driver/xscreensaver-getimage-video.man index a9ea4ce9..f2587fa7 100644 --- a/driver/xscreensaver-getimage-video.man +++ b/driver/xscreensaver-getimage-video.man @@ -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 diff --git a/driver/xscreensaver-getimage.c b/driver/xscreensaver-getimage.c index ab524327..2d3cce59 100644 --- a/driver/xscreensaver-getimage.c +++ b/driver/xscreensaver-getimage.c @@ -19,6 +19,10 @@ #include #include +#ifdef HAVE_SYS_WAIT_H +# include /* for waitpid() and associated macros */ +#endif + #ifdef HAVE_XMU # ifndef VMS # include @@ -37,6 +41,17 @@ #include "prefs.h" #include "vroot.h" +#ifdef HAVE_GDK_PIXBUF + +# ifdef HAVE_GTK2 +# include +# else /* !HAVE_GTK2 */ +# include +# 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, diff --git a/driver/xscreensaver-getimage.man b/driver/xscreensaver-getimage.man index 607c8634..c956fe8c 100644 --- a/driver/xscreensaver-getimage.man +++ b/driver/xscreensaver-getimage.man @@ -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 diff --git a/driver/xscreensaver.man b/driver/xscreensaver.man index abc39e6e..5d1cfd2b 100644 --- a/driver/xscreensaver.man +++ b/driver/xscreensaver.man @@ -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 diff --git a/hacks/Makefile.in b/hacks/Makefile.in index 65630f91..12e58419 100644 --- a/hacks/Makefile.in +++ b/hacks/Makefile.in @@ -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 index 00000000..bbd2d74a --- /dev/null +++ b/hacks/anemone.c @@ -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 +#include +#include +#include +#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)rate) { + if (aCurr->growth>0) { + if (!(--aCurr->growth)) aCurr->growth=-RND(finpoints)-1; + vCurr = vPendage + (finpoints + 1) * i + aCurr->numpt-1; + if (aCurr->numptnumpt++; + 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)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 index 00000000..20184fe5 --- /dev/null +++ b/hacks/anemone.man @@ -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 index 00000000..4d9f2caf --- /dev/null +++ b/hacks/ant.man @@ -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 index 00000000..ae4e3560 --- /dev/null +++ b/hacks/apollonian.man @@ -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 index 00000000..088f04a7 --- /dev/null +++ b/hacks/blaster.man @@ -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 index 00000000..c06dafe8 --- /dev/null +++ b/hacks/ccurve.man @@ -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 index 00000000..86ea0443 --- /dev/null +++ b/hacks/compass.man @@ -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. diff --git a/hacks/compile_axp.com b/hacks/compile_axp.com index a0c5decd..d1703538 100644 --- a/hacks/compile_axp.com +++ b/hacks/compile_axp.com @@ -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 diff --git a/hacks/compile_decc.com b/hacks/compile_decc.com index a0c5decd..d1703538 100644 --- a/hacks/compile_decc.com +++ b/hacks/compile_decc.com @@ -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 diff --git a/hacks/config/README b/hacks/config/README index 9deb86b1..492330ca 100644 --- a/hacks/config/README +++ b/hacks/config/README @@ -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 index 00000000..3443aea5 --- /dev/null +++ b/hacks/config/anemone.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + <_description> +Wiggling tentacles. By Gabriel Finch. + + diff --git a/hacks/config/blitspin.xml b/hacks/config/blitspin.xml index d7e73b2e..fe086d45 100644 --- a/hacks/config/blitspin.xml +++ b/hacks/config/blitspin.xml @@ -10,7 +10,7 @@ convert="invert"/> diff --git a/hacks/config/coral.xml b/hacks/config/coral.xml index 31a330d8..5c37df22 100644 --- a/hacks/config/coral.xml +++ b/hacks/config/coral.xml @@ -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. diff --git a/hacks/config/fluidballs.xml b/hacks/config/fluidballs.xml index 087d68c0..fb01c2f6 100644 --- a/hacks/config/fluidballs.xml +++ b/hacks/config/fluidballs.xml @@ -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. diff --git a/hacks/config/lavalite.xml b/hacks/config/lavalite.xml new file mode 100644 index 00000000..68011be4 --- /dev/null +++ b/hacks/config/lavalite.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + <_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." + + diff --git a/hacks/config/queens.xml b/hacks/config/queens.xml new file mode 100644 index 00000000..7c52fcf4 --- /dev/null +++ b/hacks/config/queens.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + <_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. + + diff --git a/hacks/config/rotor.xml b/hacks/config/rotor.xml index 20043550..f2e8a63d 100644 --- a/hacks/config/rotor.xml +++ b/hacks/config/rotor.xml @@ -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. diff --git a/hacks/config/t3d.xml b/hacks/config/t3d.xml index b2dc29d0..bf846f01 100644 --- a/hacks/config/t3d.xml +++ b/hacks/config/t3d.xml @@ -10,7 +10,7 @@ convert="invert"/> +/* xscreensaver, Copyright (c) 1999, 2001, 2002 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 @@ -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 index 00000000..73de9a02 --- /dev/null +++ b/hacks/deluxe.man @@ -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 index 00000000..9115655d --- /dev/null +++ b/hacks/demon.man @@ -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 index 00000000..abc6faa3 --- /dev/null +++ b/hacks/discrete.man @@ -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 index 00000000..2284a032 --- /dev/null +++ b/hacks/euler2d.man @@ -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 index 00000000..4ee0a034 --- /dev/null +++ b/hacks/fadeplot.man @@ -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 index 00000000..6215286f --- /dev/null +++ b/hacks/flow.man @@ -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 index 00000000..5e06b89f --- /dev/null +++ b/hacks/fluidballs.man @@ -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. + diff --git a/hacks/glx/Makefile.in b/hacks/glx/Makefile.in index 68cb2fad..49e42729 100644 --- a/hacks/glx/Makefile.in +++ b/hacks/glx/Makefile.in @@ -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 index 00000000..7ec1ee92 --- /dev/null +++ b/hacks/glx/atlantis.man @@ -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 index 00000000..6faafe53 --- /dev/null +++ b/hacks/glx/boxed.man @@ -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 index 00000000..21bdbe0e --- /dev/null +++ b/hacks/glx/bubble3d.man @@ -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 index 00000000..c60498f0 --- /dev/null +++ b/hacks/glx/cage.man @@ -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 index 00000000..211780c0 --- /dev/null +++ b/hacks/glx/circuit.man @@ -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. diff --git a/hacks/glx/cubenetic.c b/hacks/glx/cubenetic.c index 4b4815e3..db2f6ac3 100644 --- a/hacks/glx/cubenetic.c +++ b/hacks/glx/cubenetic.c @@ -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 #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; - } -} - - /* 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 index 00000000..f10b07da --- /dev/null +++ b/hacks/glx/cubenetic.man @@ -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. diff --git a/hacks/glx/dangerball.c b/hacks/glx/dangerball.c index 746b7b24..6f3f9d46 100644 --- a/hacks/glx/dangerball.c +++ b/hacks/glx/dangerball.c @@ -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 #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 index 00000000..033811a6 --- /dev/null +++ b/hacks/glx/dangerball.man @@ -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 index 00000000..e5204b39 --- /dev/null +++ b/hacks/glx/engine.man @@ -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. diff --git a/hacks/glx/extrusion.c b/hacks/glx/extrusion.c index 2e6958cc..fd9f0f48 100644 --- a/hacks/glx/extrusion.c +++ b/hacks/glx/extrusion.c @@ -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 index 00000000..f9d69deb --- /dev/null +++ b/hacks/glx/extrusion.man @@ -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 index 00000000..16f57e7a --- /dev/null +++ b/hacks/glx/flipscreen3d.man @@ -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. diff --git a/hacks/glx/fps.c b/hacks/glx/fps.c index 2b91bbfe..2ba56d40 100644 --- a/hacks/glx/fps.c +++ b/hacks/glx/fps.c @@ -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); } } diff --git a/hacks/glx/gears.c b/hacks/glx/gears.c index 954acd17..52bdab82 100644 --- a/hacks/glx/gears.c +++ b/hacks/glx/gears.c @@ -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 index 00000000..999cf11f --- /dev/null +++ b/hacks/glx/gears.man @@ -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. diff --git a/hacks/glx/gflux.c b/hacks/glx/gflux.c index 172f4061..56b7a026 100644 --- a/hacks/glx/gflux.c +++ b/hacks/glx/gflux.c @@ -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); diff --git a/hacks/glx/glplanet.c b/hacks/glx/glplanet.c index 20632b9a..5352a5db 100644 --- a/hacks/glx/glplanet.c +++ b/hacks/glx/glplanet.c @@ -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 index 00000000..096c7e60 --- /dev/null +++ b/hacks/glx/glplanet.man @@ -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. diff --git a/hacks/glx/gltext.c b/hacks/glx/gltext.c index 4cc6005a..2ccae161 100644 --- a/hacks/glx/gltext.c +++ b/hacks/glx/gltext.c @@ -1,4 +1,4 @@ -/* gltext, Copyright (c) 2001 Jamie Zawinski +/* gltext, Copyright (c) 2001, 2002 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 @@ -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 +#include #include #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 index 00000000..c7ddc8b3 --- /dev/null +++ b/hacks/glx/gltrackball.c @@ -0,0 +1,75 @@ +/* gltrackball, Copyright (c) 2002 Jamie Zawinski + * 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 +#include +#include +#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 index 00000000..fbe2efdd --- /dev/null +++ b/hacks/glx/gltrackball.h @@ -0,0 +1,41 @@ +/* gltrackball, Copyright (c) 2002 Jamie Zawinski + * 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__ */ + diff --git a/hacks/glx/lament.c b/hacks/glx/lament.c index aedc57d4..b100a9ce 100644 --- a/hacks/glx/lament.c +++ b/hacks/glx/lament.c @@ -67,13 +67,6 @@ * 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 @@ -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; - } -} - - /* 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 index 00000000..631c2e22 --- /dev/null +++ b/hacks/glx/lavalite.c @@ -0,0 +1,1597 @@ +/* lavalite --- 3D Simulation a Lava Lite, written by jwz. + * + * This software Copyright (c) 2002 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®, 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 + +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 + +#ifdef USE_GL /* whole file */ + +#include + + +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); +} + + + +/* 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; +} + + + +/* 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 (); +} + + + + +/* 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); +} + + + +/* 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 (); +} + + + +/* 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 index 00000000..4f29062b --- /dev/null +++ b/hacks/glx/lavalite.man @@ -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 diff --git a/hacks/glx/marching.c b/hacks/glx/marching.c new file mode 100644 index 00000000..a4cafb48 --- /dev/null +++ b/hacks/glx/marching.c @@ -0,0 +1,671 @@ +/* xscreensaver, Copyright (c) 2002 Jamie Zawinski + * 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 + * http://astronomy.swin.edu.au/~pbourke/modelling/polygonise/ + */ + +#include "config.h" +#include +#include +#include +#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 +*/ +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 + +/* 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 index 00000000..755545d5 --- /dev/null +++ b/hacks/glx/marching.h @@ -0,0 +1,48 @@ +/* xscreensaver, Copyright (c) 2002 Jamie Zawinski + * 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__ */ diff --git a/hacks/glx/menger.c b/hacks/glx/menger.c index 653f7a8c..b4f24f18 100644 --- a/hacks/glx/menger.c +++ b/hacks/glx/menger.c @@ -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 #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 index 00000000..3f702bbb --- /dev/null +++ b/hacks/glx/menger.man @@ -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. diff --git a/hacks/glx/moebius.c b/hacks/glx/moebius.c index 39229944..dcdb0f5e 100644 --- a/hacks/glx/moebius.c +++ b/hacks/glx/moebius.c @@ -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 #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 index 00000000..45b09d87 --- /dev/null +++ b/hacks/glx/moebius.man @@ -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. diff --git a/hacks/glx/molecule.c b/hacks/glx/molecule.c index c6c59b86..75010b8e 100644 --- a/hacks/glx/molecule.c +++ b/hacks/glx/molecule.c @@ -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" @@ -109,11 +111,15 @@ #include "colors.h" #include "sphere.h" #include "tube.h" +#include "rotator.h" +#include "gltrackball.h" #ifdef USE_GL /* whole file */ #include #include +#include +#include #include #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 index 00000000..06f716a1 --- /dev/null +++ b/hacks/glx/morph3d.man @@ -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 index 00000000..2fc7d5a6 --- /dev/null +++ b/hacks/glx/pipes.man @@ -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 index 00000000..f2691a16 --- /dev/null +++ b/hacks/glx/pulsar.man @@ -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 index 00000000..42ac6e2c --- /dev/null +++ b/hacks/glx/queens.c @@ -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 + +#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 +#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 +#include +#include +#include + +#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 index 00000000..bcfcd380 --- /dev/null +++ b/hacks/glx/queens.man @@ -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 , 20-April-2002. + diff --git a/hacks/glx/rotator.c b/hacks/glx/rotator.c new file mode 100644 index 00000000..f13cb547 --- /dev/null +++ b/hacks/glx/rotator.c @@ -0,0 +1,243 @@ +/* xscreensaver, Copyright (c) 1998-2002 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. + */ + +#include "config.h" +#include +#include +#include +#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 index 00000000..b3f36f68 --- /dev/null +++ b/hacks/glx/rotator.h @@ -0,0 +1,60 @@ +/* xscreensaver, Copyright (c) 1998-2002 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. + */ + +#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 index 00000000..6b34c948 --- /dev/null +++ b/hacks/glx/rubik.man @@ -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. diff --git a/hacks/glx/sierpinski3d.c b/hacks/glx/sierpinski3d.c index 1517d271..3a0a158b 100644 --- a/hacks/glx/sierpinski3d.c +++ b/hacks/glx/sierpinski3d.c @@ -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 +#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 - static GLfloat normals[4][3]; @@ -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 index 00000000..660cb731 --- /dev/null +++ b/hacks/glx/sierpinski3d.man @@ -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. diff --git a/hacks/glx/spheremonics.c b/hacks/glx/spheremonics.c index b894ae84..f4ffa011 100644 --- a/hacks/glx/spheremonics.c +++ b/hacks/glx/spheremonics.c @@ -53,11 +53,11 @@ * 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 @@ -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 #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); } } + /* 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 index 00000000..f714278c --- /dev/null +++ b/hacks/glx/spheremonics.man @@ -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 index 00000000..5a45f384 --- /dev/null +++ b/hacks/glx/sproingies.man @@ -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 index 00000000..f7419996 --- /dev/null +++ b/hacks/glx/stairs.man @@ -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 index 00000000..83d439db --- /dev/null +++ b/hacks/glx/stonerview.man @@ -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 index 00000000..e925b17d --- /dev/null +++ b/hacks/glx/superquadrics.man @@ -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 index 00000000..a0efbea8 --- /dev/null +++ b/hacks/glx/trackball.c @@ -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 +#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 index 00000000..f7da9509 --- /dev/null +++ b/hacks/glx/trackball.h @@ -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__ */ diff --git a/hacks/glx/xpm-ximage.c b/hacks/glx/xpm-ximage.c index 77210eca..901ce678 100644 --- a/hacks/glx/xpm-ximage.c +++ b/hacks/glx/xpm-ximage.c @@ -25,7 +25,12 @@ extern char *progname; #if defined(HAVE_GDK_PIXBUF) # include -# include + +# ifdef HAVE_GTK2 +# include +# else /* !HAVE_GTK2 */ +# include +# 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 diff --git a/hacks/images/matrix0.xbm b/hacks/images/matrix0.xbm index 078bb618..1f071fdf 100644 --- a/hacks/images/matrix0.xbm +++ b/hacks/images/matrix0.xbm @@ -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, diff --git a/hacks/images/matrix0.xpm b/hacks/images/matrix0.xpm index 7902d7d0..6422b25f 100644 --- a/hacks/images/matrix0.xpm +++ b/hacks/images/matrix0.xpm @@ -1,390 +1,387 @@ /* 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", +"................................................................................................................................................................................................................................................................................................................................", +"....................................................................++++++..............+++++.............................................................................................................................................................................................................................+++...", +"............................++++.................................+++@@@@@+++...........++@@@++..............+..............................................................+................+....................++.....................................................................................................++@@@+..", +"...........................+++++++.............++++++++..........++@@@@@@@++..........+++#@@@++...........+++++.....................................+++++................+++++............+++++.................+++++...................................................................................................++@@@++.", +"..........................++@$$$@++.........+++@@+++@@+++........+@@@####@@++........++@@$$$@@@++.......++@@@@@+....................................+@@@@+..............++$$@@+..........+@@$#++..............+++$$$++.................................................................................................++@$$$++.", +"..........................+@@$$$@@+.........+@@@#@@@#@@++.......++@#@#@##@@@+.......++@@#$$$@@@++.......++@####++..............+++++++.............++@#@@++............+++$#@@++.........@+@$$@++.............++@$$$@++...............+................................................................................++@$#$++.", +"..........................+@@$$$@@+.........+@@@#@@@#@@++.......+@@###@##@@@+......+++@@#$$$#@@++......++@@@@@#+++............++@@+@++............++@@##@++............+@+$$@@+..........+@@#$@++...........++++@$$$@@++...........+++@++..............................................................................+@@$$$++.", +".........................++@#$$$@@++.......+@@@$$@@@$$@@@+.....+++#@@####@@@++....++@@######$$@@@+.....++@##@#@@@+...........++@@$$$#@++.........++@@$$$@@+..........++@@@@#+++.........+++@##@@@+.........++@@@@$$$@@@@@+.........++$$$++............................................................................++@@@@@++.", +".........................++@#$$$#@++.......++@@$$#@@$$@@@......+@+@######@@@+.....++#@######$$@@+.....+@@@@#@#@@@+..........++@##$$$#@+...........+@@$$$@++...........+@@###+++...........++@#@@@+.........+@@@@@$$$@@@@@..........++$$$++............................................................................+@@###@@+.", +"..........................@@@$%$@@@........+@@@$$@@#$$@@++.....@@####$$$$##@@+....+@###@@@@@@#@+@+.....+@@@#@#@#@++........++@@##@@@@@++.........++@#@@@++...........++#@#@@@+...........++@#@##@++........+@@@$$$$$$$@@@+........++@#$$@++..........................................................................+++$$@@@+..", +".........................++@#$$$#@++.......+@@#$$@@@$$@@+....+.@@@##$$$$$###++....++####@@@@@@@@+.....+@@@#@#@#@@@+.........+@@##@@@#@++.........++@#@#@++...........++#@##@++.............+@#@##++........+@@@$$$$$$$@@@+........++@$$$@++..........................................................................++@#$@@++..", +"..........................@@@$$$@@+........++@@$$@@@$$@++.....+@@@###$$$$##@@++...++###@@@@@#@@@++.....+@@@#@#@#@+++.......+@@@##@@@@@+..........++#@@@@++...........++#@#@@+.............++@@#@@@+........+@@@#$$$$$$@@@+.......+++@$#$@@++...............................+.+.+.+...................................+@+$$@++...", +".........................++@#$%$#@@........++@@@@@@@@@+++.....+@@#$$##@$$##@@.....++@##$$###@@@++......++@@####@#@@+........+@@$$@@@+@++..........+@@+++.............+@$$$@@+.............++@@$$$++.........+@@@@$$$@@@@++.....+++@@@$$$+@+++..........................++++++++++++++..............................++@@@#@@++...", +"..........................@@@$$$@@++........+++@@+++@@+......++@@@$$###$$@##++....++@@@$$#@#@@@@++......++#@@#@#@@@@+......++@@#$@@+@++++..........++++.............+++$$$@++..............++@$$$@++.......+++@@@$$$@@@++.....+++@+@@$$$@@@@+++.......................+++@@@@@@@@@@@+++.............................+@@#@#++....", +"..........................+@@$$$@@+.........++.++++++++.......+@@@$$@@@$$@@++......+@@@@@###$$@@@+.....+++@#####@@++.......++@@$$###@@@@++.........+................++@$$#@++...............+@$$$@+.........+@@$$@@#$$@@+.....+@$$$$$$$$$$$$$@+.......................+@$$$$$$$$$$$$$@+...........................+++###@@++....", +"..........................++@$$$@++................+.........+++@@$$#@@$$@@@++.....+++@@@###$$##@++....++@#@####@@++.......++@@$$###@@@@@+...........................++$$$@+...............+++$$#@++.......+++@$$@@@$$@@++....+@$$$$$$$$$$$$$@+.......................+@$$$$$$$$$$$$$@+............................+@###@@+.....", +"..........................++@$$$+++..........................++@@@$$@@@$$@+++......+++@@#@##$##@@@.....+++@#####@@@++......+@@@$$###@@@@@+..........................++@$$$+++..............++@$$$+++.......+++@$$@@@$#@@+.....+@$$%$$$%$$%$$$@+.......................++$$$$$$$$$$$$$@+...........................+++###@@+.....", +"...........................++#$$@+...........................++$$$$$$%$$$##@+.....++@@@@@@@@#@###++....+@@@@######@@+.....++@@@#@$$$$$##@++.........................+++$$$+@+.............++++$$$+++........++@@@@@@@@+++......+@+@@@$$$@@@@+++.......................++@@@@@@@@@@@@+++...........................+@@###@++.....", +"...........................+@$$$++...........................+@$$$$$$$$$$###+......+@@#@@@@@@####++....+@@@@#######@@.....+@@###@$$$$$#@@++.........................+++@##@@+..............+@@#@#++.........+++@@+++@@+++......+++@@@$$$@@+@+...........++++..........+.+++++++@+++++............+++.............++@@###+++.....", +"...........................+++@+++...........................++@@########@++++....+@###$$###$$@#@@+....+++@@##@@@#@@++....++####@@@@$$@@@+...........................+@@##@@++............+@@@##@@+..........++.+..++++...........++@$$$@+++............+@@@@+............+++++..+++............++@@@+...........++@#@@@++......", +"............................++@+++...........................++@@@###@#@@@++......++###$$@#@$$#@@++.....++++@##@@@#@++....++###@#@##$$@@@++..........................++@@@##++............++##@@@++...............................++@$$#@+++...........++@@@@++................+...............+@@@@@++..........+@@#@@@++......", +"...........................++++@+.............................+@@@####@##+++......++@##$$###$$##@+.......++@#@#@@@#@+.....+@@###@#@@$$@@@++...........................+@#@#@@++..........++@@##@@+................................+++$$$@+............++@@#@@@.................................++@@#@++.........++@###@@+.......", +"...........................++$$$++...........................++@@@#####@@@+.......++@@@@@$$$@@@+++........++######@#++.....+@#@$$$$%##$$$@+..........................++@@@##+++..........++@##@@@+.................................++$$$+++...........+@@$$$@@.................................+@@$$$++.........+@@#$@+++.......", +"............................+$$$+.............................+@@@#####@@++..........+++@$$$@++............+@@#@#@@@+.....++@@#$$$$$##$$$++............................+@@$$@@+..........+@@$$@@++................................++@#$$++............+@@$$$@@+...............................++@@$$$++........++@@$#@++........", +"............................+++++.............................+@@@##@###@++..........++++$$$@++............++@++@++++......+++@@@@+@@@@@+++.............................++$$@@@.........++@@#$++.+..................................+++++............++@#@@@++.................................++@@+@+.........+@@@#@@+.........", +".............................+................................++@@###@#@@+.............+@@@@++..............+++++++.........+++++++++++++..............................+++$$@@+..........++@$$@++....................................+++.............++#@#@@++....................................+++.........++@#@#@++.........", +"..............................................................++@@@#@@@@@+.............++@#@++..................................++.+....+...............................++++.++..........+++++........................................................+@#@@@++.................................................+@@#@@++.........", +"................................................................++@+@@@+++.............++@@@+.............................................................................+.+...............+.+......................................................++@@@++..................................................++@@@@@+..........", +".................................................................+++.++.................+++++.........................................................................................................................................................+++++...................................................++@@@+++..........", +"................................................................................................................................................................................................................................................................................................................................", +"..........+......................................+.+................+.+....................................+.++.+....................+............+.++++++................+.....................................................................................................................................................", +".......+++++++............++++++..............++++++++...........++++++++................++++...........+++++++++++..............+++++++........+++++++++++++.........++++++++.............+++++++..............................................................................................................................", +".....++@@@#@@+++........+++@@@@@+............++@@#@#@@++........++@@#@#@@++.............+@@@@@+........+++@#@#@#@@@@+..........+++@@#@@@++.....+@@@@#@@@@#@@@+.......++@@@#@+@++.........+++@@@@@+++.............................................................................................................+++++++++......", +"....+++@@@#@@@++.......+++@@@#@@@+.........+++@@@#@#@@@+++....+++@@@#@#@@@+++.........+++@@@@@++.......+@@@#@#@##@@@+.........+++@@@#@#@@+....++@@#@####@#@@@++....++++@@@##@@+@+........++@##@@@@+++...........................................................................................................+++@@@@++++.....", +"...++@@$$###$$@@@+....++@##$$$$$++.........+@@@$$###$$@@@+....+@@@$$###$$@@@+.........++@$$$$$++......+@@@$$######@@+........++@$$$$$#@#++....++#############++....+@@@$$#@#$$@@@+......++$#########++.........................................................................................................++@$$$$$$$@++....", +"...+@@@$$###$$@@@.....++###$$$$$@+........++@#@$$###$$#@@++...+@#@$$###$$#@@++........+@@$$$$$++......++@@$$##@##@@@+........+@@$$$$$##@@+.....+@####@#######++...++@#@$$###$$#@@++....++@$$########++.......................................................++++..........................++++................++@$$$$$$$@@++...", +"..++@@@$$@#@$$@@@++....+@##$$$$$@++........@@@#$$@##$$##@++..++@@#$$@##$$##@++.......++@@$$$$$@++.....+@@@$$######@@++.....+++@@$$$$$##@++....++##@##########++...+@@@#$$##@$$##@++....++@#$########++.....................................................++++++++.......................+++++++++...........++@+$$$$$$$@@@+...", +"..++###@@@@@@@###++...++++@@@$$$+++.......++###@@@@@@@###++..++@@@@@@@@@@###++.......++####@$#@+......+@@@##@@@@@@@++......++@$$@@@@@+@@+......+++@+@+@+@#@#@++...++###@@@@@@@###++....@@@##+@@@@$$$@++..........+++.................+++................+++@@@$$$@+......+.+++++++.+......+$$$@#++++..........++@@##@@@@##@#++..", +"..++###@@@@@@@###++.....+++@@$$$@+.........+@@#@@+@@@@###@+...+@@@@@+@@#@###@+......+++#@#@#$$@++.....+@@@##@@@@@@@++......++@#$##@@@@++.+.......+++++@@@##@#++...+@###@@@@@@@###@+....@@@##@@+@@#$#@@..........++++++..............++++++.............++++@@@#$#@@.....+++++++++++++....+.$#$##@@++++.........@@@@#@@@#####@+..", +"..++###@@++@@@###++.....++++@$$$+@........+++++@+++@#@###++...+++++@+@@$$#@@++......+@@$$@@@$#@+......+@@@$$$$$$$@@@+......+@@$$@@#@@@@++..........+++@@##@@@++...++@###@@@@#@#@@++..+.@@@##@@+@@$$$@++.......+.@@$$$++...........+.@@$$$++..........++@@#####@@@++...++@@#@@#@#@@#@@+....++@+@#$$$@@++........+@@@@@+@@@##@++..", +".+++###@@@++@@###@+.......++@#$$@++.........+++++++@@####++.....++++@+@$$###++.....++++$$@@@$$@++......@@@$$$$$$$#@@++....+@@@$$@#@##@@++............+++##@@@+....++#@#@#@@@@####++...+@@@##@+@+@$$#@@+........+@@$$$++............+@@$$$++.........++++@#####@@@++...++@#@##@#@##@#@++....++@#@$$$@@@+++.....+++@@@+@@@@###@+..", +".++@###@@++@@@###++.......++@$$$+++............+++@@@####++......+++@@@#$@#@++.....+@@@$$@@@$#@++.....+@@@$$$$$$$@#@++....+@@@$$@#@#@@@@++...........+@@##@@@.....++@###@@@@#@#@@@+...+@@@##@@@@@$$$@++........+@@$$$++............+@@$$$++........++@@@@#####@+++....++#@#@####@#@##++....+++@@$$$#@@++++.....++@@@@+@@@###++..", +"..++###@@@++@@###@+.......++@#$$@+............+++@@@$$@@@++.....+.@@$$$$$@@@++....++@@@@#@@@$$@++......++@@#@@@##$$$@+.....@@@$$$$$##$$$++...........+++$$@+++.....@@@@$$$$$$$@@@+.....@@@$$@@@@@$$$@++........+@@@#@@+............+@@@#@@+.......++@@#$$@@@@++++....+++#####@######@@+......+@@@@@##$$$@++......++@@@@$$#@@++..", +"..++###@@+++@@##@@+.......++@$$$+++............++@@@$$@+++.......+@@$$$$$@@@++....++#####@@@$$@+++....+++@@@@@@@#$$#@++..++@@@$$$$$##$#$++..........++@@$#@+......++@@@$$$$$$$@@@@.....@@@$#@@@##$$$@@..........@@@#@++.............@@@#@++.......++#@#$$##@@@+......++@@######@####@@+.......++@@@##$$$@@+.......++@@#$$@#@++..", +"..@+###@@++@@@###++........++$$$@+............+@@$$$@@@++.........++@@@#####@+....++$$$#####$$@@@+......+++@+++@+$$$@+....+@@@$$@@@@@$$$@++.........+@@@##+++.....++#####@@@#####++....+++##$$$@#$$$@++.........++++++..............++++++........+@###$$@@@+++.......+@@@#@@####@@##++.......+++@@#@$$$@@+......++@$$$@@@+++...", +"..+@@##@@+++@@###@+.......++@#$$@++..........++@@$$$@@+++........+++@@@@####++....++$$$@###@$$#@@+.....++++++++@@$#$@@+...+@@@$$@@@@@$$$@++.........+@@@##++......++#####@@@#####++....+++@#$$$##$$$@@+..........+.+.................+.+..........++###$$@#@@++......++@#@##@###@##@#++.......+++@@##$$$@@+.......++$$$@@@++....", +".++@###@@+@+@@###++........+@$$$+@..........+++@@$$$@@+........++++++@@@####++...+++$$$#####$$@@@++...+.++++++++@$$$@++...+@@@$$@@@+@$#$@@+........+@@@#@#++.....+++###@#@@@#@###@+.....+@@#%$$#@$$#@+............+.+.................+.+........+++#@#$$@@@@@++......+@@#@#@#@####@#++......+++@@@#@$$$@@+......+++$$$@@++.....", +"..++###@@@++@@###++......+++@$$$@++.........+@@$$#@#@+++......++@@++++@@@###++...++@@##@####$$#@@++...++@@+++++@@$$$@++...+@@@$$+@@@@$$$+++........++@##@@@+......+@@##@@@@@@@##@@+.....+++@@@@@@$$$@++.............+...................+.........+++@+@@$$$@#@++.....+@@#######@####++....+++@@$$$#@@++++.......+++@##+++......", +"..++###@@@@@@@###@+......+++@#$$@@++.......++@@$$@@@@@++.....++@@@+@+@@@@###@++...++#@######$$##@+....+@@@+@+@+@@$$$@@.....@@@$$@@@+@$$$@++........+@#@##@+.......+@####@@@@#@###++.....+++@@@@@@$$$++...........++++................++++...........++@@@$$$##@@++...+++#####@####@#@@+....+++@@$$$#@@@++.........+@@#@@++......", +"..++###@@@@@@@##@++.....++@@@$$$+@+++.....++@@@$$##@@@+++....++@@@@@@+@@@###++....++#@##@###$$@#@@....+@@@@@@@+@@$$#@++....@@@$$@@@@@#$$@+.........++@#@#@+.......++###@@@@@@@###++.....+++@@@@@@$#$++.........+++++++.............+++++++...........++@@$$###@@@++...++@@@##@#@##@#@++...++@@@#$$$@@+++..........++@#@@+.......", +"..++@@@$$@#@$$@@@++....++@@@@$$$#@@@@......@#$$$$@##@@@@@+...+@$$$@#@##$$#@@++....++++@@@###$$#@@++...+@#@$$@@##$###++.....++@#$#####$$$@++........+@$$$+@++.......@@@#$$@@@$$#@@@+....+++#@###$$##@+++.........@@$$$++............+@@$$$++............+++@@#@$$$@@....++@+++@++++@+++....+$#$##@@@@+++...........+@#@@+++......", +"...+@@@$$@##$$@@@+.....+@@@##$$$#@@@@+...+++$$$$$#@##@@@@....++$$$##@@#$$#@#+......++++@@#@#$$@#@++...+@@#$$#@#$$###++.....+++$$###@#$$#@+.........++$$$@+.........+@#@$$###$$##@++....+@@@#@#@$$@@#++.........+@@$$$++...........++@@$$$+..............++++@@$$#@@....+.++++++++++++.....+$#$@#+@+++.............++@#@++.......", +"....++@@@#@#@@@++.....++@@#@#######@@+....+@@@#########@@+...++@@@####@#@@+++........++@@######@@+....+++@@@####@+@+++......++@+#@###@@@+++........+@@@@+++.......++++@#@####@@++......++@@####@@@++...........+@@@#@++..........+++$$@@@++...............+++++@+++.......+....+..........+++@@+++.+..............++@#@+........", +".....++@@###@@+++......+@@##@#@###@#@+....+@##@####@##@@@+....+@@@@#####@@++.........++@@@#@#@#@@@....+++@@##@#@#+++.........++@@#@#@@@@+...........+##@++.........++++@##@#@@@++......+@@#@###@@@++...........+@@###++...........++$$@@@++................++++++.........................++++++.+................++@@#++.......", +"......+@@@#@@@+.......++@@@@###@@#@@@++...++@@#@@#@##@#@@++....+@@@#@#@@@++............+@#@###@@@+.......+@@##@#@++.........+.+@@@#@#@++...........++@@@+............+@@@@#@#@++.......++@@#@@@@+++.............+@@@@++..........+++$$@@@+.................................................+++.....................+@@@+........", +"........+++++++........+++@+++@@+++++.....++@+@@+@++@++++.......++++@+@+++.............+.+++++@++.......+++++@+++++............+++@+++++.............++++.............++@+@+++++........+++@+@+++...............++++++...........+@@@@@+++.........................................................................+++.+........", +".......+.++++............+++++.+++++.........+++++++++++.........++++++++...............++++++.+..........+.+++++...............++.++....................................++++..............+++++..................++.............++@@@++..............................................................................+.........", +".............................+.+.............................................................+...................................................................................................................................+.+++++........................................................................................", +"................................................................................................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................................................................................................", +".......+++++................+................+.+.+.+.................+.+.............+.+.+.+.............+.+.++.+............+.+.++.+.+..............+.+.............+........+............+.+.+.+..............+.+.+.+..........+........+..........+.+.+......................................................................", +".....+++++@+++...........+++++++...........+++++++++++.............++++++++++......+++++++++++.........+++++++++++++.......++++++++++++++..........++++++++++......+++++++++++++++.......++++++++++++..........++++++++++......++++++++++++++......+++++++++...........+++++.....+++++.....+++++....+++++..........++++++.......", +"....++@@#$$$@@+........++@@@@#@@++........+@@@#@@#@@@+++........+++@@@@@#@@+@+...++@@@#@@#@@@@++......+@@@#@#@@#@@@@+.....+@@@#@#@@#@@@@@++.....+++@@@@@#@@+@+...++@@@#@@+++@@@#@@+....+@@@@#@#@@@@@@........+@@@@#@@@@@@+...++@@@#@@++@@@@@@+....+@@@@#@@@++........++@@@@++...++@@@@+..++@@@@+++++@@@@@+......+++@@@@@@++.....", +"....++@##$$$@@++.......++@@@#@@@++.......++@@#@#@#@#@@+++.......++@@@##@@@@@@@+...@@@#@#@#@#@@+++....++@@#@#@#@##@#@++...++@@#@#@##@###@@@+.....++@@@##@@@@@@@+...@@#@@#@@@@#@#@@@@...+.@@@@@#@##@@@@+......+.@@@#@####@@@+...@@#@@#@@@@#@#@@++..++@##@#@#@@++.......+@@@@@@+++++@@#@@@...+@@@@@+++@@@#@@@+.....++@@#@#@@+++....", +"..++@@@@#$$$@@@+.......+@@@#@##@@++......+@@#@##@#@#@@@+++....++++@@#@##@@@@@@+.++@@@#@##@#@#@@+@+...+@@#@##@##@##@#++...+@@#@#@#@##@@#@@@+...++++@@#@##@@@@@@+.++@@@#@#@@@@@#@#@@@...++@@##@#@###@@@+......++@@#@#@#@#@@@..++@@@##@#@@@@##@@++..++@@#@#@#@@++.......+@@##@@@+++@@@#@@@.++@@#@@@@++@@#@#@@+...++++@@#@#@#@++++..", +"...+@@@##@@@$$@++......+@@@$$$$$@@+......++###$$#####$$$++....+@#@$$#####$$$#@+..+@@$$$#######$$#++..++###$$#####$$$@++..++###$$#####$$$#@+...+@#@$$#####$$$#@+..+@@$$$##@@@##$$$@@....+@@@##$$$@##@@+.......+@@###$$###@@+..+@@$$$##@@@$$###@+..+@@##$$###@@........+@@$$$@@@+@@@$$$@@..+@$$$$$@@@@#$$$@@+...+@@##$####@$$$++..", +"..++@#@##@@@$$@++......+@#@$$$$%@@++.....++###$$#####$#$++...++@@#$$@#@##$$$##+..+@@$$$#######$$$@+..++###$$##@##$$$@++..++###$$##@##$$$##+..++@@#$$@####$$$##+..+@@$$$##@@@##$$$@@....+@@###$$$#@#@@+......++@@#@#$$###@@...+@@$$$##@@@$$##@++..++#@#$$#@@@+........+@@$$$#@@@@@#$$%@@..+@$$$$$@@@#@$$$@@+..++@#@$$@####$#$+++.", +"..+@###@@##@$$@@@+.....++@@#######++....+++@@@##@@@@@$$$@++.+++$$$@@@@@@@#@@#@+..++@###@@+@+@@#$$@@.+++@@@##@@@@@$$$@@..+++@@@##@@@@@@@@@#+.+++$$$@@@+@+@#@@#@+..++@###@@@@@@@###@+.....++++@$$$@@+++........+++@@@##@@@+++..++@###@@#####@+@+....++@@$$@@@+++......++@@$%$##@@@##$$$@@.+++###$$@@@@@$$$@@+.++@$$$@@@+@@@$$$@@+.", +".++@###@@#@@$$@@@++.....++@#######++.....++@@@##@@@@@$$$@++..+@#$$@@+++++@#@##+..++@###@@@@++@$$$@@..++@@@##@@@@@$#$+++..++@@@##@@@@@#@##@+..+@#$$@@@+@+@@#@##+..++@###@@@@@@####@+.....+++@@$$$@++++.........++++@##@@@++...++@###@######@+++....+++@$$@@++........++@@$$$##@@@##$$$@@.++@###$$@@@@@$$$@++..++$$$@@@+++@$$$@@+.", +"..++####@$$$$$@@@.......++@@#####@@++.....+@@@##@@@@@$$$@@+.++@$$$@@@+++@@@@@@+...++###@@+++@@#$$@@...+@@@##@@@@@$$#@+....+@@@##@@@@@#@@#@+.++@$$$@@+++++@#@#@+...+@####@@@@@@###@+.......+++$$$@@+.............++@###@@++....++###@@#####++.......++@#$@@++.........+@@$$$##@@@##$$$@+..+@@##$$##@@@$$#@@+.+++$$$@@++@+@#$$#@+.", +"..+@###@#$$$$$@@@+......++@$$@@@$$@++....++@@#$$@#@##$$#@++.++@#$$@@++..+++@+++..++@####@++++@@###@...+@@@##@@@$$@@@++...++@@###@@@#$@@++++.++@#$$@@++++@+@@@++...++####@#@######++.......+@@$#$+++.............++@##@@@+.....+@###$$$$$@@++.......++@$$+@++.........+@@$$$$$@@@$$$$$@@..+@###@####@@$$$@++.+@@#$$@@++++@@#@#@@.", +"..++##########@@@+.....++@@$$@@@$$@@++....+@@@$$@##@#$$$@@+..@@$$$@++.....+++.....++###@@+++.@@@@#@..++@@@##@@@$$@@++.....+@@@##@@@$#@++++...@@$$$@++++++@@+@++..++@#######@#####@+........++$$$@++..............++##@@@+....+++###$$$$$@@++.......++@#$@++..........++@$$$$$@@@$$$$$@@.+++####@###@@$$$@++.++@$$$@++..++@#@#@+.", +"..++##########@@@+.....+@@@##@@@##@@@.....+@@@$$#####$$$@@+.++@$$#@++............+++###@@+.+++@#@##...+@@#$$$$$$#@@++.....+@@@$$$$$$$@++....++@$$$@++++@@@@@@@....++#####@#######++.......++@$$$@+..............+++##@@@+....++@###$$$$#@@++........+@$$@++..........++@$#$@#$$$#@$$$+@..++###@@$$$@@$#$@++.++@$$#@+++.+@@@###+.", +"..++####@$$$$$##@++...++@@@##@@@##@@@+....+@@@$$@##@#$$$@@+.+@+$$$@++............+++###@@++.+@@@@##..++@@@$$$$$$$@+++.....+@@@$$$$$$#@++....++@$#$@@+++#@###@@+..+++#############@+........++$$#@++.........+.+.++@##@@@+.....++###$$$$$@@++........+@#$@@++........+++@$$$@#$$$#@$$$@+.++@###@@$$$@@$$$@@+.++@$$$@++..++@#@@#+.", +".++@@##@#$$$$$@@@++....+@@###@@@##@@@++...+@@@$$#####$$$@@+.++@$$$@++............++@@##@@++.++@#@#@...+@@@$$$$$$$@++++....+@@#$$$$$$$@+.....+@@$$$+++++@#@@#@@+..++@@######@####@@+.......++@$$$@+.......++++++++++##@@@+....+++###$$$$$@@+++......++@$#@@+++++......+@@#$$#@$$$##$#$@+..++###@@$$$@@$$#@++.++@$$$@+++.++@@###+.", +"..+@####@@#@####@+....+@###$$$$$$$###++...+@@@##@@@@@@#@##+.++@$#$@@++....+++.....+@###@@++++@@#@##...+@@###@@@$$@@@@+....+@@@###@@$#+++.....+@$$$@@+@@##$$$#@+...+@###@@@@@@@###@+......+.++$$$@++......+@@##++++@##@@@+.....+@###@@#@#$$@++.......++$$@@+++@@@+....++@$$$@@###@@$$$@@.++@###@#@@@##$$$@@+.+@@#$$@++.++@##@#@+.", +"..++###@#@#@##@#@@...+++###$$$$$$$###++...+@@###@+@+@#@##@+.++@$$$+@++.+++++++....+@###@@++++@@@#@#...+@@@##@@@$$@@@@@+...+@@@##@@@$$++.....++@#$$@@+++##$$##@@...+@###@@@@@@@###++.......+@+$$#@++......+@###+@++@##@@@+.....++####@##@$$@@++.....++@$#@@+++@@@++...++@$$$@@#@#@@$$#@+..++####@##@##$#$+++..+@$$$@@+++++@####+.", +".+++####@###@##@@++...+@$$$#@#@@#@$$$@+..++@@@##@@@@@##@##+.+++####@+++++@@@@@+..+++###@@++++@$$$@@..++@@###@@@@@@#@#@+..++@@@##@@@@@+.......+@###@@@@@@@@####+..+++####@+@@#@###@+......+++@$$$@+++....++@#$$@+@@@$$@@@+....++@###@@@@@###@@++....+@+$$@@@@@$#$@+...+@@#$$@@+@@+@$$$@@..+@###@@@@@$$$$$@@+.+++###@@@++@@$$$@@+.", +"..++@@#@#@@@@@@@@...+++@$$$@#@@@#@$$$@@..++@@@##@@+@@@###@+.+++###@#@@+@@@##@@+..+@+###@@@@@@@$$$@@...+@@@##@@@@@#@@##+..++@@###@@@@++.......++####@@@+@@#@#@#+..+@@###@@@@+@@###@+.....+++@@$$$@+++....++@$$$@@@+@$$@@++....++@####@@@@##@#@@...+++@@$$@@@@@$$#@@...++@$$$@@++@+@$#$@@..+@###@@@@@$$$$$@++.+++####@@@+@@$$$@@+.", +"..++#@##@@@@#@@@++...+@@$$$#@@@@@@$$$@@..++@#@##@@@@@##@##+..+@@###@@@@@@#@##@+..++@####@@+@@@#$#@@..+@@@###@@@@@@#@#@+..+@@@@##@@+@@++.....+.@@###@@@@@@@###@+..+++####@+@@#@###@+.....+++@+$$$@@@++....@+$$$@@@@@$$@@@.....+@+###@@@@@####@@+...++++$$@@@@@$$$@++.++@@#$#@@@++@@$$$@@.+++####@@@@#$$$$@@+...@@###@@@@@@$$$@++.", +"..++@@@$$$$$$$@@++...+@@$$$$$@@#$$$$$@@..+@$$$$$$$$$$$$$@++...+@@@##$$$$$###@++..+@@$$$$$$$$$$##@++..+@$$$$$$$%$$$$$##+..+@$$$$$$$$@@.........+@@@$$$$$$$##@@@+..+@#$$$$$@@@$$$$$@@....+@#@$$$$$$$#@@+...++@#@$$$$$##+++.....+@@$$$$$@+@@@$$$@@..+@$$$$$$$$$$$$$@+...+@#$$$#@+@+@#$$$@@.++@$$$$$@+@@#$$$@+....+@@@$$$$$$$@@@+++.", +"...++@@$$$$$#$@@+...++@#$$$$$@@@$$$$$#@.+++$$$$$$$$$$$$$@++..+.++@#@$$$$$##@@++.++@#$$$$$$$$$$#@#++..++$$$$$$$$$$$$$#@+..++$$$$$$$$@++.......++++@$#$$$$$###@++.++@@$$$$$@@@$$$$$#@...++@@#$$$$$$$##@+...++#@#$$$$$#@@+......+@@%$$$$@@+@@$$$#@..++$$$$$$$$$$$$$@++.++@@%$$@#+++#@$$$#@..+@$$$$$+@+#@$$$@++...+++@$#$#$$$#@@++..", +"...+++@#$$$$$#@++....++@@@@@@@++@@@@@@+..++@@@@@@@@@+@++++....++++@+@@+@@+@++....++@@@@@@@@@@@+@++...++@@@@@@@@@@@@@+@+..++@@@@@@@@++..........+++++@@@@@++++.+..+@@@@@@++++@@@@@@+....+@+@@@@@@@@+@++...++++@@@@@@+@++......+@@@@@@+++++@@@@++..++@@@@@@@@@@@@@++..++@+@@@@+++++@@@@@+..++@@@@@++++@@@@++....+++++@@@@+@+@++...", +".....++++@@@@++++....++++@+@++++++@@+++...+++@+@++++@+@++.........++++@++++++......++@+@@@+@+++++.....+++@@@@+@@@@+++++...+++@@@@+++.............+++++@+@++++.....+++@@+@+++++@++++.....++++@@@+@@+++......+++++@+@++.........++@++@+++++++++++...++@+@+@+@+@@+++.....+@++@++++++++++++...++@@+++++++++++.........++++@++++.....", +".....++++++++++.......+++++++++++++++++...++++++++@+++++..........++++++++.........++++++++++++.......++++++@+++++++++....++++++++++..............++++++++........+++++++++++++++++.....+++++++++++++........++++++.+..........++++++....++++++....+++++++++++++......+++++++..++++++++....+++++....++++..........+++++++.+.....", +".........+++.............+.+....+...+........+.++.....................+++.............+..+..+..............+......+.............++....................+.+.....................+++.........+...++++............+.+++..............+.+.......+.........++.+++++.+..........+.........+..........+........................+........", +"................................................................................................................................................................................................................................................................................................................................", +"....................................................................................................................................................................................................................................+++++.........+++++....................++++++...............................................", +"...................................................................................................................................................................................................................................+@@@@@++.......+@#@+@+................+++@@@@@+..............................................", +"........+.......................................+........................................+..+....................................................................................................................+...............+++@@#@@@++......+@##@++................++@@#@@@++..............++.............................", +"...++++++++++++...........++++++++.........+++++++++++.............++++++++++.......+++++++++++++......+++++.+.+++++++.....++++++...+++++++....++++++...+++++++....++++++++++++++++....++++++++++++++++.....++++++++++++..........+@$$$##@++.....++@@@#@++...............+@@##$$$++.............+@@@+...........................", +".+++@@@@@@@@+++++.......+++@@@+@+++......+++@@@@@@@++++..........+++@@@@@@++++....+++@@@@@@@@@++@+...+++@+@++++++@++++...+++@+++++++++@++++..+++@+@+++++++@++++..+++@@@+++++@@@++++..+++@@@+++++@@@++++..++++@@@@@@@@+@+++........++$$$##@++.....++@@@##++...............++@##$$$@+...........+++@@@++..........................", +".++$#$$#$$$$$#@@+......++@@@#$$$$@@@+...++@@$#$$#$$$#@@++.......+++$#$$$#$$$$++...++$#$$#$$#$$$$$@+..++$$$$$@@@##$$$@@+.++@@$$$##+++#@$$$@@.++@@$$$#@@++#@$$$@@..+@##$$$$@@@#$$$$@@..+@##$$$$@@@#$$$$@@...+@#@$#$$$$$$$$++.......++@$$$#@@++......+@@@#@@++..............+@+##$$$@++..........++@$$$@++.........................", +".+@$$$$$$#$$$##@@+....+++@##$$$#$@@@+....+@#$$$$$$$$##@+++.....++@@$$$#$$$$#$@+..++@$$$$$$$$$$$$#@+..+@$$$$$@+@@@$$$#@+..+@#$$$@#+++##$$$#@..+@#$$$##@@@##$$$#@..+@#$$$$$@@@$$$$$#@..+@#$$$$$@@@$$$$$#@..++###$$$$#$$$$$@++......++@$$$@@++.......++@@$$@++...............++@+$$#@+...........+@@$$$@@+.........................", +"+++$$$$$$$$$$@#@@++...++@@##$$$$$@@@++...@@@$$$$$$$$@#@@@+....+++@@#$$$$$$$$$+@..++@$$$$$$$$$$$$$@@.++@#$$#$@@@##$$$@#+.+@@@$$$#@@+@@@$$$#@.++#@#$$#@@@@@#$$$@#.++@@$$$$$@@@$$$$$#@.++@@$$$$$@@@$$$$$#@..+@@@#$$$$$$$$$$@+........++$$$@++..........+@#$@@++..............+++@$$$@++.........++@@$$$@@++........................", +"+++@@@##@@@@@####@+.+++###@#@@@@@$$$@++..+@@$$$@@@@@####@++....+@####@@@@@$$$@+..+@@#$$@@$$$@@$$$+@.++@$$$@@@++@@$$$@@+..+@@$$$@@@+@@@$$$@@.++@@$$$@@@@#@@$$$@@.++@@$$$@#@@@#@$$$@@.++@@$$$@#@@@#@$$$@@..++###@@@@@#@$$#@++......++@$$$@++..........++@@#@@+...............++@$$#@+..........++@#####@++........................", +".+@@@###@@@@@####@+..+@@###@@@@@@$$$@@+.+++@#$$#@#@@#@###++...+@#@####@@#@$$$@@..++@$$$@@$$$@@#$$@+..+@#$$@@@+@+@$$$@@+.++@@$#$@@+++@@#$$@@..+@@$$$@@@#@@@$$$@@..+++$$$##@@@##$$$@+..+++$$$##@@@##$$$@+..+@####@#@@##$$$@+........++$#$@++.........++@@#@#@@+..............+++$$$@++........++@#@#####@+........................", +"..+@@@##@@@@@@@@##+.++@$$$@@@@@@@###@@+..++@###@@@@@@@###++...++###@@@@@@@#@#++..++@$$$@@$$$@@$$$@+..+@###@@++++@#$$@@+..++@###@@+++@@###++..+@@$$$@#$$$@@$$$@@..+++@@@$$###$$@@@++..+++@@@##@@@$$@@@++..++@@#@@@@@$$@@@++.......++@$$$+++...........+@#@#@++..............++@$$$+++........++@$$@@@#$+@........................", +".++@@@##@@+@@@#@##+.++@$$$@@+++++#####+..+++####@@@@#@###@+...++####@@@@@@##@@+...+@#$$@@$$$@@$$#@@.+++###@@++++@$$#@@+...++###@@@++@@###@+..++@#$$@@$$$@@$$#@@...++@@@$$#@#$$@@@+....++@@@##@@@$$@@@+...++@#@@@@@@$$@@@++.......+++$$$@+...........++@@$$$@++..............+@#$$@+.........+++$$@@@$$@++.......................", +"..+@@###@@+@@@#@#@+.++@$$$@@++++@@##@@+..++@###@@@@@@@##@++...++#@#@#@@@+@@#@@+..++@#$$@@$$$@@$$$++..+@###@@@++++$$$@++..++@###@@+@+@@###@+..+@@$$$@#$$$#@$$$@+....+@@@$$###$$@@@+.....+@@@##@@@$$@@@+....+@@@@@@@@$$@@@+........++@#$$@++...........++@$$$+++.............++@$$#@++........+@@#$@@@#$@++.......................", +".++@@@##@@+@@@####@.++@#$$@++++++#@@##@...++######@@$$##@@+...++@@@$$$$$#@@@@++....+@+@@@$$$@+@@+++.+++###@@++++@$#$@++...++@@#@@@+@@@@#@++..++@$$$##$$$##$$#@+.....+@@@@$$$@@@++.......++@##$$$##@++......+@@@@#####@@+..........+@$#$@+.............++@##@@+..............++$$$@+........+++@@@++@@@+@+.......................", +"..+@@@##@@@@@#@#@@+.+@@$$#@++..++@#@#@+..+++###@#@#@$$@#@++...++@@@$$$$$@#@@@@+.....++@@@$$$@@++++...+@###@@+++++$$$@++...++#@##@@+@@###@@+..++@#$$@#$$$#@$$$@@......+@@#$$$#@@+++......+++##$$$#@@++.......++@@#####+++.........++@$#$@++.............+@@@$$++............++@$$$+++........++@@@@++@@+++.......................", +"..+@@@$$$$$$$###@@+..@@$$#@+++++@@@#@#+...+@###$$$$$##@@@+.....++@@@@@@#$$$$$++.....++++@$$$@@+++...+++###@@++++@#$$@@+....+@@@##@@@##@@@+...+@@$$$$$@#@$$$$$@+.....++@@#####@@+.........++@@$$$@@+.........++@@$$#@@++.+........+++$$$@+...............++@#$@++...........+++$$$@+............+++.+++++........................", +"..+@@@$$$$$$$###@++.++@$$$@@++++@###@@@..+++###$$$$$##@+++.....+++@@@#@#$$#$$++.......++@$$#@++......++###@@++++@$$#@++...++@@@##@@@##@@@+...++@$$$$$@#@$$$#$@+.....++@@######@++........++@@$$$+@++........++@@$$$@@+++.........++@$$$@++.............+++@##@@++..........++@$$$@++............................................", +"..+@@@$$$$$$$##@@++..++$$$@@@@@@@####@+..++@###$$$$$##@@++....+++@@@@@#@$$$#$@+......++++$$$@+++....++@###@@++@+@#$$@@+.....@@@##@@@##@@@+....+@#$$$$#@@$$$$#@@...+++@@@#####@@@++........+@+$$$@++.......+++@#@$$$@@@@++.........+@#$$@+...............+++##@@@+..........+++$#$@+.............................................", +"..+@@###@@@@@@@++...+++@##$$@@@@#$$$@@+...++###@@@@@$$@@@++...++#@#@@@@@@@$$$@+.......+@+$$$@++......++###@@++@+@$$$+++.....+@+$$@@@$$@++....++@###$$@@@$$###++...++@@#$$@@@$$@@@++.......+@@$$$+++........+@+$$@@@@@@#@@+.......++@$$#@++...............++##@@@+..........++@$$$+@.............................................", +".++@@@##@@@@@++++....++#@@$$@#@##$$$@@+..++@###@@@@@$$@@@++..++@###@@@@@@@$$#@@......+++@$$$@@+.....+.@@##@@@@@@@$#$@@.......+@#$@@@$$@++.....++###$$#@@$$###@+...+@@@@$$@@@$$@#@++......+++@#$$@@++......++@@$$@#@@@###@++......+++$$$@@+...............++@@#@#++.........+@+$$$@++............................................", +".+@###$$##@@@++......++@##$$@#@#@$$$@++..+@@$$$##@@@@#$$$@+..++@$$$#@@#@#@$$$@+......+@@@$$$@@@+......+@@###@@@#@###+++......+@@#$$$@@@+.....++@#####@@@#####++..+@@$%$##@@@##$$$@@......++@#$$$@@+++....++@##$$##@#@$$$+++......++@$$$++++..............++@@###++........++@@$$#@+.............................................", +".++#@#$$#@#@@+.......++++@##$$$##@@@@@+.++@@$$$#@+@@##$$#@@..++@$$$###@@##$$$@+.....++@@#$$$@@+++.....@@@@#####@####@+.......++#@$$$#@+++.....++@####@@@#####@+.+.@@$$$##@@@##$$$@@.....++@#@$$$#@@+.....++#@#$$@##@#$$$@@........+@#$$#@++...............++@$$$@++......+++@@$$$@++............................................", +".++####$#@@@+++.......+@@@##$$$##@@@@@+..+@@#$$@#@++@@$$$@+..++@$$$#@#@#@#$$#@+.....++@@@$$$#@@++.....+@@###@#@#@##@++.......++@@$$$#@++......+@#####@@@####@@+.++@@$$$##@@@##$$$@@.....++@@#$$$@@@++....++@##$$#@#@@$$$@+........+@$$$@#@++..............+++$#$++.......++@@#$$$+++............................................", +".++@#######@@+.........+@@$$###$$$$$@@+...@@#####+@@@@###@@...+@#@########@@@++.....++@#######@++......++@@######@@@++........+@@###@@+.......++@@@@@+++@@@@@++..+@@#####@@@#####@@.....++@#######+@+.....@@@@#########@@++......++@#$$#@@++................@#$#@+.......++@@@$$$@+................................+.+.+.+.+....", +".+@@##@###@@+.........++@@$$###$$$$$@@+..+@@@##@#++++@@#@@@..+++@@@#@#####@@@+.......++#####@#@++......+++@#@####@@@+.........+@@@##@@+........+@@#@@@++@#@#@+...+@@###@#@+@@###@@@.....++@@######+++.....+@@@#########@@+........++##@##@@+...............++@@+++.......+@@####@@+............................+++++++++++++++..", +"..+++++++@+++..........@@@$$###$$$#$@@+...+++++@++..+++++++....++@+@+@+++++++........++++++@++++.........++@+@+++++............+++++++.........++++++++++++++.....+++++@++++@++@+++......+++++++++++......++@+++@+++++@++..........@@####@++.................++++........++@#####+++..........................++@@@@@@@@@@@@@@@.", +"..++++++++..+...........+@@@@@+@@@@@++....++++++.+...++++......+.++++++++++.+..........++++++.............++++++++.............++++.+...........+.++..+.++..+......++++++++.+++++.+.......++++++++..........+++++++++++.+.........++@#@#@@++.................+++.........++@@#@#@++..........................+@+@@#@#@#@@###@@@.", +".....+..................+++++++@@@+++.......+..........................+..................+..+................+.............................................................................+.++.................++++..............+++++++++............................+.+++@+@++............................@@@#@#@#@#@@#@#@@.", +".........................++++++++++++...............................................................................................................................................................................................+++++..................................+.++++...........................++@@###############.", +"................................................................................................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................................................................................................", +"...........................................++++.............................................++++.................................++++++++..........................++++.....................+++...................+++..........++++...................+++++.....................................................................", +"........+++...............................+++++++..........................................+++++++..............................++++@@@+++........................+++++++..................++++++................++++++.......+++++++................++++@+++...................................................................", +".....+++@@@+............................++@@$$$@++.......................................+++$$#@@++............................++#@##$$$$++.....................++@@$$$@++................++@$$$++..............++$$$@@......++$$$@@+...............++@$$$$$++..................................................................", +".....++@@@@++............................+#@$$$@@+........................................+@$$###++...........................++@@##$$$$$@+......................+#@$$$@@+................+@@#$#++..............++$#$@@+.....+@$$$#@@+..............+@@$#$#$++..................................................................", +".....+@@$$$@++...........................+@@###@@+......................................+.++@@###++..........................++@@$$$@@@@++.......................+@@###@@+................+@@###++.............+++###@@+.....++@@@##++...............++@@$$$++..................................................................", +".....++@$$$@@+...........................+++###@@+++..................+.+...............+++@#@###@+..........................++@@$$$@@@@@++...........+.+........+++###@@+++.............+@@@###@++...........+++@###@@++....++@@###@+++.............++@@$$$@++............+.+.+................................................", +".....+@@$$$@++...........++++++++........+@@###@@@++++............+++++++++++.........++++@+@####++.......++++++++.........+++@@@$$$@@@@@+.......++++++++++++....+@@###@@@++++...........++@@###++............++@@###@@+.....++@@@##@++++++..........++@@$$$@+........++++++++++++++.......+++++++++++............++++++++......", +"......++@#@#@++.........+++@@@@@+@+.......++###@#@@@@@+++.......+++@@@@@@@@@@+.......++@@@@#@@###@+.....+++@@@@@@@+++......++@@#######@@@+.....+++@@@@@@@@@@@+....++###@#@@@@@++........++@#@#@@++..........++@@@@#@@@@++.....@@@@##@@@@@@+@..........++@$#$@++......++@@@@@@@@@@@@@++....+@@@@@@@@@@@++........+++@@@@@@@+++...", +"......++@#@#@++.......+++@@@#@@@@+++......+@####@##@@@@+++.....+++@@@@#@#@@@@++....+++@@@#@#@###@@+....+++@@@#@@@@@+++.....+@@@#####@@#@@+....+++@@@@#@@@#@@@@....+@####@##@@@+++.......+++@@#@#+++.........+@@@@@#@#@@++.....+@@@##+@@@@@@@+.........++@$$$+++.....+@@@@@#@#@#@@@@@@++.+++@@@@@@@@@@@+++......+++@@@#@@@@@+++..", +"......++++@@@+.........+@#@$$$$$$$@++....+++###$$$$$$$@#@+....++@#@$$###$$$$$@+...++@#@$$$$$$$###++...++@@#$$###$$##@+.....+@#@$$$$$###@@++..++@@#$$###$$$$$@@+..+++###$$$$$$$@@@+......+@@##$$$@+..........+@@###$$$$$++....++@@@##@@@$$#@@+..........++$$$@+......+@@$$$$$$$$$$$$$@@+..+@@$$$#####$$@@@+....++@@#$$###$$##@+..", +".......++++@@+........++###$$$$$$#@++....++@###$$$$$$$##@@+...+@@##$$###$$$$$@+...+@@##$$$$$$$###@+...+@##@$$###$$@##++...++@#@$$$$$###@@+...+@##@$$###$$$$$#@+..++@###$$$$$$$#@@+......+@@##$$$@++.........+@#@##$$$$$++.....+@@@###@@$$#@@@.........++@#$$+@......+@@$$$$$$$$$$$$$#@@.++@#$$$#####$$@@@+....+@##@$$###$$@##++.", +".........++@@+........++@@##$$#$$$@@++....++###$$$$$$$###++...++###$$###$$$$$@@...++#@#$$#$$$$###@+...++@##$$###$$#@#@+....+@#@$$$$$####@++..++@##$$###$$$$$@@+...++###$$$$$$$@@@++.....++@##$$$@+.........++@@####$#$$@++....+@@@###@#$$@#@+........+.+@$$$@++.....@@#$$$$$$$$$$$$$#@+..@@@$$$#####$$#@@++...++@##$$###$$##@@+.", +"......................++@@@#@#@@$$@@@.....+@#####+@@@@$$$@+..++@#$$@@@@@@@$$$@+..+@@$$$@@@@@####@@+..++@$$$@#@@@@#$$$++....+++@@@###@+++++..++@$$$@@@@@#####@++...+@####@@@@@####++......++@@$$$+++.........++++@@@@@$#@+.....+@@#$$$$$@#@+++.........+++$$#@+......++@###@@#####@@@##+..+@@#####@@@@@###++..++@$$$@@@@@@@$$$@+.", +"......................+@@@@@#@#@$$@@@+...+++###@#@+@@@$$$@@...@@$$$@@++@@@$$$@+...++$$$@@@+@@####++..++@$$$#@@@@#@$$$@@.....++@#@##@@@++....++@$$$@@@@@#####@++..+++#####@+@#@###@+.....+.+++$$$@+............++++@@@$$@++...++@@@$$$$$@@@++..........++@$$$@++.....++@###@#@#@#@##@#@@...+@#####@@@#####@+..++@$$$@@@+@@@$$$@+.", +"......................++###$$###$$@@++....++###@@@@@@@$#$+@..++@$$$@@@++@@@@@++..+@@$$$@@@+@@@###@+..+@@$$$$$$$$$$$$$@+.....+++@#@##++++....+@@#$$@@+++@@###@++...++###@@@@+@@###++.......+@+$$$@++.............+++@@$#@+.....+@@@$$$$$@@++............+@#$$+++.....+++###@######@@##@@..+++###@@@+@@@###++..+@@#$$@@@++@@$#$@+.", +"......................+@###$$###$$@@@+...++@####@++++@$$$@@...@+$$$@++++++@@@++..+++$$$@@+@@@@###@+..++@$$$$$$$$$$$$$@+......++#@##@@++.....++@$$$@@+@@@@###@+...+++###@@++@@@###@+.......++@$#$@+................++@$$@+.....+@@@$$$$$@@@++..........++@$$$@+.......+@###@@#@#@#@#@##+...+@###@@+@+@@###@+..++@$$$@+++@+@$$$@@.", +".....................+++###$$###$$@@@+....++###@@@@@+@$$$+@..+@@#$$@++++++@+@++..+@@#$$+@++@@@###++..++@$$$$$$$$$$$$$@+......++@#@#@@+......+@@$$$@@++@@@###++...++@@##@@@+@@@##@@+.......++@$$$@++..............++@@$#@++....+@@@$$$$$@@++...........++@$$$@++.....++@####@###@#@#@#@+...+@@##@@+@+@@##@@+..+@@$$$@@+++@@#$#@+.", +".....................++@$$$@@@@@$$@@@++..++@#####@+@@@$$$@+...+@$$$@@+++++@@@++..++@$$$@@@@@#####@+..+@@$$$##@@@@@###@+.....++@#@##@@++......++$$$@@@@@#####@++...+@###@@+++@@###@+......++@+$$$@+++.............++@@$$++....++@@@#####$$@+++........+++@#$$@@++.....+@###@@#####@#@##@..++@###@@@+@@@###@+...++$$$@@@+@@@$$$@@.", +".....................++@#$$@@@@@$$#@@+...++@#####@@@@#$$#@+..++@$$$@#@++@+@@@@+..++@$$$#@@@@#####@+...+@$$$##@#@#@#@@@+.....++@@#@##@++++...+@@#$$@#@@@#####++...++@###@@@@@@@###++.....+++@@$$$@+++............++@+@$$@++....+@@####@#$$@@++........++@@$$$++++....++@####@##@#@@#@#@@..++@###@@@+@@@###++..+@@#$$@@@@@@#$$$++.", +".....................++@$$$@@@@@$$@@@++..++@#####@@@@@$$$@@...++$$$@@@@@@@@@@@@...++$$$#@@@@#####@+..+@+$$$@#@@@@@###++....++@@@###@@@@++....+@$$$@@@@@#####@++..++@###@@@+@@@###@+.....+++@@#$$@@@+++.......+++++@@@$#@+....+@@@@####@$$@@@++......++@@@$$$@@@+++..++@###@@###@##@###@..++@####@+@@#@###@+...+@$$$#@@@@@@$$$@@.", +".....................++@#$$$$$$$$$$$$@+..+@@$$$$$$$$$$@#@++..+++@##$$$$$$$$$$@@..+++@@#$$$$$$$$$$@@...++@@#$$$$$$$$$$@+....+@@#$$$$$$$@@@+...++@##$$$$$$$##@@+...+@@$$$$$@@@$$$$$@@...++@#@$$$$$$$@#@+.......+@@@@#@###++....+@$$$#@@@@$$$$$@@+...++@@##$$$$$$@#@+..+@@$$$##@##$$#@#$$@..+@@$$$$$@@@$$$$$@@...++@#@$$$$$$$@@@++.", +"......................++$$$$$$$$$$$$$++..+@@$$$$$$$$$$@#@++....@@@@$$$#$$$$$$@@...++#@@$$$$$$$$$$@@....@@#@$$$$$$$$$#++....+@#@$$$$$$$##@+....@@@@$$$$$$$###++..++@@$$$$$@@@$$$$$@@....+@@#$$$$$$$#@@+.....++@@@@@#####++....++$$$##@@@$$$$$@@+....+@@#$$$$$$$#@@+..+@@$$$####@$$##@$$@..+@@$$$$$@+@$$$$$@@....@@@#$$$$$$$##@++.", +"......................++@+@@@@@@@@@@@++..+@@@@@@@@@@@@@+++.....++@@@@@@@@@@@@++....++@+@@@@@@@@@@@@....++@@@@@@@@@@@@+.....+@@@@@@@@@@@@++....+@@@@@@@@@@###@+...+@@@@@@@+++@@@@@@+....+@@@@@@@@@@@@++......+@@#####@@@++....++@@@@+@+@@@@@@@++...++@@@@@@@@@@@@++..+@@@@@@@@@@@@@@@@@@..+@@@@@@@@++@@@@@@+....++@+@@@@@@@+@++..", +".......................++@+@@@@@@@@@++....++@@@+@@@@@@+++.......++++@@@@@@@++++.....+++@+@@@+@@@@++......++@@@@@@@+++.+....+++@@@@@@@@+++......+++@@#@#@####+++...++@@@+@+++@@@@@@+.....+++@@@@@@@+++.......+@#@#####@++......++@@+@+++@@@@@++......+++@@@@@@@+++....++@@@@+@+@@@+@@@@+...++@@@@@+++@@@@@@+.....+++@+@@@@@+++...", +".......................++++++++@++++++....++++@++++++++...........+++++++++++........+.+++++++++@++.......++++@++++++......++++@@@@@+++++......+++@@@@@#@###++....++@@@++++++++++++.....+++++@++++@++......++@@#####@++.......+++@+++..++@+@++......++++++@+++@++....++@@+++++++@+++@++...+++++++++++@+++++......+.+++++++......", +"..........................+++++.+++.+........+.++++++...............++++.+++...........+++++++++............++.++++...........+..+.+++++.......++@@@##@###@#++.....+.+.+++..++++++.........+++++++..........+++++++@+++........+......+.+++..........+.+++.+++..........+++.++.+++.+.+......++++++..+.++++.........+++++.+......", +".................................................................................................................................+.............++@@#@@#####@++................................................+++++++...........................................................................................................", +"................................................................................................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................................................................................................", +".....................................................................................................................................................................................................................................+++@...............++++.............+++@...................................................", +".....................................................................................................................................................................................................................................++@@++.............+@@@+.............+@@+++................................................", +".....................................................................................+++...........................................................................................................................................++++@@++............++@@@++..........+++@@@+++...............................................", +"....................................................................................+++@@+........................................................................................................................................++@##@@++............++$$$++...........++@@@#@++..............................................", +"...................................................................................+@@@@#++.......................................................................................................................................+@@##@@++............++$$$++............+@###@@...............................................", +"....................................................................................@@@##@+++.....................................................................................................................................++$$$@@+............++@#$$@++...........+++$$$+++.............................................", +"...+++++++++++...........++++++++++++........+++++++++++..........+++++++++.......++@@@##@++++.........++++.....++++.......+++++++.+++++++.....+++++....+++++.......++++++.++++++......+++++....+++++.......++++++++++++.........++@$$$+++............++@$$$++............+@@$$$@+..............................................", +"..+++@@@@@@@+++++......+++++@@@@@@@+++.....+++++@+++@+++++......++++@@@@+++++....+++@@@##@@@@+++......+++++++.++++++++....+++@+@++++++@@+++...+++++++++++++++++....+++@+++@++@++++....+++++++++++++++++....++++@@@@@@@++++........+@#$$@+.............+++$$$@++............++$$$@++.............................................", +"++@@$#$@@$#$##@@+.....++@@###$##@$$#@@+....+@###$@@@$$##@++....++@#@$#$#@#@@+.....+@$$$$$$$#$$+@+...++@@$$$@@+++$$@#@++.++@@$$$$$@@@$$#$$@@.++@@$$$@#++@@#$$$@@..+++$$$$$@@@$$$$#@+.++@@$$$@@+++@#$$$@@....+@#@$#$#$#$#@@+.......++@$$$@++............++@#$$@+............++@#$$++..............................................", +".+@@$$$##$$$##@@@+....+@@@##$$$##$$$#@+...++#@#$$#@##$###++....++@##$$$#####++...++@$$$$$$$$$$@++....+@@$#$+@++@#$#@#++..+@@$$#$$@@@$$$$$@@..+@@$$$#@@@+#@$$$#@...++$#$#$@@@$#$$$++..+@@$$$#@@@@@@$$$#@...+@@##$$$$$$$###++......+++$#$@+..............+@$#$@++............+@$$$@++...........+++++++++.+.......................", +"++@@$$$##$$$##@@@++..++@@@##$$###$$$@@+....+@##$$@#@$$###++..+++@@##$$$@##@#++....+@$$$$$$$$#$@++...++@#$$$@@++@$$##@++.++@@$$$$$@@@$$$#$#@.++@#$#$#@@@@#@$$##@..+++$$$$$@@@$$$#$@+.++@##$$#@@+@#@$$#@@...++@##$$$$$$$@#@++......++@$$$+@.............++@$$$+++...........+++$$$@++........+++++++++++++++......................", +".+@@#$$$$@@@##$$$@+..++$$$##@@@$$#$$@@+...++@@@$$$$$@@##@@+...+@#@$$@@@#####++....++@#@##@@@@@+++....+@@#$$@@@+@@@###@+..+@@#$$@@@@@@@$$$@@.++@@$$$@@###@@$$$@@...++@@@$$@@@$$#@@++..+@@$$$#@@@@#@$$$@@...+@###@@#@@$$@@@+.......+@@$$$@++............+++$$$@+............++@$#$@@+........+@@@$$@#@@@##@++.....................", +"++@@$$#$$@@@##$$#++..++$$$##@#@$$$$#@@.....++@@$$$$$@@@#@++..++@##$$@#@#####++....++@#@##@@@@@+......++@$$#@@@+@@####++..++@$$$#@@@@##$$#@+..+@@$$$@@###@@$$$@@...++@@@$$@@@$#@@@++...+@#$$@#@@+#@$$$@+....+@####@##$$@@@+......++@@$$$+++............++@$$$@++...........++@$$$@@+.......++@@@$$##@@@###++.....................", +"..++###@#@@@@+$$$@+.++@$#$@@@@@#@###@++.....++@$$@@@@@@+++...++@@@$$$$$@@@@@++....++@@@##@@@++.......++@###@@++@@@###@+..+++@@@##@@@@#@#@++.+++@###@#$$$#@###@+....++@@@@$$$@#@@+....++@@@@$$@@@$$@@@++...++@@@@@$$$#@@++........++@$$$@+..............++$#$@+............+++$$$@+++.....++@$$$@@$$$$$##@@+.....................", +".++@####@@+@@@$$$@@..++$$$@@+@@#@###+++.....++@$$@@@++++++...++@@@$$$$$#@@@@+.....++@@###@++.++......+++###@@+++@@##@@+...++@@###@@@##@@@++..++@####@$$$@####++.....++@@#$$$@@@++.....++@#@$$@@@$$#@@++....++@@@@$$$@@@+++.......++@$#$@++............++@$$$+@.............+@#$$@++.......+@$$$#@$$$$$@#@@+.....................", +"..++###@@@@@@@$$$@+.++@#$$##@@@$$###@+......+++$$@@@+++.......+@@@#$$$$@#@@@++.....+@@@##@+++.........+@###@@@+@@@###@+...++@@@@#@@@###@@+....++###@#$$$@@###@+.....++@@@$$$#@+++.......++@$$@#@$$@@++.....++@@#@$$$#@@++........+++$$$++.............+++$$$@++...........++@$$$@+........++$$$#@$$$$$##@++.....................", +".++@###$$@@@##$$$@+..+@$#$###@#$$##@@+......+@+$$@@@++.......++@@#@@#@#$$###++....++@@@##@@+++++......++###@@@++@@###@+....+@@@$$@@@$#@+++....+@#####$$$$$###++.....++@#@$$$@#@++.......+++@#$$$@@@+.......++@@$$##@@@@@++.......++@$$$@++............++@$#$+++...........+++$$$+@........++@+@+@@+@@@@@++......................", +".+++###$$@#@##$$#++..++$$$##@#@$$###@+.....+++@$$@@@+++......++@@@@@###$$##@@+......@@@##@@@@@+++....+++###@@@@@#@###@+.....++@#$@@@$$+@+....+++#####$$$$$###++....++++#@$$$#@@+++.......+@##$$$##+++.....+++@@$$###@@@@@+.......+++$$$@+.............+++$$$@+............++@#$$@++.........++@+++@+@++++.......................", +"..+@#####$$$##@@@++.+.++@@#########@@++....+@@@$$@@@@@++.....++#####@@@#@$$$@+.....+@@@$$@@@@#@@@+....++@####@@@##$$#@@.....++@@#$$$#@@+......++@@#$$@@@$$@@@++....+@@#$$@@@$$@@@+.......+@@@$$$@@+.......++@#@$$@@##@##@@.......++@$#$@++............++@$$$+++...........++@$$$+++........++.+.+.+++++.+.......................", +"..++#####$$$@@@@++....++@@##########@+....++@@@$$#@#@@+++....++######@#@#$$$@++.....++@$$#@#####@++...+@@#####@@##$$$@@......+@@#$$$#@+++.....++@@@$$@@@$$@#@+....++@#@$$@@@$$##@++.....+++#####@++........@@##$$@#@@####++.......++$$$@@+.............+@@##@+............++@$#$@+..............................................", +".++@###@@@+@@@+++.......++++@@@@@###+++...++@#@$$@#@@@@++....++######@#@#$$$@+.....++@@$$@@###@#@+....++@#@##@#@##$$#@@......++@@$$$#@++......++@@@$$@@@$$@@@+....+@@@#$$@@@$$@#@++....++@+@###@@++.......++#@#$$@##@####++.......++$$#@++.............++##@@+............+@@$$#@+..............................................", +".++@###@@@@+++...........+++@@@@####@+....++$$$$$###$$@++.....@@@##@$$$$$@@@+++.....+++@@$$###@@++.....+++@##$$$#@$$$@@.......+@@#@#@@+........+@@@#@@@@@#@@@+....++$$###@@@#$$$$++...+++@@#@###++........++@#@$$$$$$$#@@++......++@#$$@@++............++@#@++...........+++@$$$++..............................................", +".++@####@@+@+.+.........+.+++@@@@###@++...++#$#$$####$+++.....+@@@#@$#$#$@@@+........++@@$$$@@@@++.....++++#@$#$@##$#@@.......+++##@@++.........++@@@++@@@@++.....++#$$##@@@$#$#$++...++$$$$$$$$++........++@@##$#$#$##@@+.........+@@@@@++.............+++++............+@@@@@@++..............................................", +".+@@$$$$$#@@+..............+@@#$$$$$@@+...++++@+@+@+@+++......+++@+@+@@@++++..........++++++@+++.........+++@+@+@+@+++.........++++++............+++++++++++......+++++++++++++@++....++$#$$$$$$@++........++++@+@@@+@+@++.........+++@#@+++............+.++.............++#@+@+................................................", +"++@@$$$$$@@@.+.............+@@@$$$$$#@+....+++++++++++.........+.+++++++++.............+++++++.+...........+++++++++++..........+++.+.............+.+..............+++++++++++++++.....+@@@@@@@@+...........+++++++++++............+++++++.................................+++++................................................", +".+@@@@@@@@@++..............++@@@@@@@@++.......+...+.......................................+...................+.+.+.+.................................................................++@@@@@@@+++..............+..+........................................................+...................................................", +"..++@@@@@@++................+++@@@@@+++.................................................................................................................................................@@@@@@@+................................................................................................................................", +"................................................................................................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................................................................................................", +"..................................................+.+.............................................................................+.................+++++++.....................................................................................................................................................................", +".................................................+++++..............++++++..............................+++++.+.+++++...........+++++.............++++@@+@+++...............................++++.+...............+.+............................................................................++++.+..........................", +"................................................++#@#++...........+++@@@@++...........................++@@@@@+++@@@@++.........++#@#++...........++@@$#$$$@#@+...........................++++@@@+++............++@+@++.......................................................................++++@@@+++...........+++++++.......", +"...#############...............................+++###+++.........++@@@@@@@++..........................++@@@@@+@+@@@@@++........+@@##++..........++@#@$$#$$@#@++........++.++++..........+++@@@@@@@+++.........+++@@@@++.....................................................................+++@@@@@@@+++........++++@@++++.....", +"..##$$$$$#$$$$$##.............................++@@$$$@@++.......+++#$$#$$$@@+.......++++.+.+.++++.....+@$$$$$@@@$$$$$@+........+@$$$++..........+@@$$@#@#####++.....+++@@+++@#+.......++@@@$$$$#$$@@@+.......++@@@@@$$++..................................................................++@@@$$$$#$$@@@+.......+@##$#$$@++....", +"..##$$$$$$$$$$$$#............................+++@@$$$@@@++......++@$$$$$$$@++......+++@++++++++@++...++@$$$$$@@@$$$$$@+.......++@#$$@++........++@@$$#@@#@###++.....++@@@+++#@++.......+@@@$#$$$$$#@@++......++###@##$++...................................................................+@@@$#$$$$$#@@++.....++#@$$$$#@@+....", +"..##$$$$$$$$$$$##............................++@@@$$$@@@++......+@@#$$$#$$@@+......+@@@@@@@@@@@@++....+@$$$$$@@@$$$$$@+........+@$$$++.........+@@@$$@#@#@###++.....+++@@+++#@+......+++@#@$$$$#$$@@@++......++@#@#@$$++.................................................................+++@#@$$$$#$$@@@++.....++@#$#$$#@++....", +"..#$$$%%%$$$$$$$#...........+.++............+@@@$$$$$$$@@+.....+@@@$$@@@@@+++.....++@#@$$#$#$$#@#++..+++@@#$$@@@$$@@@++.......+++$$$@++.......++@@@$$@#@@@@@@++.....+++@+++++@+.......+@$$$#@$$$##$$$@+.....+@@#####$$@++..........+.+.+.+++........+++++++++++++.........................+@$$$$#$$$##$$$@+......+@@@@@@@+++....", +"..##$$$$$$$$$$$##..........+@@@@@+.........++@@#$$$#$$$@@@.....++@@$#@@+@++++.....+@@##$$$$$$$#@#++...++@@#$$@@@$$#@@++........+@#$$+++.......++@##$$#@#@@@@@+.......++++++++++.....+++@#$$##$$$@#$$#@+.....++@@###@$#@++........+++++++++++++....+++@@@@@@@@@++++......................+++@#$$$$$$$@#$$#@+......++@@@@@@+++....", +"..#$$$%%%$$$$$$$#..........++@@@@+.........++###@@@@@##@@++...++@@@##@+@+++.......++#@###@@@####@++....+@@@$$@#@$$@@@+........++@$$$@+.......++@#$$@#$$$##@@@+..............+........+#@###$$@@@##@#@#@.....@@@##@@@$$@++........+@@@##@@###@@+....@##$#$$#$#$$$$++......................+@#@#@$$@@@$$@#@#@........+++++++......", +"..#$$$%%%$$$$$$$#.........+.@+@@@++........++####@@@@@#@@+.....+@@###@@+++........++###@##@@#####++.....++@$$@#@$$@+++.........++$$$++.......++@$$$#@$$$##@@@++.....................++@@##@$$##@####@#@....++@@##@#@$$@++......++@@##@#@@##@@@...++@$$$$$$$$$$$#$@+.....+++++++++++.....++@#@#@$$##@$$##@#@.....................", +"..##$$$$$$$$$$$$#.........++@@#@@+........+++####@@+@#@+@++...+@@@@##@@@+++......++@@####@#@####@@+....+++@$$#@##$@@+.........++@#$$@++......++@#$$@#$$$##@@@++.....................++#@###$$@#@##@#@#@.....@@@##@@@$$@@++....+++@#@###@@###@@+...++$#$#$$$$#$$$$@+....++++@@@@@@@+++....@@@#@#$$@#@$$@#@#@.....................", +"..#$$$$$$$$$$$$$#..........+#@@##++........+@@##@@@@+@@++.....+@$$$$$$#$@@........++###@#@@@@@###++.....+++##$$$##+@+..........++@@@++.......++@$$$##@#@##$$$@+.....................++#####$$@@@@@#@##@....++@@#######@@+.....+@@@$$@@@#####+++....+@@@@@@@@@@$$#@@...+@@##$#$#$#$$$++..++###@@$$#####@#@##.....................", +"..##$$$$$%$$$$$##.........++@##@@@+.......++@####@@+@@+@++....++$$$$$$$#@@+.......++###@@@@@#@###@+.....++@@#$$$##@++..........+@@@@@+........++$$$##@#@##$$$@+.....................++@##@#$$@@@#@#@@##.....++@#####@#@@++...++@@@$$@@@#####@+....+++@@@@@@@@@$$$@+...+@@@$$$$$$$$#$++...@@@#@#$$#####@#@#@.....................", +"..#$$$$$$$$$$$$##........+++#@###++........++@####@@@#@@++....++@@@$$@#@@++.......++@#####@@####@++.....++@##$$$@#@@+..........+@###++.......+++@@@##$$$##$$#@+.....................++@@$$$$$$$$$$###@@....+@@@#$$$$$$@@+....+@$$$##@#@$$@@@++......+.++++@@@@$$#@+...+@@@@@@@@@@@@@+...++@@###$$@@######@@.....................", +"..#$$$$$$$$$$$$##.........++#@###++........++##@###@@##@@++...+@@@@$$#@@@++......++@#####@@###@##@+.....++@@#$$$##+@+..........++###@++........++@@##$$$##$$#@+......................+@@#$$#$$$$$$###@@.....+@@$#$$$#$@@++...++$$$@#@#@$$@@@@+.......+..+.++++$$$@@....++@@@@@@@@@@@++...+@@###$$#@@#####@@.....................", +"..#$$$$$$$$$$$$##........++@$$$$$@++.......++@####@@@#@@@+....++@@#$$@#@@++++.....++@#####@#####@++....+++@##$$$@#@++..........++##@@+........+.++@@@@@@$$###++.....................++@@$$$$$$#$$$###@@.....++@$$$#$$#@@+....++$$$#@#@#$$@@@++.............+++#$#@+...++++@@@@@@@@++....++@@###$$@#@#####@@.....................", +"..#$$$$$$$$$$$$##.........++$$$$$@+.........++@+##%$$##@++....+@@#@$$@@@@@@@++...+++#@##$$$$$$#@#++.....++@@@$$$@@@@++........++@$$$++.........+++@+@@#@$$###++.......................+@@######@####@++.....+++@@@#@@@+++....++@@@$$@@@#####@++.............++@@@++.....++.++++.+.++.....++@@#@$$#@#$$###++.....................", +"..##$$$$$$$$$$$$#........++@#$$$$@++........+++@##$$$##+++....++@@#$$@@@@@@@+++...++@##$$#$#$$#@#++....+++@@#$$$@@@++.........+++$$$@++.......++@@#@@@@@$$@@@++.......................++@#@##########++.....+++@@@@@@@++.....++@@@$$#@######++..............+.@+@++...........+.+.........++###$$@@@$$#@#++.....................", +"..#$$$$$$%%%%%$##.........+@$$$$$+++.........++++@$$$@@++.....+@$$$$$$$$$#$$$@+....+@@@@@@@@+@@@++.....++@@$$$%$$$@@+.........++@$$$@+........++#@#@@@@@$$@@@++.......................++@@@@@$#$#@@+@+.......+.++++++++.......++@@#@###@@###@@+................+...........................+++@@#$$$#@@@++......................", +"+.##$$$$$$$$$$$$#.........+@$$$$$@++...........++@$$$+++.....++@$$$$$$#$$$$$$++....+++++++++++@@++.....++@@#$$$$$$@@+..........++$#$@++........@@##@@@@@$$@@@+.........................+++@#@$$$@#@+++...........++............+++@#@#@@@###@@+............................................++@@@@$$$@#@@++......................", +"+.#$$$$$$$$$$$$##........+++$$$$$@+............++@#$$@++......+@$$$$$$$$$$#$$@+.....++++++.+.++++.......++@$$$$$$#@@++........++@$$$++........++###$$$$$$$@++...........................+++@@$#$@@+++...........................++@@#@#@+#@#@++.............................................+++#@#$$@@+++.......................", +"..##$$$$$$$$$$$#..........++$$$$$+++............++@@+++.......++@@@@@@@@@@@@++.......++.................+++@@@@@@@+++..........++$$$@+........++@##$$$#$#$+@+............................++++@+@+@+..............................++++@+++@++++...............................................+.+@++@@++.........................", +"...############..........+++@#@#@@+..............++@@+.........+@@@@@@@@@@@+@++.........................+++@@@@@@@++..........+++$$$+++.......++@@@@@@@@@@++...............................+++++++................................+++.+++++++..................................................++++.++..........................", +"..........................++@@#@@++..............................+++++++@+++..............................+++++++++............++@@@+..........++@@@#@@@+++.......................................................................................................................................+.............................", +"..........................++@@@#@+................+................+++++.....................................++.................++@+++..........++@@@@@@++......................................................................................................................................................................", +"...........................++@++++..............................................................................................++@+...............++++.+.......................................................................................................................................................................", +"....................................................................................................................................................................................................................................................+.+.................+.+................++++.................................", +"................................................................................................................................+.++++++...........................................................................................................+++++...............+++++..............++++++++..............................", +".......++@++++................................++@+@++.............++@+@++.....................................................++@+@@@+@@++..................................................++++.................................................++@@@@@+............++@@@@@+............+@@##@#+++.............................", +".......++@@@++................................++@@@@++............++@@@@++..................................................+++@@@@@@@@@@+.................................................+++@++................+.+..............................@@###@@+............@@###@@+..........++@#@###@@++............................", +".....+++@@@@@+++.............................++@@@@@@++..........++@@@@@@++...............+++..............................+++@@@@@@@@@@@+................................................++@@@@++............++++++++..........................++@@#@#@++..........++@@#@#@++.....+++..+@@##@##@@@+...+++......................", +".....++##@@@##++............++@++...........++@#@@@##@++........++@#@@@##@++............+++@@@+...........................++@#@$$$%$$$$$$@+..............................................++@@$$$++............+@@#@#@@+...........................@@$$$@@+......+++...@@$$$@@++...+++@@.+@@@@#@#@@@+++++@@@..........++++.......", +"...+.++###@###+++..........++@@++...........++##@#@##@@+........++##@#@##@@+...........++@@@@@+...........................+@@##$$$$$$$$$#@+..............................................+@@#$$$++..........+++@@#@#@@@+........................+++@$#$@@+...++++++.+++@$#$@@++.++@@@@@.+@@#@#@##@@+++++@@+..........+@##+......", +"....@@@##@@@##@@+.........+++$$$+++..........+@@@@@#@@++.........+@@@#@$$+@+...........++#@#@++..........................+@@$$$@@$$$##@@@++...............................................++@$$$@++.........++@##@@@##@++........................++@###@@++...@@@#@..++@###@@+++++@@#@@.++@@@#$$@@@+@@@@#@@.........++#@@++.....", +"....+@@##@@@##@@@.........++@$$$@++.........++@@@#@##@++........++@@#@@$$@++...........++###@++........+++......+++......++@$$$@@$$$##@@@++...............................................++@$$$@+.........++@@##@@@##@@+........................++@###@@+++++@@@#@..++@###@@+++@@###@@.++@@#@$$@@@@@@@@##+.........++@@@+......", +"...++@@##@@@##@@+.......+++@+$$$@@+++........+@@@@@##@++.........+@@@#@$#@@++.........++@@#@++........+++++++.+++++++.....@@$$$#@$$$###@@+...............................................++++$$#@++........++@@##@@@##@@@+.......+.+..+...........+@###@@@+++@@@@#@...++###@@@++@@@##@@.++@@@#$$#@@@@@#@#@+.........++@@@++.....", +"....++@##@@@##@++......+@@@@@$$$@@@@@........+@@###@@@++........++@@@#@##@@+...........++@@@++.......+@@###+@+++$$@#@+...++@$%$@#$$$##@@@+...........+.+..................................++@$$$@++........++@@##@@@##@@+.....+@+@++++@++++......++@###@@@++@@###@+..+@@###@@@@@@#@@@@+.+@@@@@#@###@@###@++.........+@@@@++.....", +"....++@@#@#@#@@++.....++@@@@@$$$@@@@@++.....++@@###@@++.........++@@#@###@@++.........+.+++++........+@@#@#@@+++#$@#@++...@@$$$#@$$$##@@@++........++++++.................................+@+$$$@++.........@@@##@@@##@@@+....+@@@+@@@@@@+++.....+++###@@@@@@@##@@+..+++###@@@@@####@@+.+@@#@#@##@#@@##@@++........+++###@+.....", +"......+@@@@@@@+++.....++$$$$$$$$$$$$$++.....++####@##@++........++$$@@###@@+.............++..........+@@$$$@@+@@@####++..++@###$$$$$##@@@+........++@#@#+.................................+@@$$$@@+.........+@@###@@##@++....++@###@@@@$$@@++....+@######@@###@#@@+..+@###############@.+@@#####@#@##@#@@++........+@+###++.....", +".....+++@@@@@++.......+@#$$$$$$$$$$$#@+.....++@#@@##@@@+........+@#$#@@##@@++........................+@@#$$@@+++#@###@+...++@#@$$$$$##@@@+........+@@###++................................+@@$$$@@+........+++@##@#@##@@+....++#####@@@$$@@@+...++@@#######@###@#+@.++@@####@#####@##@#.++@######@#####@@@........++@@$$$@++....", +".......++@@@++........++$#$$$$$$$$#$$++.....++####@#@@++.........+#$@@@##+@+.........................+@@$$#@@@+@@####++...++@##$$$$$###@@+........+@@#@#++................................+@@$$$@@+.........++@##@#@##@++....++@####@#@$$@@@@+..++@@####@######@#+@.++@##############@#.++@@###@#@###@#@@+......+++@@#$#$++.....", +".........+.............++@+@@$$$@@@++++......+@@@@@@@++.........++@@@@@@@++...........................++###@@+++@@###@+....+++@@@$$$##@@@+.........@@$$#@+...............................++@@@@@@@++........+@+#@###@@@++.....+@@@$$###@@$$$@++..++@+@@@@###@@$$$@+..+++@@@#@#@#@#@@@$$..++@+@@@$$$#@$$$@@+.....++@@#@$$$+++....", +".......................++++@@$$$@@+@+........++@@@@@@++..........++@@@@@+++..........................++@###@@@+@@@##@@+....+.++@@$$$##@@@+........++@#$$++................................+@@@@@@++.........++@@#@##@#@++.....++@@$$@####$$$@@...+.++@@@@####@$$$@+...+++@@#@##@#@@@@$$...+++@@@$$##@$$$+++.....+@@###@@@++.....", +".........................+++@###@+++..........+++++++...............+++++.............................+@###@@+@+@@###@+.....+++@@$$$##@@@+.........++@+++...................................++.+++.........++@@$$$$$$$@@++...+.@+@###@#@@$$$@@+...++@+@##@@@#@$$$@@..+++@@@##@@@@@###@@....++@###@@#@$$$@@+....++#####@@@+++....", +"........................++++@###@+++............++....................................................++#####@@@##$$#@+......+++@$$$##@@@+...........+.+................+++++................+.............++@@$$$$$$#@@+.....+@@@#####@@$$$@@+.....@+@####@#@$$$+@...+@@@@#@@@@@@###@@...+++@##@#@#@$$$@++....++@####@@@+++....", +".......................+.+@+@###@@+++................................................................++@#####@#@#@$$$@+.......+@+$$$##@@@++............................++@#@++..............................+@+$#$$$$$@+@.....++@@######@$$$@@+....++@@##@@@#@$$$@+...+@@#@##+++@@###@@..++++@###@@#@$$$@@+...++@###@@@@@#@+@+..", +".......................++@@@@@@@@@@++.................................................................++#####@@###$$$@+......+++@$$$###@@+............................++@@#@@+...............................+++@+++++@+.....++@####@@@$$@@@++....++@##@###@##$$$@@...+@###@@+@+@#@#@@@...+#@#@@##@##$$$@@+....++###@@@@+#@@@+..", +"........................@@@@@@#@@@@@@+...............................................................+++###$$$$$###$$@@.....+++@@$$$##@#@++...........................+@@$$$@@+...............................++++@+++.......++#####@@@$$#@@+++...++#@##@@#@#@$$$@@..++@###+@++@##@#@@@..++@@##@@@@#@$$$@@+....++@####@@@##@@@+.", +"......................++@@@@#@@#@@@@+++..............................................................++@@##$$$$###$#$@@.....++@@@$$$###@#++...........................+@@$$$@@+.................................+.++.+.......++@####@@@$$@@@+.....++@#@@@#@#@#$$$@@..++@@##+@+++##@#@@@..++#@#@@#@@#@$$$@@+....+@@####@@@##@@+..", +".....................+.@#$$$$$$$$$#$$++...............................................................+@###@@@@@@+@@+++.....+@@$$$$$$$$$$@+..........................++@@$$$@@+..............................................++@@@@@@@@@@@++.......+@@@@+@+@@@$$$@@...++@++++++@#$#@#$$...+@@@@+++@@@#$$@@+....++@#@##@#@##@@@+.", +"......................++$$$#$$#$$$$#$++..............................................................++@###@@@+++..++++....++@@$$$$$$$$#$+@..........................++@@$$$@@+..............................................++@@@++@+@+@+++.......++@+++++++@#$$@@...++++++.++@#$@#@#$...+++++++++@@$#$@@+.....++@@$$$$$$#@++..", +".......................+++@@+@@@+@+@++................................................................++###@@+......+.......++@$#$$#$#$$$++...........................+#@$$$@@++.................................................+++.+.++.............+.....+++++++....+.+..+..+@+++@++.....++++...+++++++......++++$#$$#$$+++..", +"........................++++++++++++.+.................................................................@@##@+++.............++++@+@@@@+++++...........................+@@@@@++...............................................................................+++++..............++++++..............++++.+.......++++++@+++++...", +"...........................+...+.+....................................................................++@@@++.................+++++++++++..............................+@@@@+++...................................................................................................+................................+++++++++....", +".......................................................................................................+@+@++........................+.................................++@@@+.......................................................................................................................................+.+++.......", +"........+.......................+................+++........................................................+++++....................................................+@@+++..................++@@++...........++@@@++...................................+........................+..............+++++...........................", +"....+++@@+...................+++@@+...........+++@@@+..............+++++++................................++@@@@++...................................................+@@@@++................++@@@+++..........++@@@+++..............................+++@@+....................++@@++..........+++#@@@+..........................", +"....++@@@+++................++@@@@+...........++@@@@++...........++@@+@+++.................................@@#@#++..............+.+.+.+...............+.+...........++@@@@+++..............+++@@#@++.........++@@#@@+++..........++++++++...........++@@@+++.................++@@@+++.........++@##@@++.........................", +"....++@@#+++...............++@@@@@+...........++@@#@++..........+++@@@@@@@+...........+++.+.+............++@@@#@@++...........+++@+@+@+@++........+++@+@+++++.......++@@###@++............++@@#@@++.........++@@#####++.........++@@+++@@+@+........++@@#@+++...............+++@@#@++........++@+###@@+...........+.+.+.+.+.....", +".....+@@@#@@+.............++@@##@@+..........++#####@@+........++@@$#$$$#@++........+++@@+++@@+..........++@#@@@@@...........+@@@@@@@@@@@@+.....+++@+@@@@@@+@+......++@@##@@+++.........++++@#@##+++.......+++@@#####@++.......+++##@@@@@@@++........+@@@@@@++.............++@@#@@++.........++##@@#@#++........+@+@@+++@@+++...", +"....++@@#@#@++...........+++@###@++........+++@#####@@+........+@@@$$$$###++........+@@@@@+@@@+.........+++@#@#@@@..........+++@@@@@@@@@@@+....+++@@@@@@@@@@@++...++@@@@@@#@@@@+.......++@@@@##@@@@++.....++@@@#@@@#@@@@+.....++@@@@@@@#@@@@+.......++@@##@@@+............+++@@#@#+++.......+++####@##@++.......+@+@@@+@@@@@+...", +"...++@@@@#@#++..........++@@@@@@@+.........++@@@@@@@@@+........+@@@@@@##@@++.......+@+@#@@@@@@++.......++@@@@##@@++.........++$#$$$$$$$$$$+...+@@@#$$$$$$$$##@+...++@@@#@#@#@@@@+....++@+@@@##@@@@@@......+@@@##@#@#@@@@+.....+@@@##@#@#@@@@++.....++@@@@##@@+@++.......+++@@###@@@++......++@@@@@@@#@@@++.....+@@@#@@@@#@@@@+..", +"....+@@@@##@@+..........++@@#@#@@++........+@@@##@#@@@+........+@@#@##@#@@++.......++@@#@@@@@@+.........+@@#@#@#@+..........++$$$$$$$$$$$$@..++@@@$$#$$$$$$$@#+..++@@@@@#@@#@@@@++....+@@@#@###@@@@@@+...++@@@#@#@@##@@@++....+@@@#@#@@##@@@++......+@@@@##@@@@++.......+@+@@#@#@@@@+......+@@@##@@@#@@@@......++@@#@@@@#@@@@+..", +"...+@@@#@@#@@++........++@@#@#@@@++........+@@@#@#@@@@++......++@#@#@##@@@+........+@@@###@@@@+........+@@@#@##@@++.........++@#$$$#@@@@##+..++$$$@@@@+@+@####+..++$$$$$$$$$$$$$@+...++$$$$$$$$$$$$$@+...+@$$$$$$$$$$$$$@+..+++$$$$$$$$$$$$$@++....+@@@@@###@@@@++.....++@@@@###@@@@++.....+@@@@#@#@##@@@++...++@@#@##@@##@@@+..", +"...+@@#$$$$$@@+........+@@#$$$$$@@+........+@##$$$$$@@+.......++@##$$$$$@@++.......+@@#$$$$$@@++.......+@@#$$$$$@@+........++@@#$$$@#@@@##@..+@#$$#@@++@@@#@#@+..+@$$$$$$$$$$$$$@++.++@$$$$$$$$$$$$$@++.+++$$$$$$$$$$%$$@@+..++$$$$$$$$$$$$$@+.....+@##$$$$$$$@#@+.....+@##$$$$$$$@#@+.....+@##$$$$$$$#@@+.....+@##$$$$$$$#@@+..", +"...+#@#$$%$$@@++......++#@#$$%$$@@++......++@@#$$$$%@@++......++@@#$$$%$@@+.......++@#@$$$$$@@+.......++#@#$$$$$@@++........+@@#$$$#@@@@#@+.++@$#$@@@+++@@#@#@+..++@@@##@@@@@$$$@++...+@@@##@@@@@$$$@++..++@@@##@@@@@$$$@+..+++@@@##@@@@@$$$@@....++@@@$$$$$$$#@@+....++@@@$$$$$$$#@@+....++#@@$$$$$$$##@+....++@@@$$$$$$$##@++.", +"....+@@@#$$$#@++........+@@@#$$$#@++.......+@+@@#$$$@#++.......+@@@@#$$$#@@+.......++@@##$$$#@@+........+@@@#$$$#@++.......+++$$########@@+..+@$$$@@++.+++@@@@+..++@@###@@@@@$$$+@...++@@@##@@@@@$$#@+...++@@@##@@@@@$$#@++..++@@@##@@@@@$$#@++....++@@@@$$$@@@+++.....++@@@@$$$@@@@++......+@@@@$$$@++@++.....++@@@@$$$@++@++..", +"...+++@##$$$@#++.......++++#@$$$@#++........++@#@$$$#@++........++@#@$$$@#++........++@@#$$$@#++.......+++@##$$$@#++.......++@#$###@##@#@@+.++@$$$@+++..+++++++..++@@@##@@@#@#@@@++...+@@@##@@@##@@@+++...+@@@##@@@##@@@++....+@@@##@@@##@@@+++......++@@$$$+@+++.......++++@$$$@++.+......+.++@@$$$@@+++........+++@$$$@@++....", +"....+++@#$$$##++........+@@@#$$$#@@+........++@@#$$$##++........++@@#$$$#@@+.......+++@@#$$$#@@+........++@@#$$$#@@+.......++@$$@######@@++.++@$$$@@+....+++++....+@@###@@@##@@@+.....+@@@##@@@@#@#@++...++@@@##@@@##@@@++....+@@@##@@@@#@@@+.........++@$$$@+++.........+++@$$$@+++..........++@$$$+@+..........+++@$$$+@++....", +".....@@$$@@@$$@++........+@$$@@@$$@++.......++@$$@@@$$@++........+@$$@@@$$@++.......+@@$$#@@$$@++.......++@$$@@@$$+++.....+@@@#####$$$$$@+..++@#$#@++......+......+@@@##@@@###@@++...++@@@##@@@##@@@+.....+@@@##@@@##@@@+.....+@@@##@@@##@@@++.......++++$$$@++...........+++$$$@@+..........++++$$$@+++..........+++$$$@++.....", +"...+@@@$$@@@$$@@@++...++@@@$$@@@$$@@@++...++@@@$$@@@$$@@@++....+@@@$$@@@$$@@@++...++@@@$$@@@$$@@@++....+@@@$$@@@$$@@@++....@@@###@#$$$$$@++.+@@$$$@++.............+@@@$$###$$@@++.....+@@@$$###$$@@++.....+@@@$$###$$@+++.....+@@@$$###$$@++.........+.++$#$@+.............+@$$$@+............+++$$$@++............+@#$$@+......", +".+++###$$###$$##@++...++###$$###$$#@#++...++###$$###$$##@++...++###$$###$$#@#++...++###$$###$$#@#++...++###$$###$$##@++..++@#@$$$$$@#@@@@++..@@#$$@+++++++++.+....+@@@$$@##$$@++++....+@@#$$@#@$$@++++....+@@@$$@#@$$@+++.....+@@@$$@#@$$@@+++........++@$$$+++...........+++$$$@++...........++@$$$+++...........++@$$$@++.....", +"..++@@#$$###$$###++...++#@#$$###$$##@++...++@@#$$###$$###++...++@##$$###$$##@++..+.@@@#$$###$$##@++..+++@##$$###$$###++.+++#@#$$$$$#@#@@++..+++$$$@@@++++@@@@@....+@@@$$#@@$$@@@++....+@@@$$#@#$$@@@++....+@@@$$@#@$$@@@++....+@@@$$##@$$@@+++.........@+$$$@++...........++@$#$@++...........++@#$$@++...........++@$#$@++.....", +".++@###$$###$$#@#@+..+++###$$###$$###@+..++@###$$###$$#@#@+..++@#@#$$###$$###@+..++@###$$###$$###@+...+@#@#$$###$$#@#@+..++###$$$$$##@#@@++..++$#$#@@@@@@@@@@@+...+@@@$$@##$$@@@@++...+@@@$$#@#$$@@@@++...+@@@$$##@$$@@@@++...+@@@$$@#@$$@@@+++......+++@$$$@++...........++@$$$@++...........++@$$$@++...........++@$$$@++.....", +".++@$$$##@#@##$$$@+..++@$$$##@@@##$$$@+..++@$$$##@@#@#$$$@+..++@$$$###@@##$$$@+..++@$$$##@@@##$$$@+..++@$$$###@@@#$$$@+.+@@#$$@@##@#@@@@@#+.+++@#@$$#####$$$@@+..++@@@##@@@@@@@@@@+..++@@@##@@@@@@@@#@+..++@@@##@@@@@@@@#@+..++@@@##@@@@@@@@#@+......++@@#$$@@++........+++@@$$$@@++.........++@+$$$@@++.........++@+$$$@@++....", +".+@@$$$##@#@##$$$@@..+@@$$$####@#@$$$@+..+@@$$$@##@###$$$@+..+@@$$$#@#@@#@$$$@+..+@+$$$@###@#@$$$@+.++@@$$$#@#####$$$@+.++@$$$@@####@@@@#@+..++@@@$$#####$$#@@+..+@@@@##@@@#@##@##+..++@@@##@@@#@#@@#@+..+@@@###@@@#@#@@#@+..+@@@@##@@@####@##+....++++@@$$$+@+++.......+++@@#$$+@+++......++++@@$$$+@+++......++++@@$$$+@+++...", +"++@@$$$##@@@##$$$@@.++@@$$$##@@@##$$$@@.++@@$$$##@@@##$$$#@.++@@$$$##@#@##$$$@@.++@@$$$##@@@##$$$@@..+@@$$$##@@@##$$$#@.+@@$$$##$$$$$###$$@...+@@@$$#####$$$@++..++$$$$$#####$$$#@+.++@$$$$$#####$$$##+.+++$$$$$#####$$$##+.+++$$$$$#####$$$#@+.....@@@##$$$###@@+.....+@@@##$$$###@@+.....+@@@##$$$###@@+.....+@@@##$$$###@@+..", +"++@@$$$##@@@##$$$#@..+@@$$$##@@@##$$$#@.++@@$$$##@@@##$$$@@..+@@$$$##@@@##$$$#@.++@#$$$##@@@##$$$#@.++@#$$$##@@@##$$$@@.+@#$$$@@$$$$$###$$+....++@@@$$$@@@@+++..++@$$$$$#####$$$##+..+@$$$$$#####$$$@#+..+@#$#$$#####$$$@#+..+@$$$$$#####$$$#@@...++@@###$$$##@@@+.....+@@###$$$##@@@+.....+@@###$$$##@@@+.....+@@###$$$##@@@+..", +".+#@$$$##@@@##$$$@@.++#@$$$##@@@##$$$@@..+#@$$$##@@@##$$$#@.++#@$$$##@@@##$$$@@.++@@$$$##@@@##$$$@@.++@@$$$##@@@##$$$#@.+@@$$$##$$$$$###$$@......+@@####@++......++$#$$$#####$$$@@+..++$#$$$#####$$$#@+.+++$$$$$#####$$$#@+.+++$#$$$#####$#$#@+....+@@@##$$$###@@++....+@@@##$$$###@@++....+@@@##$$$###@@++....+@@@##$$$###@@++.", +".+@@@@@@#@@+@@@@@@@..+@@@@@@@@@@@@@#@@@..+@@@#@@@@@+@@@@@@@.++@@@@@@@@@@@@@#@@@..+@@@@@@@@@@@@@#@@@..+@@@@@@@@@+@@@@@@@.+@@@@@@@@@@@#@#@@@+......+@@###@#++......++@@@@#@@@@@@@@@@+...+@@@@#@@#@@@@@@@+..++@@@#@#@#@@@@@@@+..++@@@#@@@@@@@@@@@+....+@@@@@#@#@@@@@+....++@@@@#@#@@@@@@+....++@@@@@#@@@@@@@+.....+@@@@@#@@@@@@@+..", +"..+@@@@@@++@@@@@@@+...+@@@@@@@++@@@@@@+...+@@@@@@++@@@@@@++...+@@@@@@+++@@@@@@+..++@@@@@@@++@@@@@@+.+.+@@@@@@++@@@@@@++.++@@@@@@@@@@@#@@@@+.....++@##$$@++........+@@@#@@#@#@@@@@++..++@@@@@@@@@@@@@@++...+@@@@@@@@#@@@@@++...+@@@@#@#@@#@@@@++....++@@@@@@@@@@@+.......+@@@@@@@@@@@+.......+@@@@@@#@@@@+......++@@@@@@#@@@@+...", +"...++@++++++++@++++....+++@++++++++++++....+++++++++++@++++....++@+++++++++++++....++@+++++++++++++....+++@+++++++@++++...+++++++@++++@++++......+@@$#$@++........+++++++++++@+++.+...+++@+@+@+@+@+++......+++@+@++++@+++.....+++++++++++++++........+++@+++@+++.........++++@+@+++++........+++@++++++++........+++@++++++++...", +".............+.+.........+.......+++.........++++....+.++.......+.+++....+++........+.++.....+++.........+.......+.++.......++.+++++++.++.........++@++++............++++++++.+..........++.+++.++..........++++.+.+++..........+++++++++++............+.+++...............++.++++.............+.+++++.............+.+++++......", +"..................................................................................................................................................+.+++.........................................................................................................................................................................", +"........................++@@###@@@@@+.........+++......................++...............++++................+.+.+.........................................................................+++......................++...............++++.....................................+++++..............................................", +".......................+++#@#@##@#@@+........++++++..................+++++............+++@+++.............++++++++++.....................................................................++++++..................+++++............+++@+++...................................+++#@++.............................................", +".......................+@@#####$$@@@+........+@@@@@+................+++#@++...........++#@#@@+...........+@@@##@@@@@.....................................................................+@@@@@+................+++#@++...........++#@#@@+.................................++@@##+++...............................++++++.......", +"....++++++++++........+@@@@####$$@@@++.......+@##@@++..............++@@##+++.........++@###@@++.........++@@###@@@@@+........++++++++....................................................+@##@@++..............++@@##+++........+++@###@@++..........+++.++++.............++@@@##@++........+++++..................++@@@++......", +".++++@@@@+@+++++.....++@@@#####$$@@@++......++@@#@#++.............++@@@#@@+.........+++@####@++.........+@@@#@##@#@@+........++++++@+++.................................................+@@@@#@@++............++@@@@#@++.........+@@####@+++.........++++++@++++........++++#@#@@+++.....++++++++++..............++@@@@@++++....", +"..@@#@#@#####@@+++...++@###@@@@#@###@@+.....++@+###@@.............++#@#@@@+.........++@#@@@##@@+.......++@#####$$@@++.......++#@@@+@#@@+...................................+.+++........++@@###@++...........+++@##@@@++.......+++@#@@@##@@++......+++##+@+@#@@+.......++++@###@@@@++....++@####@@@+............+++#@$$$##++....", +".+@@##########@@@++..+@#####@@@@####@@+......++@##@@@++..........+++###@@+++........+@@#@#@#@@@+......++@@@####$$@@++.......++##@@@#@@@++........+.........+............++++++++.......+++@@#@#@@++++......++++@###@@@+++......++@##@#@#@@@@+......++@##@@@#@@@@++...++++@@@###@@@++++...++#####@@@++...........++@##$$$##+++...", +"+.@@$$$@#@@@#@$$$@+.+++$$$$$@@@@@$$$@@+.....+++@@##@@+++.........+@@###@@@++.......+++##@@@##@@@.......+@@#####$$@@++......++@@#@@@##@@@........@@@++...+.@@++.......++++@+@@@@@+....+++@@@@###@@@++++....+++@@@###@@@@+++....++@@@#@@@##@@@++...+++@+##@@@##@@@++..+@@@#@##@@@#####@@+...@@@#$$#@@@+++.........+@@$$@@@$$@@@...", +".+@@$$$##@#@##$#$@+..++$#$$$@@@#@$$$@@+....++@@@#####@@++......+++@@#####+@++......++@@######@@+++....+++@@@####@@@@++.....++@#@#####@@@++....++@@@+++.+++@@@+.....+++@@#####$#$++....+#@#@#@@@@####@@+..++#####@@@#@###@@+..++@####@@@#@###@@+...+@####@@@@@###@@+.+@@#####@@@#####@@...++#@#$$@#@@@+++.......+@@@$$@@@$$@@@...", +".++@$$$@##@#@#$$$@@.++@$$$$$@@@#@$$$@@+...+++@@#####@@@+++....++@@@@#####@@+++....+++@@@#####@@@++....+@@@#@#####@@+++...++++@@@#####@@@++.....+@@@@+++++@@@@++...++@@@@#####$$#@+..+++#####@@@@####@@...++#####@@@@####@@...+@#####@@@@####@@+.++@#####+@@#####@@+.+@@$$$@#@@@##$$$@@+.+.+#@#$$#@#@@@++++....+.@@@#$@@@$$@@@+..", +".++@###@@@@@@@###@@..+@@#######@@$$$@++...+@#@$$@@@##$$$@+....+@@#$$#@@#@$$$@+...++@####@#@#@$$$@+...++@@####@@#@$$$@+....+@#####@@#@$$$@++...++$$$##@@@@#$$#++...+@@@$$@@@#$$$$@++..++$$$#@@+@@@$$$@@+..+@#$##@+@@@@$$$@@+.+++$$$@#+@@@@$$$@@+..++$#$#@@++@@$$$@@+.+@@$$$##@@@@#$$$@@+..++@@@$$$$$$$###+++....++@@##@@@$$@@@+..", +"++++####@@@@+@####@..+@########@@$$$@@+.+++@##$$##@#@$$$@++.+++#@@$$@#@##$$$@++..+@@#####@@##$$$@++..+@##@##@#@##$$$@++.+++#@###@#@##$$$+++...++#$##@@@@###$$+..+++##@$$###$$$$$@++.+++$$##@@+@@@$$$@@+..+@$$$##++@@@$$$@@+..++$$$##++@@@$$$@@+..++$$$@#@@+@@$$$@@+.+@@%$$#@@@@##$$$@@+...+@@@$$$$$$$###@@+....+@@@###@@$$@@@+..", +".+@@$$$$$@@@@@@@@##..+@###@@$$$@@$$#@@+..+@#@@$$@@@#@$$$@@+..+@@##$$#@@#@$#$@@+..+@@####@#@#@$#$@@+..++@####@@@#@$#$@@+..+@@#####@@@@$$$@@+...++@@@$$###$$@@@+...++@##$$@@@$$$$$@@+..++$$$##+@+@@$$$@@+..+@#$$#@@++@@$$$@@+.++@#$$@@@@+@@$$$@@+.++@$$$#@++@@@$$$@@+..++####@@@@@####+++...+@@@##@@@@@@#@#@+....+@@###$$$$$@@@+..", +"++@@$$$$$#@@+@#@##@.+++###@##$$@@$$$@++.++@$$$@@@@@@@###@@+..+@$$$@@@@+@@###@@+.++@$$$@@@@+@@###@@+.++@$$$@@@@@@@###@@+.++@$$$@@@@@@@###@@+....++@@$$###$$@@+++.++@$$$@@@#@#@###@@+.++@@##@@++++@#$$@@+..+@###@@@+++@$#$@++..+@###@@++++@$$$@++..++###@@@++@@$$$@++.+++@#@##@@@#@##@@+...++@@@##@@+@@#@###+...++@@@##$$$$$#@@++.", +"++@@$$$$$@@@@+@@@##..++####@$$$@@$$$@++..+@$$$@@++++@@##@#+.+@+$$$@@++++@###@#+.++@$$$@@++++@###@#+.++@$$$#@++++@###@#+.++@$$$@@++++@@##@#+....+++@$$###$$@++....@+$$$@#@@@######@+..+@###@@@+++@$$$@++.+++###@@+++@+$$$@@+.+++###@@++++@#$$@@+.++@@##@@+++++$$$@@+..++@@@$$@@@$$@@@++....+@@###@@@+@##@#@+....+@@@##$$$$$@@@++.", +".+@@$$$@#@@@+@#@##@.++@###@@###@@$#$@++.++@$$#@++..++@#@##@.+@+$$$@+++.+@@#@#@+..@+$$$@++..+@@#@##@.++@$$$@+++.+@@#@#@+.+@@$$$@++.+++@#@##@.....+@+#@$$$@@@@++..+@@#$$@@@##@@@#@@#+.+++###@@+++++$#$@++.++@###@@++++@#$$@@+.+++###@@++++@$#$@++.+++###@@+++@+$$#@@+...+++@$$@#@$$@@++....++@@@##@@@@@#@###+....+@@@##@@@@@$$$@+.", +"++@@$$$#@@@@++@@@##..++####@###@@$$$@++.+@@$$$@+++.+@@@##@+.+@@$#$@++..++@@###+.+@@#$$@+++.++@@#@#+.++@$#$@++..++@@###+.++@$$#@++..+@@@#@#+....++@@@#$$$##+++...++@$$$@@###@@@#@##+.++@@##@@++++@$$#@++..++###@@++++@$$$@++..++###@@++++@$$$@++..++###@@++.+@$$$@++...++@@#$@#@$$+++......+@@@##@+@@@@#@#@+....+@@@##@@@##$$$@+.", +".+++###@@@++@@@###@.++@###@#@@###$$#@@+.++@$$$@@++++@@#@#@@..+@$$$@@+++++####@@..+@$$$@@++++@@###@+.++@$$$@@+++++####@@.++@$$$@@++++@@###@+....++@@$$###$$@@@+..++@$$$##@@@@@####@@..+@###@@+++++$$$@@..++@###@@++++@#$#@@..++@###@@++++@#$$@@+.++@###@@++@++$#$@+.....+++##$$$@@@++......+@@@$$#####$$$@@+....+@@@##@@@@@$$#@+.", +".+@@###@@@+++@@#@#@..++###@@#@@##$$$@++..+@#$$@+++++@####@+.++@$$$@@+++@+#@#@@+.++@$$#@@++++@##@##+.++@$$$@++++@+#@#@@+.++@$$$@@++++@##@##+....+@@@$$#@#$$@@@+..++@$$$###@#@@###@@+..++###@@++@@+$$$@+...++###@@++@+@$$$@+...++###@@++@+@$$#@++..++###@@+++@@$$$@++.....++@#$$%#@@+.......+@@@$$###@#$$$@@+....+@@@##@+@+@$$$@+.", +"..++####@@@@@@@#@#@.++@###@@@#@##$$$@++.++@$$$@@@+++@#@#@#+.++@#$$@@@+@+@#####+.+++$$$@@@++@+###@@+.+++$$$@@@+@+@#####+.++@#$$@@@++@@@##@@+...++@@@$$@#@$$@@@++.++@#$$##@@@@@@####+.+++###@@@@+@@$#$+@+..++###@@@@+@@$$$+@+..++###@@@@+@+$$$@@...++###@@@@+@+$$#@@......++@@$$$@@++......++@@@$$#####$$$@@+...++@@@##@@@@@#$$@@.", +".+@@$$$@@@@+@@$$$@@.+++$$$#@@@@##$$$@++.+++@####@@@@@$$$@@+..+@###@#@@@@@$$$@++.+++@##@#@@@@@$$$@@+.+++@####@@@@@$$$@++.+++##@##@@@@@$$$@@+...+@$$$@#@@@@#$$$+..++@###$$@#@@#$$$@++..++@@###@@@@@$$$+++..++@@##@@@@@@$#$@+...++@@###@@@@@$$#@+...++@@###@@@@@$$$++......++@@$$$@@++......++@#@$$@#@#@@@@+++...+@@#@##@@@@#$$#@+.", +".++@#$$#@@@@#@$$$@+.++@$$$@#@@@##$$$@@+..++#@#@#@@@@@$$$@++..++@####@@@@@$$$+@+..++#@###@@@@@$$$@++..++#@#@#@@@@@$$#@@+..++@####@@@@@$$$@++...++$#$@@++@@@$#$++..++###$$@@@@@$$$+@+...@@#@#@@@@@@$$#@+...++@#@##@@@@@$$#+++..++@#@@#@@@@@$$$+++...@@@@#@@@@@@$#$@++....++@@@$$$@@@++.....+@@@#$$###@@@+++.....++@@#####@#@$$$@@.", +".+@#$$$$$$$$$$@@@++..+@#$$$$@@@@@$$$@++..+++@@##$$$$$@@@++...++@@@##$$$$$@@@+++..++@@@##$$$$$@@@@+...+++@@##$$$$$@@@+++..+++@@@#$$$$$@@@@+....++@@@+++++++@@++...++@####$$$$$@@@++....++@@$$$$$$$@#@@+....++@@$$$$$$$#@#++....++@@$$$$$$$@@#++....+@@@$$$$$$$#@@@......+@@$$$$$$$@++.....+@$$$$$@@#@+++.......@@$$$$$@#@$$$$#@+.", +"++@@$$$$$$$$$$#@@++.++@$$$$$@@@#@$#$@+.....@+@@#$$$$$@@@++.....++@@#$$$$$#@@+......++@@#$$$$$@@@++.....@+@@#$$$$$@@@+.....+++@##$$$$$#@@++......+@++++..++++@.+.++@@@###$$$$$#@@++.....++@$$$$$$$#@@++....+++@#$$$$$$@#@++....+++@$$$$$$$#@@++.....++@$$$$$$$@#@++.....++@#$$$$$$@@++...++@$$$$$#@@+++.......+++$$$$$#@@$$$$$++.", +".+@@$$$$$$$$$$@@@+...++$$$$$+++@@$$$++.....++@@#$$$$$@@@.......++@@#$$$#$@@@+......++@@#$$$$$@@+.+.....++@@#$$$$$@@@+.....++++@#$$$#$@@@+.......++++....+++++.....+#@###$$$$#@@@+......+++#$$#$$$@#@+......++@$#$$$$$@@@+......+++#$$$$$$@#@+......+++#$$$$$$@@@++....++@@$$$#$$$@@+....+++$$$$$@#@++.........+@$$#$$@@@$$##$++.", +".+@+++++++@+@+@++....+++++++@+++@+++++......+++++++++++.+.......++++++@+@++++.......++++++++++++........+++++++++++.........++++++@@++++.........................++@@@+@@+@+@@++.......+.@+++@@+@+++........+++@+@++@@++.......+++++++++@+++........+@+++@+@+@@+.......+++++@@++++++......+++++@++++.........+.+++@++@@@+@@+++..", +"..++++@+++++++++.+....+++++++.+.++++.........++++++@+.+..........+.++++++++...........+++++++............++++++++++..........++++++++++...........................+@@@+++++++++.+........+++++++++++.........+++++++++++........+++++@++++++.........+++++++++...........++++++++.........++++++++.............+++++++.++++++...", +".....+.++++.+...........++........+............+++................+.+.+.................++++................++++................+..+...............................+.++++.+................++.+.+................++.................+.+.+................+.+...............+..++.............+.+..................++............", +"................................................................................................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................................................................................................", +"................................................................................................................................................................................................................................................................................................................................", +".......+..........................................+........................................................+++++.......................................................+.........................+................+....................................+.........................+...............+..............................", +".....++@@+...................+++@@..............+@+@+...............++.+...................................+@@@@+....................................................++@@+.....................+@@++.............@@@+................................++@@+.....................+@@++...........+@+@+............................", +"....+++@@+++................++@+@@+...........+++@@@+............++++++++++...............................+@@@#@++..................................................+++@@+++.................+++@@+++..........++@@@++..............................+++@@+++.................+++@@+++........+++@@@+............................", +".....++@@@++...............+++@@@@+...........++@@@@++...........++@@@@@@++............+.+..+.............+@@#@#++...................................................++@@@++.................++@@@@+..........+++@@@+++.............+...+............++@@@++.................+++@@@+.........++@@@@++.............+.+..+........", +"....++@@@@@@+..............++#@#@@+..........++@####@@+........++@@$$#$##@@+........+++@@+++@@+...........+@@@@@@@..................................................+++@#@@@+...............+@@@#@++..........+@@####@++........++@@@+++@@++........+++@#@@@+..............++@@@#@++........++@####@@..........+++@@+++@@.......", +".....++##@#@++............++@###@++..........+@#####@@+.........@@@$$$$$##+++.......++@@@+@+@@+..........++@#@@@@@+..................................................+@@#@#@++.............++@@@#@@+.........++@@###@#++........+++@@+++@@+++........++#@#@@++.............++@@@#@++........+@#####@@+.........++@@@@++@@+......", +".....++@@#@#++...........++@@@@@@++........+++@@@@@@@@++......++@@@@@##@@@++.......+++@@@@@@@@++.........+@@@##@@+.........++++++.++++++...........++++++++++........++@@#@#@++..........+++@@##@@++.........++@#@@#@@@++.......+@+@@@@@@@@++........++@@#@@++............++@@##@+++.......++@@@@@@@@+........+++@@@@@@@@+......", +"....+++@@##@@++.........+++@@@#@@+++........++@##@@@#@++.......+@@#@@@##@@@+.......++@@#@@@@@@+........++++#@#@#@+++.......+++@++@++++@+++.......++++@@@@+@+++......+++@@##@@@++.........++@@##@@@@++.......++@#@#@@#@@@++.....+++@#@@@@@@@@++......+++@@@##++...........++@@#@@@++.......+++@@##@@@@+.........++@@@@@@@@++.....", +"...++@@@@@##@+++.......++@@@#@#@@@+........+@@@@@@#@#@@+......++@@#@####@@++.......+@+@@#@@@@@@+.......++@+@###@@++......++@@@@@@@@@@@@@++.....+++@@@@@@@@@@+++...+.+@@@@###@@@+++.....++++@@@##@@@+++.....+++@@#@@@#@@@++.....+@@@@#@@@#@@@++.......++@@#@@@+...........++@@##@@+.........++@@@@#@@@+........++@@@#@@@@@.......", +"...+@@@$$$$$##++.......+@@@$$$$$##++.......+@@#$$$$$##+++.....++#@#$$$$$##@++.....++@@#$$$$$##+++......+@@#$$$$$##@+.....++$$$$$@##$$$$$@@+...++@@@#$$$$$$$$$@+....+@@@$$$$$$$@@@+....++@#@$$$$$$$@@@+....++@#@$$$$$$$@#@++...++@@@$$$$$$$@#@++.....+@@$$$$$++..........++@$$$$$@++........@@@$$$$$@++.........+@@$$$$$@++......", +"...+@##$$$$$##@++......+@##$$$$$##@++.....++@##$$$$$##@++.....++@#@$$$$$##@++......+#@#$$$$$##@++......+@#@$$$$$##+@.....++$$$$$####$$$$#@+...+@@##$$$$$$$$$$@+..+++@#@$$$$$$$#@@@+...++@@#$$$$$$$##@@+...++@@#$$$$$$$#@#++...+@@##$$$$$$$@#@@+.....+@@$$$$$@++.........+@@#$$$$@++........+@@$$$$$@++........++@@$$$$$@++......", +"..++@@@@@@@@$$@@@.....+@@@@@@@@@$$@@@.....++@@@@@@@@$$@@++....++@@#@@@@@$$@@@.....++@@@#@#@@$$@@++....+@@@#@@@@@$$@@@+..+++@@@@@$$$@@@@@$$@...+@$$$@@@+@@@$$$@@...+@$$$@@@@@#@$$$@+...+@$$$@@@@@@@$$$@+..++@$$$##@@@@#$$$@+...+@$$$@#@@@##$$$@+......++@@$$$@+...........++@@$$$@+........+.+@@@$$$@+...........++@@$$$@++......", +"..++@##@#@@@$$@@@......+@##@#@@@$#@@@.....++@##@#@@@$$@@@.....++@@@@#@@@$$@@@.....++@#@@@@@@$$@@@......+@@#@#@@@$$@@+....+@@####$$$@#@@@$$@..+++$$$@@++@@@$$$+@..+++$$$##@@@#@$$$@+..++@$$$#@@@@#@$$#@+...+@$$$@#@@@#@$$$++..++@$$$@#@@@@#$$#@+......+++@$$$@++..........+++@$$#@++..........+@@$$$@++..........++@@$$$++.......", +"..+@@@#@@@@@$$@@@+....+@@@@@@@@@$$@@@+....+@@@#@@@@@$$@@@+....++@@#@@@@@$$@@@+....+@@@#@@#@@$$@@@+....+@@@#@@@@@$$@@@+..++@@@@@@$$$@@@@@$$@..+@@$#$@@+++@@@#@++..++@$$$#@@@@##$$$@@..++@$$$@#@@@#@$$$@@..+++$$$@#@@@@#$$$@@..+++$$$##@@@#@$$$@@.......+@+$$$++............+@+$$$@+...........+++$$#@+............+++$$$@++......", +"..++@#@$$$$$$$@@@+....++###$$$$$$$@@@+....++@#@$$$$$$$@@@+....+@@#@$$$$$$$@@@+....++#@#$$$$$$$@@@+....++#@#$$$$$$$@@@+..++@###$$$$$#####$$+..++@$$$@+@++++@@@++..++@$$$#####@#$$$++..++@$$$#######$$$@+..+@@$$$#######$$$@+..+@@$$$#######$$$@+.......++@$$$@++...........++@$$$@++..........++@$$$@++...........+@+$$$@++......", +".++@@##$$$$$$$@@@+....+@@@#$$$$$%$@@@+....+@@##$$$$$$$@@@+....++@##$$$$$$$@@@+....+@#@#$$$$$%$@@@+...++@#@#$$$$$$$@@@++.+@@###$$$$$#####$$@..++@$$$@@++++@@@@++..++@$$$##@####$$$@@..++@$$$#######$$$@@...+@$$$#######$$$@@..++@$$$@######$$$@+.......++@#$$@++...........+++$#$@++..........+@+$$$@++...........++@$#$@++......", +".++@$$$@@@@@##@@@+...++@$$$@@@@@##@@@+...++@$$$@#@@@###@@+...++@$$$@@@@@##@@@+...++@$$$@@@@@##@@@+....+@$$$@@@@@###@@+..+@####@@$$$##@#@#@@...+@$$$@@@++@+@@+@+..++@$$$###@@#@#@#@+..+@@$$$##@#@@##@#++..++@$$$##@#@@@##@@+..++@$$$##@@@#@##@@+.......++@$$$@++...........+@@$$$+++..........++@$$#@++...........++@$$$+++......", +".++@$$$#@@@@##@@@++..++@$$$@#@@@##@@@++..++@$$$@@@@@##@@@++..++@$$$@#@@@##@@@++...+@$$$@@@@@###@@++..++@$$$@#@@@##@@@+..+##@##@@$$$####@##+...++###$$#####$$$@@..++@$$$##@##@###@@@..++@$$$##@###@##@@@...@@$$$@##@##@#@#@+..++@$$$#####@##@#@@......++@+$$$@+++.........+++@$$$@@++.......+++@+$$$@@++........++++@$$$@@++.....", +".++@$$$@@@@@###@@++..++@$$$@@@@@###@@++..++@$$$@@@@@##@@@++..++@$$$@@@@@###@@++..++@$$$@#@@@##@@@++..++@$$$@@@@@##@@@@..+@####@@$$$#@@##@#+...++@@#$$@#@##$#$#@..++@$$$###@##@##@@+..++@$$$###@@#@##@@+...+@$$%##@###@##@@+..++@$$$##@#@#@##@@+....++++@@$$$@@+++......+++@+@$$$@@+++......+++@@$$$@+@++.......++@@+$$$@@+++....", +".+++$$$#####$$###@+..++@$$$#####$$###@+...@+$$$#####%$###@+..++@$$$#####$$###@+...@+$$$#####$$###@+...@+$$$#####$$###@+.+#@$$$$$$$$$$###$$+....+@+@@#$$$@#@#@++...+@###$$#####$$$@+...+@###$$#####$$$@+..+++###$$#@#$$$$$@+...++###$$#####$$$@+.....@@@#@$$$#@#@@+......@@@#@$$$##@@@+....+@@@#@$$$##@@@+.....+@@@@#$$$##@@@+...", +".++@$$$#####$$###++..++@$$$#####$$###++...+@$$$#####$$###++..++@$$$#####%$###++..++@$$$#####$$###++...+@$$$#####%$###++.+@##$$$$$$$$$#@#$$+......++@@$$$#@#@@+....++@##$$##@##$$$@+...++###$$#####$$$@+...++@@#$$###$$$$$@+..+++###$$#####$$$@+...++@@###$$$##@@@+....++@@###$$$@##@@+....+@@###$$$##@@@+.....+@@###$$$@##@@+...", +"..++@@@#@####@#@@++...++@@@#@###@@#@@++..+++@@@#@##@#@#@@@+...++@@@#@##@@@#@@@+...++@@@@#@###@#@@@+..+++@@@#@##@@@#@@@+.+@@#@#@#@@@@#@#@@++......++@@###@#@+++.....+@+@@@@@##@@@@++....+++@@@@#@#@@@@++....++@@@@#@@#@@@+++....+++@@@@@@#@@@@++....+@@@@#@#@#@#@@++....+@@@#@#@#@#@@@++...+@@@@#@#@@#@@@++....+@@@#@#@#@#@@@++..", +"..++@@@#@#@@@@#@#++...++@@@@#@@#@@#@@++...++@@@#@@#@@@#@@++....+@@@#@#@#@@@#@++...++@@@#@#@@@@#@@++...++@@@#@#@#@@#@@++..++@@#@#@@@@#@#@@++......+++@####@+++.......+++@##@@#@@+++.....+++@@#@@#@#@+++.....++++@@#@@#@@@++......+++@###@#@@+++......@@@#@#@#@@@@@.......@@@#@#@#@#@@@......@@@#@###@#@@@.......@@@@##@#@#@@@....", +"...+@@@@@@@#@@@@@+.....+@@@@@@#@@@@@@+.....+@@@@#@@@@@@@@+....++@@@@@@#@@@@@@+.....+@@@@@@#@@@@@@+.....+@@@@@@#@@@@@@+...+@@@@@@@+@@@@@@++........+@@$$$@@+..........++@@@@@@@@++........++@@#@@@@+@+........++@@@#@@@+++......+.++@@@@@@@+@+......++@@@#@@@#@@@@+......++@@#@#@@@@@@+....++@@@@@@@@@@@@+......+@@@@@#@@@@@@+...", +"....+++@+@++@+@+.+......+++@+++@+++@++......+++++@+@+++++.......+++@++++@++++.......+++@++++@++++.......++++@++++++++.....+++@++++++++++.........++@@$$$@++............+++@+@++++.........++++@+++++..........++++++@+++...........++++@++++.........++++@@++@++........+++++++@++++........++@+@+@+@++.........++@+++@++++.....", +"......+.+.++.+..+........+.++++.+++...........+++.++++++..........+.++++++............+.++++.++...........++.+++++++........+.+....++++...........+@++++++..............+++.+..............+.+.+++...............++++................+++++.............++..+++.............+++++++.............+++.++..............++++++.......", +"...................................................................................................................................................++++++.......................................................................................................................................................................", +"................................................................................................................................................................................................................................................................................................................................", +".......+.+......................................................................................................................................................................................................................................................................................................................", +"...+++++++++@++..............+.+........................................................+++++................+.+...................................................................................................++................+.+.................................................++@@++++...............................", +"..+++@@@@@@@+@+++..........++++++++...........+++++...................+++++............++@@+++..............++++++++......................................................................+++++..................++++++............++++++.....................................+++++......++$$$#@++..............................", +".+@@$#$$$@##$$@@@+......+++@@@@@@@++........+++#@+++.................++@#$++.........++@@$$$@@...........+++@#@#@@@@+...................................................................+++#@+++................+@@@@@+...........+@@#@#++...................................++@#$+++...++@$$$##++..............................", +".+@@$$$$$##@$$#@@+.......+@@#@#@@@+++.......++@@#@@++...............+++@$#@++.........++@$$$@@++..........+@@##@@@@@@+...............................+..................................++@##@@++...............+@@@##++.........+.@@###+++.................................+++@$#@++....+@$$$##@++.............................", +".+@@$$$$$###$$@#@+.....+++@@#@#@##+++.......++@##@++++.............++@@@$#@+.........++@@$$#@@++........+++@@###@@@@++.......++++++++++............++++++...............................++@@#@+@++...........++++@@#@@++........+++@@###@+++........+++++++++++...........+++@@@$$+++....++@@@##@@+++............+++++++++++....", +"++@@@@@##$$$##@@+++...++@#@##$$$#@@+.........++@@###++............+++@##@@+++.......++@##@@@##@++.......++@@####$$@+@.......++@#@@+@@@+@+..........+@@#@+................++++++++......+++@@@##@++++.........++@@###@@@++......++@@##@@@@#++.......++@@@@+@+$$+++........++++#@#@@@@++...++@@@##@++++++........++++$$@++#@@@@+..", +".+@@#@###$$$##@@++....++@#@##$$$##++.........++@@###@++...........+@@###@@++........++@##@@@##@++.......++@#####$$@@+......++@+#@@@@##@@+.........+@@@#@@+............++++++@++++++..+++@+@@@###@++++....++++++@@###@@++++...+++@@@#######+@+....++@@@@##+@@#$@+++....+++++@+###@@@@+++..++@#@#######@+@......+++@+$#@@@@#@@@++.", +".+@@###@@@@@$$@#@++..+@@###@@##@#@@++.......++@#@####@++.........++@#@####@++.......@+@@#####@@++.......+@+#@####@@+++......+@@@##@#@@@+++........+@@$$$++...........++@#@##@@##@@@...@@@##@@@@@##@@@+....@@#@#@@+@@@##@@+....@@@@#@@@@@##@@@+....@@#@#@@@@@##@@@+...+@@#@#@@@@@#@#@#@@..++@@@##@#@#@@@@.+....@@#@##@@+@#@#@#@@.", +".++@###@@@@@$$##@@...+@@###@@####@@++.......++@@##@#@#@++......+++@@###@#@@++.....+++@@######@@+++.....+++@#@#@##@@++.....+++@@#@#####@++........++@@$$$@++........+++@@##@###@##@@..+@@##@@@@+@@##@@++..+@@##@@@@+@##@@@++..+@@###@@@@@@##@@@...+@@###@@+@+###@@++..+@@###@@@+@@@##@@@...+@@@###@###@@@++..++@@##@#@@@+#@###@@.", +"..@+###@#@@@$$#@#++.++@@###@@##@##@@++....+++@@#@####@@@++.....++@@#@###@#@@++.....+@@@#@#@###@@++.....++@@#######@@@+.....+@@@######@@@+++.....+++@@$$$+++........++@@@####@##@#@@.++@@###@@+@@##@#@++.++@@###@@+@@@###@++.++@@#@#@@+@@####@++..+@@@#@@@@@@##@#@++..+@@@###@+@@#@###@@...+@@@$$#####$$$@++..+@@###@#+@@@####@@.", +"..++#@#$$$$$$$$$$@+..+@@$$$$$###$##@@+....++@##$$#@#$$###++...++@##$$@##$$##@++...++@##$$##@$$##@++...++#@#$$@#@$$##@@...+++@##$$@#@$$###++.....++@@@@@@@++++.....++#@#$$@##$$###@+..+@@$$$@@+@+#####++..+@@$$$@@@+@#####++..+@@$$$@@@+@@####++..+@@$$$@@+++#####++..+@@$$$@#@+@@#$$$@@...+@@#$$#####$$$@@+..+@@$$$@#+@@@@$$$@@.", +".++@@##$$$$$$$$$$@+..+@@$$$$$@#@$$##@++...+@###$$@#@$$###++...+@###$$#@@$$###++...+@###$$#@#$$###@+...++###$$@#@$$###++...+@####$###$$###++...+++@@@@@@@@@@+++....++###$$@#@$$###@+..+@@$$$@@++@@####@+...@@$$$@@++@@####@+..+@@$$$@@@+@#####@+.++@@$$$@@@@@@####@+.++@@$$$#@+@@#@$$$@@...+@@@$%###@#$$$@@+...@@$$$#@@@@#@$$$@@.", +".++@@@#$$$$$$$$$$@+..+@@$$$#$###$$@##++..+++###$$@#@$$###++..+++###$###@$$###@+..+++####$@#@$$###++..+++###$$#@#$$###@+...++###$$@@#$####++...++@@@@@@@@@+@@++...+++###$$#@#$$###@+..+@@$#$@@@+@@####++.++@@#$$@@@+@@####++..+@@$$$@@+++@####++..+@@$$$@@++@@####++..+@@$$$##@@+#@$$$@@...+@@@$$@@@@@####@+..+@@#$$@#@+@#@$$#@@.", +"..+@$$$@#@@@@@$$$@+..+++####@@@@@@###++...+@$$$@@@@@@@$$$@+...+@$$$@@@@@@@$$$@+...+@$$$@@@@@@@$$$@+..++@$$$@@@@+@@$$$@+..++@$$$@@@@@@@$$$@+..+@@$$$$$$$$$$$$$++..++@$$$@@@#@##$$$@+..++@###@@++@@@###@+...+@###@@++@@@###@+..+++###@@+@@@@###@+..++@###@@@+@@@###@+...+@@@@##@@@##@#@++...+@@@$#@@@@@####@@...+@@@###@@@##@#@@+.", +".++@$$$@@@@@@@$$$@+..++@####@@+@@@###++..++@$$$@@@+@@@$#$@@..++@$$$@@+++@@$#$@+..++@$$$@@@++@@$$$@@..++@$$$@@+@+@@$#$@+..++@$$$@@@+@@@$$$@@..+@@$$$$$$$$$$$$$++..++@$$$@@#@###$$$@+...+@###@@@+@@@###++..++@###@@@++@@##@@+..++@###@@+++@@##@@+..++@###@@++@@@###++...++@#@##@@@###@#++...+@@@##@@++@@@@##+...++#@@##@@@###@@++.", +"..@@$$$@@@+@+@$#$@+...++###@@+@@@@###@+...@@#$$@+++++@$$$@@...@@#$$@+@+@+@$$$@@..+@@#$$@++@++@$#$@+..++@$#$@+@+@+@$$$@@..+@@#$$@+++++@$#$@+...++@+@@@@@@@@+@@+...+@@$$$#@###@@$$$@@..++@###@@+@+@@###@+...++###@@++@@@###@+..+++###@@@+@@@###@+...++###@@@++@@###@+...++@@@$$@@@$$@@++....+@@@$$@#@@@$$$@@+....+@@@$$@@@$$@@@+..", +".++@$$$@+@+@+@$$$@+..++@###@@@+@@@###++..++@$$$@@++@@@$$#@+..++@$$#@@++@+@$$#@+..++@$$$@@++@+@$$$@+..++@$$$@+++@+@$$#@+..++@$$$@@+@+@@$$$@+...+.+++@@@@@@+++++...++@#$$@####@@$#$@+...++###@@@+@@@##@@+...+@###@@@+@@@###++..+++###@@@++@@###++...+@###@@+@+@@##@@+....+++@$$@@@$$@@+.....+@@@$$#@#@@$$$@@+....+++@$$@#@$$@@+...", +"..@+$#$@@@+@@@$$$@@.+.++####@++@@@###@+..++@$#$@@@+@++$$$@@...@+$$$@+@@+@@$$$@@..++@$$#@@@+@@@$$#@@..++@#$$@@@+@@+$$$@@..++@$#$@+@+@+@$$#@@....+++@+@@@+@++.......@@$$$@@###@@$$$@+...+@####@+@@#@###@+..+++####@+@@@@###@+...++###@@@@@@@###@+..+++###@@@@@@@###@+.....++@@#$$$#@@++.....+@@@$$$$$$$#@#++......++@##$$$##+++...", +"..+@$$$@#@@@@##$#@+..+@@###@@@@@@@###@+..++@$$$@@@@@#@$$#@+..++@$$$#@@@@@##$$++..++@#$$@#@@@@@$$$++..++@$$##@@@@@#$$#@+..++@$$$#@@@@@##$$++......++@@$$$+++.......+@$$$$$@@@##$$#@+...++###@#@@@@####@+...++####@@@@#@###@+..+++####@@@@#@###@+...++####@@@@#@###@+.....++@@@$$$@@++.....++@@@##@@@@@+@++........++@#$$$#@@+....", +".++@#$$#@@@@##$$$@+..++@###@@@@@#@###@+...+@#$$##@@@##$$$++...++$#$##@@@##$$$++...+@$$$#@@@@##$$$@+..+++$$$##@@@#@$$$++...++$#$##@@@##$$$@+.......+@@$$$@+.......+@+$$$$$@@@#@$$$++...++####@@@@#@###@+...+@@##@#@@@#####@+....@@####@@@#####@+...++@####@@@#####@+......+@@#$$$@@+......+@@@@##@@@@++++.+......++@@@$$$@@+.....", +"..++@@@$$$$$$$@@@@..++@#$$$$$@@@$$$$$#@...++@@@$$$$$$$@@@++..+++@@@$$$$$$$@@@++...++@@@$$$$$$$@@@++...++@@@$$$$$$$@@@++...++@@@$$$$$$$@@@++......++@@@#@++........+@###$$$$$$$@@@++....++@@$$$$$$$$$$@@....+@@@$$$$$$$$$$#@....+@@@$$$$$$$$$$#@...++@@@$$$$$$$$$$@@.....+++#@###@++......++###$$##@@++.........+++@@####@++.....", +"..++@#@$$$$$$$#@@++.++@#$$$$$@@@$$$$$#@...++@#@$$$$$$$@@@++...++@#@$$$$$$$@@@++...++@#@$$$$$$$@@@++...++@#@$$$$$$$#@@++...+@@@@$$$$$$$#@@++.......++@@@@++.......+++###$$$$$$$#@@++...+++@@$$$$$$$$$$#@....++@@$$$$$$$$$$#@.....+++$$$$$$$$$$#@.....+++$$$$$$$$$$#@....+#@#$$$$$@++.....++@###$$#@@@.+.........+@##$$$$$++......", +"...+@@@$$$$$$#@@@+...+@#$$$%$@@@$$$$$@@...++@@@$$$$$$$@@@+....++@@@$$$$$$$@@@+.....+@@@$$$$$$$@@@+....++@@@$$$$$$$@@@+.....+@@@$$$$$$#@@@+........++@@@@++.......++@###$$$$$$$@@@+.....+++@$$$$$$$$$$#@.....++@$$$$$#$$$$@@.....+@+$$$$$#$$$$@@....++@+$$$$$#$$$$#@...++@##$$$$#@+.......++###$$##@++.........++@##$$$$#@+......", +"..+.++++++@+@+@++...+++++@+@+++++@@@@@+.....+++++@+@++@++.......++++++@+@+@++.......++@+@+@+@+@++.......+++++@@@+++++.......++++@+@@@+@++...........++++..........@@#@#@@@@@++@++........+++@+@++@@@@++......++++@+@@+@@@@+......++++@+@@+@@@@+......++++@+@@@@@@++...++#@#$$#$$++......+++@#@#@@#@++.........++#@#$$$$$+++.....", +".....++++++++++.+....+++++++++++++++++.......++++++++++.+........++++++++++.+.........+++++++++.+........+++++++++++........+++++++++++.+............+............+@@#@@+++++++.+.........+++++++++++++.......++++++++++++........++++++++++++........+++++++++++++...++@#@#@#@@++.......++@@#@#@@@+..........++@#@#@@@@++......", +".......++++++..........+.+++.+.+...............+.++++..............++++.+................+++...............+..+.++..............+.+.+............................+++++++++.++................++++.++.............++.+++..............++++++..............++.+.++.......+@@@#@@@@++........+++++@+++............+@@#@@#@@+.......", +"...................................................................................................................................................................++++..+.............................................................................................++@++@@+++..............................++++@++@++.......", +"................................................................................................................................................................................................................................................................................................................................", +"........................................................................................................+++++++++++++.....................................................................................................................................................................+++++.................................", +".......................+...............................................................................++++@+++@++++++...........................+++++++++..............++++............................................................................................................++++++++................................", +"......................@+@@+......................................+..+.+.+.............................++#$$@##@#@#$$$++.............++++.........+@@@@@@@@@+............+@@@+.............................................................................................+++....++.....+@#$$$@@++++++..........................", +"....................++@@@@@+.................................++++++++++++++++........................++@$#$##@#####$$@+..........+++@@++.......++@@@@@@@@@@++..........++@@@@+.................+++++++..........+++.................................+++++...............++++++++++++....+@#$#$@@++++@+++........................", +".........++.........++@@@@@++................................++++@@@@@@@@@@@+++......+++++............++$$$####@##$$#@+...........++@@+++.......+@@@@#@@@#@++.........++@##@+++................+++@@+++........++++++.............+.+.+.+.+........+++++++++++.+........++@@@@@++@@++...+#@$$$@@@@@@@+@++++.......+++.....++....", +"......++@+@++.......@@$$$$$@++..............+++++++++.......+@@$$$$$$$$$$$$$$#+......@@@@@+..........++@$$$@#@#@#@$$$@@.........++@@$$@@+.......+@@####@@$$++.......++++@$$$@++++.............++$$$$$@@......++@@$$$++........++++++++++++@+++....++@##@#@@@+++++++....++@@#@@@@@$$+++..+@#$$$#@@@@$$#@#@@@....+++@@+.+++@@@.+..", +"......++@@@@@+......++$#$$$@@+.......+.....++++@@@@@++++....+@@$$$$#$$$$$$#$$$+.....+@@@#@++.........++@#$$###@###$$$@+......+.++@@@$$@@++.....++@@@##@#@$$@++....++++@@@$$$@@@+++...........++@$$$$$#@....++++@@$#$@++......++++@@@@@@@@+@@@+...++@@##@#@@@@@@@@++...+++#####@@@$$@@+..@@@#$$####@$$##@#@@....+@@@@+++++@@@@+..", +"......+@$$$@@+......++@@$$$@@++...+++@@..++@@@$$$$$##@@+....++@@@+@@###@@@@++++.....+@@#@#++.........++@###$$$$$@#$$$@@..++@+@+++@@@$$@@++.....+@@@###@@@$$+++...++@@#@@#$$$@#@#@@+..........++@#@#@#@+..++@+@@@@##@@+@++....+@#$$$$$$$$$$$#$++.++@#$$$$$$$$$$$$$$#...+@@@@@##@@@$$@+++.+@@@@@$$@@@#@$$$#@@....++@$$@+++@#$#@@+.", +"......@+$$$@@++.....++@@$$$#@+++.++@+@@..++@@@$$$$$##@@@++..++++@@@@###@+@+@+++......@@@#@++........+++@####$$$$##$$$@@..+@@@@@@+@@@$$@@@+...+++@@@@##@@@$$@@++..+@@####@$$$###@#@@..........++@@###@@@...@@@@@@#@##@@++++..++@@$$$$$$$$$$$$$@+..+@#$$$$$$$$$$$$$$$...+@@###@#@@@$$@@@+..++@@@$$@#@@#$$$##@....++@$$@@@@@$$$@@+.", +".....++@$$$@@@+......++@$$$@#+++.+@@@@@.++@@#@$$$$$##@@@+++.+++++@@@###@@++++......+.@@##@@.........+@+@###$$$#$##$$$@+.++@@@@@@@@@@$$@@@++..+++@@#@##@@@$$@@+@.++@@#####$$$@##@#@@.........++@@#@##@@+.++@@@@#@#@#@@@@@@++.++##$$$$$$$$$$$$$++.++@@$$$$$#$$$$$$$#$.+++@@@#@##@@@$$@@@+.++@@@@$$@@@#@$$$@#+....++@$$@@@+@$$$@@+.", +"......++@@@$$++......++@@##@@++++@##$@@.+@@$$$@@###@####@@+.+@@@@@+@###@@@+++++.....+@@@#@++........++$$$$$##@####$$$@#.+.$$$$$$$$$$$$###++.@+@#####$$###$$@#@@.++@@$$$##$$$#####@@........++@@#$$$$$@+.++$$$$$$$$$$$$$$$@@..+@@$$$@@@@@@@$$$@+..++@@@@$$##@$$@@@@+.++@$$$$$$$$$$$$$$#@...@@##$$@@@@@$$$@@+....++@#$@@@@@###$$+.", +"......++@#@$$+@.......+@###@@@+++@$$$@@.+@@$$$@@####@###@@+.+@@@@@@@###@@@@++++.....++@##@@+........@@#$$$$##@#@##$$$#@.++$#$$$$$$$$$$###++.+@@@####$$##@$$###@.++#@$$$@#$$$#@####@........++##@$$$$$@@.++$$$$$$$$%$$$$$#@@..++@$$$@+@+@@@$$#@+..+.+@@@#$###$$@++++.+@@$$$$$$$$$$$$$$$@.++@@@@$$@@@+@#$$@@+.....+@#$@#@@@####$+.", +".....+++@@@$$@++......++@@#$$@@+@@#$$@+.+$$@@@@@@@@##@@@$$+.+#@#@##@$$$##@#@#@@.....+@@#@#++.........@@@#@#@##@#$$###@@..++@@@@$$@@@@@###@+.@@@#@###$$###$$@@##.+@@@$$$@@$$$@@#@@#@.........@@####@@@@+.+@@##@#@@$$$@@@@@++..+@@#$#@@++@@@$$$@+....+.++@@###@@+@++....++@#@#@#@@@$$@@@+.++@$$$$$@++@@#@#@@+....+++#@$$$##@@@@++.", +"......++@@@$$@@+......+@@#@$#@@+@@$$#@+.+$$#@@@@@@###@@@$$+.+@@##@##$$$##@#@#@@.....++@#@#++........++@#@#@#@##@$$###@@..+++@@@$$@@@@@###@+.@@@###@#$####$$##@@.++#@$$$@@$$$@@@#@#@........++@######@@+.++#@#@#@@$$$##@@@+...++@$$$@++++@@$$$@+......++++####@@+......++@@#@##@@@$$@@@+.+@@$$$$$@@+++#@#@@@.....++@@$$$##@#@++..", +"...+++++@+@$$@@++......+@@@$$@@@@@$#$++.+$$@#@+@@@@##@@@$$@.+@@@@#@#$$$####@#@@.....+@@@#@@++........@@@#@##@#@#$$###@@....++@@$$@@@@@###@+.@@@@@###$$@##$$@#@#..@@##$$@@$$$@@@#@#@........++#@###@#@@@.+@@#@#@@@$$$@@@@@++..+@@#$$+@+++@@$$$@+.......++@###@@+++.....+++#@###@@@$$@@@+.+@@$$$$$@+++@@###@+......@@@$$$##@@@++..", +"..++@@@#@+@##@@@+......++@@$$@@@@@+@++..@$$@#@@+@@@$$@@@##@.++@@+@@@###@++@++++.....++@$$$++.........+@@$$$$$$$$$$###@+.....+++#####@@@@+#@.+++@@@@@##@@@$$@@@+.++@#$$$#@$$$#####@#........++@@@$$###@#.++@####@@####@@++....++@$$$+@+++@@$$#@@.......+++@###@++.......++@#@##@@@$$@@++.+@@#@#$#@@@+@@@@#@+....+++@@$$$##@++.+..", +".++@@@#@@@+##@@@++......+++$$@#@@++++...@$$#@@@+++@$$@@@##@....++++@###@@++++++......@@#$$@++........++@$$$$$$$$$$#@#++......+@@#@#@@+@+@@@...+++@#@##@@@$$@@++..@@@$$$##$$$#####@@.........++@@$$####@..@@@###@@####@@++.....@@$#$@++++@@$$$@+........++@@#@#+++.....++@@#@##@#@$$@@++.+#@@#@$$@@@+@@#@##+.....++@@$$$##@@++...", +"++@#$$@@@@@@@##@++......+++@@$$$@++++...+####@@+@+@####@##@.....+++@###+@+++........++@$$#@+..........++###@#@@@@@###++.......+@@$$$@@@++++....++@@@##@@@$$@@@+..+@@###@@$$$@@@#@@@........+++@+###$$##..+@@$$$@@##@##@++....++@$$#@@+@+@@$$$@+........++@@@##++.......++@#@#@@@@$$@@+...+@+@@@#@@@@@@#@#@@...++@@@#$$$$$+@+....", +"++@$$$#@@@@@@###@++......++@@$$$@@++....+##@##+@++@@#@####@.......+@@##@+++.........+++$$$@++........++@####@@@@#@@#@++......++@@$$$@@++++......+@@@##@@@$$@@@+.++@@###@@$$$@@#@@@@.....++++++@@##$$$##.+++@$$$@@#####@+++....@+$$$@+@+@@@$$$@+.........++@@##@++......++#@####@@$$@@++...+++@##@#@@@#@@#@+..+++@@##$$$$$@@++...", +"+@+$$#@@@@@@@##@@@+.......+@@#$$+@+++...+@##@#@@+@@##@#@##@.......+@###@+++..........+@$$$@@++........++###@#@@@@@##@++........+@$$$@@++.+......+@@###@@@#$@#@+..++@@##@@$$$@+@@@@+..+++++@@@@@@##$$###..++@#$$@@#@###@+++...+@@#$$@@@@@@@$$#@+.........++@@##@@++.....++@#@@@@@@$$@@+.....+++@#@#@@@@#@#@+.++@@@@##$$$$$@@@++..", +"+##$$$$$#####$$$#@@........++#@@##@@++..+@@$$$#@@+@@@$$$$$@......+++####@@++........+++@###@++.........@@@#$$#@#@@++++........+++@@@#@@++......+.@@@##@+@#@$$$@...+++++@@$$$@@@+++...+@@#@@$#$$$#####@@...+@###$$@@@@@###++...+@$$$#@#####$$$@@..........+++@#@@@++.....@@@#####@$$@@++......+@@#####$$$@@+.+@@$$$$$@@@@@$$#@++.", +"+##$%$$$#####$$$#@@........++@####@@+++.+++$#$##@@@@@$$$#$+.......++###@#@++.........++##@##@++.......++@#@$$##@@@+++...........+@@@##+++.......+@@@##@++@@$#$@...++++++@$#$+++......+@@##@$$$$$#####@@...++###$%@@##@#@#++..++@$$$#######$$$++...........+@@##@@@.....++@####@#@$$@++.......++@###@#$$#@++.+@#$$$$#@+@#@$$$@++.", +"+$$#@@@@@@@#@#@#$$@.........++++@@$$$@+..+++@@@@$#$@@@@@@++.......+@@###@@++..........++@@$##@@+.......+@@@$$###@+++.............+++@@@@@+.......+@@@@+@++@@@@#......++@+$$$@+++....++@@@###@@@@@@@@@#@....++@@@@@+@+@@#@#@...+@@@@+@++@+@###@+...........++@@###@@....++@@@#####$$@@+........++@@@#@@@@++..+@@#@@+@+++++@@@$$@.", +"+$#@#@@@@#@#@##@$$@.........+++@@@$#$@@...+++@@#$$#@+@+@+++.......++@####@++...........+++$$@@@+.......++@@$$###++...............+++@@#@@.......++@@@#+++++@#@#........++$$$++.......+@@@#@#@@@+++@@@@#....+++@@#++++@@@@#@...++@#@@++++@+#@#++............+++@@#@+.....+@@@##@#@$$@@+........++@@@#@@@++...++@@@@@++++++@@@#$@.", +"+$$@@@+@@@#@#@#@$$+...........++@@$$#@@.....++@@#$$++++++..........@@@@#@++...........+.+@#$#@@++.......++@#$@#@++................++@@@@@+.......+++@@++.++@@@@........++$$$+++......++@@@@#@@+@++++@@@.....+++@@+++++@@#@@...++@@@++++++@##@++.............+@@#@@@.....+@@@###@#$$+++..........+@@@@@++....++@@@@++....+++@$#@.", +"++++++++++++++@++@+............++++@@@@.....++++++++++.............++@+++++.............++++@@@+.........+++@+@+++..................++++.+.......++++..+...++++........+++@@+.........++@+@++++++++++++......++.+...+++++@+...++++++....+.++++...............++++++......++++@@+@@@@++...........+++++++......+++........++++++.", +".+++++..++++++++++...............++++++.......+++++++................++++.................++@@++..........++++++............................................+++.........++++.+...........+.+++.......+................+.+.................+++................+.++.........+++++++@@+...............+.+.......................++.", +".................+..................++................................+...................++.+...........................................................................+++..................................................................................................++++.+............................................"}; diff --git a/hacks/images/matrix0b.xbm b/hacks/images/matrix0b.xbm index 25b376e4..96621412 100644 --- a/hacks/images/matrix0b.xbm +++ b/hacks/images/matrix0b.xbm @@ -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, diff --git a/hacks/images/matrix0b.xpm b/hacks/images/matrix0b.xpm index 3b5e1de3..66697f3e 100644 --- a/hacks/images/matrix0b.xpm +++ b/hacks/images/matrix0b.xpm @@ -1,192 +1,201 @@ /* 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", "...............+.................++@+......++++.............................................................................................................++..", -".............+@@@+....+++@+++...+@@$$@+...++$$@++...+++++.......+.+......++++.......+@@+....+@@++......+@@++...............................................++@@+", -".+..+..+..+..@##$++...@@$@@@+.+.+$$$$@++.++$##$@+.+.+@@++..+..+.@+++.+...+@@@+.+..++@$@++...+@$@+..+.++@##$+.+..+++@+.+..+..+..+..+..+..+..+..+..+..+..+...+$#$@", -"...........+.$%%$@.+.+@#$##$+..+@$###$@..+@$###$@..+@$$$++....+@$$@+.....+$$@+.....+$$$+.+..+$$$++....+$%%#@+....+@$++..................................+..@$#$+", -"..+..+...+..+@%%$@...+$####$@+.+$#%%#$@+.@$####$++.+$$$$@+....@$##$++..++@$$@+..+.+$$$@+.....@$$@+..++@#%%%$@+...@##$+..+..+..+..+..+..+..+..+..+...+.....+@$$@+", -"...+...+.....$%%#++..+@####$+.+@$#%%%$@.+@$##$$$++.+@###@++.+.$$#$@++....+$@++....+$#$+...+..@$#$++..+$#%&%$@..++$%%#@++.+..+..+...+++++++++..+...+...+...+$$$+.", -".....+...+..+$#%#+.+.++@@@@+...@#%%%#$@..@$####$+..+@$##$+...+$###$@+....+++...+..@##$++.....@$##@....$#%%%$@+.+$#%%%$@...........++$$#$#$@+....+...+..+.+@$$@+.", -".+...........@#%$+......+++.+.+$#%%%%$++.+@$####@+.+@$#$$@+..+@#%#$$++.......+...+@#%$+.....+.$%#@+...+####$+.+@#%%&%%$@.+..+..+...@#%%%%#$++............+@$$+..", -"...+.+..+.+.+@##@+............+$%%%%#$+.+@$$####@+.@@$##$@++.+$#%%%#@.+........+..@$#$+.+.+..+$$$+.+.++$$$$@+..+$#%%%#@+....+.+....+$$$$#$@+..+.++.+..+..$$$@+..", -".............+@$$...+....+....+$##%##@+..+$##%%#$++.+@$$$$+.++$##%%#@+.+.+.+......+$$$++....++$#$@.....++++...+.+$%%$++..+.+@@++..+.++@@+++....++@@+...++@$$++..", -".+....+...+..+@$@+....+....+...@$##$$++..+$#%##$+...+@$$$$+..@$##%##$+.......+.+..+@$$@+.....@$$++..........+....@##$+.....+$$@+............+..+@$@++..++$$@+...", -"...+..........@@+..+.........+.@$$#$$+...++$#%$@.+...+$$@+++.+@$###$@+.+.+.........+@#@++.+.+$$@+..+......+...+..+$$@.+...+@$#@+..+..+.+.......+@$@+...+$$$@.+..", -"......+.+.+.+.+.+...+.+.+.+....+$$$@@+.....+$$@+......+++.....++@@@@++.....+..+.+...@$@+....++$++...+...+......+..+++......@$@@..........+..+..++@+...+.$$@+....", +".............+@@@+....+++@+++...+@@##@+...++##@++...+++++.......+.+......++++.......+@@+....+@@++......+@@++...............................................++@@+", +".+..+..+..+..@$$#++...@@#@@@+.+.+####@++.++#$$#@+.+.+@@++..+..+.@+++.+...+@@@+.+..++@#@++...+@#@+..+.++@$$#+.+..+++@+.+..+..+..+..+..+..+..+..+..+..+..+...+#$#@", +"...........+.#%%#@.+.+@$#$$#+..+@#$$$#@..+@#$$$#@..+@###++....+@##@+.....+##@+.....+###+.+..+###++....+#%%$@+....+@#++..................................+..@#$#+", +"..+..+...+..+@%%#@...+#$$$$#@+.+#$%%$#@+.@#$$$$#++.+####@+....@#$$#++..++@##@+..+.+###@+.....@##@+..++@$%%%#@+...@$$#+..+..+..+..+..+..+..+..+..+...+.....+@##@+", +"...+...+.....#%%$++..+@$$$$#+.+@#$%%%#@.+@#$$###++.+@$$$@++.+.##$#@++....+#@++....+#$#+...+..@#$#++..+#$%&%#@..++#%%$@++.+..+..+...+++++++++..+...+...+...+###+.", +".....+...+..+#$%$+.+.++@@@@+...@$%%%$#@..@#$$$$#+..+@#$$#+...+#$$$#@+....+++...+..@$$#++.....@#$$@....#$%%%#@+.+#$%%%#@...........++##$#$#@+....+...+..+.+@##@+.", +".+...........@$%#+......+++.+.+#$%%%%#++.+@#$$$$@+.+@#$##@+..+@$%$##++.......+...+@$%#+.....+.#%$@+...+$$$$#+.+@$%%&%%#@.+..+..+...@$%%%%$#++............+@##+..", +"...+.+..+.+.+@$$@+............+#%%%%$#+.+@##$$$$@+.@@#$$#@++.+#$%%%$@.+........+..@#$#+.+.+..+###+.+.++####@+..+#$%%%$@+....+.+....+####$#@+..+.++.+..+..###@+..", +".............+@##...+....+....+#$$%$$@+..+#$$%%$#++.+@####+.++#$$%%$@+.+.+.+......+###++....++#$#@.....++++...+.+#%%#++..+.+@@++..+.++@@+++....++@@+...++@##++..", +".+....+...+..+@#@+....+....+...@#$$##++..+#$%$$#+...+@####+..@#$$%$$#+.......+.+..+@##@+.....@##++..........+....@$$#+.....+##@+............+..+@#@++..++##@+...", +"...+..........@@+..+.........+.@##$##+...++#$%#@.+...+##@+++.+@#$$$#@+.+.+.........+@$@++.+.+##@+..+......+...+..+##@.+...+@#$@+..+..+.+.......+@#@+...+###@.+..", +"......+.+.+.+.+.+...+.+.+.+....+###@@+.....+##@+......+++.....++@@@@++.....+..+.+...@#@+....++#++...+...+......+..+++......@#@@..........+..+..++@+...+.##@+....", ".+.+...........+.+..............++@++.+....++@+...+.....+..+...+..+.......+......+...++..+....+..+....+...+.+....+....+.+.+++@.+...+................+..+@@++.+..", "...++++.....+.+.......+.+++..+..+++++...+....++.....++++.+...+..+.+.+.+.+.@+@+....+++.+...+.+.++.+..+..............+........+........+...+.......+.......++.....", -"...+@@@+++.++@@@++.+..+@@@@@+..++@$@+++....+@@@++..++@$@@++....+@$@@++.+@@@@@@++..++@@@@+....++@+++.....+....+.+...............+.+....+.....+.+.......+.+@@$@+..", -".@@$$##@+..+@###@...++@$###$++.+$$##$@+....+$##+..++$##$$@+..+.$#%#$+..+$$$#$$@++++$##$$++.+@$$$$@++.+....+......+.+.+.+....+..+..+......+....+.+.+.+..+@###$@+.", -".+@####$@+++@#%%$+...+@####$@+++$#%##$@.+.+$#%%$+..+$###$$++..@$%##$@+.+$$$$##@+++$###%$@+++@$###$@+.....+.+.......+.....+..++@@@+...+.++.+.++@@++.....+$#%%#$@.", -".@$#$$#$@+.++$%#$+...@@$$###@+++$$###$@...+$#%#$+.+@$%%##$+.++$#%#$@+..++@$$$$@++@$#$##$@+.@$$$##%@+.+.+@@@+.+...++@@+....++@@$$@++++@@@@++.+@$$$@@+.+.+$####$@+", -"+@$#$$$$@@..+@#%$+..+.++@$$$$+..+@$###@+.+@###%$+..@$#%%#$++.@$%###$++...++$$$+..@$##$##$+++$#$$%%$+...+@#@+...+.+@#@@.+..@@$#$@@+.+@$$$$@@+.@@$##$@+..+@$$##$@.", -".@$#@@$$$++.++##$+....++@##$++.++$#%#$++.@$###%$++.+$$#%%#@+.@#%%###@+....+$$$++.+$####$@+++$###%%$+...+@$@@.....+@$@@..++$###$@+..@$#####@+.+@@####$+..+@$##$@.", -"+@$$$$$#@@..+@#%$+...+.@##$@+...+@$##$@.+@##%#%$@.+.@@$$#%$++@##%#%%@+.+.++$$++.+@$#####@+.+@###%%$++...+@++.+....@@++...@$###@++.+@$#####@++.+@$#%#$+..+@###@+.", -".@$#$$$$$++.+@#%$+...++$##$@+.+.@@$$#$@.+@###%%#@..+@@@$#%$.++#%###%$+...+@$$+...@$##$##$+.++$%%%%$...+.++.+...+..+.+..+.+$###$@+..@$$#$##@+.++@####@+..+@$#@+..", -"+@$#$$$$@+..+@#%$@++.+$#%#$++.+@$@$$#$@+.@$###%#$+++$@$$%#$+.@$%##%%$+..++$$$++.+@#$#$#$@++.@$##%#@+....+@++......@@++....@$###@@+++$$$#$$@+++$$##$@+....@$$@...", -".+$####$@+.+@$#%$@+..@#%##$@+.+$#$###$+..+@$##%#@.++$$#$##@+.+$#####@+...@$#@+...+$#####@++.+$####@.+..+@$@@..+.++$#@+.+...@@$#$@+.+@@@@@@++.@$$$$++.+..+@$@+.+.", -"+.+$$#$@+..+@$###@+++@$###$$@.+@$#$$$++.+.+@$$#$@+.+@#$#$@+..++$$$#$@....+$$@+.+..+$$#$$+..+@$$$$++....+@#@++...+@##@+...+..++@@++...+..+...+@@@++.......+@++...", -"...@@$@++..+@@$$$@+..+@$$$$@+...@$$@+......+@$$@+...+@@$@+.+..++$@@@+.....+++...+.++@$@+.+.++@$@@.+.+..++@+.....+@$@@.........+..............++.+...+.+..++.+...", +"...+@@@+++.++@@@++.+..+@@@@@+..++@#@+++....+@@@++..++@#@@++....+@#@@++.+@@@@@@++..++@@@@+....++@+++.....+....+.+...............+.+....+.....+.+.......+.+@@#@+..", +".@@##$$@+..+@$$$@...++@#$$$#++.+##$$#@+....+#$$+..++#$$##@+..+.#$%$#+..+###$##@++++#$$##++.+@####@++.+....+......+.+.+.+....+..+..+......+....+.+.+.+..+@$$$#@+.", +".+@$$$$#@+++@$%%#+...+@$$$$#@+++#$%$$#@.+.+#$%%#+..+#$$$##++..@#%$$#@+.+####$$@+++#$$$%#@+++@#$$$#@+.....+.+.......+.....+..++@@@+...+.++.+.++@@++.....+#$%%$#@.", +".@#$##$#@+.++#%$#+...@@##$$$@+++##$$$#@...+#$%$#+.+@#%%$$#+.++#$%$#@+..++@####@++@#$#$$#@+.@###$$%@+.+.+@@@+.+...++@@+....++@@##@++++@@@@++.+@###@@+.+.+#$$$$#@+", +"+@#$####@@..+@$%#+..+.++@####+..+@#$$$@+.+@$$$%#+..@#$%%$#++.@#%$$$#++...++###+..@#$$#$$#+++#$##%%#+...+@$@+...+.+@$@@.+..@@#$#@@+.+@####@@+.@@#$$#@+..+@##$$#@.", +".@#$@@###++.++$$#+....++@$$#++.++#$%$#++.@#$$$%#++.+##$%%$@+.@$%%$$$@+....+###++.+#$$$$#@+++#$$$%%#+...+@#@@.....+@#@@..++#$$$#@+..@#$$$$$@+.+@@$$$$#+..+@#$$#@.", +"+@#####$@@..+@$%#+...+.@$$#@+...+@#$$#@.+@$$%$%#@.+.@@##$%#++@$$%$%%@+.+.++##++.+@#$$$$$@+.+@$$$%%#++...+@++.+....@@++...@#$$$@++.+@#$$$$$@++.+@#$%$#+..+@$$$@+.", +".@#$#####++.+@$%#+...++#$$#@+.+.@@##$#@.+@$$$%%$@..+@@@#$%#.++$%$$$%#+...+@##+...@#$$#$$#+.++#%%%%#...+.++.+...+..+.+..+.+#$$$#@+..@##$#$$@+.++@$$$$@+..+@#$@+..", +"+@#$####@+..+@$%#@++.+#$%$#++.+@#@##$#@+.@#$$$%$#+++#@##%$#+.@#%$$%%#+..++###++.+@$#$#$#@++.@#$$%$@+....+@++......@@++....@#$$$@@+++###$##@+++##$$#@+....@##@...", +".+#$$$$#@+.+@#$%#@+..@$%$$#@+.+#$#$$$#+..+@#$$%$@.++##$#$$@+.+#$$$$$@+...@#$@+...+#$$$$$@++.+#$$$$@.+..+@#@@..+.++#$@+.+...@@#$#@+.+@@@@@@++.@####++.+..+@#@+.+.", +"+.+##$#@+..+@#$$$@+++@#$$$##@.+@#$###++.+.+@##$#@+.+@$#$#@+..++###$#@....+##@+.+..+##$##+..+@####++....+@$@++...+@$$@+...+..++@@++...+..+...+@@@++.......+@++...", +"...@@#@++..+@@###@+..+@####@+...@##@+......+@##@+...+@@#@+.+..++#@@@+.....+++...+.++@#@+.+.++@#@@.+.+..++@+.....+@#@@.........+..............++.+...+.+..++.+...", "+.+.+++..+..+++++++...++++++.+...+++++...+..+++++.+..+++.+......+++..+.+.+.+........++.+.....++++........+.+...+.+@+++.+..+.....+..+.+..+.+.....................", ".....+........+....+....+.+....+..+....+....+.........++.+..+.+...+........+.+..+.+..+.+..+..+..+......+.+.+....+.+........+.+...............+.+.+.+..+..+.+..+.", "+.++@@@+.+..++@@+....+@@@@+++....++@@@+..+@@@@++.+.+@++++++...+@@@+@+.+..+++@++..++@@+@+++..++@@+++.+..++@@+++.++@@@@@.+.++@+++..+.++@+.++@.+.+++.@+.+...++++...", -".++$$#$@..+++@$@@+.+.+@$$$@@+.+++@$$$@@++@$$$$@@++.+$$$$$@@+++@$$$$$@+.+@@@$$@@+++$$$@$$@@++@@$$$@@..+++@$$@@.+@@$$@@$++.@$$$@+...+@$@@@@@$++@@$@@@$@+.+@@@$$@+.", -".+@$###@+..+@###@++.+@#####$++.@$#$$##$++$###$##@++@$#####@++@###$##@@+@$$#$##$++$##$$$#$@.+@####@++..+@####@++$#####$@++@###@++.++$##$@$#$@@$##$$##$++@$##$##@+", -".@$###%$@+.+@#%#$++.+@$###%%$++$##$$$#$++$##$$###@@@$###%#@++@$###$#$@@$##$$$#$@+$##$$$#$@.++#%%#@+...+@@##$@++$#####$@.+@$##@+...+$%####%#@@#%%##%%$@@$##$$##$+", -"+@$#%%%#++..$$###@+..@$###%%$@@#%#$@@@@++@$#$@$##@+@$#####@.+@$#$##$@@@#%$$@$$@++@#$#$##$++.+@#%$+.+...+@$#@+.+@##%##@+..@$##++..++#%%##%%%$+$#%##%%#@@#%$$$#%$@", -".@$##%%$@+.+@####$++.$$%##%%$$@#%$+++++.+@$$$@$$$@+@$#%%##++.@$%###@++@#%$@@@$@+++$###$$$+..+@#%$+...+.++$$$@.+@##&%$@+..+$#$@....+$%%%%%%%$@$$##%%%$@@#%$@@$#$@", -"+@##%%%$@.++$#%%%$@.+@$%###%#@$#%$@..+.+.@$#@@@$$@+@$%%%%@@.+@$%%%#@.+$#%#@@$$@.+@$#$##$$++..$#%@@...+++@@#@++.@$%%%#@+..+@#$@++.++#%%%%%%#@@$###%%%$@$#%$@@$#$@", -".@$###%$@+.@##%%%#$+.@$#####$@$#%$@+.++.+@$#@@$##@+@$#%%#$@+.@$%##$@..@###$$##$++@$#$$#$$++.+@#%$+.++@@@$$#@@.+@$##%#$+..@$##@@$+.@#%%##%%%$+$$##%%%#+$#%$@@$#$@", -"++$####$@++$%%#%%%#$+$$##$##$@@$#$@@@@@++$##$$$##@@@######@@+@$###@+.++$##$###$++@####$#@@..+$%%$@+.@$##$##$+.+@#####$@++@$%####@++#%%#$#%#$@$##$%%%$++$#$$$#%$@", -".@$#%##$@.+$%%##%%#@+$######$++@$##$#$@++@#%####$+@$###%##$@@$###$@+..+@$###$#$+@$##$###$@+.@$#%#@++@$####$@+.@@###$##$++@#%##%#$++$##$$#%#$@$####%%$++@$#####$+", -".+@$#%#@+++@##$$##$@@$######@+.+@$$#$@+.+$$###$$+++$######$+@$###$++...+$$$#$$+++@##$$$#$+++@$###@+.+@$$##@@..+$##$@@#@+@@#####$@++$#$@@@#$@@$#$$$##$..+$$#$#$@.", -"..+@$$@@..++@@@+@$@+.@@$@@@@+..+.@@@@++..@@$@$@+...+$@$$@@++++$@@++..+..++@@@+..++@$@@@@@+..@@@$@@+..+@@@@++..++@@@@@@+++@@@$@$@+..@@@+++@++++@@+++++....@@@@+..", +".++##$#@..+++@#@@+.+.+@###@@+.+++@###@@++@####@@++.+#####@@+++@#####@+.+@@@##@@+++###@##@@++@@###@@..+++@##@@.+@@##@@#++.@###@+...+@#@@@@@#++@@#@@@#@+.+@@@##@+.", +".+@#$$$@+..+@$$$@++.+@$$$$$#++.@#$##$$#++#$$$#$$@++@#$$$$$@++@$$$#$$@@+@##$#$$#++#$$###$#@.+@$$$$@++..+@$$$$@++#$$$$$#@++@$$$@++.++#$$#@#$#@@#$$##$$#++@#$$#$$@+", +".@#$$$%#@+.+@$%$#++.+@#$$$%%#++#$$###$#++#$$##$$$@@@#$$$%$@++@#$$$#$#@@#$$###$#@+#$$###$#@.++$%%$@+...+@@$$#@++#$$$$$#@.+@#$$@+...+#%$$$$%$@@$%%$$%%#@@#$$##$$#+", +"+@#$%%%$++..##$$$@+..@#$$$%%#@@$%$#@@@@++@#$#@#$$@+@#$$$$$@.+@#$#$$#@@@$%##@##@++@$#$#$$#++.+@$%#+.+...+@#$@+.+@$$%$$@+..@#$$++..++$%%$$%%%#+#$%$$%%$@@$%###$%#@", +".@#$$%%#@+.+@$$$$#++.##%$$%%##@$%#+++++.+@###@###@+@#$%%$$++.@#%$$$@++@$%#@@@#@+++#$$$###+..+@$%#+...+.++###@.+@$$&%#@+..+#$#@....+#%%%%%%%#@##$$%%%#@@$%#@@#$#@", +"+@$$%%%#@.++#$%%%#@.+@#%$$$%$@#$%#@..+.+.@#$@@@##@+@#%%%%@@.+@#%%%$@.+#$%$@@##@.+@#$#$$##++..#$%@@...+++@@$@++.@#%%%$@+..+@$#@++.++$%%%%%%$@@#$$$%%%#@#$%#@@#$#@", +".@#$$$%#@+.@$$%%%$#+.@#$$$$$#@#$%#@+.++.+@#$@@#$$@+@#$%%$#@+.@#%$$#@..@$$$##$$#++@#$##$##++.+@$%#+.++@@@##$@@.+@#$$%$#+..@#$$@@#+.@$%%$$%%%#+##$$%%%$+#$%#@@#$#@", +"++#$$$$#@++#%%$%%%$#+##$$#$$#@@#$#@@@@@++#$$###$$@@@$$$$$$@@+@#$$$@+.++#$$#$$$#++@$$$$#$@@..+#%%#@+.@#$$#$$#+.+@$$$$$#@++@#%$$$$@++$%%$#$%$#@#$$#%%%#++#$###$%#@", +".@#$%$$#@.+#%%$$%%$@+#$$$$$$#++@#$$#$#@++@$%$$$$#+@#$$$%$$#@@#$$$#@+..+@#$$$#$#+@#$$#$$$#@+.@#$%$@++@#$$$$#@+.@@$$$#$$#++@$%$$%$#++#$$##$%$#@#$$$$%%#++@#$$$$$#+", +".+@#$%$@+++@$$##$$#@@#$$$$$$@+.+@##$#@+.+##$$$##+++#$$$$$$#+@#$$$#++...+###$##+++@$$###$#+++@#$$$@+.+@##$$@@..+#$$#@@$@+@@$$$$$#@++#$#@@@$#@@#$###$$#..+##$#$#@.", +"..+@##@@..++@@@+@#@+.@@#@@@@+..+.@@@@++..@@#@#@+...+#@##@@++++#@@++..+..++@@@+..++@#@@@@@+..@@@#@@+..+@@@@++..++@@@@@@+++@@@#@#@+..@@@+++@++++@@+++++....@@@@+..", "..+.++++........+.....+..++........++.....+..+..+...+..+.+...+.+++.....+...+.+....+.+.+++.....++++.....++.......+.++.+...++@+++...+.++.++......+..+...+...+.....", "..+.......+.+.+..+..+..+...+....+...+.+....+.++..+..++.+.+........+.+...+.+..++...+.+....+.+.+..+.+...+.+++.+...+.@@++...+++.........+@@@+...+..+...........+...", -"++@@$@@++....@@@++...+@@$$++.+...@@$@@.+.+@@@@@@+.++++++++++++@@+++@+++++++++++++++@@@@@@+.+@@@@@@@+.++@@@@@.+..+@##@++.+@@@@.+.+..++@$#$++....++@++...+.....+..", -"+@####$@++.++$##$@++.$####$@+..++$##%#$+.@##%#%#$++@#$@$$$@++@$$@@@$$++@$$@@$#$++@##$$##$@+@###$##$@++$#####@+..+@##$+...@@$@+......+$#%#@+..+.+$$@+.....+......", -"@$%%%%#$++++$##%##@+@$%%%%$$@+.+@$#%%%#@+$%%&%%%#@@#%#$$#%$++$%#$$$%#@@$%%$$#%#$@$%%%#%%#@@$%%##%%#@@@#%%%%#@+..+$%%@+...+@$$++.+..+.+$%#@.+...$#%$++...........", -"@$$###$#$++$$#$###$+@$%%###$@++@$####%#@@$%%%&%%#@@$%#$$#%$@+$##$$$##@@$%%###%#$@$#%%#%%#@@$#%##%%#@+@$##%%#@+..+$%#@+...+@$$@+......+$##@...++$###@+..+...+.+..", -".@$#$$$$$@@#%$$$$#$++@$##$#$$@.@$#####$@+$#%%%%%#@@$#$@$#%#@+$$#$@$#$@@#%%%%%%#@++##%###@.+@$#####@++@$$###$@...+$%#@.+...+@##@.+..+.+$%#@+...+$$##@++...+......", -".@$###$#$@$#%$@@$$$@+@$#%###@+.@$#####$+.@$#%%#$$+@$$$@$#%$++@$$$$$$$@+$%%%%%%#@++@#%%#$@..+@$#%#$+..+@$###@++..+@%#@+....+@$$$+.....+$##@+.+.+@$$$++..+...+....", -"+@$#%###@@@##$@@$#$++$$%%%%$@+++$##%#%$@+.+$#%#@+.+$$$@@#%$+.+@#$$$$@++#%&%%&%#@.+@$###@++..+$#%#@+..+@###$@+...+$%#@..+...+@$@@++...+$%#@.....+++++.........+..", -"+@##%##$@+@$%#$$##$++@##%#%$@..@$$$##%#@.++$#%$@.++$$$$$#%$+++@####$+.+$#%%%%%#@++@#####+.+.+$#%$@...@@###$@@...+$%#@+......@$#@+..+.+$%#$+.+......+.+.+..+.....", -"+@$###$@..+$######$++$######$@+@###$#%#@...@#%#@..+@$$$$##@+..@$###@+..@#%####$++@######$@..+$#%$++.+@$%%###@+..+$%#@+.+..+.+@$$@+..++#%#@...+..+............+..", -"@$###$++...@#%%%%%$++$%#$$##$@+$######$@+.@$#%$@+.+@$$$#$$@+..@$###+.++@$#$#$$$+@$%######@+.+$#%$@+.+@######@+..+@%%$+......+@$#@...++$%#@+............+.+.+.+..", -"+@$#$@+..+.+$#%#%#$++@$$$$$$$+.@$#$$$$@+..+@#$$@...+@$$$$@++...@$$$+...+@$$@$$+++$$#$$$#$+..+@$#$++..@$##$##@+...@##$@.+.....+@@@+..+@##$++...+...+.+...++++++++", -"+++@@++....+$$####@.++@@++++++.@+@@@@@+...++@@@++...+@@@@+...+.+@+++....++++++.+.++@@@@@+++.++@@++.+.++@@@@++..+.@$$@@...+...+++.+..+@$$$+.+..........++@@@@@@@+", -"....+.....+.+@@@$@@...............+..................................+.......+...+.++.........+.+......+.+.......++@+++............+.+@@++......+....+.@@@$$$$@+", +"++@@#@@++....@@@++...+@@##++.+...@@#@@.+.+@@@@@@+.++++++++++++@@+++@+++++++++++++++@@@@@@+.+@@@@@@@+.++@@@@@.+..+@$$@++.+@@@@.+.+..++@#$#++....++@++...+.....+..", +"+@$$$$#@++.++#$$#@++.#$$$$#@+..++#$$%$#+.@$$%$%$#++@$#@###@++@##@@@##++@##@@#$#++@$$##$$#@+@$$$#$$#@++#$$$$$@+..+@$$#+...@@#@+......+#$%$@+..+.+##@+.....+......", +"@#%%%%$#++++#$$%$$@+@#%%%%##@+.+@#$%%%$@+#%%&%%%$@@$%$##$%#++#%$###%$@@#%%##$%$#@#%%%$%%$@@#%%$$%%$@@@$%%%%$@+..+#%%@+...+@##++.+..+.+#%$@.+...#$%#++...........", +"@##$$$#$#++##$#$$$#+@#%%$$$#@++@#$$$$%$@@#%%%&%%$@@#%$##$%#@+#$$###$$@@#%%$$$%$#@#$%%$%%$@@#$%$$%%$@+@#$$%%$@+..+#%$@+...+@##@+......+#$$@...++#$$$@+..+...+.+..", +".@#$#####@@$%####$#++@#$$#$##@.@#$$$$$#@+#$%%%%%$@@#$#@#$%$@+##$#@#$#@@$%%%%%%$@++$$%$$$@.+@#$$$$$@++@##$$$#@...+#%$@.+...+@$$@.+..+.+#%$@+...+##$$@++...+......", +".@#$$$#$#@#$%#@@###@+@#$%$$$@+.@#$$$$$#+.@#$%%$##+@###@#$%#++@#######@+#%%%%%%$@++@$%%$#@..+@#$%$#+..+@#$$$@++..+@%$@+....+@###+.....+#$$@+.+.+@###++..+...+....", +"+@#$%$$$@@@$$#@@#$#++##%%%%#@+++#$$%$%#@+.+#$%$@+.+###@@$%#+.+@$####@++$%&%%&%$@.+@#$$$@++..+#$%$@+..+@$$$#@+...+#%$@..+...+@#@@++...+#%$@.....+++++.........+..", +"+@$$%$$#@+@#%$##$$#++@$$%$%#@..@###$$%$@.++#$%#@.++#####$%#+++@$$$$#+.+#$%%%%%$@++@$$$$$+.+.+#$%#@...@@$$$#@@...+#%$@+......@#$@+..+.+#%$#+.+......+.+.+..+.....", +"+@#$$$#@..+#$$$$$$#++#$$$$$$#@+@$$$#$%$@...@$%$@..+@####$$@+..@#$$$@+..@$%$$$$#++@$$$$$$#@..+#$%#++.+@#%%$$$@+..+#%$@+.+..+.+@##@+..++$%$@...+..+............+..", +"@#$$$#++...@$%%%%%#++#%$##$$#@+#$$$$$$#@+.@#$%#@+.+@###$##@+..@#$$$+.++@#$#$###+@#%$$$$$$@+.+#$%#@+.+@$$$$$$@+..+@%%#+......+@#$@...++#%$@+............+.+.+.+..", +"+@#$#@+..+.+#$%$%$#++@#######+.@#$####@+..+@$##@...+@####@++...@###+...+@##@##+++##$###$#+..+@#$#++..@#$$#$$@+...@$$#@.+.....+@@@+..+@$$#++...+...+.+...++++++++", +"+++@@++....+##$$$$@.++@@++++++.@+@@@@@+...++@@@++...+@@@@+...+.+@+++....++++++.+.++@@@@@+++.++@@++.+.++@@@@++..+.@##@@...+...+++.+..+@###+.+..........++@@@@@@@+", +"....+.....+.+@@@#@@...............+..................................+.......+...+.++.........+.+......+.+.......++@+++............+.+@@++......+....+.@@@####@+", ".....+.......+.....+.++...+.....+...+..+....+.+.+..+..+.+.+..+.+.+++..+...+......+....+.......+..........++.+..+.........+.++.+........+...+.+....+....+++++.++.", -".+.++++...+.....+....+@$+....+...........+...+@@++..+..........++@@@++..+......+.@@@+....+.+.++@++.+.+..++@+..+@@@+.+.+...+@@@++.+.+............................", -"..+@$@++......+....++$$$@+.......+...+.+...+.@$$@+....+....+..++@###@++...+.+...+$$#@+.......@@$+......++$$@..@@#@@.......@$##@......+.+....+.+.+.+.+......+....", -"..+$##@...+.+.+.++...$##$++.+.+...++++....+.@$##$+++.+.+++....+$###$@+..+.+.++.++@##@@++....+@#$@+...+.+@#$@@.+@$#@@@.+.+.+$%#$+..+.++.++++....+.+....+.+++..+..", -"...@#$@+....@@$$@+..+@$##$$++..+@@@@@@@++.+@$$$$$+.++@@@@@+.+++$%%#$@+.+@@@@@$+.+@##$$@@+..++$#$@+...++@$#$@+.@@$$$@@@....+@#%$+..+@@$$@@@@++@@@@@@@+..++@@$@@+.", -".+.+@$++.+.+@####@+..@#####$++.+$#####$+++$###%#$+++$###$$@+.+$#%%#$++.@$###%#@++@##%##@@+..+$##@+....+@##%$++.@$####@@+...@##@+.+@$###%##@++$#####@++.+$####$@+", -"....+++....@$#%%%$++.@#%#%##$@+@#%##%%#++@#%%#%#$++@#%#%%#$@++$#%%#$+++$###%%#$+.@$###%$@+..@$#%@+....@@$###+.+@$#%##@+..+.@#%$+..@#%%%%%##@@$#####$@++@$%####$@", -"+.+..+.+.+.@$##%%#@.+@$####%#@+$#%#$$#$@+$#####$$++@%%%%%%#++.+###$@.+@#%##$##$++@####$#@++.+@%%$+..+..@@##$@+.@#%%%#@+...+@##$+.+@$###%##$@@@##$$$#@+@$#%#$#%#@", -"..........+@#%##%#@.+@$$$$#%#@+$%#$@@$$++$%%$$#$$@@$%%%%%%#@+.+$#$@+.+@#%#$$#$@+.@$#$$$$$+..+@#%$@.....++@##+.+@$%%%$@+...+@%%$+.+@$######$@+@##$$$$$@+$%##$#%#@", -"...+.....+.$#%#%%#$.+@#####%#@+$%%#$$$$@+$#%####$++$%%%%%%#@.++$##$@.+@#%#####@++@##$$$#$++.+$#%$@+.+...@$#$@.+@##%%#@++..+@#%$++.@$$#####$@+@$#$$$#$++$%%#$#%#@", -".....+...+.$#%#%%#$++$######$++@####$#$@+$####%#$@+$#%%%##$@+.@$##$@+.@$#%###$@++@######$@.+@$%%#@@...@@@$#$@.+$######++.++$#%#@++@$##$####@@$######$@+@##%###$@", -".+....+...+@##%###$++@###%#$@+.+@#####$+.+$#####$+++$$####@+.+@####@+++$$##%##+++$##$$##$@.+@$###@@+..+@$$#@+++@$$$##$@+.+@$###$++@$##$$$$$@@@##$$##$@.+@####$@+", -"...+.......+@@$$$@++++@$$$@@...++@@$@@@+..+@$$$$++..+@$$$@++..@@$$$++..+@$###$@..@@@@@@@@+..+@$$@@+..+@@$$@@..+@@@@@$@@...@@$$@@.++@@$@@@@@+++@@@@@$@+.++@$$$+..", -".......+....++++.+....+.++.+......++++.....+.+.++..+.+.+++...+.++++++.++@@@$@@+..+.+.+++++.+..++@.....++@@++....+...++.+.+..+++.+..++++++++...+++++.++.....+.+..", +".+.++++...+.....+....+@#+....+...........+...+@@++..+..........++@@@++..+......+.@@@+....+.+.++@++.+.+..++@+..+@@@+.+.+...+@@@++.+.+............................", +"..+@#@++......+....++###@+.......+...+.+...+.@##@+....+....+..++@$$$@++...+.+...+##$@+.......@@#+......++##@..@@$@@.......@#$$@......+.+....+.+.+.+.+......+....", +"..+#$$@...+.+.+.++...#$$#++.+.+...++++....+.@#$$#+++.+.+++....+#$$$#@+..+.+.++.++@$$@@++....+@$#@+...+.+@$#@@.+@#$@@@.+.+.+#%$#+..+.++.++++....+.+....+.+++..+..", +"...@$#@+....@@##@+..+@#$$##++..+@@@@@@@++.+@#####+.++@@@@@+.+++#%%$#@+.+@@@@@#+.+@$$##@@+..++#$#@+...++@#$#@+.@@###@@@....+@$%#+..+@@##@@@@++@@@@@@@+..++@@#@@+.", +".+.+@#++.+.+@$$$$@+..@$$$$$#++.+#$$$$$#+++#$$$%$#+++#$$$##@+.+#$%%$#++.@#$$$%$@++@$$%$$@@+..+#$$@+....+@$$%#++.@#$$$$@@+...@$$@+.+@#$$$%$$@++#$$$$$@++.+#$$$$#@+", +"....+++....@#$%%%#++.@$%$%$$#@+@$%$$%%$++@$%%$%$#++@$%$%%$#@++#$%%$#+++#$$$%%$#+.@#$$$%#@+..@#$%@+....@@#$$$+.+@#$%$$@+..+.@$%#+..@$%%%%%$$@@#$$$$$#@++@#%$$$$#@", +"+.+..+.+.+.@#$$%%$@.+@#$$$$%$@+#$%$##$#@+#$$$$$##++@%%%%%%$++.+$$$#@.+@$%$$#$$#++@$$$$#$@++.+@%%#+..+..@@$$#@+.@$%%%$@+...+@$$#+.+@#$$$%$$#@@@$$###$@+@#$%$#$%$@", +"..........+@$%$$%$@.+@####$%$@+#%$#@@##++#%%##$##@@#%%%%%%$@+.+#$#@+.+@$%$##$#@+.@#$#####+..+@$%#@.....++@$$+.+@#%%%#@+...+@%%#+.+@#$$$$$$#@+@$$#####@+#%$$#$%$@", +"...+.....+.#$%$%%$#.+@$$$$$%$@+#%%$####@+#$%$$$$#++#%%%%%%$@.++#$$#@.+@$%$$$$$@++@$$###$#++.+#$%#@+.+...@#$#@.+@$$%%$@++..+@$%#++.@##$$$$$#@+@#$###$#++#%%$#$%$@", +".....+...+.#$%$%%$#++#$$$$$$#++@$$$$#$#@+#$$$$%$#@+#$%%%$$#@+.@#$$#@+.@#$%$$$#@++@$$$$$$#@.+@#%%$@@...@@@#$#@.+#$$$$$$++.++#$%$@++@#$$#$$$$@@#$$$$$$#@+@$$%$$$#@", +".+....+...+@$$%$$$#++@$$$%$#@+.+@$$$$$#+.+#$$$$$#+++##$$$$@+.+@$$$$@+++##$$%$$+++#$$##$$#@.+@#$$$@@+..+@##$@+++@###$$#@+.+@#$$$#++@#$$#####@@@$$##$$#@.+@$$$$#@+", +"...+.......+@@###@++++@###@@...++@@#@@@+..+@####++..+@###@++..@@###++..+@#$$$#@..@@@@@@@@+..+@##@@+..+@@##@@..+@@@@@#@@...@@##@@.++@@#@@@@@+++@@@@@#@+.++@###+..", +".......+....++++.+....+.++.+......++++.....+.+.++..+.+.+++...+.++++++.++@@@#@@+..+.+.+++++.+..++@.....++@@++....+...++.+.+..+++.+..++++++++...+++++.++.....+.+..", ".+.+....+....................+...............+..........................++.@++.+..................+.....+........+.+........+.........+............+..+....+....", ".....+...........+........+.+........+..+.+.+..+.+....+....+.+.....................+........+.+.....+......+..+...@+++.....+@@++....++@++...+...........+....+..", -".......+.+....+....+..+.......++.+....+...++++.....+....+......+.+.+.....+....+.+....+.+.+......+.......+.......++@@@+.+...@@$@.+...++@@@+....+..+..+.+.........", -".++++++...+.+.++++.+..+.+++.+...+.++++..++@$@@+.+...+++.+.+.+.+.+.++.++.++.++.+...++@.++....++.+.+@.+.+++++++...+@##@+....+@##@+....+@$#@+..............+....+..", -".@@$$@@@+.+.@@$$$$++.++@@@$@++..+@$@+++..@$##$$@.+++@@@@@@+.+@$$@@$$@+++@@@+@$@@.+@$@@$$@@+@$@@@@$@+.+@@$$$@@...+@%#@+.+...@#%$+.+...@##@+.+..+.+.+.+.....+.....", -"@$%%#%$$+++@$###%#$+++$#%##$@+++$###$$+.+@#%%%#@+.+$##@$#$@@+$#%###%#@@$##$$###@+@#%##%#$+@$##$$$##@.@$#%%%$@+..+$%%@.....+@#%@+....+@#%$+....+@+@@++.+.+....+..", -"+$%%%###$+@$###%%#$+.+$#%%#$@+++$%%%#$@.+@#%##$@+.@$%#$$$$$+@$%%###%$@@#%####%#@+@$%%%%#@@+$%##$#%#@+@@#%%##@..+@$%#@+.+..+@#%$+.+...@#%$++.++@$#$$@@+....+.....", -"+$#####%#$@#%#####@.+.@#%#$$+.+@#%%##$+.++$##$@+..+$##$$$#@++@$##$##$@+$#%#%%#$@.+@##%%$@+.@##%#%#@@.@$$#%#@@+..+$%%@+.....@%%@+....+@#%$+..+@##%%##@++......+..", -".@#####%#$@#%##%##@+.+@###@++.++$%%%#$@+.+@$#@@+..+@#$$$$#$@+@@$#$#$@++@$%%%%#$@++@#%%#@@..@@#%%##@.++$#%%#@@...@$%#@...+.+@#%$+.+...@##$+..+@##$##$@...+.+.....", -"+@$%####$+@$####%$@.+.$#%$+++.+@$###%#@+.+$##$@@++.@$#$$##$@.+@####@+..@###%%#@+..@##%#$@@..@$#%$@+..@$#%#$$@@..+$%#@@....+@##@+....+@#%@+....@@@$@@++.......+..", -"+@$###$@+.++@$$###@+.+$#%$$++.+@$###%#@+..@$%#$$++.@$####%$@+.+$###@...+@#####@+++$##%##@@.+@$##@@...@$%%%#$@+..+@%#@+.....@$#@..+...@##@+.....+.+.+......+.....", -"+$###$+++...+@$###@+++####$++++@$$###$+..++$$#$@+.+++$$$##$+..+@$$@+.+.+@$$$#@+..@$$#$##@@.@$#%#@+...+@##%#$@+...@$$@++.+..++@++....+@$$@+.+.+.........+.....+..", -"+$#%$$+.....++$###$+.+@$@@@+..+++@@@@++....@@@@++...++$@$$++...+@@++....++@+@+..+.@@@@@@@..@$##$@+.+.++@@@@@+....@@@+........+...+..++@@.......+..+.+.....+.....", -".@$$$+.+.+....+$$$++....+.+.......++.+.+.....+.........++.+.+.................+..+.......+.+@$@@@.....+.++....+...+.+.+.................+..............+.....+..", +".......+.+....+....+..+.......++.+....+...++++.....+....+......+.+.+.....+....+.+....+.+.+......+.......+.......++@@@+.+...@@#@.+...++@@@+....+..+..+.+.........", +".++++++...+.+.++++.+..+.+++.+...+.++++..++@#@@+.+...+++.+.+.+.+.+.++.++.++.++.+...++@.++....++.+.+@.+.+++++++...+@$$@+....+@$$@+....+@#$@+..............+....+..", +".@@##@@@+.+.@@####++.++@@@#@++..+@#@+++..@#$$##@.+++@@@@@@+.+@##@@##@+++@@@+@#@@.+@#@@##@@+@#@@@@#@+.+@@###@@...+@%$@+.+...@$%#+.+...@$$@+.+..+.+.+.+.....+.....", +"@#%%$%##+++@#$$$%$#+++#$%$$#@+++#$$$##+.+@$%%%$@+.+#$$@#$#@@+#$%$$$%$@@#$$##$$$@+@$%$$%$#+@#$$###$$@.@#$%%%#@+..+#%%@.....+@$%@+....+@$%#+....+@+@@++.+.+....+..", +"+#%%%$$$#+@#$$$%%$#+.+#$%%$#@+++#%%%$#@.+@$%$$#@+.@#%$#####+@#%%$$$%#@@$%$$$$%$@+@#%%%%$@@+#%$$#$%$@+@@$%%$$@..+@#%$@+.+..+@$%#+.+...@$%#++.++@#$##@@+....+.....", +"+#$$$$$%$#@$%$$$$$@.+.@$%$##+.+@$%%$$#+.++#$$#@+..+#$$###$@++@#$$#$$#@+#$%$%%$#@.+@$$%%#@+.@$$%$%$@@.@##$%$@@+..+#%%@+.....@%%@+....+@$%#+..+@$$%%$$@++......+..", +".@$$$$$%$#@$%$$%$$@+.+@$$$@++.++#%%%$#@+.+@#$@@+..+@$####$#@+@@#$#$#@++@#%%%%$#@++@$%%$@@..@@$%%$$@.++#$%%$@@...@#%$@...+.+@$%#+.+...@$$#+..+@$$#$$#@...+.+.....", +"+@#%$$$$#+@#$$$$%#@.+.#$%#+++.+@#$$$%$@+.+#$$#@@++.@#$##$$#@.+@$$$$@+..@$$$%%$@+..@$$%$#@@..@#$%#@+..@#$%$##@@..+#%$@@....+@$$@+....+@$%@+....@@@#@@++.......+..", +"+@#$$$#@+.++@##$$$@+.+#$%##++.+@#$$$%$@+..@#%$##++.@#$$$$%#@+.+#$$$@...+@$$$$$@+++#$$%$$@@.+@#$$@@...@#%%%$#@+..+@%$@+.....@#$@..+...@$$@+.....+.+.+......+.....", +"+#$$$#+++...+@#$$$@+++$$$$#++++@##$$$#+..++##$#@+.+++###$$#+..+@##@+.+.+@###$@+..@##$#$$@@.@#$%$@+...+@$$%$#@+...@##@++.+..++@++....+@##@+.+.+.........+.....+..", +"+#$%##+.....++#$$$#+.+@#@@@+..+++@@@@++....@@@@++...++#@##++...+@@++....++@+@+..+.@@@@@@@..@#$$#@+.+.++@@@@@+....@@@+........+...+..++@@.......+..+.+.....+.....", +".@###+.+.+....+###++....+.+.......++.+.+.....+.........++.+.+.................+..+.......+.+@#@@@.....+.++....+...+.+.+.................+..............+.....+..", "..+.++....+....+++.+.+..+.+...+.+..+.....+.+....+.+.++.........+.+.+....+.+++......+.+......++@...........+.............+..+.+.....+.+....+.+...+...+.....+.....", -".......+...+.+...........++++....+++++.......+......+@++@@+.+...+++..+..+@@@@@@.+......+......@@@++.+..+.++.+.+.+.+.+...........+..............++@++...+.+.+.+..", -".+...............+.+.+.+@$$+....++$$$@+...+.+.+.+.+@$$$$$$@+..++@$@.....+$###$@...+++@+.+.++@@$$@@....++@@@@..........+.+....+.......+.+....++@@$$$@+....@@$++..", -"...+.+...+.+.+.+......+@$%#$@+.+@##%#@++.++@@@@@+.+@#%##%%#++..@##@+.+.+@#####@@+..@.@@@...@$#%%%#@@..+@$$#@+.......+.....+.+.+.+.+......+...+$%%%%$@+.+@$##$++.", -".............+.++....++$#%%$@..+@####@+..+@####$@.+@#%#%%#$+..++##$+...@$%%##@@...@+++@.+.+@#%%%%#$@..@@##%$+.+.+++++++..+@@@@@@@...........+@#%&%%#$@..+$$$$+..", -".+...+.+.....+@@+.+..+@$###$@+++$###@@.+.@$####$@@.+$#%#%#@.+..@##@+.++@#%%###@@.......+..+@#%%%%#$@.+@$###$@...@@@@$@@+.@$#####$@+.++@+@+.++@#%%%%##@+..+@@++..", -".........+...+@$@+..++$$#$#$+..@$###@+...@$##$##$+.+@$%##$@+..++$#@+..+@#%%%##$@....+....+@$#%####$@+.@$#%%$@.+@@#$#$$@@.@$#%#%%#@.@@@@@@@+.@$#%%%%#$@+...+.....", -"..+.+.......+@$$$++..+$$#$$@+++@#%%#@+..+@$#$##$@++.@$%%#@+....@$$@+..+@#%##%%$@++........@$%%%%%##@.@@##%%$@+.$$%###$@+.@@@$$#%#@+@@$###$@++@######$@+.........", -"......+..+...$#%$@...+@$###$+..@#%%#@@+..@$#####$+.+@$%%%@@+..++$$@+..++@###%##+....+.....@$%%%%%#$@..@#%%#@@.@$%##%#$@...+.@@@#$@.@@@$$$@+.@@#%%###$@...+.+..+.", -"+...........+$%%#@+..++$###$+++@$%%#$$@++@$$####@+..@$%%#$+....@##@+...+@$##%%@@.+.....+..+@$%#%#$@+@.@@#$$@+.+$#%####@@......@@@+..+@@++++.+@$##%%#@++.........", -"..+.+.+..+..+@%&#@+...++$%#@+.+$#%%%%#$+.+@$$$$$++.+@#%%%$@+..+@#%$+...@$###%$@+....+......@@$###@@....+@@+....@@$$$$$@@....+..+............++@####$@.+...+.+...", -"............+$%%#@+....+@$$@...@##%###@++.++++++..+.@$#%#@+....@##@+..++$##%#@@..+.....+....+@$$@@.+............@@@$@@@+.+........+.....+.....@@$#$++...........", -"+......+.....@$#$++.....+@++.+.+@$@$$@@.............+@@@@++.+..@$#@+...+@$#$$@......+....+..++@@++........+..+..+++@@+.......+.+....+..........++@+...+.+..+.+..", -"..+.+.....+..+$@@...+.+..........++.++.+..+.+..+...+..+++.....+.+@++....+@@+@.+..+.................+.+.+.................+.+......+...+...+.+.+.+..+............", +"*======*...+.+...........++++....+++++.......+......+@++@@+.+...+++..+..+@@@@@@.+......+......@@@++.+..+.++.+.+.+.+.+...........+..............++@++...+.+.+.+..", +"-=%%%%=-.........+.+.+.+@##+....++###@+...+.+.+.+.+@######@+..++@#@.....+#$$$#@...+++@+.+.++@@##@@....++@@@@..........+.+....+.......+.+....++@@###@+....@@#++..", +";%%%%%%;.+.+.+.+......+@#%$#@+.+@$$%$@++.++@@@@@+.+@$%$$%%$++..@$$@+.+.+@$$$$$@@+..@.@@@...@#$%%%$@@..+@##$@+.......+.....+.+.+.+.+......+...+#%%%%#@+.+@#$$#++.", +";%%%%%%;.....+.++....++#$%%#@..+@$$$$@+..+@$$$$#@.+@$%$%%$#+..++$$#+...@#%%$$@@...@+++@.+.+@$%%%%$#@..@@$$%#+.+.+++++++..+@@@@@@@...........+@$%&%%$#@..+####+..", +">%%%%%%>.....+@@+.+..+@#$$$#@+++#$$$@@.+.@#$$$$#@@.+#$%$%$@.+..@$$@+.++@$%%$$$@@.......+..+@$%%%%$#@.+@#$$$#@...@@@@#@@+.@#$$$$$#@+.++@+@+.++@$%%%%$$@+..+@@++..", +";%%%%%%>.+...+@#@+..++##$#$#+..@#$$$@+...@#$$#$$#+.+@#%$$#@+..++#$@+..+@$%%%$$#@....+....+@#$%$$$$#@+.@#$%%#@.+@@$#$##@@.@#$%$%%$@.@@@@@@@+.@#$%%%%$#@+...+.....", +";%%%%%%;....+@###++..+##$##@+++@$%%$@+..+@#$#$$#@++.@#%%$@+....@##@+..+@$%$$%%#@++........@#%%%%%$$@.@@$$%%#@+.##%$$$#@+.@@@##$%$@+@@#$$$#@++@$$$$$$#@+.........", +">%%%%%%,.+...#$%#@...+@#$$$#+..@$%%$@@+..@#$$$$$#+.+@#%%%@@+..++##@+..++@$$$%$$+....+.....@#%%%%%$#@..@$%%$@@.@#%$$%$#@...+.@@@$#@.@@@###@+.@@$%%$$$#@...+.+..+.", +">%%%%%%,....+#%%$@+..++#$$$#+++@#%%$##@++@##$$$$@+..@#%%$#+....@$$@+...+@#$$%%@@.+.....+..+@#%$%$#@+@.@@$##@+.+#$%$$$$@@......@@@+..+@@++++.+@#$$%%$@++.........", +";%%%%%%;.+..+@%&$@+...++#%$@+.+#$%%%%$#+.+@#####++.+@$%%%#@+..+@$%#+...@#$$$%#@+....+......@@#$$$@@....+@@+....@@#####@@....+..+............++@$$$$#@.+...+.+...", +";%%%%%%;....+#%%$@+....+@##@...@$$%$$$@++.++++++..+.@#$%$@+....@$$@+..++#$$%$@@..+.....+....+@##@@.+............@@@#@@@+.+........+.....+.....@@#$#++...........", +"-=%%%%='.....@#$#++.....+@++.+.+@#@##@@.............+@@@@++.+..@#$@+...+@#$##@......+....+..++@@++........+..+..+++@@+.......+.+....+..........++@+...+.+..+.+..", +"*=====)...+..+#@@...+.+..........++.++.+..+.+..+...+..+++.....+.+@++....+@@+@.+..+.................+.+.+.................+.+......+...+...+.+.+.+..+............", "....+.+.......+.+......+++.+.+.+..+...........................+.@++++.+....+........+.+..+...+.+..........+.........+.+..@+@...+...@@++.....++@+++......+....+..", -"+..++@+++..+.+.+..+....+@@@.....+@@@@+.+.....++.+.+..+.....+.++@$$$@@+..+.....+..+.........+..@@++.....++@.+.+.+.+......+@@$@+....+@@@@.+.+.+@$@@++.++....+.+...", -".++@@@@+.....++@+...+.+@@$@@....+@$$@+...+.++++........+.....@@###%#@+.....+..........+.....+@$$@..+..+@@@@.............@@#$@.+++.@@#$@+++++@@##@@@+++....+.+.+.", -"..@@#$$@++...@$$@++..++@$$@@.+..@@$#$@+....+@@@++...+.+.+++.+$#%%%%#$++.+......+.+.+.....+...@##$@....@@$$$@@....+.+.+..+@#$@@.@@@+$$#@+@@@@@$###@@@@+.+..+@+...", -".+@@#$$@++.+@$#%$@+...@@$#$@...++$$#$@+....+@@@..+++@@++@++.+$%%%%#$@....+.+...+.+....+....+.$%%$+.+.+@$$$$$@.++.@.@.+..+@$#$@@@@@+@$#@@@$$@@@$##$$@@@...++@@+..", -"..+@$$$@+..@$#%%%#@@..@$#$@++...@$##$@+.+.+.++++..+@$$@@$@@++@%%&%%$@@...+@@@.+.++.@........+@#%$@....$$##$@@..+$@$@$@@.+$$$$$$#@@@@$##$##$@@$######@++..+@$$++.", -"..++@@@++.++#%%&%#$@.++@#$$@..+.@$$$$+............@$##$$#$@++@##&%#$@...+@@$@..+.++..+.+.....$##$@..+.@$#$$$@.@@$$###$@.@@#$#$##$@@@#$##$#$$@$$#####@+..++$#$+..", -"....+++....+$#%%#$@+..+@$@@++...+@$@@++...+..+....+$##$@$#@@.+@#%%%$@@...@$@@++.++.+......+..@$#@++..+@##%$$++.@$###%#$++@$$###%#@@@$$#$##$$@@$##%%#$+.++@$#$@+.", -"..+........++@###@+...+++++...+..+@+...........+...@###$###@.++$%%#$@....+@@..++.+++.@.+.....+@@+.....@#%%#@@.+@$###%%@+.@@$#$%%#@+@$#$$$#$@@@@###%%$@.+@$$$$++.", -"........+..++$$#@@.+.................+..+.+.......+@$######@..+@%%%$@@+......+.++..@@$@+..+.....+....+@$##$@+.+@$###%#@+.@$$$##%%@+@$$$$$$$@+@$$##%%#+++@##$$@++", -".+.+.+.....+@$##$$@+..+..+.+...+..+.........+..+..+@#######@+.@$%%%#$.....+.++.++.@@$#$@..........+....@$$@+..+@$$$##$@..@@$$##%%@+@@$@$$$$@+@$$$#%%$+.@@$#$#$@.", -"........+.++$#####@+.................+.............@$##$@@@+..@#%%%#$@++..++.++.+..$#%$@+...+.+................@@@$$@@+..+@@@@$##+++@++@$$$@+@@@@@##$+.+@$###$@+", -".....+.....++@$@$@@+...+...+.+..+.+....+.+..+..+.+.@$$@@+..+.++@###$$+...+.++.++.++@$#@+........+.+.+....+..+..+.@..+....+.++++@@+....++@@@+.+.++++@++..+@$#$@+.", -".+.+..........++++..+....+..........+..............+@@@+.+.....@@@@@+..+.++.++.++..@$$@+..@...@.+......+.+..........................+...++....+..+.+......@@@+..", +"+..++@+++..+.+.+..+....+@@@.....+@@@@+.+.....++.+.+..+.....+.++@###@@+..+.....+..+.........+..@@++.....++@.+.+.+.+......+@@#@+....+@@@@.+.+.+@#@@++.++....+.+...", +".++@@@@+.....++@+...+.+@@#@@....+@##@+...+.++++........+.....@@$$$%$@+.....+..........+.....+@##@..+..+@@@@.............@@$#@.+++.@@$#@+++++@@$$@@@+++....+.+.+.", +"..@@$##@++...@##@++..++@##@@.+..@@#$#@+....+@@@++...+.+.+++.+#$%%%%$#++.+......+.+.+.....+...@$$#@....@@###@@....+.+.+..+@$#@@.@@@+##$@+@@@@@#$$$@@@@+.+..+@+...", +".+@@$##@++.+@#$%#@+...@@#$#@...++##$#@+....+@@@..+++@@++@++.+#%%%%$#@....+.+...+.+....+....+.#%%#+.+.+@#####@.++.@.@.+..+@#$#@@@@@+@#$@@@##@@@#$$##@@@...++@@+..", +"..+@###@+..@#$%%%$@@..@#$#@++...@#$$#@+.+.+.++++..+@##@@#@@++@%%&%%#@@...+@@@.+.++.@........+@$%#@....##$$#@@..+#@#@#@@.+######$@@@@#$$#$$#@@#$$$$$$@++..+@##++.", +"..++@@@++.++$%%&%$#@.++@$##@..+.@####+............@#$$##$#@++@$$&%$#@...+@@#@..+.++..+.+.....#$$#@..+.@#$###@.@@##$$$#@.@@$#$#$$#@@@$#$$#$##@##$$$$$@+..++#$#+..", +"....+++....+#$%%$#@+..+@#@@++...+@#@@++...+..+....+#$$#@#$@@.+@$%%%#@@...@#@@++.++.+......+..@#$@++..+@$$%##++.@#$$$%$#++@##$$$%$@@@##$#$$##@@#$$%%$#+.++@#$#@+.", +"..+........++@$$$@+...+++++...+..+@+...........+...@$$$#$$$@.++#%%$#@....+@@..++.+++.@.+.....+@@+.....@$%%$@@.+@#$$$%%@+.@@#$#%%$@+@#$###$#@@@@$$$%%#@.+@####++.", +"........+..++##$@@.+.................+..+.+.......+@#$$$$$$@..+@%%%#@@+......+.++..@@#@+..+.....+....+@#$$#@+.+@#$$$%$@+.@###$$%%@+@#######@+@##$$%%$+++@$$##@++", +".+.+.+.....+@#$$##@+..+..+.+...+..+.........+..+..+@$$$$$$$@+.@#%%%$#.....+.++.++.@@#$#@..........+....@##@+..+@###$$#@..@@##$$%%@+@@#@####@+@###$%%#+.@@#$#$#@.", +"........+.++#$$$$$@+.................+.............@#$$#@@@+..@$%%%$#@++..++.++.+..#$%#@+...+.+................@@@##@@+..+@@@@#$$+++@++@###@+@@@@@$$#+.+@#$$$#@+", +".....+.....++@#@#@@+...+...+.+..+.+....+.+..+..+.+.@##@@+..+.++@$$$##+...+.++.++.++@#$@+........+.+.+....+..+..+.@..+....+.++++@@+....++@@@+.+.++++@++..+@#$#@+.", +".+.+..........++++..+....+..........+..............+@@@+.+.....@@@@@+..+.++.++.++..@##@+..@...@.+......+.+..........................+...++....+..+.+......@@@+..", ".+.@++.+...+..+++.....+++@.+..+.++@@+....+..+....+..++@++.......+...+..+.++.++.+.++@@@...+.+.++@@.@.+.+@@@@.+..+.@.++.+..+++++...+....++++.+..++@@++.+.+....+...", -"..+@@@+.......+@@++....@@@++....+@@@@@+....+++@+.....@@@@+..+.++@@@@@+.++.@@@@++..@$$@@++.++.+@@@@....@@$$@@....+@@@+@+...+@@+++....+.+@@++....@$@@+.....++++++.", -".++@$@++...+++@$@+..+++@$$@@..++@###$+..++@@@@@+.+.++@$$@+....@@####$@.@@$$$$$@.@+@$#$$@.+.@@@$$$$+.+@@$##$@@.+@@$$$$@@..+@@$$@+.+..++@$@@+..++@$$$@+.++++@@@++.", -".+@$#$@.+...@@#$@+...+@$##@++..@@###$@+..+@$$$@@...+@$##@@...+@#%%%%#@@$$##%##$+@@##%##$@@.@###%#$@+.$###%#$@++@#####$@+..@$##$@+..++$$#$@@.++@$###@++..$$$$$$++", -".+@#%##+...+@###$@...@$###$@...@$#%#$@...@$#%#$@...+@###$++...@#%%###@@$%#$$#$$@@$#%%%%%@+@@#%%%%#$++$#%%%%%@++$#%%%%%@+.@@####@@+.+@##%#$@..+$$#%#$+.++$#%%#$+.", -".+@#%%#@.+.+@#%%$@++.+@#%%$@+.++@#%%$@+..@@$%%$@+..+@#%%$@+..@$#%#%$$@$#%#@@@$@+@@####%%@.+$####%#@.+@####%#$.@$####%#@+.+@$%%#@+..+@$%%#@++.+@$%%#@++..@$#%#@@.", -".+@##%#@+..+@##%#@.+.+@##%#@+..+@#%##$+..+@#%%#@+..+@##%#@+..@@%#%##@+@#%$@++++..@$####$@.@+$####$@+.@$####$@.+@$####$@...@@%%#++...@@#%#@....+$#%#@..+.+$#%#+.+", -"++$##%##@+.@$##%##@.++$#%#%#@+.+$#%%#$@@.@$#%#%$@+++$#%#%$@++@$%%%##@@@#%$@.+.@.@@$#%##$@..@##%##$@.+@##%##$@+.@##%##@@+..+@#%$+....+$#%$++...+@#%$++....@#%$+..", -".@#%#%%#$@+@#%#%##$@+@##%#%#$@+@#%##%#$@.@##%#%#$++@##%#%#$@@@%%%%#$@+@#%#$@$$@.+@#%#%#$@+.@##%##$@.+@$%#%#$@.+@##%#%$@+..+@#%$@+...+@#%$+....+@#%$@..+.+$#%$+..", -"@##%##%%#@@$#%##%%#@@$%%##%%#@@$#%##%%#@@$%%##%%#@@$#%%#%%#@@##%%%#$$@+$#%##$#@+@@#%####@@@@#%####$@+$######@@@@#%####@++.@$#%#++..+@$#%#@++.++$%%$@+...+$%%#@+.", -"+$%%###%#@@$%%#$#%#@@$%%###%#@@#%%#$#%#@@$%##$#%#@@#%##$#%#@$#%#%%%##@+@$####$@+@$%###%#$@@$%%##%#$@@$#%##%#$@@$%####%$@++@##%#@@.+.@#%%$@+..+@$#%#@@++.$$%%#$+.", -"@$##$$##$@@@##$$###@@@##$$###@@@$#$@###@@@##$$$##@+@##$$###@@$######$@..@$##$@+.@$#%####$@@$###$##$+@$###$##@@@$#%####@+.+@$###@++.@@$###$++.+@$#%$$+..+@$##$$++", -".+@@@@@@@+++@@@@@@@+++@@@@@@@++@@@@@@@@+++@@@@@@+++@@@@@@@@@@@@@$$$$@@+.@$$$@....@@$@@$@@.+@$$$$@@@..@@$$$@$@.+@@@@@@@@...@@@@$+....+@$$@@+..+@@@$@+++..+@$$@+..", +"..+@@@+.......+@@++....@@@++....+@@@@@+....+++@+.....@@@@+..+.++@@@@@+.++.@@@@++..@##@@++.++.+@@@@....@@##@@....+@@@+@+...+@@+++....+.+@@++....@#@@+.....++++++.", +".++@#@++...+++@#@+..+++@##@@..++@$$$#+..++@@@@@+.+.++@##@+....@@$$$$#@.@@#####@.@+@#$##@.+.@@@####+.+@@#$$#@@.+@@####@@..+@@##@+.+..++@#@@+..++@###@+.++++@@@++.", +".+@#$#@.+...@@$#@+...+@#$$@++..@@$$$#@+..+@###@@...+@#$$@@...+@$%%%%$@@##$$%$$#+@@$$%$$#@@.@$$$%$#@+.#$$$%$#@++@$$$$$#@+..@#$$#@+..++##$#@@.++@#$$$@++..######++", +".+@$%$$+...+@$$$#@...@#$$$#@...@#$%$#@...@#$%$#@...+@$$$#++...@$%%$$$@@#%$##$##@@#$%%%%%@+@@$%%%%$#++#$%%%%%@++#$%%%%%@+.@@$$$$@@+.+@$$%$#@..+##$%$#+.++#$%%$#+.", +".+@$%%$@.+.+@$%%#@++.+@$%%#@+.++@$%%#@+..@@#%%#@+..+@$%%#@+..@#$%$%##@#$%$@@@#@+@@$$$$%%@.+#$$$$%$@.+@$$$$%$#.@#$$$$%$@+.+@#%%$@+..+@#%%$@++.+@#%%$@++..@#$%$@@.", +".+@$$%$@+..+@$$%$@.+.+@$$%$@+..+@$%$$#+..+@$%%$@+..+@$$%$@+..@@%$%$$@+@$%#@++++..@#$$$$#@.@+#$$$$#@+.@#$$$$#@.+@#$$$$#@...@@%%$++...@@$%$@....+#$%$@..+.+#$%$+.+", +"++#$$%$$@+.@#$$%$$@.++#$%$%$@+.+#$%%$#@@.@#$%$%#@+++#$%$%#@++@#%%%$$@@@$%#@.+.@.@@#$%$$#@..@$$%$$#@.+@$$%$$#@+.@$$%$$@@+..+@$%#+....+#$%#++...+@$%#++....@$%#+..", +".@$%$%%$#@+@$%$%$$#@+@$$%$%$#@+@$%$$%$#@.@$$%$%$#++@$$%$%$#@@@%%%%$#@+@$%$#@##@.+@$%$%$#@+.@$$%$$#@.+@#%$%$#@.+@$$%$%#@+..+@$%#@+...+@$%#+....+@$%#@..+.+#$%#+..", +"@$$%$$%%$@@#$%$$%%$@@#%%$$%%$@@#$%$$%%$@@#%%$$%%$@@#$%%$%%$@@$$%%%$##@+#$%$$#$@+@@$%$$$$@@@@$%$$$$#@+#$$$$$$@@@@$%$$$$@++.@#$%$++..+@#$%$@++.++#%%#@+...+#%%$@+.", +"+#%%$$$%$@@#%%$#$%$@@#%%$$$%$@@$%%$#$%$@@#%$$#$%$@@$%$$#$%$@#$%$%%%$$@+@#$$$$#@+@#%$$$%$#@@#%%$$%$#@@#$%$$%$#@@#%$$$$%#@++@$$%$@@.+.@$%%#@+..+@#$%$@@++.##%%$#+.", +"@#$$##$$#@@@$$##$$$@@@$$##$$$@@@#$#@$$$@@@$$###$$@+@$$##$$$@@#$$$$$$#@..@#$$#@+.@#$%$$$$#@@#$$$#$$#+@#$$$#$$@@@#$%$$$$@+.+@#$$$@++.@@#$$$#++.+@#$%##+..+@#$$##++", +".+@@@@@@@+++@@@@@@@+++@@@@@@@++@@@@@@@@+++@@@@@@+++@@@@@@@@@@@@@####@@+.@###@....@@#@@#@@.+@####@@@..@@###@#@.+@@@@@@@@...@@@@#+....+@##@@+..+@@@#@+++..+@##@+..", ".++.+.++....++@+@++....+.+.+....+.+.+.....++++.+....+++++++..+.+++.+.....@@@+.....+.+.+.....+++@++.....+++@+....+@@@++.+....+++.+..+..++@.+.....++.+......+.++..", -"..+.+..+..+.@@$$@@@.+.++++........++@+.....++@.+.....++@+.+......+............+.........+...+++.....+...+++......+@@.....+..........+.@@@+...+.+.....+..+.+.....", -"..+@++++.+.@$$###$++..+@@+++..+..++@@++.+.+@$@@+.+.+@@$$$@+..+.+@++@.+.+........+...+.......+@@@++......@@@@+.+.@@$$@+....+++++.+....@@$@++.+.++++.......+@@@+..", -"+@@$@$@@@++@######@+..@@$@+.....++@$@+....+@#$$@....@$###@@..++@@@@@....+.+.+.+...+.++@++..+@$$@@+.+.++@@@@@...++@#$$@+.+.+@@@@@+.++@@$$$@+.++@@@++..+.++$$#$@+.", -"+$###$##$@@$######@@.+@$$#@@++..@@$#$@@..+@$$#$@+.+@@$#%#$@+..@$$$$@@..+@@.+.@@.++.@@@$@++.+$$$$$@@+.@@@$#$@@.+@@#$#$$+++@@$$$$@++@@$$$#$$+++@##$@@++...@$###@+.", -"@$%%##$##@@$#%##%%#@++$##$#$@.@@@####$@.++$#$###@.+@$#####@.@@$$$##$@+.@@$@@$$@.++@$$###@@+$$#$$##@@+@##$$##$@+$##$$##@++$#$$$##$@@$##$###$++@#%##$+++++$##%%$@+", -"@$#%##$$$@@$###%%%$+@@######@++$######@++@$#####@+@@#$$###$.@@##$###$++@$##$##@++$####%%@@@###$$#%$@@$##$##%$@@$##$####@@$##$$#%$@@#%#####@++@$%###$@+.+$$%#%#@.", -"@#%%#$$$#@@$##%%%%#@@###$$##$@@#%#$$##$@@###@$##$@@###$$##$@@###$$##$@.@$#%#%$@+@$%###%#$@@$#$$$#%$@@$#$@$%%$@@$#$@$%%$@@##$@$#%#@@$######@+.@$##$##$@++$#%%%#$+", -"@$%%#$$$$$@$$###%%$@@#%#@@$#$@@#%#@@$$$@@#%#@@$#$@@#%#@@$$$@$#%$$@$#$@.+$$%%%$@+@#%%#$##$@@$$$@@##$@@$#$@@#%$@@$#$@$#%#@@@#$@$%%$++@$#%##@+.+@$#$$##$@.+$$###%$@", -"+$##$$$$$$@$$###%%#@@###@@$#$@$#%$@@##$@@###@@$#$@$#%$@@##@@@#%$@@$#$@++$#%##$@.@#%#$$$#$@@$$$$$#%$@+@$$@$#%$@+@#@@$#%$@@@$$@$#%$+.+$#%%$@+..@$%####$@.@$####%#@", -"+$###$$#$@@#####%##@@###$$##$@@###$$##$@@###$$##$@@$##$$##$@@###$$##$@.@$#####@@@##%###$$@@@#$$#%%@++$$#$#%#$++$$###%#$+@$#$##%#$+.+@#%%$++.+$#%%###@++@$####%#@", -"+$%%%%%#$@@#%#$#%%$@+@$#####@++@$##%##@@+@$#####@+@@$##%##@@@@$##%##@+.@$$$@$$@@+$#%#%%#@.@@$#%%##@+.@$##%%#@+.@$##%%#@+.@$#%%%#@+.+@%%%$@+.@$%%##$@+..@####%%#@", -"@$#%#%##$+@$%#$$##@+.+@##%#$@..@@$%##$@+.+@##%#$@.++@$#%#$@..@$$%##$@...@@@.@+@.@$$##%#$@..@@#%%#$@.++@#%##$++.+$#%##$@.+@$##%#$@..+$#%%#++.+$###@+...+@#%####$@", -"+@@$$$@@+.+@$@@@@@++..+@@$@@.+.++@@$@@....+@@@@++..++@@@@++...+@@$@+..+..........@@$$@@@...++@@$@@...++@$@@+....@@$$@@...++$$@@@.+.++@$@@+..+@$@@+..+..+@@@@$@++", +"..+.+..+..+.@@##@@@.+.++++........++@+.....++@.+.....++@+.+......+............+.........+...+++.....+...+++......+@@.....+..........+.@@@+...+.+.....+..+.+.....", +"..+@++++.+.@##$$$#++..+@@+++..+..++@@++.+.+@#@@+.+.+@@###@+..+.+@++@.+.+........+...+.......+@@@++......@@@@+.+.@@##@+....+++++.+....@@#@++.+.++++.......+@@@+..", +"+@@#@#@@@++@$$$$$$@+..@@#@+.....++@#@+....+@$##@....@#$$$@@..++@@@@@....+.+.+.+...+.++@++..+@##@@+.+.++@@@@@...++@$##@+.+.+@@@@@+.++@@###@+.++@@@++..+.++##$#@+.", +"+#$$$#$$#@@#$$$$$$@@.+@##$@@++..@@#$#@@..+@##$#@+.+@@#$%$#@+..@####@@..+@@.+.@@.++.@@@#@++.+#####@@+.@@@#$#@@.+@@$#$##+++@@####@++@@###$##+++@$$#@@++...@#$$$@+.", +"@#%%$$#$$@@#$%$$%%$@++#$$#$#@.@@@$$$$#@.++#$#$$$@.+@#$$$$$@.@@###$$#@+.@@#@@##@.++@##$$$@@+##$##$$@@+@$$##$$#@+#$$##$$@++#$###$$#@@#$$#$$$#++@$%$$#+++++#$$%%#@+", +"@#$%$$###@@#$$$%%%#+@@$$$$$$@++#$$$$$$@++@#$$$$$@+@@$##$$$#.@@$$#$$$#++@#$$#$$@++#$$$$%%@@@$$$##$%#@@#$$#$$%#@@#$$#$$$$@@#$$##$%#@@$%$$$$$@++@#%$$$#@+.+##%$%$@.", +"@$%%$###$@@#$$%%%%$@@$$$##$$#@@$%$##$$#@@$$$@#$$#@@$$$##$$#@@$$$##$$#@.@#$%$%#@+@#%$$$%$#@@#$###$%#@@#$#@#%%#@@#$#@#%%#@@$$#@#$%$@@#$$$$$$@+.@#$$#$$#@++#$%%%$#+", +"@#%%$#####@##$$$%%#@@$%$@@#$#@@$%$@@###@@$%$@@#$#@@$%$@@###@#$%##@#$#@.+##%%%#@+@$%%$#$$#@@###@@$$#@@#$#@@$%#@@#$#@#$%$@@@$#@#%%#++@#$%$$@+.+@#$##$$#@.+##$$$%#@", +"+#$$######@##$$$%%$@@$$$@@#$#@#$%#@@$$#@@$$$@@#$#@#$%#@@$$@@@$%#@@#$#@++#$%$$#@.@$%$###$#@@#####$%#@+@##@#$%#@+@$@@#$%#@@@##@#$%#+.+#$%%#@+..@#%$$$$#@.@#$$$$%$@", +"+#$$$##$#@@$$$$$%$$@@$$$##$$#@@$$$##$$#@@$$$##$$#@@#$$##$$#@@$$$##$$#@.@#$$$$$@@@$$%$$$##@@@$##$%%@++##$#$%$#++##$$$%$#+@#$#$$%$#+.+@$%%#++.+#$%%$$$@++@#$$$$%$@", +"+#%%%%%$#@@$%$#$%%#@+@#$$$$$@++@#$$%$$@@+@#$$$$$@+@@#$$%$$@@@@#$$%$$@+.@###@##@@+#$%$%%$@.@@#$%%$$@+.@#$$%%$@+.@#$$%%$@+.@#$%%%$@+.+@%%%#@+.@#%%$$#@+..@$$$$%%$@", +"@#$%$%$$#+@#%$##$$@+.+@$$%$#@..@@#%$$#@+.+@$$%$#@.++@#$%$#@..@##%$$#@...@@@.@+@.@##$$%$#@..@@$%%$#@.++@$%$$#++.+#$%$$#@.+@#$$%$#@..+#$%%$++.+#$$$@+...+@$%$$$$#@", +"+@@###@@+.+@#@@@@@++..+@@#@@.+.++@@#@@....+@@@@++..++@@@@++...+@@#@+..+..........@@##@@@...++@@#@@...++@#@@+....@@##@@...++##@@@.+.++@#@@+..+@#@@+..+..+@@@@#@++", "..+++++..+...+.+.+......++........++.+.+.....++.......++.........+.+...............+.+..+.....+.+.+....+.++.+.....+.+......+.++......+.+..+.+..+.+.......++.+...", "...........+...+...+.+.....+....+........+.........+...+..+...+.......+.+.+.+...+..+.......+............+.....+.+.....+....+...........+.....+....+...+.......+.", "+.++++.+.......+++.....++++..+...+++.+.....+.+..+....+@@+..+.......+..............+.@++.+....+.+@@+..+..+++........+.....+.+++.+.+.+...++++....+++.+.......+....", -"..++@+...+.+.++@@@....++@@@....++@@$@+.+..+++++....+.+@@@.....+.+...++.+.++.@.....@@@+........@@@+....++@@@+....+++++.+...++@+......+.++@+...+++@@+.+..+++++....", -"..+@$@@+.....@@$@@.+..+@$$@++..+@###$++...+@@@@++...+@@$@++..+.+.+.+.++.++..+.++..+@$$@+.+.+.+@@@@++...@$$@+++..+++@@++...+@$@++.....+@@@++..+@$$@+.....++@@++..", -".++$$$@+..+++@$$$@..+.@$##$@...+@###$@+.++@$$$@@..+.@$##@@..+@@@@@@@@.+++@@$$@@.+.@$##$@...++@$#$@..++@$##$@+.+.@$$$$@@.+.+@#@@+..+.+@$$@+...+@$#$@+.+.+$$$$+.+.", -"++@##%#@+..+@###$@+..@@####@+.++$#%%#@+..+@####@@..@@$%##@++.$$####$$@.@@#$###$@+@$##%#$$@.@@##%##@+.+$#####@++@$#####@+.+@$##@+....+$##@++..+@##$++...+@###@...", -".+$##%#$@.++$####$@.++$###%$@..@$##%##+.+@$###%$@.++$##%#$@+@$#%%%###@@@#%#$###@+@#%##%%$@@@#%#%#%$@+@#%###%#++@%%##%%#+..+$#%@+..+.+$#%$....+@#%#@+.+.+@#%#@+..", -"+@$###%#++.@$##%%$@+.@$###%$@.+@$#%#%$++.@$##%%$@+.@$##%%$@.@$$%%%###@@$%##$$#$@@$%%###%#@@$#%##%%#@+$#%##%##@@$%%###%#@+.+$#%$+....+$#%$+.+.+@$%#@.....+$%%$...", -"+@#%%##$@++@###%##@.+@#%#%#$@+.@###%##++.@#%##%$@+.@#%###$$+@$#%%%###$+@%##$$$$@@$%%###%#@@#%%#####@+$%%#####@@$%%#####@..+@#%$@....+@%%$@....@$%#$.+.+.@$%#$+..", -"+$#%###$@.+@%%###$@++$#%####@+@$%%###$@+@$#%#%##@.@$#%###$@@@##%%%%##@.@####$#$@@$#%####$@+$#%####$@@$#%%####@+$#%%###$@+.@$#%#@++.++$#%$@+..++#%#$+...+@$%#$++.", -"+$#%##%#$+@@#%##%#@++$#%####@++@#%####@+.$######@@.@%%##%$$@@#%%%%%##@+.$$%%#$$..@#####%$@+@#######++@####%#$@+@#######+++@$%##@+..+@#%%#@@+.+@#%#$$++.+$#%%$@+.", -"++$#$##$@++@$#$#$$@+.@$#$##$@++@$#$##$@++@$#$##$@++@$$#$#$@@+$###$#$$@..@@###@+@.+@$#$$$@+.+@$$##$@+.+@$####@+..@$$#$$@+.+@$###@++.+@$$#$$+.++$$##$@+..+@$##$$+.", -".++$@@$@@..++@@@@@++.++@@@@@+.++@@@@@@+..++@@@@@@...@@$@@@+..@@@@@@@+....@##$@....++@@@@+...+@@@@@....++@@@+.....@@@@@....+@@@@@+...@@@$@@+.+.@@@$@++..++@@$@++.", +"..++@+...+.+.++@@@....++@@@....++@@#@+.+..+++++....+.+@@@.....+.+...++.+.++.@.....@@@+........@@@+....++@@@+....+++++.+...++@+......+.++@+...+++@@+.+..+++++....", +"..+@#@@+.....@@#@@.+..+@##@++..+@$$$#++...+@@@@++...+@@#@++..+.+.+.+.++.++..+.++..+@##@+.+.+.+@@@@++...@##@+++..+++@@++...+@#@++.....+@@@++..+@##@+.....++@@++..", +".++###@+..+++@###@..+.@#$$#@...+@$$$#@+.++@###@@..+.@#$$@@..+@@@@@@@@.+++@@##@@.+.@#$$#@...++@#$#@..++@#$$#@+.+.@####@@.+.+@$@@+..+.+@##@+...+@#$#@+.+.+####+.+.", +"++@$$%$@+..+@$$$#@+..@@$$$$@+.++#$%%$@+..+@$$$$@@..@@#%$$@++.##$$$$##@.@@$#$$$#@+@#$$%$##@.@@$$%$$@+.+#$$$$$@++@#$$$$$@+.+@#$$@+....+#$$@++..+@$$#++...+@$$$@...", +".+#$$%$#@.++#$$$$#@.++#$$$%#@..@#$$%$$+.+@#$$$%#@.++#$$%$#@+@#$%%%$$$@@@$%$#$$$@+@$%$$%%#@@@$%$%$%#@+@$%$$$%$++@%%$$%%$+..+#$%@+..+.+#$%#....+@$%$@+.+.+@$%$@+..", +"+@#$$$%$++.@#$$%%#@+.@#$$$%#@.+@#$%$%#++.@#$$%%#@+.@#$$%%#@.@##%%%$$$@@#%$$##$#@@#%%$$$%$@@#$%$$%%$@+#$%$$%$$@@#%%$$$%$@+.+#$%#+....+#$%#+.+.+@#%$@.....+#%%#...", +"+@$%%$$#@++@$$$%$$@.+@$%$%$#@+.@$$$%$$++.@$%$$%#@+.@$%$$$##+@#$%%%$$$#+@%$$####@@#%%$$$%$@@$%%$$$$$@+#%%$$$$$@@#%%$$$$$@..+@$%#@....+@%%#@....@#%$#.+.+.@#%$#+..", +"+#$%$$$#@.+@%%$$$#@++#$%$$$$@+@#%%$$$#@+@#$%$%$$@.@#$%$$$#@@@$$%%%%$$@.@$$$$#$#@@#$%$$$$#@+#$%$$$$#@@#$%%$$$$@+#$%%$$$#@+.@#$%$@++.++#$%#@+..++$%$#+...+@#%$#++.", +"+#$%$$%$#+@@$%$$%$@++#$%$$$$@++@$%$$$$@+.#$$$$$$@@.@%%$$%##@@$%%%%%$$@+.##%%$##..@$$$$$%#@+@$$$$$$$++@$$$$%$#@+@$$$$$$$+++@#%$$@+..+@$%%$@@+.+@$%$##++.+#$%%#@+.", +"++#$#$$#@++@#$#$##@+.@#$#$$#@++@#$#$$#@++@#$#$$#@++@##$#$#@@+#$$$#$##@..@@$$$@+@.+@#$###@+.+@##$$#@+.+@#$$$$@+..@##$##@+.+@#$$$@++.+@##$##+.++##$$#@+..+@#$$##+.", +".++#@@#@@..++@@@@@++.++@@@@@+.++@@@@@@+..++@@@@@@...@@#@@@+..@@@@@@@+....@$$#@....++@@@@+...+@@@@@....++@@@+.....@@@@@....+@@@@@+...@@@#@@+.+.@@@#@++..++@@#@++.", "...++++.+....+++++......++++....+.+++.+...+.++++...+...+..+...+.+....+.+.+@@@+......+.++......+.+..+......+.+..+..+++..+....++++.....++++....+.+++.+.....++.+...", ".+.+.++..............+..............+................+.+..........+............+.........+....+......+.+..+.........+............+......+..+.+++.+...+..........", -"+@$$$@@@+.+.+++@+++...++@+..+.+.+.+++++.+.++@@@@.+....@@@@@.+.+....+...+.+........+.+.......++++.+......++++.+.+.+@++...+.+........+.+.++++.+$$$+...........+...", -"+@#%#%#$@..++@@$@+....+@@@+......++@@@.....@##@@...++@@$$@+...++++.@......@+.+.+.....+.+.+..+@@@.+....+++@@+....+@@@@+....++++++.....++@@@+++###@+++..++.+++.++.", -"+$#%%##$@+.+@$##$@++..@@$@++.....+@$$@+..+@@###@++..@@#$#$@+...@@@@@++...+@@@.......++@@+..+@@$@@+++.++@@$@@+..+@$$#@+++.+@@@@@+++..+@@$$@+++@#$$@+++...@@@@@+++", -"+$$##%##@+.@#####@..+.@$#$$@+.+.+@##$@+..+@$##$@+..+@$###$@.++@$$$$@+..+.@$$$+.+.+@@@$@@@@+@@$$$@@+.++@$$#$@@+++@#$#$@@.+@@$$$$$++++@@$$$$@++@$##$$@+.++$$$$$$@+", -"+@##%%%#@@@$##%##$@+.@@####@@+.+@####$@+.@@###%$@+.+@####$@+.+$$###$@@..@$##@@+..+@$####$@+$##$$#$@++$##$$#$@+@@##$$$#@+@$##$@#$@+@$$#$$###++@$%####@++$##$$###@", -".@#%%%%&#@@$%%####@.+@####%#@@+@######$++@####%#$@+@##%#%#$++@####%#$@+@$$###$@.+@###%%##@@$##$@$#@@+$##$$$#@@@$##$$$$$@+$###@$#@@+$###$###++@$%###%$++$%##$###@", -"+$##%#%%#@@$######@++$#%#####@+$#######@+@%%###%#@@$%#####$@+$%%#$#%#@+@#%%%#$$++$%%##%%#@+@##$$$#@++@##$$$$@@@$##$$$#@@@$##$$$$@@+@######$@.@######$++@######$@", -"+$%%#$#%#@@@###$$#@@+$%##$#%#@+$%#$$#%#@@#%##$#%#@@$%#$$#%#@@$%%#$#%#@.@$####$@.@$%%##%%#@@@$#$@$#@@+@$#$$$#$@+@$#$@$#@@+@##$$$#$+++$####$@+++#####%$+.+$####$@+", -"+$%%###%#@@$###$##$+@$%%#####@+$#%###%#@+@%##$#%#@+$%%#$#%#@@$#%###%#@+.@$##$@+.+$%%%##%#@+@$#####$++@$#$##$$++@$###$#$++@$$###$$+.+@$%%#@+.+@$%###$++.+@$%%#$..", -".@#%#%%#$@+$#######@+@#%%#%#$++@#%#%###@+@#%%%%#$@.@#%%%%#$@.$#%%#%#$@...@$$@...+@%%%%%#$@.@@###%##@.+@##%%#$@++@##%%##+.+$###%%$@+.@#%%$+..+@###$@@....$$%%$@..", -"++$#%%##@+@$%####%$@.@@#%%##@+.@$#%%##@+.@$###%$@+++$##%#$@+.@@#%%%$@@...@@@@+..+@##%%##@.++@#%%%#$@++@#%#%%$+.+@$#%%#$@+.@##%%##+++$#%%$++.+$$%$$++..++$#%%$+..", -".++@@$@@+.++$$@@@$@+.++@@$@@+...+@@$@@+...@@$$@@+...@@$$@@....@@@$@@+.....++....+@$$$$@@@...++@$$$@+..+@@$$$@+..+@@$$$@+..+@@$$$@+++$###@...+@$$$+..+..+$###@+..", -"....+.+.....+.+.++......+++..+.+..+.+..+...++.+......++++++.....+.+....+...+.....++@+++.......+.++.+....++.+......++.+......++.+...+@$$@+.+..+@@+.+....+@$$@+...", +"+@###@@@+.+.+++@+++...++@+..+.+.+.+++++.+.++@@@@.+....@@@@@.+.+....+...+.+........+.+.......++++.+......++++.+.+.+@++...+.+........+.+.++++.+###+...........+...", +"+@$%$%$#@..++@@#@+....+@@@+......++@@@.....@$$@@...++@@##@+...++++.@......@+.+.+.....+.+.+..+@@@.+....+++@@+....+@@@@+....++++++.....++@@@+++$$$@+++..++.+++.++.", +"+#$%%$$#@+.+@#$$#@++..@@#@++.....+@##@+..+@@$$$@++..@@$#$#@+...@@@@@++...+@@@.......++@@+..+@@#@@+++.++@@#@@+..+@##$@+++.+@@@@@+++..+@@##@+++@$##@+++...@@@@@+++", +"+##$$%$$@+.@$$$$$@..+.@#$##@+.+.+@$$#@+..+@#$$#@+..+@#$$$#@.++@####@+..+.@###+.+.+@@@#@@@@+@@###@@+.++@##$#@@+++@$#$#@@.+@@#####++++@@####@++@#$$##@+.++######@+", +"+@$$%%%$@@@#$$%$$#@+.@@$$$$@@+.+@$$$$#@+.@@$$$%#@+.+@$$$$#@+.+##$$$#@@..@#$$@@+..+@#$$$$#@+#$$##$#@++#$$##$#@+@@$$###$@+@#$$#@$#@+@##$##$$$++@#%$$$$@++#$$##$$$@", +".@$%%%%&$@@#%%$$$$@.+@$$$$%$@@+@$$$$$$#++@$$$$%$#@+@$$%$%$#++@$$$$%$#@+@##$$$#@.+@$$$%%$$@@#$$#@#$@@+#$$###$@@@#$$#####@+#$$$@#$@@+#$$$#$$$++@#%$$$%#++#%$$#$$$@", +"+#$$%$%%$@@#$$$$$$@++#$%$$$$$@+#$$$$$$$@+@%%$$$%$@@#%$$$$$#@+#%%$#$%$@+@$%%%$##++#%%$$%%$@+@$$###$@++@$$####@@@#$$###$@@@#$$####@@+@$$$$$$#@.@$$$$$$#++@$$$$$$#@", +"+#%%$#$%$@@@$$$##$@@+#%$$#$%$@+#%$##$%$@@$%$$#$%$@@#%$##$%$@@#%%$#$%$@.@#$$$$#@.@#%%$$%%$@@@#$#@#$@@+@#$###$#@+@#$#@#$@@+@$$###$#+++#$$$$#@+++$$$$$%#+.+#$$$$#@+", +"+#%%$$$%$@@#$$$#$$#+@#%%$$$$$@+#$%$$$%$@+@%$$#$%$@+#%%$#$%$@@#$%$$$%$@+.@#$$#@+.+#%%%$$%$@+@#$$$$$#++@#$#$$##++@#$$$#$#++@##$$$##+.+@#%%$@+.+@#%$$$#++.+@#%%$#..", +".@$%$%%$#@+#$$$$$$$@+@$%%$%$#++@$%$%$$$@+@$%%%%$#@.@$%%%%$#@.#$%%$%$#@...@##@...+@%%%%%$#@.@@$$$%$$@.+@$$%%$#@++@$$%%$$+.+#$$$%%#@+.@$%%#+..+@$$$#@@....##%%#@..", +"++#$%%$$@+@#%$$$$%#@.@@$%%$$@+.@#$%%$$@+.@#$$$%#@+++#$$%$#@+.@@$%%%#@@...@@@@+..+@$$%%$$@.++@$%%%$#@++@$%$%%#+.+@#$%%$#@+.@$$%%$$+++#$%%#++.+##%##++..++#$%%#+..", +".++@@#@@+.++##@@@#@+.++@@#@@+...+@@#@@+...@@##@@+...@@##@@....@@@#@@+.....++....+@####@@@...++@###@+..+@@###@+..+@@###@+..+@@###@+++#$$$@...+@###+..+..+#$$$@+..", +"....+.+.....+.+.++......+++..+.+..+.+..+...++.+......++++++.....+.+....+...+.....++@+++.......+.++.+....++.+......++.+......++.+...+@##@+.+..+@@+.+....+@##@+...", ".+......+..+..........+.........................+.++@@+@+++.......+.+...+.+.+.......+...+.+.........................................+++.+..+++@+..+.+.....+.+...", -"...+.+....+@@++....+......+....++++++++..+..+......+$$$$$#@@+.+..+.@...+.@@@@@@.+..++@+.....+.+.++.+..+.++..+.+.+..+.+.+.+.+.+.+.+....++.+..+$$$@++.+...+....+..", -"...++++...@@#@++.....+++++.+.++@@$$$$$@+..@+++....@@#%$##%#@....+@$@+..+@@$$$$@..+.@@$@++.....++@$@+..+++@+.....++++++...++@@@+++.+++@@@@@++@#%$$$$@++..++++.@+.", -"+..@$@@+.+@###@+.++++.@$$@@++.@$%#%%##@@..+@@@.+..+$#%%#%%#@++@@@$#$@+..@$$$#$@+++@$#%#@+++...+@##$+++@@#$@++.+@$$$$$#@++@$###$$@@.+$$$$#$@+@#%#$###$+++@$@@$$@+", -"..+@##@+..@#%#@@++@++@$#%#$@@+@@$##%#$@+.+@@$@...+@$#%%%%%%$@@@$$#%$@.@@$$##%#@@+@##%%#$@+....@@#%#@+@$####@@++$#%%%%%#@+$#%%%%%#$+@$#%#%%$@@$#%###%$+.+@#$$##$@", -"...@###@+.+@##$@@$$@@###%###@@@$$###$@@+..@$$@+...@#%%#%%%#$@$####%#@@@$$#%%#%$@@#%%%%%#$@.+.+@####@@###%%##@@@#%%##%%#@@@##%%%%$@+$#%#%%%#$@$#%#$#%$@+.$####%$@", -".+.@$##@..+@###$###$####$###$@@@$###$@@+.+@$$@+..+@$#%#%%%#@@$$%%###$@@$$%%#%#$@@#%%%%##$@+..+@###$@@$##%%##$+@#%#$$#%#@++@$###$+++@$###%%$@$#%%#$$#$+.++#%###@+", -"++@@$##@@..+$###$#$@##$$@#$##@@$@$%##@@@..@##@+...@$#%#%%#$@.+@####$@@@@$###%##@@#%%&%##$@+...@####@@####%#$@++$%#$@#%%@..+@$$$@...+$####%$@@##%#$$$$++.@$%%#$@.", -"+$$$$##$@..++$##$@@@$##$$##$#@++@@#$@@+..+@##$+...+@#%#%##$@..+$##$$@+.@@$###%$@@$#%%%##@@.+++@$###@@$#%###@+.@$%#$@#%#@+..+@$$@++.@$#####$++$$#$$$$$@+.$#%%#$+.", -"$#%#$###@+..+$###@++@##$@$##$@+.+@$$@@.+..@$%$@+..+@$####$@++.+@##$@@.+.@$$$##$@@@##%%#$@++.@@$##%#$@$#%#$#@+++$%%#$#%#@+..++@$@.+.+@$##%#$.++$$#$#$$@@$$#%%#$++", -"$#%%###%#@+..+$#$$@@@$##$####+..+@$$@@....@$$$@+...@$##$$@+....@$$$@@..+@@$$$#$@++@$%%#@+++@$#####$@@@$##$$$@++$##$$#%#@....+@$$@+.+@$##%#$...@@$##$$+@#######@+", -"####$$###@+.+.+@$#$@+@@$$#$$@++..@$#@@+..+.@$#@@+..+$##$@++.....@@@@@+..+$@@@$$++.+@##$+..+@$$#$$$@++@$$$$@@@++@#$$@$$@@.+...+@$@+..@$$###@+...+$$$$+++$#$$@$$$@", -"$@@@@@@$$@....++@$$+.++@@@@@+....+@@@.......@$@@...++$$$+...+....+@+....++++++++...+@$@+..++@@@@+@++..+++@+@@+.+@+@+@@@+......+@+++.++@$$$@.+..+++++..+++++.+@@@", +"...+.+....+@@++....+......+....++++++++..+..+......+#####$@@+.+..+.@...+.@@@@@@.+..++@+.....+.+.++.+..+.++..+.+.+..+.+.+.+.+.+.+.+....++.+..+###@++.+...+....+..", +"...++++...@@$@++.....+++++.+.++@@#####@+..@+++....@@$%#$$%$@....+@#@+..+@@####@..+.@@#@++.....++@#@+..+++@+.....++++++...++@@@+++.+++@@@@@++@$%####@++..++++.@+.", +"+..@#@@+.+@$$$@+.++++.@##@@++.@#%$%%$$@@..+@@@.+..+#$%%$%%$@++@@@#$#@+..@###$#@+++@#$%$@+++...+@$$#+++@@$#@++.+@#####$@++@#$$$##@@.+####$#@+@$%$#$$$#+++@#@@##@+", +"..+@$$@+..@$%$@@++@++@#$%$#@@+@@#$$%$#@+.+@@#@...+@#$%%%%%%#@@@##$%#@.@@##$$%$@@+@$$%%$#@+....@@$%$@+@#$$$$@@++#$%%%%%$@+#$%%%%%$#+@#$%$%%#@@#$%$$$%#+.+@$##$$#@", +"...@$$$@+.+@$$#@@##@@$$$%$$$@@@##$$$#@@+..@##@+...@$%%$%%%$#@#$$$$%$@@@##$%%$%#@@$%%%%%$#@.+.+@$$$$@@$$$%%$$@@@$%%$$%%$@@@$$%%%%#@+#$%$%%%$#@#$%$#$%#@+.#$$$$%#@", +".+.@#$$@..+@$$$#$$$#$$$$#$$$#@@@#$$$#@@+.+@##@+..+@#$%$%%%$@@##%%$$$#@@##%%$%$#@@$%%%%$$#@+..+@$$$#@@#$$%%$$#+@$%$##$%$@++@#$$$#+++@#$$$%%#@#$%%$##$#+.++$%$$$@+", +"++@@#$$@@..+#$$$#$#@$$##@$#$$@@#@#%$$@@@..@$$@+...@#$%$%%$#@.+@$$$$#@@@@#$$$%$$@@$%%&%$$#@+...@$$$$@@$$$$%$#@++#%$#@$%%@..+@###@...+#$$$$%#@@$$%$####++.@#%%$#@.", +"+####$$#@..++#$$#@@@#$$##$$#$@++@@$#@@+..+@$$#+...+@$%$%$$#@..+#$$##@+.@@#$$$%#@@#$%%%$$@@.+++@#$$$@@#$%$$$@+.@#%$#@$%$@+..+@##@++.@#$$$$$#++##$#####@+.#$%%$#+.", +"#$%$#$$$@+..+#$$$@++@$$#@#$$#@+.+@##@@.+..@#%#@+..+@#$$$$#@++.+@$$#@@.+.@###$$#@@@$$%%$#@++.@@#$$%$#@#$%$#$@+++#%%$#$%$@+..++@#@.+.+@#$$%$#.++##$#$##@@##$%%$#++", +"#$%%$$$%$@+..+#$##@@@#$$#$$$$+..+@##@@....@###@+...@#$$##@+....@###@@..+@@###$#@++@#%%$@+++@#$$$$$#@@@#$$###@++#$$##$%$@....+@##@+.+@#$$%$#...@@#$$##+@$$$$$$$@+", +"$$$$##$$$@+.+.+@#$#@+@@##$##@++..@#$@@+..+.@#$@@+..+#$$#@++.....@@@@@+..+#@@@##++.+@$$#+..+@##$###@++@####@@@++@$##@##@@.+...+@#@+..@##$$$@+...+####+++#$##@###@", +"#@@@@@@##@....++@##+.++@@@@@+....+@@@.......@#@@...++###+...+....+@+....++++++++...+@#@+..++@@@@+@++..+++@+@@+.+@+@+@@@+......+@+++.++@###@.+..+++++..+++++.+@@@", "+++.++++++......++++...+++......+..@.++......@@.+....+.+.+....+.....+..............+@@+.....++.+................+....+.....+.+..+.....++@++.......+.+......+..+."}; diff --git a/hacks/images/matrix1.xbm b/hacks/images/matrix1.xbm index b0d1974d..3f05d0f8 100644 --- a/hacks/images/matrix1.xbm +++ b/hacks/images/matrix1.xbm @@ -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, diff --git a/hacks/images/matrix1.xpm b/hacks/images/matrix1.xpm index 703cd03d..1488a1a1 100644 --- a/hacks/images/matrix1.xpm +++ b/hacks/images/matrix1.xpm @@ -1,395 +1,392 @@ /* 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", +"..........................+.++++++............+.+.+.+.+..........++++@@@@@++++........++@@@@@++..........+.++++.....................................+.++..............+++@@@@@+++........++@@@@@++.............++++++..................................................................................................++@@@+++.", +"..........................++++@@++++.........++++++++++.+........++@@#@###@@++.......++@@###@@+++........++++++++..................................++++++++...........++@##$##@++.....+.++@#####@+++...........+++@++++..............................................................................................++@@@#@@++.", +"........................+.+@@###@@++......++++@@@@@@@@@+++.....+.@@#$%%%%%$##++....+.+@##&&%##@+++.....+++@@@@@+++..............+.+................++@@@@+++..........+@##**%$$@++......+@$$%**##@++.........+++@@#@@+++..............................................................................................+@#%&%#@+.", +".........................+@###$$#@@++......++@@#@#@#@#@@+++.....++#$%%%&&&$$#@+....++@##$&==$$#@+++...+++@#####@@+...........+.+++++++.+........+.+@@####@++........++@@#$**%%$@++.....++@$%&**$#@@+........+.@@##$##@@+............++++.+..........................................................................++@#$&&&$@@.", +".......................++@@$%**-%$@@+....+++@#$&&$$$&&$#@++....++@#&&=;=;;&%$@+..+.+@@$&=***&%$##++...++@#%&=&&#@@+..........+++@@@@@@++........+.+@#&&&$$@++.......++@#$%**%%$@+......++@$%%**%$#@++.....+.++@#$***$#@+++........++++@@++..........................................................................++@$$***$#@.", +"........................+@#%&-**%%#@++....+@#$%&=%%%=&%$#@+....+@@#&=;=;;;&%%#@...+@##$==*--=&%$#@+.+++@##&===&$@@++........++@@#####@@++........+@#$&==%$@++......++@#%&&;=%#@@++......++@$$;;&&%#@++....++@@#$$***%##@@++.......++@#@@@+++........................................................................+@#$%***$#@.", +"........................+@#%%*-*&%#@++..+++@$$%==%%%==%$#@@..+.+@#$===;;;;=%%#@.++@@#$%==-**==%$#@+..+@@#$===;=$#@++......+++@##$$$$$#@@++.....+++@#$===%$#@++......@@#%&=;=$#@+.+......+@@#$=;&&%#@++....+@@##$%***%$$#@@+......++@##$##@++........................................................................+@#$%***$#@.", +"........................@@#&=---=&#@++...+@@%%&*-=&&--&%%@+...+@@#$==;=;;;&&%#@..+@#&==;;;;;-*&%$@@.++@$%%====&&%#@++....+.+@#$==-*-=&#@+.......+@#%&*-*%%@++.......@@$=====$#@++........+@#$&=;==$@@++.+++@%%&%&*-*&%&%$@+....+.+@@$***$@@+.......................................................................+@@#&===&$@+.", +".......................++@$==*-*==$@++...+@@%%&-*&&&*-&%$@@..++@#$$==;=;;;=&%$@.+@#$&=;;;;;;-*&%$@@.++@$%&=====&%#@++....++@@#$=;--*;=#@@+......+@#%%*-*&%@@+.....++@#$==;=&$@@+.........+@@$&==;=$#@....+@@%%&&&***&%&&%#@......+@#$***$#@++......................................................................+@#$==;==##+.", +"........................@##&&-*-=&##++...+@#%&&**&&&-*%%$@+..+@@%%=;;*****;;=$#.+@@$;;;&=%%%==%%$@+.+@@$%&======&$@@++....+@$%&;;%%%=&$@++.....+@@#=;==&$#@++.......@#$=;==&#@+...........@@#&====$#@++.++@#%&=**---**&&%#@.....+@@#%***$$@++...........................+.+.++.++.+.+.............................++@#$**%%$#@+.", +".......................++@$&=-*-&&$@@....++@%%&**&&&*-%$$@+..+@#%&=;;*-***;;;$#.+@#$;;;=&&%&&=%%$@+.++@$%&=======$#@++...++@$%&;;&%%&&#@@+......@@$==&&%$@@+......++@#$***%$#@++..........+@#$%***$#@++..+@@%&&****-**=&%@@...+++@#$%*-*%$#@+++........................+++++++++++++++............................+@#$$**&%$@@+.", +"........................@@#&&--*=&$@++..++@@%%&**&%&**%$#@+..+@#%&=;;**-**;;=$#.+@@$;;;&=%&%=&%$$@@.+@@$%%=======$#@@++..++#$%&;;%%%&%#@+++....++@#&=&%%#@+.+......+@#%***%$@@+..........+.@#$$-**%#@+...+@@%%=***-***&&%@@..+++@@#$%***%$##@@+......................+++@@#@@#@#@#@@@++.........................+++@#$%**%$#@+..", +".......................++@$&=*--=&##++...+@@$%%&%%%%&&$#@++..+@#%&=--;;;-*;;=$#.+@@$==;**;=;&&%$#@+..+@@$$===;==&&%$@++..++@$%&**%%%$$#@@++....++@#$%###@@+.......++@#%***$$@++............+@$$***$$@++..++@#$%&&-*-&&%$#@+..+@@#$$%%*-*%%$##@@......................+@@###$$#$#$#$##@@.........................++@#%&&;=$$@@+..", +"........................@@#&=*-*=&#@+.....+@$$$%%#$$&%#@@+..+.@#%&=**;;;*-=;=$@.++@#&==**=;=&&%$##@..++@#$===;===&%$@++.+.@@$%%**%%%$$$#@@+.....++@$$#@@++.........@@#$*-*%$@@............++##%*-*%#@+....@@#$%&&*-*&&%$#@+.+@@#$$%%%*-*%%%%$#@.....................+@@#$$$%$%$%$%$$$#@.........................++##&&&;=$#@+...", +"........................+@#$%***%$#@++....++@@@#@#@@#@@@++..++@#$%%**&=&**%%$#@.++@#$$%==;;;**==%#@..+@@#$==;;;==%$#@++.+++@$%%-*;;;%%%%%@@......+++@@+++..........+##%***$#@@............++@$$***%##++...+@#$%*-&&&**%%$@+.+@#$--*---*--*-*-$#.....................+@#$--*-*--*-*--*$#.........................+@#$;;;&&#@@++..", +"........................+@##%*-*%$#@+......++@@@@@@@@@++.....+@#$%&**&&&-*%%$#@..+@@#$%&&;;;**==&#@.+.@@#$=;;*;==%$#@++..+@#$%&--;;;&%&&%@@.....+.+++++..+........++##$***%##++...........+@@#%***%#@+...++@#$%**&&&-*%$$@+.+@$$*--*-*--*---*%#.........++++++......+@$$*--*--*---*--%#..........+.+.+.........+@#$&;;;$$@+++...", +".........................+@$$***$#@++........+..+.+.+++..+..+@@#$%%*-&&&**%%$#@..+@@#$%&&;;;**===$#.+.@@#$==;;;;=%$$#@...+@#$%&**;*;&&=&%#@...........+...........++@$$*-*%##@+...........+@#$%***%#@@....+@#$%**&&%**%%#@+.+@#$-*---*-*-**--$#.......+++@@@@+++....+@#$-*--*--**--*-$#.........++++++.......+.@@#%&;;;$#@+.....", +"........................+@@#$***%#@+...........+.+.+........+@#$*---*-*---;;=#@.++@#%&=%&%&%==;;;$#..+@$%&&&*;;;;==&#@+.++@#&&=;;***-*===#@........+..............++@#$***%$@@++.........+.@##%-**$#@++..++@#$$&&$$%&&$$#@+.+@@#$%$%%**-%%%$$#@.......++@@#@@@+++....@@#$$$$%$$%%$%$$#@.......++++@@@+++......+@#$=;=&&$#@++....", +".........................+@#$***$#@++.......................+@#%-*-*--*-*-;;=#@.++@#&&&&&%&%&=;;;##.+++$$%&&;;;;;==&##+.+@#$&====***--;==##.......................++@#$=;;&&#@++.........++@#&&;;=%#@++...++#$$%%###%%##@++..+@@##$%%-**%%$$##@.....+++@#%&&$#@+.....+@@##$#$$#$#####@@.......++@@#@@@++......+@#$=;&&&#@++.....", +".........................++##$%$#@@+........................+@##&&=;;;;;==%$##@.+@#$=;;**=;;**;==$@..++@#$$%;;;&&==&$@+.++#$;;;=====**&%%#@........................+@#$==;=&##++..........@@#&&;;=$#@+.....+@@@@@##@#@@@@+...++@@##$%*-*%$##@++......+@##&&&%$@@.+...++@@@@@@#@@###@@@+......++@$$&&%#@++...++@@#$=;&&%#@+......", +".........................++@#$$$#@@..........................+@#&&&;;;=;==%$#@+.+@##;;;*-=;;**==&#@..+++@##$==;%&===##+.+@#$;;;=&&&=*-&%%$@.......................+++#$&=&==$#@++.......++@#$=;&=%$@++......++@@@+++@@+++......++@#$$***%$#@++......+@@#$===%$@@+......++@+@+@+@+++++.+......+@@$%&&&#@@+...++@$$&**$$#@+++.....", +"..........................@@#$$$#@++........................+@@#%&&*;=;;==$#@++..+@#&&===*-*==%$#@@....+@@$$=;=%&==&$@+.+@@$;;;&=&=&-*&&%$@.........................+@#%&=;;$#@++.....+.++@#$=;=&%#@++.....+.+.++++.+++.........+@@$$-**$#@++.......+@#%%***&%@@+.........+.+.+...++.........+@#$%==&$#++...+@#$%%**$$@@+.......", +".........................++##***##++.........................+@#%&&;;;;;&&$#@++.++@#%%&&=*--=&$##@+.....+@##;;;;;==&##+.+@@$&;=-*--*;;*-*$#........................++@#%&&;=%$#+++......+@#$%=;&&%#@++............+...+..+.......+@#$***$#@++......++@#%&--*%%@+++...........................+@#&&**-##@++..+@@&&===$#@++.......", +"..........................+@#***#@++........................++@#$&&;;;;;&&$@@+....+@@@@#$***%#@++.+.....++@#==;====&#@+..+@#&==--*--;=*--$#..........................+@#$%**%%$@+......++@#%&**%$#@+.............................+@@$***$#@+.......++@#===&&$#@++..........................+..@@%&-**$@++...+@#&====$#@+........", +".........................++@##$#@@++.........................+@#$&&;;;=;=&#@++..+++.+@@#$===$#@++.......++@##$$$$###@++.++@@#$$$$%$$$%$$##@.........................++@@#$**%%$@++.....++@$%%**$$@@++............................++@##$##@++.+.....++##===&&##@+.............................++@#$$$##@++...+@#&===&#@++........", +"..........................++@@@@@++.........................+.@@$%&;;;==&&#@+......+.+@##=&&$#@+.........++@@#@###@@+++...+@@@#####$#####@@...........................+@#$**%$$@+.......+@$$%**$#@++..............................+@@@#@@++........++@#==&%%#@++..............................+@@@###@@+....@@#%&&%$#@+.........", +"...........................++@@@++............................+@$$%=;===&%#@++........+@#&&%#@+++.........+++@@@+@+@+......+@@@@#@@@#@@@@++..........................+++@##$##@+++......++@#####@++................................++@@+@+..........@@#$%$##@++................................++@@@+++.....+@#$%%$#@@++........", +"............................+.+.+............................++@@###$$$###@++........+++@##@@@..............++.++++..........+++++@++@++++.............................+@@@@@@+++........++@@#@@++..................................+.++..+.........+@@$$#@@+++..............................+..+.++++......++#$$%##@+..........", +"..............................+................................++@@#@##@@@@+...........++@@@+++..............+................+++.+..+..................................++@@+++.........++++++++++..................................................++@##@@++...............................................++@@@#@@++..........", +".....++++++++++...........+++++++............++++++@++++........+.++++@++++++...........+++++++++.......+++++@@++++++..........+++++++++++....+++++@+@+@+@+++.........++++++++++.........+++++++++.+............................................................................................................+.+.+.+.........", +"...+.++@@#@@@@++++.....++++@@@@@++++.......+++@@@@#@@@@+++......++@@@@@#@@+++..........+.+@@@@@+++....+++@@@#@#@#@@@+++.........+@@@@#@@+++.+++@@@@#@#@#@@@@+++.....+++@@@@@@@++++......+.+@@@@@@@++++...........................................................................................................+++++++++.+....", +"...+++@@##$##@@@++....++@@@#####@@.+.......++@@##$$###@@+++..++++@@#$$$###@@@++........++@@###@@++..+.+@@##$$#$#$##@@+......+++@@@###$##@@+.++@##$#$$$#$$###@++...+++@@##$$###@@+++.....++@@##$##@@@++........................................................................................................++++@@@@@@@@++....", +"..++@@#$%=&=%$#@@++..++@@#$%%&&&#@++.....++@@##&%===&%##@@+....@@##%&&==&&##@@+......++@@#%%%%%#@++..+@#$$&&=&==&&%%@@+.....++@@#$$==&&%$@+.+@@%%&==&=&==&%%#@+..+++@##$%&&=%$##@++...++@@#$&&&&%$#@@++......................................................+..............................+.+..............+.+@@###$###@@+++..", +"..+@@#$%%===%%$#@@+..+@##$$&&==&$#+++....++@#$$&=====&$$#@+.+++@#$$&&===&&$$#@@.......+@#$%%&&%$@@+.++@#$%=======&&%#@+.....+@##$%%====&$#@.+@#&&&=======&&%#@+..++@#$$%&===%%$$#@@....+@#$$===&&%$##@+...................................................+.+++++.+......................++.+++++............++@@#$$%$%$$##@++..", +"++@@$%&**;;;**%%$@+.+@@#=;;*-***$#@+....++@#%&=**;;;**=&&#@..+@#&&=**;;;**=&%#@......+@#$%-*-**$#@+.++@$%&**;;;;;=&&#@+...++@@$%*****;;=$#@.@@$=;;;;;;;;;;;;$#@.++@#%&=**;;;**=&%#@..++@#$**=;;;;;;;#@+..........+.....................+.................++++@+@+++.....................+.++@+@+++.+.........++#$%*******%$#@++.", +".+@#%%&**;;;**&&%#@..+@$=;;-*--*%#@++...++@#=&=**;;;**==&#@..+@#&==*-;;;-*==&#@......+@#%%--***$#@+.+@#%%&*-;;;;;==%#@+...++@#%%--***;==$#@.@@$=;;;;;;;;;;;;##@.++@$&==**;;;**==&#@..++@#$**;;;;;;;;$#@........+.++++.+..............+.++++..........+.+++@@@###@@+....++++++++++++++...++@@###@@@+++........+@#$%*--*-**%%$@@+.", +"+@@#%&&**;;;**&&%#@.+@@#==;--*-*$$@+....+@@$&==-*;;;*-===$@.++@#&==**;;;**===$#...+.+@@#%&*--**%#@+.+@@%&&**;;;;;=&&#@+...+@#$%&*--**;;=$#+.+@#=;;;;;;;;*;;;$@@.+@@$&==**;;;**==&$#.++@#$%**;;;;;;;;$#@......+++@@+@++............+.++@@+@+++.......+.++@@##$$#$#@@....+++@+@+@@+@++++..+@###$$$##@@++++....+@@#%%**-*-**%%%#@+.", +"+@#$;;;=&%%%=&;;;$#..+@##$%%%***$$@@+....@@#;;;&&%%%&=;;;$#.++@#%==%%%%%==;;;##.....+@#$=;===**$#@@.+@#%&&;;&%%%&%%##@+.+.+@#$**===%%%$##@+.+@##$$$$%%%==;==$#+.+@#$;;;=&%%&==;;;$@.++@$%&;;%%%%&***%$@......++@@##@@@++..........+.+@@##@@+++......++@@##$%&***%$@..+++@@@#@#@#@#@@@@+.+@#***==$$##@@++.+...@@$%&;;%%%;;;;=$@@.", +".@#$;;;&&%$%&=;;;$#..++@##$$%*-*%#@+.....@@#==;%%$$%&=;;;$#..+@@%%&%%$%%&=;;;$#...+++@#$=;;=;**%#@+.+@#$&=;;%&%&%%$$#@+..+@#$%**===%%%$$@@+.++@@####$$%==;==#@@.+@@$;;;==%%%&=;;;$#.+@@%%&;;%%%%%***%$#.....++@##$$##@++...........@@###$$#@++..+.++@@@#$$%&&***%%@.+.@@#$#$$$$$$$$##@+.+@#***;=%%$$#@@++...++#$%&;;%%%=;;;;$#@.", +"+@#$;;;&&$$$%&;;;$#...++@@#$%***%##++....+@@#$#$$$$%==;;;$#..++@###$$$%%**;==$#....+@#$%**&&&**%#@+.++#%%&*-*-***=&%#@+.++@$%&**=====%$$@@+.+.++@@@##$%;;&&%#@@.+@#$=;===%%%==;==$#.+@@%%&;;%%$%%***%$@.....+@@%%***##+++........++@@%&***##@+..+.+@@#%%=;;;;&%%$@@.++@#&&=&&===&&=&&#@.+@@#$$==***&%##@@++.++@$$%&=%%%&&;;;$#@.", +"+@#$;;;&%$$$%&;;;$#.....+@#$$-**%#@@....+++@@@####$$=;;;;$#...++@@##$$%%**;==$@...+@@#%%**&&&**$$@@.+@#$&=**-*--*=&&#@+..@#$%&**===;=%%$#@+..++++++@#$$;;&&%#@+.++##==;=;%&%;=;==$@.+@@%&=;;%%$%%***%$#.....+@#%&***$#@+..........+@#%&***$@@++.++@@##%&;;;;;&%%#@+.+@@#&============#@..@@#$%==--*=&$$#@@+.++@#$%%&%$%&=;;;$#@.", +"+@#%;;;=%##$%&;;;$#....+++@$%***$$@++....+++@@@@#$$%==;;=#@..++++@@#$%%%**;==##...+@#$%%**&&&**%##+.++@$%&***-***==&$#@.++#%%&**=====&%%##+.....+++@@$%;;&%$@@..++@$==;==&%%==;==##.+@#$%&;;%%%%%***%$#.....+@#%&***$#@+..........+@#%&***$#@.+.+@@$$$&&;;;;;%$$@@+.+@#$==;=;=;;=;===$#..++@##==**-=&%$$##@.++@#$$%%%$%&&;;;$#+.", +"+@#%;;;&%$#$%&;;;%#......@@#$*-*%#@@.......+++@##%&&**&&%#@.....+@@%%*---*&&%$@..++@#&====&&&**%$#@.++@$$%=;&%&=;***$#@.+@@%&&*****;;***$#@.......+@#$%**%$#@++..@##%%&-*-*--*&&%$@..@@%%=**%%%==-*-%$@....++@#%&=;=$@@++........+.@#%&=;=$#@+..@@#==;**===%$##@@+..+@#%=;;;;;;;;;;;=$#...++@##$%%&;;***%$@...+@@##$%&&**;=&$@@.", +"+@#$;;;&%$#$%&;;;$#......+@$$***%#@@........++@#$%&&**%%$#@....++@@%%--***&%%$#.++@#$&==;=&%&**%$#@.++@##%==%%%==***$#@.+@#%&&*-***;;***$#@.....++@@$$%**$$@@+..++#$%&&**-****&%%$@..+@$%&**%%&==---%$#.....++@$%==&##+.+........+++@$%==&#@++..@#$=;;*-==&$$#@@++..+@#$;;;;;;;;;;;;;$#...+++@#$%%%;;***&%#...++@@$$&&&**==&#@+.", +"+@#%;;;&%##$%=;;;%#.....+@@#%*-*$$@++......++@#%%-*-&&%#@@+...+.+@@#$%%&=;;;=$#..+@#$*-*;;;;=-*&&%#..++@###$#$$%%***%$#.+@@%&&**&&&&&***%$@......+@#%&=;;$#@++..+@@$;;;=;&&&;;;;;$#.++@#$$;;-*-;;***%$@.....++@@####@@++...........+@@#####@+...@#$;;;**=&&$##@++...+@#%&====;=;==;==$#....++@@#$%&;;-**&%#....++@#$***=&%$#@@+.", +"+@#$;;;&&$#$%&;;;$#......@@$$***%#@@+......+@@#%%*-*&&##@++...++@@@##$%%=;;;;$#..+@#$***;;=;;**=&%#..++@@#####$$%***%$#.+@#%%=*-%%&%%***%$#......+@#%&&;=$#@++..+@#$;;;;=&%&=;;;;$#.+.+@#$=;--*;;***%$#.....+++@@##@@+............+.+@@#@@@+++..@#$;;;**=&&%$#@++.+.+@$$===;=;=;==;==$#....++@##$%%;;*-*&%#....++@#$*-*&%$##@++.", +"+@#%;;;&%$$$%=;;;$#.....++##%***%$@+++....++@#$&&*-*&%$@@++..++@@@###$$%=;;;;$#.++@$$*-*;;=;=-*=&&#.++@@#@##@#$$%***%$@.+@@%&&**&%%%%***%$@.....++@$&=&;=$#@+...+@#$;;;;=&%%=;;;;$#..++@#$==*--;;***%$@.......++@@@@+++............+++@@@@++....@#$=;;**=&&$$#@@++..+@#%====;=;;;=;;=$#...++@@#$$%%;;***&%@.....@@#$***&%#@@+...", +"+@#$;;;=%$$$%&;;;%#...+++@#$%*-*%$#@++..+++@$$%**===%$#@@+...+@@%%%##$$%&=;;;$#.++@$%=;;;;;;;-*==&$.+@@$%%####$%%-*-%$#.+@#$&&**%%%%%*-*%$#.....+@@$&=;==##+++..+@#$;;;=&%%%&=;;;$#..+++@#$%%&&&&***%$@......+++@@@@+++............+++@@@@@+....+@#$$%&&***;;%$#@@+.+@#$=;;;;;;;;;;=;$#.+++@##&&*-*;=%%$$#@.....+@#$===%$#@++...", +"+@#$;;;&&%$%&&;;;$#..+.+@@#$%***%$#@@++..+@#$%%-*==&%$#@@++.++@#%%&$$$$%&=;;;$#..+@#$==;;;*;;*-==&$.+@#%&%%$$$$%&***%$@..@@%%&-*%%%%%***%$@.....+@#$====&$@++...+@#$;;;=&%%%&=;;;$#...+@@#$%%%&&&***$#@.....+.@@@@##@+++...........+@@@##@@+++..++@##$%&***;;%$$#@+.+@#$=;=;;;=;=;;==$#..+@##$&=**-==%$#@@@.....+@#$===$#@+.....", +"+@#$;;;=&%%%&&;;;##..++@@#$%%-*-%%$#@@+.++@#%%&*-===%%$##@+.+@##&&&%$%$%&=;;;$#..+@#$==;;;;;***;=&$.+@#%&&%%$%%%&*-*%$@.++@$%&**%%%%&***%$@.....+@#$=;==&#@+....+@#$;;;=&&%%==;;;$#...+@##$%%&&&&***$#@.....++@#$$###@++.........+++@##$$##@++...++@@#%%***;;&%$$#@.+@#$&======;=====$#.+@@$$%&=*-*==##@@++.....+@#$===$#@++....", +".+@#%&&**===**&&%#@..+@@%%&==-**==&%%@@.+@@$*****;====&%$@@.+@#$***;;===**;==$@...+@##$$&&;;=-*==&$.+@#&==**===**;;;$#@..+@##%*-;;;;;-**%$@.....+@#$***%$#@++...+@@$==;**===**;==$@..++@#$=====**;==$#@......@@%%***#@+++.........+@#%&***#@++....++@@#$$$%==***%$@.++@##$$$$$$$$$$$#@@.+@#***;;%%%$##@@++.....++@@$==&$#@+.....", +"++@@%%&**=;=**&%%#@..+@#%&&==*--===&%#@.+@#$***-*;;===&&%#@.+@#$***;;==;**==&#@...++@##$%&=;;**=&&#.+@#&==**===-*;;;##@.+++@#$**;*;;;***$#@.....+@#$***$##++.....@@#&==**;==**==&#@.++@#$$===;=**==&#@+....++@#%&***$#@+........++@##&&***$@@+....+.+@@@#$$&=***%$@..++@@##########@@@+.+@#***;;%$$##@++........+@@$&=&$@@++....", +".++@##$&&;;;=&$$@@+.++@#&&=;;;;;;;=&&#@.+@#$=;;;;;;;;;==&#@.++##%&%;;;;;;=%$#@@....++@##%&=;;;;==&#.++@#$%==;;;=;%$$#@+...+@##%%=;=;;&&%$#@.....+@#$===$#@+......+@##$%==;;;;=%$#@@..+@$$%;;;;;&&%$#@@+.....+@@%&;;=$#@++........+@#$**=&&$@++........+@@@##$$$$##@...++++@@@@@@@@@@@++.+@##$$$$##@@@++.........++##&==#@@......", +".+.+@##%&=;=&&$#@@+..+@#&&==;;=;;==&&@@.+@#%==;=;;;;;==&%#@.++@#$%%;=;=;==$##@+....+.+@#%%;=;=;==&#..+@@#$==;;;==$$@@@...+.+@#$%===;=%%$#@+.....++@#==&$@@++......+@##$==;;===$##@+..+@#$%==;=;&%###@++.....+@@%%===$@@.........++@#$**=&%##++.......+.++@@@@###@@+....+++.+++++++.++.+.++@#$###@@@++.+.........++@#&=&#@@......", +"..++@@#$%===%%#@++...+@@%&&===;====&%#@.+@##==========&&%@@...@@$$%=====&&##@+......+++@$%=====&&%#..++@##&=====&##@@.+....++@#$&====%$$@++......@@#%&&#@++......+.+@##&=====&##@++..++#$$=====%%#@+++.......@@$%==&#@+++.......+@@$$**&&%#@+............++@@@@+@++.......+..............++@#@@@@++..............@@#%&%#@++.....", +"....++@@##$###@++.....+@##$$$$$$$$###@+.++@##$$$$$$$$$$##@+...++@###$$$$$#@@++.......++@@##$$$$###@...++@###$$#$#@@++......+++@@##$####@+++......+@@#@#@@+..........+@###$$$##@@++...++@@##$$###@@@+.+.......+@@####@@+.........+@#%%==$##@+++..............+.++..+.........+....+.......+++++++.................++@@#@@++.+....", +".....++@@@#@@@++.....+++@@#@#####@#@@++..++@@@########@@@@+..+.++@@@####@@@++.........++@@#@####@@+.....+@@@@##@@@++.........++@@@##@@@+++........++@@@++...........+++@#@#@#@@++......+@@#@###@@++.........+.+@@@@@@++.........++#$$&&##@++.................+..............................+++.+.................+@@@@@+.......", +".....+.++@@++++.+.....++++@@@+@@@@++++....++@@@@@@@@@@@++......+.++@+@+@@++.+...........++@+@+@++++......++@@+@+++...........+++@++@+++...........+++++++............++++@@@+++..+....+.+++@@+++++.............++@@++.+.........++@@@##@@@+........................................................................+++++........", +"......++++++++..........+.++...+.........+.+.++++++.+.............++.++.+.+.+....+.++++.++..+..+......+.+++++++++++.+....+.++++++++.++.+............+.+.+..+........+.+++..+.+++..+....+.+.++++++.+.........+.+++++++++......+.++.++.+.+.+.+.+......+.+++.+.+..+......+.+........+.+..+....+.+.+...++..+..........+.+.++........", +"..+.++++@@@+@+++......+.+++++@++++........++@+++++++++++.........+.+++++++++++...++++++@+++++.+.......+++++++@++++++.+....+++++@+++@@++++++......++++++@++++++...++++@+++++++++++++...++++++++++++++++........+++++++++++++.+.+++@++++++++@++.+.+..++++++@+++++.......++++++..+.+++++++...++++++++.++++++++......+.++++++++.....", +"..+.++@@####@@+++.....+++@@@@@@@+++.....+++@@@#@#@#@@@+++.......+++@@@#@@@@@+++.+@@@@#@@#@#@@++.+...+++@@@#@#@#@#@@@+++.+++@@@@#@#@@#@@@@++....+.++@@@@@@@@@+++..++@@@@@@@@@@@@#@@+.+.++@@#@#@#@#@@++++....+++@@@#@#@#@@@++.+++@@@@@@@@@@@@@@++..+++@@@#@@@@@++.....+++@@@@@++++++@@@@+.+++@@@@+++++@@@@@++....+.++@@@@@@+++....", +"...+@###$$$$$#@+++....++@@##$###@@+.....++@##$#$$$###@@++++...+++@@####$####@@+.+@##$#$$#$##@@@++...++@##$#$#$$$#$##@++.++@###$#$$$$#$$##@@...+++@@###$#$###@@+.+@@###$###@#######@.++@@####$$#$###@@++.....+@@##$#$$#$##@@..@@###$###@######@+..++@##$#$$##@@++....+@@@###@@+++@@###@@.++@@###@@@@@#####@@...+++@@@#####@@+++..", +".+++##%==***%%#@++..+.+@$$%&&&&&#@@+....+@@%&&&&&=&&&$##@+....++@@$$&&&=&%%%$$@.@$$&&&&=&&&&%#@@++..+@#%&&=&=&&=&&&&#@+.+@#%&&=&&&&=&&&&%$@...++@@$$&&=&&%%%$$@.+@$%&&&&&$$$&&=&&%$.++@%%&&=&=&=&%%%@++...+++@%%&&&&=&&&%$@.+@$%&&&&&$$$&&&&%#@..+@#%&&&&=&&$#@++...+@$%&&&##@@@##&&&%$.+@#%&%%$#@#$%&&&$$@...++@#$%&&&%%#@@+++.", +"..@@#$%=;-**&&#@@+...+@#$%&====&$#@++...+##&========&%$#@@+.++@@##%%=====&&%%%@.@%%========&&$##@@+.@@#&&=========&&$@@.+@#&============%%#.++@@##%%=====&&%%$#.@@$%&===&%$%&===&%%.+@#%&&=======&%%#@+....+@#%&=======&%$@.@@$%====&%%%&===&#@.++@#&======&%$@++...@@%%&&=$$#@#$%&=&%$.@##&&=%%$##%%=&=%%@.++@@##%%&==&&$##@@+.", +"++@#$%%;;**-&=$#@++..+@@%%&=====$##+++..@@$&===;=====%%%#@@.+@@#$$&&=====&&&&%#.#%%===;=====&%$$#@+.@#$&====;==;====$#@.@#$&===;=;==;===&%#.+@@#$$&%=====&&&&%#.@#%&=====%%%=====%%.+@#%&&========&%#@+...++@#%&========&%#.@#%%=====%%%====&$#.+@@#&=======%$@@+...@#%&===%$$##$%===&%.@#$===&&$$$&&===%%#.+@@#$$%&====&%$$#@@.", +"++@#&==;==&&**%$#@+..+@#&&=**-*-&%#@+...@#$;;;**;;;;;***$#@.+@#&&=**;;;;;***==$.#%&***;;;;;;;***$#@.@#$;;;-*;;;;;-**%$@.@#$;;;**;;;;;***;=$.+@#&&=**;;;;;-**==$.@#%&***;;%%&;;***&%.+@#%&=;;-*-;;==%#@+....+@#&=;;;*-;;;&%#.@#%&**-;;&&&--;;=$#.+@#$==;-*;;=%$@+++..@#%&*-*==$$%&=-*-&%.@$$*****%%$&=-**=%#.+@#&&=**;;;;;***$#@.", +"+@##&==;==&&**%$#@+..++@&&=**-*-=&$@@+..@#$;;;-*;;;;;***$#@.@##===**;=;;;*-*;=$.#%=*-*;;;;;;;***$$@.@#$;;;**;;;;;*-*%$@.+#$;;;-*;;;;;***;=$.@##===**;=;;;**-;=$.@#%&*-*;;&%%;;-*-&%.++#%&==;*-*;==&%@@+...++@#&&=;;**;;;&%@.@#%&***;;&&&*-;;=$#..@@$==;*-;==%$@++...@#&=--*==$%$==-*-&&.@$%**-**%%%==*-*&%#.@@$&==**;=;;;***$##.", +".@#$;;;&=&==**&%%@+..+@@#$%;;;;;;=$#@+..@@$%==;;&&&&&***%$@.@#$***&&%%$%%===;=$.@$%;;;=&%%%%%***&%#.+##%==;;%%%%%***%$@.@##&&=;;%%%%%=====#.@#$***=&%%$%%===;=$.+#$%;;;=&%%%==;;;%$.++@##$%%***%%$##@+.....++@#$$%&;;=&&$#@.+#$%;;;==;;;;;%%$#@.++@#$%%**&%%##@+....@#$%*--;;%%%;;*--%%.@#$;;;**&&&%&***%%#.@#$***&&%%%%%***&%#.", +"+@#$;;;==&=&**&%%#@...+@#$%;;;;;;=$#@++.+@#%&=;;&%%%&***%$#.@#$***&&$$$#$=====#.@$$;;*&&$$$%%***=&#.+@$%&&;*%&%&&***%$@.+@#%&=;;&%%%%=&===#.@#$***&&$$$$$=====$.+@$%;;;==%%%&=;;;$$.+++@##%%*-*%$$@@@+.....+++@##$%;;=&%$#@.+@$%;;*&&;*;;;%##@+..++@#$%**%%$#@++....@#%%-*-;;&%%;;-*-%%.@$%;;;-*===%&***%$#.@#%***&&$$$%%***=&#.", +"+@#$;;;&&=&=**&&%@@..++@#$$;;*;;;;$$@++.@@#%&=;;%&&&%***%$@.##%***&%$####%&&==#.@#%;;;&&$$#$%***&&#.+@#%&=;;&%%%%***%#@.+@#%&=;;%%%%%&=&==#.@#%***&%$###$&====#.@@#%;;;=&%%%=&*;;%#...+@@#$%***%$#@++........+@@#$%;;&&%#@+.@@#%;;;&=;;;;;$#@@+...+@##%**%$$@@+.....@#%%*--;;%&=;;--*%$.@#%;;;-*&&&&%-**%%@.@#$***&%$##$%***&&$.", +"+@#%;;;;=**-*-&%%#@..++@#$%**&=&**%$#@+.+@#%&&*-===;;-**%$#.@$%***%$#@@@######@.@#%;;;&%$###$===;=$.+@#%&&;;&&&**%%$#@@.+@#%&&;;&&%**%%$##@.@$%***%%####$$%%$$#.+@#%;;;;;===;;;;;$$....++@$$*-*$$#@.+......+..+@@#%;;=&%#@+.+@#%;;;*****&$$#@++...++@$$**%%#@+++....@@%%*****&&&*****&$.@#$;;*=;;;;&%***%$#.#$%***%$##@#$=====$.", +"+@#%;;;==-*-**&&%#@..++@$$&**&&&-*%$$@+.+@@%&=**=;=;;-*-%$#.#$%***%$#@@+@@@#@@@.@#$;;;&%##@#$=====$.+@#$&=;;&&&**&%$#@+.+@@%&=;;&%&**%$##@@.#$%***%$####$%$%$##.+@#%;;;=;=;=;;;;;%#....+@@#%***%#@++......+.++.@@#$;;&%%#@+.@@#$;;******%%#@++.....@@#%**%$#@++.....@#$%**-**&&&**-**%$.@#%;;;;=*;;%&-**%$@.#$%***%$#@@#$==;==#.", +"+@#$;;;;;;;;;;=%%#@..+@@%%&;;&&%;;=%%#@.+@#%%&*-;;;;;***&%#.#$%*-*%##++++++@@++.@$$;;;&%##@##&==;=$.+@#%&&--**-**%$##++.+@#%&&--*-***$$#@++.#$%*-*%$###&&===%%@.+@#$;;*;;;;;;;*;;$#.....+##%***%#@@.....+++++@+@@$$;;&&%#@+.+@$$;;;*-*-*&%#@@.+....+@#%**%$#@@++++..+#$%***;=*-*;=***%$.@#%;;;&&***=&***%$#.@%%***$##@@##&&=;=$.", +"+@#%;;*;;;;;;*&&%#@.++@#%&=;;&&&;;&&%#@.+@#%&=**;;;;;*-*&%$.#$%***$$@@+.+++++++.@#%;;;&%##@@$&&&;=$.+@#$&&-*-****%$#@@+.+@@%&&-*-*-**%#@++..#$%***%$##$&====&%#.+@$%;;;;;;;;;;;;;$#.....@@#$-**$$@++....++@@@@@@@$$;;&%%@@+.+@#%;;**-***&%$@@+....+@@#$**%%#@@@@@++.@#$&***=;-*-=;-**%$.@#$;;;&=***&&***%$@.#$%***%$@@@#$&&=;=$.", +"+@#$;;;==*-***==&#@.+@#$%&=;;&%&;;=&%##.+@#%%&-*;;;;;*-*=%$.#$%***%$@@+++++@+++.@#$;;;&%#@###&==;=$.+@#%&&*-*-***%%$#@@.+@#%&&-*-*-**$##++..@%%***%$##$&====&%#.+@#$;;*;;;;;;*;;;%#.....+@$$*-*%#@@.....@@##$#####%;;&&%#@+.+@#$;;;**-*-&%$#@@+....+@$$**%$$#@@@@@+.+#$%***==-*-==***%$.@#%;;*&&***=&***%%@.#$%*-*%##@@#$&==;=$.", +"@@#%;;;;;**-**===##.++#$;;;*-*-*--;;=$@.++#%&&;;%%%%%;==;=$.#$%*-*%$#@++@@@@@@+.@$%;;;&%##@#$&&=;=#.+@#%&=;;=&&**&%%%$@.+@#%%=;;&&&**$#@+...@$%***%%$$$;;***==$.+@#%;;;==%&%&=;;;%#...++@##%***%$@+++...@#$===####%;;&%%#@+.+@$%;;;===;=**%$#@+...++##%**%$$##%%%#@.@#$%*-*&%;;;%&***%%.@#%;;;=====;;-**%$#.@$%***%$#@@#$===;=$.", +"+@#$;;;&==;=;;==&#@.@@#$;;;-*-*-*-;;=%#.+@#%&&;;%%%%%===;=$.@$%***%%##@@##$###@.@#$;;;&%$###$&====$.+@#%%&;;=&=**&&%%%#.+@#%&&;;=&&**$@@+.+.@$%*-*%%$$$;;***==$.+@$$;;;=&%%%&=;;;$$....++##%***$$#@.+.+.@$$;;;%$$$%;;=&$#@+.+@#$;;*&===;**&%$#@...+@@$%**&%$$$&&%$#.+#$%***&%=;;%%*-*%$.@#$;;;=====;;***%$#.#$%*-*%%$##$$=;=;=#.", +"@@#$;;;====;;;==&$@.+#$%*-*==&&&&&***%$.@@#%&=;;%%$%%;;=;=#.##%;;;==$$###&==&&#.@$%;;;&&$$$%%***&%#.+@#%&=;;%&%&%=====#.+@#%&=;;&%%%%#@++...@$$;;;=&%$%%%;;;;=$.@@$%;;;&&%$%&=;;;$$...+@@#$%*-*%$#@@++..@$%***%%$$%**&%%@++.@@$%;;;&=%%&;;==&#@..++@##%**%%%%$***$#.@#%%***%%%$%%&***%$.@#%;;;&&%%%***-*%$#.@$$;;;=&$$#%%***&%$.", +"+@#%;;;=&;==;;==&#@.@#$%***=&&&&==*-*%$.+@$%&=;;&%%%%=;;==$.@#$;;;==%$$%%====&#.@$%;;;=&$$$%%***&%#.+##&&=;*%&%&&=====$.+@$%&=;;&%%%$#@++...@#$;;;;=%%%%%;==;=$.@@$%;;;=&%$%&=;;;%$.++@@#$$%*-*%$$#@++..@$%***%%%%%**&%%#@..@@$%;;;=&&%%;;===$#..+@@$$%**&%%%%***%$.@#%%***%%$$$%%***&$.@$$;;*&=%%%***-*%$#.@#$;;;;=%%$%%*-*%%#.", +"+@#$=;;==&&%=&&%$#@.@#$&*-*=&&&&&=***%%.@#$&&=;;%%%%%;=;;=$.@@$;;;==%%%%%====&#.#$%;;;&=%%%%&***%$#.@@$&&&;;&%&&%===;=$.@@$&&=;;&%%%$#@+....@@$;;;==%%%%%=;===#.@#$%;;;&&%%%&&*;;%$.++@#$$%%***%%$$#@@+.@$%*-*&&%%&**&%$@++.@#$%;;;&&%%%;;===%#.++@#$%%**&&&&%***%$.@#%&***%%$$$%%***%%.@#%;;;&&%%%**-**%$@.@@$;;;==%%%&&***%$@.", +"+@@#&==;=%&%=&%%$@@.@#&=--***&&&**---=&.@#$*-*--*-*-****%$#.+@#%%&;;*-***;;;%$#.#&=---**-*-*-;==$#@.@#$**-*-*-*-***-;=$.@#$**--*-**%%@@+....+@#%%&*****--;;;%$#.@#&=--***%%%****-=&.+@@&==-----**==&@@+.@#$=;;*-***;;$$@@++.@#&=---**%%%&=-*-=&.+@#$*-*--****-*--$$.@#&=--*==$#$=;---=&.@$%*-*-*%%%==---%$#.+@#%%&******-===$#@.", +".+@#$%&***-***%$$@+.@#&=*--**&%&**--*=&.@#$-***-*-**-***$$@.+@@$%%;;**-**;;;$$@.#&=-*-***-*-*;==##@.@#%*-*-*-*-**-**==#.@#$*-***-*-%%@+++...+@@$%%**-****;;;%$@.@#&=*--**%%&-*-**&&.+@#&==***-*-*===@@+.@@#===-**-*;=$#@++..@#&=-*-**%$$%%*-*=&.++#$-*-*-****-*-*%#.@#&=*--==#$#==-*-=&.@#%*--*-$$$==**-$$@.+@@$%%***-***=&&#@@.", +"+++@#$%*******%$#@+.@#$$%%%%%$$$%%%%%%#.@@$$%&%&%%%%%%%$$@@..+@@##$$%%%%%$$##@@.@#$%%&%&%%%%%$$##@+.@@#%%%%%%%%&%%%%$$#.+@#%%%&%%%%$#@+......+@@##$$%%&%%%$##@@.+#$$&%%%%$$$%%%%%%#.+@@$$%%%%&%&%%$#@@..+@##$$%%&%&$$#@@+...+@$$%&%%%###$$%$%$$.++@#$%%%%%&%%&%%%##.@@$%%%%%$###$$%%%$$.@@#%%%%%$#$$$%%%##@..+@@##$$%%%%%$###@+.", +".++@@##$$%%%$$##@+..+@#$$$%$$###$$%$$$#.+@#$$%$%$%$$$$$##@+..+++@###$%$%$$##@@+.@@#$$%$%%$%$$##@@++.+@@$$$%%%%%$%$$$$#@.@@@$$%$%%$##@+++.....++@@@#$$$%$$###@@+.+@#$$%$$$###$%$%$$#..+@#$$$%%$%%%$$#@++.++@@#$$$%%%##@++....@@#$$$$$$##@@##$$##..+@@$$$%%%$%%$%$$#@.+@##$$$$##@###$$$##.+@#$$$$$#@@##$$$#@+..+++@###$$$$$##@@++.", +"...++@@##$$$##@@++..++@###$##@#@######@..+@####$###$###@@++..++++@@@#####@@@+++.+@@###$#$####@@@+.+.++@###$###$######@+.++@###$##$#@@+.........++@@@######@@++..++@###$##@@@######@.+++@@###$#$$###@++..+++@@@#$#$#@@@++....+@@##$###@@+@@###@@.+++@#####$#$#$###@+.++@#####@@+@@#####@.++@#####@@@@@##@@++...+++@@@#####@@++...", +"....++@@@@#@@@++++...++@@@@@@@++@@@@@@+..+++@@@@@@@@@@@+++.......++@@@@@@@+++...++@@@@@@@@@@@@++.+...++@@@@@@@@@@@@+@++..+++@@@@@@@++............++@@@@@@++++....++@@@@@@+@+@@@@@++...++@@@@@@@@@@@++.....+++@@@@@@@++.......++@@@@@++++++++@@+...++@@@@@@@@@@@@+++..++@@@@@+++++@+@@++..++@@@@++++++++@++.......++@@@@@++++....", +"....+.++@++@+++......+.+++++.+++++++++....++++++++++.++..+.......+..+++++..........+++++@++++..........++++@+++@+++++.+...++++++++..+...............++++++........+.+++++++.+++++++...+.++++++@+++++..........++++++.........+.++++++....++.+.......+++@+++++++++.+..+.+++++++.+.+++++.....+++++...++++..+........+.++.+........", +"...+.+.++++.++.............+.+.+.+.........+.+.+..+.+..............+.+++..+........++.+++.+..+.+..........+......+.+......+..+.+..+..+...+......+.+.+..+.+.+.....+...+...+...++.+......+.+.+...+.+.++.+......+.+.+.+.++..........++@@@@@@++.+...+.+++++++................+++@@@@@++.+..........+.+++++..........................", +"..+++++++++++++++........++++++++.+......+.++++++++++++..........++++++++++++.....++++++++++++++++...++++++++++++++++++...++++++++.+.+++++....+++++++.+.+++++++...+++++++++++++++++....+++++++++++++++......+++++++++++++++....+++@#####@@++.....++@@@@++++...........+.++@@#####@@.+.........+++@+@+++.........................", +"+++@@@@@@@@@@@++++.....++++@@@@@@++++....++@@@@@#@@@@+++.......+++@@@@@@@@@@+++.+++@@@@@@@@@@@@@+++..++@@@@@++@+@@@@@++.+++@@@@@++++@@@@@@+.+++@@@@@+++++@@@@@+..++@@@@@@+@@@@@@@@+..++@@@@@@@+@@@@@@@+..++++@@@@@@@@@@@@++.....+@#%%&&%$#@+++..+@@####@@++............++@#$&&&%%#@+..........+@@@#@@+++........................", +".@@###$#$#$####@@++...+++@@#######@@+++.+@@@#$#$######@@++...+++@@@##$#$###@@++..@@@###$$#$$####@++.+@@######@@######@@.+@@@####@@@@@#####@.+@@@#####@@@@#####@.+@@#######@@######@.+@@######@#@######@...+@@###$#$#$####@@....+@@$&&==&$#@@....+@#&==%$@+++...........+@##$&=&&&##@+........++@#%%%#@+++.......................", +"+@##$$%$%$$$$$$#@@+.+.+@@#$$$%$$$##@@++.@@#$$$$%$%$$$##@@++...+@@#$$$%$%$$$$#@@.+@#$$%$$%$%$%$$$#@+.+@##$$$$###$$$$$##@.+@#$$$$$$####$$$$$#.+@#$$$$$####$$$$$##.@@#$$%$$$$$$$$$$$$#.@@#$$$$$$$$$$$$$$$#.+++@##$$%$%$%$$$$#@...++@#$***;;%$#+++..+@#===%%#@++..........++@#$%;;***$#@+.......++@#$%&&$#@++.......................", +"@#$**********==&#@@..+@#$$==*****%%$@@+.@#&=********==$##@+.++@#$$**********$#@.@#$*************$#@.@#$*****%%%==***=&#.@#&=***==$#$==***=&.@#&=***==$$$==***=&.@#&=*****%%%*****&&.@#&=*****%%%*****=&..@@#===**********$#....+@#$--*;;%##++...+@#%&&==$@@+...........+@#%%;;***$#@++......+@#$%-**%$@+++......................", +"@#%***-*-*-**===$#@.+@@#$%;;*****&&%#@+.@#&=**-*-**-;=%$#@@.++@#%%**********$$@.@$%**-**-***-***%$@.@$%*****%%$;=***=&#.@#&=***==$$$=;***=&.@#&=***;;$%$;;***=&.@#&=**-**&&&**-**=&.@#&=**-**&%&*-***=&.+@##=;;**-*-*****%$...++@$$**-;;$$#@.+..+@#%&===$#@+..........+.@#$%;;-**%#@+.......+@#%%*-*%%#@++......................", +"@$$*-*******-=;=$$#.+@#$%%;;-*-**&&%$#@.@#==-****-**;;%%$#@.+@#$%%**-*-*****%$@.@$%***-*-*-***-*%$@.@#%**-**%%%;;*-*==$.##==*-*;=$$$==-**==.##==*-*;;%%%;;*-*==.@#==***-*%&&-**-*==.@#==-**-*&&&***-*==..@#$=;;*-**-*--**%$....+@$%***%%#@@+....+@#%&&;;$#@@+.........+.+@##%%***$$@@....+.+@@#%&*-*%%#@++......................", +"@#$&==;;=&&&&;;;=&#.@#$=;;==&&&=&***%$@.@#$%***==&&&;=;;;#@.+@#=;;;;&&&==*-*%$#.@$%***&&-*-&=***%$#.@#%***=&$$$%%***&%#.@#%&***%%$$$%%***&%.@#%&***&&==&&&***&%.@#$%-**;;%%%;;***%%.@#$%***;=%&%;;***%%.+@#$;;;==&&&;=***%#...+@@#$*-*%$#@+.+...++@#$%**%$#@@..........+++@#$%*-*%#@++.....+@#$==;;;;=$#@+......................", +"@@#&==;;&&&&=;;;==$.@#$;;;;=&&%&=*-*%$#.@#$%***==&&&;;;;;$#.@#$==;;;&&&&&*-*%$@.#$%-**=&**-&&***%$@.##$***&=$$$%%***%%#.@#%%***%%$#$%&***%%.@#%&***&%===%&-**%%.+#$%*-*=;&&&=;*-*%$.@#$%**-=;&%&=;*-*%$..@@$;;;===&&;;-**$$....+@$%***%$#@+......+@@#$**%%$@@++.........++@#$%***%#@++....++@#$==*;;;;$#@++.....................", +"+@#%&=;;%%$$%===;=$.@$%***&%$$$%%;;;==#.+#$%;;;=&%%%&=;;;$#.@#$;;;==%%%%&=;=%$@.@$%***%&-**&%-**%$#.@$$;;;&&$##$%***%%#.+@$%;;;&%$#$%%;;;%#.@#$%***&&*-*&&***%%.+@#$%&=**=;=*-&&&$#.+@#$&&=;;&&&**&&%$#.+@@$&==&&%&&**&&&$@....@@#$***$$@+++......@@#$====&#@++..........++@#%***$$@@.....+@#$%**&&&**$$#++.....................", +"@@#%&=;;%%$%$===;=$.@$%*-*&%$##$%;;;==$.+@#%;;;&=%%%&=;;;$#.@@$;;;==%%%%%;==$#@.@$%***&%-*-%&***%$@.@#%;;;&%###$%***%%@.@@#%;;;%%$##%&;;;$$.@#%%*-*=&*-*=&-**%$.+@@#%&&*-=;;**&&%#@.+@@#%%=;;&&&**&&%#@..@@#&&=&&&%&*-&&%#@...++@$%*-*%#@@........+@#$&===&$#@+..........++@$$-**%#@@....+.@#$%**%&%**%$#@+.....................", +"+@#%%=;;%%$$%&==;=$.@$%***&%####$;;;;=#.+@#$;;*&=%%%=&;;;$#.@@$=;;==&%%%%;==$$@.@#$***%%**-%%***$$@.@#$;;;=%$###%***%$#.+@#$;;;&%$$$%&;;;$#.@@$%***&=-*-&&***%$..+@#$%&**;=;-*&%%#@..+@#%%&;;&&&**&%%#@..+@#%&&%&%&&**&%%#@....+@$%*-*%##++........+@#&====$#@++..........+@#%**-$$@++...++@#$%**%%%**$$@@+.....................", +"+@#%&=;;%%$%%;==;=$.#$%***%$#@@#$===;=$.@@#%;;;;====**;=&$@.@@#%&&***-*==&&%$#@.@##$%%%%-**%%%%$#@@.@#%;;;&%#@#$$***%$#.+@#$=;;==$$$&=;;;$#.@#$%***;=--*;;***%$.+++@#$%==*-*==$$#@+..++@#$%;;**-;;$$#@+.++@@##$$%;;;;;$$#@+....@@#$***%#@@.........++@#$=;;&&##+++.......+@@#$***%#@@......@#$$&=$%$&&%$#++.....................", +"+@@%%&;;&%%%%=;=;=#.#$%***%##@@#$&=&;=$.+@#%;;;;;===**;==#@.+@#%&&*-**-==%%%$@@.+@@#$%%%**-%%$$$@@+.@#%;;;&%$#@$%***%$#.++@$=====%$%&=;==$@.@#$%***;=---;;***%$..++@@#$&=-*-&=$$@@+...++@#$;;-**;;$#@++...+@@#$$%;;;;;$#@@+...+@@#%***%#@+..........+@@$==;=&$#@+.........@@$%***%#@@....+++#$$%%#$#&%$##++.....................", +"+@#%&=*-*****;;;%%#.@$%***%$####$&==;=$.@@#%;;;*****;;%%$#@.+@##$%&%;==*****$#@.++@@@#$%***%$##@@++.@#%;;;&%###$$***%$@..@@#%&&;;%%%;;&&%#@.+#$%*****&&=**-**%%...+@##%=;;;;;=%#@@+....+@@$%%**-%$$@@+.....+@##&&***%%$$@@+...+@@#%***%##@..........++@#$%%**$#@+++.......+@$%**-$$@++.....++@@###@@##@@@+......................", +"+@#%&&-*-*-**;;;%$#.#$%*-*&%$$#$%;;;=&$.+@#$;;;***-*;;%$##@.+@##$$&%==;*****$#@..++@@#$%*-*%$#@++...@#$;;;&%####%***%%@..+@#%&&;;%%%;;&&%#@.+#$%*-***==&-****%$..++@#$$=;;;;;=%$#@+.....@@#%%-**%$#@++...+++@#$&=***%%$##@@....@@$$*-*$$@++..........+@@$%%**%##@+.......+@@#$***%#@@.....+++@+@+@@@+@@+++....++.+++++.+++++.+..", +"+@#%&&*-**-*-;;;$#@.@$%***&%%$$%%;;;=&$.+##%;*;****-;;%%$@@.+@#$$%&&===*****$$@....+@##%***$$#@+.+..@#%;;;&%$##$%***%$#.+++@$%&;;&%&;;&%%@@.@@$%***-*&&=*****%$.++@@#$%;=*;;==%$#@@....++@#$%*-*%$#@+.....+@##$&=*-*%%%$##@....+@#%***%##+++..........+@@$$;;%%$@@+......+@#$%***%#@@........++++.++++++....+.+++++++++++++++++.", +"+@#%&=;;=&&&&%$$#@@.@#$=;=**=&===*-*%%#.+@$$;;;==&&&**=%%#@.@#$;;;%%%%&&&***%$#...++@#$%*-*%$#@+.+..@#$;;;&&$$$$%***%$@..++@#$%**&&&**%$#@+.+@#%;;;-*&&&*-;;;%#.+@@$%&&**&&&**=&&#@.....+@#$%***%$#@++..+++@#$%**===%%;;=$#....+##$*-*%$#@+...........+@@#$;;&%$#@+....+.+@#$%-**$$@++..........+......+....+++@@@@@@@#@@@#@@@+.", +"@@#%&=;;&&&&%$##@@+.@@#==;**==&;=-*-%$#.@@$%;;;&&%&&-*&&&$#.@$$;;;%%&%%%&***%$@..+++@#$%***%$#@@+...@#$;;;&&%%%%%-**%$#...++##$**&&&**$#@++.@@#%;;;**&&&*-;;;%#.+@#$&==-*&&&-*=&&$#....+@@$$%*-*%$#@@+...+@#$%%-*===%&;;;%$...++@$$***%$#@@++..........+@#$=;&%%#@+....+.+@#$%**-$$@++......................+@@###$$###$#$###@@.", +"@#$=;;**;==&%##@+++.+@##%%;;-*-;;&&&&%#.@#%&**-;=%%%;=***%$.@$%-*-;====;=-**%$@...+@#$&=--*&&$#@++..+@#&==;;=====;;;$#@...++@#$==*-*;=$$@++.+@#$;;*;;&%&;;*;;$#.@#%%-*-;;&&&;;*-*&%...++@#$==-*-&&$#@++.++@#=;;**=;===***%$...++@#%*-*==$#@+..........+.@@$%&;;;$#@.....@@#$&=***%#@+.......................@#$%%&&&&&&&&&=&%%@.", +"@#$=;;**;==%%#@++...+@#$$%;;-*-;;&&&&%#.@#%&***=;%$%=;***%%.#$%*--=;====;-**%$@..+@@$$==**-=&$#@+++.@@#%&=;;====;;;;$#@....+@#$==*-*==$#@+..+@#%;;;;;%%&;;;;;$#.+#%&--*;;%&%;;*-*&%..+++##%&=-**=&$#@++.+@@$==;*-=;===-**%$....+@#%***==$$@@++..........+@#%&;;;$#@....++#$$==-**%##++......................@$%&&&==&&&&&===&%#.", +"+#$=;;**===%$#@++...++@%%=*-;;;*****&%#.@#%&***;=%$%==***%%.@$%-*-;====;=***$#@..+@@$$==-*-&=%$#++..+@#%&&;;;====;;;$#@....++@#&=**-==#@@++.+@#$;;;;;%%%;;;;;$#.@#%&*--;;%&&;;-**&%...+@#$$==*--=&%$#++..@@#=;;*-==;==***%$...+@@#$*-*==%$#@+..........++@@$%***%#@....+@#$%==***$#@+.......................#$%&============&&$.", +"@#$=;;;;;;;%%@++....++@$%&*-;;**-***&%#.+#%&;;;;;$$$%%;;;&%.@#$===;;;;;;;&&%$#@...+#$$;;;;;;=%$#@++.+@@##%;;;;;;;&&%#@+....++@#%&;;;&%#@+...++@#&====$$$====&$@.@#%&;;;;;%%%;;;;;&%....@#$%;;;;;;;%$#@+.++##&&=;;;;;;;;;;$$....+@#$=;;;;%$#@++..........++@#$***$#@....+@#$%;;;;;$#@++......................#%&;;;;;;;;;;;;;;;#.", +"@#$=;;=;;;=%$@++.....@@$%&*-;;;*****&%@.@@%%;;;==$##$$=;=%%.@#$&====;;;;;%%%#@+.+++@#$=;;;;;=$$#++....@@##==;;;;;%%$#@+....++@@$%=;=%%#@+...++@#&&&&&$#$&&&&%#@.+@%%;;;;;$%$;;;;=%%..+++#$$=;;;;;=$$#++.++@#&&=;;;;;;;;;=$#....+@#$==;;;%%#@+...........++@##***$#@...++@#$%;;;;;$#@+.......................#%&;;*;;;;;;;;;;;=$.", +"+@##$$$$$$$#@@+......+@@#$%%%%%&&%%%##@.+@###$$$##@@##$#$#@.@@###$$$$$$$$$#@@++...+@@##$$$$$$#@@+.+..+.@@##$$$$$$$#@@+......++@##$#$#@@+++...+@@##$##@#@#####@+.+@###$$$$####$$$$#@....+@@#$$$$$$##@@++..++@##$$$$$$$$$$$#@....++@#=====%$#@++..........+.+@#$$$#@@....+@#$%=;;;=##+++......................@%%;;;;;;;;;;;;;;=#.", +"++@@@####@@@@++.+.....+@@#$$#$#%$%$$#@+.++@#####@@@@@@@#@@@.++@@#########@@@+++....+@@@#####@@@++......++@@######@@@++......+++@@##@@@++......++@@@@@@@@@@#@@@+.++@@###@#@#@#@####@.....+@@@#####@@@+.+...++@@@####$####@@@.....+@@#$$$##@@+.............++@@#$$@@+.....+@@#$$$$##@++.......................@@##$$$%%%%%%%$$$#@.", +".++@@@@@@@@+++........++@@#$###$#$##@@+..+++@+@@@+.++++@@@+..++@+@@@@@@@@@+++.....+.++@@@@@@@++.........+++@@@@@+@+++..........+++@@@++.......+++@+@+++++@++++...++@+@@@+@++@@@@@++....++++@@@@@@@++.+.....++@@@@@@@@@@@@++.....++@@@##@@@+++.............++@@#@@+.....+++@@@#@#@@++........................@@@###############@.", +"....++++++++...........+++@+++@@@@@@++.....+++.+.+..++.+.+.....+.+++++.+.+..........+..++++.++...........+.+++++++.............++.+...+..........+.+.....+.........++++++++++++.+........+.+.+++++.+..........+++++++++.+........+++@@@@+++................++++++.+......+++@@@@+++.........................+++@@@@@@@@@@@@@@++.", +"........+.+...+..........................+++++++.+.......................................+.+++++................................+.+++++++.........................++++++...................+.+++.+............+.+.++++.........++++++...............++++++++.+..................................................................", +"......+.++++++..........................++++@@@+++......................................+.@+@+@++++..........................++++@@@@@@@+++.....................+++@@@@+++................++@+@+++.............+++@@+++......++++@@@++++............+++@@@@@++..................................................................", +"......+++@@+++..........................+@@#@##@@++.....................................++@@##@@@++..........................++@@#######@++.....................+@@@##@@@+++............+++@@#@#@++..........+++@@#@@@@++....++@@##@@@+...........+++@@###@@@++.................................................................", +".....++@@@##@+++........................+@##$$$#@@++...................................+@@##$$$#@@+.........................++@##$$$%$$##@+.....................+@##$$$#@@+..............+@###$##@++..........+@##$$#@@++...++@##$$$#@@++........+.+@@#$$$$$#@++................................................................", +".....+@#$%%%#@++........................@#&&***%$@+++..................................+@#$**===#@+.............+.........+.+@##==;*****$#+.....................@#&&***%$@@++..........++@@%&***#@@+........++@@$***&%@@++..+@#$***=&#@+++.......+++#$%*****##@+......................................................+.........", +"..+.+@@$$&&%$#@++............++++.......@#&=***%$#@++..............++.+.++.+.........++@@$$**=;=##@.......+.++.+.+.........+@@#%==;*****$#@........+.+.+++.+....@#&=***%$#@++...........+@#%&***$#@++........+@#$***&%#@+...+@#$***==$#@++.+......+@$$%*****$#@+.......+.+.+.+++.+..+.......++.+.+.+.+.............+.+.+.+......", +"....+@@%%*-*%$@+++....+.++++++++++......@#$%;;;&%#@@++++........+++++++++++++......+.++@@#%&=;;;$#@....+.+++++++++.+.....+++@#%&***&&&&%#@@...+.+++++++++++++++.@#$%;;;&%#@@+++.........+@#%&;;;$#@.......+++@@#$;;;&%#@++..++#$&&=;;##@++++++.....+@#$%&***$#@++......+++++++++++++++...++++++++++++++..+.....+.++++++++++.....", +".....@@%&*-*%$#@+......+++@@@@@@@++++...+#$%;;;&&$##@@++++.....+++@@@@#@@@@@+++....+++@@#$$==;;;$#@..+.+++@@@@@@@@++.....++@#$&=*-*=&&%%#@+..+.+++@@@@@@@@@@@++.+#$&;;;&&$#@@@++++.....+@@#%&;;;$#@++......++@#$%;;;&%#@+...+@@#&&=;;%##@@@@++....++@@$%&***$$@+.....+@+@@@@#@@@#@@@++...++@@@@@@@@@@@+++.....++++@@@@@@@@++++..", +"...++@@%%-*-%%#@++...+++@@#######@@++...+#$%;;;=&%$###@@@++.+++@@@####$#$##@@++.+++@@@##$$%&=;;;$#@..++@@@###$###@@@++...+@##$&=***&&&%%#@+..++@@@###$$#$###@@@.@@$%;;;=&%$$##@@++...+.+@#$%&;;;$#@+.....++@@#$$%;;;&%#@@....@@#&&=;;%$####@@@+....++@#%&*-*%#@@....++@@####$#$##$##@@+.++@@##########@@+++.+.+@@@###$###@@@+...", +"....++@#$=;===#@+...+.+@#$$%&&&%$$@@++..@@#%;;;==&&&%%##@@+..+@@##%%&&&&&%%%#@+..+@@##%%&&==;;;;%#@.++@@##%%&&%&%$#@@++.+@@$%&;;;;;==&&%#@+.++@@##%%&%&&%&&%$$@.+@#%;;;==&&&%%#@@++....@@#$&===&$#@++...+.@@$%%&====&&$@++..++@#%&&;;%%$&%%%$@+.....+@##%***$$@++...+@$$%%%&&&&&&%&%##@.+@$$%&%%%&&%%%#@@++.++@@##%%%&&&%$#@@++.", +"....++@@#&===&$@@...++@@$$%&&&=&%%#@@++.+@$%;;;=====&&$$#@@.+@@#$%%&&&&=&&&%$#@.+@@$$%&&=&===;;;$#@.+@@$$$&&&=&=&$$##@+.+@#%%&;;;*;==&&%#@@.+@@$$$&&&=&&&=&=%$#.+@$$;;;====&&%$$#@+..++@#$%&===&$#@++...++@#%%&&====&%$#@+..++@#%&&;;%%%&&%%%#@.....++##%***%#@@....@@$%&&&&=&=&&&&&$#@.@#$%&&&%%&&=%%$$#@+.+@@$$$&&&=&&&$$##@+.", +".....++@##$$&&#@++...+@#===*******%##++.+@#%;;;-******;==#@.@@#==;**;;;**-*-$$@.+@#===******-;;;%#@.@@#===**;;;**;==#@@.+@#===****-;;==&#@+.+@#==;**;;;-****=&#.@@#%;;;-******&%%@@...+@#$%;;-**%#@+.....+@#&==;;*****$#@+...+@#%&=;;&=&*-==&#@......+##%*-*$$@++...@#&=************==#.@#&=***;;;;;**&%%@@.@@#==;**;;;**;==#@+.", +".....+++@##$%%#@++..+@@#=;;*******%$#@+.+@#%;;;-****-*;;=$#.@#$=;;*-;;;-*-*-%$@.@#$=;;*-***-*;*;$#@.@#$=;;*-;;;-*;;=$#@.+@#&=;**-**;;;==#@+.@#$=;;**;;;-*-**=&#.+@$$;;**-***-*=&&#@...+@#$%;;*-*%#@@.....+@#&==;;*****$#@+..++@#%%&;*&&=*-==&#@.....++@#%***%#@++...@#&=*-*-***-*-**==#.@#&=*-*;;;;;-*=&&#@.@#$=;;*-;;;-*;;=$#@.", +".......++@@@%%@@+....@@$==;*******%$$@+.+@#%;;;*-*****;;;$#.@#$=;;*-;;;**--*%$@.@#$=;;******-;;;%#@.@#$=;;***;;**;;=$#@.+@#&==***--;;=&&#@+.@#$==;-**;;-*-**=&#.+@#%;;;*******=&&$@...+@#$%;;-*-$$@++...++@#&==;;*****$#@++..++#%&&;;==&-*==&#@....+.+##$***$$@@....@#&=***-*-***-**==$.@#&=*-**;*;;**=&&$@.@#$=;;**;;;**;;=$#@.", +"........++@@@@@++...++#$%&&=====**&%%@@.+@#$;;*;;%%%&&***%$.@$%***=&&%%&&*-*%$#.@$%***&=%%&;;;;;$#@.@$%**-&=%&&=&***%$@.++@#$%==;;;%%$$#@@+.@$%***=&%%&;;;;;%$#.+@#%;;;;;%&%==;;;$#....@@#$$%***%#@++....++@##$%%%&&**%#@++.++@#%&&*****==%$#@@.....++@$%*-*%#@@....@#$%;;;==;;;=;==;=$.@#$%;;;;;&%&==;;;$#.@$%***==%%&&&***%$@.", +"..........++++++.....@@$%%&=====**&%%#+.+@#%;;;;;%%%&&-**%$.@$%***&&$%$&&*-*%#@.@$%**-&&%%%;;;;;%#@.@$%***=&&%&&=*-*%$@.++@#$$&=;;;%$##@@+..@$%***=&%$%;;*;;$#@.+@#%;;;;;%%%==;;;$#....++@#$%-**%##+......++@@##$%%%**$$@+...+@#$&=***-*=&$$#@+......@@#$***$$@+....@@#%;;;===;=;;==;=$.@@#%;;;;;%%%==;;;$#.@$%*-*&&%$%&&-**%$#.", +"...........++....+..+@#$;;;**;;;--&&%@@.+@#%;;;&&%$%%%***%$.@$%*-*%$$##$$%&%$#@.@$%***%%$$%&=;;;$$@.#$%---****-**--*%$#.+.+@#$===;=$$#@+++..#$%***==%%%;;;;;%#@.+@#$;;*&&$$%%&;;;$#....++@#$%***%#@@......+++@@@#$%%**%#@@...+@#%&&*--*-&%$#@++......+@$%*-*%#@@....+@$$;*;===;;====;=$.@@$$;;;=&$$%%=;;;$#.@$%***%$$$$%%***%$@.", +".............+......+@#$;;;*-;*;**&&%#@.@@#$;;;&&$$$$%***%$.#$%***%$$###$%%%$@@.#$%***%%$$$&=;;;$#@.#$%-*-**-*-***--%$@..++@#$===;=$#@++....@#%*-*==%%&;*;;;$#@.+@#%;;;&&$$$&=;;;$#.....+@##%***%$@+++........++@#%%**$#@+..++@#%%=**-**&%$#@++.....+@##$***%$@+++..@@#%;;;&==;=;===;=$.+@#%;;;&&$$$&&;;;$#.#$%***%$$##$%***%$#.", +"....................+@#%;;***;;;--&&%#@.+@$$;;*&&%$$%%***%$.@$%***%$$####%$%##@.#$%***%$$$%&&;*;%#@.#$%-*-*****-*-*-%$#..++@#$==;==%#@@++.+.@#$===*******;*;$#@.+@#%;;;&&$$$%&;;;%#.....+@#$$*-*$$#@+.+......+.@@#$%**$$@++..+@#%&&**-*-&%$##++...+.+@@$%***$$#@+.+.+@#%;;;==;=;====;=$.+@$$;;;&&$$$&&;;;%#.@$%***%$$$$$%***%$#.", +"....................@@$%***&&&&&**&&%#@.@@$%;;;;;%$%&=*-*%$.#$%*-*=&$###$%%%$#@.@$%*-*==%%%;;;;;%##.@$%***;;=&&&==;=%#@..++@#$===;=$$#@+++..@@#&==*-*-*-*;;;%#@.@@#%;;;&%$$$%=;;;%#.+.+++@#$%***%$#@@+.....+.++@#$$%**$#@++.++@#%&=;;=;=**%$#@+..+.+@@#$%*-*%$#@@+..@@#%;;;&&;=;;===;;$.@@$%;;;&&$$$&=;;;%#.@$%*-*=&$$$&=-**%$@.", +"....................@@$%***%&%&%**&&%$@.@@$$;;;;;%%%==***%$.@$%***=&%$$$$&&%%$@.@$%**-&&%%%;;;;;$$@.#$%*-*==&=&=&;==$$@..+@##%==;=;%$##@@+..+@##%%&&&&&==;;;$#@.@@$$;;;&&$$$&&;;;%$...+@@#$$%-**%$$#@@+..+.+@@@@#$%&**$$@+..+@@#%&=;*=;;**%%$#@...+@@#$$%*-*%$$#@@+.@##%;;*&=;;=====;=%.+@$$;;*&&$$$&&;;;%$.@$%**-==%%%&=***%$@.", +"....................@@$%***%&%&&**=&&##.@#$%;;*;;&%%==*-*$$.@#%***==%%%%%&&&%%@.@$$***==%%&;*;;;%$#.@#%**-;;&&&=&;;=$#@.+@@#$%===;=%%$$#@++.++@@#$&&&&&==;;;$#@.@#$%;;;&%%%%%=;;;$$.++@@#$$%%*-*%%$$#@+..+++@##$$%%&**$#@++..@#$&&=;;;=;**&%%$#..++@#$$%%***%%$$#@+.+#$%;;;=&=;;;===;;$.@#$%;;;&&%$%&=;;;$$.@#%***==%%%==*-*$$@.", +"....................+@$%*-******-****$#.@@&=***-*-**-*===$#.@#$===**********&&#.@#$==;********-*=%#.@#$===*-*-******%#@.+@#&=;*-*-***==&#@+..++#$$&&===;;;;=$@@.@#&=--*-*%%%**-*-&&..+@@&==*-*--**==&#@...@@$%%&&=;;;;$#@+..+@#$***;;%&%--***&%..+@@&==-*---**==&#@.@#%=*-*;;;==-*;=*-&.@#&&*-***%%%**--*=&.@#$===*******===$#@.", +"....................+@#$**-*-*-**-***$#.@#%=-*-*******==&#@.@@#&==-******-**&%@.@@#&==*-*-*-**-*&&#.+@#&==*****-****$#@.+@#&=;**-*-**==&@@+..+@@$%&====;;;==#@@.@@&&*-***%%%***-*&&..+@#&=;**-*-**==&@@.++@#%%&&=;;;;;$@@++.+@#$***=;%%%-*-**&&.++@#&=;**-*-**==&@@.@#&=*-*;;=;=**=;**&.@#&=**-**%%%***-*&&.@@#&==**-*-*-==&#@+.", +"....................+@@#%%%&&&&&%&&%%##.@@$%%&&&%&&&&%%$##@.+@##$$%%&%&&%&%%$#@.+@##$$&%&&&&&&&%%#@.+@##$$&%&&&&%%%$#@@.+@#$%%&&&&&&&%%$@@+.+@#$%;;;;;;;;%$##@+.@#$%&&&&%$$$&&&&%%$..+@@$$%%&&&&&&%%$@@..+@#&==;;;;;%%#@++..+@##&%&%%$$$&%&&&$$..+@@$$%&%&&&&&%%$@@.+@$%&&&%%%%&&&%%&&%.@@$%&&&&&$$%&&&&%%$.+@##$$%&%&%&%%$##@+.", +".....................@@@$$%$%%%%%%%%$#@.+@#$$%%%%%%$%%##@@+.++@@##%%%%%%%$$$#@@.++@@#$$%%%%%$%%%$#@.++@@##%%%%%%%$$$@@+.++@$$%%%&&%%%$$#@+..+@#$%;;;;;*=;$$#@+..+@#$%&%%%$#$%%%%%$#..++@#$$%%%%%%%$$#@+..+@#&==;;;;;%$#@+....+@#%%%$$$##%%%%%$#.+.@@#$$%%%%%%%$$#@+.@@#$%%%%%%$%%%%%%%$.+@#$$%%%%$##%%%%%$#.+++###%%%%%%%##@@++.", +".....................++@##$$$$$$$$$$#@+.+@##$$$#$$$$$##@@++..++@@@#$$$$$$$##@@+..++@@@$$$$$$$$$$##@..++@@@#$$$$$$##@@++.++@##$$$%%%$$###@+..++#$%=;;;;;=&$#@+++.+@##$$%$##@@$$$$$##..++@###$$$$$$$###@+.++@@&==;;;;=$#@++...+++@$$$##@@##$%$$##...+@@##$$$$$$$###@+.+@@#$%$$#$#$$$##$$#.++##$$$$$#@#$$$$###..++@@##$$$$$##@@++..", +"......................+++@@@@@#@#@@@@++..++@@@@#@@@@@@+++......+@@@@@@@@@@@@++.....+++@@@@@@@@@@@++....+@@@@@@@@@@@@+....++@@@@@@@#@@@@++.+.++@@#$$$$$$$#@@++....++@#@@@@@@@@@@@@@+....++@@@@@#@@@@@++...+@@##$$$$$##@@.+.....++@@@@@+@@@@@#@@+....+@@@@@@#@@@@@++..++@@@@@@@@@@@#@@@@@..++@@@@@@@@@@@@@@@+....+.@@@@@@@@@++....", +".......................++++@+@@+@@++++....+++++@+@@++++.+........+++@+@@++++.+.....+.+++@+@@+@+++++......+++@+@++++.+.+..++++@@@@@@@@+++.....++@@@######@@++.....++++@@+++++@@+++++....+.++@+@+@+++++.....++@@#####@@+++.....++++@++++.+@+@++++.....+++@@+@@+++++...+.++@@@++++@++@@+++..++++@@++++++@+@+++....+.+++@++++.......", +"......................................................................................................................................................................................................................................++++++..........+.+++++++........+.++++++.................................................", +"....................................................................................+.+..+........................................................................................................................................++++@@@@++.+.........++@@@++........+.++@@@@++.+..............................................", +"....................................................................................+.++++.........................................................................................................................................+@@@$$#@@+........+++@#$$@@++......+.@@@$$@@@++..............................................", +".................................................................................+.+++@@@++++....................................................................................................................................++@@##%%#@@++........+@#$%$#@+........+@##%%##@@++.............................................", +"..................................................+..............................+.+@@@#@@+++....................................................................................................................................+@##$$%%##@.+......++@@$%%%#@@+.......+@@#%&$$##@++............................................", +".....+.+...+................+.++.+.+.+......+.+..+...................+.+..+.......+@#$$&&#@++.+.........++......+...........+..+..+...+...+.......+...+.....+.......+.++...+.+.+.......+..+.....+....+.......+.+.++.+.+.+.......+@@#====&#@++........+@#$***$#@+.......+@@#&====#@++............................................", +"..++++++++++++++........++++++++++++++.....++++++++++++++........++++++++++++.+.++@@$%%&=##@@+++......++++++..+.++++......+++++++++++++++++..++++++++.+.++++++..+.++++++++++++++....+.++++++++.+++++++.....+.++++++++++++.......+@#$=;;&&#@++.+......+@#$***$#@++.......+@#&&;;=$#@++...........................................", +"+++@@@@@@@@@@@+++++...++++@@@@@@@@@+@++...+++@@@@@@@@@@+++.....+.+++@@@@@@+@++...+@#%%&;;$$#@@+++.+.++@+@@+++++@@@@++++.+++@@@@@@+@+@@@@@@+..+++@@@@+++++@@@@@+..+++@@@@+@+@@@@@+++.+++@@@@+++++@@@@@++...+++@@@@@@@@@@@+++....++@#$***%$#@+........++@#%***%#@+.......++@#$%***$#@+............................................", +"++@@####$#####@@+++.+.++@@##########@@+.++@@@##@#@#####@@++....++@@@#######@@@+.++@#%&&;;%$$##@@++..@@@#@#@@@+@@@#@@@++.++@@#####@#@#####@@.+@@@###@@@@@@@##@#@.+@@#####@#@####@@++.@@@##@#@@@@@@##@@@@...+@@@####$####@@@+.....+@#%***%##@+........++@#%*-*$$@@.......+++##%***%#@++..........+.+..............................", +"+@#$$$%$$$%$$$##@@+..+@@##$$$%$%$%$$$#@.+@@#$$$$$$$$$$$##@+....+@@#$$$%$$$$$#@@.+@#$&&=;;%%%$$#@@++.@##$$$##@###$$$#@@+.+@#$$$$$$$#$$$$$$$#.+@##$$$$#####$$$$##.+@##$$$$$#$$$$$$#@+.@##$$$$##@##$$$$$#@.++@@#$$$%$%$%$$$#@@....++##$***%$@++........++##$***%#@++........@@#%***%#@+.........++.+++++++.+.+.....................", +"@#%&***;;***;;%%$@@.+@@$%%;;***;=***&&#.+@#&==**&&&**;;=#@+..+++#$$=;***;====#@.+@#$***-******%$#++.#&&***$$##$**===#@+.@#%&*****%%%*****&%.@#&&***==$$$=&***&&.@#$*****%%%*****$#@.#&&***=&$#$&=***&%#.++@#==;*******===#@...+.@#$%*-*%##++........++@$%***%#@@.........+@$$-*-$$#++.....++++@@@@+@++@++++.....................", +"@#&=***;;***;;&%%#@.+@#%%&;;***;;***&&#.@@#==;**==&**;;=$#@...@@#$%;;***;;;==$@.+@$%**-*-*****%$#@+.#&&***%%$$$**;==$@@.@#&=*****%&%*****=&.@#&=***==%$%==***=&.@#$*****%&%*****$#@.#&&***==$$$==***=&#..@##==;*******;==#@....+@#$%***%#@+..........@@#$***$$@++........@@#%***%$#@++....++@@@#@##@##@#@@+.....................", +"@#&=***;;***;;=&%$@.@#$%&&;;***;;***=&#.+@#==;**===**;;;$#@.++@#$%%;;***;;;;=$#.+@#%***-******%$#@..#&=***%%$$$**;;=$#@.@#&=*****&&&*****=&.@#&=***;=%%%;;***=&.@#$*****&&&*****$#@.#&=***==%%%==***=&#.++#$=;;*******;==#@....+@#%%-**%##++.........@@$%*-*%#@@.........+@#%*-*&%#@++..++@@##$$$$$$#$$###@.....................", +"@#$%***-*=&=;;***$#.@#$***;;=&=*-***%$#.@@#%%&*****=&;==$#@..+@#==;**==&;;;;;$@.+@#$==;;;=&&&%##@++.#%%***&%$$$&=;;;$#@.@#$%***==%&%;=***%$.@#%&*-*&&;;;&&***&%.@@$&&=**&&&**=&&$@@.#$%***==%%%=;***%$@.+@##;;;==;=;*-&&%#@...++@#=;***%#@+.........++@#$***$$@++.......+@@$$***;=##++...+@#%&&**===%%;;=##.....................", +"+@$%;;;==%%%%%***%$.#$%***&%%%%==;;;%$@.+@@$%&*-*-*&&===##+..+@#=;;**&=&;;;;=$#.+@@$&==;;=&%%%#@@+..#$%***&%$$$==;;;$#@.+#$%***==&%&==-**%$.@#%&***&&;;;=&-**%%.@@#%&=**&%&**=&%#@+.@#$&==**%%%**==&$#@..+@$=;;;===;*-&%%#@...+@@$==***$$@++........++@$%*-*%#@++........+@#%***;=##++..+@@$%&&**===%%;;;$#.....................", +"+@#$;;;==$%$%&*-*%$.@$%-*-%%%$%&=;;;%#@.++@#$%**&&%%$$$##@+.++@#%&&*****&=&&%#@.++@#%&=;;%%$##@@+.+.@#%;;;&%$$$&&;;;$#@.+@#$&==;;%%%;;==&$#.@##%;;;==--*&=;;;%$..@@#$$==***=&%$#@@+.+@$&&=**&%%**=&&##+.+@@#%%&&&--*==%$#@+....@@#=;***%#@+..........@@#$***$$@@........++##$***;=#@++..+@#$***==**-**;==$#.....................", +"+@#%;;;==%%%%&***%$.#$%***%%%%%=;;;;$#@.++@#$%**&&%$##@@@++.++@#%&=**-**=&&&%$@.++@#%&=;;%$##@@++.+.@$$;;;&%##$%&;;;%#@.++@$%&=;;%%%;;&&%$@.+@$$;;*==*-*==;;;$#..+@#$$&=*-*=&%##@++.+@@$%%*-=&=**&%$@@+..+@@$%%&&***=&$$#@+....+@#%%***%##+.+........@@$%*-*%#@@........++@$$***%%#@++..+@$%***==***-*;;=$@.....................", +"+@#%;;;-*=&=;;***$$.@$$***;;=&=*-;;;%#@..+@@#%**&%%##@@@++..++@#%&&*****==&&%##.++@#%&&;;%$##@@@++..@#%;;;&%$$$&&;;;$$@..@@#%&&;;%&%;;=&%#@.+@#%;;;==-*-=&*;;$$.++@@#%&=***=&$$@@+....+@#$==*--==$#@+....+@#$%%&&--*=&%##@+.....+@#%-**%#@++.........@@#$***$$@+.........@@#%*-*$$@++...+@#$-**==-****===#@.....................", +"+@#%;;;-*===;****$#.@#$***;;===-*;;;%#@..+@#$%**&%%##@@+++..++@#%%&&=;=;**;;=$#.++@@%&&;;%$$###@@@+.@#$;;;&&$$$&&;;;%#@..+@@$%%**&&%**%$#@@.+@#$;;;;;*****;;;$#..+@#$$==***==%##@++..++@#$==-*-==##@++...+@@$%%**;=;&%&%$@@....++##%***%##++.........+@$$*-*%##++........+##%***%#@++...+@@#%%%$$%%%&&%$$#@.....................", +"+@#%;;;;;***;=&%%#@.+@#%%&;;;;;;;;;;$$@.+@@#$%**&%%$#@@++....@##%&&&&;=;**;;;$#..+@@%%=;;%%$$$$##@+.@#%;;;&&%%%&&*;;%$@...+@#$%**&&&**$$@@+.+@#$;;;*;*****;;;$#.+@@#$%==-**==%$#@@+...+@@$&&*-*%%#@+....++@#$%&**=;=&%&%%#@....++@#$*-*$$@++........+@@#%***%#@+........+@@$$-**$$@@.....+@@$$$$$$$$$%$$#@+.....................", +"+@#%;;*;;***;=%$$@@.+@@$%%;;;;;;;;;;%#@.+@#%&&-*==&&%##@++...@@$;;;;;=====***%#..+@@$%&*-==&;;=&&#@.@#$;;;;;&&&;;***%%@..+++@#$==**-==$#@++.+@#$&==*-&&&--==&$@.+@#&&=**&&&**==&#@+..+@@#$==;;;$$@+++....+@$==;**=====;;=$@....++@$$***%##@+.........+@#%***$#@@+........+@$$**-$$@++....++@@@@@@#@##@@@@++.....................", +"+##%;;;&=%%%$$$#@@+..+@@#$$%%%&==*;;$$@.+@#&&=**==&&&$#@+++.+@#$;;;*;===;=--*%$..++@$%&**===;;==&#@.@@#=;;;;&==;;***%%#....+@#$==-**;=$#@+...+@#&&=-*&&&**=&&#@.+##&==**&&&**==&#@@.++@#$%=;;;=%##+.....+@##=;;-*====;;;;$#.....@@#$***%%@@++.......++@#$;;;%#@+.......++@#$%***$#@+......+++@@+@+@@@@@+++......................", +"+@$%;;;==%%$$#@@@++.+++@@@#$$%%&&;;;%##.@@$&&=*-===&&$$#++..++@$;;;;;=====*-*$#..++@#$%**===;;==&#@.+@#==;;*&=&;;***&$#...++@@$==***==#@@+..++@#%&&**%%&-*&&%#@.@@$===-*&%&**===$@@.+@#$%%;=;;;$#@++....++@$==;**====;;;=$#.....+@#%***%$#@++.......++@#$=;=$#@+.......++@#%%***$#@++.........+.+.+.+.+..+......................", +"@@$%;;;=&%$$#@@+++.....++@@#$$%==;;;%$@.@#$*****;;;**%$#@++.+@@#==;=;*****&&%$#...+@@#$&&***;;&%$@@.+@##$%;;***;;***&%@.....+@#$%;;;%$#@+....+@@$%%==%%$==%%$@@.@#$***;;&%&*****$#@.@##***-****$#@++....+@@#===*******===#@....++@@$***%%#@++........++@#===#@+++.....+.@@#%%***$#@+.......+.......+.+..........................", +"@#&=--***=&&#@++.......+.+@#%=&**-*-&&#.+##*****;;;**$$#++...+@#&&===*****%%%#@....+@@#%&***==%$$@+.++@##$=;***==***%%@.....++@#$;==$$@@++...++@#$%&&$#$&&%$$@+.+##***;=%%%*****##+.@#$***---**$#@+......+@#&==*******==&#@.....+@@#%%%==$#@++.......++@##$##@+.......++@##==&%%#@@+............................................", +"@@&&**-**=&%@@+.........++@#%&=**-**=%#.+@##$$$$$$$$##@@+.+.++@@##$$$$$$$$$#@@+...+++@@##$$$$###@@+..++@##$$$%$$$$$$##@.....++@@##$##@@+......+@@@#########@@++.+@##$$$$$##$$$$##@+.+@#%&&&&&&%$@@+.....++@@##$$%$%$$$$##@@......+@@$$%&&##@+.........++@@@@@+++.......+@##&&%$$@@+.............................................", +"@#$%&&&&&%$$@++..........++@$$%&&&&&%$@.++@@##$#$####@@++.....+@@@@########@@@......++@@@####@@@++....+++@@####$####@@+......++@@@#@@@+........++@@@@+@@@@@++++.++@@###@#@#@###@@@+.+@#$%%%&%%%#@+........+@@@######$###@@+.......+@@####@@+++........+.+@++++.........++@@####@@++.+...........................................", +"+@#$%%&&%$$#@+++.........++@#$$&%&&%$#@..++@@@@@@@@@@++.......+++@@@@@@@@@@++.+......+++@+@@@@+++.......++@@@@@@@@@@@++.......+++@+@++.+........+.+++++.+++++...+++@@@@@@+@@@@@@++..+@@$%%%%%$$@@++........++@@@@@@@@@@++++......++++@@@@@++...........+..++............++@@@@@+++..............................................", +"+@##%$%$%##@@+...........+++@##$%$$$$#@..+.++++++++++.+........+..++++@++.+.+.........+.++++++..+.......+..++++++++............+.+.+..................+...+......+..+.++.+.++.++.+....@@@@#@#@@@+..........+..++++++++++..........++.+++++...............................+++++++................................................", +"+++++++++++++++...............................+.++.+.+...............+..+................................+.+....+.+...........++.++..............+.+++++++++................................+.+.+................+..+...........................................................................+.+.............................", +"+++++++++++++++................................+++@+++..............++++++++...........................++++++.+.+++++.+........+@+++++...........++@@@@@@@+++.+...............+.........+.++++++++.+...........++.+++.........................................................................++++++++..............+..+........", +"+++++++$$+$$$@@+.............................+++@@@@@+++........++++@@@@@++++.......................++++@@@@@+@+@+@@@++.....+++@@@@@++........+++@@@######@@@++........+.++.+.+.........+.++@+@@++++........+.++++@+++++....................................................................+++++@@@+++++........++++++++++.....", +"@++++$$%%%%$$%$$+...........................+.+@##$##@++.......+.+@@@@###@@++........+.+....+.+.+....++@#####@@@@###@@+......+@##$#@@++......+.+@@#$$$$$$$$#@@+......+++++++++++.+.....++@@@@##@#@@++++......++@@@@@@@+++..................................................................+++@@#@#@#@@+++......+++@@@@@@++++...", +"@++$%%%===%$$%%%%...........................++@##===$#@++......++@@$$%%%%%#@@++...++++++++..++++++..++@#%%%%%$#$%%%%$#@....+++@#===$@@+......++@@#&&*****==&#@+....+.++@+@+@@@@+++...+++@@#$$%%%$$#@@++....+.+@#$$%%##@++................................................................+++@@#$$%%%$$#@@++...+.+@@@#####@@++...", +"@++%%=********=%%+............+.............+@@$$;;;$##@+++...+++##$%%&&%%##@+.....++@+@+++@+@+@+++.+@##&=&&%%$$%%&&%$@.....+@#$;;=$#@+.......@@#$==*****===#@@...+.++@@#@@@@@#@@+..+.+@##$%%%&%%$$$@@+.....+@@$$%%%%$#@++................................................................+@##$%%%&%%$$##@+....+@@#$$$$$$#@@+++.", +"##$%=**********=%$.........+..+...........+++@#%&***&%##@++...+@@$$*******%$#@+.+++@####@@@@@####@+.+@#%***-*%&&*-***$$.....+@#$***$#@++....++@$%%**====;;;;$#+...++@##$%&##$==#@++.++@@%%&*******&%%#@...+++@#&==&=**$@@++.........+...+..........+.+..+.++............................++@@%%&*******&%%#@....+@#==*****$$#@.+.", +"@##%=******-*-*=%$+.......+.+++++.+......+.@@#$&&-**&%$##++...+@#$%*******%%#@+..+@@$$$$$#$#$#%$$@+.+@$$-*-*-&%&-*--*%#....+@@#%***%#@+.....+@@$%&**=====;;;##@....++##$&&#$#==#@++.+@@#&&=*******=&&#@....+@#$==&=&**$#@+.......+.+.+.++++++++...++++++++++++++.+......................+@@#&&=*******=&%#@...+@@#==*****%$#@+..", +"@@$$**---*******%%+.......+.++@++++......++@#$$&&*-*&&%$#@+.+.+@#$%*****-*%$#@+..+@#$%%%$%$%$%%%$#@.+@#%*-**-&&&*-*-*%#.....+@$$*-*$$@@.....+@#$%&-*===;=;;;#@@....++#$$%&##$==#@++.+@#$&&=*******=&&$#..+++@#$=====**$#@++......++@+@++@+@++++.++++@@@@@@@@@@@@+++............+........+@#$&&=*******==&$#....@@#=;*****%$#@+..", +"+@#%*****-----**%$........+@@@##@+++....++@#%&=*****-*&%$@+..+@@%%&**&%%%%$##++.++##==;*******;==##.+@#$&&=**%&%**=&&$#....++@#%***%#@++....@@#&&=*-===%&&%%$@+...++@@##$$###$$#@+..@@$%***;;***;;***$$...+@#$$;;;;;**$$@++....+++@@#@#@@#@#@@+.++@####$#$#$###@@++.........+.+..+..+...+##%*****-**;;***%$...++@#%%%&&&&$##+++.", +"+@$$******----**%%+.....+.+@###$#@+++...++@#&&=*-****-%%$@@..+@#%&&**%%%%$$#@++.+@#$=;;*******;;=$#.++@#&&=**&%&**=&&#@....++@#%***%#@++....@#$&==*-===&%&&%#@+.....+@@@##@@#$#@@++.@#$%***;;*-*;;***%$...+@#$%=;;;;**%##++....+@@##$#$$#$$###@.+@##$$%$%$%$%$$$#@+...+++++++++++++++...@#$%********;;***%$....+@@$%%%%$%##@++..", +"+@#%***-**-*-***%$.......++@$%%%$@++....+@#$=;;==%%%;;&%$@+.++@#%%=;;%$$##@@++..++#$=;;;;===;;;;=$#..+@#$%%**===**%%$#@....++##$-**$$@+.....@#$***==***;;&%%#@+.....++@@@@@+@@@++...@#&=;;;-*===;;;===&..++@$%&;;&&&**%$#@+..++@@#%&===%%;=;%%@.@#$*************$#@...+++@@@@@@@@@@@++..@#&===;**===**====&.....+@@@#####@@++.+.", +".@#%************%+......++@@%%%&%#+++...+@#$;;;==%%%==%%$@+..+@#&&&;;&%$##@@+...+@#$=;;;;&&=;;;;=$#.+.+@#%%**===**%%#@@....++@#$***$#@@+....@$%***;=-*-;;&&%##+........++.++++++..+.@#&=;;;**===;;=;==&..+@@%%&;;=&=**%$#@+..+@@#$==;=;%%;;;&%#.@#$*************$$@.+++@@#####$####@@@+.@#&====-*===*-=;==&.....++@@@@@@++++....", +".@#%***-**-*-*-*%+.......+@@%&&%%#@+....+@#$;;;=&%%%==%$#@+.+@##&&=;;%%%$#@+++..+@#$;=;;;===;;;;;$#..++@#$%**===**%$$@+.....+@#$*-*%#@+.....@$%***=;**-;;&&%$@@...........+...+.....#$&=;;;-*===;;====&.+.@@$%&;;&&&-*%$#@+.+@@#$$==;;;&&;;;&%@.@#$*************%$@..+@##$$$%$$%$$$##@+.#$===;=**===**====&.........+++++++.....", +"+@#%*****----***%$.......+@#$$%%%#@++...+@#$;;;=&%$%%$$#@@+.+@#$***-****%%@++...+@#$;;;&&%&%==;;;$#..++@#$%=;---;;%$#@+....++@#$&&&$#@++....@#%**-;;===;;***%#@........+............@$=;=;;**%%%=====;=...+@$%%;;;;;;;&%$@+.+@#%&&**&&&;;;;;$$@.+@#%%&&&&&&=&***%$#.+@@&&=**********##+.@#=;===-*;;;;;===;=.....................", +".@$$****-*******%$......++@#$%%%%#@++...+@#%;;;&&%%%$%$#@@+.+@#$*-*-****&%@@++..+@#$;;;==%&%==;;;$#....@@#$;;*-*;;%$#@+.....+@#$&&&$#@+.....@#$***;;&=&;;-**%$@.....................##=;;;;**&&%&====;=.++@@$$%;;;;;;;%%$@+.@@$&==-*&=&;;;;;$#@.@@#$%%%%%%&&=***%$@.+@@&&=**********$#@.#$=====*-;*;;;===;=............+........", +"+##%*-*****--***%@.......+@#&====##++...+@#$=;;;;&&&==%$#@+.+@#$&&&*-==&$$#@++..+@#$;;;;;&=&;;;;=$#..+.@#$%==-*-==%$#@+.....+@#$;;;$#@++....+@@$%&;;-**;=-**%$@.....................@#%&**********;;;&%..++@$%&*******%%$@+.@#$***=;===*-&&%$#@.++@@####$#$$%***%$#.+@@$%%&&&&&&&&&%#@+.@#&&;;;-*===;;;;;&%.....................", +"+##%***---******%@......+@@$&====$@@++..++#$=;;;;&&&;;%%#@+..@@$%==**&=&%$#@@++.+@#$=;;;;===;;;;;$#...+@#$%=;*-*;=%$#@+....++@#$;;;$#@+.....+@##$%%%=&=*-;;;$#@.....................@#%&**-**-*-**;;;&%..++@#%%*******%%$@+.+#$***=====**&&%$@@..+++@@@@@##$%***%$@..@@$$%%%&&&&&%%$#@+.@#%&;;;**===;*;;;&%.....................", +"+##%*----***--**$#......+@#$**-*-$$@+...++@#==;;;==&;=%$#@+.+@@$%&=*-==&%$##@@+.+@#$=;;;;&==;;;;=$#...+@#$%==-*-=;%$#@+....++@#$;;;$#@++....+@##$%%%&&=*-;;;$#@.....................@#%%*********-;;;&%..++@#$%*******%$$@+.@#$**-=;===-*=&%$#@..++++++++@@#$***$$@..+@##$%%$%$%%$$$@@+.@#%&;;***===;;;*;&%.....................", +"@+$%**-*****-***%$......+@#%***-*%#@@....+@#$%%;;-*-;;%$#@+..@#$&==**%%%%$%$$@@..@@$==;*****-*;==$@...+@#$%=&-*-&&%$#@+.....+@$$***%#@+.....+@#&==&&%&%**=&&##+.....................+@#%=;;;;;;=*;;;=$#...+@#$$%&&=&&&$$@@+.@@#&&=**=&=;;;;;$#@......+++++@@#%%%$@@..++@@@@@######@@@+..+@#$=;;**===**;;=$#.....................", +"@+%%******-*****%$......+@$$***-*%##+...+++@#$%;;-*-;;$#@@+.+@#$&==-*&%%%%%%%#@.++@$===*******;==#@...+@#$%&&*-*=&%$#@+....++@#%***$$@@.+...+@$&==&&%%&**&&%#@+.....................+@##=;;;;;;;;;;;=$#..+.+@##%%&%&%$##@++.+@#%&&**=&=;;;;;$#@..........++@@$$$#@+..+.++@@@@@@+@@@++...+@#$==;**===**;==$#.....................", +"#+$%=**********=$$.....++@#%*-*-*%#@@.....+@@##%%***%$$@@+..+@$$*-**-********%#.++@#%%%%%%$%$%%%%#@..++@#%%**-*-**%%$@+.....+##$***%#@++....@@$==;&&%&%**&%$#@+.....................++@#$%&==***;;%%$#@...+++@@@######@@++..+@@#$%==;;;&&;;;&%#...........+@@@@@@++...+++.+.+.+++++.....++@#$%%==***=;%%$#@.....................", +"#+%%==********=%%#......@@#$***-*$$@++.....++@#$%*-*%$#@++..+@#%*-*-******-**$#.++@@$$%$$$#$#$$$$@@..++@$$&**--***%$$@+.....+@$%*-*$$@+.....@##;;;*******%$$@++.....................+++@#$%&=***==%$#@@....+.+@@@@@@@@+++.+..+@@#$&==;=&%;;;&%#............++@@+++........+.+......+....++@@#$%==***;=%$#@@.....................", +"@+$%%%%&&%%&&%%%##......+@#$*-*-*$#@++......+@@#$***$#@++...+@#$**-*-********$#...+@#####@#@#@$##@+...+@#$%***--**%$#@+....++@#$***%#@++....+@$=;;*-*****$$@@+.......................++@##$&&***=&$##@+.....++.+++@+++++.....++@@#&&===%%;;;%$@.............+.+.+.........................+@##$&=***=&$$#@+.....................", +"@++$$%%$$%%$$%$+#@......+@#$==;==$#@+........+@@#%%%##@+....+@#$%&&&&&&&=&&%%$@...++@@@@@+@++@@@+++..++@##$%&&&&&%$$#++....++@#$***$#@+.....+@#%%&==&&&%%##@++.........................++@##$$$$$##@@+.........++.+............+@@##$$#$#$#$##@...............+............................+@@@#$$$$$##@+++.....................", +"+#####$##$#$$###@+.....+++@#&&===$@@++.......++@#$%$#@+.+...++@#$%%%%&%&%&%%$#@.....++++++.++.+++.....++@##%%%%%%%##@++.....+@#$***$#@++....+@@$%%&&&&%$##@++........................+..++@@@####@@++...........................+@@@@@#@#@#@@@+.............................................++@@@####@@++.......................", +"+@@@@@@@@@@@@@@+++.......@@#&&=&&#@++........+.+@@@@@++......++@@##########@@@+...+......+......+......++@@@######@@++.....++@@$%%%$@@+.....++@#$$%%%%$$#@++............................+.+@@@@@@+@.+............................++@@@@+@+@@+++.............................................+++@@@+@@++++.......................", +".........................++@#####@@+...........+++@+++........++@@@@#@#@@@@@+++......+................+.++@@@@@@@@+++.+......+@#%%$#@+.......++@@@@#@#@@++...................................+..++.+..............................+....++++.++...................................................+++.++.........................", +"........................+.++@@#@@@+.............+.++..+.......+.++++++++@++++..............................++++++++.........+++@#$$@+++......+.+@@@@@@++++.+.................................+......................................+.....+........................................................+............................", +"......++++++++................................+++++++++..........++++++++..................+................................+++++@+@@@+@++.................................................+.++++...............................................++@@@@@@@+..........+@@@@@@++...........++@@#@#@@@++............................", +"....+++@@@@@+++...............+.............+++@@@@@@++........+++@@@@@@+++...............+.+................................+@@@@#@#@#@@@+..............................................++++@+@++.............++++.+...........................+@@##$##@+++........@@##$##@+++.....+...+@#$#$$##@@+++.++.......................", +"....+@@#$$$#@@++...........+..+.+...........+@@#$$$$#@@++......+@@#$$$$#@+++..........++++++++...........................+++@@@$$%%%%%%$$@@..............................................++@@###@@++.........+.+++@++++.........................+@$%===$$@++....+...@$%===$$@++..++++++.@$$=====%$#@+++.+++..........+.++.......", +"..++@@#$%%%$#@@+...........++++++.+.......++@@#$%%%%$@@++....+++@#$%%%$$#@+++..........+++@@@+++........................+.+@@##%%%%&%&%%%#@............................................+++@@$$%$@@+.........++@@@@@#@@+++.......................@@%%===%$@@+++.++++.@%%===%$@@++++++@@+.@$%=;;;=%%$@@+++@@@.........++++++++....", +"..++@#$$%&%%$#@@++.......+.+@@@@@++........+@#$%%&&%%##@++....+@#$%%&&%%$#@++.......+++@@@#@@@++.+......................++@##$%%&&&&&&&&%#@............................................++@##$%%%#@@+........++@##$#$##@@++......................@#%&;;;%%@@+.+++@+@.#%&;;;%%#@+++@@#@@@.@%%=;;;;%%$#@@@@@@@.......+.+@@@@@++....", +"+++@#$;;&=&;=$#@+.+.......+@@$$$@@++......++@#=;&&=;;%$#@++...@@#=;&==;=%$#+++.......+@@$$$&%@@.+.....+...+.............+@@$==;**---*-***$#..........................................+.+@#$&=*-*$#@++.....++@@#%&===%%#@+++.....................@@%%***&%#@+++@@@##.@%%***&%#@@@@#$$=&@.@&=&===;==&##@#$%&$........+@@###@@+....", +".+@@#$;;===;;$##@+......++@@#%$%#@@++......+@#=;===;;%$#@....++@#=;===;;%$$@+.......++@#%%%&&@@+......+++++.+..+++++....+@#$=;;***-*-****$#............................................+@##&=*-*$#@+......++@##&&;=;&&$#@++...........+.........@#%%***&%#@@@@@#$$$.#%&***&%#@@@#$$%=&#.#%&===;===&$##$$&&%........+@#===#@++...", +"++@$%&;;%%&;;%%$@++....+.@@#$***$#@++++....@@#%&&&&;;%$#@++...@@#%&&==**%$#@++.....++@#$=;;%$#@+.....++++@++++++++@+++..@@$%-*-&&**-;;=&&$@............................................++@#$%***$$@++....++@#$%;;%&&;;%$#@+...+.++++.+.++.+.....+##%;;;&%#@@@#%%&=&.##$;;;&%###$$===%%#.@$$&&=**&&%$$%&&==$.......++@#===#@++...", +"++@$%&;;&%&;;&%$@++..+.+@@#$$***%$#@@++...++@#%&%&&;;%##@.+...+@$%&===**%$#@++......+@#$;;=%$@+++...++@@#@#@@@@@@#@#@@+.@@$%-*-&=-**;;=&%##.........+++++..............................++@#$%*-*%#@++....++@$%%;;&&&;;%%$@+.+.+++++@++++++++....+@$$;;;&%$#@##&&&==.@$%;;;&&$##$%=;;&%#.@#%&==**&&&%$&&===$.......+@@$%&%##++...", +".@@$%&;;&%&;;&%$@+..+.@@@#$%%-**%$$#@@+....+@#%&&&&;;%$#++...+@@#%&&==**%%#@++.....++@#$=;=$#@++....+@##$$##@@@##$$##@+.@#$%*--&&*-**;&&%#@........+++++++++............................+@#$%***$$#++.....@@$%&;;%&&;;%%$@@.++@@@#@@@@@@@@+++...@@$%;;;&&$###$&&===.@#%;;;&&$$$%%;=;%%#.##$&==-*&&&%%&====#.......+@@$%&%$@++...", +".+@#$%;;=&=;;%$#@+..++@#$%%&&*-*&&&%$#@...++@#$%;;;&%$#@@+....+@#%%===;;&%$@++......+@#$$%%##@+.....@@%&=;=%$##$**&=&#@.+#$%-*-&=**-;;=&%#@......+.+@@@#@@++............................+@@$%*-*%##++...+.@@$%&;;&%&;;&%$@@.+@@$%$$#$$$$$#@@++..@@$%;;;&%%$$&&;=;%$.#$%;;;&&$%$;====$$#.#%=&&===;===&;;;%$#.......+@#$%&&$#@+...", +"++@@#$;;&&&;;$##@++.+@@#%&&&&-**=&&&%#@....@@#%&;;;&&$#@+++..++##%&===;;%%$@@.+.....++@#$$#@@+......@#&=;;;%%$#$**===##.@@$%--*==-**;;&&%#@.......+@@#$##@@++............................@##%***%$@@+....++@$%&;;%&&;;&%$@+.+@#%%&$$%$%%%$#@@++.@#$$*;;&&%%%&&;;=$$.@$%;;;&&%%%;;===%$#.#&&&&==;=;;&==;=%##.....++@@#$;;;$@@++..", +"..+@##$%&=&%$##@+...+@#$*****---*****$$...++##;;;;=;=%$#@+...+@@$**&==;;&%$@++......+++@@@@@++......@#$%***&%$$$&=;;;$#.+@#$=;;***-*;;=%%#@.....+++@$%=;=#@@+..........................++@#%&-*-&%#@+....++@$$%;;=&=;;&$$@+.+@#=;;;=&&&**%%$@@+.@#&=;;;;;===;;===%$.#==;;*;;;;;;;;;;=&#.@%%;;;;;===;;;==%#@......+@#$%;;;$#@+...", +"..++@#$$&%&$$@@++...+@#$*******-*****$#...+@@$=;===;;%$#+++..+@##**&&=;;%%#@++........++++++........@#%&***&%$$$==;;;$#.+@#$==;**-*-;;&&%#@......+@#%%;;;$#+++..........................+@#%&*-*&%#@++...++@#$&;;===;;%$#@+.@##;;;;;&&&**&&%#@@.@#&;;;;;;===;;;==%$.#&;;;;;;;;;;;;;;==$.@$%;;;;;===;;===%$@...+++@#$&=***$#@++..", +"...++@##%%%##@++....+@#$*****---*****$#....@@$=;=====%$#@.+...+@#**&&&;;%$#@++.........+.+.+........+#$%***&%$$$==;;;$#.+@@$==;***-**;&&%@@......+@#%%;;=$#@+.........+.++.+..........+.+@#%%*-*%%#@++...++@#$%;;=&=;;%$#@+.+##=;;;;==&-*&&&$#@.@#&&;;;;;;=;;;;==$$.#&=;;;;;;*;*;;;;==$.@$%;;;;;===;*===%$@....+@##$==***$#@++..", +"....++@@@@@@@++.+...++@#$$%%%***%%%$$#@...++@#%%&=&&&##@++...+@@#$%&&&%%##@+........................@@$%;;;&%$$$&=;;;$#..+@##$%&=***;;&%%#@....+.++#%&***$@@++........++++++...........+@@#%&%&&&%#@@.+...+@#$$==;;;=&%$@@+.+@#$%&**;=;==-**%$@.@@#$%%%&&;;;==***%$.@#$%%&=;=;===&&&**$.@@#$%%&&***==***%$@...+@##$%==-**$#@+...", +".....+++@@@+++......++@@##$%%*-*%%$##@@...++@@$%%&%%%#@+++....+@@#$%%&%$#@@++.......................+@#%;;;=%$$$%&;;;%#..++@@#$%&-*-;;=&%#@......+@@%%***##++.......+++@@@@@++.........+@@#%%%%%%%#@@+....+@@$%&==;===$$#@+.+@#$%%**;=;==***%%#.+@@#$$%&&;*;==-**%$.@#$$%%=;=;===&&&**#.+@@#$%%&***==-**%$#..++@#===;;&&%$#@@+..", +".......++.++..........+@@#$$%;;;%$##@++....++@@#####@@++.......+@@@##@#@@++.........................@@#%;;;&&%%%&=;;;%#....+@##%%**-;;&%%#@......++@##$###@+.........+@@####@+++........++@@@###@@@++....++@$%&*******&%$@+.+@#$%&;;;;;&=*-*&%#.++@#$$%;;=====***%$.@@$&==;;%%%%&;;;&%$.+@@##%;;=====***%$#..+@@$=;;;;%%%$#@@++.", +"........+.............+@@@#$%;;;%$#@@++....++++@@@@@@+++........+@@@@@@+++..........................+@#%;;;;;&&&;;***%$....++@#$%****;=%%@@.......++@@##@@+++.......+@##==&##@+.........+++@@@@@@@+++.....+@$$&**-*-**%%$@+.+@#$%%;;;;;=&*-*%%@.++@#$%%;;=====*-*&$.@##&&&;=%%$%%;;;&&#.++@#$%;;=====*-*%%@..+@#$=;;;;&%%$##@@+.", +"....................+.+@@##%%;;;%%##@++......+++++++++.............++++++...........................@@#$;*;;;&=&;;***%$..+.+@@#$%*-*;;=&%$@........+++@+@++.......+.+@#$=;=$#@@...........+++++++++......++@#%%*******%$$@+.+@#$%&;;;;;&=***%%#..+@#$%&;;=====***%%.@#$&==;=$$$%%*;;&%#.+@##%%;;=====***%%#..+@#$;;;==%%$&=$$#@.", +"....................+.+@$%%&&==&&%%$$@+.........+...................................................+@#%;;;;;&=&;;***%$...++@#$%&*-**;==&$@.........+.++.+.........+@#%&***%%#@++............++.....+....++@@##$$%$$$$##@++.+@$=;;;;=&&*-==&$#@..+@#&;;==;==;;*-*&%.@$%;;;%%$$$=;===&%#.+@#==;=====;;*-*&&#..+@#$;;;=&%%%==%$$@.", +".....................@@#%%&&&=&=&&%%$@@..........+..................................................@@#$;;;*****;;***=&..++@#$%&&*-*;;;==$#.......................++@#%&*-*&%#@+...........................++@@###$###@@+++.@@$;;;;;&&&**=&&$@@.+@@#==;&=====;***=&.@$$;;;%$$$%====&&%#.@@#==;&=&=&=;*-*&&#...@#$=;;;;&&&;;&%$@.", +"....................++@#%&&&=&=&&&&%%#@.............................................................+@#%;;**-***;;***&%..++@$%%**********$#........................+@#%&***&%#@++..........................+++@@@@@@@@@++...@@$=;;;;&&&**&%%#@+..@@#===&&=====-**&&.@$%===$$#$$=;===%%#.+@#===&&&&&==***=%#.+++#$=;;;;&&&;;&%$@.", +"....................+@#$*************$#.............................................................@@#$;;;=&%%%$$$$$##..++@$%&***-******%#.......................+@@$&=-**&%#@+.............................+.+++@+++.+....@@#%=&%%%%%&%$##@++.++@#$%%$$$$$%%***&%.@$$$%$###$$**===**#.+@#%%%$$#$$%%***&&#..++@#==;;;&&=;;&%%@.", +"....................++##*************##.............................................................+@#$;;;&&$$$#$###@@...+@#$%**********$#........................+@#==*-*&%@@++..............................+..+.+.......+@#%%%##$$$%$##@+++.++@@$$$##@##%%***&%.+#####@@##$**===**#.++@$$$#####$%***%%@..++@#$$%*******%$#@.", +".....................+@##$$$$%%$%$$$##@.............................................................+@@$;;;%%@@+++.+++....+@@##$$%%%$%$$##@........................+@#$%&&&$##+.+...........................................++@@@##@#@@#@@@+++....+@@@@@@@@@###$$#@.+@@@@@@+@@##$$$$$#@..+@@@@@+@@@###$$##@...++@#$$*******$##@.", +"....................+++@@##$####$###@@+.............................................................++@#%%%##@++............@@###########@@.......................+++@$$&&%$@@++.+..........................................+++@@@@+@+@@+++.......++@@++++++@@#@#@@..++@+++++@@@###@#@@.+.++@+++++@@@#@#@@@...++@@##$$$%$$$#@@+.", +"......................++@@@@@@@@@@@@@++.............................................................++@#$$%#@@+...........+.+++@@@@@#@@@@++........................++@##%%%@@++................................................+.++++++.++.+..........++++++++@@@@+...+.++...++@++@@@@+..+..+++...+++@@+@++.....++@@#######@@+..", +"......................+.++++@+@+++++++..............................................................+++@$$$@@.+...............+++@+++++++...........................++@@@@@@@+.................................................+......+.....................++..+..............+++...+.............+.+++........+.++@@@@@@@+++..", +"...++@@@@@@+.+.............++@@@@@@++........++@@@#@@++........+++++@@@@@+++........+.+..+.+..+........+.@@####@@+++...........+.++.+.+++.+.......+.+.+.+.++.......++@@@@@@++...............+@@@#@@++.........@@@##@@++........++++++++++++........++@@@@@+++.............+.++@@@@@@+++......++@####@@+++.........+..+..+.++....", +"...+@#$%&#@@++............++@##$&%#++.+....+.+@#$%&%#@++........+@@######@@++.+.....+.+++++++++........++@$%&&&##++..........+++@++@+@+++++.....+.+++@+@++++++.....+@@%&$##@++...........+++@@#%%##@++.....+++@#%%&##@++......+.++@@@@@@@@+++......+@##&&#@@+++...........+.+@@#&%##@++....+.+@#$===$#@+++......+.+++++++++++...", +"+.+@@#$&&$#@++..........+++@@$$%&&#@++......+@@$$&&&##@++.....++@@#$%$$$$#@@++....++++@@@+@+@++++.....++@#$%==&$#@++.......+++@@@@@#@@@@@@+.....+++@@@@@@@@@+++...++@#&&$$$@@++.+.......+.+@@##=&$##++.....++@@$&&&$$@@++.....++@@@##@@#@@@@++...+++##$&&##@@+.+..........++@@#$&&$#@+......+@#$$===%$#@+......++@+@@++@+@+++++.", +"..++##$==$$#@@++.........+@@#%%%&&@@+.....+++@#$%===$#@+++....+@@#$%%%%%%$#@+.+....+@@@@#@#@@@@++.....++@#%&===%#@++......+.+@#$$$$$$%$$$#@..++++@##$$$$$$###@+...++@#&=%%$#@@++.....+..++@@#$$==$##+++..+.+@##$===%$#@@+....++@@#&&$$$%&$$#@++...++##$==$$#@@++.........++@@#$$==$$#++...+++@#$%;;=%$#@@+...+.+@@@@#@@@@#@@@++.", +"...@@#$&==&&#@+........++@@$$=;;%$#@++...+.@@#$;;;;=&%@@+...+++@$%&*****;=$#@+...++@#$$&&##$&&@@++...++@@$&=&&&&%@@++.....++@#$%%%%&%%%%%$#..++@@##$%%%%%%$$$#@...+@##%%;;;$$@@++.+...+++@##&====$#@@+...++@@#&&=;;;;$#@+++..++@#$==%%%&=%$$@++...++@#$&===&#@@+++...+.+++@@#&&==&$#@++...++@#$;;===;;$#@++...+@#$$%%##$%%$$#@+.", +".++@@#$====&#@@+.....+.+@@#$%;;;%$@@.+...++@@$$;;;;;&%#@+.+..+@#$%&***-*;=$#@+....+@#$%&=$$$=&#@+....++@#$===&&%%@++......++@#%%&&&&&&&&%%#.++@##$%%&%&%&%%%$$#.+++@#$%%;;;%$##@@+..++@@@##$&===&$$@@++..+@@#$&=;;;;;$$#@++.+@@$%%==&&&==&%%#@+...+@##$====&$#@@+++..+.++@##$====&$#@@....+@@#$;;;==;;$##@+.+++@#%%&&%$$&&%$#@+.", +"+.+@$%%%&===$#@++.....++#$$&&&=&$#@++....++@$%&==&&&&%#@++..++@#%&=&==;=&%#@+++..+@@$%%==%%%%%#@++..++@$$%&==;=$$@+++.....+@@$***-******--$.+@@%%%**********==#.++@$$%&&====&%$$@++.++@#$%%&===&&%%$@@+.+@@$%%==&&&==&%%@@+.+@#$%&===&&==&&%#@@.+++@#%%%&;==%%$##++...++##$%&==;&%%$#@+.++@@$%&&=&&===&%$@+..+@@$%%==%&%==&%%@@.", +"++@@$%%&&;==$#@++...++@@#$%&===&%##+++...+@#%%&===&&&%#@+...++@#&&=&=;=;%%##+.+..+@@$%&==&&%&$#@++..+@@$%&&=;=;$$@@+......+@##***----***-*$.@@#%&&****-*-***;=$.@@#%%&=&=====&&%$#@.@@#%%&&&;=;&&&&%##@.@@$%&&;=&=&;==&&$#@.@##%&&====&;=&&&$#@..+@@$%%&&;=;&%%$#@+.+++@#$%%&;=;&&%$#@@..+@#%%&==&&&==&%%#@..+@#%&&==&&&==&%%#@.", +".+@#$%&&&=;=$$@@+.....@@$%%====&%$@@+...++@#%&&;===&&%#@++...@@#&&==&;=;%%#@++..++@#%%&==&&&&%#@+...+@#$%&===;=%$#+++.....+@#$==-**==%&%;;$.@#$***==%%%%%;;=;=$.@#$****-*****-*-$$@.@#$***-******-*-%#@.@#$****-*****-*-$$@.@#$***-******-*-%#@.++@#%%&&&;;=&&%%$@@..+@@$%%&&;=;&&%%$@@.++@#%&&==&=&;=&&%#@.++@#%&&==&&&==&&%#@.", +".+@#==;**---&%#@+...++@#&=;**-*-%%#@++...+@#&=;**-*-&%#@++...@@#==;*-*--&%$@++...+@#&=;*-*-*&%$@@.+.+@#==;**-*-&%#@++......@#$==*-*;=&%&;;$.@#$***=&%$$$%=====$.@#$*-*-*-*-**--*%$@.@#$****-***-*--*%$@.@#$*-**-*****-*-%$@.@$$****-*****--*%$@..+@@&==***-***==&#@..+@#&==**-*-**;=&#@..+@#&=;**-*-**;=&#@.++@#&=;**-*-**;==#@.", +"++@#&=;-**-*&%#@++...+@#&==-*-*-&&#@++..++@#==;**--*&%$#++..++@#==;*-*-*&%$@++..++@#==;**---&%$@++..+@#&==**--*&%#@+.....++@#$==-*-==&%&;;#.@$$***&&$###$===;=#.@#$%&&;;%%%%%***%$@.@#$%=&;;&%%&%***%$#.@##&&=;;&%&%%***%$@.+#$&&=;;&%&%&***%$#.++@#&==-*----*==&@@.++@@&=;***--**==&@@.++@#&==**-*-**==&#@..+@#==;**---**==&#@.", +"..@@#$%=;*-*==$#@++..++@#$%==**-==$#@+....@@#$%==*-*==$#@++...@@#$%==-**==$#@++..++##$%=;*-*==$#@++.++@#$%=;-*-=&$#@++....+@#$**;;;;;;;;%%#.@$%***%%###@#$%$%$#.+@#%&=;;&%%%%***$$@.+@#%&&;;&%%&%***$#@.+@#%&&;*%%%%&***$#@.+@#%&&;*%%%%&***%#@..++@#$%%%***%%%$#@+..+@@#$$%%***%%$$#@+..++@#$%%%*-*%%%$#@@.+++@##%%%***&%$$#@@.", +"..+@##%=;*-*==$#@++..++@@$$=;-**;=$#@++...+@@$%=;**-;=$#@++...+@##%==*-*==$#@+...++@#$%=;*-*==$#@++.+++@$%==*-*==$#@+.+.++@@$$**;;;=;;;=%$#.@$%*-*%$#@@@@#$$$$@.+@#%&=;;%%%;;=&&$#@.+@#%&=;;%%%;;==&$#@.+@#%&=;;&%%;;&&%$#@.@@#%&&;;&%%;;&&%$#@...@@@#$$%*-*%$$#@@+...+@@##%%*-*%%$#@@+..++@@##%%***%$$#@@+...+@@##%%*-*%%$#@@+.", +"..+@#$%**&&&-*%$#@+..++@#$%-*&=&-*%$#@+..++@#$%**&=&-*%$#@+.+++@#$%**&&&**%$#@+.++@@$%&**&&&-*%$#@+.++@#$%**&=&-*%$#@++..+@#$%**;;;;=;;;%$#.#$%***%$@+++@@####@.+@#%%&;;&%%;;=&&#@+.+@#%&&;;&%%;;&&&#@@.+@#%%&;;&%%;;&&%#@@.+@#%&&;;&%%;;&&%#@@....+@@#$%***%$#@@++....+@@#$%*-*%$#@@++..+.+@@#$%-*-%$#@@++..+.+@@#$%***%$#@@++.", +"++@#%%&**%&%**&%%#@..+@#%%&**%&%**&%%#@..+@@%%&**%&%**&%%#@..+@#%%&**&&&**&&%#@..+@#%%&**&&%**&%%#@.+@#%%&**&%&**&&%#@+.++@$%%;;;;;*-**-%$@.@$%***%$#@@+@@@@@@+.+@#%&=;;&&%;;&&%#@+.+@@%&=;;%&%;;=&%#@+.+@#%&=;;%&%;;&%%#@+.+@#%&=;;%&%;;&%%#@+.....+@##%*-*$$#@++......+@##%***$$#@++....+++@##%***$$@@+......++@#$$-**$$@@+...", +"++@#%&&**&%&**&&%#@.++@#%&&**&%&**&&%#@.+@@#%&&**&%&**&&%#@.++@#%&&**%%%**&&%#@.++@#%&&-*%%&**&&%#@.+@#%&=**%&%**&&%#@+.+@#%%&;;;;;-*-**%$@.@$%***%$$##@#####@@.+@@%&&-*;;;**%%##@+.+@#%&&--;;;**%$$#@+.+@@%%=*-;;;-*%$#@@+.+@@%%=*-;;;**%$#@@+.....++@$$*-*$$@++.......++@$$***$$@++.......++##$*-*%#@@........++@$$***%#@@....", +"+@@$=;;-*;;;-*;;=$#.+@@$=;;*-;;;-*;==$#.+@#$=;;-*;;;-*;;=$@.+@@$=;;-*;*;-*;==$#.+@#$=;;*-;;;-*;;=$#.@#$=;;*-;;;-*;==$#@.@@#==;*-***===&&$#@.@$$***&&$$#$$%%%%$@.+@#$&&**;=;**%%$#@@.+@#%&&**;=;**%%$#@+.+@#%&&**=;;**%%$#@@.+@#%&&**=;;**%%$#@@.....+@@$$***%#@@+.......+@@#%*-*%#@@+.......++@$%***%#@@........+@@#%*-*%#@@+...", +"+@#$==;-**;;-*;;=$#.+@#$=;;*-;;;-*;;=$#..@#$=;;***;;-*;;=$#.+@#$=;;*-;;;**;;=$#.+@#$=;;***;;-*;;=$#.@#$=;;***;;**;;=$#@.@#$==;***-*;==&&$$@.@#$***==%%$%%&=&&%#.+@#%&=**===**%%$$#@.+@#%&=**=;=-*%%$$#@.+@#%&=**===**%%$$#@.+@#%%=**===**%%$$#@.....++##%-**%$#++.+.....++#$$***%$#+++......+@@#%***%$@@++.......@##%***%$@+++..", +"+@#%;;;**;;;*-;;=$#.+@#%=;;*-;*;**;;;$$.+@#$;=;-*;;;*-;;;$#.+@#%=;;**;*;-*;;;$$.+@#%=;;*-;;***;;=%#.@#$=;;-*;;**-;;=%#@.@#$=;=-*-*-===&&$$#.+#$&==**;;;;;***%%@.+@#%&&**;=;*-&%%$$@.+@#%&&**===**&%%$$#.+@#%&&**;;=*-%%%$$@.+@#%&&**;=;*-&%%$$@....++@#$%***%##@@.+..+.++@#$%*-*$$#@++....+++@#$%-**%$#@+++...+++@#$%*-*%$#@+++.", +"@#$%***;;=;==;***%$.@#$%***;;===;;***%$.@#$%***;;=;=;=***%$.@#$%**-;;===;;***%$.@#$%***;;====;***%$.#$%***;;====;***%$#.#$%***&&=;=;=%&%==#.+@#%&&**;;;;;***&%@.@@$%&=;;%&%=&=====#.@@#%&=;;&&&====&==#.@@#%&=;;%&%====&==#.@@$%&=;;&%&&&==&==#..+++@##$%*-*%%##@++...++@##$%***%$##@++..+++@#$$%*-*%$##@++...++@##$%***%$$#@++.", +"@#$%*-*;====;;*-*%$.@#$%-*-=;====;-**%%.@#$%-*-=;===;=-**%%.@#$%***;=====;*-*%$.@#$%-*-=;===;=-**%$.#%%*-*;====;;*-*%$#.#$%***&&;=;=;%&%;=$.+@#%&&**;;*;;***%%@.@@$%&=;*%&%=&==&;=$.@#$%&=;;&%%&&=====$.@#$%&=;*%&%=&=====$.@@$&&=;;&%&=&=====$..++@#$$%%*-*%%$$#@+.+++@#$$%%-*-%%$$#@@...+@##$%%***%%$$#@+.+.@@#$$%%-*-%%$$#@+.", +"@#&=-*-;;&&&;;-*-=&.@#&=*-*;;&&&;;*-*=&.@#&=*-*;;%&&;;--*=&.@#&=-*-;;&&&;;*-*=&.@#&=*-*;;&&&;;*--=&.#&=-*-;;&&&;;*-*=&#.#&=*--==**-**;;;-*$..+@##%%&***;=&%$##@.@$$*****;;;;;***==$.@#$***-*;*;;;***;=$.@#$*****;;;;;***;=#.@#$***--;;;;;***;=#.++@@%&=;;-*-;;=&%@@..+@@%&=;;-*-;;=&%@+.++@#%&=;;---;;=&%@@..+@@%&=;;-*-;;&&%@@.", +"@#&=*-*;;&%&;;*-*=&.@#&=*-*;;&%&;;--*=&.@$&=*-*;;&&&;;*-*=&.@#&=-*-;;&%&;;-*-=&.@$&=*-*;;&%&;;-**=&.#&=*-*;;&%&;;-*-=&#.#&=-**;=-***-;*;*-$...++@#%&;;;=&$#@++..@#%***-*;*;*;***;=$.@$$****-;;;*;***;=$.@#%***-**;;*;***;=$.@$$*****;*;*;***;=$..+@#&&=;;---;;=&&#@..+@#&&=;;--*;;=&&#@..+@#%&=;;-*-;;==&#@..+@#%&=;;--*;;==&#@.", +"@#&&-*-;;%%&;;-*-=&.@#&=-*-;;%%&;;*-*=&.@#&=*--;;%%&;;*-*=&.@#&=**-;;%%&;;*-*=&.@#&=-*-;;%%&;;-*-=&.#&=**-;;%%&;;*-*=&#.#&=-*-==*-***;;;**$...++@#%&;;*=&#@@+...@#$***-*;;;;;-**==#.@$$*****;;;;;-**==$.@#$*****;;;;;***==#.@#$***-*;;;;;-**==#.++@#%==;;**-;;==%#@.++@#%==;;*--;;=&&#@.++@#&==;;*--;;=&%#@.++@#&==;;*--;;=&%#@.", +"@#$%&=&=&%%%&&=&&%%.@#$%&=&=&%%%&&=&&%%.@@$%&=&=&%%%&=&=&%$.@#$%&=&=&%%%&=&=&%$.@@$%&=&=&%%%&&=&&%%.#$%&==&=%%%&=&=&%%#.#$%&&&&&&========&#....@@#&=***%$#@+....@@$&&&=======&=&%%#.+@$&&==;======&&%%#.@##&&==========&%%#.@@$&&========&=&%%#..+@@%%&&==&==&%%%@@.+++#$%&==&====&%$#@..+@@$%&==&=&=&&%%@@..+@@$%&&=&===&&%%@@.", +"+@$$&%&&%$$$%%&&%$#.+@$$&%&&%$$$%%&&%$#.@@$$&%&&%#$$%&%&%$$.+@$$%&%&%$$$%&%&%$$.@@$$%&%&%$$$%&%&&$#.@$$%&%&%#$$%%%&%$$@.@$$%&&%%%&%&&=&=%%#....+@#&=***$$@@++...+@#%%&=&&&&&&&%&$$@.@@#%%&&&&&&%&&&%$$@.+@#%%&&=&&&&&%&&$$@.+@#%%&=&&&&&&&&&$$@..++@$$%&%&&%&&%%$@+...@@$$%%&&&%&%%$$@+...@@$$%%&&&&&%%$$@+...@@$$%%&&%&&%%%$@+.", +"+@@######@@#######@.+@@@#####@@#######@.+@@#######@#######@.+@@######@@@######@.+@@######@@#######@.@@#######@######@@@.+@######$#$##$####@...+++@##$$$#@@+.....++@###$#$####$###@@.++@###$#$#$######@@.++@######$#######@@.++@####$#########@@..+++@@####$####@@@+...+@@@####$#####@@+...+@@@######$###@@+...+@@####$#####@@@+.", +".++@@@@@@@@@@@@@@@@..++@@@@@@@@@@@@@@@@..++@@@@@@@@+@@#@@@+..++@@@@@@@@@@@@@@@+..++@@@@@@@@@@@@@@@+.++@@@@@@+@@@@#@@@++.++@@@@@@@@@@#@#@@@+....+++@@#@#@@++......++@@@@@@#@#@@@@@++..++@@@@#@#@#@#@@@++..++@@@##@@#@#@@@@++..++@@@@#@##@#@@@@++....+@@@@#@@#@@@@++...+.++@@@@@@#@@@@++..+..++@@@#@#@@@@@++...+.++@@@@@@#@@@@++..", +"..++++++++++++@+++...++++@+++++.+@++++...+.+++@++.+++++++++..+.++@+++++++@+++++..+.++@++++.+++@++++.+.++@+++++++++++++...+.++@+@+@@+@+@@++.......+@@@@@++.........+++@@@+@++@++++.+...+++@+++@++@++++.+...+++@+@@+@+@+++++....+++@+@+++++@+++++...+..++++@++@++++......++++@@++@++++.++...++.+++++@+@+++.+......+++@@@+@@++++.+.", +"....+..+...++..+........++@@@#@@@@@@++.....+++###@@++..............++@@#@@+++.......+++@####@+++.......+++@@#@@#@@@@++.......+..+.+..+...................................++.++.+.+.....++@@##@@+++.............++@@#@@+++.......+.@@####@+++.........+.++.+.+.+.............++@@##@+++......+......................+++++++......", +"..+++++++++++++.......+++@##$$$$###@@++....+@@#$###@@+............++@@#$##@+++......+@@#$$$##@++.......++@###$$#$##@@++......++++++++++..............................+.+++++++@+++.....+@@#$###@++...........+.+@@##$@@++.......++@#$$$##@+++......+.++++++++++...........+.+@@####@++......+++++.++.............+++@@@@++++....", +"+.++@@@@@@@@++++++...+.+@@%%===&%&&%@@+...++@#&&&&%#@++..........++@#$$==$#@+......++@#$=;=&%#@++.....++@#%%===&%&&%@@+....+++@@+@@@@++++..................+.........+++@@@@@##@@++..+.+@#&&&&%#@+++.........++@#$$==$#@++.....+@@#$;=;&%#@+.+......++@@@+@@@+++.+........++@#$$==$#@++.++++@@@@@+++.............+@@##$#@@+++...", +".@@@@#########@@+++..++@##&&=;=&&=&%#@+....+@#&===&##++..........+@@$$%;=$#@@......+@@$%;;;&%$@@++....+@@#&&;=;&&&&%#@+....+@@##@@###@@++.........+.......+..+....+++@@#@##$#$$#@@+....+@#&===&##+++......+.++@@$%%;=$#@++.....+@#$$;;;&%$@@+++..+++@@##@@###@@@++......+.+@@$%%;=$#@++..+@#@#@#@@@+++.........++@@#$$%%##@++...", +"+@##$$$$$$$$$###@@+..+@@#$&&;;;=&=&&#@+...++@#&====$#@+++.....+.++@#$%%;;$#@++....++@#$%;;;=&$#@+.+.+++@#$&&;;;&&=&&@@+...++@@$$$##$$##@@+....+++.++....+.++.+..+.+@@@##$$$$%%%$#@+..++@##&====$#@@++++..+.++@@#$%%;;%$#@++..+++@#%%;;;=&$#@@+.....@@@$$$##$$##@@++..+.+++@@#$%%;;%$#@+.+@@#$$$$##@@+++........++@$$%%%%$$#@@++.", +"+@%&=;;;;;;;==$$$@@.++@$$%;;;;;**&%$#@@...++@#$%=;=%$#@++.+.....+@#$;;;&%$#@++....++@$====&;=%$#@++..+@#$%;;;;;**&%$@@+...++@#==%%%==%$$@++..+.++@++++.++++++++..+@@#$%&;;;;;***$#@..++@#$$%;;=%%#@@+++..++@@##$;;;&%$#@@++..+@@#$=;&=&;;%%$@@+.+++@#$==%$%==%%$@@+..+++@@##$;;;&%$##@+.+@#==;;;&%%#@++.+....+++@#$;;***;=$#@++.", +"@@%&;;;;;;;;;;%%$#@.+@#$%&;=*;;**&%%#@@...++@#$%;;;&%#@@++....++@@#$;;;&&$#@++...++@@$=;&&=;;%%$@++..+@$$%=;;*;**%$$#++..++@##;;%%%=;%%$@@+..++@@@@@+++++@@@@@+.++@#$$&=;;;;;***$#@.++@@#$%%=;;&%$##@@+.++@@##$%;;;&&%$$@@+.++@#$$=;&=&;;&%%#@@.++@#$$;;%%%==&%%#@+.++@@@##$%;;;&&%$#@@.@#$;;;;;=&%$@@@++.....+@@$$;;*-*;;$$@@+.", +"@#$%***;;====;***$$.+@#%%&;;;;***&%%$#@..++@@#$%=;;%&$#@@++.+.+@@#$%;;;&&$$#@++..++@#$=;=&&;;&%$@@+..+@$%%;;;;;**&%$@@+..+@@#$;;&&&;;&%%@@+.+.@@$%%#@@@@@#%%$@@.@@#&==**===*****%$@.+@#$$%%%;;=&%%$$##@.+@##$$%%;;;&&%$$##@.+@##%%;;&&&;;%&%$#@.+@#$$%;;%%%;;&&&$#@.+@##$$%$%;;;=&%%$##.@@#==;**==&%$#@@++...+@@$%&**&&&**&%$@+.", +"@#%&***;====;=*-*%$.@#$;;;;;&%&==;;;&%#.++@##$&=;;;;=%$$@@+..+@@#$&=;;;=;%$$@@+.++@#$%==;;;;;%%$#@+.+@@#$%==;*;;;%%$#@+.++@#$%&=;;;;;%%%#@+.++@#%%%$#@@###%%%#@.@#$===**===**-**%$#.@@#==;;;%%%==;;;%%@.@@#=;;;;%&%==;;;&%@.+##=;;;;&%%==;;;&%@.@##=;;;;%%%==;;;&%#.@@%%==;;;&&&;;;;;&%.@##==;**==&&%$##@@+..+@@%%&**&&&**&%%@@.", +"@@%%***=;====;***%$.@#$;;;=;%&%;=;;;&%#.++@#$%&=;;;;;&%$##+.+@@$$$&=;*;;;%%%##+.+@##$%&=;*;;;&%%$@@.+@#$%%==;;;;;&%%##@.+@##$%==;;;;;&%%$#@..@##&&&$$$#$$%&&&#@.@#$=;;**===***-*%%#.@#$;;;;;%%%==;;;&%#.@#$;;;;;%%%==;;;&%#.@#$;;;;;%%%==;;;&%#.@#$;;;;;%%%==;;;&%#.@#%&;;;;;&&&;;;;;&%.+##===-*===&%%$$#@@...@#$&&**&&&**&%%#@.", +"@#$%;;;=&%%%%%;;;=&.@#$*****&&&==-**&%#.+@#&==**===;=***%#@.+@#&==**====;***%#@.@@#==;;;====;***$$@.@@#==;;;;===;***%#@.@@#==;;;====;***$#@.++#$***;=%$%=;***$@.@#%***&&=&&;;;;;=&#.@#$***;=%%%&=***&%#.@#$***;=%$%&=***&%#.@#$***;=%$%&=-**&%#.@#$***;=%$$&=-**&%#.@#%&**-;;%%%;;-**&%.+@#%&=*-*****;;=%#@.++@#%%&;;&&&-*=&%@@.", +"@#$%;*;&=%%%%%*;;==.@#$***-*&&&&=*-*&%#.@#$&=;**====;***%$#.@@$==;**===;=***%$#.@#$=;;;;====;*-*%$#.@#$=;;;;===;=-**%$#.@#$=;;;;===;=-**%$#.+@#$***;;%%%=;***#@.@$%**-&&&=&;=*;;==$.@#%***;=$$$%&-**&%#.@#$***;=%$$%&*-*&%#.@#%***;=%$$%&***&%#.@#%***;=$$$&&**-&%#.@@%%*--=;%%%;=-*-%%.@@#%&&-*-**-*;;;%$#..++#%&=;;&=&-*&&%#@.", +"@#%=*****=&&%%&==;=.@#%***-*&&&&=***&%#.@#$=;=**=&&;=*-*%$#.@#$=;=**&&&=;*-*%$#.@#$=;;;;&&===***%$#.@#$=;;;;&&&;=***%$#.@#$=;;;;&=&=;*-*%$#..+@#$%%**;;;**%%$#@.@$%***&&;;;&&===;=$.@#$***==$$$%&*-*&%#.@#%***==$$$&&***&%#.@#$***==$$$&&*-*&%#.@#$***==$$$%&***&%#.+@#%=;;;=&%%;=;;;$#.+@#%&&;;%%%%&;=;==#..+@@%&&;******&&%#@.", +"@#&&-*-**=&&$%&==;=.@#%;;;;;;=;%&*-*%%@.@$%***&&$$$%%;;;=&#.@$$***&&%$%$%;;;=&#.@$%***=&%$%%%;;;=&#.@$%***=&%$$%%;;;=&#.@$%***==%$$%%;;;=&#.++@#$%&*-;;;-*&%$#@.#$%***%%;;;=&===;=$.@$%;;;=&$#$$%***%%#.@#%;;;=%$##$%***%$#.@#%;;;&&$##$%***&%#.@#%;;;=&$#$$%***%%#.+@#$==;;=&%%;;;;;$#.+@#%%=;;%%%%%;=;;=$..+@#%&=;;***-*=&%$@.", +"@#&&**-**=&&$$&=&;=.@#%;;;;;=;;&%***%$#.@#%*-*&%$$$$%;;;==$.@$%***&%$#$$%;;;==$.@$%*-*&&$$#$%;;;==$.@$%*-*&&$$$$%;;;==$.@$%*-*&%$$#$%;;;==$..++@#$%***;;-*%$$@+.#$%***&%;;;&&===;=$.@#%;;;&%$##$%***%$#.@#$;;;&&$##$%***%$#.@#%;;;&%$##$%***%$#.@#%;;;&%$##$%***%$#..+@#%%%**==&**&%$##.+@#%&&;;&%%%%=;=;=$..+@@%%&;;****-&&&$#.", +"@#%&***;=%%%$$&&=;=.@#$;;;==***%&***%$#.#$%***%$##@#$===;=$.@$%***%$####$===;=$.@$%***%$####$===;=$.@$%***%$##@#$===;=$.@$%***%$####$&==;=$...@@#$%=;*-*;=%$#@@.#$%***&%;;;%&===;=$.@#%;;;&%##@#%***%$@.@#%;;;&%####%***%$@.@#%;;;&%##@$%***%$#.@#%;;;&%#@##%***%$@.++@#$%%**=&=**%%$@@.+@@%&=;;%%$%%===;=$..+@#%&=;;&%%==***%#.", +"@#%&***;=&%$$$===;=.@#%;;;=&*;;&=***%$@.#$%***%##@@#$&=&;=$.@$%***%$@@@#$&=&;=$.#$%***%$#@@#$&==;=$.#$%***$$#@@#$&=&;=$.#$%***%##@@#$&&=;=$.+.@@#$%==--*==%$#@+.#$%*-*%&;;;%%===;=$.@#$;;;&%###$$***%$#.@#$;;;=%###$$***%$#.@#$;;;&&####%***%$@.@#$;;;=%$###%***%$#..++@#$%**&=&**%$#@+.+@#%%=;;&%%%%;==;=$..+@#%&&;;&%%==***%$.", +"+##%;;;&&$$$$$&====.@#%;;;==;;*&=***%%@.#$%***%%#@##$=;;==$.#$%*-*%%##@#$=;;==$.@$%*-*%$#@##$==;==$.@$%-**%$#@##$=;;==$.@$%***%%#@##$=;;==$..+@#%&&**;;;**&%%#@.@$%*-*;;&&&&%;;;==$.@#%;;;&%$##$%***%$@.@#%;;;&%$##$%***%$@.@#%;;;&%$##$%***%%@.@#%;;;&%###$%***%$@...++##$==*--==$#@++.+@#%&=*-;;;;;***&%#..+@@%&=;;%%%%%***%$.", +"+##%;;;=&%$#$%=====.@#%;;*&&=&=;****%%@.#$%-*-%%$##$%=;;==$.@$%***%%#$#$%=;;==#.@$%***&%$##$%;;;==#.@$%**-&%$##$%=;;==$.#$%***%%$##$%=;;==$.++@#%%&*-==;-*&&%#@.#$%***;;==&%%;;;==$.@#$;;;&%$$#$%*-*%$@.@#$;;;&%$#$$%***%$@.@#$;;;&%$#$$%***%$@.@#$;;;&%$$#$%***%$@...++@#$=;-*-==$#@++.+@#%%=**;;;;;-**&%#..+@#%&&;;%%%%%***%$.", +"@@$%;;;&&%$$$%=;==&.@#%;;;&&&==;;***%$#.@$%***&%$$$$%;;;==#.@$%*-*&%$$$$%;;;==$.@$%-**&%$$$$%=;;==$.@#%***&%$$$$%;;;==#.@$%*-*&%$$$$$;;;==#..@@#%&=**=;=**&&%#@.@$%*-*;;&=&&%;;;==#.@#$;;;&&$$$%%***%$@.@#$;;;&%%$$$%***%$@.@#$;;;&&$$$$%***%$@.@#$;;;&&$$$%%***%$@....++##$%*-*%$$@+++.+@#%&&-**;;;;***%%#.+@@#%&=;;%%%%%***%$.", +"@##%*-*==%&%&&***%%.@#%***==%%%;;--*%$#.@#$=;;;;&%&&&***%$#.@#$;;;;;&%&&&***%$#.@#$=;;;;&%&&&***%$#.@#$=;;;;&%&&&***%%#.@#$=;;;;&%&&&***%$#.+@#$***==%%%==***$@.@#$;;;*-&&&&&***%$#.+#$&==;;%%%&&***$$@.+#$&==;;%%&&&*-*$$@.+#$&==;;%&%&&***%#@.+#$&==;;%%%&&***$$@....+@#$%&***&%$#@++.@#$&==**;;===%%%##@.+@#$&==;;=====***%$.", +"@#$%***==&&&&&-**%$.##$***==%&&;;-*-%$@.@#$===;;&&&&&***%$#.@#$=;;;;&&&&&***%$@.@@#==;=;&&&&&-**%$@.@#$===;;&&&&&***%$@.@@$==;;;&&&&=***%$#..@#$***&%$$$&&***#@.@#%;;;**&=&==-**%$#.+@#&==;;&&&&=***$#@.+@#&==;;&%&&=***$#@.+@#&==;;%&&&=***$#@.+@#&==;;&&&&=***$#@.+.+@@#$&&-*-&%$#@@+.@@$&&=-*=====%$##@+.+@@$&&;;;=====-**%$.", +"@#&=*-******-*==&$#.@$%**-**&%%==***%$#.+@#$%%;;*****=&%$#@.+@#$%%;;****-=&&$#@.+@#$%%;;*****&&&$#@.+@#$%%;;*****&&%$#@.+@#$%%=;*****=&&$#@..+@#$%%$$####$%%$##.@#$=;;;;*****=&&$#@.+@#$%%****-**===$#@.+@#$%%***-**-===$#@.+@#$%%****-**===$#@.+@#$%%****-*-===$#@...+@$$&****-**%%$++.@$%****-=;=$$##@@++.+@$%**-*-==&*****$$.", +"@#==***-****-*&&&#@.@#%*****%%%&=***%$@..@@$$%==-*-**&&%#@+.+@@$$%=;*-***=&&#@@.+@##$%=;**-**&%%#@@.++@$$%=;*-*-*&&%#@@.+@@#$%=;**-**=&&#@@.++@#$$$#@@@@##$$$@@.@@$===*;*-***=&&#@+.++@#$%*****-*==&#@@.++@#$%*******=&&#@+.++@#$%**-***-==&#@@.++@#$%**-****==&#@+.+.+@$%%**-**-*%%$@+.@#%**-**==&$#@@@++..+@#%*****&==-****$#.", +"@#&=*****-***-&%%#@.@#$***-*%$$&&***$#@.++@##$==*****%%$#@+..+@##$==*****&%%#@+..+@##$==*****&%$#@+.++@##$==*****%%$#@+..+@#$$==*****&%%#@+.+++@###@@+++@@###@+.@@#===;;*****&%%#@+.++@##$*******=&&#@+.++@##%***-***=&&#@+.++@##$*******=&&#@+.++@##$*****-*=&&#@+...+@#%%*******%$$@+.@#$*****=&&#@@+.....+@#$*****&&&*****##.", +"@@#$$%$%$%$%$$$##@+.@##$$$$$$###$$$$#@@...+@@#$$$$$$$$#@@++..++@@##$$%$$$$#@@++...+@@##$$$%$$##@@+....+@@##$$%$$$$#@@+...++@@##$$%$$$$#@@+....++@@@+++++++@@@++.+@#%&&%%%$%$$$#@@++...+@##$$%$%$$$##@++...+@@#$$$%$%$$##@@+...+@##$$$$%$$$##@++...+@##$$$%$$$$##@@+...++@##$$%$%$$$#@++.@@#$$%$$$##@@+.+....+@@#$$$%$$$$$$$$##@.", +"+@@######$#####@@++.+@@#####@@@@@##@@@+....+@@@##$###@@@+.+...++@@########@@@......+@@#######@@@++.....++@#######@@@++.....+@@########@@@+.....+.+++....+++++.+.+@@%%%########@@@+....++@@@#######@@@+....++@@########@@++....++@@####$###@@@+....+++@####$###@@++....+++@@#######@@@++.+@@@#####@@@++.......+@@############@@+.", +".++@@@@#@@@#@@@@++...++@@@@@@+@+@@@@++......++@@@@@@@@++.+......+++@@@@@@@++.+......++@@@@@@@@++.......++++@@@@@@@++........+++@@@@@@@++........+............+..++@@@@###@@@@@+++.......+@@@@@@@@@@++.......++@@@@@@@@@++.......++@@@@@@@@@++.......++@@@@@@@@@++.......++@@@#@@@@@++....+@@@@@@@@++.........+++@@@@@@@@@@@@@++.", +"...++++++@++++...+...+.++++++.+.+.+++.........++++++++...........+.++++++++............++@++++...........+.+++++++...........+.+++++++++..+.......................+@@@+++@+++++...........++@+@+++..+........++++@+++++.+........+++++++++..+.......+.+++++++++.+......+.++++++@++..+......+++++++............+.+++++++++++++...", +"....++++++..................+.++++.+............+++.+....................+...............................+++++++++..................................................+.+++++...................+++++.+..........++.++.+...............................+.+++....................+++++.+..........++.+++.+.........................", +"....++++++++................+++++++..........+++++++.+............++..+.+.................................++@@@@+++................................................++++++++.+...............+.+++++++.+.......+.+@+++++...........+................+++@++++++...............+.+++++++..........+++++++..........................", +"..+.+@@@@@+++............++++@@@@@+++........+@@@@@@+++........++.++@+@++++...........+.++..+............+@@####@++.................................................+@@@@@@+................+++@@@@@++........++@@@@@+++..........+..++.+...........++@@@@++................+++@@@@@++......++++@@@@@++..........+.+.+.++.......", +"...+@##%%#@@++............++###%%@++.......++@@@%%%@@+..........++@@@@@@#@+++......++++++++++++........+++@$%&&&#@++..............................................++@##%%@@@+............+..++@#%%##@++......++@#$%%@@++.......+++++++.++++.+.....++@##%%@@@+............+..++@#%%##@++.......@@#%$%@@++........+.++++++++.+....", +".+++@#$%&##@+++........+++@@#$$%%@@++......++@#$%%%#@@+......+++@@#$$#$#$#@@++...+.+++@+++++++++........+@@$%==&##@++.............................................++@#$%&##@@++............+@@##&%$#@++......+@@#%%%$#@+++...+.+++@++++++++++.....++@#$&&##@@+.............+@@##&%$#@++....+++@##&%%#@@++.....+.+++@+++++@++....", +"...@@#$&&$$#@++..........@@#$%%&&#@+......++@#$$&&&$#@+++.....+@@##$%$%$$$#@+++.+.++@@@#@@#@@@+.+.......+@#%%===$#@+........+.+.+...+.+.+............+.+.+.+......++##$&&$$#@+++.........+++@@$$&&$##+.....+++@#$&&&$##@+.....++@@@@@@@@@@@++......@@#$&&$$#@++..........+++@##$&&$#@++.....+@#$$&&&$#@++......++@@@#@@@@@@+++..", +"...+@#$===&&#@++......+++@#$=;;%$@@++.....+@@#=;;;;%%@@+.....++@$%&*****;=$#@+..+++##$%%###%%@@+.......++@#&=&&%%%@++.+..+.+++++++++++++........++++++++++++.+....++@##===&&#@+++.........+@#%&&==$@@+......+@#%&;;;;=#@@+..+++##$%%###%%##@++.....+@##===&&#@+..........++@#%&&==$#@++...++@@#=;;;;%$@@++...++@@$$%%###%%@@.+..", +"..++@@#====&#@@+.....+.+@#$%;;;%%#@+....+++@#$;;;;;&%#@++....+@@%%&*****;;$$@++..+@#$$&&$$$&&#@++.....++@@$&=&&&%%@@++..+.++@+@+@++@+@+@+++....++++@@@@@@+@+++.....+@##====&$#@+++......++@##&&&;=$#@++....+@@#%=;;;==$#@++..+@#$$&&$$$&%$##@++...++@@$&==&&#@@+........++@##%&===#@++.....+@#$;;;;;&%#@+.....+@##$&&$$$&&@@+...", +"..++@#$%%===$#@++....++@@#%%=&&%#@@++....+@#$%&=&&&=&#@++....+@#%&=&&;;=&&$#@++..+@#$%%&%%%&%#@++......+@#$&&=;=$$@@....++@@#####@@#####@@+.++++@@#########@@++...++@#$%%===$$#@++....++@@@$$==;%%##@+...+++@#$==&=&=&%$#@+.++@#$$&&%%%&&%$#@++....+@@$%%==&$@@+........+@@$%===%$#@++...++@#$%&=&&&&%@@++....+@#$%%&%%%%%#@++..", +".++@@#$%%;;=$$@@++....@@#$%&==&%$#@+....++@$$%&=&&&=&$#@+...++@#%&=&&=;;&%$#@+..+@@$%%&=&&&&&$@@+....++@##$&==;=%$#@++..+@@#$$$$$$$$$$$$#@@..+@@@#$$%$%%$$$$@@+..++@@#$%%;;=%%##@@+...+@@##%%==;%%$##@+...+@##$==&&&=&%$$@+..@@#$%&&%%%&&%$$@++...++@#$%&==&$#@+......++@@#$%=;=$$@@+.....++#$%==&&&&%#@+....++@#$%&=&&&&%#@+...", +".++@#$%%&=;=%$#@@+..++@#$%&&===%$#@@++..+@@$%&==&&&==$#@++..++@$&&=&==;==&$#@++.+@#$%%==&&&&&$#@++...+@@#$%==;=;%$##+++.+@#$%%%%$%$%%%%%$#@.+@@#$$%%%%%%%%%$##+..+@@#$%%&=;=&%$$#@@.++@@#$$%&;=;&%%$#@@..+@@#$%===&&==%%$#@.+@#$%%==&&&=&%%$#@+...++@#$%&===$#@+.......+@#$%%=;=$#@++.....+@#$%&=&&&&%#@+....++@#$%=&&&%&%#@+...", +"++@#&==-**-*;;$#@++.+@#&&=*-***;;$#@+.+.+@#&==*-***;;$#@+++.+@@#===*-*-*;;$#@++.+@#&==**-**;;$#@++..++@#&==**-**;;$#@++.@#$***-*;;;**-**=&#.+@#&&&****-***-*%#@.++@#&&=*******=&&#@..+@#&&=***-***==&#@.++@#&==****-**==&#@.@@#&==***-***==&#@@..+.@$$%-**-*$#@++....++@#$%**-**%$@@.....++@$%&*-*-*%$@+++...++@$%%-**-*%$@@++..", +"++@#&==*-*-*;;$$@@+.+@#&=;*-*-*;;%##@+..@@#===-*--*;;%$#@+...@@#==;*-*-*;;%$#@+.+@#==;-*-*-;;%$#@+...+@#&==-*-*-;;$$#@+.@#$***-*;;;***-*==$.@#$&==*--*-**-**%$@.+@#$&==*--*-**===$#.+@#$&==*-*-*-*==&$#.+@#$&==-*-*-*-===$#.@#$&==-*-*--*===$#@..+++#$%*-*-*%#@++.....++$$%**-*-$#@@......+@#$%*-*-*$$#++....++@$%%*-*-*$$@@.+..", +".@@#&&=&&&&&**&%$@+.+##&&=&&&&&**&%$@++.@@#&&=&&&&&**&%$@++.++##%&&&&&&&**&%$@+.+##&&=&&&&&**&%$@++.++@#&==&&&&&**&%$@+.@#$&====--*=&&&&**$.@#%***==%%%==---%$#.+@#$**-==&%&=;***%#.+@#%***==%&%==***%#.+@#$***=;%&%;=***%$.@#%***==%&%;=-**%$@....@@#$%%***$$@+......++@#$%%***%$@++.....+@@#$%%***%#@++.....++@#$%%***$$@++...", +"++##&==&=&&&**&%%@@.+@$&&=&&&&&**&%%@@..+##&==&&&&&**&%%@@+.++@$%&=&&&&&**&%%@@.+@$&&=&&&&&-*&%%@@+.+@@$&&=&&&&&**&%%@@.@#$&==&=**-&&&&&-*$.@$%***=&$$$&&*--%$@.+@#%***;=&%&==-**%$.@@$%*-*==%&%==-**%$.+@#%**-==&%&=;*-*%$.@$%*-*;=&%&==***%##...++@@#$%*-*%#@@......+++@#$%*-*$#@++......+@@#$%*-*%##+......++@@#%%*-*%#@@....", +"+@@$&&=&&&&&**&&%#@.@##&===&&&&**&%%#@+.@##&&=&&&&&**&&%#@+.++##&&&=&&&&**&&%#@.@##&&==&&&&**&&%#@+.++##&&==&&&&**&%%#@.@#%&&==&--*=&&&&*-$.@$%***%%###$$&&&$#@.+##%*-*==%&%;=***%$.@#$%**-==&%&==-**%$.+##%***;=&%&==***%$.#$%**-==&%&=;-**%$@.....+@#$%***$$@++......++@#$%***%$@@......+++@#$%***$$@++.......+@@$%***$$@+....", +"+@#$===**-*---&%%@@.@#$&==**-*---&&%@@+.@#$&=;**-*---&%%@@+.+@#$&==*-*----&%%@@.@#$===*-**---&%%@@+.+@#$===**-*---&&%@@.#$%;;;*-**-;;;;;-*%.#$%***%$$##$$&&%$#@.@@$%*-*;;;;;;;--*%$.@@$%-**;;;;;;;*-*%$.+@$%--*;;;;;;;-**%$.@$%-*-;;;;;;;*-*%$@....++@##%*-*%##++......++@@$%***$$@++.+....++@##%*-*%##++......++@##%*-*%##++...", +"+@#$==;*-*-**-&&%#@.@#$===*-*-**-&&%#@+.@#$===*-*-**-&&%#@+.+@#$=;=**-***-&&%#@.@#$===**-***-&&%#@+.+@#$===-*-**-*&&%#@.#$&;;;-*--*;;;;;-*%.@$%*-*&&%%$%$%%%%$#.@#$%-*-;;;;;;;*-*%$.@#$%*--;;*;;;;*-*%$.@#$%**-;;;;;;;--*%$.#$%*-*;;;;;;;*-*%$@.....+@@$%***$$@@++......+@@#%*-*%##@++......+@@$%***$$@@++......+@@$%***%$@@++..", +"+@$%**-&&%&&;;=&%#@.@$%*-*&&%&%;;=%%#@+.@$%**-&&%&%;;&&%#@+.+@$%**-&&%&&;;=&%#@.@$%**-&&%&&;;=&%#@+.+@$%**-&&%&%;;=%%#@.$=;;;;%&*--=;=====$.@#$==;**=;=;;***&&@.@@$%-*-;;=====;==%$.+#$%-*-;;=;=;=;==%$.@#$%--*;;=====;==%$.#$%-*-;;====;=;=%$#...+++@#$%*-*%$#@+++....++@#$$***%$#@++....+++@#$%*-*%$#@++...++++@#$%*-*$$#@+++.", +"@@$%***&&&%&;;&&%#@.@$%*-*&&%&&;;=&%$@+.@$%***&&&%&*;&&%#@+.@@$%***&&&%&;;&&%#@.@$%***&&&%&;;&&%#@+.@@$%***&&%&&;;=&%#@.#==;=;&%*-*;;=;=;=$.+@#=;=-*;;;;;***=&#.+#$%*--;;;;=;=;;=%$.+#$%*-*;;;====;;=%$.@@$%-*-;;=;;=;=;=%$.@$%--*;;;=;=;=;=%$@...++@##$%***%$##@++...++@#$$%-**%$##@++...++@##$%***%$##@++...++@##$%***%$##@++.", +"+@$%**-%&%&&;;=&&$#.#$%***&&%&%;;=&%$#@.@$%*-*&&%&%;;=&&$#+.@@$%*-*&%&%&;;=&&$#.@$%*-*&%&%&;;=&&$#+.+@$%**-%&%&&;;=&&$#.#=;=;=&%-*-=;===;=$.@@##$%==***;===&$#@.+@$%-*-;;===;==;=%$.+@$%-*-;;=;=;=;==%$.+@$$--*;;=====;;=%$.@$$*--;;==;==;==%$@.+.+@@$$%%-**%%$##@+.+++@@#$%%*-*%%$##@+..++@@$$%%*-*%%$##@+..++@@$$%%-*-%%$##@@.", +"@@$%***;;;;;-*;;;$#.@$%**-;;;*;--;;;$#@.#$%***;;;;;--;;;$#@.@@$%***;;;;;--;;;$#.#$%***;;;;;--;;;$#@.@#$%***;;;;;--;;;$#.$==******-***;;;**$.++@##$&=***;==&&$#@.@@#$;;;**;;;;;*-*$$.+@#$;;;**;;;;;-*-$$.+@#$=;;*-;;;***-*$$.@#$;;;**;;;;;-*-$$@..+@@%&==;*--;;=&%@@..+@@%&==;-*-;==&%@@..+@@%&==;-*-;;=&%@@..+@@%&==;*-*;;=&%@+.", +"@@$%*-*;;;*;-*;;;$#.@$%***;;;;;-*;;;$#@.@$%**-;;;*;*-;;;$#@.+@$%*-*;;;*;-*;;;$#.@$%*-*;;;*;*-;;;$#@.+@$%*-*;;;*;*-;;;$#.#==*****-*-**;;;**#..+@@#$&&***;=&&%#@+.+@@$=;;-*;;;;;-*-$#.+@@$=;;**;;;;;-**$$.+@@#==;**;;;**-*-$#.@##=;;*-;;;;;-*-$#@..+@#%&=;;*-*;===&#@..+@#%&=;;*-*;;=&&#@..+@#%&=;;*-*;===&#@..+@#%&=;;*-*;===&#@.", +"+@@$&=&;===;====&$@.@#$&&==;=;=====&$@@.@#$&&=====;&===&$@@.+@@$&&==;=======&$@.@#$&&==;==;&===&$@@.+@@$&===;==;&===&$@.#$%=====&%&=====%$#...++@#%%;;;==%##@@+.++@#$$%&====;=&%%$@..+@#$$%====;==&%%#@.++@##$%&======%%$$@.+@#$$%&====;=%&$$@@..+@@%%&=======&&%#@..+@#%%&========&%#@..+@@%%&=======&&%#@..+@@%%&=;=====&&%#@.", +"+@@#%&&=========&#@.+@#%&&=====&&==&#@@.+@#%&&=====&&=&&#@+.+@@#%&&=====&&=&&#@.+@#&&&=====&&=&&#@@.+@@#%&&=====&&=&&#@.@$$=====%%%====&$#@....+@#$%;*;=&$#@+....++@##$&&=====%$$#@.+++@##$=======%$$#@.+++@##$&&=====%$$@@.+@@##$&&=====%$$#@+..+@@%%&=;=====&%%#@..++@$%&=;=====&%%@@..+@@%%&=;=====&&%@@..+@@$%&=======&&%@@.", +".+@#%%&&&=&&&%&&%#@.+@#%%&&&&&&%%&&%#@+.+@#%%&&&=&&%%&&%#@+..+@#%%&&&&=&%%&&%#@.+@@%%&&&=&&%%&&%#@+.++@#%%&&&=&&%%&&%#@.@##&&&&&$$$&&&&&##@...++@#==***%%#@+.+....++@##%&&&&&&$$#@+...++@##%&&&&&&$$#@+...++@@#%&&=&&&$##@+..++@##%%&=&&&$$#@++..++@$$%&=&=&=&&%$@+.+.@@$$%&=&==&&&%%@@..++@$$%&=&=&=&%%%@+...@@$$%&=&===&%%%@+.", +".++@@###$$$#$####@@..+@@##$$$$#$###@@++..+@@##$$#$$#$###@@+.+.+@@##$$#$#$####@+.++@@###$#$$#$###@++..++@@###$#$#$####@@.+@@#############@@+...++@#==***%$@@+.......+++@@##$###@@@++...+++@@##$$####@@++...+.+@@@#######@@++...++@@########@@++....++@@##$#$$####@@+...+@@###$#$#$###@@+...++@@##$#$$#$##@@+...++@###$$##$###@@+.", +"..++@@#@@@@#@#@@@++.+++@@@@@@#@@@@@@+++.+++@@@@@#@@@@@@@++...+++@@@@@#@#@@@@@++..++@@@@@#@@@@@@@++....++@@@@@#@#@@@@@++.++@@@#@@@@@@@@@@++.....+@@#$$$$##@++.........+@@@@@#@@@+++......++@@@@@#@@@@++......+++@@#@#@@@++.......++@@#@#@@@@++....+.++@@@@#@#@#@@@+...+.++@@@@#@#@@@@@+...+.+@@@@@#@@@@@@@++..+.++@@@@#@#@@@@@++.", +"...+.++@+@+@+++++.....+.++@++@+@+@+++....+.++@+@+@@@++++.+....+.+++@+++@+@+++....+.++@@+@+@@++++++.....+++@@+++@+@+++.....++++@++++@+++++.+.....+@@####@@++...........+++@++@+++..........+++@+@+++..........+.++++@+++.+........++++@+@++...+....++++@@+@+@+@++++.....+.++@+@+@+@+++.+.....++@@+@@@@+++..+....+.++@+@+@@@+++.+.", +"..++++++++++++++++.........+.+.+.+..+.........+.....................+.++.+..+.........+++++++.............+.++++.+.+.....................................................................+..+.+.................+.++++.+.........+.++++..+......................................................................................", +"++++@@@#@@@@@@@+++.......+++++++++++.......++++++++................+.+++++++........+++@@@@@++...........++++++++++.+....................................................................++++++.................+++++++.+........++++++++..................................+..+++++++...++@@@@@@++..............................", +"++@@###$$$#$$##@@@.....+.++@@@@#@@++++...+.++@@@@+++...............+++@@@@+++.......++@@###@@@++........++@@@#@@@@@+++..................................+..............................+++@@@@+++..............++@@@##@++......+.+@@@#@@+++.............+..................+.+@@@@@++...+@@#$$##@+++............................", +"+@##$%$%%$%$$%$##@+....++@@##$####@@++....++@@###@@++.............++@@###@@+++.....++@##%$%##@++.......++@@#$#$###@@+++....+..+..+.+++.+............+.++..............................+++@@###@@+++...........++@@####@+++.....++@@#$###@++.........+..+..++.+.+...........++@@####@+++.@##$%$$##@+...............+++++.+++.+...", +"@@%&*****;=;**=&%@@...++@@#&&&&%&&##@++..++##$==$##@++..........+.+@##$**$#@++.....+@@%%***%%@@++......+@@$%===%%%%$@++....+++++++++++++.........+.+++++++................+.++.........+##$==$##@++.........+.+@#%%&=&#@++....++@#$%=;=##@+.........++++++++++++..........++@##$**$#@++.@#$*-*;=$@@++..........+++++++++++++++..", +"@#%&***-*;;;**=&&#@..++@##$==&=&=&$##++..++@$$=;%$#@@+...........+@@$$%**$#@+....++@@#%&***&%#@+++...+++@#%&=;=&%%%%@++..+++@@@@@@@@@@@+++........+@@@@@@+++...........+++++++++.+...++@#$$=;%$#@@++.+.....+++@@#%&&==$@@+..+++@@#%&;;;$#@@++....+++@@@@@@@@@@@++++..+.++++@@#$%**$##@+.@$$-**;;$#@+++.........+++@@@@@@@@@@@++.", +"@#%&***-*;;;**==%#@..+@@#$%=;&====$##++..++##%=;%%%#@@++.......++@@#%%%**$$@@.....+@#$%&*-*&&$#@+.....+@#$%&;;;&&&%%@@+..++@@########@@@++......+++@##$#@@+..........++++@+@@+@@+@+..++@#$%;;%%%##@@++..++++@@@#$&====$#@++.++@@#$&&;;;%$#@@++...+@@@##########@@+...++++@@##%$%**%$#@+.@#%*-*;;$$#@@+++....+++@@@##########@@+.", +"@#&&===;;-*-;;%%$#@.+@@#&&=;;***=;$#@+...++@#$%&;;;$#@+++.....+++@#$=;;&&$#@+++..++##%;;&&&;;$$@+++..++##$;;;;;**%%$@++.++@#$$==$$$&=%$#+++....+.@@$%===#@+++.......++@@@##@####@@@.++@##$$%&;;=$##@@++.++@@###%%;;;%%$#@@+.+@#$$%;;===;=$#@@++.++@#$%%=&$$$**$#@@+.++@@@###$;;;&&%$#@@.@#$&&=;;%$##@@@+++..++@@##$**$$$==%%$#@.", +"@#%&===;;-*-;;&%$#@.+@#$===;;*-*;=$#@@...++@#$&&;;;%$#@++.....++@#$%;;;&%$#@+.+..+@#$%;;&%&;;%$#++...+@#$%;;;;***%$$@+..++@$%%==%%%==%%$@+......+@@$%===$#@+......+++@@##$$$$$$$##@.+@@#$%%&&;;;%$$##@+.+@@#$$$%%;;;%%$$#@@.@##%%%;;==&;;$$#@++.+@#$%%&==%%%**$$#@+.+@@#$#$$$;;;&&%$$$#.+@#%&=;;%%$$$##@++..+@##$$%**$%$==&&%$#.", +"+#$%;;;=&&&&-*===$@.@#%&=;;&&;=;;=%$@@+..+@##$==;;;=&$#@++...++@#$&=;;;;=$#@@+..++@#$%=;;;;;=$$#@++.++@##%=;;;;;;%$#@++.++##%%=;=;;;=$$#@++....++@#%&***$#@++.....++@@$&=========%%.@@%&==;%%%%%;==&%#@.@@%%===%%%%%;;=&%#@.@%&=;;&&%&%;;=&&#@+.@@%&=;;%%$%%=;=&&#@.@@%%==;&&%%%=&;;=%%.@##%&=;;=;===%$$@@+.@@$&=;===%$%===;=&%.", +"@@$%;;;=&&&&*-;==$#.@#%&;;;&&;;===%##@+..+@#$%=;;;;==$$#@@+.++@##%==;;;==%$#@@+.+@#$%%;=;;;=;%$#@@+.++@#$%=;;;;==%$$@@+.+@#$%%;=;;;=;%$#@@+....+@@$&&*-*$#@+++..+++@#$$==;;;==;;=&%.@#%&;;;%%%$%;===&#@.@#%&;;=%%$%%=;==&#@.#%&=;=&%%%%;;==&#@@.@#%&;=;&%%%%;;==&##.@#%&;=;&&%%%&=;;=&%.+@#%&&;*=;=;=%%%#@+.@#%&=;;==%$%==;;=&%.", +"+@$%;;;&&&&&**=;=$#.@#&&=;;&&=;;;=%$#@@.+@#$$%==;;;=;%$##@+.+@#$$%;=;;;;;%$$#@+.+@#$%%;=;;;;=%%$#@+.+@#$%%;=;;;;;%%$#@+.+@#$%&=;;;;;=%%$#@+.+.++@##&=***$$#@+++..+@#$$%==;;;;;;;;&%.@#%&=;;&%$%$;;===$#.@#%&=;;&%$$%;;===$#.#%&;;;&%%%%;;===$@@.@#%&;;;%%$%%=;===$@.@#%&;;;==$$%=&;;;&%.+@#%&=;;=;;;;&%%$#@.@#%&;;;==%$%==;;;&&.", +"+@#$=;;****--*-**%#.@#%&*****;=;**;=&#@.@@#;;;**==;**;;=$@@.@@#;;;**===**;;=#@@.@@$=;;**;==**;;=##@.@@$=;;**===**;;=$@@.@@$=;;**=;=**;;;##+.++@@#$$%%&&%%$###++.+@@#=;;**===**;;;%$.@#%&***&%$$%=;;;;$#.@#%&***&&$$$=;;;;$#.#%&***&&$%$;;;;;$#@.@#%&***&&$$%;;;;;$#.@@%%***==%%%==*-*%%.+@#%&&--;;;;;*--%%#.@@%%***==%%%==-**&$.", +"@@#$===*-*-**-***%$.@#%&**-**;=;**===$@.@#$;;;**;==**;;;$#@.@#$;;;**=;=**;;;$#@.@#$;;;**;;;**;;;$#@.@#$;;;**=;=**;;;$#@.@#$;;;**;=;**;;;$#@.+@@#$$%%%&&%%%$$#@@.+@#$;;;**=;=*-;;;$$.@#%&***&&$$$;;;;;$#.@#%&***&&$$$;;;;;$#.#%&***&&$$%=;;;;$#@.@#%&*-*&&$$$=;;;;$#.+@#$==;;;%%%;;===$#.+@@%&&**&&%%%;;;;=$.+@#$==;;;%%&;;===$#.", +"+@$$==;*-*-*-*-**%$.@#%&*****;=;**;==$#.@#$;;;-*===*-;;;$#@.@#$;;;**===**;;;$#@.@$$;;;**===*-;;;$#@.@#$;;;-*===**;;;$#@.@$$;;;**==;**;;;$#@.+@##%%%&&%&&%%%%$#@.+@$$;;;-*;=;**;;;%#.@#%%***&%$$$=;;;;$#.@#%&***&%$$%=;;;;$#.#%%***&%$$$=;;;;$#@.@#%&***&&$$$;;;;;$#.+@##===;;&&%;;;=&$#.+@#%&&**%%$%%;;;==$.+@@$&==;;&%%;;;=&$#.", +"@@$%*-*==%%%%&*-*%$.@@#%;;;==%%%&=;;;$#.#$%***&&%%%&&***%$@.#$%***&&%%%&&-**%$@.@$%*-*&%%%%%&***%$#.#$%***&&%%%&&-**%$#.@$%*-*&&%%%&&-**%$#.@@&&-**-*-*-***-*$#.@@$%*-*&&===*;-**%$.@@$%;;;&&$$$&=;;;$#.@@#%;;;&&$$$%=;;;$#.@$%;;;&&$$$&=;;;%#@.@@#%;;;&%$$$%=;;;%#..++@#%%**&&&-*%$#@+.+@#$&=;;%%%%%&=&;=$...+@#$%**&=&**%%#@+.", +"+@$%***=&%%%%&***%$.+@$%;;*==%%%&&;;;$#.#$%*-*%%$$$%&*-*%$#.@$%*-*&%$$$%&**-%$#.#$%***&%$$%%&*-*%$@.@$%*-*%%$$$%&***%$@.@$%**-%%$$$%%***%$@.@@&&*-*-*---*-*-*$#.+#$%***&&===;;-**%$.+@#%;;;&&$$$%&;;;%#.+@$$;;;&%$$$&&;;;%#.@#%;;;&%$$$%&;;;$#@.+@$$;;;&&$$$&&;;;$#..++@@#%;;*-*;;$$@@+.+@#%&&--=&=&&*-*&%#...+@@$$;;***;;$#@@+.", +"@#$%***%%$$$%%***%$.@@#%;;;=&$$$&=;;;$#.#$%***%%$$$%%***%$@.#$%***%$$$$%%***%$@.#$%-**%%$$$$%***%$@.#$%***%%$$$$%-**%$@.#%%***%%$$$%%-**%$@.+@#$$$%%%%%%%%%$$@@.@@%%*-*&=;;;&&***%$.@@#%;;;&%$$$&=;;;$#.@@#%;;;&%$$$%&;;;$$.@#%;;;&%$$$%=;;;$$@.@@#%;;;&%$$$%&;;;%#....+@#$=;***;=$#@+..+@#%&&**===&&*-*&%#....+@#$=;*-*;=$#@+..", +"@@$%***%%$$$%%*-*%$.+@#%;;;&&$$$&&;;;%#.#$%***%%$$$$%***%$#.#$%***%%$$$$%***%$#.#$%***%$$$$%%***%$#.#$%***%%$$$%%***%$#.@$%***%$$#$%%***%%@.+@@##$$%%%%%%$###@+.@@$%***==;;;&&***%%.+@#$;;;=&$$$&&;;;%$.+@#%;;;=&$$$&&;;;%#.@#$;;;&%$$$%&;;;%#@.+@#%;;;&%$$$&&;;;%#...++@#$&&--*&%$@@+..+@@%&&**-**-*;;;%$#...++@#$&&*-*&%$#@++.", +"@#$%*-*%%%$$%%***%$.@##%;;;&&%$$&=;;;$$.@$%***%%$$$%%***%$@.#$%***%%$$%%%***%$@.@$%***%%$$$%%***%$@.#$%-**%%$$$%%***%$@.#$%***%%$$$%%***%$@..++@@#$$%%%%$$#@@@+.@#$%***&=;*;%%-**%$.+@#%;;;&&%%%&=;;;$$.+@#$;;;&&$%$&=;;;$$.@#%;;;&&%$%&=;;;$$#.+@#$;;;&&%$%%=;;;$$..+++@#$&&*-*%%#@+...+@#%&&*-*-*-*===$#@..+++@#$&&-*-%%#@+...", +"+@$%***==%%%=;***%$.+#$%;;;=&%$%&&;;;%$.#$%***==&%%;;*-*%##.@$%***==%%%=;***%#@.#$%**-==&%%=;*-*%##.@$%***==%%%=;*-*%#@.@$%**-==%%%=;***$$@..+.+@@#&=*-*$#@@+.+.+@$%*-**-&&&;;***%#.+@#$;;;==%%%=;;;;%$.+@#$;;;;=%&%=;;;;%$.@#$;;;;=%%%=;;;;%##.+@#$;;;;=%%&=;;;;%$...+@#$$=;;;;%$@@++..@@#%&=;;&%%%%%$##@+...+@#$$==;;;$$@+++..", +"@@#$***;;&&&=;***%#.@#$%;;;&&%%%&&*;;%$.@#%*-*;=&%&==***$#@.@#%***;;&&&=;***$#@.@#%***;=&%&;=***$#@.@#%***;;&&&;=***$#@.@#%***;;%%%=;***$#@...+++@#&=*-*$#@+.+..@#$%*****&&&=;***$#.++##;;;;=&&&;=*;;%$.+@@$;;;=;%&&;=*;;%$.@@#;;;=;&&&;=*;;%$#.+@@$;;;=;&&%;=*;;%$.++@@#$%==;;;$$@+....@#$%&=;;&%%%$##@@++.++@@#$%=;;;;%##++...", +"+@#$&==**-*-*-=&&$#.@#=;---*-%%&*-*-*=&.@#$&&=**-*-*-=&&$@@.@#$&==***-*-*==&$#+.@#$&==**-*-*-=&&$@@.@##&==***-**-=&&$#@.@#$&&=**---**==&$@@....++@#$%==&$#@+....+@$%;;;-***-**=&&$#.++@#%%&********-*=&..+@#%%&********-*=&.+@#$%&********--=&#..+@#$%&***-****-*=&..+@#==;--***%#@++...@#$;;;-*;==$##@@++...+@#==;*-***%#@+....", +".@@#%&&**-*-**=&%#@.@#&;*-*-*&&&*-*--==.+@#&&&-*-*-**=&&#@+.+@#%&&**-*-**&&%#@@.+@#%&&-**-***&&&#@+.@@#%&&**-*-**=&%#@+.+@#&&&**-*-*-&&%#@+.....+@@$%&&&#@+.+...@@#%;;;*--*-*-&=%#@..+@@$%%**---***--==.++@@$%%**-*-**---==.+@##%%*-*--**-*-==#.++@@$$%****-**---==.+@@$==;**-**$#@++...@#%;;;-*;==$#@++.+..+@@$==;-****$#@@....", +".+@#%&&***-***&&%#@.@#==**--*%%%*-*-*=&.+@@%&&****-**&%%#@+.+@#%%&***-***&&%@@+.+@#%%&**-*-**&%%#@+.+@#%&&**-****&&%#@+.+@@%&&**-*-**&&%#@+.....++@#$&&%#@@.....+##%;;;-***-**&%%#@..++@#$%*******-*-=&..++@#$%**-*-***-*=&..+@##%****-***-*=&#...+@#$$**-*-***-*=&..@@$==;-****$#@+....@#$;;;**;==#@@+......@@$==;*-***$#@+....", +"+++@@#$$$$%$$$$#@@+.@##$$%$$$$$$$$%$$$#.++@@#$$%$%$$$$#@@++.++@##$$$$$%$$$##@++.++@##$$$$%$$$$#@@++.++@@#$$$$$%$$$#@@+..++@@#$$$$%$$$$#@@++......+@@#@##@++.....@@%%;;;%%%$%$$$#@@+...++@@#$$%$%%$%$$$#...++@@#$$$%$%$%$$$#..++@@#$$%$$%%%$$$#@...++@##$$$%$$%%$$$#.++@#=======&$#@++...@#$&=;===&&#@++.....++@#=======&$@@+....", +"..++@@#####$###@@@+.+@@###$###########@.+++@@####$####@@@....++@@###$#####@@++...++@@####$#$##@@@+..+++@@###$#####@@@+..+++@@####$####@@@.+.......++@@@+@.+.....+@%%===$$$#$###@@@....+++@@#######$###@...++@@@######$####@...++@@###$####$##@@....++@@###$#$##$##@..@@#&&==&=&%#@+.....+@#&&===&&&#@++......@@#&&===&&&#@++....", +"...+++@@@@@@@@@+++...+@@@@@@@+@@@#@@@@+...+++@@@@@@@@@++.+....+++@@@@#@@@@+++.....+++@@@@@@@@@+++.....+++@@@@#@@@@+++.....+++@@@@@@@@@++.+.........+++++.+......+@@#######@@@@@++.+.....+@+@@@#@#@@@@@+......+@@@#@#@@#@@@+....+++@@@@@@#@@@@++.....++@@@@@@@@@@@@+..++@##$$#$##@@+.....+@@#$#$$###@@.+......++@##$#$###@@+.....", +"....+.++@+@+++++......+++@++++++++@++++....+.+++@+@+++++.......+.+++++@++++.+......+.+++@++++++.+......+.++++++++++.......++.++@+@@+++++...............+.........+@@@#@@@@+@+++++........+.++++++@+++++........+++++@++@+++.....+.++@+@++@++++........+++@+@@@+++++...+@@@@@#@@@@+......++@@@@#@#@@+++........+@@@@#@#@@++......", +".......................+++++.........................................................................++++@@@@@@@@@@@@++.............++.+.......+.+++++++++++...........+++++++...................+........................................................................+.+....+......++@@@+++++..+..+........................", +".....................+++++++++.................................+.+++.+.++.+.+........................++@#@#####@####@@+...........++++++++.....+++@@@@@@@@+++.........+++@@@++..................+......................................................................+..++.+.++.+.+...@@@###@@+++++.+.........................", +".....................+@@#@@@+++....................+........+++++++++++++++++++......+.+++...........+@##$$$$$$$$$$$$#@.........+.++@@++++...+.+@@@#####@@@++.........+@@@##@@++.............+++++++++.......+.+++++.+...............+...........+.++++++..+...........++++@+++++++++...@#$$$$##@@@+@+++++.......+.+.+...+......", +".......+.+++........+@@%%$$#@++.+................+....+.....++@@@@@@@#@#@@@@@@+.....+++++++.........+@##***=======***$#.........++@@#$#@@+....++@%%%%%%%&%@@++......+++@#&&%#@++.............++@@@@@@++.......++++@+++......+..++.+.+...++++.+...+++@+@+++++.++.+.....+++@##@#@@@##@++..#==***%%##@##@@@@++.....+++++.+.++++++..", +".......++@+@+++.....@@#%&%%%#@@+.....+.....++++++++++.+.....+@###$#$###$#$###@@...+.+@@@@@@++.......+@#$***;;=;=;;***%#....+.+.++@@#%$$#@@....+@@%%&&&&%&&#@@.....+.++@##&==##@++..........+++@######@@....++++@@#@#@++.+.....+++++++@+++++++++.++@@#@##@@@@++++++....++@##$#$###$##@++.$==***&%$$$$%###@@@..+.++@+@+++++@+@+++.", +".....+++@@#@@+++....@#$&&&%%$#@++..++.+...+.++@@@@@@@@+.+...@##$$$%$%%%$%$%$$#@....+@@###@@++.......+@#$***;;=;;;;***%$...+.++++@@#$%%$##@+..++@#%&===&&==$@@++...++@@#$$===$##@@++........++@#$$%$$##@...+++@@#$#$##@++....+++@@@@@@@#@#@#@@@+.+@##$$$#$###@#@@@@+..++@#$%%$$$$$%%#@@+.$=;***&&$%$%%%$$$#@...++@@#@@@+@@@#@@@+.", +".....++@#%%$#@++....#$%*****%$#@++.++++...++@@##$####@@+++..@&=*-*****-*******#..+++@$%&&&#@++......+@$%***;;===;=***%$.++++++@@@$%%-*%$#@+..++@#&&&;;==**$#@+..++@@@##$%***%$##@@+........+@##-****=&#.++++@@#%&***$#@@+.+.+@@##$$$$#$#$#$$#@@.@#$=====%%%$$#$###@..+@@#=====%&&**%##@.#==***;==&=**===&&$.+++##$&&##@@#%%%#@@.", +"....++@##%%%$@@++...##%**-**%%#@++++@@@..++@@#$$$%$$$##+++..#%&-**-*-*-*-*****#...+@@%&==&#@++......@@$%*-*;=;==;;-*-%$.++@@@@@@#%%&*-%%$@@..+@@#&&=;;==**%#@++.+@@#$$$%%*-*%%$$##@.......++@#$*--**=&#.++@@##$%&***%$@@+++.@@#$$$$%$%$%$%%%$#@.@$$=;=;=&&&%%$%$$##.+@@#$=;;;=&&&**%$#@.#&=***;====--=;===%..+@@$$=&$####%&%$#@.", +".....+@$%**&&#@+....@#$%%*-*=&#@@@@#$%%.++@#%&&**-*;;%%#@++.@$$%%%%%;;;%%%%$$#@...+@#$%===$#@+......@#$$;;;*****;;--*%$.@@$$$$$$#%%&**&%$@@..+@#$%&=;;&&**%$#@@.+@$%==;=;*-*=;===%$.......+@@$%==;;=%$#.@@$$%%%=&===$$$##@+.@#&=*-*-**-******$#.#&=-*-*******-*-**#.+@#$%===;=&&&**%%$@.#$$&&&**&&&==***;=%..+@#$%**%$$$%***&%#.", +"....+@@$%**&&##+++..+@#%%***=&$@@@@#$&%.+@##&&=*-*-;;&%#@@+.@##$$%%&;;;%%%$$##@...+@@%&===##++......@#$%;;;*-***;;*--%%.@#%%%%%$%%%&**&%%#@.@@##$&&=;;%&**%$##@.@#%&=;;;=-*-;=;==%%......++@#$%=;=;=%$@.@#%%%%&==;;;%%%$##@.@#&=--*-*-*---***$#.#==*--*******--***$.@@#%&===;;&%&-*&%%#.@#$%&&**&&&=;***;=%..+@#$%**%%%$$***&&#.", +".....+@$%-*=&$#@+...+@#$%-*-==$####$%&&.@@$$&&=--**;;=&$#@+.@#$$$%%%;*;%%$###@@...+@#$%;==$#+++.....#$%%;*;***-*;;-*-%%.@#%&&&&%%%&&*-&&%#@.@##$%&&&;;&&**%%$$#.@#%&;;;=;*-*;=;=;%%......+@@$$%=;=;=$$@.@#%&&&&===;=%%%%$$#.@$==*--*-****-*-*$#.#&=-*-**-*-**-*-**#.@#$%&===;=&&&**&%%$.@#$&&&-*&&&==*-*;=$..+@#$%**%%%%%***=&#.", +"....++@#$==**$#@++..++@#%;;;&&$###$**&%.@#%&***%;;;;=;;&%#@.#%&%%%%&;;;&&$$$##@.+..@@%%===$#@+......$$***-*;;;==;;***==.##*****-*-*-**;;;$#.$%%=;;;;**=;-*;==&&.##==***;=-**;;;;;=&.....++@#==;***-*%$@.#$***-***-*-*****%$.@#%%***%%%%%&&***%$.@#$%%&**;;;**%%$$##.#$%***-******--***%.@#$===*-&%%%%***&%$..++@#$**=&=&=;;;**$.", +"....++@##&=**$#@@+..++@#$;;;&&$$#$$**&%.@$&&***%;;*==;;&&$@.#&&&&%%&;;;&&%$$$$#...+@@%%;==$@@+......$%****-;;=;;;**-*==.@#**-*--*-****;;;$#.$%&=;;*;-*;=*-=;==&.##==*-*;;**-=;;;;;&.....+@@$=;;**-**%$@.#$**-*--*---*-***&%.@#$%***%%%%%&&***%$.@@#$%%**;;;**%%$##@.$$%***-******-****&.@#$==;**%%%%%***%%#..++@#%**=&&=&;;;**#.", +"....++@##%%**%#+++...+@#$===**%$$%&**%$.#$**===%&&=;;&%**$#.#&===;=;--*;;====&%..+.@#$%===$#@++.....#$==;==;====**;;;&&.@#$$%%&**&&&&&;;;%$.%&&;=;;;**;=**;===&.@$==***%%***&%;===&.....++##=;;;;===%$@.#$=;===%&***===&%$#.@#%%***%$#$$%=*-*$$.+@@##$%%;;;=&$$#@@@.@##%%===;;&&&*-&&%#.#$%***-*%$$$$=;==&#...+@#$&=***;;=&&$$#.", +".++++@@#$%&**%#@+....++@#&==**%$$&&**$#.#$**===%&&&;;&&**$#.$&===;=;**-;;=====%..+.@@%%;==$#@.......@$&==;==;=;=**;;;&&.+@#$%%%-*&&&&&;;;%$.%%&=;;;;**;=*-====&.@$&=**-&%-**&%====&.....+@@$==;;;==&%$#.#$;====%&*-*==&&%#@.+@$%***%$##$&&***%#..++@@#$%;;;==$#@@+..+@#$%==;==&%&**&&%#.#%%****-%$$$$==;&&$..+++@$&&***;*&&&##@.", +"..+@@###$%%-*%$@@++...@@#&==**%%%%&**##.#$**=&&%%&=;;&&**%$.#&=====;*-*;;=====%...+@@%%=;=$#@++.....@#&===;=;==;**;;;&%.++@@$%%**&&&&&;;;%$.$%&==;;;**;=**===&%.@$==***%&*-*%&=====......@@#=;;*;===%$#.#$=;===&%*-*=&&%$#@.@#$%***$$###%&*-*$$..+++@@#%;;;=&$#@+.+.+@@#$===;;&&&-*&%%#.#%&*****%$$#%====&#...+@##&=***;;&%%#@+.", +"++@@$$%==$%;;&%#@++...+@@#$%**=&&%$$$#@.$$*-=&&$$%%**&&;;&%.@##$$%%%;;;%%%$$###...+@@$%***$#@++.....@#$%***-*--*--;;=%$.+++@@$$;;=;=%%%%%=&.@##$$&&=;;&&*-%%%$#.@$&=-*-;=*-*;;;;;=&..+.+.+@#$%%**;;;;=$.@$==;;;&%;;;==$$#@+.@#$%***%$##$%&***%$....++@#$=;==&$#@+....+@#$===;=&&%*-%%$@.#&==;;**%%$$$&====$...++##%%-*-;;%$$@@+.", +"+@@$$%%;;%%;;=%#@++....+@@$$**==&$$$@@+.#%**===$$%%**&&;;&%.+@@###$%;;;%$$####@...++#$%***%#@+......@##%**-*-**-**;;;$#...++@#$=;;=;%%%%$&&.@@##$&&=;;&&**%%$#@.@$&=***;;-*-;;;;;==.+.+++@@#$%%**;;;;=$.@#&=;;;%&*;;=&%#@@+.@@%%***$$##$%&*-*%$.....+@@#==;=&$#@+...++@@#===;=&&&*-%$$@.#&====**%%%$%&==;=$..+@@#$%%-**;;%$#@++.", +"+@$$***&&$%=&;=$#@@...+++@#$%&***%$#@@+.#$;;;==$$$%;;==;;=&.+++@@#$%;;;%$#@@@@+...++@$$***%$@@+.....+@#%;;;=&%&%&&;==$#...+++@#%%**-%%$####.++@@#%&&;;&%**&&%##.@#%&;;;%%*-*&%===%%.+++@@@@#$%%;;***;;#.@#%%*-*=&=;;;;%##@+.@@$%***%$$#$&&***%#......+@#%%&;;$#@@+...+@#$&===;&&&**&%$@.@##$%%=;=&&$%&=&==$.+@@#$%;;*-***%%$@@+.", +"@#$%***&&%%&&;=%$#@.....+@@#%&***%$$@++.#$;;=;=%$$$=;=;;;&&...++@##%;;;%$#@@+++....@@#%***%$#@++....+@#$;;;&=&%&&&;;=$@.....@@#$%***&%$##@@..+@@#%&=;;%%**&&&#@.@#%&;;;%&***%%&&&%$.+@@@###$$%&;;***;;$.@#$&***&&;=;;;%$#@@.@#%%***%%$$$&&*-*%$.....++@@$%&;;%$#@++...@@#==;==%&&-*%%#@.@@###%==&=&%%=====#.+##$%%;;**-**%%$#@+.", +"@#%%***=&%%==;;%$##......+@#$%***%$$#@+.##;;;=;$$%%;;==;;&&....++@#$;;;%%##++.+....+@#$*-*%$#@@++...+@#$;;;=&&%%&%==&#@.....++@$%*-*&%$#@@+...+@#%&&;;&%**=&&$#.@@$%;;;%%--*%%&%%%#.@##$$$%$%%%;****;;$.+#$%***&&;=;;;%$$#@.+@$%***%%%%%&=***$$.....+.@@$$%;;%$#@@+..+@@$&==;=&&&**%%$@.++@@#$=====%%====&#.@#$%%&;;-**-*&%$##@.", +"#$;;----*;;;;**==%$.......@@#$=;=;;%##@.@#$%***;%$%%&****%#.....+@#%;;;==$##++....++@#$;;;==$#@@++..+@#$=;;**;=;&%$$##@.....++@#$%&&=;$#@@+..++@@%%=;;%$&&***%$.+@@#$$%%%***%$$##@@.@&&===***-*;;;;;%%$.+@#$;;;-*=&===;==$#.@#$%*-*;;;;;;;*-*%$.......+@@$$====&#@+...@@$&=;;;===-*%%#@.+++@@#%&;;;;;***%$#.#&=*--**%%%==***$##.", +"#$;;*-***;;;;**;=&%.......+@@#&==;;%%##.@@$$***;%%%&&****$#....++@#$;;;;=%##++....++@@$=;;;=%$#@++...+@#===**;==%%##@@+.....+++@#%%&;=%$#@@..++@@%%&;;%$&&***%$.++@@@##$%***%$#@@@+.#&====****-;;;;;&%#.+@#$=;;--&&&==;;=$$.+@$%***;=;;;;;***%$........+@#$=;===$#@..++@$&==;;===*-%%#@..+.+@@$%;;;;;***%$@.#&=-*-**%%%&=***%$#.", +"#$**===&%====;;**%%.......++@##$%&=**%$.+@##$$%=***%%%&$$#@.....+@#$;;;;;$$#+++.....+@#$$%**=&%#@++.++@#$%&*-;;;$$#@@++.......++@##$&&&&%#+...++@$%%==$$#%&&&;;..++@@@#$%-**%##@+++.@%&=;;=;&&&%%&&&==#.++@#$%%&=%$$$$=====.+@$$===%%$%$%&;;;$#.......+++@#$%;==&%@...@@#&&=;;;=;**%%#@...+++@#$%&&==&%%##@.#%&&=&%$$#$$$%&&**%.", +"@$**&&&%%==;=;=-*%$.......+++@@#$&&**%%..+@@#$$=***%$%%##@@.....+@##==;;;$##+.+....+++@#$$**==&#@+..+++@$$%**;;;$#@++.........+++@##&&&&%@@...++@#%%&&###$&&&;=.....+@@#$***$#@@+.+.#$%=====%%%$$%%%==#..+@@$$%&&$#$$$&====.+@#$&&&$$#$$$%;;;$#........++@@$$=;=&%@...+@#%&=;;;=;**%$#@....+++@#%%&==&%$#@+.@%%&&&$##@@##%%%**$.", +"##**&&%$$&&====**%$.........++@@#%&**%%.+.+@@##&***$#$$@@++......+@#===;=$#@++.......+@@#$**=&%#@++..++@#$%**;;=#@@+............++@#$%&%%@+....+@##$&&#@@@%%&==....+.+@#$***$#@+....@$%&====%%$##$$%&&#..++@@#$%%##@@#%&&&&.++#$%&&##@@#$$===#@.........++@#$&==%%@..+.@@%%&;;===**%$#@......+@@$%%&&$$$@++.@$$%%%##@@@@@$$%**$.", +"@##$######$#$$$$$##.........+++@@##$$%%....++@@#$#$##@@@++......++@@##$#$#@@+.........+@@##$&%%#@+...+++@@#$$$$##@++...........+.++@@####@+....++@@@#@@@@@#####......++@#%%$#@++....@@###$###@#@@@###@@....++@@@@@@@@@#####.+++@##@@@@@@@##$##@.........+++@#####@@....+@@##$%$%%&&$#@+......++@@@####@@@++.+@@#@@@+++++@@###$#.", +"@@@@#@@@@@@#@####@@...........++@@###%$.....++@@##@@@++++........++@@@##@@++...........+@@##%%$@+++....++@@####@@++...............++@@@@@++.....+++@@@++++@@#@@.....+.+@@#$$#@+.....+@@@#@#@@@+@@+@@@@+....+++@@@++++@@@#@@..++++@@@++.+@@@@@@+...........++@@@@@@+...+++@@######&%#@++........+@@@@@@@++...+@@@@@+++..+++@@@@@.", +"++@@@++++@+@@@+@@@+.............++@@@@@.....+.+@@@+++++...........++@@+@++++............++@@@#@@+.+....++++@@@@@++.................+.++++........+++.++..+.+++@......+++@@@@++++.....++++@@+++..+.+++++.....+...+..+.++++++...++++.+.+..++@++++...........+.+@@++++....++++@@@@#@#@@@++.........+++@+++.......+.++......+++@@++."}; diff --git a/hacks/images/matrix1b.xbm b/hacks/images/matrix1b.xbm index 9bca70a2..5ba39413 100644 --- a/hacks/images/matrix1b.xbm +++ b/hacks/images/matrix1b.xbm @@ -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, diff --git a/hacks/images/matrix1b.xpm b/hacks/images/matrix1b.xpm index 4340bf2e..037eb64c 100644 --- a/hacks/images/matrix1b.xpm +++ b/hacks/images/matrix1b.xpm @@ -1,200 +1,227 @@ /* 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+..@%==&#@+...@$%$@+.@#&&*&&&%@..@.@..@...@#%&&&$@.+.#%-*$@..@$**=&%@.....+.+.+....@#$%$@@+............@#$$#$@+........+.......+.+...@#%$$#+....+.+....", +"......+......@$%#@......@@@.....@##$$@@..+.....+.+..+@@##@....@#&%@@+..@#$##@...+........+....@.@.....+.+..+.+......+@....@+.+.....@.+.......++++@....+.....+...", +"+.@@##@..+.........+.+@####.+...@###@.......+@..............+.@#$$$$@........+...............@@@@..+....@..............+@$%%@@..+@@%%$@...+.@$%%$#@..........+..", +".@#%&&%@...+.@@@@....@#%&&%#@.+@$&&&$@.+.+.@@#@@.+.......+...#$&****%#...........+.+.+.+...+@$%&#@.....##$#@..+.+.+.....$&=*%@@.+@%*=&#@@@#@%*-=*$@@#@+.+.@@++..", +"+#%*=*&$@....@$%$@...@$*==*%@..#&===&$@...@#%&$@...+.+......#%=->);>*#+.+..+.+.............@@&=-&@.+.@#%**&$@.......+...$*>-&#@#$#&=>*$#$%&$&=--=&$%%$...+#%$@..", +"@$*-=-*&#+..#%*-&$@+.@%*=-*%#..#&=-;*$@...@%**%@...@@@@@#$@+#&>,>,,>*#.........+.......+.+.@#&-;&#...$%*=-=&#@..@@..@.+.#*>>&$#&*%&->=%%***#%=->=*&*=$@.++%*&#@.", +"@$*-=-=&@.@@%&>'&&#@.@$*=-*%@+.#&=-'&%@+..@%=*$@+.@%&%$$&%$@#*',;,>=&#...+@#@....+.+........@&-'&#@..#&--=-*%@@#$$$$#@..$&--*%&*=%%=-=&*=-*$%=-;-====$...@%*&#@.", +"@#%=-=&%@.@$=-;'>=&#.@%*--*%@..$&---*%@...@$%$@...$*--&&--*##&>;,'>=&#+..@$&%$.......+...+..#%=,*$@+@#&=---*%@@&*****%#.$*>-=*=-=%&=--==--*$%=->----&#@.@#&-*$@.", +".@$&**%@+.@%>'',;;=$.@%=--*%@..$=---&$@+...@@@..+.$*;>**--*##%->,,>=&#..@#&-*$#.............#&>,&$@..@&=---*$@#&--->-*%@%*->----=%&-->>>>-=%%==>->>-&@@+#%=>-%@.", +"...#$$@@..@$&=-'-=&#.@%***&$@+.#&=**%#............#&>-**=-=$@$&=;,>=&#+.@#*-=$@.+.+@#@.+..+@#&*=&$@..@%=>>-&$@@&=>>>;>&##&*=-->;-%%*=----->%$&==;;;;*#.@%*-;=%@.", +"+...@@..+..#$&--*%#@..@$%%#@...@#%$%@@.+.+.+.+..+.$&>-==->=$.@$*-'-=&@...@%&%@....@$&%#@....@#$%$#@+.#&-',;*%@@%=>->,,&#@$&=->-'-%$*=-==---$#$&->-;;*#@#*--=*%#+", +"..+........+%*=-*%#@...+@@@......+@@..............#&>>---'-%@@$&-,;-*#....@#@.....#&-=%@..+...@.@....@%*->-&$@#&=---;>&#@%*---='>%%*-=**->*$#%=---;,*#+%*--**&%@", +"........+.@$*=->-*%$.......+.+.......+........+.+.#%-',>>>-%@@&=;,;>=#+......+.+.@$='-&@...........+.@@%%&%#@.$*--->>=%@@$===--;>&%*=*&=--*$$&===->'=#+$*->--=&@", +"+.+..+....@%->,>'>*#.+.........+.......+.+.+......#%=-=*&*%#.@&=>-';=$..+........@$*'>&#+...+.+.+.......@@@..@@&**&*&$@+@$&&&&*>>%$%&%%=---$@%&%%&->*#+#&=>>>=&@", +"........+.@#&&&&&&%#...+.........+................#%**%$#@@..@#&*&&&%@....+......@#&**%@.................+....@#$$$$#@+..@##@#%%&#@#@@#$&%%#@@$#@$%%%@.+#&=--*$@", +"..@.@+.....@@#$#$#@......@.+.+....++.+......+.+.+..#%%$@.......@####@.+......+.+..@%%$@...+.....@.+.+.+.+.++...@.++@@.....@@@@@@@......@###...@.@+@#+...+@%%%$@.", +".@#%%#@.+....@#%%#@+.+@#%&#@...+@#$%#@.+.+@@@@@@..+@$%&%#@+...@@@@@@@@..+@#@@@@..@#&%#@@....+@%%$#+...@#&%#@...@@@#@#@+..@@$%@@..+..+@@$%$@@..@#&&$#++..++@@@@@.", +".@$&*%#@....@#%**$@..@@&*=&@@..@%&**&$#..@#$$#$@@..@$*=*$@..+@@%%%%%%@.@@$%%%$#@.@$**%#@+...@#%*&$@..@#%==%#@+.@$&%&&%@..@$&&&#@.....@$&=&#..@#%==*$@+.+#$#$$#@+", +".@%*=*%@+.+@#%==&$@.@@%*--*$@.@$&-;>=%@..@%&&&&$@.@#%===%@...@$======$@#%*===*&$@#%*-=&$#@@@%&==*&@@@$&*--=%#@@$&===**$@.@%*==%$@.@@#%*==%$..@%*--=&#++#%&&&*&$@", +"@$&=--%#@..#%*--&#@.+$*---*$@.+$=->>*%@.@#*===*$@.@%*->=%@+..@%>')>'>%$&='>;;,=$$&=->>-=%@#&*->>-=%@#&=>>>>=%@$&->>>--%@@$&=--=&$@.@%*->=*$@@$&=-->*%@+$*-=--*&@", +"+$*>',*#@.@#*-'>=$@.@$*>',=%@.@%=>),*%@.@$*>'>=%@.#&=',-&@...#&-'>--=%%-;=**=-*%%=;'-';>&#%=,,>';>&#%=>'-',>&#$=;'>,;>&#@$*-;,>=%#@#*-';>=&@@$=-;,;=&@+$*>;,;=&@", +".$&--)-%#+@$&=,'-%@..$&-;)-&@..$&-;'-&@.@$&-,)-%@.@#*-'>*$@+.@&>,>>-*%%=)=%$%*&##&=-==-'&@#%=-=->;&@#&->==>>&@$&=>==>;&@+@&=>'-*$@+$%=>,-*$++#&=>,-*$+@#&=>;-*$@", +".$&>;-;&$@@#*->->*%@.$&>->>*$@@#&-;->*%@@$&>->>*%@@%*;>;-&@@@$*,->,>*$%-;*$#$%$##&=>=--*%@#&=-==-=%@#&=-=--=%@@&=>=--*%@.@#&>;*%@..@$&>;*%@..@#&>;*%@..@$&>,*%@.", +"+%*>;-'=&@@%=>,-'=&#@$=>,-'=&@@%*-,-'=&@+%=>,-'=&##&=,-;>=$@#&*;;,';*#&*'=%%%%%@@%*,>>-*$@@&=,>>-*%@#%=,>>-&$@@&*,>>-&$@..@%-;&$@...+%-;*$@...@$-;*#+...@%-;*#+.", +"@&-,,-,-=##%-;;>,-*$#&-,;>'-=#@&-'>;,-*$#%-;;>;-=$%=>,>,>-%#$*>,;--=&@%=>-===-&$#&=;->>*%##&=>>>>*%##&=>->>*%@@&=>-;-*%@..#&-,&$@+..@&-,&$@+..#%-;&$@..+@%>;*#@.", +"#*>;>->,-%$&,;>->'-%$&;,>--'-%$*>,>->'-%$*>,>->,-%&=,>->,;*#%=,>>>--=$#&=>>>>>*#$&=,-->-=$$&->----=$$&=,----=$$*->->--=$@@$&-'=%$@.@%&-,=%#@.@$*-,=%$@.@%&>;=%#@", +"%*',-=>'-&%=,>-=>'>&%='>-=>'-&%=,,-=>'>&$='>-=>'-&&>'---,,*$&>,-',>>>%@$&='>=*$@$=,;->;,=%%='>>>'-=%%=,>>>>,=$%=,'->;;=$@#*-,,-*&@@#&-,,-=%#@$&-,,-*&@+#*=,,-=%#", +"$*>>=*=;-%$*;>=*=>-%$&,>=*->-%$*->=*->-%$&,>=*=>-&&->-**->=$&=>->;>>-%.@#*>>*$@.#*-,>->>*#$*>;-->>=$$*>>>-->*##*-,-->>*#@$&=>>-*&@@#&=->-*&@+$&=-;-=%#.$*=-;-*&@", +"@%&&%%&&&##%&&&%&*%$#%&&%%&&&$@%&&%%&*&$#%&&&%&*&#$&*&%&&&%#$&&&*&**&@.@$*=*$@..@%&*&&*&%#@%&**&*&%##%***&&&%#@%&*&&*&%@+@%&*&&&$+.#%&&*&&$@.#%&&&&&$@.#%&*&&&$+", +"@@######@@@####@#$#.@@#$####@@@+$#@###@@@@######@@@####$$$#.@#####$##...@#$#@....@@$$#$#@@.@$$$###@..@#$$$$##..+#$$$$#@@..@@#$#@@..+@#$$$@@..+@@###@+...@#$$#@@.", +".+@@@@@@...@#%%%%$#...#%%#@......@$%%@@...@$%%$@...@#$%%%$#...@@#@@.+.+......+...+.@@@@@@..@#%%$@......@#%$#@...@$%%$@....@@@@@+......@$%#@+..@@+++......@@$@+@.", +"@#$$%$$#@..@$*-==*$@.@$&=&$@..+.@#&**$@..@#&==&$@..@%*=-=*$@.@@$$$##@........@...@@#%%%%#@.@$*=&#@@+..@#&**$@+.@$&==&$@.+@@$$$$#@+...#$**%@@@$$$#@+++...@$%&%#+.", +"@&*=*=*&$#@$&->>-*$@.@%*=*%#@...@%=-*$@+.@%*--*%#.@#&->>-*#@.@$*&**%@.+@$@@.@@@.@#%**=>-&@@#%*-*&#@.@@$%=-*%#@@@%=--*&$.+@%*&&&&$@@@#%&==&$@@&*=&%#@.+.#$*--=%#+", +"$&,>>-->*$#&=->;-=%@.@%*--*%@..@%&--*%#.@@&=---*$@@%*->;-*#@.#&====*$@@#&%$$$%$@#&=>>>,'*@#%**-=*&$#@%&*--=*%@@%*-=--*&@@&*=====%@@$&*=--*&#$*-;-*%#@+.#&->>>*$+", +"$*;;---,=%%*>>=->-*$@%*->--=%@#%*-->-=%@@%*-->-=%@#%*->>-=%@#%*->--=%@@%=**%*=*#%*>;-;,>*#$*>-==--*#$*--*=>-*$$*--==>-*$$*>-*=>>*$$&->-=>>=%$&-,>-=&$@.#*->>;=%@", +"$=>>-=*>-&%-;,-=>,=#$&-;-->>&#$&-;-->>&#$*---->>*#$*->--;>&#$*----;>*@@%->-=--*$%=,--->>=%%-;-**>'*$%=,-**>,=$%-;-**>,=$%-;-**>;=#$*;>==>;-%#&*,;;>-*#@$*->>,=&#", +"%=,,>=*--&%->>--;;*$%=,=**>>=$%->-**>>=$%-,=**->=$%-,=**->=$%-,=**->=$@$*>,>'*%#&-,*-----%%=>=&&>;*#%->=&&>>*#%=>=&&>;*#%=>=&&>,&$@%->-=>-*##&=-===>=$@$*-;,;=&#", +"$=>,-**=-&%=>>>->,*$%=,=%%=-=%&-'=%%=-=%%=,=%&=-=%%=,=%%=-=%%=,=%%*-=$@#%=,,>*%#%=,---=--%%=-=%&-,*$$=-=%&-,*$%=-=%%-,*#%=>=%&='*#@$&->>;*%@@%=-===>=%@$*=-->;=%", +"$&>-=&*=-&%=>->>,;*#&-;*%%=>=%%->=%%=>=%&->=%%=>=%&-;*%%=>=%&-;*%%=-=%@$*-;>,=%#%-,--==>=%%=-=%&-,&#%*-=%&-,&#%*>=&&-;*#$=-=&&-;*@.@%=;,-&#@#&=;-->;=$@#=====,-%", +"$*>>=*=>-%%->-=-;'*#$=,=**->*%%=,=**->=$%=>=**->=$$=,=**->=$%=;=**->=$@%=>-->-*#%=,>--->=$$*--**-;*#$*-=**>>*#$*-=*=-;*@$*--**-,&#.@$*>,=%#@$&=,>>>-&#@%=--==;-%", +"$=,,>->,*%%-,>=-,>*#$&=->>;>&#$&=->>;>&#$&=->>>>&#$&=->>>>&#$&=->>;>&#@%==*&*-&#%*>;>>;>&##&=>>>,-%@#&=>>>,-&@#&=>>>;-&@@&=>>>;-&@.@%=,,-&$@$=;,-=*&#@@&-;>>;,-%", +"%*-'>'>=&#%=>;**>;&#@$&=;>-*%@@%&=;>>*%@@$&=>,>*%@@$&=>'-*%@@$&=,>>=$@@$%%##$%%@#*->;;>=$@@$&>,>-=%@@$*>,>>=$@@$*>>,>*$@@$*>;;>=$@.@%=>,>*%@%=>;=*$@+.@&-;-->>=$", +"#%&&&&&&#@#%&&%$&%#@.@#%&&%$@..@$%&&&$@..@$%&&%%@..@$%&%%$@..@#%&&%%@..@@@@@@@@@#%*&&&&$@..#$&&&&$@..@#%&&&$@..@$&&&%%@..@#&&&%%@.@@$%&&&$@+#%&&%%@...@#&&&%&&$@", +"@@##$#@@@.@@@@@@@@@...@#@##@....@@@@@@....@@@#@@.....####@.....@@@@@............@#$$##@@.....@#$@@@...@###@@@....@@#@@@...@@##@++...@###@@@..@#@@#.....@@@@#@@@.", +"..@@@@.......+@@@@.+.+.@@@@.+....@.@.@+...+.....+....@##@.+.........+.............@@@@..+......@@@@+...@@@@.+.........+...@@@@.........@@@@...@.@@@.+...........", +".@#%$#@.+....@#%$@....@$%%#...+.@##$#@.....@@@@....+@#&%$@...+........+.+.+.+.+..@#%%#.....+..@$%$@....@%%$@...+@@.@@...+.#$%#..+.+...@$%$@.+.+#%%#@....@@@@@@..", +".@$&*%#...+.@$&*%#...@#&**$@...@%&**&$@+@@#$###@+...#%==%@+....+..+..............@$&*%#@+....@$&*%@+..@%**&$@..@#$$###...@$&&%#.....+@$%*%@@..@%**%#@..@@#$#$@@.", +".@#*=*%#...@$&==%#.+@#%--=&#+.@#&-;;=&#.@#&*&*%#...@$&==&$@.@@######@...@#$##@@.+@$*==%#@...@#&*=%#..+#&=-=%#+@#&*&&&$$..@$*=*%@....@#&=*%@..@$*=-*$@..@%&&&&$+.", +".@%*--&$+..#%=-=%#..@%*---*$..@%=->>=%@.@%*===*$@+.@%=--*$@.@%&&%&&&%@@#%&*&*%$..#%*=-*%$@@@%&=>=&$.@@%=---*%@@%&====&$..@$*--%@+..@#&=-&$.+.@%=>-*#@..#%*-=*$@.", +"@$*->,=&#@#%=>,>*$@.@&->'>=%@+@$=>>)-&#@@&->'>=%@.@#*-;'-%#@$*-;--'>=$$&=-,>)>&#@$*-;'>=&#@$*->)>=&#@$=-,;'-&##&=,>'>=%@.@%=;;&#...@$=;;*#@..@&-;;*$@.+@&-;;*$@.", +"+$=->>;*$@#&---;-&$.#&=>>;-&#.@%=-->;*%@#&-->;-&@.@%*---;*%@$=>>)>->>%%='-=-,>*@#&>,-->,=$#*;;-->,=$#&>;---,=%%='-->;>&#.@$*>'&#.+.@$*>,&#...@$*>,&#@..@$*;;&#@.", +"@%=->-)=%##*->>)>*#@#*->>'>*$.@%=->>,=%##*->>'>*$@@%=>>-)=%#$=--,,--)&%='=&*=-&@#&;,---,-%#&,,>--)-%#&,,---'-%%='>--,)*$..#%-;*#...@#%-;*$..++#%-,&$....@%-;*$..", +"#&>;,,>=&#%=;,;,>*$@%=>';,>*$@#&>,,;;=&@%=>;;,>*$@#&>';>;=&#&=>,';>>>%%=>-===-&#$*',-->;=%$*'>>>>>-$$*'>>->;=%&-'-->>-*#..#&-,&$@+..#%-,&#@..+#&-;*#@..@#&-,&#@.", +"$*;>-->=&#%=;-->>*%@%-;-->-=%@#*;>-->=&#%=,-=>>*%@#*>,-->=&$*>--''>>-%$&->;>>>*##&;'>>->=%#&,';->>=%#%,';>>>=%%='>->>-*#.@$&-,*%#@.@$&-,=%#+.@$&-,=%#@.@$&-;=%#@", +"#*>,->,-*$%-'--,>-%#%-;--;;=%@$*>,->)-*$%-;->>,=%@$*>>>>'-*$*>,;'>;>-%@$&='>-=%@#&-,>>>,=$#%->>>>;=%#%->>>'>-%%*>;>>,>&#@#&->'=*&@@#&->,=*&@+#&->,=*&@+#&-;,=*%#", +"#%==-=-=*##&=-=--=%@#*=--=-=$@@%*-==-=*$$&--=--*%@#%=-===-&#%*===--=*#.@$*;>*%#..#%=-===&#@#&=--==&#@#&*-===&#@%&=-==*$@@#&=---*&@.$&=->==%@@#*=---*&@+$&==>-=&@", +"+#&&*&*&%@@%&*&&&%#@@%&*&&&&#@@#&*&*&&%@@%&**&&&#.@#&&**&&%@#%&&&&&&$@.@$=>=&@...@$%&*&%#@.@#%&*&%#@.@#%&*&%#..#%&&&&$@..#%&&*&&$@.#%&&**&$+.@%&**&&$+.#%&*&*%$@", +".@##$$##@..@@$$#$#@..@#$$#@#....@#$$#@@..@##$##@@...###$##@.@###@#@@@...@$&%#@.+...@@##@@...@+$##@@...@@####.@..@#$##@+...@#$$$@@+..@#$##@@.+.@##$$@@+..@#$$##@+", +"+@@$$#$@@....@@@@@....@@@.........@@@@....@@##@.+....@@@@@...........+...@...............+..@@@@...+....@@@@....@.@@@.................@@@@..@@#@@...............", +"@$***&*&$+.@@$%%$#@+.@#$$@@.+.+..@#%$#@+..@%&%$@..+.#$%%$#@.......@......@..@+...+.........@@$$#@......@#$%#@.+@@%%$#@+.+.....@..+...@@$%$@@@&&&#@+......+@@@@..", +"$*>,>>;=%#.@%&==*%#@@#&*&%@.....@#%==$@..@%*>-&$@..@$*==*&#+.@#####@@+.+.@#$@@.....@+@@@.+.@%**%$@.+.+@#&**%@.@@%*=*%@...#@$$#$@@..+@@%*-&@@%=>-%#@+.+.#@#####@.", +"%=>>,,,=&@@%&->;-%#..#%==*%@...@#&=-*%@.+#&=>>*%@..#&=>>-*#@@#%&&&&%@...@$**$@+.+.@#$%$%$#@#&*==&$#.@$$&*-=&#@#%&=--*%@@@$&&&&=&#@@$$%&=-*%@$=->&%$@@.@#%**&&&%#", +"#*->->>-*#$&-->>-&$@@#&=--*$$.+#%=->*%@@@$*-->=%#@@$&->>-&#.@%*=-==&#...$&->&#...@$&*=***$#&*====*%@#&*=*==*%#%*-====*#@#&-=**-=%@#&*====-*%$&=>-**&$.#&===*=-*%", +"$&->>>'>*$%*>>>>>*$@#%*>>--&$@#%*->>-*#@#&=>>>-*$@#%=>>>-*$@#&=>>>-*$@@@$*>>*$@.@$&-->>-=%%*>-=*--*#%*--*=--&$&->=*=>=%@$=>-=*--&#$&>-==->=%#&=>>--=%##&>>==->=%", +"#&-;,',,=%%=,,>>;-&#$*>;->;-%#$*>,->;-%#$=>,->;-%@$*>,->;-%#$=>;->;-%@@%&=--=&%@@&-;>>'>=%%*;>**--*$%=;>**--*$&-,=*=--&@%=;>**--*$@&---=->*$#%=,==->=%#&--==->*$", +"#*>>==-,-%#&>;-=->*$&='-==>,&$%->-==>;*#%=;-==>;*$%-;-*->,*#%='-==>'*#$&>-'>)>=##&>,-->,-%$&>-**=-*##*>-=&=-=$%=>=&*-=&@#*>-**=-=#@#&->>;*%@@%=;-=>>=$+#&->>>*%@", +"$*,-=*=,=%$&--=*=-=$%-,***>,&$%>'*&*>,&$&-,***>'&$%-,=&*>'&$%-;***>;&#@%*====&%#$*'>>>-,=%$&--**=>=$$&--**=-=$%=>=**--&@#&--**=-*$.@%=>,=&@@@&=,>>;>*#+@%*;;-%#.", +"#&,>=&=,-%$*--**=-=%&=,-*=-,&$%=,-*=-,*#%=,-==>,&$%=,-*=>;*#&=,-*=>,*@@#%&=-&%@@#*;,>-=,-%#%--=*->=%#%--*=->=%%*--*->>&#@&--==->=%@@%*-,=$@.#&=,,>-=%@.@$=>;*$@.", +"#&-;>>;>=$$=,>-=>,-%%=,>>,>>%#%=>;>;;-%#%=>>>>,-%#%=>>>,>>%#%=>;>>,=&@.@#&->&@..$*>,;;>>*$@%=>>>,;-%#%=>>>;,-%$&->>;;'*#@$*>;>;'-%@$*>;>&#+.$*->-*&%@++$*-;>*#..", +"@%*>>';=&#$=>'-=-'-%#&=>>,>*%@#&*,>,>=$@#&=>';>*%@#&=,>,>=$@#&*'>'-=$@..@$**%@..#&-,;,,=&@@#&->;>'>%@#&->,>'-%#$*>>,>,=#@$&=>'>,-%@%=>'>&+.+$*-;-*$@..+%=;,>&#@.", +"+@%%&&%%#@#%&&%&&&%#@#%*&&%%@.@#%%&&%$@.@#%&&&&$@.@#%%&&&$@+@#%%&&%$@@...@$#@+..#&=**&%%#..@#%&*&&&#.@#%&&&&%#.@$&&&&&%@.@$%&&&&&#@%=-=*%@..$&=-*&@@..+$====$+..", +"..@@###@...###@@@##@.@@####@...@@###@@@...@@#@@@@..@######....@@##@@..+...@@.@..@$%$$##@@.+.@@###@@@..+@@####@...#####@....@###@@@.@$%%$#.+.@$%%$#@....@$%$$@+..", +".........+.@#@@.............+....@.@..+.........+.@@$%%$%%$@....@.#@...@@#@##@.....@@#@........@.@.+.........+.........+....@.....+.@@@@@...#%%$@@@@.....@......", +"+...+@+...@%%%#@...+..........@#$#$#$#@@+.@@@.....@%===*=-*#+...@#%#$..@$&&&&#@...@#%&#@@...+.@@##@....@@#@.....+@@.@@@.@@#@@@.@....@$###$@@%=-&$$##@@..@+@@@#@.", +"...@#$#@..$*==%#+.@..@@$$##@+.$&**=***&#.@#$%#..+.@&,>>>>,=%.@@@#%*%#@.#&*===%@+.@#%*=&#@+...@@%&&%#+@@$%&$@.+@@$#$$#$#@@%&%%%$##.@@%&&&*&##*>;=***&%@.##$#@#$#@", +".+@#&*%#+@$=>'*$@@##+@%&**%#@@&=>>)>,>-$.@%**%@...@&>,>>-'-%@##$&*>*$@+#&=-->*#@@%&*-;=&%#...@%=>;*#@#%&--*$@@#%*=**=*&#%=--==*=&#@%*--=>=&#&-,>->>-=%@#&=%%**%@", +"..@%=-*#..#*>,=%$%&%#%=>)>-&#@%&==-=**%@.@%*=%@.+.%*>,,;>'-%$***=-'=%##%*=>-,*%#$*->,)-=*%+..#%->>*#$**=>>=&%#%=)'>),;=%&-',','>-%$&=->-;>*$%*-;--;,=%#$*>=&-;=$", +"..@%=>=%@.@$=>=&%*=%%*>>;;-=&#%**=>>**%#.#%==%@..@&-;>;;>'>&%->,,>'-*$%*--,-,-*%%=;>>'>>=%@.@$=>'>*#%-;,,,'>=$$&,>-=-'-%%*->>'>-*#%=>,,>,,-%%*-,==-;=%@$&;-=-;-%", +"..@$*--%@.@$*-;&*--%&>>=----=$&==-'>-=*$@@%=-%#...%->>>>,>-%%*-,----*%*=->'-,-=%&=';;;---%+.@%=>>>*#&->>>,--*$$*,-**=,=%#$&=>-=&#@$*->>-;;=%%-,>=*=>=$.@&-;;-=*#", +"+@$&*--%@..#%*,=*=*$%,-==->--%&*==;;==*$.@%=>&#.+@$=>;;;,;=%@#&->-=-*%&==-,-,-*%%=;,;,---%@.@$=>>-*$%=---,-*%##&,-&&*,-%.@$&-=*%@.@%*--->;*$&=;,=**-=$+@%=,;-*$@", +"#%====-&$@.@#&--=*%#&>-**->-=%#$%*-=&%$@.$%-,&#...#*>'>,>>=$.@$*->=&&$#%*=-->=&$%=;>,,=-=%@@#%*>,>-%%=>>>>-&$+$*,=&&=,=%..@%==*$@.@$*--->>&#%*=>=*===%@#%-,,-&$@", +"$*,;==-=%#..@%*,-&$@&->=*=>>-%@@$&-=&#@@.@%->=$@..#%->-=-=*#..@&->=%$@@#&=-=>-&#$&-=>'=**$#$%*=-;,-%$*,;>--*%@#&,>*&='-%@..#&==&#..$&--->>&#$%&=-=--=$$&*-;,>*%@", +"%-,;>>>>=$...#%=-=&##*>>==-;=$..#&--=$@..@#*--&$@.@%=>>-*&$@..@#&==&$@.#%=-*->-%#$&*-;*%$#&*->,->-=$@%->>-==*$$*>>---;-$+..#%*=*%@.$*-->;-&@@@%*-->>*$&>,>==>>*#", +"&>-==->;=%@..@#&*-=%#$*=>-**&#..@%=-*%@+..#%=>=&#.@#*-,-&$@.+..@$%**%@.@$&=&&==%@@#%-;&$@@%*--=**=*$@#*=**&==%$&-=&**-*$...@#%==&#+@&=->>-&@.@@%*=-*%#%==*&%*=-%", +"%**%&**=*$+...@#%=*%@@#&=&%$@+..@$&*&#@....#%==%@.@@%*=*$@......@#%%$@.@#%%$#&&%..@$*=%@..$&**&%%%%#.@#%%$$&&$@$%%$$%*%#+..+@$&&%#.@$&*===%@..@#%&&%@@$%%#@#$&*$", +"#$$##$%$$@......@$%#..@#$$#@.....@$#$@.+..+.#$%$@@..##$$#.+.+....@##@...@@@@@@#@..@#$%#@+..##$#@@@#@..@@@.@@#@.@##@.@$#@.....@#$#@.+@$$%&%#@....###@..@#@+..@#$@"}; diff --git a/hacks/images/matrix2.xbm b/hacks/images/matrix2.xbm index 5ed00843..515a1bca 100644 --- a/hacks/images/matrix2.xbm +++ b/hacks/images/matrix2.xbm @@ -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, diff --git a/hacks/images/matrix2.xpm b/hacks/images/matrix2.xpm index c3134b3c..f2f687fd 100644 --- a/hacks/images/matrix2.xpm +++ b/hacks/images/matrix2.xpm @@ -1,396 +1,393 @@ /* 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", +"...........................++++++................+..+............+++@@###@@+++.......+++@###@++............+.++......................................+.+.+.............+@#####@+........+@##$##@+...............+++++.................................................................................................++@@#@@+..", +"..........................++@@#@@++..........+++++++++++.........+@##$$$%$$#@++......++#$$%$$#+++.........++@+@+++..................................++++++............++#$%&%$#@+......+@#$%%%$#++............+++@@@+++...............................................................................................+@#$$$#@+.", +"........................+.@@$$%$$@@+.......++@@#@#@#@#@@++.....+.+#&**====&%$@+.....++#$&=-=&$#@+.......++@@##$#@+................................++@###@@+..........++#$&;;=*&#++....++#&*=;;&$#++...........+@#$$$#@+.............................................................................................+++#%===$#@.", +"........................++@$%*&*%$@++.....++@#$$%$$$%$##@++....++@$*====-=**%#+....++#$&*->-*&%#@++....++@#$%%%$#@++...........++@+++++..........++@#$%%$#@+........++@$&*;;==*#++....++#&==;;*&$@+.........++@#$%&&$#@++..........+.+++.............................................................................+#$&---&$@.", +"........................+@$*=;;;=*$@+.....++$%&=-***-=&%$++....++#%=->>>;;==*#@...++#$&->;;;-=*%$++....++#%=----%#@+.........++@@###@@++.........+@$%=--*&#++.......+@#%&=;;=**#++....++#**=;;**%#@+.......++@#%&;;;&%#@++.........++@@@++..........................................................................++$&*;;>&$@.", +".......................++#$*=;;;=*$#+....++#%**>-=*=>>**%#+....+@$&->>>>;;-=*$@..++@$%*->;;;>-**%@+...++#$&-->>-&$@++.......++#$%%%%%##++.......++#$&->-=&$@+......++@$==->>*&$@+......+@$**>;-==$@++.....++@#%&*;;;*&$#@++.......+@#$$$#@+........................................................................++@$*=;;;*%#.", +".......................++#&==;;;==%#@....++#&*=>>===>>=*&#+...++#$&->>>>;;-==%#..+@$%*=>>;;;>-=*&#@...+@$%*->>>>*%$@+.....++@#$%****&%$@+.......+@#&*>>>=*$@+......+@#%=->>>*%$@+.....++@#%*>>>-=%#@+....++@$$&*=;;;=*&%#@+......++#$&&&$#@+.......................................................................++#%*=;;;*$#.", +".......................+@#%->;;;>-&$++...+@$*=-;;---;;==*#@...+@#&*>>>>>;;-==%#.+@#%->>;;;;;;;==*#@..++#**=>>>>-==$@+.....++#$&>>;;;>-%#++......+@%*=;;;==$@++......@$&->>>-*$#+........+#%*->>>>&$@+....+@#*====;;;====*#@......+#$&;;;&$@+.......................................................................+@$&-->>>*$@.", +"........................@$&->;;;>-&$@+..++@$==-;;---;;-=*$@..++#%&*>>>>>;;--=&$.+@$&->>;;;;;;;-=*$@..+@#*==>>>>>-=%#@+....+@$%*>>;;;>>&$@......++#%==;;;=*$@+......+@%*>>>>-&$@+.......++@#&->>>>&$#+....+#$==-=-;;;-=-==$@.....++#%*;;;*%#++......................................................................+@$&->>>-%$@.", +".......................+@$&->;;;--&$@...++@%*=-;;-=-;;==&#+.++@#=--;;;;;;;;>>*%.+#$&;;;->===>-==*#@.++@#*=->>>>->-&$@+...++#&==;;===--%#@+.....+@$&>>>--*%#++.....++#$*>>>>-%#++.........@#%->>>>*%#+...++@$=--;;;;;;;-==$#......@#&*;;;*&#@+...........................+.+.+.+..++...............................+@#&*;;==*%#+.", +".......................++$&=-;;;>=&#@+...+#$==-;;=-=;;=*&#+..+#$==-;;;;;;;;>>*&.+#$*>;;->===>-=*&#+..+@#*==>>>>>>-&%#@+..+@#*==;;===--%#@+.....+@#&>>--=&$@++......+#%*;;;=&%#++.........+#$**;;;*%#++..++#$==-;;;;;;;>-=$#...+++#$&=;;;=&$#++.........................+++@+@+@@++@+++............................+#$&*;;==&$@+.", +".......................+@$&->;;;--&$@...++@$*==;;===;;=*%@+.++#$=->;;;;;;;;>>*%.+@%&;;;->===--=*&#@..+@#&==>>>>>>>*%$@+..+@#*==;;==*-=%#@++.....@#%->===$#@+......+@#&*;;;=&$@+.........++@$&=;;;*&#@....+@#=--;;;;;;;-==$@..++@#$%*=;;;=*&$#@+......................++@@##$#$#$$$##@@+..........................+@#%*=;;=*%#++.", +"........................+#&->;;;>-%$++...+@#*========-&%#@+.++#%==-;;;;;;;;>>*$.+@$&>>>;;>>>-==*%#@...+@$%*>>>>>>-==*@+..+@$&==;;==**&%$@@+.....+#$*=&%$#@+........+#&*;;;*&$@+..........+@$&*;;;*&#++..++@#%*==-;;;--=*%#@..+#$%&**=;;;=**&%$@......................+@$$%&&&&&&&&&%%$@.........................+@#&=-->>*$#++..", +".......................+@#%->;;;>-%#@....++#&**=*&&*==%#@+...+@$=->;;;;;;;;>>&$.+@#%->>;;>>>-==*&$@..++@#%*>>>>>>>==*#+..+@#**=;;===**%%$@+....++@#&&$#@+++.......+@#&*;;;*&$+...........++$&*;;;*&$+....++#$**--;;;-=**%#@.+@#%**===;;;===**%$.....................+@$%****=**=****&%$.........................+#$*>;;-=&$@+...", +"........................+#$*=;;;=*%@+.....++@#$$$$$$$##@@+..++#%&==;;---;;==*%#..+#$&*=--;;;;;--=%#...+@#%*->;;;>>**%#+..+@#*==;;;;;====*$@......+@@#@@@+..........+$&*;;;*&#@...........++$&*;;;*&#@+...++#%*=;;---;;=**#+.+#%*;;;;;;;;;;;;;*%.....................+#%*;;;;;;;;;;;;;*%........................++#%*;;;==%#@+...", +"........................+@$**;;;=&$#++....++@@@#@@@@#@@+....+@#%**=;;---;;=**%#.++@$&**->;;;;;>>-%$...+@#%*>>;;;>>=*%$@.++@$*==;;;;;==-==$#......++++++...........++#&*;;;*&$++..........++$&*;;;*&#+.....@@&*=;;---;;=*&#+.+#&*;;;;;;;;;;;;;*%............+........+#&*;;;;;;;;;;;;;*&........................+@$&*;;;==$@+....", +"........................+@#&*;;;*&$@........++++++++++++....+@#&*==;;---;;==*%#..+@$%*==-;;;;;>>-&$..++@#%*->;;;>>=*&$@.++#$*==;;;;;==--=%#.......+++.+...........++#&*;;;*&$@+..........+@$&=;;;*&#+.....+#%*=;;===;;=*&#+.+#%*;;;;;;;;;;;;;*%........+++++++......+@%*;;;;;;;;;;;;;*%........++++++.........++#$==;;;*&$@++...", +"........................++#&*;;;*%#++...........+.+.+.......+@%*;;;;;;;;;;;>>%#.++#%==-=-===>-;;;*$..++@*==--;;;;>>>-%#.+@#&=>>>>;;;;;>>-&#.......................++#&*;;;=&$@+..........+@$&*;;;*&#@+...++@%**=-***-=*&%@+.+@$%**===;;;===**%$.......++@@##@+++....+@$%***=*=*=*=***%#......+++@###+++.......+@$&>>>--&$@+.....", +".........................+#$*;;;*$#+........................+#%*;;;;;;;;;;;>>$#.+@#%=->=-===--;;;&%..++@&*==-;;;;;>>-%$.+@$&->>>>;;;;;>>-%#.......................++#&*;;;=&%@+..........+@$*=;;;*%#+....++@$&*==&&&==&%$@+..+@$%&**=;;;=**&%$@.......+@#$$$$#++....++@$$&&&&&&&&&&%%#@......+@#$$$$#@+......++#%*>>--=%$@+.....", +"........................++@$&***%$@+........................+@$*=--;;>>>>>=*&$@.+@$&>;;;;;>;;;>>>*$...+@#$%*=>>>==>>-&#.+@$*;;;-->->;;===&$........................+#%*>>>-=%#@+........++#%=->;>*%#+.....++@###$#$#$$##+++..++@#$&*=;;;=*&$#@+......++#$===&&#++....++@####$#$$#$$##@+.....++#&*===$#+.....++@$&*>;-==$@+......", +".........................+@#%***%#@+........................+@$%=--;;>>>>>**$#@.+@%&>;;;;>>>;;>>-&$..+.+@#$&*>>>==>>-&$.+#$*>;;>-->-;;-==%#.......................++@$&>>;-=&$@+.......++@$&=-;>>*$#++.....++@@@@@@@@@@++.+....+@#$&=;;;**$#@+.......+#$&---=&#@+......+++@@@@@@@+++++......+@$&=---%$@+....+@#&*=;;=&%#@+......", +".........................++#%***%$++.........................@#%=--;;>>>>>*%#@+.+@$&>;;;;>>>;;>>-%#...+++@$%*>>>==>>-&#.+#$&>;;->-->;;===&$........................+@$&=->>>&%@++......++#$*>>---&$@+........+++++.++++.+.......+@#&*;;;*&$@+.......+@$%*>>-=*$@+........+......++++.......++#$*=>>-&$@+....+@$&==;;*&$@++......", +".........................+@#%;;;%#@.........................++#%==-;;>;;--&%@++.+@#&=-->>;;;>>**%#@.....++@$&>;;;;>>-%#.+@$&>>>;;;;;;;;;;*%.........................@#%=->>>*&#@+......+@#%*>>>-=%#@..........+.+.....+.........++#%*;;;*%#++.......+@%*=;;;=*$@+...........+...............+@%=-;;;&$@+....+#%=-->>*%#@+.......", +".........................++#%;;;%#@+.........................+@$==-;;;;;--&$@+...+#$==-->;;;>>*%$#+......+@$%>>>>>>--$#..@#%->>;;;;;>>;;;&%.........................+#$==->>*&$@++.....+@$&*>>-==$@++............................+@$&;;;&$@+.......+@#%==;;;-*$@++.........................++@$=-;;;&$@++...+#%=>>>-*$@+........", +"..........................+#$%%%$@++........................++@$*=-;;>>>>-%$@+..++++#$%*=;;;**$#++........+#$%&*&*&%%#@..+@#%&***=******&%#.......................+.++#%*=;;==*#+.....++#*==;;**%#@+.............................+@#%&&&$#@+........@#&>>>--*%#@+...........................+@#$&&*&$#@.....+#%-->>-%$@+........", +"..........................++##$#@@+..........................+@$*=-;;>>>-=%#+......++#$&*;;;*&#@+........+++@#$$$$$##@+..++@#$%&%&&&&&&%$#@.........................++@$%*;;==*#++....++#*==;;*&$@+...............................+@##$$#@+........+@$%>>--=&$@+.............................+@#$%$$#@++....@#%=-==*$#+.........", +"...........................++@@@++...........................++#&*=>>>>>-=$#++.......+@#%=-=$#@+...........+@@@##@@@++...+++@@@###$######@+..........................++#%&;;=*&#+.....++@&*=;;&$#++................................++@@@+++........++#&->===$#++.............................+++@@#@++......+@$===*%#@+.........", +"............................+++++............................++@#$%&&*&&%$#++.........+@#$$$#@+..............+++++++++......++++@+@+@+@+++............................+@#$%%%$#@++.....+@#$%&%%#@+..................................+++.+..........++#%*=&%$#@++...............................+++++++......+@#***%%@++.........", +"..............................................................++@##$$$$$##@++..........+@@##@++................+.+............+.+.+.+.+................................+@##$##@++......++@##$#@@+.....................................+............++@#**%$#++..................................+.+.........++@#$##@@+..........", +"......+++@@++++.........+.+++@++++..........+++@+@@+@+++.........++++@@@+++.............+++@+++........+++@@@@@@@++++............++++@@++.....++@+@@@@@@@@+++.........+++@+@+++...........+++@@+@+..................................................................................................................+.+.........", +".....+@@##$##@+++.......++@@####@+..........++@###$$##@++.......++@#$#$$$#@++..........+@@@##@+++.....++@###$$$$$##@++.........+@@##$###@@+..+@@#$$$$$$$$##@@+......++@@##$###+++.......+++@#####@+++............................................................................................................+++++@++++.....", +"..+++@#$%%&%%$#@++....+@@#$%%%%$#@++......++@#$%%&&&%%$#@++...++@#$$%&&&%%$#@++......++@#$%$%$#@+...+.+@#$%&&&&&&&$$@@......+++@#$%%&&%$$@+.++#$%%&&&&&&&&%$#@....+++##$%%&%%$$@@+......+@#$%%%%%$#@@+.........................................................................................................++@######@@++....", +"..++@$$*=->-=*%$@++..++#$%&*=---%#++.....++@#$&==>>>==&$#@+...+@#$&==>>>==%%#@+......+@#%*====$#+....+@%&*->->->>==*$@+.....++#$%&*->--=%$@.+#$==->>>->>>===$#+...+@#$&*=->-=*%$#@+....+@#$&---==&%$#++.......................................................................................................++@$$%&&&%%##++...", +"..@@$%&==>>>==&%$@+.++#$&**==>--&%@+.....+@#%&*-->>>--*&%#@..+@#%&*-->>>--*&%#@.....++#%&===-=%$@+..+@#%*=>>>>>>>--=$#+.....@@$&**=>>>>-*$@.+#%=-->>>>>>>--=%$@..+@#$&*==>>>==*&%#@..++@#%&*>>>--**&$#+....................................................++++++.........................++++++.............++#$%&******%$#@+..", +".+@$*==;;;;;;;==*$@.++#%>;;;;;;;*%#+....++#$=->;;;;;;;>-=%#.+@@$=->;;;;;;;>-=%#.....+@$*=;;;;;*$#++.++$*==;;;;;;>>-=%#+...++@$*=;;;;;>>>*%#.@$&>>;;;;;>;;;;>&$@.+@@%=--;;;;;;;>-=$#...+#$*;;>>>;;;;>&$@..................................................+++@#@@@++......................++@@#@@@++..........+@$**;;;;;;;=*%#++.", +".+#$===;;;;>;;-==$#.+@#&>;;;;;;;*&#@+...++$%->>;;;;;;;>>-%$..+#%-->;;;;;;;>>-%$....+@#%==;;;;;*%#+..+@$*=-;;;;;;;>>-%#+...+@#%*=;;;;;;>>*%#.@$&>>;;;;;;;;;;;&%@..@$%->>;;;;;;;>>-&$..+@$%*;;;;;;;;;;&%@.........++++.................++++++...........+++@@#$$$$##@.....++++++++++++....+@@$$$$$#@@++.......++#%*=;;;;;;;=**$@+.", +"+@#%=--;;;;;;;-==%$..@#%>>;;;;;;*&#+.....@$&->>;;;;;;;>>-&$.+@#%->>;;;;;;;>>-&$....+@#%==;;;;;*&#++.+#$==-;;;;;;;>-=%#+..++@%&=-;;;;;>>>&$@.+#%>>;;;>>;;;;;;*%@.+@$&->>;;;;;;;>>-&$.++@$**;;;;;;;;;;*%$.......+@@@@@@++.............++@#@@@+..........+@@$$%&&*&%#@....+++@@@@@@@@@+@+..+@$%&*&&%$#@@++.....+@#&*=;;;;;;;==*%#@.", +"+@%&>;;--===--;;>&$..+@$&**==;;;*&$@....++$%>>;--===--;;;*%..@#%=--=====->;;>&$....+#$*>;>>>;;*&#@..+#$==-;;======*&$#+..+@#%*;;>>>===*&%#@.+@$%&****==>>>>>&$@.+@%*>;;--===->;;;*$.+@#*==;;=====;;;=&$.....++@#$$%$#@+............+@##$$$#@+.......+@@#$%&--;;;=*$..++@##$$$$$$$$$##@+.@#$;;;>>*&&$#@++....+@#*==;;===>>;;>&$@.", +"+@%*;;;--***--;;;*%.++@@$&**=;;;*%$++...+@#%>>>==**=--;;;*%.++@#=-==**==->;;;*%...+@#%*>;>>>;;*&#++.+@$==-;;-=====**$#+.++@$**;;>>-===*&$@+.+@@$$%%&&*=>>>>>&$@.+@$&;;;>-===--;;>*$.+@$*=-;;=*=*=;;;**$.....++#$&&&&$#@+..........+@#$%*&&$#@+....++@#$%***--;;;=*#..+@#%%&&&&*&&&&%%#@.+#%;;;>>=**&%$@@+...+@$*=-;;===>>;;>*%@.", +"@#%*;;;-=***==;;;*%...++##&*=;;;=%$++....+@$%&&&&&**>>;;;*$..+@#$%%&***=;;>>>&$..++@%*=;;-=-;;*&#@..+#$*=-;;;;;;;>-=%#@.+@#*==;;>>>>>=*&$@+..++@@##$%**;;-==%#@.+#$*>>>>>===>>>>>&%.+@$==-;;=*=*=;;;=*$.....+@$==;;;&$@+..........+@$==;;;&$@+...++@#%*=>;;;;===&%#..@#$-->>>>>>>->--%#.+@$&*=>>;;;-=%$#@@..++#**=--=*==-;;;*$#.", +"+#%*;;;-=*&*==;;;*%....++#$**;;;*&#@.....+@@#$$$%&*=>>;;>*$...++##%%&*==;;>>>&%..+@#&*=;;---;;*&$++.+#$==-;;;;;;;--=%$+.+@$*=-;;>>>>-==*$#+...++++@#$&*;;-==$#+.+@$&>>>>>===>>>>>&$.+@$==-;>=*=*=;;;=*$....++#$=-;;;*$#+.........++#$=-;;;*$#+..++#$%&==;;;;;==*%#@.+@$&->>>>>>>>>>>-%$.+@#$&*>>;;;--*&%$#@.++#%*====*==-;;;*%#.", +"+#%*;;;-=&&&==;;;*%.....+@#&=;;;*&$++.....++@##$%&**>>;;>&$...++@@$%**==;;>>>&$..+#$*==;;=-=;;*&$@+.+@#*==;;;;;;;>--&$@.+#$==-;;>>>>>===%$@.....+++@$&=;;-=*$@+.+@$&->>>>===>>>>>&$.+@$*=-;;==*==;;;=*$....++@%=-;;;*$#+.........++#$=-;;;*$#+..@@$%**=-;;;;;=**#@+.+@$&>>>>>>>>>>>>>&$..+@#$&->;;;>-=**%$@.++@%&*==**==-;;;&%@.", +"+#&*;;;==&%&==;;;*%......@#&*;;;*&#@.......++@#$%==-;;===%#....++@$==;;;;;-==&$.+@$%-->>>-=-;;=*$@+.+@#&*=>>===>>;;;*%#.+@$==-;;;;;;;;;;*$#......+@#%*=;;**$#++.+@$&==-;;;;;;;===&$.+@$*==;;===>>;;;=*%.....+#$*=>>>&%@++.........+#$==>>>*$@@..@$%>>>;;>>-=*&%#@++.@#&*>>;;;;;;;;;;>*%...+@#$&*===;;;;;=*$..++@#$&*==-;;>>>&$@.", +"+#%*;;;==&%&==;;;*&......@#&*;;;*&$++.......+@#%*=--;;==&$@....++@#*=;;;;;===&$.+@$&->>>>=-=;;=*%$@..+@%&*>>===>>;;;*&#.+#$==-;;;;;;;;;;*%#......+@$&*=;;*&$@+..+@$&===;;;;;;;-==&$.+@#*==;;===->;;;=*$....++@$*=>>-%$@...........+@#*=->-%$@...@$&>>;;;>--*&%#@@...@#&*>>;;;;;;;;;>>*&....+@#$&*==;;;;;==$..+++@$%*=--;;>>-%#@.", +"+#&*;;;==&&&=-;;;*%.....+@#&*;;;*&#@........+#$*=;;;-=*&$@@....++#$%&===>>;;>&%.+#%*;;;;;>>>;;-==$@.++@#$%%&&&*==;;;=*$.+@$==-;;-====;;;=*$......+@$=-->>*%#@+..+@$&>;;>>=-=>>;;>&%.++#$**>>;;;;;;;;=*$......+##%%%%$@++..........++@$$&%%$@++..#&*;;;;;---*&$#+++..+#&*>>>>>>>>>>>>>*%....++@$%*==;;;;;-=%....+@#%*;;;--**%$@+.", +"+#%*;;;==&&&=-;;;*&......@$&*;;;*&$@......++@$%==;;;-=&%#++...++@#$$&*==>>;;;*%.+#%*;;;;;>>>;;>-=%#.++@#$%%%$%&*=;;;=*#.+#$==-;;=====;;;=&$.....++#%=--;>*%#++..+#%*;;;>>===>>;;;*%..+@#%*>;;;;;;;;;=*$.....+++@#$$#@@+............++##$###@.+..#%*;;;;;---*&$#@+...+#&*>>>>>>>>>>>>>*$....++#$&**=>;;;;-=%.....@#%*;;;-=*%##++.", +"+#&*>;;-=*&*==;;;*%.....+@$**;;;=&$@+.....+@#%*=-;;;-=%$@++..++##$$$%&*=>>;;;*%.@#&*;;;;;>>>;;>-=%#.++##$$$$$$&*=;;;=*$.+@$==-;;=====;;;=*$.....+@#&=->>>*$@+...+@%*;;;>>===>>;;;*%...+#%&>>;;;;;;;;=*$......++@#@#@@+.............+++@##@+++...@%*>;;;;>-==*&$#@++.@#&*>>>>>>>>>>>>>*%...+@@$%**==;;;;;==$....++#%*;;;==%$@++..", +"+#%*;;;-=*&*==;;;*%....++#$&=;;;**$#++..+++#&*=;;>>-=&%#@++.++@$*==&&&**--;;;*%.+#&*;>;;;;;;;;>>-&#.+@#*==&&%%&*=;;;=*$.+#$*=-;;==**=;;;=*$.....+@$&>>>>-&$@++..@#%*;;;--===--;;;*%..+++$%*===---;;;*&#.......+@@###@++............++@@###@+....+#$&*=--;;;;>*&%#@+.+#&*>>;;;;;;;;;>>*%.+++#$%==;;;>>=**&$#.....+#%*>>>*&$#++...", +"+#$*;;;-==**==;;;*$...++@$%*=;;;=*&$@@+..+#$*==;;>>-=*&$#@+.+@#%===*&**=--;;;*%.+#&*>>;;;;;;;;>>-&$.+#$===**&**==;;;=*$.+@$==-;;=====;;;**$....++#$*>>>>-&$@+...+@%*;;;--===--;;;*%...+@#%**=-==-;;;*%#......+@#$%$$#@+...........++@#$$$$#@+...+@#$%*==;;;;;==&$#@.+#%*>>;;>;;>>>>>>*%..@#$&*--;;;>>**&$#@....++#$*>>>*%#@+....", +"+@$&>;;--===--;;>&$..++#$%**=;;;=**%$@+.+@#%*==;;>>-=**%#@@.+@$&==-=**=*--;;>*$.+@%&>>>;;;;;;;>>-&#.+#%==-==**===;;;=&$.++#*==;;=====;;;=*#.....+#$*>>>>-%#++...+#$*>;;--=*=--;;;&$..++@$%*===--=;;;*%#.....++#$%&&&$#++..........+@#%&*&%$#@...++@#$%==;;;;;==*&$#.+@$&>>>>>>>>>>>>-&$.+@$&*=->;;;>-&%##++.....+@$*>>>*%#++....", +"++$%==-;;>>>;;--=%$.++@$*==>>;;;>>-==$@.+#$*;;;;;>>>>>==*$@.+#%*;;;>>>>>;;>>>&$.++#$&**=->>>;;>--&$.@#$-->;;>->;;;;>*%#.++#$**;;;;;>>;;;**#.....+#%*;;;**$#+....+@$&->>;;>>>;;>>>&$..+@$%*->>>>;;>>>&$@....++@#==;;;&$@+.........+@#%==;;;&#@+....++@#$&***>>;;;=*#.++#$%&&&*&**&*&&%$#.@#$>;;;;===*&$#@++.....++@$&->-&$@+.....", +"++@$*==;;>>>;;==*$@.++#$==>>>;;;>>-==$#.+#%*;;;;;>>>>>--=$#.+#%*;;;;;>>>;;>>-%#.++@#$&*==>>>;;>--%$.+#$=>>;;>>>;;;;>&$@..+@#%*;;;;;;;;;;*&#.....+#%*;;;*&$++....++#%->>;;>>>;;>>-%#..+@%&*>>>>>;;>>-%$@.....+#$==;;;&$@+.........+@$&=-;;;&$@+......+@#$%&*--;;;=*#.+++@#$%$%$%$%%$$##+.+#%>;;>>=*&%$#@++.......+@$&->-&$@+.....", +".+@#$&*=->;>>-*&%#@.++#%=->;;;;;;;>-=%#.+#%*>;;;;;;;;;>-=%#.+@$%===;;;;;>>**%$#...++@$%==>;;;;>>-%$.+@#%*=>>;;;>>=*&$#@...+@$%==>>>;;-==&$@....++@$&>>>*%#++....++@$%*=>>;;;>>**%$@.++#&*=>>;;>--**%$@+....++#$==>>>*%#++.......++#$*;;->=&$@+........+@#$$&&**&%$#...++@@@#@###@#@@@++.+#$****&%%$#@++.........+@$&->-&$@+.....", +"..+@#$&==>>>-=&%#@+.++#%=>>>;;;;>>>--$#.+#%*>>;;>;;;>>>--%#..+#$*==>>>>>>>*&$@+....++#$==>>>>>>--%#.++#$%*->>>>>>*&%#@+...++#$**>>>>>==*%#@.....+@$&---&$@++.....++@$%*->>>>>>*&$#+.++@%*=>>>>>==&%##++.....+@$*=>>>&$@+........++#%*;;--=%#@+........+++@##$$%$$@@...+.+++++++++++++...+@#%&&%$##@+++..........++#%---%#@+.....", +"...+@#$*=>>>==$#@+...+@$==->>>>>>>-==$@.+@%&>>>>>>>>>>-==$@.++@$&*=>>>>>--%$#@+....++@#**>>>>>-==$@..++@$%-->>>>-&$#@+.....+@#%*-->>-=*&#@+.....++#$=--$#@+.......++#$%-->>>--%$#++.++@%&*>>>>>=*%#@++.....++@#*=>>-%#@+........+@$&*;;-==$@+...........+++@@#@@@+..........+..+.+.......+@##$##@+++.............@#$===$#+......", +"....+@#$%%&&%$#@+...++@#$%&&*&*&*&&%$#@.++#$%&&**&**&*&%$#@..++@#$%&*&*&&%#@++.......+#$%&&&&&&%$#@...++##%&&*&&%$#+++......+@#$%&&&&%$#@++.....++@#$$$#@+........+++#$%&&&&&%$@+++..+@@$%&&&&&%$#@++.......++##$%%$$@+.........+@&*=->*&%#@+............+++++++++........................++@@++++...............+@#$$$#@+......", +".....++@##$$##+++.....++##$$$%$%$$$$@@+..++##$$$%%$%$$$##++...++@@##$%$$$##++......+.++@#$$$%$$##++....++@##$$$##@++.........+@@##$$##@@++.......++@###@++..........++@#$$%$##@++.....++@@$$$$$#@+++.........++@#$##@++........++@%**-=&$#@+.................+.+..........................++.++..................++@@#@@++......", +"......++@@@+@++.......+++@@#@#@#@@@++++..+++@@#@#@#@#@@++++.....++@@@@@@@+++...........++@@@#@@+@+.....+++@@@#@@@+++..........++@@@@@@+...........++++++..............++@@@@@@++.......++@@@@@@+@+...........++++@+@++..........++@$$$$$#+++.......................................................................+++++........", +".........................+.+.+.+...........+.++++.+.+................++++.+.......+++.+++.+............+.+++.++++.+.........++.+++.+++.+............++++.+.........+.++.+....+.++.+......+.++.++++.+..........+.+++.+++.+......+.+++...+.++..+......+++.+.+............+...........++.+.....+........++............+..+.........", +"......+++++++...........++++@+@+++........+++@+@@@@@+++...........++@+++@+++++..+++++@+@@@@@++........++@+@@@@@@@@++++...++++@@@@@@@@@@+@+........+++@+@@+@++++..++++@+@+++++@+@+++.....++@+@@@+@+@++.........+@+@@@@@+@++....++@+@+@+++@++@++....++++@@@@+++.........++@+@+..+..++++++...+++++++.+++++@+++.......++++@+++......", +".....++@####@@++......++@@##$###@+......++@@#$$#$$###@+++.......++@@#$$####@@++.+@##$$$$#$##@@++....+++@#$#$$$$$$#$@@+...+@@##$$#$$$#$###@+.....++@@#######@@++..+@###$###@###$###@..+++@##$#$$$$###@@.....+++@##$#$#$###@+.++@###$###@######@+.++@##$#$####++......++@@###@++++@@####@.++@@###@++@@#####@+.....++@@####@@+.....", +"..+++@#$$%%$$#@+.....++@#$%%%&%$#@+.....+@#$%%&&&&&%%$#@++....+++@#$%%&&&%%$$#@.@#$%%&&&&&%%$#@++...+@#$%&&&&&&&&&%$#@+.+@#$%&&&&&&&&&&%$#@...++@@#$%&&&&%%$$#@.+@#$%&%%%$$$$%%&%$#..++##$%%&&&&&&%$#@@....++#$$%&&&&&&%$#@.+@#$%%%%%$$$%%%%$#@.++#$%&&&&&$$#@+.....+@#$$%%##@+@##$%%$#.+@#$$%$$#@##$%%%$#@...+++@#$%%%%$##++...", +"..++@#%%***&&$#@+....++#&*=----=%#@+....+#$=----->--=*%$@++...+@#$**-----==***#.#**---->---==%$#@++.+#$=----->-----=%#@.+#$=--->->->->--=*#...+@#$**-----==***#.@#**-----***-----**..+@#*==---->--==*$@....+@#*=-->->---**#.+#**-----***---==$#.+#$=-------&%#++....@#**--=&%###%&-=-**.+#$==-=*$$$*==-=**#...+@#$**---==%$#@+..", +"..+@%&*>>;;;-=$#++...+@$*==>>>->&%#@+...@$%-->>>>>>>-=*&$@+.++@$$&*=->>>>=-==*$.$*=->>>>>>>-=*&$#@+.@$%-->>>>>>>>>--&$@.@$%-->>>>>>>>>>-==$.++@#$&*=->>>>=-==*$.@$*=->>--*=*-->>-=*.++@%==->>>>>>>-==$@...++#%==>>>>>>>>=*$.@$*=>>>>-=*=->>--%#.@#%=->>>>>-=&#@+....@$==-->*&$$$&*-->=*.@$&---==&%%==->>=*$..@@#%&*=->--=&&$#@+.", +".+@#&*=>;;;;-=&$@++..+@$===>>>>>*&$@+...@$&->>>>>>>>>==*%#@.+@$%&*=->>>>>---==%.$==>>>>>>>>>-=**%#@.@$&->>>>>>>>>>>>*%#.@$&->>>>>>>>>>>>==%.+@$%&*=->>>>>---==%.#$==>>>>>===>>>>>==.++#$==>>>>>>>>>-=$#...++#%=->>>>>>>>==$.#$==>>>>>===>>>>-&$.@$&->>>>>>-=*#@+....#$==>>>=*&%&*=>>>==.#$*->>==***==>>>==%.+@$%&*=->>>>-=**%#@.", +"++#$*==>;;;;>-*%#++.++#$=->;;;;;-=%#++..#%*;;;;;;;;;;;;;*$#.@#%-->;;;;;;;;;;>>&.%=-;;;;;;;;;;;;;&%#.#%*;;;;;;;;;;;;;=&$.@%*;;;;;;;;;;;;;>>&.@#%-->;;;;;;;;;;>>&.@%=-;;;;;===;;;;;-=.++#$=->;>;;;;>>-=%#...++#%->>;;;;;;;==$.#%=-;;;;;=-=;;;;>*%.@$&>>;;;;;>=*$@+....#%=-;;;>>***->;;;-=.#&*;;;;;=**>>;;;-=%.+#%-->;;;;>;;;;;&%#.", +".@#%=->>>---;;=&%@+..+@$=->;;;;;>=&$@+..@%*>;;;;;;;;;;;;*%#.@$&->>;;>>>>>;;;>>&.$=-;;;;;>>;;;;;;*&$.@%*>;;;;;;;;;;;;=*$.@%*>;;;;;;;;;;;;;>&.@$&->>;;;>>>;;;;>>&.#$=-;;;;;===;;;;;-=.++@$==->;;;;;>--=#@...++@$=->>;;;;;;-=$.@$=-;;;;;=-=;;;;>&$.@$&>>>;;;>>=*#++....#%=-;;;>>*=*>>;;;-=.#&=;;;;;===>>;;;-=%.@$&->>;;;>>;;;;;*&$.", +"+@$&->>>>---;;=*&#+.++@$%*=;;;;;>>*$@+..@$&=--;;=====;;;=*$.#%*;;;--=*=*=>>>>>&.$&=;;;--==*==;;;-=%.@#&=--;;=====;;;**$.@$&=--;;=====>>>>>*.#%*;;;--=*=*=>>>>>&.@$&*;;;-====--;;;=&..+@#$&**=;;;==*&$#@....+@#$&**=;;--=&%#.@$**;;;--;;;;;=*&$#.+#$&*=;;==*%$@@.....#%==;;;;;===;;;;;==.#&*;;;;;=--==;;;=*%.#%*;;;--==*==;;;-=%.", +"@@%*;;;--->-;;-==$#...+#%&=>;;;;>>*%#++.+#%=--;;=====;;;=*$.#%*;;;-=**&**->>>>&.#&*;;;-=****=;;;-=%.@#%=--;;=====;;;=&$.+#%==-;;=====--->>%.#%*;;;-=*****>>>>>&.@$&*;;;--=*=--;;;*&...+@#$&*=;;;=*%$#@+....++@#%&*=;;--=&$@.@$&*;;;--;;;;;**%#@.+@$%*=;;==*%#++.....#$*=;;;;;===;;;;;=*.#&*;;;;;---==;;;=*%.#%*;;;-=****=;;;-=%.", +"+#%*;;;>>;;;;;-==$@..++#$**>>;;;;>*&$@+.@#%==-;;=====;;;=*$.$&*;;;-=&%$%&=-->-%.#&*>;;-=*&&**;;;>-&.@#$==-;;=====;;;*&#.@#%=--;;=*===>-->-%.$&*;;;-=&%%&*-->>>%.+#**;;;--===--;;;*&....+@#%&=;;;**%#+++.....++@#$**;;-==&#@.+#&*;;;--;;;;;*%$@+..+@$**;;=*&#@++.....#%*=;;;;;===;;;;;=*.#&*;;;;;>->==;;;=*$.$&*;;;-=&%&**;;;>-&.", +"+#%*;;;>>;;;;;-==%#..++#%*=;;---;;=*%@+.+#$==-;;>>>;;;;;=*%.$*=;;;=*%$###$%&%%#.#&*;;;-=&%$&*>>>>>&.+#%==-;;==-;;==*&$@.+#$==-;;===;;=**&$$.$*=;;;=*&%$%&*=***$.+#%*;;;>>>>>;;;;;*&.....+@$&*;;;**$@+.......+++@$&*;;-==%#+.@#&*;;;;;;;;=**$@++..+@$&*;;=*&#@.+.....@%*=;;;;;-=-;;;;;=*.#%*;;;>>;;;==;;;=*$.$*=;;;=*%$$%*>>>>>&.", +"+#&*;;;;;;;;;;-==$#..+@#**=;;---;;=*&#+.+#$==-;;>>>;;;;;=*%.$*=;;;=*$#+@@###$#@.#&*;;;==%$$%*->>>>&.+#$==-;;=-=;;==*$#@.+#$==-;;===;;**&$#@.$*=;;;=*%$%&**==*&$.+$&*;;;>>>>>;>;;;*%.....+@$&*;;;*&#@+.....+++++@#&*;;-==$#+.+#&*;;;;;;;;=*%$@+...++#&*;;=*%#@+......@%*=;;;;;-=-;;;;;=*.#&*;;;>>;;;==;;;=*$.$*=;;;*&$##%*->>>>&.", +"+#%*;;;;;;;;;;-==%#..+@$*=-;;===;;-==$@.+#$==-;;;;;;;;;;==%.$*=;;;*&$@+++@@@@@+.#%*;;;==%$#$&-->>>*.+#$==-;;;;;;;=*%$@+.+#$==-;;;;;;;**$#@+.$*=;;;**%$%=----==$.+#%*;;;;;>;;;;;;;*&......+$&*;;;*&$++...++++@@+@#&*;;-==$#+.+#%*;;;;;;;;==&#@+...++$&*;;=*%#@+@++...@$*=;;;>>;;;>>;;;=*.#&*;;;--;;;--;;;=*$.$*=;;;**$##$&-->>>*.", +"+#&*;;;;;;;;;;-==%#.+@#%==-;;===;;-==%#.+#$==-;;;;;;;;;;-=&.$*=;;;*&$@+++++++++.#&*;;;==%##$&-->>>*.+#$==-;;;;;;;=*%$@+.+#$==-;;;;;;;*%$@++.$*=;;;=*%%&->>>-==%.+#&*;;;;;;;;;;;;;*&.....+@#&*;;;*&#@....+@##$###$&*;;-==$#+.+#&*;;;;;;;;==&$@++..++#&*;;=*&#@#@@@++.@%*=;;;>>;;;>>;;;=*.#&*;;;--;;;--;;;=*$.$*=;;;*&$@#$&-->>>&.", +"+#%*;;;>>;;;;;>>-&$.+@$&=--;;===;;--=&$.+#%==-;;;;;;;;;;-=&.$*=;;;=&$@+++@@@@++.#%*;;;==%$#$&=->>>*.+#$==-;;;;;;;=*&%##.+#$==-;;;;;;;*&#++..$*=;;;**&&*->>>>==%.+#&*;;;;;;;>;;;;;*&......@$&*;;;*&$++...+#$%&%%$$&*;;-==$#+.+#&*;;;;;;;;-=*%#@+..++#&*;;=*&$$$$##@+.@$*=;;;>>;;;>>;;;=*.#%*;;;--;;;--;;;=*$.$*=;;;=&$##$*-->>>*.", +"+#%*;;;>>;;;;;>>-%#.+#%*>;;;;;;;;;;>>&$.+@$==-;;=====>>>>>&.$*=;;;=*%#@@@##$$#@.#&*;;;==%$$%&-->>>&.+#$==-;;---;;===**#.+#$=--;;---;;*%#+...$*=;;;==&&*;;;;;>-&.+#&*;;;--===--;;;*%.....++$&=;;;*&$@+...#%*>>>&%%**;;===$#+.+#&*;;;>->>>;;=*%#@...@$&*;;=**%%===$#@.#$*=;;;==;;;==;;;=*.#&*;;;-->>>;;;;;=*$.$*=;;;=*%$$%*>>>>>&.", +"@#%*;;;-->>>;;>>-&$.+#%*;;;;;;;;;;;;>*&.+#%==-;;==*==>>>>>&.#*=;;;=*&$#$$%&%%$#.#&*;;;==&%%&*->->>&.+#%==-;;---;;-====%.+#%==-;;---;;&$@+...#*=;;;=****;;;;;>>&.+#&*;;;--=*==-;;;*&.....+@$&*;;;=&$@+...#&*;;>*&&*=;;-==$@+.+#&*;;;-->>>;;==&$@.++@$&*;;==**&===%$@.@%*=;;;==>>>==;;;=*.#%*;;;>->>>;;;;;=*%.#*=;;;=*&%%&*>>>>>&.", +"+#%*;;;->>>>;;>>-%#.@$*=;;;>----->;;;=*.@#%=--;>===*=>>>>>*.#%*;;;>-*&%%&-----$.$&*;;;-=*&&*=;;;==%.+#%=--;;===-=>>->-&.@#%==-;;====*%$@+...#%*>;;>-=**==>>>>>*.@$%=;;;-==*=--;;;*&...+@@#%*=;;;=*%#@@+.$*=;;;==**=;;-=*$#+.+$&*;;;>-===;;>--&$..+#%*=;;===*=;;;=&#.@%*=;;;==*=*==;;;=*.#&*;;;--===;;;;;=*$.#%*;;;>-*&**=;;;==&.", +"+@$&>>>>>===>-==*$#.@$*=;;;---=---;;;=*.@#&==-;;==*==>>>>>&.#%*;;;>>*****>>>>-%.$&=;;;--=**==;;;==$.@#&==-;;====->>>>>&.@#&=--;;====*%#++...#%*>;;>>=====>>>>>&.@$&*;;;-==*==-;;;=&...+@$%&*=;;;=**%#@+.$&=;;;=====;;===#@+.@$&=;;;--===;;>>-&%.+@$%*=;;=====;;;=&$.#%*=;;;==***==;;;==.#&*;;;--===;;;;;=*%.#%*;;;>>=**==;;;=*%.", +"+@#&->>>>===--==*$@.#%*=;;;>--=-->;;;==.@$&=--;>=====>>>>>&.#$&>;;>>=====>>>>-%.$&=;;;-======;;;=*$.#$&=--;;=====>>>;>*.@$&=--;;==*=&$#+....@$*>;;>-=====>>>>>&.@%&=;;;-==*=--;;;**..+@#$**==;;;==*&%#@.#&=;;;=====;;==*#@+.#$&=;;;--*==;;>>>*&.@#%**=;;=====;;;=*#.#&*=;;;=*****=;;;=*.#&*;;;-====;;;;;=*$.#$&>;;>-=====;;;=*$.", +"++#%*=-;;;;;;;=**#@.#%->;;;;;---;;;;;>-.#&*;;;;;;;;;;;;;=*%.+#%===;;;;;;;;;>=*$.%--;;;;;;;;;;;>>*&#.#%*;;;;;;;;;;;;;>>&.#%*;;;;;;;;==#@+....@#%*=-;;;;;;;;;;=*$.#%--;;;;;===;;;;;>-.++@$-->;;;;;;;>>-$@.#%&>>;;;;;;;;*&$#++.#%->;;;;;==*=-;;;>-.@%&;;;;;;;;;;;;;**#.#%->;;;>>*&*->;;;>-.#&=;;;;;**=>>;;;=*$.+#%===;;;;;;;>>-*%#.", +"++@$*==;;;;;;;=*&#+.#%->;;;;;===;;;;;>-.@&*;;;;;;;;;;;;;*&$.+##**=;;;;;;;;>>*&$.$=>;;;;;;;;;;>>>%$@.#&*;;;;;;;;;;;;;>>%.@%*;;;;;;;;==$@++...+@$**=;;;;;;;;>>*&$.#$->;;;;;===;;;;;>-..+#$->>;;;;;;;>>-$#.@$&>>>;;;;;;>&%#++..#$=>;;;;;=**==;;;--.@$*;;;;;;;;;;;;;*&#.#%->;;;>-&&&>>;;;>-.#%*;;;;;***->;;;*&#.+##**=;;;;;;;>-=%$@.", +".+@#&*=>;;;;;;=*%@+.@$&*=====***=====**.@$%*===========*&$#..+##%&**=====**&%#@.$%&==========**%$#+.@$%*============**$.@#%*======*&$#++....++##%&**=====**&%$@.@$&*=====&**=====*&.++@#&*=========*&#@.+#$%**=====*&%#@+...@$&*====*&&%&**=**&.@#%*============%$@.@$&*===**%%%**==***.@$&*===**%&&*==*&$#.++@$%&**====**&%$@+.", +"..+@#$%&*===**%$#@+.@#%&*****%%%*****&%.+#$***********&&$#+.+++@#$%%*****&%$#@+.@$%*****=***&&$$#@+.+#%&**=*=*=*****&%#.+#$&***=***%#@+......++@#$%&*****&%$#@+.@#%&*****%%%&****&%..+@#$&&**=*==**&%#@.++##%&**=*=%%#@++...@#%&*****$##$%&**&%.+#$&***=*=**=**&$#+.@#%&***&&##$%&***&%.+#%&****$$$$%&**$#+..++@#$%%*****%$#@++.", +"...+@#$%%&*&%%#@@+..+@$$%&%%%###%%&%%$$.+@@%%&&*&%&%%%$$@++...+++@#$%%&%%##@@++.+@#%&&*&&&&%%##@+.+..+#%%&&&&&&&&%%%$$@.+@#%%&&&&%$#@++......++++@##%&&%%$##@++.+@#%%&%%%###%&&&%$#...+@#$%&&&&&&&%$#++..++@##&&&*&##@++....+@#%%&&%$#@@@#$$$$#.++#%%&&&&&&&&&%%#@+.+@$$%&%$$@@@$$%%$$#.+@#%%&%$#@@##%$$#@+..+.++@#$%%%%$##@++..", +"....++@###$###@++....+@@####@@@@@####@+..++@######@##@@@++......+++@@###@@@+++..++@@#######@@++++...+++@@#########@@@++...+@######@+++..........+++@@#@#@@+++...+++@####@@@@@@@##@@....++@#@###$##@@@+....+++@@####@@+......+++@#@##@@++++@@@@+..++@###########@++..++@@#@#@@@+++@@@@@+..++@@@@@@+++@@@@+++.....+++@@@#@@+++....", +"......++@@@@++++......+++++++++++++++++...++++++++++++++.+........+++++++++.......++++@++++++++.......+++++@+@++++@++.....++++++++++.............+.++++++++......++++++++++++++++++....+.++++@+@@++++......++++++++++........+++++++++..+.++++....++++@+@@+@+++++.....+++++++.+++++++++...+++@+++.+.++++..........++++++++......", +"....+...+.+..................................+..+...+.................+..............+..+.+.+............+.........+...........................+..........+..........+.+........+.........+......................+.+.+...........+++++@++........++++@++..................++++++++..............+++++...........................", +"..+++++@+@++++++..........++@++++++.......+++++@+@++++...........++++@+@+@+++......++++@++@++@++++....+++++++.++++++++....+++++++.+.+++++++....++@+++++.+++++++...+++++++++++@+++++...+++++++++++@+@+++.....+++@++@++@++++.......++#####@@+.....++@####@++..............+++@#$###++...........++@@@@+++.........................", +"++@@#####$####@@+......+++@@####@@++....++@@########@@@+.......++@@########@+++..+++@###$##$##$#@@+..+@@###@@@@@####@@+.++@@###@@@+@@####@+.++@@###@@++@@@###@+.++@@#####@@#@####@@.++@@#####@@#@####@@...++@@#####$####@@+....++@#$%%%%##@.....+@#$%%$$@++.............+@#$$%%%$#@+.........++@#$$$#@+.........................", +"+@#$%%&&%&%&%$$#@++...++@#$%%%&%%$#@++..+@#$%%&&&&&%%$#@++....++@#$%%%&&%%%$#@+.++@#$%&%&&%&&%%%$#@.+@#$%%%$$$#$$%%%$#@.+@#$%%%$$###$$%%$%#.+@#$$%%$$###$$%%$%#.+@#$%%%%%$$$%%%%%$#.+@#$%%%%%$$$%%%%%$#..++@#$%%&&%&&%&%$#@....++#$===--&$#++...+@%->>*&$@+............++#$&=-===%#++........+@#$===%#@+........................", +"@#%&*****=****&%$@+.+++@#%%******&%$@@+.@$%&********&&$#@++.+.+#$%&********&%#@.+@$%&*****=**=**&%#.@$%&****&%&&****&%$.@$%&****%%$$&&***&%.@$%&****&%%%&****&%.@$%&*****&&&*****&%.@$%&*****&&&*****&%..+#$%&*******=**&%#....+@$&=----*&$@....@#%->>=*%#@............+@%&*->--=&$@+.......++#%&===&$#@........................", +"@%*;;;;;;;;;;>>-%$@..+#$&*>>;;;;;==*$@+.#$->;;;;;;;;>>*&%@+..@@$&*;;;;;;;;;;*%#.+#%*;;;;;;;;;;;;;*&.@%*;;;;;=**>>;;;>-%.#$->;;;>>&&&>>;;;--.#$->;;;>>*&&>>;;;--.#$->;;;;;===;;;;;>-.#$->;;;;;===;;;;;>-.++#%>>>;;;;;;;;;;*%...++#%*;;;;>=&$@++..+#%=-->>&$@+..........++@&*=;;;;;*$#+......++@$*=;;;=*$@+.......................", +"#&*;;;;;;;;;;>>>&%#.+@$&*=>>;;;;;-==%$@.$%->;;;;;;;;>>=*&$@.+@$&*=;;;;;;;;;;*&#.+#&*;;;;;;;;;;;;;=&.#&*;;;;;===>>;;;>-%.#%->;;;>>***>>;;;>-.#&->;;;>>*=*>>;;;>-.#%->;;;;;===;;;;;>-.#%->;;;;;===;;;;;>-.+@$&>>;;;;;;;;;;;=&...++#%*;;;;>**$@+...+#%=-->>*$#@..........++@&*=;;;;;*%#++.....++#%==;;;=*%#++......................", +"#&*;;;;;;;;;;>>>=&$.@#%*==>;;;;;;--=&%#.#%->;;;;;;;;;>==*%#.+#$*==;;;;;;;;;;=*$.@$*=;;;;;;;;;;;;;**.$&=;;;;;===>;;;;>>%.$%>>;;;>>***>>;;;>>.#%->;;;;>===;;;;;>-.$%->;;;;;-=-;;;;;>-.$%->;;;;;-=-;;;;;>>.+#$&>>;;;;;;;;;;;=&...++$&*;;;;;*&$@++..+@$==->>*&$@++.........+@%*=;;;;;*&$+......+@$%==;;;==&#@+......................", +"@%*->>;;-----;;;>-%.@$&>>;>>-----;;;=&$.#%*=;;;>>--->>;>>&$.@$&>>>;;-----;;;=&$.@$*=;;;--;;;--;;;=*.#&*;;;>-***==;;;==%.#%==;;;==&&*==;;;==.#&==;;;-=>->=-;;;==.#%*=;;;>>===>>;;;=*.#%*=;;;>>===>>;;;=*.+#%*>;;>>--->>;;;**...++#&=;;;=**$@+....+@#%**;;=*%#@.........+++#$&*=;;;*&#@.....++@$&>>;;;>>&$@++.....................", +"@$&=--;;-====;;;>>&.#%*;;;>>===--;;;=*%.#$*=;;;>>-=->>;;>*$.@$&>>;;;-----;;;=*#.@$*=;;;--;;;--;;;=*.#&*;;;--*&**=;;;==%.#%*=;;;==&&**=;;;=*.#%==;;;-=>>>-=;;;==.@$*=;;;>>===>>;;;=*.@$*=;;;>>===>>;;;=*.+@$&>;;>>--->>;;;*&....@#&*;;;=*%#@++....+@$&*;;==*$@++.........+@#%*=;;;*&#++.....@#%*>>;;;>>*%#+......................", +"+#%=--;;==*=*>>>>>&.#&=;;;-=****=;;;>-%.@$&*;;;--===--;;;*%.#$*;;;>>=====>>>**#.@#*=;;;==;;;==;;;=&.#&*;;;-=*%&*=;;;=*%.@$&=;;;==&%&==;;;**.#$*=;;;--;;;--;;;=*.+#%*=--;;;;>;;--=*$.+#%*=--;;=-=;;--=*%.+@$&->>-==-=;;--=*$....@#&*;;;**$@+......++#%*->>-=%#@...........+#$&=;;;*&#@....++@%*=;;===;;=&%@+.....................", +"@#%==-;;=***=-->>>*.$&=;;;==&&&**;;;>>&.@#&*;;;-====--;;>*%.@%&>;;>-=====>>>*&#.@#**;;;==;;;==;;;=&.#&*;;;==&%%&*;;;=*%.@#%*;;;==&&&==;;;*&.#%*=;;;--;;;--;;;=*.+@#%==-;;>>>;;-==%$.+@#%==-;;-=-;;-==%$.+@$%-->=-==-;;-==%#...++#&*;;;*&$@+.......+@#&->>>>*%#++.........+@$&*;;;*&$++....+@%&=;;-==;;**$@+.....................", +"+#$==-;;=***=->>>>&.$*=;;;==%$$&*;;;>>&.+#&*;;;--===--;;;&$.@$&>;;->=====>>>*&#.@#&*;;;==;;;==;;;*&.#%*;;;-=%$%&*;;;=*$.+#%*>;;==&&&==;;;*%.@$*=;;;--;;;--;;;=*.++#$*=-;;>>>;;-=*$#.++#$*=-;;=-=;;-=*$@..+#$==-=-==-;;-=*%@...+@#&*;;;*&$++.......++#$*=;;;*%$++..........@#&*;;;*&$++...++#%**;;===;;=&%@+.....................", +"+#$=--;;===*=>>>;>*.$*=;;;=&%##$*-->>>*.@#&*;;;>>-->;;>>>&$.@#%==-;;;;;->===&$@.+@#&*====;;;====*%$.#&*;;;==&$$**;;;=*$.+#$*>>>>-***-->;>*%.@%*=;;;>>;;;;;;;;=*..+@#%&=->;;;>>**%#@..++#%&*;;;;;;;*&$#@.++@#$&**=>;>;;**%#@...++$&*;;;*&#@.........+@$*=;;;=&$@+..........@$&*;;;*&#@....++@%*=--***--**%@+.....................", +"+#$==-;;=====>>>>>&.$*=;;;*&$##$&-->>>*.+#%*;;;>>>>>;;>>-%$.+#%*=-;;;;;>>===*$#.++##&&**=;;;=***&$@.#%*;;;-=%$%&*;;;=*%.+@$&->>>>=*=--;>>&$.@$*=;;;>>;;;;;;;;=*...+@$&*->;;;>-*&$@+..++@#%*;;;;;;;*%#@+...+@#$&*=>;;;;*&#@+...++$&*;;;*&$++........+@#%*>>>-=%#++........++#&=;;;*&$++....+@%%*==&&&==*&%@+.....................", +"+#$==-;;;;;;;;;;=*%.#*=;;;=*&$%%*->>>>&.@#&*;;;;;;;;;;==&%#.+#$&*===>>>;;;;;*%#..++@#$&*=;;;=*&$#@+.#&*;;;==&$$**;;;=*$.++#%==-;>=*=;;--=%#.@$*=;;;;;>->;;;;;=*..++@$&*>>;;;>>*&$@+....+@$&==;;;=*&$@+....+@#%&=-;;;==*%$#+....@$&*;;;=%$@..........+#$*>>>--&$@.........+@#&*;;;*&#@.....++@#$$$$#$$$$#@++.....................", +"+#$==-;;;;;;;;;;=*$.$&=;;;==&&&**;;;>-&.+#&*;;;;;;;;;;=*&$@.+#$&**==>>>;;;;;*%#..+++@#%&=;;;**$#@++.#%*;;;==%%%&*;;;=*$.++#$==-;;===;;-==%#.@$*=;;;;;->-;;;;;=*..+@#$&=>>;;;>>**$#@....+@#%*=;;;=*%#@+....++#%*--;;;=**&$#@...++#&*;;;*&#@..........+@$&>>;--&$@++........@#&*;;;*&$++.....+++@@@@@@@@@+++.......+.++.+.+++.+...", +"+#%==-;;;;;;;;;>*&#.#**;;;===**==;;;>-&.@#&*;;;;;;;;;;=*&$#.@#%**===>>>;;;;;*&#....++#$&=;;;=&$#++..#%*;;;==&%&*=;;;=*$..+@#*==;;===;;==*$@.@$&=;;;;;-->;;;;;=*.++@$&*=>>;;;>>=*&$@....++#%*=;;;**%#+....++@$%*->;;;==**&%#....@$&*;;;*&$++..........+@$**=;;*&$#++......++$&*;;;*&#@.......+++@+++++++++....+++@@+@+@+@++@++++.", +"+#%=--;;----==*&%#@.#%*>>>;;--->>;;;=*%.+$&*;;;---=-;;--=%$.#%*>>;=======;;;=*$....++#%&=;;;=*$#++..#%*;;;-=****=;;;=*$..++#%**;;==-;;=&%#+.+#&*;;;;;--=;;;;;*%.+@$%==-;;===;;--=%$....+@#%*=;;;=*$#++...+@#&*=;;>>>==;>>*%....+#&*;;;=&$@+...........+@$&*;;==&#@+.....++@$&=;;;*&$++..........++.++.......++@@####$###$$#$#@+.", +"@$&=--;;---==*%%#@+.@$*>>>;;->>>>;;;=*%.@$&=;;;--===;;--=&$.#&*;;;=======;;;=*$....+@$%*=;;;=*%#@+..#$*;;;-==**==;;;=*$...+@#&*;;---;;*%$@+.@#&*;;;;;=--;;;;;*&.@#%*-->;;=--;;>--*%....+@$&*=;;;=*%#@+..++#$*==;;>>>==;;>*&...++$&*;;;**$#++.........++@$&*;;==*$#+.....++#%&=;;;*&#@.......................@@$$%&&%&%&%&&%&$$#.", +"@$&>>;;;>>>==%$#@++.@#%->>;;>>>>>;;;=*%.@%==;;;>>===>>;;;=*.$*=;;;>>->>>>;;;=&$...++#%*--;;;-=*%#++.@$&=>>;;>>->>;;;*%#...++#%*->;;;>>*%#++.+#%*;;;;;===;;;;;*&.@$*=;;;;;-==;;;;;==....+#%*->;;;-=*%#++.++#&->>;;>>>>-;;;=*...++#&=;;;=*&#@+...........+@$*>;-==%$@.....+@#%*=;;;*&#@.......................@&&===--=-=-=---=*$.", +"@$*>>;;;>>>=*%#@++..+#%&==;;;;;;;---==$.#$==;;;>>=*=>>;;;=*.#*=;;;>>>->>>;;;**#....@$%*>>;;;--*%$@+.+#%=--;;>>>>>;;>*%#...++#$*->;;;>>*%#+..@#%*;;;;;===;;;;;*%.#%=-;;;;;-=-;;;;;==..++@$&*>>;;;--*%$@+.+@$&>>;;;>>>>>;;;=*....@#&*;;;>-*%#++..........+@$%=-;;>&$@....++#%*->;;;*&#++......................#**--->>---->>>>-=%.", +"#$*>>;;;>>>=*%@++...+@$&*=;;;;;;;---==%.#$==;;;>>=**>>;;;=*.$&=;;;>>>>>>>;;;*&#..++@$&*->;;;>-*&$@+.+#$==-;;>>>>>;;>&$#....+@#&->;;;>-&$@+..+#$*>;;;;=*=;;;;>*$.#%==;;;;;===;;;;;==...+@$&*>>;;;>-**$@+.+@$&>>;;;>>>>>;;;=&...++#&*;;;>>*&$@+..........++#%==;;;*%#....+@$&*->;;;*&$+.......................$*=-->>>>>>->>>>-=&.", +"@%*>;;;>;;;=*$@+....+@$*=-;;;;;;;;;;-=$.#$=-;;;;>****=;;;==.#&*>>>>;;;;;;--=&$#...++$**>;;;;;>=*%@+.++#$**>>;;;;;-==%#@....++#%==;;;==%#++..+@$&-->>-***>>>--&$.#$=-;;;;;===;;;;;==..++#%*=;;;;;;;**%@+.++#%-->;;;;;;;;;>*&...++#%*;;;>>=*%@++..........+@$**;;;=&#...++@%&=>>;;;*%#++......................$==;;;;;;;;;;;;;;>&.", +"@$&>>>>>>>>=*#@+....+@#*==;;;;;;;;;;==%.@#==>>>>>&%%**>>>==.#%&-->>>;;;>>==*%#+...+@#%*>>;;;>>*&%@+..+@#$*>>;;;;>==*$@+.....+@$*=>>>=*$@++...+#$=--=-&&&=---=$#.@$*=;;;;>*=*>>;;>==...+@%&*>>;;;;>**$@+.++#$=--;;;;;;;;>>*%....+#%*>;;;;=*&@+...........+@#%*;;;*&#...++#&*=>;;;;*&#++......................$=->;;;;;;;;;;;;;>&.", +"@#$&&****&&%$@+......@#*==;;;;;;;;;;==$.@#$%&**&%$$$$%&&&%$.+#$%&&*******&%$#@+...++@#%&&****&%$@++..++@#$&&****&&%$#++.....++#$%&&&%$#++...++@#$%&%%$$$%%%%$#@.@#$&&***&&%&&&**&%$...++@$%&*****&%##++..+@#$&&********&&%#...++#$&>>>;>=*%#++...........+#%&;;;*%#...++@&*=>;;;>*$#+.......................$*=>>;;;;;;;;;;;>>%.", +"+@@$$$%%%$$#@++......+@#%&===*=====*&$#.++#$$$%$$#@@##$$$#@.+@@$$$$$%%$%$$#@+++....++@#$$%%%$$#@@.....+++##$$%%%$##@@+......+++##$$$##@+.....++@#####@@@##$##@+.+@##$$%$$##$$$%$$$#....++@#$$%%%%$#@++...++@##$$%%%&%%%$$#@....+@#&->>>>**%@++...........+@#%***%#@...++@%&*>>>>>%$@+.......................#$%&************&%$.", +".++@#@#@#@@@++.......++##%**&&**=***%#@..++@@@#@@+++++@@@@+..+++@@##@##@@@@++.......+++@@##@#@++.+......++@@@#@#@@@+..........++@@@@@++.......+++@@@++@++@+@+++..++@@#@#@@@@@@##@@+...+.++@@@##@@@@++.....+++@#@######@#@++.....+@$%&&&&%##++.............+##&&&##+....+@#$%&**&%$#++.......................@##$$%%%&%&%%&%%%##.", +".+.+++++++++.........+++@#%&$$%&&&%%#@+...+++++++++.+.++++....++++++++++++..+.........++++++++++........+.++++++++.+............++++...............++..+++.+.....+++++++++++++++++........+++++++++.........+.++++++@++++.......++@#$$%$#@@+..............++@$$$@++......@@#$$$%##++........................++@@##########@#@@+.", +"..........................................++++++..........................................++++++................................++++++++++.......................+++++++...................++++++................+.+++........++++++.................++++++++...................................................................", +".......++++++............................+@@@#@@++.......................................++@#@@@++.............................++@@#####@++......................+@@##@@++................++@@@+@+..............++@@@@++....+++@#@@@+..............+++@@###@++..................................................................", +"......++@##@@+..........................+@#$%$$#@@+....................................++@#$$$$#@++..........................++@@$$%%&%%$#@.....................+@#$$$$$@++..............++#$$$$#@+............+@#$$$$@@+...+@#$$%$#@++............+@@$$%%$$#@+.................................................................", +".....+@@$$$$#@+.........................@#%&&**%$@++...................................+@#$&&*&%$@+..........................++#$%******&%#.....................@#%&**&%$@++............++#$%&&%$#++..........++#$&&&&$#++..@#$&&*&%$@+..........+++#$%&***&$#++................................................................", +"....++@%&===$#@+........................@$=>;;;=&$@+..................................++#%*;;>>>%$@.........................++#$&>>>;;;;;&%.....................@$=-;;;=*#@+............+@$==;;;&$@+..........+@$%;;;==$@+..@%&;;;>-%#@+..........+@%*=;;;;>&$@+................................................................", +".....@$&*=-=&%#++.........+..++.........#%->;;;=*$#++................++.++............+@$&*;;>>>&$@........+...+.+.........++@$&*>>;;;;;;&%.........+.+.+.+.....#$->;;;=*$#++..........++#$==;;;&$#++........++#$*;;;==$#++.@%*;;;>>&$@+++........+@&*=;;;;;*%#++.....+...+.+...+..........+.++.+.++..............+...+.........", +"...++@$*=;;;=&$@+.......++++++@+++......#$*=;;;==&$@@++.........+++++@+@+++++.......+++@$%*->;;;*%@......+.++@++++++.......+@#%=-;;;---==&$......+++@+@+@+@+++..#$*=;;;-=&$@@++........++#%==;;;*%#+.........+#$&*;;;-=%#++.@$&-->;>*%#@++++.+...+.@#$*==;;;*%#++....++++@+@+@@+@+++......++++++++++@++.........+.+@@++@+++.....", +"....+@$==;;;=*$@+......++@@#####@@++....@$*=;;;-=&%$#@@@++....+++@####$#$##@+++...+++@##%**->;;;*%#.....++@###$###@+++....+@#$&--;;;--===%#...+++@@##$######@@+.#$*=;;;-=*%$#@+++......+@$%=-;;;*%#+.......++@#$**;;;==%#@..@$&=>-;;*&$$###++.....++@$&=-;;;*&$+....++@#####$######@++...+@@#########@@++.....+++@@##$###@+++...", +"....+@$*=;;;=*&#++....++##$%%&%%$#@@+...@$&=;;;--**&%$$#@++.+.+@#$$%%&%&%%%$#@+..++@#$$&&*=->;;;*%#..+++@#$$%%&%%%$#@++...+@$&*->;;;---=*%#..++@#$$%%%&&&&%%$#@.@$&=>;;--**&%$$@++....++@$&=-;;;*%#+......++@#%&*=;;;-=%#@..+$%=->;;**&%$$$#@++....+@#%==;;;*&#@+...@#$$%&&&%&&&%%$$@@..+@#$$%%%%%%%$$#@@+...++@#$$%%%%%$$#@++..", +"....+@#&*>>>>>%#@....++#%&*=====*&$#++..@#&*;;;>>---==%%##+.+@@$$&===-=-====$#+.+@@$%%==--->>;;;*&#...@@$%%====-==&%$#+.++@$*==>>;;;>>-==%#.+@@$%&===-===-==*&#.@#&*;;;>>--===%$#@+...+@$&*-->>-*%#@......+@#*==-->>>-=&$@+.+#%==-;;=**====*#@+.....+@$&=;;;*&#+....#&*====--===-==%$#+.@#&*====*=====%$#@+.+@@$%%===--==&%$#++.", +".....+@$&->>>-&#@+..++#$&*=-->--=*&$@@..+#&*;;;>>->-==**%$@.+@$%**==->----==&%@.+@$%**==->->>;;;*&#.++#$%**==>----**%$@.++#%==-;;;;;>--==%#.+@$%&*==-->-----=*$.+#&*;;;->>->==*&$#@...+@$&*->>--*%@+.....++#$*==>->>--=&$@+.+#%==-;;===--==*%#+.....+@$&*;;;*&$@....$*===---->-----*&$@.#$*=---==->-==*%$#@.+@$%**==-----**%$@@.", +".....++#$%**--%#++..++#%>>>;;;;;;;*&$@+.@#&*;;;;;;;;;;>>>%$.@$%>>>;;;;;;;;;;*&#.@$%>>>;;;;;;;;;;*%#..@#%>>>;;;;;;;>>>%$..@@%->>;;;;;;;>>-%#.@$%>>>;;;;;;;;;;--%.@#&*;;;;;;;;;;-==$@..++@&*=;;;;;*%#@+.....@#%->>;;;;;;;*%#+.+@$==-;;---;;>>-%#+.....++$&*;;;*&#++...%=-;;;;;;;;;;;;>-%#.#%--;;;;;;;;;;-==$#.@$%>>>;;;;;;;>>>&#@.", +".....+++#$%&==%#++..+@#&>>>;;;;;;;=*%@@.+#%*;;;;;;;;;;;>>&$.@$&>>;;;;;;;;;;;=*$.@$&>>;;;;;;;;;;;*&#.+#$&>>;;;;;;;;;>>*$.++#%->>;;;;;;;>>-%#.@$&>>;;;;;;;;;;;>-%.+#%*;;;;;;;;;;--=%#..++#&*=;;;;;*&#@.....++#%->>;;;;;;;*%#+.+#$==-;;---;;>>-%#@......@#&*;;;*&$++...%->;;;;;;;;;;;;>>&$.#%->;;;;;;;;;;--=%#.@$&>>;;;;;;;;;>>&$@.", +".......++@#$=*#@+...+@$&>>;;;;;;;;=*&#+.+#&*;;;;;;;;;;;>>*%.#%*>>;;;;;;;;;;;=*$.#%*>;;;;;;;;;;;;*%#.+#&*>;;;;;;;;;;>>*%.++#$-->;;;;;;;>--$#.#%*>;;;;;;;;;;;;--%.+#&*;;;;;;;;;;>-=&$...+@%*=;;;;;*&#+.....++#$=->;;;;;;;*%#+.+#$==-;;-->;;>>-$#+.....+@$&*;;;*&#@....%=>;;;;;;;;;;;;>>&$.#%=>;;;;;;;;;;>--&$.#%*>;;;;;;;;;;;>*&#.", +".......+++@@###++....@$&==->>>>>;;-=*$@.+#&*;;;;;===--;;;=&.$&=;;;--====-;;;=&$.$&=;;;--===;;;;;*&#.+$&=;;;--===>-;;;=&..+@#&*=->;;;=**&%#@.$**;;;--===>;;;;=&%.+#&*;;;;;===>>;;;&$...++@$&*=;;;*&$@......+@#$&&**===;;*&#@.+#$==-;;;;;>-=&%$@+......+$&*;;;*&$++...$*=;;;>>>>>>>>>>>*$.#$*=;;;;>===->;;>&$.#**;;;--===--;;;=&$.", +".........+++@@++....+@$&===>>>>>;;-==$@.+#&*;;;;>=*=--;;;=*.$&=;;;-=***=-;;;*&#.$&=;;;-==*=>>;;;*%#.@$&=;;;->===->;;;=*...@@$&*->;;>=*&%#@+.#*=;;;-==*=;;;;>=&$.+#&*;;;;>===->;;;*%....+@$%*=;;;*&#@+.....++@#$%&&===;;*&#+.+#$==-;;;;;--*&$#++.....+@#&*;;;=%$@....$&*;;;>>>>>>>>>>>&%.@$&*;;;;>=*=->;;;*%.$*=;;;-=***--;;;=&$.", +"..........+.++.+....+@%&>;;;;;;;;;-==$#.+#%*;;;--***==;;;=*.$*=;;;=**&&&*===*%#.$*=;;;==**==-;;;*&#.@$*=;;;;;;;;;;;;;=*...++#%*>>>>>*&$#@++.$*=;;;=***==-;;;*&$.+#%*;;;--***=-;;;*%....++@%&=;;;*&$+.......+++@##%**=;;*&#+.+#$==-;;;;;-=*%#@+.......@$&*;;;*&#@....$&*;;;-->>>>>>>>>*%.@#&*;;;-==**--;;;*%.$*=;;;=*****=;;;=*$.", +"....................+#%*>;;;;;;;;;-==$#.@#&*;;;-==***=;;;=*.$*=;;;=*&$%%&===&$@.$*=;;;=****--;;;*%#.@$*=;;;;;;;;;;;;;=*...++#%&->>>>*%$@++..$*=;;;=****--;;;*&#.+#&*;;;-=***=-;;;*%.....+@$&*;;;*&$@+........++@@#**=;;*&#@.+#$=--;;;;;==&%#+++.....++$&=;;;*&$@+...#&*;;;>->>>>>>>>>*%.+#&*;;;-=***=-;;;*%.$*=;;;=*&&&*=;;;=*$.", +"....................+#&*;;;;;;;;;;-==%#.+#&*;;;--***==;;;=*.$*=;;;=*&%$%%*=*%$#.$*=;;;==***--;;;*&#.@%*=;;;;;;;;;;;;;=&...++@%*>>>>>*&#@++..#**;;;>-===;;;;;*%#.+#&*;;;-=***=-;;;*&...+++#$*=;;;=&$@++.........++#%*=;;*&#+.+#%==-;;;;;==*%$@+.....++@$&*;;;=&$@++..#&*;;;-->>>>>>>>>*$.+#&*;;;-=***=-;;;*&.$*=;;;=**&**=;;;=*$.", +"....................@#*=;;;=====;;-==%#.+$&*;;;;>==*--;;;=*.$&=;;;-=*&%&&===*&#.$&=;;;--*==;;;;;*&$.@$*=;;;>>--->->>>*&...+@#%*>>>>>*&$#@++.#$*>>>;;;;;;;;;;*&#.+$&*;;;-=*&*==;;;*&....+@#%&=;;;**%#@++.......++@#&*=;;*%#@.@#%=--;;>>>;;=*&#@+....+@#%*=;;;**%$@++.$%=;;;>->>>>>>>>>*&.@$&*;;;-=***=-;;;*&.$&=;;;--***--;;;=*$.", +"....................@$*=;;;=====;;--=%$.@$&*;;;;;=*=->;;;**.#**;;;>-*****====*#.#**;;;>-===;;;;;*&$.@#*=;;;>>---->>>>*&..++#$&*>>>>>=*&$$@+.@$%->>;;;;;;;;;;*%#.@$&=;;;-=***=-;;;*&..++@#%&*=;;;=**%#@@.....+++@@$&*=;;*&#+.@#&==-;;>>>;;=**%#@..++@$%&*=;;;=*&%#@+.$&*;;;-->>>>>>>;>*&.@$&=;;;--***--;;;**.#**;;;--=*=->;;;**#.", +"....................@#&=;;;=====;;--=&$.@%&=;;;;;===->;;;*&.#**;;;>-==*==-===*$.#**;;;>-===;;;;;=&$.@#&*;;;>>----->>>*%..+@$%*=>>>>>==*&%#@.+#$&*==---->>;;;*&#.@$&=;;;===*===;;;=&.++@#%**==;;;==*&%#@....+++##$&*==;;*&#+.@$&=--;;>>>;;===&%#..+@#%&*==;;;==*&%#@.$&=;;;>->>>>>>>;>=&.@$**;;;-==*==-;;;=&.#**;;;>-===>>;;;*&#.", +"....................@#&*;;;;;;;;;;;;;*%.@%=-;;;;;;;;;;>>>*%.#$*>>>;;;;;;;;;;-=$.#$*>>>;;;;;;;;;;--%.+#%*>>>;;;;;;;;;;*&.++#$->>;;;;;;;>>-$@.++#$&*==--->-;;;*%#.#$=-;;;;;===;;;;;--..+#$=>>;;;;;;;>>-$@....+@#$%&*===;;*%#@.#&*;;;;>==-;;;;;-=$..+@$->>;;;;;;;>>-$@.%=-;;;;;>>;;>>>;;-=.@$=-;;;;;===;;;;;--.@%*>>>;;;;;;;>>>*%@.", +"....................+#&*;;;;;;;;;;;;;*%.#$=-;;;;;;;;;;>>-%$.@$%->>;;;;;;;;;;-=$.@$%->>;;;;;;;;;;-=$.+@#%->>;;;;;;;;;;*%.++#%->>;;;;;;;>>-$#..+@$&*-->>>;;>>>&$@.#$--;;;;;===;;;;;-=.+@@$->>;;;;;;;>>-$@..++@#**===>>>;>*%#+.@&*;;;>>===;;;;;-=$.++#$->>;;;;;;;>>-$#.$--;;;;>>>;;>>>;;-=.#$--;;;;;*==;;;;;-=.@#%->>;;;;;;;>>-%$@.", +"....................+@$&*===-=-=-=-==%$.@$*=======-===**%$@.+#$%**==========&%#.+#$%**===-===-===&$..+#$%**==-=-====*%#.++@$*===----===**$@.++@$&*->->>;;>>>%$@.@$*==--==***=-====&..+#$&*===--====**$@..++#%===->;;;;>&$@+.@$&====****==--=*&$..+@$&*===--====**$@.$*==--=====-======&.@$**==-==***=-====&.+#$%**=======**%$@+.", +"....................++#$***========**$#.+#%**========*%%##+.++@#%&*======**&%#@.++@#%&*=====*==**%#.+++@#%&*======**%$#.++@#**========*&%#@.++#&*=;;;;;;>=*&$@+.+#%*====*&%&====**%...@#%**=======**%#@..++#%=>>;;;;;=*%#@+.+#%*==**%%&*====&%#.++@#&**=======**%#@.#%*====***==*=*==*%.@#%*=====&&&====**%.++@#%&*=====*%%##++.", +"....................+++@%%&********&&#+.+@$%&*&&&**&*&$#@++..+@@#$&&*****&&%#@+..+@@#$&&*&*****&%$@...+@@#$&&***&*%$$@+..+@@%&&**=*=**&%$@+.++@%*=>;;;;>>*&%#@+.+@$%****&$$$&***&%$..++@$%%&*****&%%$@+..++#%->>;;;;;=*$#+..+@#***&%$#$&****%$@...+@$%%*&****&%%$@+.@$%***&&&***&&&**$$.+@$%&&***$#$&****%$.+++@#$&&***&*$#@++..", +"......................++@####$#$#$##@@+.++@###$#$#$###@+++.....++@####$####@@++....++@####$######@+.....++@####$####+++...+@@#$#$$$$###@++...+@%**>>;;;>-&$#++..+@@#$$$##@@###$###@...+++#####$#$##@++...++#$=->;;;>>*%#@.+.++@####@@@@##$$##@+...++@@##$$#$$##@++..+@###$####$#$#####@.++@###$##@#######@@...+++@######@@+++...", +"......................+.++@@@@@@@@@@++....++@+@@@@@+@+++.......++++@@@@@@++++......++++@@@@@@@@+++......++++@@@@@+++++.....+++@@@@#@@@@+++..+++@$%&****&&$#@++...+++@@@@++++@@@@+++...++++@@@@@@@@+++++...+@#%&&***&&%#@+.....++@+@++++@@@@++++.....++@+@@@@@@+@++..+++@@@@@+@@@@@@++++..+++@@@@@+++@@@@+++....++++@@@@@+++.....", +"................................................................................................................................................................................................................................................................................................................................", +".....................................................................................+.+............................................................................................................................................+++++@+............++++++.+.........+++++++.................................................", +".....................................................................................++++++........................................................................................................................................++@@##@@++.........++@###@+.........+++###@@++...............................................", +"...................................................................................++@@#@++.......................................................................................................................................++@#$**$#@+.........+@#&&&#@+........+@#$**$#@++..............................................", +".................................................................................+++##$$$#@++....................................................................................................................................++#$$&*=%$#++.......++#$*=*$#++......++#$%*=%%$#++.............................................", +".....+....+...................+..................+.+..............................+#%**-=%#@+..................................+.......................................+....+.............+..................+..+................+#$%**==%$#+........+@$&===&$@+.......+#$&==*&&$@++............................................", +"..++++@+@+++@++.........+++++++@++++++......+++++++++++++.........+++++@+++++...++@$&*=--&$#@+++.......+++++...++++++.....+++++++++++++@+++...++++++++.+++++++.....+++++++++++++++....+++++++..++++@+++....++++++@@+@+++........+@$%>>>--%#@+........+#$*;;;*$#+.......+@#%=->>>%$@+............................................", +".++@@########@@@+......++@@#########@++...+++@##@#@@###@@++.....+++@#######@+++..+#$==-;;*&%##@++....+@@@#@@++++@@#@+++..++@####@@@@#####@+..++@@##@@+++@#@##@@...++@###@@@@@###@++..++@#@#@@@++@#@#@@@..+++@#########@@+.......+@$*>>>--%#@+.......++#%*;;;*%#++......++#%-->>>*$@+............................................", +"+@#$$%%%&%%%%$$#@++.+++@#$$%%&%&%%%%$#@..++##$$%$%$%$%%$$#@....++@#$$%%%%%$$#@+.+@#%==-;;=**%$$@++..+@#$$$$##@##$$$$#@+.+@#$%%%%$$$$$%%%$$#.+@#$%$%$$####$%$$$#.++@#$%%%$$$$$%%%$#@.+@#$$%$$#####$$%$$#..+##$%%&%&%%%$$##++....++#%*;;;=&%@+........++#&*;;;*&#+.......++#%&=;;;*%#@............................................", +"@#%&*********&&$$@+.++@$$%**********&$#..+@#%&***&*****&%$#...++@$%&*******&%$@.+#$*=--;;===*&%$#++.@#$&**&%$$$$&&*&%$@.@#$&*****&&&*****&%.@#%&***&%%$$&&***&$.+@#%%****&&&****&%#.@#$&***&%$$$&&***&$.+@$%&*********&%$@+....++#%*;;;**$@++.......++#&*;;;*&#@........+@$&*;;;*&#++........++++++++.+++.......................", +"#$=-;;;>;;;;;>==*$@.+@$*==>;;;;;>;;;-=$.++#%->>;;---;;;>>%$...+@%&*>;;;;>>>>>%#.+#%*;;;;;;;;;;**%@+.#$=-;;;=*%%&;;>>>%$.#$=-;;;;;===;;;;;-=.#$=-;;;>-*&*->;;;-=.+@%*;;;;;===;;;;;*%.#$=-;;;>-&&&->;;;-=.@#%>>>;;;;;;;>>-%#+....++$&*;;;*&$@+........++$&*;;;*&$++.......+@$**;;;*&#+......+++@@@#@@@@@@@@++.....................", +"#%--;;;;;;;;;;==*%#.+#$===;;;;;;;;;;>-%.+@#%>>>;;>->;;;;>&$..+@#&*=;;;;;;;>>>&$.@#**;;;;;;;;;;=*&@+.#%=>;;;=*&&*;;>>>&$.#%->;;;;;===;;;;;--.#%--;;;>>*=*>>;;;--.+#%*;;;;;===;;;;;*%.#%--;;;>>***>>;;;--.@$&>>>;;;;;;;>>>%$+.....@#&*;;;*&#++........++#&*;;;*&#++........+#&*;;;*&$@......+@##$%$%$$$$$$##+.....................", +"#%=>;;;;;;;;;;--=&$.@$&==-;;;;;;;;;;>=%..@#%>>>;;>>-;;;;>*$..+@$**=;;;;;;;;>>&$.+#&=;;;;;;;;;;=&%@+.#%->;;;==***;;;>>*$.#%=-;;;;;==-;;;;;>=.#%->;;;>>===>>;;;>-.+#%*;;;;;-=-;;;;;*%.#%--;;;>>=**>>;;;>=.@$&>>;;;;;;;;;>>%#@...++#%*=;;;*&#@..........@$&*;;;*&#@........++#&*;;;=*$#@...++@#$%&***&&&&&&%$#.....................", +"@%*=;;;;;>-->;;;;*%.#$*;;;;;->-;;;;;=*%.++#%*=-;;;;;-->>>*%.+@#%>>;;;->-;;;;;*%.+#$*>>>;;---==&%#@+.@%*=;;;-=&**>>;;;*%.@%*=;;;>>===>>;;;=*.#%=-;;;-=;;;--;;;==.+@$&=->;;=-=;;>-=&$.#$*=;;;>-===>>;;;=*.#$&>;;>>>>>;;-==%#+....+#%==;;;*&#++........++#&=;;;*&$++.......++$&*;;;==%#++..++#%==-;;>>>==>>>&%.....................", +"@%*=;;;;;--->;;;;*%.#&*;;;;;---;;;;;=*%..+@$*==;;;;;-->>-&$..@#%->;;;>->;;;;>&$.+@$&->>;;--==*%#@++.@$*=;;;==*&*->;;;*%.@$*=;;;>>===>>;;;=*.#$==;;;--;;;--;;;=*.++#%==-;;-=-;;--=%#.@$*=;;;>>=*=>>;;;=*.@$&>;;>>>>>;;-=*$#+...+@$%>>;;;*&#@..........@#&*;;;=%$@.........@#&*;;;>>&$@+..+@$&=->;;>>>==;;>*%.....................", +"@$&*;;;>-=*===;;;=*.$&=;;;=====>>;;;*&$..++#%*=;;--=***&%$#.++#%=--;;;;;---==&$.+@#&=--;;=**&$#@++..@$&*;;;==&&*=-;;;*%.+#$*-->;;===;;>-=&%.@$**;;;>>;;;>-;;;=&..+@#%*=->;;;>>**%$@.+#$*-->;;===;;>-=*%.+#%*==--;;;>-=*%#@+...++$&>>;;;*&#@.........++#&*;;;*&#@........++$&*;;;>>&#@+..+#&*;;;>>;;;;;;>>*$.....................", +"@$&*;;;>-=**==;;;=*.$*=;;;==**=--;;;=%$...+@$&*;;-==*&%$##+.++#%==-;;;;;>--==&#.++#%==-;;=*%$##+++..@#&*;;;==&&&==;;;*&.+@$&=->>;===>;--=&$.@#&*;;;->;;;--;;;*&..++#$&*->;;;>-*&$#+.+@$&=->;;===;;>--&$.+#$*==--;;;>-*&%#++...+@#&>>;;;*&#++.........@$&*;;;*%$++.......++#&*;;;>>&$++..+#&*;;;>>;;;;;;>>&$.....................", +"+#&*;;;>======;;;**.#*=;;;==*==>>;;;*%#...@@%&=;;-==&$##@++.+@#%=--;;;;;->-==&$.++#$=--;;**&$$#@@++.+#&*;;;==***=-;;;*&.++#$=-->>===;;--=$#.@#&*;;;>>;;;>-;;;*%..++@$&*->;;;>>*&$@+..+@#&==;;-->;;=*&$@.+@$**=--;;;->*&$#++....+#%*=;;;*&$+.........++#&*;;;*&$++.......++$&*;;;=*%#++..+#%*;;;--;;;;;>>>%$.....................", +"+#%*;;;;;-=-;;;;;*&.#&*;;;;;---;;;;;*&#..++#%&=;;==*&$#@@++..@#%==--->>>;;;>>&%..+#$*=-;;=*&&%$$#@+.@#%*;;;-=***=-;;;*&..+@$&*=;;===;;=*%#@.+#%*;;;;;;;;;;;;;*%..++#$&*>>;;;>>**$#+..+@#%*=;;>--;;=*%#+.+#$*==;;>>>-===*$@+....+@#&*;;;*&#@.........++$&*;;;*&$++.......++$&*;;;*&$@+...+@$%===*=======**$@.....................", +"+#&*;;;;;>>>;;;;;*$.#$*;;;;;>->;;;;;*&#..+@#%*=;;===&%$#++..+@#%==--->>>;;;>>*%.++@$==-;;==***&&$#@.+#%*;;;-====--;;;*&..++#%*=;;=--;;*&$@+.+@%*>;;;;;;;;;;;>*%..+@#&*=>>;;;>>=*%$@...+@#&*>>;;;>>*&$@+.+#$*==;;>>>====*%#@....+@#&*;;;*&$++........++#&*;;;*&#++.......++$&*;;;*&$++...++@#&**%%&***=&&%#@.....................", +"+#&*;;;;;;;;>>===%#.@#%===;;;;;;>;;;*%#.++#%==-;;>--==%$#++.+@$&>;;;;>>>>>;;;=&..+@$*==;;--->>>--$#.+#%*>>;;;-=-;;;;;=*...+@#&*>>;;;>>*%#@+.+@$&-->;;-=-;;>--&$.++#%=->;;-=-;;>-=%#....@#%*>>;;;>>*%#++.@#&->>;;>>>>>;;>&$@....++$&*;;;=&$@+........++$&*;;;*&#@........++$&=;;;*&#@.....+@@##$$$$$$%$$#@@+.....................", +"+#&*;;;;;;;;>>=**#@.+@$&==>;;;;;;;;;=%$..@#%=->;;>>--=*%$@+.+#$*>;;;;>>>>>;;;*&..+@#&==;;>>>;;>--%#.+@$&>>>;;---;;;;;=*...++@%&>>;;;>>*$#+..+@#&=->;;=-=;;--=&#.+@#&->>;;=-=;;>>-%$....+@%&>>;;;>-&$@++.@$&>>;;;>>>>>;;>&$@....++$&*;;;*&$@+........++#&*;;;*&#++.......+@$&*;;;*&#++.....++@@@+@@@@@@@+++......................", +"@$&*;;;>-===*&&%##+.+@@$$&**===--;;;*&#.+@$&=->;;>>---*&$@+.+@$&>;;;;->>>>;;;*&...+#&*=;;>->;;>>-$#.++#%>>>;;---;;;;;==...++@$%->;;;>-&$@+...+#%==-;;===;;--=%#.+@$&->>;;==-;;>>-&$..++@$%*>>;;;*&$@++..@$&>>;;;>>>>>;;>*$@.....+#&*;;;=*$@+........++#%*>;;*%#+.......++@$*=;;;*%#@.........+++.+++++++........................", +"@$&=>;;>-=**&%$#@++..++@#$%&**=--;;;**$.+@$*;;;;;;;;;;=&%@+.+@$&->>>>;;;;;--=&$..++@#%*--;;;;>==*$@.++#$%*=;;;;;>>;;;==....++#%*=;;;=*$#+...++@#*==>>=*=>>=**$@.@@%*>;;;;===;;;;;*%.+@#$**=>>;;>*%#++...@#&->>;;;;;;;>>-&$@....++#%*;;;=*%#@+........+#$*>>>*$#++......++#%*=;;;*%#+...............+............................", +"@$&=;;;--=**%$@+++....++@@#%**=->;;;=&$.+@%&>;;;;;;;;;*&%@+.++#%-->>>;;;;;===$#...++@$%==;;;>>=*&#@..++#$%&>;;;;>>;;;==.....+@#&*>>>*&#@+....++#%**--&&&--**&@@.+@$&;;;;>===>;;;;&$.+@%&;;;;;;;;*%#+....+#%-->;;;;;;;>>-%#@.....+@$&;;;=*%#@++.......+@$%>>>%$@+.......+@#&*=;;;&%@++...........................................", +"@%=-;;;;;>-=$#@+........+@#$=->;;;;;-=%.++#$%********&%$@+..++@#$&&&******&%$#@....++@#%&&**&&%$#@+...+@@$%&*********%$.....++@#%%&%$$@++....+++##%$%$%$%%$$#++.+@#$&&**&&%&&**&&$#.+@$*;;;;;;;;*%#++...+@#$&********&&%#@+.....+@$%===>>&%#+.........+#$%%%$@++......++#%&->===%$@+............................................", +"@$--;;;;;--=$@++.........+#$=->;;;;;--$..+@#$$%&&%%%$$#@@+...++@#$$$%%%%%$$##@+.....++@#$$%%$$##@++....++@#$$%%%%%%$$$@......++@#$$$#@++......++@@###@#@##@@+++..+@#$$%$$$$$$%%$$#@.++#%*=======$#@.....++@#$$%&&&&%%%$#@++......+@#***--&$#++.......+++@#$#@@+........+#$&-==*&$@+.............................................", +"#$**----==*&#@+..........+@#&*==----**$..+++@########@@++.....+++@@#@#####@@++.....+.+++@@#@#@@++.......+++@@#######@@+.......++++@@+++..........++++++++++++....+++@@##@@@@@@##@++..+@#**=*=***#@++.....++@@@#######@@+++.......++##%%%$#@++..........++@+@++........+++##$%%$##++.............................................", +"+@$%**=**&%$++...........++@$%&*=***&$@...+++++++@+++++........+.++++++++++...........+.++++++............+++++++++++++........++++++.............+++.+.+++........++++++++++++++....++@#$$$%$$#@+.........+++++++++++++........+.++@@###@@++............++.+..........+++#@###@++..............................................", +"................................................+.+++.+.................+................................+......+..+...............................++++@++++....................................................................................................................................................................", +"................................................+++@@++............++++++++............................+++@+++.+++++++..........+.++.............+++@######@@++...........................+++++++...............+++++........................................................................+.++++++...............+...........", +".......@@@@@...................................+@#####++.........++@@###@@++..........................+@@###@@@@@##@@++........+++@@++..........++##$$%%%%$$#@+............+.+.........+.++@@@@@@+++..........+++@@@@++......................................................................++@@##@@++...........++++++++......", +"......@@$$$$@@.................................@#$%&%$#@+.......++@#$$$%$$#@++.......+..........+....+@#$$%%$$#$$$%$$#@......+.@#####@+........++@$%&*****&&$$@.......++++++++@++......++@##$$$$##@++........+@@#$#$##@++..................................................................++@##$$$$##@@+.......++@@####@@++....", +"...++$$$$$$%$$++.............................++#$&>>>&$#@.....+.@@$&*====*%#@+....+.+++++.+.+++++...+@#%====*&%&*===*$#.......@@$%&%$@++.......+#$%--;;;;;>>-%#....+++@@#@@#@#@@++....+@@$$**==&&$$@@+.....+++#%&***&%#@+.................................................................+@@$$&*==&&$##@+.....++@$$%%%%$##++...", +"..@$%%=====-=%%$..+.........................++@$&*;;;*&$#@+...++@$%*======&%#@+...++@@@@@+@@@@@@@++.+@$&=--=-***=====&$......+@$%>>>&$@+.....++@#%*->;;;;;>>-&$.....+@##$$#$$$$#@+...++#$%**====**%$#++....++@$&*===**%#++...............................................................+@#$&&=====**%$#@+...++@$%&****&%$#@+..", +".@%&&==>>>>>>=&&%@@.............+...........+@#%==;;;==&$#+...+@$&*;;;;;;;=*%@+..++#%&&$$#$#$$&%%@@.+#&*;;;;;===;;;;;*&......+#%&>>>*$#+.....++#&*=;;>->>>;;>&$...++@$&&==%%%>>$#@..++#$==-;;;;;;-==$@@....+@#%->-->;;&$@+..............................+..+.+.+........................++@$==-;;;;;;-==$@+...++#%->;;;;;**%@++.", +".@%*=>;;;;;;;;=*%@.........++++++.........++@#%*=-;;;==*&$@..++#$*=;;;;;;;=*&#+.++@#&**&&&%&&&**&$@.@#&=;;;;;-=-;;;;;*&.....++#%*;;;*%#++....+@$*==;;>>>>>;;;&$....+@%&*=-%&&>>%#@+.+@#%=--;;;;;;--=%$@...++@$&->->>;;*%#+.........++++.+++++......+++@++@@+@++++.......................+@$%=--;;;;;;--=%$@...++$%>>;;;;;=*&@+..", +".#&*>;;;;;;;;;>*&#.........++@@@+++.......+@#%&*--;;;-==&%#..++#&*=;;;;;;;=*%@+.++#%*==**=**=*==*%#.+#&*;;;;;-=-;;;;;*&.....++#&*;;;*&#+....++#%*=-;;>>>>>;;>&$....+@$&*==%&&>>%#++.+#%*=>-;;;;;;>--&%#...+@#%*>>>>>;;*%#++.....++++@@@@@@@@@++..++@@###########@@+.....................+#$*=>>;;;;;;>--&%#...+@#%>>;;;;;=*%@@..", +".$&=>;;;;;;;;;>=&$.......++@#$$$$@+......++#$=--;;;;;;;==*#..+@$*=-;;=====*&$@+.+@$&>>>;;;;;;;>>>%$.+@%&-->;;===;;>>-*$.....++#&*;;;*&#@....+@#&=->;;>>>==-==&#...++@$$%&&%$%**$#@..@#**;;;;;;;;;;;;=&$...+@%&=>>>;>;;*%$@......+@#$#$$$$$$$#@@..+@#$$%%&%&%&%%%$#@.....................@#**;;;;;;;;;;;;=&#....+#%*======*&$@++.", +".$*=>;;;;;;;;;>=*$.......++#$%&&$#++.....+@$%=--;;;;;;;-=*$..+#$===;;==***%%#@+.+@$&>>;;;;;;;;;>>&$.+@#&=->;;===;;--=&$.....++#&*;;;*&#++...+#$*-->;;>>>=====%#....++##$%%##$&&#@+..#%*=;;;;;;;;;;;;=*$..++#%*=>;;;;;;=&$@+...++@#$&&&&&&&&&%$#.++#$&*******=***&$#....+.+++@+@+@+@+++..#$*=;;;;;;;;;;;;=*$...++@$*=====*%$#@...", +".$&=>;;;;;;;;;;=&$......++@#*===*#@+.....+@$*>;;>>===>>=**#.++#%==-;;*=*&%##++..+#$*>;;;;>--;;;>>*%..+#$*==;;>>>;;==*$#.....++$&*;;;*%$+....+#&*;;;>>;;;;;===%#.....++@@@@@@@#@@++..#%-->;;;;>>;;>>>--%..+@#*==;;---;;=*%@+..++@$%=->>>==>>>==#.+#$*;;;;;;;;;;;;;*%....+@@@########@@@+.#%=>>>>;;>>;;>>>>-%....++@#$$%$%$##+++..", +".$*=;;;;;;;;;;;=*$.......+@$=====$@++....+#$*;;;->===>>==&#.+@#%==-;;==*&$#@++..+#%*>;;;;->-;;;>>*$.+.@#&*=;;>>>;;=*&$@.....++#%*;;;*&#++...+#&=;;;>>;;;;;===%#......++++@++++++....$%->;;;;;>>;;>>>>-&..+@#*==;;---;;=&%@+.++@$%&->>>>==;;;==$.+#%*;;;;;;;;;;;;;*&..++@@$$$%%%&%%%%$@@.$&->>>>;;>>;;>>>>-&.....++@@###@@@++....", +".%*=;;;;;;;;;;;=*%......++@$*====%#+.....+#%*;;;>-*=*>-=*&@.+@$&=--;;==*&%#@+...+#$*>;;;;>--;;;>>*%..++#%*=;;>>>;;=*%#+......@#%*;;;*%#+....@$&=;;;>>;;;;;-==&$.......+.+.+.+++.....$&->;;;;;>>;;>>>>-&...@$*==;;---;;=*&#@.+@#%**>>;;;==;;;==$.+@%*;;;;;;;;;;;;;=*...@#$%*********&&$#.$&->>>>;;>>;;>>>>-&.......+++++++.+.....", +".%*=;;;;;;;;;;;=*%.......@@%**==*%#@....++#%*;;;--=**=*&%$@.+#%*;;;;;;;;=*$@+...+#%*;;;--===--;;>*%...+@$&*>;;;;;>=*%#+......+#%*--=*%#++...+#&*;;;;;---;>;;;**.....................$&>>;;;;;==>->>>>>&.++@#&*=;>;;;;>==&#@.+#%=--;;---;;;;;*&$.+@$%===-------;;;=*.++@$=->;;;;;;;;;;&$.#&>;>>>;;;;>>>>>>>&.........+.++........", +".%*=;;;;;;;;;;;=*%......++#$*====%#@+....+@%*;;;-===*=**%$#.+@&*;;;;;;;;==$@++..+#%*;;;->===>-;;;*%..++@$&*>;;;;>>=*%#+......+#$*=--*$#+....@#&*;;;;;>->;;;;;=&.....................$&>;;;;;;==>->>>>>&..++#**=;;;;;;>==*#+.@$&=->;;---;;;;;*%#.++#$**======--;;;=*..+@$-->;;;;;;;;;;&$.$&>>>>>;;;;>>>>>>>&.....................", +".$*=;;;;;;;;;;;=*$......++#%=->>-%$++...++#$*>;;;;==->>=*%@.+@$*=--;;>--=&$#++..+@%*>;;;;>--;;>;>*%...+@%*=>>;;;>>=*%#+.....++#$*;;;*%#+....+@$*==-;;;;;>>;;;=&.....................#&=-;;;;;;;;;;;;-=&..+@#&==;;;;;;;=**#@.@%&;;;>>>>>;;-==&$@..+@#$%$%%%&**=;;;=&.++@$*===-----=-==&#.#&=-;;;;;>>;;;;;-=%.....................", +".%*=;;;;;;;;;;>=*%......+@$&->>>>&$@++...+@$&>>;;;--->>=*&#.+@$&=--;;>--**$#@++.+#%&>;;;;->-;;;;>*$..++@$*=>>;;;>>=*%#+......+#%*;;;*%#+....+@#%*==;;;;;>>;;;=*.....................#%=-;;;;;;;;;;;;==%..++#**=;;;;;;;==&#@.#%*;;;>>>>>;;--=*$@...++@@####$%**;;;=*..+@#&*==========*$#.#$==;;;;;>-;;;;;==%.....................", +".$*=;;;;;;;;;;>=*$......+@$&->>>>*%@+....+@$&>>>;;>--;>=*&@.+@$&=->;;>>-=*&%$@@.+@%*>;;;;>--;;>>>*$..++#%*=>>;;;>>=*%@@.....++#%*;;;*%#++....+#$*==;;;;;>>;;;=&.....................@$==;;;;;;;;;;;;==$..++@&*=;;;;;;;=*&#+.@$*;;;>>>>>;;-==*$#.....++++@+@$%*;;;*&..++@%&&*=====*=**#@.#$*=;;;;;>>;;;;;==$.....................", +".$&=;;;;;;;;;;>=&$.....++#$*>>;>>*%#@.....+#$&==;;;;;;;**$@.+@$*-->;;====****$#.+@$&>>;;;;;;;;;>>&$..++@%&=--;;;-==*%#+......@#&*;;;*&#@....++@$&**==->-;;;;>*%.....................@#%*>;;;;>>;;;;>*%#..++@$&*==---==*&$@+.@$&-->;;->-;;;;;*%#......+.++++@#%===&$...+@@#$#$$$$$$$$#@+.+$&*>>;;;>>;;>>>*%#.....................", +".$*=>;;;;;;;;;>=*$......+#%*>>;>>*%#+.....+@#%*=>;;;;;>*&$@.+#%&->>;;========%$.+@$%>>>;;;;;;;>>>&$..++#%*==>;;;>-**%#+......@#&*;;;*&#@....++#$&*=*=---;;;;;*%.....................+#$&>>>;;>>;;>>>&$#...+@#$&===-==*&%#@+.+#$==-;;-->;;;;;*&$...........+@#$***$#....+++@@@#@##@@@+++.+@$&>>>;;>>;;;>>&$#.....................", +".#&*>;;;;;;;;;>*&#......+#%*;;;;;*%#@+.....+@#$**=;;;=*&$@+.+#&*;;;;;;;;;;;;;*%..+#%*====*****==*%#..++#&*=;;;;;;;=*&#+.....++#&*;;;*&#++...+@$&>>>--===;;-=*$@.....................+@#%*==>>;;>>==*%#+....+@@##%%&%%$#@++..+@$%**>>;;>-=;;;-=$............++@###@+.....++++++++++++++..+@#%*==>>;;>>==*%#@.....................", +".@%*=>;;;;;;;;=*%@.....+@#&*;;;;;=&#@+.....++@#%**;;;=&%#++.+$&=;;;;;;;;;;;;;*%.++@$&****&&&&&**&$@..++#&*=;;;;;;;==&#+......+#%*;;;*%#++...+@$&>;;;;;;;;;=*&#@......................+@#%**>>;;>>**%$@+.....++@@#####@@@+...++@#%*->>>>==;;;==$.............+@@@@++........+.+.+.+.......+@#%**>>;;>>**%#@+.....................", +".@%&&==>>>>>>=&&%......+@#&*;;;;;*&#@+.......+@#&*;;;*%#@+..+#%*;;;;;;;;;;;;;*%...@@%%&%%$$$$$&&%@+..++#&*=;;;;;;>=*&#+.....++#%*;;;*%#+....+@$&>;;;;;;;;;*&$@+......................++@$%*--;;>-*&$@++......++++++@++++......+##%=->>>==>>>==#...............++++.......................++@$%*--;;>-*&%@++.....................", +"..@$%========$%$@.+.....+#%*;;;;;*%#+........++@$&===%$#++..+@$&==--------===%$...+@@@#@@@@@@@@@@++...+@$&*==--=-=*%$@+......+@$%===%$@+....++#%===>----=*&$#++.......................++@#$%&**&&$#@++.........++++++..........+@#$%&&&%&&&&%##...........................................++@#$%&&*&&$#@++......................", +"...++$$$$$$$$$++.......++#$*>>>>>*%#++........+@@$***$#++...+@#%*==========**$#....++++++.+.+++++++..++@#$&*=====*&$$++......++#%*=*$#++....++@$**=--===*&$#@+.........................++@@#$$%$##@++.........................+++@#$#$$$$$$$#@@............................................++@@#$%%$##@++.......................", +".......@$$$@@............+#%=---=%#@+..........++##$#@@+.....+@#$$%%%%%&%%%$$@@.....++++......+........+@##$%%%%%$#@@+........+@#&&*#@++.....+@#%**===**&$#++............................++@@##@@+++............................+++@@@@@@@@@@++..............................................++@@@@#@++.........................", +"........................++@#$%&%%#@+............+++@@++.......++@##########@@++.........................++@@####@#@++..........+@##@@+........++##$$$%$$#@++...............................+++++++................................++.+.+.+++++.................................................+++++.+..........................", +"..........................+@#####@++.............++++.........+++++@@@+@@++++............................++++++@+++.+.........+.++++++.........++@@#@#@@+++..................................+.+.................................................................................................+.+............................", +".....+++@+@+++..............................+++++@+@++...........+++++@+++...................................................+++@@@#@#@@+++................................................++++++................................................+@+@@++............+++@+@+.............++@@@@@@++..............................", +"....++@@###@@++..............................+@#####@@+.........++@#####@@++................+..............................+++@#$$$$$$$$#@+...............................................++@@@@+++...........+.++.+............................+@#####@++..........@#$###@+............@#$$$$##@@+..................+.+........", +"...++@$%***$$@++.............+.............++@$$***&%#@+.......++@$%***&&@@+............++++++............................++@#$&*=====***#@.............................................++@@$&&%#@+.........+++@@@@@++..........................@$$&&%$#@+..........#%%&%$#@+...........#$%&&&&%##@+.....+.........+++@+++......", +"...+@#%&=*=*%$@++..........+++@@++.........+@#%&===**$#@+......+@#%&===**$#@+.........++@@#@@++..........................++#$%&=*========%#............................................+++#$%***$#++.......++@@##$###@@.........................#*=->>*&#+++.....+..*=>>>*&#@+..++++@.+.&*>>>>>**%#++++++++.......++@###@++.....", +"..+@#%**===**%#@+.........++####@++........+#$**==-==&$#++.....+#$**==-==&$#++.......++@#$$$$@@+........................++#$&&*==------==%$............................................++#$%*===%$@+.......+@#$%&&&%$#@+........................$*=>>>=*$@+...+++++.*=>>>=*$@++++@#@@@+.*=>>>>>==&$@@@@@#@@.......@@#%%$$@+.....", +".+@#%&>;>->;>&%#++.......++##&&&$#+.......++#%>>->-;>=*%@+....++#%>>---;>=*%@+......++##***-=#@+........................+@$&>>>;;;;;;;;;;*%............................................+#$&->;;;*$#+.....++@#%==>>>==%#@++......................$==>>>=*%@@+++@@@@@.==>>>=*%@@+@##$$$#@.*=>>;;>==*%####$$##.......+#%>>>$#++....", +".+@$&*;;>>>;;*&$@++......+@$%==*%$@++.....+@#%>>->>;;=*%@++...+@#%>;>>>;;=*&@@......+@#%*==-=$@+......+++++....+.+++....+#%*>>>;;;;;;;;;;*%............................................+#$&->;;;*%#++....+@#$&-->>>-=&%#@+......................$==;;;==$#+@+##$%%#.==;;;==%#@##%&&--$@.=-->>>>>--%$$$%==*&......+@#%>>>%$++....", +"++#&==;;===;;==*#++....++@#%&;;;*%#@++.....@#%==---;>=*%#++...++$%=-->>;;=*%#++.....+@%*>>>=*$#++....++@@@@@+++@@@@@@+..@$&=;;;--;;;;;--=&$............................................+@#%*=;;;*&$+....++@&*=;;===;;=*%#++....+++++.+.++.......$==;;;==%#@@#$$&*&$.==;;;-=%$##%**=--$#.=-->>>>>>-&%&&*--=*......+@$%===&#@+....", +"+@#*==;;===;;-=*#@....+@@#%&*;;;**%#@@.....@#%==---;;**$@+....++#%==>>>;;=*&#++....++#%*>;>**#@+....+@##$$$##@@##$$##@@.@$*=;;;--;;;;;--=&$.........++++.+..............................+#$**;;;*&#@....+@#&==;;--=;;==&#++.+++@@@@@+@@+@++.....$&*;;;-=%$##$===>>$.&*;;;==&$$%*>>>==%#.&*-->;;-==**==->>*$......+@$&===&$@+....", +".@#*==;;===;>==*#++..++#$%**=;;;=*&%$#@...++#%===-=;>=&$@++....@#%=--->;;=*&#++....++#%*>>>*&#++....+#$%&&&%$#$%%&&&%$@.@$*=;;;--;;;;;-==%#.......+++@@+@..............................++@%&=;;;=&$@+...+@#&==;;-==;;==*#@+.++@##$########@++...#&=>;;-=&$$$&=-->-%.&*;;;-=&&&*=>>>==$#.%*>->;;--=**--->>&$......+#%&=-=&$@+....", +"++#%*=>;---;;**%#+...@@$*==--;;;--==*$@...++#%*=;;;==*%$@+....+@#%==>>>;;==&#@......+@%&*=*%$@+.....@$=->>>**%$&;;>--$#.@$*=;;;>-;;;;;--=$#......+@@##$##++.............................+@$&=;;;*&$@+...+@$*==;;===;;-=*$++.+@$***&&&&&*&$##++..$&*;;;-=*%%&*--->>%.&=;;;-=*&**=>>>==$#.&*->>;;---==->->>&$....++@#&*>;>*$#+....", +".+@$%*>;---;;*&$@++.+@$&==---;;;---==&$...+@#%==;;;==*%#@+.....@$%==->>;;==*#@+.....++$%&*&##++.....#$--;;;==&&*;;>>>&$.@#*=;;;->;;;;;-==%#.....++@$%&&%$#@............................++#$**;;;=*$@+...++#*==;;===;;==*#@+.@#$===**=*===&%$#++.$&=;;;-=***==>>>**%.&*;;;-==*=>>>>-**%#.=---->>>>>--;;>**$#....++#%&=;;;*%#+....", +"..+#$%*=---=*&$@++..+@%*;;;;;;;;;;;;;*%....@$&>;>>>;>=*%@++..++@$&>;---;;=**#++.....+++####@++......#%==;;;==&&*>>;;>&%.+#%*>;;;;;;;;;-==$#.....+@#*=>>>%#@.............................+#$==;;;==$#++..++#%*=;;->-;;=*&#++.@$%>;;>>-=-;;==*$@@.%**;;;-===*-->;;*&$.*=;;;-====;>>>-=*%#.=-->->>>>>-->;;*&$@...++#$&->;;;*%#++...", +"..++#$**===*&$#++...+#%*;;;;;;;;;;;;;*%...+@$&>;>>>>>=*&@+....+@$&;;->-;;=*&#++......+++@++++.......@$*=;;;-=***>>;;;*%.+#%*>>;;;;;;;;-==$#....++@$*=;;;&$#++...........................@#%=-;;;==%#+...+@#%*=;;---;;=*%@@..@$&>;;;>---;;-==%#@.%->;;;;>>>>;;>>>=&$.->;;;>;;;;;;;;;>-%$.*=;;;;;>>>;;>>>=*$@..+@#$&*->;;;*%#++...", +"..+++#$&==*&%@@+....+@%*;;;;;;;;;;;;;*%...+@#&>;>>>>>**%@++...+@$%;;---;>=*&@+..........+++.........#$*=;;;==&&*->;;;*%.+@#%->>;;;;;;;-==$#.....+#%==;;;*$#+..........................+.@#%==;;;==%#@+...+@%*=>;->-;;=*%@+..@$%>;;;;---;;--=*$#.%->;;;;;>>>;;>>-=&#.->;;;;;;;;;;;;;>>&$.*=>;;;;>>>;;>>>*&#@..+@$&*=>>;;;*%#+....", +"....+@@##$$#@@+.....++#%&**==;;;===*&%#....@#$==----=&$#++.....+#$*==--==&$#@++.....................@$**;;;-=*&*=-;;;*%.++#$&**--;;;;;===$#....++@$==;;;&$#+..............++...........+@#%=-=-===%$@+..++@$&*->>>>>-*&$#++.+#%*==;;>>>>>;;;=*$.$=-;;;>;>>>;;>>>=&$.->;;;;;;;;;;;;;>>&%.&*>;;;;>>>;;>>>=*$+.+@#%->>;;===&$#@+...", +".....++@@@@@++......++@#%&*==;;;=**&$#@....+@$**=====$#@++....++@#%&===**%#@+.......................+#%*;;;-=***--;;;*&..++#$%*--;;;;;-==$#.....+@$*=>>;&#@+...........++@++++.........+@#$*=====*$#@++.++#$&=->>>>>-=&$#++.+#%*==;;>>>>>;;;=*%.$%&*==-=;;;>>;;;=*$.&**==>>>>>>>-=-;;*$.$%**==-;;;>>;;;=*$@.+@$&>>>;;===*%##++..", +".......++++.+........++@#%%*=;;;=*&$#@+...++@@$$%%%$$#@+.......++@#$$$%$$@@++.......................@#&*;;;--===--;;;*&...++@$%*=;;;;;-==$#.....+@#$%&&%$#@+..........+@@####++........++@#$$$$%$$#@+...++#&==;;;;;;;==*#@..+@$&==;;;;;--;;;==$.@$%&*===;;;>>;;;=*$.$&===>>>>>>>--=;;&$.#$%**=-;;;>>;;;=*$@.+@%&>>;;;==**&%##++.", +".........+...........++@#$%*=>;;=&%$#@+.....++@@###@@+++........+++@#@#@@++.........................+#&*;;;;>-=->;;;;=&....++#%&=;;;;;-==$#......+@##$$$#++..........++#$%%%$#++........+++@####@@+++...+@#**=;;;;;;;==&#++.+#$*==;;;;;>>;;;==$.+#$**=;;>>>>>;;;=*$.$&=--;>=*===;;;-=&$.@#%*=;;>>>>>;;;=*$#.+#%*;;;--==*--**%#+.", +".....................++@#$&*=;;>=*&$#@+......+++++@+++...........+++++++++..........................+#&*;;;;;---;;;;;=*.....+@$&=;;;;;-==$#........@@@@@++...........+@$&->>%$#++.........++++@+++++....++@**=;;;;;;;=*&@@..@#%*==;;;;;--;;;=*$.+#$**=;;->>>>;;;=*%.$&=->>>=**==;;;-=&#.@#%**;;>>>>>;;;=*%#.+#$*;;;--===>>=*&#+.", +".....................+@#**===---==**&@@........++.+.+..............+.++.............................+#%*;;;>;>--;;;;;=*....+@$%*=;;;;;-==&#.........+++++...........+@$%*>>>*%#@+..........+.+.+.........+@#%&&******%%#@+..@$&>>;;;---;;>>-*%$.+#%*==;;>>>>>;;;=*%.%&->->>****=;;;==%#.@$&*=;;>>>>>;;;=*%#.+@%&>;;;>==-;;==*#@.", +"....................+@#$===--->---==*$#.............................................................+#&*;;;;;;;;;;;;;-=..++@$%*==;;;;;>>-&$........................++@$==;;;==$@+........................++@@$%%&&&%$$#@++..@$&>;;;;---;;--=&$@.+#%->>>>>>>>>;;;-=%.*=>;;==***>>>>-==%#.#%->>>>->->>;;;-=%#.+@$&>>;;;---;;-=*$@.", +".....................@$%==-->-->--==*%#.............................................................+#%*;;;;;;;;>>;;;-=...+@$&*=-;;;;;>>-*%.........................@#%==;;;==%#++.........................++@@#####@@+++...@$&>;;;;==-;;-==$#@.@$%>>>-->>>>>;;;--%.&=;;>=*&**>>>>>==%#.$%>>>>->->>>;;;--&#.+@$%>>>;;---;;==*#@.", +"....................+@$*;;;;;;;;;;;;;*$.............................................................+#&*;;;--==*****&&$..+@#*==;;;;;;;;;;*&.........................+#%=-;;;==%#+..........................+++++++@++++.....+#%=--**=====*&$#@+.+#%->>--->>>>;;;-=%.&*>>>**%&*>>->-==%$.#%->>-=-=->>;;;-=%#..+#$**=;;;;;;;=*%#+.", +"....................+@$&;;;;;;;;;;;;;&$.............................................................+#%*;;;-=*%$####@@+..++#&==;;;;;;;;;;*&........................++#&->;;;-=$#++............................+.+..+........+#$*==&&*****%$#@++.@#%*==**&&*==;;;-=%.&****%$%**;;>>>;>%$.#%*==*&&&*==;;;-=%#.++@#%**;;;;;;>*&$@+.", +"....................++#%%***********&$#.............................................................+#%*;;;==%##@++@++...++#&*=;;;;;;;;;;*%.........................@#%->;;;==$#+...........................................++#$$$$$#$$$$#@++...+@#***$%$%%*=>;;==$.%&%%%$#$%*>>>>>>;%#.@#***$$$$%**;;;==$@...+@#$&&*****&%$@@..", +".....................+@#$$%&&&&&&&%$$#@.............................................................+@#%===&%#@+..........+@#$&&********&%#........................++#$*=---*%$@+...........................................+++@@#@@@@@@@++++...++@########$%&*&%$#.@@###@@@#$&&&*&&%$@.+@######@$$&&&&%$#@...++@##$%%%%%$#@+.+.", +".....................+++@###########@++.............................................................++#$***%#@+...........++@##%%&&&&&%%$#@.........................+@$&*===&$@+..............................................++++++++++++.......+++@+++++@##$$$$@@.+++++++@@#$$$$$$#@@.+++@@++++@@$$$$$@@+......+@@#####@@++...", +".......................+++++@+@+++++++...............................................................+@#&*&#@++............++@@########@@@+..........................+@%&==*$#@+..............................................+...................++++++++++@@@@@++.++++++..++@@##@@@++..+.+.++.++++@#@@++........++++++++++....", +"...+++@@@@++...............+++@@@@++..........++@@#@@+...........+.++@++++..............................+++@####@++............++++++++.+.........+++@+@+@+++++....+++@@@@++................++@@@@@+..........++@#@@@...........+++++++++++........+++@@@++..................++@@@@++........++@@####@+.........++++++++++++....", +"...++##$##@++..............++@##$##@+........++##$$$#@+..........+@@@###@@++...............+.............+@#$%%$$@++.........+++@+@@@@@@@++...++++@@########@++....++##$$#@++..............++@##$#@@++.......+@#$$$#@@+........++@##@##@#@@++......+@@#$$#@++...............++@##$#@@+.......++#$%%%$#@+.......+++@#@@@@@@@@++..", +"..++#$&==$#@@.............++#$&&==#@++.....+++#%&===$#@+.......++@#&&%%$%$@@........+++@+++++++........++@#**---&$@+.......++@@##$#$#####@@....+@#$%&****&&%$$@...++@$==&%%@@............+++@#%==%$#++.....+++#$===&%#++......++@#$$%$$$$$#@@+.....+#%%==$$@++.............++@#%==&$#++....+++#%*->-&%#@.....+++##$$$$#$$$$#@@+.", +"..+@$%*--&%#@++..........+@@$&**--$#@.......+@$&*---&$@+......++##%******&#@++.....++@@@#@@@@@@+.......++@%*=>>-*%#++.......@@&&********&&#..+@@#%&*=====***&%#...++#$=-**&$@@+...........@@$%&--*%$++.....++#$&->-*&$#++....++@$%--***==*&%@+....++$%*--&%$@++...........++@$%&--*%$@+....++@$**>>>=&$#++....+@%&&==%%%==*&%@+.", +"..++$&*>>**%#@+.........++@$%===--$#+......+@$%*=>>-*%#@+....++@$%&=====**%#@+....++@#$$$$$$##@@+......+@#%==>>>*&$++.....++#$**========**$.+@#$%**=====-===**$..++@$%==;;>*&$#@++....++@#$%-->>>*%$@++..++@$%=->>>;>&%#@+...+@$%&>>=*=--=**#@+..++@$%*->**%$@++.........+@@$%&*>-*%$++....+@$%*=>>>=*%#@+...+@#&*==-***--**&#@.", +"..+@#%*->>-=$#++......+++@#&*>>>=*$@++....++#%&>;>>>==$@++..+.@#*==;;;;;;>&$#+...++@%&*=-%%%--$@++....++@$&->---==$@+......@#%====-=-=====&.+@$===;;;;;;;;;;>>%..+@#%&==;;;=*%$#@+..++@@$$&*->>>-*&$@@...@@$%*=-;;;;;*&$#@..+@#**=->--->>===%#+...+@#%*->>-=%$#+++.....+++#$%-->>-*%#@+...++#%&>;>>>;;&%#@+.++@$*==>>===->-=*$@.", +".++@$%*->>>-&$@.+.....++@$%*=;;;=*$@+....++#$&*;;;;>-=$@+....+@$*=-;;;;;;>*$#+...+@#%*=--***--$@++....+@#%*->---=*$++....++@$&>;;;;;;;;;;;&.@#%==-;;;;;;;;;;>>&.+@#&*==-->---=*&#@+.++#&**==>>>--=**$@+.+@$*==>>--->>-=*$#+.+#$*==>>--->>-==%$@...+@$%*->>>-*%$#@++...++@#$%*->>>-*%#@+...+@$&*;;>>>;;*&$@+.++#%===>>--->>-==%#.", +".++#&*==->>>&$#+.....++@$&*=->--*&#@++...+@#*=->>---==%#++..++#%=---->>>==&$@++..+@#**=>>=====%#+....++#&*=->>>>*&$@++....+#$*;;;;;;;;;;;;*.#$*;;;->=====>>>>>&.@#&==--->>>>>===&$@.@$%===-->>>---==&$@.@$%=-->>->->>--=&%#.@$&==->>>->>>--=*$#..+@$*===->>>==**%#+..++#&**=->>>-==*&#@..+#$*=-->--->>-==$@.++#$==->>=-->>-==%#.", +".+@$*===->>>*%#@.....+@#&*=-->>-*&#@.....+#$*=->>->-==$#++..+@#%=->->>>>=*%#@....+#$*==>>-===*%#@....+@$*==->>>>*&$@+.....+@%*->;;;>>===;;*.#%*;;;--*****>>>>>&.#%&;;;;;;;;;;;;;=&#.@%*;;;;;;;;;;;;;=&#.@%*;;;;;;;;;;;;;=&#.#%*;;;;;;;;;;;;;=&#.++#$*==-->>>-==**$@..+@$&==-->>>-===*$@.++#%==->>--->>-==%#.++#%->>;;;;;;;>>-%#.", +"++#$*==-->>>*&$@+....+@$**=->->>*&$@++..++#%==->>---==%#@...++#&=->-->>>==%#@+..++#%*==>>---==%#++..++#$*==->>>>=&$@+....++#$*>>;;;>>===;;*.#%*;;;>=*%%&*->>>>&.#%*;;;;;;;;;;;;;=*$.@%*;;;;;;;;;;;;;=*#.#%*;;;;;;;;;;;;;=*$.@&*;;;;;;;;;;;;;=*$.++#$->>;;;;;;;>>-$#.++#$->>;;;;;;;>>-$#.++#%->>;;;;;;;>>-%#.++#$->>;;;;;;;>>-$#.", +"++#%->>;;;;;-=%#++..++#$->>;;;;;-=%#++..++#%->>;;;;;-=%#@+..+@#%>>;;;;;;-=&#@...++#%->;;;;;;-=&#@+..++#%->>;;;;;==%#++....+#%*>>;;;>>=-=;>&.$*=;;;=*&$#$%***=*$.@$&=--;;=====;;;**#.@$&=--;;=====;;;**$.@$&=--;;=====;;;**#.@%&=--;;=====;;;=&$..+#$->>;;;;;;;>>-$#..+@$->>;;;;;;;>>-$#.++#$->>;;;;;;;>>-$#..+@$%&*==;;;==**%#@.", +".+#$->>;;;;;==&#@+...+#$->>;;;;;==&#++..++#$->>;;;;;-=&$@+..++#%->>;;;;;-=&#@+..++@%->>;;;;;-=&$++..++#$->>;;;;;-=&#@....+@#%*;;;;;>>;;;=*&.#*=;;;=*%#@@#&&**&$.@$&=--;;=====;;;=&$.@#&=--;;=====;;;=&#.@$&=--;;=====;;;=&$.@$&=--;;=====;;>=*#..+@#%&*==;;;==**%#@.++@#%&*==;;;==*&%#@..+@#%&*==;;;==*&%#@...+@$%**=;;;=*&%##+.", +"++@$%*=>>;;;>>&$@+..++@$&*=>>;;;>>&$@+...+@$&*=>>;;;>>&$@+...+@$&*=>>;;;>>&$@+...+@$&*=>>;;;>>&$@+...+@$&*=>>;;;>-&$@+...+@$&*;;;;;>>;;;=*%.$&=;;;=*$@@@@$%$%%@.+#%==-;;=====;;;*&#.+#%==-;;=====;;;*&$.+#%==-;;=====;;;*&#.+#%==-;;=====;;;*&#..++@#%**=;;;=*&%#@+..++@#%&*=;;;=*&%$@+..++@$%**=;;;=**%##+..+.+@#%*=;;;=*%#@++.", +"..+@$&*>>;;;>>*%#@...++@$&*>>;;;>>*%#++...+@$&=>>;;;>>*%#@...++@$&*>>;;;>>*%#@....+#$&*>>;;;>>*%#++...+@$&*>>;;;>>*%#+..++@%&=;;;;;>>;;>=*$.$*=;;;*&$@++++@@@@+.+#$==-;;===>;>--&%@.+#$==-;;===>;>--*$#.+#$==-;;===>;--=&$@.+#$=--;>===>>--=&$#...++@#%*=;;;=*%#@@....++@#%*=;;;=*%#@++...++@#%*=;;;=*%#@++...+++@$&*;;;*&$#++..", +".++@$**;;---;;*%$++...+@$**;;---;;*%$++..++@$&*;;---;;*&$++...+@$**;;---;;*%#@+..++#&*=;;---;;*%$++..++@$**;;---;;*%#@+.+@$*==;;;;;;;;;;=*$.$*=;;;*&$@++++@@@++.+@$==-;;===;;--=$#+.+@$==-;;===;>--=$#+.+#$==-;;===;;===$@+.+#$==-;;===;>-==$@+....++@$&*;;;*&$#++.....++#$&*;;;*&$#++.....++@$&*;;;*&$#++......+@$&*;;;=&#@+...", +".++#$*=;;=-=;;=&$@+..++@$&=;;---;;=&$@+..++@$**;;---;;=&$@+..++@$&=;;---;;=&$@+..++#&*=;;---;;=&$@+..++#$&=;;---;;=&$@+.+#%*==;;;;;;;;;;=&#.#*=;;;=*%##@@####@@.+#$==-;;;;;;;=*&$@@.+#$==-;;;;;;;=*&$@+.+#$==-;;;;;;;=*%$@@.+#$==-;;;;;;;=*%$@+....++@$&=;;;=&#@+.......+@#&=;;;=&#@+.......+@$&=;;;*&$@+.......++$&*;;;*&$++...", +"++@$===;;===;;-==$@..+@%*=-;;===;;-==$@..+#$==-;;===;;===$@..+#$===;;===;;-==$@..+#$==-;;===;;-==$@.++@$===;;===;;===$@.@$%->>;;;;;>>--=*&#.$&=;;;=*&%$$$%%$$#@.+#$==-;;;;;;;=*%$@+.+#$==-;;;;;;;=*&$#+.+#$==-;;;;;;;=*%$@+.+#$==-;;;;;;;=*%$#+.....++#&=;;;=&#@+.......+@#&*;;;*&$++.......++$&*;;;**#@+.......++#&=;;;*&$++...", +"+@#%=--;;===;;-==%$.+@#%==-;;-==;;-==%$.++#%==-;;===;;-==%$.+@#%=--;;===;;-==%#.+@#%=--;;-==;;-==%$.+@#%==-;;===;;-==%$.@$*>>>;;;;;>>>--*%$.#&*;;;-=**&&&====*#.+#$==-;;>>>;;=**%$@.+#$==-;;>>>;;=**%$@.+#$==-;;>>>;;=**%$+.+#$==-;;>>>;;=**%$@....++@$&*;;;*&$@++......+@$&=;;;*&$@+.......+@$&=;;;*&$@+.......+@$**;;;*&$@+...", +"+@$&>>;;;;;;;;;>>&$.+@$&>>;;;;;;;;;>>&$.+@$&>>;;;;;;;;;>>&$.+@$&->;;;;;;;;;>>&$.+@$&>>;;;;;;;;>>>&$.+@$&>>;;;;;;;;;>>&$.#&*>>>;;;;;>>---**$.#%*;;;>-=*=*=---==$.+#%==-;;>>>;;===*&$.@#%==-;;>>>;;===*&$.@#%==-;;>>>;;===*&$.+#%==-;;>>>;;==**&$...++@#%*=;;;=&%#@+....++@#%&=;;;=*%#@+....++@#$**;;;=*$#@+.....+@#%*=;;;=*%#@+..", +"+#%*>;;;;;;;;;;;>*&.@$%*>;;;;;;;;;;;>*&.+#%*>;;;;;;;;;;;>*&.+#&*>;;;;;;;;;;;>*&.@$%*>;;;;;;;;;;;>*&.+#%*>;;;;;;;;;;;>*&.$&=;;;=->>>>>===>>&.@$&-->;;;;;;;;;;==%.@$&=--;;===>->-->>%.@$&=--;;===>---->>%.@$&=--;;===----->>%.@$%=--;;===--->->>%...+@#$&*=;;;=*&$#@+...+@#$&*=;;;=*&$#@+...+@#%&*=;;;=*&$#@+..++@#$&*=;;;=*&$#@+.", +"#$*=;;;>>>>>>>;;;=*.@$*=;;;>>>>>>>;;;=*.#$*=;;;>>>>>>>;;;=*.@$*=;;;>>>>>>>;;;=*.@$*=;;;>>>>>>>;;;=*.#$*=;;;>>>>>>>;;;=*.%*=;;;-=>>>>>===>>*.@#%=--;;;;;;;;;;=*$.@$&=--;;===-->>>>>&.@$&=--;;===->>>>>>&.@$&=--;;===>>>>->>&.@$&=--;;===>>>>->>&..++#$&*==;;;==*&$#@.+.@#$&*==;;;==*&$#+..++#$&*==;;;==*&%#@..++#$&*==;;;==*&$#+.", +"#%*=;;;>>>>>>>;;;=*.#%*=;;;>>>>>>>;;;=*.#%*=;;;>>>>>>>;;;=*.#%*=;;;>>>>>>>;;;=*.#%*=;;;>>>>>>>;;;=*.#%*=;;;>>>>>>>;;;=*.%->;;;>>;;;;;;;;;;*.+#$==-;;;;;;;;;;=*$.#&*;;;;;;;;;;;;;>>&.#&*;;;;;;;;;;;;;>>&.#&*;;;;;;;;;;;;;>>&.#&*;;;;;;;;;;;;;>>*.++@$==-;;;;;;;--=$@..+@$==-;;;;;;;>-=$@.++@$==-;;;;;;;--=$@..+@$==-;;;;;;;--=$@.", +"#%->;;;;;===;;;;;>-.#%->;;;;;===;;;;;>-.#%->;;;;;=-=;;;;;>-.#%->;;;;;=-=;;;;;>-.#%->;;;;;===;;;;;>-.#%->;;;;;=-=;;;;;>-.%->;;;>>;;;;;;;;;;*.++#$&*==;;;>>==**$#.#&*;;;;;;;;;;;;;>>&.#%*;;;;;;;;;;;;;>>&.#%*;;;;;;;;;;;;;>>&.#&*;;;;;;;;;;;;;>>&.++#$=->;;;;;;;>-=%#.++#$=->;;;;;;;>-=%#..+#$=->;;;;;;;>-=$#.++#$=->;;;;;;;>-=%#.", +"#%->;;;;;-=-;;;;;>-.#%--;;;;;-=-;;;;;>-.#%->;;;;;===;;;;;>-.#%->;;;;;===;;;;;>-.#&--;;;;;-=-;;;;;>-.#%->;;;;;===;;;;;>-.%--;;;>>;;;;;;;;;;&..++@#&==;;;>>*&%#@+.#%*;;;;;;;;;;;;;>>&.#&*;;;;;;;;;;;;;>>&.#&*;;;;;;;;;;;;;>>&.@&*;;;;;;;;;;;;;>>&.++#%=->;;;;;;;>>=$#.++#%=->;;;;;;;>--$#.++#%=->;;;;;;;>>=%#.++#%=->;;;;;;;>>=$#.", +"#%--;;;;;===;;;;;--.#%->;;;;;===;;;;;--.#%--;;;;;===;;;;;--.#%=-;;;;;===;;;;;--.#%=>;;;;;===;;;;;>=.#%--;;;;;===;;;;;--.$*=---=--->-->>>--&....@#%==;;;>-&#@+...@$&=-->>-->-----=*%.@$&=-->>-->-----=*%.@$&=-->>->->----=*%.@$&=-->>>--->---=*%..+@$*==->->---==*$#..+@$*==->->---==*$#.++@$*==--->->-==*$@..+@$*==->->---==*$#.", +"#$*=-----=*=--->-=*.#$*=-----=*=--->-=*.#$*=-----*===----=*.#$*=-----*===----=*.@$*=-----=*=-----=*.#$*=-----*===----=*.#&*======-=-----==$...++#%->;;;=*%#++...+#$===----=---==*&#.+#$==----=-=--==**#.+#$==----=-=--==*&$.+#$==-----=-=-==*&#.++@#**===-=-===**#@.++@#**====-=-==**#@..+@#**===-=-===**#@.++@#**===-=-===**#@.", +"@#&*=-===*&*=====*&.@#&*=-===*&*=====*&.@#&*=-===&&*==-==*&.@$&*=-===&&*==-==*&.@$&*=-===*&*==-==**.@#&*=-===&&*==-==*&.@#$%%%%%&%&&&&&&%$#....+#$=-;;;*&#@+....+@#$%&&&&&&&%&&%$$@.+@#$%%&&&&&&%&&%$#@.+@#$%%&&&&&&%&%%%#@.+@#$%%&&&&&&%&&%$$@..++@#$%%&&&&%%%$#@+..++@#$%%&&&%&%%$#@+..++@#$%%&%&&%%%$#@+..++@#$%%&&&&&%%$#@+.", +"+@#$%%%%$$$$$%%&%$$.+@#$%%%%$$$$$%%&%$$.+@#$%%&%%$$$$%%&%$$.+@#$%%&%%$$$$%%&%$$.+@#$%%%%$$$$$%%%%$#.+@#$%%&%%$$$$%%&%$$.+@@######$##$#$###@....+@#%&**&%$#++....++@@###$#$#$####@@+.+++@##$#$#$#$###@@+.+++@##$#$#$#$###@@+..++@##$#$#$#$###@@+...++@@####$#$##@@++...++@@#####$###@@++...++@@###$#$###@@+....++@@@########@@++.", +"++@@#####@@@#####@+.++@@#####@@@#####@+.++@@#####@@@#####@+.++@@#####@@@#####@@.++@@#####@@@#####@@.++@@#####@@@#####@+.++++@@+@+@@@@@@@+++.....+@#$$$$#@++.......+++@@@@@@+@@++++...+++@+@@@@@+@++@++...+++@+@@@@@+@@+@++...+++@+@@@@@+@++@++.....+++++@+@+@++++......++++@@@+@@+++++.....++++@+@+@+@++++.....+++@+@@@@@++++...", +"........................++++@@@+@++++.......+++@@@+++...............+++@@+++.........++@@#@@@+..........++++@@@@+@+++.....................................................+.++++.+......++@@@@+++...............+++@+@+.+........++@@##@@+...................................+++@+@+.........+....................+++++++.......", +"..++++++++++++..........++###$$$$###++.....++#$$$##@+..............+@@#$$#@+........++@#%%%$#@++........++##$#$$$###+++.........+..++..................................++++@@@@++......++@$$$##@++............+++@#$$#@+........++@#%%%$#@++............+.+.+...............++@#$$@@++.....+++++++................+@@###@++.....", +"++@@#######@@+++.......+@#$%&&&&%%$$#++....+@#&&&%$#@+............++@$$&&$#@+.......+@#%&**%$#@+......++@#$%&&&&%%$$@@......+++++++++++.............................+++@@####%$$@@+....+@$&&&%$#@+............++#$$&&$#@+.......+@#%&**%$#@+........+++++++++++............++#$$&&$#@+...++@@#@@@+++............++@$%&&&$@@+....", +"@@$$%%%%%%%$$##+++...+++#$==>>>==-==$@+...++#$=---=$#++..........++#%&*>>&%#++.....++#%*>>>==$#++.....++#$==>>>==-==$@+....+++#$@@###@@++.........................++@@#$$%%%&*&&$@+...++#$=---=$#++..........++#%&*>>&%#++.....+@#%*>>>==$#++......++@#$@@@$#@+++.........++#%&*>>&%#++.++##$%$%$#@@+..........++@$%**=*%%#@++..", +"#$%&*******&&%$$@++...+##%=->>>----=$#+...++#%->---&$@+..........+@$&==>>*%$+......+@$**;;;-=&$@++....+@#%=->>>----=$@+....+@#$%$$$%%##@++.....++++......++++.+...+@#$%&&****==*%#@...++#%->---&$@++........++##&==>>*%$++.....+@$**;;;-=&$@@+.....+@#$%$$#%%$#@++......+++#$&==>>*%$++.+#$&&**&&%$#@+.........+@$%**===*&%#@+..", +"#==>;;;;;;;>>**&$#+.++@$%*--;;;-->-=%#+....@#%->>>-*%#@+........+@#%*==;>*%$++....+@#%*=;;;--*%#++...+@#%&--;;;-->-=$#+...++#$&&%&%**%$#@+....++@+@+++..+++@+++.++@$$&=-;;;;>;;;&$@...+@$%->>>-*%$@+++....+++@$%*==;;*&$@++..++@#&*=;;;--*%$@++..++@#$&&%%&&*%$$@++...+.++##%*==;;*&$@+.@#%>>>;>-==$#@+.+.....+@#$*>;;;;;>&%#@+.", +"$==;;;;;;;;>>==*%$@.+@#&*=>;;;;;;==*%#@...++#$*=>;>=*$@++......++#$&>>;-=&%#++.....@#&>>--->>=*&@++..+@&*=>;;;;;;==&$@+...+@$%>>=*=>>=*&#@..+.+@####@+++@##$#@+.+@$%**--;;;;;;;;*&#.++@#$&*=>;>=*%$@@++..++@#$%*>;;-=*&$#++..+@#%*>>---;>=**#@+..+@#%&>>*=*>>==*$@+..++@@#$%*>>;-=*&$#+.@$&>;;;;--=%$#@++....++@$&*;;;;;;;*&$@+.", +"%*=;;;>>>>>>>;;;*&#.+@%*==>>;;;;;===&$@..+.@#%&=>>>==&$@++....++@$&*;;;-=*%#@+...++#$&>>->-;>=**#++.++#&*=>>;;;;;=**$@+..++#$&>>===>>==*#@+..@@$*=*$##@##$=**$@.@#%->>;;>>>;;;;;=*$.++#$&**=>;>==*%%$#+.++#$%&**;;;--**%$#@.+@#%&*>;->-;>===%$@.+@#%**;>===>>===%$@.++##$%&**;;;-==*&$#.@$&>>>;;>--=*$$@@++.+.@#*==;;=--;;==*$+.", +"%*=;;;>>>->>>;;;=*$.@#%===;;;;;;;===&%#..++@$%*=>;>==&%$@@+..++@$%&=;;;==*&$@@...+@#%*>>-->;;==*$@+.++#&==>>;;;;;==&$#+..+@$%*>;===;>-==$#+.++#%===&%$$$%&===%#.@$&->>;;>>>;;;;;=*$.+#$&*===>;>==***%$#.+#$%**==;;;-==**&$#.+#$&*=>;---;;-==&%#.+#$&*=;;===>>-==*%#.@@$%&**==;;;--=**&$.@$&>>>;;>--==&&$#@+..+@$*=-;;-==;;-=*$@.", +"%==;;;>>>>>>>;;;=*%.@$&>;;>>===>>;;;==$.@#%->>;;>>>>>;;;*&#.@#%->>;;>>>>>;;;*&#.@#&->>;;>>>>>;;;*&#.@#&>>;;;->>>>;;;*&#.@#&>>>;;>>>>>;;;*&$.+@$%=--**&&&**--=&#.#%*>>>;;>>>;;;;;=*%.@$%>>>;;===>>;;>==$.@$&>>;;;===>>;;>==$.@$&>;;;;===>>;;;==$.@$&>>;;>=*=>>;;;==$.@#==>>>;;-==;;;;>==.@#&>>>;;>>>-=**&%$#.++#$==-;;-=-;;-==$@.", +"$*=;;;--=====;;;>-%.#%*>;;>>===>>;;;-=$.@$&->>;;>>->>;;;=*$.@$&->>;;>->>>;;;=*$.#$&>>;;;>->>>;;;=*$.#$*>>;;;>->>>;;;=*$.#$&>>;;;>->>>;;;=*$.+@%*;;;>>**=>>;;>&$.#&*;;;----->>;;;>-&.@%*>;;;;==*>>;;;-=$.@$*>;;;;===->;;;-=$.@%*>;;;;=*=>>;;;-=$.@%*>;;;;=*=->;;;-=%.#$==>>;;;==-;;;;;-=.+$%=--;;;;;;;;;>*&$..+@$==-;;---;;-==$#.", +"$&=;;;--=*=*=;;;>-&.#%*;;;;;-=-->;;;-=%.#%*>>>;;--->>;;;=*%.#%*>>>;;--->>;;;=*%.#%*>>;;;--->>;;;=*%.#%*>;>;;--->>;;;=*%.#%*>;;;;--->>;;;=*%.+@$*>;;;>===>>;;;&#.$*=;;;----->>;;;>-&.#%*;;;>>=*==-;;;==%.#%*;;;>-=**--;;;==%.#%*;;;>>==*=-;;;==%.#%*;;;>>=**=-;;;==%.#%=-;;;>>===>>;;;==.+#%=--;;;;;;;;;;=*$..+#$==-;;---;;-==%#.", +"%=-;;;;;---=*->>>>&.#&*;;;;;-=---;;;==%.#&=;;;-=***==;;;>-&.#&*;;;-=***==;;;>-%.#&=;;;--***==;;;>-&.#&=;;;-==**==;;;>-&.$&=;;;--***==;;;>-&.+@#%*==;;;;;;;==*%#.$*=;;;==;;;-->>>>>&.#%*;;;-=*%&*=;;;=*%.#&*;;;-=*%&*=;;;=*%.#&*;;;-=*&&*=;;;=*%.#&*;;;-=*&&*=;;;=*%.@#%*>>;>>===>>;;;*&.+#$==-;;=====>>>>>&..+@$==-;;;;;;;-==%#.", +"%=-;;;;;--=*=-->>>*.#%*;;;;;>>>==;;;=*%.$&=;;;-=*&&**;;;>-&.$*=;;;==*&&**;;;>-&.$&=;;;-=*&&**;;;>-&.$&=;;;-=*&&**;;;>-&.#&=;;;-=*&&**;;;>-&..+#%&==;;;;;;;=**$@.$*=;;;==;;;-->>>>>*.#&*;;;-=&%%**;;;=*$.#&*;;;-=&%%&*;;;=*$.#&*;;;-=&%%&*;;;=*$.#&*;;;-=&%%&*;;;=*$.+#%*>>>>>===>>;;>*%.+#$==-;;=====>>>>>&.++#$==-;;;;;;;--=&$.", +"%=-;;;;;--=**->>>>*.$&*;;;;;>>;==;;;=*$.$*=;;;*&%##%&-->>>*.#*=;;;*&%##%&-->>>*.$*=;;;=&%##%&-->;>*.#*=;;;=&%##%&-->>>*.$&=;;;*&%##%&-->>>*.++@#&*=;;;;;;;=**#@.$*=;;;==;;;-->>>>>&.#&*;;;==&$%&*;;;=*$.#%*;;;-=&%%&=;;;=*%.#%*;;;==&$%**;;;=*%.#%*;;;-=&%%&=;;;=*%.+@#%*==;;---;;==*%#.+#$==-;;=*=*=>>>>>&.++#$==-;;;;;;;--=&$.", +"%=-;;;>>===**-->>>*.#%*;;;>>;;;==;;;=*$.$*=;;;=&$##$&-->>>*.$**;;;=&$#@$&=->>>*.$&=;;;*&$##$&-->>>*.$**;;;*&$##$&-->>>*.$*=;;;=&$##$&-->>>*...@#%*=>>;;;>>=*%#+.$*=;;;=-;;;==->>;>*.#&*;;;==&$%**;;;=*$.#&*;;;==&$%&*;;;=*$.#&*;;;==&$$**;;;=*$.#&*;;;==%$%&*;;;=*$..+@$*==;;>->;;=**$@.+#$==-;;==*==>>>;>*..+@$==-;;===>>;;;*&.", +"%==;;;>>==***-->>>&.#&*;;;--;;;->;;;=*$.$*=;;;*&$#@$&-->>>&.$*=;;;*&$##$&=>->>&.$*=;;;=&$@#$&-->>>&.$*=;;;*&$@#$&-->>>*.$*=;;;*&$@#$&-->>>&.+.@#%**>>;;;>>=&%$@.$*=;;;==;;;==>>-;>&.#&*;;;==%$$**;;;=*$.#%*;;;==%$$**;;;=*$.#%*;;;==%$%**;;;=*$.#&*;;;==%$%**;;;=*$..++@#%*>>;;;>-*%#@+.+#$==-;;=====>>>>>&.++#$==-;;===->;;;=*.", +"$&=;;;-=**&&*>>>>>*.#&*;;;->;;;--;;;=*$.$*=;;;=&$##$&-->>>*.$*=;;;**$##%&-->>>*.$*=;;;*&%##$&-->>>*.$*=;;;=&$##$&-->>>&.$*=;;;=&$##$&-->>>*..+@$==-;;>>>;;-=*$@.$&=;;;;;>--==;;;>>*.#%*;;;-=&%%&*;;;=*$.#%*;;;-=&$%&*;;;=*$.#&*;;;-=&$%&*;;;=*$.#%*;;;-=&$%&*;;;=*$...++#$&>>;;;>>&%@++.+#$==-;;;>;>>;;;-=&.++#$==-;;=*===;;;=&.", +"$&*;;;--*****>>>>>&.#&*;;;-----;;;;;=*$.$*=;;;==&%&&*>;>>>&.#&=;;;==&%&&*>;;>>&.#*=;;;==&%&&*>>;>>&.$&=;;;==&&%**>;>>>&.$*=;;;==&%&&*>;;>>&.+@#%==-;;>>>;;-==%#.$&=;;;;;>--==;;;>>&.#&*;;;==%%%&=;;;=*$.#%*>;;==&%&&=;;;=*$.#%*;;;==&%%**;;;=*$.#&*;;;==&%%*=;;;=*$....+@$&*=;;;=*%#@+..+#%==-;;;;;;;;;;==$.++#%==-;;===*=;;;=&.", +"#**;;;-==***=>>>>-%.#%*;;;--->-;;;;;=*%.#&=;;;==****=>;;>-%.$&=;;;==****=>;>>-&.#&*;;;==****=;;>>-%.#&*;;;==****=;;;>-%.#&=;;;==****=;>;>-%.+@#%==-;;>>>;;--=&#.$&=;;;;>>--==;;;>-%.@$*;;;==****=;;;**#.#$*>;;==***==;;;=&$.@$*;;;-=****=;;;=*$.@$*>;;-=****=;;;**#....+@$%*=;;;=*%$@+..@#%=--;;;;;;;;;;=*$.+@#%==-;>=====;;;=*.", +"$*=;;;>-====-;;;=*%.#&*;;;-->--;;;;;=*$.#%*>>>;>===--;;;=*%.#%*>;;>>===--;;;=*%.#%*>>;>>===-=;;;=*%.#%*>>>;>====-;;;=*%.#%*>>>;>===-=;;;=*%.+@%*;;;>-=*=--;;>&$.#&*;;;;;-----;;;=*%.@$&->>;;====-;;;*&#.@$&->>;;=====;;;*&#.@$&->>>>====-;;;*%#.@$&->>;>====-;;;*&#....+@$&==;;;==&$#++.@$&=->;;>>>>>==*&%#.+@$&=->;;---->;;;=&.", +"%&=;;;>>===--;;;**$.#&*;;;->===;;;;;=*$.@$&>>;;;--=--;;;=*$.@$&>;;;>--=--;;;=*$.@$&>>>;;-=---;;;=*$.@$&>>;;>-=---;;;=*$.@$&>>;;;-=---;;;=*$.+@%*;;;-=***=-;;;%$.#%*;;;;;---->;;;=*$.@#%->>>;==---;;;*%#.@#%->>;>===--;;;*%#.@#%->>;;===--;;;*%#.@#%=>>;;==---;;;*%#..++@$%*=-;;;-=*%$@+.#%*-->;;>>>>-**&$#@.+#$*-->;;>->>>;;;=*.", +"%->;;;;;;;;;;>--*%#.#**;;;;;===->;;;=*$.@#%*==>>;;;;;--=&%#.@#%*==>;;;;;;>--&%#.+#%*==>;;;;;;--=&%#.@#%*==>;;;;;;--=&%#.@#%*==>;;;;;;>--&%#.+@#%*==*&%%%&*==*%#.#%*>>>;;;;;;;>--&%#.+#$*==;;;;;;;>>-*$#.+#$*==;;;;;;;>>-*$#.+#$**=;;;;;;;>>-*$#.+#$*==;;;;;;;>>-*$#..++#&==;;;;;;;=**#+.#&*;;;;;>>>**&%##++.+#&=;;;;;>>>;;;;;*%.", +"%->;;;;;;;;;;--=%$@.#**;;;;;===--;;;*&$.+@#%*=>>;;;;;-==%$@.+##&*=>>;;;;;--=%$@.+@#%*=>>;;;;;-==%$@.+@#%*=>>;;;;;-==%$@.+@#%*=>>;;;;;--=%$@..+#$&**%$###$%***$@.@$&>>>;;;;;;;--=%$@.++#%*=;;;;;;;>--&$@.++#%*=;;;;;;;>--%$@.++#&*=;;;;;;;>>-&$@.+@#%*=;;;;;;;>>-%$@..++#&==;;;;;;;==&#+.#&=;;;;;>>-*%$#@++..@#&*;;;;;-->;;;;;*%.", +"$=>;;;;;;;;;;-==$#+.#%*;;;;;***=-;;;*%#.++#$&*>>;;;;;==*$@+..+#$&*>>;;;;;===$#+.++#$&*>>;;;;;==*$@+.++#$&*->;;;;;==*$@+.++#$&*>>;;;;;===$#+.+.@#%%%#@@+@@#%%%@@.@$&->>;;;;;;;===$#+.++@$&*;;;;;;;>-=$#+.++@%&*;;;;;;;>-=%@+.++@%&*;;;;;;;--=$#+..+@%&*;;;;;;;--=%@+..++#&*=;;;;;;;=*&#+.#%*;;;;;--=%#@++....+#&*;;;;;---;;;;;&$.", +"$%&***=**=***&&$#++.@#%&****&%%%&**&%$@..++@#$&******&%##++.+++##$&******&%$#++..++@#%%******&%##++..++@#$&******&$$@@+..++@#$&******&%$#++...++@@@+++.+++@@@++.+#$====*=****&%$#@+..+@@$%&******&&$#@+..++@#%&*******%%#@+..++@$%&**=***&&$#@+..++@#%&*******%%#@+...+@#$&*******&%#@+.@#%&*****&%#@++.....+@#%&***********&$#.", +"@#%%&%&&&%&&%$$@@++.+@$$%%%$$##$$$$$#@+...++@##%%&%%$##@++....++@#$$%&&%%$##+++...++@#$$%&%%$##@++....++@#$$%&%%$$#@++....++@##%%&&%%$##@++....++++++...+++++++.+#$*==&&%&&%%$#@@+....++@#%%&&&&%$$#@+....+@##%%&&&&%$$#@++..+++@#$%%%&&%$$#@++...+@##%%&&&&%$$#@++....+@#$$&&&&%$$#@++.+@$$%&%%$##@++.......+@$$%&%%%$%%%%%$#@.", +"+@@#####$####@@++...++@@####@@++@@#@@++....+++@@#####@@++......+++@@#####@@++......+++@######@@++......+++@######@+++......+++@@#####@+++.......+.+.......++....++@##$$$#####@@+.......++@@#######@+++......++@######@@+++.....++@@#######@+++......++@######@@+++....++++@@#####@@+++..++@@#####@+++........++@@######@####@++.", +".++++@++@+@+++++......++++++.++++++++.......+++++++++++.........+++++++++++.+........++++++++++.........+.+++++++++.........+++++++++++.........................+++@@@@@@+++++++.........++++@+++++.........++++++++++++........++++@+@++++.........++++++++@+++........+++++@+@++++......+++++++++............+++++++++++++++..", +".....+++++....................++.+..............++++......................................................+++++@+...................................................++++++....................+++++............+++++.................................+++++....................++++++............++++............................", +"....+++@@+++................++++@@++...........+++@@++...........+..+.+..+...............................++@###@@++.................................................+++@@+++.................+++@@@++..........+++@@++..............................+++@@+++.................+++@@++++........++++@@++..........................", +"..+++@####@+................+@####@++........++@####@@...........+++@+@@+++...............+.............++@#$%%$#@+...............................................+.@@####@+.................+@####@@+........++#####@+...........+....+..+.......+++@####@+.................+@####@++........+@####@@+...........+....+.+......", +"...+$$%==$#@++...........+++@$%%==#@++......++@#$*=*$#++.......+++#$$$##$#@++........+++++++++...........@#**--=%#@+...............................................+#$%==$#@++.............++@#$==%$#++......++#$*=*$#@+.........++++++++++........+$$%==$#@++.............++@#$==&$#++.....++@#$*=*$@++.........++++++++++.....", +".+++#%&==&%#@+...........++##&&*==##+.......+@#%&===%#@+......++@#$&&&&&&%$@++.....+++@@@@@@@@++.......++@$*=>>-%$@++............................................+++$%&==&%#@+.............+@#$&==&%$++.....++@$%===&$#@.......+++@@@@+@@@+@++...+++#%&==&$$@+.............+@#$&==&%$++.....+@#%&===%$@+.......+++@@@@@@@+++....", +"..++$%*--*&%#@+..........+@#%**===$#++.....++#%&*--=*%#@+....++@$%&*=****&%#@+....++@##$$######++......++#%==>>>&$#@.........+......+................+...+........++$%*--*&%$@+...........+@#$&*--*%$++.....+@#%*=--*&$#++....++@##$#######@+++...++$%*--*&%#@+...........+@#$&*--*%$++....++#%&*---&%#++.....++@##$$######++...", +"..++#$&->>-=%#++........++#%*>>>=*$#++.....+@$%>;;;;=*$@+....+@#**=;;;;;;>*%#++...++$&&==%%%==#@+......++#%=>=-===#++.....+++++++++++++++........+++++@+++++......++@$&->>-=$#@+.........++#$==->>&$#++....++#$==;;;>>%$@+....++$%&==%$%==%%#++...++#$&->--=$#++.........++#$===>>&$@++....+@$%>;;;;=*$@+.....++$%&==%%%==#@+...", +"..++@$&->>--&$@+.......++#$**;;;=*$@+....++@#%*>;;;;==%#++...+@$*=-;;;;;;>*%$+...++#%&*==&*&-=$#++.....+@$&->--==*$@++....++@@#@@@@@@#@@+++....+++@#@#@##@@@++....++#$&->>>-&$#@+.......++#$&=-->>&$#+.....+@$%=-;;;>>&$#@+..++@%&*==&&&==&&$@+...++@$&>>>>-%#++........++#$&=-->-%$@+....++#$*;;;;;==$@++...++@%&*==&*&-=$#++..", +"..+@#%&==>>>&%#++.....++@$%==>--**$@+.....+@%&=---==>-%#@+..++#%=---->>>-=*$#++..+@#&*==-=====%$@+....+@#$*=->>>*&$@+...++@$%%%%$$$%%%%%#@+.+.+@@#$%&&%%%%$$@@....++#$&==>>>=&$#@+....++@#$&*>>>==*$#@+..+++#$*->-----=&%@+..++#%&*--====-**%#+....+@$&==>>-&$@+.......++@$&*>>>**$#++....+@%&*->----=$#++...++#%**--=====$#++..", +".++@$%*==>>>*&$#++...++##%*=->>-=&%#++...+@#&*=----=>-&$@+...@#%=->-->>>-=*%#+...+@#&*=---==-=&$@+...++@$&*->>>>**%#++..+@$%&***&&&*****%$#.++@#$%&***=****&$#+..++@$%*==>>>=*&%#@+..++@#$&*=>>>==*&$@+...+@$&*>>--->-=*&#@..+@$&*=-====--=*&$@...++#$&==>>-*$#+......++@#&*=>>>*&$@+....++@%*=->--=-=$#+....++#%*=--=====%#+...", +".+@#%**==>>>=*%#@+...+@#%&*--->-=*&$@+...+#$*==>>=-->>*%#++.++$%=->-->>>--&%#@..++#$*==>>--->-&$#++..+@#%*=->>>>=*&$@++.@#%*====**=*===**%$.+#$%&*========**&$@..+#$%**==>>>==**%$@..+#$%**==>>>==**%$@.++#$%**>>--->-==*%#.++#$*==->===>-==*%#...+@#%*==>>>*%#++.....+@#%&==>>>*&$@+....++#&*=->--=-=$#+....++#&*=->-=-==$@++..", +"++#$=->;;;;;;>*%#++.++@%=>>;;;;;;>&%#@+.++#%=>>;;;;;;;*&#@+.++$&->>;;;;;;;*&#@+.++#%->>;;;;;;;*&#@+.++#$-->;;;;;;>*%#++.@%*;;;;;;;;;;;;;--%.@#%---;;;;;;;;;;*&#.+@#%=->;;;;;;;>--%#.+@#%=->;;;;;;;>--%#..@#%->>;;;;;;;>>-%$.+@$&=->;;;;;;;>>-%$..++@&*=;;;;;*%#+......+@&*=;;;;;*&#+.....++#&==;;;;;*&$@+....++#&==;;;;;*&$@+...", +"++#%->>;;;;;;;*&$#+.++#%->>;;;;;;;*&$@+.++#&->>;;;;;;;=&$#+.+@#&>>>;;;;;;;*&$#+.+@#%->>;;;;;;;**$#+.++#%->>;;;;;;>*&$#+.#%*;;;;;;;;;;;;;>-*.@$&->>;;;;;;;;;;=&$.+@$&->>;;;;;;;>>-&%.+#$&>>>;;;;;;;>>-*$.+@$&->>;;;;;;;>>-*$.+#$&>>>;;;;;;;>>-*$...+@&*=;;;;;*&#@+.....+@%*=;;;;;*&#@+....++#&*=;;;;;=&$@+....++#&*=;;;;;=&$@+...", +"+@#&=->---=-;;==*#+.+@$&=->---=-;;==*#+.+@$%-->-----;;==*#+.++#%=-----=-;;-=*#+..@$&=->-----;;-=*#+.+@#&=->-----;;==*#+.#$*-->>-;;;-----;;*.#**;;;>>===>>;;;=*$.+#%*;;;>>===>>;;;*&.+#**;;;>>===>>;;;*&.+#%*;;;>>===>>;;;=&.+#**;;;>>===>>;;;=&...++#$**=;;;*&#+......++#$**=;;;*&#@......+@#%**=;;;*&$@+.....+@#%&==;;;*&$@+...", +"+@$&-->----=;;-=*$@..@#&-->----=;;-=*$@.+@$%=->--=-=;;-=*$@.+@$%==>----=;;-=*$@.+@#&-->--=-=;;-=*$@.+@$%-->--==-;;-=*$@.#%*-->--;;;--==-;;*.$&=;;;-=***--;;;=&$.+$%*;;;>>=-=>>;;;=*.@$&=;;;>>=-=>>;;;=*.+$%*;;;>>=-=>>;;;=&.@$&=;;;>>=-=>>;;;=&...++@$&*=;;;*&$++.....++@#&*=;;;*&$++.....++@$&*=;;;*&#++.....++#$%*=;;;*&#@....", +"+@$&-->--=--;;-==$#.+@$&-->--=--;;-==$#.+@$&-->--=--;;-==$#.+@$&=----=--;;-==$#.+@$&-->--=--;;-==$#.+@$&-->-----;;-==$#.#%*->>->;;;---=-;;*.$*=;;;=**%&&*--=*%#.@$**;;;>>===>>;;;=*.@$*=;;;>>===>>;;;=&.@$**;;;>>===>>;;;=*.@$*=;;;>>===>>;;;=*....++@%&=;;;*&#@.......+@#$&=;;;*&#@.......++#%&=;;;*&$@.......++#%&=;;;*&$++...", +"+@$&->>;;;;;;;-==$#.+@$*->>;;;;;;;-==$#.+@%&>>>;;;;;;;-==$#.+@$&->>;;;;;;;-==$#.+#$&->>;;;;;;;-==$#.+@$*->>;;;;;;;-==$#.$*=;;;;;;;;;;;;;;;*.$*=;;;=*&%%&*=-=&$#.@#*=;;;;;;;;;;;;;=&.@$*=;;;;;;;;;;;;;=&.@#*=;;;;;;;;;;;;;**.@$*=;;;;;;;;;;;;;=&.....+@$&*;;;**#@+.......+@$&*;;;*&$@+......++@$&*;;;*&$++.......+@$&*;;;*&$++...", +"@#%*>>>;;;;;;;-==%#.@#%*>>>;;;;;;;-==%#.+#%*>>>;;;;;;;-==%#.+#%*>>>;;;;;;;-==%#.+#%*>>>;;;;;;;-==%#.@#%*>>>;;;;;;;-==%#.%*=;;;;;;;;;;;;;;;*.#*=;;;==&&%&&=*=*%#.@$*=;;;;;;;;;;;;;=&.@$*=;;;;;;;;;;;;;=*.@$*=;;;;;;;;;;;;;=*.@$&=;;;;;;;;;;;;;=&....++@%&=;;;*&$@+......++@%&=;;;=&$@+......++@%&=;;;*&$@++.....++#$&=;;;*&$@+...", +"+$*=;;;-====;;-==$#.+$&=;;;-====;;-==%#.@#*=;;;-====;;-==%#.@#&=;;;-====;;-==%#.@$*=;;;-====;;-==%#.+$&=;;;-====;;-==$#.&>>>>>==;;;>>>>>>>*.#&*;;;--=**=*===**$.@$*=;;;;;>>>>>>>>=&.@$*=;;;;;>>>>>>>>=&.@$*=;;;;;>>>>>>>>**.@$*=;;;;;>>>>>>>>=&...++@#%&=;;;=*$#@+.....+@#%&=;;;**$#@+.....+@#%&=;;;=*%#++.....+@#%**;;;=*%#@+..", +"@#&=;;;=--==;;-==%$.@$&=;;;=--==;;-==%#.@$&=;;;=--==;;-==&#.@#*=;;;=--==;;-==%#.@#&=;;;=--==;;-==&#.@#*=;;;=--==;;-==&$.&>>>>;==;;;>>>>>>>*.#%*>>>;;;>>>>;;;>=$.@$&=;;;;;>>>>>>>>=*.@$*=;;;;;>>>>>>>>=*.@$&=;;;;;>>>>>>>>=&.@$*=;;;;;>>>>>>>>=&...++#$&*=;;;=*&$#@+..+++#$&*=;;;=*&$#@+..+++#$&*=;;;=*&$#@+..+++#$&*=;;;=*&$#@+.", +"@$*=;;;-====;;--=&$.@$*=;;;-====;;--=&$.+$*=;;;-====;;--=&$.@$*=;;;-====;;--=&$.@$*=;;;-====;;--=&$.@$*=;;;-====;;--=&$.&>>>>>==;;;>>>>>>>*.@$%>>>;;;;;;;;;;--$.@$&=;;;;;>>>>>>>>**.@#&=;;;;;>>>>>>>>*&.@#&=;;;;;>>>>>>>>=&.@#&=;;;;;>>>>>>>>=&.+++#$%**=;;;==*&$#@..++#$%**=;;;==*&$#@..++#$%**=;;;=**&$#+..++#$%*==;;;=**&$#+.", +"@$&=;;;;;;;;;;;;>*%.+$&=;;;;;;;;;;;;>*%.@#&=;;;;;;;;;;;;>*%.@#&=;;;;;;;;;;;;>*%.@$&=;;;;;;;;;;;;>*%.@#&=;;;;;;;;;;;;>*%.&>>;;;;;;;;;;;;;;;*.+#$&*=->;;;>>>--*%$.+#%*;;;;;;;;;;;;;*&.@#%*;;;;;;;>;;;;;=&.@#%*>;;;;;;;;;;;;*&.+#%*;;;;;;;;;;;;;=&..+@#=-->>;;;>>--=$@.++@#=-->>;;;>>--=$@.++@#=-->>;;;;>--=$@.++@#==->>;;;;>--=$@.", +"+#&=;;;;;;;;;;;;;*%.+#&=;;;;;;;;;;;;;*%.@#&=;;;;;;;;;;;;>*%.@#&=;;;;;;;;;;;;;*%.+#&=;;;;;;;;;;;;>*%.@#&=;;;;;;;;;;;;;*%.%->;;;;;;;;;;;;;;;&..+@#$*=>;;;>>-==%#@.+@$&>;;;;;;;;;;;;*&.+@$&>;;;;;;;;;;;;*&.+@#&->>;;;;;;;;;;*&.+@$&>;;;;;;;;;;;;*&.++#$=->>;;;;;>>-=$#..+#$=->>;;;;;;>-=$#..+#$=->>;;;;;;>-=$#..+#$=->>;;;;;>>-=$#.", +"@#$&-->>>>>>>>>>-&$.@#$&-->>>>>>-->>-&$.+#$&-->>>>>>-->>-&$.+#$&-->>>>>>-->>-&$.@#$&-->>>>>>-->>-&$.+#$&-->>>>>>-->>-&$.%*=>>>>>-==>>>>>=&%...++#%==;;;>-*%$@++.+@#%&*=->>>>>>===&$.++#%&*=>>>>>>>==*&$.+@#$&*=->>>>>>==*%$.+@#$&*=->>>>>>==*%$..+@$==->>>>>>>--=%#.++@$==->>>>>>>--=%#.++@$==->>>>>>>--=%#.++@$===>>>>>>>--=%#.", +"+@$%=-->>>>>-->>-&$.+@$%==->>>>>-->--&$.+@$%=-->>>>>-->--%$.+@$%=-->>>>>-->--&$.+@$%=-->>>>>-->--&$.+@$%=-->>>>>-->--%$.#&*->>>-===>>>--&%$...++#%*=;;;>-&$@++...+@#$&*=->>>>>=*&$#.++@#%&*->>>>>>=**$#...@#$%&=->>>>-=**$#..+@#$&*=-->>>>=**%#..+@$*==>>>>>>>-==$@..+@$*==>>>>>>>-==$@..+@$*==>>>>>>>-==$#..+@$*==>>>>>>>-==$#.", +"++@%*==------=-==$#..@@$===-----==-==$#.+@@%*==-----==-==$#.+@@%*==-----==-==$#.++#$*==-----==-==$#.+@@%*==-----==-==$#.#$&==---***=---=%$@...+@#%->;;;==%#@+.....+@@$$==----=*&%#@...+@#$%=-----=*&%#+...++@$%==----=&&$#+...+@@$$==----=*&%#+.++@#&*=->-----==*#@.++@#&*=->-----==*#@.++@#&*=->-----==*#@.++@#&*=->-----==*#@.", +".+@#$$%&&&&&&&%%$#@..++##%%&&&&%&%%%$#@..++#$%%&&&&%&%%%$#@..++#$%%&&&&%&%%%$#@..++#$%%&&&&%&%%$$#@..++#$%%&&&&%%%%%$#@.+#$$%%%%%%$%%%%$#@@....+#%->;;;=&$@+.......++@#$$%&%&%$##++....++##$%%&&&%$$@@+...+++@#$%%&&%%$#@++....++@#$%%%&%%%#@@+...+@#$%%&&&&&%%$$#+...+@#$%%&&&&&%%$$#+...+@#$%%&&&&&&%$$@@...+@#$%%&&&&&&%$$@+.", +"..++@##$#$$$#$##@++...+@@@##$#$#$###@++...++@@##$#$#$###@@+...++@@##$#$#$###@++..+++@@##$#$#$###@++...++@@#$#$#$$###@++.++@#$###@#######@+....++@#%&**&%$#++........++@@##$####@++......++@###$###@@++......+++@###$###@++......++@@###$##@@++....+++###$$$$$$##@++...+++###$$$#$$##@++...+++###$$$$$###@++...+++###$$$#$###@++.", +"..+++++@@+@@@@+@++.....+++@+@@@+@+@+++....++++@+@@@+@@+@++....++++@+@@@+@+@+++....++++@+@@@+@@@+@+....+++++@@@@+@@+@+++..++++@@@+++@@@++++.....++##$%%$$@@+...........++@+@@@+++.+.......+++@@@@@++++........++++@@@++++..........++@@@@@+@+.+.....++++@+@@+@@+++......++++@+@@@@@++++.....+++@+@@@@@@++++.....++++@@@@@@@+@++..", +"..++++@@+@++@+@+.+.........+.+.+.+............+.+......................+..+............++++@++.............+.+++++........................................................................+.......................++.+...............+++.+......................................+.+......+++@++++...............................", +".++@##########@@++........+++@+@++++.........+++++++..................++@++++.........++@##@@++............++@+@+@++++.................................................................++++++++.................+++@@@++..........++@+@@++...................................++++@+++...++@####@++..............................", +"+@#$$%&&*&&%&&$$#@+....+++@###$###@+++.....++@@##@@++...............++@####@+........+@#$%&&$#@+.........++@#$#$###@+++................................................................+@####@+...............+++###$$@@.........++@#$##@@+................................+.+@###@@+...+#$%&&%$#@+.............................", +"+#$&***==***=**%$#+.....+##$%%&%%%##++....++@#$%%$#@++.............++@$$%%$#@++.....+@#$&***&$#@+.......+@@$%%&&%%$$#@+......+.+..+.++.............+.++..............................++@#$$%$#@++..............@@$%%&%$@++......++#$%&&%$#++.........+.+.+..+.+............+@@$$%%$#@++.@$%*=**&$#++...............+.+.+.+.+....", +"@$==;;;;;>;>;;--=$@..+++@$%--=-=-=&%#++....+$%&>>*&$@@...........+.@#$&*;;&%#++.....+@$*=;;;=*$@++......+@$*=>>>===**#+....+.++@+++++@+++..........+++@+++...........................++$%*>>*&$#++..........+++#$===>-%#++....+++#$*=>>>&$#++.....+.+++@++@+@++++.......+.++@%&*;;&%#++.#%*;;;;>&$@++...........+++++@+++@+++...", +"#$=-;;;;;>;>;;>-=$#..++@$%&>>-----*%$++...++$&*>>=*&$@++.........++@$&*=;;*%$+....++@#&=-;;;-=&#@+....++@#%==>>>====*#@....+@@#########@+++......++@#$##@++..........+.+++++++++....++@$&*>>=*&$#++........+++@$%==->>%$@+....++@$%==;;>*%$@++....+@@#########@@+.......++@@$&*=;;*&%@+.#&*;;;;>*%#@+..........++@##########@@+.", +"#%=-;;;;;;;;;;>>=%#..+#$%**>>>>>>-*&$@+...++$&*>;==*%$@+.........+@$%*==;;*&$++...++#$&=-;;;-=&$#++...++#$&==;;>-=-==$@..+++##%%%%%%%$$$@++......+@#%%%%$@@.........+++@@#@#@#@@@++.+@#%*=>;==*%$#@@+....++@@#$%&--->>&$#++..+@@$%*=-;;;=*%$@++.++@##$%%%$%%%%$#@@..++++@@#$%*==;;=&%#+.#&*;;;;;*&$#@@++....+++@#$%%%%$%%%%%##@.", +"#%=->>>;;;;;;;==*%#.+@$%-->>>;;;;>*%#++...++#%*==;;>*%#@+.......+@#%*>;;-=*$#@....+@$**>;=-=;;*&$++....@$&*>;;;;;;=*&#@..++@&**->*&*>>**&@+....++@#**>>-&#@++......++@#$$$$%$$$$#@+.@#$%**==;>>*%%$@@++.++@#$$&*=>;;==*%$@+.++#$&*=;;>>->>&%#@+.+@#%*==>-***;;&%$@+.++##$$%&&>>;-==*&$#.@$&=--;;==**&%$#@++.+@@$$&&;;***>-==*$#.", +"#$=-->>;;;;;;;==&%#.@#%*->>;;;;;>>*%#@+..++@#%&=-;;;**$$@+.....+@#%&*;;;-=*%#++...+@%*=>;=-=;;=*$@+..++@%*=>;;;;;;=**#+..++#*==>>=*=>>=*&#+.....+@$*=>>>&$#+.....++@#$%&&**&**&&%$@.#$&**==-;;;=*&&$#@+.@#$%&**==>;;==*&%$@.@#$&*==;;->>>>=&%$@.+#$&===>>*==;;**%#@.+#$%&&***;;;=-=**%$.@#%=--;;>>>>>=*&#@+.+#$%***;;=**>>===&%.", +"@$*=;;;----=;;>>-&$.@$=->>;-->>>>>*&$@+...+@#&*>>;;;>>&$#@+...+@#%&>>>;;>>*%$@+..+@#%*=>>;;;>>*&%#+...+@$&*>>;;;>>=*%#@.++@#&*=>>;>>>>**%#+....+@#%=-;;;*%#++....+@#$%->>>>>>>>>=*#.$*=>>>=====>>--=$#+.@$*=>>>==*==>>>-=$#.@#==>>;=====>>>-=$#.@$==>>>===*=>>>-=%#.@#==>>>--===-->>>==.+#$==-;;>>>>>==*&#@.@#==>>>>-=*=>>>>>==.", +"@$&=>;;--=--;;>>>&$.#$==;;;-->>>>>=&$#+.++@#%**>>;;;>>*&%#@.+++#$&*>>;;;>>**%#@..+@$**=>>;;;>>=*%$@..+@$%*=>>;;;>>=*&$@..+#$*==>>;;;>>=*%$@....+@$%=-;;;*%$++...++#$&*>>>>>>>>>>-=$.$=->>>==**=>;>>-&#@.#$==>>>==*=*>;>>-%$.#%==>>;=====>;>>-&#.#$==>>>==*==>;>>-%$.#$==>>;--=*=->>;>==.+#$==-;;>>>;>-==&$#.#$==>>;>>*=*>>;;>-=.", +"@#&=;;;---=-;;>>>*%.#%=-;;;-->>>>>=*&$@..+#%&*=>>;;;>>=*&$#.++#%&*=>>;;;>>=*&$#.+@#%*==>>;;;>>=*&%#.++#%**=>>;;;>>=*&%#.+@#%*==>>;;;>>=**%#..++@#$&--;;;*&$#@++.+#%&*=>>;;;>>;>>==$.%=-;;>==**=>>>>-&$@.#%=->;>==**=>;>>-&$.#%=-;;;=====>;>>-&$.#%=-;;>==*==>;>>>&$.#%=->;>>==*=->;;>-=.+#$==-;;;;;;;;;;=*$.#%=-;;>>-=*=>>;>>-=.", +"@#%*->>;;;;;;;;;;=&.#%==;;;;;>>>;;>>-%#.+@$&>;;;;>>>;;;;>&$.+@$&>;;;;>>>;;;;>&$.+@$&>;;;;>>>;;;;>&$.+@$&>;;;;>>>;;;;>&$.+@$&>;;;;>>>;;;;>&$..+@#%&*===-=**&%$@+.@$&>>;;;>>>;;;;;**$.%==;;;==***>;;;;*%#.#%==;;;==**=>;;;;*%.#%==;;;-=**=>>;;;*%.#%==;;;-=***>;;;;*%.@$*=;;;>>===->;;;=*.+#$==-;;;;;>;;;;==%.@$=-;;;>-=*=>>;;;==.", +"+#%*>>>;;;;;;;;;;=&.#$=-;;;;;>>>;;>>-&$.+#$*;;;;;>>>;;;;>*%.+#$*;;;;;>>>;;;;;*%.+#%*;;;;;>>>;;;;>*%.+#$*;;;;;>>>;;;;>*%.+#%*;;;;;>>>;;;;>*%.+@$$**===-===***&$@.#$*;;;;;>>>;;;;;*&$.$=-;;;-=***>>;;;*%#.#$=-;;;-=***>>;;;*%.#$=-;;;-=***>>;;;*%.#$=-;;;-=***>;;;;*%.@$%*>>>;>===;;>>>*&.+#$==-;;=====;;;>>&.@$*=;;;>>===->;;;=*.", +"+$%*>>>;;;;;;;;;;=*.#$==;;;;;>>>;;>>>&$.+$%*;;;;;>>>;;;;;*%.+$%*;;;;;>>>;;;;;*%.+$%*;;;;;>>>;;;;;*%.+$%*;;;;;>>>;;;;;*%.+#%*;;;;;>>>;;;;;*%.@#%&*=====-====**%#.$%*;;;;;>>>;;;;;=&$.$==;;;-=***>>;;;*%#.@$==;;;-=***>>;;;*%.@$==;;;-=***>>;;;*%.#$==;;;-=***>;;;;*%.+#$&->>;;===;;>>-&$.+#$==-;;=**==>;;>>&.@#%*>>>;>===;;>>>*%.", +"@#*=;;;>>====-;;;=*.@$&*;;;>>===--;;;*%.@#*=;;;-==*===;;;=*.@$*=;;;===*===;;;=*.@$*=;;;===*===;;;=*.@$*=;;;-==*==-;;;=*.@$*=;;;-=*====;;;=*.@$=-;;;;;;;;;;;;;&%.$*=;;;=->>>;;;;;=*$.$&*;;;-=***--;;;*%#.@$&*;;;==*&*=-;;;*%.@$&*;;;==*&*=-;;;*%.@$&=;;;-=***=-;;;*%.+@#%*==;;=--;;==*%#.+#$==-;;==**=>->>>*.+#$&->>;;===;;>>-&$.", +"@$*=;;;--=*===;;;=*.+$&=;;;>>=*==-;;>*%.@$*=;;;==***==;;;=*.@#*=;;;==***==;;;=*.@$*=;;;==***==;;;=*.@$*=;;;==***==;;;=*.@$*=;;;==***==;;;=*.@$=-;;;;;;;;;;;;;&$.#*=;;;-=>>>;;;;;=&$.$&=;;;-=*&*=-;;;*&#.@#&*;;;-=*&*=-;;;*&.@#&=>;;==*&*=-;;;*&.@#&*;;;-=&&*=-;;;*&..++#%*=;;---;;=*&#+.+#$==-;>===*=-->>>&.+@#%*==;;=--;;==*%#.", +"@#*=;;;==****=;;;=*.@#&*;;;-=***--;;;*%.@#*=;;;=*****=;;;=*.@$*=;;;=**&**=;;;=*.@$*=;;;=*****=;;;=*.@#*=;;;=*****=;;;=*.@#*=;;;=**&**=;;;=*.+#%&**=======*=*&%#.$*=;;;>-;;;==;;;=*$.#%*;;;-=***=-;;;*%#.+$&*;;;-=*&*=-;;;*%.@#&*;;;==*&*=-;;;*&.@#&*;;;==*&*=-;;;*%..++@$%*>;;;;;>*&#@+.+#$==-;;---==;;;-=&..++#%*=;;---;;=*%#+.", +"@$*=;;;=****==;;;=*.+#&*;;;--***=-;;;*&.@$*=;;;=**&**=;;;=&.@$*=;;;=*****=;;;=*.@$*=;;;=**&**=;;;=*.@$*=;;;=**&**=;;;=*.@$*=;;;=**&**=;;;=*.+@#$&&**====***%$#@.$*=;;;--;;;==;;;=*$.#%*;;;-=***--;;;*&$.+#%*;;;-=***==;;;*&.+#%*;;;-=***==;;;*&.+#%*;;;-=***==;;;*&....+#%*=-;;;-=&$@+..+#%==-;;;;;;;;;>=*$...+@$%*>;;;;;>*&$@+.", +"@#*=;;;===**==;;;=*.@$&*;;;--***--;;;*&.@$*=;;;==***==;;;=*.@$&=;;;==***==;;;=*.@$&=;;;==***==;;;=*.@#*=;;;==***==;;;=&.@#*=;;;==***==;;;=*.++@##%**====*&$$#@+.#*=;;;>-;;;==;;;=*#.#%*;;;--*=*--;;;*&#.@#%*;;;-==*==-;;;*%.+#%*;;;===**=-;;;*&.@#%*;;;===**=-;;;*&...+@#&*=-;;;=*%#+...+#$=--;;;;;;;;>>*&#...++#$*=-;;;-=&$@+..", +"@#&=;;;>>===->;;;**.@$*=;;;-==*==-;;;=&.@#&*;;;>>===>>;;;*&.+$&=;;;>>===>>;;;*&.@#&=;;;>>===>>;;;*%.@#&=;;;>>===>>;;;*&.@#&=;;;>>==*>>;;;*%..+++@$%=-;;;*%$@++..$**;;;;;-=->;;;;*%#.#%*>;;>>===>>;;;=&$.+#%*>;;>>===>>;;;=&.+#$*;;;>>===>>;;;=&.+#%*>;;>>===>>;;;=&..+@#$&*>>;;;=&$@+...+#%==-;;;;;;;>>>*%@....+#%&--;;;==%#@+..", +"@#&*;;;>>===>>;;;*&.#%&=;;;-==*=--;;;=*.+#&=;;;>>===>>;;;*%.@#&*;;;>>===>>;;;*%.@#&*;;;>>===>>;;;*%.@#&*;;;>>===>>;;;*%.@#&*;;;>>===>>;;;*%....+@#%=-;;;*%#++...#*=;;;;;-==>>;;;*%#.@$&>;;>>===>>;;;=*%.+@$&>;;>>===>>;;;=*.+@$&>;;>>===>>;;;**.+@$&>;;>>===>>;;>=*..+@$&*=>>;;;*&$@+...@#%=--;;=====**%$#@..++#%&*>>;;;=&$@++..", +"+#$*=->;;;;;;;>--*$.#&->;;;;;===;;;;;>-.+#$&-->;;;;;;;>--&$.+#$*=>>;;;;;;;>--&$.+#%&-->;;;;;;;>--&$.+#$&-->;;;;;;;>--&$.+#$*=->;;;;;;;>-=&$.....+#$==>>-&$@++...$&*;;;;;;;;;;>-=&$#.+#%*==;;;;;;;;;;>-%..@#%*==;;;;;;;;;;>-.++#%*==;;;;;;;;;;>-..+#%*==;;;;;;;;;;>-.+@#%->>;;;;;*&#+....@$&=--;;===**&%##++..+@$&*=>>;;;*&$@+...", +"+@#&=--;;;;;;;--=&#.#%>>;;;;;===;;;;;>-.+@$%=--;;;;;;;--=%#.+@$%=--;;;;;;;--=%#.++$%=--;;;;;;;--=%$.+@$&=--;;;;;;;--=%$.+@#&=--;;;;;;;--=%$....++@$&=---%$@+....$&*;;;;;;;;;;--=%#@.+@$&==;;;;;;;;;;>-%..+@$**=;;;;;;;;;;>-..+@$&*=;;;;;;;;;;>-.++@$&*=;;;;;;;;;;>-.+@$&>>;;;;;;*%#@....#&*>;;;;>>>*%$#@++..+@#%->>;;;;;*&#+....", +"++#$==-;;;;;;;-==$@.#%->;;;;;===;;;;;>-..+#$==-;;;;;;;-==$#..+@$==-;;;;;;;-==$#.++#$==-;;;;;;;-==$@..+@$==-;;;;;;;-==$@.++#$==-;;;;;;;-==$@.....++#&*===$#++....#&*;;;;;;;;;;-==$@+.+@#%&=;;;;;;;;;;>-%..++#%*=;;;;;;;;;;>-..++@%&*;;;;;;;;;;>-..++#%&*;;;;;;;;;;>-..@$&>>;;;;;;*%#+....#&*;;;;;>>-&$@++.....@$&>>;;;;;;*%#++...", +".++#$%&***=***&%$#@.@$%*******&******&%.+++#$%&***=***&%$#+..+@#$%&***=***&%$#+..++#$%&***=***&%$#@.++@#$%&***=***&%$#@..++#$%&***=***&%$#@......+@@$$$$#@+.....$==>>>==*=***&%$#@+..+@#$%****=**=**&%$..+++#$%****=**=**&%...++#$%****=**=**&%...++#$%****=*****&%.++$%->>>>>>-&$@+....@$&>>>>>>--%#++.....++#&->>>>>>-&$@+....", +"..++##$%&&%&&%$#@@+.+#$$&&&&%$%$%&&&%$$...++##%%&&%&&%$#@@+...++##$%&&%&&%$##++...++##%%&&%&&%$#@@+...++##$%&&%&&%$#@@+...++##%%&%&&&%$$@++.......+@@##@+++.....#*=->>**&&&&%$$@@+....++##$%&&%&&%&%$$@...+++##$%&&%&&%&%$$...+++##%%&&%&&%&%$$....++#$$%&&&&&&&&$#.++#%--->---=$#@+....@#%-->->-==$#+......+@#$--->---=$#++....", +"...++@@#######@@++..++@@######@######@@....++@@@#######@++.....++@@#######@@++....+++@@@######@@++.....++@@#######@@++...+.++@@#######@@+++.....+..+++++++......##%&&%%$$$###@+++......++@####$#$###@@+.....++@####$#$###@@.....++@@###$#$###@@.....++@####$#$####@..+@#$&&&&&%%#@+.....+@#%%&&&&%%#@++......+@#%%&&&&%%#@+.....", +"...+.++++@+@++++.+...++++@++++++++@+@++.....+++++@+@++++.+.....+.++++@+@+++++........++++@@++++++.......+++++@+@++++.......+.+++@@+@+++++...........+++.........+@##$###@@++++++........++++@+@+@@@++++......++++@+@+@@@+++.......+++@+@+@@@+++........++++@+@+@+++...+@##$$$$##@++.....+@@#$$$$$##@++........+@#$$$$$##@++.....", +".....................+++++...........................................................................+++@@####@###@@++...............+.........++++++++@+++............+++@++...........................................................................................................+@@#@@@+++..............................", +"....................+++@@@+++......................................+.+.+..+..........................+@#$%$%$$%$%%%$#@+...........+++++........++@@#####@@@++.........++@#@#@++..................+.......................................................................++++.++++......@$$%%$$#@++++...........................", +"....................+##$###@+................................+++@++@+@+@++@++.........+.+............+#$&&********&&%#@..........+@@#@@++......+@#$%$%$$$$@@+.........+@#$$$#@+..............++++++++..........+++++...............................+.+++++.+..........++++@@@@++@+@+....$%&**&%$##@@@@+++.........+......+......", +".........+++........@$*=**&#@++.............................+@@##$##$#$#$###@@+.....+++@+++.........+@$&>;;>>>>>>;;;*%#.........++#&&%##+.....+@#*========$#++.......+@#%=-=%#@+.............+@@###@@++.......++@@@@@+............+..++.++.+......++@@@@@@@++..+.......+@$$$$###%$#++...%->;;;==%$$&%$#@@++.....+++++..+++++....", +"......+++@@@@+......$%===**%#@+.............+++++++@+.......@#$%%&%&&%&&%&&$$@@....++@####@++.......+#%*;;;;>>>>>;;;*&#.......+.@@%*=&$$++...++#$===--==--%#@......+++#$&->-&$@+............+@#$%&%$#@+.....++@##$$##@++.....++++@+@+@@@+@+++...+++##$$$$##@@@+@++...++@#%&&&%$%*&$#@+..&>>;;;==*&&**%$$#@@..+.+@@@@@+++@@@@++..", +"......+@#$$##@++....%&=--==&%#++.+.++++....++@@#####@@++....#%&******=**=***%$@...++@$$%%$#@+.......@#%*;;;;;>>;;;;;=*$....+++++@$&==*&%@++..++#$=--->-->-&$@....+++@#$&*>>>*&#@@++........+@#%&***&%#@...+++@#$&&&&$#@++....+@###$#$##$$$$#@++.+@#$&&*&&&%$$#$##@@..++#$**=*&*&=*%$@+..&>>;;;-==**==**&%$#...+@#$$$#@@#$$$#@++.", +".....++#$***%#+.....*=;;;;;=*$@++.++@++...+@@#%%%&%%%$@++...#=-;;;;;;;;;;;;;;%#...+@#*=---$#++......+$&=;;;>>>>>>;;;=&$.++++@@@##*=;;=*%#+...++#%=--;;>>;;*%#+..++@#$%&*=;;;=*$$#@+........+@$&;;;;>-$#.+++@#$%==;;;*%#++...+@$$%%&&&&&&&&&&$@+.+#%&>>>>>==&&&&%%$#..+@$&>>>>=-=;;*&%@+.&->;;;>>-->;;>>--*&.+++$%&=-%#$$=*=%#@+.", +"....++#$&===*$+.....&=;;;;;==%#@++#####..+@#$%&**=**&&$@++..$=-;;;;;;;;;;;;;;%#..++@$==->-&#@+......@$&=;;;>>>>>>;;;=*$.+@###$#$%*=;;=*&#@+..+@$%=--;;>>;;*&$+..+@$%&***=;;;==*%$#@.......+@#%*;;;;>>$#.+@#$$%&=-;;;*&$#@++.@#%****=***=*==*%#@.@$&*>>>>>--=*=***&$.+@#$*>>>>---;;=*%#+.%->;;;>>>->;;>>>-=*..+@%&*--*%%&===*%#@.", +"....++#*=;;-=%@.....$&==;;;>-%$@@#%&=*$.++#$==-;;;;;;=*$@++.$%**====;;;===**%$@...+@$*=>>>&$@+......@%&*;;;;;;;;;;;;=*%.@#&****&&*=;;-=*$@+.+@#$&=--;>==;;**$@+.@$*=>>>>>;;;>>>-=*#.......+@$&*>>>>=&$#.@#&*===->>>>=*&%$#@.#%--;;;;;;;;;;;;&%@.$%->;;;;;;;;;;;;;;%.+#$*=>>>>=-=;;=**$@.$&*---;;--->>;;>>**..+@%*=;;=*&*;;;==%#.", +"....+@#&=;;-=&@+....#&*=;;;>-&$##$**==$.+#$&=--;;;;;;==%$@+.#%****==;;;===*%%#@...@@%*=>>>&$@+......#%*=;;;;;;;;;;;;=*%.#%*====**==;;===%#+.@#$&*---;;--;;=*&#@.#$==>>;>>;;;>>>>==$......++#%*=>>>>=&$@.#%*====->>>>=*=*&$#.#%->;;;;;;;;;;;;*%#.#%->;;;;;;;;;;;;;;&.@$%==>>>>-=-;;==*%#.#%*=--;;--->>;;;>=&.++@%*=;;==*=;;;-=%#.", +"....+@#*=;;>-&@+....#$*=;;;>-&%$$%==-=%.@$&*-->;;;;;;-=*%$@.$%&**=*=;;;=**&%$#@...+@%*=>>>&%@+......$&*=;;;;;;;;;;;;==%.#&========-;;-==%$@.#$&**---;;==;;==*%#.#%==;;;>>;;;>>>>==%......+#$&*=>>>>*&$@.$&===-->>>>>====*&$.$%>>;;;;;;;;;;;;*&#.#%->;;;;;;;;;;;;;;%.#%&==>>>>=-=;;-==&$.#%&==-;;-=->>;;;>*&.++@%*=;;====;;;--&$.", +"....++#$*->;;*#@+...@$&*;;;--*%%%*;;-=%.#%=-;;;==;;>>>>==%#.$=======;;;==**%$$#..++@%*=>>>*$@++.....&=>;;;;;;>>;;;;;>-&.$%;;;;;;;;;;;;;>*$@.**=>>;;;;;;>;;>>>-$.$&->;;;>>;;;>>;;--&.....+@#%->>;;;;=&$@.$&;;;;;;;;;;;;;;;=*.#&*=;;;====--;;;=&$.@#%*===;;;;;;===*&%.&*=;;;;;;;;;;;;;;==.#$*>>>;;=====;;==*%..+@#%*;;-=--;;;;>&$.", +"....++#$&=-;;*#@+...+#%*;;;--*&&&*;;-=%.$&=-;;;==;;>>;>--&$.%=-=====;;;-==**&%$...+@$*=>>>&%@+......&=>;;;;;;>>;;;;;>-&.$%;;;;;;;;;;;;;;*%#.*==>;;;;;;>>;;>>>-%.$&>>;;;>>;;;>>;;>-&.....+@$&>>;;;;;=&$@.%*;;;;;;;;;;;;;;;==.#$*=;;;=**==-;;;=&$.+#$%*==;;;;;;=*&%$#.%*=;;;;;;;;;;;;;;=*.#%*->>;;==**=;;==%$..++#%*;;----;;;;;%#.", +"....++#$&*=;;=%@+...+#$*>>>;;***==;;*&$.$*;;>>-==--;;==;;*%.&->>>>>>;;;;>>>>-==..++@%*=>>>*$#+......%*->>>>>>>>;;;;;--%.#%&*==-;;---=;;;=&$.==->>>;;;;>>;;>>>-&.$&->;;;==;;;==>>>-&.....+@$&>>;;;>-=&$@.%*>;>>>==;;;>>--=&%.#%*=;;;=***=-;;;*&$.++@#$%**=;;--*&%$@@.#$&*=>>>>-=-;;-==*$.$*=;;;;;=****>>-=&#..++#$*--;;;;---*&$#.", +"..++@##%&*=;;=&#++..+@$%->>;;=**=-;;*&#.%*;;>>-=*=-;;==;;*&.%->>>>>>;;;;>>>>>==...+@$*=>>>*%#+......$&->>>>>>>>;;;;;-=%.@#%&===;;==-=;;;=*$.*=->>;;;;;>>;;>>>-%.$&>>;;;==;;;==>>>-&.....+@$&>>;;;>-=*$@.$*>>>>>==;;;>>-==%$.@$*=;;;=*%*=-;;;*&$..++@@$%*=>;>-*%#@++.@#%&*>>>>=-=;;-==%$.%*=;;;;;=**&*>>-=&$...+@$&--;;;;-==*%#@.", +".++##$%&**=;;=&$@+...+#%=->;;=====;;&$@.%*;;->==*=-;;--;;=&.%=->>>>>;;;;>>>>===..++@%*=>>>*%#+......$%->>>>>>>>;;;;;-=%.+@@$**=;;--=-;;>=*$.*==>>;;;;;>>;;>>>=$.$&->;;;==;;;==>>>-&.....+@#&>>>;;>-=*%$.%&>>>>>==;;;>-==*$@.#$*=;;;*&%&=-;;;*&$....++@$%*;;--*$#++..+@#&*>>>>-=-;;==*$#.%==;;;;;=*&**>>--&$..++@$&=>;;;;-==%#@+.", +"++@$&**>>*=>;-=$#@...+@$%*=;;---*=*&%#@.&*;;>--***=;;==;;==.#%&&**==;;;==**&&%$...+@$*=;;;*%#++.....#$**;;;;;;;;;;;>*&$..+@@$&*>;>>=====--$.$%%**-->;;==;;==*%#.$&>>;;;;;;;;;;;;>-&.....+@#%*==;;;;>>&$.$&->;;;==;;;->**%#@.@$*=;;;**%&==;;;=*#....+++#%*>>>-*$#+...++#%&>>>>=-=;;==*$@.%->>>>;;=****->>>&$..++@$&*=;;;>=*%##++.", +"+@$&*==;>*=;;-=%$@+..++@$&*;;->-**%$#@+.&*;;>>-*&*=;;==;;-=.@##$%&*=;;>=**%$###...+@$*=;;;*&#@......@$&=;;;;;;;;;;;>*&#...+@#%*>>>>=*=**--$.@#$%*=--;;--;;==*$#.$&->;;;>>;;;;>;;>-%..++++@#$*==;;;;>>&$.#&->;;;==;;;>-*&$@+.@$*=;;;*&%&=-;;;=&$......+@#&->>-*$#++..++@$&->>>-=-;;=**#@.$->>>>;;==***->>>&$..+@#%*==;;;>=*%#@+..", +"@#&*;;;--=*--;>*%#@...+@#$*=-;;;=&$#@++.%*;;>>>**&*>;>>>;--.++@##%&*;;;=*%$#@@+...+@#&*;;;**$@+.....+$%*;;;->==--;>>*%@....+@#%==;;==*&%$$@.+@#$%==-;;==;;-==$@.#%=-;;;==;;;==>-==%.++@@@#$%&*=;;;;;;*$.#%*=;;;-=>>>;;*&$@+.@$*=;;;=*&*=-;;;*&$......++#%==;>*&#@+...+@$&>>>>-=-;;==&#@.#%&**=>>---==-->>&$.+##&**;;;;;;=*&$@+..", +"#%*=;;;-===--;>*&$#....+@#%==;;;=*$#@+..%*;;>>>****>>>>;;-=..+++##**;;>=*%#@++.....@#&*;;;**$#++....+#&*;;;->==-->>>&$@....++#$*=;;==&%$#@@..+@#%=--;;==;;-==$@.#$==;;;==;;;==-==*$.@##$%%%**==;;;;;>*%.@%*=;;;-->>>;;=*%$@.#$*=;;;=***=-;;;*&$......++@#*=;;*&$#++..+@$&->>>=-=;;=*&#+.@#$%**>>>--*=->>-&$.@$%*==;;;;;;==*$#@+.", +"#%*=;;;--==--;;=*&$....++#$*=;;;=*%$@@+.$&>;>>>=**=>;>>;;-=...+.+#%*;;;=*&$#++....++#%*;;;=*&$@+....+#$*;;;->===->>-%#@.....+@$&=;;==*%##@+...+#$===;;==;;--=%#.@$*=>;;==;;;=*==*&#.#$%&****===;;;;;>&$.@$*=;;;=->>>;;=*&%#.@$*=;;;====--;;;*&$.......+@#&*;;=*&$@@..+@$&->>>=-=;;==&#+.++##%*->->-==-->-%#.$%*===;;;;;;==*&$#@.", +"%*>;;;;;;>;;;;;>>=*.....+@#%*>>>;;*&$#@.#%*=;;;>>====;;;;*&....+@#%*;;;>-*%$+++...++#%*;;;>>*%$@++..+#$&>>>;;>>==*&%$@+.....++#$&=->>*&$@++..++@$*=-;>==--;;;&$.+@$%&**==;;;=*%$$#@.$=-->>;;;;;;;;;==&$.+#%*>;;;;--->>>>>&$.@$*=;;;>>>;;;;;;=&$.......++@$&>>>--%$@..+@$&->>;>>>;;=*&#+..++@#%==;;;;;;;=*$#.$=-;;;;;==>>;;;*&$#.", +"$*;;;;;;;;;;;;;>>==......+##&->>;;=*&$@.@$&*;;;>>===-;;;;*%.....+#%*;;;>>*&$@+.....+@$&>;;>>**%#@+..+@$%->>;;>>==&$#@@+.....+++#%*=>>*&%#@+...+@$*=-;>**=-;;;*%.++@#$%&*=;;;=&$#@@+.%->>>>;;;;;;;;;==&$.+@$&>>;;;--=>>>>>*&.@#*=;;;;>;;>;;;;=&#........++#$>>>>-&%#..++$%->>;>>>;;=**#+..+++#$*=;;;>;;;*&$@.%->;;;;;**>-;;;=*%$.", +"%*;;>>-==>>>>>>;;=*......++#$%**--;;=*$.+#$%**=>>;;====*&%$....++#%*>>>;>=&$@++....++#$**=;;>-=$@++..+#%*==;;;>*&$#@++........+@#%*---==$@+..++@#*==>>*&**--->%..++@@#%&*;;;*&@@+.+.$==>>>>>=-=====>>&#.+@#%*==>>****=>>>>>.+#&*->-==**==;;>*%#.........+@$*=>>>==$...@#%=--;>>>;;=*&#+....++#$*==->>==&$#+.$==---=**&**===;;=&.", +"$*;;---==->>>>>;;==.......++#$%*--;;=*$.++##%&*->;;**=*&%#@.....+@$&>>>;>*&$@.......+@#%&*;;>--%#++..+@#&*=;;;>*%#@++.........++@#&==--=$@+...+@#&*=--&$%&=-->&..+.++@#&*;;;*%@++...$*=>>>>>===&*==>-%#..+@$%**--*&&&&-->>-.+#%*---*&&&*=>;>*%#..........+@&*>>>=*$..++#$=--;>>>;;=*%#+....++@#%===>>=*%#@+.$*=-==*&%$%%===;;=*.", +"$&;;-==&*=-->>>;;**........++##%==;;==$..++@#%&=-;;*&*&##@+.....++#%->>>>*%$++......++@#%*>;>-=%#+...++#%**;;>>%$@++............+@$=====#@+....+@%&*==$#$$===>%.....++#%&;;;*$+.....#*=-->--=**%%**--$#..++@$%&==$$$$%==->-.+@$&===%$$%&*>>>%$@..........+@%*->>=*#...+@$*=->>>>;;=*%@+.....++@#**=--*&#@+..#**===%##@##&*=;;*&.", +"#$%&&&%%%%&&&***&&$.........++@#%&**=*$...+++#$%&*&%$##@++.......+@$%&&*%$#@++.......++@#%&*===$#++...+@#$&**&&$#++..............+##$%$##++....++@#$$$#@@##%%%#.....++@#%=*=%#+.....@#$%&&&%%$####%$$#@..+++@##$##@@##%%%&$.++@#$%$##@##%%&%$@+...........+#$%&%%$#...++#$%&***=--&$#++......++##$%%%%#@++..@#$$$##@++@@#$%&%%$.", +"@##$$##@##$$$$$%$##..........++@#$%&**#....+++@#$$$##@++++......+++@#$$$$#@+..........++@#$%==*#@+.....++@#$$$$#++................+@####++......++@@#@@++@@#$#@......++##*&&##+.....@@##$$$$#@@@+@@##@+....++@@@@@+++@##$##..++@@#@@+++@####@@+............@@##$#@+....++@#$&&%&==%#@+........++@@####++....++@#@@+++.++@@##$#@.", +"+@@@@@++++@@#@@#@@+...........+++@####@......+++@#@@++............++@@@@@+++...........++@@##$##++......++@@#@@++.................++++++++......+.+++++.++++@@+.......++@###@++.....+++@@@@+@++++++++++......++++++.++++@+@..++++++++++++@@@++.............++@@@+++....++++@@#$$$##@++.........+++++++++....+++++++....+++@@@++."}; diff --git a/hacks/images/matrix2b.xbm b/hacks/images/matrix2b.xbm index 0cfc10e6..d67c5b0a 100644 --- a/hacks/images/matrix2b.xbm +++ b/hacks/images/matrix2b.xbm @@ -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, diff --git a/hacks/images/matrix2b.xpm b/hacks/images/matrix2b.xpm index d7e0373a..4792744e 100644 --- a/hacks/images/matrix2b.xpm +++ b/hacks/images/matrix2b.xpm @@ -1,201 +1,233 @@ /* 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 index 00000000..3bf78f07 --- /dev/null +++ b/hacks/interference.man @@ -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 index 00000000..e43ea048 --- /dev/null +++ b/hacks/juggle.man @@ -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 index 00000000..518b48b8 --- /dev/null +++ b/hacks/kumppa.man @@ -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 index 00000000..40c29493 --- /dev/null +++ b/hacks/lissie.man @@ -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 index 00000000..d24698f2 --- /dev/null +++ b/hacks/loop.man @@ -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 index 00000000..3834e13e --- /dev/null +++ b/hacks/moire2.man @@ -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 index 00000000..6a39d51f --- /dev/null +++ b/hacks/mountain.man @@ -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 index 00000000..d5eed874 --- /dev/null +++ b/hacks/polyominoes.man @@ -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 index 00000000..caa26863 --- /dev/null +++ b/hacks/ripples.man @@ -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 index 00000000..0e982d7e --- /dev/null +++ b/hacks/rotor.man @@ -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. diff --git a/hacks/screenhack.c b/hacks/screenhack.c index 9d11b350..2dfd9781 100644 --- a/hacks/screenhack.c +++ b/hacks/screenhack.c @@ -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 index 00000000..9f2ed3e2 --- /dev/null +++ b/hacks/shadebobs.man @@ -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 index 00000000..1f5755c1 --- /dev/null +++ b/hacks/thornbird.man @@ -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 index 00000000..4159f206 --- /dev/null +++ b/hacks/triangle.man @@ -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 index 00000000..3f915125 --- /dev/null +++ b/hacks/truchet.man @@ -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 index 00000000..f6e4b5da --- /dev/null +++ b/hacks/vermiculate.man @@ -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. diff --git a/hacks/vidwhacker b/hacks/vidwhacker index 8308ccca..688895b8 100755 --- a/hacks/vidwhacker +++ b/hacks/vidwhacker @@ -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 index 00000000..5755ce82 --- /dev/null +++ b/hacks/wander.man @@ -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. diff --git a/hacks/webcollage b/hacks/webcollage index 9489f22f..260230ab 100755 --- a/hacks/webcollage +++ b/hacks/webcollage @@ -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 \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 { + +############################################################################ +# +# 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 () { $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)); +} + ############################################################################ # @@ -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 { diff --git a/hacks/webcollage-helper.c b/hacks/webcollage-helper.c index 99bd7829..5713bdaf 100644 --- a/hacks/webcollage-helper.c +++ b/hacks/webcollage-helper.c @@ -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, diff --git a/hacks/webcollage.man b/hacks/webcollage.man index 3e8872d4..51dbb18a 100644 --- a/hacks/webcollage.man +++ b/hacks/webcollage.man @@ -16,10 +16,20 @@ 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 index 00000000..c5fef30f --- /dev/null +++ b/hacks/worm.man @@ -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. diff --git a/hacks/xlockmore.c b/hacks/xlockmore.c index 28828beb..12d31ffe 100644 --- a/hacks/xlockmore.c +++ b/hacks/xlockmore.c @@ -1,5 +1,6 @@ /* xlockmore.c --- xscreensaver compatibility layer for xlockmore modules. - * xscreensaver, Copyright (c) 1997, 1998, 2001 Jamie Zawinski + * xscreensaver, Copyright (c) 1997, 1998, 2001, 2002 + * 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 @@ -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; diff --git a/hacks/xlockmore.h b/hacks/xlockmore.h index b6ae538d..3b390f03 100644 --- a/hacks/xlockmore.h +++ b/hacks/xlockmore.h @@ -1,5 +1,5 @@ /* xlockmore.h --- xscreensaver compatibility layer for xlockmore modules. - * xscreensaver, Copyright (c) 1997, 1998, 2001 Jamie Zawinski + * xscreensaver, Copyright (c) 1997-2002 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 @@ -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); } diff --git a/hacks/xlockmoreI.h b/hacks/xlockmoreI.h index ad1ac8d2..500de7a4 100644 --- a/hacks/xlockmoreI.h +++ b/hacks/xlockmoreI.h @@ -1,5 +1,5 @@ /* xlockmore.h --- xscreensaver compatibility layer for xlockmore modules. - * xscreensaver, Copyright (c) 1997, 1998, 2001 Jamie Zawinski + * xscreensaver, Copyright (c) 1997-2002 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 @@ -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__ */ diff --git a/hacks/xmatrix.c b/hacks/xmatrix.c index 016ec771..1cd60801 100644 --- a/hacks/xmatrix.c +++ b/hacks/xmatrix.c @@ -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 index 00000000..e6b69d78 --- /dev/null +++ b/hacks/xml2man.pl @@ -0,0 +1,250 @@ +#!/usr/bin/perl -w +# Copyright © 2002 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. +# +# 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 () { $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/^= 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/