[yquake2] 01/02: Imported Upstream version 5.34~dfsg1

Simon McVittie smcv at debian.org
Thu Jun 30 11:01:24 UTC 2016


This is an automated email from the git hooks/post-receive script.

smcv pushed a commit to branch master
in repository yquake2.

commit 90e5abd6275056288c5b9f181a0783db5bd812df
Author: Simon McVittie <smcv at debian.org>
Date:   Wed Jun 29 22:41:02 2016 +0100

    Imported Upstream version 5.34~dfsg1
---
 .gitignore                           |   1 +
 CHANGELOG                            |  17 +-
 CMakeLists.txt                       |  72 +--
 CONTRIBUTE                           |  47 +-
 LICENSE                              |  10 +-
 Makefile                             |  41 +-
 README.md                            | 227 +++++++++
 src/backends/sdl/icon/q2icon.xbm     |  18 +-
 src/backends/sdl/icon/q2icon64.h     | 955 +++++++++++++++++------------------
 src/backends/sdl/input.c             |  48 +-
 src/backends/sdl/refresh.c           |   7 +-
 src/backends/unix/main.c             |  19 +-
 src/backends/unix/signalhandler.c    |   8 +-
 src/backends/windows/icon.rc         |   1 +
 src/backends/windows/system.c        |   4 +-
 src/client/cl_console.c              |  10 +-
 src/client/cl_entities.c             |   8 +-
 src/client/cl_keyboard.c             |  11 +-
 src/client/cl_main.c                 |   9 +
 src/client/cl_screen.c               |  94 +++-
 src/client/cl_view.c                 |  74 ++-
 src/client/header/client.h           |   7 +-
 src/client/menu/menu.c               |  83 +--
 src/client/menu/qmenu.c              |  40 +-
 src/client/menu/videomenu.c          | 123 +++--
 src/client/refresh/files/stb_image.h |   9 +-
 src/client/refresh/header/local.h    |  19 +-
 src/client/refresh/r_draw.c          |  10 +-
 src/client/refresh/r_image.c         |  12 +-
 src/client/refresh/r_main.c          | 279 +++++++++-
 src/client/refresh/r_mesh.c          |   8 +-
 src/client/sound/openal.c            |   8 +-
 src/client/sound/sound.c             |   1 -
 src/common/header/common.h           |  32 +-
 src/common/misc.c                    |   2 +-
 src/game/g_misc.c                    |  14 +-
 src/game/savegame/savegame.c         | 117 +++--
 README => stuff/README.old           |  53 +-
 stuff/models/crosshair/skin.pcx      | Bin 0 -> 4279 bytes
 stuff/models/crosshair/tris.md2      | Bin 0 -> 1152 bytes
 40 files changed, 1580 insertions(+), 918 deletions(-)

diff --git a/.gitignore b/.gitignore
index b9df871..e607722 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@
 /release/
 *.mk
 *.user
+*.d
diff --git a/CHANGELOG b/CHANGELOG
index 1657412..280e7ff 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,8 +1,23 @@
+Quake II 5.33 to 5.34:
+- Add support for stereo 3D (by Valery Guskov)
+- Make gibt solid so they move with conveyor belts.
+- Disable gl_ext_multitexturing by default.
+- Switch from an arch whitelist to an "all archs are supported"
+  approach.
+- Add a new README.
+
+Quake II 5.32 to 5.33:
+- Add OGG volume slider in settings menu
+- Fixed some bugs in volume settings
+- Replaced HUD scale option in video menu with generic UI scale
+- General UI upscaling improvements
+- Better support for keyboards with AZERTY layout
+
 Quake II 5.31 to 5.32:
 - Fix problems with never openal-soft versions.
 - Fix overbright bits not applied to regular meshes. (by David Reid)
 - Several improvements to GUI / HUD scaling. (by David Reid)
-- Don't stop generatings gibs after map change.
+- Don't stop generating gibs after map change.
 - A new high resolution application / windows icon. (by Ryan)
 - Don't display baseq2 savegames in mods / addons.
 - Some smaller bugfixes.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index df9c188..cf0e2f0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,18 +1,22 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
 
 # Enforce "Debug" as standard build type
 if(NOT CMAKE_BUILD_TYPE)
-  set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
-endif(NOT CMAKE_BUILD_TYPE)
+	set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
+endif()
 
 # CMake project configuration
-project (yquake2)
+project(yquake2)
 
 # Cmake module search path
 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/stuff/cmake/modules ${CMAKE_MODULE_PATH})
 
-if (YQUAKE2LIBS)
-	set(ENV{CMAKE_PREFIX_PATH} ${YQUAKE2LIBS})
+if(YQUAKE2LIBS)
+	if(CMAKE_CROSSCOMPILING)
+		set(CMAKE_FIND_ROOT_PATH ${YQUAKE2LIBS})
+	else()
+		set(ENV{CMAKE_PREFIX_PATH} ${YQUAKE2LIBS})
+	endif()
 
 	set(ENV{OPENALDIR} ${YQUAKE2LIBS})
 	set(ENV{SDLDIR} ${YQUAKE2LIBS})
