diff -Naurd ../nethack-3.4.0/win/win32/mhaskyn.c ./win/win32/mhaskyn.c
--- ../nethack-3.4.0/win/win32/mhaskyn.c Wed Mar 20 23:44:21 2002
+++ ./win/win32/mhaskyn.c Mon Feb 24 15:25:05 2003
@@ -8,4 +8,4 @@
 int mswin_yes_no_dialog( const char *question, const char *choices, int def)
 {
 	return '\032';
-}
\ No newline at end of file
+}
diff -Naurd ../nethack-3.4.0/win/win32/mhdlg.c ./win/win32/mhdlg.c
--- ../nethack-3.4.0/win/win32/mhdlg.c Wed Mar 20 23:44:21 2002
+++ ./win/win32/mhdlg.c Mon Feb 24 15:25:05 2003
@@ -726,4 +726,4 @@
 	}
 
 	return TRUE;
-}
\ No newline at end of file
+}
diff -Naurd ../nethack-3.4.0/win/win32/mhfont.c ./win/win32/mhfont.c
--- ../nethack-3.4.0/win/win32/mhfont.c Wed Mar 20 23:44:21 2002
+++ ./win/win32/mhfont.c Mon Feb 24 15:25:05 2003
@@ -34,7 +34,7 @@
 	lgfnt.lfItalic			=	FALSE;		     // italic attribute option
 	lgfnt.lfUnderline		=	FALSE;		 // underline attribute option
 	lgfnt.lfStrikeOut		=	FALSE;			     // strikeout attribute option
-	lgfnt.lfCharSet		=	OEM_CHARSET;     // character set identifier
+	lgfnt.lfCharSet		=	ANSI_CHARSET;     // character set identifier
 	lgfnt.lfOutPrecision	=	OUT_DEFAULT_PRECIS;  // output precision
 	lgfnt.lfClipPrecision	=	CLIP_DEFAULT_PRECIS; // clipping precision
 	lgfnt.lfQuality		=	DEFAULT_QUALITY;     // output quality
@@ -87,7 +87,7 @@
 		lgfnt.lfItalic			=	FALSE;		         // italic attribute option
 		lgfnt.lfUnderline		=	FALSE;			     // underline attribute option
 		lgfnt.lfStrikeOut		=	FALSE;			     // strikeout attribute option
-		lgfnt.lfCharSet			=	OEM_CHARSET;     // character set identifier
+		lgfnt.lfCharSet			=	mswin_charset();     // character set identifier
 		lgfnt.lfOutPrecision	=	OUT_DEFAULT_PRECIS;  // output precision
 		lgfnt.lfClipPrecision	=	CLIP_DEFAULT_PRECIS; // clipping precision
 		lgfnt.lfQuality			=	DEFAULT_QUALITY;     // output quality
@@ -109,7 +109,7 @@
 		lgfnt.lfItalic			=	(attr==ATR_BLINK)? TRUE: FALSE;		     // italic attribute option
 		lgfnt.lfUnderline		=	(attr==ATR_ULINE)? TRUE : FALSE;		 // underline attribute option
 		lgfnt.lfStrikeOut		=	FALSE;				// strikeout attribute option
-		lgfnt.lfCharSet			=	OEM_CHARSET;     // character set identifier
+		lgfnt.lfCharSet			=	mswin_charset();     // character set identifier
 		lgfnt.lfOutPrecision	=	OUT_DEFAULT_PRECIS;  // output precision
 		lgfnt.lfClipPrecision	=	CLIP_DEFAULT_PRECIS; // clipping precision
 		lgfnt.lfQuality			=	DEFAULT_QUALITY;     // output quality
@@ -132,7 +132,7 @@
 		lgfnt.lfItalic			=	(attr==ATR_BLINK)? TRUE: FALSE;		     // italic attribute option
 		lgfnt.lfUnderline		=	(attr==ATR_ULINE)? TRUE : FALSE;		 // underline attribute option
 		lgfnt.lfStrikeOut		=	FALSE;			     // strikeout attribute option
-		lgfnt.lfCharSet			=	OEM_CHARSET;     // character set identifier
+		lgfnt.lfCharSet			=	mswin_charset();     // character set identifier
 		lgfnt.lfOutPrecision	=	OUT_DEFAULT_PRECIS;  // output precision
 		lgfnt.lfClipPrecision	=	CLIP_DEFAULT_PRECIS; // clipping precision
 		lgfnt.lfQuality			=	DEFAULT_QUALITY;     // output quality
@@ -154,7 +154,7 @@
 		lgfnt.lfItalic			=	(attr==ATR_BLINK)? TRUE: FALSE;		     // italic attribute option
 		lgfnt.lfUnderline		=	(attr==ATR_ULINE)? TRUE : FALSE;		 // underline attribute option
 		lgfnt.lfStrikeOut		=	FALSE;			     // strikeout attribute option
-		lgfnt.lfCharSet			=	OEM_CHARSET;     // character set identifier
+		lgfnt.lfCharSet			=	mswin_charset();     // character set identifier
 		lgfnt.lfOutPrecision	=	OUT_DEFAULT_PRECIS;  // output precision
 		lgfnt.lfClipPrecision	=	CLIP_DEFAULT_PRECIS; // clipping precision
 		lgfnt.lfQuality			=	DEFAULT_QUALITY;     // output quality
@@ -183,6 +183,21 @@
 	return fnt;
 }
 
+UINT mswin_charset()
+{
+	CHARSETINFO cis;
+	if( iflags.IBMgraphics )
+		if( TranslateCharsetInfo((DWORD*)GetOEMCP(), &cis, TCI_SRCCODEPAGE) ) 
+			return cis.ciCharset;
+		else
+			return OEM_CHARSET;
+	else 
+		if( TranslateCharsetInfo((DWORD*)GetACP(), &cis, TCI_SRCCODEPAGE) ) 
+			return cis.ciCharset;
+		else
+			return ANSI_CHARSET;
+}
+
 void __cdecl font_table_cleanup(void)
 {
 	int i;
diff -Naurd ../nethack-3.4.0/win/win32/mhfont.h ./win/win32/mhfont.h
--- ../nethack-3.4.0/win/win32/mhfont.h Wed Mar 20 23:44:22 2002
+++ ./win/win32/mhfont.h Mon Feb 24 15:25:05 2003
@@ -11,5 +11,6 @@
 HGDIOBJ mswin_get_font(int win_type, int attr, HDC hdc, BOOL replace);
 void mswin_init_splashfonts(HWND hWnd);
 void mswin_destroy_splashfonts(void);
+UINT mswin_charset(void);
 
 #endif /* MSWINFont_h */
diff -Naurd ../nethack-3.4.0/win/win32/mhinput.c ./win/win32/mhinput.c
--- ../nethack-3.4.0/win/win32/mhinput.c Wed Mar 20 23:44:22 2002
+++ ./win/win32/mhinput.c Mon Feb 24 15:25:05 2003
@@ -82,4 +82,4 @@
 		retval = NULL;
 	}
 	return retval;
-}
\ No newline at end of file
+}
diff -Naurd ../nethack-3.4.0/win/win32/mhmain.c ./win/win32/mhmain.c
--- ../nethack-3.4.0/win/win32/mhmain.c Wed Mar 20 23:44:22 2002
+++ ./win/win32/mhmain.c Mon Feb 24 15:25:05 2003
@@ -18,6 +18,7 @@
 
 static TCHAR szMainWindowClass[] = TEXT("MSNHMainWndClass");
 static TCHAR szTitle[MAX_LOADSTRING];
+extern void mswin_display_splash_window(BOOL);
 
 LRESULT CALLBACK	MainWndProc(HWND, UINT, WPARAM, LPARAM);
 LRESULT CALLBACK	About(HWND, UINT, WPARAM, LPARAM);
@@ -30,6 +31,7 @@
 HWND mswin_init_main_window () {
 	static int run_once = 0;
 	HWND ret;
+    WINDOWPLACEMENT wp;
 
 	/* register window class */
 	if( !run_once ) {
@@ -55,6 +57,28 @@
 
 	if( !ret ) panic("Cannot create main window");
 
+    
+    if (GetNHApp()->regMainMinX != CW_USEDEFAULT)
+    {
+        wp.length = sizeof(wp);
+        wp.showCmd = GetNHApp()->regMainShowState;
+
+        wp.ptMinPosition.x = GetNHApp()->regMainMinX;
+        wp.ptMinPosition.y = GetNHApp()->regMainMinY;
+
+        wp.ptMaxPosition.x = GetNHApp()->regMainMaxX;
+        wp.ptMaxPosition.y = GetNHApp()->regMainMaxY;
+
+        wp.rcNormalPosition.left = GetNHApp()->regMainLeft;
+        wp.rcNormalPosition.top = GetNHApp()->regMainTop;
+        wp.rcNormalPosition.right = GetNHApp()->regMainRight;
+        wp.rcNormalPosition.bottom = GetNHApp()->regMainBottom;
+        SetWindowPlacement(ret, &wp);
+    }
+    else
+        ShowWindow(ret, SW_SHOWDEFAULT);
+    UpdateWindow(ret);
+
 	return ret;
 }
 
@@ -406,9 +430,28 @@
 
 		case WM_MOVE:
 		case WM_SIZE:
+        {
+            WINDOWPLACEMENT wp;
+
 			mswin_layout_main_window(NULL);
-			break;
+            
+            wp.length = sizeof(wp);
+            if (GetWindowPlacement(hWnd, &wp)) {
+                GetNHApp()->regMainShowState = wp.showCmd;
 
+                GetNHApp()->regMainMinX = wp.ptMinPosition.x;
+                GetNHApp()->regMainMinY = wp.ptMinPosition.y;
+
+                GetNHApp()->regMainMaxX = wp.ptMaxPosition.x;
+                GetNHApp()->regMainMaxY = wp.ptMaxPosition.y;
+
+                GetNHApp()->regMainLeft = wp.rcNormalPosition.left;
+                GetNHApp()->regMainTop = wp.rcNormalPosition.top;
+                GetNHApp()->regMainRight = wp.rcNormalPosition.right;
+                GetNHApp()->regMainBottom = wp.rcNormalPosition.bottom;
+            }
+			break;
+        }
 		case WM_SETFOCUS:
 			/* if there is a menu window out there -
 			   transfer input focus to it */
@@ -608,6 +651,7 @@
 						   TRUE );
 				break;
 
