From 5256a8e6f1801301508d43e077b8aff566144580 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sat, 25 Nov 2017 09:40:00 -0500 Subject: [PATCH 01/67] Revert of 9f58eb96dcf5ab6a010720618939c948f83959da. Causes issues with mouse coordinates under Sierra. --- BasiliskII/src/SDL/video_sdl.cpp | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/BasiliskII/src/SDL/video_sdl.cpp b/BasiliskII/src/SDL/video_sdl.cpp index 798ed8e8..77c102bc 100644 --- a/BasiliskII/src/SDL/video_sdl.cpp +++ b/BasiliskII/src/SDL/video_sdl.cpp @@ -31,6 +31,7 @@ * - Ctr-Tab for suspend/resume but how? SDL does not support that for non-Linux * - Ctrl-Fn doesn't generate SDL_KEYDOWN events (SDL bug?) * - Mouse acceleration, there is no API in SDL yet for that + * - Force relative mode in Grab mode even if SDL provides absolute coordinates? * - Gamma tables support is likely to be broken here * - Events processing is bound to the general emulation thread as SDL requires * to PumpEvents() within the same thread as the one that called SetVideoMode(). @@ -692,7 +693,7 @@ void driver_base::init() } void driver_base::adapt_to_video_mode() { - ADBSetRelMouseMode(mouse_grabbed); + ADBSetRelMouseMode(false); // Init blitting routines SDL_PixelFormat *f = s->format; @@ -726,7 +727,7 @@ void driver_base::adapt_to_video_mode() { SDL_ShowCursor(hardware_cursor); // Set window name/class - set_window_name(mouse_grabbed ? STR_WINDOW_TITLE_GRABBED : STR_WINDOW_TITLE); + set_window_name(STR_WINDOW_TITLE); // Everything went well init_ok = true; @@ -806,7 +807,7 @@ void driver_base::grab_mouse(void) if (new_mode == SDL_GRAB_ON) { set_window_name(STR_WINDOW_TITLE_GRABBED); disable_mouse_accel(); - ADBSetRelMouseMode(mouse_grabbed = true); + mouse_grabbed = true; } } } @@ -819,7 +820,7 @@ void driver_base::ungrab_mouse(void) if (new_mode == SDL_GRAB_OFF) { set_window_name(STR_WINDOW_TITLE); restore_mouse_accel(); - ADBSetRelMouseMode(mouse_grabbed = false); + mouse_grabbed = false; } } } @@ -1751,11 +1752,7 @@ static void handle_events(void) // Mouse moved case SDL_MOUSEMOTION: - if (mouse_grabbed) { - drv->mouse_moved(event.motion.xrel, event.motion.yrel); - } else { - drv->mouse_moved(event.motion.x, event.motion.y); - } + drv->mouse_moved(event.motion.x, event.motion.y); break; // Keyboard From 7378a62032da8d053e5759aa42954648e85c0da7 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sat, 25 Nov 2017 10:27:00 -0500 Subject: [PATCH 02/67] Set Xcode to use tabs. --- .../src/MacOSX/SheepShaver_Xcode8.xcodeproj/project.pbxproj | 1 + 1 file changed, 1 insertion(+) diff --git a/SheepShaver/src/MacOSX/SheepShaver_Xcode8.xcodeproj/project.pbxproj b/SheepShaver/src/MacOSX/SheepShaver_Xcode8.xcodeproj/project.pbxproj index bdde7b99..44bdb27d 100644 --- a/SheepShaver/src/MacOSX/SheepShaver_Xcode8.xcodeproj/project.pbxproj +++ b/SheepShaver/src/MacOSX/SheepShaver_Xcode8.xcodeproj/project.pbxproj @@ -489,6 +489,7 @@ ); name = Sources; sourceTree = ""; + usesTabs = 1; }; 0856CD7E14A99EEF000B1711 /* dummy */ = { isa = PBXGroup; From 2bdbd22e85c8dcc53c2a9a92f27bc52783f3f026 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sat, 25 Nov 2017 10:36:00 -0500 Subject: [PATCH 03/67] Fix setting window title on Mac Sierra when grabbing mouse. --- BasiliskII/src/SDL/video_sdl.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/BasiliskII/src/SDL/video_sdl.cpp b/BasiliskII/src/SDL/video_sdl.cpp index 77c102bc..524d8267 100644 --- a/BasiliskII/src/SDL/video_sdl.cpp +++ b/BasiliskII/src/SDL/video_sdl.cpp @@ -136,6 +136,7 @@ static bool toggle_fullscreen = false; static const int sdl_eventmask = SDL_MOUSEEVENTMASK | SDL_KEYEVENTMASK | SDL_VIDEOEXPOSEMASK | SDL_QUITMASK | SDL_ACTIVEEVENTMASK; static bool mouse_grabbed = false; +static bool mouse_grabbed_window_name_status = false; // Mutex to protect SDL events static SDL_mutex *sdl_events_lock = NULL; @@ -805,7 +806,6 @@ void driver_base::grab_mouse(void) if (!mouse_grabbed) { SDL_GrabMode new_mode = set_grab_mode(SDL_GRAB_ON); if (new_mode == SDL_GRAB_ON) { - set_window_name(STR_WINDOW_TITLE_GRABBED); disable_mouse_accel(); mouse_grabbed = true; } @@ -818,7 +818,6 @@ void driver_base::ungrab_mouse(void) if (mouse_grabbed) { SDL_GrabMode new_mode = set_grab_mode(SDL_GRAB_OFF); if (new_mode == SDL_GRAB_OFF) { - set_window_name(STR_WINDOW_TITLE); restore_mouse_accel(); mouse_grabbed = false; } @@ -1280,6 +1279,13 @@ void VideoVBL(void) if (toggle_fullscreen) do_toggle_fullscreen(); + // Setting the window name must happen on the main thread, else it doesn't work on + // some platforms - e.g. macOS Sierra. + if (mouse_grabbed_window_name_status != mouse_grabbed) { + set_window_name(mouse_grabbed ? STR_WINDOW_TITLE_GRABBED : STR_WINDOW_TITLE); + mouse_grabbed_window_name_status = mouse_grabbed; + } + // Temporarily give up frame buffer lock (this is the point where // we are suspended when the user presses Ctrl-Tab) UNLOCK_FRAME_BUFFER; @@ -1302,6 +1308,13 @@ void VideoInterrupt(void) if (toggle_fullscreen) do_toggle_fullscreen(); + // Setting the window name must happen on the main thread, else it doesn't work on + // some platforms - e.g. macOS Sierra. + if (mouse_grabbed_window_name_status != mouse_grabbed) { + set_window_name(mouse_grabbed ? STR_WINDOW_TITLE_GRABBED : STR_WINDOW_TITLE); + mouse_grabbed_window_name_status = mouse_grabbed; + } + // Temporarily give up frame buffer lock (this is the point where // we are suspended when the user presses Ctrl-Tab) UNLOCK_FRAME_BUFFER; From 9c041ee2dc3f1e5fc1ebad9dab00564282929c29 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sat, 25 Nov 2017 13:45:49 -0500 Subject: [PATCH 04/67] move STR_WINDOW_TITLE_GRABBED to user_strings.h and fix header guard for user_strings_unix.h --- SheepShaver/src/Unix/user_strings_unix.h | 5 ++--- SheepShaver/src/include/user_strings.h | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/SheepShaver/src/Unix/user_strings_unix.h b/SheepShaver/src/Unix/user_strings_unix.h index be9ea0bb..8858684c 100644 --- a/SheepShaver/src/Unix/user_strings_unix.h +++ b/SheepShaver/src/Unix/user_strings_unix.h @@ -18,8 +18,8 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#ifndef USER_STRINGS_LINUX_H -#define USER_STRINGS_LINUX_H +#ifndef USER_STRINGS_UNIX_H +#define USER_STRINGS_UNIX_H enum { STR_NO_DEV_ZERO_ERR = 10000, @@ -78,7 +78,6 @@ enum { STR_MOUSEWHEELLINES_CTRL, STR_OPEN_WINDOW_ERR, - STR_WINDOW_TITLE_GRABBED, STR_NO_B2_EXE_FOUND }; diff --git a/SheepShaver/src/include/user_strings.h b/SheepShaver/src/include/user_strings.h index 12ea12eb..c0fbb6dc 100644 --- a/SheepShaver/src/include/user_strings.h +++ b/SheepShaver/src/include/user_strings.h @@ -166,6 +166,7 @@ enum { // Mac window STR_WINDOW_TITLE = 4000, STR_WINDOW_TITLE_FROZEN, + STR_WINDOW_TITLE_GRABBED, STR_WINDOW_MENU = 4050, STR_WINDOW_ITEM_ABOUT, STR_WINDOW_ITEM_REFRESH, From dcbbf18bb7c9e56f4f9812a54b2e95aba04b1a21 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sat, 25 Nov 2017 13:52:40 -0500 Subject: [PATCH 05/67] more changes needed to move STR_WINDOW_TITLE_GRABBED cross-platform code --- BasiliskII/src/Unix/user_strings_unix.cpp | 2 -- BasiliskII/src/Unix/user_strings_unix.h | 2 -- BasiliskII/src/Windows/user_strings_windows.cpp | 1 - BasiliskII/src/Windows/user_strings_windows.h | 1 - BasiliskII/src/include/user_strings.h | 1 + BasiliskII/src/user_strings.cpp | 1 + SheepShaver/src/Unix/user_strings_unix.cpp | 1 - SheepShaver/src/Windows/user_strings_windows.cpp | 1 - SheepShaver/src/Windows/user_strings_windows.h | 1 - SheepShaver/src/user_strings.cpp | 1 + 10 files changed, 3 insertions(+), 9 deletions(-) diff --git a/BasiliskII/src/Unix/user_strings_unix.cpp b/BasiliskII/src/Unix/user_strings_unix.cpp index f095e06c..b04762db 100644 --- a/BasiliskII/src/Unix/user_strings_unix.cpp +++ b/BasiliskII/src/Unix/user_strings_unix.cpp @@ -84,8 +84,6 @@ user_string_def platform_strings[] = { {STR_IGNORESEGV_CTRL, "Ignore Illegal Memory Accesses"}, - {STR_WINDOW_TITLE_GRABBED, "Basilisk II (mouse grabbed, press Ctrl-F5 to release)"}, - {STR_NO_B2_EXE_FOUND, "Could not start %s (%s)."}, {-1, NULL} // End marker diff --git a/BasiliskII/src/Unix/user_strings_unix.h b/BasiliskII/src/Unix/user_strings_unix.h index 9bdb9f62..b47f442a 100644 --- a/BasiliskII/src/Unix/user_strings_unix.h +++ b/BasiliskII/src/Unix/user_strings_unix.h @@ -75,8 +75,6 @@ enum { STR_IGNORESEGV_CTRL, - STR_WINDOW_TITLE_GRABBED, - STR_NO_B2_EXE_FOUND }; diff --git a/BasiliskII/src/Windows/user_strings_windows.cpp b/BasiliskII/src/Windows/user_strings_windows.cpp index c2241250..0d98d61f 100755 --- a/BasiliskII/src/Windows/user_strings_windows.cpp +++ b/BasiliskII/src/Windows/user_strings_windows.cpp @@ -37,7 +37,6 @@ user_string_def platform_strings[] = { {STR_NO_AUDIO_WARN, "No audio device found, audio output will be disabled."}, {STR_KEYCODE_FILE_WARN, "Cannot open keycode translation file %s (%s)."}, {STR_KEYCODE_VENDOR_WARN, "Cannot find vendor '%s' in keycode translation file %s."}, - {STR_WINDOW_TITLE_GRABBED, "Basilisk II (mouse grabbed, press Ctrl-F5 to release)"}, {STR_NO_WIN32_NT_4, "Basilisk II does not run on Windows NT versions less than 4.0"}, {STR_PREFS_MENU_FILE_GTK, "/_File"}, diff --git a/BasiliskII/src/Windows/user_strings_windows.h b/BasiliskII/src/Windows/user_strings_windows.h index ccf5ff54..c8e21e31 100755 --- a/BasiliskII/src/Windows/user_strings_windows.h +++ b/BasiliskII/src/Windows/user_strings_windows.h @@ -39,7 +39,6 @@ enum { STR_NO_AUDIO_WARN, STR_KEYCODE_FILE_WARN, STR_KEYCODE_VENDOR_WARN, - STR_WINDOW_TITLE_GRABBED, STR_NO_WIN32_NT_4, STR_PREFS_MENU_FILE_GTK, diff --git a/BasiliskII/src/include/user_strings.h b/BasiliskII/src/include/user_strings.h index 7f2958f4..24a0b28a 100644 --- a/BasiliskII/src/include/user_strings.h +++ b/BasiliskII/src/include/user_strings.h @@ -213,6 +213,7 @@ enum { // Mac window STR_WINDOW_TITLE = 4000, STR_WINDOW_TITLE_FROZEN, + STR_WINDOW_TITLE_GRABBED, STR_WINDOW_MENU = 4050, STR_WINDOW_ITEM_ABOUT, STR_WINDOW_ITEM_REFRESH, diff --git a/BasiliskII/src/user_strings.cpp b/BasiliskII/src/user_strings.cpp index f4861825..55a7fb87 100644 --- a/BasiliskII/src/user_strings.cpp +++ b/BasiliskII/src/user_strings.cpp @@ -226,6 +226,7 @@ user_string_def common_strings[] = { {STR_WINDOW_TITLE, "Basilisk II"}, {STR_WINDOW_TITLE_FROZEN, "Basilisk II *** FROZEN ***"}, + {STR_WINDOW_TITLE_GRABBED, "Basilisk II (mouse grabbed, press Ctrl-F5 to release)"}, {STR_WINDOW_MENU, "Basilisk II"}, {STR_WINDOW_ITEM_ABOUT, "About Basilisk II" ELLIPSIS}, {STR_WINDOW_ITEM_REFRESH, "Refresh Rate"}, diff --git a/SheepShaver/src/Unix/user_strings_unix.cpp b/SheepShaver/src/Unix/user_strings_unix.cpp index 5a3b21f5..4aafced5 100644 --- a/SheepShaver/src/Unix/user_strings_unix.cpp +++ b/SheepShaver/src/Unix/user_strings_unix.cpp @@ -84,7 +84,6 @@ user_string_def platform_strings[] = { {STR_VOSF_INIT_ERR, "Cannot initialize Video on SEGV signals."}, {STR_OPEN_WINDOW_ERR, "Cannot open Mac window."}, - {STR_WINDOW_TITLE_GRABBED, "SheepShaver (mouse grabbed, press Ctrl-F5 to release)"}, {STR_NO_B2_EXE_FOUND, "Could not start %s (%s)."}, diff --git a/SheepShaver/src/Windows/user_strings_windows.cpp b/SheepShaver/src/Windows/user_strings_windows.cpp index 92555c8f..32e52d25 100755 --- a/SheepShaver/src/Windows/user_strings_windows.cpp +++ b/SheepShaver/src/Windows/user_strings_windows.cpp @@ -45,7 +45,6 @@ user_string_def platform_strings[] = { {STR_VOSF_INIT_ERR, "Cannot initialize Video on SEGV signals."}, {STR_OPEN_WINDOW_ERR, "Cannot open Mac window."}, - {STR_WINDOW_TITLE_GRABBED, "SheepShaver (mouse grabbed, press Ctrl-F5 to release)"}, {STR_NO_WIN32_NT_4, "SheepShaver does not run on Windows NT versions less than 4.0"}, {STR_PREFS_MENU_FILE_GTK, "/_File"}, diff --git a/SheepShaver/src/Windows/user_strings_windows.h b/SheepShaver/src/Windows/user_strings_windows.h index 7980c5f7..7db10a74 100755 --- a/SheepShaver/src/Windows/user_strings_windows.h +++ b/SheepShaver/src/Windows/user_strings_windows.h @@ -39,7 +39,6 @@ enum { STR_KEYCODE_FILE_WARN, STR_KEYCODE_VENDOR_WARN, STR_OPEN_WINDOW_ERR, - STR_WINDOW_TITLE_GRABBED, STR_NO_WIN32_NT_4, STR_PREFS_MENU_FILE_GTK, diff --git a/SheepShaver/src/user_strings.cpp b/SheepShaver/src/user_strings.cpp index 4041d451..f4618b55 100644 --- a/SheepShaver/src/user_strings.cpp +++ b/SheepShaver/src/user_strings.cpp @@ -172,6 +172,7 @@ user_string_def common_strings[] = { {STR_WINDOW_TITLE, "SheepShaver"}, {STR_WINDOW_TITLE_FROZEN, "SheepShaver *** FROZEN ***"}, + {STR_WINDOW_TITLE_GRABBED, "SheepShaver (mouse grabbed, press Ctrl-F5 to release)"}, {STR_WINDOW_MENU, "SheepShaver"}, {STR_WINDOW_ITEM_ABOUT, "About SheepShaver" ELLIPSIS}, {STR_WINDOW_ITEM_REFRESH, "Refresh Rate"}, From 7df78acb4096eaa82a3212eb028ff63522d2e8b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesu=CC=81s=20A=2E=20A=CC=81lvarez?= Date: Tue, 28 Nov 2017 22:53:29 +0100 Subject: [PATCH 06/67] fix for extfs on 64-bit macOS/iOS --- BasiliskII/src/extfs.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BasiliskII/src/extfs.cpp b/BasiliskII/src/extfs.cpp index 99470e8f..1dc47f94 100644 --- a/BasiliskII/src/extfs.cpp +++ b/BasiliskII/src/extfs.cpp @@ -175,9 +175,9 @@ static uint32 next_cnid = fsUsrCNID; // Next available CNID #if defined __APPLE__ && defined __MACH__ struct crtimebuf { - unsigned long length; + u_int32_t length; struct timespec crtime; -}; +} __attribute__((aligned(4), packed)); static uint32 do_get_creation_time(const char *path) { From 33b061f0f4a01dbe029919fa294f816f16e5f2e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesu=CC=81s=20A=2E=20A=CC=81lvarez?= Date: Thu, 30 Nov 2017 18:03:43 +0100 Subject: [PATCH 07/67] fix indentation --- BasiliskII/src/extfs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BasiliskII/src/extfs.cpp b/BasiliskII/src/extfs.cpp index 1dc47f94..e18d1df1 100644 --- a/BasiliskII/src/extfs.cpp +++ b/BasiliskII/src/extfs.cpp @@ -176,7 +176,7 @@ static uint32 next_cnid = fsUsrCNID; // Next available CNID #if defined __APPLE__ && defined __MACH__ struct crtimebuf { u_int32_t length; - struct timespec crtime; + struct timespec crtime; } __attribute__((aligned(4), packed)); static uint32 do_get_creation_time(const char *path) From c9717bf3316a3e4e6fe60fbe4b4c06812db2be0b Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sat, 2 Dec 2017 11:35:23 -0500 Subject: [PATCH 08/67] Fix window redraw on macOS when un-minimizing. --- BasiliskII/src/SDL/video_sdl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BasiliskII/src/SDL/video_sdl.cpp b/BasiliskII/src/SDL/video_sdl.cpp index 524d8267..3db0d71f 100644 --- a/BasiliskII/src/SDL/video_sdl.cpp +++ b/BasiliskII/src/SDL/video_sdl.cpp @@ -1835,7 +1835,7 @@ static void handle_events(void) // Application activate/deactivate case SDL_ACTIVEEVENT: // Force a complete window refresh when activating, to avoid redraw artifacts otherwise. - if (event.active.gain && (event.active.state & SDL_APPACTIVE)) + if (event.active.gain) force_complete_window_refresh(); break; } From 57131adacc7b91df91106dac1ce7723f6928b7e1 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sat, 2 Dec 2017 12:21:13 -0500 Subject: [PATCH 09/67] Fix some string conversion warnings. --- BasiliskII/src/MacOSX/main_macosx.mm | 4 ++-- BasiliskII/src/Unix/main_unix.cpp | 6 +++--- BasiliskII/src/Windows/main_windows.cpp | 2 +- BasiliskII/src/emul_op.cpp | 6 +++--- BasiliskII/src/uae_cpu/compiler/compemu_support.cpp | 2 +- BasiliskII/src/uae_cpu/newcpu.h | 4 ++-- SheepShaver/src/Unix/main_unix.cpp | 2 +- SheepShaver/src/emul_ppc/emul_ppc.cpp | 2 +- SheepShaver/src/kpx_cpu/sheepshaver_glue.cpp | 2 +- SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-cpu.cpp | 2 +- SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-execute.cpp | 2 +- SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-translate.cpp | 2 +- cxmon/README | 2 +- cxmon/src/mon.cpp | 4 ++-- cxmon/src/mon.h | 2 +- cxmon/src/mon_ppc.cpp | 10 +++++----- 16 files changed, 27 insertions(+), 27 deletions(-) diff --git a/BasiliskII/src/MacOSX/main_macosx.mm b/BasiliskII/src/MacOSX/main_macosx.mm index abb046c1..b14a2ede 100644 --- a/BasiliskII/src/MacOSX/main_macosx.mm +++ b/BasiliskII/src/MacOSX/main_macosx.mm @@ -176,7 +176,7 @@ static void sigsegv_dump_state(sigsegv_info_t *sip) #endif VideoQuitFullScreen(); #ifdef ENABLE_MON - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); #endif QuitEmulator(); @@ -550,7 +550,7 @@ static void sigint_handler(...) extern void m68k_dumpstate(uaecptr *nextpc); m68k_dumpstate(&nextpc); VideoQuitFullScreen(); - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); QuitEmulator(); } diff --git a/BasiliskII/src/Unix/main_unix.cpp b/BasiliskII/src/Unix/main_unix.cpp index 9aadbbf8..c4f975a3 100644 --- a/BasiliskII/src/Unix/main_unix.cpp +++ b/BasiliskII/src/Unix/main_unix.cpp @@ -292,7 +292,7 @@ static void sigsegv_dump_state(sigsegv_info_t *sip) #endif VideoQuitFullScreen(); #ifdef ENABLE_MON - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); #endif QuitEmulator(); @@ -958,7 +958,7 @@ static void sigint_handler(...) m68k_dumpstate(&nextpc); #endif VideoQuitFullScreen(); - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); QuitEmulator(); } @@ -1505,7 +1505,7 @@ ill: printf("SIGILL num %d, code %d\n", sig, code); VideoQuitFullScreen(); #ifdef ENABLE_MON - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); #endif QuitEmulator(); diff --git a/BasiliskII/src/Windows/main_windows.cpp b/BasiliskII/src/Windows/main_windows.cpp index 7d555c98..184a2dc6 100755 --- a/BasiliskII/src/Windows/main_windows.cpp +++ b/BasiliskII/src/Windows/main_windows.cpp @@ -181,7 +181,7 @@ static void sigsegv_dump_state(sigsegv_info_t *sip) #endif VideoQuitFullScreen(); #ifdef ENABLE_MON - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); QuitEmulator(); #endif diff --git a/BasiliskII/src/emul_op.cpp b/BasiliskII/src/emul_op.cpp index 6051f9e2..bdab4f63 100644 --- a/BasiliskII/src/emul_op.cpp +++ b/BasiliskII/src/emul_op.cpp @@ -70,7 +70,7 @@ void EmulOp(uint16 opcode, M68kRegisters *r) r->sr); VideoQuitFullScreen(); #ifdef ENABLE_MON - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); #endif QuitEmulator(); @@ -575,7 +575,7 @@ void EmulOp(uint16 opcode, M68kRegisters *r) r->a[0], r->a[1], r->a[2], r->a[3], r->a[4], r->a[5], r->a[6], r->a[7], r->sr); #ifdef ENABLE_MON - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); #endif break; @@ -592,7 +592,7 @@ void EmulOp(uint16 opcode, M68kRegisters *r) r->a[0], r->a[1], r->a[2], r->a[3], r->a[4], r->a[5], r->a[6], r->a[7], r->sr); #ifdef ENABLE_MON - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); #endif QuitEmulator(); diff --git a/BasiliskII/src/uae_cpu/compiler/compemu_support.cpp b/BasiliskII/src/uae_cpu/compiler/compemu_support.cpp index f31febce..c55ae3b5 100644 --- a/BasiliskII/src/uae_cpu/compiler/compemu_support.cpp +++ b/BasiliskII/src/uae_cpu/compiler/compemu_support.cpp @@ -6533,7 +6533,7 @@ void disasm_block(int target, uint8 * start, size_t length) mon_read_byte = mon_read_byte_jit; mon_write_byte = mon_write_byte_jit; - char *arg[5] = {"mon", "-m", "-r", disasm_str, NULL}; + const char *arg[5] = {"mon", "-m", "-r", disasm_str, NULL}; mon(4, arg); mon_read_byte = old_mon_read_byte; diff --git a/BasiliskII/src/uae_cpu/newcpu.h b/BasiliskII/src/uae_cpu/newcpu.h index 305b242e..bead5234 100644 --- a/BasiliskII/src/uae_cpu/newcpu.h +++ b/BasiliskII/src/uae_cpu/newcpu.h @@ -206,7 +206,7 @@ static __inline__ void m68k_setpc (uaecptr newpc) if (IS_BREAK_POINT(newpc)) { printf("Stopped at break point address: %08lx. Last PC: %08lx\n", newpc, previous_pc); m68k_dumpstate(NULL); - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); } #endif // end of #if ENABLE_MON @@ -223,7 +223,7 @@ static __inline__ void m68k_incpc (uae_s32 delta) if (IS_BREAK_POINT(next_pc)) { printf("Stopped at break point address: %08lx. Last PC: %08lx\n", next_pc, previous_pc); m68k_dumpstate(NULL); - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); } #endif // end of #if ENABLE_MON diff --git a/SheepShaver/src/Unix/main_unix.cpp b/SheepShaver/src/Unix/main_unix.cpp index 3d0ee43e..b6de430b 100644 --- a/SheepShaver/src/Unix/main_unix.cpp +++ b/SheepShaver/src/Unix/main_unix.cpp @@ -1402,7 +1402,7 @@ static void *tick_func(void *arg) #ifdef ENABLE_MON // Start up mon in real-mode printf("Welcome to the sheep factory.\n"); - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); #endif return NULL; diff --git a/SheepShaver/src/emul_ppc/emul_ppc.cpp b/SheepShaver/src/emul_ppc/emul_ppc.cpp index 10584d72..b445f22f 100644 --- a/SheepShaver/src/emul_ppc/emul_ppc.cpp +++ b/SheepShaver/src/emul_ppc/emul_ppc.cpp @@ -212,7 +212,7 @@ static void dump(void) // Start up mon in real-mode #if ENABLE_MON - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); #endif QuitEmulator(); diff --git a/SheepShaver/src/kpx_cpu/sheepshaver_glue.cpp b/SheepShaver/src/kpx_cpu/sheepshaver_glue.cpp index a553973e..af7ba467 100644 --- a/SheepShaver/src/kpx_cpu/sheepshaver_glue.cpp +++ b/SheepShaver/src/kpx_cpu/sheepshaver_glue.cpp @@ -83,7 +83,7 @@ static void enter_mon(void) { // Start up mon in real-mode #if ENABLE_MON - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); #endif } diff --git a/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-cpu.cpp b/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-cpu.cpp index c5de1179..4654a86a 100644 --- a/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-cpu.cpp +++ b/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-cpu.cpp @@ -527,7 +527,7 @@ bool powerpc_cpu::check_spcflags() spcflags().clear(SPCFLAG_CPU_ENTER_MON); #if ENABLE_MON // Start up mon in real-mode - char *arg[] = { + const char *arg[] = { "mon", #ifdef SHEEPSHAVER "-m", diff --git a/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-execute.cpp b/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-execute.cpp index 8c512be8..7154a5af 100644 --- a/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-execute.cpp +++ b/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-execute.cpp @@ -67,7 +67,7 @@ void powerpc_cpu::execute_illegal(uint32 opcode) disass_ppc(stdout, pc(), opcode); // Start up mon in real-mode - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); #endif abort(); diff --git a/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-translate.cpp b/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-translate.cpp index 1d691ed0..7d023147 100644 --- a/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-translate.cpp +++ b/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-translate.cpp @@ -95,7 +95,7 @@ static void disasm_block(int target, uint8 *start, uint32 length) target == TARGET_POWERPC ? "d" : "x", start, start + length - 1); - char *arg[] = {"mon", + const char *arg[] = {"mon", #ifdef SHEEPSHAVER "-m", #endif diff --git a/cxmon/README b/cxmon/README index 44ab37f6..905e6d83 100644 --- a/cxmon/README +++ b/cxmon/README @@ -418,7 +418,7 @@ Here's how to do it (all functions are defined in the mon.h header file): arguments and the mon_read/write_*() functions to access memory. 5. To enter cxmon, call the mon() function like this: - char *args[3] = {"mon", "-r", NULL}; + const char *args[3] = {"mon", "-r", NULL}; mon(2, args); 6. If you're done with cxmon, call mon_exit(). diff --git a/cxmon/src/mon.cpp b/cxmon/src/mon.cpp index 52478b0c..358a6985 100644 --- a/cxmon/src/mon.cpp +++ b/cxmon/src/mon.cpp @@ -872,7 +872,7 @@ static void help_or_hunt() } fprintf(monout, "x Quit mon\n" "h This help text\n"); - fprintf(monout, cmd_help); + fprintf(monout, "%s", cmd_help); } @@ -1180,7 +1180,7 @@ void mon_exit() * Main function, read-execute loop */ -void mon(int argc, char **argv) +void mon(int argc, const char **argv) { bool done = false, interactive = true; diff --git a/cxmon/src/mon.h b/cxmon/src/mon.h index a4e59041..007aef5d 100644 --- a/cxmon/src/mon.h +++ b/cxmon/src/mon.h @@ -31,7 +31,7 @@ void mon_init(); void mon_exit(); -void mon(int argc, char **argv); +void mon(int argc, const char **argv); // Break points prompt const char STR_ACTIVE_BREAK_POINTS[] = "Active Break Points:\n"; diff --git a/cxmon/src/mon_ppc.cpp b/cxmon/src/mon_ppc.cpp index 56683654..d101e726 100644 --- a/cxmon/src/mon_ppc.cpp +++ b/cxmon/src/mon_ppc.cpp @@ -187,7 +187,7 @@ static void disass31(FILE *f, unsigned int adr, unsigned int w); static void disass59(FILE *f, unsigned int adr, unsigned int w); static void disass63(FILE *f, unsigned int adr, unsigned int w); static unsigned int mbme2mask(int mb, int me); -static char *get_spr(int reg); +static const char *get_spr(int reg); /* @@ -279,7 +279,7 @@ void disass_ppc(FILE *f, unsigned int adr, unsigned int w) case 16: { int target = short(imm & 0xfffc); - char *form; + const char *form; if (w & 1) if (w & 2) form = "la"; @@ -817,7 +817,7 @@ static void disass31(FILE *f, unsigned int adr, unsigned int w) else if ((ra | (rb << 5)) == 256) fprintf(f, "mfvrsave\tr%d\n", rd); else { - char *spr = get_spr(ra | (rb << 5)); + const char *spr = get_spr(ra | (rb << 5)); if (spr) fprintf(f, "mfspr\tr%d,%s\n", rd, spr); else @@ -894,7 +894,7 @@ static void disass31(FILE *f, unsigned int adr, unsigned int w) else if ((ra | (rb << 5)) == 256) fprintf(f, "mtvrsave\tr%d\n", rd); else { - char *spr = get_spr(ra | (rb << 5)); + const char *spr = get_spr(ra | (rb << 5)); if (spr) fprintf(f, "mtspr\t%s,r%d\n", spr, rd); else @@ -1058,7 +1058,7 @@ static unsigned int mbme2mask(int mb, int me) * Convert SPR number to register name */ -char *get_spr(int reg) +const char *get_spr(int reg) { switch (reg) { case 1: return "xer"; From fc0d7dcdde78f39ffb71d31138443364eee5f513 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sat, 2 Dec 2017 12:27:27 -0500 Subject: [PATCH 10/67] silence some more warnings --- BasiliskII/src/MacOSX/sys_darwin.cpp | 4 ++-- BasiliskII/src/uae_cpu/newcpu.cpp | 2 +- cxmon/src/mon_ppc.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/BasiliskII/src/MacOSX/sys_darwin.cpp b/BasiliskII/src/MacOSX/sys_darwin.cpp index 5a798e70..cc6c8a3c 100644 --- a/BasiliskII/src/MacOSX/sys_darwin.cpp +++ b/BasiliskII/src/MacOSX/sys_darwin.cpp @@ -256,7 +256,7 @@ void DarwinAddFloppyPrefs(void) } // Iterate through each floppy - while ( nextFloppy = IOIteratorNext(allFloppies)) + while ((nextFloppy = IOIteratorNext(allFloppies))) { char bsdPath[MAXPATHLEN]; long size; @@ -333,7 +333,7 @@ void DarwinAddSerialPrefs(void) } // Iterate through each modem - while ( nextModem = IOIteratorNext(allModems)) + while ((nextModem = IOIteratorNext(allModems))) { char bsdPath[MAXPATHLEN]; CFTypeRef bsdPathAsCFString = diff --git a/BasiliskII/src/uae_cpu/newcpu.cpp b/BasiliskII/src/uae_cpu/newcpu.cpp index eb14efd6..51f3fcef 100644 --- a/BasiliskII/src/uae_cpu/newcpu.cpp +++ b/BasiliskII/src/uae_cpu/newcpu.cpp @@ -1170,7 +1170,7 @@ void m68k_mull (uae_u32 opcode, uae_u32 src, uae_u16 extra) } #endif } -static char* ccnames[] = +static const char* ccnames[] = { "T ","F ","HI","LS","CC","CS","NE","EQ", "VC","VS","PL","MI","GE","LT","GT","LE" }; diff --git a/cxmon/src/mon_ppc.cpp b/cxmon/src/mon_ppc.cpp index d101e726..615af158 100644 --- a/cxmon/src/mon_ppc.cpp +++ b/cxmon/src/mon_ppc.cpp @@ -30,7 +30,7 @@ static unsigned short imm; // Codes for trap instructions -static char *to_code[32] = { +static const char *to_code[32] = { NULL, "lgt", "llt", NULL, "eq", "lge", "lle", NULL, "gt", NULL, NULL, NULL, "ge", NULL, NULL, NULL, "lt", NULL, NULL, NULL, "le", NULL, NULL, NULL, From fc082509a69fa9db1c1049c61d64eb57f1be1513 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sat, 2 Dec 2017 12:39:30 -0500 Subject: [PATCH 11/67] fix some format warnings --- BasiliskII/src/uae_cpu/memory.cpp | 18 +++++++++--------- BasiliskII/src/uae_cpu/newcpu.cpp | 22 +++++++++++----------- BasiliskII/src/uae_cpu/newcpu.h | 4 ++-- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/BasiliskII/src/uae_cpu/memory.cpp b/BasiliskII/src/uae_cpu/memory.cpp index 42b855d1..7483f506 100644 --- a/BasiliskII/src/uae_cpu/memory.cpp +++ b/BasiliskII/src/uae_cpu/memory.cpp @@ -89,7 +89,7 @@ static void REGPARAM2 dummy_bput (uaecptr, uae_u32) REGPARAM; uae_u32 REGPARAM2 dummy_lget (uaecptr addr) { if (illegal_mem) - write_log ("Illegal lget at %08lx\n", addr); + write_log ("Illegal lget at %08x\n", addr); return 0; } @@ -97,7 +97,7 @@ uae_u32 REGPARAM2 dummy_lget (uaecptr addr) uae_u32 REGPARAM2 dummy_wget (uaecptr addr) { if (illegal_mem) - write_log ("Illegal wget at %08lx\n", addr); + write_log ("Illegal wget at %08x\n", addr); return 0; } @@ -105,7 +105,7 @@ uae_u32 REGPARAM2 dummy_wget (uaecptr addr) uae_u32 REGPARAM2 dummy_bget (uaecptr addr) { if (illegal_mem) - write_log ("Illegal bget at %08lx\n", addr); + write_log ("Illegal bget at %08x\n", addr); return 0; } @@ -113,17 +113,17 @@ uae_u32 REGPARAM2 dummy_bget (uaecptr addr) void REGPARAM2 dummy_lput (uaecptr addr, uae_u32 l) { if (illegal_mem) - write_log ("Illegal lput at %08lx\n", addr); + write_log ("Illegal lput at %08x\n", addr); } void REGPARAM2 dummy_wput (uaecptr addr, uae_u32 w) { if (illegal_mem) - write_log ("Illegal wput at %08lx\n", addr); + write_log ("Illegal wput at %08x\n", addr); } void REGPARAM2 dummy_bput (uaecptr addr, uae_u32 b) { if (illegal_mem) - write_log ("Illegal bput at %08lx\n", addr); + write_log ("Illegal bput at %08x\n", addr); } /* Mac RAM (32 bit addressing) */ @@ -268,19 +268,19 @@ uae_u32 REGPARAM2 rom_bget(uaecptr addr) void REGPARAM2 rom_lput(uaecptr addr, uae_u32 b) { if (illegal_mem) - write_log ("Illegal ROM lput at %08lx\n", addr); + write_log ("Illegal ROM lput at %08x\n", addr); } void REGPARAM2 rom_wput(uaecptr addr, uae_u32 b) { if (illegal_mem) - write_log ("Illegal ROM wput at %08lx\n", addr); + write_log ("Illegal ROM wput at %08x\n", addr); } void REGPARAM2 rom_bput(uaecptr addr, uae_u32 b) { if (illegal_mem) - write_log ("Illegal ROM bput at %08lx\n", addr); + write_log ("Illegal ROM bput at %08x\n", addr); } uae_u8 *REGPARAM2 rom_xlate(uaecptr addr) diff --git a/BasiliskII/src/uae_cpu/newcpu.cpp b/BasiliskII/src/uae_cpu/newcpu.cpp index 51f3fcef..d13a6078 100644 --- a/BasiliskII/src/uae_cpu/newcpu.cpp +++ b/BasiliskII/src/uae_cpu/newcpu.cpp @@ -373,7 +373,7 @@ uae_s32 ShowEA (int reg, amodes mode, wordsizes size, char *buf) if (dp & 4) base += dispreg; addr = base + outer; - sprintf (buffer,"(%s%c%d.%c*%d+%ld)+%ld == $%08lx", name, + sprintf (buffer,"(%s%c%d.%c*%d+%d)+%d == $%08lx", name, dp & 0x8000 ? 'A' : 'D', (int)r, dp & 0x800 ? 'L' : 'W', 1 << ((dp >> 9) & 3), disp,outer, @@ -420,7 +420,7 @@ uae_s32 ShowEA (int reg, amodes mode, wordsizes size, char *buf) if (dp & 4) base += dispreg; addr = base + outer; - sprintf (buffer,"(%s%c%d.%c*%d+%ld)+%ld == $%08lx", name, + sprintf (buffer,"(%s%c%d.%c*%d+%d)+%d == $%08lx", name, dp & 0x8000 ? 'A' : 'D', (int)r, dp & 0x800 ? 'L' : 'W', 1 << ((dp >> 9) & 3), disp,outer, @@ -1257,7 +1257,7 @@ void REGPARAM2 op_illg (uae_u32 opcode) return; } - write_log ("Illegal instruction: %04x at %08lx\n", opcode, pc); + write_log ("Illegal instruction: %04x at %08x\n", opcode, pc); #if USE_JIT && JIT_DEBUG compiler_dumpstate(); #endif @@ -1473,11 +1473,11 @@ void m68k_disasm (uaecptr addr, uaecptr *nextpc, int cnt) } if (ccpt != 0) { if (cctrue(dp->cc)) - printf (" == %08lx (TRUE)", newpc); + printf (" == %08x (TRUE)", newpc); else - printf (" == %08lx (FALSE)", newpc); + printf (" == %08x (FALSE)", newpc); } else if ((opcode & 0xff00) == 0x6100) /* BSR */ - printf (" == %08lx", newpc); + printf (" == %08x", newpc); printf ("\n"); } if (nextpc) @@ -1488,19 +1488,19 @@ void m68k_dumpstate (uaecptr *nextpc) { int i; for (i = 0; i < 8; i++){ - printf ("D%d: %08lx ", i, m68k_dreg(regs, i)); + printf ("D%d: %08x ", i, m68k_dreg(regs, i)); if ((i & 3) == 3) printf ("\n"); } for (i = 0; i < 8; i++){ - printf ("A%d: %08lx ", i, m68k_areg(regs, i)); + printf ("A%d: %08x ", i, m68k_areg(regs, i)); if ((i & 3) == 3) printf ("\n"); } if (regs.s == 0) regs.usp = m68k_areg(regs, 7); if (regs.s && regs.m) regs.msp = m68k_areg(regs, 7); if (regs.s && regs.m == 0) regs.isp = m68k_areg(regs, 7); - printf ("USP=%08lx ISP=%08lx MSP=%08lx VBR=%08lx\n", + printf ("USP=%08x ISP=%08x MSP=%08x VBR=%08x\n", regs.usp,regs.isp,regs.msp,regs.vbr); - printf ("T=%d%d S=%d M=%d X=%d N=%d Z=%d V=%d C=%d IMASK=%d\n", + printf ("T=%d%d S=%d M=%d X=%ld N=%ld Z=%ld V=%ld C=%ld IMASK=%d\n", regs.t1, regs.t0, regs.s, regs.m, GET_XFLG, GET_NFLG, GET_ZFLG, GET_VFLG, GET_CFLG, regs.intmask); @@ -1509,5 +1509,5 @@ void m68k_dumpstate (uaecptr *nextpc) m68k_disasm(m68k_getpc (), nextpc, 1); if (nextpc) - printf ("next PC: %08lx\n", *nextpc); + printf ("next PC: %08x\n", *nextpc); } diff --git a/BasiliskII/src/uae_cpu/newcpu.h b/BasiliskII/src/uae_cpu/newcpu.h index bead5234..e2d5b5ed 100644 --- a/BasiliskII/src/uae_cpu/newcpu.h +++ b/BasiliskII/src/uae_cpu/newcpu.h @@ -204,7 +204,7 @@ static __inline__ void m68k_setpc (uaecptr newpc) #if ENABLE_MON if (IS_BREAK_POINT(newpc)) { - printf("Stopped at break point address: %08lx. Last PC: %08lx\n", newpc, previous_pc); + printf("Stopped at break point address: %08x. Last PC: %08x\n", newpc, previous_pc); m68k_dumpstate(NULL); const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); @@ -221,7 +221,7 @@ static __inline__ void m68k_incpc (uae_s32 delta) #if ENABLE_MON uaecptr next_pc = m68k_getpc(); if (IS_BREAK_POINT(next_pc)) { - printf("Stopped at break point address: %08lx. Last PC: %08lx\n", next_pc, previous_pc); + printf("Stopped at break point address: %08x. Last PC: %08x\n", next_pc, previous_pc); m68k_dumpstate(NULL); const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); From 404c5f1fd6ee53545da50f4d59ae2ecd686843bf Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sat, 2 Dec 2017 13:27:14 -0500 Subject: [PATCH 12/67] fix configure X check to not trigger if using mac gui and some more warning fixes --- BasiliskII/src/Unix/configure.ac | 4 ++-- BasiliskII/src/rom_patches.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/BasiliskII/src/Unix/configure.ac b/BasiliskII/src/Unix/configure.ac index 09d7ae3b..0a05d16f 100644 --- a/BasiliskII/src/Unix/configure.ac +++ b/BasiliskII/src/Unix/configure.ac @@ -313,8 +313,8 @@ else SDL_SUPPORT="none" fi -dnl We need X11, if not using SDL. -if [[ "x$WANT_SDL_VIDEO" = "xno" ]]; then +dnl We need X11, if not using SDL or Mac GUI. +if [[ "x$WANT_SDL_VIDEO" = "xno" -a "x$WANT_MACOSX_GUI" = "xno"]]; then AC_PATH_XTRA if [[ "x$no_x" = "xyes" ]]; then AC_MSG_ERROR([You need X11 to run Basilisk II.]) diff --git a/BasiliskII/src/rom_patches.cpp b/BasiliskII/src/rom_patches.cpp index 25cf5f38..fdedf5e2 100644 --- a/BasiliskII/src/rom_patches.cpp +++ b/BasiliskII/src/rom_patches.cpp @@ -1683,8 +1683,8 @@ bool PatchROM(void) if (ROMBreakpoint) { #if ENABLE_MON mon_add_break_point(ROMBaseMac + ROMBreakpoint); - printf("ROM start address at %08lx\n", ROMBaseMac); - printf("Set ROM break point at %08lx\n", ROMBaseMac + ROMBreakpoint); + printf("ROM start address at %08x\n", ROMBaseMac); + printf("Set ROM break point at %08x\n", ROMBaseMac + ROMBreakpoint); #else uint16 *wp = (uint16 *)(ROMBaseHost + ROMBreakpoint); *wp = htons(M68K_EMUL_BREAK); From d77e529ce9d67e4925a939676fcbaec93a9185ae Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sat, 2 Dec 2017 15:34:18 -0500 Subject: [PATCH 13/67] Make Basilisk's configure.ac's SDL detection logic match SS's. --- BasiliskII/src/Unix/configure.ac | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/BasiliskII/src/Unix/configure.ac b/BasiliskII/src/Unix/configure.ac index 0a05d16f..b201cd4e 100644 --- a/BasiliskII/src/Unix/configure.ac +++ b/BasiliskII/src/Unix/configure.ac @@ -300,13 +300,22 @@ if [[ "x$WANT_SDL" = "xyes" ]]; then ac_cv_framework_SDL=no fi if [[ "x$ac_cv_framework_SDL" = "xno" ]]; then - PKG_CHECK_MODULES([sdl], [sdl >= 1.2], [ - CFLAGS="$CFLAGS $sdl_CFLAGS" - CXXFLAGS="$CXXFLAGS $sdl_CFLAGS" - LIBS="$LIBS $sdl_LIBS" - ], [ - WANT_SDL=no - ]) + AC_PATH_PROG(sdl_config, "sdl-config") + if [[ -n "$sdl_config" ]]; then + sdl_cflags=`$sdl_config --cflags` + if [[ "x$WANT_SDL_STATIC" = "xyes" ]]; then + sdl_libs=`$sdl_config --static-libs` + else + sdl_libs=`$sdl_config --libs` + fi + CFLAGS="$CFLAGS $sdl_cflags" + CXXFLAGS="$CXXFLAGS $sdl_cflags" + LIBS="$LIBS $sdl_libs" + else + WANT_SDL=no + WANT_SDL_VIDEO=no + WANT_SDL_AUDIO=no + fi fi SDL_SUPPORT=`echo "$SDL_SUPPORT" | sed -e "s/^ //"` else From dc65a48d32da2ef902260b3f2b3455d1181e1ce2 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 13:43:03 -0500 Subject: [PATCH 14/67] remove stray non-ascii chars at start of mon_cmd.cpp --- cxmon/src/mon_cmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cxmon/src/mon_cmd.cpp b/cxmon/src/mon_cmd.cpp index 3975ead5..8ddcac7e 100644 --- a/cxmon/src/mon_cmd.cpp +++ b/cxmon/src/mon_cmd.cpp @@ -1,4 +1,4 @@ -/* +/* * mon_cmd.cpp - cxmon standard commands * * cxmon (C) 1997-2004 Christian Bauer, Marc Hellwig From ee5b726d73c29b2d474d8f4211baa79967567375 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 14:54:50 -0500 Subject: [PATCH 15/67] Fix SDL support message in configure based on detection logic. --- BasiliskII/src/Unix/configure.ac | 1 + SheepShaver/src/Unix/configure.ac | 1 + 2 files changed, 2 insertions(+) diff --git a/BasiliskII/src/Unix/configure.ac b/BasiliskII/src/Unix/configure.ac index b201cd4e..c883ac56 100644 --- a/BasiliskII/src/Unix/configure.ac +++ b/BasiliskII/src/Unix/configure.ac @@ -315,6 +315,7 @@ if [[ "x$WANT_SDL" = "xyes" ]]; then WANT_SDL=no WANT_SDL_VIDEO=no WANT_SDL_AUDIO=no + SDL_SUPPORT="none" fi fi SDL_SUPPORT=`echo "$SDL_SUPPORT" | sed -e "s/^ //"` diff --git a/SheepShaver/src/Unix/configure.ac b/SheepShaver/src/Unix/configure.ac index 39f18115..006fe872 100644 --- a/SheepShaver/src/Unix/configure.ac +++ b/SheepShaver/src/Unix/configure.ac @@ -209,6 +209,7 @@ if [[ "x$WANT_SDL" = "xyes" ]]; then WANT_SDL=no WANT_SDL_VIDEO=no WANT_SDL_AUDIO=no + SDL_SUPPORT="none" fi fi SDL_SUPPORT=`echo "$SDL_SUPPORT" | sed -e "s/^ //"` From c0200eede45235ee9f193c45fdf75c0340027880 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 15:32:04 -0500 Subject: [PATCH 16/67] clean up some code --- BasiliskII/src/Unix/sysdeps.h | 13 ------------- BasiliskII/src/Windows/sysdeps.h | 13 ------------- 2 files changed, 26 deletions(-) diff --git a/BasiliskII/src/Unix/sysdeps.h b/BasiliskII/src/Unix/sysdeps.h index d74a2eda..7ac37f29 100644 --- a/BasiliskII/src/Unix/sysdeps.h +++ b/BasiliskII/src/Unix/sysdeps.h @@ -424,30 +424,17 @@ static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {uint8 *b = (uint8 *)a #if defined(__i386__) || defined(__x86_64__) /* Intel x86 */ -#define X86_PPRO_OPT static inline uae_u32 do_get_mem_long(uae_u32 *a) {uint32 retval; __asm__ ("bswap %0" : "=r" (retval) : "0" (*a) : "cc"); return retval;} -#ifdef X86_PPRO_OPT static inline uae_u32 do_get_mem_word(uae_u16 *a) {uint32 retval; __asm__ ("movzwl %w1,%k0\n\tshll $16,%k0\n\tbswapl %k0\n" : "=&r" (retval) : "m" (*a) : "cc"); return retval;} -#else -static inline uae_u32 do_get_mem_word(uae_u16 *a) {uint32 retval; __asm__ ("xorl %k0,%k0\n\tmovw %w1,%w0\n\trolw $8,%w0" : "=&r" (retval) : "m" (*a) : "cc"); return retval;} -#endif #define HAVE_GET_WORD_UNSWAPPED #define do_get_mem_word_unswapped(a) ((uae_u32)*((uae_u16 *)(a))) static inline void do_put_mem_long(uae_u32 *a, uae_u32 v) {__asm__ ("bswap %0" : "=r" (v) : "0" (v) : "cc"); *a = v;} -#ifdef X86_PPRO_OPT static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {__asm__ ("bswapl %0" : "=&r" (v) : "0" (v << 16) : "cc"); *a = v;} -#else -static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {__asm__ ("rolw $8,%0" : "=r" (v) : "0" (v) : "cc"); *a = v;} -#endif #define HAVE_OPTIMIZED_BYTESWAP_32 /* bswap doesn't affect condition codes */ static inline uae_u32 do_byteswap_32(uae_u32 v) {__asm__ ("bswap %0" : "=r" (v) : "0" (v)); return v;} #define HAVE_OPTIMIZED_BYTESWAP_16 -#ifdef X86_PPRO_OPT static inline uae_u32 do_byteswap_16(uae_u32 v) {__asm__ ("bswapl %0" : "=&r" (v) : "0" (v << 16) : "cc"); return v;} -#else -static inline uae_u32 do_byteswap_16(uae_u32 v) {__asm__ ("rolw $8,%0" : "=r" (v) : "0" (v) : "cc"); return v;} -#endif #elif defined(CPU_CAN_ACCESS_UNALIGNED) diff --git a/BasiliskII/src/Windows/sysdeps.h b/BasiliskII/src/Windows/sysdeps.h index c1d7898f..3f11226f 100755 --- a/BasiliskII/src/Windows/sysdeps.h +++ b/BasiliskII/src/Windows/sysdeps.h @@ -220,7 +220,6 @@ static inline int spin_trylock(spinlock_t *lock) } #endif -#define X86_PPRO_OPT #define HAVE_OPTIMIZED_BYTESWAP_32 #define HAVE_OPTIMIZED_BYTESWAP_16 @@ -234,24 +233,12 @@ static inline uae_u32 do_byteswap_16_g(uae_u32 v) {return _byteswap_ushort(v);} #else /* Intel x86 */ static inline uae_u32 do_get_mem_long(uae_u32 *a) {uint32 retval; __asm__ ("bswap %0" : "=r" (retval) : "0" (*a) : "cc"); return retval;} -#ifdef X86_PPRO_OPT static inline uae_u32 do_get_mem_word(uae_u16 *a) {uint32 retval; __asm__ ("movzwl %w1,%k0\n\tshll $16,%k0\n\tbswapl %k0\n" : "=&r" (retval) : "m" (*a) : "cc"); return retval;} -#else -static inline uae_u32 do_get_mem_word(uae_u16 *a) {uint32 retval; __asm__ ("xorl %k0,%k0\n\tmovw %w1,%w0\n\trolw $8,%w0" : "=&r" (retval) : "m" (*a) : "cc"); return retval;} -#endif static inline void do_put_mem_long(uae_u32 *a, uae_u32 v) {__asm__ ("bswap %0" : "=r" (v) : "0" (v) : "cc"); *a = v;} -#ifdef X86_PPRO_OPT static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {__asm__ ("bswapl %0" : "=&r" (v) : "0" (v << 16) : "cc"); *a = v;} -#else -static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {__asm__ ("rolw $8,%0" : "=r" (v) : "0" (v) : "cc"); *a = v;} -#endif /* bswap doesn't affect condition codes */ static inline uae_u32 do_byteswap_32_g(uae_u32 v) {__asm__ ("bswap %0" : "=r" (v) : "0" (v)); return v;} -#ifdef X86_PPRO_OPT static inline uae_u32 do_byteswap_16_g(uae_u32 v) {__asm__ ("bswapl %0" : "=&r" (v) : "0" (v << 16) : "cc"); return v;} -#else -static inline uae_u32 do_byteswap_16_g(uae_u32 v) {__asm__ ("rolw $8,%0" : "=r" (v) : "0" (v) : "cc"); return v;} -#endif #endif #define HAVE_GET_WORD_UNSWAPPED From eab9d9029f54e7aa585c98bb747d85589de19d3d Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 15:39:51 -0500 Subject: [PATCH 17/67] clean up some code --- BasiliskII/src/SDL/video_sdl.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/BasiliskII/src/SDL/video_sdl.cpp b/BasiliskII/src/SDL/video_sdl.cpp index 3db0d71f..011941f9 100644 --- a/BasiliskII/src/SDL/video_sdl.cpp +++ b/BasiliskII/src/SDL/video_sdl.cpp @@ -496,7 +496,7 @@ static void add_mode(int type, int width, int height, int resolution_id, int byt } // Set Mac frame layout and base address (uses the_buffer/MacFrameBaseMac) -static void set_mac_frame_buffer(SDL_monitor_desc &monitor, int depth, bool native_byte_order) +static void set_mac_frame_buffer(SDL_monitor_desc &monitor, int depth) { #if !REAL_ADDRESSING && !DIRECT_ADDRESSING int layout = FLAYOUT_DIRECT; @@ -504,10 +504,7 @@ static void set_mac_frame_buffer(SDL_monitor_desc &monitor, int depth, bool nati layout = (screen_depth == 15) ? FLAYOUT_HOST_555 : FLAYOUT_HOST_565; else if (depth == VIDEO_DEPTH_32BIT) layout = (screen_depth == 24) ? FLAYOUT_HOST_888 : FLAYOUT_DIRECT; - if (native_byte_order) - MacFrameLayout = layout; - else - MacFrameLayout = FLAYOUT_DIRECT; + MacFrameLayout = layout; monitor.set_mac_frame_base(MacFrameBaseMac); // Set variables used by UAE memory banking @@ -688,7 +685,7 @@ void driver_base::init() } // Set frame buffer base - set_mac_frame_buffer(monitor, VIDEO_MODE_DEPTH, true); + set_mac_frame_buffer(monitor, VIDEO_MODE_DEPTH); adapt_to_video_mode(); } From a78c76f76223b9c61922a30a41e155b3f54bb38d Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 15:44:31 -0500 Subject: [PATCH 18/67] fix colors in b2 video_macosx.mm code --- BasiliskII/src/MacOSX/video_macosx.mm | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/BasiliskII/src/MacOSX/video_macosx.mm b/BasiliskII/src/MacOSX/video_macosx.mm index d4eff082..510b6e6c 100644 --- a/BasiliskII/src/MacOSX/video_macosx.mm +++ b/BasiliskII/src/MacOSX/video_macosx.mm @@ -422,17 +422,10 @@ void OSX_monitor::set_mac_frame_buffer(const video_mode mode) { #if !REAL_ADDRESSING && !DIRECT_ADDRESSING - switch ( mode.depth ) - { - // case VDEPTH_15BIT: - case VDEPTH_16BIT: MacFrameLayout = FLAYOUT_HOST_555; break; - // case VDEPTH_24BIT: - case VDEPTH_32BIT: MacFrameLayout = FLAYOUT_HOST_888; break; - default : MacFrameLayout = FLAYOUT_DIRECT; - } set_mac_frame_base(MacFrameBaseMac); // Set variables used by UAE memory banking + MacFrameLayout = FLAYOUT_DIRECT; MacFrameBaseHost = (uint8 *) the_buffer; MacFrameSize = mode.bytes_per_row * mode.y; InitFrameBufferMapping(); From 182a7aeadbcf0e82e1833127cabf8c203b325d63 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 15:59:14 -0500 Subject: [PATCH 19/67] clean up disabled / non-working modes out of video_macosx.mm/.h --- BasiliskII/src/MacOSX/video_macosx.h | 10 ---- BasiliskII/src/MacOSX/video_macosx.mm | 79 --------------------------- 2 files changed, 89 deletions(-) diff --git a/BasiliskII/src/MacOSX/video_macosx.h b/BasiliskII/src/MacOSX/video_macosx.h index 9cecd9f2..e83f2bd6 100644 --- a/BasiliskII/src/MacOSX/video_macosx.h +++ b/BasiliskII/src/MacOSX/video_macosx.h @@ -22,16 +22,6 @@ #import -/* Set the strategy for drawing the bitmap in the Mac OS X window */ -//#define CGDRAWBITMAP -#if defined __i386__ -#define CGIMAGEREF -//#define NSBITMAP -#else -#define CGIMAGEREF -//#define NSBITMAP -#endif - // Using Core Graphics is fastest when rendering 32bit data. // Using CGImageRefs allows us to use all the bitmaps that BasiliskII supports. // When both Basilisk II and OS X are set to 'Thousands', updating a 312x342 diff --git a/BasiliskII/src/MacOSX/video_macosx.mm b/BasiliskII/src/MacOSX/video_macosx.mm index 510b6e6c..8323038c 100644 --- a/BasiliskII/src/MacOSX/video_macosx.mm +++ b/BasiliskII/src/MacOSX/video_macosx.mm @@ -371,16 +371,11 @@ class OSX_monitor : public monitor_desc bool init_window(const video_mode &mode); -#ifdef CGIMAGEREF CGColorSpaceRef colourSpace; uint8 *colourTable; CGImageRef imageRef; CGDataProviderRef provider; short x, y, bpp, depth, bpr; -#endif -#ifdef NSBITMAP - NSBitmapImageRep *bitmap; -#endif void *the_buffer; @@ -397,24 +392,17 @@ OSX_monitor :: OSX_monitor (const vector &available_modes, uint32 default_id) : monitor_desc (available_modes, default_depth, default_id) { -#ifdef CGIMAGEREF colourSpace = nil; colourTable = (uint8 *) malloc(256 * 3); imageRef = nil; provider = nil; -#endif -#ifdef NSBITMAP - bitmap = nil; -#endif newMode = originalMode = nil; the_buffer = NULL; theDisplay = nil; }; // Should also have a destructor which does -//#ifdef CGIMAGEREF // free(colourTable); -//#endif // Set Mac frame layout and base address (uses the_buffer/MacFrameBaseMac) @@ -501,7 +489,6 @@ OSX_monitor::init_window(const video_mode &mode) unsigned char *offsetBuffer = (unsigned char *) the_buffer; offsetBuffer += 1; // OS X NSBitmaps are RGBA, but Basilisk generates ARGB -#ifdef CGIMAGEREF switch ( mode.depth ) { case VDEPTH_1BIT: bpp = 1; break; @@ -571,61 +558,6 @@ OSX_monitor::init_window(const video_mode &mode) // CGDataProviderRef provider, const float decode[], bool shouldInterpolate); #endif - return true; -#endif - - -#ifndef CGIMAGEREF - short bitsPer, samplesPer; // How big is each Pixel? - - if ( mode.depth == VDEPTH_1BIT ) - bitsPer = 1; - else - bitsPer = 8; - - if ( mode.depth == VDEPTH_32BIT ) - samplesPer = 3; - else - samplesPer = 1; -#endif - - -#ifdef NSBITMAP - bitmap = [NSBitmapImageRep alloc]; - bitmap = [bitmap initWithBitmapDataPlanes: (unsigned char **) &offsetBuffer - pixelsWide: mode.x - pixelsHigh: mode.y - bitsPerSample: bitsPer - samplesPerPixel: samplesPer - hasAlpha: NO - isPlanar: NO - colorSpaceName: NSCalibratedRGBColorSpace - bytesPerRow: mode.bytes_per_row - bitsPerPixel: bits_from_depth(mode.depth)]; - - if ( ! bitmap ) - { - ErrorAlert("Could not allocate an NSBitmapImageRep"); - return false; - } - - [output readyToDraw: bitmap - imageWidth: mode.x - imageHeight: mode.y]; -#endif - -#ifdef CGDRAWBITMAP - [output readyToDraw: offsetBuffer - width: mode.x - height: mode.y - bps: bitsPer - spp: samplesPer - bpp: bits_from_depth(mode.depth) - bpr: mode.bytes_per_row - isPlanar: NO - hasAlpha: NO]; -#endif - return true; } @@ -780,13 +712,11 @@ bool VideoInit(bool classic) case DISPLAY_OPENGL: // Same as window depths and sizes? case DISPLAY_WINDOW: -#ifdef CGIMAGEREF add_standard_modes(VDEPTH_1BIT); add_standard_modes(VDEPTH_2BIT); add_standard_modes(VDEPTH_4BIT); add_standard_modes(VDEPTH_8BIT); add_standard_modes(VDEPTH_16BIT); -#endif add_standard_modes(VDEPTH_32BIT); break; } @@ -859,14 +789,9 @@ OSX_monitor::video_close() [output disableDrawing]; // Free frame buffer stuff -#ifdef CGIMAGEREF CGImageRelease(imageRef); CGColorSpaceRelease(colourSpace); CGDataProviderRelease(provider); -#endif -#ifdef NSBITMAP - [bitmap release]; -#endif free(the_buffer); break; @@ -929,7 +854,6 @@ OSX_monitor::set_palette(uint8 *pal, int num) CGPaletteRelease(CGpal); } -#ifdef CGIMAGEREF if ( display_type != DISPLAY_WINDOW ) return; @@ -981,7 +905,6 @@ OSX_monitor::set_palette(uint8 *pal, int num) CGColorSpaceRelease(oldColourSpace); CGImageRelease(oldImageRef); -#endif } @@ -1028,7 +951,6 @@ OSX_monitor::switch_to_current_mode(void) failure = "Could not get base address of screen"; } -#ifdef CGIMAGEREF // Clean up the old CGImageRef stuff else if ( display_type == DISPLAY_WINDOW && imageRef ) { @@ -1047,7 +969,6 @@ OSX_monitor::switch_to_current_mode(void) else failure = "Could not video_open() requested mode"; } -#endif else if ( ! video_open(mode) ) failure = "Could not video_open() requested mode"; From e42a40f832f00bae973e94cb405114cbef6e658f Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sat, 2 Dec 2017 15:34:18 -0500 Subject: [PATCH 20/67] Make Basilisk's configure.ac's SDL detection logic match SS's. --- BasiliskII/src/Unix/configure.ac | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/BasiliskII/src/Unix/configure.ac b/BasiliskII/src/Unix/configure.ac index 0a05d16f..b201cd4e 100644 --- a/BasiliskII/src/Unix/configure.ac +++ b/BasiliskII/src/Unix/configure.ac @@ -300,13 +300,22 @@ if [[ "x$WANT_SDL" = "xyes" ]]; then ac_cv_framework_SDL=no fi if [[ "x$ac_cv_framework_SDL" = "xno" ]]; then - PKG_CHECK_MODULES([sdl], [sdl >= 1.2], [ - CFLAGS="$CFLAGS $sdl_CFLAGS" - CXXFLAGS="$CXXFLAGS $sdl_CFLAGS" - LIBS="$LIBS $sdl_LIBS" - ], [ - WANT_SDL=no - ]) + AC_PATH_PROG(sdl_config, "sdl-config") + if [[ -n "$sdl_config" ]]; then + sdl_cflags=`$sdl_config --cflags` + if [[ "x$WANT_SDL_STATIC" = "xyes" ]]; then + sdl_libs=`$sdl_config --static-libs` + else + sdl_libs=`$sdl_config --libs` + fi + CFLAGS="$CFLAGS $sdl_cflags" + CXXFLAGS="$CXXFLAGS $sdl_cflags" + LIBS="$LIBS $sdl_libs" + else + WANT_SDL=no + WANT_SDL_VIDEO=no + WANT_SDL_AUDIO=no + fi fi SDL_SUPPORT=`echo "$SDL_SUPPORT" | sed -e "s/^ //"` else From f22a1eecefcc83404d414ecce1f192980d2f5d50 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 13:43:03 -0500 Subject: [PATCH 21/67] remove stray non-ascii chars at start of mon_cmd.cpp --- cxmon/src/mon_cmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cxmon/src/mon_cmd.cpp b/cxmon/src/mon_cmd.cpp index 3975ead5..8ddcac7e 100644 --- a/cxmon/src/mon_cmd.cpp +++ b/cxmon/src/mon_cmd.cpp @@ -1,4 +1,4 @@ -/* +/* * mon_cmd.cpp - cxmon standard commands * * cxmon (C) 1997-2004 Christian Bauer, Marc Hellwig From f99fc0ec71dd5ad59986745871c5fcdc97e9bcab Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 14:54:50 -0500 Subject: [PATCH 22/67] Fix SDL support message in configure based on detection logic. --- BasiliskII/src/Unix/configure.ac | 1 + SheepShaver/src/Unix/configure.ac | 1 + 2 files changed, 2 insertions(+) diff --git a/BasiliskII/src/Unix/configure.ac b/BasiliskII/src/Unix/configure.ac index b201cd4e..c883ac56 100644 --- a/BasiliskII/src/Unix/configure.ac +++ b/BasiliskII/src/Unix/configure.ac @@ -315,6 +315,7 @@ if [[ "x$WANT_SDL" = "xyes" ]]; then WANT_SDL=no WANT_SDL_VIDEO=no WANT_SDL_AUDIO=no + SDL_SUPPORT="none" fi fi SDL_SUPPORT=`echo "$SDL_SUPPORT" | sed -e "s/^ //"` diff --git a/SheepShaver/src/Unix/configure.ac b/SheepShaver/src/Unix/configure.ac index 39f18115..006fe872 100644 --- a/SheepShaver/src/Unix/configure.ac +++ b/SheepShaver/src/Unix/configure.ac @@ -209,6 +209,7 @@ if [[ "x$WANT_SDL" = "xyes" ]]; then WANT_SDL=no WANT_SDL_VIDEO=no WANT_SDL_AUDIO=no + SDL_SUPPORT="none" fi fi SDL_SUPPORT=`echo "$SDL_SUPPORT" | sed -e "s/^ //"` From 93d6a4527ebd3ec8574ea5d22adb2658a8dbd6d1 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 15:32:04 -0500 Subject: [PATCH 23/67] clean up some code --- BasiliskII/src/Unix/sysdeps.h | 13 ------------- BasiliskII/src/Windows/sysdeps.h | 13 ------------- 2 files changed, 26 deletions(-) diff --git a/BasiliskII/src/Unix/sysdeps.h b/BasiliskII/src/Unix/sysdeps.h index d74a2eda..7ac37f29 100644 --- a/BasiliskII/src/Unix/sysdeps.h +++ b/BasiliskII/src/Unix/sysdeps.h @@ -424,30 +424,17 @@ static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {uint8 *b = (uint8 *)a #if defined(__i386__) || defined(__x86_64__) /* Intel x86 */ -#define X86_PPRO_OPT static inline uae_u32 do_get_mem_long(uae_u32 *a) {uint32 retval; __asm__ ("bswap %0" : "=r" (retval) : "0" (*a) : "cc"); return retval;} -#ifdef X86_PPRO_OPT static inline uae_u32 do_get_mem_word(uae_u16 *a) {uint32 retval; __asm__ ("movzwl %w1,%k0\n\tshll $16,%k0\n\tbswapl %k0\n" : "=&r" (retval) : "m" (*a) : "cc"); return retval;} -#else -static inline uae_u32 do_get_mem_word(uae_u16 *a) {uint32 retval; __asm__ ("xorl %k0,%k0\n\tmovw %w1,%w0\n\trolw $8,%w0" : "=&r" (retval) : "m" (*a) : "cc"); return retval;} -#endif #define HAVE_GET_WORD_UNSWAPPED #define do_get_mem_word_unswapped(a) ((uae_u32)*((uae_u16 *)(a))) static inline void do_put_mem_long(uae_u32 *a, uae_u32 v) {__asm__ ("bswap %0" : "=r" (v) : "0" (v) : "cc"); *a = v;} -#ifdef X86_PPRO_OPT static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {__asm__ ("bswapl %0" : "=&r" (v) : "0" (v << 16) : "cc"); *a = v;} -#else -static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {__asm__ ("rolw $8,%0" : "=r" (v) : "0" (v) : "cc"); *a = v;} -#endif #define HAVE_OPTIMIZED_BYTESWAP_32 /* bswap doesn't affect condition codes */ static inline uae_u32 do_byteswap_32(uae_u32 v) {__asm__ ("bswap %0" : "=r" (v) : "0" (v)); return v;} #define HAVE_OPTIMIZED_BYTESWAP_16 -#ifdef X86_PPRO_OPT static inline uae_u32 do_byteswap_16(uae_u32 v) {__asm__ ("bswapl %0" : "=&r" (v) : "0" (v << 16) : "cc"); return v;} -#else -static inline uae_u32 do_byteswap_16(uae_u32 v) {__asm__ ("rolw $8,%0" : "=r" (v) : "0" (v) : "cc"); return v;} -#endif #elif defined(CPU_CAN_ACCESS_UNALIGNED) diff --git a/BasiliskII/src/Windows/sysdeps.h b/BasiliskII/src/Windows/sysdeps.h index c1d7898f..3f11226f 100755 --- a/BasiliskII/src/Windows/sysdeps.h +++ b/BasiliskII/src/Windows/sysdeps.h @@ -220,7 +220,6 @@ static inline int spin_trylock(spinlock_t *lock) } #endif -#define X86_PPRO_OPT #define HAVE_OPTIMIZED_BYTESWAP_32 #define HAVE_OPTIMIZED_BYTESWAP_16 @@ -234,24 +233,12 @@ static inline uae_u32 do_byteswap_16_g(uae_u32 v) {return _byteswap_ushort(v);} #else /* Intel x86 */ static inline uae_u32 do_get_mem_long(uae_u32 *a) {uint32 retval; __asm__ ("bswap %0" : "=r" (retval) : "0" (*a) : "cc"); return retval;} -#ifdef X86_PPRO_OPT static inline uae_u32 do_get_mem_word(uae_u16 *a) {uint32 retval; __asm__ ("movzwl %w1,%k0\n\tshll $16,%k0\n\tbswapl %k0\n" : "=&r" (retval) : "m" (*a) : "cc"); return retval;} -#else -static inline uae_u32 do_get_mem_word(uae_u16 *a) {uint32 retval; __asm__ ("xorl %k0,%k0\n\tmovw %w1,%w0\n\trolw $8,%w0" : "=&r" (retval) : "m" (*a) : "cc"); return retval;} -#endif static inline void do_put_mem_long(uae_u32 *a, uae_u32 v) {__asm__ ("bswap %0" : "=r" (v) : "0" (v) : "cc"); *a = v;} -#ifdef X86_PPRO_OPT static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {__asm__ ("bswapl %0" : "=&r" (v) : "0" (v << 16) : "cc"); *a = v;} -#else -static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {__asm__ ("rolw $8,%0" : "=r" (v) : "0" (v) : "cc"); *a = v;} -#endif /* bswap doesn't affect condition codes */ static inline uae_u32 do_byteswap_32_g(uae_u32 v) {__asm__ ("bswap %0" : "=r" (v) : "0" (v)); return v;} -#ifdef X86_PPRO_OPT static inline uae_u32 do_byteswap_16_g(uae_u32 v) {__asm__ ("bswapl %0" : "=&r" (v) : "0" (v << 16) : "cc"); return v;} -#else -static inline uae_u32 do_byteswap_16_g(uae_u32 v) {__asm__ ("rolw $8,%0" : "=r" (v) : "0" (v) : "cc"); return v;} -#endif #endif #define HAVE_GET_WORD_UNSWAPPED From af642edc16b458f108d41b176dafaf3fcb0eab7e Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 15:39:51 -0500 Subject: [PATCH 24/67] clean up some code --- BasiliskII/src/SDL/video_sdl.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/BasiliskII/src/SDL/video_sdl.cpp b/BasiliskII/src/SDL/video_sdl.cpp index 3db0d71f..011941f9 100644 --- a/BasiliskII/src/SDL/video_sdl.cpp +++ b/BasiliskII/src/SDL/video_sdl.cpp @@ -496,7 +496,7 @@ static void add_mode(int type, int width, int height, int resolution_id, int byt } // Set Mac frame layout and base address (uses the_buffer/MacFrameBaseMac) -static void set_mac_frame_buffer(SDL_monitor_desc &monitor, int depth, bool native_byte_order) +static void set_mac_frame_buffer(SDL_monitor_desc &monitor, int depth) { #if !REAL_ADDRESSING && !DIRECT_ADDRESSING int layout = FLAYOUT_DIRECT; @@ -504,10 +504,7 @@ static void set_mac_frame_buffer(SDL_monitor_desc &monitor, int depth, bool nati layout = (screen_depth == 15) ? FLAYOUT_HOST_555 : FLAYOUT_HOST_565; else if (depth == VIDEO_DEPTH_32BIT) layout = (screen_depth == 24) ? FLAYOUT_HOST_888 : FLAYOUT_DIRECT; - if (native_byte_order) - MacFrameLayout = layout; - else - MacFrameLayout = FLAYOUT_DIRECT; + MacFrameLayout = layout; monitor.set_mac_frame_base(MacFrameBaseMac); // Set variables used by UAE memory banking @@ -688,7 +685,7 @@ void driver_base::init() } // Set frame buffer base - set_mac_frame_buffer(monitor, VIDEO_MODE_DEPTH, true); + set_mac_frame_buffer(monitor, VIDEO_MODE_DEPTH); adapt_to_video_mode(); } From 34624eee4b2565565c6d9def9a81219058185976 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 15:44:31 -0500 Subject: [PATCH 25/67] fix colors in b2 video_macosx.mm code --- BasiliskII/src/MacOSX/video_macosx.mm | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/BasiliskII/src/MacOSX/video_macosx.mm b/BasiliskII/src/MacOSX/video_macosx.mm index d4eff082..510b6e6c 100644 --- a/BasiliskII/src/MacOSX/video_macosx.mm +++ b/BasiliskII/src/MacOSX/video_macosx.mm @@ -422,17 +422,10 @@ void OSX_monitor::set_mac_frame_buffer(const video_mode mode) { #if !REAL_ADDRESSING && !DIRECT_ADDRESSING - switch ( mode.depth ) - { - // case VDEPTH_15BIT: - case VDEPTH_16BIT: MacFrameLayout = FLAYOUT_HOST_555; break; - // case VDEPTH_24BIT: - case VDEPTH_32BIT: MacFrameLayout = FLAYOUT_HOST_888; break; - default : MacFrameLayout = FLAYOUT_DIRECT; - } set_mac_frame_base(MacFrameBaseMac); // Set variables used by UAE memory banking + MacFrameLayout = FLAYOUT_DIRECT; MacFrameBaseHost = (uint8 *) the_buffer; MacFrameSize = mode.bytes_per_row * mode.y; InitFrameBufferMapping(); From d693c8d6c8e0b3c272dcf48f7a90961c722c5472 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 15:59:14 -0500 Subject: [PATCH 26/67] clean up disabled / non-working modes out of video_macosx.mm/.h --- BasiliskII/src/MacOSX/video_macosx.h | 10 ---- BasiliskII/src/MacOSX/video_macosx.mm | 79 --------------------------- 2 files changed, 89 deletions(-) diff --git a/BasiliskII/src/MacOSX/video_macosx.h b/BasiliskII/src/MacOSX/video_macosx.h index 9cecd9f2..e83f2bd6 100644 --- a/BasiliskII/src/MacOSX/video_macosx.h +++ b/BasiliskII/src/MacOSX/video_macosx.h @@ -22,16 +22,6 @@ #import -/* Set the strategy for drawing the bitmap in the Mac OS X window */ -//#define CGDRAWBITMAP -#if defined __i386__ -#define CGIMAGEREF -//#define NSBITMAP -#else -#define CGIMAGEREF -//#define NSBITMAP -#endif - // Using Core Graphics is fastest when rendering 32bit data. // Using CGImageRefs allows us to use all the bitmaps that BasiliskII supports. // When both Basilisk II and OS X are set to 'Thousands', updating a 312x342 diff --git a/BasiliskII/src/MacOSX/video_macosx.mm b/BasiliskII/src/MacOSX/video_macosx.mm index 510b6e6c..8323038c 100644 --- a/BasiliskII/src/MacOSX/video_macosx.mm +++ b/BasiliskII/src/MacOSX/video_macosx.mm @@ -371,16 +371,11 @@ class OSX_monitor : public monitor_desc bool init_window(const video_mode &mode); -#ifdef CGIMAGEREF CGColorSpaceRef colourSpace; uint8 *colourTable; CGImageRef imageRef; CGDataProviderRef provider; short x, y, bpp, depth, bpr; -#endif -#ifdef NSBITMAP - NSBitmapImageRep *bitmap; -#endif void *the_buffer; @@ -397,24 +392,17 @@ OSX_monitor :: OSX_monitor (const vector &available_modes, uint32 default_id) : monitor_desc (available_modes, default_depth, default_id) { -#ifdef CGIMAGEREF colourSpace = nil; colourTable = (uint8 *) malloc(256 * 3); imageRef = nil; provider = nil; -#endif -#ifdef NSBITMAP - bitmap = nil; -#endif newMode = originalMode = nil; the_buffer = NULL; theDisplay = nil; }; // Should also have a destructor which does -//#ifdef CGIMAGEREF // free(colourTable); -//#endif // Set Mac frame layout and base address (uses the_buffer/MacFrameBaseMac) @@ -501,7 +489,6 @@ OSX_monitor::init_window(const video_mode &mode) unsigned char *offsetBuffer = (unsigned char *) the_buffer; offsetBuffer += 1; // OS X NSBitmaps are RGBA, but Basilisk generates ARGB -#ifdef CGIMAGEREF switch ( mode.depth ) { case VDEPTH_1BIT: bpp = 1; break; @@ -571,61 +558,6 @@ OSX_monitor::init_window(const video_mode &mode) // CGDataProviderRef provider, const float decode[], bool shouldInterpolate); #endif - return true; -#endif - - -#ifndef CGIMAGEREF - short bitsPer, samplesPer; // How big is each Pixel? - - if ( mode.depth == VDEPTH_1BIT ) - bitsPer = 1; - else - bitsPer = 8; - - if ( mode.depth == VDEPTH_32BIT ) - samplesPer = 3; - else - samplesPer = 1; -#endif - - -#ifdef NSBITMAP - bitmap = [NSBitmapImageRep alloc]; - bitmap = [bitmap initWithBitmapDataPlanes: (unsigned char **) &offsetBuffer - pixelsWide: mode.x - pixelsHigh: mode.y - bitsPerSample: bitsPer - samplesPerPixel: samplesPer - hasAlpha: NO - isPlanar: NO - colorSpaceName: NSCalibratedRGBColorSpace - bytesPerRow: mode.bytes_per_row - bitsPerPixel: bits_from_depth(mode.depth)]; - - if ( ! bitmap ) - { - ErrorAlert("Could not allocate an NSBitmapImageRep"); - return false; - } - - [output readyToDraw: bitmap - imageWidth: mode.x - imageHeight: mode.y]; -#endif - -#ifdef CGDRAWBITMAP - [output readyToDraw: offsetBuffer - width: mode.x - height: mode.y - bps: bitsPer - spp: samplesPer - bpp: bits_from_depth(mode.depth) - bpr: mode.bytes_per_row - isPlanar: NO - hasAlpha: NO]; -#endif - return true; } @@ -780,13 +712,11 @@ bool VideoInit(bool classic) case DISPLAY_OPENGL: // Same as window depths and sizes? case DISPLAY_WINDOW: -#ifdef CGIMAGEREF add_standard_modes(VDEPTH_1BIT); add_standard_modes(VDEPTH_2BIT); add_standard_modes(VDEPTH_4BIT); add_standard_modes(VDEPTH_8BIT); add_standard_modes(VDEPTH_16BIT); -#endif add_standard_modes(VDEPTH_32BIT); break; } @@ -859,14 +789,9 @@ OSX_monitor::video_close() [output disableDrawing]; // Free frame buffer stuff -#ifdef CGIMAGEREF CGImageRelease(imageRef); CGColorSpaceRelease(colourSpace); CGDataProviderRelease(provider); -#endif -#ifdef NSBITMAP - [bitmap release]; -#endif free(the_buffer); break; @@ -929,7 +854,6 @@ OSX_monitor::set_palette(uint8 *pal, int num) CGPaletteRelease(CGpal); } -#ifdef CGIMAGEREF if ( display_type != DISPLAY_WINDOW ) return; @@ -981,7 +905,6 @@ OSX_monitor::set_palette(uint8 *pal, int num) CGColorSpaceRelease(oldColourSpace); CGImageRelease(oldImageRef); -#endif } @@ -1028,7 +951,6 @@ OSX_monitor::switch_to_current_mode(void) failure = "Could not get base address of screen"; } -#ifdef CGIMAGEREF // Clean up the old CGImageRef stuff else if ( display_type == DISPLAY_WINDOW && imageRef ) { @@ -1047,7 +969,6 @@ OSX_monitor::switch_to_current_mode(void) else failure = "Could not video_open() requested mode"; } -#endif else if ( ! video_open(mode) ) failure = "Could not video_open() requested mode"; From bc7edbc677061f7448e9e16cb0209ef386230df4 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sat, 25 Nov 2017 13:45:49 -0500 Subject: [PATCH 27/67] move STR_WINDOW_TITLE_GRABBED to user_strings.h and fix header guard for user_strings_unix.h --- SheepShaver/src/Unix/user_strings_unix.h | 5 ++--- SheepShaver/src/include/user_strings.h | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/SheepShaver/src/Unix/user_strings_unix.h b/SheepShaver/src/Unix/user_strings_unix.h index be9ea0bb..8858684c 100644 --- a/SheepShaver/src/Unix/user_strings_unix.h +++ b/SheepShaver/src/Unix/user_strings_unix.h @@ -18,8 +18,8 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#ifndef USER_STRINGS_LINUX_H -#define USER_STRINGS_LINUX_H +#ifndef USER_STRINGS_UNIX_H +#define USER_STRINGS_UNIX_H enum { STR_NO_DEV_ZERO_ERR = 10000, @@ -78,7 +78,6 @@ enum { STR_MOUSEWHEELLINES_CTRL, STR_OPEN_WINDOW_ERR, - STR_WINDOW_TITLE_GRABBED, STR_NO_B2_EXE_FOUND }; diff --git a/SheepShaver/src/include/user_strings.h b/SheepShaver/src/include/user_strings.h index 12ea12eb..c0fbb6dc 100644 --- a/SheepShaver/src/include/user_strings.h +++ b/SheepShaver/src/include/user_strings.h @@ -166,6 +166,7 @@ enum { // Mac window STR_WINDOW_TITLE = 4000, STR_WINDOW_TITLE_FROZEN, + STR_WINDOW_TITLE_GRABBED, STR_WINDOW_MENU = 4050, STR_WINDOW_ITEM_ABOUT, STR_WINDOW_ITEM_REFRESH, From 1e4e7179d4f910a0315a676d72140f9581d0c73f Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sat, 25 Nov 2017 13:52:40 -0500 Subject: [PATCH 28/67] more changes needed to move STR_WINDOW_TITLE_GRABBED cross-platform code --- BasiliskII/src/Unix/user_strings_unix.cpp | 2 -- BasiliskII/src/Unix/user_strings_unix.h | 2 -- BasiliskII/src/Windows/user_strings_windows.cpp | 1 - BasiliskII/src/Windows/user_strings_windows.h | 1 - BasiliskII/src/include/user_strings.h | 1 + BasiliskII/src/user_strings.cpp | 1 + SheepShaver/src/Unix/user_strings_unix.cpp | 1 - SheepShaver/src/Windows/user_strings_windows.cpp | 1 - SheepShaver/src/Windows/user_strings_windows.h | 1 - SheepShaver/src/user_strings.cpp | 1 + 10 files changed, 3 insertions(+), 9 deletions(-) diff --git a/BasiliskII/src/Unix/user_strings_unix.cpp b/BasiliskII/src/Unix/user_strings_unix.cpp index f095e06c..b04762db 100644 --- a/BasiliskII/src/Unix/user_strings_unix.cpp +++ b/BasiliskII/src/Unix/user_strings_unix.cpp @@ -84,8 +84,6 @@ user_string_def platform_strings[] = { {STR_IGNORESEGV_CTRL, "Ignore Illegal Memory Accesses"}, - {STR_WINDOW_TITLE_GRABBED, "Basilisk II (mouse grabbed, press Ctrl-F5 to release)"}, - {STR_NO_B2_EXE_FOUND, "Could not start %s (%s)."}, {-1, NULL} // End marker diff --git a/BasiliskII/src/Unix/user_strings_unix.h b/BasiliskII/src/Unix/user_strings_unix.h index 9bdb9f62..b47f442a 100644 --- a/BasiliskII/src/Unix/user_strings_unix.h +++ b/BasiliskII/src/Unix/user_strings_unix.h @@ -75,8 +75,6 @@ enum { STR_IGNORESEGV_CTRL, - STR_WINDOW_TITLE_GRABBED, - STR_NO_B2_EXE_FOUND }; diff --git a/BasiliskII/src/Windows/user_strings_windows.cpp b/BasiliskII/src/Windows/user_strings_windows.cpp index c2241250..0d98d61f 100755 --- a/BasiliskII/src/Windows/user_strings_windows.cpp +++ b/BasiliskII/src/Windows/user_strings_windows.cpp @@ -37,7 +37,6 @@ user_string_def platform_strings[] = { {STR_NO_AUDIO_WARN, "No audio device found, audio output will be disabled."}, {STR_KEYCODE_FILE_WARN, "Cannot open keycode translation file %s (%s)."}, {STR_KEYCODE_VENDOR_WARN, "Cannot find vendor '%s' in keycode translation file %s."}, - {STR_WINDOW_TITLE_GRABBED, "Basilisk II (mouse grabbed, press Ctrl-F5 to release)"}, {STR_NO_WIN32_NT_4, "Basilisk II does not run on Windows NT versions less than 4.0"}, {STR_PREFS_MENU_FILE_GTK, "/_File"}, diff --git a/BasiliskII/src/Windows/user_strings_windows.h b/BasiliskII/src/Windows/user_strings_windows.h index ccf5ff54..c8e21e31 100755 --- a/BasiliskII/src/Windows/user_strings_windows.h +++ b/BasiliskII/src/Windows/user_strings_windows.h @@ -39,7 +39,6 @@ enum { STR_NO_AUDIO_WARN, STR_KEYCODE_FILE_WARN, STR_KEYCODE_VENDOR_WARN, - STR_WINDOW_TITLE_GRABBED, STR_NO_WIN32_NT_4, STR_PREFS_MENU_FILE_GTK, diff --git a/BasiliskII/src/include/user_strings.h b/BasiliskII/src/include/user_strings.h index 7f2958f4..24a0b28a 100644 --- a/BasiliskII/src/include/user_strings.h +++ b/BasiliskII/src/include/user_strings.h @@ -213,6 +213,7 @@ enum { // Mac window STR_WINDOW_TITLE = 4000, STR_WINDOW_TITLE_FROZEN, + STR_WINDOW_TITLE_GRABBED, STR_WINDOW_MENU = 4050, STR_WINDOW_ITEM_ABOUT, STR_WINDOW_ITEM_REFRESH, diff --git a/BasiliskII/src/user_strings.cpp b/BasiliskII/src/user_strings.cpp index f4861825..55a7fb87 100644 --- a/BasiliskII/src/user_strings.cpp +++ b/BasiliskII/src/user_strings.cpp @@ -226,6 +226,7 @@ user_string_def common_strings[] = { {STR_WINDOW_TITLE, "Basilisk II"}, {STR_WINDOW_TITLE_FROZEN, "Basilisk II *** FROZEN ***"}, + {STR_WINDOW_TITLE_GRABBED, "Basilisk II (mouse grabbed, press Ctrl-F5 to release)"}, {STR_WINDOW_MENU, "Basilisk II"}, {STR_WINDOW_ITEM_ABOUT, "About Basilisk II" ELLIPSIS}, {STR_WINDOW_ITEM_REFRESH, "Refresh Rate"}, diff --git a/SheepShaver/src/Unix/user_strings_unix.cpp b/SheepShaver/src/Unix/user_strings_unix.cpp index 5a3b21f5..4aafced5 100644 --- a/SheepShaver/src/Unix/user_strings_unix.cpp +++ b/SheepShaver/src/Unix/user_strings_unix.cpp @@ -84,7 +84,6 @@ user_string_def platform_strings[] = { {STR_VOSF_INIT_ERR, "Cannot initialize Video on SEGV signals."}, {STR_OPEN_WINDOW_ERR, "Cannot open Mac window."}, - {STR_WINDOW_TITLE_GRABBED, "SheepShaver (mouse grabbed, press Ctrl-F5 to release)"}, {STR_NO_B2_EXE_FOUND, "Could not start %s (%s)."}, diff --git a/SheepShaver/src/Windows/user_strings_windows.cpp b/SheepShaver/src/Windows/user_strings_windows.cpp index 92555c8f..32e52d25 100755 --- a/SheepShaver/src/Windows/user_strings_windows.cpp +++ b/SheepShaver/src/Windows/user_strings_windows.cpp @@ -45,7 +45,6 @@ user_string_def platform_strings[] = { {STR_VOSF_INIT_ERR, "Cannot initialize Video on SEGV signals."}, {STR_OPEN_WINDOW_ERR, "Cannot open Mac window."}, - {STR_WINDOW_TITLE_GRABBED, "SheepShaver (mouse grabbed, press Ctrl-F5 to release)"}, {STR_NO_WIN32_NT_4, "SheepShaver does not run on Windows NT versions less than 4.0"}, {STR_PREFS_MENU_FILE_GTK, "/_File"}, diff --git a/SheepShaver/src/Windows/user_strings_windows.h b/SheepShaver/src/Windows/user_strings_windows.h index 7980c5f7..7db10a74 100755 --- a/SheepShaver/src/Windows/user_strings_windows.h +++ b/SheepShaver/src/Windows/user_strings_windows.h @@ -39,7 +39,6 @@ enum { STR_KEYCODE_FILE_WARN, STR_KEYCODE_VENDOR_WARN, STR_OPEN_WINDOW_ERR, - STR_WINDOW_TITLE_GRABBED, STR_NO_WIN32_NT_4, STR_PREFS_MENU_FILE_GTK, diff --git a/SheepShaver/src/user_strings.cpp b/SheepShaver/src/user_strings.cpp index 4041d451..f4618b55 100644 --- a/SheepShaver/src/user_strings.cpp +++ b/SheepShaver/src/user_strings.cpp @@ -172,6 +172,7 @@ user_string_def common_strings[] = { {STR_WINDOW_TITLE, "SheepShaver"}, {STR_WINDOW_TITLE_FROZEN, "SheepShaver *** FROZEN ***"}, + {STR_WINDOW_TITLE_GRABBED, "SheepShaver (mouse grabbed, press Ctrl-F5 to release)"}, {STR_WINDOW_MENU, "SheepShaver"}, {STR_WINDOW_ITEM_ABOUT, "About SheepShaver" ELLIPSIS}, {STR_WINDOW_ITEM_REFRESH, "Refresh Rate"}, From db72f9142e51101285fa1579e291a1ea50c750d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesu=CC=81s=20A=2E=20A=CC=81lvarez?= Date: Tue, 28 Nov 2017 22:53:29 +0100 Subject: [PATCH 29/67] fix for extfs on 64-bit macOS/iOS --- BasiliskII/src/extfs.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BasiliskII/src/extfs.cpp b/BasiliskII/src/extfs.cpp index 99470e8f..1dc47f94 100644 --- a/BasiliskII/src/extfs.cpp +++ b/BasiliskII/src/extfs.cpp @@ -175,9 +175,9 @@ static uint32 next_cnid = fsUsrCNID; // Next available CNID #if defined __APPLE__ && defined __MACH__ struct crtimebuf { - unsigned long length; + u_int32_t length; struct timespec crtime; -}; +} __attribute__((aligned(4), packed)); static uint32 do_get_creation_time(const char *path) { From e44a75d7ebaf6381552067c0d229f2dc5bfea446 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jesu=CC=81s=20A=2E=20A=CC=81lvarez?= Date: Thu, 30 Nov 2017 18:03:43 +0100 Subject: [PATCH 30/67] fix indentation --- BasiliskII/src/extfs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BasiliskII/src/extfs.cpp b/BasiliskII/src/extfs.cpp index 1dc47f94..e18d1df1 100644 --- a/BasiliskII/src/extfs.cpp +++ b/BasiliskII/src/extfs.cpp @@ -176,7 +176,7 @@ static uint32 next_cnid = fsUsrCNID; // Next available CNID #if defined __APPLE__ && defined __MACH__ struct crtimebuf { u_int32_t length; - struct timespec crtime; + struct timespec crtime; } __attribute__((aligned(4), packed)); static uint32 do_get_creation_time(const char *path) From b150b42fc6d5917646e9726d07bfabefc861254f Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sat, 2 Dec 2017 12:21:13 -0500 Subject: [PATCH 31/67] Fix some string conversion warnings. --- BasiliskII/src/MacOSX/main_macosx.mm | 4 ++-- BasiliskII/src/Unix/main_unix.cpp | 6 +++--- BasiliskII/src/Windows/main_windows.cpp | 2 +- BasiliskII/src/emul_op.cpp | 6 +++--- BasiliskII/src/uae_cpu/compiler/compemu_support.cpp | 2 +- BasiliskII/src/uae_cpu/newcpu.h | 4 ++-- SheepShaver/src/Unix/main_unix.cpp | 2 +- SheepShaver/src/emul_ppc/emul_ppc.cpp | 2 +- SheepShaver/src/kpx_cpu/sheepshaver_glue.cpp | 2 +- SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-cpu.cpp | 2 +- SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-execute.cpp | 2 +- SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-translate.cpp | 2 +- cxmon/README | 2 +- cxmon/src/mon.cpp | 4 ++-- cxmon/src/mon.h | 2 +- cxmon/src/mon_ppc.cpp | 10 +++++----- 16 files changed, 27 insertions(+), 27 deletions(-) diff --git a/BasiliskII/src/MacOSX/main_macosx.mm b/BasiliskII/src/MacOSX/main_macosx.mm index abb046c1..b14a2ede 100644 --- a/BasiliskII/src/MacOSX/main_macosx.mm +++ b/BasiliskII/src/MacOSX/main_macosx.mm @@ -176,7 +176,7 @@ static void sigsegv_dump_state(sigsegv_info_t *sip) #endif VideoQuitFullScreen(); #ifdef ENABLE_MON - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); #endif QuitEmulator(); @@ -550,7 +550,7 @@ static void sigint_handler(...) extern void m68k_dumpstate(uaecptr *nextpc); m68k_dumpstate(&nextpc); VideoQuitFullScreen(); - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); QuitEmulator(); } diff --git a/BasiliskII/src/Unix/main_unix.cpp b/BasiliskII/src/Unix/main_unix.cpp index 9aadbbf8..c4f975a3 100644 --- a/BasiliskII/src/Unix/main_unix.cpp +++ b/BasiliskII/src/Unix/main_unix.cpp @@ -292,7 +292,7 @@ static void sigsegv_dump_state(sigsegv_info_t *sip) #endif VideoQuitFullScreen(); #ifdef ENABLE_MON - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); #endif QuitEmulator(); @@ -958,7 +958,7 @@ static void sigint_handler(...) m68k_dumpstate(&nextpc); #endif VideoQuitFullScreen(); - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); QuitEmulator(); } @@ -1505,7 +1505,7 @@ ill: printf("SIGILL num %d, code %d\n", sig, code); VideoQuitFullScreen(); #ifdef ENABLE_MON - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); #endif QuitEmulator(); diff --git a/BasiliskII/src/Windows/main_windows.cpp b/BasiliskII/src/Windows/main_windows.cpp index 7d555c98..184a2dc6 100755 --- a/BasiliskII/src/Windows/main_windows.cpp +++ b/BasiliskII/src/Windows/main_windows.cpp @@ -181,7 +181,7 @@ static void sigsegv_dump_state(sigsegv_info_t *sip) #endif VideoQuitFullScreen(); #ifdef ENABLE_MON - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); QuitEmulator(); #endif diff --git a/BasiliskII/src/emul_op.cpp b/BasiliskII/src/emul_op.cpp index 6051f9e2..bdab4f63 100644 --- a/BasiliskII/src/emul_op.cpp +++ b/BasiliskII/src/emul_op.cpp @@ -70,7 +70,7 @@ void EmulOp(uint16 opcode, M68kRegisters *r) r->sr); VideoQuitFullScreen(); #ifdef ENABLE_MON - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); #endif QuitEmulator(); @@ -575,7 +575,7 @@ void EmulOp(uint16 opcode, M68kRegisters *r) r->a[0], r->a[1], r->a[2], r->a[3], r->a[4], r->a[5], r->a[6], r->a[7], r->sr); #ifdef ENABLE_MON - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); #endif break; @@ -592,7 +592,7 @@ void EmulOp(uint16 opcode, M68kRegisters *r) r->a[0], r->a[1], r->a[2], r->a[3], r->a[4], r->a[5], r->a[6], r->a[7], r->sr); #ifdef ENABLE_MON - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); #endif QuitEmulator(); diff --git a/BasiliskII/src/uae_cpu/compiler/compemu_support.cpp b/BasiliskII/src/uae_cpu/compiler/compemu_support.cpp index f31febce..c55ae3b5 100644 --- a/BasiliskII/src/uae_cpu/compiler/compemu_support.cpp +++ b/BasiliskII/src/uae_cpu/compiler/compemu_support.cpp @@ -6533,7 +6533,7 @@ void disasm_block(int target, uint8 * start, size_t length) mon_read_byte = mon_read_byte_jit; mon_write_byte = mon_write_byte_jit; - char *arg[5] = {"mon", "-m", "-r", disasm_str, NULL}; + const char *arg[5] = {"mon", "-m", "-r", disasm_str, NULL}; mon(4, arg); mon_read_byte = old_mon_read_byte; diff --git a/BasiliskII/src/uae_cpu/newcpu.h b/BasiliskII/src/uae_cpu/newcpu.h index 305b242e..bead5234 100644 --- a/BasiliskII/src/uae_cpu/newcpu.h +++ b/BasiliskII/src/uae_cpu/newcpu.h @@ -206,7 +206,7 @@ static __inline__ void m68k_setpc (uaecptr newpc) if (IS_BREAK_POINT(newpc)) { printf("Stopped at break point address: %08lx. Last PC: %08lx\n", newpc, previous_pc); m68k_dumpstate(NULL); - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); } #endif // end of #if ENABLE_MON @@ -223,7 +223,7 @@ static __inline__ void m68k_incpc (uae_s32 delta) if (IS_BREAK_POINT(next_pc)) { printf("Stopped at break point address: %08lx. Last PC: %08lx\n", next_pc, previous_pc); m68k_dumpstate(NULL); - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); } #endif // end of #if ENABLE_MON diff --git a/SheepShaver/src/Unix/main_unix.cpp b/SheepShaver/src/Unix/main_unix.cpp index 3d0ee43e..b6de430b 100644 --- a/SheepShaver/src/Unix/main_unix.cpp +++ b/SheepShaver/src/Unix/main_unix.cpp @@ -1402,7 +1402,7 @@ static void *tick_func(void *arg) #ifdef ENABLE_MON // Start up mon in real-mode printf("Welcome to the sheep factory.\n"); - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); #endif return NULL; diff --git a/SheepShaver/src/emul_ppc/emul_ppc.cpp b/SheepShaver/src/emul_ppc/emul_ppc.cpp index 10584d72..b445f22f 100644 --- a/SheepShaver/src/emul_ppc/emul_ppc.cpp +++ b/SheepShaver/src/emul_ppc/emul_ppc.cpp @@ -212,7 +212,7 @@ static void dump(void) // Start up mon in real-mode #if ENABLE_MON - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); #endif QuitEmulator(); diff --git a/SheepShaver/src/kpx_cpu/sheepshaver_glue.cpp b/SheepShaver/src/kpx_cpu/sheepshaver_glue.cpp index a553973e..af7ba467 100644 --- a/SheepShaver/src/kpx_cpu/sheepshaver_glue.cpp +++ b/SheepShaver/src/kpx_cpu/sheepshaver_glue.cpp @@ -83,7 +83,7 @@ static void enter_mon(void) { // Start up mon in real-mode #if ENABLE_MON - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); #endif } diff --git a/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-cpu.cpp b/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-cpu.cpp index c5de1179..4654a86a 100644 --- a/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-cpu.cpp +++ b/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-cpu.cpp @@ -527,7 +527,7 @@ bool powerpc_cpu::check_spcflags() spcflags().clear(SPCFLAG_CPU_ENTER_MON); #if ENABLE_MON // Start up mon in real-mode - char *arg[] = { + const char *arg[] = { "mon", #ifdef SHEEPSHAVER "-m", diff --git a/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-execute.cpp b/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-execute.cpp index 8c512be8..7154a5af 100644 --- a/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-execute.cpp +++ b/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-execute.cpp @@ -67,7 +67,7 @@ void powerpc_cpu::execute_illegal(uint32 opcode) disass_ppc(stdout, pc(), opcode); // Start up mon in real-mode - char *arg[4] = {"mon", "-m", "-r", NULL}; + const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); #endif abort(); diff --git a/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-translate.cpp b/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-translate.cpp index 1d691ed0..7d023147 100644 --- a/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-translate.cpp +++ b/SheepShaver/src/kpx_cpu/src/cpu/ppc/ppc-translate.cpp @@ -95,7 +95,7 @@ static void disasm_block(int target, uint8 *start, uint32 length) target == TARGET_POWERPC ? "d" : "x", start, start + length - 1); - char *arg[] = {"mon", + const char *arg[] = {"mon", #ifdef SHEEPSHAVER "-m", #endif diff --git a/cxmon/README b/cxmon/README index 44ab37f6..905e6d83 100644 --- a/cxmon/README +++ b/cxmon/README @@ -418,7 +418,7 @@ Here's how to do it (all functions are defined in the mon.h header file): arguments and the mon_read/write_*() functions to access memory. 5. To enter cxmon, call the mon() function like this: - char *args[3] = {"mon", "-r", NULL}; + const char *args[3] = {"mon", "-r", NULL}; mon(2, args); 6. If you're done with cxmon, call mon_exit(). diff --git a/cxmon/src/mon.cpp b/cxmon/src/mon.cpp index 52478b0c..358a6985 100644 --- a/cxmon/src/mon.cpp +++ b/cxmon/src/mon.cpp @@ -872,7 +872,7 @@ static void help_or_hunt() } fprintf(monout, "x Quit mon\n" "h This help text\n"); - fprintf(monout, cmd_help); + fprintf(monout, "%s", cmd_help); } @@ -1180,7 +1180,7 @@ void mon_exit() * Main function, read-execute loop */ -void mon(int argc, char **argv) +void mon(int argc, const char **argv) { bool done = false, interactive = true; diff --git a/cxmon/src/mon.h b/cxmon/src/mon.h index a4e59041..007aef5d 100644 --- a/cxmon/src/mon.h +++ b/cxmon/src/mon.h @@ -31,7 +31,7 @@ void mon_init(); void mon_exit(); -void mon(int argc, char **argv); +void mon(int argc, const char **argv); // Break points prompt const char STR_ACTIVE_BREAK_POINTS[] = "Active Break Points:\n"; diff --git a/cxmon/src/mon_ppc.cpp b/cxmon/src/mon_ppc.cpp index 56683654..d101e726 100644 --- a/cxmon/src/mon_ppc.cpp +++ b/cxmon/src/mon_ppc.cpp @@ -187,7 +187,7 @@ static void disass31(FILE *f, unsigned int adr, unsigned int w); static void disass59(FILE *f, unsigned int adr, unsigned int w); static void disass63(FILE *f, unsigned int adr, unsigned int w); static unsigned int mbme2mask(int mb, int me); -static char *get_spr(int reg); +static const char *get_spr(int reg); /* @@ -279,7 +279,7 @@ void disass_ppc(FILE *f, unsigned int adr, unsigned int w) case 16: { int target = short(imm & 0xfffc); - char *form; + const char *form; if (w & 1) if (w & 2) form = "la"; @@ -817,7 +817,7 @@ static void disass31(FILE *f, unsigned int adr, unsigned int w) else if ((ra | (rb << 5)) == 256) fprintf(f, "mfvrsave\tr%d\n", rd); else { - char *spr = get_spr(ra | (rb << 5)); + const char *spr = get_spr(ra | (rb << 5)); if (spr) fprintf(f, "mfspr\tr%d,%s\n", rd, spr); else @@ -894,7 +894,7 @@ static void disass31(FILE *f, unsigned int adr, unsigned int w) else if ((ra | (rb << 5)) == 256) fprintf(f, "mtvrsave\tr%d\n", rd); else { - char *spr = get_spr(ra | (rb << 5)); + const char *spr = get_spr(ra | (rb << 5)); if (spr) fprintf(f, "mtspr\t%s,r%d\n", spr, rd); else @@ -1058,7 +1058,7 @@ static unsigned int mbme2mask(int mb, int me) * Convert SPR number to register name */ -char *get_spr(int reg) +const char *get_spr(int reg) { switch (reg) { case 1: return "xer"; From 75324c10d05a3ab1d794edea635ce1591eac6334 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sat, 2 Dec 2017 12:27:27 -0500 Subject: [PATCH 32/67] silence some more warnings --- BasiliskII/src/MacOSX/sys_darwin.cpp | 4 ++-- BasiliskII/src/uae_cpu/newcpu.cpp | 2 +- cxmon/src/mon_ppc.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/BasiliskII/src/MacOSX/sys_darwin.cpp b/BasiliskII/src/MacOSX/sys_darwin.cpp index 5a798e70..cc6c8a3c 100644 --- a/BasiliskII/src/MacOSX/sys_darwin.cpp +++ b/BasiliskII/src/MacOSX/sys_darwin.cpp @@ -256,7 +256,7 @@ void DarwinAddFloppyPrefs(void) } // Iterate through each floppy - while ( nextFloppy = IOIteratorNext(allFloppies)) + while ((nextFloppy = IOIteratorNext(allFloppies))) { char bsdPath[MAXPATHLEN]; long size; @@ -333,7 +333,7 @@ void DarwinAddSerialPrefs(void) } // Iterate through each modem - while ( nextModem = IOIteratorNext(allModems)) + while ((nextModem = IOIteratorNext(allModems))) { char bsdPath[MAXPATHLEN]; CFTypeRef bsdPathAsCFString = diff --git a/BasiliskII/src/uae_cpu/newcpu.cpp b/BasiliskII/src/uae_cpu/newcpu.cpp index eb14efd6..51f3fcef 100644 --- a/BasiliskII/src/uae_cpu/newcpu.cpp +++ b/BasiliskII/src/uae_cpu/newcpu.cpp @@ -1170,7 +1170,7 @@ void m68k_mull (uae_u32 opcode, uae_u32 src, uae_u16 extra) } #endif } -static char* ccnames[] = +static const char* ccnames[] = { "T ","F ","HI","LS","CC","CS","NE","EQ", "VC","VS","PL","MI","GE","LT","GT","LE" }; diff --git a/cxmon/src/mon_ppc.cpp b/cxmon/src/mon_ppc.cpp index d101e726..615af158 100644 --- a/cxmon/src/mon_ppc.cpp +++ b/cxmon/src/mon_ppc.cpp @@ -30,7 +30,7 @@ static unsigned short imm; // Codes for trap instructions -static char *to_code[32] = { +static const char *to_code[32] = { NULL, "lgt", "llt", NULL, "eq", "lge", "lle", NULL, "gt", NULL, NULL, NULL, "ge", NULL, NULL, NULL, "lt", NULL, NULL, NULL, "le", NULL, NULL, NULL, From a472d9ab63fb042715650f528453b6dc75c60595 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sat, 2 Dec 2017 12:39:30 -0500 Subject: [PATCH 33/67] fix some format warnings --- BasiliskII/src/uae_cpu/memory.cpp | 18 +++++++++--------- BasiliskII/src/uae_cpu/newcpu.cpp | 22 +++++++++++----------- BasiliskII/src/uae_cpu/newcpu.h | 4 ++-- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/BasiliskII/src/uae_cpu/memory.cpp b/BasiliskII/src/uae_cpu/memory.cpp index 42b855d1..7483f506 100644 --- a/BasiliskII/src/uae_cpu/memory.cpp +++ b/BasiliskII/src/uae_cpu/memory.cpp @@ -89,7 +89,7 @@ static void REGPARAM2 dummy_bput (uaecptr, uae_u32) REGPARAM; uae_u32 REGPARAM2 dummy_lget (uaecptr addr) { if (illegal_mem) - write_log ("Illegal lget at %08lx\n", addr); + write_log ("Illegal lget at %08x\n", addr); return 0; } @@ -97,7 +97,7 @@ uae_u32 REGPARAM2 dummy_lget (uaecptr addr) uae_u32 REGPARAM2 dummy_wget (uaecptr addr) { if (illegal_mem) - write_log ("Illegal wget at %08lx\n", addr); + write_log ("Illegal wget at %08x\n", addr); return 0; } @@ -105,7 +105,7 @@ uae_u32 REGPARAM2 dummy_wget (uaecptr addr) uae_u32 REGPARAM2 dummy_bget (uaecptr addr) { if (illegal_mem) - write_log ("Illegal bget at %08lx\n", addr); + write_log ("Illegal bget at %08x\n", addr); return 0; } @@ -113,17 +113,17 @@ uae_u32 REGPARAM2 dummy_bget (uaecptr addr) void REGPARAM2 dummy_lput (uaecptr addr, uae_u32 l) { if (illegal_mem) - write_log ("Illegal lput at %08lx\n", addr); + write_log ("Illegal lput at %08x\n", addr); } void REGPARAM2 dummy_wput (uaecptr addr, uae_u32 w) { if (illegal_mem) - write_log ("Illegal wput at %08lx\n", addr); + write_log ("Illegal wput at %08x\n", addr); } void REGPARAM2 dummy_bput (uaecptr addr, uae_u32 b) { if (illegal_mem) - write_log ("Illegal bput at %08lx\n", addr); + write_log ("Illegal bput at %08x\n", addr); } /* Mac RAM (32 bit addressing) */ @@ -268,19 +268,19 @@ uae_u32 REGPARAM2 rom_bget(uaecptr addr) void REGPARAM2 rom_lput(uaecptr addr, uae_u32 b) { if (illegal_mem) - write_log ("Illegal ROM lput at %08lx\n", addr); + write_log ("Illegal ROM lput at %08x\n", addr); } void REGPARAM2 rom_wput(uaecptr addr, uae_u32 b) { if (illegal_mem) - write_log ("Illegal ROM wput at %08lx\n", addr); + write_log ("Illegal ROM wput at %08x\n", addr); } void REGPARAM2 rom_bput(uaecptr addr, uae_u32 b) { if (illegal_mem) - write_log ("Illegal ROM bput at %08lx\n", addr); + write_log ("Illegal ROM bput at %08x\n", addr); } uae_u8 *REGPARAM2 rom_xlate(uaecptr addr) diff --git a/BasiliskII/src/uae_cpu/newcpu.cpp b/BasiliskII/src/uae_cpu/newcpu.cpp index 51f3fcef..d13a6078 100644 --- a/BasiliskII/src/uae_cpu/newcpu.cpp +++ b/BasiliskII/src/uae_cpu/newcpu.cpp @@ -373,7 +373,7 @@ uae_s32 ShowEA (int reg, amodes mode, wordsizes size, char *buf) if (dp & 4) base += dispreg; addr = base + outer; - sprintf (buffer,"(%s%c%d.%c*%d+%ld)+%ld == $%08lx", name, + sprintf (buffer,"(%s%c%d.%c*%d+%d)+%d == $%08lx", name, dp & 0x8000 ? 'A' : 'D', (int)r, dp & 0x800 ? 'L' : 'W', 1 << ((dp >> 9) & 3), disp,outer, @@ -420,7 +420,7 @@ uae_s32 ShowEA (int reg, amodes mode, wordsizes size, char *buf) if (dp & 4) base += dispreg; addr = base + outer; - sprintf (buffer,"(%s%c%d.%c*%d+%ld)+%ld == $%08lx", name, + sprintf (buffer,"(%s%c%d.%c*%d+%d)+%d == $%08lx", name, dp & 0x8000 ? 'A' : 'D', (int)r, dp & 0x800 ? 'L' : 'W', 1 << ((dp >> 9) & 3), disp,outer, @@ -1257,7 +1257,7 @@ void REGPARAM2 op_illg (uae_u32 opcode) return; } - write_log ("Illegal instruction: %04x at %08lx\n", opcode, pc); + write_log ("Illegal instruction: %04x at %08x\n", opcode, pc); #if USE_JIT && JIT_DEBUG compiler_dumpstate(); #endif @@ -1473,11 +1473,11 @@ void m68k_disasm (uaecptr addr, uaecptr *nextpc, int cnt) } if (ccpt != 0) { if (cctrue(dp->cc)) - printf (" == %08lx (TRUE)", newpc); + printf (" == %08x (TRUE)", newpc); else - printf (" == %08lx (FALSE)", newpc); + printf (" == %08x (FALSE)", newpc); } else if ((opcode & 0xff00) == 0x6100) /* BSR */ - printf (" == %08lx", newpc); + printf (" == %08x", newpc); printf ("\n"); } if (nextpc) @@ -1488,19 +1488,19 @@ void m68k_dumpstate (uaecptr *nextpc) { int i; for (i = 0; i < 8; i++){ - printf ("D%d: %08lx ", i, m68k_dreg(regs, i)); + printf ("D%d: %08x ", i, m68k_dreg(regs, i)); if ((i & 3) == 3) printf ("\n"); } for (i = 0; i < 8; i++){ - printf ("A%d: %08lx ", i, m68k_areg(regs, i)); + printf ("A%d: %08x ", i, m68k_areg(regs, i)); if ((i & 3) == 3) printf ("\n"); } if (regs.s == 0) regs.usp = m68k_areg(regs, 7); if (regs.s && regs.m) regs.msp = m68k_areg(regs, 7); if (regs.s && regs.m == 0) regs.isp = m68k_areg(regs, 7); - printf ("USP=%08lx ISP=%08lx MSP=%08lx VBR=%08lx\n", + printf ("USP=%08x ISP=%08x MSP=%08x VBR=%08x\n", regs.usp,regs.isp,regs.msp,regs.vbr); - printf ("T=%d%d S=%d M=%d X=%d N=%d Z=%d V=%d C=%d IMASK=%d\n", + printf ("T=%d%d S=%d M=%d X=%ld N=%ld Z=%ld V=%ld C=%ld IMASK=%d\n", regs.t1, regs.t0, regs.s, regs.m, GET_XFLG, GET_NFLG, GET_ZFLG, GET_VFLG, GET_CFLG, regs.intmask); @@ -1509,5 +1509,5 @@ void m68k_dumpstate (uaecptr *nextpc) m68k_disasm(m68k_getpc (), nextpc, 1); if (nextpc) - printf ("next PC: %08lx\n", *nextpc); + printf ("next PC: %08x\n", *nextpc); } diff --git a/BasiliskII/src/uae_cpu/newcpu.h b/BasiliskII/src/uae_cpu/newcpu.h index bead5234..e2d5b5ed 100644 --- a/BasiliskII/src/uae_cpu/newcpu.h +++ b/BasiliskII/src/uae_cpu/newcpu.h @@ -204,7 +204,7 @@ static __inline__ void m68k_setpc (uaecptr newpc) #if ENABLE_MON if (IS_BREAK_POINT(newpc)) { - printf("Stopped at break point address: %08lx. Last PC: %08lx\n", newpc, previous_pc); + printf("Stopped at break point address: %08x. Last PC: %08x\n", newpc, previous_pc); m68k_dumpstate(NULL); const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); @@ -221,7 +221,7 @@ static __inline__ void m68k_incpc (uae_s32 delta) #if ENABLE_MON uaecptr next_pc = m68k_getpc(); if (IS_BREAK_POINT(next_pc)) { - printf("Stopped at break point address: %08lx. Last PC: %08lx\n", next_pc, previous_pc); + printf("Stopped at break point address: %08x. Last PC: %08x\n", next_pc, previous_pc); m68k_dumpstate(NULL); const char *arg[4] = {"mon", "-m", "-r", NULL}; mon(3, arg); From c18d6fa9232ba44c00f93627ee71add9d2f5a57f Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sat, 2 Dec 2017 13:27:14 -0500 Subject: [PATCH 34/67] fix configure X check to not trigger if using mac gui and some more warning fixes --- BasiliskII/src/Unix/configure.ac | 4 ++-- BasiliskII/src/rom_patches.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/BasiliskII/src/Unix/configure.ac b/BasiliskII/src/Unix/configure.ac index 09d7ae3b..0a05d16f 100644 --- a/BasiliskII/src/Unix/configure.ac +++ b/BasiliskII/src/Unix/configure.ac @@ -313,8 +313,8 @@ else SDL_SUPPORT="none" fi -dnl We need X11, if not using SDL. -if [[ "x$WANT_SDL_VIDEO" = "xno" ]]; then +dnl We need X11, if not using SDL or Mac GUI. +if [[ "x$WANT_SDL_VIDEO" = "xno" -a "x$WANT_MACOSX_GUI" = "xno"]]; then AC_PATH_XTRA if [[ "x$no_x" = "xyes" ]]; then AC_MSG_ERROR([You need X11 to run Basilisk II.]) diff --git a/BasiliskII/src/rom_patches.cpp b/BasiliskII/src/rom_patches.cpp index 25cf5f38..fdedf5e2 100644 --- a/BasiliskII/src/rom_patches.cpp +++ b/BasiliskII/src/rom_patches.cpp @@ -1683,8 +1683,8 @@ bool PatchROM(void) if (ROMBreakpoint) { #if ENABLE_MON mon_add_break_point(ROMBaseMac + ROMBreakpoint); - printf("ROM start address at %08lx\n", ROMBaseMac); - printf("Set ROM break point at %08lx\n", ROMBaseMac + ROMBreakpoint); + printf("ROM start address at %08x\n", ROMBaseMac); + printf("Set ROM break point at %08x\n", ROMBaseMac + ROMBreakpoint); #else uint16 *wp = (uint16 *)(ROMBaseHost + ROMBreakpoint); *wp = htons(M68K_EMUL_BREAK); From 0e8e0b51b7ea5cfc5d07b2d00d486fe3095bf6dc Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sat, 2 Dec 2017 15:34:18 -0500 Subject: [PATCH 35/67] Make Basilisk's configure.ac's SDL detection logic match SS's. --- BasiliskII/src/Unix/configure.ac | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/BasiliskII/src/Unix/configure.ac b/BasiliskII/src/Unix/configure.ac index 0a05d16f..b201cd4e 100644 --- a/BasiliskII/src/Unix/configure.ac +++ b/BasiliskII/src/Unix/configure.ac @@ -300,13 +300,22 @@ if [[ "x$WANT_SDL" = "xyes" ]]; then ac_cv_framework_SDL=no fi if [[ "x$ac_cv_framework_SDL" = "xno" ]]; then - PKG_CHECK_MODULES([sdl], [sdl >= 1.2], [ - CFLAGS="$CFLAGS $sdl_CFLAGS" - CXXFLAGS="$CXXFLAGS $sdl_CFLAGS" - LIBS="$LIBS $sdl_LIBS" - ], [ - WANT_SDL=no - ]) + AC_PATH_PROG(sdl_config, "sdl-config") + if [[ -n "$sdl_config" ]]; then + sdl_cflags=`$sdl_config --cflags` + if [[ "x$WANT_SDL_STATIC" = "xyes" ]]; then + sdl_libs=`$sdl_config --static-libs` + else + sdl_libs=`$sdl_config --libs` + fi + CFLAGS="$CFLAGS $sdl_cflags" + CXXFLAGS="$CXXFLAGS $sdl_cflags" + LIBS="$LIBS $sdl_libs" + else + WANT_SDL=no + WANT_SDL_VIDEO=no + WANT_SDL_AUDIO=no + fi fi SDL_SUPPORT=`echo "$SDL_SUPPORT" | sed -e "s/^ //"` else From 89e423497571293585f498bc214dc557fa49a96b Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 13:43:03 -0500 Subject: [PATCH 36/67] remove stray non-ascii chars at start of mon_cmd.cpp --- cxmon/src/mon_cmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cxmon/src/mon_cmd.cpp b/cxmon/src/mon_cmd.cpp index 3975ead5..8ddcac7e 100644 --- a/cxmon/src/mon_cmd.cpp +++ b/cxmon/src/mon_cmd.cpp @@ -1,4 +1,4 @@ -/* +/* * mon_cmd.cpp - cxmon standard commands * * cxmon (C) 1997-2004 Christian Bauer, Marc Hellwig From 8a6a9db6d5493ca73321c92804c16dbedc388573 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 14:54:50 -0500 Subject: [PATCH 37/67] Fix SDL support message in configure based on detection logic. --- BasiliskII/src/Unix/configure.ac | 1 + SheepShaver/src/Unix/configure.ac | 1 + 2 files changed, 2 insertions(+) diff --git a/BasiliskII/src/Unix/configure.ac b/BasiliskII/src/Unix/configure.ac index b201cd4e..c883ac56 100644 --- a/BasiliskII/src/Unix/configure.ac +++ b/BasiliskII/src/Unix/configure.ac @@ -315,6 +315,7 @@ if [[ "x$WANT_SDL" = "xyes" ]]; then WANT_SDL=no WANT_SDL_VIDEO=no WANT_SDL_AUDIO=no + SDL_SUPPORT="none" fi fi SDL_SUPPORT=`echo "$SDL_SUPPORT" | sed -e "s/^ //"` diff --git a/SheepShaver/src/Unix/configure.ac b/SheepShaver/src/Unix/configure.ac index 39f18115..006fe872 100644 --- a/SheepShaver/src/Unix/configure.ac +++ b/SheepShaver/src/Unix/configure.ac @@ -209,6 +209,7 @@ if [[ "x$WANT_SDL" = "xyes" ]]; then WANT_SDL=no WANT_SDL_VIDEO=no WANT_SDL_AUDIO=no + SDL_SUPPORT="none" fi fi SDL_SUPPORT=`echo "$SDL_SUPPORT" | sed -e "s/^ //"` From bb2a197c9821ae2dcf0f07640c825d66ee96056d Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 15:32:04 -0500 Subject: [PATCH 38/67] clean up some code --- BasiliskII/src/Unix/sysdeps.h | 13 ------------- BasiliskII/src/Windows/sysdeps.h | 13 ------------- 2 files changed, 26 deletions(-) diff --git a/BasiliskII/src/Unix/sysdeps.h b/BasiliskII/src/Unix/sysdeps.h index d74a2eda..7ac37f29 100644 --- a/BasiliskII/src/Unix/sysdeps.h +++ b/BasiliskII/src/Unix/sysdeps.h @@ -424,30 +424,17 @@ static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {uint8 *b = (uint8 *)a #if defined(__i386__) || defined(__x86_64__) /* Intel x86 */ -#define X86_PPRO_OPT static inline uae_u32 do_get_mem_long(uae_u32 *a) {uint32 retval; __asm__ ("bswap %0" : "=r" (retval) : "0" (*a) : "cc"); return retval;} -#ifdef X86_PPRO_OPT static inline uae_u32 do_get_mem_word(uae_u16 *a) {uint32 retval; __asm__ ("movzwl %w1,%k0\n\tshll $16,%k0\n\tbswapl %k0\n" : "=&r" (retval) : "m" (*a) : "cc"); return retval;} -#else -static inline uae_u32 do_get_mem_word(uae_u16 *a) {uint32 retval; __asm__ ("xorl %k0,%k0\n\tmovw %w1,%w0\n\trolw $8,%w0" : "=&r" (retval) : "m" (*a) : "cc"); return retval;} -#endif #define HAVE_GET_WORD_UNSWAPPED #define do_get_mem_word_unswapped(a) ((uae_u32)*((uae_u16 *)(a))) static inline void do_put_mem_long(uae_u32 *a, uae_u32 v) {__asm__ ("bswap %0" : "=r" (v) : "0" (v) : "cc"); *a = v;} -#ifdef X86_PPRO_OPT static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {__asm__ ("bswapl %0" : "=&r" (v) : "0" (v << 16) : "cc"); *a = v;} -#else -static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {__asm__ ("rolw $8,%0" : "=r" (v) : "0" (v) : "cc"); *a = v;} -#endif #define HAVE_OPTIMIZED_BYTESWAP_32 /* bswap doesn't affect condition codes */ static inline uae_u32 do_byteswap_32(uae_u32 v) {__asm__ ("bswap %0" : "=r" (v) : "0" (v)); return v;} #define HAVE_OPTIMIZED_BYTESWAP_16 -#ifdef X86_PPRO_OPT static inline uae_u32 do_byteswap_16(uae_u32 v) {__asm__ ("bswapl %0" : "=&r" (v) : "0" (v << 16) : "cc"); return v;} -#else -static inline uae_u32 do_byteswap_16(uae_u32 v) {__asm__ ("rolw $8,%0" : "=r" (v) : "0" (v) : "cc"); return v;} -#endif #elif defined(CPU_CAN_ACCESS_UNALIGNED) diff --git a/BasiliskII/src/Windows/sysdeps.h b/BasiliskII/src/Windows/sysdeps.h index c1d7898f..3f11226f 100755 --- a/BasiliskII/src/Windows/sysdeps.h +++ b/BasiliskII/src/Windows/sysdeps.h @@ -220,7 +220,6 @@ static inline int spin_trylock(spinlock_t *lock) } #endif -#define X86_PPRO_OPT #define HAVE_OPTIMIZED_BYTESWAP_32 #define HAVE_OPTIMIZED_BYTESWAP_16 @@ -234,24 +233,12 @@ static inline uae_u32 do_byteswap_16_g(uae_u32 v) {return _byteswap_ushort(v);} #else /* Intel x86 */ static inline uae_u32 do_get_mem_long(uae_u32 *a) {uint32 retval; __asm__ ("bswap %0" : "=r" (retval) : "0" (*a) : "cc"); return retval;} -#ifdef X86_PPRO_OPT static inline uae_u32 do_get_mem_word(uae_u16 *a) {uint32 retval; __asm__ ("movzwl %w1,%k0\n\tshll $16,%k0\n\tbswapl %k0\n" : "=&r" (retval) : "m" (*a) : "cc"); return retval;} -#else -static inline uae_u32 do_get_mem_word(uae_u16 *a) {uint32 retval; __asm__ ("xorl %k0,%k0\n\tmovw %w1,%w0\n\trolw $8,%w0" : "=&r" (retval) : "m" (*a) : "cc"); return retval;} -#endif static inline void do_put_mem_long(uae_u32 *a, uae_u32 v) {__asm__ ("bswap %0" : "=r" (v) : "0" (v) : "cc"); *a = v;} -#ifdef X86_PPRO_OPT static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {__asm__ ("bswapl %0" : "=&r" (v) : "0" (v << 16) : "cc"); *a = v;} -#else -static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {__asm__ ("rolw $8,%0" : "=r" (v) : "0" (v) : "cc"); *a = v;} -#endif /* bswap doesn't affect condition codes */ static inline uae_u32 do_byteswap_32_g(uae_u32 v) {__asm__ ("bswap %0" : "=r" (v) : "0" (v)); return v;} -#ifdef X86_PPRO_OPT static inline uae_u32 do_byteswap_16_g(uae_u32 v) {__asm__ ("bswapl %0" : "=&r" (v) : "0" (v << 16) : "cc"); return v;} -#else -static inline uae_u32 do_byteswap_16_g(uae_u32 v) {__asm__ ("rolw $8,%0" : "=r" (v) : "0" (v) : "cc"); return v;} -#endif #endif #define HAVE_GET_WORD_UNSWAPPED From 364cf2085e31df430b8243b75bbdc4c21d09d247 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 15:39:51 -0500 Subject: [PATCH 39/67] clean up some code --- BasiliskII/src/SDL/video_sdl.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/BasiliskII/src/SDL/video_sdl.cpp b/BasiliskII/src/SDL/video_sdl.cpp index 3db0d71f..011941f9 100644 --- a/BasiliskII/src/SDL/video_sdl.cpp +++ b/BasiliskII/src/SDL/video_sdl.cpp @@ -496,7 +496,7 @@ static void add_mode(int type, int width, int height, int resolution_id, int byt } // Set Mac frame layout and base address (uses the_buffer/MacFrameBaseMac) -static void set_mac_frame_buffer(SDL_monitor_desc &monitor, int depth, bool native_byte_order) +static void set_mac_frame_buffer(SDL_monitor_desc &monitor, int depth) { #if !REAL_ADDRESSING && !DIRECT_ADDRESSING int layout = FLAYOUT_DIRECT; @@ -504,10 +504,7 @@ static void set_mac_frame_buffer(SDL_monitor_desc &monitor, int depth, bool nati layout = (screen_depth == 15) ? FLAYOUT_HOST_555 : FLAYOUT_HOST_565; else if (depth == VIDEO_DEPTH_32BIT) layout = (screen_depth == 24) ? FLAYOUT_HOST_888 : FLAYOUT_DIRECT; - if (native_byte_order) - MacFrameLayout = layout; - else - MacFrameLayout = FLAYOUT_DIRECT; + MacFrameLayout = layout; monitor.set_mac_frame_base(MacFrameBaseMac); // Set variables used by UAE memory banking @@ -688,7 +685,7 @@ void driver_base::init() } // Set frame buffer base - set_mac_frame_buffer(monitor, VIDEO_MODE_DEPTH, true); + set_mac_frame_buffer(monitor, VIDEO_MODE_DEPTH); adapt_to_video_mode(); } From ba0ed857d784c1d414c0e3a0e94d4d579a52d0b3 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 15:44:31 -0500 Subject: [PATCH 40/67] fix colors in b2 video_macosx.mm code --- BasiliskII/src/MacOSX/video_macosx.mm | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/BasiliskII/src/MacOSX/video_macosx.mm b/BasiliskII/src/MacOSX/video_macosx.mm index d4eff082..510b6e6c 100644 --- a/BasiliskII/src/MacOSX/video_macosx.mm +++ b/BasiliskII/src/MacOSX/video_macosx.mm @@ -422,17 +422,10 @@ void OSX_monitor::set_mac_frame_buffer(const video_mode mode) { #if !REAL_ADDRESSING && !DIRECT_ADDRESSING - switch ( mode.depth ) - { - // case VDEPTH_15BIT: - case VDEPTH_16BIT: MacFrameLayout = FLAYOUT_HOST_555; break; - // case VDEPTH_24BIT: - case VDEPTH_32BIT: MacFrameLayout = FLAYOUT_HOST_888; break; - default : MacFrameLayout = FLAYOUT_DIRECT; - } set_mac_frame_base(MacFrameBaseMac); // Set variables used by UAE memory banking + MacFrameLayout = FLAYOUT_DIRECT; MacFrameBaseHost = (uint8 *) the_buffer; MacFrameSize = mode.bytes_per_row * mode.y; InitFrameBufferMapping(); From c41b849ecf0061ab541e929728d1b1d540025719 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 15:59:14 -0500 Subject: [PATCH 41/67] clean up disabled / non-working modes out of video_macosx.mm/.h --- BasiliskII/src/MacOSX/video_macosx.h | 10 ---- BasiliskII/src/MacOSX/video_macosx.mm | 79 --------------------------- 2 files changed, 89 deletions(-) diff --git a/BasiliskII/src/MacOSX/video_macosx.h b/BasiliskII/src/MacOSX/video_macosx.h index 9cecd9f2..e83f2bd6 100644 --- a/BasiliskII/src/MacOSX/video_macosx.h +++ b/BasiliskII/src/MacOSX/video_macosx.h @@ -22,16 +22,6 @@ #import -/* Set the strategy for drawing the bitmap in the Mac OS X window */ -//#define CGDRAWBITMAP -#if defined __i386__ -#define CGIMAGEREF -//#define NSBITMAP -#else -#define CGIMAGEREF -//#define NSBITMAP -#endif - // Using Core Graphics is fastest when rendering 32bit data. // Using CGImageRefs allows us to use all the bitmaps that BasiliskII supports. // When both Basilisk II and OS X are set to 'Thousands', updating a 312x342 diff --git a/BasiliskII/src/MacOSX/video_macosx.mm b/BasiliskII/src/MacOSX/video_macosx.mm index 510b6e6c..8323038c 100644 --- a/BasiliskII/src/MacOSX/video_macosx.mm +++ b/BasiliskII/src/MacOSX/video_macosx.mm @@ -371,16 +371,11 @@ class OSX_monitor : public monitor_desc bool init_window(const video_mode &mode); -#ifdef CGIMAGEREF CGColorSpaceRef colourSpace; uint8 *colourTable; CGImageRef imageRef; CGDataProviderRef provider; short x, y, bpp, depth, bpr; -#endif -#ifdef NSBITMAP - NSBitmapImageRep *bitmap; -#endif void *the_buffer; @@ -397,24 +392,17 @@ OSX_monitor :: OSX_monitor (const vector &available_modes, uint32 default_id) : monitor_desc (available_modes, default_depth, default_id) { -#ifdef CGIMAGEREF colourSpace = nil; colourTable = (uint8 *) malloc(256 * 3); imageRef = nil; provider = nil; -#endif -#ifdef NSBITMAP - bitmap = nil; -#endif newMode = originalMode = nil; the_buffer = NULL; theDisplay = nil; }; // Should also have a destructor which does -//#ifdef CGIMAGEREF // free(colourTable); -//#endif // Set Mac frame layout and base address (uses the_buffer/MacFrameBaseMac) @@ -501,7 +489,6 @@ OSX_monitor::init_window(const video_mode &mode) unsigned char *offsetBuffer = (unsigned char *) the_buffer; offsetBuffer += 1; // OS X NSBitmaps are RGBA, but Basilisk generates ARGB -#ifdef CGIMAGEREF switch ( mode.depth ) { case VDEPTH_1BIT: bpp = 1; break; @@ -571,61 +558,6 @@ OSX_monitor::init_window(const video_mode &mode) // CGDataProviderRef provider, const float decode[], bool shouldInterpolate); #endif - return true; -#endif - - -#ifndef CGIMAGEREF - short bitsPer, samplesPer; // How big is each Pixel? - - if ( mode.depth == VDEPTH_1BIT ) - bitsPer = 1; - else - bitsPer = 8; - - if ( mode.depth == VDEPTH_32BIT ) - samplesPer = 3; - else - samplesPer = 1; -#endif - - -#ifdef NSBITMAP - bitmap = [NSBitmapImageRep alloc]; - bitmap = [bitmap initWithBitmapDataPlanes: (unsigned char **) &offsetBuffer - pixelsWide: mode.x - pixelsHigh: mode.y - bitsPerSample: bitsPer - samplesPerPixel: samplesPer - hasAlpha: NO - isPlanar: NO - colorSpaceName: NSCalibratedRGBColorSpace - bytesPerRow: mode.bytes_per_row - bitsPerPixel: bits_from_depth(mode.depth)]; - - if ( ! bitmap ) - { - ErrorAlert("Could not allocate an NSBitmapImageRep"); - return false; - } - - [output readyToDraw: bitmap - imageWidth: mode.x - imageHeight: mode.y]; -#endif - -#ifdef CGDRAWBITMAP - [output readyToDraw: offsetBuffer - width: mode.x - height: mode.y - bps: bitsPer - spp: samplesPer - bpp: bits_from_depth(mode.depth) - bpr: mode.bytes_per_row - isPlanar: NO - hasAlpha: NO]; -#endif - return true; } @@ -780,13 +712,11 @@ bool VideoInit(bool classic) case DISPLAY_OPENGL: // Same as window depths and sizes? case DISPLAY_WINDOW: -#ifdef CGIMAGEREF add_standard_modes(VDEPTH_1BIT); add_standard_modes(VDEPTH_2BIT); add_standard_modes(VDEPTH_4BIT); add_standard_modes(VDEPTH_8BIT); add_standard_modes(VDEPTH_16BIT); -#endif add_standard_modes(VDEPTH_32BIT); break; } @@ -859,14 +789,9 @@ OSX_monitor::video_close() [output disableDrawing]; // Free frame buffer stuff -#ifdef CGIMAGEREF CGImageRelease(imageRef); CGColorSpaceRelease(colourSpace); CGDataProviderRelease(provider); -#endif -#ifdef NSBITMAP - [bitmap release]; -#endif free(the_buffer); break; @@ -929,7 +854,6 @@ OSX_monitor::set_palette(uint8 *pal, int num) CGPaletteRelease(CGpal); } -#ifdef CGIMAGEREF if ( display_type != DISPLAY_WINDOW ) return; @@ -981,7 +905,6 @@ OSX_monitor::set_palette(uint8 *pal, int num) CGColorSpaceRelease(oldColourSpace); CGImageRelease(oldImageRef); -#endif } @@ -1028,7 +951,6 @@ OSX_monitor::switch_to_current_mode(void) failure = "Could not get base address of screen"; } -#ifdef CGIMAGEREF // Clean up the old CGImageRef stuff else if ( display_type == DISPLAY_WINDOW && imageRef ) { @@ -1047,7 +969,6 @@ OSX_monitor::switch_to_current_mode(void) else failure = "Could not video_open() requested mode"; } -#endif else if ( ! video_open(mode) ) failure = "Could not video_open() requested mode"; From 3ac2640c79b5703a9139cd4d343fed8e9774009f Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sat, 2 Dec 2017 15:34:18 -0500 Subject: [PATCH 42/67] Make Basilisk's configure.ac's SDL detection logic match SS's. --- BasiliskII/src/Unix/configure.ac | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/BasiliskII/src/Unix/configure.ac b/BasiliskII/src/Unix/configure.ac index 0a05d16f..b201cd4e 100644 --- a/BasiliskII/src/Unix/configure.ac +++ b/BasiliskII/src/Unix/configure.ac @@ -300,13 +300,22 @@ if [[ "x$WANT_SDL" = "xyes" ]]; then ac_cv_framework_SDL=no fi if [[ "x$ac_cv_framework_SDL" = "xno" ]]; then - PKG_CHECK_MODULES([sdl], [sdl >= 1.2], [ - CFLAGS="$CFLAGS $sdl_CFLAGS" - CXXFLAGS="$CXXFLAGS $sdl_CFLAGS" - LIBS="$LIBS $sdl_LIBS" - ], [ - WANT_SDL=no - ]) + AC_PATH_PROG(sdl_config, "sdl-config") + if [[ -n "$sdl_config" ]]; then + sdl_cflags=`$sdl_config --cflags` + if [[ "x$WANT_SDL_STATIC" = "xyes" ]]; then + sdl_libs=`$sdl_config --static-libs` + else + sdl_libs=`$sdl_config --libs` + fi + CFLAGS="$CFLAGS $sdl_cflags" + CXXFLAGS="$CXXFLAGS $sdl_cflags" + LIBS="$LIBS $sdl_libs" + else + WANT_SDL=no + WANT_SDL_VIDEO=no + WANT_SDL_AUDIO=no + fi fi SDL_SUPPORT=`echo "$SDL_SUPPORT" | sed -e "s/^ //"` else From cd60ce9421425981d2395b4d33c9bf894d87a794 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 13:43:03 -0500 Subject: [PATCH 43/67] remove stray non-ascii chars at start of mon_cmd.cpp --- cxmon/src/mon_cmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cxmon/src/mon_cmd.cpp b/cxmon/src/mon_cmd.cpp index 3975ead5..8ddcac7e 100644 --- a/cxmon/src/mon_cmd.cpp +++ b/cxmon/src/mon_cmd.cpp @@ -1,4 +1,4 @@ -/* +/* * mon_cmd.cpp - cxmon standard commands * * cxmon (C) 1997-2004 Christian Bauer, Marc Hellwig From d17ef870f71f98f6876a435c0d944afacae0b7b8 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 14:54:50 -0500 Subject: [PATCH 44/67] Fix SDL support message in configure based on detection logic. --- BasiliskII/src/Unix/configure.ac | 1 + SheepShaver/src/Unix/configure.ac | 1 + 2 files changed, 2 insertions(+) diff --git a/BasiliskII/src/Unix/configure.ac b/BasiliskII/src/Unix/configure.ac index b201cd4e..c883ac56 100644 --- a/BasiliskII/src/Unix/configure.ac +++ b/BasiliskII/src/Unix/configure.ac @@ -315,6 +315,7 @@ if [[ "x$WANT_SDL" = "xyes" ]]; then WANT_SDL=no WANT_SDL_VIDEO=no WANT_SDL_AUDIO=no + SDL_SUPPORT="none" fi fi SDL_SUPPORT=`echo "$SDL_SUPPORT" | sed -e "s/^ //"` diff --git a/SheepShaver/src/Unix/configure.ac b/SheepShaver/src/Unix/configure.ac index 39f18115..006fe872 100644 --- a/SheepShaver/src/Unix/configure.ac +++ b/SheepShaver/src/Unix/configure.ac @@ -209,6 +209,7 @@ if [[ "x$WANT_SDL" = "xyes" ]]; then WANT_SDL=no WANT_SDL_VIDEO=no WANT_SDL_AUDIO=no + SDL_SUPPORT="none" fi fi SDL_SUPPORT=`echo "$SDL_SUPPORT" | sed -e "s/^ //"` From e29cc81dbf33422ac5377857add2083d52f5a9ae Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 15:32:04 -0500 Subject: [PATCH 45/67] clean up some code --- BasiliskII/src/Unix/sysdeps.h | 13 ------------- BasiliskII/src/Windows/sysdeps.h | 13 ------------- 2 files changed, 26 deletions(-) diff --git a/BasiliskII/src/Unix/sysdeps.h b/BasiliskII/src/Unix/sysdeps.h index d74a2eda..7ac37f29 100644 --- a/BasiliskII/src/Unix/sysdeps.h +++ b/BasiliskII/src/Unix/sysdeps.h @@ -424,30 +424,17 @@ static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {uint8 *b = (uint8 *)a #if defined(__i386__) || defined(__x86_64__) /* Intel x86 */ -#define X86_PPRO_OPT static inline uae_u32 do_get_mem_long(uae_u32 *a) {uint32 retval; __asm__ ("bswap %0" : "=r" (retval) : "0" (*a) : "cc"); return retval;} -#ifdef X86_PPRO_OPT static inline uae_u32 do_get_mem_word(uae_u16 *a) {uint32 retval; __asm__ ("movzwl %w1,%k0\n\tshll $16,%k0\n\tbswapl %k0\n" : "=&r" (retval) : "m" (*a) : "cc"); return retval;} -#else -static inline uae_u32 do_get_mem_word(uae_u16 *a) {uint32 retval; __asm__ ("xorl %k0,%k0\n\tmovw %w1,%w0\n\trolw $8,%w0" : "=&r" (retval) : "m" (*a) : "cc"); return retval;} -#endif #define HAVE_GET_WORD_UNSWAPPED #define do_get_mem_word_unswapped(a) ((uae_u32)*((uae_u16 *)(a))) static inline void do_put_mem_long(uae_u32 *a, uae_u32 v) {__asm__ ("bswap %0" : "=r" (v) : "0" (v) : "cc"); *a = v;} -#ifdef X86_PPRO_OPT static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {__asm__ ("bswapl %0" : "=&r" (v) : "0" (v << 16) : "cc"); *a = v;} -#else -static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {__asm__ ("rolw $8,%0" : "=r" (v) : "0" (v) : "cc"); *a = v;} -#endif #define HAVE_OPTIMIZED_BYTESWAP_32 /* bswap doesn't affect condition codes */ static inline uae_u32 do_byteswap_32(uae_u32 v) {__asm__ ("bswap %0" : "=r" (v) : "0" (v)); return v;} #define HAVE_OPTIMIZED_BYTESWAP_16 -#ifdef X86_PPRO_OPT static inline uae_u32 do_byteswap_16(uae_u32 v) {__asm__ ("bswapl %0" : "=&r" (v) : "0" (v << 16) : "cc"); return v;} -#else -static inline uae_u32 do_byteswap_16(uae_u32 v) {__asm__ ("rolw $8,%0" : "=r" (v) : "0" (v) : "cc"); return v;} -#endif #elif defined(CPU_CAN_ACCESS_UNALIGNED) diff --git a/BasiliskII/src/Windows/sysdeps.h b/BasiliskII/src/Windows/sysdeps.h index c1d7898f..3f11226f 100755 --- a/BasiliskII/src/Windows/sysdeps.h +++ b/BasiliskII/src/Windows/sysdeps.h @@ -220,7 +220,6 @@ static inline int spin_trylock(spinlock_t *lock) } #endif -#define X86_PPRO_OPT #define HAVE_OPTIMIZED_BYTESWAP_32 #define HAVE_OPTIMIZED_BYTESWAP_16 @@ -234,24 +233,12 @@ static inline uae_u32 do_byteswap_16_g(uae_u32 v) {return _byteswap_ushort(v);} #else /* Intel x86 */ static inline uae_u32 do_get_mem_long(uae_u32 *a) {uint32 retval; __asm__ ("bswap %0" : "=r" (retval) : "0" (*a) : "cc"); return retval;} -#ifdef X86_PPRO_OPT static inline uae_u32 do_get_mem_word(uae_u16 *a) {uint32 retval; __asm__ ("movzwl %w1,%k0\n\tshll $16,%k0\n\tbswapl %k0\n" : "=&r" (retval) : "m" (*a) : "cc"); return retval;} -#else -static inline uae_u32 do_get_mem_word(uae_u16 *a) {uint32 retval; __asm__ ("xorl %k0,%k0\n\tmovw %w1,%w0\n\trolw $8,%w0" : "=&r" (retval) : "m" (*a) : "cc"); return retval;} -#endif static inline void do_put_mem_long(uae_u32 *a, uae_u32 v) {__asm__ ("bswap %0" : "=r" (v) : "0" (v) : "cc"); *a = v;} -#ifdef X86_PPRO_OPT static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {__asm__ ("bswapl %0" : "=&r" (v) : "0" (v << 16) : "cc"); *a = v;} -#else -static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {__asm__ ("rolw $8,%0" : "=r" (v) : "0" (v) : "cc"); *a = v;} -#endif /* bswap doesn't affect condition codes */ static inline uae_u32 do_byteswap_32_g(uae_u32 v) {__asm__ ("bswap %0" : "=r" (v) : "0" (v)); return v;} -#ifdef X86_PPRO_OPT static inline uae_u32 do_byteswap_16_g(uae_u32 v) {__asm__ ("bswapl %0" : "=&r" (v) : "0" (v << 16) : "cc"); return v;} -#else -static inline uae_u32 do_byteswap_16_g(uae_u32 v) {__asm__ ("rolw $8,%0" : "=r" (v) : "0" (v) : "cc"); return v;} -#endif #endif #define HAVE_GET_WORD_UNSWAPPED From e1c0a08957f5414e9f8134fb2c2096a8c74ceefe Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 15:39:51 -0500 Subject: [PATCH 46/67] clean up some code --- BasiliskII/src/SDL/video_sdl.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/BasiliskII/src/SDL/video_sdl.cpp b/BasiliskII/src/SDL/video_sdl.cpp index 3db0d71f..011941f9 100644 --- a/BasiliskII/src/SDL/video_sdl.cpp +++ b/BasiliskII/src/SDL/video_sdl.cpp @@ -496,7 +496,7 @@ static void add_mode(int type, int width, int height, int resolution_id, int byt } // Set Mac frame layout and base address (uses the_buffer/MacFrameBaseMac) -static void set_mac_frame_buffer(SDL_monitor_desc &monitor, int depth, bool native_byte_order) +static void set_mac_frame_buffer(SDL_monitor_desc &monitor, int depth) { #if !REAL_ADDRESSING && !DIRECT_ADDRESSING int layout = FLAYOUT_DIRECT; @@ -504,10 +504,7 @@ static void set_mac_frame_buffer(SDL_monitor_desc &monitor, int depth, bool nati layout = (screen_depth == 15) ? FLAYOUT_HOST_555 : FLAYOUT_HOST_565; else if (depth == VIDEO_DEPTH_32BIT) layout = (screen_depth == 24) ? FLAYOUT_HOST_888 : FLAYOUT_DIRECT; - if (native_byte_order) - MacFrameLayout = layout; - else - MacFrameLayout = FLAYOUT_DIRECT; + MacFrameLayout = layout; monitor.set_mac_frame_base(MacFrameBaseMac); // Set variables used by UAE memory banking @@ -688,7 +685,7 @@ void driver_base::init() } // Set frame buffer base - set_mac_frame_buffer(monitor, VIDEO_MODE_DEPTH, true); + set_mac_frame_buffer(monitor, VIDEO_MODE_DEPTH); adapt_to_video_mode(); } From 3b77a377c2409310e7f814b6936c755ee66994c8 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 15:44:31 -0500 Subject: [PATCH 47/67] fix colors in b2 video_macosx.mm code --- BasiliskII/src/MacOSX/video_macosx.mm | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/BasiliskII/src/MacOSX/video_macosx.mm b/BasiliskII/src/MacOSX/video_macosx.mm index d4eff082..510b6e6c 100644 --- a/BasiliskII/src/MacOSX/video_macosx.mm +++ b/BasiliskII/src/MacOSX/video_macosx.mm @@ -422,17 +422,10 @@ void OSX_monitor::set_mac_frame_buffer(const video_mode mode) { #if !REAL_ADDRESSING && !DIRECT_ADDRESSING - switch ( mode.depth ) - { - // case VDEPTH_15BIT: - case VDEPTH_16BIT: MacFrameLayout = FLAYOUT_HOST_555; break; - // case VDEPTH_24BIT: - case VDEPTH_32BIT: MacFrameLayout = FLAYOUT_HOST_888; break; - default : MacFrameLayout = FLAYOUT_DIRECT; - } set_mac_frame_base(MacFrameBaseMac); // Set variables used by UAE memory banking + MacFrameLayout = FLAYOUT_DIRECT; MacFrameBaseHost = (uint8 *) the_buffer; MacFrameSize = mode.bytes_per_row * mode.y; InitFrameBufferMapping(); From c161ca5b8bc52168ddfbd37e6ae8c515bf97e3ed Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Sun, 3 Dec 2017 15:59:14 -0500 Subject: [PATCH 48/67] clean up disabled / non-working modes out of video_macosx.mm/.h --- BasiliskII/src/MacOSX/video_macosx.h | 10 ---- BasiliskII/src/MacOSX/video_macosx.mm | 79 --------------------------- 2 files changed, 89 deletions(-) diff --git a/BasiliskII/src/MacOSX/video_macosx.h b/BasiliskII/src/MacOSX/video_macosx.h index 9cecd9f2..e83f2bd6 100644 --- a/BasiliskII/src/MacOSX/video_macosx.h +++ b/BasiliskII/src/MacOSX/video_macosx.h @@ -22,16 +22,6 @@ #import -/* Set the strategy for drawing the bitmap in the Mac OS X window */ -//#define CGDRAWBITMAP -#if defined __i386__ -#define CGIMAGEREF -//#define NSBITMAP -#else -#define CGIMAGEREF -//#define NSBITMAP -#endif - // Using Core Graphics is fastest when rendering 32bit data. // Using CGImageRefs allows us to use all the bitmaps that BasiliskII supports. // When both Basilisk II and OS X are set to 'Thousands', updating a 312x342 diff --git a/BasiliskII/src/MacOSX/video_macosx.mm b/BasiliskII/src/MacOSX/video_macosx.mm index 510b6e6c..8323038c 100644 --- a/BasiliskII/src/MacOSX/video_macosx.mm +++ b/BasiliskII/src/MacOSX/video_macosx.mm @@ -371,16 +371,11 @@ class OSX_monitor : public monitor_desc bool init_window(const video_mode &mode); -#ifdef CGIMAGEREF CGColorSpaceRef colourSpace; uint8 *colourTable; CGImageRef imageRef; CGDataProviderRef provider; short x, y, bpp, depth, bpr; -#endif -#ifdef NSBITMAP - NSBitmapImageRep *bitmap; -#endif void *the_buffer; @@ -397,24 +392,17 @@ OSX_monitor :: OSX_monitor (const vector &available_modes, uint32 default_id) : monitor_desc (available_modes, default_depth, default_id) { -#ifdef CGIMAGEREF colourSpace = nil; colourTable = (uint8 *) malloc(256 * 3); imageRef = nil; provider = nil; -#endif -#ifdef NSBITMAP - bitmap = nil; -#endif newMode = originalMode = nil; the_buffer = NULL; theDisplay = nil; }; // Should also have a destructor which does -//#ifdef CGIMAGEREF // free(colourTable); -//#endif // Set Mac frame layout and base address (uses the_buffer/MacFrameBaseMac) @@ -501,7 +489,6 @@ OSX_monitor::init_window(const video_mode &mode) unsigned char *offsetBuffer = (unsigned char *) the_buffer; offsetBuffer += 1; // OS X NSBitmaps are RGBA, but Basilisk generates ARGB -#ifdef CGIMAGEREF switch ( mode.depth ) { case VDEPTH_1BIT: bpp = 1; break; @@ -571,61 +558,6 @@ OSX_monitor::init_window(const video_mode &mode) // CGDataProviderRef provider, const float decode[], bool shouldInterpolate); #endif - return true; -#endif - - -#ifndef CGIMAGEREF - short bitsPer, samplesPer; // How big is each Pixel? - - if ( mode.depth == VDEPTH_1BIT ) - bitsPer = 1; - else - bitsPer = 8; - - if ( mode.depth == VDEPTH_32BIT ) - samplesPer = 3; - else - samplesPer = 1; -#endif - - -#ifdef NSBITMAP - bitmap = [NSBitmapImageRep alloc]; - bitmap = [bitmap initWithBitmapDataPlanes: (unsigned char **) &offsetBuffer - pixelsWide: mode.x - pixelsHigh: mode.y - bitsPerSample: bitsPer - samplesPerPixel: samplesPer - hasAlpha: NO - isPlanar: NO - colorSpaceName: NSCalibratedRGBColorSpace - bytesPerRow: mode.bytes_per_row - bitsPerPixel: bits_from_depth(mode.depth)]; - - if ( ! bitmap ) - { - ErrorAlert("Could not allocate an NSBitmapImageRep"); - return false; - } - - [output readyToDraw: bitmap - imageWidth: mode.x - imageHeight: mode.y]; -#endif - -#ifdef CGDRAWBITMAP - [output readyToDraw: offsetBuffer - width: mode.x - height: mode.y - bps: bitsPer - spp: samplesPer - bpp: bits_from_depth(mode.depth) - bpr: mode.bytes_per_row - isPlanar: NO - hasAlpha: NO]; -#endif - return true; } @@ -780,13 +712,11 @@ bool VideoInit(bool classic) case DISPLAY_OPENGL: // Same as window depths and sizes? case DISPLAY_WINDOW: -#ifdef CGIMAGEREF add_standard_modes(VDEPTH_1BIT); add_standard_modes(VDEPTH_2BIT); add_standard_modes(VDEPTH_4BIT); add_standard_modes(VDEPTH_8BIT); add_standard_modes(VDEPTH_16BIT); -#endif add_standard_modes(VDEPTH_32BIT); break; } @@ -859,14 +789,9 @@ OSX_monitor::video_close() [output disableDrawing]; // Free frame buffer stuff -#ifdef CGIMAGEREF CGImageRelease(imageRef); CGColorSpaceRelease(colourSpace); CGDataProviderRelease(provider); -#endif -#ifdef NSBITMAP - [bitmap release]; -#endif free(the_buffer); break; @@ -929,7 +854,6 @@ OSX_monitor::set_palette(uint8 *pal, int num) CGPaletteRelease(CGpal); } -#ifdef CGIMAGEREF if ( display_type != DISPLAY_WINDOW ) return; @@ -981,7 +905,6 @@ OSX_monitor::set_palette(uint8 *pal, int num) CGColorSpaceRelease(oldColourSpace); CGImageRelease(oldImageRef); -#endif } @@ -1028,7 +951,6 @@ OSX_monitor::switch_to_current_mode(void) failure = "Could not get base address of screen"; } -#ifdef CGIMAGEREF // Clean up the old CGImageRef stuff else if ( display_type == DISPLAY_WINDOW && imageRef ) { @@ -1047,7 +969,6 @@ OSX_monitor::switch_to_current_mode(void) else failure = "Could not video_open() requested mode"; } -#endif else if ( ! video_open(mode) ) failure = "Could not video_open() requested mode"; From 1c9b21f580501c5d5833935375945479c5651964 Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Fri, 15 Dec 2017 16:42:49 -0500 Subject: [PATCH 49/67] Fix JIT support on macOS. This was broken by a copy-paste error in b5820d80596fa5fb7a4ca3b13a3aa8c759ab434a. --- BasiliskII/src/Unix/configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BasiliskII/src/Unix/configure.ac b/BasiliskII/src/Unix/configure.ac index c883ac56..3e44d5a4 100644 --- a/BasiliskII/src/Unix/configure.ac +++ b/BasiliskII/src/Unix/configure.ac @@ -1298,7 +1298,7 @@ AC_TRANSLATE_DEFINE(HAVE_SIGCONTEXT_SUBTERFUGE, "$ac_cv_have_sigcontext_hack", dnl Resolve and set the proper sigsegv_recovery method... -if [[ "x$ac_cv_have_win32_exceptions" = "xyes" ]]; then +if [[ "x$ac_cv_have_mach_exceptions" = "xyes" ]]; then sigsegv_recovery=mach elif [[ "x$ac_cv_have_win32_exceptions" = "xyes" ]]; then sigsegv_recovery=win32 From bbd3d3f57c74ac073523320910717606dbec92a3 Mon Sep 17 00:00:00 2001 From: David O'Shea Date: Thu, 28 Dec 2017 15:10:47 +1030 Subject: [PATCH 50/67] Fix TUN/TAP detection on CentOS 7 (#include ) (fixes #153). Previously, "checking whether TUN/TAP is supported..." in "configure" failed to detect TUN/TAP support due to compile errors due to "struct sockaddr" not being defined. This fix causes sys/socket.h to be #included if it exists. --- BasiliskII/src/Unix/configure.ac | 3 +++ 1 file changed, 3 insertions(+) diff --git a/BasiliskII/src/Unix/configure.ac b/BasiliskII/src/Unix/configure.ac index 3e44d5a4..983d3312 100644 --- a/BasiliskII/src/Unix/configure.ac +++ b/BasiliskII/src/Unix/configure.ac @@ -906,6 +906,9 @@ dnl Check that the host supports TUN/TAP devices AC_CACHE_CHECK([whether TUN/TAP is supported], ac_cv_tun_tap_support, [ AC_TRY_COMPILE([ + #ifdef HAVE_SYS_SOCKET_H + #include + #endif #if defined(HAVE_LINUX_IF_H) && defined(HAVE_LINUX_IF_TUN_H) #include #include From 3f2dbbac2939f73429cc38956f905e102be3f508 Mon Sep 17 00:00:00 2001 From: David O'Shea Date: Thu, 28 Dec 2017 16:46:14 +1030 Subject: [PATCH 51/67] Fix link error due to missing X11 libraries (fixes #152). c18d6fa removed a space from BasiliskII/src/Unix/configure.ac, which caused "configure" to fail to properly determine the correct set of libraries to link against when using X11, which caused linking to fail. This fix restores the missing space. --- BasiliskII/src/Unix/configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BasiliskII/src/Unix/configure.ac b/BasiliskII/src/Unix/configure.ac index 3e44d5a4..b3a569d2 100644 --- a/BasiliskII/src/Unix/configure.ac +++ b/BasiliskII/src/Unix/configure.ac @@ -324,7 +324,7 @@ else fi dnl We need X11, if not using SDL or Mac GUI. -if [[ "x$WANT_SDL_VIDEO" = "xno" -a "x$WANT_MACOSX_GUI" = "xno"]]; then +if [[ "x$WANT_SDL_VIDEO" = "xno" -a "x$WANT_MACOSX_GUI" = "xno" ]]; then AC_PATH_XTRA if [[ "x$no_x" = "xyes" ]]; then AC_MSG_ERROR([You need X11 to run Basilisk II.]) From 385b49ba8ec8aef988097ef283cbe60acd75e85b Mon Sep 17 00:00:00 2001 From: David O'Shea Date: Thu, 28 Dec 2017 15:11:38 +1030 Subject: [PATCH 52/67] Avoid an all-zero Ethernet/MAC address when using TUN/TAP (fixes #154). Previously, when "ether tun" configuration was used on a Linux host, packets were sent with Ethernet/MAC address 00:00:00:00:00:00. Under CentOS 7 at least, this did not appear to cause any issues where the tun interface on the host was configured with an IP address, but when an attempt was made to bridge the tun interface, it was no longer possible to establish IP communication between the emulated machine and either the Linux host or a Windows NT Server 4 VM. This fix causes an Ethernet/MAC address to be generated in the same way when using TUN/TAP as is done for ethertap. --- BasiliskII/src/Unix/ether_unix.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BasiliskII/src/Unix/ether_unix.cpp b/BasiliskII/src/Unix/ether_unix.cpp index 526ee29c..a9ca33ce 100644 --- a/BasiliskII/src/Unix/ether_unix.cpp +++ b/BasiliskII/src/Unix/ether_unix.cpp @@ -371,7 +371,7 @@ bool ether_init(void) #endif // Get Ethernet address - if (net_if_type == NET_IF_ETHERTAP) { + if (net_if_type == NET_IF_ETHERTAP || net_if_type == NET_IF_TUNTAP) { pid_t p = getpid(); // If configured for multicast, ethertap requires that the lower 32 bit of the Ethernet address are our PID ether_addr[0] = 0xfe; ether_addr[1] = 0xfd; From 8c64ebfd03c4a50d05f36875fb1afdd3991d8745 Mon Sep 17 00:00:00 2001 From: Ricky Zhang Date: Wed, 13 Sep 2017 20:55:29 -0400 Subject: [PATCH 53/67] Add Travis CI configuration file and README.md status. --- .travis.yml | 20 ++++++++++++++++++++ README.md | 2 ++ 2 files changed, 22 insertions(+) create mode 100644 .travis.yml create mode 100644 README.md diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..27c17b7a --- /dev/null +++ b/.travis.yml @@ -0,0 +1,20 @@ +language: cpp + +matrix: + include: + - os: linux + dist: trusty + sudo: required + compiler: gcc + +addons: + apt: + packages: + - libsdl1.2-dev + - libgtk2.0-dev + +script: + - cd BasiliskII/src/Unix + - NO_CONFIGURE=1 ./autogen.sh + - ./configure --enable-sdl-video --enable-sdl-audio --disable-vosf --disable-jit-compiler --with-x --with-gtk --with-mon + - make -j 4 diff --git a/README.md b/README.md new file mode 100644 index 00000000..dba6c383 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# BasiliskII +[![Build Status](https://travis-ci.org/rickyzhang82/macemu.svg)](https://travis-ci.org/rickyzhang82/macemu) From 802224630dceac91592ed4498efb4c187fda06c2 Mon Sep 17 00:00:00 2001 From: David O'Shea Date: Fri, 29 Dec 2017 11:49:37 +1030 Subject: [PATCH 54/67] Basilisk II: Update README to cover bridging tun interfaces. Now that issue #154 has been fixed, when Basilisk II is configured to use "tun" for networking, the generated tunN interface can be bridged, enabling AppleTalk frames to be forwarded without the Linux host needing to be able to route AppleTalk. This commit updates the README to discuss this possibility and briefly outline how it can be achieved. A number of spelling corrections and other minor clarifications are made in the same area. --- BasiliskII/README | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/BasiliskII/README b/BasiliskII/README index 6a2ee6bd..1a823086 100644 --- a/BasiliskII/README +++ b/BasiliskII/README @@ -442,25 +442,43 @@ ether instead of sending packets via physical media writes them to the user space program. - Prerequesties: + Prerequisites: - Make sure the "tun" kernel module is loaded - # modprobe tun - - Make sure IP Fordwarding is enabled on your system - # echo 1 >/proc/sys/net/ipv4/ip_forward - A virtual network configuration script is required and the + # modprobe tun + + - If you wish to route IP packets from Basilisk II, make sure + IP Forwarding is enabled on your system (not required for + bridging) + + # echo 1 >/proc/sys/net/ipv4/ip_forward + + A virtual network configuration script is required in order + to configure the tunN interface after it is created, and the default is /usr/local/BasiliskII/tunconfig unless you specify a different file with the "etherconfig" item. - This script requires you that "sudo" is properly configured + The default "tunconfig" script configures the tunN interface + for IP NAT. It requires that "sudo" is properly configured so that "/sbin/ifconfig" and "/sbin/iptables" can be executed as root. Otherwise, you can still write a helper script which - invokes your favorite program to enhance a user priviledges. + invokes your favorite program to elevate user privileges. e.g. in a KDE environment, kdesu can be used as follows: #!/bin/sh exec /usr/bin/kdesu -c /path/to/tunconfig $1 $2 + As an alternative to configuring IP on the tunN interface, + you may attach it to a bridge, which will enable AppleTalk + frames to be forwarded without Linux needing to route them. + No tunconfig-like script is provided to configure bridging, + but you may simply configure "etherconfig /bin/true" to skip + the automatic configuration and then configure bridging + manually once Basilisk II has started, e.g.: + + # ifconfig tun0 up + # brctl addif bridge1 tun0 + 4. Access the network through the user mode network stack. (the code and this documentation come from QEMU) From 9e2fc30ecdba79ee126512365b9aa1bc0af653ab Mon Sep 17 00:00:00 2001 From: David O'Shea Date: Fri, 29 Dec 2017 22:52:58 +1030 Subject: [PATCH 55/67] Basilisk II: Add icons for X11 based on the MacOS X icons (fixes #160). Note that it appears that a 'make clean' may be required due to the change in user_strings_unix.h failing to cause all of the modules that include it to be rebuilt. --- .../src/Unix/BasiliskII_128x128x32_icon.c | 2672 +++++++++++++++++ .../src/Unix/BasiliskII_32x32x32_icon.c | 166 + BasiliskII/src/Unix/user_strings_unix.cpp | 1 + BasiliskII/src/Unix/user_strings_unix.h | 1 + BasiliskII/src/Unix/video_x.cpp | 85 + 5 files changed, 2925 insertions(+) create mode 100644 BasiliskII/src/Unix/BasiliskII_128x128x32_icon.c create mode 100644 BasiliskII/src/Unix/BasiliskII_32x32x32_icon.c diff --git a/BasiliskII/src/Unix/BasiliskII_128x128x32_icon.c b/BasiliskII/src/Unix/BasiliskII_128x128x32_icon.c new file mode 100644 index 00000000..da13849a --- /dev/null +++ b/BasiliskII/src/Unix/BasiliskII_128x128x32_icon.c @@ -0,0 +1,2672 @@ +/* GIMP RGBA C-Source image dump (BasiliskII_128x128x32_icon.c) */ + +static const struct { + unsigned int width; + unsigned int height; + unsigned int bytes_per_pixel; /* 2:RGB16, 3:RGB, 4:RGBA */ + unsigned char pixel_data[128 * 128 * 4 + 1]; +} icon_128x128x32 = { + 128, 128, 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\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\277\277\277\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\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\274\254P\377\223" + "}\200\377`>\277\377`>\277\377\274\254P\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\337\337\30PPP\377\312" + "\312\3121\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\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\337\327\40\377\207n\217\3778\16\357\377L\0\377\377[\0\377\377i\0\377" + "\377c\0\377\3778\16\357\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\342\342\11PPP\377PPP\377PPP\377\245\245\245X\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\307\273@\377`>\277\3779\0\377" + "\377f\0\377\377\215\0\377\377\220\0\377\377\210\0\377\377}\0\377\377g\0\377" + "\377E\36\337\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\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\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\\\\\\\242PPP\377PPP\377PPP\377PPP\377jjj\224\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\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\307\273@\377`>\277\377F\0\377\377z\0\377\377\224\0\377\377\223\0\377" + "\377\220\0\377\377\213\0\377\377}\0\377\377S\0\377\377S.\317\371\325\312" + "1\177\177\177\2\177\177\177\2\252\252\252\3\277\277\277\4\277\277\277\4\277" + "\277\277\4\252\252\252\3\177\177\177\2\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\0\0\0\0\0\0\0\0\0jjj\224PPP\377PPP\377PPP\377PPP\377" + "PPP\377\312\312\3121\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\307\273@\377`>\277\377F\0\377\377z\0\377\377\223" + "\0\377\377\223\0\377\377\221\0\377\377\216\0\377\377}\0\377\377R\0\377\377" + "<\16\357\377\224~\201\252\252\252\3\277\277\277\4\324\324\324\6\337\337\337" + "\10\342\342\342\11\347\347\347\13\347\347\347\13\345\345\345\12\337\337\337" + "\10\314\314\314\5\252\252\252\3\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\0\245\245\245XPPP\377PPP\377PPP\377PPP\377PPP\377\245\245\245" + "X\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\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\337" + "\327\40\377mN\257\377F\0\377\377z\0\377\377\223\0\377\377\222\0\377\377\220" + "\0\377\377\215\0\377\377r\0\377\377N\0\377\377E\36\337\374\240\213q\361\344" + "\344\23\314\314\314\5\337\337\337\10\347\347\347\13\356\356\356\17\361\361" + "\361\23\350\350\350\27\353\353\353\32\353\353\353\32\361\344\335&\371\203" + "j\227\375R.\321\3778\16\357\375_>\300\377`>\277\377mN\257\377\223}\200\377" + "\223}\200\377\257\234`\342\257\244Z|G<\377|G<\377[NK\377PPP\377PPP\377jj" + "j\224\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\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" + "\357\337\20\377\307\273@\377\257\234`\377\223}\200\377`>\277\377y^\237\377" + "\357\337\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\357\337\20\377\207n\217\3779\0\377\377s\0\377\377" + "\223\0\377\377\222\0\377\377\220\0\377\377\215\0\377\377r\0\377\377B\0\377" + "\377`>\277\374\255\235a\252\252\252\3\324\324\324\6\342\342\342\11\353\353" + "\353\15\361\361\361\23\353\353\353\32\347\347\347!\346\346\346)\344\344\344" + "0\341\341\3414\341\341\3413\361\224\200\211\377T\0\377\377{\0\377\377\213" + "\0\377\377y\0\377\377x\0\377\377r\0\377\377_\0\377\377^\0\377\377Q\0\377" + "\377E\0\377\377E\0\377\377E\0\377\3772\0\377\377,\0\377\377,\0\377\377,\0" + "\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377" + ",\0\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377" + "\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377,\0" + "\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377" + ",\0\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377" + "\377,\0\377\377,\0\377\3772\0\377\377A\0\377\377I\0\377\377P\0\377\377_\0" + "\377\377V\0\377\377`>\277\0\0\0\1\0\0\0\1\0\0\0\1\0\0\0\1\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\257\234`\377>\16\357\377f\0\377\377\223\0\377" + "\377\222\0\377\377\220\0\377\377\214\0\377\377|\0\377\377M\0\377\377`>\277" + "\373\310\274A\252\252\252\3\324\324\324\6\342\342\342\11\354\354\354\16\362" + "\362\362\25\355\355\355\35\345\345\345(\341\341\3413\336\336\336?\326\326" + "\326K\324\324\324T\320\320\320X\322\322\322U\365W6\322\377t\0\377\377\222" + "\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0" + "\377\377\224\0\377\377\223\0\377\377\223\0\377\377\223\0\377\377\223\0\377" + "\377\223\0\377\377\223\0\377\377\223\0\377\377\223\0\377\377\223\0\377\377" + "\223\0\377\377\223\0\377\377\223\0\377\377\223\0\377\377\223\0\377\377\223" + "\0\377\377\223\0\377\377\223\0\377\377\223\0\377\377\223\0\377\377\223\0" + "\377\377\223\0\377\377\223\0\377\377\223\0\377\377\223\0\377\377\223\0\377" + "\377\223\0\377\377\223\0\377\377\223\0\377\377\223\0\377\377\223\0\377\377" + "\223\0\377\377\223\0\377\377\223\0\377\377\223\0\377\377\223\0\377\377\223" + "\0\377\377\223\0\377\377\223\0\377\377\223\0\377\377\223\0\377\377\223\0" + "\377\377\223\0\377\377\222\0\377\377\216\0\377\377\205\0\377\377|\0\377\377" + "u\0\377\377q\0\377\377p\0\377\377,\0\377\252\252\252\3\252\252\252\3\277" + "\277\277\4\277\277\277\4\277\277\277\4\252\252\252\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\377\324\311" + "0\377`>\277\377S\0\377\377\215\0\377\377\222\0\377\377\220\0\377\377\214" + "\0\377\377\210\0\377\377]\0\377\377I\35\337\374\255\235a\252\252\252\3\314" + "\314\314\5\342\342\342\11\354\354\354\16\362\362\362\25\356\356\356\37\346" + "\346\346*\337\337\3378\327\327\327G\320\320\320W\312\312\312f\303\303\303" + "s\300\300\300{\277\277\277}\302\302\302v\360S2\330\377w\0\377\377\224\0\377" + "\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377" + "\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224" + "\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0" + "\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377" + "\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377" + "\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\225\0\377\377\224" + "\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0" + "\377\377\224\0\377\377\224\0\377\377\225\0\377\377\224\0\377\377\224\0\377" + "\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377" + "\224\0\377\377\224\0\377\377\221\0\377\377\211\0\377\377~\0\377\377v\0\377" + "\377r\0\377\377[\0\377\374kM\262\342\342\342\11\345\345\345\12\347\347\347" + "\13\347\347\347\13\347\347\347\13\342\342\342\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\0\0\0\0\0\377\223}\200\377@\0\377" + "\377z\0\377\377\223\0\377\377\220\0\377\377\215\0\377\377\211\0\377\377y" + "\0\377\377A\0\377\377\207n\217\361\344\344\23\314\314\314\5\337\337\337\10" + "\354\354\354\16\362\362\362\25\356\356\356\37\347\347\347+\340\340\340:\331" + "\331\331J\317\317\317\\\307\307\307n\276\276\276\177\266\266\266\215\261" + "\261\261\230\257\257\257\235\260\260\260\231\267\267\267\214\357Q0\334\377" + "x\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0" + "\377\377\223\0\377\377\224\0\377\377\223\0\377\377\224\0\377\377\224\0\377" + "\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377" + "\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224" + "\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0" + "\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377" + "\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377" + "\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224" + "\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0" + "\377\377\224\0\377\377\223\0\377\377\223\0\377\377\220\0\377\377\207\0\377" + "\377}\0\377\377u\0\377\377r\0\377\377F\0\377\365\246\226n\350\350\350\27" + "\352\352\352\31\353\353\353\32\354\354\354\33\352\352\352\31\363\363\363" + "\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\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\324\3110\377" + "S.\317\377`\0\377\377\223\0\377\377\221\0\377\377\216\0\377\377\211\0\377" + "\377\204\0\377\377e\0\377\377I\35\337\373\310\274A\277\277\277\4\337\337" + "\337\10\351\351\351\14\362\362\362\24\355\355\355\35\346\346\346*\337\337" + "\3379\326\326\326K\316\316\316^\304\304\304q\274\274\274\203\264\264\264" + "\224\254\254\254\241\251\251\251\252\247\247\247\256\247\247\247\254\254" + "\254\254\241\267\267\267\216\357Q0\334\377y\0\377\377\224\0\377\377\224\0" + "\377\377\223\0\377\377\222\0\377\377\221\0\377\377\220\0\377\377\220\0\377" + "\377\220\0\377\377\221\0\377\377\221\0\377\377\221\0\377\377\221\0\377\377" + "\221\0\377\377\221\0\377\377\221\0\377\377\221\0\377\377\221\0\377\377\221" + "\0\377\377\221\0\377\377\221\0\377\377\221\0\377\377\221\0\377\377\221\0" + "\377\377\221\0\377\377\221\0\377\377\221\0\377\377\221\0\377\377\221\0\377" + "\377\221\0\377\377\221\0\377\377\221\0\377\377\221\0\377\377\221\0\377\377" + "\221\0\377\377\221\0\377\377\221\0\377\377\221\0\377\377\221\0\377\377\221" + "\0\377\377\221\0\377\377\221\0\377\377\221\0\377\377\221\0\377\377\221\0" + "\377\377\221\0\377\377\221\0\377\377\221\0\377\377\221\0\377\377\220\0\377" + "\377\217\0\377\377\212\0\377\377\202\0\377\377z\0\377\377t\0\377\377q\0\377" + "\3770\0\377\345\330\330<\344\344\3441\341\341\3414\342\342\3426\336\336\336" + "7\341\341\3414\347\347\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\377\223}\200\377@\0\377\377\200\0\377\377\223\0\377\377\220\0\377\377" + "\214\0\377\377\206\0\377\377\201\0\377\377T\0\377\377lO\260\361\344\344\23" + "\324\324\324\6\347\347\347\13\360\360\360\22\354\354\354\33\345\345\345(" + "\336\336\3367\330\330\330I\315\315\315]\304\304\304q\273\273\273\204\262" + "\262\262\226\254\254\254\244\246\246\246\257\244\244\244\264\244\244\244" + "\264\246\246\246\257\254\254\254\244\264\264\264\223\277\277\277|\361T3\327" + "\377y\0\377\377\224\0\377\377\224\0\377\377\223\0\377\377\220\0\377\377\214" + "\0\377\377\211\0\377\377\210\0\377\377\210\0\377\377\211\0\377\377\211\0" + "\377\377\211\0\377\377\212\0\377\377\212\0\377\377\212\0\377\377\212\0\377" + "\377\212\0\377\377\212\0\377\377\212\0\377\377\211\0\377\377\212\0\377\377" + "\212\0\377\377\212\0\377\377\212\0\377\377\212\0\377\377\212\0\377\377\211" + "\0\377\377\212\0\377\377\211\0\377\377\212\0\377\377\212\0\377\377\212\0" + "\377\377\212\0\377\377\212\0\377\377\212\0\377\377\212\0\377\377\212\0\377" + "\377\212\0\377\377\212\0\377\377\212\0\377\377\212\0\377\377\212\0\377\377" + "\212\0\377\377\212\0\377\377\211\0\377\377\212\0\377\377\211\0\377\377\211" + "\0\377\377\211\0\377\377\210\0\377\377\206\0\377\377\201\0\377\377{\0\377" + "\377v\0\377\377r\0\377\377V\0\377\356jN\277\322\322\322V\321\321\321Y\317" + "\317\317\\\316\316\316_\316\316\316^\320\320\320X\326\326\326K\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\337\327\40\377`>\277\377`\0\377\377\224\0\377" + "\377\222\0\377\377\217\0\377\377\212\0\377\377\203\0\377\377x\0\377\377I" + "\0\377\375\222|\201\314\314\314\5\342\342\342\11\356\356\356\17\351\351\351" + "\30\351\351\351$\341\341\3413\332\332\332E\321\321\321Z\305\305\305o\273" + "\273\273\204\262\262\262\226\253\253\253\245\246\246\246\260\243\243\243" + "\265\243\243\243\266\245\245\245\261\251\251\251\247\260\260\260\231\271" + "\271\271\210\303\303\303t\315\315\315]\365W6\321\377y\0\377\377\224\0\377" + "\377\224\0\377\377\222\0\377\377\215\0\377\377\206\0\377\377\201\0\377\377" + "~\0\377\377~\0\377\377~\0\377\377\177\0\377\377\177\0\377\377\177\0\377\377" + "\177\0\377\377\177\0\377\377\177\0\377\377\177\0\377\377\177\0\377\377\177" + "\0\377\377\177\0\377\377\177\0\377\377\177\0\377\377\177\0\377\377\177\0" + "\377\377\177\0\377\377\177\0\377\377\177\0\377\377\177\0\377\377\177\0\377" + "\377\177\0\377\377\177\0\377\377\177\0\377\377\177\0\377\377\177\0\377\377" + "\177\0\377\377\177\0\377\377\177\0\377\377\177\0\377\377\177\0\377\377\177" + "\0\377\377\177\0\377\377\177\0\377\377\177\0\377\377\177\0\377\377\177\0" + "\377\377\177\0\377\377\177\0\377\377\177\0\377\377\177\0\377\377~\0\377\377" + "|\0\377\377y\0\377\377u\0\377\377r\0\377\377p\0\377\377=\0\377\315\230\214" + "\241\273\273\273\204\273\273\273\207\267\267\267\213\266\266\266\215\270" + "\270\270\212\275\275\275\200\310\310\310l\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\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\274" + "\254P\377D\15\357\377z\0\377\377\224\0\377\377\222\0\377\377\216\0\377\377" + "\211\0\377\377\202\0\377\377v\0\377\377D\14\357\374\253\234b\332\332\332" + "\7\351\351\351\14\362\362\362\25\347\347\347\40\343\343\343.\333\333\333" + "@\322\322\322U\310\310\310k\275\275\275\201\263\263\263\225\253\253\253\245" + "\245\245\245\261\243\243\243\266\243\243\243\266\245\245\245\261\251\251" + "\251\247\260\260\260\231\271\271\271\210\302\302\302v\313\313\313c\325\325" + "\325P\335\335\335=\370Z8\312\377y\0\377\377\224\0\377\377\224\0\377\377\222" + "\0\377\377\213\0\377\377\202\0\377\377{\0\377\377v\0\377\377u\0\377\377v" + "\0\377\377v\0\377\377v\0\377\377v\0\377\377v\0\377\377w\0\377\377w\0\377" + "\377v\0\377\377v\0\377\377v\0\377\377w\0\377\377v\0\377\377w\0\377\377v\0" + "\377\377w\0\377\377v\0\377\377w\0\377\377v\0\377\377v\0\377\377v\0\377\377" + "v\0\377\377w\0\377\377v\0\377\377w\0\377\377w\0\377\377w\0\377\377v\0\377" + "\377v\0\377\377v\0\377\377v\0\377\377v\0\377\377v\0\377\377w\0\377\377w\0" + "\377\377w\0\377\377v\0\377\377v\0\377\377w\0\377\377v\0\377\377v\0\377\377" + "u\0\377\377u\0\377\377s\0\377\377r\0\377\377p\0\377\377g\0\377\363;\24\365" + "\246\246\246\257\245\245\245\261\244\244\244\264\241\241\241\267\241\241" + "\241\267\244\244\244\262\254\254\254\243\270\270\270\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\316\316" + "\316\377\316\316\316\377\316\316\316\377\316\316\316\377\316\316\316\377" + "\316\316\316\377\316\316\316\377\316\316\316\377\316\316\316\377\316\316" + "\316\377\316\316\316\377\316\316\316\377\316\316\316\377\316\316\316\377" + "\316\316\316\377\316\316\316\377\316\316\316\377\316\316\316\377\316\316" + "\316\377\352s[\377\377M\0\377\377\215\0\377\377\224\0\377\377\222\0\377\377" + "\216\0\377\377\207\0\377\377\200\0\377\377u\0\377\375B\12\377\325\256\246" + "\377\312\312\312\377\307\307\307\377\304\304\304\377\276\276\276\377\267" + "\267\267\377\256\256\256\377\246\246\246\377\234\234\234\377\224\224\224" + "\377\214\214\214\377\206\206\206\377\203\203\203\377\203\203\203\377\206" + "\206\206\377\212\212\212\377\220\220\220\377\227\227\227\377\240\240\240" + "\377\246\246\246\377\256\256\256\377\265\265\265\377\273\273\273\377\300" + "\300\300\377\342xa\377\377`\0\377\377\224\0\377\377\224\0\377\377\221\0\377" + "\377\212\0\377\377\200\0\377\377x\0\377\377s\0\377\377r\0\377\377q\0\377" + "\377r\0\377\377r\0\377\377r\0\377\377q\0\377\377r\0\377\377r\0\377\377r\0" + "\377\377r\0\377\377r\0\377\377r\0\377\377r\0\377\377r\0\377\377r\0\377\377" + "r\0\377\377r\0\377\377r\0\377\377r\0\377\377r\0\377\377r\0\377\377r\0\377" + "\377r\0\377\377r\0\377\377r\0\377\377q\0\377\377r\0\377\377r\0\377\377r\0" + "\377\377r\0\377\377r\0\377\377r\0\377\377r\0\377\377r\0\377\377q\0\377\377" + "r\0\377\377r\0\377\377r\0\377\377r\0\377\377r\0\377\377q\0\377\377q\0\377" + "\377q\0\377\377p\0\377\377p\0\377\377p\0\377\377N\0\377\311_I\351\223\223" + "\223\324\223\223\223\325\221\221\221\327\222\222\222\330\223\223\223\326" + "\227\227\227\315\241\241\241\272\261\261\261\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\316\316\316\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\247\232\227\377\347I(\377\377g\0" + "\377\377\224\0\377\377\224\0\377\377\222\0\377\377\215\0\377\377\207\0\377" + "\377\177\0\377\377k\0\377\372;\11\377\260\211\200\377\235\235\235\377\232" + "\232\232\377\226\226\226\377\221\221\221\377\213\213\213\377\204\204\204" + "\377|||\377uuu\377nnn\377iii\377fff\377eee\377fff\377jjj\377ooo\377uuu\377" + "|||\377\202\202\202\377\210\210\210\377\216\216\216\377\222\222\222\377\226" + "\226\226\377\231\231\231\377\234\234\234\377\317eO\377\377`\0\377\377\224" + "\0\377\377\224\0\377\377\221\0\377\377\212\0\377\377\200\0\377\377w\0\377" + "\377r\0\377\377p\0\377\377p\0\377\377p\0\377\377p\0\377\377p\0\377\377p\0" + "\377\377p\0\377\377p\0\377\377p\0\377\377p\0\377\377p\0\377\377p\0\377\377" + "p\0\377\377p\0\377\377p\0\377\377p\0\377\377p\0\377\377p\0\377\377p\0\377" + "\377p\0\377\377p\0\377\377p\0\377\377p\0\377\377p\0\377\377p\0\377\377p\0" + "\377\377p\0\377\377p\0\377\377p\0\377\377p\0\377\377p\0\377\377p\0\377\377" + "p\0\377\377p\0\377\377p\0\377\377p\0\377\377p\0\377\377p\0\377\377p\0\377" + "\377p\0\377\377p\0\377\377p\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0" + "\377\3770\0\377\217\202\177\354\210\210\210\353\210\210\210\354\207\207\207" + "\355\210\210\210\354\211\211\211\347\221\221\221\332\235\235\235\302\257" + "\257\257\236\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\316\316\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\263\213\203" + "\377\364A\23\377\377z\0\377\377\224\0\377\377\224\0\377\377\222\0\377\377" + "\215\0\377\377\206\0\377\377~\0\377\377j\0\377\356E\34\377\252\220\212\377" + "\234\234\234\377\230\230\230\377\224\224\224\377\216\216\216\377\207\207" + "\207\377\200\200\200\377www\377ppp\377jjj\377fff\377ddd\377ddd\377hhh\377" + "lll\377rrr\377zzz\377\201\201\201\377\210\210\210\377\215\215\215\377\222" + "\222\222\377\227\227\227\377\231\231\231\377\234\234\234\377\236\236\236" + "\377\236\236\236\377\312mZ\377\377Y\0\377\377\224\0\377\377\224\0\377\377" + "\221\0\377\377\211\0\377\377\177\0\377\377w\0\377\377r\0\377\377p\0\377\377" + "o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377" + "\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0" + "\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377" + "o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377" + "\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0" + "\377\377p\0\377\377p\0\377\377p\0\377\377p\0\377\377p\0\377\377p\0\377\377" + "p\0\377\377o\0\377\377o\0\377\377o\0\377\377V\0\377\317K0\374\202\202\202" + "\367\202\202\202\367\202\202\202\367\202\202\202\367\204\204\204\364\207" + "\207\207\355\220\220\220\334\236\236\236\300\261\261\261\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\316" + "\316\316\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\276|n\377\372E\10\377\377\207\0\377\377\224\0\377\377" + "\223\0\377\377\221\0\377\377\214\0\377\377\205\0\377\377~\0\377\377n\0\377" + "\364>\23\377\243\226\223\377\233\233\233\377\227\227\227\377\221\221\221" + "\377\213\213\213\377\203\203\203\377{{{\377sss\377lll\377fff\377ccc\377b" + "bb\377ddd\377hhh\377nnn\377vvv\377~~~\377\206\206\206\377\214\214\214\377" + "\222\222\222\377\226\226\226\377\231\231\231\377\234\234\234\377\236\236" + "\236\377\237\237\237\377\240\240\240\377\240\240\240\377\270\203x\377\377" + "F\0\377\377\224\0\377\377\224\0\377\377\221\0\377\377\211\0\377\377\177\0" + "\377\377v\0\377\377r\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377" + "o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377" + "\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0" + "\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377" + "o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377" + "\377o\0\377\377o\0\377\377o\0\377\377p\0\377\377q\0\377\377r\0\377\377s\0" + "\377\377s\0\377\377r\0\377\377q\0\377\377p\0\377\377p\0\377\377o\0\377\377" + "o\0\377\377=\0\377\237j_\376~~~\375~~~\375\200\200\200\374\200\200\200\373" + "\203\203\203\366\210\210\210\353\221\221\221\327\243\243\243\266\267\267" + "\267\214\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\316\316\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\304ud\377\377M\0\377\377\215\0\377\377\223\0\377" + "\377\221\0\377\377\216\0\377\377\211\0\377\377\203\0\377\377|\0\377\377r" + "\0\377\372?\10\377\257\210\177\377\231\231\231\377\224\224\224\377\217\217" + "\217\377\210\210\210\377\200\200\200\377www\377ooo\377hhh\377ccc\377aaa\377" + "aaa\377ddd\377iii\377qqq\377yyy\377\201\201\201\377\211\211\211\377\220\220" + "\220\377\225\225\225\377\231\231\231\377\234\234\234\377\236\236\236\377" + "\237\237\237\377\240\240\240\377\240\240\240\377\240\240\240\377\240\240" + "\240\377\255\222\215\377\3779\0\377\377\224\0\377\377\224\0\377\377\221\0" + "\377\377\211\0\377\377~\0\377\377v\0\377\377q\0\377\377p\0\377\377o\0\377" + "\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0" + "\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377" + "o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377" + "\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0" + "\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377" + "o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377" + "\377o\0\377\377o\0\377\377g\0\377\3577\20\377\177\177\177\377\177\177\177" + "\377\177\177\177\376~~~\375\200\200\200\373\204\204\204\364\213\213\213\346" + "\227\227\227\315\252\252\252\250\277\277\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\316\316\316\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\320fP\377\377S\0\377\377\224" + "\0\377\377\222\0\377\377\217\0\377\377\212\0\377\377\205\0\377\377\177\0" + "\377\377z\0\377\377p\0\377\372?\10\377\256\206~\377\230\230\230\377\222\222" + "\222\377\214\214\214\377\205\205\205\377|||\377sss\377kkk\377eee\377aaa\377" + "___\377aaa\377ddd\377kkk\377sss\377|||\377\205\205\205\377\214\214\214\377" + "\222\222\222\377\230\230\230\377\233\233\233\377\235\235\235\377\237\237" + "\237\377\240\240\240\377\240\240\240\377\240\240\240\377\240\240\240\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\365/\6\377\377\215\0\377" + "\377\223\0\377\377\217\0\377\377\207\0\377\377}\0\377\377u\0\377\377q\0\377" + "\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0" + "\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377" + "o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377" + "\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0" + "\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377" + "o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377" + "\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377I\0\377\267ZG\377\177\177" + "\177\377\177\177\177\377\177\177\177\377~~~\375\201\201\201\371\206\206\206" + "\360\217\217\217\336\236\236\236\300\261\261\261\230\310\310\310l\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\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\316\316\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\334X=\377\377`\0\377\377" + "\224\0\377\377\222\0\377\377\216\0\377\377\210\0\377\377\202\0\377\377|\0" + "\377\377w\0\377\377t\0\377\3779\0\377\256\206~\377\226\226\226\377\221\221" + "\221\377\212\212\212\377\201\201\201\377yyy\377ppp\377hhh\377bbb\377___\377" + "^^^\377```\377eee\377lll\377uuu\377~~~\377\207\207\207\377\217\217\217\377" + "\225\225\225\377\231\231\231\377\235\235\235\377\236\236\236\377\240\240" + "\240\377\240\240\240\377\240\240\240\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\206\206\206\377\3107\31" + "\377\377s\0\377\377\223\0\377\377|\0\377\377n\0\377\377T\0\377\377P\0\377" + "\377F\0\377\377=\0\377\377=\0\377\377=\0\377\3779\0\377\377,\0\377\377,\0" + "\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377" + ",\0\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377" + "\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377,\0" + "\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377,\0\377\377" + ",\0\377\377,\0\377\377,\0\377\3770\0\377\377A\0\377\377k\0\377\377o\0\377" + "\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377k\0\377\3674\7\377\205xu" + "\377\177\177\177\377\177\177\177\377\177\177\177\376\200\200\200\374\203" + "\203\203\366\211\211\211\352\224\224\224\323\245\245\245\261\273\273\273" + "\207\317\317\317[\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\316\316\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\334X=\377\377m\0" + "\377\377\224\0\377\377\222\0\377\377\216\0\377\377\207\0\377\377\200\0\377" + "\377z\0\377\377v\0\377\377s\0\377\377F\0\377\300q`\377\225\225\225\377\217" + "\217\217\377\207\207\207\377~~~\377uuu\377mmm\377eee\377```\377]]]\377]]" + "]\377```\377eee\377mmm\377www\377\200\200\200\377\211\211\211\377\221\221" + "\221\377\226\226\226\377\233\233\233\377\235\235\235\377\237\237\237\377" + "\240\240\240\377\240\240\240\377\240\240\240\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\223\223\223\377" + "PPP\377\222B2\377\377?\0\377\377,\0\377\3352\16\377\3246\25\377\331oY\377" + "\325kU\377\276n^\377\244od\377\233f[\377\230cX\377\215e]\377rrr\377rrr\377" + "rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rr" + "r\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377" + "rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377{nk\377\236\\N\377" + "\371D\5\377\377k\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377V\0" + "\377\312F+\377}}}\377\177\177\177\377\177\177\177\377\177\177\177\376\201" + "\201\201\372\205\205\205\362\215\215\215\342\231\231\231\307\254\254\254" + "\241\301\301\301u\326\326\326K\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\316\316\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\334X=\377\377m\0\377" + "\377\224\0\377\377\222\0\377\377\216\0\377\377\207\0\377\377\177\0\377\377" + "y\0\377\377t\0\377\377q\0\377\377R\0\377\322\\C\377\224\224\224\377\215\215" + "\215\377\205\205\205\377|||\377rrr\377jjj\377ccc\377^^^\377\\\\\\\377\\\\" + "\\\377___\377fff\377nnn\377www\377\201\201\201\377\212\212\212\377\222\222" + "\222\377\230\230\230\377\233\233\233\377\236\236\236\377\237\237\237\377" + "\240\240\240\377\240\240\240\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "kkk\377PPP\377[NK\377qIA\377OOO\377MMM\377\240\240\240\377\301\301\301\377" + "\255\255\255\377\230\230\230\377\207\207\207\377|||\377vvv\377sss\377rrr" + "\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377" + "rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rr" + "r\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377rrr\377" + "rrr\377\334>\35\377\377^\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377" + "\3774\0\377\204id\377}}}\377\177\177\177\377\177\177\177\376~~~\375\202\202" + "\202\370\207\207\207\355\221\221\221\331\241\241\241\271\265\265\265\217" + "\313\313\313c\335\335\335<\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\316\316\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\326_G\377\377f\0\377\377\224\0\377\377\223" + "\0\377\377\217\0\377\377\210\0\377\377\200\0\377\377y\0\377\377t\0\377\377" + "q\0\377\377_\0\377\345G&\377\223\223\223\377\214\214\214\377\203\203\203" + "\377yyy\377ppp\377hhh\377aaa\377\\\\\\\377ZZZ\377[[[\377___\377eee\377nn" + "n\377xxx\377\202\202\202\377\214\214\214\377\223\223\223\377\230\230\230" + "\377\234\234\234\377\236\236\236\377\240\240\240\377\240\240\240\377\240" + "\240\240\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\223\223\223\377PPP\377" + "PPP\377PPP\377PPP\377OOO\377ggg\377\323\323\323\377\303\303\303\377\257\257" + "\257\377\234\234\234\377\212\212\212\377~~~\377xxx\377ttt\377ttt\377sss\377" + "ttt\377ttt\377ttt\377ttt\377uuu\377uuu\377uuu\377uuu\377uuu\377uuu\377uu" + "u\377uuu\377uuu\377uuu\377uuu\377uuu\377uuu\377uuu\377uuu\377uuu\377uuu\377" + "uuu\377uuu\377uuu\377uuu\377uuu\377uuu\377uuu\377uuu\377uuu\377uuu\377\377" + ",\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377^\0\377\334>\35\377" + "sss\377~~~\377\177\177\177\376\177\177\177\376\200\200\200\373\204\204\204" + "\364\213\213\213\346\227\227\227\315\250\250\250\251\277\277\277}\323\323" + "\323R\343\343\343/\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\316\316\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\304ud\377\377S\0\377\377\224\0\377\377\223\0\377\377\220\0\377\377" + "\211\0\377\377\201\0\377\377y\0\377\377t\0\377\377q\0\377\377l\0\377\371" + "7\11\377\231\214\211\377\212\212\212\377\201\201\201\377www\377nnn\377ff" + "f\377___\377[[[\377YYY\377ZZZ\377^^^\377eee\377nnn\377yyy\377\203\203\203" + "\377\214\214\214\377\224\224\224\377\231\231\231\377\235\235\235\377\236" + "\236\236\377\240\240\240\377\240\240\240\377\240\240\240\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377kkk\377PPP\377PPP\377PPP\377" + "PPP\377OOO\377\266\266\266\377\325\325\325\377\306\306\306\377\263\263\263" + "\377\237\237\237\377\215\215\215\377\202\202\202\377zzz\377xxx\377www\377" + "xxx\377xxx\377yyy\377yyy\377zzz\377zzz\377zzz\377zzz\377zzz\377zzz\377zz" + "z\377zzz\377zzz\377zzz\377zzz\377zzz\377zzz\377zzz\377zzz\377zzz\377zzz\377" + "zzz\377zzz\377zzz\377zzz\377zzz\377zzz\377zzz\377zzz\377zzz\377zzz\377\223" + "kc\377\3779\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377E\0\377" + "\252[J\377uuu\377\177\177\177\377\200\200\200\374\200\200\200\374\201\201" + "\201\371\206\206\206\360\217\217\217\335\236\236\236\277\261\261\261\230" + "\310\310\310k\334\334\334C\351\351\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\316\316\316\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\304ud\377\377S\0\377\377\224\0\377\377\223\0\377\377\221\0\377" + "\377\212\0\377\377\203\0\377\377z\0\377\377u\0\377\377r\0\377\377p\0\377" + "\377=\0\377\255xm\377\211\211\211\377\200\200\200\377vvv\377lll\377ddd\377" + "]]]\377ZZZ\377XXX\377YYY\377]]]\377ddd\377mmm\377xxx\377\203\203\203\377" + "\214\214\214\377\224\224\224\377\231\231\231\377\235\235\235\377\237\237" + "\237\377\240\240\240\377\240\240\240\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\223\223\223\377PPP\377PPP\377PP" + "P\377PPP\377PPP\377\205\205\205\377\337\337\337\377\327\327\327\377\312\312" + "\312\377\270\270\270\377\245\245\245\377\224\224\224\377\210\210\210\377" + "\202\202\202\377\177\177\177\377\177\177\177\377\177\177\177\377\200\200" + "\200\377\201\201\201\377\202\202\202\377\203\203\203\377\203\203\203\377" + "\204\204\204\377\205\205\205\377\205\205\205\377\205\205\205\377\205\205" + "\205\377\205\205\205\377\205\205\205\377\205\205\205\377\205\205\205\377" + "\205\205\205\377\205\205\205\377\205\205\205\377\205\205\205\377\205\205" + "\205\377\205\205\205\377\205\205\205\377\205\205\205\377\205\205\205\377" + "\205\205\205\377\205\205\205\377\205\205\205\377\205\205\205\377\205\205" + "\205\377\205\205\205\377\205\205\205\377\273^K\377\377I\0\377\377o\0\377" + "\377o\0\377\377o\0\377\377g\0\377\3577\20\377}}}\377zzz\377\202\202\202\377" + "\201\201\201\371\201\201\201\372\203\203\203\365\211\211\211\351\225\225" + "\225\322\246\246\246\260\273\273\273\205\321\321\321Z\342\342\3425\354\354" + "\354\33\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\316\316\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\263\213\203\377\372E\10\377\377\215" + "\0\377\377\224\0\377\377\221\0\377\377\214\0\377\377\204\0\377\377|\0\377" + "\377u\0\377\377r\0\377\377p\0\377\377N\0\377\310^H\377\210\210\210\377~~" + "~\377ttt\377kkk\377bbb\377\\\\\\\377XXX\377WWW\377XXX\377\\\\\\\377ccc\377" + "mmm\377www\377\202\202\202\377\214\214\214\377\224\224\224\377\231\231\231" + "\377\235\235\235\377\237\237\237\377\240\240\240\377\240\240\240\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377kkk\377PPP\377PPP\377PPP\377PPP\377PPP\377\273\273\273\377\340" + "\340\340\377\331\331\331\377\316\316\316\377\276\276\276\377\255\255\255" + "\377\236\236\236\377\223\223\223\377\215\215\215\377\213\213\213\377\213" + "\213\213\377\215\215\215\377\216\216\216\377\220\220\220\377\221\221\221" + "\377\223\223\223\377\224\224\224\377\224\224\224\377\225\225\225\377\226" + "\226\226\377\226\226\226\377\226\226\226\377\226\226\226\377\226\226\226" + "\377\226\226\226\377\226\226\226\377\226\226\226\377\226\226\226\377\226" + "\226\226\377\226\226\226\377\226\226\226\377\226\226\226\377\226\226\226" + "\377\226\226\226\377\226\226\226\377\226\226\226\377\226\226\226\377\226" + "\226\226\377\226\226\226\377\226\226\226\377\226\226\226\377\226\226\226" + "\377\353@\34\377\377b\0\377\377o\0\377\377o\0\377\377o\0\377\377N\0\377\306" + "\\F\377\206\206\206\377\200\200\200\377\207\207\207\377\204\204\204\364\203" + "\203\203\366\206\206\206\360\215\215\215\341\233\233\233\305\256\256\256" + "\237\303\303\303s\331\331\331J\346\346\346)\361\361\361\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\316\316" + "\316\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\247\232\227\377\3719\11\377\377\215\0\377\377\224\0\377\377\222\0\377\377" + "\215\0\377\377\206\0\377\377}\0\377\377w\0\377\377r\0\377\377p\0\377\377" + "b\0\377\352?\33\377\207\207\207\377~~~\377ttt\377iii\377aaa\377\\\\\\\377" + "XXX\377VVV\377:::\377<<<\377AAA\377GGG\377NNN\377VVV\377\214\214\214\377" + "\224\224\224\377\231\231\231\377\235\235\235\377\237\237\237\377\240\240" + "\240\377\240\240\240\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\223\223\223\377PPP\377PPP\377PP" + "P\377PPP\377PPP\377\205\205\205\377\343\343\343\377\340\340\340\377\334\334" + "\334\377\323\323\323\377\306\306\306\377\271\271\271\377\254\254\254\377" + "\243\243\243\377\236\236\236\377\235\235\235\377\237\237\237\377\240\240" + "\240\377\242\242\242\377\244\244\244\377\245\245\245\377\246\246\246\377" + ";;;\377;;;\377<<<\377<<<\377<<<\377<<<\377\253\253\253\377\253\253\253\377" + "\253\253\253\377\253\253\253\377\253\253\253\377\253\253\253\377\253\253" + "\253\377\253\253\253\377\253\253\253\377\253\253\253\377\253\253\253\377" + "\253\253\253\377\253\253\253\377\253\253\253\377\253\253\253\377\253\253" + "\253\377\253\253\253\377\253\253\253\377\253\253\253\377\273\223\213\377" + "\3779\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\3774\0\377\250\216" + "\210\377\223\223\223\377\210\210\210\377\214\214\214\377\207\207\207\356" + "\205\205\205\361\211\211\211\352\223\223\223\326\243\243\243\266\266\266" + "\266\215\315\315\315a\340\340\340;\356\356\356\36\354\354\354\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" + "\316\316\316\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\347I(\377\377z\0\377\377\224\0\377\377\222\0\377\377\216\0\377\377" + "\210\0\377\377\177\0\377\377x\0\377\377s\0\377\377p\0\377\377o\0\377\377" + "9\0\377\236vn\377}}}\377rrr\377iii\377aaa\377[[[\377WWW\377UUU\377VVV\377" + "<<<\377@@@\377FFF\377NNN\377UUU\377\\\\\\\377\223\223\223\377\231\231\231" + "\377\235\235\235\377\237\237\237\377\240\240\240\377\240\240\240\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\206\206\206\377PPP\377PPP\377PPP\377PPP\377" + "PPP\377\274\274\274\377\343\343\343\377\341\341\341\377\337\337\337\377\330" + "\330\330\377\317\317\317\377\305\305\305\377\274\274\274\377\266\266\266" + "\377\263\263\263\377\263\263\263\377\264\264\264\377\266\266\266\377\267" + "\267\267\377\271\271\271\377\272\272\272\377\273\273\273\377BBB\377CCC\377" + "CCC\377CCC\377CCC\377CCC\377\277\277\277\377\277\277\277\377\277\277\277" + "\377\277\277\277\377\277\277\277\377\277\277\277\377\277\277\277\377\277" + "\277\277\377\277\277\277\377\277\277\277\377\277\277\277\377\277\277\277" + "\377\277\277\277\377\277\277\277\377\277\277\277\377\277\277\277\377\277" + "\277\277\377\277\277\277\377\277\277\277\377\343mT\377\377R\0\377\377o\0" + "\377\377o\0\377\377o\0\377\377V\0\377\343`D\377\254\254\254\377\236\236\236" + "\377\220\220\220\377\220\220\220\377\211\211\211\347\210\210\210\353\215" + "\215\215\342\230\230\230\312\252\252\252\246\300\300\300z\325\325\325P\342" + "\342\342-\363\363\363\26\342\342\342\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\316\316\316\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\326_G\377\377f\0\377\377\224\0\377\377" + "\223\0\377\377\220\0\377\377\211\0\377\377\201\0\377\377y\0\377\377t\0\377" + "\377q\0\377\377p\0\377\377N\0\377\304ZD\377}}}\377rrr\377hhh\377```\377Z" + "ZZ\377VVV\377UUU\377VVV\377YYY\377???\377EEE\377LLL\377TTT\377[[[\377aaa" + "\377\231\231\231\377\235\235\235\377\237\237\237\377\240\240\240\377\240" + "\240\240\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\223\223\223\377]]]\377PPP\377" + "PPP\377PPP\377PPP\377kkk\377\344\344\344\377\343\343\343\377\342\342\342" + "\377\340\340\340\377\335\335\335\377\327\327\327\377\320\320\320\377\313" + "\313\313\377\306\306\306\377\306\306\306\377\306\306\306\377\307\307\307" + "\377\311\311\311\377\312\312\312\377\314\314\314\377\315\315\315\377\315" + "\315\315\377HHH\377HHH\377III\377III\377III\377III\377\320\320\320\377\320" + "\320\320\377\320\320\320\377\320\320\320\377\320\320\320\377\320\320\320" + "\377\320\320\320\377\320\320\320\377\320\320\320\377\320\320\320\377\320" + "\320\320\377\320\320\320\377\320\320\320\377\320\320\320\377\320\320\320" + "\377\320\320\320\377\320\320\320\377\320\320\320\377\320\320\320\377\371" + "A\32\377\377g\0\377\377o\0\377\377o\0\377\377o\0\377\377=\0\377\322\235\222" + "\377\266\266\266\377\247\247\247\377\226\226\226\377\224\224\224\377\215" + "\215\215\342\213\213\213\345\222\222\222\330\240\240\240\273\264\264\264" + "\224\311\311\311h\333\333\333@\350\350\350\"\357\357\357\20\324\324\324\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\316\316\316\377\241\241\241\377\241\241\241\377\271\204y\377\377" + "F\0\377\377\224\0\377\377\223\0\377\377\221\0\377\377\213\0\377\377\203\0" + "\377\377{\0\377\377u\0\377\377r\0\377\377p\0\377\377g\0\377\3608\21\377~" + "~~\377sss\377hhh\377```\377ZZZ\377VVV\377TTT\377UUU\377XXX\377]]]\377DDD" + "\377KKK\377SSS\377ZZZ\377aaa\377eee\377\234\234\234\377\236\236\236\377\240" + "\240\240\377\240\240\240\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\206\206\206\377PPP\377PPP\377PPP\377PPP\377PPP\377\256\256\256\377\344" + "\344\344\377\344\344\344\377\343\343\343\377\342\342\342\377\340\340\340" + "\377\335\335\335\377\331\331\331\377\327\327\327\377\325\325\325\377\324" + "\324\324\377\325\325\325\377\326\326\326\377\327\327\327\377\327\327\327" + "\377\330\330\330\377\330\330\330\377\331\331\331\377LLL\377MMM\377MMM\377" + "MMM\377MMM\377MMM\377\333\333\333\377\333\333\333\377\333\333\333\377\333" + "\333\333\377\333\333\333\377\333\333\333\377\333\333\333\377\333\333\333" + "\377\333\333\333\377\333\333\333\377\333\333\333\377\333\333\333\377\333" + "\333\333\377\333\333\333\377\333\333\333\377\333\333\333\377\333\333\333" + "\377\333\333\333\377\344\257\244\377\377=\0\377\377o\0\377\377o\0\377\377" + "o\0\377\377g\0\377\371A\32\377\313\313\313\377\275\275\275\377\253\253\253" + "\377\230\230\230\377\227\227\227\377\217\217\217\336\217\217\217\336\230" + "\230\230\314\250\250\250\253\275\275\275\201\322\322\322V\345\345\3452\352" + "\352\352\31\347\347\347\13\277\277\277\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\316\316\316\377\241\241" + "\241\377\247\232\227\377\3719\11\377\377\215\0\377\377\224\0\377\377\221" + "\0\377\377\215\0\377\377\205\0\377\377}\0\377\377v\0\377\377r\0\377\377p" + "\0\377\377o\0\377\377=\0\377\237j_\377ttt\377iii\377```\377ZZZ\377VVV\377" + "TTT\377TTT\377VVV\377\\\\\\\377ddd\377III\377QQQ\377YYY\377___\377ddd\377" + "ggg\377\236\236\236\377\240\240\240\377\240\240\240\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377]]]\377PPP\377PPP\377PPP\377" + "PPP\377kkk\377\344\344\344\377\344\344\344\377\344\344\344\377\343\343\343" + "\377\343\343\343\377\342\342\342\377\340\340\340\377\340\340\340\377\336" + "\336\336\377\335\335\335\377\335\335\335\377\335\335\335\377\336\336\336" + "\377\336\336\336\377\337\337\337\377\337\337\337\377\340\340\340\377\340" + "\340\340\377NNN\377NNN\377OOO\377OOO\377OOO\377OOO\377\340\340\340\377\340" + "\340\340\377\340\340\340\377\340\340\340\377\340\340\340\377\340\340\340" + "\377\340\340\340\377\340\340\340\377\340\340\340\377\340\340\340\377\340" + "\340\340\377\340\340\340\377\340\340\340\377\340\340\340\377\340\340\340" + "\377\340\340\340\377\340\340\340\377\340\340\340\377\363pT\377\377V\0\377" + "\377o\0\377\377o\0\377\377o\0\377\377I\0\377\351\214y\377\315\315\315\377" + "\275\275\275\377\252\252\252\377\227\227\227\377\227\227\227\377\220\220" + "\220\333\223\223\223\326\236\236\236\277\261\261\261\232\305\305\305o\332" + "\332\332F\352\352\352&\360\360\360\22\332\332\332\7\177\177\177\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" + "\316\316\316\377\241\241\241\377\342Q3\377\377s\0\377\377\224\0\377\377\223" + "\0\377\377\217\0\377\377\210\0\377\377\177\0\377\377x\0\377\377s\0\377\377" + "p\0\377\377o\0\377\377^\0\377\337A\40\377uuu\377jjj\377aaa\377ZZZ\377VVV" + "\377SSS\377SSS\377UUU\377ZZZ\377aaa\377kkk\377OOO\377WWW\377^^^\377ccc\377" + "ggg\377iii\377\240\240\240\377\240\240\240\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\223\223\223\377PPP\377PPP\377PPP\377" + "PPP\377PPP\377\256\256\256\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\343\343\343\377\343\343\343\377\342\342\342\377\342" + "\342\342\377\341\341\341\377\341\341\341\377\341\341\341\377\341\341\341" + "\377\341\341\341\377\342\342\342\377\342\342\342\377\342\342\342\377\342" + "\342\342\377\342\342\342\377OOO\377OOO\377OOO\377OOO\377OOO\377OOO\377\343" + "\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343" + "\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377\343" + "\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343" + "\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377\375" + "7\16\377\377k\0\377\377o\0\377\377o\0\377\377k\0\377\375;\15\377\332\314" + "\312\377\313\313\313\377\272\272\272\377\246\246\246\377\224\224\224\377" + "\224\224\224\377\222\222\222\330\227\227\227\315\245\245\245\261\271\271" + "\271\210\315\315\315]\336\336\3367\354\354\354\34\351\351\351\14\314\314" + "\314\5\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\316\316\316\377\276|n\377\377M\0\377\377\224\0\377" + "\377\223\0\377\377\221\0\377\377\212\0\377\377\202\0\377\377z\0\377\377t" + "\0\377\377q\0\377\377p\0\377\377o\0\377\3774\0\377\207mg\377kkk\377bbb\377" + "ZZZ\377VVV\377SSS\377SSS\377TTT\377XXX\377___\377hhh\377ttt\377UUU\377\\" + "\\\\\377bbb\377fff\377hhh\377jjj\377\240\240\240\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377kkk\377PPP\377" + "PPP\377PPP\377PPP\377]]]\377\326\326\326\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\343" + "\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343" + "\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377\343" + "\343\343\377\343\343\343\377\343\343\343\377PPP\377PPP\377PPP\377PPP\377" + "PPP\377PPP\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343" + "\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377\343" + "\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343" + "\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377\354" + "\252\234\377\377A\0\377\377o\0\377\377o\0\377\377o\0\377\377V\0\377\362o" + "S\377\324\324\324\377\306\306\306\377\265\265\265\377\241\241\241\377\220" + "\220\220\377\223\223\223\377\223\223\223\324\235\235\235\302\255\255\255" + "\240\302\302\302v\326\326\326L\347\347\347+\362\362\362\25\337\337\337\10" + "\252\252\252\3\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\321\304\302\377\364A\23\377\377\207\0\377" + "\377\224\0\377\377\222\0\377\377\216\0\377\377\205\0\377\377}\0\377\377v" + "\0\377\377r\0\377\377p\0\377\377o\0\377\377V\0\377\314I-\377mmm\377ccc\377" + "\\\\\\\377VVV\377SSS\377SSS\377SSS\377VVV\377\\\\\\\377eee\377ppp\377|||" + "\377ZZZ\377aaa\377fff\377hhh\377jjj\377kkk\377\240\240\240\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\223\223\223\377PPP\377" + "PPP\377PPP\377PPP\377PPP\377\223\223\223\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377PPP\377PPP\377" + "PPP\377PPP\377PPP\377PPP\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\367fH\377\377Z\0\377\377o\0\377\377o\0\377\377o\0\377\3779\0" + "\377\341\271\261\377\320\320\320\377\301\301\301\377\255\255\255\377\233" + "\233\233\377\214\214\214\377\223\223\223\377\227\227\227\316\243\243\243" + "\265\265\265\265\217\314\314\314d\335\335\335=\347\347\347\40\354\354\354" + "\16\314\314\314\5\177\177\177\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\347}g\377\377`\0\377\377\224" + "\0\377\377\223\0\377\377\220\0\377\377\211\0\377\377\200\0\377\377w\0\377" + "\377s\0\377\377p\0\377\377o\0\377\377k\0\377\3705\7\377wjg\377ddd\377\\\\" + "\\\377VVV\377SSS\377RRR\377SSS\377UUU\377ZZZ\377aaa\377lll\377yyy\377\205" + "\205\205\377___\377ddd\377hhh\377iii\377jjj\377kkk\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\206\206\206" + "\377PPP\377PPP\377PPP\377PPP\377PPP\377\311\311\311\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377PPP\377" + "PPP\377PPP\377PPP\377PPP\377PPP\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\346\330\326\377\3770\0\377\377o\0\377\377o\0\377\377o\0\377\377b\0\377\371" + "N*\377\327\327\327\377\314\314\314\377\272\272\272\377\247\247\247\377\225" + "\225\225\377\211\211\211\377\223\223\223\377\233\233\233\305\251\251\251" + "\247\277\277\277}\323\323\323S\344\344\3440\351\351\351\30\345\345\345\12" + "\252\252\252\3\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\377\337\327\40\3779\0\377\377\224\0\377\377" + "\224\0\377\377\222\0\377\377\214\0\377\377\204\0\377\377{\0\377\377t\0\377" + "\377q\0\377\377p\0\377\377o\0\377\377N\0\377\270N8\377fff\377]]]\377XXX\377" + "TTT\377RRR\377RRR\377TTT\377XXX\377^^^\377hhh\377ttt\377\201\201\201\377" + "\214\214\214\377ccc\377ggg\377iii\377jjj\377kkk\377kkk\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377kkk\377P" + "PP\377PPP\377PPP\377PPP\377\206\206\206\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\356\237\216\377\377E\0\377\377o\0\377\377o\0\377\377o\0\377\377" + "E\0\377\352\232\212\377\324\324\324\377\306\306\306\377\264\264\264\377\240" + "\240\240\377\220\220\220\377\207\207\207\377\224\224\224\377\241\241\241" + "\272\262\262\262\226\310\310\310k\334\334\334C\351\351\351$\360\360\360\21" + "\332\332\332\7\177\177\177\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\377`>\277\377z\0\377\377\224" + "\0\377\377\223\0\377\377\217\0\377\377\210\0\377\377\177\0\377\377w\0\377" + "\377r\0\377\377p\0\377\377o\0\377\377k\0\377\3675\7\377reb\377___\377XXX" + "\377UUU\377RRR\377RRR\377SSS\377VVV\377\\\\\\\377ddd\377ooo\377|||\377\210" + "\210\210\377\222\222\222\377fff\377hhh\377jjj\377kkk\377kkk\377kkk\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\223\223\223" + "\377PPP\377PPP\377PPP\377PPP\377PPP\377\256\256\256\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\372O+\377\377b\0\377\377o\0\377\377o\0\377\377k\0\377" + "\375;\15\377\334\317\314\377\317\317\317\377\277\277\277\377\255\255\255" + "\377\232\232\232\377\214\214\214\377\206\206\206\377\231\231\231\377\247" + "\247\247\254\273\273\273\205\321\321\321Z\342\342\3425\354\354\354\33\351" + "\351\351\14\277\277\277\4\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\377\307\273@\377F\0\377\377\224" + "\0\377\377\224\0\377\377\221\0\377\377\214\0\377\377\203\0\377\377z\0\377" + "\377s\0\377\377q\0\377\377o\0\377\377o\0\377\377N\0\377\265K5\377aaa\377" + "ZZZ\377UUU\377SSS\377QQQ\377RRR\377TTT\377XXX\377```\377kkk\377www\377\204" + "\204\204\377\217\217\217\377\227\227\227\377hhh\377jjj\377kkk\377kkk\377" + "kkk\377kkk\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\206\206\206\377PPP\377PPP\377PPP\377PPP\377]]]\377\326\326\326\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\347\315\307\377\3774\0\377\377o\0\377\377o\0\377\377" + "o\0\377\377V\0\377\363oT\377\327\327\327\377\312\312\312\377\271\271\271" + "\377\245\245\245\377\224\224\224\377\211\211\211\377\207\207\207\377\235" + "\235\235\377\257\257\257\235\303\303\303s\331\331\331J\346\346\346)\361\361" + "\361\23\337\337\337\10\252\252\252\3\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\377`>\277\377z\0\377" + "\377\224\0\377\377\223\0\377\377\217\0\377\377\207\0\377\377~\0\377\377v" + "\0\377\377r\0\377\377p\0\377\377o\0\377\377o\0\377\3774\0\377w]W\377\\\\" + "\\\377VVV\377SSS\377QQQ\377QQQ\377SSS\377VVV\377\\\\\\\377fff\377rrr\377" + "\177\177\177\377\213\213\213\377\224\224\224\377\233\233\233\377iii\377j" + "jj\377kkk\377kkk\377kkk\377kkk\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377]]]\377PPP\377PPP\377PPP\377PPP\377\206\206\206\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377PPP\377PPP\377PPP\377PPP" + "\377PPP\377PPP\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\360\223\200\377\377I\0\377\377o" + "\0\377\377o\0\377\377o\0\377\3779\0\377\343\273\263\377\323\323\323\377\305" + "\305\305\377\262\262\262\377\237\237\237\377\217\217\217\377\210\210\210" + "\377\212\212\212\377\243\243\243\377\267\267\267\214\315\315\315a\340\340" + "\340;\356\356\356\37\354\354\354\16\314\314\314\5\177\177\177\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\377" + "\307\273@\377F\0\377\377\224\0\377\377\223\0\377\377\221\0\377\377\213\0" + "\377\377\202\0\377\377y\0\377\377t\0\377\377q\0\377\377o\0\377\377o\0\377" + "\377V\0\377\306C'\377^^^\377XXX\377SSS\377RRR\377QQQ\377RRR\377UUU\377ZZ" + "Z\377aaa\377mmm\377yyy\377\206\206\206\377\221\221\221\377\230\230\230\377" + "\235\235\235\377\237\237\237\377\240\240\240\377\240\240\240\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\223\223\223\377PPP\377PPP\377PPP\377PPP\377PPP\377\256\256" + "\256\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\374C\35\377\377g\0\377\377o\0\377\377o\0" + "\377\377b\0\377\371N*\377\331\331\331\377\317\317\317\377\276\276\276\377" + "\254\254\254\377\231\231\231\377\213\213\213\377\210\210\210\377\215\215" + "\215\377\252\252\252\377\300\300\300{\322\322\322Q\343\343\343.\350\350\350" + "\27\342\342\342\11\252\252\252\3\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\377`>\277\377z\0\377\377" + "\224\0\377\377\222\0\377\377\216\0\377\377\207\0\377\377}\0\377\377v\0\377" + "\377r\0\377\377p\0\377\377o\0\377\377o\0\377\3779\0\377\177WO\377YYY\377" + "UUU\377RRR\377QQQ\377QQQ\377SSS\377VVV\377]]]\377ggg\377ttt\377\201\201\201" + "\377\214\214\214\377\226\226\226\377\233\233\233\377\236\236\236\377\240" + "\240\240\377\240\240\240\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\206" + "\206\206\377PPP\377PPP\377PPP\377PPP\377]]]\377\326\326\326\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\351" + "\301\271\377\3779\0\377\377o\0\377\377o\0\377\377o\0\377\377E\0\377\352\233" + "\212\377\326\326\326\377\311\311\311\377\267\267\267\377\245\245\245\377" + "\224\224\224\377\212\212\212\377\211\211\211\377\222\222\222\377\262\262" + "\262\377\311\311\311i\333\333\333A\351\351\351#\357\357\357\20\324\324\324" + "\6\177\177\177\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\377\324\3110\377@\0\377\377\224\0\377\377\224\0" + "\377\377\221\0\377\377\212\0\377\377\201\0\377\377x\0\377\377s\0\377\377" + "q\0\377\377p\0\377\377o\0\377\377^\0\377\330:\31\377\\\\\\\377VVV\377SSS" + "\377QQQ\377QQQ\377RRR\377UUU\377ZZZ\377bbb\377nnn\377zzz\377\210\210\210" + "\377\222\222\222\377\231\231\231\377\235\235\235\377\240\240\240\377\240" + "\240\240\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377kkk\377" + "PPP\377PPP\377PPP\377PPP\377\206\206\206\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\363" + "}d\377\377R\0\377\377o\0\377\377o\0\377\377k\0\377\375;\15\377\335\320\315" + "\377\322\322\322\377\303\303\303\377\261\261\261\377\236\236\236\377\217" + "\217\217\377\211\211\211\377\213\213\213\377\230\230\230\377\272\272\272" + "\377\320\320\320X\341\341\3414\353\353\353\32\347\347\347\13\277\277\277" + "\4\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\377y^\237\377m\0\377\377\224\0\377\377\223\0\377\377\216" + "\0\377\377\206\0\377\377|\0\377\377u\0\377\377q\0\377\377p\0\377\377o\0\377" + "\377o\0\377\377E\0\377\233K;\377XXX\377SSS\377QQQ\377QQQ\377QQQ\377SSS\377" + "WWW\377^^^\377hhh\377ttt\377\202\202\202\377\215\215\215\377\226\226\226" + "\377\234\234\234\377\237\237\237\377\240\240\240\377\240\240\240\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\223\223\223\377PPP\377PPP\377PPP\377" + "PPP\377PPP\377\256\256\256\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\374C\35\377\377g\0\377" + "\377o\0\377\377o\0\377\377V\0\377\363pT\377\330\330\330\377\316\316\316\377" + "\275\275\275\377\252\252\252\377\230\230\230\377\213\213\213\377\211\211" + "\211\377\220\220\220\377\236\236\236\377\303\303\303\377\330\330\330I\345" + "\345\345(\361\361\361\23\337\337\337\10\252\252\252\3\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\377\357\337" + "\20\3773\0\377\377\224\0\377\377\224\0\377\377\222\0\377\377\213\0\377\377" + "\202\0\377\377y\0\377\377s\0\377\377p\0\377\377o\0\377\377o\0\377\377k\0" + "\377\365/\6\377ZZZ\377UUU\377RRR\377QQQ\377QQQ\377RRR\377UUU\377ZZZ\377b" + "bb\377nnn\377{{{\377\210\210\210\377\222\222\222\377\231\231\231\377\236" + "\236\236\377\240\240\240\377\240\240\240\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\206\206\206\377PPP\377PPP\377PPP\377PPP\377" + "PPP\377\311\311\311\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\354\252\234\377\377A\0\377\377o\0\377\377o\0" + "\377\377o\0\377\3779\0\377\344\274\264\377\325\325\325\377\310\310\310\377" + "\266\266\266\377\243\243\243\377\223\223\223\377\212\212\212\377\213\213" + "\213\377\225\225\225\377\245\245\245\377\314\314\314\377\340\340\340:\356" + "\356\356\36\353\353\353\15\314\314\314\5\177\177\177\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\377\223}\200" + "\377a\0\377\377\224\0\377\377\224\0\377\377\220\0\377\377\210\0\377\377~" + "\0\377\377u\0\377\377q\0\377\377p\0\377\377o\0\377\377o\0\377\377V\0\377" + "\302>#\377VVV\377SSS\377QQQ\377QQQ\377QQQ\377SSS\377VVV\377]]]\377hhh\377" + "uuu\377\202\202\202\377\216\216\216\377\227\227\227\377\234\234\234\377\237" + "\237\237\377\240\240\240\377\240\240\240\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\206\206\206\377PPP\377PPP\377PPP\377PPP\377" + "kkk\377\326\326\326\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\365qV\377\377V\0\377\377o\0\377\377o\0\377\377" + "g\0\377\373C\34\377\333\333\333\377\321\321\321\377\302\302\302\377\257\257" + "\257\377\234\234\234\377\217\217\217\377\212\212\212\377\216\216\216\377" + "\234\234\234\377\255\255\255\377\324\324\324\377\343\343\343.\363\363\363" + "\26\342\342\342\11\252\252\252\3\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\377E\36\337\377\210\0\377" + "\377\224\0\377\377\223\0\377\377\216\0\377\377\205\0\377\377z\0\377\377s" + "\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\3779\0\377xQH\377UUU\377" + "RRR\377QQQ\377QQQ\377RRR\377UUU\377ZZZ\377bbb\377mmm\377{{{\377\210\210\210" + "\377\222\222\222\377\232\232\232\377\236\236\236\377\240\240\240\377\240" + "\240\240\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377kkk\377PPP\377PPP\377PPP\377PPP\377\223\223\223\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\3758\16\377\377k\0\377\377o\0\377\377o\0\377\377I\0\377\355" + "\220}\377\330\330\330\377\314\314\314\377\274\274\274\377\250\250\250\377" + "\227\227\227\377\214\214\214\377\213\213\213\377\223\223\223\377\242\242" + "\242\377\265\265\265\377\333\333\333\377\351\351\351#\357\357\357\20\324" + "\324\324\6\177\177\177\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\377\324\3110\377@\0\377\377\224\0\377\377" + "\224\0\377\377\222\0\377\377\214\0\377\377\201\0\377\377x\0\377\377r\0\377" + "\377p\0\377\377o\0\377\377o\0\377\377g\0\377\3532\14\377VVV\377SSS\377QQ" + "Q\377QQQ\377QQQ\377SSS\377VVV\377]]]\377fff\377ttt\377\201\201\201\377\215" + "\215\215\377\226\226\226\377\234\234\234\377\245\230\225\377\276|n\377\320" + "fP\377\342Q3\377\347I(\377\347I(\377\347I(\377\342Q3\377\320fP\377\276|n" + "\377\247\232\227\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\223\223\223\377]]]\377PPP\377PPP\377PPP\377PPP\377\256" + "\256\256\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\356\237\216\377\377E\0\377\377o\0\377\377o\0\377\377" + "o\0\377\3770\0\377\337\322\317\377\325\325\325\377\306\306\306\377\265\265" + "\265\377\242\242\242\377\223\223\223\377\213\213\213\377\214\214\214\377" + "\230\230\230\377\252\252\252\377\275\275\275\377\341\341\341\377\353\353" + "\353\32\347\347\347\13\277\277\277\4\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\377y^\237\377m\0\377" + "\377\224\0\377\377\224\0\377\377\220\0\377\377\210\0\377\377}\0\377\377u" + "\0\377\377q\0\377\377o\0\377\377o\0\377\377o\0\377\377R\0\377\266@'\377T" + "TT\377QQQ\377QQQ\377QQQ\377QQQ\377TTT\377XXX\377aaa\377lll\377zzz\377\207" + "\207\207\377\231\214\211\377\277p_\377\355A\36\377\3770\0\377\377A\0\377" + "\377N\0\377\377[\0\377\377_\0\377\377^\0\377\377^\0\377\377Z\0\377\377N\0" + "\377\377A\0\377\3770\0\377\355B\36\377\304ud\377\247\232\227\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\206\206\206\377PPP\377PPP\377PPP\377PPP\377PPP\377\311\311" + "\311\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\367fH\377\377Z\0\377\377o\0\377\377o\0\377\377Z\0\377\365" + "dF\377\332\332\332\377\320\320\320\377\301\301\301\377\256\256\256\377\234" + "\234\234\377\217\217\217\377\213\213\213\377\221\221\221\377\236\236\236" + "\377\261\261\261\377\304\304\304\377\347\347\347\377\361\361\361\23\337\337" + "\337\10\252\252\252\3\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\3778\16\357\377\215\0\377\377\224\0" + "\377\377\222\0\377\377\215\0\377\377\204\0\377\377z\0\377\377s\0\377\377" + "p\0\377\377o\0\377\377o\0\377\377o\0\377\3779\0\377vNF\377SSS\377QQQ\377" + "QQQ\377QQQ\377RRR\377UUU\377\\\\\\\377eee\377rrr\377\200\200\200\377\306" + "\\F\377\3707\10\377\377E\0\377\377b\0\377\377p\0\377\377p\0\377\377q\0\377" + "\377q\0\377\377q\0\377\377q\0\377\377p\0\377\377p\0\377\377o\0\377\377o\0" + "\377\377o\0\377\377b\0\377\377E\0\377\3717\11\377\320fP\377\240\240\240\377" + "\240\240\240\377\240\240\240\377\241\241\241\377\241\241\241\377\206\206" + "\206\377PPP\377PPP\377PPP\377PPP\377kkk\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\346\330\326\377\3770\0\377" + "\377o\0\377\377o\0\377\377o\0\377\377A\0\377\351\247\231\377\327\327\327" + "\377\313\313\313\377\272\272\272\377\247\247\247\377\226\226\226\377\214" + "\214\214\377\213\213\213\377\225\225\225\377\245\245\245\377\271\271\271" + "\377\312\312\312\377\354\354\354\377\353\353\353\15\314\314\314\5\177\177" + "\177\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\377\324\3110\377?\0\377\377\224\0\377\377\224\0\377\377\221" + "\0\377\377\212\0\377\377\200\0\377\377w\0\377\377r\0\377\377p\0\377\377o" + "\0\377\377o\0\377\377k\0\377\365/\6\377TTT\377RRR\377QQQ\377QQQ\377QQQ\377" + "SSS\377WWW\377___\377jjj\377\231dY\377\3607\21\377\377N\0\377\377k\0\377" + "\377p\0\377\377p\0\377\377q\0\377\377s\0\377\377t\0\377\377u\0\377\377u\0" + "\377\377t\0\377\377r\0\377\377q\0\377\377p\0\377\377o\0\377\377o\0\377\377" + "o\0\377\377o\0\377\377k\0\377\377N\0\377\363;\24\377\262\212\202\377\240" + "\240\240\377\240\240\240\377\240\240\240\377kkk\377PPP\377PPP\377PPP\377" + "PPP\377\206\206\206\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\360\223\200\377\377I\0\377\377o\0\377\377o\0" + "\377\377g\0\377\373C\34\377\335\335\335\377\324\324\324\377\306\306\306\377" + "\264\264\264\377\241\241\241\377\222\222\222\377\213\213\213\377\217\217" + "\217\377\234\234\234\377\255\255\255\377\300\300\300\377\317\317\317\377" + "\360\360\360\377\342\342\342\11\252\252\252\3\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\377\207n\217" + "\377f\0\377\377\224\0\377\377\223\0\377\377\217\0\377\377\207\0\377\377|" + "\0\377\377u\0\377\377q\0\377\377p\0\377\377o\0\377\377o\0\377\377V\0\377" + "\277<\40\377SSS\377QQQ\377QQQ\377QQQ\377RRR\377UUU\377ZZZ\377bbb\377\267" + "M7\377\377=\0\377\377g\0\377\377o\0\377\377o\0\377\377p\0\377\377q\0\377" + "\377s\0\377\377v\0\377\377z\0\377\377|\0\377\377}\0\377\377z\0\377\377w\0" + "\377\377t\0\377\377r\0\377\377p\0\377\377p\0\377\377o\0\377\377o\0\377\377" + "o\0\377\377o\0\377\377g\0\377\3779\0\377\303sc\377\236\236\236\377\237\237" + "\237\377\\\\\\\377PPP\377PPP\377PPP\377PPP\377\241\241\241\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\372" + "O+\377\377b\0\377\377o\0\377\377o\0\377\377R\0\377\361{b\377\332\332\332" + "\377\317\317\317\377\277\277\277\377\255\255\255\377\233\233\233\377\216" + "\216\216\377\213\213\213\377\223\223\223\377\242\242\242\377\265\265\265" + "\377\306\306\306\377\324\324\324\377\363\363\363\377\324\324\324\6\177\177" + "\177\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\377S.\317\377\200\0\377\377\224\0\377\377\223\0\377" + "\377\215\0\377\377\204\0\377\377z\0\377\377s\0\377\377p\0\377\377o\0\377" + "\377o\0\377\377o\0\377\377E\0\377\225F5\377RRR\377QQQ\377QQQ\377QQQ\377S" + "SS\377VVV\377]]]\377\306B'\377\377N\0\377\377o\0\377\377o\0\377\377o\0\377" + "\377p\0\377\377g\0\377\377`\0\377\377c\0\377\377x\0\377\377\203\0\377\377" + "\207\0\377\377\207\0\377\377\204\0\377\377\177\0\377\377z\0\377\377u\0\377" + "\377r\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0" + "\377\377o\0\377\377E\0\377\323]D\377\217\217\217\377NNN\377OOO\377OOO\377" + "PPP\377PPP\377\273\273\273\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\347\315\307\377\3774\0\377\377o\0\377\377o\0\377\377" + "o\0\377\3774\0\377\342\310\302\377\327\327\327\377\312\312\312\377\271\271" + "\271\377\246\246\246\377\225\225\225\377\214\214\214\377\215\215\215\377" + "\230\230\230\377\251\251\251\377\274\274\274\377\315\315\315\377\327\327" + "\327\377\365\365\365\377\277\277\277\4\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\377\337\327\40\377" + "9\0\377\377\224\0\377\377\224\0\377\377\221\0\377\377\213\0\377\377\201\0" + "\377\377x\0\377\377r\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377" + "4\0\377iNI\377QQQ\377QQQ\377QQQ\377QQQ\377SSS\377XXX\377\260F0\377\377N\0" + "\377\377o\0\377\377o\0\377\377o\0\377\377V\0\377\3775\0\377\363;\24\377\347" + "I(\377\347I(\377\3713\12\377\377>\0\377\377j\0\377\377\217\0\377\377\215" + "\0\377\377\210\0\377\377\201\0\377\377{\0\377\377v\0\377\377r\0\377\377p" + "\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377" + "\377N\0\377\305[E\377MMM\377MMM\377NNN\377OOO\377\\\\\\\377\310\310\310\377" + "\343\343\343\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\362\210" + "r\377\377N\0\377\377o\0\377\377o\0\377\377b\0\377\371N*\377\334\334\334\377" + "\323\323\323\377\305\305\305\377\262\262\262\377\237\237\237\377\222\222" + "\222\377\213\213\213\377\221\221\221\377\236\236\236\377\260\260\260\377" + "\303\303\303\377\321\321\321\377\333\333\333\377\367\367\367\377\252\252" + "\252\3\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\377\257\234`\377S\0\377\377\224\0\377\377\223\0\377" + "\377\220\0\377\377\210\0\377\377~\0\377\377v\0\377\377r\0\377\377p\0\377" + "\377o\0\377\377o\0\377\377g\0\377\3521\13\377RRR\377QQQ\377QQQ\377QQQ\377" + "RRR\377UUU\377dWT\377\3664\6\377\377k\0\377\377o\0\377\377k\0\377\377=\0" + "\377\331V:\377\252\220\212\377\237\237\237\377\237\237\237\377\236\236\236" + "\377\234\234\234\377\254\204|\377\327T8\377\377?\0\377\377\177\0\377\377" + "\217\0\377\377\211\0\377\377\202\0\377\377{\0\377\377v\0\377\377r\0\377\377" + "p\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377" + "\377E\0\377\216>.\377KKK\377LLL\377MMM\377iii\377\323\323\323\377\342\342" + "\342\377\343\343\343\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\374C\35\377\377" + "g\0\377\377o\0\377\377o\0\377\377E\0\377\354\234\214\377\331\331\331\377" + "\317\317\317\377\276\276\276\377\254\254\254\377\232\232\232\377\216\216" + "\216\377\214\214\214\377\225\225\225\377\245\245\245\377\267\267\267\377" + "\311\311\311\377\326\326\326\377\336\336\336\377\370\370\370\377\177\177" + "\177\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\377\207n\217\377f\0\377\377\224\0\377\377\223\0\377" + "\377\217\0\377\377\206\0\377\377|\0\377\377u\0\377\377q\0\377\377o\0\377" + "\377o\0\377\377o\0\377\377Z\0\377\3119\32\377QQQ\377QQQ\377QQQ\377QQQ\377" + "SSS\377VVV\377\206QF\377\377=\0\377\377o\0\377\377^\0\377\3706\10\377\262" + "}r\377\235\235\235\377\236\236\236\377\236\236\236\377\235\235\235\377\232" + "\232\232\377\227\227\227\377\222\222\222\377\215\215\215\377\236wn\377\351" + "B\27\377\377l\0\377\377\217\0\377\377\212\0\377\377\203\0\377\377|\0\377" + "\377v\0\377\377s\0\377\377q\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0" + "\377\377o\0\377\377k\0\377\3659\3\377iA9\377III\377KKK\377\201\201\201\377" + "\337\337\337\377\341\341\341\377\342\342\342\377\343\343\343\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\351\301" + "\271\377\3779\0\377\377o\0\377\377o\0\377\377o\0\377\3770\0\377\340\323\320" + "\377\326\326\326\377\311\311\311\377\267\267\267\377\245\245\245\377\224" + "\224\224\377\214\214\214\377\217\217\217\377\233\233\233\377\254\254\254" + "\377\276\276\276\377\317\317\317\377\331\331\331\377\340\340\340\377\371" + "\371\371\377\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\377S.\317\377\200\0\377\377\224\0\377" + "\377\223\0\377\377\216\0\377\377\204\0\377\377z\0\377\377t\0\377\377p\0\377" + "\377p\0\377\377o\0\377\377o\0\377\377N\0\377\251?)\377QQQ\377QQQ\377QQQ\377" + "QQQ\377SSS\377XXX\377j]Z\377\3674\7\377\377E\0\377\341C\"\377\231\214\211" + "\377\232\232\232\377\235\235\235\377\236\236\236\377\234\234\234\377\231" + "\231\231\377\224\224\224\377\217\217\217\377\210\210\210\377\201\201\201" + "\377{{{\377~pn\377\311F*\377\377l\0\377\377\220\0\377\377\212\0\377\377\204" + "\0\377\377|\0\377\377w\0\377\377s\0\377\377q\0\377\377p\0\377\377o\0\377" + "\377o\0\377\377o\0\377\377o\0\377\377b\0\377\3330\14\377DDD\377GGG\377{{" + "{\377\330\330\330\377\336\336\336\377\340\340\340\377\342\342\342\377\343" + "\343\343\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\363" + "}d\377\377R\0\377\377o\0\377\377o\0\377\377V\0\377\363pT\377\333\333\333" + "\377\322\322\322\377\303\303\303\377\260\260\260\377\236\236\236\377\221" + "\221\221\377\214\214\214\377\223\223\223\377\241\241\241\377\263\263\263" + "\377\305\305\305\377\323\323\323\377\334\334\334\377\340\340\340\377\372" + "\372\372\377\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\377,\0\377\377\224\0\377\377\224\0\377" + "\377\222\0\377\377\215\0\377\377\202\0\377\377y\0\377\377s\0\377\377p\0\377" + "\377o\0\377\377o\0\377\377o\0\377\377=\0\377}H=\377QQQ\377PPP\377QQQ\377" + "RRR\377UUU\377ZZZ\377ccc\377\213c[\377\257_O\377\214\214\214\377\225\225" + "\225\377\233\233\233\377\235\235\235\377\233\233\233\377\230\230\230\377" + "\222\222\222\377\214\214\214\377\204\204\204\377|||\377uuu\377ooo\377iii" + "\377fff\377\330:\31\377\377y\0\377\377\220\0\377\377\213\0\377\377\204\0" + "\377\377}\0\377\377v\0\377\377s\0\377\377p\0\377\377o\0\377\377o\0\377\377" + "o\0\377\377o\0\377\377o\0\377\377N\0\377\2364\36\377BBB\377\214\214\214\377" + "\317\317\317\377\327\327\327\377\335\335\335\377\340\340\340\377\342\342" + "\342\377\343\343\343\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\3758\16" + "\377\377k\0\377\377o\0\377\377o\0\377\377A\0\377\351\247\231\377\330\330" + "\330\377\315\315\315\377\275\275\275\377\252\252\252\377\231\231\231\377" + "\216\216\216\377\216\216\216\377\227\227\227\377\247\247\247\377\272\272" + "\272\377\313\313\313\377\327\327\327\377\337\337\337\377\341\341\341\377" + "\372\372\372\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\377\324\3110\377?\0\377\377\224\0\377\377" + "\224\0\377\377\222\0\377\377\213\0\377\377\201\0\377\377x\0\377\377r\0\377" + "\377p\0\377\377o\0\377\377o\0\377\377o\0\377\3774\0\377gLG\377QQQ\377PPP" + "\377QQQ\377RRR\377VVV\377\\\\\\\377fff\377ttt\377\202\202\202\377\217\217" + "\217\377\227\227\227\377\233\233\233\377\233\233\233\377\230\230\230\377" + "\222\222\222\377\212\212\212\377\201\201\201\377yyy\377rrr\377kkk\377ggg" + "\377ccc\377aaa\377h[X\377\3548\13\377\377\206\0\377\377\221\0\377\377\213" + "\0\377\377\204\0\377\377|\0\377\377u\0\377\377r\0\377\377p\0\377\377o\0\377" + "\377o\0\377\377o\0\377\377o\0\377\377o\0\377\3774\0\377T:4\377\213\213\213" + "\377\303\303\303\377\317\317\317\377\327\327\327\377\335\335\335\377\340" + "\340\340\377\342\342\342\377\343\343\343\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\354\252\234\377\377" + "A\0\377\377o\0\377\377o\0\377\377g\0\377\373C\34\377\335\335\335\377\325" + "\325\325\377\307\307\307\377\266\266\266\377\244\244\244\377\224\224\224" + "\377\215\215\215\377\220\220\220\377\234\234\234\377\256\256\256\377\301" + "\301\301\377\320\320\320\377\332\332\332\377\340\340\340\377\342\342\342" + "\377\372\372\372\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\377\257\234`\377S\0\377\377\224\0\377" + "\377\224\0\377\377\221\0\377\377\212\0\377\377\177\0\377\377w\0\377\377r" + "\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377,\0\377QQQ\377QQQ\377" + "QQQ\377QQQ\377SSS\377WWW\377___\377jjj\377xxx\377\206\206\206\377\222\222" + "\222\377\230\230\230\377\233\233\233\377\231\231\231\377\223\223\223\377" + "\213\213\213\377\201\201\201\377xxx\377ppp\377kkk\377ggg\377ddd\377ccc\377" + "bbb\377aaa\377\207RG\377\377F\0\377\377\223\0\377\377\220\0\377\377\212\0" + "\377\377\202\0\377\377{\0\377\377u\0\377\377q\0\377\377p\0\377\377o\0\377" + "\377o\0\377\377o\0\377\377o\0\377\377V\0\377\2630\24\377\211\211\211\377" + "\252\252\252\377\266\266\266\377\301\301\301\377\311\311\311\377\317\317" + "\317\377\323\323\323\377\324\324\324\377\325\325\325\377\326\326\326\377" + "\326\326\326\377\326\326\326\377\326\326\326\377\326\326\326\377\326\326" + "\326\377\326\326\326\377\326\326\326\377\326\326\326\377\326\326\326\377" + "\326\326\326\377\326\326\326\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\365qV\377\377V\0\377\377" + "o\0\377\377o\0\377\377R\0\377\361{b\377\333\333\333\377\321\321\321\377\302" + "\302\302\377\257\257\257\377\235\235\235\377\221\221\221\377\215\215\215" + "\377\224\224\224\377\244\244\244\377\266\266\266\377\307\307\307\377\325" + "\325\325\377\335\335\335\377\341\341\341\377\343\343\343\377\373\373\373" + "\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\377\223}\200\377`\0\377\377\224\0\377\377\223\0\377" + "\377\220\0\377\377\210\0\377\377~\0\377\377u\0\377\377q\0\377\377p\0\377" + "\377o\0\377\377o\0\377\377^\0\377\3246\25\377QQQ\377PPP\377QQQ\377QQQ\377" + "TTT\377XXX\377aaa\377mmm\377|||\377\212\212\212\377\224\224\224\377\231\231" + "\231\377\232\232\232\377\226\226\226\377\217\217\217\377\205\205\205\377" + "zzz\377qqq\377kkk\377iii\377iii\377iii\377kkk\377kkk\377kkk\377iii\377\305" + "B&\377\377m\0\377\377\223\0\377\377\220\0\377\377\211\0\377\377\201\0\377" + "\377y\0\377\377t\0\377\377q\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0" + "\377\377o\0\377\3774\0\377V<6\377CCC\377III\377PPP\377TTT\377XXX\377ZZZ\377" + "\\\\\\\377]]]\377]]]\377]]]\377]]]\377]]]\377]]]\377]]]\377]]]\377]]]\377" + "]]]\377]]]\377]]]\377\274\274\274\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\346\330\326\377\3770\0\377\377o\0\377" + "\377o\0\377\377o\0\377\3774\0\377\343\311\303\377\327\327\327\377\314\314" + "\314\377\274\274\274\377\251\251\251\377\230\230\230\377\216\216\216\377" + "\217\217\217\377\231\231\231\377\252\252\252\377\275\275\275\377\315\315" + "\315\377\330\330\330\377\337\337\337\377\342\342\342\377\343\343\343\377" + "\373\373\373\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\377mN\257\377s\0\377\377\224\0\377\377\223" + "\0\377\377\217\0\377\377\206\0\377\377|\0\377\377u\0\377\377q\0\377\377p" + "\0\377\377o\0\377\377o\0\377\377^\0\377\3235\24\377QQQ\377PPP\377QQQ\377" + "RRR\377UUU\377ZZZ\377ddd\377qqq\377\200\200\200\377\214\214\214\377\226\226" + "\226\377\232\232\232\377\231\231\231\377\224\224\224\377\213\213\213\377" + "\200\200\200\377vvv\377ooo\377mmm\377nnn\377ppp\377ttt\377www\377yyy\377" + "xxx\377vvv\377\204id\377\3779\0\377\377\224\0\377\377\223\0\377\377\217\0" + "\377\377\210\0\377\377\177\0\377\377x\0\377\377s\0\377\377p\0\377\377o\0" + "\377\377o\0\377\377o\0\377\377o\0\377\377R\0\377\245.\26\377555\377:::\377" + "@@@\377EEE\377III\377MMM\377NNN\377OOO\377PPP\377PPP\377PPP\377PPP\377PP" + "P\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377\311\311\311\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\356\237\216" + "\377\377E\0\377\377o\0\377\377o\0\377\377b\0\377\371N*\377\335\335\335\377" + "\324\324\324\377\306\306\306\377\265\265\265\377\242\242\242\377\224\224" + "\224\377\215\215\215\377\222\222\222\377\237\237\237\377\261\261\261\377" + "\304\304\304\377\322\322\322\377\333\333\333\377\340\340\340\377\342\342" + "\342\377\343\343\343\377\373\373\373\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\377`>\277\377z\0" + "\377\377\224\0\377\377\223\0\377\377\216\0\377\377\204\0\377\377z\0\377\377" + "t\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377N\0\377\250>(\377" + "QQQ\377PPP\377QQQ\377RRR\377UUU\377\\\\\\\377fff\377ttt\377\203\203\203\377" + "\217\217\217\377\230\230\230\377\233\233\233\377\231\231\231\377\223\223" + "\223\377\212\212\212\377\200\200\200\377www\377sss\377ttt\377www\377|||\377" + "\201\201\201\377\205\205\205\377\206\206\206\377\206\206\206\377\204\204" + "\204\377\200\200\200\377\315I.\377\377m\0\377\377\224\0\377\377\222\0\377" + "\377\216\0\377\377\206\0\377\377}\0\377\377v\0\377\377r\0\377\377p\0\377" + "\377o\0\377\377o\0\377\377o\0\377\377k\0\377\362,\3\377111\377555\377;;;" + "\377AAA\377FFF\377JJJ\377MMM\377OOO\377OOO\377PPP\377PPP\377PPP\377PPP\377" + "PPP\377PPP\377PPP\377PPP\377PPP\377kkk\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\367fH\377\377Z\0" + "\377\377o\0\377\377o\0\377\377E\0\377\354\234\214\377\332\332\332\377\320" + "\320\320\377\300\300\300\377\256\256\256\377\234\234\234\377\220\220\220" + "\377\216\216\216\377\226\226\226\377\245\245\245\377\270\270\270\377\311" + "\311\311\377\327\327\327\377\336\336\336\377\341\341\341\377\343\343\343" + "\377\344\344\344\377\373\373\373\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\3778\16\357\377\215" + "\0\377\377\224\0\377\377\222\0\377\377\215\0\377\377\203\0\377\377z\0\377" + "\377s\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377N\0\377\250>(" + "\377PPP\377PPP\377QQQ\377SSS\377VVV\377]]]\377iii\377www\377\205\205\205" + "\377\221\221\221\377\231\231\231\377\233\233\233\377\231\231\231\377\224" + "\224\224\377\214\214\214\377\204\204\204\377~~~\377|||\377~~~\377\203\203" + "\203\377\210\210\210\377\215\215\215\377\220\220\220\377\222\222\222\377" + "\222\222\222\377\220\220\220\377\215\215\215\377\226|v\377\3779\0\377\377" + "\224\0\377\377\224\0\377\377\222\0\377\377\214\0\377\377\203\0\377\377z\0" + "\377\377t\0\377\377p\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377" + "A\0\377o-\37\377111\377777\377===\377CCC\377HHH\377KKK\377NNN\377OOO\377" + "PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377\223\223\223" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\347\315\307\377\3774\0\377\377o\0\377\377o\0\377\377o\0\377\3770\0\377" + "\341\324\321\377\327\327\327\377\313\313\313\377\272\272\272\377\247\247" + "\247\377\227\227\227\377\216\216\216\377\220\220\220\377\234\234\234\377" + "\255\255\255\377\277\277\277\377\317\317\317\377\331\331\331\377\340\340" + "\340\377\342\342\342\377\343\343\343\377\344\344\344\377\373\373\373\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\377,\0\377\377\224\0\377\377\224\0\377\377\222\0\377\377" + "\214\0\377\377\202\0\377\377y\0\377\377s\0\377\377p\0\377\377o\0\377\377" + "o\0\377\377o\0\377\377N\0\377\250>(\377PPP\377QQQ\377QQQ\377SSS\377XXX\377" + "___\377kkk\377zzz\377\210\210\210\377\223\223\223\377\232\232\232\377\235" + "\235\235\377\233\233\233\377\227\227\227\377\221\221\221\377\213\213\213" + "\377\206\206\206\377\206\206\206\377\211\211\211\377\215\215\215\377\222" + "\222\222\377\226\226\226\377\230\230\230\377\231\231\231\377\231\231\231" + "\377\231\231\231\377\226\226\226\377\222\222\222\377\342D#\377\377z\0\377" + "\377\224\0\377\377\223\0\377\377\220\0\377\377\210\0\377\377~\0\377\377v" + "\0\377\377r\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377V\0\377" + "\257,\20\377...\377333\377888\377>>>\377DDD\377III\377MMM\377NNN\377OOO\377" + "PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377\274\274\274\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\360\223\200\377\377I\0\377\377o\0\377\377o\0\377\377V\0\377\364pU\377\334" + "\334\334\377\323\323\323\377\306\306\306\377\263\263\263\377\241\241\241" + "\377\223\223\223\377\216\216\216\377\224\224\224\377\241\241\241\377\264" + "\264\264\377\306\306\306\377\324\324\324\377\334\334\334\377\340\340\340" + "\377\343\343\343\377\344\344\344\377\344\344\344\377\373\373\373\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\377,\0\377\377\224\0\377\377\224\0\377\377\222\0\377\377\213" + "\0\377\377\201\0\377\377x\0\377\377r\0\377\377p\0\377\377o\0\377\377o\0\377" + "\377o\0\377\377=\0\377}H=\377PPP\377QQQ\377QQQ\377TTT\377XXX\377aaa\377n" + "nn\377|||\377\212\212\212\377\225\225\225\377\233\233\233\377\235\235\235" + "\377\235\235\235\377\232\232\232\377\226\226\226\377\222\222\222\377\220" + "\220\220\377\221\221\221\377\222\222\222\377\226\226\226\377\231\231\231" + "\377\234\234\234\377\235\235\235\377\236\236\236\377\236\236\236\377\235" + "\235\235\377\233\233\233\377\231\231\231\377\274m\\\377\377S\0\377\377\224" + "\0\377\377\224\0\377\377\222\0\377\377\214\0\377\377\203\0\377\377y\0\377" + "\377s\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377k\0\377\364.\5" + "\377QQQ\377WWW\377```\377kkk\377www\377\202\202\202\377\212\212\212\377\216" + "\216\216\377\221\221\221\377\222\222\222\377\223\223\223\377\206\206\206" + "\377PPP\377PPP\377PPP\377PPP\377]]]\377\311\311\311\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\372O+\377\377b\0\377" + "\377o\0\377\377o\0\377\377A\0\377\352\250\232\377\331\331\331\377\317\317" + "\317\377\277\277\277\377\255\255\255\377\234\234\234\377\220\220\220\377" + "\217\217\217\377\230\230\230\377\250\250\250\377\273\273\273\377\313\313" + "\313\377\327\327\327\377\337\337\337\377\342\342\342\377\343\343\343\377" + "\344\344\344\377\344\344\344\377\373\373\373\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\377,\0\377" + "\377\224\0\377\377\224\0\377\377\222\0\377\377\213\0\377\377\200\0\377\377" + "w\0\377\377r\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377=\0\377" + "}H=\377PPP\377QQQ\377QQQ\377TTT\377ZZZ\377ccc\377ppp\377\177\177\177\377" + "\215\215\215\377\226\226\226\377\234\234\234\377\236\236\236\377\236\236" + "\236\377\235\235\235\377\233\233\233\377\231\231\231\377\230\230\230\377" + "\230\230\230\377\231\231\231\377\234\234\234\377\235\235\235\377\236\236" + "\236\377\240\240\240\377\240\240\240\377\240\240\240\377\240\240\240\377" + "\236\236\236\377\235\235\235\377\237\222\217\377\3772\0\377\377\224\0\377" + "\377\224\0\377\377\223\0\377\377\217\0\377\377\206\0\377\377|\0\377\377u" + "\0\377\377q\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\3779\0\377" + "uME\377[[[\377ccc\377nnn\377|||\377\210\210\210\377\222\222\222\377\232\232" + "\232\377\236\236\236\377\240\240\240\377\240\240\240\377\206\206\206\377" + "PPP\377PPP\377PPP\377PPP\377kkk\377\326\326\326\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\347\315\307\377\3774\0\377\377o\0\377\377" + "o\0\377\377g\0\377\373C\34\377\336\336\336\377\327\327\327\377\312\312\312" + "\377\270\270\270\377\245\245\245\377\226\226\226\377\216\216\216\377\221" + "\221\221\377\235\235\235\377\257\257\257\377\301\301\301\377\320\320\320" + "\377\332\332\332\377\340\340\340\377\342\342\342\377\343\343\343\377\344" + "\344\344\377\344\344\344\377\373\373\373\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\377,\0\377\377" + "\224\0\377\377\224\0\377\377\221\0\377\377\212\0\377\377\200\0\377\377w\0" + "\377\377r\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377=\0\377|G" + "<\377PPP\377QQQ\377RRR\377UUU\377[[[\377eee\377rrr\377\201\201\201\377\217" + "\217\217\377\230\230\230\377\235\235\235\377\237\237\237\377\240\240\240" + "\377\237\237\237\377\236\236\236\377\235\235\235\377\235\235\235\377\235" + "\235\235\377\236\236\236\377\236\236\236\377\240\240\240\377\240\240\240" + "\377\240\240\240\377\240\240\240\377\240\240\240\377\240\240\240\377\240" + "\240\240\377\237\237\237\377\235\235\235\377\345G&\377\377y\0\377\377\224" + "\0\377\377\224\0\377\377\221\0\377\377\211\0\377\377\177\0\377\377w\0\377" + "\377r\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377I\0\377\237B/" + "\377WWW\377^^^\377hhh\377uuu\377\202\202\202\377\216\216\216\377\227\227" + "\227\377\235\235\235\377\237\237\237\377\240\240\240\377kkk\377PPP\377PP" + "P\377PPP\377PPP\377\206\206\206\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\363}d\377\377R\0\377\377o\0\377\377o\0\377" + "\377R\0\377\361{b\377\334\334\334\377\322\322\322\377\304\304\304\377\262" + "\262\262\377\240\240\240\377\223\223\223\377\216\216\216\377\225\225\225" + "\377\244\244\244\377\266\266\266\377\307\307\307\377\325\325\325\377\335" + "\335\335\377\341\341\341\377\343\343\343\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\373\373\373\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\377,\0\377\377\224\0" + "\377\377\224\0\377\377\221\0\377\377\212\0\377\377\177\0\377\377w\0\377\377" + "r\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377=\0\377|G<\377PPP" + "\377QQQ\377RRR\377UUU\377\\\\\\\377fff\377ttt\377\203\203\203\377\220\220" + "\220\377\231\231\231\377\235\235\235\377\240\240\240\377\240\240\240\377" + "\240\240\240\377\240\240\240\377\237\237\237\377\237\237\237\377\237\237" + "\237\377\240\240\240\377\240\240\240\377\240\240\240\377\240\240\240\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\240\240" + "\240\377\240\240\240\377\237\237\237\377\316dN\377\377_\0\377\377\224\0\377" + "\377\224\0\377\377\222\0\377\377\214\0\377\377\202\0\377\377x\0\377\377s" + "\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377V\0\377\276:\37\377" + "UUU\377ZZZ\377bbb\377nnn\377|||\377\211\211\211\377\224\224\224\377\233\233" + "\233\377\236\236\236\377\240\240\240\377kkk\377PPP\377PPP\377PPP\377PPP\377" + "\241\241\241\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\374C\35\377\377g\0\377\377o\0\377\377o\0\377\3774\0\377" + "\344\311\304\377\331\331\331\377\316\316\316\377\276\276\276\377\253\253" + "\253\377\233\233\233\377\220\220\220\377\220\220\220\377\232\232\232\377" + "\253\253\253\377\275\275\275\377\315\315\315\377\330\330\330\377\337\337" + "\337\377\342\342\342\377\343\343\343\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\373\373\373\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\377,\0\377\377\224\0\377" + "\377\224\0\377\377\221\0\377\377\212\0\377\377\177\0\377\377v\0\377\377r" + "\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377=\0\377|G<\377PPP\377" + "QQQ\377SSS\377VVV\377]]]\377hhh\377vvv\377\205\205\205\377\221\221\221\377" + "\231\231\231\377\236\236\236\377\240\240\240\377\240\240\240\377\240\240" + "\240\377\240\240\240\377\240\240\240\377\240\240\240\377\240\240\240\377" + "\240\240\240\377\240\240\240\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\240\240\240\377\240\240\240\377\266\201v\377\377E\0\377\377\224\0\377\377" + "\224\0\377\377\223\0\377\377\216\0\377\377\205\0\377\377{\0\377\377t\0\377" + "\377q\0\377\377o\0\377\377o\0\377\377o\0\377\377^\0\377\3235\24\377SSS\377" + "WWW\377^^^\377iii\377vvv\377\204\204\204\377\220\220\220\377\230\230\230" + "\377\235\235\235\377\222\222\222\377]]]\377PPP\377PPP\377PPP\377PPP\377\274" + "\274\274\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\351" + "\301\271\377\3779\0\377\377o\0\377\377o\0\377\377b\0\377\371N*\377\336\336" + "\336\377\326\326\326\377\310\310\310\377\267\267\267\377\245\245\245\377" + "\225\225\225\377\217\217\217\377\223\223\223\377\237\237\237\377\261\261" + "\261\377\304\304\304\377\322\322\322\377\333\333\333\377\340\340\340\377" + "\342\342\342\377\343\343\343\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\373\373\373\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\377,\0\377\377\224\0\377\377\224" + "\0\377\377\221\0\377\377\211\0\377\377\177\0\377\377v\0\377\377r\0\377\377" + "p\0\377\377o\0\377\377o\0\377\377o\0\377\377=\0\377|G<\377PPP\377QQQ\377" + "SSS\377VVV\377^^^\377iii\377www\377\206\206\206\377\222\222\222\377\232\232" + "\232\377\236\236\236\377\240\240\240\377\240\240\240\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\240\240\240\377\240\240\240\377\377,\0\377\377\223\0\377\377\224" + "\0\377\377\223\0\377\377\220\0\377\377\207\0\377\377}\0\377\377u\0\377\377" + "q\0\377\377p\0\377\377o\0\377\377o\0\377\377k\0\377\364.\5\377RRR\377UUU" + "\377[[[\377ddd\377ppp\377\177\177\177\377\214\214\214\377\226\226\226\377" + "\234\234\234\377\221\221\221\377PPP\377PPP\377PPP\377PPP\377PPP\377\311\311" + "\311\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\363}d\377" + "\377R\0\377\377o\0\377\377o\0\377\377E\0\377\354\234\214\377\333\333\333" + "\377\321\321\321\377\303\303\303\377\260\260\260\377\237\237\237\377\223" + "\223\223\377\217\217\217\377\226\226\226\377\246\246\246\377\270\270\270" + "\377\311\311\311\377\327\327\327\377\336\336\336\377\341\341\341\377\343" + "\343\343\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\373\373\373\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\377,\0\377\377\224\0\377\377\224\0\377" + "\377\221\0\377\377\211\0\377\377\177\0\377\377v\0\377\377q\0\377\377p\0\377" + "\377o\0\377\377o\0\377\377o\0\377\377=\0\377|G<\377PPP\377QQQ\377SSS\377" + "WWW\377___\377kkk\377yyy\377\207\207\207\377\223\223\223\377\233\233\233" + "\377\236\236\236\377\240\240\240\377\240\240\240\377\206\206\206\377\223" + "\223\223\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\240\240\240\377\240\240\240\377\355A\36\377\377\200\0\377\377\224\0" + "\377\377\224\0\377\377\221\0\377\377\212\0\377\377\200\0\377\377w\0\377\377" + "r\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377,\0\377QQQ\377SSS" + "\377XXX\377```\377lll\377zzz\377\210\210\210\377\223\223\223\377\232\232" + "\232\377\204\204\204\377PPP\377PPP\377PPP\377PPP\377]]]\377\326\326\326\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\3758\16\377\377" + "k\0\377\377o\0\377\377o\0\377\3770\0\377\324\307\304\377\231\231\231\377" + "\251\251\251\377\275\275\275\377\252\252\252\377\232\232\232\377\220\220" + "\220\377\221\221\221\377\234\234\234\377\255\255\255\377\277\277\277\377" + "\317\317\317\377\331\331\331\377\340\340\340\377\342\342\342\377\343\343" + "\343\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\373\373\373\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\377,\0\377\377\224\0\377\377\224\0\377\377" + "\221\0\377\377\211\0\377\377\177\0\377\377v\0\377\377r\0\377\377p\0\377\377" + "o\0\377\377o\0\377\377o\0\377\377=\0\377|G<\377QQQ\377QQQ\377SSS\377WWW\377" + "___\377kkk\377zzz\377\210\210\210\377\224\224\224\377\233\233\233\377\236" + "\236\236\377\240\240\240\377\206\206\206\377kkk\377kkk\377kkk\377\206\206" + "\206\377\223\223\223\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\240\240\240\377" + "\341P2\377\377r\0\377\377\224\0\377\377\224\0\377\377\222\0\377\377\214\0" + "\377\377\202\0\377\377x\0\377\377s\0\377\377p\0\377\377o\0\377\377o\0\377" + "\377o\0\377\3770\0\377\\OL\377SSS\377VVV\377]]]\377hhh\377uuu\377\204\204" + "\204\377\220\220\220\377\231\231\231\377\203\203\203\377OOO\377PPP\377PP" + "P\377PPP\377kkk\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\354\252\234\377\377A\0\377\377o\0\377\377o\0\377\377V\0\377\326R7\377ZZ" + "Z\377KKK\377QQQ\377\240\240\240\377\244\244\244\377\225\225\225\377\217\217" + "\217\377\224\224\224\377\242\242\242\377\264\264\264\377\306\306\306\377" + "\324\324\324\377\334\334\334\377\340\340\340\377\343\343\343\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\373\373\373\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\377,\0\377\377\224\0\377\377\224\0\377\377" + "\221\0\377\377\211\0\377\377\177\0\377\377w\0\377\377r\0\377\377p\0\377\377" + "o\0\377\377o\0\377\377o\0\377\377E\0\377\222B2\377QQQ\377QQQ\377SSS\377X" + "XX\377```\377mmm\377{{{\377\211\211\211\377\224\224\224\377\233\233\233\377" + "\236\236\236\377\222\222\222\377kkk\377kkk\377kkk\377kkk\377kkk\377kkk\377" + "\206\206\206\377\223\223\223\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\240\240\240\377\320fP\377\377_\0\377\377" + "\224\0\377\377\224\0\377\377\223\0\377\377\215\0\377\377\204\0\377\377y\0" + "\377\377s\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377=\0\377}H" + "=\377RRR\377UUU\377ZZZ\377ddd\377rrr\377\200\200\200\377\215\215\215\377" + "\227\227\227\377\202\202\202\377OOO\377PPP\377PPP\377PPP\377\206\206\206" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\365qV\377\377" + "V\0\377\377o\0\377\377o\0\377\377A\0\377\206D6\377MMM\377III\377DDD\377R" + "RR\377\224\224\224\377\222\222\222\377\220\220\220\377\230\230\230\377\250" + "\250\250\377\273\273\273\377\313\313\313\377\327\327\327\377\337\337\337" + "\377\342\342\342\377\343\343\343\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\373\373\373\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\377,\0\377\377\224\0\377\377\224\0\377\377\221\0\377\377\212\0\377\377" + "\177\0\377\377v\0\377\377r\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0" + "\377\377N\0\377\250>(\377QQQ\377QQQ\377SSS\377XXX\377aaa\377mmm\377|||\377" + "\212\212\212\377\225\225\225\377\233\233\233\377\221\221\221\377kkk\377k" + "kk\377kkk\377kkk\377kkk\377kkk\377kkk\377kkk\377kkk\377kkk\377\206\206\206" + "\377\223\223\223\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\312mZ\377\377" + "X\0\377\377\224\0\377\377\224\0\377\377\223\0\377\377\216\0\377\377\204\0" + "\377\377z\0\377\377s\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377" + "=\0\377}H=\377QQQ\377TTT\377XXX\377aaa\377nnn\377|||\377\212\212\212\377" + "\225\225\225\377ggg\377OOO\377PPP\377PPP\377PPP\377\206\206\206\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\326\326\326\377\274\274\274\377\3702\11\377\377k\0\377\377" + "o\0\377\377k\0\377\364.\5\377NNN\377LLL\377HHH\377BBB\377;;;\377ccc\377\220" + "\220\220\377\222\222\222\377\235\235\235\377\257\257\257\377\301\301\301" + "\377\320\320\320\377\332\332\332\377\340\340\340\377\342\342\342\377\343" + "\343\343\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\373\373\373\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\377,\0\377\377\224\0" + "\377\377\224\0\377\377\221\0\377\377\212\0\377\377\200\0\377\377w\0\377\377" + "r\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377N\0\377\250>(\377" + "QQQ\377QQQ\377SSS\377XXX\377aaa\377mmm\377|||\377\212\212\212\377\225\225" + "\225\377\234\234\234\377\221\221\221\377kkk\377kkk\377kkk\377kkk\377kkk\377" + "kkk\377kkk\377kkk\377kkk\377kkk\377kkk\377kkk\377kkk\377\206\206\206\377" + "\223\223\223\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\270\203x\377\377E\0\377\377\224\0\377\377\224\0\377\377\223\0\377" + "\377\216\0\377\377\205\0\377\377{\0\377\377s\0\377\377p\0\377\377o\0\377" + "\377o\0\377\377o\0\377\377=\0\377}H=\377QQQ\377SSS\377WWW\377___\377kkk\377" + "yyy\377\207\207\207\377\223\223\223\377ggg\377OOO\377PPP\377PPP\377PPP\377" + "\223\223\223\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\326\326\326\377\311\311" + "\311\377\256\256\256\377\206\206\206\377]]]\377\222B2\377\377E\0\377\377" + "o\0\377\377o\0\377\377R\0\377\262;#\377MMM\377JJJ\377FFF\377???\377999\377" + "```\377\220\220\220\377\225\225\225\377\244\244\244\377\266\266\266\377\307" + "\307\307\377\325\325\325\377\335\335\335\377\341\341\341\377\343\343\343" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\373\373\373\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\377,\0\377\377" + "\224\0\377\377\224\0\377\377\221\0\377\377\212\0\377\377\200\0\377\377w\0" + "\377\377r\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377N\0\377\250" + ">(\377QQQ\377QQQ\377SSS\377XXX\377aaa\377mmm\377|||\377\212\212\212\377\225" + "\225\225\377\234\234\234\377\237\237\237\377\240\240\240\377\206\206\206" + "\377kkk\377kkk\377kkk\377kkk\377kkk\377kkk\377kkk\377kkk\377kkk\377kkk\377" + "kkk\377kkk\377kkk\377kkk\377\206\206\206\377\206\206\206\377\223\223\223" + "\377\255xm\377\377E\0\377\377\224\0\377\377\224\0\377\377\223\0\377\377\217" + "\0\377\377\206\0\377\377{\0\377\377t\0\377\377q\0\377\377o\0\377\377o\0\377" + "\377o\0\377\377=\0\377|G<\377QQQ\377SSS\377VVV\377]]]\377hhh\377www\377\205" + "\205\205\377\221\221\221\377fff\377NNN\377OOO\377PPP\377PPP\377\223\223\223" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\326\326\326\377\311\311\311\377\274\274\274" + "\377\241\241\241\377\206\206\206\377kkk\377]]]\377PPP\377PPP\377PPP\377\310" + "7\31\377\377Z\0\377\377o\0\377\377o\0\377\3779\0\377oH?\377MMM\377III\377" + "CCC\377fff\377\202\202\202\377\222\222\222\377\221\221\221\377\232\232\232" + "\377\253\253\253\377\275\275\275\377\315\315\315\377\330\330\330\377\337" + "\337\337\377\342\342\342\377\343\343\343\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\373" + "\373\373\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\3778\16\357\377\215\0\377\377\224\0\377\377" + "\221\0\377\377\212\0\377\377\200\0\377\377w\0\377\377r\0\377\377p\0\377\377" + "o\0\377\377o\0\377\377o\0\377\377^\0\377\3235\24\377QQQ\377QQQ\377SSS\377" + "XXX\377aaa\377mmm\377|||\377\212\212\212\377\225\225\225\377\234\234\234" + "\377\237\237\237\377\240\240\240\377\241\241\241\377\241\241\241\377\206" + "\206\206\377kkk\377kkk\377kkk\377kkk\377kkk\377kkk\377kkk\377kkk\377kkk\377" + "kkk\377kkk\377kkk\377kkk\377kkk\377kkk\377\207_W\377\377?\0\377\377\223\0" + "\377\377\224\0\377\377\223\0\377\377\217\0\377\377\207\0\377\377|\0\377\377" + "t\0\377\377q\0\377\377o\0\377\377o\0\377\377o\0\377\377=\0\377|G<\377QQQ" + "\377RRR\377UUU\377\\\\\\\377fff\377ttt\377\203\203\203\377\220\220\220\377" + "fff\377NNN\377OOO\377PPP\377PPP\377\241\241\241\377\326\326\326\377\311\311" + "\311\377\274\274\274\377\241\241\241\377\223\223\223\377\206\206\206\377" + "kkk\377]]]\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377[NK\377\377" + "0\0\377\377o\0\377\377o\0\377\377b\0\377\3363\17\377NNN\377XXX\377\203\203" + "\203\377\244\244\244\377\250\250\250\377\230\230\230\377\221\221\221\377" + "\224\224\224\377\240\240\240\377\261\261\261\377\304\304\304\377\322\322" + "\322\377\333\333\333\377\340\340\340\377\342\342\342\377\343\343\343\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\373\373\373\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\377`>\277\377z\0" + "\377\377\224\0\377\377\221\0\377\377\213\0\377\377\201\0\377\377w\0\377\377" + "r\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377^\0\377\3235\24\377" + "QQQ\377QQQ\377SSS\377XXX\377aaa\377mmm\377|||\377\212\212\212\377\225\225" + "\225\377\234\234\234\377\237\237\237\377\240\240\240\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\223\223\223\377\206\206" + "\206\377kkk\377kkk\377kkk\377kkk\377kkk\377kkk\377kkk\377kkk\377kkk\377k" + "kk\377kkk\377kkk\377kkk\377\377,\0\377\377\223\0\377\377\224\0\377\377\223" + "\0\377\377\220\0\377\377\207\0\377\377}\0\377\377u\0\377\377q\0\377\377o" + "\0\377\377o\0\377\377o\0\377\377=\0\377r=2\377CCC\377DDD\377FFF\377KKK\377" + "TTT\377___\377lll\377www\377XXX\377NNN\377OOO\377PPP\377PPP\377]]]\377]]" + "]\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377" + "PPP\377PPP\377PPP\377PPP\377\222B2\377\377E\0\377\377o\0\377\377o\0\377\377" + "I\0\377\272]J\377\250\250\250\377\307\307\307\377\306\306\306\377\264\264" + "\264\377\242\242\242\377\224\224\224\377\221\221\221\377\227\227\227\377" + "\246\246\246\377\270\270\270\377\311\311\311\377\327\327\327\377\336\336" + "\336\377\341\341\341\377\343\343\343\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\373\373\373\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\377mN\257\377s\0\377\377\224\0\377" + "\377\222\0\377\377\213\0\377\377\201\0\377\377x\0\377\377s\0\377\377p\0\377" + "\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377,\0\377QQQ\377QQQ\377SSS" + "\377XXX\377```\377mmm\377{{{\377\212\212\212\377\224\224\224\377\233\233" + "\233\377\237\237\237\377\240\240\240\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\223\223" + "\223\377\223\223\223\377\206\206\206\377kkk\377kkk\377kkk\377kkk\377kkk\377" + "kkk\377kkk\377kkk\377kkk\377kkk\377\377,\0\377\377\223\0\377\377\224\0\377" + "\377\224\0\377\377\221\0\377\377\210\0\377\377~\0\377\377u\0\377\377q\0\377" + "\377p\0\377\377o\0\377\377o\0\377\3779\0\377[3+\377666\377666\377888\377" + "<<<\377BBB\377KKK\377UUU\377^^^\377KKK\377NNN\377OOO\377PPP\377PPP\377PP" + "P\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377" + "PPP\377PPP\377PPP\377PPP\377PPP\377\3235\24\377\377^\0\377\377o\0\377\377" + "o\0\377\3770\0\377\342\325\322\377\332\332\332\377\317\317\317\377\277\277" + "\277\377\255\255\255\377\234\234\234\377\222\222\222\377\222\222\222\377" + "\234\234\234\377\255\255\255\377\277\277\277\377\317\317\317\377\331\331" + "\331\377\340\340\340\377\342\342\342\377\343\343\343\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\373\373\373\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\377\223}\200\377" + "`\0\377\377\224\0\377\377\222\0\377\377\214\0\377\377\202\0\377\377x\0\377" + "\377r\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\3770\0" + "\377\\OL\377QQQ\377SSS\377XXX\377```\377lll\377zzz\377\211\211\211\377\224" + "\224\224\377\233\233\233\377\236\236\236\377\240\240\240\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\223\223\223\377\206\206\206\377xxx\377kkk\377kkk\377kkk\377kkk\377k" + "kk\377kkk\377\377,\0\377\377\223\0\377\377\224\0\377\377\224\0\377\377\221" + "\0\377\377\211\0\377\377~\0\377\377v\0\377\377q\0\377\377p\0\377\377o\0\377" + "\377o\0\377\377,\0\377555\377666\377666\377888\377;;;\377AAA\377JJJ\377T" + "TT\377]]]\377KKK\377NNN\377OOO\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP" + "\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377]]]\377" + "kkk\377\241\206\201\377\3774\0\377\377o\0\377\377o\0\377\377Z\0\377\366e" + "G\377\336\336\336\377\327\327\327\377\312\312\312\377\271\271\271\377\247" + "\247\247\377\230\230\230\377\221\221\221\377\225\225\225\377\242\242\242" + "\377\264\264\264\377\306\306\306\377\323\323\323\377\334\334\334\377\340" + "\340\340\377\343\343\343\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\373\373\373\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\377\274\254P\377M\0\377\377" + "\224\0\377\377\222\0\377\377\214\0\377\377\202\0\377\377y\0\377\377s\0\377" + "\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377=\0\377|G<\377" + "QQQ\377SSS\377WWW\377___\377kkk\377zzz\377\210\210\210\377\224\224\224\377" + "\233\233\233\377\236\236\236\377\240\240\240\377\240\240\240\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\223\223\223\377\223\223\223\377" + "\206\206\206\377\206\206\206\377xxx\377xxx\377\377,\0\377\377\223\0\377\377" + "\224\0\377\377\224\0\377\377\221\0\377\377\211\0\377\377\177\0\377\377v\0" + "\377\377q\0\377\377p\0\377\377o\0\377\377o\0\377\377,\0\377555\377666\377" + "666\377888\377;;;\377AAA\377III\377TTT\377]]]\377JJJ\377MMM\377OOO\377PP" + "P\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377PPP\377" + "kkk\377\206\206\206\377\241\241\241\377\274\274\274\377\311\311\311\377\344" + "\344\344\377\360\223\200\377\377I\0\377\377o\0\377\377o\0\377\377A\0\377" + "\352\250\232\377\334\334\334\377\323\323\323\377\305\305\305\377\263\263" + "\263\377\241\241\241\377\224\224\224\377\222\222\222\377\231\231\231\377" + "\250\250\250\377\272\272\272\377\313\313\313\377\327\327\327\377\337\337" + "\337\377\342\342\342\377\343\343\343\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\373\373\373\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\377\324\3110\377" + "@\0\377\377\224\0\377\377\222\0\377\377\215\0\377\377\204\0\377\377z\0\377" + "\377s\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377I\0" + "\377\235@-\377QQQ\377SSS\377VVV\377^^^\377jjj\377yyy\377\207\207\207\377" + "\223\223\223\377\233\233\233\377\236\236\236\377\240\240\240\377\240\240" + "\240\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\223\223" + "\223\377\377,\0\377\377\223\0\377\377\224\0\377\377\224\0\377\377\221\0\377" + "\377\211\0\377\377~\0\377\377v\0\377\377q\0\377\377p\0\377\377o\0\377\377" + "b\0\377\331.\12\377555\377666\377666\377777\377;;;\377AAA\377III\377SSS\377" + "\\\\\\\377JJJ\377MMM\377OOO\377PPP\377PPP\377PPP\377kkk\377kkk\377\206\206" + "\206\377\223\223\223\377\241\241\241\377\256\256\256\377\274\274\274\377" + "\311\311\311\377\326\326\326\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\374C\35\377\377g\0\377\377o\0\377" + "\377k\0\377\3757\16\377\340\340\340\377\331\331\331\377\317\317\317\377\276" + "\276\276\377\255\255\255\377\234\234\234\377\223\223\223\377\224\224\224" + "\377\236\236\236\377\257\257\257\377\301\301\301\377\320\320\320\377\332" + "\332\332\377\340\340\340\377\342\342\342\377\343\343\343\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\373\373\373\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\377,\0\377\377\224\0\377\377\223\0\377\377\216\0\377\377\206" + "\0\377\377|\0\377\377t\0\377\377q\0\377\377p\0\377\377o\0\377\377o\0\377" + "\377o\0\377\377R\0\377\262<#\377QQQ\377SSS\377VVV\377]]]\377iii\377www\377" + "\206\206\206\377\222\222\222\377\232\232\232\377\236\236\236\377\240\240" + "\240\377\240\240\240\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\377,\0\377\377\223\0\377\377\224\0\377\377\224\0" + "\377\377\221\0\377\377\211\0\377\377~\0\377\377v\0\377\377q\0\377\377p\0" + "\377\377o\0\377\377^\0\377\3202\21\377CCC\377CCC\377DDD\377EEE\377JJJ\377" + "QQQ\377[[[\377hhh\377ttt\377VVV\377MMM\377OOO\377PPP\377PPP\377\223\223\223" + "\377\326\326\326\377\326\326\326\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\351" + "\301\271\377\3779\0\377\377o\0\377\377o\0\377\377R\0\377\362{c\377\336\336" + "\336\377\327\327\327\377\311\311\311\377\270\270\270\377\246\246\246\377" + "\230\230\230\377\222\222\222\377\226\226\226\377\244\244\244\377\266\266" + "\266\377\307\307\307\377\325\325\325\377\335\335\335\377\341\341\341\377" + "\343\343\343\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\373\373\373\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\377`>\277\377z\0" + "\377\377\223\0\377\377\220\0\377\377\210\0\377\377\177\0\377\377v\0\377\377" + "r\0\377\377p\0\377\377o\0\377\377o\0\377\377o\0\377\377b\0\377\3363\17\377" + "QQQ\377SSS\377VVV\377]]]\377hhh\377vvv\377\205\205\205\377\221\221\221\377" + "\231\231\231\377\236\236\236\377\240\240\240\377\240\240\240\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\377,\0\377" + "\377\224\0\377\377\224\0\377\377\224\0\377\377\220\0\377\377\210\0\377\377" + "}\0\377\377u\0\377\377q\0\377\377o\0\377\377o\0\377\377N\0\377\250>(\377" + "PPP\377QQQ\377QQQ\377SSS\377XXX\377aaa\377nnn\377}}}\377\213\213\213\377" + "ccc\377MMM\377OOO\377PPP\377PPP\377\223\223\223\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\363}d\377\377R\0\377\377o\0\377" + "\377o\0\377\3779\0\377\346\276\266\377\334\334\334\377\322\322\322\377\304" + "\304\304\377\262\262\262\377\240\240\240\377\224\224\224\377\223\223\223" + "\377\233\233\233\377\253\253\253\377\275\275\275\377\315\315\315\377\330" + "\330\330\377\337\337\337\377\342\342\342\377\343\343\343\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\373\373\373" + "\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\377\223}\200\377`\0\377\377\224\0\377\377\222" + "\0\377\377\214\0\377\377\202\0\377\377y\0\377\377s\0\377\377p\0\377\377p" + "\0\377\377o\0\377\377o\0\377\377o\0\377\377,\0\377QQQ\377RRR\377UUU\377\\" + "\\\\\377fff\377uuu\377\203\203\203\377\220\220\220\377\231\231\231\377\236" + "\236\236\377\240\240\240\377\240\240\240\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\377,\0\377\377\223\0\377\377" + "\224\0\377\377\223\0\377\377\220\0\377\377\207\0\377\377|\0\377\377u\0\377" + "\377q\0\377\377o\0\377\377o\0\377\377E\0\377\223C3\377PPP\377QQQ\377QQQ\377" + "SSS\377XXX\377aaa\377nnn\377}}}\377\213\213\213\377ccc\377MMM\377OOO\377" + "PPP\377PPP\377\223\223\223\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\3758\16\377\377k\0\377\377o\0\377\377b\0\377\372N+\377" + "\340\340\340\377\331\331\331\377\316\316\316\377\276\276\276\377\254\254" + "\254\377\234\234\234\377\223\223\223\377\224\224\224\377\240\240\240\377" + "\261\261\261\377\303\303\303\377\321\321\321\377\333\333\333\377\340\340" + "\340\377\342\342\342\377\343\343\343\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\373\373\373\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\377\324\3110\377@\0\377\377\224\0\377\377\223\0\377\377\217\0\377" + "\377\207\0\377\377}\0\377\377u\0\377\377q\0\377\377p\0\377\377o\0\377\377" + "o\0\377\377o\0\377\377=\0\377}H=\377RRR\377UUU\377[[[\377eee\377sss\377\201" + "\201\201\377\217\217\217\377\230\230\230\377\235\235\235\377\240\240\240" + "\377\240\240\240\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\255\222\215\377\3779\0\377\377\224\0\377\377\224\0\377\377\223\0\377" + "\377\217\0\377\377\206\0\377\377|\0\377\377t\0\377\377p\0\377\377o\0\377" + "\377o\0\377\3779\0\377rJB\377PPP\377QQQ\377QQQ\377TTT\377YYY\377bbb\377o" + "oo\377~~~\377\214\214\214\377ddd\377NNN\377OOO\377PPP\377PPP\377\206\206" + "\206\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\354\252\234\377" + "\377A\0\377\377o\0\377\377o\0\377\377I\0\377\356\222~\377\336\336\336\377" + "\326\326\326\377\310\310\310\377\267\267\267\377\245\245\245\377\227\227" + "\227\377\223\223\223\377\230\230\230\377\246\246\246\377\270\270\270\377" + "\311\311\311\377\326\326\326\377\336\336\336\377\341\341\341\377\343\343" + "\343\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\373\373\373\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" + "\3778\16\357\377\215\0\377\377\224\0\377\377\221\0\377\377\213\0\377\377" + "\202\0\377\377x\0\377\377s\0\377\377p\0\377\377p\0\377\377o\0\377\377o\0" + "\377\377R\0\377\263<$\377QQQ\377TTT\377ZZZ\377ccc\377ppp\377\200\200\200" + "\377\215\215\215\377\227\227\227\377\235\235\235\377\237\237\237\377\240" + "\240\240\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\271" + "\204y\377\377E\0\377\377\224\0\377\377\224\0\377\377\223\0\377\377\216\0" + "\377\377\205\0\377\377z\0\377\377s\0\377\377p\0\377\377o\0\377\377k\0\377" + "\364.\5\377QQQ\377PPP\377QQQ\377QQQ\377TTT\377ZZZ\377bbb\377ppp\377\177\177" + "\177\377\215\215\215\377~~~\377NNN\377OOO\377PPP\377PPP\377kkk\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\367fH\377\377Z\0\377\377o\0\377" + "\377o\0\377\3770\0\377\342\325\322\377\333\333\333\377\321\321\321\377\302" + "\302\302\377\260\260\260\377\237\237\237\377\224\224\224\377\224\224\224" + "\377\234\234\234\377\255\255\255\377\276\276\276\377\317\317\317\377\331" + "\331\331\377\340\340\340\377\342\342\342\377\343\343\343\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\373\373\373\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\377y^\237\377m\0\377" + "\377\224\0\377\377\223\0\377\377\216\0\377\377\206\0\377\377}\0\377\377u" + "\0\377\377q\0\377\377p\0\377\377o\0\377\377o\0\377\377b\0\377\3363\17\377" + "QQQ\377TTT\377YYY\377bbb\377nnn\377}}}\377\213\213\213\377\226\226\226\377" + "\234\234\234\377\237\237\237\377\240\240\240\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\271\204y\377\377F\0\377\377\224\0\377\377" + "\224\0\377\377\223\0\377\377\215\0\377\377\203\0\377\377y\0\377\377s\0\377" + "\377p\0\377\377o\0\377\377Z\0\377\3108\31\377QQQ\377PPP\377QQQ\377QQQ\377" + "UUU\377ZZZ\377ddd\377rrr\377\200\200\200\377\216\216\216\377~~~\377NNN\377" + "OOO\377PPP\377PPP\377kkk\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\346\330\326" + "\377\3770\0\377\377o\0\377\377o\0\377\377Z\0\377\366eG\377\337\337\337\377" + "\330\330\330\377\315\315\315\377\274\274\274\377\252\252\252\377\233\233" + "\233\377\223\223\223\377\225\225\225\377\242\242\242\377\264\264\264\377" + "\305\305\305\377\323\323\323\377\334\334\334\377\340\340\340\377\343\343" + "\343\377\343\343\343\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\373\373\373\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\377\274\254P\377M\0\377\377\224\0\377\377\224\0\377\377" + "\221\0\377\377\213\0\377\377\201\0\377\377y\0\377\377s\0\377\377p\0\377\377" + "p\0\377\377o\0\377\377o\0\377\3774\0\377gLG\377SSS\377XXX\377```\377lll\377" + "zzz\377\211\211\211\377\224\224\224\377\233\233\233\377\236\236\236\377\240" + "\240\240\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\312" + "nZ\377\377Y\0\377\377\224\0\377\377\224\0\377\377\221\0\377\377\213\0\377" + "\377\200\0\377\377x\0\377\377r\0\377\377p\0\377\377o\0\377\377E\0\377\223" + "C3\377QQQ\377PPP\377QQQ\377RRR\377UUU\377[[[\377eee\377ttt\377\202\202\202" + "\377\217\217\217\377\177\177\177\377NNN\377OOO\377PPP\377PPP\377]]]\377\326" + "\326\326\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\360\223\200\377\377I\0\377\377o\0\377\377o\0" + "\377\377A\0\377\352\250\232\377\335\335\335\377\324\324\324\377\306\306\306" + "\377\266\266\266\377\244\244\244\377\227\227\227\377\223\223\223\377\232" + "\232\232\377\250\250\250\377\272\272\272\377\313\313\313\377\327\327\327" + "\377\337\337\337\377\341\341\341\377\343\343\343\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\373\373\373\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\377" + "8\16\357\377\215\0\377\377\224\0\377\377\223\0\377\377\216\0\377\377\206" + "\0\377\377}\0\377\377u\0\377\377q\0\377\377p\0\377\377o\0\377\377o\0\377" + "\377I\0\377\235A-\377SSS\377VVV\377^^^\377jjj\377xxx\377\206\206\206\377" + "\222\222\222\377\232\232\232\377\236\236\236\377\240\240\240\377\240\240" + "\240\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\320fP\377\377`\0\377\377" + "\224\0\377\377\223\0\377\377\217\0\377\377\207\0\377\377}\0\377\377v\0\377" + "\377q\0\377\377p\0\377\377o\0\377\3770\0\377\\OL\377QQQ\377PPP\377QQQ\377" + "RRR\377VVV\377\\\\\\\377ggg\377uuu\377\204\204\204\377\221\221\221\377\214" + "\214\214\377NNN\377OOO\377PPP\377PPP\377PPP\377\311\311\311\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\372O+\377\377b\0\377\377o\0\377\377k\0\377\3757\16\377\340\340\340\377" + "\332\332\332\377\320\320\320\377\301\301\301\377\256\256\256\377\236\236" + "\236\377\224\224\224\377\224\224\224\377\236\236\236\377\257\257\257\377" + "\301\301\301\377\320\320\320\377\332\332\332\377\340\340\340\377\342\342" + "\342\377\343\343\343\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\373\373\373\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\377\223}\200\377`\0\377\377\224" + "\0\377\377\224\0\377\377\221\0\377\377\212\0\377\377\201\0\377\377x\0\377" + "\377s\0\377\377p\0\377\377p\0\377\377o\0\377\377b\0\377\3363\17\377RRR\377" + "VVV\377\\\\\\\377hhh\377uuu\377\203\203\203\377\220\220\220\377\231\231\231" + "\377\236\236\236\377\240\240\240\377\240\240\240\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\342Q3\377\377s\0\377\377\224\0\377\377\221\0\377\377" + "\214\0\377\377\203\0\377\377y\0\377\377t\0\377\377p\0\377\377o\0\377\377" + "Z\0\377\3119\32\377QQQ\377QQQ\377PPP\377QQQ\377SSS\377VVV\377]]]\377iii\377" + "www\377\206\206\206\377\222\222\222\377\232\232\232\377[[[\377OOO\377PPP" + "\377PPP\377PPP\377\274\274\274\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\351\301\271\377\3779\0\377\377o\0\377\377" + "o\0\377\377R\0\377\362{c\377\337\337\337\377\327\327\327\377\313\313\313" + "\377\272\272\272\377\250\250\250\377\232\232\232\377\223\223\223\377\227" + "\227\227\377\245\245\245\377\266\266\266\377\307\307\307\377\325\325\325" + "\377\335\335\335\377\341\341\341\377\343\343\343\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\373\373\373\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\377\337\327\40\3779\0\377\377\224\0\377\377\224\0\377\377\223" + "\0\377\377\216\0\377\377\206\0\377\377}\0\377\377u\0\377\377q\0\377\377p" + "\0\377\377o\0\377\377o\0\377\3779\0\377sKC\377UUU\377[[[\377ddd\377rrr\377" + "\201\201\201\377\216\216\216\377\227\227\227\377\235\235\235\377\237\237" + "\237\377\240\240\240\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\355B\36" + "\377\377\200\0\377\377\223\0\377\377\217\0\377\377\207\0\377\377~\0\377\377" + "w\0\377\377r\0\377\377p\0\377\377o\0\377\377A\0\377\212G:\377QQQ\377QQQ\377" + "QQQ\377QQQ\377SSS\377WWW\377___\377kkk\377zzz\377\210\210\210\377\224\224" + "\224\377\233\233\233\377iii\377PPP\377PPP\377PPP\377PPP\377\241\241\241\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\363}d\377\377R\0\377\377o\0\377\377o\0\377\3779\0\377\346\276\266\377\334" + "\334\334\377\323\323\323\377\305\305\305\377\264\264\264\377\242\242\242" + "\377\226\226\226\377\224\224\224\377\234\234\234\377\253\253\253\377\275" + "\275\275\377\315\315\315\377\330\330\330\377\337\337\337\377\342\342\342" + "\377\343\343\343\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\373" + "\373\373\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\373w\\\242\377" + "m\0\377\377\224\0\377\377\224\0\377\377\221\0\377\377\213\0\377\377\201\0" + "\377\377y\0\377\377s\0\377\377p\0\377\377p\0\377\377o\0\377\377V\0\377\275" + ":\36\377TTT\377YYY\377bbb\377nnn\377}}}\377\213\213\213\377\225\225\225\377" + "\234\234\234\377\237\237\237\377\240\240\240\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\377,\0\377\377\224\0\377\377\222\0\377\377\214\0\377\377" + "\203\0\377\377z\0\377\377t\0\377\377q\0\377\377o\0\377\377g\0\377\3522\13" + "\377TTT\377QQQ\377QQQ\377QQQ\377QQQ\377TTT\377YYY\377aaa\377nnn\377|||\377" + "\212\212\212\377\225\225\225\377\234\234\234\377jjj\377PPP\377PPP\377PPP" + "\377PPP\377\206\206\206\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\3758\16\377\377k\0\377\377o\0\377\377b\0\377\372" + "N+\377\340\340\340\377\331\331\331\377\317\317\317\377\276\276\276\377\255" + "\255\255\377\234\234\234\377\224\224\224\377\225\225\225\377\240\240\240" + "\377\261\261\261\377\303\303\303\377\321\321\321\377\333\333\333\377\340" + "\340\340\377\342\342\342\377\343\343\343\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\373\373\373\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\367\333\333$\3779\0\377\377\224\0\377\377\224\0\377\377\223" + "\0\377\377\216\0\377\377\206\0\377\377}\0\377\377u\0\377\377q\0\377\377p" + "\0\377\377o\0\377\377k\0\377\3652\5\377^QN\377XXX\377___\377kkk\377yyy\377" + "\210\210\210\377\223\223\223\377\232\232\232\377\236\236\236\377\240\240" + "\240\377\240\240\240\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241" + "\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377" + "\241\241\241\377\241\241\241\377\271\204y\377\377F\0\377\377\223\0\377\377" + "\220\0\377\377\210\0\377\377\177\0\377\377w\0\377\377r\0\377\377p\0\377\377" + "o\0\377\377N\0\377\254B,\377SSS\377QQQ\377QQQ\377QQQ\377RRR\377UUU\377ZZ" + "Z\377ddd\377rrr\377\200\200\200\377\215\215\215\377\227\227\227\377\235\235" + "\235\377\204\204\204\377PPP\377PPP\377PPP\377PPP\377kkk\377\326\326\326\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\354\252\234\377\377A\0\377\377o" + "\0\377\377o\0\377\377I\0\377\356\222~\377\336\336\336\377\326\326\326\377" + "\311\311\311\377\270\270\270\377\246\246\246\377\230\230\230\377\224\224" + "\224\377\230\230\230\377\246\246\246\377\270\270\270\377\311\311\311\377" + "\326\326\326\377\336\336\336\377\341\341\341\377\343\343\343\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\373\373\373\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\277\277\277\4\373x]\243" + "\377m\0\377\377\224\0\377\377\224\0\377\377\221\0\377\377\213\0\377\377\202" + "\0\377\377y\0\377\377t\0\377\377p\0\377\377p\0\377\377o\0\377\377N\0\377" + "\251?)\377VVV\377]]]\377hhh\377uuu\377\204\204\204\377\220\220\220\377\231" + "\231\231\377\235\235\235\377\240\240\240\377\240\240\240\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\320" + "fP\377\377`\0\377\377\222\0\377\377\215\0\377\377\204\0\377\377{\0\377\377" + "t\0\377\377q\0\377\377o\0\377\377k\0\377\3663\6\377bUR\377SSS\377QQQ\377" + "QQQ\377QQQ\377SSS\377VVV\377]]]\377ggg\377uuu\377\203\203\203\377\220\220" + "\220\377\231\231\231\377\235\235\235\377\222\222\222\377PPP\377PPP\377PP" + "P\377PPP\377PPP\377\311\311\311\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\367fH\377\377Z\0\377\377o\0\377\377o\0\377\3770\0\377\342\325\322\377\333" + "\333\333\377\322\322\322\377\303\303\303\377\261\261\261\377\240\240\240" + "\377\225\225\225\377\224\224\224\377\234\234\234\377\255\255\255\377\276" + "\276\276\377\317\317\317\377\331\331\331\377\340\340\340\377\342\342\342" + "\377\343\343\343\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\373\373\373\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\252\252\252\3\370\336\327'\3779\0\377\377\224\0\377\377\224\0\377\377" + "\223\0\377\377\217\0\377\377\207\0\377\377~\0\377\377w\0\377\377r\0\377\377" + "p\0\377\377o\0\377\377k\0\377\3652\5\377`RP\377[[[\377ddd\377qqq\377\200" + "\200\200\377\215\215\215\377\226\226\226\377\234\234\234\377\237\237\237" + "\377\240\240\240\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\347I(\377\377z\0\377\377\221\0\377\377\212\0" + "\377\377\200\0\377\377x\0\377\377s\0\377\377p\0\377\377o\0\377\377N\0\377" + "\257E/\377WWW\377SSS\377QQQ\377QQQ\377QQQ\377SSS\377XXX\377___\377kkk\377" + "yyy\377\207\207\207\377\222\222\222\377\232\232\232\377\236\236\236\377\222" + "\222\222\377]]]\377PPP\377PPP\377PPP\377PPP\377\274\274\274\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\347\315\307\377\3774\0\377\377o\0\377\377o\0\377\377Z\0\377" + "\366eG\377\337\337\337\377\330\330\330\377\315\315\315\377\275\275\275\377" + "\253\253\253\377\234\234\234\377\224\224\224\377\226\226\226\377\242\242" + "\242\377\264\264\264\377\305\305\305\377\323\323\323\377\334\334\334\377" + "\340\340\340\377\343\343\343\377\343\343\343\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377" + "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\373\373\373\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\177\177\177\2\324\324\324\6\371\220y\210" + "\377`\0\377\377\224\0\377\377\224\0\377\377\222\0\377\377\214\0\377\377\204" + "\0\377\377{\0\377\377u\0\377\377r\0\377\377p\0\377\377o\0\377\377N\0\377" + "\252@*\377XXX\377aaa\377mmm\377{{{\377\210\210\210\377\224\224\224\377\233" + "\233\233\377\236\236\236\377\240\240\240\377\240\240\240\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241" + "\241\241\377\241\241\241\377\241\241\241\377\241\241\241\377\241\241\241" + "\377\241\241\241\377\241\241\241\377\247\232\227\377\3773\0\377\377\223\0" + "\377\377\217\0\377\377\207\0\377\377}\0\377\377u\0\377\377q\0\377\377p\0" + "\377\377g\0\377\3544\15\377^^^\377VVV\377SSS\377QQQ\377QQQ\377RRR\377UUU" + "\377ZZZ\377bbb\377ooo\377~~~\377\213\213\213\377\225\225\225\377\233\233" + "\233\377\237\237\237\377\240\240\240\377kkk\377PPP\377PPP\377PPP\377PPP\377" + "\223\223\223\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344" + "\344\377\344\344\344\377\344\344\344\377\360\223\200\377\377I\0\377\377o" + "\0\377\377o\0\377\377A\0\377\352\250\232\377\335\335\335\377\325\325\325" + "\377\307\307\307\377\266\266\266\377\245\245\245\377\227\227\227\377\224" + "\224\224\377\232\232\232\377\250\250\250\377\273\273\273\377\313\313\313" + "\377\327\327\327\377\337\337\337\377\341\341\341\377\343\343\343\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344" + "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344" + "\377\373\373\373\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\1\277\277\277\4\365\342\342\33\374H\33\342\377\207\0\377\377\224\0\377" + "\377\223\0\377\377\220\0\377\377\212\0\377\377\201\0\377\377z\0\377\377t" + "\0\377\377q\0\377\377p\0\377\377k\0\377\3674\7\377xkh\377xxx\377\206\206" + "\206\377\227\227\227\377\251\251\251\377\270\270\270\377\303\303\303\377" + "\312\312\312\377\314\314\314\377\316\316\316\377\316\316\316\377\316\316" + "\316\377\316\316\316\377\316\316\316\377\316\316\316\377\316\316\316\377" + "\316\316\316\377\316\316\316\377\316\316\316\377\316\316\316\377\316\316" + "\316\377\316\316\316\377\341\221\201\377\377S\0\377\377\222\0\377\377\214" + "\0\377\377\202\0\377\377y\0\377\377s\0\377\377p\0\377\377o\0\377\377A\0\377" + "\254i\\\377www\377nnn\377jjj\377hhh\377hhh\377jjj\377nnn\377www\377\204\204" + "\204\377\225\225\225\377\246\246\246\377\267\267\267\377\302\302\302\377" + "\311\311\311\377\314\314\314\377\316\316\316\377\247\247\247\377PPP\377P" + "PP\377PPP\377PPP\377kkk\377\373\373\373\377\373\373\373\377\373\373\373\377" + "\373\373\373\377\373\373\373\377\373\373\373\377\376F\37\377\377g\0\377\377" + "o\0\377\377k\0\377\3779\20\377\366\366\366\377\360\360\360\377\345\345\345" + "\377\325\325\325\377\301\301\301\377\256\256\256\377\243\243\243\377\243" + "\243\243\377\256\256\256\377\301\301\301\377\325\325\325\377\345\345\345" + "\377\360\360\360\377\366\366\366\377\371\371\371\377\372\372\372\377\373" + "\373\373\377\373\373\373\377\373\373\373\377\373\373\373\377\373\373\373" + "\377\373\373\373\377\373\373\373\377\373\373\373\377\373\373\373\377\373" + "\373\373\377\373\373\373\377\373\373\373\377\373\373\373\377\373\373\373" + "\377\373\373\373\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\1\252\252\252\3\337\337\337\10\365\301\267O\377F\0\377\377\224\0\377\377" + "\224\0\377\377\223\0\377\377\216\0\377\377\210\0\377\377\177\0\377\377x\0" + "\377\377s\0\377\377q\0\377\377p\0\377\377Z\0\377\330G)\372\217\217\217\336" + "\236\236\236\300\261\261\261\230\310\310\310k\334\334\334C\351\351\351$\360" + "\360\360\21\332\332\332\7\177\177\177\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\377S.\317" + "\377\200\0\377\377\220\0\377\377\210\0\377\377~\0\377\377v\0\377\377r\0\377" + "\377p\0\377\377Z\0\377\350W9\333\241\241\241\271\220\220\220\333\206\206" + "\206\357\201\201\201\371\200\200\200\374\200\200\200\373\204\204\204\364" + "\213\213\213\346\227\227\227\315\250\250\250\251\276\276\276~\323\323\323" + "R\343\343\343.\363\363\363\26\342\342\342\11\252\252\252\3\0\0\0\1\277\277" + "\277\4PPP\377PPP\377PPP\377PPP\377PPP\377\277\277\277\4\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\377\307\273@\377=\0\377\377o\0\377\377o\0\377\377V\0\377\375" + "y]\241\351\351\351\14\355\355\355\35\337\337\3378\317\317\317\\\273\273\273" + "\205\252\252\252\246\244\244\244\264\250\250\250\253\267\267\267\216\310" + "\310\310g\333\333\333@\350\350\350\"\357\357\357\20\324\324\324\6\177\177" + "\177\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\177\177\177\2\314\314\314" + "\5\354\354\354\16\366\201g\235\377f\0\377\377\224\0\377\377\224\0\377\377" + "\222\0\377\377\215\0\377\377\206\0\377\377~\0\377\377w\0\377\377s\0\377\377" + "q\0\377\377p\0\377\377=\0\377\250sh\354\227\227\227\315\252\252\252\250\277" + "\277\277}\323\323\323R\343\343\343/\350\350\350\27\345\345\345\12\277\277" + "\277\4\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\377\307\273@\377F\0\377\377\222\0\377\377\215\0\377" + "\377\203\0\377\377z\0\377\377t\0\377\377q\0\377\377l\0\377\3739\13\366\267" + "\252\250\235\236\236\236\300\216\216\216\337\205\205\205\361\201\201\201" + "\372\200\200\200\374\201\201\201\371\206\206\206\357\217\217\217\335\236" + "\236\236\300\261\261\261\230\310\310\310l\334\334\334C\351\351\351$\360\360" + "\360\21\332\332\332\7\177\177\177\2\0\0\0\1\0\0\0\0jjj\224PPP\377PPP\377" + "PPP\377PPP\377\337\337\337\30\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377y^\237\377" + "V\0\377\377o\0\377\377o\0\377\3779\0\377\372\317\3136\360\360\360\21\352" + "\352\352%\332\332\332E\310\310\310l\264\264\264\223\247\247\247\256\244\244" + "\244\264\255\255\255\242\275\275\275\200\320\320\320W\341\341\3413\353\353" + "\353\32\347\347\347\13\277\277\277\4\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\1\252\252\252\3\345\345\345\12\350\350\350\27\372O+\330" + "\377\200\0\377\377\224\0\377\377\224\0\377\377\221\0\377\377\214\0\377\377" + "\205\0\377\377}\0\377\377w\0\377\377s\0\377\377p\0\377\377l\0\377\3675\7" + "\376\231\214\210\332\242\242\242\270\265\265\265\217\314\314\314d\335\335" + "\335=\347\347\347!\356\356\356\17\324\324\324\6\177\177\177\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\377" + "`>\277\377y\0\377\377\217\0\377\377\210\0\377\377~\0\377\377w\0\377\377s" + "\0\377\377p\0\377\377=\0\377\322\235\223\225\256\256\256\237\231\231\231" + "\307\214\214\214\344\204\204\204\363\201\201\201\372\201\201\201\372\203" + "\203\203\365\212\212\212\350\224\224\224\321\246\246\246\257\273\273\273" + "\205\321\321\321Z\342\342\3425\354\354\354\33\351\351\351\14\277\277\277" + "\4\0\0\0\1\0\0\0\0\0\0\0\0\312\312\3121PPP\377PPP\377PPP\377PPP\377\245\245" + "\245X\0\0\0\0\0\0\0\0\0\0\0\0\377\357\337\20\3770\0\377\377o\0\377\377o\0" + "\377\377g\0\377\377E\36\337\345\345\345\12\351\351\351\30\344\344\3440\323" + "\323\323S\300\300\300{\256\256\256\237\243\243\243\263\246\246\246\260\261" + "\261\261\227\304\304\304q\330\330\330I\345\345\345(\361\361\361\23\337\337" + "\337\10\252\252\252\3\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\177\177\177\2\324\324\324\6\356\356\356\17\356\336\336/\374<\14\363" + "\377\215\0\377\377\224\0\377\377\223\0\377\377\221\0\377\377\214\0\377\377" + "\204\0\377\377}\0\377\377w\0\377\377s\0\377\377p\0\377\377_\0\377\342D#\370" + "\231\231\231\307\255\255\255\242\303\303\303w\327\327\327N\342\342\342-\363" + "\363\363\26\345\345\345\12\277\277\277\4\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\377\257\234`\377S\0\377\377\220" + "\0\377\377\212\0\377\377\202\0\377\377y\0\377\377t\0\377\377p\0\377\377J" + "\0\377\350\212x\234\277\277\277|\250\250\250\251\226\226\226\317\212\212" + "\212\350\203\203\203\365\201\201\201\372\202\202\202\370\206\206\206\357" + "\217\217\217\336\235\235\235\302\260\260\260\234\304\304\304q\330\330\330" + "I\346\346\346)\361\361\361\23\337\337\337\10\252\252\252\3\0\0\0\1\0\0\0" + "\0\0\0\0\0\277\277\277\4PPP\377PPP\377PPP\377PPP\377PPP\377\0\0\0\1\0\0\0" + "\0\0\0\0\0\377\241\215p\377I\0\377\377o\0\377\377o\0\377\377I\0\377\374\237" + "\213s\354\354\354\16\347\347\347\40\335\335\335<\313\313\313c\270\270\270" + "\212\250\250\250\251\243\243\243\265\250\250\250\251\270\270\270\212\315" + "\315\315b\335\335\335<\356\356\356\37\354\354\354\16\314\314\314\5\177\177" + "\177\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\1\277" + "\277\277\4\345\345\345\12\350\350\350\27\352\303\272U\374F\12\364\377\215" + "\0\377\377\224\0\377\377\223\0\377\377\221\0\377\377\213\0\377\377\204\0" + "\377\377}\0\377\377v\0\377\377s\0\377\377p\0\377\377V\0\377\326R7\357\244" + "\244\244\264\267\267\267\214\315\315\315a\335\335\335<\347\347\347\40\356" + "\356\356\17\324\324\324\6\177\177\177\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\377\357\337\20\377>\16\357\377\212\0\377\377\213\0" + "\377\377\203\0\377\377|\0\377\377u\0\377\377r\0\377\377V\0\377\363pU\263" + "\321\321\321Z\271\271\271\210\244\244\244\264\223\223\223\326\210\210\210" + "\354\203\203\203\366\202\202\202\370\204\204\204\364\211\211\211\347\226" + "\226\226\320\246\246\246\257\273\273\273\207\315\315\315]\337\337\3378\356" + "\356\356\36\353\353\353\15\314\314\314\5\177\177\177\2\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0jjj\224PPP\377PPP\377PPP\377PPP\377\332\332\332#\0\0\0\0\0" + "\0\0\0\377E\36\337\377g\0\377\377o\0\377\377o\0\377\3774\0\377\370\336\327" + "'\362\362\362\24\346\346\346*\331\331\331J\304\304\304r\261\261\261\230\245" + "\245\245\261\244\244\244\264\256\256\256\237\300\300\300{\323\323\323S\344" + "\344\3440\350\350\350\27\345\345\345\12\252\252\252\3\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\177\177\177\2\324\324" + "\324\6\356\356\356\17\347\347\347!\344\275\265a\374F\12\365\377\215\0\377" + "\377\224\0\377\377\223\0\377\377\221\0\377\377\213\0\377\377\204\0\377\377" + "|\0\377\377v\0\377\377r\0\377\377p\0\377\377V\0\377\331V:\351\254\254\254" + "\241\303\303\303w\325\325\325O\343\343\343.\351\351\351\30\347\347\347\13" + "\277\277\277\4\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\357\337" + "\20\377V,\317\377z\0\377\377\210\0\377\377\203\0\377\377|\0\377\377v\0\377" + "\377s\0\377\377V\0\377\367tY\253\336\336\336?\311\311\311h\263\263\263\225" + "\237\237\237\276\217\217\217\335\206\206\206\357\203\203\203\366\203\203" + "\203\365\207\207\207\355\220\220\220\333\236\236\236\277\261\261\261\232" + "\306\306\306p\330\330\330I\346\346\346*\362\362\362\24\342\342\342\11\252" + "\252\252\3\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\332\332\332#PPP\377PP" + "P\377PPP\377PPP\377jjj\224\0\0\0\0\377\274\254P\377A\0\377\377o\0\377\377" + "o\0\377\377Z\0\377\375lN\260\351\351\351\14\354\354\354\33\342\342\3425\321" + "\321\321Z\274\274\274\202\254\254\254\244\243\243\243\265\246\246\246\257" + "\264\264\264\224\310\310\310l\332\332\332E\352\352\352%\360\360\360\21\332" + "\332\332\7\177\177\177\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\277\277\277\4\345\345\345\12\363\363\363" + "\26\347\347\347,\336\266\257m\373F\11\366\377\215\0\377\377\224\0\377\377" + "\223\0\377\377\220\0\377\377\212\0\377\377\203\0\377\377{\0\377\377u\0\377" + "\377r\0\377\377p\0\377\377V\0\377\347I'\354\300\246\237\233\314\314\314d" + "\336\336\336?\351\351\351#\360\360\360\21\337\337\337\10\252\252\252\3\0" + "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\377\357\337\20\377U,\317\377q\0\377\377\201" + "\0\377\377\177\0\377\377z\0\377\377v\0\377\377s\0\377\377V\0\377\372u[\247" + "\346\346\346*\326\326\326L\303\303\303w\254\254\254\243\231\231\231\311\214" + "\214\214\344\205\205\205\362\203\203\203\365\206\206\206\360\215\215\215" + "\342\230\230\230\312\250\250\250\251\274\274\274\202\321\321\321Y\342\342" + "\3426\355\355\355\35\353\353\353\15\314\314\314\5\177\177\177\2\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\277\277\277\4PPP\377PPP\377PPP\377PPP\377" + "PPP\377\342\342\342\11\377`>\277\377^\0\377\377o\0\377\377o\0\377\377E\0" + "\377\374\255\233d\360\360\360\21\351\351\351$\334\334\334B\307\307\307j\265" + "\265\265\221\246\246\246\255\243\243\243\266\251\251\251\247\272\272\272" + "\206\315\315\315]\337\337\3378\355\355\355\35\351\351\351\14\314\314\314" + "\5\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\177\177\177\2\324\324\324\6\354\354\354\16\356\356\356" + "\36\336\336\3367\330\260\252x\372:\12\367\377z\0\377\377\224\0\377\377\223" + "\0\377\377\220\0\377\377\211\0\377\377\202\0\377\377z\0\377\377u\0\377\377" + "r\0\377\377p\0\377\377^\0\377\372;\11\371\336t_\276\324\311\304`\341\341" + "\3414\354\354\354\34\354\354\354\16\324\324\324\6\177\177\177\2\0\0\0\1\0" + "\0\0\0\377\257\234`\377<\16\357\377h\0\377\377x\0\377\377x\0\377\377w\0\377" + "\377t\0\377\377r\0\377\377F\0\377\373w[\244\355\355\355\35\336\336\3367\317" + "\317\317\\\271\271\271\210\244\244\244\262\223\223\223\324\211\211\211\351" + "\205\205\205\362\205\205\205\361\211\211\211\347\223\223\223\324\243\243" + "\243\266\265\265\265\221\311\311\311i\331\331\331D\352\352\352&\361\361\361" + "\23\337\337\337\10\252\252\252\3\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\0jjj\224PPP\377PPP\377PPP\377PPP\377\253\236\231b\3770\0\377" + "\377o\0\377\377o\0\377\377k\0\377\3778\16\357\345\345\345\12\350\350\350" + "\27\343\343\343/\322\322\322Q\300\300\300z\257\257\257\236\244\244\244\264" + "\244\244\244\264\257\257\257\235\303\303\303w\325\325\325O\342\342\342-\363" + "\363\363\26\342\342\342\11\252\252\252\3\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\1\252\252" + "\252\3\337\337\337\10\361\361\361\23\352\352\352&\334\334\334B\314\301\274" + "p\354N-\342\377Z\0\377\377\215\0\377\377\222\0\377\377\217\0\377\377\211" + "\0\377\377\200\0\377\377x\0\377\377s\0\377\377p\0\377\377p\0\377\377k\0\377" + "\377N\0\377\3739\13\366\357lP\272\361\226\201\210\365\300\263Q\367\302\270" + "H\373\270\254S\377\210o\220\377E\36\337\377F\0\377\377m\0\377\377r\0\377" + "\377s\0\377\377s\0\377\377r\0\377\377d\0\377\3779\0\377\372\254\233f\362" + "\362\362\24\345\345\345(\327\327\327G\305\305\305o\261\261\261\232\235\235" + "\235\301\217\217\217\335\210\210\210\354\206\206\206\360\211\211\211\352" + "\221\221\221\331\236\236\236\300\257\257\257\235\302\302\302v\325\325\325" + "P\344\344\3441\353\353\353\32\351\351\351\14\314\314\314\5\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\337\337\337\30PPP\377" + "PPP\377PPP\377PPP\377|G<\377\377=\0\377\377o\0\377\377o\0\377\377V\0\377" + "\375y]\241\354\354\354\16\356\356\356\37\335\335\335<\315\315\315a\270\270" + "\270\212\251\251\251\252\241\241\241\267\247\247\247\256\266\266\266\220" + "\311\311\311h\333\333\333A\351\351\351#\357\357\357\20\324\324\324\6\177" + "\177\177\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\177\177\177\2\314\314\314\5\347\347\347" + "\13\352\352\352\31\343\343\343.\326\326\326L\304\304\304q\322uc\305\371>" + "\10\373\377m\0\377\377\222\0\377\377\216\0\377\377\206\0\377\377}\0\377\377" + "u\0\377\377r\0\377\377p\0\377\377o\0\377\377o\0\377\377k\0\377\377V\0\377" + "\377I\0\377\377=\0\377\377=\0\377\377A\0\377\377R\0\377\377g\0\377\377o\0" + "\377\377p\0\377\377p\0\377\377p\0\377\377l\0\377\377N\0\377\377S/\320\372" + "\317\3136\356\356\356\17\356\356\356\37\337\337\3378\317\317\317[\273\273" + "\273\205\246\246\246\255\227\227\227\316\214\214\214\343\207\207\207\355" + "\211\211\211\352\217\217\217\335\233\233\233\306\251\251\251\247\275\275" + "\275\201\317\317\317\\\340\340\340:\347\347\347!\357\357\357\20\332\332\332" + "\7\252\252\252\3\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\\\\\\\242PPP\377PPP\377PPP\377qIA\377\3735\14\362\377,\0" + "\377\377,\0\377\375lN\260\363\350\350\27\362\362\362\24\346\346\346)\331" + "\331\331J\304\304\304r\261\261\261\230\244\244\244\262\241\241\241\267\253" + "\253\253\245\274\274\274\202\321\321\321Y\341\341\3414\354\354\354\33\347" + "\347\347\13\277\277\277\4\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\1\177\177" + "\177\2\324\324\324\6\356\356\356\17\356\356\356\36\342\342\3426\322\322\322" + "U\301\301\301y\272\237\231\252\332W;\347\3779\0\377\377k\0\377\377\212\0" + "\377\377\200\0\377\377x\0\377\377r\0\377\377p\0\377\377o\0\377\377o\0\377" + "\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0" + "\377\377o\0\377\377o\0\377\377o\0\377\377g\0\377\377N\0\377\377;\16\357\375" + "\222|\201\332\332\332\7\353\353\353\15\353\353\353\32\343\343\343/\327\327" + "\327M\303\303\303s\260\260\260\233\236\236\236\277\221\221\221\331\211\211" + "\211\347\212\212\212\350\217\217\217\336\230\230\230\312\246\246\246\255" + "\270\270\270\212\311\311\311e\334\334\334C\344\344\344'\362\362\362\25\342" + "\342\342\11\277\277\277\4\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\312\312\3121PPP\377PPP\377PPP\377PPP\377" + "PPP\377\0\0\0\1\0\0\0\1\277\277\277\4\351\351\351\14\354\354\354\33\342\342" + "\3425\321\321\321Y\274\274\274\202\253\253\253\245\241\241\241\267\243\243" + "\243\263\260\260\260\231\304\304\304r\331\331\331J\346\346\346)\362\362\362" + "\24\337\337\337\10\252\252\252\3\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\1\252\252\252\3\337\337\337\10\360\360\360\22\351\351\351#\335\335" + "\335<\317\317\317[\276\276\276\177\255\255\255\242\252\216\212\310\325Q6" + "\360\3772\0\377\377L\0\377\377[\0\377\377j\0\377\377p\0\377\377o\0\377\377" + "o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377\377o\0\377" + "\377o\0\377\377g\0\377\377R\0\377\377A\0\377\377E\37\340\375\223}\202\363" + "\347\347\26\342\342\342\11\356\356\356\17\352\352\352\31\347\347\347+\332" + "\332\332E\310\310\310g\266\266\266\215\245\245\245\261\227\227\227\316\216" + "\216\216\340\214\214\214\344\217\217\217\336\230\230\230\314\245\245\245" + "\261\266\266\266\220\310\310\310l\330\330\330I\342\342\342-\352\352\352\31" + "\351\351\351\14\314\314\314\5\177\177\177\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\1PPP\377PPP\377" + "PPP\377PPP\377PPP\377\272\272\272C\177\177\177\2\324\324\324\6\357\357\357" + "\20\351\351\351#\333\333\333A\311\311\311h\266\266\266\220\246\246\246\255" + "\242\242\242\270\250\250\250\253\267\267\267\213\313\313\313c\335\335\335" + "=\347\347\347\40\354\354\354\16\314\314\314\5\177\177\177\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\177\177\177\2\277\277\277\4\345\345\345" + "\12\362\362\362\25\344\344\344'\333\333\333@\316\316\316_\274\274\274\202" + "\254\254\254\243\235\235\235\301\231\214\210\332\265fV\361\320L1\372\356" + "5\17\376\3775\0\377\377=\0\377\377E\0\377\377N\0\377\377N\0\377\377N\0\377" + "\377N\0\377\377A\0\377\377=\0\377\3770\0\377\374D\35\343\371\202i\230\371" + "\266\250[\354\354\354\16\353\353\353\15\356\356\356\17\362\362\362\25\356" + "\356\356\36\342\342\342-\331\331\331D\315\315\315a\273\273\273\204\252\252" + "\252\246\234\234\234\304\221\221\221\327\216\216\216\337\220\220\220\333" + "\227\227\227\313\244\244\244\262\265\265\265\222\306\306\306p\327\327\327" + "N\344\344\3441\354\354\354\34\354\354\354\16\324\324\324\6\177\177\177\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\0\0\0\0\0\271\271\271BPPP\377PPP\377PPP\377PPP\377\272\272" + "\272C\177\177\177\2\337\337\337\10\362\362\362\24\346\346\346*\326\326\326" + "K\303\303\303s\260\260\260\231\246\246\246\260\244\244\244\262\257\257\257" + "\236\300\300\300{\323\323\323S\344\344\3440\351\351\351\30\345\345\345\12" + "\277\277\277\4\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\1\177\177\177\2\314\314\314\5\351\351\351\14\350\350\350\27\346\346" + "\346)\334\334\334B\315\315\315a\274\274\274\202\254\254\254\243\236\236\236" + "\277\223\223\223\325\213\213\213\345\206\206\206\357\223xs\365\243nc\367" + "\263dS\365\305[E\362\312`J\350\320fO\334\327lW\316\323\221\202\246\331\243" + "\230\211\330\314\311V\337\337\3378\347\347\347+\351\351\351#\356\356\356" + "\37\356\356\356\37\350\350\350\"\346\346\346*\336\336\3367\331\331\331J\314" + "\314\314d\274\274\274\202\254\254\254\241\237\237\237\275\226\226\226\320" + "\221\221\221\331\223\223\223\326\232\232\232\310\245\245\245\261\264\264" + "\264\223\304\304\304q\322\322\322Q\341\341\3414\356\356\356\37\357\357\357" + "\20\332\332\332\7\252\252\252\3\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\277\277\277" + "\4PPP\377PPP\377\271\271\271B\277\277\277\4\0\0\0\1\252\252\252\3\342\342" + "\342\11\350\350\350\27\343\343\343/\322\322\322Q\301\301\301x\260\260\260" + "\231\251\251\251\252\253\253\253\245\266\266\266\215\311\311\311i\334\334" + "\334C\352\352\352%\360\360\360\21\332\332\332\7\177\177\177\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\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\177\177\177" + "\2\324\324\324\6\353\353\353\15\351\351\351\30\346\346\346*\334\334\334B" + "\314\314\314`\275\275\275\200\256\256\256\237\241\241\241\272\226\226\226" + "\320\216\216\216\340\210\210\210\353\205\205\205\361\205\205\205\361\207" + "\207\207\355\215\215\215\342\225\225\225\322\240\240\240\274\254\254\254" + "\243\270\270\270\212\304\304\304r\316\316\316^\327\327\327N\331\331\331D" + "\336\336\336>\335\335\335=\333\333\333A\326\326\326K\321\321\321Z\305\305" + "\305o\273\273\273\207\254\254\254\241\241\241\241\271\230\230\230\312\225" + "\225\225\322\226\226\226\320\234\234\234\303\246\246\246\255\266\266\266" + "\220\306\306\306p\322\322\322Q\342\342\3425\347\347\347\40\360\360\360\21" + "\337\337\337\10\252\252\252\3\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\356\356\356\17\277\277\277\4\0\0\0\0\0\0\0\0\0\0\0\1\252\252\252\3\345" + "\345\345\12\350\350\350\27\343\343\343/\325\325\325O\304\304\304r\267\267" + "\267\216\260\260\260\231\265\265\265\217\301\301\301u\324\324\324T\341\341" + "\3413\354\354\354\33\351\351\351\14\277\277\277\4\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\1\252\252" + "\252\3\324\324\324\6\353\353\353\15\351\351\351\30\346\346\346)\333\333\333" + "A\315\315\315]\300\300\300{\261\261\261\230\244\244\244\262\232\232\232\310" + "\221\221\221\331\214\214\214\344\210\210\210\353\207\207\207\355\211\211" + "\211\352\215\215\215\341\223\223\223\324\234\234\234\303\246\246\246\257" + "\261\261\261\232\271\271\271\210\301\301\301x\307\307\307n\310\310\310g\312" + "\312\312f\310\310\310k\303\303\303t\274\274\274\202\264\264\264\224\251\251" + "\251\247\241\241\241\271\233\233\233\306\230\230\230\314\231\231\231\307" + "\241\241\241\272\253\253\253\245\270\270\270\212\310\310\310l\325\325\325" + "O\342\342\3425\347\347\347\40\360\360\360\22\342\342\342\11\277\277\277\4" + "\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\1\252\252\252\3\342\342\342\11\362\362\362\25\346" + "\346\346)\332\332\332E\315\315\315a\302\302\302v\277\277\277|\304\304\304" + "q\321\321\321Z\336\336\336>\351\351\351$\360\360\360\22\337\337\337\10\252" + "\252\252\3\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\1\252\252\252\3\324\324\324\6\353\353\353" + "\15\350\350\350\27\344\344\344'\335\335\335=\322\322\322V\304\304\304r\266" + "\266\266\215\252\252\252\246\240\240\240\274\227\227\227\315\221\221\221" + "\332\215\215\215\342\213\213\213\346\213\213\213\345\216\216\216\340\221" + "\221\221\327\227\227\227\313\240\240\240\274\247\247\247\256\255\255\255" + "\242\261\261\261\230\265\265\265\222\265\265\265\221\264\264\264\224\260" + "\260\260\233\253\253\253\245\245\245\245\261\240\240\240\273\235\235\235" + "\302\234\234\234\303\237\237\237\275\246\246\246\257\261\261\261\232\275" + "\275\275\201\311\311\311e\331\331\331J\345\345\3452\356\356\356\37\360\360" + "\360\22\342\342\342\11\277\277\277\4\177\177\177\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" + "\1\177\177\177\2\332\332\332\7\357\357\357\20\356\356\356\37\341\341\341" + "4\330\330\330H\320\320\320W\321\321\321Y\325\325\325P\336\336\336>\346\346" + "\346)\350\350\350\27\347\347\347\13\277\277\277\4\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\1\177\177\177\2\324\324\324\6\351\351\351\14\362\362\362\25" + "\351\351\351$\342\342\3426\327\327\327M\311\311\311e\276\276\276~\262\262" + "\262\226\250\250\250\253\237\237\237\275\227\227\227\313\223\223\223\325" + "\220\220\220\333\217\217\217\335\220\220\220\333\223\223\223\326\226\226" + "\226\317\231\231\231\307\236\236\236\277\242\242\242\270\244\244\244\264" + "\245\245\245\261\244\244\244\262\243\243\243\265\241\241\241\271\240\240" + "\240\274\240\240\240\274\242\242\242\270\246\246\246\257\255\255\255\240" + "\267\267\267\214\303\303\303t\317\317\317[\334\334\334C\343\343\343.\355" + "\355\355\35\360\360\360\21\342\342\342\11\277\277\277\4\177\177\177\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\177\177\177\2\314\314\314\5\347\347\347\13\362" + "\362\362\24\350\350\350\"\343\343\343.\336\336\3367\337\337\3378\344\344" + "\3441\352\352\352%\351\351\351\30\353\353\353\15\324\324\324\6\177\177\177" + "\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\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\177\177\177\2\314\314" + "\314\5\345\345\345\12\361\361\361\23\356\356\356\36\343\343\343.\333\333" + "\333A\322\322\322V\310\310\310l\274\274\274\202\262\262\262\226\251\251\251" + "\247\243\243\243\265\236\236\236\300\232\232\232\310\230\230\230\314\227" + "\227\227\316\227\227\227\315\227\227\227\313\231\231\231\307\234\234\234" + "\303\236\236\236\277\240\240\240\274\241\241\241\272\241\241\241\267\244" + "\244\244\264\246\246\246\260\251\251\251\247\260\260\260\234\267\267\267" + "\214\301\301\301y\314\314\314d\327\327\327N\337\337\3379\344\344\344'\352" + "\352\352\31\356\356\356\17\337\337\337\10\277\277\277\4\177\177\177\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\252\252\252\3\324\324\324\6" + "\347\347\347\13\360\360\360\22\352\352\352\31\355\355\355\35\355\355\355" + "\35\352\352\352\31\361\361\361\23\351\351\351\14\324\324\324\6\252\252\252" + "\3\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\1\177\177" + "\177\2\277\277\277\4\342\342\342\11\356\356\356\17\351\351\351\30\351\351" + "\351$\341\341\3414\332\332\332E\320\320\320X\307\307\307j\277\277\277|\267" + "\267\267\213\261\261\261\230\254\254\254\243\250\250\250\253\245\245\245" + "\261\243\243\243\265\243\243\243\266\243\243\243\266\244\244\244\264\246" + "\246\246\260\247\247\247\254\251\251\251\247\254\254\254\241\260\260\260" + "\231\266\266\266\220\274\274\274\203\303\303\303t\313\313\313c\322\322\322" + "Q\336\336\336?\343\343\343.\347\347\347\40\362\362\362\24\351\351\351\14" + "\324\324\324\6\252\252\252\3\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\252\252\252\3\314\314\314\5\337\337\337\10\347" + "\347\347\13\353\353\353\15\353\353\353\15\347\347\347\13\337\337\337\10\314" + "\314\314\5\252\252\252\3\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\0\0\0\0\1\177\177\177\2\252\252\252\3\324\324\324" + "\6\347\347\347\13\360\360\360\22\354\354\354\33\352\352\352&\341\341\341" + "4\334\334\334B\325\325\325P\316\316\316^\310\310\310k\302\302\302v\275\275" + "\275\200\273\273\273\207\267\267\267\214\265\265\265\217\266\266\266\220" + "\265\265\265\217\267\267\267\214\271\271\271\210\274\274\274\202\300\300" + "\300z\304\304\304q\312\312\312f\321\321\321Y\326\326\326L\335\335\335=\343" + "\343\343/\351\351\351#\351\351\351\30\356\356\356\17\342\342\342\11\314\314" + "\314\5\177\177\177\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\177\177\177\2\252\252\252\3\277\277" + "\277\4\314\314\314\5\314\314\314\5\277\277\277\4\252\252\252\3\177\177\177" + "\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\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/BasiliskII/src/Unix/BasiliskII_32x32x32_icon.c b/BasiliskII/src/Unix/BasiliskII_32x32x32_icon.c new file mode 100644 index 00000000..632f4673 --- /dev/null +++ b/BasiliskII/src/Unix/BasiliskII_32x32x32_icon.c @@ -0,0 +1,166 @@ +/* GIMP RGBA C-Source image dump (BasiliskII_32x32x32_icon.c) */ + +static const struct { + unsigned int width; + unsigned int height; + unsigned int bytes_per_pixel; /* 2:RGB16, 3:RGB, 4:RGBA */ + unsigned char pixel_data[32 * 32 * 4 + 1]; +} icon_32x32x32 = { + 32, 32, 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\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0q'\17s\377s\0\377q\37\6s\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0JJJ\377\7\7\7!\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0h(\16k\377\214\0\377" + "\356b\16\357\36\27\27!\12\12\12\30%%%)\356b\16\357\315Y\40\316\263I\40\326" + "\245B)\377\203\27\0\204z\16\0{z\16\0{\203\27\0\204z\16\0{\203\27\0\204z\16" + "\0{z\16\0{\203\27\0\204\264I\27\265,\26\15""9\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\10\377{\0\377\377\204" + "\0\377%\22\22)\27\27\27!AAARbbb\224jjj\224\377\224\0\377\377\214\0\377\377" + "\224\0\377\377\224\0\377\377\214\0\377\377\224\0\377\377\224\0\377\377\224" + "\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0\377\377\224\0" + "\377\377s\0\377,((9\37\37\37)\0\0\0\0\0\0\0\0,,,9jjj\204jjj\204aaa{jjj\204" + "\2138\40\224\377\224\0\377\377k\0\377bbb\204jjj\234zzz\306zzz\326\203\203" + "\203\316zzz\245\377\224\0\377\377\204\0\377\377s\0\377\377s\0\377\377{\0" + "\377\377s\0\377\377s\0\377\377s\0\377\377{\0\377\377s\0\377\377s\0\377\377" + "s\0\377\377s\0\377\377c\0\377zzz\306rrr\265\0\0\0\0\0\0\0\0jjj\204\234\234" + "\234\377\234\234\234\377\245\245\245\377\357c\30\377\377\224\0\377\367c\0" + "\377\224\224\224\377{{{\377ccc\377sss\377\214\214\214\377\234\234\234\377" + "\234\234\234\377\377\224\0\377\377{\0\377\377s\0\377\377k\0\377\377k\0\377" + "\377s\0\377\377k\0\377\377s\0\377\377k\0\377\377s\0\377\377s\0\377\377s\0" + "\377\377s\0\377\306Z9\377{{{\377rrr\275\0\0\0\0\0\0\0\0bbb\204\234\234\234" + "\377\245\245\245\377\367s\20\377\377\204\0\377\377k\0\377\214\214\214\377" + "kkk\377ZZZ\377{{{\377\224\224\224\377\234\234\234\377\245\245\245\377\224" + "\224\224\377\2559!\377\306\224\204\377\214kk\377kkk\377sss\377sss\377sss" + "\377sss\377sss\377sss\377sss\377\367R\10\377\377k\0\377{{{\377\203\203\203" + "\367XXX\204\0\0\0\0\0\0\0\0jjj\204\245\245\245\377\357c\30\377\377\204\0" + "\377\377s\0\377\224\204\204\377ccc\377ZZZ\377{{{\377\234\234\234\377\245" + "\245\245\377\245\245\245\377\234\234\234\377RRR\377sss\377\306\306\306\377" + "\214\214\214\377\214\214\214\377\214\214\214\377\214\214\214\377\214\214" + "\214\377\224\224\224\377\214\214\214\377\214\214\214\377\224\224\224\377" + "\377c\0\377\357R\30\377\204\204\204\377zzz\326666B\0\0\0\0\0\0\0\0aaa{\306" + "sR\377\377\224\0\377\377{\0\377\316R1\377ccc\377RRR\377JJJ\377{{{\377\234" + "\234\234\377\245\245\245\377\234\234\234\377\224\224\224\377RRR\377\336\336" + "\336\377\336\336\336\377\316\316\316\377\316\316\316\377\224\224\224\377" + "RRR\377\326\326\326\377\326\326\326\377\326\326\326\377\326\326\326\377\326" + "\306\306\377\377k\0\377\306\275\265\377\203\203\203\357jjj\234\25\25\25\30" + "\0\0\0\0\0\0\0\0jbb\204\377\224\0\377\377{\0\377\377k\0\377ccc\377RRR\377" + "kkk\377ccc\377\204\204\204\377\245\245\245\377\245\245\245\377\234\234\234" + "\377ZZZ\377ccc\377\347\347\347\377\347\347\347\377\347\347\347\377\347\347" + "\347\377\224\224\224\377RRR\377\347\347\347\377\336\336\336\377\347\347\347" + "\377\347\347\347\377\367k9\377\377c\0\377\275\275\275\377\203\203\203\347" + "IIIZ\0\0\0\0\0\0\0\0\0\0\0\0\356j\16\357\377\204\0\377\377s\0\377\234R9\377" + "RRR\377ZZZ\377\214\214\214\377ccc\377\204\204\204\377\234\234\234\377\234" + "\234\234\377\245\245\245\377RRR\377\326\326\326\377\347\347\347\377\336\336" + "\336\377\347\347\347\377\336\336\336\377\234\234\234\377JJJ\377\347\347\347" + "\377\347\347\347\377\347\347\347\377\336\336\336\377\377k\0\377\347\224\204" + "\377\234\234\234\377\203\203\203\326\36\36\36!\0\0\0\0\0\0\0\0\0\0\0\10\377" + "\224\0\377\377{\0\377\377k\0\377RRR\377RRR\377sss\377\224\224\224\377\234" + "\234\234\377\245\245\245\377\245\245\245\377\234\234\234\377\214\214\214" + "\377JJJ\377\347\347\347\377\347\347\347\377\347\347\347\377\336\336\336\377" + "\347\347\347\377\347\347\347\377\347\347\347\377\347\347\347\377\347\347" + "\347\377\336\336\336\377\347\275\265\377\377s\0\377\316\316\316\377\214\214" + "\214\377\203\203\203\265\0\0\0\10\0\0\0\0\0\0\0\0\335Y\26\336\377\214\0\377" + "\377s\0\377\316B\30\377JJJ\377ZZZ\377\204\204\204\377\234\234\234\377\245" + "\245\245\377\245\245\245\377\234\234\234\377\245\245\245\377ccc\377kkk\377" + "\347\347\347\377\336\336\336\377\347\347\347\377\347\347\347\377\347\347" + "\347\377\336\336\336\377\336\336\336\377\347\347\347\377\336\336\336\377" + "\347\347\347\377\377c!\377\367c)\377\265\265\265\377\214\214\214\377zzz\224" + "\0\0\0\0\0\0\0\0\0\0\0\0\377\224\0\377\377{\0\377\377k\0\377ZRR\377RRR\377" + "{kk\377\377Z\10\377\377s\0\377\377s\0\377\377s\0\377\357R\30\377\245\245" + "\245\377RRR\377\255\255\255\377\347\347\347\377\336\336\336\377\347\347\347" + "\377\336\336\336\377\347\347\347\377\347\347\347\377\347\347\347\377\347" + "\347\347\377\347\347\347\377\347\347\347\377\377k\0\377\336\316\316\377\234" + "\234\234\377\245\245\245\377yyy\204\0\0\0\0\0\0\0\0\36\27\27!\377\224\0\377" + "\377s\0\377\377k\0\377RRR\377ZRR\377\377k\0\377\316cJ\377\316cJ\377\377\214" + "\0\377\377s\0\377\377s\0\377\377c\0\377RRR\377\326\326\326\377\336\336\336" + "\377\347\347\347\377\347\347\347\377\347\347\347\377\336\336\336\377\347" + "\347\347\377\336\336\336\377\347\347\347\377\336\336\336\377\357\245\224" + "\377\377c\0\377\306\306\306\377\214\214\214\377\275\275\275\377yyy\204\0" + "\0\0\0\0\0\0\0\212(\16\214\377\224\0\377\377k\0\377\377R\0\377RRR\377ccc" + "\377\224\224\224\377\234\234\234\377{{{\377ccc\377\377\214\0\377\377s\0\377" + "\377s\0\377\347B\10\377\316\316\316\377\347\347\347\377\347\347\347\377\347" + "\347\347\377\336\336\336\377\347\347\347\377\347\347\347\377\347\347\347" + "\377\347\347\347\377\347\347\347\377\377R\0\377\357\204c\377\255\255\255" + "\377\224\224\224\377\326\326\326\377zzz{\0\0\0\0\0\0\0\0\335b\26\336\377" + "\214\0\377\377s\0\377\336J\20\377RRR\377kkk\377\224\224\224\377\204\204\204" + "\377kkk\377{{{\377\265ZJ\377\377\214\0\377\377s\0\377\377s\0\377111\377J" + "JJ\377RRR\377JJJ\377RRR\377\347\347\347\377\347\347\347\377\347\347\347\377" + "\336\336\336\377\347\347\347\377\377k\0\377\326\326\326\377\234\234\234\377" + "\255\255\255\377\336\336\336\377yyy\204\0\0\0\0\0\0\0\0\377Z\0\377\377\204" + "\0\377\377k\0\377\275B\30\377JJJ\377{{{\377\234\234\234\377\234\234\234\377" + "\234\234\234\377\234\234\234\377\234\234\234\377\377\224\0\377\377{\0\377" + "\377s\0\377\265B)\377sss\377\224\224\224\377kkk\377ZZZ\377\336\336\336\377" + "\336\336\336\377\347\347\347\377\347\347\347\377\367\224{\377\377Z\10\377" + "\306\306\306\377\214\214\214\377\306\306\306\377\336\336\336\377\203\203" + "\203\204\0\0\0\0\0\0\0\0\377c\0\377\377\204\0\377\377s\0\377\275B!\377RR" + "R\377{{{\377\234\234\234\377\245\245\245\377\234\234\234\377\245\245\245" + "\377\234\234\234\377\377c\0\377\377\214\0\377\377k\0\377\357J\10\377ccc\377" + "\224\224\224\377RRR\377\214\214\214\377\347\347\347\377\347\347\347\377\347" + "\347\347\377\336\336\336\377\377Z\0\377\347\245\234\377\255\255\255\377\234" + "\234\234\377\326\326\326\377\347\347\347\377zzz{\0\0\0\0\0\0\0\0\377c\0\377" + "\377\204\0\377\377s\0\377\316J\30\377RRR\377\204\204\204\377\224\224\224" + "\377kkk\377{{{\377\234\234\234\377\245\245\245\377\347c)\377\377\224\0\377" + "\377s\0\377\377R\0\377RRR\377\204\204\204\377JJJ\377\265\265\265\377\347" + "\347\347\377\336\336\336\377\347\347\347\377\336\336\336\377\377k\0\377J" + "JJ\377\214\214\214\377\265\265\265\377\336\336\336\377\347\347\347\377zz" + "z{\0\0\0\0\0\0\0\0\346b\17\347\377\214\0\377\377k\0\377\347J\10\377ZZZ\377" + "\204\204\204\377\245\245\245\377\214\214\214\377kkk\377kkk\377kkk\377\275" + "J1\377\377\224\0\377\377s\0\377\377Z\0\377JJJ\377sss\377RRR\377\214\214\214" + "\377sss\377ZZZ\377JJJ\377\275B!\377\336J\20\377\255\255\255\377\224\224\224" + "\377\316\316\316\377\336\336\336\377\347\347\347\377zzz{\0\0\0\0\0\0\0\0" + "\2437\27\245\377\214\0\377\377s\0\377\377Z\0\377RRR\377\204\204\204\377\234" + "\234\234\377\245\245\245\377\234\234\234\377\245\245\245\377\234\234\234" + "\377\306ZB\377\377\224\0\377\377s\0\377\367J\0\377111\377RRR\377RRR\377Z" + "ZZ\377sss\377\224\224\224\377\326\326\326\377\377c\0\377\336\326\316\377" + "\245\245\245\377\245\245\245\377\336\336\336\377\347\347\347\377\347\347" + "\347\377zzz{\0\0\0\0\0\0\0\0%\22\22)\377\214\0\377\377s\0\377\377k\0\377" + "RRR\377{{{\377\234\234\234\377\245\245\245\377\234\234\234\377\245\245\245" + "\377\234\234\234\377\326kJ\377\377\214\0\377\377s\0\377\306J!\377RRR\377" + "sss\377JJJ\377\265\265\265\377\336\336\336\377\347\347\347\377\347\326\326" + "\377\377c\0\377\316\316\316\377\224\224\224\377\275\275\275\377\336\336\336" + "\377\347\347\347\377\336\336\336\377zzz{\0\0\0\0\0\0\0\0\0\0\0\0\377\224" + "\0\377\377\204\0\377\377s\0\377kJJ\377kkk\377\234\234\234\377\245\245\245" + "\377\234\234\234\377\245\245\245\377\245\245\245\377\347c)\377\377\214\0" + "\377\377s\0\377cJB\377ZZZ\377{{{\377RRR\377\224\224\224\377\347\347\347\377" + "\347\347\347\377\367c)\377\367\204c\377\275\275\275\377\224\224\224\377\316" + "\316\316\377\347\347\347\377\347\347\347\377\347\347\347\377yyy\204\0\0\0" + "\0\0\0\0\0\0\0\0\0\264@\27\265\377\214\0\377\377s\0\377\357J\10\377kkk\377" + "\224\224\224\377\245\245\245\377\234\234\234\377\245\245\245\377\234\234" + "\234\377\377c\0\377\377\204\0\377\377c\0\377RRR\377ZZZ\377\204\204\204\377" + "ccc\377ccc\377\336\336\336\377\347\347\347\377\377s\0\377\326\326\326\377" + "\245\245\245\377\245\245\245\377\336\336\336\377\336\336\336\377\336\336" + "\336\377\347\347\347\377zzz{\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\377\224\0\377" + "\377\204\0\377\377k\0\377kkc\377\245\245\245\377\265\265\265\377\275\275" + "\275\377\265\265\265\377\265\265\265\377\377\224\0\377\377s\0\377\234ZR\377" + "ccc\377kkk\377\245\245\245\377\245\245\245\377RRR\377\357\357\357\377\357" + "\255\234\377\377R\0\377\326\326\326\377\234\234\234\377\326\326\326\377\357" + "\357\357\377\357\357\357\377\367\367\367\377\357\357\357\377zzz{\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0H%\37J\377\214\0\377\377{\0\377\367Z\0\377XXX\204" + "\17\17\17\20\0\0\0\0\0\0\0\0\2128\27\214\377{\0\377\335Q\16\336zzz\326zz" + "z\367bbb\224\17\17\17\20\0\0\0\0RRR\377\0\0\0\0\377Z\0\377W\37\26ZQQQkjj" + "j\234\27\27\27!\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0yA0\204\377\224\0\377\377{\0\377\367Z\10\3776..B\0" + "\0\0\0P\37\17R\377{\0\377\346Y\16\357QQQk\203\203\203\357zzz\316666B\0\0" + "\0\10\0\0\0\0III\336777\234\377s\0\377\27\27\27!rrr\245QQQk\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\17\17\17\20YYY{\356Y\7\367\377k\0\377\377k\0\377\377s\0\377\377c\0\377" + "a&\27c%%%)rrr\265zzz\326QQQk\0\0\0\10\0\0\0\0\0\0\0\0\0\0\0\20RRR\377\0\0" + "\0\0""777Jrrr\265$$$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\25\25\25\30YYY{zzz\336\203\203" + "\203\357rrr\255IIIZIIIZjjj\245zzz\316QQQk\17\17\17\20\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\10IIIZXXXs\17\17\17\20\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\17\17\17\20AAAJbbb\224rrr\275zzz\275jjj\255bbb\214666B\17\17\17" + "\20\0\0\0\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\20\17" + "\17\17\20\0\0\0\0\0\0\0\0\0\0\0\0\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/BasiliskII/src/Unix/user_strings_unix.cpp b/BasiliskII/src/Unix/user_strings_unix.cpp index b04762db..c9321e4a 100644 --- a/BasiliskII/src/Unix/user_strings_unix.cpp +++ b/BasiliskII/src/Unix/user_strings_unix.cpp @@ -38,6 +38,7 @@ user_string_def platform_strings[] = { {STR_FBDEV_NAME_ERR, "The %s frame buffer is not supported in %d bit mode."}, {STR_FBDEV_MMAP_ERR, "Cannot mmap() the frame buffer memory (%s)."}, {STR_VOSF_INIT_ERR, "Cannot initialize Video on SEGV signals."}, + {STR_X_ICON_ATOM_ALLOC_ERR, "Failed to allocate X Atom. Icon will not be set."}, {STR_NO_DEV_ZERO_ERR, "Cannot open /dev/zero (%s)."}, {STR_LOW_MEM_MMAP_ERR, "Cannot map Low Memory Globals (%s)."}, {STR_SIGALTSTACK_ERR, "Cannot install alternate signal stack (%s)."}, diff --git a/BasiliskII/src/Unix/user_strings_unix.h b/BasiliskII/src/Unix/user_strings_unix.h index b47f442a..52394bf1 100644 --- a/BasiliskII/src/Unix/user_strings_unix.h +++ b/BasiliskII/src/Unix/user_strings_unix.h @@ -29,6 +29,7 @@ enum { STR_FBDEV_NAME_ERR, STR_FBDEV_MMAP_ERR, STR_VOSF_INIT_ERR, + STR_X_ICON_ATOM_ALLOC_ERR, STR_NO_DEV_ZERO_ERR, STR_LOW_MEM_MMAP_ERR, STR_SIGALTSTACK_ERR, diff --git a/BasiliskII/src/Unix/video_x.cpp b/BasiliskII/src/Unix/video_x.cpp index 6f8ef67f..e373719c 100644 --- a/BasiliskII/src/Unix/video_x.cpp +++ b/BasiliskII/src/Unix/video_x.cpp @@ -29,6 +29,7 @@ #include "sysdeps.h" +#include #include #include #include @@ -445,6 +446,87 @@ static void set_window_name(Window w, int name) } } +// This struct is designed to match the ones generated by GIMP in +// BasiliskII_*_icon.c +struct gimp_image { + unsigned int width; + unsigned int height; + unsigned int bytes_per_pixel; + unsigned char pixel_data[0]; // Variable-length +}; + +// These were generated by using 'icns2png -x +// ../MacOSX/BasiliskII.icns', then using GIMP to convert the +// resulting .png files into "C source code (*.c)". GIMP doesn't +// generate corresponding .h files with extern declarations, so just +// #include the .c files here. +#include "BasiliskII_32x32x32_icon.c" +#include "BasiliskII_128x128x32_icon.c" + +// Set window icons +static void set_window_icons(Window w) +{ + // As per the _NET_WM_ICON documentation at + // https://standards.freedesktop.org/wm-spec/wm-spec-latest.html#idm140200472568384, + // "The first two cardinals are width, height." + const unsigned int HEADER_SIZE = 2; + // We will pass 32-bit values to XChangeProperty() + const unsigned int FORMAT = 32; + + // Icon data from GIMP to be converted and passed to the + // Window Manager + const struct gimp_image* const icons[] = + {(struct gimp_image *) &icon_32x32x32, + (struct gimp_image *) &icon_128x128x32}; + const unsigned int num_icons = sizeof(icons) / sizeof(icons[0]); + unsigned int icon; + + // Work out how big the buffer needs to be to store all of our icons + unsigned int buffer_size = 0; + for (icon = 0; icon < num_icons; icon++) { + buffer_size += HEADER_SIZE + + icons[icon]->width * icons[icon]->height; + } + + // As per the XChangeProperty() man page, "If the specified + // format is 32, the property data must be a long array." + unsigned long buffer[buffer_size]; + // This points to the start of the current icon within buffer + unsigned long *buffer_icon = buffer; + + // Copy the icons into the buffer + for (icon = 0; icon < num_icons; icon++) { + const unsigned int pixel_count = icons[icon]->width * + icons[icon]->height; + assert(icons[icon]->bytes_per_pixel == 4); + buffer_icon[0] = icons[icon]->width; + buffer_icon[1] = icons[icon]->height; + unsigned long *const buffer_pixels = buffer_icon + HEADER_SIZE; + + unsigned int i; + for (i = 0; i < pixel_count; i++) { + const unsigned char *src = + &icons[icon]->pixel_data[i * icons[icon]->bytes_per_pixel]; + buffer_pixels[i] = (src[3] << 24 | + src[0] << 16 | + src[1] << 8 | + src[2]); + } + + buffer_icon += HEADER_SIZE + pixel_count; + } + + Atom net_wm_icon = XInternAtom(x_display, "_NET_WM_ICON", False); + if (net_wm_icon == None) { + ErrorAlert(STR_X_ICON_ATOM_ALLOC_ERR); + // We can still continue running, just without an icon + return; + } + XChangeProperty(x_display, w, net_wm_icon, XA_CARDINAL, FORMAT, + PropModeReplace, (const unsigned char *) buffer, + buffer_size); +} + // Set window input focus flag static void set_window_focus(Window w) { @@ -733,6 +815,9 @@ driver_window::driver_window(X11_monitor_desc &m) // Set window name/class set_window_name(w, STR_WINDOW_TITLE); + // Set window icons + set_window_icons(w); + // Indicate that we want keyboard input set_window_focus(w); From 588a2ae9cdfc64dd3bb7a5042223c6d58d8b8cda Mon Sep 17 00:00:00 2001 From: Alexei Svitkine Date: Mon, 1 Jan 2018 15:42:53 -0500 Subject: [PATCH 56/67] don't try to run diskutil eject (null) --- BasiliskII/src/Unix/sys_unix.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) mode change 100644 => 100755 BasiliskII/src/Unix/sys_unix.cpp diff --git a/BasiliskII/src/Unix/sys_unix.cpp b/BasiliskII/src/Unix/sys_unix.cpp old mode 100644 new mode 100755 index 85d650c8..9c25feb5 --- a/BasiliskII/src/Unix/sys_unix.cpp +++ b/BasiliskII/src/Unix/sys_unix.cpp @@ -883,10 +883,12 @@ void SysEject(void *arg) // Try to use "diskutil eject" but it can take up to 5 // seconds to complete - static const char eject_cmd[] = "/usr/sbin/diskutil eject %s 2>&1 >/dev/null"; - char *cmd = (char *)alloca(strlen(eject_cmd) + strlen(fh->ioctl_name) + 1); - sprintf(cmd, eject_cmd, fh->ioctl_name); - system(cmd); + if (fh->ioctl_name) { + static const char eject_cmd[] = "/usr/sbin/diskutil eject %s 2>&1 >/dev/null"; + char *cmd = (char *)alloca(strlen(eject_cmd) + strlen(fh->ioctl_name) + 1); + sprintf(cmd, eject_cmd, fh->ioctl_name); + system(cmd); + } } fh->is_media_present = false; } From 581ce7d971632cbb89e61cc842feb2be4d3969fc Mon Sep 17 00:00:00 2001 From: atmaxinger Date: Tue, 20 Feb 2018 11:54:55 +0100 Subject: [PATCH 57/67] Mac GUI: don't show /dev/poll/cdrom if it is configured as cdrom --- .../src/MacOSX/Launcher/VMSettingsController.mm | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm b/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm index ceed49ff..3a69032b 100755 --- a/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm +++ b/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm @@ -120,11 +120,14 @@ static NSString *getStringFromPrefs(const char *key) /* Fetch all CDROMs */ index = 0; while ((dsk = PrefsFindString("cdrom", index++)) != NULL) { - DiskType *disk = [[[DiskType alloc] init] autorelease]; - [disk setPath:[NSString stringWithUTF8String: dsk ]]; - [disk setIsCDROM:YES]; + NSString *path = [NSString stringWithUTF8String: dsk ]; + if(![path isEqualToString:@"/dev/poll/cdrom"]) { + DiskType *disk = [[[DiskType alloc] init] autorelease]; + [disk setPath:[NSString stringWithUTF8String: dsk ]]; + [disk setIsCDROM:YES]; - [diskArray addObject:disk]; + [diskArray addObject:disk]; + } } [disks setDataSource: self]; From 3931036d87e5856224dea756da9c75f25c6601dd Mon Sep 17 00:00:00 2001 From: atmaxinger Date: Tue, 20 Feb 2018 12:39:59 +0100 Subject: [PATCH 58/67] Fix whitespace --- SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm b/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm index 3a69032b..29c4c36c 100755 --- a/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm +++ b/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm @@ -121,7 +121,7 @@ static NSString *getStringFromPrefs(const char *key) index = 0; while ((dsk = PrefsFindString("cdrom", index++)) != NULL) { NSString *path = [NSString stringWithUTF8String: dsk ]; - if(![path isEqualToString:@"/dev/poll/cdrom"]) { + if (![path isEqualToString:@"/dev/poll/cdrom"]) { DiskType *disk = [[[DiskType alloc] init] autorelease]; [disk setPath:[NSString stringWithUTF8String: dsk ]]; [disk setIsCDROM:YES]; From 787661f80f10ccc76610644450ff7ae389cde9f2 Mon Sep 17 00:00:00 2001 From: atmaxinger Date: Wed, 21 Feb 2018 15:24:29 +0100 Subject: [PATCH 59/67] Always save the default entry "cdrom /dev/poll/cdrom" --- SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm b/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm index 29c4c36c..530bc302 100755 --- a/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm +++ b/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm @@ -51,6 +51,8 @@ void prefs_exit() } #endif +#define DEFAULT_CDROM_PATH "/dev/poll/cdrom" + @implementation VMSettingsController + (id) sharedInstance @@ -121,7 +123,7 @@ static NSString *getStringFromPrefs(const char *key) index = 0; while ((dsk = PrefsFindString("cdrom", index++)) != NULL) { NSString *path = [NSString stringWithUTF8String: dsk ]; - if (![path isEqualToString:@"/dev/poll/cdrom"]) { + if (![path isEqualToString:@DEFAULT_CDROM_PATH]) { DiskType *disk = [[[DiskType alloc] init] autorelease]; [disk setPath:[NSString stringWithUTF8String: dsk ]]; [disk setIsCDROM:YES]; @@ -417,6 +419,8 @@ static NSString *makeRelativeIfNecessary(NSString *path) PrefsAddString([d isCDROM] ? "cdrom" : "disk", [[d path] UTF8String]); } + PrefsAddString("cdrom", DEFAULT_CDROM_PATH); + PrefsReplaceInt32("bootdriver", ([bootFrom indexOfSelectedItem] == 1 ? CDROMRefNum : 0)); PrefsReplaceString("rom", [[romFile stringValue] UTF8String]); PrefsReplaceString("extfs", [[unixRoot stringValue] UTF8String]); From 85bcff03d42bd7c15a3c1695eb0492443d87ad69 Mon Sep 17 00:00:00 2001 From: atmaxinger Date: Wed, 21 Feb 2018 16:24:20 +0100 Subject: [PATCH 60/67] Block all CDROMs in /dev/ --- SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm b/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm index 530bc302..54546f5b 100755 --- a/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm +++ b/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm @@ -51,8 +51,6 @@ void prefs_exit() } #endif -#define DEFAULT_CDROM_PATH "/dev/poll/cdrom" - @implementation VMSettingsController + (id) sharedInstance @@ -123,7 +121,7 @@ static NSString *getStringFromPrefs(const char *key) index = 0; while ((dsk = PrefsFindString("cdrom", index++)) != NULL) { NSString *path = [NSString stringWithUTF8String: dsk ]; - if (![path isEqualToString:@DEFAULT_CDROM_PATH]) { + if (![path hasPrefix:@"/dev/"]) { DiskType *disk = [[[DiskType alloc] init] autorelease]; [disk setPath:[NSString stringWithUTF8String: dsk ]]; [disk setIsCDROM:YES]; @@ -419,8 +417,6 @@ static NSString *makeRelativeIfNecessary(NSString *path) PrefsAddString([d isCDROM] ? "cdrom" : "disk", [[d path] UTF8String]); } - PrefsAddString("cdrom", DEFAULT_CDROM_PATH); - PrefsReplaceInt32("bootdriver", ([bootFrom indexOfSelectedItem] == 1 ? CDROMRefNum : 0)); PrefsReplaceString("rom", [[romFile stringValue] UTF8String]); PrefsReplaceString("extfs", [[unixRoot stringValue] UTF8String]); From 4ba1c48ec84f481d0b9375e22d6bf60e56cb8dbb Mon Sep 17 00:00:00 2001 From: atmaxinger Date: Thu, 22 Feb 2018 10:36:36 +0100 Subject: [PATCH 61/67] Always write /dev/poll/cdrom to preferences --- SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm b/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm index 54546f5b..8347c3a4 100755 --- a/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm +++ b/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm @@ -417,6 +417,8 @@ static NSString *makeRelativeIfNecessary(NSString *path) PrefsAddString([d isCDROM] ? "cdrom" : "disk", [[d path] UTF8String]); } + PrefsAddString("cdrom", "/dev/poll/cdrom"); + PrefsReplaceInt32("bootdriver", ([bootFrom indexOfSelectedItem] == 1 ? CDROMRefNum : 0)); PrefsReplaceString("rom", [[romFile stringValue] UTF8String]); PrefsReplaceString("extfs", [[unixRoot stringValue] UTF8String]); From f2fcfffabbde6914c32cdec95e4918896b396a3a Mon Sep 17 00:00:00 2001 From: atmaxinger Date: Thu, 22 Feb 2018 11:11:11 +0100 Subject: [PATCH 62/67] Always save the cdrom entries from /dev/ --- .../src/MacOSX/Launcher/VMSettingsController.mm | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm b/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm index 8347c3a4..f72ec39a 100755 --- a/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm +++ b/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm @@ -406,10 +406,15 @@ static NSString *makeRelativeIfNecessary(NSString *path) // Remove all disks while (PrefsFindString("disk")) PrefsRemoveItem("disk"); - // Remove all cdroms - while (PrefsFindString("cdrom")) - PrefsRemoveItem("cdrom"); - + // Remove all cdroms (but keep the ones in /dev/) + const char *path; + int index=0; + while ((path = PrefsFindString("cdrom", index++)) != NULL) { + NSString *p = [NSString stringWithUTF8String: path]; + if(![p hasPrefix:@"/dev/"]) { + PrefsRemoveItem("cdrom"); + } + } // Write all disks for (int i = 0; i < [diskArray count]; i++) { @@ -417,8 +422,6 @@ static NSString *makeRelativeIfNecessary(NSString *path) PrefsAddString([d isCDROM] ? "cdrom" : "disk", [[d path] UTF8String]); } - PrefsAddString("cdrom", "/dev/poll/cdrom"); - PrefsReplaceInt32("bootdriver", ([bootFrom indexOfSelectedItem] == 1 ? CDROMRefNum : 0)); PrefsReplaceString("rom", [[romFile stringValue] UTF8String]); PrefsReplaceString("extfs", [[unixRoot stringValue] UTF8String]); From 515746d584d7006fb3e3c62142f7872692e2b6e6 Mon Sep 17 00:00:00 2001 From: atmaxinger Date: Thu, 22 Feb 2018 11:32:57 +0100 Subject: [PATCH 63/67] Only remove item at index --- SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm b/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm index f72ec39a..c1eafa13 100755 --- a/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm +++ b/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm @@ -409,11 +409,13 @@ static NSString *makeRelativeIfNecessary(NSString *path) // Remove all cdroms (but keep the ones in /dev/) const char *path; int index=0; - while ((path = PrefsFindString("cdrom", index++)) != NULL) { + while ((path = PrefsFindString("cdrom", index)) != NULL) { NSString *p = [NSString stringWithUTF8String: path]; if(![p hasPrefix:@"/dev/"]) { - PrefsRemoveItem("cdrom"); + PrefsRemoveItem("cdrom", index); } + + index++; } // Write all disks From f25821d067923316849d59fb1112a1acd13d3595 Mon Sep 17 00:00:00 2001 From: atmaxinger Date: Thu, 22 Feb 2018 23:06:23 +0100 Subject: [PATCH 64/67] Fix CD ROM entries appearing multiple times --- SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm b/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm index c1eafa13..bd47a953 100755 --- a/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm +++ b/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm @@ -413,9 +413,12 @@ static NSString *makeRelativeIfNecessary(NSString *path) NSString *p = [NSString stringWithUTF8String: path]; if(![p hasPrefix:@"/dev/"]) { PrefsRemoveItem("cdrom", index); + } + else { + // only increase the index if the current entry has not been deleted + // if it has been deleted, the next entry is on the current entrys index + index++; } - - index++; } // Write all disks From a2e163fea90cd0654d5c7c09d9bb1ea67192bb9c Mon Sep 17 00:00:00 2001 From: atmaxinger Date: Thu, 22 Feb 2018 23:08:57 +0100 Subject: [PATCH 65/67] fix whitespaces --- .../src/MacOSX/Launcher/VMSettingsController.mm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm b/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm index bd47a953..9281f7ab 100755 --- a/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm +++ b/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm @@ -414,11 +414,11 @@ static NSString *makeRelativeIfNecessary(NSString *path) if(![p hasPrefix:@"/dev/"]) { PrefsRemoveItem("cdrom", index); } - else { - // only increase the index if the current entry has not been deleted - // if it has been deleted, the next entry is on the current entrys index - index++; - } + else { + // only increase the index if the current entry has not been deleted + // if it has been deleted, the next entry is on the current entrys index + index++; + } } // Write all disks From 4f14c448372b6e8d68ce32284f42b93fce5f0c88 Mon Sep 17 00:00:00 2001 From: atmaxinger Date: Sun, 25 Feb 2018 17:01:12 +0100 Subject: [PATCH 66/67] Fix formatting --- SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm b/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm index 9281f7ab..46e5a9fb 100755 --- a/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm +++ b/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm @@ -121,7 +121,7 @@ static NSString *getStringFromPrefs(const char *key) index = 0; while ((dsk = PrefsFindString("cdrom", index++)) != NULL) { NSString *path = [NSString stringWithUTF8String: dsk ]; - if (![path hasPrefix:@"/dev/"]) { + if (![path hasPrefix:@"/dev/"]) { DiskType *disk = [[[DiskType alloc] init] autorelease]; [disk setPath:[NSString stringWithUTF8String: dsk ]]; [disk setIsCDROM:YES]; @@ -408,13 +408,12 @@ static NSString *makeRelativeIfNecessary(NSString *path) PrefsRemoveItem("disk"); // Remove all cdroms (but keep the ones in /dev/) const char *path; - int index=0; + int index = 0; while ((path = PrefsFindString("cdrom", index)) != NULL) { NSString *p = [NSString stringWithUTF8String: path]; - if(![p hasPrefix:@"/dev/"]) { + if (![p hasPrefix:@"/dev/"]) { PrefsRemoveItem("cdrom", index); - } - else { + } else { // only increase the index if the current entry has not been deleted // if it has been deleted, the next entry is on the current entrys index index++; From e791a1fdd69a70e9240c4c2cb116cdeeb25e2ea1 Mon Sep 17 00:00:00 2001 From: atmaxinger Date: Sun, 25 Feb 2018 17:44:08 +0100 Subject: [PATCH 67/67] fix identation --- SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm b/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm index 46e5a9fb..a5319175 100755 --- a/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm +++ b/SheepShaver/src/MacOSX/Launcher/VMSettingsController.mm @@ -410,7 +410,7 @@ static NSString *makeRelativeIfNecessary(NSString *path) const char *path; int index = 0; while ((path = PrefsFindString("cdrom", index)) != NULL) { - NSString *p = [NSString stringWithUTF8String: path]; + NSString *p = [NSString stringWithUTF8String: path]; if (![p hasPrefix:@"/dev/"]) { PrefsRemoveItem("cdrom", index); } else {