@@ -36,6 +40,7 @@ string(REPLACE "-O3" "-O2" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
 option(ZIP_SUPPORT "ZIP support" ON)
 option(OGG_SUPPORT "OGG Vorbis playback support (Music)" ON)
 option(OPENAL_SUPPORT "OpenAL support" ON)
+option(SYSTEMWIDE_SUPPORT "Enable systemwide installation of game assets" OFF)
 
 # These variables will act as our list of include folders and linker flags
 set(yquake2LinkerFlags)
@@ -50,6 +55,20 @@ set(GAME_SRC_DIR ${SOURCE_DIR}/game)
 set(SERVER_SRC_DIR ${SOURCE_DIR}/server)
 set(CLIENT_SRC_DIR ${SOURCE_DIR}/client)
 
+# Operating system
+add_definitions(-DOSTYPE="${CMAKE_SYSTEM_NAME}")
+
+# Architecture string
+string(REGEX REPLACE "amd64" "x86_64" ARCH ${CMAKE_SYSTEM_PROCESSOR})
+string(REGEX REPLACE "i.86" "i386" ARCH ${ARCH})
+string(REGEX REPLACE "^arm.*" "arm" ARCH ${ARCH})
+add_definitions(-DARCH="${ARCH}")
+
+# Systemwide installation of game assets
+if(${SYSTEMWIDE_SUPPORT})
+    add_definitions(-DSYSTEMWIDE)
+endif()
+
 # Required libraries to build the different components of the binaries. Find
 # them and add the include/linker directories and flags (in case the package
 # manager find it in a weird place)
@@ -119,10 +138,10 @@ include_directories(${yquake2IncludeDirectories})
 link_directories(${yquake2LinkerDirectories})
 
 set(Backends-Generic-Source
+	${BACKENDS_SRC_DIR}/generic/misc.c
 	${BACKENDS_SRC_DIR}/generic/qal.c
-	${BACKENDS_SRC_DIR}/generic/vid.c
 	${BACKENDS_SRC_DIR}/generic/qgl.c
-	${BACKENDS_SRC_DIR}/generic/misc.c
+	${BACKENDS_SRC_DIR}/generic/vid.c
 
 	${BACKENDS_SRC_DIR}/sdl/cd.c
 	${BACKENDS_SRC_DIR}/sdl/input.c
@@ -137,11 +156,11 @@ set(Backends-Generic-Header
 	)
 
 set(Backends-Unix-Source
-	${BACKENDS_SRC_DIR}/unix/network.c
-	${BACKENDS_SRC_DIR}/unix/system.c
 	${BACKENDS_SRC_DIR}/generic/misc.c
 	${BACKENDS_SRC_DIR}/unix/main.c
+	${BACKENDS_SRC_DIR}/unix/network.c
 	${BACKENDS_SRC_DIR}/unix/signalhandler.c
+	${BACKENDS_SRC_DIR}/unix/system.c
 	${BACKENDS_SRC_DIR}/unix/shared/hunk.c
 	)
 
@@ -151,6 +170,7 @@ set(Backends-Unix-Header
 
 set(Backends-Windows-Source
 	${BACKENDS_SRC_DIR}/generic/misc.c
+	${BACKENDS_SRC_DIR}/windows/icon.rc
 	${BACKENDS_SRC_DIR}/windows/network.c
 	${BACKENDS_SRC_DIR}/windows/system.c
 	${BACKENDS_SRC_DIR}/windows/shared/mem.c
@@ -388,7 +408,7 @@ set(Server-Source
 	)
 
 set(Server-Header
-    ${COMMON_SRC_DIR}/header/common.h
+	${COMMON_SRC_DIR}/header/common.h
 	${COMMON_SRC_DIR}/header/crc.h
 	${COMMON_SRC_DIR}/header/files.h
 	${COMMON_SRC_DIR}/header/glob.h
@@ -400,22 +420,19 @@ set(Server-Header
 	)
 
 # Build the game dynamic library
-add_library(game SHARED ${Game-Source} ${Game-Header})
+add_library(game MODULE ${Game-Source} ${Game-Header})
 set_target_properties(game PROPERTIES
-							PREFIX ""
-							LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/Debug/baseq2
-							LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/Release/baseq2
-							)
+	PREFIX ""
+	LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/release/baseq2
+	RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/release/baseq2
+	)
 target_link_libraries(game ${yquake2LinkerFlags})
 
 # Main Quake 2 executable
 add_executable(quake2 ${Client-Source} ${Client-Header} ${Platform-Specific-Source} ${Backends-Generic-Source} ${Backends-Generic-Header})
 set_target_properties(quake2 PROPERTIES
-							PREFIX ""
-							RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/Debug
-							RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/Release
-							)
-
+	RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/release
+	)
 if(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
 	target_link_libraries(quake2 ${yquake2LinkerFlags} ws2_32 winmm)
 else()
@@ -425,14 +442,11 @@ endif()
 # Quake 2 Dedicated Server
 add_executable(q2ded ${Server-Source} ${Server-Header} ${Platform-Specific-Source})
 set_target_properties(q2ded PROPERTIES
-							PREFIX ""
-							COMPILE_DEFINITIONS "DEDICATED_ONLY"
-							RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/Debug
-							RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/Release
-							)
-
+	COMPILE_DEFINITIONS "DEDICATED_ONLY"
+	RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/release
+	)
 if(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
-	target_link_libraries(q2ded game ${yquake2LinkerFlags} ws2_32 winmm)
+	target_link_libraries(q2ded ${yquake2LinkerFlags} ws2_32 winmm)
 else()
-	target_link_libraries(q2ded game ${yquake2LinkerFlags})
+	target_link_libraries(q2ded ${yquake2LinkerFlags})
 endif()
diff --git a/CONTRIBUTE b/CONTRIBUTE
index 8d6a692..f54f38c 100644
--- a/CONTRIBUTE
+++ b/CONTRIBUTE
@@ -8,13 +8,9 @@
 
 =============================================================================== 
 
-This is a list of features that are currently not implemented in Yamagi Quake
-II, but would be nice to have. If you have some freetime to spare, fun coding or
-just want to contribute something, this list has some suggestions. All tasks
-need strong C knowledge, the necessary amount of understandig of the Quake II
-source code or external ABIs differs between the tasks.
+At this time there're no open tasks regaring Quake II. Nevertheless the hints
+for working with the code:
 
-Some hints:
 - Sign up for a Github account and fork our yquake2 repository. This allows 
   the easy integration of upstream changes into your branch and sending of
   pull requests. You'll get a wiki and a bugtracker for free.
@@ -45,42 +41,3 @@ Some hints:
   C (e.g. no inline assembler) and in an endianess independed way.
 - gcc is not the only compiler. Test your changes with clang.
 
-=============================================================================== 
-
-1. Port Yamagi Quake II to new unixoid platforms (for example DragonflyBSD, 
-   NetBSD, Solaris, etc.)
-
-Difficulty: Easy
-Knowledge: Good knowledge of the target platform
-
-Yamagi Quake II runs fine on Linux and FreeBSD. Due to it's very low hardware
-requirements it's an ideal game for platforms without good 3D acceleration.
-Ports to new unixoid operating systems should be easy. In most cases only some
-#ifdef need to be added and the Makefile integration written.
-
-=============================================================================== 
-
-2. Source code cleanup
-
-Difficulty: Medium
-Knowledge: Good knowledge of the Yamagi Quake II source
-
-While the Yamagi Quake II source code was cleaned a few times there is still
-much left to do. Someone need to go through the source, read and audit it. Dead
-code should be removed, inefficient functions rewritten and bugs resolved. This
-can be done at one module (e.g. client, server, refresher, game, etc) at a time.
-
-=============================================================================== 
-
-3. Finish the port of Zaero
-
-Difficulty: Hard
-Knowledge: How to work with broken code
-
-Zaero is an unofficial but popular addon to Quake II. It was release as
-freeware. The Yamagi Quake II developers did an inital port, but it's
-unfinished and still buggy. Grab the source (take a look at our Github
-organization), clean it and debug it. Zaero will need some extensive
-testing, have fun while playing. :)
-
-=============================================================================== 
diff --git a/LICENSE b/LICENSE
index a85eaf7..566b898 100644
--- a/LICENSE
+++ b/LICENSE
@@ -5,6 +5,7 @@ copys for each license:
 - Quake II: GPLv2
 - Info-ZIP (unzip): Info-ZIP License
 - Cocoa SDL entry points
+- stb
 
 Parts of other Quake II Clients were included into the source. They
 covered by the same GPLv2 license as Quake II itself:
@@ -15,19 +16,19 @@ covered by the same GPLv2 license as Quake II itself:
 - Q2Pro
 - QuDoS
 - r1q2
+- stereo quake
 - zeq2
 
 The following code is used in library form and thus not part of Yamagi
 Quake II:
 
-- libjpeg
 - libogg
 - libopenal
 - libvorbis
 - libz
-- libsdl
 - libX11
 - libXxf86vm
+- SDL
 
 ===============================================================================
 
@@ -445,3 +446,8 @@ Non-NIB-Code & other changes: Max Horn <max at quendi.de>
 Feel free to customize this file to suit your needs
 
 ===============================================================================
+
+Sean's Tool Box -- public domain -- http://nothings.org/stb.h
+no warranty is offered or implied; use this code at your own risk
+
+===============================================================================
diff --git a/Makefile b/Makefile
index 8a6fe29..05c06ad 100755
--- a/Makefile
+++ b/Makefile
@@ -106,20 +106,16 @@ endif
 
 # Detect the architecture
 ifeq ($(OSTYPE), Windows)
-# At this time only i386 is supported on Windows
-# (amd64 works, but building an 64 bit executable
-# is not that easy. Especially SDL and OpenAL are
-# somewhat problematic)
-ARCH ?= i386
+ifdef PROCESSOR_ARCHITEW6432
+# 64 bit Windows
+ARCH := $(PROCESSOR_ARCHITEW6432)
 else
-# Some platforms call it "amd64" and some "x86_64"
-ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/amd64/x86_64/)
+# 32 bit Windows
+ARCH := $(PROCESSOR_ARCHITECTURE)
 endif
-
-# Refuse all other platforms as a firewall against PEBKAC
-# (You'll need some #ifdef for your unsupported  plattform!)
-ifeq ($(findstring $(ARCH), i386 x86_64 sparc64 ia64),)
-$(error arch $(ARCH) is currently not supported)
+else
+# Normalize some abiguous ARCH strings
+ARCH := $(shell uname -m | sed -e 's/i.86/i386/' -e 's/amd64/x86_64/' -e 's/^arm.*/arm/')
 endif
 
 # Disable CDA for SDL2
@@ -156,7 +152,6 @@ endif
 ifeq ($(OSTYPE), Darwin)
 CFLAGS := -O2 -fno-strict-aliasing -fomit-frame-pointer \
 		  -Wall -pipe -g -fwrapv
-		  #-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.5.sdk
 CFLAGS += $(OSX_ARCH)
 else
 CFLAGS := -O2 -fno-strict-aliasing -fomit-frame-pointer \
@@ -165,6 +160,11 @@ endif
 
 # ----------
 
+# Defines the operating system and architecture
+CFLAGS += -DOSTYPE=\"$(OSTYPE)\" -DARCH=\"$(ARCH)\"
+
+# ----------
+
 # Systemwide installation
 ifeq ($(WITH_SYSTEMWIDE),yes)
 CFLAGS += -DSYSTEMWIDE
@@ -323,7 +323,7 @@ ifeq ($(OSTYPE), Windows)
 icon:
 	@echo "===> WR build/icon/icon.res"
 	${Q}mkdir -p build/icon
-	${Q}windres stuff\icon\icon.rc -O COFF -o build\icon\icon.res
+	${Q}windres src/backends/windows/icon.rc -O COFF -o build/icon/icon.res
 endif
 
 # ----------
@@ -401,7 +401,8 @@ ifeq ($(WITH_OPENAL),yes)
 ifeq ($(OSTYPE), OpenBSD)
 release/quake2 : CFLAGS += -DUSE_OPENAL -DDEFAULT_OPENAL_DRIVER='"libopenal.so"'
 else ifeq ($(OSTYPE), Darwin)
-release/quake2 : CFLAGS += -DUSE_OPENAL -DDEFAULT_OPENAL_DRIVER='"libopenal.dylib"'
+release/quake2 : CFLAGS += -DUSE_OPENAL -DDEFAULT_OPENAL_DRIVER='"libopenal.dylib"' -I/usr/local/opt/openal-soft/include
+release/quake2 : LDFLAGS += -L/usr/local/opt/openal-soft/lib
 else
 release/quake2 : CFLAGS += -DUSE_OPENAL -DDEFAULT_OPENAL_DRIVER='"libopenal.so.1"'
 endif
@@ -504,17 +505,17 @@ build/baseq2/%.o: %.c
 release/baseq2/game.dll : LDFLAGS += -shared
 else ifeq ($(OSTYPE), Darwin)
 game:
-	@echo "===> Building baseq2/game.dynlib"
+	@echo "===> Building baseq2/game.dylib"
 	${Q}mkdir -p release/baseq2
-	$(MAKE) release/baseq2/game.dynlib
+	$(MAKE) release/baseq2/game.dylib
 
 build/baseq2/%.o: %.c
 	@echo "===> CC $<"
 	${Q}mkdir -p $(@D)
 	${Q}$(CC) -c $(CFLAGS) $(INCLUDE) -o $@ $<
 
-release/baseq2/game.dynlib : CFLAGS += -fPIC
-release/baseq2/game.dynlib : LDFLAGS += -shared
+release/baseq2/game.dylib : CFLAGS += -fPIC
+release/baseq2/game.dylib : LDFLAGS += -shared
 else # not Windows or Darwin
 game:
 	@echo "===> Building baseq2/game.so"
@@ -783,7 +784,7 @@ release/baseq2/game.dll : $(GAME_OBJS)
 	${Q}$(CC) $(GAME_OBJS) $(LDFLAGS) -o $@
 	$(Q)strip $@
 else ifeq ($(OSTYPE), Darwin)
-release/baseq2/game.dynlib : $(GAME_OBJS)
+release/baseq2/game.dylib : $(GAME_OBJS)
 	@echo "===> LD $@"
 	${Q}$(CC) $(GAME_OBJS) $(LDFLAGS) -o $@
 else
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..0685eac
--- /dev/null
+++ b/README.md
@@ -0,0 +1,227 @@
+Yamagi Quake II
+===============
+
+This is the Yamagi Quake II Client, an enhanced version of id Software's Quake
+II with focus on offline and coop gameplay. Both the gameplay and the graphics
+are unchanged, but many bugs if the last official release were fixed and some
+nice to have features like widescreen support were added. Unlike most other
+Quake II source ports Yamagi Quake II is full 64 bit clean. It works perfectly
+on modern processors and operating systems. Yamagi Quake II runs on nearly all
+common platforms, including FreeBSD, Linux, OpenBSD, Windows and OS X.
+
+This code is build upon Icculus Quake II, which itself is based on Quake II
+3.21. Yamagi Quake II released under the terms of the GPL version 2. See the
+LICENSE file for further information.
+
+
+Installation
+------------
+
+Yamagi Quake II is installed in 3 steps:
+
+- Game data setup.
+- Music extraction.
+- Download and extract the executables.
+
+
+### Game data Setup
+
+Over the years Quake II was distributed in a myriad of ways:
+
+- As a demo version.
+- As a retail release on CD.
+- As part of Quake IV.
+- Through steam.
+- etc.
+
+Yamagi Quake II supports all of these version, even the limited demo.  Full
+versions require about 1.6 GiB hard drive space, the demo version about 150 Mib.
+
+
+#### Full versions
+
+The easiest way to install a full version of Quake II is to start with the
+patch. Please note that the patch is **required** for all full versions of the
+game, even the newer ones like Steam. Without it Yamagi Quake II will not work!
+
+1. Download the patch:
+   http://deponie.yamagi.org/quake2/idstuff/q2-3.20-x86-full-ctf.exe
+2. Extract the patch into an empty directory. The patch is just an ordinary
+   self-extracting ZIP file. On Windows it can be extracted by double clicking
+   on it, on other systems an archiver or even the *unzip* command can be used.
+
+Now it's time to remove the following files from the extracted patch. They're
+the original executables, documentation and so on. They aren't needed anymore:
+
+- 3.20_Changes.txt
+- quake2.exe
+- ref_gl.dll
+- ref_soft.dll
+- baseq2/gamex86.dll
+- baseq2/maps.lst
+- ctf/ctf2.ico
+- ctf/gamex86.dll
+- ctf/readme.txt
+- ctf/server.cfg
+- xatrix/gamex86.dll
+- rogue/gamex86.dll
+
+Copy the pak0.pak file and the video/ subdirectory from your Quake II
+distribution (CD, Steam download, etc) into the baseq2/ subdirectory of the
+extracted patch.
+
+If you own the optional addons you'll need to copy their gamedata too:
+
+- For The Reckoning copy the pak0.pak and the video/ subdirectory from your
+  addon distribution into the xatrix/ subdirectory.
+- For Ground Zero copy the pak0.pak and the video/ subdirectory from your
+  addon distribution into the rogue/ subdirectory.
+
+
+#### The demo version
+
+1. Get the demo from http://deponie.yamagi.org/quake2/idstuff/q2-314-demo-x86.exe
+   and extract it. It's just an ordinary, self-extract ZIP file. On Windows it
+   be extracted by double clicking on it, on other system an archiver or even
+   the *unzip* command can be used.
+3. Create a new directory and a subdirectory baseq2/ in it.
+3. Copy the pak0.pak and the players/ subdirectory from Install/Data/baseq2/
+   into the newly created baseq2/ subdirectory.
+
+The demo **must not** be patched! Patching the demo will break it!
+
+
+### Music extraction
+
+The retail CD version of Quake II and both addons contain up to 11 Audio CD
+tracks, forming the soundtrack. Since modern computers lack the ability for
+classic Audio CD playback, it's often emulated by a transparent combination 
+of CD ripping and playback, these tracks can be ripped into OGG/Vorbis files.
+Yamagi Quake II will use these files instead of the CD tracks.
+
+Later Quake II version, for example the one included with Quake IV and the one
+available through Steam, lack the soundtrack. Nevertheless Yamagi Quake II can
+play it if you copy the files into the directories mentioned above. 
+
+
+#### Using a generic CD extractor / CD ripper
+
+1. Install a CD extractor and set it to OGG/Vorbis files.
+2. Put the Quake II CD into your CD drive and extract the files.
+3. The files must be named after the CD track. Track 02 becomes 02.ogg, track
+   03 becomes 03.ogg and so on. On both the Quake II and the Addon CDs track 1
+   is the data track and can't be ripped.
+4. Put these files into the corresponding subdirectory:
+    - baseq2/music for Quake II.
+    - xatrix/music for The Reckoning.
+    - rogue/music for Ground Zero.
+
+
+#### Extracting music on BSD, Linux and OS X 
+
+An easy way to extract the music on unixoid platforms is to use
+*stuff/cdripper.sh*, a simple shellscript we provide. It needs *cdparanoia* and
+oggenc from the *vorbis-tools* package installed. Use your package manager of
+choice (apt-get, dnf, homebrew, ...) to install them. Just execute the script
+and copy the resulting music/ directory to:
+	- baseq2/ for Quake II.
+    - xatrix/ for The Reckoning.
+    - rogue/ for Ground Zero.
+ 
+
+### Download and extract the executables
+
+How the Yamagi Quake II executables are installed depends on the platform:
+
+- For Windows a package with all Yamagi Quake II executables is provided.
+- Some Linux distributions and BSD systems provide Yamagi Quake II packages.
+- On OS X you need to compile from source.
+- Of course Yamagi Quake II can be compiled from source on all platforms.
+
+
+#### Microsoft Windows
+
+1. Get the latest release from http://www.yamagi.org/quake2
+2. Extract it into the gamedata directory created above. quake2.exe must be
+   placed next to the baseq2/ subdirectory.
+
+On Windows Yamagi Quake II is fully portable, you can move the installation
+directory wherever and whenever you like. To update Yamagi Quake II just
+overwrite the old files with the new ones.
+
+
+#### Binary Package from your Linux distribution or BSD system
+
+Many Linux distributions and BSD systems provide Yamagi Quake II packages.
+Please refer to the documentation of your distribution or system. The gamedata
+is searched at:
+
+- A global directory specified by the package.
+- The same directory as the quake2 executable.
+- In $HOME/.yq2
+- The directory given with the *+set basedir /path/to/quake2_installation/*
+  commandline argument.
+
+Yamagi Quake II has support for an alternative startup config. It may be a good
+idea to install it, since it sets some global options to sane defaults. Copy
+yq2.cfg to the baseq2/ subdirectory in your gamedata directory. Usually yq2.cfg
+can be found somewhere in /usr/share or /usr/local/share.
+
+
+### Compiling from source
+
+To compile Yamagi Quake II from source, you need the following dependencies,
+including development headers:
+
+- A GCC-compatible compiler like GCC, MinGW (see below) or clang.
+- GNU make or cmake.
+- A libGL implementation with OpenGL system headers.
+- SDL 2.0 or SDL 1.2 (2.0 recommended, edit the Makefile to use 1.2 instead).
+- libogg, libvorbis and libvorbisfile.
+- A OpenAL implementation, openal-soft is highly recommended.
+- zlib.
+
+Yamagi Quake II has 2 build systems:
+
+- A classic GNU Makefile.
+- A CMake file.
+
+Both build system provide the same options and features, it's up to the user to
+decide which one to use.
+
+
+#### On Linux distribution or BSD systems
+
+On debian based distributions (including Ubuntu and Mint) the dependencies can
+be installed with: `apt-get install build-essential libgl1-mesa-dev libsdl2-dev
+libogg-dev libvorbis-dev libopenal-dev zlib1g-dev`
+
+On OS X we recommend using [homebrew](http://brew.sh) to install the
+dependencies: `brew install sdl2 libvorbis libogg openal-soft`
+
+On FreeBSD you'll need something like: `pkg install gmake libGL sdl2 libogg
+libvorbis openal-soft`
+
+
+#### On Windows
+
+On Windows a MinGW environment is needed. A preinstalled environment with all
+dependencies can be found at http://deponie.yamagi.org/quake2/windows/build/
+Just extract it into C:\MinGW\ and start either the 32 bit or 64 bit version
+through *C:\MinGW\MSYS32* or *C:\MinGW\MSYS64*. With the preinstalled MinGW
+environment GNU Make is highly recommended, CMake requires further
+configuration. At this time Yamagi Quake II can't be compiled with Microsoft
+Visual Studio.
+
+
+#### Compiling
+
+Download the latest release from http://www.yamagi.org/quake2 or clone the
+source from https://github.com/yquake/yquake.git, change into the yquake2/
+source directory and type *make*. After that copy everything from the release/
+directory to your Yamagi Quake II installation directory.
+
+For the addons download or clone their source, change into the source directory
+and type *make*. After the compilation finishes the release/game.so is copied
+to the corresponding directory in your Quake II installation.
+ 
diff --git a/src/backends/sdl/icon/q2icon.xbm b/src/backends/sdl/icon/q2icon.xbm
index 0a8e217..f0e0866 100644
--- a/src/backends/sdl/icon/q2icon.xbm
+++ b/src/backends/sdl/icon/q2icon.xbm
@@ -1,14 +1,14 @@
 #define q2icon_width 32
 #define q2icon_height 32
 static unsigned char q2icon_bits[] = {
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 0x03, 0xc0, 0x00,
-   0x80, 0x01, 0x80, 0x01, 0xc0, 0x00, 0x00, 0x03, 0x60, 0x00, 0x00, 0x06,
-   0x60, 0x00, 0x00, 0x06, 0x30, 0x00, 0x00, 0x0c, 0x30, 0x00, 0x00, 0x0c,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x01, 0x80, 0x00,
+   0x80, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x03, 0x60, 0x00, 0x00, 0x06,
+   0x60, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 0x06, 0x30, 0x00, 0x00, 0x0c,
    0x30, 0x00, 0x00, 0x0c, 0x30, 0x00, 0x00, 0x0c, 0x30, 0x00, 0x00, 0x0c,
-   0x30, 0x00, 0x00, 0x0c, 0x30, 0x00, 0x00, 0x0c, 0x70, 0x00, 0x00, 0x0e,
-   0x70, 0xf0, 0x0f, 0x0e, 0xe0, 0xe0, 0x07, 0x07, 0xe0, 0x61, 0x86, 0x07,
-   0xc0, 0x63, 0xc6, 0x03, 0x80, 0x7f, 0xfe, 0x01, 0x00, 0xff, 0xff, 0x00,
-   0x00, 0xfe, 0x7f, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0xe0, 0x07, 0x00,
+   0x70, 0x00, 0x00, 0x0e, 0x70, 0x00, 0x00, 0x0e, 0xe0, 0xf0, 0x0f, 0x07,
+   0xe0, 0xe0, 0x07, 0x07, 0xc0, 0x61, 0x86, 0x03, 0xc0, 0x67, 0xe6, 0x03,
+   0x80, 0x7f, 0xfe, 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfc, 0x3f, 0x00,
+   0x00, 0xf0, 0x0f, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x60, 0x06, 0x00,
    0x00, 0x60, 0x06, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x60, 0x06, 0x00,
-   0x00, 0x60, 0x06, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x60, 0x06, 0x00,
-   0x00, 0x60, 0x06, 0x00, 0x00, 0x60, 0x06, 0x00 };
+   0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
diff --git a/src/backends/sdl/icon/q2icon64.h b/src/backends/sdl/icon/q2icon64.h
index ab814d9..8cadadf 100644
--- a/src/backends/sdl/icon/q2icon64.h
+++ b/src/backends/sdl/icon/q2icon64.h
@@ -5,489 +5,474 @@ static const struct {
 	unsigned char pixel_data[64 * 64 * 4 + 1];
 } q2icon64 = {
 	64, 64, 4,
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\4\0\0\0\0\0\0\0_\0\0\0\256\0\0\0b\0\0\0\3\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0/\0\0\0\377\0\0\0"
-	"y\0\0\0\0\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\5\0\0\0\35\0\0\0\361\0\0\0\377\0\0\0w\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\6\0\0\0\302\0\0\0\377\0\0\0\66\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\0\0\0\0k\0\0\0\377\0\0\0\237"
-	"\0\0\0\0\0\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\0\0\0\0a\0\0\0\377\0"
-	"\0\0\242\0\0\0\0\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\0\0\0\0\337"
-	"\0\0\0\377\0\0\0\66\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\4\0\0\0 \0\0\0\374\0\0\0\347\0\0\0\0\0\0\0\4\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\3\0\0\0\0\0\0\0\377\0\0\0\373\0\0\0\f\0\0\0\a\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\0\0\0\0\0\0\0\354"
-	"\0\0\0\371\0\0\0\2\0\0\0\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\0\0\0\0\370\0\0\0\377\0\0\0\f\0\0\0\6\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\4\0\0\0\0\0\0\0\375\0\0\0\360\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\304\0\0\0"
-	"\377\0\0\0\65\0\0\0\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\0\0\0)\0\0\0"
-	"\377\0\0\0\313\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\4\0\0\0Z\0\0\0\377\0\0\0\237\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\1\0\0\0\200\0\0\0\376\0\0\0v\0\0\0\3\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\3\0\0\0\34\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\357\0"
-	"\0\0\377\0\0\0\21\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\320\0\0\0\367"
-	"\0\0\0\203\0\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\4\0\0\09\0\0\0\377\0\0\0\322\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\5\0\0\0L\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\255\0\0\0\377"
-	"\0\0\08\0\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\307\0\0\0\367\0\0\0\255\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\5\0\0\0f\0\0\0\373\0\0\0\313\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0*\0\0\0\377\0\0\0"
-	"\377\0\0\0\?\0\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\r\0\0\0\377\0\0\0\377\0\0\0"
-	"\33\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\3\0\0\0\211\0\0\0\372\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\355\0\0\0\370\0\0\0\240\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\356\0\0\0\372\0\0\0\325"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\257\0\0\0\371\0\0\0\371"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0"
-	"\0\25\0\0\0\377\0\0\0\373\0\0\0\261\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\1\0\0\0\225\0\0\0\372\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\0\0\0q\0\0\0\374\0\0\0\373\0\0\0{\0\0\0"
-	"\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\0\0\0y\0\0\0\372\0\0\0\377\0\0\0*\0"
-	"\0\0\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\260\0\0"
-	"\0\373\0\0\0\377\0\0\0a\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\0\0\0Z\0"
-	"\0\0\377\0\0\0\372\0\0\0\226\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\324\0\0\0\374\0\0\0\372\0\0\0\177\0\0\0\6\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\21\0\0\0\337\0\0\0\372\0\0\0\310\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\320\0\0\0\374"
-	"\0\0\0\371\0\0\0\206\0\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\0\0\0R\0\0"
-	"\0\377\0\0\0\375\0\0\0\341\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\372\0\0\0\222\0\0\0\2\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\6\0\0\0u\0\0\0\373\0\0\0\377\0\0\0\377\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\375\0\0\0\376\0"
-	"\0\0\374\0\0\0\217\0\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\260\0"
-	"\0\0\373\0\0\0\374\0\0\0\327\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\334\0\0\0\374\0\0\0\370\0\0\0r\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\355\0\0\0\375\0\0\0\376\0\0\0\377\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\303\0\0\0\373"
-	"\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\0\0\0\0\377"
-	"\0\0\0\377\0\0\0\375\0\0\0\370\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\246\0\0\0\372\0\0\0\377\0\0\0\377\0\0\0j\0\0\0"
-	"\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\5\0\0\0\\\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\27\0\0\0"
-	"\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\0\0\0\204\0\0\0\372"
-	"\0\0\0\377\0\0\0\376\0\0\0\373\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\326\0\0\0"
-	"\374\0\0\0\377\0\0\0\377\0\0\0W\0\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\4\0\0\0R\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
-	"R\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\2\0\0\0\1\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\2\0\0\0\26\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\63\0\0"
-	"\0\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\b\0\0\0\377"
-	"\0\0\0\377\0\0\0\377\0\0\0\375\0\0\0\351\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\b\0\0\0\6\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\0\0\0\206\0\0\0\372\0"
-	"\0\0\377\0\0\0\376\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\337\0\0\0\373\0\0\0\377\0\0\0\377"
-	"\0\0\0\377\0\0\0M\0\0\0\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\1\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\370\0\0\0\355\0\0\0\354\0"
-	"\0\0\370\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\375\0"
-	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0$\0\0\0\2\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\0\0\0\67\0\0\0\361\0\0\0\376\0\0"
-	"\0\377\0\0\0\372\0\0\0\230\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\65\0\0\0\377\0\0\0\373\0\0\0\377\0"
-	"\0\0\376\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\1\0\0\0\0\0\0\0\61\0\0\0\337\0\0\0\373\0\0\0\375\0\0"
-	"\0\376\0\0\0\376\0\0\0\365\0\0\0\335\0\0\0\375\0\0\0\376\0\0\0\376\0\0"
-	"\0\374\0\0\0\341\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\0\0\0\0\376\0\0\0\375\0\0\0\377\0\0\0"
-	"\377\0\0\0\377\0\0\0\27\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\0\0\0\63\0\0\0\377\0\0\0\377\0\0\0\377"
-	"\0\0\0\372\0\0\0\312\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\b\0\0\0\205\0\0\0\372\0\0\0\377\0\0\0\377"
-	"\0\0\0\373\0\0\0\206\0\0\0H\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
-	"\0M\0\0\0\a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\367\0\0\0\372\0\0\0\377\0\0\0\377\0\0\0\373\0\0\0\307"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\3\0\0\0\63\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
-	"\0\0\374\0\0\0\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\4\0\0\0P\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
-	"\0\62\0\0\0\5\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0&\0\0\0\3\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\317"
-	"\0\0\0\371\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0&\0\0\0\3\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\316\0\0\0\371\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
-	"\377\0\0\0\272\0\0\0\0\0\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\3\0\0\0\62\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\22\0\0"
-	"\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0$\0\0\0\3\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\0\0\0\0\314\0\0\0\373\0\0\0"
-	"\377\0\0\0\377\0\0\0\377\0\0\0\371\0\0\0\266\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\1\0\0\0\0\0\0\0\377\0\0\0\376\0\0\0\377\0\0\0\377\0\0\0\377\0"
-	"\0\0\371\0\0\0\373\0\0\0\4\0\0\0\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\3\0\0\0&\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\27\0\0\0\0\0"
-	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\25\0\0\0\2\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\6\0\0\0\0\0\0\0\347\0\0\0\372\0\0\0\377\0\0\0\377"
-	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\6\0\0\0#\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
-	"\0\0\373\0\0\0\377\0\0\0+\0\0\0\4\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0"
-	"\"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\32\0\0\0\0\0\0\0\377\0"
-	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\1\0"
-	"\0\0\0\0\0\0=\0\0\0\377\0\0\0\372\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
-	"\0\0\0\377\0\0\0H\0\0\0\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\4\0\0\0U\0\0\0\377\0\0\0\377\0\0\0\376\0\0\0\377\0\0\0\377\0\0\0\375"
-	"\0\0\0\376\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\3\0\0\0\'\0\0\0\377\0"
-	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0"
-	"\377\0\0\0\377\0\0\0\30\0\0\0\2\0\0\0\1\0\0\0\2\0\0\0\0\0\0\0\263\0\0\0"
-	"\377\0\0\0\376\0\0\0\377\0\0\0\377\0\0\0\376\0\0\0\377\0\0\0\377\0\0\0"
-	"\201\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0`\0\0\0\377\0\0\0\351\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
-	"\0\375\0\0\0\377\0\0\0\377\0\0\0\250\0\0\0\22\0\0\0\4\0\0\0\3\0\0\0\377"
-	"\0\0\0\376\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0"
-	"\0\377\0\0\0\377\0\0\0#\0\0\0\0\0\0\0\f\0\0\0\220\0\0\0\377\0\0\0\372\0"
-	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\376\0\0\0\356\0\0\0\377\0\0\0\237\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\1\0\0\0\b\0\0\0\246\0\0\0\372\0\0\0\377\0\0\0\377\0"
-	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\372\0\0\0\377\0\0\0\0\0\0\0]\0\0\0\377"
-	"\0\0\0\377\0\0\0\376\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0"
-	"\0\377\0\0\0\377\0\0\0\241\0\0\0\337\0\0\0\377\0\0\0\373\0\0\0\377\0\0"
-	"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0|\0\0\0\267\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\0\0\0\16\0\0\0\377\0\0\0\375\0\0\0\377\0"
-	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\370\0\0\0\377\0"
-	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\375\0"
-	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\372\0\0\0\375\0\0\0\377\0\0\0\377\0"
-	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0;\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\65\0\0\0\372\0\0"
-	"\0\372\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\376\0\0"
-	"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
-	"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
-	"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\372\0\0\0\377\0\0\0r\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\0\0\0\0"
-	"\0\0\0\226\0\0\0\377\0\0\0\372\0\0\0\373\0\0\0\373\0\0\0\377\0\0\0\377"
-	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
-	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
-	"\0\0\0\377\0\0\0\377\0\0\0\374\0\0\0\377\0\0\0\313\0\0\0\r\0\0\0\4\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\27\0\0\0\267\0\0\0\271\0\0\0\263\0\0\0\377\0\0\0\377"
-	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
-	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\376"
-	"\0\0\0\372\0\0\0\377\0\0\0\335\0\0\09\0\0\0\0\0\0\0\2\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\3\0\0\0\0\0\0\0\0\0\0\0\24\0\0\0\377\0\0\0\377\0\0\0\377\0"
-	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
-	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\372\0\0\0\377\0\0\0\377\0\0\0\234\0"
-	"\0\0\"\0\0\0\0\0\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\0\0\0\0\35\0\0\0\232\0\0\0\377\0\0\0\377"
-	"\0\0\0\377\0\0\0\375\0\0\0\377\0\0\0\377\0\0\0\376\0\0\0\377\0\0\0\377"
-	"\0\0\0\377\0\0\0\241\0\0\08\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\a\0\0\0Z\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\20"
-	"\0\0\0\34\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0A\0\0\0\a\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\0\0\0T\0\0\0\377\0"
-	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\26\0\0\0\'\0\0\0\377\0\0\0\377\0\0\0"
-	"\377\0\0\0\377\0\0\0H\0\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\4\0\0\0F\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\24"
-	"\0\0\0\b\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\09\0\0\0\3\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\37\0\0\0\377\0"
-	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\350\0\0\0\375\0\0\0"
-	"\377\0\0\0\377\0\0\0+\0\0\0\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\1\0\0\0\20\0\0\0\361\0\0\0\376\0\0\0\376\0\0\0\377\0\0\0"
-	"\0\0\0\0\0\0\0\0\377\0\0\0\376\0\0\0\377\0\0\0\377\0\0\0-\0\0\0\3\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\61\0\0\0\377"
-	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0(\0\0\0\377\0\0\0\377\0\0\0"
-	"\377\0\0\0\377\0\0\0+\0\0\0\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\2\0\0\0\35\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
-	"\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\27\0\0\0\2\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377"
-	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\376\0\0"
-	"\0\377\0\0\0\377\0\0\0\0\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\354\0\0\0\375\0\0\0\375\0\0\0\344\0"
-	"\0\0\0\0\0\0\0\0\0\0\350\0\0\0\375\0\0\0\376\0\0\0\370\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\312\0\0\0\374\0\0\0\372\0\0\0\236\0\0\0\0\0\0\0\0\0\0\0\251\0\0\0\373"
-	"\0\0\0\374\0\0\0\307\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\241\0\0\0\372\0\0\0\377\0\0\0Y\0"
-	"\0\0\5\0\0\0\6\0\0\0x\0\0\0\373\0\0\0\372\0\0\0\225\0\0\0\2\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\0\0\0t\0"
-	"\0\0\373\0\0\0\377\0\0\0*\0\0\0\3\0\0\0\4\0\0\0O\0\0\0\377\0\0\0\376\0"
-	"\0\0h\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\4\0\0\0K\0\0\0\377\0\0\0\377\0\0\0\21\0\0\0\2\0\0\0\3\0"
-	"\0\0)\0\0\0\377\0\0\0\377\0\0\0\62\0\0\0\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\'\0\0\0\377\0\0\0"
-	"\377\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\6\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0"
-	"\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\2\0\0\0\r\0\0\0\377\0\0\0\350\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\274\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\372\0\0\0\332\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\336\0\0\0\244\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\316\0\0"
-	"\0\271\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\240\0\0\0\207\0\0\0\4\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\234\0\0\0\232\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\0\0\0"
-	"~\0\0\0Z\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0\5\0\0\0g\0\0\0s\0\0\0\5\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\3\0\0\0\?\0\0\0\33\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\20"
-	"\0\0\0(\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-	"\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\40\0\0\0u\0\0\0^\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\226\0\0\0\244\0\0\0"
+	"\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\10\0\0\0\216\0\0\0\374\0\0\0\262\0\0\0\35\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\15\0\0\0\177\0\0\0\355\0\0\0s\0\0\0\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0$\0\0\0\311\0\0\0\336\0\0\0I\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0/\0\0\0\333\0\0\0\310\0\0\0!\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0k\0\0\0\366\0\0\0\236\0\0\0\12\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\0\0\0\262\0\0\0\354"
+	"\0\0\0D\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0u\0\0\0\377\0\0\0\202\0\0\0\1"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2"
+	"\0\0\0\222\0\0\0\371\0\0\0G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0y\0\0\0\371\0\0\0\206\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\1\0\0\0\245\0\0\0\365\0\0\0""6\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?\0\0\0\374\0\0\0\267"
+	"\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\0\0\0\325\0\0\0\341\0\0\0\23\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\25\0\0\0\345"
+	"\0\0\0\360\0\0\0\24\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0+\0\0\0\371"
+	"\0\0\0\266\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\256\0\0\0\377\0\0\0x\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\204\0\0\0\377\0\0\0o\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0I\0\0\0\377\0\0\0\347\0\0\0\11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\12\0\0\0\332\0\0\0\360\0\0\0\26\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\1\0\0\0\322\0\0\0\377\0\0\0\177\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0O\0\0\0\377\0\0\0\211"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0;\0\0\0\377\0\0\0\375\0\0\0\34\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\22\0\0"
+	"\0\376\0\0\0\362\0\0\0\17\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\266\0\0\0\377\0\0\0\277\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\322\0\0\0\377\0\0\0q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\0\0\0\370\0\0\0"
+	"\377\0\0\0r\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\221\0\0\0\377\0\0\0\323\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0S\0"
+	"\0\0\377\0\0\0\377\0\0\0G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0f\0\0\0\377\0\0\0\377\0\0\0"
+	"\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\237\0\0\0\377\0\0\0\377\0\0\0#\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0I\0\0\0\377\0"
+	"\0\0\377\0\0\0""6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\333\0\0\0\377\0\0\0\373\0\0\0\4\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0.\0\0\0\377\0\0\0\377\0\0\0}\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\0\0\0\376\0\0\0\377\0\0\0\374\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\17\0\0\0\307\0\0\0\377\0\0\0\277\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\23\0\0\0\377\0\0\0\377"
+	"\0\0\0\377\0\0\0\7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\35\0\0\0\372\0\0\0\377\0\0\0\331"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0=\0"
+	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\21\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0>\0\0\0\377\0\0"
+	"\0\377\0\0\0\370\0\0\0\7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0R\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\30\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\\\0\0\0\377\0\0\0\377\0\0\0\372\0\0\0\17\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""8\0\0\0\377\0\0\0\377\0\0\0\313\0\0\0"
+	"\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\213\0\0\0\377\0\0\0\377\0\0\0\355\0\0\0\3\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\36\0\0\0\377\0\0"
+	"\0\377\0\0\0\377\0\0\0\222\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301\0\0\0\377\0\0\0\377"
+	"\0\0\0\377\0\0\0\35\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\5\0\0\0\375\0\0\0\377\0\0\0\377\0\0\0\306\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\0\0\0"
+	"\366\0\0\0\377\0\0\0\377\0\0\0\230\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\342\0\0\0\377\0\0\0\377\0\0\0\377"
+	"\0\0\0;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0e\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0L\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\274\0\0\0\377\0"
+	"\0\0\377\0\0\0\377\0\0\0\262\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\304\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
+	"\0v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\206\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\376\0\0\0.\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\34\0\0\0\376\0\0\0\377\0"
+	"\0\0\377\0\0\0\377\0\0\0&\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""6\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
+	"\0\0\0\256\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\301\0\0\0\303\0\0\0\257\0\0\0\232\0\0\0\231\0\0\0\243\0"
+	"\0\0\302\0\0\0\330\0\0\0\325\0\0\0\301\0\0\0\264\0\0\0\252\0\0\0\275\0\0"
+	"\0\322\0\0\0\335\0\0\0\217\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\11\0\0\0\235\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
+	"\313\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\1\0\0\0\300\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
+	"\0\0G\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0.\0\0\0w\0\0\0\340\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\363\0"
+	"\0\0\364\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\304\0\0\0?\0\0\0\5"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\207"
+	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0f\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0"
+	"\0\0\255\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\342\0\0\0\32\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\202\0\0\0"
+	"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0y\0\0\0\205\0\0\0\377\0\0\0\377\0"
+	"\0\0\377\0\0\0\377\0\0\0(\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0h\0\0\0\376\0\0\0\377\0\0\0\377\0\0\0\377\0"
+	"\0\0\353\0\0\0\14\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\271\0\0\0\377\0\0\0\377\0"
+	"\0\0\377\0\0\0\377\0\0\0\321\0\0\0\21\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0S\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
+	"\0\0\0""5\0\0\0L\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\364\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0N\0\0\0\374"
+	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0w\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0;\0\0\0\375\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\323"
+	"\0\0\0\40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""7"
+	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\27\0\0\0""3\0\0\0\377\0\0"
+	"\0\377\0\0\0\377\0\0\0\351\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0E\0\0\0\364\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
+	"\0\0\0\340\0\0\0\13\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\203\0\0"
+	"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\356\0\0\0J\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0.\0\0\0\377\0\0\0\377\0\0\0\377"
+	"\0\0\0\377\0\0\0\21\0\0\0,\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\330\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0b\0\0\0\372\0\0\0"
+	"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0K\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\272\0\0\0\377\0\0\0\377\0\0\0\377"
+	"\0\0\0\377\0\0\0\377\0\0\0\374\0\0\0n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0,\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\16\0\0\0+\0\0\0"
+	"\377\0\0\0\377\0\0\0\377\0\0\0\300\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\16\0\0\0\237\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
+	"\0\0\377\0\0\0\226\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\20\0\0\0\326\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
+	"\0\377\0\0\0\375\0\0\0""7\0\0\0\22\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0$\0\0\0\377"
+	"\0\0\0\377\0\0\0\377\0\0\0\376\0\0\0\4\0\0\0+\0\0\0\377\0\0\0\377\0\0\0\377"
+	"\0\0\0\333\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0U\0\0\0\342\0\0\0\377\0\0"
+	"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\276\0\0\0\5\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\32"
+	"\0\0\0\315\0\0\0\353\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\372\0"
+	"\0\0\375\0\0\0\273\0\0\0G\0\0\0\0\0\0\0\23\0\0\0\355\0\0\0\377\0\0\0\377"
+	"\0\0\0\360\0\0\0\0\0\0\0*\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\347\0\0\0\0"
+	"\0\0\0\6\0\0\0W\0\0\0\310\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
+	"\0\0\0\366\0\0\0\366\0\0\0\331\0\0\0\22\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\0\0\0D\0\0"
+	"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
+	"\377\0\0\0""2\0\0\0h\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\347\0\0\0""3\0\0"
+	"\0Q\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\366\0\0\0\265\0\0\0\363\0\0\0\377"
+	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\305\0"
+	"\0\0\212\0\0\0%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\276\0\0\0\377"
+	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\363\0"
+	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
+	"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
+	"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\240\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\0\0\0\231\0\0\0"
+	"\376\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
+	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
+	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
+	"\0\377\0\0\0\377\0\0\0\377\0\0\0\376\0\0\0\231\0\0\0\16\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0:\0\0\0\313\0"
+	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
+	"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
+	"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
+	"\0\0\0\320\0\0\0A\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0[\0\0\0\177\0\0\0{"
+	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
+	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
+	"\0\377\0\0\0\377\0\0\0\377\0\0\0\316\0\0\0_\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\230\0\0\0\351\0\0\0\377"
+	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
+	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\346\0\0\0\224\0\0\0""4\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0j\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
+	"\0\0\0\321\0\0\0\334\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\364\0\0\0:\0\0\0"
+	"\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0P\0\0\0\377\0\0\0"
+	"\377\0\0\0\377\0\0\0\377\0\0\0\25\0\0\0S\0\0\0\377\0\0\0\377\0\0\0\377\0"
+	"\0\0\375\0\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0F\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\20\0\0\0Q\0\0\0\377"
+	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0""1\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\372\0"
+	"\0\0\1\0\0\0,\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\376\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\0\0\0\353\0\0\0\377"
+	"\0\0\0\377\0\0\0\347\0\0\0\0\0\0\0\4\0\0\0\373\0\0\0\377\0\0\0\377\0\0\0"
+	"\370\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0'\0\0\0\371\0\0\0\377\0\0\0\377\0\0\0\356\0\0\0\0\0\0\0B\0\0\0\377\0\0"
+	"\0\377\0\0\0\377\0\0\0\361\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0#\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\365\0\0\0\0"
+	"\0\0\0K\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\346\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\0\0\0\376\0\0\0\377\0\0\0"
+	"\377\0\0\0\353\0\0\0\0\0\0\0,\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\320\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\340\0\0\0\377\0\0\0\377\0\0\0\321\0\0\0\0\0\0\0\16\0\0\0\377\0\0\0\377"
+	"\0\0\0\377\0\0\0\256\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\270\0\0\0\377\0\0\0\377\0\0\0\237\0\0\0\0\0\0"
+	"\0\0\0\0\0\345\0\0\0\377\0\0\0\377\0\0\0\211\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\0\0\0\377\0\0\0\377"
+	"\0\0\0g\0\0\0\0\0\0\0\0\0\0\0\271\0\0\0\377\0\0\0\377\0\0\0b\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0{\0\0\0"
+	"\377\0\0\0\377\0\0\0@\0\0\0\0\0\0\0\0\0\0\0\217\0\0\0\377\0\0\0\377\0\0\0"
+	"<\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0]\0\0\0\377\0\0\0\377\0\0\0\34\0\0\0\0\0\0\0\0\0\0\0q\0\0\0\377\0\0"
+	"\0\377\0\0\0\24\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0A\0\0\0\377\0\0\0\367\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0T"
+	"\0\0\0\377\0\0\0\347\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0$\0\0\0\377\0\0\0\325\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0""7\0\0\0\377\0\0\0\273\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\0\0\0\373\0\0\0\264\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\31\0\0\0\377\0\0\0\227\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\331\0\0\0\227\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\367\0\0\0}\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\252\0\0\0\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\316\0\0"
+	"\0c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\201\0\0\0\\\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\241\0\0\0?\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0A\0\0\0\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0I\0\0\0\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
+	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",
 };
diff --git a/src/backends/sdl/input.c b/src/backends/sdl/input.c
index 48f7774..b5b7701 100644
--- a/src/backends/sdl/input.c
+++ b/src/backends/sdl/input.c
@@ -333,6 +333,7 @@ IN_Update(void)
 					break;
 				}
 #endif
+				/* fall-through */
 			case SDL_MOUSEBUTTONUP:
 				switch( event.button.button )
 				{
@@ -367,8 +368,8 @@ IN_Update(void)
 
 #if SDL_VERSION_ATLEAST(2, 0, 0)
 			case SDL_TEXTINPUT:
-				if ((event.text.text[0] >= SDLK_SPACE) &&
-					 (event.text.text[0] < SDLK_DELETE))
+				if((event.text.text[0] >= ' ') &&
+				   (event.text.text[0] <= '~'))
 				{
 					Char_Event(event.text.text[0]);
 				}
@@ -384,31 +385,40 @@ IN_Update(void)
 					Char_Event(event.key.keysym.unicode);
 				}
 #endif
+				/* fall-through */
+			case SDL_KEYUP:
+			{
+				qboolean down = (event.type == SDL_KEYDOWN);
 
-				if ((event.key.keysym.sym >= SDLK_SPACE) &&
-					 (event.key.keysym.sym < SDLK_DELETE))
+#if SDL_VERSION_ATLEAST(2, 0, 0)
+				/* workaround for AZERTY-keyboards, which don't have 1, 2, ..., 9, 0 in first row:
+				 * always map those physical keys (scancodes) to those keycodes anyway
+				 * see also https://bugzilla.libsdl.org/show_bug.cgi?id=3188 */
+				SDL_Scancode sc = event.key.keysym.scancode;
+				if(sc >= SDL_SCANCODE_1 && sc <= SDL_SCANCODE_0)
 				{
-					Key_Event(event.key.keysym.sym, true, false);
+					/* Note that the SDL_SCANCODEs are SDL_SCANCODE_1, _2, ..., _9, SDL_SCANCODE_0
+					 * while in ASCII it's '0', '1', ..., '9' => handle 0 and 1-9 separately
+					 * (quake2 uses the ASCII values for those keys) */
+					int key = '0'; /* implicitly handles SDL_SCANCODE_0 */
+					if(sc <= SDL_SCANCODE_9)
+					{
+						key = '1' + (sc - SDL_SCANCODE_1);
+					}
+					Key_Event(key, down, false);
 				}
 				else
+#endif /* SDL2; (SDL1.2 doesn't have scancodes so nothing we can do there) */
+				   if((event.key.keysym.sym >= SDLK_SPACE) &&
+				      (event.key.keysym.sym < SDLK_DELETE))
 				{
-					Key_Event(IN_TranslateSDLtoQ2Key(event.key.keysym.sym), true, true);
-				}
-
-				break;
-
-			case SDL_KEYUP:
-
-				if ((event.key.keysym.sym >= SDLK_SPACE) &&
-					 (event.key.keysym.sym < SDLK_DELETE))
-				{
-					Key_Event(event.key.keysym.sym, false, false);
+					Key_Event(event.key.keysym.sym, down, false);
 				}
 				else
 				{
-					Key_Event(IN_TranslateSDLtoQ2Key(event.key.keysym.sym), false, true);
+					Key_Event(IN_TranslateSDLtoQ2Key(event.key.keysym.sym), down, true);
 				}
-
+			}
 				break;
 
 #if SDL_VERSION_ATLEAST(2, 0, 0)
@@ -418,7 +428,7 @@ IN_Update(void)
 					Key_MarkAllUp();
 				}
 
-#else // SDL1.2
+#else /* SDL1.2 */
 			case SDL_ACTIVEEVENT:
 				if(event.active.gain == 0 && (event.active.state & SDL_APPINPUTFOCUS))
 				{
diff --git a/src/backends/sdl/refresh.c b/src/backends/sdl/refresh.c
index 5f450c4..bfd5e39 100644
--- a/src/backends/sdl/refresh.c
+++ b/src/backends/sdl/refresh.c
@@ -182,7 +182,7 @@ SetSDLIcon()
 	transColor.b = 255;
 
 	solidColor.r = 0;
-	solidColor.g = 16;
+	solidColor.g = 0;
 	solidColor.b = 0;
 
 	SDL_SetColors(icon, &transColor, 0, 1);
@@ -442,7 +442,10 @@ static void InitGamma()
 	XRRFreeScreenResources(res);
 
 	VID_Printf(PRINT_ALL, "Using hardware gamma via X11/xRandR.\n");
-
+#elif __APPLE__
+	gl_state.hwgamma = false;
+	VID_Printf(PRINT_ALL, "Using software gamma (needs vid_restart after changes)\n");
+	return;
 #else
 	VID_Printf(PRINT_ALL, "Using hardware gamma via SDL.\n");
 #endif
diff --git a/src/backends/unix/main.c b/src/backends/unix/main.c
index dc59e2f..3388cea 100644
--- a/src/backends/unix/main.c
+++ b/src/backends/unix/main.c
@@ -38,6 +38,8 @@ int
 main(int argc, char **argv)
 {
 	int time, oldtime, newtime;
+	int verLen, i;
+	const char* versionString;
 
 	/* register signal handler */
 	registerHandler();
@@ -59,7 +61,7 @@ main(int argc, char **argv)
 	{
 		printf("The effective UID is not the real UID! Your binary is probably marked\n");
 		printf("'setuid'. That is not good idea, please fix it :) If you really know\n");
-		printf("what you're doin edit src/unix/main.c and remove this check. Don't\n");
+		printf("what you're doing edit src/unix/main.c and remove this check. Don't\n");
 		printf("complain if Quake II eats your dog afterwards!\n");
 
 		return 1;
@@ -68,8 +70,15 @@ main(int argc, char **argv)
 	/* enforce C locale */
 	setenv("LC_ALL", "C", 1);
 
-	printf("\nYamagi Quake II v%s\n", YQ2VERSION);
-	printf("=====================\n\n");
+	versionString = va("Yamagi Quake II v%s", YQ2VERSION);
+	verLen = strlen(versionString);
+
+	printf("\n%s\n", versionString);
+	for(i=0; i<verLen; ++i)
+	{
+		putc('=', stdout);
+	}
+	puts("\n");
 
 #ifndef DEDICATED_ONLY
 	printf("Client build options:\n");
@@ -101,8 +110,8 @@ main(int argc, char **argv)
 #endif
 #endif
 
-	printf("Platform: %s\n", BUILDSTRING);
-	printf("Architecture: %s\n", CPUSTRING);
+	printf("Platform: %s\n", OSTYPE);
+	printf("Architecture: %s\n", ARCH);
 
 	/* Seed PRNG */
 	randk_seed();
diff --git a/src/backends/unix/signalhandler.c b/src/backends/unix/signalhandler.c
index ec36e8d..2f802df 100644
--- a/src/backends/unix/signalhandler.c
+++ b/src/backends/unix/signalhandler.c
@@ -49,8 +49,8 @@ printBacktrace(int sig)
 
 	printf("Product:      Yamagi Quake II\n");
 	printf("Version:      %s\n", YQ2VERSION);
-	printf("Plattform:    %s\n", BUILDSTRING);
-	printf("Architecture: %s\n", CPUSTRING);
+	printf("Plattform:    %s\n", OSTYPE);
+	printf("Architecture: %s\n", ARCH);
 	printf("Compiler:     %s\n", __VERSION__);
 	printf("Signal:       %i\n", sig);
 	printf("\nBacktrace:\n");
@@ -70,8 +70,8 @@ printBacktrace(int sig)
 {
 	printf("Product:      Yamagi Quake II\n");
 	printf("Version:      %s\n", YQ2VERSION);
-	printf("Plattform:    %s\n", BUILDSTRING);
-	printf("Architecture: %s\n", CPUSTRING);
+	printf("Plattform:    %s\n", OSTYPE);
+	printf("Architecture: %s\n", ARCH);
 	printf("Compiler:     %s\n", __VERSION__);
 	printf("Signal:       %i\n", sig);
 	printf("\nBacktrace:\n");
diff --git a/src/backends/windows/icon.rc b/src/backends/windows/icon.rc
new file mode 100644
index 0000000..576ae84
--- /dev/null
+++ b/src/backends/windows/icon.rc
@@ -0,0 +1 @@
+icon ICON "../../../stuff/icon/Quake2.ico"
diff --git a/src/backends/windows/system.c b/src/backends/windows/system.c
index b0e677f..3d73a06 100644
--- a/src/backends/windows/system.c
+++ b/src/backends/windows/system.c
@@ -739,8 +739,8 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
 #endif
 #endif
 
-	printf("Platform: %s\n", BUILDSTRING);
-	printf("Architecture: %s\n", CPUSTRING);
+	printf("Platform: %s\n", OSTYPE);
+	printf("Architecture: %s\n", ARCH);
 
 	/* Seed PRNG */
 	randk_seed();
diff --git a/src/client/cl_console.c b/src/client/cl_console.c
index ba73d14..dfd1b25 100644
--- a/src/client/cl_console.c
+++ b/src/client/cl_console.c
@@ -261,8 +261,9 @@ Con_CheckResize(void)
 {
 	int i, j, width, oldwidth, oldtotallines, numlines, numchars;
 	char tbuf[CON_TEXTSIZE];
+	float scale = SCR_GetConsoleScale();
 
-	width = (viddef.width >> 3) - 2;
+	width = ((int)(viddef.width / scale) >> 3) - 2;
 
 	if (width == con.linewidth)
 	{
@@ -610,6 +611,7 @@ Con_DrawConsole(float frac)
 {
 	int i, j, x, y, n;
 	int rows;
+	int verLen;
 	char *text;
 	int row;
 	int lines;
@@ -643,9 +645,11 @@ Con_DrawConsole(float frac)
 
 	Com_sprintf(version, sizeof(version), "Yamagi Quake II v%s", YQ2VERSION);
 
-	for (x = 0; x < 21; x++)
+	verLen = strlen(version);
+
+	for (x = 0; x < verLen; x++)
 	{
-		Draw_CharScaled(viddef.width - (173 * scale) + x * 8 * scale, lines - 35 * scale, 128 + version[x], scale);
+		Draw_CharScaled(viddef.width - ((verLen*8+5) * scale) + x * 8 * scale, lines - 35 * scale, 128 + version[x], scale);
 	}
 
 	t = time(NULL);
diff --git a/src/client/cl_entities.c b/src/client/cl_entities.c
index d87fa9d..1fd6eb7 100644
--- a/src/client/cl_entities.c
+++ b/src/client/cl_entities.c
@@ -758,7 +758,13 @@ CL_CalcViewValues(void)
 		ops = ps; /* don't interpolate */
 	}
 
-	lerp = cl.lerpfrac;
+	if(cl_paused->value){
+		lerp = 1.0f;
+	}
+	else
+	{
+		lerp = cl.lerpfrac;
+	}
 
 	/* calculate the origin */
 	if ((cl_predict->value) && !(cl.frame.playerstate.pmove.pm_flags & PMF_NO_PREDICTION))
diff --git a/src/client/cl_keyboard.c b/src/client/cl_keyboard.c
index 59ea4b8..c081924 100644
--- a/src/client/cl_keyboard.c
+++ b/src/client/cl_keyboard.c
@@ -966,10 +966,19 @@ Char_Event(int key)
 			break;
 
 		/* Console */
-		case key_game:
 		case key_console:
 			Key_Console(key);
 			break;
+
+		/* Console is really open but key_dest is game anyway (not connected) */
+		case key_game:
+			if(cls.state == ca_disconnected || cls.state == ca_connecting)
+				Key_Console(key);
+
+			break;
+
+		default:
+			break;
 	}
 }
 
diff --git a/src/client/cl_main.c b/src/client/cl_main.c
index a6869e6..f2035ec 100644
--- a/src/client/cl_main.c
+++ b/src/client/cl_main.c
@@ -95,6 +95,11 @@ cvar_t *hand;
 cvar_t *gender;
 cvar_t *gender_auto;
 
+
+cvar_t	*gl_stereo;
+cvar_t	*gl_stereo_separation;
+cvar_t	*gl_stereo_convergence;
+
 cvar_t *cl_vwep;
 
 client_static_t cls;
@@ -529,6 +534,10 @@ CL_InitLocal(void)
 	cl_paused = Cvar_Get("paused", "0", 0);
 	cl_timedemo = Cvar_Get("timedemo", "0", 0);
 
+	gl_stereo = Cvar_Get( "gl_stereo", "0", CVAR_ARCHIVE );
+	gl_stereo_separation = Cvar_Get( "gl_stereo_separation", "1", CVAR_ARCHIVE );
+	gl_stereo_convergence = Cvar_Get( "gl_stereo_convergence", "1.4", CVAR_ARCHIVE );
+
 	rcon_client_password = Cvar_Get("rcon_password", "", 0);
 	rcon_address = Cvar_Get("rcon_address", "", 0);
 
diff --git a/src/client/cl_screen.c b/src/client/cl_screen.c
index 85f2083..5459db2 100644
--- a/src/client/cl_screen.c
+++ b/src/client/cl_screen.c
@@ -435,8 +435,8 @@ SCR_Init(void)
 	scr_graphshift = Cvar_Get("graphshift", "0", 0);
 	scr_drawall = Cvar_Get("scr_drawall", "0", 0);
 	gl_hudscale = Cvar_Get("gl_hudscale", "-1", CVAR_ARCHIVE);
-	gl_consolescale = Cvar_Get("gl_consolescale", "1", CVAR_ARCHIVE);
-	gl_menuscale = Cvar_Get("gl_menuscale", "1", CVAR_ARCHIVE);
+	gl_consolescale = Cvar_Get("gl_consolescale", "-1", CVAR_ARCHIVE);
+	gl_menuscale = Cvar_Get("gl_menuscale", "-1", CVAR_ARCHIVE);
 
 	/* register our commands */
 	Cmd_AddCommand("timerefresh", SCR_TimeRefresh_f);
@@ -492,7 +492,6 @@ SCR_DrawLoading(void)
 		return;
 	}
 
-	scr_draw_loading = false;
 	Draw_GetPicSize(&w, &h, "loading");
 	Draw_PicScaled((viddef.width - w * scale) / 2, (viddef.height - h * scale) / 2, "loading", scale);
 }
@@ -609,6 +608,9 @@ SCR_BeginLoadingPlaque(void)
 	}
 
 	SCR_UpdateScreen();
+
+	scr_draw_loading = false;
+
 	SCR_StopCinematic();
 	cls.disable_screen = Sys_Milliseconds();
 	cls.disable_servercount = cl.servercount;
@@ -1441,9 +1443,18 @@ SCR_UpdateScreen(void)
 		return; /* not initialized yet */
 	}
 
-	separation[0] = 0;
-	separation[1] = 0;
-	numframes = 1;
+	if ( gl_stereo->value )
+	{
+		numframes = 2;
+		separation[0] = -gl_stereo_separation->value / 2;
+		separation[1] = +gl_stereo_separation->value / 2;
+	}		
+	else
+	{
+		separation[0] = 0;
+		separation[1] = 0;
+		numframes = 1;
+	}
 
 	for (i = 0; i < numframes; i++)
 	{
@@ -1454,8 +1465,14 @@ SCR_UpdateScreen(void)
 			/* loading plaque over black screen */
 			int w, h;
 
-			R_SetPalette(NULL);
-			scr_draw_loading = false;
+			if(i == 0){
+				R_SetPalette(NULL);
+			}
+
+			if(i == numframes - 1){
+				scr_draw_loading = false;
+			}
+
 			Draw_GetPicSize(&w, &h, "loading");
 			Draw_PicScaled((viddef.width - w * scale) / 2, (viddef.height - h * scale) / 2, "loading", scale);
 		}
@@ -1552,7 +1569,32 @@ SCR_UpdateScreen(void)
 	GLimp_EndFrame();
 }
 