+			case NHW_TEXT: // same as the map window
 			case NHW_MAP:
 				MoveWindow(GetNHApp()->windowlist[i].win, 
 					       map_org.x, 
@@ -632,7 +676,6 @@
 
 				pt.x = map_org.x + max(0, (int)(map_size.cx-menu_size.cx));
 				pt.y = map_org.y;
-				ClientToScreen(GetNHApp()->hMainWnd, &pt);
 				MoveWindow(GetNHApp()->windowlist[i].win, 
 						   pt.x, 
 						   pt.y,
@@ -659,7 +702,7 @@
 	switch (wmId)
 	{
 		case IDM_ABOUT:
-		   DialogBox(GetNHApp()->hApp, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
+     mswin_display_splash_window(TRUE);
 		   break;
 
 		case IDM_EXIT:
@@ -667,7 +710,8 @@
 		   break;
 
 		case IDM_SAVE:
-		   dosave();
+		   if (!program_state.gameover && !program_state.done_hup) dosave();
+		   else MessageBeep(0);
 		   break;
 
 		case IDM_MAP_TILES:
diff -Naurd ../nethack-3.4.0/win/win32/mhmap.c ./win/win32/mhmap.c
--- ../nethack-3.4.0/win/win32/mhmap.c Wed Mar 20 23:44:23 2002
+++ ./win/win32/mhmap.c Mon Feb 24 15:25:05 2003
@@ -6,6 +6,7 @@
 #include "mhmap.h"
 #include "mhmsg.h"
 #include "mhinput.h"
+#include "mhfont.h"
 
 #include "patchlevel.h"
 
@@ -92,8 +93,10 @@
 	
 	/* set new screen tile size */
 	data = (PNHMapWindow)GetWindowLong(hWnd, GWL_USERDATA);
-	data->xScrTile = (data->bFitToScreenMode? wnd_size.cx : lpsz->cx) / COLNO;
-	data->yScrTile = (data->bFitToScreenMode? wnd_size.cy : lpsz->cy) / ROWNO;
+	data->xScrTile = 
+		max(1, (data->bFitToScreenMode? wnd_size.cx : lpsz->cx) / COLNO);
+	data->yScrTile = 
+		max(1, (data->bFitToScreenMode? wnd_size.cy : lpsz->cy) / ROWNO);
 
 	/* set map origin point */
 	data->map_orig.x = max(0, client_rt.left + (wnd_size.cx - data->xScrTile*COLNO)/2 );
@@ -157,12 +160,18 @@
 	lgfnt.lfItalic			=	FALSE;				 // italic attribute option
 	lgfnt.lfUnderline		=	FALSE;				 // underline attribute option
 	lgfnt.lfStrikeOut		=	FALSE;			     // strikeout attribute option
-	lgfnt.lfCharSet			=	OEM_CHARSET;         // character set identifier
+	lgfnt.lfCharSet			=	mswin_charset();     // character set identifier
 	lgfnt.lfOutPrecision	=	OUT_DEFAULT_PRECIS;  // output precision
 	lgfnt.lfClipPrecision	=	CLIP_DEFAULT_PRECIS; // clipping precision
 	lgfnt.lfQuality			=	DEFAULT_QUALITY;     // output quality
-	lgfnt.lfPitchAndFamily	=	FIXED_PITCH;		 // pitch and family
-	_tcscpy(lgfnt.lfFaceName, NHMAP_FONT_NAME);
+	if( iflags.wc_font_map &&
+		*iflags.wc_font_map ) {
+		lgfnt.lfPitchAndFamily	= DEFAULT_PITCH;		 // pitch and family
+		NH_A2W(iflags.wc_font_map, lgfnt.lfFaceName, LF_FACESIZE);
+	} else {
+		lgfnt.lfPitchAndFamily	= FIXED_PITCH;		 // pitch and family
+		NH_A2W(NHMAP_FONT_NAME, lgfnt.lfFaceName, LF_FACESIZE);
+	}
 	data->hMapFont = CreateFontIndirect(&lgfnt);
 
 	mswin_cliparound(data->xCur, data->yCur);
@@ -418,6 +427,7 @@
 			( msg_data->y<(data->yPos+mcam) ||
 			  msg_data->y>(data->yPos+data->yPageSize-mcam) );
 		
+		mcam += iflags.wc_scroll_amount - 1;
 		/* get page size and center horizontally on x-position */
 		if( scroll_x ) {
 			if( data->xPageSize<=2*mcam ) {
@@ -555,12 +565,13 @@
 				unsigned special;
 				int mgch;
 				HBRUSH back_brush;
+				COLORREF OldFg;
 
 				nhcoord2display(data, i, j, &glyph_rect);
 
 #if (VERSION_MAJOR < 4) && (VERSION_MINOR < 4) && (PATCHLEVEL < 2)
 				nhglyph2charcolor(data->map[i][j], &ch, &color);
-				SetTextColor (hDC, nhcolor_to_RGB(color) );
+				OldFg = SetTextColor (hDC, nhcolor_to_RGB(color) );
 #else
 				/* rely on NetHack core helper routine */
 				mapglyph(data->map[i][j], &mgch, &color,
@@ -568,13 +579,20 @@
 				ch = (char)mgch;
 				if (((special & MG_PET) && iflags.hilite_pet) ||
 				    ((special & MG_DETECT) && iflags.use_inverse)) {
-					back_brush = CreateSolidBrush(RGB(192, 192, 192));
+					back_brush = CreateSolidBrush(nhcolor_to_RGB(CLR_GRAY));
 					FillRect (hDC, &glyph_rect, back_brush);
 					DeleteObject (back_brush);
-					SetTextColor( hDC,  RGB(0, 0, 0) );
-				} else
-				{
-					SetTextColor (hDC, nhcolor_to_RGB(color) );
+					switch (color)
+					{
+					case CLR_GRAY:
+					case CLR_WHITE:
+						OldFg = SetTextColor( hDC,  nhcolor_to_RGB(CLR_BLACK));
+						break;
+					default:
+						OldFg = SetTextColor (hDC, nhcolor_to_RGB(color) );
+					}
+				} else {
+					OldFg = SetTextColor (hDC, nhcolor_to_RGB(color) );
 				}
 #endif
 
@@ -584,6 +602,7 @@
 						 &glyph_rect,
 						 DT_CENTER | DT_VCENTER | DT_NOPREFIX
 						 );
+				SetTextColor (hDC, OldFg);
 			}
 			SelectObject(hDC, oldFont);
 		} else {
@@ -871,84 +890,87 @@
 
 /* apply bitmap pointed by sourceDc transparently over 
    bitmap pointed by hDC */
+
+typedef BOOL (WINAPI* LPTRANSPARENTBLT)(HDC, int, int, int, int, HDC, int, int, int, int, UINT); 
 void nhapply_image_transparent( 
 	HDC hDC, int x, int y, int width, int height,
 	HDC sourceDC, int s_x, int s_y, int s_width, int s_height,
 	COLORREF cTransparent
 )
 {
-	HDC        hdcMem, hdcBack, hdcObject, hdcSave;
-	COLORREF   cColor;
-	HBITMAP    bmAndBack, bmAndObject, bmAndMem, bmSave;
-	HBITMAP    bmBackOld, bmObjectOld, bmMemOld, bmSaveOld;
+    /* Don't use TransparentBlt; According to Microsoft, it contains a memory leak in Window 95/98. */
+		HDC        hdcMem, hdcBack, hdcObject, hdcSave;
+		COLORREF   cColor;
+		HBITMAP    bmAndBack, bmAndObject, bmAndMem, bmSave;
+		HBITMAP    bmBackOld, bmObjectOld, bmMemOld, bmSaveOld;
 
-	/* Create some DCs to hold temporary data. */
-	hdcBack   = CreateCompatibleDC(hDC);
-	hdcObject = CreateCompatibleDC(hDC);
-	hdcMem    = CreateCompatibleDC(hDC);
-	hdcSave   = CreateCompatibleDC(hDC);
+		/* Create some DCs to hold temporary data. */
+		hdcBack   = CreateCompatibleDC(hDC);
+		hdcObject = CreateCompatibleDC(hDC);
+		hdcMem    = CreateCompatibleDC(hDC);
+		hdcSave   = CreateCompatibleDC(hDC);
 
-	/* this is bitmap for our pet image */
-	bmSave = CreateCompatibleBitmap(hDC, s_width, s_height);
+		/* this is bitmap for our pet image */
+		bmSave = CreateCompatibleBitmap(hDC, width, height);
 
-	/* Monochrome DC */
-	bmAndBack   = CreateBitmap(s_width, s_height, 1, 1, NULL);
-	bmAndObject = CreateBitmap(s_width, s_height, 1, 1, NULL);
+		/* Monochrome DC */
+		bmAndBack   = CreateBitmap(width, height, 1, 1, NULL);
+		bmAndObject = CreateBitmap(width, height, 1, 1, NULL);
 
-	/* resulting bitmap */
-	bmAndMem    = CreateCompatibleBitmap(hDC, s_width, s_height);
+		/* resulting bitmap */
+		bmAndMem    = CreateCompatibleBitmap(hDC, width, height);
 
-	/* Each DC must select a bitmap object to store pixel data. */
-	bmBackOld   = SelectObject(hdcBack, bmAndBack);
-	bmObjectOld = SelectObject(hdcObject, bmAndObject);
-	bmMemOld    = SelectObject(hdcMem, bmAndMem);
-	bmSaveOld   = SelectObject(hdcSave, bmSave);
+		/* Each DC must select a bitmap object to store pixel data. */
+		bmBackOld   = SelectObject(hdcBack, bmAndBack);
+		bmObjectOld = SelectObject(hdcObject, bmAndObject);
+		bmMemOld    = SelectObject(hdcMem, bmAndMem);
+		bmSaveOld   = SelectObject(hdcSave, bmSave);
 
-	/* copy source image because it is going to be overwritten */
-	BitBlt(hdcSave, 0, 0, s_width, s_height, sourceDC, s_x, s_y, SRCCOPY);
+		/* copy source image because it is going to be overwritten */
+		StretchBlt(hdcSave, 0, 0, width, height, sourceDC, s_x, s_y, s_width, s_height, SRCCOPY);
 
-	/* Set the background color of the source DC to the color.
-	   contained in the parts of the bitmap that should be transparent */
-	cColor = SetBkColor(hdcSave, cTransparent);
+		/* Set the background color of the source DC to the color.
+		   contained in the parts of the bitmap that should be transparent */
+		cColor = SetBkColor(hdcSave, cTransparent);
 
-	/* Create the object mask for the bitmap by performing a BitBlt
-	   from the source bitmap to a monochrome bitmap. */
-	BitBlt(hdcObject, 0, 0, s_width, s_height, hdcSave, 0, 0, SRCCOPY);
+		/* Create the object mask for the bitmap by performing a BitBlt
+		   from the source bitmap to a monochrome bitmap. */
+		BitBlt(hdcObject, 0, 0, width, height, hdcSave, 0, 0, SRCCOPY);
 
-	/* Set the background color of the source DC back to the original
-	   color. */
-	SetBkColor(hdcSave, cColor);
+		/* Set the background color of the source DC back to the original
+		   color. */
+		SetBkColor(hdcSave, cColor);
 
-	/* Create the inverse of the object mask. */
-	BitBlt(hdcBack, 0, 0, s_width, s_height, hdcObject, 0, 0, NOTSRCCOPY);
+		/* Create the inverse of the object mask. */
+		BitBlt(hdcBack, 0, 0, width, height, hdcObject, 0, 0, NOTSRCCOPY);
 
-	/* Copy background to the resulting image  */
-	StretchBlt(hdcMem, 0, 0, s_width, s_height, hDC, x, y, width, height, SRCCOPY);
+		/* Copy background to the resulting image  */
+		BitBlt(hdcMem, 0, 0, width, height, hDC, x, y, SRCCOPY);
 
-	/* Mask out the places where the source image will be placed. */
-	BitBlt(hdcMem, 0, 0, s_width, s_height, hdcObject, 0, 0, SRCAND);
+		/* Mask out the places where the source image will be placed. */
+		BitBlt(hdcMem, 0, 0, width, height, hdcObject, 0, 0, SRCAND);
 
-	/* Mask out the transparent colored pixels on the source image. */
-	BitBlt(hdcSave, 0, 0, s_width, s_height, hdcBack, 0, 0, SRCAND);
+		/* Mask out the transparent colored pixels on the source image. */
+		BitBlt(hdcSave, 0, 0, width, height, hdcBack, 0, 0, SRCAND);
 
-	/* XOR the source image with the beckground. */
-	BitBlt(hdcMem, 0, 0, s_width, s_height, hdcSave, 0, 0, SRCPAINT);
+		/* XOR the source image with the beckground. */
+		BitBlt(hdcMem, 0, 0, width, height, hdcSave, 0, 0, SRCPAINT);
 
-	/* blt resulting image to the screen */
-	StretchBlt( 
-		hDC, 
-		x, y, width, height, hdcMem,
-		0, 0, s_width, s_height, SRCCOPY 
-	);
+		/* blt resulting image to the screen */
+		BitBlt( 
+			hDC, 
+			x, y, width, height, hdcMem,
+			0, 0, SRCCOPY 
+		);
 
-	/* cleanup */
-	DeleteObject(SelectObject(hdcBack, bmBackOld));
-	DeleteObject(SelectObject(hdcObject, bmObjectOld));
-	DeleteObject(SelectObject(hdcMem, bmMemOld));
-	DeleteObject(SelectObject(hdcSave, bmSaveOld));
+		/* cleanup */
+		DeleteObject(SelectObject(hdcBack, bmBackOld));
+		DeleteObject(SelectObject(hdcObject, bmObjectOld));
+		DeleteObject(SelectObject(hdcMem, bmMemOld));
+		DeleteObject(SelectObject(hdcSave, bmSaveOld));
 
-	DeleteDC(hdcMem);
-	DeleteDC(hdcBack);
-	DeleteDC(hdcObject);
-	DeleteDC(hdcSave);
+		DeleteDC(hdcMem);
+		DeleteDC(hdcBack);
+		DeleteDC(hdcObject);
+		DeleteDC(hdcSave);
 }
diff -Naurd ../nethack-3.4.0/win/win32/mhmap.h ./win/win32/mhmap.h
--- ../nethack-3.4.0/win/win32/mhmap.h Wed Mar 20 23:44:23 2002
+++ ./win/win32/mhmap.h Mon Feb 24 15:25:05 2003
@@ -16,5 +16,6 @@
 #define ROGUE_LEVEL_MAP_MODE		MAP_MODE_ASCII12x16	
 
 #define DEF_CLIPAROUND_MARGIN  5
+#define DEF_CLIPAROUND_AMOUNT  1
 
 #endif /* MSWINMapWindow_h */
diff -Naurd ../nethack-3.4.0/win/win32/mhmenu.c ./win/win32/mhmenu.c
--- ../nethack-3.4.0/win/win32/mhmenu.c Wed Mar 20 23:44:23 2002
+++ ./win/win32/mhmenu.c Mon Feb 24 15:25:05 2003
@@ -9,20 +9,28 @@
 #include "mhmain.h"
 #include "mhmsg.h"
 #include "mhfont.h"
+#include "mhdlg.h"
 
-#define MENU_MARGIN			0
-#define NHMENU_STR_SIZE     BUFSZ
-#define MIN_TABSTOP_SIZE	8
+#define MENU_MARGIN		0
+#define NHMENU_STR_SIZE		BUFSZ
+#define MIN_TABSTOP_SIZE	0
+#define NUMTABS			15
+#define TAB_SEPARATION		10 /* pixels between each tab stop */
+
+#define DEFAULT_COLOR_BG_TEXT	COLOR_WINDOW
+#define DEFAULT_COLOR_FG_TEXT	COLOR_WINDOWTEXT
+#define DEFAULT_COLOR_BG_MENU	COLOR_WINDOW
+#define DEFAULT_COLOR_FG_MENU	COLOR_WINDOWTEXT
 
 typedef struct mswin_menu_item {
-	int				glyph;
+	int			glyph;
 	ANY_P			identifier;
-	CHAR_P			accelerator;
-	CHAR_P			group_accel;
-	int				attr;
+	CHAR_P		accelerator;
+	CHAR_P		group_accel;
+	int			attr;
 	char			str[NHMENU_STR_SIZE];
 	BOOLEAN_P		presel;
-	int				count;
+	int			count;
 	BOOL			has_focus;
 } NHMenuItem, *PNHMenuItem;
 
@@ -32,13 +40,13 @@
 
 	union {
 		struct menu_list {
-			int				 size;			/* number of items in items[] */
-			int				 allocated;		/* number of allocated slots in items[] */
+			int			 size;			/* number of items in items[] */
+			int			 allocated;			/* number of allocated slots in items[] */
 			PNHMenuItem		 items;			/* menu items */
-			char			 gacc[QBUFSZ];	/* group accelerators */
-			BOOL			 counting;		/* counting flag */
-			char			 prompt[QBUFSZ]; /* menu prompt */
-			int				 tab_stop_size; /* for options menu we use tabstops to align option values */
+			char			 gacc[QBUFSZ];		/* group accelerators */
+			BOOL			 counting;			/* counting flag */
+			char			 prompt[QBUFSZ]; 		/* menu prompt */
+			int			 tab_stop_size[NUMTABS];/* tabstops to align option values */
 		} menu;
 
 		struct menu_text {
@@ -95,7 +103,6 @@
 /*-----------------------------------------------------------------------------*/
 int mswin_menu_window_select_menu (HWND hWnd, int how, MENU_ITEM_P ** _selected)
 {
-	MSG msg;
 	PNHMenuWindow data;
 	int ret_val;
     MENU_ITEM_P *selected = NULL;
@@ -133,8 +140,10 @@
 
 				next_char ++;
 			}
+		}
 
-			/* collect group accelerators */
+		/* collect group accelerators */
+		for( i=0; i<data->menu.size;  i++) {
 			if( data->how != PICK_NONE ) {
 				if( data->menu.items[i].group_accel && 
 					!strchr(data->menu.gacc, data->menu.items[i].group_accel) ) {
@@ -147,28 +156,7 @@
 		reset_menu_count(NULL, data);
 	}
 
-	/* activate the menu window */
-	GetNHApp()->hPopupWnd = hWnd;
-
-	mswin_layout_main_window(hWnd);
-
-	/* disable game windows */
-	EnableWindow(mswin_hwnd_from_winid(WIN_MAP), FALSE);
-	EnableWindow(mswin_hwnd_from_winid(WIN_MESSAGE), FALSE);
-	EnableWindow(mswin_hwnd_from_winid(WIN_STATUS), FALSE);
-
-	/* bring menu window on top */
-	SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
-
-	/* go into message loop */
-	while( IsWindow(hWnd) && 
-		   !data->done &&
-		   GetMessage(&msg, NULL, 0, 0)!=0 ) {
-		if( !IsDialogMessage(hWnd, &msg) ) {
-			TranslateMessage(&msg);
-			DispatchMessage(&msg);
-		}
-	}
+	mswin_popup_display(hWnd, &data->done);
 
 	/* get the result */
 	if( data->result != -1 ) {
@@ -205,19 +193,7 @@
 		}
 	}
 
-	/* restore window state */
-	EnableWindow(mswin_hwnd_from_winid(WIN_MAP), TRUE);
-	EnableWindow(mswin_hwnd_from_winid(WIN_MESSAGE), TRUE);
-	EnableWindow(mswin_hwnd_from_winid(WIN_STATUS), TRUE);
-
-	SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW);
-	GetNHApp()->hPopupWnd = NULL;
-	mswin_window_mark_dead( mswin_winid_from_handle(hWnd) );
-	DestroyWindow(hWnd);
-
-	mswin_layout_main_window(hWnd);
-
-	SetFocus(GetNHApp()->hMainWnd );
+	mswin_popup_destroy(hWnd);
 
 	return ret_val;
 }
@@ -416,6 +392,21 @@
 		else
 			return FALSE;
 
+	case WM_CTLCOLORSTATIC: { /* sent by edit control before it is drawn */
+		HDC hdcEdit = (HDC) wParam; 
+		HWND hwndEdit = (HWND) lParam;
+		if( hwndEdit == GetDlgItem(hWnd, IDC_MENU_TEXT) ) {
+			SetBkColor(hdcEdit, 
+				text_bg_brush ? text_bg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_BG_TEXT)
+				);
+			SetTextColor(hdcEdit, 
+				text_fg_brush ? text_fg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_FG_TEXT) 
+				); 
+			return (BOOL)(text_bg_brush 
+					? text_bg_brush : SYSCLR_TO_BRUSH(DEFAULT_COLOR_BG_TEXT));
+		}
+	} return FALSE;
+
 	case WM_DESTROY:
 		if( data ) {
 			DeleteObject(data->bmpChecked);
@@ -467,6 +458,8 @@
 	} break;
 
 	case MSNH_MSG_STARTMENU:
+	{
+		int i;
 		if( data->type!=MENU_TYPE_MENU )
 			SetMenuType(hWnd, MENU_TYPE_MENU);
 
@@ -477,14 +470,18 @@
 		data->menu.allocated = 0;
 		data->done = 0;
 		data->result = 0;
-		data->menu.tab_stop_size = MIN_TABSTOP_SIZE;
-	break;
+		for (i = 0; i < NUMTABS; ++i)
+			data->menu.tab_stop_size[i] = MIN_TABSTOP_SIZE;
+	} break;
 
 	case MSNH_MSG_ADDMENU:
 	{
 		PMSNHMsgAddMenu msg_data = (PMSNHMsgAddMenu)lParam;
 		char *p, *p1;
 		int new_item;
+		HDC hDC;
+		int column;
+		HFONT saveFont;
 		
 		if( data->type!=MENU_TYPE_MENU ) break;
 		if( strlen(msg_data->str)==0 ) break;
@@ -505,14 +502,33 @@
 		data->menu.items[new_item].presel = msg_data->presel;
 
 		/* calculate tabstop size */
+		hDC = GetDC(hWnd);
+		saveFont = SelectObject(hDC, mswin_get_font(NHW_MENU, msg_data->attr, hDC, FALSE));
 		p1 = data->menu.items[new_item].str;
 		p = strchr(data->menu.items[new_item].str, '\t');
-		while( p ) {
-			data->menu.tab_stop_size = 
-				max( data->menu.tab_stop_size, p - p1 + 1 );
-			p1 = p;
-			p = strchr(p+1, '\t');
+		column = 0;
+		for (;;) {
+			TCHAR wbuf[BUFSZ];
+			RECT drawRect;
+			SetRect ( &drawRect, 0, 0, 1, 1 );
+			if (p != NULL) *p = '\0'; /* for time being, view tab field as zstring */
+			DrawText(hDC,
+				NH_A2W(p1, wbuf, BUFSZ),
+				strlen(p1),
+				&drawRect,
+				DT_CALCRECT | DT_LEFT | DT_VCENTER | DT_EXPANDTABS | DT_SINGLELINE
+			);
+			data->menu.tab_stop_size[column] =
+				max( data->menu.tab_stop_size[column], drawRect.right - drawRect.left );
+			if (p != NULL) *p = '\t';
+			else /* last string so, */ break;
+
+			++column;
+			p1 = p + 1;
+			p = strchr(p1, '\t');
 		}
+		SelectObject(hDC, saveFont);
+		ReleaseDC(hWnd, hDC);
 
 		/* increment size */
 		data->menu.size++;
@@ -656,6 +672,14 @@
 	wndProcListViewOrig = (WNDPROC)GetWindowLong(control, GWL_WNDPROC);
 	SetWindowLong(control, GWL_WNDPROC, (LONG)NHMenuListWndProc);
 
+	/* set control colors */
+	ListView_SetBkColor(control, 
+		menu_bg_brush ? menu_bg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_BG_MENU));
+	ListView_SetTextBkColor(control, 
+		menu_bg_brush ? menu_bg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_BG_MENU));
+	ListView_SetTextColor(control, 
+		menu_fg_brush ? menu_fg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_FG_MENU));
+
 	/* set control font */
 	fnt = SendMessage(hWnd, WM_GETFONT, (WPARAM)0, (LPARAM)0);
 	SendMessage(control, WM_SETFONT, (WPARAM)fnt, (LPARAM)0);
@@ -728,10 +752,10 @@
 /*-----------------------------------------------------------------------------*/
 BOOL onDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
 {
-    LPDRAWITEMSTRUCT lpdis; 
+	LPDRAWITEMSTRUCT lpdis;
 	PNHMenuItem item;
 	PNHMenuWindow data;
-    TEXTMETRIC tm;
+	TEXTMETRIC tm;
 	HGDIOBJ saveFont;
 	HDC tileDC;
 	short ntile;
@@ -739,7 +763,9 @@
 	int x, y;
 	TCHAR wbuf[BUFSZ];
 	RECT drawRect;
-	DRAWTEXTPARAMS dtp;
+	COLORREF OldBg, OldFg, NewBg;
+	char *p, *p1;
+	int column;
 
 	lpdis = (LPDRAWITEMSTRUCT) lParam; 
 
@@ -752,26 +778,37 @@
 
 	tileDC = CreateCompatibleDC(lpdis->hDC);
 	saveFont = SelectObject(lpdis->hDC, mswin_get_font(NHW_MENU, item->attr, lpdis->hDC, FALSE));
+	NewBg = menu_bg_brush ? menu_bg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_BG_MENU);
+	OldBg = SetBkColor(lpdis->hDC, NewBg);
+	OldFg = SetTextColor(lpdis->hDC, 
+		menu_fg_brush ? menu_fg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_FG_MENU)); 
+
     GetTextMetrics(lpdis->hDC, &tm);
 
 	x = lpdis->rcItem.left + 1;
 
-	/* print check mark */
+    /* print check mark and letter */
 	if( NHMENU_IS_SELECTABLE(*item) ) {
-		HGDIOBJ saveBmp;
-		char buf[2];
+ char buf[2];
+ if (data->how != PICK_NONE) {
+		HGDIOBJ saveBrush;
+		HBRUSH	hbrCheckMark;
 
 		switch(item->count) {
-		case -1: saveBmp = SelectObject(tileDC, data->bmpChecked); break;
-		case 0: saveBmp = SelectObject(tileDC, data->bmpNotChecked); break;
-		default: saveBmp = SelectObject(tileDC, data->bmpCheckedCount); break;
+		case -1: hbrCheckMark = CreatePatternBrush(data->bmpChecked); break;
+		case 0: hbrCheckMark = CreatePatternBrush(data->bmpNotChecked); break;
+		default: hbrCheckMark = CreatePatternBrush(data->bmpCheckedCount); break;
 		}
 
 		y = (lpdis->rcItem.bottom + lpdis->rcItem.top - TILE_Y) / 2; 
-		BitBlt(lpdis->hDC, x, y, TILE_X, TILE_Y, tileDC, 0, 0, SRCCOPY );
+		SetBrushOrgEx(lpdis->hDC, x, y, NULL);
+		saveBrush = SelectObject(lpdis->hDC, hbrCheckMark);
+		PatBlt(lpdis->hDC, x, y, TILE_X, TILE_Y, PATCOPY);
+		SelectObject(lpdis->hDC, saveBrush);
+		DeleteObject(hbrCheckMark);
 
+ }
 		x += TILE_X + 5;
-
 		if(item->accelerator!=0) {
 			buf[0] = item->accelerator;
 			buf[1] = '\x0';
@@ -780,7 +817,6 @@
 			DrawText(lpdis->hDC, NH_A2W(buf, wbuf, 2), 1, &drawRect, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX);
 		}
 		x += tm.tmAveCharWidth + tm.tmOverhang + 5;
-		SelectObject(tileDC, saveBmp);
 	} else {
 		x += TILE_X + tm.tmAveCharWidth + tm.tmOverhang + 10;
 	}
@@ -805,21 +841,35 @@
 	x += TILE_X + 5;
 
 	/* draw item text */
-	SetRect( &drawRect, x, lpdis->rcItem.top, lpdis->rcItem.right, lpdis->rcItem.bottom );
 
-	ZeroMemory(&dtp, sizeof(dtp));
-	dtp.cbSize = sizeof(dtp);
-	dtp.iTabLength = max(MIN_TABSTOP_SIZE, data->menu.tab_stop_size);
-	DrawTextEx(lpdis->hDC, 
-		NH_A2W(item->str, wbuf, BUFSZ), 
-		strlen(item->str),
-		&drawRect, 
-		DT_LEFT | DT_VCENTER | DT_EXPANDTABS | DT_SINGLELINE | DT_TABSTOP, 
-		&dtp
-	); 
+	p1 = item->str;
+	p = strchr(item->str, '\t');
+	column = 0;
+	SetRect( &drawRect, x, lpdis->rcItem.top, min(x + data->menu.tab_stop_size[0], lpdis->rcItem.right),
+	    lpdis->rcItem.bottom );
+	for (;;) {
+		TCHAR wbuf[BUFSZ];
+		if (p != NULL) *p = '\0'; /* for time being, view tab field as zstring */
+		DrawText(lpdis->hDC,
+			NH_A2W(p1, wbuf, BUFSZ),
+			strlen(p1),
+			&drawRect,
+			DT_LEFT | DT_VCENTER | DT_SINGLELINE
+		);
+		if (p != NULL) *p = '\t';
+		else /* last string so, */ break;
+
+		p1 = p + 1;
+		p = strchr(p1, '\t');
+		drawRect.left = drawRect.right + TAB_SEPARATION;
+		++column;
+		drawRect.right = min (drawRect.left + data->menu.tab_stop_size[column], lpdis->rcItem.right);
+	}
 
 	/* draw focused item */
-	if( item->has_focus ) {
+	if( item->has_focus 
+        || (NHMENU_IS_SELECTABLE(*item) && 
+			data->menu.items[lpdis->itemID].count!=-1)) {
 		RECT client_rt;
 
 		GetClientRect(lpdis->hwndItem, &client_rt);
@@ -844,18 +894,25 @@
 			drawRect.right = client_rt.right-1;
 			drawRect.top = lpdis->rcItem.top;
 			drawRect.bottom = lpdis->rcItem.bottom;
-			FillRect(lpdis->hDC, &drawRect, (HBRUSH)GetClassLong(lpdis->hwndItem, GCL_HBRBACKGROUND) );
+			FillRect(lpdis->hDC, &drawRect, 
+					 menu_bg_brush ? menu_bg_brush : SYSCLR_TO_BRUSH(DEFAULT_COLOR_BG_MENU));
 
 			/* draw text */
 			DrawText(lpdis->hDC, wbuf, _tcslen(wbuf), &drawRect, 
 					 DT_RIGHT | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX );
 		}
-
+    }
+    if (item->has_focus) {
 		/* draw focus rect */
+		RECT client_rt;
+
+		GetClientRect(lpdis->hwndItem, &client_rt);
 		SetRect( &drawRect, client_rt.left, lpdis->rcItem.top, client_rt.right, lpdis->rcItem.bottom );
 		DrawFocusRect(lpdis->hDC, &drawRect);
 	}
 
+	SetTextColor (lpdis->hDC, OldFg);
+	SetBkColor (lpdis->hDC, OldBg);
 	SelectObject(lpdis->hDC, saveFont);
 	DeleteDC(tileDC);
 	return TRUE;
@@ -997,7 +1054,10 @@
 			char buf[BUFSZ];
 			
 			reset_menu_count(hwndList, data);
-			mswin_getlin("Search for:", buf);
+			if( mswin_getlin_window("Search for:", buf, BUFSZ)==IDCANCEL ) {
+				strcpy(buf, "\033");
+			}
+			SetFocus(hwndList);	// set focus back to the list control
 			if (!*buf || *buf == '\033') return -2;
 			for(i=0; i<data->menu.size; i++ ) {
 				if( NHMENU_IS_SELECTABLE(data->menu.items[i])
@@ -1183,13 +1243,16 @@
 	HDC hdc;
 	PNHMenuWindow data;
 	int i;
-	RECT rt;
-	TCHAR wbuf[BUFSZ];
+	RECT rt, wrt;
+	int extra_cx;
 
 	GetClientRect(hWnd, &rt);
 	sz->cx = rt.right - rt.left;
 	sz->cy = rt.bottom - rt.top;
 
+	GetWindowRect(hWnd, &wrt);
+	extra_cx = (wrt.right-wrt.left) - sz->cx;
+
 	data = (PNHMenuWindow)GetWindowLong(hWnd, GWL_USERDATA);
 	if(data) {
 		control = GetMenuControl(hWnd);
@@ -1200,23 +1263,41 @@
 			saveFont = SelectObject(hdc, mswin_get_font(NHW_MENU, ATR_NONE, hdc, FALSE));
 			GetTextMetrics(hdc, &tm);
 			for(i=0; i<data->menu.size; i++ ) {
-				DRAWTEXTPARAMS dtp;
-				RECT drawRect;
+				LONG menuitemwidth = 0;
+				int column;
+				char *p, *p1;
 
-				SetRect(&drawRect, 0, 0, 1, 1);
-				ZeroMemory(&dtp, sizeof(dtp));
-				dtp.cbSize = sizeof(dtp);
-				dtp.iTabLength = max(MIN_TABSTOP_SIZE, data->menu.tab_stop_size);
-				DrawTextEx(hdc, 
-					NH_A2W(data->menu.items[i].str, wbuf, BUFSZ), 
-					strlen(data->menu.items[i].str),
-					&drawRect, 
-					DT_CALCRECT | DT_LEFT | DT_VCENTER | DT_EXPANDTABS | DT_SINGLELINE | DT_TABSTOP, 
-					&dtp
-				); 
+				p1 = data->menu.items[i].str;
+				p = strchr(data->menu.items[i].str, '\t');
+				column = 0;
+				for (;;) {
+					TCHAR wbuf[BUFSZ];
+					RECT tabRect;
+					SetRect ( &tabRect, 0, 0, 1, 1 );
+					if (p != NULL) *p = '\0'; /* for time being, view tab field as zstring */
+					DrawText(hdc,
+						NH_A2W(p1, wbuf, BUFSZ),
+						strlen(p1),
+						&tabRect,
+						DT_CALCRECT | DT_LEFT | DT_VCENTER | DT_SINGLELINE
+					);
+					/* it probably isn't necessary to recompute the tab width now, but do so
+					 * just in case, honoring the previously computed value
+					 */
+					menuitemwidth += max(data->menu.tab_stop_size[column],
+					    tabRect.right - tabRect.left);
+					if (p != NULL) *p = '\t';
+					else /* last string so, */ break;
+					/* add the separation only when not the last item */
+					/* in the last item, we break out of the loop, in the statement just above */
+					menuitemwidth += TAB_SEPARATION;
+					++column;
+					p1 = p + 1;
+					p = strchr(p1, '\t');
+				}
 
 				sz->cx = max(sz->cx, 
-					(LONG)(2*TILE_X + (drawRect.right - drawRect.left) + tm.tmAveCharWidth*12 + tm.tmOverhang));
+					(LONG)(2*TILE_X + menuitemwidth + tm.tmAveCharWidth*12 + tm.tmOverhang));
 			}
 			SelectObject(hdc, saveFont);
 		} else {
@@ -1229,7 +1310,7 @@
 			sz->cx = max(sz->cx, text_rt.right - text_rt.left + 5*tm.tmAveCharWidth + tm.tmOverhang);
 			SelectObject(hdc, saveFont);
 		}
-		sz->cx += GetSystemMetrics(SM_CXVSCROLL) + 2*GetSystemMetrics(SM_CXSIZEFRAME);
+		sz->cx += extra_cx;
 
 		ReleaseDC(control, hdc);
 	}
diff -Naurd ../nethack-3.4.0/win/win32/mhmsg.h ./win/win32/mhmsg.h
--- ../nethack-3.4.0/win/win32/mhmsg.h Wed Mar 20 23:44:23 2002
+++ ./win/win32/mhmsg.h Mon Feb 24 15:25:05 2003
@@ -17,6 +17,7 @@
 #define MSNH_MSG_CURSOR			107
 #define MSNH_MSG_ENDMENU		108
 #define MSNH_MSG_DIED			109
+#define MSNH_MSG_CARET			110
 
 typedef struct mswin_nhmsg_add_wnd {
   winid		  wid;
diff -Naurd ../nethack-3.4.0/win/win32/mhmsgwnd.c ./win/win32/mhmsgwnd.c
--- ../nethack-3.4.0/win/win32/mhmsgwnd.c Wed Mar 20 23:44:24 2002
+++ ./win/win32/mhmsgwnd.c Mon Feb 24 15:25:05 2003
@@ -11,11 +11,13 @@
 #define MSG_VISIBLE_LINES     max(iflags.wc_vary_msgcount, 2)
 #define MAX_MSG_LINES		  32
 #define MSG_LINES			  (int)min(iflags.msg_history, MAX_MSG_LINES)
-#define MAXWINDOWTEXT		  200
+#define MAXWINDOWTEXT		  TBUFSZ
 
 #define DEFAULT_COLOR_BG_MSG	COLOR_WINDOW
 #define DEFAULT_COLOR_FG_MSG	COLOR_WINDOWTEXT
 
+#define MORE "--More--"
+
 struct window_line {
 	int  attr;
 	char text[MAXWINDOWTEXT];
@@ -24,6 +26,16 @@
 typedef struct mswin_nethack_message_window {
 	size_t max_text;
 	struct window_line window_text[MAX_MSG_LINES];
+#ifdef MSG_WRAP_TEXT
+    int  window_text_lines[MAX_MSG_LINES]; /* How much space this text line takes */
+#endif
+    int  lines_last_turn; /* lines added during the last turn */
+    int  cleared;     /* clear was called */
+    int  last_line;   /* last line in the message history */
+    struct window_line new_line;
+    int  lines_not_seen;  /* lines not yet seen by user after last turn or --More-- */
+    int  in_more;   /* We are in a --More-- prompt */
+    int  nevermore;   /* We want no more --More-- prompts */
 
 	int  xChar;       /* horizontal scrolling unit */
 	int  yChar;       /* vertical scrolling unit */
@@ -43,9 +55,13 @@
 #ifndef MSG_WRAP_TEXT
 static void onMSNH_HScroll(HWND hWnd, WPARAM wParam, LPARAM lParam);
 #endif
+static COLORREF setMsgTextColor(HDC hdc, int gray);
 static void onPaint(HWND hWnd);
 static void onCreate(HWND hWnd, WPARAM wParam, LPARAM lParam);
-static HDC prepareDC( HDC hdc );
+
+#ifdef USER_SOUNDS
+extern void play_sound_for_message(const char* str);
+#endif
 
 HWND mswin_init_message_window () {
 	static int run_once = 0;
@@ -168,14 +184,14 @@
 			SetScrollInfo(hWnd, SB_HORZ, &si, TRUE); 
 #endif
 		
-			data->yMax = MSG_LINES - MSG_VISIBLE_LINES - 1;
+			data->yMax = MSG_LINES-1;
  			data->yPos = min(data->yPos, data->yMax);
 
 			ZeroMemory(&si, sizeof(si));
 			si.cbSize = sizeof(si); 
 			si.fMask  = SIF_RANGE | SIF_PAGE | SIF_POS; 
-			si.nMin   = 0; 
-			si.nMax   = MSG_LINES; 
+			si.nMin   = MSG_VISIBLE_LINES; 
+			si.nMax   = data->yMax + MSG_VISIBLE_LINES - 1; 
 			si.nPage  = MSG_VISIBLE_LINES;
 			si.nPos   = data->yPos;
 			SetScrollInfo(hWnd, SB_VERT, &si, TRUE); 
@@ -199,25 +215,22 @@
 	{
 		PMSNHMsgPutstr msg_data = (PMSNHMsgPutstr)lParam;
 		SCROLLINFO si;
-		char* p;
-
-		if( msg_data->append ) {
-			strncat(data->window_text[MSG_LINES-1].text, msg_data->text, 
-				    MAXWINDOWTEXT - strlen(data->window_text[MSG_LINES-1].text));
-		} else {
-			/* check if the string is empty */
-			for(p = data->window_text[MSG_LINES-1].text; *p && isspace(*p); p++);
-
-			if( *p ) {
-				/* last string is not empty - scroll up */
-				memmove(&data->window_text[0],
-						&data->window_text[1],
-						(MSG_LINES-1)*sizeof(data->window_text[0]));
-			}
 
-			/* append new text to the end of the array */
-			data->window_text[MSG_LINES-1].attr = msg_data->attr;
-			strncpy(data->window_text[MSG_LINES-1].text, msg_data->text, MAXWINDOWTEXT);
+		if( msg_data->append == 1) {
+		    /* Forcibly append to line, even if we pass the edge */
+		    strncat(data->window_text[data->last_line].text, msg_data->text, 
+			    MAXWINDOWTEXT - strlen(data->window_text[data->last_line].text));
+		} else if( msg_data->append < 0) {
+            /* remove that many chars */
+		    int len = strlen(data->window_text[data->last_line].text);
+            int newend = max(len + msg_data->append, 0);
+		    data->window_text[data->last_line].text[newend] = '\0';
+        } else {
+		    /* Try to append but move the whole message to the next line if 
+		       it doesn't fit */
+		    /* just schedule for displaying */
+		    data->new_line.attr = msg_data->attr;
+		    strncpy(data->new_line.text, msg_data->text, MAXWINDOWTEXT);
 		}
 		
 		/* reset V-scroll position to display new text */
@@ -231,21 +244,35 @@
 
 		/* update window content */
 		InvalidateRect(hWnd, NULL, TRUE);
+
+#ifdef USER_SOUNDS
+		play_sound_for_message(msg_data->text);
+#endif
 	}
 	break;
 
 	case MSNH_MSG_CLEAR_WINDOW:
 	{
-		MSNHMsgPutstr data;
-
-		/* append an empty line to the message window (send message to itself) */
-		data.attr = ATR_NONE;
-		data.text = " ";
-		onMSNHCommand(hWnd, (WPARAM)MSNH_MSG_PUTSTR, (LPARAM)&data);
-
-		InvalidateRect(hWnd, NULL, TRUE);
+		data->cleared = 1;
+		data->lines_not_seen = 0;
+		/* do --More-- again if needed */
+		data->nevermore = 0;
 		break;
 	}
+    case MSNH_MSG_CARET:
+        /* Create or destroy a caret */
+        if (*(int *)lParam)
+            CreateCaret(hWnd, NULL, 0, data->yChar);
+	    else {
+            DestroyCaret();
+		/* this means we just did something interactive in this window, so we
+		   don't need a --More-- for the lines above.
+		   */
+		data->lines_not_seen = 0;
+	    }
+        break;
+
+
 	}
 }
 
@@ -305,7 +332,8 @@
 	// of the scroll box, and update the window. UpdateWindow 
 	// sends the WM_PAINT message. 
 
-	if (yInc = max(-data->yPos, min(yInc, data->yMax - data->yPos))) 
+	if (yInc = max( MSG_VISIBLE_LINES - data->yPos, 
+		            min(yInc, data->yMax - data->yPos))) 
 	{ 
 		data->yPos += yInc; 
 		/* ScrollWindowEx(hWnd, 0, -data->yChar * yInc, 
@@ -399,6 +427,31 @@
 }
 #endif // MSG_WRAP_TEXT
 
+COLORREF setMsgTextColor(HDC hdc, int gray)
+{
+    COLORREF fg, color1, color2;
+    if (gray) {
+	if (message_bg_brush) {
+	    color1 = message_bg_color;
+	    color2 = message_fg_color;
+	} else {
+	    color1 = (COLORREF)GetSysColor(DEFAULT_COLOR_BG_MSG);
+	    color2 = (COLORREF)GetSysColor(DEFAULT_COLOR_FG_MSG);
+	}
+	/* Make a "gray" color by taking the average of the individual R,G,B 
+	   components of two colors. Thanks to Jonathan del Strother */
+	fg = RGB((GetRValue(color1)+GetRValue(color2))/2,
+		(GetGValue(color1)+GetGValue(color2))/2,
+		(GetBValue(color1)+GetBValue(color2))/2);
+    } else {
+	fg = message_fg_brush ? message_fg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_FG_MSG);
+    }
+
+
+    return SetTextColor(hdc, fg);
+}
+
+
 void onPaint(HWND hWnd)
 {
 	PAINTSTRUCT ps;
@@ -411,72 +464,223 @@
 	TCHAR wbuf[MAXWINDOWTEXT+2];
 	size_t wlen;
 	COLORREF OldBg, OldFg;
+    int do_more = 0;
 
 	hdc = BeginPaint(hWnd, &ps);
 
 	OldBg = SetBkColor(hdc, message_bg_brush ? message_bg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_BG_MSG));
-	OldFg = SetTextColor(hdc, message_fg_brush ? message_fg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_FG_MSG));
+    OldFg = setMsgTextColor(hdc, 0);
 
 	data = (PNHMessageWindow)GetWindowLong(hWnd, GWL_USERDATA);
 
 	GetClientRect(hWnd, &client_rt);
 
 	if( !IsRectEmpty(&ps.rcPaint) ) {
-		FirstLine = max (0, data->yPos + ps.rcPaint.top/data->yChar - 1); 
-		LastLine = min (MSG_LINES-1, data->yPos + ps.rcPaint.bottom/data->yChar); 
-		y = min( ps.rcPaint.bottom, client_rt.bottom - 2); 
+		FirstLine = max (0, data->yPos - (client_rt.bottom - ps.rcPaint.top)/data->yChar + 1); 
+		LastLine = min (MSG_LINES-1, data->yPos - (client_rt.bottom - ps.rcPaint.bottom)/data->yChar); 
+		y = min( ps.rcPaint.bottom, client_rt.bottom ); 
  		for (i=LastLine; i>=FirstLine; i--) { 
-			if( i==MSG_LINES-1 ) {
+				int lineidx = (data->last_line + 1 + i) % MSG_LINES;
 				x = data->xChar * (2 - data->xPos); 
-			} else {
-				x = data->xChar * (4 - data->xPos); 
-			}
-
-			if( strlen(data->window_text[i].text)>0 ) {
-				/* convert to UNICODE */
-				NH_A2W(data->window_text[i].text, wbuf, sizeof(wbuf));
-				wlen = _tcslen(wbuf);
 
-				/* calculate text height */
 				draw_rt.left = x;
 				draw_rt.right = client_rt.right;
 				draw_rt.top = y - data->yChar;
 				draw_rt.bottom = y;
 
-				oldFont = SelectObject(hdc, mswin_get_font(NHW_MESSAGE, data->window_text[i].attr, hdc, FALSE));
+	    oldFont = SelectObject(hdc, mswin_get_font(NHW_MESSAGE, data->window_text[lineidx].attr, hdc, FALSE));
+
+	    /* find out if we can concatenate the scheduled message without wrapping,
+        but only if no clear_nhwindow was done just before putstr'ing this one,
+        and only if not in a more prompt already (to prevent concatenating to
+        a line containing --More-- when resizing while --More-- is displayed.) 
+	       */
+	    if (i == MSG_LINES-1 
+  && strlen(data->new_line.text) > 0
+  && !data->in_more) {
+		/* concatenate to the previous line if that is not empty, and
+		   if it has the same attribute, and no clear was done.
+		   */
+		if (strlen(data->window_text[lineidx].text) > 0
+			&& (data->window_text[lineidx].attr 
+			    == data->new_line.attr)
+			&& !data->cleared) {
+		    RECT tmpdraw_rt = draw_rt;
+		    /* assume this will never work when textsize is near MAXWINDOWTEXT */
+		    char tmptext[MAXWINDOWTEXT];
+		    TCHAR tmpwbuf[MAXWINDOWTEXT+2];
 
+		    strcpy(tmptext, data->window_text[lineidx].text);
+		    strncat(tmptext, "  ", 
+			    MAXWINDOWTEXT - strlen(tmptext));
+		    strncat(tmptext, data->new_line.text, 
+			    MAXWINDOWTEXT - strlen(tmptext));
+		    /* Always keep room for a --More-- */
+		    strncat(tmptext, MORE, 
+			    MAXWINDOWTEXT - strlen(tmptext));
+		    NH_A2W(tmptext, tmpwbuf, sizeof(tmpwbuf));
+		    /* Find out how large the bounding rectangle of the text is */                
+		    DrawText(hdc, tmpwbuf, _tcslen(tmpwbuf), &tmpdraw_rt, DT_NOPREFIX | DT_WORDBREAK | DT_CALCRECT);
+		    if ((tmpdraw_rt.bottom - tmpdraw_rt.top) == (draw_rt.bottom - draw_rt.top)  /* fits pixelwise */
+			    && (strlen(data->window_text[lineidx].text) 
+				+ strlen(data->new_line.text) < MAXWINDOWTEXT)) /* fits charwise */
+		    {
+			/* strip off --More-- of this combined line and make it so */
+			tmptext[strlen(tmptext) - strlen(MORE)] = '\0';
+			strcpy(data->window_text[lineidx].text, tmptext);
+			data->new_line.text[0] = '\0';
+			i++; /* Start from the last line again */
+			continue;
+		    }
+		}
+		if (strlen(data->new_line.text) > 0) {
+		    /* if we get here, the new line was not concatenated. Add it on a new line,
+		       but first check whether we should --More--. */
+		    RECT tmpdraw_rt = draw_rt;
+		    TCHAR tmpwbuf[MAXWINDOWTEXT+2];
+		    HGDIOBJ oldFont;
+		    int new_screen_lines;
+		    int screen_lines_not_seen = 0;
+		    /* Count how many screen lines we haven't seen yet. */
+#ifdef MSG_WRAP_TEXT				
+		    {
+			int n;
+			for (n = data->lines_not_seen - 1; n >= 0; n--) {
+			    screen_lines_not_seen += 
+				data->window_text_lines[(data->last_line - n + MSG_LINES) % MSG_LINES];
+			}
+		    }
+#else
+		    screen_lines_not_seen = data->lines_not_seen;
+#endif
+		    /* Now find out how many screen lines we would like to add */
+		    NH_A2W(data->new_line.text, tmpwbuf, sizeof(tmpwbuf));
+		    /* Find out how large the bounding rectangle of the text is */                
+		    oldFont = SelectObject(hdc, mswin_get_font(NHW_MESSAGE, data->window_text[lineidx].attr, hdc, FALSE));
+		    DrawText(hdc, tmpwbuf, _tcslen(tmpwbuf), &tmpdraw_rt, DT_NOPREFIX | DT_WORDBREAK | DT_CALCRECT);
+		    SelectObject(hdc, oldFont);
+		    new_screen_lines = (tmpdraw_rt.bottom - tmpdraw_rt.top) / data->yChar;
+		    /* If this together is more than fits on the window, we must 
+		       --More--, unless:
+		       - We are in --More-- already (the user is scrolling the window)
+		       - The user pressed ESC
+		       */
+		    if (screen_lines_not_seen + new_screen_lines > MSG_VISIBLE_LINES
+			    && !data->in_more && !data->nevermore) {
+			data->in_more = 1;
+			/* Show --More-- on last line */
+			strcat(data->window_text[data->last_line].text, MORE);
+			/* Go on drawing, but remember we must do a more afterwards */
+			do_more = 1;
+		    } else if (!data->in_more) {
+			data->last_line++;
+			data->last_line %= MSG_LINES; 
+			data->window_text[data->last_line].attr = data->new_line.attr;
+			strncpy(data->window_text[data->last_line].text, data->new_line.text, MAXWINDOWTEXT);
+			data->new_line.text[0] = '\0';
+			if (data->cleared) {
+			    /* now we are drawing a new line, the old lines can be redrawn in grey.*/
+			    data->lines_last_turn = 0;
+			    data->cleared = 0;
+			}
+			data->lines_last_turn++;
+			data->lines_not_seen++;
+			/* and start over */
+			i++; /* Start from the last line again */
+			continue;
+		    }
+		}
+	    }
+	    /* convert to UNICODE */
+	    NH_A2W(data->window_text[lineidx].text, wbuf, sizeof(wbuf));
+	    wlen = _tcslen(wbuf);
+	    setMsgTextColor(hdc, i < (MSG_LINES - data->lines_last_turn));
 #ifdef MSG_WRAP_TEXT				
+	    /* Find out how large the bounding rectangle of the text is */                
 				DrawText(hdc, wbuf, wlen, &draw_rt, DT_NOPREFIX | DT_WORDBREAK | DT_CALCRECT);
+	    /* move that rectangle up, so that the bottom remains at the same height */
 				draw_rt.top = y - (draw_rt.bottom - draw_rt.top);
 				draw_rt.bottom = y;
+	    /* Remember the height of this line for subsequent --More--'s */
+	    data->window_text_lines[lineidx] = (draw_rt.bottom - draw_rt.top) / data->yChar;
+	    /* Now really draw it */
 				DrawText(hdc, wbuf, wlen, &draw_rt, DT_NOPREFIX | DT_WORDBREAK);
+                
+                /* Find out the cursor (caret) position */
+	    if (i == MSG_LINES-1) {
+                    int nnum, numfit;
+                    SIZE size;
+                    TCHAR *nbuf;
+                    int nlen;
+
+                    nbuf = wbuf;
+                    nlen = wlen;
+                    while (nlen) {
+                        /* Get the number of characters that fit on the line */
+                        GetTextExtentExPoint(hdc, nbuf, nlen, draw_rt.right - draw_rt.left, &numfit, NULL, &size);
+                        /* Search back to a space */
+                        nnum = numfit;
+                        if (numfit < nlen) {
+                            while (nnum > 0 && nbuf[nnum] != ' ')
+                                nnum--;
+                            /* If no space found, break wherever */
+                            if (nnum == 0)
+                                nnum = numfit;
+                        }
+                        nbuf += nnum;
+                        nlen -= nnum;
+                        if (*nbuf == ' ') {
+                            nbuf++;
+                            nlen--;
+                        }
+                    }
+                    /* The last size is the size of the last line. Set the caret there.
+                       This will fail automatically if we don't own the caret (i.e.,
+                       when not in a question.)
+                     */
+                    SetCaretPos(draw_rt.left + size.cx, draw_rt.bottom - data->yChar);
+                }
 #else
 				DrawText(hdc, wbuf, wlen, &draw_rt, DT_NOPREFIX );
+                SetCaretPos(draw_rt.left + size.cx, draw_rt.bottom - data->yChar);
 #endif
 				SelectObject(hdc, oldFont);
-
 				y -= draw_rt.bottom - draw_rt.top;
-			} else {
-				y -= data->yChar;
 			}
+	if (do_more) {
+	    int okkey = 0;
+	    int chop;
+	    // @@@ Ok respnses
 
-			/* highligh the last line */
-			if( i==MSG_LINES-1 ) {
-				draw_rt.left = client_rt.left;
-				draw_rt.right = draw_rt.left + 2*data->xChar;
-				DrawText(hdc, TEXT("> "), 2, &draw_rt, DT_NOPREFIX );
+	    while (!okkey) {
+		char c = mswin_nhgetch();
 
-				y -= 2;
-				draw_rt.left = client_rt.left;
-				draw_rt.right = client_rt.right;
-				draw_rt.top -= 2;
-				draw_rt.bottom = client_rt.bottom;
-				DrawEdge(hdc, &draw_rt, EDGE_SUNKEN, BF_TOP | BF_ADJUST);
-				DrawEdge(hdc, &draw_rt, EDGE_SUNKEN, BF_BOTTOM | BF_ADJUST);
+		switch (c)
+		{
+		    /* space or enter */
+		    case ' ':
+		    case '\015':
+			okkey = 1;
+			break;
+			/* ESC */
+		    case '\033':
+			data->nevermore = 1;
+			okkey = 1;
+			break;
+		    default:
+			break;
 			}
 		}
+	    chop = strlen(data->window_text[data->last_line].text) 
+		- strlen(MORE);
+	    data->window_text[data->last_line].text[chop] = '\0';
+	    data->in_more = 0;
+	    data->lines_not_seen = 0;
+	    /* We did the --More--, reset the lines_not_seen; now draw that
+	       new line. This is the easiest method */
+	    InvalidateRect(hWnd, NULL, TRUE);
+	}
 	}
-
 	SetTextColor (hdc, OldFg);
 	SetBkColor (hdc, OldBg);
 	EndPaint(hWnd, &ps);
@@ -484,10 +688,8 @@
 
 void onCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
 {
-	HDC hdc;
-	TEXTMETRIC tm; 
 	PNHMessageWindow data;
-	HGDIOBJ saveFont;
+	SIZE	dummy;
 
 	/* set window data */
 	data = (PNHMessageWindow)malloc(sizeof(NHMessageWindow));
@@ -496,8 +698,24 @@
 	data->max_text = MAXWINDOWTEXT;
 	SetWindowLong(hWnd, GWL_USERDATA, (LONG)data);
 
+	/* re-calculate window size (+ font size) */
+	mswin_message_window_size(hWnd, &dummy);
+}
+
+void mswin_message_window_size (HWND hWnd, LPSIZE sz)
+{
+	HDC hdc;
+	HGDIOBJ saveFont;
+	TEXTMETRIC tm; 
+	PNHMessageWindow data;
+	RECT rt, client_rt;
+
+	data = (PNHMessageWindow)GetWindowLong(hWnd, GWL_USERDATA);
+	if( !data ) return;
+
+	/* -- Calculate the font size -- */
     /* Get the handle to the client area's device context. */
-    hdc = prepareDC( GetDC(hWnd) ); 
+    hdc = GetDC(hWnd); 
 	saveFont = SelectObject(hdc, mswin_get_font(NHW_MESSAGE, ATR_NONE, hdc, FALSE));
 
     /* Extract font dimensions from the text metrics. */
@@ -510,31 +728,15 @@
     /* Free the device context.  */
 	SelectObject(hdc, saveFont);
     ReleaseDC (hWnd, hdc); 
-}
-
-HDC prepareDC( HDC hdc )
-{
-	// set font here
-	return hdc;
-}
-
-
-void mswin_message_window_size (HWND hWnd, LPSIZE sz)
-{
-	PNHMessageWindow data;
-	RECT rt, client_rt;
-
+	
+	/* -- calculate window size -- */
 	GetWindowRect(hWnd, &rt);
-
 	sz->cx = rt.right - rt.left;
 	sz->cy = rt.bottom - rt.top;
 
-	data = (PNHMessageWindow)GetWindowLong(hWnd, GWL_USERDATA);
-	if(data) {
-		/* set size to accomodate MSG_VISIBLE_LINES, highligh rectangle and
-		   horizontal scroll bar (difference between window rect and client rect */
-		GetClientRect(hWnd, &client_rt);
-		sz->cy = sz->cy-(client_rt.bottom - client_rt.top) +
-			     data->yChar * MSG_VISIBLE_LINES + 4;
-	}
-}
\ No newline at end of file
+	/* set size to accomodate MSG_VISIBLE_LINES and
+	   horizontal scroll bar (difference between window rect and client rect */
+	GetClientRect(hWnd, &client_rt);
+	sz->cy = sz->cy - (client_rt.bottom - client_rt.top) +
+			 data->yChar * MSG_VISIBLE_LINES;
+}
diff -Naurd ../nethack-3.4.0/win/win32/mhsplash.c ./win/win32/mhsplash.c
--- ../nethack-3.4.0/win/win32/mhsplash.c Wed Mar 20 23:44:24 2002
+++ ./win/win32/mhsplash.c Mon Feb 24 15:25:05 2003
@@ -7,13 +7,16 @@
 #include "mhmsg.h"
 #include "mhfont.h"
 #include "patchlevel.h"
+#include "dlb.h"
+
+#define LLEN 128
 
 PNHWinApp GetNHApp(void);
 
 BOOL CALLBACK NHSplashWndProc(HWND, UINT, WPARAM, LPARAM);
 
 #define SPLASH_WIDTH		440
-#define SPLASH_HEIGHT		240
+#define SPLASH_HEIGHT  301
 #define SPLASH_VERSION_X		290
 #define SPLASH_VERSION_Y		10
 #define SPLASH_EXTRA_X_BEGIN	15
@@ -25,7 +28,7 @@
 extern HFONT version_splash_font;
 extern HFONT extrainfo_splash_font;
 
-void mswin_display_splash_window ()
+void mswin_display_splash_window (BOOL show_ver)
 {
 	MSG msg;
 	RECT rt;
@@ -34,6 +37,7 @@
 	RECT clientrt;
 	RECT controlrt;
 	HWND hWnd;
+ int buttop;
 
 	hWnd = CreateDialog(GetNHApp()->hApp, MAKEINTRESOURCE(IDD_SPLASH),
 	    GetNHApp()->hMainWnd, NHSplashWndProc);
@@ -60,12 +64,69 @@
 	rt.left += (rt.right - rt.left - splashrt.right) / 2;
 	rt.top += (rt.bottom - rt.top - splashrt.bottom) / 2;
 	MoveWindow(hWnd, rt.left, rt.top, splashrt.right, splashrt.bottom, TRUE);
-	/* Place the control */
+ /* Place the OK control */
 	GetClientRect (hWnd, &clientrt);
 	MoveWindow (GetDlgItem(hWnd, IDOK),
 	    (clientrt.right - clientrt.left - controlrt.right) / 2,
 	    clientrt.bottom - controlrt.bottom - SPLASH_OFFSET_Y,
 	    controlrt.right, controlrt.bottom, TRUE);
+ buttop = clientrt.bottom - controlrt.bottom - SPLASH_OFFSET_Y;
+ /* Place the text control */
+ GetWindowRect (GetDlgItem(hWnd, IDC_EXTRAINFO), &controlrt);
+ controlrt.right -= controlrt.left;
+ controlrt.bottom -= controlrt.top;
+ GetClientRect (hWnd, &clientrt);
+ MoveWindow (GetDlgItem(hWnd, IDC_EXTRAINFO),
+     clientrt.left + SPLASH_OFFSET_X,
+     buttop - controlrt.bottom - SPLASH_OFFSET_Y,
+     clientrt.right - 2 * SPLASH_OFFSET_X, controlrt.bottom, TRUE);
+ if (show_ver) {
+     /* Show complete version informatoin */
+      char buf[BUFSZ];
+
+  getversionstring(buf);
+  SetWindowText(GetDlgItem(hWnd, IDC_EXTRAINFO), buf);
+
+ } else {
+     /* Show news, if any */
+     FILE *nf;
+
+     iflags.news = 0; /* prevent newgame() from re-displaying news */
+     nf = fopen(NEWS, "r");
+     if (nf != NULL) {
+  char *buf = NULL;
+  int bufsize = 0;
+  int strsize = 0;
+  char line[LLEN + 1];
+
+  while (fgets(line, LLEN, nf)) {
+      size_t len;
+      len = strlen(line);
+      if (line[len - 1] == '\n') {
+   line[len - 1] = '\r';
+   line[len] = '\n';
+   line[len + 1] = '\0';
+   len++;
+      }
+      if (strsize + (int)len > bufsize)
+      {
+   bufsize += BUFSZ;
+   buf = realloc(buf, bufsize);
+   if (buf == NULL)
+       panic("out of memory");
+   if (strsize == 0)
+       buf[0] = '\0';
+      }
+      strcat(buf, line);
+      strsize += len;
+  }
+  (void) fclose(nf);
+  SetWindowText(GetDlgItem(hWnd, IDC_EXTRAINFO), buf);
+  free(buf);
+     }
+     else
+  SetWindowText(GetDlgItem(hWnd, IDC_EXTRAINFO), "No news.");
+ }
 	ShowWindow(hWnd, SW_SHOW);
 
 	while( IsWindow(hWnd) &&
@@ -88,13 +149,10 @@
 	case WM_INITDIALOG:
 	    /* set text control font */
 		hdc = GetDC(hWnd);
-		hdc = GetDC(hWnd);
 		SendMessage(hWnd, WM_SETFONT,
 			(WPARAM)mswin_get_font(NHW_TEXT, ATR_NONE, hdc, FALSE), 0);
 		ReleaseDC(hWnd, hdc);
 
-		ReleaseDC(hWnd, hdc);
-
 		SetFocus(GetDlgItem(hWnd, IDOK));
 	return FALSE;
 
@@ -114,8 +172,11 @@
 		hdcBitmap = CreateCompatibleDC(hdc);
 		SetBkMode (hdc, OPAQUE);
 		OldBitmap = SelectObject(hdcBitmap, GetNHApp()->bmpSplash);
-		BitBlt (hdc, SPLASH_OFFSET_X, SPLASH_OFFSET_Y, SPLASH_WIDTH,
-		    SPLASH_HEIGHT, hdcBitmap, 0, 0, SRCCOPY);
+		nhapply_image_transparent(hdc, SPLASH_OFFSET_X, SPLASH_OFFSET_Y,
+		    SPLASH_WIDTH, SPLASH_HEIGHT, 
+		    hdcBitmap, 0, 0, SPLASH_WIDTH, SPLASH_HEIGHT, 
+		    TILE_BK_COLOR);
+
 		SelectObject (hdcBitmap, OldBitmap);
 		DeleteDC (hdcBitmap);
 
diff -Naurd ../nethack-3.4.0/win/win32/mhsplash.h ./win/win32/mhsplash.h
--- ../nethack-3.4.0/win/win32/mhsplash.h Wed Mar 20 23:44:25 2002
+++ ./win/win32/mhsplash.h Mon Feb 24 15:25:05 2003
@@ -8,6 +8,6 @@
 #include "config.h"
 #include "global.h"
 
-void mswin_display_splash_window (void);
+void mswin_display_splash_window (BOOL);
 
 #endif /* MSWINSplashWindow_h */
diff -Naurd ../nethack-3.4.0/win/win32/mhstatus.c ./win/win32/mhstatus.c
--- ../nethack-3.4.0/win/win32/mhstatus.c Wed Mar 20 23:44:25 2002
+++ ./win/win32/mhstatus.c Mon Feb 24 15:25:05 2003
@@ -7,11 +7,11 @@
 #include "mhfont.h"
 
 #define NHSW_LINES    2
-#define MAXWINDOWTEXT 80
+#define MAXWINDOWTEXT BUFSZ
 
 typedef struct mswin_nethack_status_window {
 	int   index;
-	char  window_text[NHSW_LINES][MAXWINDOWTEXT];
+	char  window_text[NHSW_LINES][MAXWINDOWTEXT+1];
 } NHStatusWindow, *PNHStatusWindow;
 
 static TCHAR szStatusWindowClass[] = TEXT("MSNHStatusWndClass");
@@ -173,4 +173,4 @@
 		SelectObject(hdc, saveFont);
 		ReleaseDC(hWnd, hdc);
 	}
-}
\ No newline at end of file
+}
diff -Naurd ../nethack-3.4.0/win/win32/mhtext.c ./win/win32/mhtext.c
--- ../nethack-3.4.0/win/win32/mhtext.c Wed Mar 20 23:44:25 2002
+++ ./win/win32/mhtext.c Mon Feb 24 15:25:05 2003
@@ -14,6 +14,8 @@
 } NHTextWindow, *PNHTextWindow;
 
 static WNDPROC  editControlWndProc = 0;
+#define DEFAULT_COLOR_BG_TEXT	COLOR_WINDOW
+#define DEFAULT_COLOR_FG_TEXT	COLOR_WINDOWTEXT
 
 BOOL	CALLBACK	NHTextWndProc(HWND, UINT, WPARAM, LPARAM);
 LRESULT CALLBACK	NHEditHookWndProc(HWND, UINT, WPARAM, LPARAM);
@@ -42,10 +44,7 @@
 
 void mswin_display_text_window (HWND hWnd)
 {
-	MSG msg;
-	RECT rt;
 	PNHTextWindow data;
-	HWND mapWnd;
 	
 	data = (PNHTextWindow)GetWindowLong(hWnd, GWL_USERDATA);
 	if( data && data->window_text ) {
@@ -55,22 +54,8 @@
 		SetWindowText(GetDlgItem(hWnd, IDC_TEXT_CONTROL), data->window_text);
 	}
 
-	GetNHApp()->hPopupWnd = hWnd;
-	mapWnd = mswin_hwnd_from_winid(WIN_MAP);
-	if( !IsWindow(mapWnd) ) mapWnd = GetNHApp()->hMainWnd;
-	GetWindowRect(mapWnd, &rt);
-	MoveWindow(hWnd, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, TRUE);
-	ShowWindow(hWnd, SW_SHOW);
-
-	while( IsWindow(hWnd) && 
-		   GetMessage(&msg, NULL, 0, 0)!=0 ) {
-		if( !IsDialogMessage(hWnd, &msg) ) {
-			TranslateMessage(&msg);
-			DispatchMessage(&msg);
-		}
-	}
-
-	GetNHApp()->hPopupWnd = NULL;
+	mswin_popup_display(hWnd, NULL);
+	mswin_popup_destroy(hWnd);
 }
     
 BOOL CALLBACK NHTextWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