-float
+static float
+SCR_ClampScale(float scale)
+{
+	float f;
+
+	f = viddef.width / 320.0f;
+	if (scale > f)
+	{
+		scale = f;
+	}
+
+	f = viddef.height / 240.0f;
+	if (scale > f)
+	{
+		scale = f;
+	}
+
+	if (scale < 1)
+	{
+		scale = 1;
+	}
+
+	return scale;
+}
+
+static float
 SCR_GetDefaultScale(void)
 {
 	int i = viddef.width / 640;
@@ -1597,11 +1639,11 @@ SCR_DrawCrosshair(void)
 	}
 	else
 	{
-		scale = crosshair_scale->value;
+		scale = SCR_ClampScale(crosshair_scale->value);
 	}
 
-	Draw_PicScaled(scr_vrect.x + ((scr_vrect.width - crosshair_width) >> 1),
-			scr_vrect.y + ((scr_vrect.height - crosshair_height) >> 1),
+	Draw_PicScaled(scr_vrect.x + (scr_vrect.width - crosshair_width * scale) / 2,
+			scr_vrect.y + (scr_vrect.height - crosshair_height * scale) / 2,
 			crosshair_pic, scale);
 }
 
@@ -1610,13 +1652,21 @@ SCR_GetHUDScale(void)
 {
 	float scale;
 
-	if (gl_hudscale->value < 0)
+	if (!scr_initialized)
+	{
+		scale = 1;
+	}
+	else if (gl_hudscale->value < 0)
 	{
 		scale = SCR_GetDefaultScale();
 	}
+	else if (gl_hudscale->value == 0) /* HACK: allow scale 0 to hide the HUD */
+	{
+		scale = 0;
+	}
 	else
 	{
-		scale = gl_hudscale->value;
+		scale = SCR_ClampScale(gl_hudscale->value);
 	}
 
 	return scale;
@@ -1627,13 +1677,17 @@ SCR_GetConsoleScale(void)
 {
 	float scale;
 
-	if (gl_consolescale->value < 0)
+	if (!scr_initialized)
+	{
+		scale = 1;
+	}
+	else if (gl_consolescale->value < 0)
 	{
 		scale = SCR_GetDefaultScale();
 	}
 	else
 	{
-		scale = gl_consolescale->value;
+		scale = SCR_ClampScale(gl_consolescale->value);
 	}
 
 	return scale;
@@ -1644,13 +1698,17 @@ SCR_GetMenuScale(void)
 {
 	float scale;
 
-	if (gl_menuscale->value < 0)
+	if (!scr_initialized)
+	{
+		scale = 1;
+	}
+	else if (gl_menuscale->value < 0)
 	{
 		scale = SCR_GetDefaultScale();
 	}
 	else
 	{
-		scale = gl_menuscale->value;
+		scale = SCR_ClampScale(gl_menuscale->value);
 	}
 
 	return scale;
diff --git a/src/client/cl_view.c b/src/client/cl_view.c
index b8b06e8..e2e07d6 100644
--- a/src/client/cl_view.c
+++ b/src/client/cl_view.c
@@ -31,11 +31,17 @@ int gun_frame;
 struct model_s *gun_model;
 
 cvar_t *crosshair;
+cvar_t *crosshair_3d;
+cvar_t *crosshair_3d_glow;
+
 cvar_t *crosshair_scale;
 cvar_t *cl_testparticles;
 cvar_t *cl_testentities;
 cvar_t *cl_testlights;
 cvar_t *cl_testblend;
+cvar_t *crosshair_3d_glow_r;
+cvar_t *crosshair_3d_glow_g;
+cvar_t *crosshair_3d_glow_b;
 
 cvar_t *cl_stats;
 
@@ -53,6 +59,8 @@ lightstyle_t r_lightstyles[MAX_LIGHTSTYLES];
 char cl_weaponmodels[MAX_CLIENTWEAPONMODELS][MAX_QPATH];
 int num_cl_weaponmodels;
 
+void V_Render3dCrosshair(void);
+
 /*
  * Specifies the model that will be used as the world
  */
@@ -494,6 +502,9 @@ V_RenderView(float stereo_separation)
 		   v_forward, etc. */
 		CL_AddEntities();
 
+		// before changing viewport we should trace the crosshair position
+		V_Render3dCrosshair();
+
 		if (cl_testparticles->value)
 		{
 			V_TestParticles();
@@ -519,6 +530,7 @@ V_RenderView(float stereo_separation)
 
 		/* offset vieworg appropriately if
 		   we're doing stereo separation */
+
 		if (stereo_separation != 0)
 		{
 			vec3_t tmp;
@@ -572,7 +584,19 @@ V_RenderView(float stereo_separation)
 		qsort(cl.refdef.entities, cl.refdef.num_entities,
 				sizeof(cl.refdef.entities[0]), (int (*)(const void *, const void *))
 				entitycmpfnc);
-	}
+	} else if (cl.frame.valid && cl_paused->value && gl_stereo->value) {
+		// We need to adjust the refdef in stereo mode when paused.  
+		vec3_t tmp;  
+		CL_CalcViewValues();  
+		VectorScale( cl.v_right, stereo_separation, tmp );  
+		VectorAdd( cl.refdef.vieworg, tmp, cl.refdef.vieworg );  
+		  
+		cl.refdef.vieworg[0] += 1.0/16;  
+		cl.refdef.vieworg[1] += 1.0/16;  
+		cl.refdef.vieworg[2] += 1.0/16;  
+
+		cl.refdef.time = cl.time*0.001;  
+	}  
 
 	cl.refdef.x = scr_vrect.x;
 	cl.refdef.y = scr_vrect.y;
@@ -602,6 +626,52 @@ V_RenderView(float stereo_separation)
 	SCR_DrawCrosshair();
 }
 
+void 
+V_Render3dCrosshair(void)
+{
+	trace_t crosshair_trace;
+	vec3_t end;
+
+	crosshair_3d = Cvar_Get("crosshair_3d", "0", CVAR_ARCHIVE);
+	crosshair_3d_glow = Cvar_Get("crosshair_3d_glow", "0", CVAR_ARCHIVE);
+	
+
+	if(crosshair_3d->value || crosshair_3d_glow->value){
+		VectorMA(cl.refdef.vieworg,8192,cl.v_forward,end);
+		crosshair_trace = CL_PMTrace(cl.refdef.vieworg, vec3_origin, vec3_origin, end);
+
+		if(crosshair_3d_glow->value){
+			crosshair_3d_glow_r = Cvar_Get("crosshair_3d_glow_r", "5", CVAR_ARCHIVE);
+			crosshair_3d_glow_g = Cvar_Get("crosshair_3d_glow_g", "1", CVAR_ARCHIVE);
+			crosshair_3d_glow_b = Cvar_Get("crosshair_3d_glow_b", "4", CVAR_ARCHIVE);
+
+			V_AddLight(
+				crosshair_trace.endpos, 
+				crosshair_3d_glow->value, 
+				crosshair_3d_glow_r->value, 
+				crosshair_3d_glow_g->value, 
+				crosshair_3d_glow_b->value
+			);
+		}
+
+		if(crosshair_3d->value){
+			entity_t crosshair_ent = {0};
+
+			crosshair_ent.origin[0] = crosshair_trace.endpos[0];
+			crosshair_ent.origin[1] = crosshair_trace.endpos[1];
+			crosshair_ent.origin[2] = crosshair_trace.endpos[2];
+
+			crosshair_ent.model = R_RegisterModel("models/crosshair/tris.md2");
+			//crosshair_ent.skin = R_RegisterSkin("models/crosshair/skin.pcx");
+
+			AngleVectors2(crosshair_trace.plane.normal, crosshair_ent.angles);
+			crosshair_ent.flags = RF_DEPTHHACK | RF_FULLBRIGHT | RF_NOSHADOW;
+
+			V_AddEntity(&crosshair_ent);
+		}
+	}
+}
+
 void
 V_Viewpos_f(void)
 {
@@ -620,7 +690,7 @@ V_Init(void)
 	Cmd_AddCommand("viewpos", V_Viewpos_f);
 
 	crosshair = Cvar_Get("crosshair", "0", CVAR_ARCHIVE);
-	crosshair_scale = Cvar_Get("crosshair_scale", "1", CVAR_ARCHIVE);
+	crosshair_scale = Cvar_Get("crosshair_scale", "-1", CVAR_ARCHIVE);
 	cl_testblend = Cvar_Get("cl_testblend", "0", 0);
 	cl_testparticles = Cvar_Get("cl_testparticles", "0", 0);
 	cl_testentities = Cvar_Get("cl_testentities", "0", 0);
diff --git a/src/client/header/client.h b/src/client/header/client.h
index 9a3195d..e1586e4 100644
--- a/src/client/header/client.h
+++ b/src/client/header/client.h
@@ -247,8 +247,9 @@ typedef struct
 extern client_static_t	cls;
 
 /* cvars */
-extern	cvar_t	*cl_stereo_separation;
-extern	cvar_t	*cl_stereo;
+extern	cvar_t	*gl_stereo_separation;
+extern	cvar_t	*gl_stereo_convergence;
+extern	cvar_t	*gl_stereo;
 extern	cvar_t	*cl_gun;
 extern	cvar_t	*cl_add_blend;
 extern	cvar_t	*cl_add_lights;
@@ -399,6 +400,7 @@ void CL_RunParticles (void);
 void CL_RunDLights (void);
 void CL_RunLightStyles (void);
 
+void CL_CalcViewValues(void);
 void CL_AddEntities (void);
 void CL_AddDLights (void);
 void CL_AddTEnts (void);
@@ -506,5 +508,6 @@ void CL_KeyInventory (int key);
 void CL_DrawInventory (void);
 
 void CL_PredictMovement (void);
+trace_t CL_PMTrace(vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end);
 
 #endif
diff --git a/src/client/menu/menu.c b/src/client/menu/menu.c
index c73f5c5..57ded35 100644
--- a/src/client/menu/menu.c
+++ b/src/client/menu/menu.c
@@ -334,7 +334,7 @@ static void
 M_DrawCharacter(int cx, int cy, int num)
 {
 	float scale = SCR_GetMenuScale();
-	Draw_CharScaled(cx + ((viddef.width - 320 * (int)scale) >> 1), cy + ((viddef.height - 240 * (int)scale) >> 1), num, scale);
+	Draw_CharScaled(cx + ((int)(viddef.width - 320 * scale) >> 1), cy + ((int)(viddef.height - 240 * scale) >> 1), num, scale);
 }
 
 static void
@@ -987,13 +987,11 @@ static menulist_s s_options_lookspring_box;
 static menulist_s s_options_lookstrafe_box;
 static menulist_s s_options_crosshair_box;
 static menuslider_s s_options_sfxvolume_slider;
-#ifdef CDA
-static menulist_s s_options_enablecd_box;
-#endif
 #if defined(OGG) || defined(CDA)
 static menulist_s s_options_cdshuffle_box;
 #endif
 #ifdef OGG
+static menuslider_s s_options_oggvolume_slider;
 static menulist_s s_options_enableogg_box;
 #endif
 static menulist_s s_options_quality_list;
@@ -1050,15 +1048,12 @@ ControlsSetMenuItemValues(void)
 {
     s_options_sfxvolume_slider.curvalue = Cvar_VariableValue("s_volume") * 10;
 
-#ifdef CDA
-    s_options_enablecd_box.curvalue = (Cvar_VariableValue("cd_nocd") == 0);
-#endif
-
 #if defined(OGG) || defined(CDA)
     s_options_cdshuffle_box.curvalue = (Cvar_VariableValue("cd_shuffle") != 0);
 #endif
 
 #ifdef OGG
+    s_options_oggvolume_slider.curvalue = Cvar_VariableValue("ogg_volume") * 10;
     s_options_enableogg_box.curvalue = (Cvar_VariableValue("ogg_enable") != 0);
 
     cvar_t *ogg;
@@ -1169,41 +1164,14 @@ CDShuffleFunc(void *unused)
 
 #endif
 
-#ifdef CDA
-static void
-EnableCDMusic(void *unused)
-{
-    Cvar_SetValue("cd_nocd", (float)!s_options_enablecd_box.curvalue);
-#ifdef OGG
-    Cvar_SetValue("ogg_enable", 0);
-#endif
-
-    if (s_options_enablecd_box.curvalue)
-    {
 #ifdef OGG
-        OGG_Shutdown();
-#endif
-        CDAudio_Init();
 
-        if (s_options_cdshuffle_box.curvalue)
-        {
-            CDAudio_RandomPlay();
-        }
-        else
-        {
-            CDAudio_Play((int)strtol(cl.configstrings[CS_CDTRACK],
-                                     (char **)NULL, 10), true);
-        }
-    }
-    else
-    {
-        CDAudio_Stop();
-    }
+static void
+UpdateOggVolumeFunc(void *unused)
+{
+    Cvar_SetValue("ogg_volume", s_options_oggvolume_slider.curvalue / 10);
 }
 
-#endif
-
-#ifdef OGG
 static void
 EnableOGGMusic(void *unused)
 {
@@ -1293,14 +1261,6 @@ UpdateSoundQualityFunc(void *unused)
 static void
 Options_MenuInit(void)
 {
-#ifdef CDA
-    static const char *cd_music_items[] =
-    {
-        "disabled",
-        "enabled",
-        0
-    };
-#endif
 
 #ifdef OGG
     static const char *ogg_music_items[] =
@@ -1356,16 +1316,15 @@ Options_MenuInit(void)
     s_options_sfxvolume_slider.minvalue = 0;
     s_options_sfxvolume_slider.maxvalue = 10;
 
-#ifdef CDA
-    s_options_enablecd_box.generic.type = MTYPE_SPINCONTROL;
-    s_options_enablecd_box.generic.x = 0;
-    s_options_enablecd_box.generic.y = 10;
-    s_options_enablecd_box.generic.name = "CD music";
-    s_options_enablecd_box.generic.callback = EnableCDMusic;
-    s_options_enablecd_box.itemnames = cd_music_items;
-#endif
-
 #ifdef OGG
+    s_options_oggvolume_slider.generic.type = MTYPE_SLIDER;
+    s_options_oggvolume_slider.generic.x = 0;
+    s_options_oggvolume_slider.generic.y = 10;
+    s_options_oggvolume_slider.generic.name = "OGG volume";
+    s_options_oggvolume_slider.generic.callback = UpdateOggVolumeFunc;
+    s_options_oggvolume_slider.minvalue = 0;
+    s_options_oggvolume_slider.maxvalue = 10;
+
     s_options_enableogg_box.generic.type = MTYPE_SPINCONTROL;
     s_options_enableogg_box.generic.x = 0;
     s_options_enableogg_box.generic.y = 20;
@@ -1461,10 +1420,9 @@ Options_MenuInit(void)
     ControlsSetMenuItemValues();
 
     Menu_AddItem(&s_options_menu, (void *)&s_options_sfxvolume_slider);
-#ifdef CDA
-    Menu_AddItem(&s_options_menu, (void *)&s_options_enablecd_box);
-#endif
+
 #ifdef OGG
+    Menu_AddItem(&s_options_menu, (void *)&s_options_oggvolume_slider);
     Menu_AddItem(&s_options_menu, (void *)&s_options_enableogg_box);
 #endif
 #if defined(OGG) || defined(CDA)
@@ -2648,10 +2606,7 @@ JoinServer_MenuInit(void)
 
     s_joinserver_server_title.generic.type = MTYPE_SEPARATOR;
     s_joinserver_server_title.generic.name = "connect to...";
-	if (scale > 1)
-		s_joinserver_server_title.generic.x = 80 * scale + (scale * 8);
-	else
-		s_joinserver_server_title.generic.x = 80;
+    s_joinserver_server_title.generic.x = 80 * scale;
     s_joinserver_server_title.generic.y = 30;
 
     for (i = 0; i < MAX_LOCAL_SERVERS; i++)
@@ -3661,7 +3616,7 @@ AddressBook_MenuInit(void)
     int i;
 	float scale = SCR_GetMenuScale();
 
-    s_addressbook_menu.x = viddef.width / scale / 2 - 142 / scale;
+    s_addressbook_menu.x = viddef.width / 2 - (142 * scale);
     s_addressbook_menu.y = viddef.height / (2 * scale) - 58;
     s_addressbook_menu.nitems = 0;
 
diff --git a/src/client/menu/qmenu.c b/src/client/menu/qmenu.c
index d7cd100..6f58333 100644
--- a/src/client/menu/qmenu.c
+++ b/src/client/menu/qmenu.c
@@ -59,22 +59,20 @@ Action_DoEnter(menuaction_s *a)
 void
 Action_Draw(menuaction_s *a)
 {
-    float scale = SCR_GetMenuScale();
+	float scale = SCR_GetMenuScale();
 
 	if (a->generic.flags & QMF_LEFT_JUSTIFY)
 	{
 		if (a->generic.flags & QMF_GRAYED)
 		{
 			Menu_DrawStringDark(a->generic.x + a->generic.parent->x + (LCOLUMN_OFFSET * scale),
-                    a->generic.y + a->generic.parent->y,
-					a->generic.name);
+					a->generic.y + a->generic.parent->y, a->generic.name);
 		}
 
 		else
 		{
 			Menu_DrawString(a->generic.x + a->generic.parent->x + (LCOLUMN_OFFSET * scale),
-                    a->generic.y + a->generic.parent->y,
-					a->generic.name);
+					a->generic.y + a->generic.parent->y, a->generic.name);
 		}
 	}
 	else
@@ -82,15 +80,13 @@ Action_Draw(menuaction_s *a)
 		if (a->generic.flags & QMF_GRAYED)
 		{
 			Menu_DrawStringR2LDark(a->generic.x + a->generic.parent->x + (LCOLUMN_OFFSET * scale),
-                    a->generic.y + a->generic.parent->y,
-					a->generic.name);
+					a->generic.y + a->generic.parent->y, a->generic.name);
 		}
 
 		else
 		{
 			Menu_DrawStringR2L(a->generic.x + a->generic.parent->x + (LCOLUMN_OFFSET * scale),
-                    a->generic.y + a->generic.parent->y,
-					a->generic.name);
+					a->generic.y + a->generic.parent->y, a->generic.name);
 		}
 	}
 
@@ -139,9 +135,9 @@ Field_Draw(menufield_s *f)
 			(f->generic.y + f->generic.parent->y + 4) * scale, 24, scale);
 
 	Draw_CharScaled((f->generic.x + f->generic.parent->x + 24 * scale) + (f->visible_length * 8 * scale),
-            (f->generic.y + f->generic.parent->y - 4) * scale, 20, scale);
+			(f->generic.y + f->generic.parent->y - 4) * scale, 20, scale);
 	Draw_CharScaled((f->generic.x + f->generic.parent->x + 24 * scale) + (f->visible_length * 8 * scale),
-            (f->generic.y + f->generic.parent->y + 4) * scale, 26, scale);
+			(f->generic.y + f->generic.parent->y + 4) * scale, 26, scale);
 
 	for (i = 0; i < f->visible_length; i++)
 	{
@@ -171,14 +167,14 @@ Field_Draw(menufield_s *f)
 		if (((int)(Sys_Milliseconds() / 250)) & 1)
 		{
 			Draw_CharScaled(
-                f->generic.x + f->generic.parent->x + 24 * scale + (offset * 8 * scale),
-                (f->generic.y + f->generic.parent->y) * scale, 11, scale);
+				f->generic.x + f->generic.parent->x + 24 * scale + (offset * 8 * scale),
+				(f->generic.y + f->generic.parent->y) * scale, 11, scale);
 		}
 		else
 		{
 			Draw_CharScaled(
-                f->generic.x + f->generic.parent->x + 24 * scale + (offset * 8 * scale),
-                (f->generic.y + f->generic.parent->y) * scale, ' ', scale);
+				f->generic.x + f->generic.parent->x + 24 * scale + (offset * 8 * scale),
+				(f->generic.y + f->generic.parent->y) * scale, ' ', scale);
 		}
 	}
 }