@@ -135,6 +120,21 @@
 		}
 	break;
 
+	case WM_CTLCOLORSTATIC: { /* sent by edit control before it is drawn */
+		HDC hdcEdit = (HDC) wParam; 
+		HWND hwndEdit = (HWND) lParam;
+		if( hwndEdit == GetDlgItem(hWnd, IDC_TEXT_CONTROL) ) {
+			SetBkColor(hdcEdit, 
+				text_bg_brush ? text_bg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_BG_TEXT)
+				);
+			SetTextColor(hdcEdit, 
+				text_fg_brush ? text_fg_color : (COLORREF)GetSysColor(DEFAULT_COLOR_FG_TEXT) 
+				); 
+			return (BOOL)(text_bg_brush 
+					? text_bg_brush : SYSCLR_TO_BRUSH(DEFAULT_COLOR_BG_TEXT));
+		}
+	} return FALSE;
+
 	case WM_DESTROY:
 		if( data ) {
 			if( data->window_text ) free(data->window_text);
diff -Naurd ../nethack-3.4.0/win/win32/mnselcnt.uu ./win/win32/mnselcnt.uu
--- ../nethack-3.4.0/win/win32/mnselcnt.uu Wed Mar 20 23:44:26 2002
+++ ./win/win32/mnselcnt.uu Mon Feb 24 15:25:05 2003
@@ -1,9 +1,6 @@
 begin 600 mnselcnt.bmp
-M0DWV`````````'8````H````$````!`````!``0``````(``````````````
-M````````````````````@```@````("``(````"``(``@(```,#`P`"`@(``
-M``#_``#_````__\`_P```/\`_P#__P``____````````````````````````
-M________``#_______\``/_P__\/_P``_P````#_``#_\/__#_\``/_P__\/
-M_P``__#__P__``#_\/__#_\``/\`````_P``__#__P__``#_______\``/__
-5_____P``````````````````````
+M0DU^`````````#X````H````$````!`````!``$``````$````!T$@``=!(`
+M`````````````````/___P```````````#_\```__```.]P``#`,```[W```
+D.]P``#O<```[W```,`P``#O<```__```/_P`````````````
 `
 end
diff -Naurd ../nethack-3.4.0/win/win32/mnsel.uu ./win/win32/mnsel.uu
--- ../nethack-3.4.0/win/win32/mnsel.uu Wed Mar 20 23:44:26 2002
+++ ./win/win32/mnsel.uu Mon Feb 24 15:25:05 2003
@@ -1,9 +1,6 @@
 begin 600 mnsel.bmp
-M0DWV`````````'8````H````$````!`````!``0``````(``````````````
-M````````````````````@```@````("``(````"``(``@(```,#`P`"`@(``
-M``#_``#_````__\`_P```/\`_P#__P``____````````````````````````
-M________``#_"/____\``/@`C____P``\`@(____``#P#X"/__\``/`/^`C_
-M_P``\`__@(__``#XC__X"/\``/____^`CP``______@/``#_______\``/__
-5_____P``````````````````````
+M0DU^`````````#X````H````$````!`````!``$``````$````!T$@``=!(`
+M`````````````````/___P```````````#_\```W_```,_P``"7\```F_```
+D)WP``">\```_W```/^P``#_T```__```/_P`````````````
 `
 end
diff -Naurd ../nethack-3.4.0/win/win32/mnunsel.uu ./win/win32/mnunsel.uu
--- ../nethack-3.4.0/win/win32/mnunsel.uu Wed Mar 20 23:44:26 2002
+++ ./win/win32/mnunsel.uu Mon Feb 24 15:25:05 2003
@@ -1,9 +1,6 @@
 begin 600 mnunsel.bmp
-M0DWV`````````'8````H````$````!`````!``0``````(``````````````
-M````````````````````@```@````("``(````"``(``@(```,#`P`"`@(``
-M``#_``#_````__\`_P```/\`_P#__P``____````````````````````````
-M________``#_______\``/_______P``________``#_______\``/______
-M_P``________``#_______\``/_______P``________``#_______\``/__
-5_____P``````````````````````
+M0DU^`````````#X````H````$````!`````!``$``````$````!T$@``=!(`
+M`````````````````/___P```````````#_\```__```/_P``#_\```__```
+D/_P``#_\```__```/_P``#_\```__```/_P`````````````
 `
 end
diff -Naurd ../nethack-3.4.0/win/win32/mswproc.c ./win/win32/mswproc.c
--- ../nethack-3.4.0/win/win32/mswproc.c Wed Mar 20 23:44:26 2002
+++ ./win/win32/mswproc.c Mon Feb 24 15:25:05 2003
@@ -8,6 +8,7 @@
 
 #include "hack.h"
 #include "dlb.h"
+#include "func_tab.h"   /* for extended commands */
 #include "winMS.h"
 #include "mhmap.h"
 #include "mhstatus.h"
@@ -64,11 +65,11 @@
 struct window_procs mswin_procs = {
     "MSWIN",
     WC_COLOR|WC_HILITE_PET|WC_ALIGN_MESSAGE|WC_ALIGN_STATUS|
-	WC_INVERSE|WC_SCROLL_MARGIN|WC_MAP_MODE|
-	WC_FONT_MESSAGE|WC_FONT_STATUS|WC_FONT_MENU|WC_FONT_TEXT|
+	WC_INVERSE|WC_SCROLL_AMOUNT|WC_SCROLL_MARGIN|WC_MAP_MODE|
+	WC_FONT_MESSAGE|WC_FONT_STATUS|WC_FONT_MENU|WC_FONT_TEXT|WC_FONT_MAP|
 	WC_FONTSIZ_MESSAGE|WC_FONTSIZ_STATUS|WC_FONTSIZ_MENU|WC_FONTSIZ_TEXT|
 	WC_TILE_WIDTH|WC_TILE_HEIGHT|WC_TILE_FILE|WC_VARY_MSGCOUNT|
-	WC_WINDOWCOLORS|WC_PLAYER_SELECTION|WC_SPLASH_SCREEN,
+	WC_WINDOWCOLORS|WC_PLAYER_SELECTION|WC_SPLASH_SCREEN|WC_POPUP_DIALOG,
     mswin_init_nhwindows,
     mswin_player_selection,
     mswin_askname,
@@ -153,7 +154,16 @@
 	WIN_MAP = WIN_ERR;
 
     /* Read Windows settings from the reqistry */
+    /* First set safe defaults */
+    GetNHApp()->regMainMinX = CW_USEDEFAULT;
     mswin_read_reg();
+    /* Create the main window */
+    GetNHApp()->hMainWnd = mswin_init_main_window();
+    if (!GetNHApp()->hMainWnd)
+    {
+        panic("Cannot create main window");
+    }
+
     /* Set menu check mark for interface mode */
     mswin_menu_check_intf_mode();
 
@@ -177,6 +187,7 @@
 	if( iflags.wc_align_message==0 ) iflags.wc_align_message = ALIGN_TOP;
 	if( iflags.wc_align_status==0 ) iflags.wc_align_status = ALIGN_BOTTOM;
 	if( iflags.wc_scroll_margin==0 ) iflags.wc_scroll_margin = DEF_CLIPAROUND_MARGIN;
+	if( iflags.wc_scroll_amount==0 ) iflags.wc_scroll_amount = DEF_CLIPAROUND_AMOUNT;
 	if( iflags.wc_tile_width==0 ) iflags.wc_tile_width = TILE_X;
 	if( iflags.wc_tile_height==0 ) iflags.wc_tile_height = TILE_Y;
 
@@ -191,6 +202,7 @@
 	 */
 	flags.toptenwin = 1;
 	set_option_mod_status("toptenwin", SET_IN_FILE);
+	set_option_mod_status("perm_invent", SET_IN_FILE);
 
 	/* initialize map tiles bitmap */
 	initMapTiles();
@@ -205,7 +217,8 @@
 		WC_HILITE_PET |
 		WC_ALIGN_MESSAGE | 
 		WC_ALIGN_STATUS |
-		WC_SCROLL_MARGIN | 
+		WC_SCROLL_AMOUNT |
+		WC_SCROLL_MARGIN |
 		WC_MAP_MODE |
 		WC_FONT_MESSAGE |
 		WC_FONT_STATUS |
@@ -228,7 +241,7 @@
 	mswin_color_from_string(iflags.wc_backgrnd_status, &status_bg_brush, &status_bg_color);
 	mswin_color_from_string(iflags.wc_backgrnd_text, &text_bg_brush, &text_bg_color);
 
-	if (iflags.wc_splash_screen) mswin_display_splash_window();
+ if (iflags.wc_splash_screen) mswin_display_splash_window(FALSE);
 	iflags.window_inited = TRUE;
 }
 
@@ -653,7 +666,15 @@
 */
 void mswin_get_nh_event(void)
 {
+	MSG msg;
+
 	logDebug("mswin_get_nh_event()\n");
+	while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)!=0 ) {
+		if (!TranslateAccelerator(msg.hwnd, GetNHApp()->hAccelTable, &msg)) {
+			TranslateMessage(&msg);
+			DispatchMessage(&msg);
+		}
+	} 
 	return;
 }
 
@@ -864,11 +885,6 @@
 		return;
     }
 
-	if (GetNHApp()->windowlist[wid].type == NHW_TEXT) {
-		/* this type takes care of themself */
-		return;
-	}
-
     if (wid != -1) {
 		if( !GetNHApp()->windowlist[wid].dead &&
 			GetNHApp()->windowlist[wid].win != NULL ) 
@@ -931,7 +947,7 @@
 	mswin_putstr_ex(wid, attr, text, 0);
 }
 
-void mswin_putstr_ex(winid wid, int attr, const char *text, boolean app)
+void mswin_putstr_ex(winid wid, int attr, const char *text, int app)
 {
 	if( (wid >= 0) && 
         (wid < MAXWINDOWS) )
@@ -953,6 +969,8 @@
 				 GetNHApp()->windowlist[wid].win, 
 				 WM_MSNH_COMMAND, (WPARAM)MSNH_MSG_PUTSTR, (LPARAM)&data );
 		}
+        /* yield a bit so it gets done immediately */
+        mswin_get_nh_event();
 	}
 	else
 	{
@@ -981,24 +999,21 @@
 			MessageBox(GetNHApp()->hMainWnd, message, TEXT("ERROR"), MB_OK | MB_ICONERROR );
 		} 
 	} else {
-		HWND hwnd;
+		winid text;
 		char line[LLEN];
 
-		hwnd = mswin_init_text_window();
+		text = mswin_create_nhwindow(NHW_TEXT);
 
 		while (dlb_fgets(line, LLEN, f)) {
-			 MSNHMsgPutstr data;
 			 size_t len;
-
 			 len = strlen(line);
 			 if( line[len-1]=='\n' ) line[len-1]='\x0';
-			 data.attr = 0;
-			 data.text = line;
-			 SendMessage( hwnd, WM_MSNH_COMMAND, (WPARAM)MSNH_MSG_PUTSTR, (LPARAM)&data );
+				mswin_putstr(text, ATR_NONE, line);
 		}
 		(void) dlb_fclose(f);
 
-		mswin_display_text_window(hwnd);
+		mswin_display_nhwindow(text, 1);
+		mswin_destroy_nhwindow(text);
 	}
 }
 
@@ -1338,6 +1353,7 @@
 int mswin_doprev_message()
 {
     logDebug("mswin_doprev_message()\n");
+	SendMessage(mswin_hwnd_from_winid(WIN_MESSAGE), WM_VSCROLL, MAKEWPARAM(SB_LINEUP, 0), (LPARAM)NULL); 
     return 0;
 }
 
@@ -1368,6 +1384,7 @@
     char yn_esc_map='\033';
     char message[BUFSZ];
 	char res_ch[2];
+    int createcaret;
 
 	logDebug("mswin_yn_function(%s, %s, %d)\n", question, choices, def);
 
@@ -1404,11 +1421,20 @@
 	Strcat(message, " ");
     }
 
+    createcaret = 1;
+    SendMessage(mswin_hwnd_from_winid(WIN_MESSAGE), 
+        WM_MSNH_COMMAND, (WPARAM)MSNH_MSG_CARET, (LPARAM)&createcaret );
+
+    mswin_clear_nhwindow(WIN_MESSAGE);
     mswin_putstr(WIN_MESSAGE, ATR_BOLD, message);
 
     /* Only here if main window is not present */
     while (result<0) {
+        ShowCaret(mswin_hwnd_from_winid(WIN_MESSAGE));
 	ch=mswin_nhgetch();
+	if (choices)
+		ch = lowc(ch);
+        HideCaret(mswin_hwnd_from_winid(WIN_MESSAGE));
 	if (ch=='\033') {
 	    result=yn_esc_map;
 	} else if (choices && !index(choices,ch)) {
@@ -1424,6 +1450,9 @@
 	}
     }
 
+    createcaret = 0;
+    SendMessage(mswin_hwnd_from_winid(WIN_MESSAGE), 
+        WM_MSNH_COMMAND, (WPARAM)MSNH_MSG_CARET, (LPARAM)&createcaret );
 	/* display selection in the message window */
 	if( isprint(ch) ) {
 		res_ch[0] = ch;
@@ -1446,10 +1475,67 @@
 */
 void mswin_getlin(const char *question, char *input)
 {
+
 	logDebug("mswin_getlin(%s, %p)\n", question, input);
-	if( mswin_getlin_window(question, input, BUFSZ)==IDCANCEL ) {
-		strcpy(input, "\033");
-	}
+
+    if (!iflags.wc_popup_dialog)
+    {
+        char c;
+        int len;
+        int done;
+        int createcaret;
+
+        createcaret = 1;
+        SendMessage(mswin_hwnd_from_winid(WIN_MESSAGE), 
+            WM_MSNH_COMMAND, (WPARAM)MSNH_MSG_CARET, (LPARAM)&createcaret );
+
+ mswin_clear_nhwindow(WIN_MESSAGE);
+        mswin_putstr_ex(WIN_MESSAGE, ATR_BOLD, question, 0);
+        mswin_putstr_ex(WIN_MESSAGE, ATR_BOLD, " ", 1);
+        input[0] = '\0';
+        len = 0;
+        ShowCaret(mswin_hwnd_from_winid(WIN_MESSAGE));
+        done = FALSE;
+        while (!done)
+        {
+            c = mswin_nhgetch();
+            switch (c)
+            {
+                case VK_ESCAPE:
+                    strcpy(input, "\033");
+                    done = TRUE;
+                    break;
+                case '\n':
+                case '\r':
+                case -115:
+                    done = TRUE;
+                    break;
+                default:
+                    if (input[0])
+                        mswin_putstr_ex(WIN_MESSAGE, ATR_NONE, input, -len);
+                    if (c == VK_BACK) {
+                        if (len > 0) len--;
+                        input[len] = '\0';
+                    } else {
+
+                        input[len++] = c;
+                        input[len] = '\0';
+                    }
+                    mswin_putstr_ex(WIN_MESSAGE, ATR_NONE, input, 1);
+                    break;
+            }
+        }
+        HideCaret(mswin_hwnd_from_winid(WIN_MESSAGE));
+        createcaret = 0;
+        SendMessage(mswin_hwnd_from_winid(WIN_MESSAGE), 
+            WM_MSNH_COMMAND, (WPARAM)MSNH_MSG_CARET, (LPARAM)&createcaret );
+    }
+    else
+    {
+	    if( mswin_getlin_window(question, input, BUFSZ)==IDCANCEL ) {
+		    strcpy(input, "\033");
+	    }
+    }
 }
 
 /*
@@ -1463,10 +1549,87 @@
 	int ret;
 	logDebug("mswin_get_ext_cmd()\n");
 
-	if(mswin_ext_cmd_window (&ret) == IDCANCEL)
-		return -1;
-	else 
-		return ret;
+    if (!iflags.wc_popup_dialog)
+    {
+        char c;
+        char cmd[BUFSZ];
+        int i, len;
+        int createcaret;
+
+        createcaret = 1;
+        SendMessage(mswin_hwnd_from_winid(WIN_MESSAGE), 
+            WM_MSNH_COMMAND, (WPARAM)MSNH_MSG_CARET, (LPARAM)&createcaret );
+
+        cmd[0] = '\0';
+        i = -2;
+ mswin_clear_nhwindow(WIN_MESSAGE);
+        mswin_putstr_ex(WIN_MESSAGE, ATR_BOLD, "#", 0);
+        len = 0;
+        ShowCaret(mswin_hwnd_from_winid(WIN_MESSAGE));
+        while (i == -2)
+        {
+            int oindex, com_index;
+            c = mswin_nhgetch();
+            switch (c)
+            {
+                case VK_ESCAPE:
+                    i = -1;
+                    break;
+                case '\n':
+                case '\r':
+                case -115:
+                    for (i = 0; extcmdlist[i].ef_txt != (char *)0; i++)
+                        if (!strcmpi(cmd, extcmdlist[i].ef_txt)) break;
+
+                    if (extcmdlist[i].ef_txt == (char *)0) {
+                        pline("%s: unknown extended command.", cmd);
+                        i = -1;
+                    }
+                    break;
+                default:
+                    if (cmd[0])
+                        mswin_putstr_ex(WIN_MESSAGE, ATR_BOLD, cmd, -(int)strlen(cmd));
+                    if (c == VK_BACK)
+                    {
+                        if (len > 0) len--;
+                        cmd[len] = '\0';
+                    }
+                    else
+                    {
+
+                        cmd[len++] = c;
+                        cmd[len] = '\0';
+                        /* Find a command with this prefix in extcmdlist */
+	                    com_index = -1;
+	                    for (oindex = 0; extcmdlist[oindex].ef_txt != (char *)0; oindex++) {
+		                    if (!strncmpi(cmd, extcmdlist[oindex].ef_txt, len)) {
+			                    if (com_index == -1)	/* no matches yet */
+			                        com_index = oindex;
+                                else
+                                    com_index = -2;     /* two matches, don't complete */
+		                    }
+	                    }
+	                    if (com_index >= 0) {
+		                    Strcpy(cmd, extcmdlist[com_index].ef_txt);
+	                    }
+                    }
+                    mswin_putstr_ex(WIN_MESSAGE, ATR_BOLD, cmd, 1);
+                    break;
+            }
+        }
+        HideCaret(mswin_hwnd_from_winid(WIN_MESSAGE));
+        createcaret = 0;
+        SendMessage(mswin_hwnd_from_winid(WIN_MESSAGE), 
+            WM_MSNH_COMMAND, (WPARAM)MSNH_MSG_CARET, (LPARAM)&createcaret );
+	    return i;
+    }
+    else
+    {
+    	if(mswin_ext_cmd_window (&ret) == IDCANCEL)
+	    	return -1;
+	    else 
+		    return ret;
+    }
 }
 
 
@@ -1622,6 +1785,7 @@
 		mswin_get_font(NHW_STATUS, ATR_INVERSE, hdc, TRUE);
 		ReleaseDC(GetNHApp()->hMainWnd, hdc);
 
+		InvalidateRect(mswin_hwnd_from_winid(WIN_STATUS), NULL, TRUE);
 		mswin_layout_main_window(NULL);
 		return;
 	}
@@ -1642,6 +1806,7 @@
 		mswin_get_font(NHW_MESSAGE, ATR_INVERSE, hdc, TRUE);
 		ReleaseDC(GetNHApp()->hMainWnd, hdc);
 
+		InvalidateRect(mswin_hwnd_from_winid(WIN_MESSAGE), NULL, TRUE);
 		mswin_layout_main_window(NULL);
 		return;
 	}
@@ -1666,6 +1831,11 @@
 		return;
 	}
 
+	if( stricmp( pref, "scroll_amount")==0 ) {
+		mswin_cliparound(u.ux, u.uy);
+		return;
+	}
+
 	if( stricmp( pref, "scroll_margin")==0 ) {
 		mswin_cliparound(u.ux, u.uy);
 		return;
@@ -1702,9 +1872,9 @@
 
 	while( !mswin_have_input() &&
 		   GetMessage(&msg, NULL, 0, 0)!=0 ) {
-		if (GetNHApp()->regNetHackMode ||
-			!TranslateAccelerator(msg.hwnd, GetNHApp()->hAccelTable, &msg))
-		{
+ 		if (GetNHApp()->regNetHackMode ||
+ 			!TranslateAccelerator(msg.hwnd, GetNHApp()->hAccelTable, &msg))
+ 		{
 			TranslateMessage(&msg);
 			DispatchMessage(&msg);
 		}
@@ -1784,6 +1954,84 @@
 	return TRUE;
 }
 
+void mswin_popup_display(HWND hWnd, int* done_indicator)
+{
+	MSG msg;
+	HWND hChild;
+	HMENU hMenu;
+	int mi_count;
+	int i;
+
+	/* activate the menu window */
+	GetNHApp()->hPopupWnd = hWnd;
+
+	mswin_layout_main_window(hWnd);
+
+	/* disable game windows */
+	for( hChild=GetWindow(GetNHApp()->hMainWnd, GW_CHILD);
+		 hChild;
+		 hChild = GetWindow(hChild, GW_HWNDNEXT) ) {
+		if( hChild!= hWnd) EnableWindow(hChild, FALSE);
+	}
+
+	/* disable menu */
+	hMenu = GetMenu( GetNHApp()->hMainWnd );
+	mi_count = GetMenuItemCount( hMenu );
+	for( i=0; i<mi_count; i++ ) {
+		EnableMenuItem(hMenu, i, MF_BYPOSITION | MF_GRAYED);
+	}
+	DrawMenuBar( GetNHApp()->hMainWnd );
+
+	/* bring menu window on top */
+	SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
+
+	/* go into message loop */
+	while( IsWindow(hWnd) && 
+		   (done_indicator==NULL || !*done_indicator) &&
+		   GetMessage(&msg, NULL, 0, 0)!=0 ) {
+		if( !IsDialogMessage(hWnd, &msg) ) {
+			if (!TranslateAccelerator(msg.hwnd, GetNHApp()->hAccelTable, &msg)) {
+				TranslateMessage(&msg);
+				DispatchMessage(&msg);
+			}
+		}
+	}
+}
+
+void mswin_popup_destroy(HWND hWnd)
+{
+	HWND hChild;
+	HMENU hMenu;
+	int mi_count;
+	int i;
+
+	/* enable game windows */
+	for( hChild=GetWindow(GetNHApp()->hMainWnd, GW_CHILD);
+		 hChild;
+		 hChild = GetWindow(hChild, GW_HWNDNEXT) ) {
+		if( hChild!= hWnd) {
+			EnableWindow(hChild, TRUE);
+		}
+	}
+
+	/* enable menu */
+	hMenu = GetMenu( GetNHApp()->hMainWnd );
+	mi_count = GetMenuItemCount( hMenu );
+	for( i=0; i<mi_count; i++ ) {
+		EnableMenuItem(hMenu, i, MF_BYPOSITION | MF_ENABLED);
+	}
+	DrawMenuBar( GetNHApp()->hMainWnd );
+
+	SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW);
+	GetNHApp()->hPopupWnd = NULL;
+	mswin_window_mark_dead( mswin_winid_from_handle(hWnd) );
+	DestroyWindow(hWnd);
+
+	mswin_layout_main_window(hWnd);
+
+	SetFocus(GetNHApp()->hMainWnd );
+}
+
 #ifdef _DEBUG
 #include <stdarg.h>
 
@@ -1806,10 +2054,19 @@
 
 
 /* Reading and writing settings from the registry. */
-#define CATEGORYKEY "Software"
-#define COMPANYKEY  "NetHack"
-#define PRODUCTKEY  "NetHack 3.4.0"
-#define SETTINGSKEY     "Settings"
+#define CATEGORYKEY         "Software"
+#define COMPANYKEY          "NetHack"
+#define PRODUCTKEY          "NetHack 3.4.1"
+#define SETTINGSKEY         "Settings"
+#define MAINSHOWSTATEKEY    "MainShowState"
+#define MAINMINXKEY         "MainMinX"
+#define MAINMINYKEY         "MainMinY"
+#define MAINMAXXKEY         "MainMaxX"
+#define MAINMAXYKEY         "MainMaxY"
+#define MAINLEFTKEY         "MainLeft"
+#define MAINRIGHTKEY        "MainRight"
+#define MAINTOPKEY          "MainTop"
+#define MAINBOTTOMKEY       "MainBottom"
 
 /* #define all the subkeys here */
 #define INTFKEY "Interface"
@@ -1833,10 +2090,19 @@
             != ERROR_SUCCESS)
         return;
 
-    /* Read the keys here. */
     size = sizeof(DWORD);
-    RegQueryValueEx(key, INTFKEY, 0, NULL, 
-        (unsigned char *)(&(GetNHApp()->regNetHackMode)), &size);
+    /* Read the keys here. */
+    RegQueryValueEx(key, INTFKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regNetHackMode)), &size);
+    /* Main window placement */
+    RegQueryValueEx(key, MAINSHOWSTATEKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainShowState)), &size);
+    RegQueryValueEx(key, MAINMINXKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainMinX)), &size);
+    RegQueryValueEx(key, MAINMINYKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainMinY)), &size);
+    RegQueryValueEx(key, MAINMAXXKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainMaxX)), &size);
+    RegQueryValueEx(key, MAINMAXYKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainMaxY)), &size);
+    RegQueryValueEx(key, MAINLEFTKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainLeft)), &size);
+    RegQueryValueEx(key, MAINRIGHTKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainRight)), &size);
+    RegQueryValueEx(key, MAINTOPKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainTop)), &size);
+    RegQueryValueEx(key, MAINBOTTOMKEY, 0, NULL, (unsigned char *)(&(GetNHApp()->regMainBottom)), &size);
     
     RegCloseKey(key);
 }
@@ -1862,6 +2128,16 @@
 
         /* Write the keys here */
         RegSetValueEx(key, INTFKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regNetHackMode)), sizeof(DWORD));
+        /* Main window placement */
+        RegSetValueEx(key, MAINSHOWSTATEKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainShowState)), sizeof(DWORD));
+        RegSetValueEx(key, MAINMINXKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainMinX)), sizeof(DWORD));
+        RegSetValueEx(key, MAINMINYKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainMinY)), sizeof(DWORD));
+        RegSetValueEx(key, MAINMAXXKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainMaxX)), sizeof(DWORD));
+        RegSetValueEx(key, MAINMAXYKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainMaxY)), sizeof(DWORD));
+        RegSetValueEx(key, MAINLEFTKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainLeft)), sizeof(DWORD));
+        RegSetValueEx(key, MAINRIGHTKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainRight)), sizeof(DWORD));
+        RegSetValueEx(key, MAINTOPKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainTop)), sizeof(DWORD));
+        RegSetValueEx(key, MAINBOTTOMKEY, 0, REG_DWORD, (unsigned char *)(&(GetNHApp()->regMainBottom)), sizeof(DWORD));
 
         RegCloseKey(key);
     }
@@ -1952,24 +2228,24 @@
 static color_table_brush_value color_table_brush[] = {
 	{ "activeborder", 	COLOR_ACTIVEBORDER	},
 	{ "activecaption",	COLOR_ACTIVECAPTION	},
-	{ "appworkspace",	COLOR_APPWORKSPACE	},
-	{ "background",		COLOR_BACKGROUND	},
+	{ "appworkspace",		COLOR_APPWORKSPACE	},
+	{ "background",		COLOR_BACKGROUND		},
 	{ "btnface",		COLOR_BTNFACE		},
 	{ "btnshadow",		COLOR_BTNSHADOW		},
 	{ "btntext", 		COLOR_BTNTEXT		},
-	{ "captiontext",	COLOR_CAPTIONTEXT	},
+	{ "captiontext",		COLOR_CAPTIONTEXT		},
 	{ "graytext",		COLOR_GRAYTEXT		},
 	{ "greytext",		COLOR_GRAYTEXT 		},
-	{ "highlight",		COLOR_HIGHLIGHT 	},
+	{ "highlight",		COLOR_HIGHLIGHT 		},
 	{ "highlighttext",	COLOR_HIGHLIGHTTEXT	},
 	{ "inactiveborder", 	COLOR_INACTIVEBORDER 	},
 	{ "inactivecaption",	COLOR_INACTIVECAPTION 	},
-	{ "menu",		COLOR_MENU 		},
+	{ "menu",			COLOR_MENU 			},
 	{ "menutext",		COLOR_MENUTEXT 		},
-	{ "scrollbar",		COLOR_SCROLLBAR 	},
-	{ "window",		COLOR_WINDOW 		},
-	{ "windowframe", 	COLOR_WINDOWFRAME 	},
-	{ "windowtext",		COLOR_WINDOWTEXT 	},
+	{ "scrollbar",		COLOR_SCROLLBAR 		},
+	{ "window",			COLOR_WINDOW 		},
+	{ "windowframe", 		COLOR_WINDOWFRAME 	},
+	{ "windowtext",		COLOR_WINDOWTEXT 		},
 	{ "", 			-1				},
 };
 
@@ -1996,7 +2272,7 @@
 		blue_value *= 16;
 		blue_value += index(hexadecimals, tolower(*colorstring++)) - hexadecimals;
 
-		*colorptr = RGB(red_value, blue_value, green_value);
+		*colorptr = RGB(red_value, green_value, blue_value);
 	} else {
 	    while (*ctv_ptr->colorstring && stricmp(ctv_ptr->colorstring, colorstring))
 		++ctv_ptr;
diff -Naurd ../nethack-3.4.0/win/win32/nethack.dsw ./win/win32/nethack.dsw
--- ../nethack-3.4.0/win/win32/nethack.dsw Wed Mar 20 23:44:35 2002
+++ ./win/win32/nethack.dsw Mon Feb 24 15:25:05 2003
@@ -3,6 +3,39 @@
 
 ###############################################################################
 
+Project: "NetHackW"=.\build\NetHackW.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name dgncomp
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name dlb_main
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name levcomp
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name makedefs
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tilemap
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiles
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name uudecode
+    End Project Dependency
+}}}
+
+###############################################################################
+
 Project: "dgncomp"=.\build\dgncomp.dsp - Package Owner=<4>
 
 Package=<5>
@@ -95,42 +128,6 @@
 }}}
 
 ###############################################################################
-
-Project: "nethackw"=.\build\nethackw.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-    Begin Project Dependency
-    Project_Dep_Name dgncomp
-    End Project Dependency
-    Begin Project Dependency
-    Project_Dep_Name dlb_main
-    End Project Dependency
-    Begin Project Dependency
-    Project_Dep_Name levcomp
-    End Project Dependency
-    Begin Project Dependency
-    Project_Dep_Name makedefs
-    End Project Dependency
-    Begin Project Dependency
-    Project_Dep_Name recover
-    End Project Dependency
-    Begin Project Dependency
-    Project_Dep_Name tilemap
-    End Project Dependency
-    Begin Project Dependency
-    Project_Dep_Name tiles
-    End Project Dependency
-    Begin Project Dependency
-    Project_Dep_Name uudecode
-    End Project Dependency
-}}}
-
-###############################################################################
 
 Project: "recover"=.\build\recover.dsp - Package Owner=<4>
 
diff -Naurd ../nethack-3.4.0/win/win32/nethackw.dsp ./win/win32/nethackw.dsp
--- ../nethack-3.4.0/win/win32/nethackw.dsp Wed Mar 20 23:44:35 2002
+++ ./win/win32/nethackw.dsp Mon Feb 24 15:25:05 2003
@@ -1,24 +1,24 @@
-# Microsoft Developer Studio Project File - Name="nethackw" - Package Owner=<4>
+# Microsoft Developer Studio Project File - Name="NetHackW" - Package Owner=<4>
 # Microsoft Developer Studio Generated Build File, Format Version 6.00
 # ** DO NOT EDIT **
 
 # TARGTYPE "Win32 (x86) Application" 0x0101
 
-CFG=nethackw - Win32 Debug
+CFG=NetHackW - Win32 Debug
 !MESSAGE This is not a valid makefile. To build this project using NMAKE,
 !MESSAGE use the Export Makefile command and run
 !MESSAGE 
-!MESSAGE NMAKE /f "nethackw.mak".
+!MESSAGE NMAKE /f "NetHackW.mak".
 !MESSAGE 
 !MESSAGE You can specify a configuration when running NMAKE
 !MESSAGE by defining the macro CFG on the command line. For example:
 !MESSAGE 
-!MESSAGE NMAKE /f "nethackw.mak" CFG="nethackw - Win32 Debug"
+!MESSAGE NMAKE /f "NetHackW.mak" CFG="NetHackW - Win32 Debug"
 !MESSAGE 
 !MESSAGE Possible choices for configuration are:
 !MESSAGE 
-!MESSAGE "nethackw - Win32 Release" (based on "Win32 (x86) Application")
-!MESSAGE "nethackw - Win32 Debug" (based on "Win32 (x86) Application")
+!MESSAGE "NetHackW - Win32 Release" (based on "Win32 (x86) Application")
+!MESSAGE "NetHackW - Win32 Debug" (based on "Win32 (x86) Application")
 !MESSAGE 
 
 # Begin Project
@@ -29,7 +29,7 @@
 MTL=midl.exe
 RSC=rc.exe
 
-!IF  "$(CFG)" == "nethackw - Win32 Release"
+!IF  "$(CFG)" == "NetHackW - Win32 Release"
 
 # PROP BASE Use_MFC 0
 # PROP BASE Use_Debug_Libraries 0
@@ -54,22 +54,22 @@
 # ADD BSC32 /nologo
 LINK32=link.exe
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib advapi32.lib /nologo /subsystem:windows /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib advapi32.lib winmm.lib /nologo /subsystem:windows /map /debug /machine:I386 /MAPINFO:EXPORTS /MAPINFO:LINES
+# SUBTRACT LINK32 /pdb:none
 # Begin Special Build Tool
 OutDir=.\Release
 SOURCE="$(InputPath)"
 PostBuild_Desc=Install exe
-PostBuild_Cmds=copy $(OutDir)\nethackw.exe ..\binary	\
+PostBuild_Cmds=copy $(OutDir)\NetHackW.exe ..\binary	\
 copy ..\dat\nhdat ..\binary	\
 copy ..\dat\license ..\binary	\
 if exist tiles.bmp copy tiles.bmp ..\binary	\
 if exist ..\doc\Guidebook.txt copy ..\doc\Guidebook.txt ..\binary\Guidebook.txt	\
 if exist ..\doc\nethack.txt copy ..\doc\nethack.txt ..\binary\NetHack.txt	\
-if exist ..\doc\recover.txt copy ..\doc\recover.txt ..\binary\recover.txt	\
 copy ..\sys\winnt\defaults.nh ..\binary\defaults.nh
 # End Special Build Tool
 
-!ELSEIF  "$(CFG)" == "nethackw - Win32 Debug"
+!ELSEIF  "$(CFG)" == "NetHackW - Win32 Debug"
 
 # PROP BASE Use_MFC 0
 # PROP BASE Use_Debug_Libraries 1
@@ -94,19 +94,18 @@
 # ADD BSC32 /nologo
 LINK32=link.exe
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib advapi32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib advapi32.lib winmm.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
 # Begin Special Build Tool
 OutDir=.\Debug
 SOURCE="$(InputPath)"
 PostBuild_Desc=Install exe
 PostBuild_Cmds=if NOT exist ..\binary\*.* mkdir ..\binary	\
-copy $(OutDir)\nethackw.exe ..\binary	\
+copy $(OutDir)\NetHackW.exe ..\binary	\
 copy ..\dat\nhdat ..\binary	\
 copy ..\dat\license ..\binary	\
 if exist tiles.bmp copy tiles.bmp ..\binary	\
 if exist ..\doc\Guidebook.txt copy ..\doc\Guidebook.txt ..\binary\Guidebook.txt	\
 if exist ..\doc\nethack.txt copy ..\doc\nethack.txt ..\binary\NetHack.txt	\
-if exist ..\doc\recover.txt copy ..\doc\recover.txt ..\binary\recover.txt	\
 copy ..\sys\winnt\defaults.nh ..\binary\defaults.nh
 # End Special Build Tool
 
@@ -114,8 +113,8 @@
 
 # Begin Target
 
-# Name "nethackw - Win32 Release"
-# Name "nethackw - Win32 Debug"
+# Name "NetHackW - Win32 Release"
+# Name "NetHackW - Win32 Debug"
 # Begin Group "Source Files"
 
 # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
@@ -357,6 +356,10 @@
 # End Source File
 # Begin Source File
 
+SOURCE=..\sys\winnt\ntsound.c
+# End Source File
+# Begin Source File
+ 
 SOURCE=..\src\o_init.c
 # End Source File
 # Begin Source File
@@ -905,10 +908,6 @@
 # End Source File
 # Begin Source File
 
-SOURCE=..\win\win32\winhack.h
-# End Source File
-# Begin Source File
-
 SOURCE=..\include\winprocs.h
 # End Source File
 # Begin Source File
diff -Naurd ../nethack-3.4.0/win/win32/recover.dsp ./win/win32/recover.dsp
--- ../nethack-3.4.0/win/win32/recover.dsp Wed Mar 20 23:44:35 2002
+++ ./win/win32/recover.dsp Mon Feb 24 15:25:05 2003
@@ -54,7 +54,8 @@
 # Begin Special Build Tool
 OutDir=.\Release
 SOURCE="$(InputPath)"
-PostBuild_Cmds=copy $(OutDir)\recover.exe ..\binary
+PostBuild_Cmds=copy $(OutDir)\recover.exe ..\binary	\
+if exist ..\doc\recover.txt copy ..\doc\recover.txt ..\binary\recover.txt
 # End Special Build Tool
 
 !ELSEIF  "$(CFG)" == "recover - Win32 Debug"
@@ -85,7 +86,8 @@
 OutDir=.\Debug
 SOURCE="$(InputPath)"
 PostBuild_Desc=install exe
-PostBuild_Cmds=copy $(OutDir)\recover.exe ..\binary
+PostBuild_Cmds=copy $(OutDir)\recover.exe ..\binary	\
+if exist ..\doc\recover.txt copy ..\doc\recover.txt ..\binary\recover.txt
 # End Special Build Tool
 
 !ENDIF 
diff -Naurd ../nethack-3.4.0/win/win32/resource.h ./win/win32/resource.h
--- ../nethack-3.4.0/win/win32/resource.h Wed Mar 20 23:44:27 2002
+++ ./win/win32/resource.h Mon Feb 24 15:25:05 2003
@@ -111,6 +111,7 @@
 #define IDC_PLSEL_GENDER_LIST           1326
 #define IDC_ABOUT_VERSION               1327
 #define IDC_ABOUT_COPYRIGHT             1328
+#define IDC_EXTRAINFO                   1331
 #define IDM_SAVE                        32771
 #define IDM_HELP_LONG                   32772
 #define IDM_HELP_COMMANDS               32773
@@ -143,7 +144,7 @@
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_NEXT_RESOURCE_VALUE        145
 #define _APS_NEXT_COMMAND_VALUE         32796
-#define _APS_NEXT_CONTROL_VALUE         1331
+#define _APS_NEXT_CONTROL_VALUE         1332
 #define _APS_NEXT_SYMED_VALUE           110
 #endif
 #endif
diff -Naurd ../nethack-3.4.0/win/win32/splash.uu ./win/win32/splash.uu
--- ../nethack-3.4.0/win/win32/splash.uu Wed Mar 20 23:44:28 2002
+++ ./win/win32/splash.uu Mon Feb 24 15:25:05 2003
@@ -1,7045 +1,2374 @@
 begin 600 splash.bmp
-M0DVVU00``````#8````H````N`$``/`````!`!@``````(#5!`#$#@``Q`X`
-M````````````@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``+3AGP+7"559;@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``'A@8
-M96=I*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``#@\0*S`^559;<G!R%!0V@(``@(``@(``%!0V*S`^$QDX@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``$QDXEYB;P+7"J:VO*S`^@(``@(``$QDX
-M559;EYB;*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``'A@8EYB;S\O1
-MS\O1*S`^@(``%!0VEYB;S\O1F:?,*S`^@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``*S`^-3]`@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``$QDXF8"0S\O1S\O1N7YB*S`^*S`^P+*UXO+TJ:VO*S`^@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``%!0VEYB;
-MP+7"*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``#@\0'A@8*S`^+3AGL)BHS\O1S\O1U=3>EYB;+3AGEYB;
-MS\O1P+7"*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``*S`^S\O1P+*U*S`^@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``$QDXEYB;P+*UF=#5EYB;F:?,
-MF=#5S\O1J:VO0UICF8"0F=#5S\O1-3]`@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``*S`^P+7"F=#5*S`^+3AG*S`^@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``'A@8
-MP+*UU=3>S\O1EYB;N7YBF=#5F=#5P+7"96=IEYB;F:?,F:?,+3AG@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``559;P+*U
-MF=#5<G!RJ:VOL)BH*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``$QDX>GZ=P+7"S\O1>GZ=EYB;F:?,S\O1F=#5P+*UF:?,
-MP+*UF=#596=I$QDX'A@8@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``*S`^F=#5F=#5S\O1S\O1S\O1F=#5%!0V@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``'A@896=IEYB;P+*UEYB;EYB;
-M96^<05BD05BDF8"0F=#5F=#5S\O1S\O1>GZ=$QDX@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``*S`^S\O1U=3>F=#5X^KKU=3>P+*U559;
-M'A@8@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``#`P]
-MF8"0EYB;F8"096^<96^<(C&<%!68+3AG(C&<EYB;P+7"F=#5X^KKF:?,'A@8
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``*S`^P+*US\O1
-MF=#5U=3>S\O1S\O1F=#5*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``'A@8>GZ=EYB;559;0UIC&25@(C&<+3AG)T2E+3AGEYB;
-MEYB;?Y?/F:?,EYB;5B@>@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``*S`^F=#5S\O1F=#5EYB;F:?,U=3>SMK=5B@>@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``%!0VEYB;J:VO0UIC+3AG04F-
-M(C&<05BD0UIC+3AG'".<(C&<(C&<96=I96^<F:?,*S`^@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``+3AGJ:VOP+7"?Y?/96^<F=#5S\O1P+7"
-M96=I*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``$QDX
-MEYB;EYB;559;+3AG05BD96=I96^<96=I'".<&25@%!68)T2E(C&<96=IEYB;
-M96=I*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``*S`^?HF\96^<
-M(C&<+3AGF:?,F=#5?Y?/S\O1?HF\-3]`@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``$QDX>GZ=F:?,0UIC'".<(C&<96^<05BD(C&<+3AG(C&<
-M96=I05BD0UIC05BD05BDF:?,EYB;%!0V@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``+3AGEYB;04F-+3AG04F-05BD2%S(05BD05BD96^<EYB;*S`^@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``%!0V96=I66^\&25@%!68'".<
-M(C&<*47&(C&<'".<(C&<04F-05BD*47&'".<#Q/-F:?,EYB;%!0V@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``*S`^EYB;2%S(05BD+3AG(C&<(C&<(C&<
-M+3AG96=IF:?,*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``#@\0+3AG
-M+3AG'".<%!68%QAE(C&<(C&<(C&<'2C3%!680UIC2%S(2%S(#Q/-'2C3(C&<
-M66^\F8"0'A@8@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``$QDX96^<2%S(
-M(C&<*47&2%S(96^<05BD'".<(C&<05BD5B@>'A@8@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``-3]`EYB;96^<+3AG+3AG'".<"0F5'2C32%S(96^<'".<(C&<
-M*47&*47&"0GS"0GS#Q/-96^<05BD@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``%!0V05BD(C&<'2C3(C&<05BD*47&'2C3#Q/-'".<(C&<EYB;EYB;
-M$QDX@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``5B@>EYB;05BD&25@(C&<'".<%!68
-M(C&<*47&*47&"0G+'2C3(C&<2%S(*47&'2C3"0G+05BD04F-#@\0@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``*S`^96^<(C&<'2C3*47&(C&<(C&<"0GS
-M"0G+(C&<(C&<F=#5P+*U%!0V@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``*S`^#@\0@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``+3AGF=#5
-M04F-+3AG(C&<+3AG"0F5'".<"0GS'2C3(C&<"0G+*47&2%S("0GS"0G+(C&<
-M*47&05BD*S`^@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``*S`^2%S(#Q/-
-M'2C3*47&'2C3'2C3"0GS'2C3"0G+(C&<P+7"P+*U0UIC'A@8@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``%!0V-3]`EYB;*S`^@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``*S`^EYB;(C&<'".<(C&<'".<(C&<%!68"0G+"0G+%!68'2C3
-M#Q/-'2C3"0GS"0GS'2C3%!6805BD96^<*S`^'A@8@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``@(``
-M@(``@(``@(``@(``@(``@(``@(``@(``@(``