@@ -392,7 +388,7 @@ Menu_Center(menuframework_s *menu)
 	height = ((menucommon_s *)menu->items[menu->nitems - 1])->y;
 	height += 10;
 
-    menu->y = (VID_HEIGHT / scale - height) / 2;
+	menu->y = (VID_HEIGHT / scale - height) / 2;
 }
 
 void
@@ -444,13 +440,13 @@ Menu_Draw(menuframework_s *menu)
 		{
 			Draw_CharScaled(menu->x + (item->x / scale - 24 + item->cursor_offset) * scale,
 					(menu->y + item->y) * scale,
-                    12 + ((int)(Sys_Milliseconds() / 250) & 1), scale);
+					12 + ((int)(Sys_Milliseconds() / 250) & 1), scale);
 		}
 		else
 		{
 			Draw_CharScaled(menu->x + (item->cursor_offset) * scale,
-                    (menu->y + item->y) * scale,
-				   	12 + ((int)(Sys_Milliseconds() / 250) & 1), scale);
+					(menu->y + item->y) * scale,
+					12 + ((int)(Sys_Milliseconds() / 250) & 1), scale);
 		}
 	}
 
@@ -485,7 +481,7 @@ Menu_DrawStatusBar(const char *string)
 	if (string)
 	{
 		int l = (int)strlen(string);
-        float col = (VID_WIDTH / 2) - (l*8 / 2) * scale;
+		float col = (VID_WIDTH / 2) - (l*8 / 2) * scale;
 
 		Draw_Fill(0, VID_HEIGHT - 8 * scale, VID_WIDTH, 8 * scale, 4);
 		Menu_DrawString(col, VID_HEIGHT / scale - 8, string);
@@ -638,7 +634,7 @@ MenuList_Draw(menulist_s *l)
 {
 	const char **n;
 	int y = 0;
-    float scale = SCR_GetMenuScale();
+	float scale = SCR_GetMenuScale();
 
 	Menu_DrawStringR2LDark(l->generic.x + l->generic.parent->x
 			+ LCOLUMN_OFFSET * scale, l->generic.y + l->generic.parent->y,
@@ -758,7 +754,7 @@ void
 SpinControl_Draw(menulist_s *s)
 {
 	char buffer[100];
-    float scale = SCR_GetMenuScale();
+	float scale = SCR_GetMenuScale();
 
 	if (s->generic.name)
 	{
diff --git a/src/client/menu/videomenu.c b/src/client/menu/videomenu.c
index e43111f..051378f 100644
--- a/src/client/menu/videomenu.c
+++ b/src/client/menu/videomenu.c
@@ -28,12 +28,13 @@
 #include "../../client/header/client.h"
 #include "../../client/menu/header/qmenu.h"
 
-#define CUSTOM_MODE 24
-
 extern void M_ForceMenuOff(void);
 
 static cvar_t *gl_mode;
 static cvar_t *gl_hudscale;
+static cvar_t *gl_consolescale;
+static cvar_t *gl_menuscale;
+static cvar_t *crosshair_scale;
 static cvar_t *fov;
 extern cvar_t *scr_viewsize;
 extern cvar_t *vid_gamma;
@@ -46,7 +47,7 @@ static menuframework_s s_opengl_menu;
 
 static menulist_s s_mode_list;
 static menulist_s s_aspect_list;
-static menulist_s s_hudscale_list;
+static menulist_s s_uiscale_list;
 static menuslider_s s_screensize_slider;
 static menuslider_s s_brightness_slider;
 static menulist_s s_fs_box;
@@ -56,6 +57,27 @@ static menulist_s s_msaa_list;
 static menuaction_s s_defaults_action;
 static menuaction_s s_apply_action;
 
+static int
+GetCustomValue(menulist_s *list)
+{
+	static menulist_s *last;
+	static int i;
+
+	if (list != last)
+	{
+		last = list;
+		i = list->curvalue;
+		do
+		{
+			i++;
+		}
+		while (list->itemnames[i]);
+		i--;
+	}
+
+	return i;
+}
+
 static void
 ScreenSizeCallback(void *s)
 {
@@ -100,7 +122,7 @@ ApplyChanges(void *unused)
 	qboolean restart = false;
 
 	/* custom mode */
-	if (s_mode_list.curvalue != CUSTOM_MODE)
+	if (s_mode_list.curvalue != GetCustomValue(&s_mode_list))
 	{
 		/* Restarts automatically */
 		Cvar_SetValue("gl_mode", s_mode_list.curvalue);
@@ -161,30 +183,21 @@ ApplyChanges(void *unused)
 		}
 	}
 
-	/* HUD scaling */
-	if (s_hudscale_list.curvalue == 0)
-	{
-		Cvar_SetValue("gl_hudscale", 1);
-	}
-	else if (s_hudscale_list.curvalue == 1)
+	/* UI scaling */
+	if (s_uiscale_list.curvalue == 0)
 	{
 		Cvar_SetValue("gl_hudscale", -1);
 	}
-	else if (s_hudscale_list.curvalue == 2)
-	{
-		Cvar_SetValue("gl_hudscale", 1.5);
-	}
-	else if (s_hudscale_list.curvalue == 3)
+	else if (s_uiscale_list.curvalue < GetCustomValue(&s_uiscale_list))
 	{
-		Cvar_SetValue("gl_hudscale", 2);
+		Cvar_SetValue("gl_hudscale", s_uiscale_list.curvalue);
 	}
-	else if (s_hudscale_list.curvalue == 4)
-	{
-		Cvar_SetValue("gl_hudscale", 2.5);
-	}
-	else if (s_hudscale_list.curvalue == 5)
+
+	if (s_uiscale_list.curvalue != GetCustomValue(&s_uiscale_list))
 	{
-		Cvar_SetValue("gl_hudscale", 3);
+		Cvar_SetValue("gl_consolescale", gl_hudscale->value);
+		Cvar_SetValue("gl_menuscale", gl_hudscale->value);
+		Cvar_SetValue("crosshair_scale", gl_hudscale->value);
 	}
 
 	/* Restarts automatically */
@@ -267,13 +280,15 @@ VID_MenuInit(void)
 		0
 	};
 
-	static const char *hudscale_names[] = {
-		"no (1x)",
+	static const char *uiscale_names[] = {
 		"auto",
-		"1.5x",
+		"1x",
 		"2x",
-		"2.5x",
-		"3.0x",
+		"3x",
+		"4x",
+		"5x",
+		"6x",
+		"custom",
 		0
 	};
 
@@ -301,6 +316,18 @@ VID_MenuInit(void)
 	{
 		gl_hudscale = Cvar_Get("gl_hudscale", "-1", CVAR_ARCHIVE);
 	}
+	if (!gl_consolescale)
+	{
+		gl_consolescale = Cvar_Get("gl_consolescale", "-1", CVAR_ARCHIVE);
+	}
+	if (!gl_menuscale)
+	{
+		gl_menuscale = Cvar_Get("gl_menuscale", "-1", CVAR_ARCHIVE);
+	}
+	if (!crosshair_scale)
+	{
+		crosshair_scale = Cvar_Get("crosshair_scale", "-1", CVAR_ARCHIVE);
+	}
 
 	if (!horplus)
 	{
@@ -351,7 +378,7 @@ VID_MenuInit(void)
 	}
 	else
 	{
-		s_mode_list.curvalue = CUSTOM_MODE;
+		s_mode_list.curvalue = GetCustomValue(&s_mode_list);
 	}
 
 	s_aspect_list.generic.type = MTYPE_SPINCONTROL;
@@ -381,37 +408,33 @@ VID_MenuInit(void)
 	}
 	else
 	{
-		s_aspect_list.curvalue = 5;
+		s_aspect_list.curvalue = GetCustomValue(&s_aspect_list);
 	}
 
-	s_hudscale_list.generic.type = MTYPE_SPINCONTROL;
-	s_hudscale_list.generic.name = "hud scale";
-	s_hudscale_list.generic.x = 0;
-	s_hudscale_list.generic.y = (y += 10);
-	s_hudscale_list.itemnames = hudscale_names;
-	if (gl_hudscale->value == 1)
+	s_uiscale_list.generic.type = MTYPE_SPINCONTROL;
+	s_uiscale_list.generic.name = "ui scale";
+	s_uiscale_list.generic.x = 0;
+	s_uiscale_list.generic.y = (y += 10);
+	s_uiscale_list.itemnames = uiscale_names;
+	if (gl_hudscale->value != gl_consolescale->value ||
+		gl_hudscale->value != gl_menuscale->value ||
+		gl_hudscale->value != crosshair_scale->value)
 	{
-		s_hudscale_list.curvalue = 0;
+		s_uiscale_list.curvalue = GetCustomValue(&s_uiscale_list);
 	}
 	else if (gl_hudscale->value < 0)
 	{
-		s_hudscale_list.curvalue = 1;
-	}
-	else if (gl_hudscale->value == 1.5f)
-	{
-		s_hudscale_list.curvalue = 2;
+		s_uiscale_list.curvalue = 0;
 	}
-	else if (gl_hudscale->value == 2)
+	else if (gl_hudscale->value > 0 &&
+			gl_hudscale->value < GetCustomValue(&s_uiscale_list) &&
+			gl_hudscale->value == (int)gl_hudscale->value)
 	{
-		s_hudscale_list.curvalue = 3;
+		s_uiscale_list.curvalue = gl_hudscale->value;
 	}
-	else if (gl_hudscale->value == 2.5f)
-	{
-		s_hudscale_list.curvalue = 4;
-	}
-	else if (gl_hudscale->value == 3)
+	else
 	{
-		s_hudscale_list.curvalue = 5;
+		s_uiscale_list.curvalue = GetCustomValue(&s_uiscale_list);
 	}
 
 	s_screensize_slider.generic.type = MTYPE_SLIDER;
@@ -493,7 +516,7 @@ VID_MenuInit(void)
 
 	Menu_AddItem(&s_opengl_menu, (void *)&s_mode_list);
 	Menu_AddItem(&s_opengl_menu, (void *)&s_aspect_list);
-	Menu_AddItem(&s_opengl_menu, (void *)&s_hudscale_list);
+	Menu_AddItem(&s_opengl_menu, (void *)&s_uiscale_list);
 	Menu_AddItem(&s_opengl_menu, (void *)&s_screensize_slider);
 	Menu_AddItem(&s_opengl_menu, (void *)&s_brightness_slider);
 	Menu_AddItem(&s_opengl_menu, (void *)&s_fs_box);
diff --git a/src/client/refresh/files/stb_image.h b/src/client/refresh/files/stb_image.h
index c3945c2..1a7ed68 100644
--- a/src/client/refresh/files/stb_image.h
+++ b/src/client/refresh/files/stb_image.h
@@ -443,12 +443,12 @@ STBIDEF stbi_uc *stbi_load_from_file  (FILE *f,                  int *x, int *y,
 #ifndef STBI_NO_HDR
    STBIDEF void   stbi_hdr_to_ldr_gamma(float gamma);
    STBIDEF void   stbi_hdr_to_ldr_scale(float scale);
-#endif
+#endif // STBI_NO_HDR
 
 #ifndef STBI_NO_LINEAR
    STBIDEF void   stbi_ldr_to_hdr_gamma(float gamma);
    STBIDEF void   stbi_ldr_to_hdr_scale(float scale);
-#endif // STBI_NO_HDR
+#endif // STBI_NO_LINEAR
 
 // stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR
 STBIDEF int    stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user);
@@ -1079,14 +1079,15 @@ STBIDEF int      stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void
    #endif
 }
 
-static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
+#ifndef STBI_NO_LINEAR
 static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
 
-#ifndef STBI_NO_LINEAR
 STBIDEF void   stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; }
 STBIDEF void   stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; }
 #endif
 
+static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
+
 STBIDEF void   stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; }
 STBIDEF void   stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; }
 
diff --git a/src/client/refresh/header/local.h b/src/client/refresh/header/local.h
index af213fe..a5befd1 100644
--- a/src/client/refresh/header/local.h
+++ b/src/client/refresh/header/local.h
@@ -117,6 +117,23 @@ typedef enum
 	it_sky
 } imagetype_t;
 
+enum stereo_modes {
+	STEREO_MODE_NONE,
+	STEREO_MODE_OPENGL,
+	STEREO_MODE_ANAGLYPH,
+	STEREO_MODE_ROW_INTERLEAVED,
+	STEREO_MODE_COLUMN_INTERLEAVED,
+	STEREO_MODE_PIXEL_INTERLEAVED,
+	STEREO_SPLIT_HORIZONTAL,
+	STEREO_SPLIT_VERTICAL,
+};
+
+enum opengl_special_buffer_modes {
+	OPENGL_SPECIAL_BUFFER_MODE_NONE,
+	OPENGL_SPECIAL_BUFFER_MODE_STEREO,
+	OPENGL_SPECIAL_BUFFER_MODE_STENCIL,
+};
+
 typedef struct image_s
 {
 	char name[MAX_QPATH];               /* game path, including extension */
@@ -382,7 +399,7 @@ typedef struct
 	int currenttmu;
 
 	float camera_separation;
-	qboolean stereo_enabled;
+	enum stereo_modes stereo_mode;
 
 	qboolean hwgamma;
 
diff --git a/src/client/refresh/r_draw.c b/src/client/refresh/r_draw.c
index 5fd71a7..0f3ed0b 100644
--- a/src/client/refresh/r_draw.c
+++ b/src/client/refresh/r_draw.c
@@ -33,14 +33,16 @@ void Scrap_Upload(void);
 
 extern unsigned r_rawpalette[256];
 
+static cvar_t *gl_nolerp_list;
+
 void
 Draw_InitLocal(void)
 {
-	/* load console characters (don't bilerp characters) */
+	/* don't bilerp characters and crosshairs */
+	gl_nolerp_list = Cvar_Get("gl_nolerp_list", "pics/conchars.pcx pics/ch1.pcx pics/ch2.pcx pics/ch3.pcx", 0);
+
+	/* load console characters */
 	draw_chars = R_FindImage("pics/conchars.pcx", it_pic);
-	R_Bind(draw_chars->texnum);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 }
 
 /*
diff --git a/src/client/refresh/r_image.c b/src/client/refresh/r_image.c
index 772e5a1..c4a1c5c 100644
--- a/src/client/refresh/r_image.c
+++ b/src/client/refresh/r_image.c
@@ -961,6 +961,7 @@ R_LoadPic(char *name, byte *pic, int width, int realwidth,
 {
 	image_t *image;
 	int i;
+	qboolean nolerp = (strstr(Cvar_VariableString("gl_nolerp_list"), name) != NULL);
 
 	/* find a free image_t */
 	for (i = 0, image = gltextures; i < numgltextures; i++, image++)
@@ -1001,7 +1002,7 @@ R_LoadPic(char *name, byte *pic, int width, int realwidth,
 	}
 
 	/* load little pics into the scrap */
-	if ((image->type == it_pic) && (bits == 8) &&
+	if (!nolerp && (image->type == it_pic) && (bits == 8) &&
 		(image->width < 64) && (image->height < 64))
 	{
 		int x, y;
@@ -1078,6 +1079,12 @@ R_LoadPic(char *name, byte *pic, int width, int realwidth,
 		image->sh = 1;
 		image->tl = 0;
 		image->th = 1;
+
+		if (nolerp)
+		{
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+		}
 	}
 
 	return image;
@@ -1325,7 +1332,8 @@ void
 R_InitImages(void)
 {
 	int i, j;
-	float g = vid_gamma->value;
+	// use 1/gamma so higher value is brighter, to match HW gamma settings
+	float g = 1.0f/vid_gamma->value;
 
 	registration_sequence = 1;
 
diff --git a/src/client/refresh/r_main.c b/src/client/refresh/r_main.c
index a421ec0..cedd0fc 100644
--- a/src/client/refresh/r_main.c
+++ b/src/client/refresh/r_main.c
@@ -142,6 +142,11 @@ cvar_t *gl_msaa_samples;
 cvar_t *vid_fullscreen;
 cvar_t *vid_gamma;
 
+cvar_t *gl_stereo;
+cvar_t *gl_stereo_separation;
+cvar_t *gl_stereo_anaglyph_colors;
+cvar_t *gl_stereo_convergence;
+
 /*
  * Returns true if the box is completely outside the frustom
  */
@@ -467,7 +472,10 @@ R_DrawParticles2(int num_particles, const particle_t particles[],
 void
 R_DrawParticles(void)
 {
-	if (gl_ext_pointparameters->value && qglPointParameterfEXT)
+	qboolean stereo_split_tb = ((gl_state.stereo_mode == STEREO_SPLIT_VERTICAL) && gl_state.camera_separation);
+	qboolean stereo_split_lr = ((gl_state.stereo_mode == STEREO_SPLIT_HORIZONTAL) && gl_state.camera_separation);
+
+	if (gl_ext_pointparameters->value && qglPointParameterfEXT && !(stereo_split_tb || stereo_split_lr))
 	{
 		int i;
 		unsigned char color[4];
@@ -678,8 +686,8 @@ R_MYgluPerspective(GLdouble fovy, GLdouble aspect,
 	xmin = ymin * aspect;
 	xmax = ymax * aspect;
 
-	xmin += -(2 * gl_state.camera_separation) / zNear;
-	xmax += -(2 * gl_state.camera_separation) / zNear;
+	xmin += - gl_stereo_convergence->value * (2 * gl_state.camera_separation) / zNear;
+	xmax += - gl_stereo_convergence->value * (2 * gl_state.camera_separation) / zNear;
 
 	glFrustum(xmin, xmax, ymin, ymax, zNear, zFar);
 }
@@ -700,6 +708,20 @@ R_SetupGL(void)
 	w = x2 - x;
 	h = y - y2;
 
+	qboolean drawing_left_eye = gl_state.camera_separation < 0;
+	qboolean stereo_split_tb = ((gl_state.stereo_mode == STEREO_SPLIT_VERTICAL) && gl_state.camera_separation);
+	qboolean stereo_split_lr = ((gl_state.stereo_mode == STEREO_SPLIT_HORIZONTAL) && gl_state.camera_separation);
+
+	if(stereo_split_lr) {
+		w = w / 2;
+		x = drawing_left_eye ? (x / 2) : (x + vid.width) / 2;
+	}
+
+	if(stereo_split_tb) {
+		h = h / 2;
+		y2 = drawing_left_eye ? (y2 + vid.height) / 2 : (y2 / 2);
+	}
+
 	glViewport(x, y2, w, h);
 
 	/* set up projection matrix */
@@ -749,13 +771,20 @@ R_SetupGL(void)
 void
 R_Clear(void)
 {
+	// Check whether the stencil buffer needs clearing, and do so if need be.
+	GLbitfield stencilFlags = 0;
+	if (gl_state.stereo_mode >= STEREO_MODE_ROW_INTERLEAVED && gl_state.stereo_mode <= STEREO_MODE_PIXEL_INTERLEAVED) {
+		glClearStencil(0);
+		stencilFlags |= GL_STENCIL_BUFFER_BIT;
+	}
+
 	if (gl_ztrick->value)
 	{
 		static int trickframe;
 
 		if (gl_clear->value)
 		{
-			glClear(GL_COLOR_BUFFER_BIT);
+			glClear(GL_COLOR_BUFFER_BIT | stencilFlags);
 		}
 
 		trickframe++;
@@ -777,11 +806,11 @@ R_Clear(void)
 	{
 		if (gl_clear->value)
 		{
-			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+			glClear(GL_COLOR_BUFFER_BIT | stencilFlags | GL_DEPTH_BUFFER_BIT);
 		}
 		else
 		{
-			glClear(GL_DEPTH_BUFFER_BIT);
+			glClear(GL_DEPTH_BUFFER_BIT | stencilFlags);
 		}
 
 		gldepthmin = 0;
@@ -817,12 +846,158 @@ R_Flash(void)
 	R_PolyBlend();
 }
 
+void
+R_SetGL2D(void)
+{
+	int x, w, y, h;
+	/* set 2D virtual screen size */
+	qboolean drawing_left_eye = gl_state.camera_separation < 0;
+	qboolean stereo_split_tb = ((gl_state.stereo_mode == STEREO_SPLIT_VERTICAL) && gl_state.camera_separation);
+	qboolean stereo_split_lr = ((gl_state.stereo_mode == STEREO_SPLIT_HORIZONTAL) && gl_state.camera_separation);
+
+	x = 0;
+	w = vid.width;
+	y = 0;
+	h = vid.height;
+
+	if(stereo_split_lr) {
+		w =  w / 2;
+		x = drawing_left_eye ? 0 : w;
+	}
+
+	if(stereo_split_tb) {
+		h =  h / 2;
+		y = drawing_left_eye ? h : 0;
+	}
+
+	glViewport(x, y, w, h);
+	glMatrixMode(GL_PROJECTION);
+	glLoadIdentity();
+	glOrtho(0, vid.width, vid.height, 0, -99999, 99999);
+	glMatrixMode(GL_MODELVIEW);
+	glLoadIdentity();
+	glDisable(GL_DEPTH_TEST);
+	glDisable(GL_CULL_FACE);
+	glDisable(GL_BLEND);
+	glEnable(GL_ALPHA_TEST);
+	glColor4f(1, 1, 1, 1);
+}
+
 /*
  * r_newrefdef must be set before the first call
  */
 void
 R_RenderView(refdef_t *fd)
 {
+	if ((gl_state.stereo_mode != STEREO_MODE_NONE) && gl_state.camera_separation) {
+
+		qboolean drawing_left_eye = gl_state.camera_separation < 0;
+		switch (gl_state.stereo_mode) {
+			case STEREO_MODE_ANAGLYPH:
+				{
+
+					// Work out the colour for each eye.
+					int anaglyph_colours[] = { 0x4, 0x3 }; // Left = red, right = cyan.
+
+					if (strlen(gl_stereo_anaglyph_colors->string) == 2) {
+						int eye, colour, missing_bits;
+						// Decode the colour name from its character.
+						for (eye = 0; eye < 2; ++eye) {
+							colour = 0;
+							switch (toupper(gl_stereo_anaglyph_colors->string[eye])) {
+								case 'B': ++colour; // 001 Blue
+								case 'G': ++colour; // 010 Green
+								case 'C': ++colour; // 011 Cyan
+								case 'R': ++colour; // 100 Red
+								case 'M': ++colour; // 101 Magenta
+								case 'Y': ++colour; // 110 Yellow
+									anaglyph_colours[eye] = colour;
+									break;
+							}
+						}
+						// Fill in any missing bits.
+						missing_bits = ~(anaglyph_colours[0] | anaglyph_colours[1]) & 0x3;
+						for (eye = 0; eye < 2; ++eye) {
+							anaglyph_colours[eye] |= missing_bits;
+						}
+					}
+
+					// Set the current colour.
+					glColorMask(
+						!!(anaglyph_colours[drawing_left_eye] & 0x4),
+						!!(anaglyph_colours[drawing_left_eye] & 0x2),
+						!!(anaglyph_colours[drawing_left_eye] & 0x1),
+						GL_TRUE
+					);
+				}
+				break;
+			case STEREO_MODE_ROW_INTERLEAVED:
+			case STEREO_MODE_COLUMN_INTERLEAVED:
+			case STEREO_MODE_PIXEL_INTERLEAVED:
+				{
+					qboolean flip_eyes = true;
+					int client_x, client_y;
+
+					//GLimp_GetClientAreaOffset(&client_x, &client_y);
+					client_x = 0;
+					client_y = 0;
+
+					R_SetGL2D();
+
+					glEnable(GL_STENCIL_TEST);
+					glStencilMask(GL_TRUE);
+					glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
+
+					glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP);
+					glStencilFunc(GL_NEVER, 0, 1);
+
+					glBegin(GL_QUADS);
+					{
+						glVertex2i(0, 0);
+						glVertex2i(vid.width, 0);
+						glVertex2i(vid.width, vid.height);
+						glVertex2i(0, vid.height);
+					}
+					glEnd();
+
+					glStencilOp(GL_INVERT, GL_KEEP, GL_KEEP);
+					glStencilFunc(GL_NEVER, 1, 1);
+
+					glBegin(GL_LINES);
+					{
+						if (gl_state.stereo_mode == STEREO_MODE_ROW_INTERLEAVED || gl_state.stereo_mode == STEREO_MODE_PIXEL_INTERLEAVED) {
+							int y;
+							for (y = 0; y <= vid.height; y += 2) {
+								glVertex2f(0, y - 0.5f);
+								glVertex2f(vid.width, y - 0.5f);
+							}
+							flip_eyes ^= (client_y & 1);
+						}
+
+						if (gl_state.stereo_mode == STEREO_MODE_COLUMN_INTERLEAVED || gl_state.stereo_mode == STEREO_MODE_PIXEL_INTERLEAVED) {
+							int x;
+							for (x = 0; x <= vid.width; x += 2) {
+								glVertex2f(x - 0.5f, 0);
+								glVertex2f(x - 0.5f, vid.height);
+							}
+							flip_eyes ^= (client_x & 1);
+						}
+					}
+					glEnd();
+
+					glStencilMask(GL_FALSE);
+					glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+
+					glStencilFunc(GL_EQUAL, drawing_left_eye ^ flip_eyes, 1);
+					glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+				}
+				break;
+			default:
+				break;
+		}
+	}
+
+
 	if (gl_norefresh->value)
 	{
 		return;
@@ -874,23 +1049,36 @@ R_RenderView(refdef_t *fd)
 				c_brush_polys, c_alias_polys, c_visible_textures,
 				c_visible_lightmaps);
 	}
+
+	switch (gl_state.stereo_mode) {
+		case STEREO_MODE_ANAGLYPH:
+			glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+			break;
+		case STEREO_MODE_ROW_INTERLEAVED:
+		case STEREO_MODE_COLUMN_INTERLEAVED:
+		case STEREO_MODE_PIXEL_INTERLEAVED:
+			glDisable(GL_STENCIL_TEST);
+			break;
+		default:
+			break;
+	}
 }
 
-void
-R_SetGL2D(void)
-{
-	/* set 2D virtual screen size */
-	glViewport(0, 0, vid.width, vid.height);
-	glMatrixMode(GL_PROJECTION);
-	glLoadIdentity();
-	glOrtho(0, vid.width, vid.height, 0, -99999, 99999);
-	glMatrixMode(GL_MODELVIEW);
-	glLoadIdentity();
-	glDisable(GL_DEPTH_TEST);
-	glDisable(GL_CULL_FACE);
-	glDisable(GL_BLEND);
-	glEnable(GL_ALPHA_TEST);
-	glColor4f(1, 1, 1, 1);
+enum opengl_special_buffer_modes GL_GetSpecialBufferModeForStereoMode(enum stereo_modes stereo_mode) {
+	switch (stereo_mode) {
+		case STEREO_MODE_NONE:
+		case STEREO_SPLIT_HORIZONTAL:
+		case STEREO_SPLIT_VERTICAL:
+		case STEREO_MODE_ANAGLYPH:
+			return OPENGL_SPECIAL_BUFFER_MODE_NONE;
+		case STEREO_MODE_OPENGL:
+			return OPENGL_SPECIAL_BUFFER_MODE_STEREO;
+		case STEREO_MODE_ROW_INTERLEAVED:
+		case STEREO_MODE_COLUMN_INTERLEAVED:
+		case STEREO_MODE_PIXEL_INTERLEAVED:
+			return OPENGL_SPECIAL_BUFFER_MODE_STENCIL;
+	}
+	return OPENGL_SPECIAL_BUFFER_MODE_NONE;
 }
 
 void
@@ -999,7 +1187,7 @@ R_Register(void)
 
 	gl_ext_swapinterval = Cvar_Get("gl_ext_swapinterval", "1", CVAR_ARCHIVE);
 	gl_ext_palettedtexture = Cvar_Get("gl_ext_palettedtexture", "0", CVAR_ARCHIVE);
-	gl_ext_multitexture = Cvar_Get("gl_ext_multitexture", "1", CVAR_ARCHIVE);
+	gl_ext_multitexture = Cvar_Get("gl_ext_multitexture", "0", CVAR_ARCHIVE);
 	gl_ext_pointparameters = Cvar_Get("gl_ext_pointparameters", "1", CVAR_ARCHIVE);
 	gl_ext_compiled_vertex_array = Cvar_Get("gl_ext_compiled_vertex_array", "1", CVAR_ARCHIVE);
 	gl_ext_mtexcombine = Cvar_Get("gl_ext_mtexcombine", "1", CVAR_ARCHIVE);
@@ -1018,6 +1206,12 @@ R_Register(void)
 
 	gl_retexturing = Cvar_Get("gl_retexturing", "1", CVAR_ARCHIVE);
 
+
+	gl_stereo = Cvar_Get( "gl_stereo", "0", CVAR_ARCHIVE );
+	gl_stereo_separation = Cvar_Get( "gl_stereo_separation", "-0.4", CVAR_ARCHIVE );
+	gl_stereo_anaglyph_colors = Cvar_Get( "gl_stereo_anaglyph_colors", "rc", CVAR_ARCHIVE );
+	gl_stereo_convergence = Cvar_Get( "gl_stereo_convergence", "1", CVAR_ARCHIVE );
+
 	Cmd_AddCommand("imagelist", R_ImageList_f);
 	Cmd_AddCommand("screenshot", R_ScreenShot);
 	Cmd_AddCommand("modellist", Mod_Modellist_f);
@@ -1128,6 +1322,7 @@ R_Init(void *hinstance, void *hWnd)
 
 	/* set our "safe" mode */
 	gl_state.prev_mode = 4;
+	gl_state.stereo_mode = gl_stereo->value;
 
 	/* create the window and set up the context */
 	if (!R_SetMode())
@@ -1344,6 +1539,21 @@ R_BeginFrame(float camera_separation)
 		vid_fullscreen->modified = true;
 	}
 
+	// force a vid_restart if gl_stereo has been modified.
+	if ( gl_state.stereo_mode != gl_stereo->value ) {
+		// If we've gone from one mode to another with the same special buffer requirements there's no need to restart.
+		if ( GL_GetSpecialBufferModeForStereoMode( gl_state.stereo_mode ) == GL_GetSpecialBufferModeForStereoMode( gl_stereo->value )  ) {
+			gl_state.stereo_mode = gl_stereo->value;
+		}
+		else
+		{
+			VID_Printf(PRINT_ALL, "stereo supermode changed, restarting video!\n");
+			cvar_t	*ref;
+			ref = Cvar_Get("vid_fullscreen", "0", CVAR_ARCHIVE);
+			ref->modified = true;
+		}
+	}
+
 	if (vid_gamma->modified)
 	{
 		vid_gamma->modified = false;
@@ -1355,7 +1565,28 @@ R_BeginFrame(float camera_separation)
 	}
 
 	/* go into 2D mode */
-	glViewport(0, 0, vid.width, vid.height);
+
+	int x, w, y, h;
+	qboolean drawing_left_eye = gl_state.camera_separation < 0;
+	qboolean stereo_split_tb = ((gl_state.stereo_mode == STEREO_SPLIT_VERTICAL) && gl_state.camera_separation);
+	qboolean stereo_split_lr = ((gl_state.stereo_mode == STEREO_SPLIT_HORIZONTAL) && gl_state.camera_separation);
+
+	x = 0;
+	w = vid.width;
+	y = 0;
+	h = vid.height;
+
+	if(stereo_split_lr) {
+		w =  w / 2;
+		x = drawing_left_eye ? 0 : w;
+	}
+
+	if(stereo_split_tb) {
+		h =  h / 2;
+		y = drawing_left_eye ? h : 0;
+	}
+
+	glViewport(x, y, w, h);
 	glMatrixMode(GL_PROJECTION);
 	glLoadIdentity();
 	glOrtho(0, vid.width, vid.height, 0, -99999, 99999);
@@ -1372,7 +1603,7 @@ R_BeginFrame(float camera_separation)
 	{
 		gl_drawbuffer->modified = false;
 
-		if ((gl_state.camera_separation == 0) || !gl_state.stereo_enabled)
+		if ((gl_state.camera_separation == 0) || gl_state.stereo_mode != STEREO_MODE_OPENGL)
 		{
 			if (Q_stricmp(gl_drawbuffer->string, "GL_FRONT") == 0)
 			{
diff --git a/src/client/refresh/r_mesh.c b/src/client/refresh/r_mesh.c
index ebe96c4..326d96f 100644
--- a/src/client/refresh/r_mesh.c
+++ b/src/client/refresh/r_mesh.c
@@ -390,14 +390,14 @@ R_CullAliasModel(vec3_t bbox[8], entity_t *e)
 
 	if ((e->frame >= paliashdr->num_frames) || (e->frame < 0))
 	{
-		VID_Printf(PRINT_ALL, "R_CullAliasModel %s: no such frame %d\n",
+		VID_Printf(PRINT_DEVELOPER, "R_CullAliasModel %s: no such frame %d\n",
 				currentmodel->name, e->frame);
 		e->frame = 0;
 	}
 
 	if ((e->oldframe >= paliashdr->num_frames) || (e->oldframe < 0))
 	{
-		VID_Printf(PRINT_ALL, "R_CullAliasModel %s: no such oldframe %d\n",
+		VID_Printf(PRINT_DEVELOPER, "R_CullAliasModel %s: no such oldframe %d\n",
 				currentmodel->name, e->oldframe);
 		e->oldframe = 0;
 	}
@@ -775,7 +775,7 @@ R_DrawAliasModel(entity_t *e)
 	if ((currententity->frame >= paliashdr->num_frames) ||
 		(currententity->frame < 0))
 	{
-		VID_Printf(PRINT_ALL, "R_DrawAliasModel %s: no such frame %d\n",
+		VID_Printf(PRINT_DEVELOPER, "R_DrawAliasModel %s: no such frame %d\n",
 				currentmodel->name, currententity->frame);
 		currententity->frame = 0;
 		currententity->oldframe = 0;
@@ -784,7 +784,7 @@ R_DrawAliasModel(entity_t *e)
 	if ((currententity->oldframe >= paliashdr->num_frames) ||
 		(currententity->oldframe < 0))
 	{
-		VID_Printf(PRINT_ALL, "R_DrawAliasModel %s: no such oldframe %d\n",
+		VID_Printf(PRINT_DEVELOPER, "R_DrawAliasModel %s: no such oldframe %d\n",
 				currentmodel->name, currententity->oldframe);
 		currententity->frame = 0;
 		currententity->oldframe = 0;
diff --git a/src/client/sound/openal.c b/src/client/sound/openal.c
index 0cb9d62..48a3f12 100644
--- a/src/client/sound/openal.c
+++ b/src/client/sound/openal.c
@@ -239,7 +239,7 @@ AL_PlayChannel(channel_t *ch)
 	}
 
 	/* Clamp volume */
-	vol = ch->oal_vol + s_volume->value;
+	vol = ch->oal_vol;
 
 	if (vol > 1.0f)
 	{
@@ -445,6 +445,11 @@ AL_AddLoopSounds(void)
 		ch->dist_mult = SOUND_LOOPATTENUATE;
 		ch->end = paintedtime + sc->length;
 
+		/* it seems like looped sounds are always played at full volume
+		 * see SDL_AddLoopSounds() which calls SDL_SpatializeOrigin() with volume 255.0f
+		 * so set it to full volume (1.0 * s_volume). */
+		ch->oal_vol = s_volume->value;
+
 		AL_PlayChannel(ch);
 	}
 }
@@ -602,7 +607,6 @@ AL_Update(void)
 	/* set listener (player) parameters */
 	AL_CopyVector(listener_forward, orientation);
 	AL_CopyVector(listener_up, orientation + 3);
- 	qalListenerf(AL_GAIN, s_volume->value);
 	qalListenerf(AL_MAX_GAIN, s_openal_maxgain->value);
 	qalDistanceModel(AL_LINEAR_DISTANCE_CLAMPED);
 	qalListener3f(AL_POSITION, AL_UnpackVector(listener_origin));
diff --git a/src/client/sound/sound.c b/src/client/sound/sound.c
index 04b17a3..ccb445b 100644
--- a/src/client/sound/sound.c
+++ b/src/client/sound/sound.c
@@ -830,7 +830,6 @@ S_RawSamples(int samples, int rate, int width,
 #if USE_OPENAL
 	if (sound_started == SS_OAL)
 	{
-		volume = volume * (s_volume->value);
 		AL_RawSamples(samples, rate, width, channels, data, volume);
 	}
 	else
diff --git a/src/common/header/common.h b/src/common/header/common.h
index f0f0d67..9199fe0 100644
--- a/src/common/header/common.h
+++ b/src/common/header/common.h
@@ -33,34 +33,15 @@
 #include "crc.h"
 
 /* Should have 4 characters. */
-#define YQ2VERSION "5.32"
-
+#define YQ2VERSION "5.34"
 #define BASEDIRNAME "baseq2"
 
-#if defined __linux__
- #define BUILDSTRING "Linux"
-#elif defined __FreeBSD__
- #define BUILDSTRING "FreeBSD"
-#elif defined __OpenBSD__
- #define BUILDSTRING "OpenBSD"
-#elif defined _WIN32
- #define BUILDSTRING "Windows"
-#elif defined __APPLE__
- #define BUILDSTRING "MacOS X"
-#else
- #define BUILDSTRING "Unknown"
+#ifndef OSTYPE
+#error OSTYPE should be defined by the build system
 #endif
 
-#ifdef __i386__
- #define CPUSTRING "i386"
-#elif defined __x86_64__
- #define CPUSTRING "amd64"
-#elif defined __sparc__
- #define CPUSTRING "sparc64"
-#elif defined __ia64__
- #define CPUSTRING "ia64"
-#else
- #define CPUSTRING "Unknown"
+#ifndef ARCH
+#error ARCH should be defined by the build system
 #endif
 
 #ifdef _WIN32
@@ -79,7 +60,6 @@
  #define LIBGL "libGL.so.1"
 #endif
 
-
 /* ================================================================== */
 
 typedef struct sizebuf_s
@@ -767,7 +747,7 @@ extern vec3_t bytedirs[NUMVERTEXNORMALS];
 /* this is in the client code, but can be used for debugging from server */
 void SCR_DebugGraph(float value, int color);
 
-/* NON-PORTABLE SYSTEM SERVICES */
+/* NON-PORTABLE OSTYPE SERVICES */
 
 void Sys_Init(void);
 void Sys_UnloadGame(void);
diff --git a/src/common/misc.c b/src/common/misc.c
index 61ebe06..98a90e5 100644
--- a/src/common/misc.c
+++ b/src/common/misc.c
@@ -241,7 +241,7 @@ Qcommon_Init(int argc, char **argv)
 	dedicated = Cvar_Get("dedicated", "0", CVAR_NOSET);
 #endif
 
-	s = va("%s %s %s %s", YQ2VERSION, CPUSTRING, __DATE__, BUILDSTRING);
+	s = va("%s %s %s %s", YQ2VERSION, ARCH, __DATE__, OSTYPE);
 	Cvar_Get("version", s, CVAR_SERVERINFO | CVAR_NOSET);
 
 	if (dedicated->value)
diff --git a/src/game/g_misc.c b/src/game/g_misc.c
index 409487e..1523e5a 100644
--- a/src/game/g_misc.c
+++ b/src/game/g_misc.c
@@ -218,7 +218,7 @@ ThrowGib(edict_t *self, char *gibname, int damage, int type)
 	gib->s.origin[2] = origin[2] + crandom() * size[2];
 
 	gi.setmodel(gib, gibname);
-	gib->solid = SOLID_NOT;
+	gib->solid = SOLID_BBOX;
 	gib->s.effects |= EF_GIB;
 	gib->flags |= FL_NO_KNOCKBACK;
 	gib->takedamage = DAMAGE_YES;
@@ -267,7 +267,7 @@ ThrowHead(edict_t *self, char *gibname, int damage, int type)
 
 	self->s.modelindex2 = 0;
 	gi.setmodel(self, gibname);
-	self->solid = SOLID_NOT;
+	self->solid = SOLID_BBOX;
 	self->s.effects |= EF_GIB;
 	self->s.effects &= ~EF_FLIES;
 	self->s.sound = 0;
@@ -330,7 +330,7 @@ ThrowClientHead(edict_t *self, int damage)
 	VectorSet(self->maxs, 16, 16, 16);
 
 	self->takedamage = DAMAGE_NO;
-	self->solid = SOLID_NOT;
+	self->solid = SOLID_BBOX;
 	self->s.effects = EF_GIB;
 	self->s.sound = 0;
 	self->flags |= FL_NO_KNOCKBACK;
@@ -399,7 +399,7 @@ ThrowDebris(edict_t *self, char *modelname, float speed, vec3_t origin)
 	v[2] = 100 + 100 * crandom();
 	VectorMA(self->velocity, speed, v, chunk->velocity);
 	chunk->movetype = MOVETYPE_BOUNCE;
-	chunk->solid = SOLID_NOT;
+	chunk->solid = SOLID_BBOX;
 	chunk->avelocity[0] = random() * 600;
 	chunk->avelocity[1] = random() * 600;
 	chunk->avelocity[2] = random() * 600;
@@ -2127,7 +2127,7 @@ SP_misc_gib_arm(edict_t *ent)
 	}
 
 	gi.setmodel(ent, "models/objects/gibs/arm/tris.md2");
-	ent->solid = SOLID_NOT;
+	ent->solid = SOLID_BBOX;
 	ent->s.effects |= EF_GIB;
 	ent->takedamage = DAMAGE_YES;
 	ent->die = gib_die;
@@ -2155,7 +2155,7 @@ SP_misc_gib_leg(edict_t *ent)
 	}
 
 	gi.setmodel(ent, "models/objects/gibs/leg/tris.md2");
-	ent->solid = SOLID_NOT;
+	ent->solid = SOLID_BBOX;
 	ent->s.effects |= EF_GIB;
 	ent->takedamage = DAMAGE_YES;
 	ent->die = gib_die;
@@ -2183,7 +2183,7 @@ SP_misc_gib_head(edict_t *ent)
 	}
 
 	gi.setmodel(ent, "models/objects/gibs/head/tris.md2");
-	ent->solid = SOLID_NOT;
+	ent->solid = SOLID_BBOX;
 	ent->s.effects |= EF_GIB;
 	ent->takedamage = DAMAGE_YES;
 	ent->die = gib_die;
diff --git a/src/game/savegame/savegame.c b/src/game/savegame/savegame.c
index 9593bd0..9dc0878 100644
--- a/src/game/savegame/savegame.c
+++ b/src/game/savegame/savegame.c
@@ -67,47 +67,53 @@
 #include "../header/local.h"
 
 /*
- * When ever the savegame version
- * is changed, q2 will refuse to
- * load older savegames. This
- * should be bumped if the files
- * in tables/ are changed, otherwise
- * strange things may happen.
+ * When ever the savegame version is changed, q2 will refuse to
+ * load older savegames. This should be bumped if the files
+ * in tables/ are changed, otherwise strange things may happen.
  */
-#define SAVEGAMEVER "YQ2-1"
+#define SAVEGAMEVER "YQ2-2"
 
 /*
- * This macros are used to
- * prohibit loading of savegames
- * created on other systems or
- * architectures. This will
- * crash q2 in spectacular
- * ways
+ * This macros are used to prohibit loading of savegames
+ * created on other systems or architectures. This will
+ * crash q2 in spectacular ways
+ */
+#ifndef OSTYPE
+#error OSTYPE should be defined by the build system
+#endif
+
+#ifndef ARCH
+#error ARCH should be defined by the build system
+#endif
+
+/*
+ * Older operating systen and architecture detection
+ * macros, implemented by savegame version YQ2-1.
  */
 #if defined(__APPLE__)
- #define OS "MacOS X"
+#define OSTYPE_1 "MacOS X"
 #elif defined(__FreeBSD__)
- #define OS "FreeBSD"
+#define OSTYPE_1 "FreeBSD"
 #elif defined(__OpenBSD__)
- #define OS "OpenBSD"
+#define OSTYPE_1 "OpenBSD"
 #elif defined(__linux__)
- #define OS "Linux"
+ #define OSTYPE_1 "Linux"
 #elif defined(_WIN32)
- #define OS "Windows"
+ #define OSTYPE_1 "Windows"
 #else
- #define OS "Unknown"
+ #define OSTYPE_1 "Unknown"
 #endif
 
 #if defined(__i386__)
- #define ARCH "i386"
+#define ARCH_1 "i386"
 #elif defined(__x86_64__)
- #define ARCH "amd64"
+#define ARCH_1 "amd64"
 #elif defined(__sparc__)
- #define ARCH "sparc64"
+#define ARCH_1 "sparc64"
 #elif defined(__ia64__)
- #define ARCH "ia64"
+ #define ARCH_1 "ia64"
 #else
- #define ARCH "unknown"
+ #define ARCH_1 "unknown"
 #endif
 
 /*
@@ -777,7 +783,7 @@ WriteGame(const char *filename, qboolean autosave)
 
 	Q_strlcpy(str_ver, SAVEGAMEVER, sizeof(str_ver));
 	Q_strlcpy(str_game, GAMEVERSION, sizeof(str_game));
-	Q_strlcpy(str_os, OS, sizeof(str_os));
+	Q_strlcpy(str_os, OSTYPE, sizeof(str_os));
 	Q_strlcpy(str_arch, ARCH, sizeof(str_arch));
 
 	fwrite(str_ver, sizeof(str_ver), 1, f);
@@ -827,26 +833,59 @@ ReadGame(const char *filename)
 	fread(str_os, sizeof(str_os), 1, f);
 	fread(str_arch, sizeof(str_arch), 1, f);
 
-	if (strcmp(str_ver, SAVEGAMEVER))
-	{
-		fclose(f);
-		gi.error("Savegame from an incompatible version.\n");
-	}
-	else if (strcmp(str_game, GAMEVERSION))
+	if (!strcmp(str_ver, SAVEGAMEVER))
 	{
-		fclose(f);
-		gi.error("Savegame from an other game.so.\n");
+		if (strcmp(str_game, GAMEVERSION))
+		{
+			fclose(f);
+			gi.error("Savegame from an other game.so.\n");
+		}
+		else if (strcmp(str_os, OSTYPE))
+		{
+			fclose(f);
+			gi.error("Savegame from an other os.\n");
+		}
+		else if (strcmp(str_arch, ARCH))
+		{
+			fclose(f);
+			gi.error("Savegame from an other architecure.\n");
+		}
 	}
- 	else if (strcmp(str_os, OS))
+	else if (!strcmp(str_ver, "YQ2-1"))
 	{
-		fclose(f);
-		gi.error("Savegame from an other os.\n");
-	}
+		if (strcmp(str_game, GAMEVERSION))
+		{
+			fclose(f);
+			gi.error("Savegame from an other game.so.\n");
+		}
+		else if (strcmp(str_os, OSTYPE_1))
+		{
+			fclose(f);
+			gi.error("Savegame from an other os.\n");
+		}
 
- 	else if (strcmp(str_arch, ARCH))
+		if (!strcmp(str_os, "Windows"))
+		{
+			/* Windows was forced to i386 */
+			if (strcmp(str_arch, "i386"))
+			{
+				fclose(f);
+				gi.error("Savegame from an other architecure.\n");
+			}
+		}
+		else
+		{
+			if (strcmp(str_arch, ARCH_1))
+			{
+				fclose(f);
+				gi.error("Savegame from an other architecure.\n");
+			}
+		}
+	}
+	else
 	{
 		fclose(f);
-		gi.error("Savegame from an other architecure.\n");
+		gi.error("Savegame from an incompatible version.\n");
 	}
 
 	g_edicts = gi.TagMalloc(game.maxentities * sizeof(g_edicts[0]), TAG_GAME);
diff --git a/README b/stuff/README.old
similarity index 96%
rename from README
rename to stuff/README.old
index 68eea6f..bcc3661 100644
--- a/README
+++ b/stuff/README.old
@@ -47,9 +47,8 @@ Content of this file:
    3.2 Retail Version
    3.3 Demo Version
    3.4 Addons
-   3.5 Binary Installation
-   3.6 Compiling
-   3.7 Default Configuration
+   3.5 Compiling
+   3.6 Default Configuration
 
  4. OGG/Vorbis playback
    4.1 Setup for the original soundtrack
@@ -282,7 +281,7 @@ Now you are ready to start your brand new Quake II. Have fun.
 =======================
 Yamagi Quake II has full support for Apple OS X. All features are
 supported, including the IPv6 network code and the OpenAL sound backend.
-Installation can be done by using the binary release or by compiling the source.
+As there currently is no binary release for OS X, you need to compile the source.
 
 3.1 Supported Systems
 ---------------------
@@ -331,23 +330,16 @@ distributed separately. You can get them at http://www.yamagi.org/quake2,
 both contain installation instructions. But nevertheless you'll need an
 installation of the full Quake II game with our client for playing them.
 The same applies to the "ctf" capture the flag addon. 
- 
-3.5 Binary Installation
------------------------
-Extract the zip archive and right click on the app. Select "Show Contents",
-a new finder window will open. Navigate to Contents/Resources/baseq2 and
-copy the contents of the baseq2/ folder (created while preparing the game
-data, see above) into it. Close the finder windows. Yamagi Quake II is
-now ready.
 
-3.6 Compiling
+3.5 Compiling
 -------------
-Compiling Yamagi Quake II from source is unnecessary as long as you will not
-use the github version or want to develop on OS X. If you really want to
-compile Yamagi Quake II by yourself follow these steps:
+If you want to compile Yamagi Quake II on OS X follow these steps:
 
 1. Make sure that you've installed XCode with the "Unix Develoment Tools".
    Depending on your OS X version the name of these can be different.
+   At least on OS X 10.11 El Capitan it should be sufficient to enter "clang" in a
+   Terminal to be prompted for installation of the commandline development tools;
+   full XCode is not needed there.
 2. Install dependencies using Homebrew (http://brew.sh). Once you have Homebrew
    installed, run the following commands from the terminal to install dependencies:
    brew install sdl2 --universal
@@ -365,7 +357,7 @@ In the latter case the game be started at the command line. Be aware that the ap
 support has to be deactivated in the Makefile, otherwise the game is unable to find it's
 libraries!
 
-3.7 Default Configuration
+3.6 Default Configuration
 -------------------------
 Quake II ships with an old and for today standards "insane" default
 configuration. This is no problem since you can alter everything. To make your
@@ -822,3 +814,30 @@ How do I disable the vsync?
    not work with SDL 1.2 due to bugs in SDL.
 
 ==============================================================================
+
+8. Stereo Support
+======
+Stereo support was added back.
+3d crosshair was added, which requires a model 'models/crosshair/tris.md2' (look in stuff directory)
+
+added cvars 
+-----------
+ - gl_stereo:
+  - 0 - none
+  - 1 - native opengl (not tested)
+  - 2 - anaglyph
+  - 3 - horizontal interleaved
+  - 4 - vertical interleaved
+  - 5 - pixel interleaved
+  - 6 - horizontal split
+  - 7 - vertical split
+ - gl_stereo_separation
+ - gl_stereo_convergence
+ - crosshair_3d - non-cheating 3d crosshair
+   it does not work as iron sights, as is positioned exactly 
+   at the center of the view, similar to 2d crosshair
+ - crosshair_3d_glow (0 - ...) - radius of glow area, can be used without crosshair_3d enabled
+ - crosshair_3d_glow_r
+ - crosshair_3d_glow_g
+ - crosshair_3d_glow_b
+ 
diff --git a/stuff/models/crosshair/skin.pcx b/stuff/models/crosshair/skin.pcx
new file mode 100644
index 0000000..fccc263
Binary files /dev/null and b/stuff/models/crosshair/skin.pcx differ
diff --git a/stuff/models/crosshair/tris.md2 b/stuff/models/crosshair/tris.md2
new file mode 100644
index 0000000..fdd7f83
Binary files /dev/null and b/stuff/models/crosshair/tris.md2 differ

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/yquake2.git



More information about the Pkg-games-commits mailing list