changes by H.G. Muller; version 4.3.4 v4.3.4
authorH.G. Muller <h.g.muller@hccnet.nl>
Sun, 19 Apr 2009 16:39:19 +0000 (09:39 -0700)
committerArun Persaud <arun@nubati.net>
Sun, 19 Apr 2009 17:32:55 +0000 (10:32 -0700)
12 files changed:
backend.c
backend.h
common.h
config.h
moves.c
moves.h
parser.l
winboard/resource.h
winboard/winboard.c
winboard/winboard.rc
winboard/woptions.c
winboard/woptions.h

index 29ebca6..f3cffc5 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -421,36 +421,47 @@ ChessSquare twoKingsArray[2][BOARD_SIZE] = {
     { WhiteRook, WhiteKnight, WhiteBishop, WhiteQueen,\r
        WhiteKing, WhiteKing, WhiteKnight, WhiteRook },\r
     { BlackRook, BlackKnight, BlackBishop, BlackQueen,\r
-       BlackKing, BlackKing, BlackKnight, BlackRook }\r
+        BlackKing, BlackKing, BlackKnight, BlackRook }\r
 };\r
 \r
 #ifdef FAIRY\r
+ChessSquare  KnightmateArray[2][BOARD_SIZE] = {\r
+    { WhiteRook, WhiteMan, WhiteBishop, WhiteQueen,\r
+        WhiteUnicorn, WhiteBishop, WhiteMan, WhiteRook },\r
+    { BlackRook, BlackMan, BlackBishop, BlackQueen,\r
+        BlackUnicorn, BlackBishop, BlackMan, BlackRook }\r
+};\r
+\r
 ChessSquare fairyArray[2][BOARD_SIZE] = { /* [HGM] Queen side differs from King side */\r
-    { WhiteFairyRook, WhiteFairyKnight, WhiteFairyBishop, WhiteQueen,\r
+    { WhiteCannon, WhiteNightrider, WhiteAlfil, WhiteQueen,\r
         WhiteKing, WhiteBishop, WhiteKnight, WhiteRook },\r
-    { BlackFairyRook, BlackFairyKnight, BlackFairyBishop, BlackQueen,\r
+    { BlackCannon, BlackNightrider, BlackAlfil, BlackQueen,\r
        BlackKing, BlackBishop, BlackKnight, BlackRook }\r
 };\r
 \r
 ChessSquare ShatranjArray[2][BOARD_SIZE] = { /* [HGM] (movGen knows about Shatranj Q and P) */\r
-    { WhiteRook, WhiteKnight, WhiteFairyBishop, WhiteFairyPawn,\r
-        WhiteKing, WhiteFairyBishop, WhiteKnight, WhiteRook },\r
-    { BlackRook, BlackKnight, BlackFairyBishop, BlackFairyPawn,\r
-        BlackKing, BlackFairyBishop, BlackKnight, BlackRook }\r
+    { WhiteRook, WhiteKnight, WhiteAlfil, WhiteFerz,\r
+        WhiteKing, WhiteAlfil, WhiteKnight, WhiteRook },\r
+    { BlackRook, BlackKnight, BlackAlfil, BlackFerz,\r
+        BlackKing, BlackAlfil, BlackKnight, BlackRook }\r
+};\r
+\r
+\r
+#if (BOARD_SIZE>=10)\r
+ChessSquare ShogiArray[2][BOARD_SIZE] = {\r
+    { WhiteQueen, WhiteKnight, WhiteFerz, WhiteWazir,\r
+        WhiteKing, WhiteWazir, WhiteFerz, WhiteKnight, WhiteQueen },\r
+    { BlackQueen, BlackKnight, BlackFerz, BlackWazir,\r
+        BlackKing, BlackWazir, BlackFerz, BlackKnight, BlackQueen }\r
 };\r
 \r
-#if (BOARD_SIZE>=9)\r
 ChessSquare XiangqiArray[2][BOARD_SIZE] = {\r
-    { WhiteRook, WhiteKnight, WhiteFairyBishop, WhiteFairyPawn,\r
-        WhiteKing, WhiteFairyPawn, WhiteFairyBishop, WhiteKnight, WhiteRook },\r
-    { BlackRook, BlackKnight, BlackFairyBishop, BlackFairyPawn,\r
-        BlackKing, BlackFairyPawn, BlackFairyBishop, BlackKnight, BlackRook }\r
+    { WhiteRook, WhiteKnight, WhiteAlfil, WhiteFerz,\r
+        WhiteWazir, WhiteFerz, WhiteAlfil, WhiteKnight, WhiteRook },\r
+    { BlackRook, BlackKnight, BlackAlfil, BlackFerz,\r
+        BlackWazir, BlackFerz, BlackAlfil, BlackKnight, BlackRook }\r
 };\r
-#else\r
-#define XiangqiPosition FIDEPosition\r
-#endif\r
 \r
-#if (BOARD_SIZE>=10)\r
 ChessSquare CapablancaArray[2][BOARD_SIZE] = {\r
     { WhiteRook, WhiteKnight, WhiteCardinal, WhiteBishop, WhiteQueen, \r
         WhiteKing, WhiteBishop, WhiteMarshall, WhiteKnight, WhiteRook },\r
@@ -470,16 +481,17 @@ ChessSquare GothicArray[2][BOARD_SIZE] = {
 #endif // !GOTHIC\r
 \r
 #else // !(BOARD_SIZE>=10)\r
+#define XiangqiPosition FIDEArray\r
 #define CapablancaArray FIDEArray\r
 #define GothicArray FIDEArray\r
 #endif // !(BOARD_SIZE>=10)\r
 \r
 #if (BOARD_SIZE>=12)\r
 ChessSquare CourierArray[2][BOARD_SIZE] = {\r
-    { WhiteRook, WhiteKnight, WhiteFairyBishop, WhiteBishop, WhiteFairyKing, WhiteKing,\r
-        WhiteFairyPawn, WhiteFairyRook, WhiteBishop, WhiteFairyBishop, WhiteKnight, WhiteRook },\r
-    { BlackRook, BlackKnight, BlackFairyBishop, BlackBishop, BlackFairyKing, BlackKing,\r
-        BlackFairyPawn, BlackFairyRook, BlackBishop, BlackFairyBishop, BlackKnight, BlackRook }\r
+    { WhiteRook, WhiteKnight, WhiteAlfil, WhiteBishop, WhiteMan, WhiteKing,\r
+        WhiteFerz, WhiteWazir, WhiteBishop, WhiteAlfil, WhiteKnight, WhiteRook },\r
+    { BlackRook, BlackKnight, BlackAlfil, BlackBishop, BlackMan, BlackKing,\r
+        BlackFerz, BlackWazir, BlackBishop, BlackAlfil, BlackKnight, BlackRook }\r
 };\r
 #else // !(BOARD_SIZE>=12)\r
 #define CourierArray CapablancaArray\r
@@ -733,25 +745,31 @@ InitBackEnd1()
       case VariantLoadable:\r
       case Variant29:\r
       case Variant30:\r
-#ifndef FAIRY\r
       case Variant31:\r
       case Variant32:\r
       case Variant33:\r
       case Variant34:\r
       case Variant35:\r
       case Variant36:\r
-#endif\r
       default:\r
        sprintf(buf, "Unknown variant name %s", appData.variant);\r
        DisplayFatalError(buf, 0, 2);\r
        return;\r
 \r
+      case VariantXiangqi:    /* [HGM] repetition rules not implemented */\r
+      case VariantFairy:      /* [HGM] TestLegality definitely off! */\r
+      case VariantGothic:     /* [HGM] should work */\r
+      case VariantCapablanca: /* [HGM] should work */\r
+      case VariantCourier:    /* [HGM] initial forced moves not implemented */\r
+      case VariantShogi:      /* [HGM] drops not tested for legality */\r
+      case VariantShowgi:     /* [HGM] not a valid variant */\r
+      case VariantKnightmate: /* [HGM] should work */\r
+      case VariantCrazyhouse: /* holdings not shown, ([HGM] fixed that!)\r
+                                offboard interposition not understood */\r
       case VariantNormal:     /* definitely works! */\r
       case VariantWildCastle: /* pieces not automatically shuffled */\r
       case VariantNoCastle:   /* pieces not automatically shuffled */\r
       case VariantFischeRandom: /* Fabien: pieces not automatically shuffled */\r
-      case VariantCrazyhouse: /* holdings not shown,\r
-                                offboard interposition not understood */\r
       case VariantLosers:     /* should work except for win condition,\r
                                 and doesn't know captures are mandatory */\r
       case VariantSuicide:    /* should work except for win condition,\r
@@ -762,14 +780,6 @@ InitBackEnd1()
       case VariantAtomic:     /* should work except for win condition */\r
       case Variant3Check:     /* should work except for win condition */\r
       case VariantShatranj:   /* might work if TestLegality is off */\r
-#ifdef FAIRY\r
-      case VariantShogi:\r
-      case VariantXiangqi:\r
-      case VariantFairy:      /* [HGM] TestLegality definitely off! */\r
-      case VariantGothic:\r
-      case VariantCapablanca:\r
-      case VariantCourier:\r
-#endif\r
        break;\r
       }\r
     }\r
@@ -1355,7 +1365,14 @@ StringToVariant(e)
     char buf[MSG_SIZ];\r
 \r
     if (!e) return v;\r
-    \r
+\r
+    /* [HGM] skip over optional board-size prefixes */\r
+    if( sscanf(e, "%dx%d+%d_", &i, &i, &i) == 3 ) {\r
+        while( *e++ != '_');\r
+    } else if( sscanf(e, "%dx%d_", &i, &i) == 2 ) {\r
+        while( *e++ != '_');\r
+    }\r
+\r
     for (i=0; i<sizeof(variantNames)/sizeof(char*); i++) {\r
       if (StrCaseStr(e, variantNames[i])) {\r
        v = (VariantClass) i;\r
@@ -1452,46 +1469,46 @@ StringToVariant(e)
          v = Variant30;\r
          break;\r
        case 31:\r
-#ifdef FAIRY\r
-          v = VariantShogi;\r
-#else\r
          v = Variant31;\r
-#endif\r
          break;\r
        case 32:\r
-#ifdef FAIRY\r
-          v = VariantXiangqi;\r
-#else\r
          v = Variant32;\r
-#endif\r
          break;\r
        case 33:\r
-#ifdef FAIRY\r
-          v = VariantCourier;\r
-#else\r
          v = Variant33;\r
-#endif\r
          break;\r
        case 34:\r
-#ifdef FAIRY\r
-          v = VariantGothic;\r
-#else\r
          v = Variant34;\r
-#endif\r
          break;\r
        case 35:\r
-#ifdef FAIRY\r
-          v = VariantCapablanca;\r
-#else\r
          v = Variant35;\r
-#endif\r
          break;\r
        case 36:\r
-#ifdef FAIRY\r
-          v = VariantFairy;\r
-#else\r
          v = Variant36;\r
-#endif\r
+         break;\r
+        case 37:\r
+          v = VariantShogi;\r
+         break;\r
+        case 38:\r
+          v = VariantXiangqi;\r
+         break;\r
+        case 39:\r
+          v = VariantCourier;\r
+         break;\r
+        case 40:\r
+          v = VariantGothic;\r
+         break;\r
+        case 41:\r
+          v = VariantCapablanca;\r
+         break;\r
+        case 42:\r
+          v = VariantKnightmate;\r
+         break;\r
+        case 43:\r
+          v = VariantFairy;\r
+          break;\r
+        case 44:\r
+          v = VariantShowgi;\r
          break;\r
 \r
        case -1:\r
@@ -1677,6 +1694,45 @@ DontEcho()
     TelnetRequest(TN_DONT, TN_ECHO);\r
 }\r
 \r
+void\r
+CopyHoldings(Board board, char *holdings, ChessSquare lowestPiece)\r
+{\r
+    /* put the holdings sent to us by the server on the board holdings area */\r
+    int i, j, holdingsColumn, holdingsStartRow, direction, countsColumn;\r
+    char p;\r
+    ChessSquare piece;\r
+\r
+    if(gameInfo.holdingsWidth < 1)  return;\r
+\r
+    if( (int)lowestPiece >= BlackPawn ) {\r
+        holdingsColumn = 0;\r
+        countsColumn = 1;\r
+        holdingsStartRow = BOARD_HEIGHT-1;\r
+        direction = 1;\r
+    } else {\r
+        holdingsColumn = BOARD_WIDTH-1;\r
+        countsColumn = BOARD_WIDTH-2;\r
+        holdingsStartRow = 0;\r
+        direction = 1;\r
+    }\r
+\r
+    for(i=0; i<BOARD_HEIGHT; i++) { /* clear holdings */\r
+        board[i][holdingsColumn] = EmptySquare;\r
+        board[i][countsColumn]   = (ChessSquare) 0;\r
+    }\r
+    while( (p=*holdings++) != NULLCHAR ) {\r
+        piece = CharToPiece( ToUpper(p) );\r
+        if(piece == EmptySquare) continue;\r
+        j = (int) piece - (int) WhitePawn;\r
+        if(j >= gameInfo.holdingsSize) continue; /* ignore pieces that do not fit */\r
+        if(j < 0) continue;               /* should not happen */\r
+        piece = (ChessSquare) ( (int)piece + (int)lowestPiece );\r
+        board[holdingsStartRow+i*direction][holdingsColumn] = piece;\r
+        board[holdingsStartRow+i*direction][countsColumn]++;\r
+    }\r
+\r
+}\r
+\r
 static int loggedOn = FALSE;\r
 \r
 /*-- Game start info cache: --*/\r
@@ -2725,9 +2781,9 @@ read_from_ics(isr, closure, data, count, error)
                        ClearPremoveHighlights();\r
                        if (appData.debugMode)\r
                          fprintf(debugFP, "Sending premove:\n");\r
-                         UserMoveEvent(premoveFromX, premoveFromY, \r
+                          UserMoveEvent(premoveFromX, premoveFromY, \r
                                        premoveToX, premoveToY, \r
-                                       premovePromoChar);\r
+                                        premovePromoChar);\r
                      }\r
                    }\r
 \r
@@ -2780,6 +2836,10 @@ read_from_ics(isr, closure, data, count, error)
                                    gameInfo.white, white_holding,\r
                                    gameInfo.black, black_holding);\r
                        }\r
+\r
+                        /* [HGM] copy holdings to board holdings area */\r
+                        CopyHoldings(boards[currentMove], white_holding, WhitePawn);\r
+                        CopyHoldings(boards[currentMove], black_holding, BlackPawn);\r
                        DrawPosition(FALSE, NULL);\r
                        DisplayTitle(str);\r
                    }\r
@@ -2997,6 +3057,20 @@ ParseBoard12(string)
        movesPerSession = 0;\r
        gameInfo.timeControl = TimeControlTagValue();\r
        gameInfo.variant = StringToVariant(gameInfo.event);\r
+        gameInfo.holdingsSize = 5; /* [HGM] prepare holdings */\r
+        switch(gameInfo.variant) {\r
+            case VariantShogi:\r
+            case VariantShowgi:\r
+              gameInfo.boardWidth = gameInfo.boardHeight = 9;\r
+              gameInfo.holdingsSize += 2;\r
+            case VariantBughouse:\r
+            case VariantCrazyhouse:\r
+              gameInfo.boardWidth = gameInfo.boardHeight = 8;\r
+              gameInfo.holdingsWidth = 2; break;\r
+            default:\r
+              gameInfo.boardWidth = gameInfo.boardHeight = 8;\r
+              gameInfo.holdingsWidth = 0;\r
+        }\r
         gameInfo.outOfBook = NULL;\r
        \r
        /* Do we have the ratings? */\r
@@ -3343,9 +3417,9 @@ SendMoveToProgram(moveNum, cps)
        * the engine. It would be nice to have a better way to identify castle \r
        * moves here. */\r
       if(gameInfo.variant == VariantFischeRandom && cps->useOOCastle) {\r
-       int fromX = moveList[moveNum][0] - 'a'; \r
+        int fromX = moveList[moveNum][0] - AAA; \r
         int fromY = moveList[moveNum][1] - ONE;\r
-       int toX = moveList[moveNum][2] - 'a'; \r
+        int toX = moveList[moveNum][2] - AAA; \r
         int toY = moveList[moveNum][3] - ONE;\r
        if((boards[currentMove][fromY][fromX] == WhiteKing \r
            && boards[currentMove][toY][toX] == WhiteRook)\r
@@ -3411,21 +3485,21 @@ SendMoveToICS(moveType, fromX, fromY, toX, toY)
       case BlackPromotionArchbishop:\r
 #endif\r
        sprintf(user_move, "%c%c%c%c=%c\n",\r
-                'a' + fromX, ONE + fromY, 'a' + toX, ONE + toY,\r
+                AAA + fromX, ONE + fromY, AAA + toX, ONE + toY,\r
                PieceToChar(PromoPiece(moveType)));\r
        break;\r
       case WhiteDrop:\r
       case BlackDrop:\r
        sprintf(user_move, "%c@%c%c\n",\r
                ToUpper(PieceToChar((ChessSquare) fromX)),\r
-                'a' + toX, ONE + toY);\r
+                AAA + toX, ONE + toY);\r
        break;\r
       case NormalMove:\r
       case WhiteCapturesEnPassant:\r
       case BlackCapturesEnPassant:\r
       case IllegalMove:  /* could be a variant we don't quite understand */\r
        sprintf(user_move, "%c%c%c%c\n",\r
-                'a' + fromX, ONE + fromY, 'a' + toX, ONE + toY);\r
+                AAA + fromX, ONE + fromY, AAA + toX, ONE + toY);\r
        break;\r
     }\r
     SendToICS(user_move);\r
@@ -3439,16 +3513,17 @@ CoordsToComputerAlgebraic(rf, ff, rt, ft, promoChar, move)
 {\r
     if (rf == DROP_RANK) {\r
        sprintf(move, "%c@%c%c\n",\r
-                ToUpper(PieceToChar((ChessSquare) ff)), 'a' + ft, ONE + rt);\r
+                ToUpper(PieceToChar((ChessSquare) ff)), AAA + ft, ONE + rt);\r
     } else {\r
        if (promoChar == 'x' || promoChar == NULLCHAR) {\r
            sprintf(move, "%c%c%c%c\n",\r
-                    'a' + ff, ONE + rf, 'a' + ft, ONE + rt);\r
+                    AAA + ff, ONE + rf, AAA + ft, ONE + rt);\r
        } else {\r
            sprintf(move, "%c%c%c%c%c\n",\r
-                    'a' + ff, ONE + rf, 'a' + ft, ONE + rt, promoChar);\r
+                    AAA + ff, ONE + rf, AAA + ft, ONE + rt, promoChar);\r
        }\r
     }\r
+    AlphaRank(move, 4);\r
 }\r
 \r
 void\r
@@ -3465,6 +3540,22 @@ ProcessICSInitScript(f)
 }\r
 \r
 \r
+/* [HGM] Shogi move preprocessor: swap digits for letters, vice versa */\r
+void\r
+AlphaRank(char *move, int n)\r
+{\r
+    char *p = move, c;\r
+\r
+    if( !appData.alphaRank ) return;\r
+\r
+    while(c = *p) {\r
+        if(c>='0' && c<='9') *p += 'a'-'0'; else\r
+        if(c>='a' && c<='z') *p -= 'a'-'0';\r
+        p++;\r
+        if(--n < 1) break;\r
+    }\r
+}\r
+\r
 /* Parser for moves from gnuchess, ICS, or user typein box */\r
 Boolean\r
 ParseOneMove(move, moveNum, moveType, fromX, fromY, toX, toY, promoChar)\r
@@ -3474,6 +3565,10 @@ ParseOneMove(move, moveNum, moveType, fromX, fromY, toX, toY, promoChar)
      int *fromX, *fromY, *toX, *toY;\r
      char *promoChar;\r
 {       \r
+    if (appData.debugMode) {\r
+        fprintf(debugFP, "move to parse: %s\n", move);\r
+    }\r
+    AlphaRank(move, 10);\r
     *moveType = yylexstr(moveNum, move);\r
 \r
     switch (*moveType) {\r
@@ -3511,13 +3606,13 @@ ParseOneMove(move, moveNum, moveType, fromX, fromY, toX, toY, promoChar)
       case BlackASideCastleFR:\r
       /* End of code added by Tord */\r
       case IllegalMove:                /* bug or odd chess variant */\r
-        *fromX = currentMoveString[0] - 'a';\r
+        *fromX = currentMoveString[0] - AAA;\r
         *fromY = currentMoveString[1] - ONE;\r
-       *toX = currentMoveString[2] - 'a';\r
+        *toX = currentMoveString[2] - AAA;\r
         *toY = currentMoveString[3] - ONE;\r
        *promoChar = currentMoveString[4];\r
-        if (*fromX < 0 || *fromX >= BOARD_WIDTH || *fromY < 0 || *fromY >= BOARD_HEIGHT ||\r
-            *toX < 0 || *toX >= BOARD_WIDTH || *toY < 0 || *toY >= BOARD_HEIGHT) {\r
+        if (*fromX < BOARD_LEFT || *fromX >= BOARD_RGHT || *fromY < 0 || *fromY >= BOARD_HEIGHT ||\r
+            *toX < BOARD_LEFT || *toX >= BOARD_RGHT || *toY < 0 || *toY >= BOARD_HEIGHT) {\r
            *fromX = *fromY = *toX = *toY = 0;\r
            return FALSE;\r
        }\r
@@ -3533,7 +3628,7 @@ ParseOneMove(move, moveNum, moveType, fromX, fromY, toX, toY, promoChar)
          (int) CharToPiece(ToUpper(currentMoveString[0])) :\r
        (int) CharToPiece(ToLower(currentMoveString[0]));\r
        *fromY = DROP_RANK;\r
-       *toX = currentMoveString[2] - 'a';\r
+        *toX = currentMoveString[2] - AAA;\r
         *toY = currentMoveString[3] - ONE;\r
        *promoChar = NULLCHAR;\r
        return TRUE;\r
@@ -3591,7 +3686,7 @@ static void ShuffleFRC( Board board )
     board[0][FindEmptySquare(board, 0)] = WhiteKing;\r
     board[0][FindEmptySquare(board, 0)] = WhiteRook;\r
 \r
-    for( i=0; i<BOARD_WIDTH; i++ ) {\r
+    for( i=BOARD_LEFT; i<BOARD_RGHT; i++ ) {\r
         board[BOARD_HEIGHT-1][i] = board[0][i] + BlackPawn - WhitePawn;\r
     }\r
 }\r
@@ -3637,7 +3732,7 @@ static void SetupFRC( Board board, int pos_index )
     board[0][ FindEmptySquare(board, 0) ] = WhiteRook;\r
 \r
     /* Mirror piece placement for black */\r
-    for( i=0; i<BOARD_WIDTH; i++ ) {\r
+    for( i=BOARD_LEFT; i<BOARD_RGHT; i++ ) {\r
         board[BOARD_HEIGHT-1][i] = board[0][i] + BlackPawn - WhitePawn;\r
     }\r
 }\r
@@ -3647,7 +3742,10 @@ InitPosition(redraw)
      int redraw;\r
 {\r
     ChessSquare (* pieces)[BOARD_SIZE];\r
-    int i, j;\r
+    int i, j, pawnRow, overrule,\r
+    oldx = gameInfo.boardWidth,\r
+    oldy = gameInfo.boardHeight,\r
+    oldh = gameInfo.holdingsWidth;\r
 \r
     currentMove = forwardMostMove = backwardMostMove = 0;\r
 \r
@@ -3662,11 +3760,11 @@ InitPosition(redraw)
         /* [HGM] Build normal castling rights */\r
         for( j=0; j<BOARD_SIZE; j++ ) initialRights[j] = -1;\r
         nrCastlingRights = 6;\r
-        castlingRights[0][0] = initialRights[0] = BOARD_WIDTH-1;\r
-        castlingRights[0][1] = initialRights[1] = 0;\r
+        castlingRights[0][0] = initialRights[0] = BOARD_RGHT-1;\r
+        castlingRights[0][1] = initialRights[1] = BOARD_LEFT;\r
         castlingRights[0][2] = initialRights[2] = BOARD_WIDTH>>1;\r
-        castlingRights[0][3] = initialRights[3] = BOARD_WIDTH-1;\r
-        castlingRights[0][4] = initialRights[4] = 0;\r
+        castlingRights[0][3] = initialRights[3] = BOARD_RGHT-1;\r
+        castlingRights[0][4] = initialRights[4] = BOARD_LEFT;\r
         castlingRights[0][5] = initialRights[5] = BOARD_WIDTH>>1;\r
 \r
         castlingRank[0] = castlingRank[1] = castlingRank[2] = 0;\r
@@ -3683,15 +3781,17 @@ InitPosition(redraw)
     /* empty squares. This initial position is then copied to boards[0],  */\r
     /* possibly after shuffling, so that it remains available.            */\r
 \r
+    gameInfo.holdingsWidth = 0; /* default board sizes */\r
+    gameInfo.boardWidth    = 8;\r
+    gameInfo.boardHeight   = 8;\r
+    gameInfo.holdingsSize  = 0;\r
+\r
     switch (gameInfo.variant) {\r
     default:\r
-      pieces = BOARD_WIDTH <= 8  ? FIDEArray :\r
-               BOARD_WIDTH <= 10 ? CapablancaArray : CourierArray;\r
+      pieces = FIDEArray;\r
       break;\r
     case VariantShatranj:\r
       pieces = ShatranjArray;\r
-      CharToPiece('E'); /* associate PGN/FEN letter with internal piece type */\r
-      CharToPiece('e');\r
       nrCastlingRights = 0;\r
       for(i=0; i<BOARD_SIZE; i++) initialRights[i] = -1;\r
       break;\r
@@ -3704,26 +3804,61 @@ InitPosition(redraw)
       castlingRank[6] = BOARD_HEIGHT-1;\r
       startedFromSetupPosition = TRUE;\r
       break;\r
-#ifdef FAIRY\r
     case VariantCapablanca:\r
       pieces = CapablancaArray;\r
+      gameInfo.boardWidth = 10;\r
       break;\r
     case VariantGothic:\r
       pieces = GothicArray;\r
+      gameInfo.boardWidth = 10;\r
       break;\r
     case VariantXiangqi:\r
       pieces = XiangqiArray;\r
+      gameInfo.boardWidth  = 9;\r
+      gameInfo.boardHeight = 10;\r
+      nrCastlingRights = 0;\r
+      for(i=0; i<BOARD_SIZE; i++) initialRights[i] = -1;\r
+      strcpy(pieceToChar, "PN.R.MKE...C....pn.r.mke...c...."); \r
+      break;\r
+    case VariantShogi:\r
+      pieces = ShogiArray;\r
+      gameInfo.boardWidth  = 9;\r
+      gameInfo.boardHeight = 9;\r
+      gameInfo.holdingsSize = 7;\r
+      nrCastlingRights = 0;\r
+      for(i=0; i<BOARD_SIZE; i++) initialRights[i] = -1;\r
+      strcpy(pieceToChar, "PNBRLSGPNBRLS..Kpnbrlsgpnbrls..k"); \r
+      break;\r
+    case VariantShowgi:\r
+      pieces = ShogiArray;\r
+      gameInfo.boardWidth  = 9;\r
+      gameInfo.boardHeight = 9;\r
+      gameInfo.holdingsSize = 7;\r
+      nrCastlingRights = 0;\r
+      for(i=0; i<BOARD_SIZE; i++) initialRights[i] = -1;\r
+      strcpy(pieceToChar, "PNBRQFWEHACGOUMKpnbrlsgpnbrls..k"); \r
       break;\r
     case VariantCourier:\r
       pieces = CourierArray;\r
+      gameInfo.boardWidth  = 12;\r
       nrCastlingRights = 0;\r
       for(i=0; i<BOARD_SIZE; i++) initialRights[i] = -1;\r
       break;\r
+    case VariantKnightmate:\r
+      pieces = KnightmateArray;\r
+      strcpy(pieceToChar, "PNBRQFWEHACGOMK.pnbrqfwehacgomK."); \r
+      break;\r
     case VariantFairy:\r
       pieces = fairyArray;\r
+      strcpy(pieceToChar, "PNBRQFWEHACGOMUKpnbrqfwehacgomuk"); \r
       startedFromSetupPosition = TRUE;\r
       break;\r
-#endif\r
+    case VariantCrazyhouse:\r
+    case VariantBughouse:\r
+      pieces = FIDEArray;\r
+      gameInfo.holdingsSize = 5;\r
+      strcpy(pieceToChar, "PNBRQ...NBRQ...Kpnbrq...nbrq...k"); \r
+      break;\r
     case VariantWildCastle:\r
       pieces = FIDEArray;\r
       /* !!?shuffle with kings guaranteed to be on d or e file */\r
@@ -3736,27 +3871,62 @@ InitPosition(redraw)
       break;\r
     }\r
 \r
-    for( j=0; j<BOARD_WIDTH; j++ ) {\r
+    overrule = 0;\r
+    if(appData.NrFiles >= 0) {\r
+        if(gameInfo.boardWidth != appData.NrFiles) overrule++;\r
+        gameInfo.boardWidth = appData.NrFiles;\r
+    }\r
+    if(appData.NrRanks >= 0) {\r
+        if(gameInfo.boardHeight != appData.NrRanks) overrule++;\r
+        gameInfo.boardHeight = appData.NrRanks;\r
+    }\r
+    if(appData.holdingsSize >= 0) {\r
+        i = appData.holdingsSize;\r
+        if(i > gameInfo.boardHeight) i = gameInfo.boardHeight;\r
+        gameInfo.holdingsSize = i;\r
+    }\r
+    if(gameInfo.holdingsSize) gameInfo.holdingsWidth = 2;\r
+    if(BOARD_HEIGHT > BOARD_SIZE || BOARD_WIDTH > BOARD_SIZE)\r
+        DisplayFatalError("Recompile to support this BOARD_SIZE!", 0, 2);\r
+\r
+    pawnRow = gameInfo.boardHeight - 7; /* seems to work in all variants */\r
+\r
+    /* User pieceToChar list overrules defaults */\r
+    if(appData.pieceToCharTable != NULL)\r
+        strcpy(pieceToChar, appData.pieceToCharTable);\r
+\r
+    for( j=0; j<BOARD_WIDTH; j++ ) { ChessSquare s = EmptySquare;\r
+\r
+        if(j==BOARD_LEFT-1 || j==BOARD_RGHT)\r
+            s = (ChessSquare) 0; /* account holding counts in guard band */\r
         for( i=0; i<BOARD_HEIGHT; i++ )\r
-            initialPosition[i][j] = EmptySquare;\r
-        initialPosition[0][j] = pieces[0][j];\r
+            initialPosition[i][j] = s;\r
+\r
+        if(j < BOARD_LEFT || j >= BOARD_RGHT || overrule) continue;\r
+        initialPosition[0][j] = pieces[0][j-gameInfo.holdingsWidth];\r
+        initialPosition[pawnRow][j] = WhitePawn;\r
+        initialPosition[BOARD_HEIGHT-pawnRow-1][j] = BlackPawn;\r
         if(gameInfo.variant == VariantXiangqi) {\r
             if(j&1) {\r
-                initialPosition[3][j] = \r
-                initialPosition[BOARD_HEIGHT-4][j] = EmptySquare;\r
-                if(j==1 || j>=BOARD_WIDTH-2) {\r
-                    initialPosition[2][j] = WhiteFairyMarshall;\r
-                    initialPosition[BOARD_HEIGHT-3][j] = BlackFairyMarshall;\r
+                initialPosition[pawnRow][j] = \r
+                initialPosition[BOARD_HEIGHT-pawnRow-1][j] = EmptySquare;\r
+                if(j==BOARD_LEFT+1 || j>=BOARD_RGHT-2) {\r
+                   initialPosition[2][j] = WhiteCannon;\r
+                   initialPosition[BOARD_HEIGHT-3][j] = BlackCannon;\r
                 }\r
-            } else {\r
-                initialPosition[3][j] = WhitePawn;\r
-                initialPosition[BOARD_HEIGHT-4][j] = BlackPawn;\r
             }\r
-        } else {\r
-            initialPosition[1][j] = WhitePawn;\r
-            initialPosition[BOARD_HEIGHT-2][j] = BlackPawn;\r
         }\r
-        initialPosition[BOARD_HEIGHT-1][j] =  pieces[1][j];\r
+        initialPosition[BOARD_HEIGHT-1][j] =  pieces[1][j-gameInfo.holdingsWidth];\r
+    }\r
+    if( (gameInfo.variant == VariantShogi\r
+       ||gameInfo.variant == VariantShowgi\r
+                                         ) && !overrule ) {\r
+            j=BOARD_LEFT+1;\r
+            initialPosition[1][j] = WhiteBishop;\r
+            initialPosition[BOARD_HEIGHT-2][j] = BlackRook;\r
+            j=BOARD_RGHT-2;\r
+            initialPosition[1][j] = WhiteRook;\r
+            initialPosition[BOARD_HEIGHT-2][j] = BlackBishop;\r
     }\r
 \r
     if(gameInfo.variant == VariantFischeRandom) {\r
@@ -3770,6 +3940,11 @@ InitPosition(redraw)
 \r
     CopyBoard(boards[0], initialPosition);\r
 \r
+    if(oldx != gameInfo.boardWidth ||\r
+       oldy != gameInfo.boardHeight ||\r
+       oldh != gameInfo.holdingsWidth )\r
+            InitDrawingSizes(-1 ,0);\r
+\r
     if (redraw)\r
       DrawPosition(TRUE, boards[currentMove]);\r
 }\r
@@ -3799,10 +3974,10 @@ SendBoard(cps, moveNum)
       SendToProgram("#\n", cps);\r
       for (i = BOARD_HEIGHT - 1; i >= 0; i--) {\r
        bp = &boards[moveNum][i][0];\r
-        for (j = 0; j < BOARD_WIDTH; j++, bp++) {\r
+        for (j = BOARD_LEFT; j < BOARD_RGHT; j++, bp++) {\r
          if ((int) *bp < (int) BlackPawn) {\r
            sprintf(message, "%c%c%c\n", PieceToChar(*bp), \r
-                    'a' + j, ONE + i);\r
+                    AAA + j, ONE + i);\r
            SendToProgram(message, cps);\r
          }\r
        }\r
@@ -3811,11 +3986,11 @@ SendBoard(cps, moveNum)
       SendToProgram("c\n", cps);\r
       for (i = BOARD_HEIGHT - 1; i >= 0; i--) {\r
        bp = &boards[moveNum][i][0];\r
-        for (j = 0; j < BOARD_WIDTH; j++, bp++) {\r
+        for (j = BOARD_LEFT; j < BOARD_RGHT; j++, bp++) {\r
          if (((int) *bp != (int) EmptySquare)\r
              && ((int) *bp >= (int) BlackPawn)) {\r
            sprintf(message, "%c%c%c\n", ToUpper(PieceToChar(*bp)),\r
-                    'a' + j, ONE + i);\r
+                    AAA + j, ONE + i);\r
            SendToProgram(message, cps);\r
          }\r
        }\r
@@ -3829,19 +4004,45 @@ int
 IsPromotion(fromX, fromY, toX, toY)\r
      int fromX, fromY, toX, toY;\r
 {\r
-    return gameMode != EditPosition && gameInfo.variant != VariantXiangqi &&\r
-      fromX >=0 && fromY >= 0 && toX >= 0 && toY >= 0 &&\r
-       ((boards[currentMove][fromY][fromX] == WhitePawn && toY == BOARD_HEIGHT-1) ||\r
-        (boards[currentMove][fromY][fromX] == BlackPawn && toY == 0));\r
+    /* [HGM] add Shogi promotions */\r
+    int promotionZoneSize=1, highestPromotingPiece = (int)WhitePawn;\r
+    ChessSquare piece;\r
+\r
+    if(gameMode == EditPosition || gameInfo.variant == VariantXiangqi ||\r
+      !(fromX >=0 && fromY >= 0 && toX >= 0 && toY >= 0) ) return FALSE;\r
+   /* [HGM] Note to self: line above also weeds out drops */\r
+    piece = boards[currentMove][fromY][fromX];\r
+    if(gameInfo.variant == VariantShogi) {\r
+        promotionZoneSize = 3;\r
+        highestPromotingPiece = (int)WhiteFerz; /* Silver */\r
+    }\r
+    if((int)piece >= BlackPawn) {\r
+        if(toY >= promotionZoneSize && fromY >= promotionZoneSize)\r
+             return FALSE;\r
+        highestPromotingPiece = WHITE_TO_BLACK highestPromotingPiece;\r
+    } else {\r
+        if(  toY < BOARD_HEIGHT - promotionZoneSize &&\r
+           fromY < BOARD_HEIGHT - promotionZoneSize) return FALSE;\r
+    }\r
+    return ( (int)piece <= highestPromotingPiece );\r
 }\r
 \r
+int\r
+InPalace(row, column)\r
+     int row, column;\r
+{   /* [HGM] for Xiangqi */\r
+    if( (row < 3 || row > BOARD_HEIGHT-4) &&\r
+         column < (BOARD_WIDTH + 4)/2 &&\r
+         column > (BOARD_WIDTH - 5)/2 ) return TRUE;\r
+    return FALSE;\r
+}\r
 \r
 int\r
 PieceForSquare (x, y)\r
      int x;\r
      int y;\r
 {\r
-  if (x < 0 || x >= BOARD_WIDTH || y < 0 || y >= BOARD_HEIGHT)\r
+  if (x < BOARD_LEFT || x >= BOARD_RGHT || y < 0 || y >= BOARD_HEIGHT)\r
      return -1;\r
   else\r
      return boards[currentMove][y][x];\r
@@ -3958,17 +4159,19 @@ char lastLoadGameTitle[MSG_SIZ], lastLoadPositionTitle[MSG_SIZ];
 ChessMove lastLoadGameStart = (ChessMove) 0;\r
 \r
 \r
-void\r
-UserMoveEvent(fromX, fromY, toX, toY, promoChar)\r
+ChessMove\r
+UserMoveTest(fromX, fromY, toX, toY, promoChar)\r
      int fromX, fromY, toX, toY;\r
      int promoChar;\r
 {\r
     ChessMove moveType;\r
 \r
-    if (fromX < 0 || fromY < 0) return;\r
+    if (fromX < 0 || fromY < 0) return ImpossibleMove;\r
     if ((fromX == toX) && (fromY == toY)) {\r
-       return;\r
+        return ImpossibleMove;\r
     }\r
+    /* [HGM] suppress all moves into holdings area and guard band */\r
+    if( toX < BOARD_LEFT || toX >= BOARD_RGHT ) return ImpossibleMove;\r
        \r
     /* Check if the user is playing in turn.  This is complicated because we\r
        let the user "pick up" a piece before it is his turn.  So the piece he\r
@@ -3990,13 +4193,13 @@ UserMoveEvent(fromX, fromY, toX, toY, promoChar)
       case IcsIdle:\r
        /* We switched into a game mode where moves are not accepted,\r
            perhaps while the mouse button was down. */\r
-       return;\r
+        return ImpossibleMove;\r
 \r
       case MachinePlaysWhite:\r
        /* User is moving for Black */\r
        if (WhiteOnMove(currentMove)) {\r
            DisplayMoveError("It is White's turn");\r
-           return;\r
+            return ImpossibleMove;\r
        }\r
        break;\r
 \r
@@ -4004,7 +4207,7 @@ UserMoveEvent(fromX, fromY, toX, toY, promoChar)
        /* User is moving for White */\r
        if (!WhiteOnMove(currentMove)) {\r
            DisplayMoveError("It is Black's turn");\r
-           return;\r
+            return ImpossibleMove;\r
        }\r
        break;\r
 \r
@@ -4018,13 +4221,13 @@ UserMoveEvent(fromX, fromY, toX, toY, promoChar)
            /* User is moving for Black */\r
            if (WhiteOnMove(currentMove)) {\r
                DisplayMoveError("It is White's turn");\r
-               return;\r
+                return ImpossibleMove;\r
            }\r
        } else {\r
            /* User is moving for White */\r
            if (!WhiteOnMove(currentMove)) {\r
                DisplayMoveError("It is Black's turn");\r
-               return;\r
+                return ImpossibleMove;\r
            }\r
        }\r
        break;\r
@@ -4046,7 +4249,7 @@ UserMoveEvent(fromX, fromY, toX, toY, promoChar)
                            "fromY %d, toX %d, toY %d\n",\r
                            fromX, fromY, toX, toY);\r
            }\r
-           return;\r
+            return ImpossibleMove;\r
        }\r
        break;\r
 \r
@@ -4067,7 +4270,7 @@ UserMoveEvent(fromX, fromY, toX, toY, promoChar)
                            "fromY %d, toX %d, toY %d\n",\r
                            fromX, fromY, toX, toY);\r
            }\r
-           return;\r
+            return ImpossibleMove;\r
        }\r
        break;\r
 \r
@@ -4083,10 +4286,17 @@ UserMoveEvent(fromX, fromY, toX, toY, promoChar)
            boards[0][fromY][fromX] = EmptySquare;\r
            DrawPosition(FALSE, boards[currentMove]);\r
        }\r
-       return;\r
+        return ImpossibleMove;\r
+    }\r
+\r
+    if (toX < 0 || toY < 0) return ImpossibleMove;\r
+\r
+    /* [HGM] If move started in holdings, it means a drop */\r
+    if( fromX == BOARD_LEFT-2 || fromX == BOARD_RGHT+1) {\r
+         if( boards[currentMove][toY][toX] != EmptySquare ) return ImpossibleMove;\r
+         return WhiteDrop; /* Not needed to specify white or black yet */\r
     }\r
 \r
-    if (toX < 0 || toY < 0) return;\r
     userOfferedDraw = FALSE;\r
        \r
     if (appData.testLegality) {\r
@@ -4095,12 +4305,45 @@ UserMoveEvent(fromX, fromY, toX, toY, promoChar)
                                          fromY, fromX, toY, toX, promoChar);\r
        if (moveType == IllegalMove || moveType == ImpossibleMove) {\r
            DisplayMoveError("Illegal move");\r
-           return;\r
+            return ImpossibleMove;\r
        }\r
     } else {\r
        moveType = PromoCharToMoveType(WhiteOnMove(currentMove), promoChar);\r
     }\r
 \r
+    return moveType;\r
+    /* [HGM] <popupFix> in stead of calling FinishMove directly, this\r
+       function is made into one that returns an OK move type if FinishMove\r
+       should be called. This to give the calling driver routine the\r
+       opportunity to finish the userMove input with a promotion popup,\r
+       without bothering the user with this for invalid or illegal moves */\r
+\r
+/*    FinishMove(moveType, fromX, fromY, toX, toY, promoChar); */\r
+}\r
+\r
+/* Common tail of UserMoveEvent and DropMenuEvent */\r
+void\r
+FinishMove(moveType, fromX, fromY, toX, toY, promoChar)\r
+     ChessMove moveType;\r
+     int fromX, fromY, toX, toY;\r
+     /*char*/int promoChar;\r
+{\r
+    /* [HGM] <popupFix> kludge to avoid having know the exact promotion\r
+       move type in caller when we know the move is a legal promotion */\r
+    if(moveType == NormalMove)\r
+        moveType = PromoCharToMoveType(WhiteOnMove(currentMove), promoChar);\r
+\r
+    /* [HGM] convert drag-and-drop piece drops to standard form */\r
+    if( fromX == BOARD_LEFT-2 || fromX == BOARD_RGHT+1) {\r
+         moveType = WhiteOnMove(currentMove) ? WhiteDrop : BlackDrop;\r
+         fromX = boards[currentMove][fromY][fromX];\r
+         fromY = DROP_RANK;\r
+    }\r
+\r
+    /* [HGM] <popupFix> The following if has been moved here from\r
+       UserMoveEnevt(). Because it seemed to belon here (why not allow\r
+       piece drops in training games?), and because it can only be\r
+       performed after it is known to what we promote. */\r
     if (gameMode == Training) {\r
       /* compare the move played on the board to the next move in the\r
        * game. If they match, display the move and the opponent's response. \r
@@ -4136,16 +4379,6 @@ UserMoveEvent(fromX, fromY, toX, toY, promoChar)
       return;\r
     }\r
 \r
-    FinishMove(moveType, fromX, fromY, toX, toY, promoChar);\r
-}\r
-\r
-/* Common tail of UserMoveEvent and DropMenuEvent */\r
-void\r
-FinishMove(moveType, fromX, fromY, toX, toY, promoChar)\r
-     ChessMove moveType;\r
-     int fromX, fromY, toX, toY;\r
-     /*char*/int promoChar;\r
-{\r
   /* Ok, now we know that the move is good, so we can kill\r
      the previous line in Analysis Mode */\r
   if (gameMode == AnalyzeMode && currentMove < forwardMostMove) {\r
@@ -4236,6 +4469,26 @@ FinishMove(moveType, fromX, fromY, toX, toY, promoChar)
   }\r
 }\r
 \r
+void\r
+UserMoveEvent(fromX, fromY, toX, toY, promoChar)\r
+     int fromX, fromY, toX, toY;\r
+     int promoChar;\r
+{\r
+    /* [HGM] This routine was added to allow calling of its two logical\r
+       parts from other modules in the old way. Before, UserMoveEvent()\r
+       automatically called FinishMove() if the move was OK, and returned\r
+       otherwise. I separated the two, in order to make it possible to\r
+       slip a promotion popup in between. But that it always needs two\r
+       calls, to the first part, (now called UserMoveTest() ), and to\r
+       FinishMove if the first part succeeded. Calls that do not need\r
+       to do anything in between, can call this routine the old way. \r
+    */\r
+    ChessMove moveType = UserMoveTest(fromX, fromY, toX, toY, promoChar);\r
+\r
+    if(moveType != ImpossibleMove)\r
+        FinishMove(moveType, fromX, fromY, toX, toY, promoChar);\r
+}\r
+\r
 void SendProgramStatsToFrontend( ChessProgramState * cps, ChessProgramStats * cpstats )\r
 {\r
     char * hint = lastHint;\r
@@ -4370,15 +4623,17 @@ HandleMachineMove(message, cps)
            return;\r
        }\r
 \r
-       if (!ParseOneMove(machineMove, forwardMostMove, &moveType,\r
-                             &fromX, &fromY, &toX, &toY, &promoChar)) {\r
+        if (!ParseOneMove(machineMove, forwardMostMove, &moveType,\r
+                              &fromX, &fromY, &toX, &toY, &promoChar)) {\r
            /* Machine move could not be parsed; ignore it. */\r
             sprintf(buf1, "Illegal move \"%s\" from %s machine",\r
                    machineMove, cps->which);\r
            DisplayError(buf1, 0);\r
+            sprintf(buf1, "Xboard: Forfeit due to invalid move: %s (%c%c%c%c) res=%d%c",\r
+                    machineMove, fromX+AAA, fromY+ONE, toX+AAA, toY+ONE, 0);\r
            if (gameMode == TwoMachinesPlay) {\r
              GameEnds(machineWhite ? BlackWins : WhiteWins,\r
-                      "Forfeit due to illegal move", GE_XBOARD);\r
+                       buf1, GE_XBOARD);\r
            }\r
            return;\r
        }\r
@@ -4389,19 +4644,21 @@ HandleMachineMove(message, cps)
         /* to cause a forfeit on a justified illegal-move complaint      */\r
         /* of the opponent.                                              */\r
         if(gameMode==TwoMachinesPlay && appData.testLegality &&\r
+           fromY != DROP_RANK && /* [HGM] temporary; should still add legality test for drops */\r
            LegalityTest(boards[forwardMostMove], PosFlags(forwardMostMove),\r
                         epStatus[forwardMostMove], castlingRights[forwardMostMove],\r
                              fromY, fromX, toY, toX, promoChar) == IllegalMove)\r
-           { static char buf[MSG_SIZ];\r
+           {\r
            if (appData.debugMode) {\r
                 int i;\r
                 for(i=0; i< nrCastlingRights; i++) fprintf(debugFP, "(%d,%d) ",\r
                     castlingRights[forwardMostMove][i], castlingRank[i]);\r
                 fprintf(debugFP, "castling rights\n");\r
            }\r
-              sprintf(buf, "Xboard: Forfeit due to illegal move %s (%c%c%c%c)%c",\r
-                            machineMove, fromX+'a', fromY+ONE, toX+'a', toY+ONE, 0);\r
-              GameEnds(machineWhite ? BlackWins : WhiteWins, buf, GE_XBOARD);\r
+            sprintf(buf1, "Xboard: Forfeit due to illegal move: %s (%c%c%c%c)%c",\r
+                    machineMove, fromX+AAA, fromY+ONE, toX+AAA, toY+ONE, 0);\r
+             GameEnds(machineWhite ? BlackWins : WhiteWins,\r
+                       buf1, GE_XBOARD);\r
            }\r
        hintRequested = FALSE;\r
        lastHint[0] = NULLCHAR;\r
@@ -4464,10 +4721,11 @@ HandleMachineMove(message, cps)
 \r
 #ifdef ADJUDICATE // [HGM] some adjudications useful with buggy engines\r
 \r
-        if( gameMode == TwoMachinesPlay ) {\r
+        if( gameMode == TwoMachinesPlay && gameInfo.holdingsSize == 0) {\r
             int count = 0, epFile = epStatus[forwardMostMove];\r
 \r
-            if(appData.testLegality) // don't wait for engine to announce game end if we can judge ourselves\r
+            if(appData.testLegality && appData.checkMates) \r
+            // don't wait for engine to announce game end if we can judge ourselves\r
             switch (MateTest(boards[forwardMostMove],\r
                                  PosFlags(forwardMostMove), epFile,\r
                                        castlingRights[forwardMostMove]) ) {\r
@@ -4496,7 +4754,7 @@ HandleMachineMove(message, cps)
                 static int moveCount;\r
 \r
                 /* First absolutely insufficient mating material. Count what is on board. */\r
-                for(i=0; i<BOARD_HEIGHT; i++) for(j=0; j<BOARD_WIDTH; j++)\r
+                for(i=0; i<BOARD_HEIGHT; i++) for(j=BOARD_LEFT; j<BOARD_RGHT; j++)\r
                 {   ChessSquare p = boards[forwardMostMove][i][j];\r
                     int m=i;\r
 \r
@@ -4534,7 +4792,7 @@ HandleMachineMove(message, cps)
                      /* always flag draws, for judging claims */\r
                      epStatus[forwardMostMove] = EP_INSUF_DRAW;\r
 \r
-                     if(adjudicateLossThreshold != 0) {\r
+                     if(appData.materialDraws) {\r
                          /* but only adjudicate them if adjudication enabled */\r
                          ShowMove(fromX, fromY, toX, toY); /*updates currentMove*/\r
                          GameEnds( GameIsDrawn, "Xboard adjudication: Insufficient mating material", GE_XBOARD );\r
@@ -4549,7 +4807,7 @@ HandleMachineMove(message, cps)
                    || NrWN==2 || NrBN==2     /* KNNK */\r
                    || NrWN+NrWB == 1 && NrBN+NrBB == 1 /* KBKN, KBKB, KNKN */\r
                   ) ) {\r
-                     if(--moveCount < 0 && adjudicateLossThreshold != 0)\r
+                     if(--moveCount < 0 && appData.trivialDraws)\r
                      {    /* if the first 3 moves do not show a tactical win, declare draw */\r
                           ShowMove(fromX, fromY, toX, toY); /*updates currentMove*/\r
                           GameEnds( GameIsDrawn, "Xboard adjudication: Trivial draw", GE_XBOARD );\r
@@ -4605,7 +4863,7 @@ HandleMachineMove(message, cps)
       fprintf(debugFP, " %d %d\n", rights, k);\r
     }\r
                         if( rights == 0 && ++count > appData.drawRepeats-2\r
-                            && adjudicateLossThreshold != 0) {\r
+                            && appData.drawRepeats > 1) {\r
                              /* adjudicate after user-specified nr of repeats */\r
                              ShowMove(fromX, fromY, toX, toY); /*updates currentMove*/\r
                              GameEnds( GameIsDrawn, "Xboard adjudication: repetition draw", GE_XBOARD );\r
@@ -4628,7 +4886,7 @@ HandleMachineMove(message, cps)
                 if( count >= 100)\r
                          epStatus[forwardMostMove] = EP_RULE_DRAW;\r
                          /* this is used to judge if draw claims are legal */\r
-                if(adjudicateLossThreshold != 0 && count >= 2*appData.ruleMoves) {\r
+                if(appData.ruleMoves > 0 && count >= 2*appData.ruleMoves) {\r
                          ShowMove(fromX, fromY, toX, toY); /*updates currentMove*/\r
                          GameEnds( GameIsDrawn, "Xboard adjudication: 50-move rule", GE_XBOARD );\r
                          return;\r
@@ -4868,11 +5126,8 @@ HandleMachineMove(message, cps)
         /* [HGM] illegal-move claim should forfeit game when Xboard */\r
         /* only passes fully legal moves                            */\r
         if( appData.testLegality && gameMode == TwoMachinesPlay ) {\r
-            static char buf[MSG_SIZ];\r
-            sprintf(buf, "False illegal-move claim on %s (%c%c%c%c)%c",\r
-                    machineMove, fromX+'a', fromY+ONE, toX+'a', toY+ONE, 0);\r
             GameEnds( cps->twoMachinesColor[0] == 'w' ? BlackWins : WhiteWins,\r
-                                buf, GE_XBOARD );\r
+                                "False illegal-move claim", GE_XBOARD );\r
         }\r
        return;\r
     }\r
@@ -5420,9 +5675,9 @@ ParseGameHistory(game)
           case BlackASideCastleFR:\r
           /* POP Fabien */\r
          case IllegalMove:             /* maybe suicide chess, etc. */\r
-           fromX = currentMoveString[0] - 'a';\r
+            fromX = currentMoveString[0] - AAA;\r
             fromY = currentMoveString[1] - ONE;\r
-           toX = currentMoveString[2] - 'a';\r
+            toX = currentMoveString[2] - AAA;\r
             toY = currentMoveString[3] - ONE;\r
            promoChar = currentMoveString[4];\r
            break;\r
@@ -5432,7 +5687,7 @@ ParseGameHistory(game)
              (int) CharToPiece(ToUpper(currentMoveString[0])) :\r
            (int) CharToPiece(ToLower(currentMoveString[0]));\r
            fromY = DROP_RANK;\r
-           toX = currentMoveString[2] - 'a';\r
+            toX = currentMoveString[2] - AAA;\r
             toY = currentMoveString[3] - ONE;\r
            promoChar = NULLCHAR;\r
            break;\r
@@ -5533,11 +5788,12 @@ ApplyMove(fromX, fromY, toX, toY, promoChar, board)
      int promoChar;\r
      Board board;\r
 {\r
+    ChessSquare captured = board[toY][toX], piece; int p;\r
+\r
     /* [HGM] In Shatranj and Courier all promotions are to Ferz */\r
     if((gameInfo.variant==VariantShatranj || gameInfo.variant==VariantCourier)\r
-       && promoChar != 0) promoChar = 'f';\r
+       && promoChar != 0) promoChar = 'F';\r
          \r
-    ChessSquare captured = board[toY][toX];\r
     if (fromY == DROP_RANK) {\r
        /* must be first */\r
        board[toY][toX] = (ChessSquare) fromX;\r
@@ -5545,6 +5801,8 @@ ApplyMove(fromX, fromY, toX, toY, promoChar, board)
        return;\r
     }\r
 \r
+    piece = board[fromY][fromX];\r
+    \r
     /* Code added by Tord: */\r
     /* FRC castling assumed when king captures friendly rook. */\r
     else if (board[fromY][fromX] == WhiteKing &&\r
@@ -5552,18 +5810,18 @@ ApplyMove(fromX, fromY, toX, toY, promoChar, board)
       board[fromY][fromX] = EmptySquare;\r
       board[toY][toX] = EmptySquare;\r
       if(toX > fromX) {\r
-       board[0][BOARD_WIDTH-2] = WhiteKing; board[0][BOARD_WIDTH-3] = WhiteRook;\r
+        board[0][BOARD_RGHT-2] = WhiteKing; board[0][BOARD_RGHT-3] = WhiteRook;\r
       } else {\r
-       board[0][2] = WhiteKing; board[0][3] = WhiteRook;\r
+        board[0][BOARD_LEFT+2] = WhiteKing; board[0][BOARD_LEFT+3] = WhiteRook;\r
       }\r
     } else if (board[fromY][fromX] == BlackKing &&\r
               board[toY][toX] == BlackRook) {\r
       board[fromY][fromX] = EmptySquare;\r
       board[toY][toX] = EmptySquare;\r
       if(toX > fromX) {\r
-       board[BOARD_HEIGHT-1][BOARD_WIDTH-2] = BlackKing; board[BOARD_HEIGHT-1][BOARD_WIDTH-3] = BlackRook;\r
+        board[BOARD_HEIGHT-1][BOARD_RGHT-2] = BlackKing; board[BOARD_HEIGHT-1][BOARD_RGHT-3] = BlackRook;\r
       } else {\r
-       board[BOARD_HEIGHT-1][2] = BlackKing; board[BOARD_HEIGHT-1][3] = BlackRook;\r
+        board[BOARD_HEIGHT-1][BOARD_LEFT+2] = BlackKing; board[BOARD_HEIGHT-1][BOARD_LEFT+3] = BlackRook;\r
       }\r
     /* End of code added by Tord */\r
 \r
@@ -5572,14 +5830,14 @@ ApplyMove(fromX, fromY, toX, toY, promoChar, board)
         && toY == fromY && toX > fromX+1) {\r
        board[fromY][fromX] = EmptySquare;\r
        board[toY][toX] = WhiteKing;\r
-        board[fromY][BOARD_WIDTH-1] = EmptySquare;\r
+        board[fromY][BOARD_RGHT-1] = EmptySquare;\r
         board[toY][toX-1] = WhiteRook;\r
     } else if (initialPosition[fromY][fromX] == WhiteKing\r
               && board[fromY][fromX] == WhiteKing\r
                && toY == fromY && toX < fromX-1) {\r
        board[fromY][fromX] = EmptySquare;\r
        board[toY][toX] = WhiteKing;\r
-       board[fromY][0] = EmptySquare;\r
+        board[fromY][BOARD_LEFT] = EmptySquare;\r
         board[toY][toX+1] = WhiteRook;\r
     } else if (fromY == 0 && fromX == 3\r
               && board[fromY][fromX] == WhiteKing\r
@@ -5606,6 +5864,8 @@ ApplyMove(fromX, fromY, toX, toY, promoChar, board)
         if (board[toY][toX] == EmptySquare) {\r
             board[toY][toX] = WhiteQueen;\r
        }\r
+        if(gameInfo.variant==VariantCrazyhouse) /* [HGM] use shadow piece */\r
+            board[toY][toX] += (int) WhiteAlfil - (int) WhitePawn;\r
        board[fromY][fromX] = EmptySquare;\r
     } else if ((fromY == BOARD_HEIGHT-4)\r
               && (toX != fromX)\r
@@ -5620,14 +5880,14 @@ ApplyMove(fromX, fromY, toX, toY, promoChar, board)
                && toY == fromY && toX > fromX+1) {\r
        board[fromY][fromX] = EmptySquare;\r
        board[toY][toX] = BlackKing;\r
-        board[fromY][BOARD_WIDTH-1] = EmptySquare;\r
+        board[fromY][BOARD_RGHT-1] = EmptySquare;\r
         board[toY][toX-1] = BlackRook;\r
     } else if (initialPosition[fromY][fromX] == BlackKing\r
               && board[fromY][fromX] == BlackKing\r
                && toY == fromY && toX < fromX-1) {\r
        board[fromY][fromX] = EmptySquare;\r
        board[toY][toX] = BlackKing;\r
-       board[fromY][0] = EmptySquare;\r
+        board[fromY][BOARD_LEFT] = EmptySquare;\r
         board[toY][toX+1] = BlackRook;\r
     } else if (fromY == 7 && fromX == 3\r
               && board[fromY][fromX] == BlackKing\r
@@ -5654,6 +5914,8 @@ ApplyMove(fromX, fromY, toX, toY, promoChar, board)
        if (board[0][toX] == EmptySquare) {\r
            board[0][toX] = BlackQueen;\r
        }\r
+        if(gameInfo.variant==VariantCrazyhouse) /* [HGM] use shadow piece */\r
+            board[toY][toX] += (int) WhiteAlfil - (int) WhitePawn;\r
        board[fromY][fromX] = EmptySquare;\r
     } else if ((fromY == 3)\r
               && (toX != fromX)\r
@@ -5667,28 +5929,62 @@ ApplyMove(fromX, fromY, toX, toY, promoChar, board)
        board[toY][toX] = board[fromY][fromX];\r
        board[fromY][fromX] = EmptySquare;\r
     }\r
-    if (gameInfo.variant == VariantCrazyhouse) {\r
-#if 0\r
-      /* !!A lot more code needs to be written to support holdings */\r
+    if (gameInfo.holdingsWidth != 0) {\r
+\r
+      /* !!A lot more code needs to be written to support holdings  */\r
+      /* [HGM] OK, so I have written it. Holdings are stored in the */\r
+      /* penultimate board files, so they are automaticlly stored   */\r
+      /* in the game history.                                       */\r
       if (fromY == DROP_RANK) {\r
-       /* Delete from holdings */\r
-       if (holdings[(int) fromX] > 0) holdings[(int) fromX]--;\r
+        /* Delete from holdings, by decreasing count */\r
+        /* and erasing image if necessary            */\r
+        p = (int) fromX;\r
+        if(p < (int) BlackPawn) { /* white drop */\r
+             p -= (int)WhitePawn;\r
+             if(p >= gameInfo.holdingsSize) p = 0;\r
+             if(--board[p][BOARD_WIDTH-2] == 0)\r
+                  board[p][BOARD_WIDTH-1] = EmptySquare;\r
+        } else {                  /* black drop */\r
+             p -= (int)BlackPawn;\r
+             if(p >= gameInfo.holdingsSize) p = 0;\r
+             if(--board[BOARD_HEIGHT-1-p][1] == 0)\r
+                  board[BOARD_HEIGHT-1-p][0] = EmptySquare;\r
+        }\r
       }\r
-      if (captured != EmptySquare) {\r
-       /* Add to holdings */\r
-       if (captured < BlackPawn) {\r
-         holdings[(int)captured - (int)BlackPawn + (int)WhitePawn]++;\r
+      if (captured != EmptySquare && gameInfo.holdingsSize > 0\r
+          && gameInfo.variant != VariantBughouse        ) {\r
+        /* Add to holdings, if holdings exist */\r
+        p = (int) captured;\r
+        if (p >= (int) BlackPawn) {\r
+          p -= (int)BlackPawn;\r
+          if(gameInfo.variant == VariantShogi && DEMOTED p >= 0) {\r
+                  /* in Shogi restore piece to its original  first */\r
+                  captured = (ChessSquare) (DEMOTED captured);\r
+                  p = DEMOTED p;\r
+          }\r
+          if(p >= gameInfo.holdingsSize) { p = 0; captured = BlackPawn; }\r
+          board[p][BOARD_WIDTH-2]++;\r
+          board[p][BOARD_WIDTH-1] =\r
+                                   BLACK_TO_WHITE captured;\r
        } else {\r
-         holdings[(int)captured - (int)WhitePawn + (int)BlackPawn]++;\r
+          p -= (int)WhitePawn;\r
+          if(gameInfo.variant == VariantShogi && DEMOTED p >= 0) {\r
+                  captured = (ChessSquare) (DEMOTED captured);\r
+                  p = DEMOTED p;\r
+          }\r
+          if(p >= gameInfo.holdingsSize) { p = 0; captured = WhitePawn; }\r
+          board[BOARD_HEIGHT-1-p][1]++;\r
+          board[BOARD_HEIGHT-1-p][0] =\r
+                                  WHITE_TO_BLACK captured;\r
        }\r
       }\r
-#endif\r
+\r
     } else if (gameInfo.variant == VariantAtomic) {\r
       if (captured != EmptySquare) {\r
        int y, x;\r
        for (y = toY-1; y <= toY+1; y++) {\r
          for (x = toX-1; x <= toX+1; x++) {\r
-           if (y >= 0 && y < BOARD_WIDTH && x >= 0 && x < BOARD_WIDTH &&\r
+            if (y >= 0 && y < BOARD_HEIGHT && x >= BOARD_LEFT && x < BOARD_RGHT &&\r
                board[y][x] != WhitePawn && board[y][x] != BlackPawn) {\r
              board[y][x] = EmptySquare;\r
            }\r
@@ -5697,6 +5993,11 @@ ApplyMove(fromX, fromY, toX, toY, promoChar, board)
        board[toY][toX] = EmptySquare;\r
       }\r
     }\r
+    if(gameInfo.variant == VariantShogi && promoChar != NULLCHAR) {\r
+        /* [HGM] Shogi promotions */\r
+        board[toY][toX] = (ChessSquare) (PROMOTED piece);\r
+    }\r
+\r
 }\r
 \r
 /* Updates forwardMostMove */\r
@@ -5731,15 +6032,15 @@ MakeMove(fromX, fromY, toX, toY, promoChar)
       if( boards[forwardMostMove][fromY][fromX] == WhitePawn ) {\r
            epStatus[forwardMostMove] = EP_PAWN_MOVE; \r
            if( toY-fromY==2 &&\r
-               (toX>1 && boards[forwardMostMove][toY][toX-1] == BlackPawn ||\r
-                toX<BOARD_WIDTH-1 && boards[forwardMostMove][toY][toX+1] == BlackPawn ) )\r
+               (toX>BOARD_LEFT+1 && boards[forwardMostMove][toY][toX-1] == BlackPawn ||\r
+                toX<BOARD_RGHT-1 && boards[forwardMostMove][toY][toX+1] == BlackPawn ) )\r
               epStatus[forwardMostMove] = toX;\r
       } else \r
       if( boards[forwardMostMove][fromY][fromX] == BlackPawn ) {\r
            epStatus[forwardMostMove] = EP_PAWN_MOVE; \r
            if( toY-fromY== -2 &&\r
-               (toX>1 && boards[forwardMostMove][toY][toX-1] == WhitePawn ||\r
-                toX<BOARD_WIDTH-1 && boards[forwardMostMove][toY][toX+1] == WhitePawn ) )\r
+               (toX>BOARD_LEFT+1 && boards[forwardMostMove][toY][toX-1] == WhitePawn ||\r
+                toX<BOARD_RGHT-1 && boards[forwardMostMove][toY][toX+1] == WhitePawn ) )\r
               epStatus[forwardMostMove] = toX;\r
        }\r
 \r
@@ -5812,20 +6113,51 @@ void
 InitChessProgram(cps)\r
      ChessProgramState *cps;\r
 {\r
-    char buf[MSG_SIZ];\r
+    char buf[MSG_SIZ], *b; int overruled;\r
     if (appData.noChessProgram) return;\r
     hintRequested = FALSE;\r
     bookRequested = FALSE;\r
     SendToProgram(cps->initString, cps);\r
     if (gameInfo.variant != VariantNormal &&\r
-       gameInfo.variant != VariantLoadable) {\r
+       gameInfo.variant != VariantLoadable\r
+        /* [HGM] also send variant if board size non-standard */\r
+        || gameInfo.boardWidth != 8 || gameInfo.boardHeight != 8\r
+                                            ) {\r
       char *v = VariantName(gameInfo.variant);\r
       if (StrStr(cps->variants, v) == NULL) {\r
        sprintf(buf, "Variant %s not supported by %s", v, cps->tidy);\r
        DisplayFatalError(buf, 0, 1);\r
        return;\r
       }\r
-      sprintf(buf, "variant %s\n", VariantName(gameInfo.variant));\r
+      b = buf;\r
+      /* [HGM] make prefix for non-standard board size. Awkward testing... */\r
+      overruled = gameInfo.boardWidth != 8 || gameInfo.boardHeight != 8 || gameInfo.holdingsSize != 0;\r
+      if( gameInfo.variant == VariantXiangqi )\r
+           overruled = gameInfo.boardWidth != 9 || gameInfo.boardHeight != 10 || gameInfo.holdingsSize != 0;\r
+      if( gameInfo.variant == VariantShogi )\r
+           overruled = gameInfo.boardWidth != 9 || gameInfo.boardHeight != 9 || gameInfo.holdingsSize != 7;\r
+      if( gameInfo.variant == VariantBughouse || gameInfo.variant == VariantCrazyhouse )\r
+           overruled = gameInfo.boardWidth != 8 || gameInfo.boardHeight != 8 || gameInfo.holdingsSize != 5;\r
+      if( gameInfo.variant == VariantCapablanca || gameInfo.variant == VariantGothic )\r
+           overruled = gameInfo.boardWidth != 10 || gameInfo.boardHeight != 8 || gameInfo.holdingsSize != 0;\r
+      if( gameInfo.variant == VariantCourier )\r
+           overruled = gameInfo.boardWidth != 12 || gameInfo.boardHeight != 8 || gameInfo.holdingsSize != 0;\r
+\r
+      if(overruled) {\r
+#if 0\r
+           // doesn't work in protocol 1\r
+           if (StrStr(cps->variants, "boardsize") == NULL,) {\r
+             sprintf(buf, "Board size %dx%d+%d not supported by %s",\r
+                  gameInfo.boardWidth, gameInfo.boardHeight, gameInfo.holdingsSize, cps->tidy);\r
+             DisplayFatalError(buf, 0, 1);\r
+             return;\r
+           }\r
+#endif\r
+           sprintf(buf, "%dx%d+%d_", gameInfo.boardWidth,\r
+                              gameInfo.boardHeight, gameInfo.holdingsSize );\r
+           while(*b++ != '_');\r
+      }\r
+      sprintf(b, "variant %s\n", VariantName(gameInfo.variant));\r
       SendToProgram(buf, cps);\r
     }\r
     if (cps->sendICS) {\r
@@ -6397,7 +6729,7 @@ AutoPlayOneMove()
       return FALSE;\r
     }\r
     \r
-    toX = moveList[currentMove][2] - 'a';\r
+    toX = moveList[currentMove][2] - AAA;\r
     toY = moveList[currentMove][3] - ONE;\r
 \r
     if (moveList[currentMove][1] == '@') {\r
@@ -6405,7 +6737,7 @@ AutoPlayOneMove()
            SetHighlights(-1, -1, toX, toY);\r
        }\r
     } else {\r
-       fromX = moveList[currentMove][0] - 'a';\r
+        fromX = moveList[currentMove][0] - AAA;\r
         fromY = moveList[currentMove][1] - ONE;\r
 \r
         HistorySet(parseList, backwardMostMove, forwardMostMove, currentMove); /* [AS] */\r
@@ -6503,9 +6835,9 @@ LoadGameOneMove(readAhead)
       /* POP Fabien */\r
        if (appData.debugMode)\r
          fprintf(debugFP, "Parsed %s into %s\n", yy_text, currentMoveString);\r
-       fromX = currentMoveString[0] - 'a';\r
+        fromX = currentMoveString[0] - AAA;\r
         fromY = currentMoveString[1] - ONE;\r
-       toX = currentMoveString[2] - 'a';\r
+        toX = currentMoveString[2] - AAA;\r
         toY = currentMoveString[3] - ONE;\r
        promoChar = currentMoveString[4];\r
        break;\r
@@ -6518,7 +6850,7 @@ LoadGameOneMove(readAhead)
          (int) CharToPiece(ToUpper(currentMoveString[0])) :\r
        (int) CharToPiece(ToLower(currentMoveString[0]));\r
        fromY = DROP_RANK;\r
-       toX = currentMoveString[2] - 'a';\r
+        toX = currentMoveString[2] - AAA;\r
         toY = currentMoveString[3] - ONE;\r
        break;\r
 \r
@@ -6627,9 +6959,9 @@ LoadGameOneMove(readAhead)
            if (appData.debugMode)\r
              fprintf(debugFP, "Parsed %s into IllegalMove %s\n",\r
                      yy_text, currentMoveString);\r
-           fromX = currentMoveString[0] - 'a';\r
+            fromX = currentMoveString[0] - AAA;\r
             fromY = currentMoveString[1] - ONE;\r
-           toX = currentMoveString[2] - 'a';\r
+            toX = currentMoveString[2] - AAA;\r
             toY = currentMoveString[3] - ONE;\r
            promoChar = currentMoveString[4];\r
        }\r
@@ -6738,9 +7070,9 @@ MakeRegisteredMove()
     \r
            thinkOutput[0] = NULLCHAR;\r
            strcpy(moveList[currentMove], cmailMove[lastLoadGameNumber - 1]);\r
-           fromX = cmailMove[lastLoadGameNumber - 1][0] - 'a';\r
+            fromX = cmailMove[lastLoadGameNumber - 1][0] - AAA;\r
             fromY = cmailMove[lastLoadGameNumber - 1][1] - ONE;\r
-           toX = cmailMove[lastLoadGameNumber - 1][2] - 'a';\r
+            toX = cmailMove[lastLoadGameNumber - 1][2] - AAA;\r
             toY = cmailMove[lastLoadGameNumber - 1][3] - ONE;\r
            promoChar = cmailMove[lastLoadGameNumber - 1][4];\r
            MakeMove(fromX, fromY, toX, toY, promoChar);\r
@@ -7167,7 +7499,7 @@ LoadGame(f, gameNumber, title, useList)
        if (!startedFromSetupPosition) {\r
            p = yy_text;\r
             for (i = BOARD_HEIGHT - 1; i >= 0; i--)\r
-              for (j = 0; j < BOARD_WIDTH; p++)\r
+              for (j = BOARD_LEFT; j < BOARD_RGHT; p++)\r
                switch (*p) {\r
                  case '[':\r
                  case '-':\r
@@ -7437,7 +7769,7 @@ LoadPosition(f, positionNumber, title)
     \r
         for (i = BOARD_HEIGHT - 1; i >= 0; i--) {\r
            (void) fgets(line, MSG_SIZ, f);\r
-            for (p = line, j = 0; j < BOARD_WIDTH; p++) {\r
+            for (p = line, j = BOARD_LEFT; j < BOARD_RGHT; p++) {\r
                if (*p == ' ')\r
                  continue;\r
                initial_position[i][j++] = CharToPiece(*p);\r
@@ -9021,7 +9353,7 @@ EditPositionMenuEvent(selection, x, y)
                    if (gameMode == IcsExamining) {\r
                        if (boards[currentMove][y][x] != EmptySquare) {\r
                            sprintf(buf, "%sx@%c%c\n", ics_prefix,\r
-                                    'a' + x, ONE + y);\r
+                                    AAA + x, ONE + y);\r
                            SendToICS(buf);\r
                        }\r
                    } else {\r
@@ -9045,7 +9377,7 @@ EditPositionMenuEvent(selection, x, y)
 \r
       case EmptySquare:\r
        if (gameMode == IcsExamining) {\r
-            sprintf(buf, "%sx@%c%c\n", ics_prefix, 'a' + x, ONE + y);\r
+            sprintf(buf, "%sx@%c%c\n", ics_prefix, AAA + x, ONE + y);\r
            SendToICS(buf);\r
        } else {\r
            boards[0][y][x] = EmptySquare;\r
@@ -9056,7 +9388,7 @@ EditPositionMenuEvent(selection, x, y)
       default:\r
        if (gameMode == IcsExamining) {\r
            sprintf(buf, "%s%c@%c%c\n", ics_prefix,\r
-                    PieceToChar(selection), 'a' + x, ONE + y);\r
+                    PieceToChar(selection), AAA + x, ONE + y);\r
            SendToICS(buf);\r
        } else {\r
            boards[0][y][x] = selection;\r
@@ -9350,14 +9682,14 @@ ForwardInner(target)
 \r
     if (target > 0 && moveList[target - 1][0]) {\r
        int fromX, fromY, toX, toY;\r
-       toX = moveList[target - 1][2] - 'a';\r
+        toX = moveList[target - 1][2] - AAA;\r
         toY = moveList[target - 1][3] - ONE;\r
        if (moveList[target - 1][1] == '@') {\r
            if (appData.highlightLastMove) {\r
                SetHighlights(-1, -1, toX, toY);\r
            }\r
        } else {\r
-           fromX = moveList[target - 1][0] - 'a';\r
+            fromX = moveList[target - 1][0] - AAA;\r
             fromY = moveList[target - 1][1] - ONE;\r
            if (target == currentMove + 1) {\r
                AnimateMove(boards[currentMove], fromX, fromY, toX, toY);\r
@@ -9453,14 +9785,14 @@ BackwardInner(target)
     \r
     if (moveList[target][0]) {\r
        int fromX, fromY, toX, toY;\r
-       toX = moveList[target][2] - 'a';\r
+        toX = moveList[target][2] - AAA;\r
         toY = moveList[target][3] - ONE;\r
        if (moveList[target][1] == '@') {\r
            if (appData.highlightLastMove) {\r
                SetHighlights(-1, -1, toX, toY);\r
            }\r
        } else {\r
-           fromX = moveList[target][0] - 'a';\r
+            fromX = moveList[target][0] - AAA;\r
             fromY = moveList[target][1] - ONE;\r
            if (target == currentMove - 1) {\r
                AnimateMove(boards[currentMove], toX, toY, fromX, fromY);\r
@@ -9733,10 +10065,10 @@ PrintPosition(fp, move)
     int i, j;\r
     \r
     for (i = BOARD_HEIGHT - 1; i >= 0; i--) {\r
-        for (j = 0; j < BOARD_WIDTH; j++) {\r
+        for (j = BOARD_LEFT; j < BOARD_RGHT; j++) {\r
            char c = PieceToChar(boards[move][i][j]);\r
            fputc(c == 'x' ? '.' : c, fp);\r
-            fputc(j == BOARD_WIDTH - 1 ? '\n' : ' ', fp);\r
+            fputc(j == BOARD_RGHT - 1 ? '\n' : ' ', fp);\r
        }\r
     }\r
     if ((gameMode == EditPosition) ? !blackPlaysFirst : (move % 2 == 0))\r
@@ -11124,6 +11456,7 @@ PositionToFEN(move, useFEN960)
     char buf[128];\r
     char *p, *q;\r
     int emptycount;\r
+    ChessSquare piece;\r
 \r
     whiteToPlay = (gameMode == EditPosition) ?\r
       !blackPlaysFirst : (move % 2 == 0);\r
@@ -11132,7 +11465,7 @@ PositionToFEN(move, useFEN960)
     /* Piece placement data */\r
     for (i = BOARD_HEIGHT - 1; i >= 0; i--) {\r
        emptycount = 0;\r
-        for (j = 0; j < BOARD_WIDTH; j++) {\r
+        for (j = BOARD_LEFT; j < BOARD_RGHT; j++) {\r
            if (boards[move][i][j] == EmptySquare) {\r
                emptycount++;\r
            } else {\r
@@ -11142,7 +11475,15 @@ PositionToFEN(move, useFEN960)
                     else { *p++ = '0' + emptycount/10; *p++ = '0' + emptycount%10; }\r
                    emptycount = 0;\r
                }\r
-               *p++ = PieceToChar(boards[move][i][j]);\r
+                *p++ = PieceToChar(boards[move][i][j]);\r
+                if(gameInfo.variant == VariantCrazyhouse) {\r
+                    /* [HGM] flag Crazyhouse promoted pieces */\r
+                    if( (int)boards[move][i][j] > (int) WhiteQueen && (int)boards[move][i][j] < (int) WhiteKing ||\r
+                        (int)boards[move][i][j] > (int) BlackQueen && (int)boards[move][i][j] < (int) BlackKing ) {\r
+                        p[-1] = PieceToChar((ChessSquare)((int)boards[move][i][j]-(int)WhiteAlfil+(int)WhitePawn));\r
+                        *p++ = '~';\r
+                    }\r
+                }\r
            }\r
        }\r
        if (emptycount > 0) {\r
@@ -11174,18 +11515,18 @@ PositionToFEN(move, useFEN960)
 \r
        /* White castling rights */\r
 \r
-       for (fk = 1; fk < BOARD_WIDTH-1; fk++) {\r
+       for (fk = BOARD_LEFT+1; fk < BOARD_RGHT-1; fk++) {\r
 \r
           if (boards[move][0][fk] == WhiteKing) {\r
 \r
-             for (fr = BOARD_WIDTH-1; fr > fk; fr--) { /* H side */\r
+             for (fr = BOARD_RGHT-1; fr > fk; fr--) { /* H side */\r
                 if (boards[move][0][fr] == WhiteRook) {\r
                    *p++ = useFEN960 ? 'A' + fr : 'K';\r
                    break;\r
                 }\r
              }\r
 \r
-             for (fr = 0; fr < fk; fr++) { /* A side */\r
+             for (fr = BOARD_LEFT; fr < fk; fr++) { /* A side */\r
                 if (boards[move][0][fr] == WhiteRook) {\r
                    *p++ = useFEN960 ? 'A' + fr : 'Q';\r
                    break;\r
@@ -11196,18 +11537,18 @@ PositionToFEN(move, useFEN960)
 \r
        /* Black castling rights */\r
 \r
-       for (fk = 1; fk < BOARD_WIDTH-1; fk++) {\r
+       for (fk = BOARD_LEFT+1; fk < BOARD_RGHT-1; fk++) {\r
 \r
           if (boards[move][BOARD_HEIGHT-1][fk] == BlackKing) {\r
 \r
-             for (fr = BOARD_WIDTH-1; fr > fk; fr--) { /* H side */\r
+             for (fr = BOARD_RGHT-1; fr > fk; fr--) { /* H side */\r
                 if (boards[move][BOARD_HEIGHT-1][fr] == BlackRook) {\r
                    *p++ = useFEN960 ? 'a' + fr : 'k';\r
                    break;\r
                 }\r
              }\r
 \r
-             for (fr = 0; fr < fk; fr++) { /* A side */\r
+             for (fr = BOARD_LEFT; fr < fk; fr++) { /* A side */\r
                 if (boards[move][BOARD_HEIGHT-1][fr] == BlackRook) {\r
                    *p++ = useFEN960 ? 'a' + fr : 'q';\r
                    break;\r
@@ -11224,23 +11565,23 @@ PositionToFEN(move, useFEN960)
 \r
 #ifdef OLDCASTLINGCODE\r
         if (boards[move][0][BOARD_WIDTH>>1] == WhiteKing) {\r
-           if (boards[move][0][BOARD_WIDTH-1] == WhiteRook) *p++ = 'K';\r
-           if (boards[move][0][0] == WhiteRook) *p++ = 'Q';\r
+            if (boards[move][0][BOARD_RGHT-1] == WhiteRook) *p++ = 'K';\r
+            if (boards[move][0][BOARD_LEFT] == WhiteRook) *p++ = 'Q';\r
         }\r
         if (boards[move][BOARD_HEIGHT-1][BOARD_WIDTH>>1] == BlackKing) {\r
            if (boards[move][BOARD_HEIGHT-1][BOARD_HEIGHT-1] == BlackRook) *p++ = 'k';\r
-           if (boards[move][BOARD_HEIGHT-1][0] == BlackRook) *p++ = 'q';\r
+            if (boards[move][BOARD_HEIGHT-1][BOARD_LEFT] == BlackRook) *p++ = 'q';\r
         }          \r
 #else\r
         /* [HGM] write true castling rights */\r
         if( nrCastlingRights == 6 ) {\r
-            if(castlingRights[move][0] == BOARD_WIDTH-1 &&\r
+            if(castlingRights[move][0] == BOARD_RGHT-1 &&\r
                castlingRights[move][2] >= 0  ) *p++ = 'K';\r
-            if(castlingRights[move][1] == 0 &&\r
+            if(castlingRights[move][1] == BOARD_LEFT &&\r
                castlingRights[move][2] >= 0  ) *p++ = 'Q';\r
-            if(castlingRights[move][3] == BOARD_WIDTH-1 &&\r
+            if(castlingRights[move][3] == BOARD_RGHT-1 &&\r
                castlingRights[move][5] >= 0  ) *p++ = 'k';\r
-            if(castlingRights[move][4] == 0 &&\r
+            if(castlingRights[move][4] == BOARD_LEFT &&\r
                castlingRights[move][5] >= 0  ) *p++ = 'q';\r
         }\r
 #endif\r
@@ -11252,16 +11593,16 @@ PositionToFEN(move, useFEN960)
 \r
     /* En passant target square */\r
     if (move > backwardMostMove) {\r
-       fromX = moveList[move - 1][0] - 'a';\r
+        fromX = moveList[move - 1][0] - AAA;\r
         fromY = moveList[move - 1][1] - ONE;\r
-       toX = moveList[move - 1][2] - 'a';\r
+        toX = moveList[move - 1][2] - AAA;\r
         toY = moveList[move - 1][3] - ONE;\r
        if (fromY == (whiteToPlay ? BOARD_HEIGHT-2 : 1) &&\r
            toY == (whiteToPlay ? BOARD_HEIGHT-4 : 3) &&\r
            boards[move][toY][toX] == (whiteToPlay ? BlackPawn : WhitePawn) &&\r
            fromX == toX) {\r
            /* 2-square pawn move just happened */\r
-           *p++ = toX + 'a';\r
+            *p++ = toX + AAA;\r
            *p++ = whiteToPlay ? '6'+BOARD_HEIGHT-8 : '3';\r
        } else {\r
            *p++ = '-';\r
@@ -11270,6 +11611,26 @@ PositionToFEN(move, useFEN960)
        *p++ = '-';\r
     }\r
 \r
+    /* [HGM] print Crazyhouse holdings */\r
+    if( gameInfo.variant == VariantCrazyhouse ) {\r
+        *p++ = ' '; q = p;\r
+        for(i=0; i<gameInfo.holdingsSize; i++) { /* white holdings */\r
+            piece = boards[move][i][BOARD_WIDTH-1];\r
+            if( piece != EmptySquare )\r
+              for(j=0; j<(int) boards[move][i][BOARD_WIDTH-2]; j++)\r
+                  *p++ = PieceToChar(piece);\r
+        }\r
+        for(i=0; i<gameInfo.holdingsSize; i++) { /* black holdings */\r
+            piece = boards[move][BOARD_HEIGHT-i-1][0];\r
+            if( piece != EmptySquare )\r
+              for(j=0; j<(int) boards[move][BOARD_HEIGHT-i-1][1]; j++)\r
+                  *p++ = PieceToChar(piece);\r
+        }\r
+\r
+        if( q == p ) *p++ = '-';\r
+        *p++ = ' ';\r
+    }\r
+\r
     /* [HGM] find reversible plies */\r
     {   int i = 0, j=move;\r
 \r
@@ -11300,32 +11661,51 @@ ParseFEN(board, blackPlaysFirst, fen)
     int i, j;\r
     char *p;\r
     int emptycount;\r
+    ChessSquare piece;\r
 \r
     p = fen;\r
 \r
+    /* [HGM] by default clear Crazyhouse holdings, if present */\r
+   if(gameInfo.holdingsWidth) {\r
+       for(i=0; i<BOARD_HEIGHT; i++) {\r
+           board[i][0]             = EmptySquare; /* black holdings */\r
+           board[i][BOARD_WIDTH-1] = EmptySquare; /* white holdings */\r
+           board[i][1]             = (ChessSquare) 0; /* black counts */\r
+           board[i][BOARD_WIDTH-2] = (ChessSquare) 0; /* white counts */\r
+       }\r
+   }\r
+\r
     /* Piece placement data */\r
     for (i = BOARD_HEIGHT - 1; i >= 0; i--) {\r
        j = 0;\r
        for (;;) {\r
            if (*p == '/' || *p == ' ') {\r
                if (*p == '/') p++;\r
-                emptycount = BOARD_WIDTH - j;\r
-               while (emptycount--) board[i][j++] = EmptySquare;\r
+                emptycount = gameInfo.boardWidth - j;\r
+                while (emptycount--)\r
+                        board[i][(j++)+gameInfo.holdingsWidth] = EmptySquare;\r
                break;\r
 #if(BOARD_SIZE >= 10)\r
             } else if(*p=='x' || *p=='X') { /* [HGM] X means 10 */\r
                 p++; emptycount=10;\r
-                if (j + emptycount > BOARD_WIDTH) return FALSE;\r
-               while (emptycount--) board[i][j++] = EmptySquare;\r
+                if (j + emptycount > gameInfo.boardWidth) return FALSE;\r
+                while (emptycount--)\r
+                        board[i][(j++)+gameInfo.holdingsWidth] = EmptySquare;\r
 #endif\r
             } else if (isdigit(*p)) {\r
                emptycount = *p++ - '0';\r
                 while(isdigit(*p)) emptycount = 10*emptycount + *p++ - '0'; /* [HGM] allow > 9 */\r
-                if (j + emptycount > BOARD_WIDTH) return FALSE;\r
-               while (emptycount--) board[i][j++] = EmptySquare;\r
+                if (j + emptycount > gameInfo.boardWidth) return FALSE;\r
+                while (emptycount--)\r
+                        board[i][(j++)+gameInfo.holdingsWidth] = EmptySquare;\r
            } else if (isalpha(*p)) {\r
-                if (j >= BOARD_WIDTH) return FALSE;\r
-               board[i][j++] = CharToPiece(*p++);\r
+                if (j >= gameInfo.boardWidth) return FALSE;\r
+                piece = CharToPiece(*p++);\r
+                if(*p == '~') { /* [HGM] make it a promoted piece for Crazyhouse */\r
+                    piece = (ChessSquare) ((int)piece + (int)WhiteAlfil - (int)WhitePawn);\r
+                    p++;\r
+                }\r
+                board[i][(j++)+gameInfo.holdingsWidth] = piece;\r
            } else {\r
                return FALSE;\r
            }\r
@@ -11353,18 +11733,18 @@ ParseFEN(board, blackPlaysFirst, fen)
     for(i=0; i<nrCastlingRights; i++ ) {\r
         FENcastlingRights[i] = initialRights[i];\r
     }   /* assume possible unless obviously impossible */\r
-    if(board[castlingRank[0]][initialRights[0]] != WhiteRook) FENcastlingRights[0] = -1;\r
-    if(board[castlingRank[1]][initialRights[1]] != WhiteRook) FENcastlingRights[1] = -1;\r
-    if(board[castlingRank[2]][initialRights[2]] != WhiteKing) FENcastlingRights[2] = -1;\r
-    if(board[castlingRank[3]][initialRights[3]] != BlackRook) FENcastlingRights[3] = -1;\r
-    if(board[castlingRank[4]][initialRights[4]] != BlackRook) FENcastlingRights[4] = -1;\r
-    if(board[castlingRank[5]][initialRights[5]] != BlackKing) FENcastlingRights[5] = -1;\r
+    if(initialRights[0]>=0 && board[castlingRank[0]][initialRights[0]] != WhiteRook) FENcastlingRights[0] = -1;\r
+    if(initialRights[1]>=0 && board[castlingRank[1]][initialRights[1]] != WhiteRook) FENcastlingRights[1] = -1;\r
+    if(initialRights[2]>=0 && board[castlingRank[2]][initialRights[2]] != WhiteKing) FENcastlingRights[2] = -1;\r
+    if(initialRights[3]>=0 && board[castlingRank[3]][initialRights[3]] != BlackRook) FENcastlingRights[3] = -1;\r
+    if(initialRights[4]>=0 && board[castlingRank[4]][initialRights[4]] != BlackRook) FENcastlingRights[4] = -1;\r
+    if(initialRights[5]>=0 && board[castlingRank[5]][initialRights[5]] != BlackKing) FENcastlingRights[5] = -1;\r
     FENrulePlies = 0;\r
 \r
     while(*p==' ') p++;\r
 \r
     if(*p=='K' || *p=='Q' || *p=='k' || *p=='q' || *p=='-') {\r
-              /* castling indicator present, so default is impossible */\r
+              /* castling indicator present, so default is no castlings */\r
               for(i=0; i<nrCastlingRights; i++ ) {\r
                      FENcastlingRights[i] = -1;\r
               }\r
@@ -11372,19 +11752,19 @@ ParseFEN(board, blackPlaysFirst, fen)
     while(*p=='K' || *p=='Q' || *p=='k' || *p=='q' || *p=='-') {\r
         switch(*p++) {\r
           case'K':\r
-              FENcastlingRights[0] = BOARD_WIDTH-1;\r
+              FENcastlingRights[0] = BOARD_RGHT-1;\r
               FENcastlingRights[2] = BOARD_WIDTH>>1;\r
               break;\r
           case'Q':\r
-              FENcastlingRights[1] = 0;\r
+              FENcastlingRights[1] = BOARD_LEFT;\r
               FENcastlingRights[2] = BOARD_WIDTH>>1;\r
               break;\r
           case'k':\r
-              FENcastlingRights[3] = BOARD_WIDTH-1;\r
+              FENcastlingRights[3] = BOARD_RGHT-1;\r
               FENcastlingRights[5] = BOARD_WIDTH>>1;\r
               break;\r
           case'q':\r
-              FENcastlingRights[4] = 0;\r
+              FENcastlingRights[4] = BOARD_LEFT;\r
               FENcastlingRights[5] = BOARD_WIDTH>>1;\r
               break;\r
           /* Tord! FRC! */\r
@@ -11397,13 +11777,39 @@ ParseFEN(board, blackPlaysFirst, fen)
     if(*p=='-') {\r
         p++; FENepStatus = EP_NONE;\r
     } else {\r
-       char c = *p++ - 'a';\r
+       char c = *p++ - AAA;\r
 \r
-       if(c < 0 || c >= BOARD_WIDTH) return TRUE;\r
+       if(c < BOARD_LEFT || c >= BOARD_RGHT) return TRUE;\r
        if(*p >= '0' && *p <='9') *p++;\r
        FENepStatus = c;\r
     }\r
 \r
+    /* [HGM] look for Crazyhouse holdings here */\r
+    while(*p==' ') p++;\r
+    if( !isdigit(*p) ) {\r
+        if(*p == '-' ) *p++; /* empty holdings */ else {\r
+            if( !gameInfo.holdingsWidth ) return FALSE; /* no room to put holdings! */\r
+            /* if we would allow FEN reading to set board size, we would   */\r
+            /* have to add holdings and shift the board read so far here   */\r
+            while( (piece = CharToPiece(*p) ) != EmptySquare ) {\r
+                *p++;\r
+                if((int) piece >= (int) BlackPawn ) {\r
+                    i = (int)piece - (int)BlackPawn;\r
+                    if( i >= BOARD_HEIGHT ) return FALSE;\r
+                    board[BOARD_HEIGHT-1-i][0] = piece; /* black holdings */\r
+                    board[BOARD_HEIGHT-1-i][1]++;       /* black counts   */\r
+                } else {\r
+                    i = (int)piece - (int)WhitePawn;\r
+                    if( i >= BOARD_HEIGHT ) return FALSE;\r
+                    board[i][BOARD_WIDTH-1] = piece;    /* white holdings */\r
+                    board[i][BOARD_WIDTH-2]++;          /* black holdings */\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+\r
+\r
     if(sscanf(p, "%d", &i) == 1) {\r
         FENrulePlies = i; /* 50-move ply counter */\r
         /* (The move number is still ignored)    */\r
index 5058ac3..0057b9d 100644 (file)
--- a/backend.h
+++ b/backend.h
-/*
- * backend.h -- Interface exported by XBoard back end
- * $Id: backend.h,v 2.1 2003/10/27 19:21:00 mann Exp $
- *
- * Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts.
- * Enhancements Copyright 1992-95 Free Software Foundation, Inc.
- *
- * The following terms apply to Digital Equipment Corporation's copyright
- * interest in XBoard:
- * ------------------------------------------------------------------------
- * All Rights Reserved
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and that
- * both that copyright notice and this permission notice appear in
- * supporting documentation, and that the name of Digital not be
- * used in advertising or publicity pertaining to distribution of the
- * software without specific, written prior permission.
- *
- * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
- * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
- * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
- * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
- * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- * ------------------------------------------------------------------------
- *
- * The following terms apply to the enhanced version of XBoard distributed
- * by the Free Software Foundation:
- * ------------------------------------------------------------------------
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * ------------------------------------------------------------------------
- */
-#ifndef _BACKEND
-#define _BACKEND
-
-#include "lists.h"
-#include "frontend.h"
-
-extern int gotPremove;
-extern GameMode gameMode;
-extern int pausing, cmailMsgLoaded, flipView;
-extern char white_holding[], black_holding[];
-extern int currentMove, backwardMostMove, forwardMostMove;
-extern int blackPlaysFirst;
-extern FILE *debugFP;
-extern char* programVersion;
-extern ProcRef firstProgramPR, secondProgramPR;
-extern Board boards[];
-
-char *CmailMsg P((void));
-/* Tord: Added the useFEN960 parameter in PositionToFEN() below */
-char *PositionToFEN P((int move, int useFEN960));
-void EditPositionPasteFEN P((char *fen));
-void TimeDelay P((long ms));
-void SendMultiLineToICS P(( char *text ));
-void AnalysisPeriodicEvent P((int force));
-void SetWhiteToPlayEvent P((void));
-void SetBlackToPlayEvent P((void));
-void InitBackEnd1 P((void));
-void InitBackEnd2 P((void));
-int IsPromotion P((int fromX, int fromY, int toX, int toY));
-int PieceForSquare P((int x, int y));
-int OKToStartUserMove P((int x, int y));
-void Reset P((int redraw, int init));
-void ResetGameEvent P((void));
-int LoadGame P((FILE *f, int n, char *title, int useList));
-int LoadGameFromFile P((char *filename, int n, char *title, int useList));
-int CmailLoadGame P((FILE *f, int n, char *title, int useList));
-int ReloadGame P((int offset));
-int SaveGame P((FILE *f, int dummy, char *dummy2));
-int SaveGameToFile P((char *filename, int append));
-int LoadPosition P((FILE *f, int n, char *title));
-int ReloadPosition P((int offset));
-int SavePosition P((FILE *f, int dummy, char *dummy2));
-void EditPositionEvent P((void));
-void FlipViewEvent P((void));
-void MachineWhiteEvent P((void));
-void MachineBlackEvent P((void));
-void TwoMachinesEvent P((void));
-void EditGameEvent P((void));
-void TrainingEvent P((void));
-void IcsClientEvent P((void));
-void ForwardEvent P((void));
-void BackwardEvent P((void));
-void ToEndEvent P((void));
-void ToStartEvent P((void));
-void ToNrEvent P((int to));
-void RevertEvent P((void));
-void RetractMoveEvent P((void));
-void MoveNowEvent P((void));
-void TruncateGameEvent P((void));
-void PauseEvent P((void));
-void CallFlagEvent P((void));
-void AcceptEvent P((void));
-void DeclineEvent P((void));
-void RematchEvent P((void));
-void DrawEvent P((void));
-void AbortEvent P((void));
-void AdjournEvent P((void));
-void ResignEvent P((void));
-void UserAdjudicationEvent P((int result));
-void StopObservingEvent P((void));
-void StopExaminingEvent P((void));
-void PonderNextMoveEvent P((int newState));
-void ShowThinkingEvent P((int newState));
-void PeriodicUpdatesEvent P((int newState));
-void HintEvent P((void));
-void BookEvent P((void));
-void AboutGameEvent P((void));
-void ExitEvent P((int status));
-char *DefaultFileName P((char *));
-void UserMoveEvent P((int fromX, int fromY, int toX, int toY, int promoChar));
-void DecrementClocks P((void));
-char *TimeString P((long millisec));
-void AutoPlayGameLoop P((void));
-void DisplayBothClocks P((void));
-void EditPositionMenuEvent P((ChessSquare selection, int x, int y));
-void DropMenuEvent P((ChessSquare selection, int x, int y));
-int ParseTimeControl P((char *tc, int ti, int mps));
-void ProcessICSInitScript P((FILE * f));
-void EditCommentEvent P((void));
-void ReplaceComment P((int index, char *text));
-int ReplaceTags P((char *tags, GameInfo *gi));/* returns nonzero on error */
-void AppendComment P((int index, char *text));
-void ReloadCmailMsgEvent P((int unregister));
-void MailMoveEvent P((void));
-void EditTagsEvent P((void));
-void GetMoveListEvent P((void));
-void ExitAnalyzeMode P((void));
-void AnalyzeModeEvent P((void));
-void AnalyzeFileEvent P((void));
-void DoEcho P((void));
-void DontEcho P((void));
-void TidyProgramName P((char *prog, char *host, char *buf));
-void AskQuestionEvent P((char *title, char *question,
-                        char *replyPrefix, char *which));
-Boolean ParseOneMove P((char *move, int moveNum,
-                       ChessMove *moveType, int *fromX, int *fromY,
-                       int *toX, int *toY, char *promoChar));
-char *VariantName P((VariantClass v));
-VariantClass StringToVariant P((char *e));
-
-char *StrStr P((char *string, char *match));
-char *StrCaseStr P((char *string, char *match));
-char *StrSave P((char *s));
-char *StrSavePtr P((char *s, char **savePtr));
-
-#ifndef _amigados
-int StrCaseCmp P((char *s1, char *s2));
-int ToLower P((int c));
-int ToUpper P((int c));
-#else
-#define StrCaseCmp Stricmp  /*  Use utility.library functions   */
-#include <proto/utility.h>
-#endif
-
-extern GameInfo gameInfo;
-
-
-/* pgntags.c prototypes
- */
-char *PGNTags P((GameInfo *));
-void PrintPGNTags P((FILE *f, GameInfo *));
-int ParsePGNTag P((char *, GameInfo *));
-char *PGNResult P((ChessMove result));
-
-
-/* gamelist.c prototypes
- */
-/* A game node in the double linked list of games.
- */
-typedef struct _ListGame {
-    ListNode node;
-    int number;
-    unsigned long offset;   /*  Byte offset of game within file.     */
-    GameInfo gameInfo;      /*  Note that some entries may be NULL. */
-} ListGame;
-extern List gameList;
-void ClearGameInfo P((GameInfo *));
-int GameListBuild P((FILE *));
-void GameListInitGameInfo P((GameInfo *));
-char *GameListLine P((int, GameInfo *));
-char * GameListLineFull P(( int, GameInfo *));
-
-extern char* StripHighlight P((char *));  /* returns static data */
-extern char* StripHighlightAndTitle P((char *));  /* returns static data */
-
-typedef struct _CPS {
-    char *which;
-    int maybeThinking;
-    ProcRef pr;
-    InputSourceRef isr;
-    char *twoMachinesColor; /* "white\n" or "black\n" */
-    char *program;
-    char *host;
-    char *dir;
-    struct _CPS *other;
-    char *initString;
-    char *computerString;
-    int sendTime; /* 0=don't, 1=do, 2=test */
-    int sendDrawOffers;
-    int useSigint;
-    int useSigterm;
-    int offeredDraw; /* countdown */
-    int reuse;
-    int useSetboard; /* 0=use "edit"; 1=use "setboard" */
-    int useSAN;      /* 0=use coordinate notation; 1=use SAN */
-    int usePing;     /* 0=not OK to use ping; 1=OK */
-    int lastPing;
-    int lastPong;
-    int usePlayother;/* 0=not OK to use playother; 1=OK */
-    int useColors;   /* 0=avoid obsolete white/black commands; 1=use them */
-    int useUsermove; /* 0=just send move; 1=send "usermove move" */
-    int sendICS;     /* 0=don't use "ics" command; 1=do */
-    int sendName;    /* 0=don't use "name" command; 1=do */
-    int sdKludge;    /* 0=use "sd DEPTH" command; 1=use "depth\nDEPTH" */
-    int stKludge;    /* 0=use "st TIME" command; 1=use "level 1 TIME" */
-    char tidy[MSG_SIZ];
-    int matchWins;
-    char variants[MSG_SIZ];
-    int analysisSupport;
-    int analyzing;
-    int protocolVersion;
-    int initDone;
-
-    /* Added by Tord: */
-    int useFEN960;   /* 0=use "KQkq" style FENs, 1=use "HAha" style FENs */
-    int useOOCastle; /* 0="O-O" notation for castling, 1="king capture rook" notation */
-    /* End of additions by Tord */
-
-    int scoreIsAbsolute; /* [AS] 0=don't know (standard), 1=score is always from white side */
-    int isUCI;           /* [AS] 0=no (Winboard), 1=UCI (requires Polyglot) */
-    int hasOwnBookUCI;   /* [AS] 0=use GUI or Polyglot book, 1=has own book */
-} ChessProgramState;
-
-extern ChessProgramState first, second;
-
-/* [AS] Search stats from chessprogram, for the played move */
-typedef struct {
-    int score;  /* Centipawns */
-    int depth;  /* Plies */
-    int time;   /* Milliseconds */
-} ChessProgramStats_Move;
-
-extern ChessProgramStats_Move pvInfoList[MAX_MOVES];
-
-#endif /* _BACKEND */
+/*\r
+ * backend.h -- Interface exported by XBoard back end\r
+ * $Id: backend.h,v 2.1 2003/10/27 19:21:00 mann Exp $\r
+ *\r
+ * Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts.\r
+ * Enhancements Copyright 1992-95 Free Software Foundation, Inc.\r
+ *\r
+ * The following terms apply to Digital Equipment Corporation's copyright\r
+ * interest in XBoard:\r
+ * ------------------------------------------------------------------------\r
+ * All Rights Reserved\r
+ *\r
+ * Permission to use, copy, modify, and distribute this software and its\r
+ * documentation for any purpose and without fee is hereby granted,\r
+ * provided that the above copyright notice appear in all copies and that\r
+ * both that copyright notice and this permission notice appear in\r
+ * supporting documentation, and that the name of Digital not be\r
+ * used in advertising or publicity pertaining to distribution of the\r
+ * software without specific, written prior permission.\r
+ *\r
+ * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING\r
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL\r
+ * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR\r
+ * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,\r
+ * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,\r
+ * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS\r
+ * SOFTWARE.\r
+ * ------------------------------------------------------------------------\r
+ *\r
+ * The following terms apply to the enhanced version of XBoard distributed\r
+ * by the Free Software Foundation:\r
+ * ------------------------------------------------------------------------\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+ * ------------------------------------------------------------------------\r
+ */\r
+#ifndef _BACKEND\r
+#define _BACKEND\r
+\r
+#include "lists.h"\r
+#include "frontend.h"\r
+\r
+extern int gotPremove;\r
+extern GameMode gameMode;\r
+extern int pausing, cmailMsgLoaded, flipView;\r
+extern char white_holding[], black_holding[];\r
+extern int currentMove, backwardMostMove, forwardMostMove;\r
+extern int blackPlaysFirst;\r
+extern FILE *debugFP;\r
+extern char* programVersion;\r
+extern ProcRef firstProgramPR, secondProgramPR;\r
+extern Board boards[];\r
+\r
+char *CmailMsg P((void));\r
+/* Tord: Added the useFEN960 parameter in PositionToFEN() below */\r
+char *PositionToFEN P((int move, int useFEN960));\r
+void AlphaRank P((char *s, int n)); /* [HGM] Shogi move preprocessor */\r
+void EditPositionPasteFEN P((char *fen));\r
+void TimeDelay P((long ms));\r
+void SendMultiLineToICS P(( char *text ));\r
+void AnalysisPeriodicEvent P((int force));\r
+void SetWhiteToPlayEvent P((void));\r
+void SetBlackToPlayEvent P((void));\r
+void InitBackEnd1 P((void));\r
+void InitBackEnd2 P((void));\r
+int IsPromotion P((int fromX, int fromY, int toX, int toY));\r
+int InPalace P((int row, int column));\r
+int PieceForSquare P((int x, int y));\r
+int OKToStartUserMove P((int x, int y));\r
+void Reset P((int redraw, int init));\r
+void ResetGameEvent P((void));\r
+int LoadGame P((FILE *f, int n, char *title, int useList));\r
+int LoadGameFromFile P((char *filename, int n, char *title, int useList));\r
+int CmailLoadGame P((FILE *f, int n, char *title, int useList));\r
+int ReloadGame P((int offset));\r
+int SaveGame P((FILE *f, int dummy, char *dummy2));\r
+int SaveGameToFile P((char *filename, int append));\r
+int LoadPosition P((FILE *f, int n, char *title));\r
+int ReloadPosition P((int offset));\r
+int SavePosition P((FILE *f, int dummy, char *dummy2));\r
+void EditPositionEvent P((void));\r
+void FlipViewEvent P((void));\r
+void MachineWhiteEvent P((void));\r
+void MachineBlackEvent P((void));\r
+void TwoMachinesEvent P((void));\r
+void EditGameEvent P((void));\r
+void TrainingEvent P((void));\r
+void IcsClientEvent P((void));\r
+void ForwardEvent P((void));\r
+void BackwardEvent P((void));\r
+void ToEndEvent P((void));\r
+void ToStartEvent P((void));\r
+void ToNrEvent P((int to));\r
+void RevertEvent P((void));\r
+void RetractMoveEvent P((void));\r
+void MoveNowEvent P((void));\r
+void TruncateGameEvent P((void));\r
+void PauseEvent P((void));\r
+void CallFlagEvent P((void));\r
+void AcceptEvent P((void));\r
+void DeclineEvent P((void));\r
+void RematchEvent P((void));\r
+void DrawEvent P((void));\r
+void AbortEvent P((void));\r
+void AdjournEvent P((void));\r
+void ResignEvent P((void));\r
+void UserAdjudicationEvent P((int result));\r
+void StopObservingEvent P((void));\r
+void StopExaminingEvent P((void));\r
+void PonderNextMoveEvent P((int newState));\r
+void ShowThinkingEvent P((int newState));\r
+void PeriodicUpdatesEvent P((int newState));\r
+void HintEvent P((void));\r
+void BookEvent P((void));\r
+void AboutGameEvent P((void));\r
+void ExitEvent P((int status));\r
+char *DefaultFileName P((char *));\r
+ChessMove UserMoveTest P((int fromX, int fromY, int toX, int toY, int promoChar));\r
+void UserMoveEvent P((int fromX, int fromY, int toX, int toY, int promoChar));\r
+void DecrementClocks P((void));\r
+char *TimeString P((long millisec));\r
+void AutoPlayGameLoop P((void));\r
+void DisplayBothClocks P((void));\r
+void EditPositionMenuEvent P((ChessSquare selection, int x, int y));\r
+void DropMenuEvent P((ChessSquare selection, int x, int y));\r
+int ParseTimeControl P((char *tc, int ti, int mps));\r
+void ProcessICSInitScript P((FILE * f));\r
+void EditCommentEvent P((void));\r
+void ReplaceComment P((int index, char *text));\r
+int ReplaceTags P((char *tags, GameInfo *gi));/* returns nonzero on error */\r
+void AppendComment P((int index, char *text));\r
+void ReloadCmailMsgEvent P((int unregister));\r
+void MailMoveEvent P((void));\r
+void EditTagsEvent P((void));\r
+void GetMoveListEvent P((void));\r
+void ExitAnalyzeMode P((void));\r
+void AnalyzeModeEvent P((void));\r
+void AnalyzeFileEvent P((void));\r
+void DoEcho P((void));\r
+void DontEcho P((void));\r
+void TidyProgramName P((char *prog, char *host, char *buf));\r
+void AskQuestionEvent P((char *title, char *question,\r
+                        char *replyPrefix, char *which));\r
+Boolean ParseOneMove P((char *move, int moveNum,\r
+                       ChessMove *moveType, int *fromX, int *fromY,\r
+                       int *toX, int *toY, char *promoChar));\r
+char *VariantName P((VariantClass v));\r
+VariantClass StringToVariant P((char *e));\r
+\r
+char *StrStr P((char *string, char *match));\r
+char *StrCaseStr P((char *string, char *match));\r
+char *StrSave P((char *s));\r
+char *StrSavePtr P((char *s, char **savePtr));\r
+\r
+#ifndef _amigados\r
+int StrCaseCmp P((char *s1, char *s2));\r
+int ToLower P((int c));\r
+int ToUpper P((int c));\r
+#else\r
+#define StrCaseCmp Stricmp  /*  Use utility.library functions   */\r
+#include <proto/utility.h>\r
+#endif\r
+\r
+extern GameInfo gameInfo;\r
+\r
+\r
+/* pgntags.c prototypes\r
+ */\r
+char *PGNTags P((GameInfo *));\r
+void PrintPGNTags P((FILE *f, GameInfo *));\r
+int ParsePGNTag P((char *, GameInfo *));\r
+char *PGNResult P((ChessMove result));\r
+\r
+\r
+/* gamelist.c prototypes\r
+ */\r
+/* A game node in the double linked list of games.\r
+ */\r
+typedef struct _ListGame {\r
+    ListNode node;\r
+    int number;\r
+    unsigned long offset;   /*  Byte offset of game within file.     */\r
+    GameInfo gameInfo;      /*  Note that some entries may be NULL. */\r
+} ListGame;\r
\r
+extern List gameList;\r
+void ClearGameInfo P((GameInfo *));\r
+int GameListBuild P((FILE *));\r
+void GameListInitGameInfo P((GameInfo *));\r
+char *GameListLine P((int, GameInfo *));\r
+char * GameListLineFull P(( int, GameInfo *));\r
+\r
+extern char* StripHighlight P((char *));  /* returns static data */\r
+extern char* StripHighlightAndTitle P((char *));  /* returns static data */\r
+\r
+typedef struct _CPS {\r
+    char *which;\r
+    int maybeThinking;\r
+    ProcRef pr;\r
+    InputSourceRef isr;\r
+    char *twoMachinesColor; /* "white\n" or "black\n" */\r
+    char *program;\r
+    char *host;\r
+    char *dir;\r
+    struct _CPS *other;\r
+    char *initString;\r
+    char *computerString;\r
+    int sendTime; /* 0=don't, 1=do, 2=test */\r
+    int sendDrawOffers;\r
+    int useSigint;\r
+    int useSigterm;\r
+    int offeredDraw; /* countdown */\r
+    int reuse;\r
+    int useSetboard; /* 0=use "edit"; 1=use "setboard" */\r
+    int useSAN;      /* 0=use coordinate notation; 1=use SAN */\r
+    int usePing;     /* 0=not OK to use ping; 1=OK */\r
+    int lastPing;\r
+    int lastPong;\r
+    int usePlayother;/* 0=not OK to use playother; 1=OK */\r
+    int useColors;   /* 0=avoid obsolete white/black commands; 1=use them */\r
+    int useUsermove; /* 0=just send move; 1=send "usermove move" */\r
+    int sendICS;     /* 0=don't use "ics" command; 1=do */\r
+    int sendName;    /* 0=don't use "name" command; 1=do */\r
+    int sdKludge;    /* 0=use "sd DEPTH" command; 1=use "depth\nDEPTH" */\r
+    int stKludge;    /* 0=use "st TIME" command; 1=use "level 1 TIME" */\r
+    char tidy[MSG_SIZ];\r
+    int matchWins;\r
+    char variants[MSG_SIZ];\r
+    int analysisSupport;\r
+    int analyzing;\r
+    int protocolVersion;\r
+    int initDone;\r
+\r
+    /* Added by Tord: */\r
+    int useFEN960;   /* 0=use "KQkq" style FENs, 1=use "HAha" style FENs */\r
+    int useOOCastle; /* 0="O-O" notation for castling, 1="king capture rook" notation */\r
+    /* End of additions by Tord */\r
+\r
+    int scoreIsAbsolute; /* [AS] 0=don't know (standard), 1=score is always from white side */\r
+    int isUCI;           /* [AS] 0=no (Winboard), 1=UCI (requires Polyglot) */\r
+    int hasOwnBookUCI;   /* [AS] 0=use GUI or Polyglot book, 1=has own book */\r
+} ChessProgramState;\r
+\r
+extern ChessProgramState first, second;\r
+\r
+/* [AS] Search stats from chessprogram, for the played move */\r
+typedef struct {\r
+    int score;  /* Centipawns */\r
+    int depth;  /* Plies */\r
+    int time;   /* Milliseconds */\r
+} ChessProgramStats_Move;\r
+\r
+extern ChessProgramStats_Move pvInfoList[MAX_MOVES];\r
+\r
+#endif /* _BACKEND */\r
index fc2b999..be6d4e8 100644 (file)
--- a/common.h
+++ b/common.h
@@ -100,10 +100,27 @@ int pclose(FILE *);
 \r
 #define PROTOVER                2       /* engine protocol version */\r
 \r
-#define BOARD_SIZE              12                     /* [HGM] for in declarations */\r
-#define BOARD_WIDTH             (appData.NrFiles)      /* [HGM] made user adjustable */\r
-#define BOARD_HEIGHT            (appData.NrRanks)\r
-#define ONE                     ('1'-(BOARD_HEIGHT>9)) /* [HGM] foremost board rank */\r
+/* [HGM] Some notes about board sizes:\r
+   In games that allow piece drops, the holdings are considered part of the\r
+   board, in the leftmost and rightmost two files. This way they are\r
+   automatically part of the game-history states, and enjoy all display\r
+   functions (including drag-drop and click-click moves to the regular part\r
+   of the board). The drawback of this is that the internal numbering of\r
+   files starts at 2 for the a-file if holdings are displayed. To ensure\r
+   consistency, this shifted numbering system is used _everywhere_ in the\r
+   code, and conversion to the 'normal' system only takes place when the\r
+   file number is converted to or from ASCII (by redefining the character\r
+   constant 'a'). This works because Winboard only communicates with the\r
+   outside world in ASCII. In a similar way, the different rank numbering\r
+   systems (starting at rank 0 or 1) are implemented by redefining '1'.\r
+*/\r
+#define BOARD_SIZE              16            /* [HGM] for in declarations */\r
+#define BOARD_HEIGHT (gameInfo.boardHeight)   // [HGM] made user adjustable \r
+#define BOARD_WIDTH  (gameInfo.boardWidth + 2*gameInfo.holdingsWidth)   \r
+#define BOARD_LEFT   (gameInfo.holdingsWidth) // [HGM] play-board edges     \r
+#define BOARD_RGHT   (gameInfo.boardWidth + gameInfo.holdingsWidth)\r
+#define ONE          ('1'-(BOARD_HEIGHT>9))   // [HGM] foremost board rank  \r
+#define AAA          ('a'-BOARD_LEFT)         // [HGM] leftmost board file  \r
 #define DROP_RANK               -3\r
 #define MAX_MOVES              1000\r
 #define MSG_SIZ                        512\r
@@ -168,24 +185,32 @@ typedef enum {
   } GameMode;\r
 \r
 typedef enum {\r
-    WhitePawn, WhiteKnight, WhiteBishop, WhiteRook, \r
+    WhitePawn, WhiteKnight, WhiteBishop, WhiteRook, WhiteQueen, \r
 #ifdef FAIRY\r
-    WhiteCardinal, WhiteMarshall, WhiteFairyPawn, WhiteFairyKnight,\r
-    WhiteFairyBishop, WhiteFairyRook, WhiteFairyCardinal, WhiteFairyMarshall,\r
-    WhiteFairyQueen, WhiteFairyKing,\r
+    /* [HGM] the order here is crucial for Crazyhouse & Shogi: */\r
+    /* only the first N pieces can go into the holdings, and   */\r
+    /* promotions in those variants shift P-W to E-M           */\r
+    WhiteFerz, WhiteWazir, WhiteAlfil, WhiteNightrider, WhiteCardinal,\r
+    WhiteMarshall, WhiteGrasshopper, WhiteCannon, WhiteMan, WhiteUnicorn,\r
 #endif\r
-    WhiteQueen, WhiteKing,\r
-    BlackPawn, BlackKnight, BlackBishop, BlackRook,\r
+    WhiteKing, BlackPawn, BlackKnight, BlackBishop, BlackRook, BlackQueen, \r
 #ifdef FAIRY\r
-    BlackCardinal, BlackMarshall, BlackFairyPawn, BlackFairyKnight,\r
-    BlackFairyBishop, BlackFairyRook, BlackFairyCardinal, BlackFairyMarshall,\r
-    BlackFairyQueen, BlackFairyKing,\r
+    BlackFerz, BlackWazir, BlackAlfil, BlackNightrider, BlackCardinal,\r
+    BlackMarshall, BlackGrasshopper, BlackCannon, BlackMan, BlackUnicorn,\r
 #endif\r
-    BlackQueen, BlackKing,\r
+    BlackKing,\r
     EmptySquare, \r
     ClearBoard, WhitePlay, BlackPlay /*for use on EditPosition menus*/\r
   } ChessSquare;\r
 \r
+/* [HGM] some macros that can be used as prefixes to convert piece types */\r
+#define WHITE_TO_BLACK (int)BlackPawn - (int)WhitePawn + (int)\r
+#define BLACK_TO_WHITE (int)WhitePawn - (int)BlackPawn + (int)\r
+#define PROMOTED       (int)WhiteAlfil - (int)WhitePawn + (int)\r
+#define DEMOTED        (int)WhitePawn - (int)WhiteAlfil + (int)\r
+#define SHOGI          (int)EmptySquare + (int)\r
+\r
+\r
 typedef ChessSquare Board[BOARD_SIZE][BOARD_SIZE];\r
 \r
 typedef enum {\r
@@ -243,52 +268,23 @@ typedef enum {
     VariantShatranj,     /* Unsupported (ICC wild 28) */\r
     Variant29,           /* Temporary name for possible future ICC wild 29 */\r
     Variant30,           /* Temporary name for possible future ICC wild 30 */\r
-#ifdef FAIRY\r
-    VariantShogi,        /* [HGM] To be supported in next version */\r
-    VariantXiangqi,\r
-    VariantCourier,\r
-    VariantGothic,\r
-    VariantCapablanca,\r
-    VariantFairy,        /* [HGM] allow more piece types */\r
-#else\r
     Variant31,           /* Temporary name for possible future ICC wild 31 */\r
     Variant32,           /* Temporary name for possible future ICC wild 32 */\r
-    Variant33,\r
+    Variant33,           /* Temporary name for possible future ICC wild 33 */\r
     Variant34,           /* Temporary name for possible future ICC wild 34 */\r
     Variant35,           /* Temporary name for possible future ICC wild 35 */\r
     Variant36,           /* Temporary name for possible future ICC wild 36 */\r
-#endif\r
+    VariantShogi,        /* [HGM] added variants */\r
+    VariantXiangqi,\r
+    VariantCourier,\r
+    VariantGothic,\r
+    VariantCapablanca,\r
+    VariantKnightmate,\r
+    VariantFairy,        \r
+    VariantShowgi,\r
     VariantUnknown       /* Catchall for other unknown variants */\r
 } VariantClass;\r
 \r
-#ifdef FAIRY\r
-#define VARIANT_NAMES { \\r
-  "normal", \\r
-  "normal", \\r
-  "wildcastle", \\r
-  "nocastle", \\r
-  "fischerandom", \\r
-  "bughouse", \\r
-  "crazyhouse", \\r
-  "losers", \\r
-  "suicide", \\r
-  "giveaway", \\r
-  "twokings", \\r
-  "kriegspiel", \\r
-  "atomic", \\r
-  "3check", \\r
-  "shatranj", \\r
-  "wild29", \\r
-  "wild30", \\r
-  "shogi", \\r
-  "xiangqi", \\r
-  "courier", \\r
-  "gothic", \\r
-  "capablanca", \\r
-  "fairy", \\r
-  "unknown" \\r
-}\r
-#else\r
 #define VARIANT_NAMES { \\r
   "normal", \\r
   "normal", \\r
@@ -313,9 +309,16 @@ typedef enum {
   "wild34", \\r
   "wild35", \\r
   "wild36", \\r
+  "shogi", \\r
+  "xiangqi", \\r
+  "courier", \\r
+  "gothic", \\r
+  "capablanca", \\r
+  "knightmate", \\r
+  "fairy", \\r
+  "showgi", \\r
   "unknown" \\r
 }\r
-#endif\r
 \r
 typedef struct {\r
 #if !defined(_amigados)\r
@@ -516,10 +519,16 @@ typedef struct {
     /* [HGM] Board size */\r
     int NrFiles;\r
     int NrRanks;\r
+    int holdingsSize;\r
     int matchPause;\r
+    Boolean alphaRank;\r
     Boolean testClaims;\r
+    Boolean checkMates;\r
+    Boolean materialDraws;\r
+    Boolean trivialDraws;\r
     int ruleMoves;\r
     int drawRepeats;\r
+    char * pieceToCharTable;\r
 \r
 #if ZIPPY\r
     char *zippyLines;\r
@@ -580,7 +589,16 @@ typedef struct {
     int blackRating;    /* -1 if unknown */\r
     VariantClass variant;\r
     char *outOfBook;    /* [AS] Move and score when engine went out of book */\r
+    int boardWidth;     /* [HGM] adjustable board size */\r
+    int boardHeight;\r
+/* [HGM] For Shogi and Crazyhouse: */\r
+    int holdingsSize;  /* number of different piece types in holdings       */\r
+    int holdingsWidth; /* number of files left and right of board, 0 or 2   */\r
 } GameInfo;\r
 \r
 \r
 #endif\r
+\r
+/* extern int holdingsWidth;  \r
+extern int holdingsHeight; \r
+/*extern int holdings[(int) EmptySquare];*/\r
index b29bde6..ec3ac90 100644 (file)
--- a/config.h
+++ b/config.h
@@ -47,7 +47,7 @@
 \r
 #define LAST_PTY_LETTER 'q'\r
 \r
-#define PATCHLEVEL "2"\r
+#define PATCHLEVEL "4"\r
 \r
 #define PRODUCT "WinBoard"\r
 \r
diff --git a/moves.c b/moves.c
index 57e350e..2070ef3 100644 (file)
--- a/moves.c
+++ b/moves.c
@@ -119,13 +119,13 @@ ChessSquare PromoPiece(moveType)
        return BlackKing;\r
 #ifdef FAIRY\r
       case WhitePromotionChancellor:\r
-        return WhiteFairyRook;\r
+        return WhiteMarshall;\r
       case BlackPromotionChancellor:\r
-        return BlackFairyRook;\r
+        return BlackMarshall;\r
       case WhitePromotionArchbishop:\r
-        return WhiteFairyBishop;\r
+        return WhiteCardinal;\r
       case BlackPromotionArchbishop:\r
-        return BlackFairyBishop;\r
+        return BlackCardinal;\r
 #endif\r
     }\r
 }\r
@@ -196,15 +196,15 @@ ChessMove PromoCharToMoveType(whiteOnMove, promoChar)
 }\r
 \r
 char pieceToChar[] = {\r
-    'P', 'N', 'B', 'R', \r
+              'P', 'N', 'B', 'R', 'Q', \r
 #ifdef FAIRY\r
-    'A', 'C', 'F', 'H', 'E', 'W', 'D', 'O', 'G', 'M',\r
+    'F', 'W', 'E', 'H', 'A', 'C', 'G', 'O', 'M', 'U', \r
 #endif\r
-    'Q', 'K', 'p', 'n', 'b', 'r', \r
+    'K',      'p', 'n', 'b', 'r', 'q', \r
 #ifdef FAIRY            \r
-    'a', 'c', 'f', 'h', 'e', 'w', 'd', 'o', 'g', 'm',\r
+    'f', 'w', 'e', 'h', 'a', 'c', 'g', 'o', 'm', 'u',\r
 #endif\r
-    'q', 'k', 'x'\r
+    'k', 'x'\r
   };\r
 \r
 char PieceToChar(p)\r
@@ -215,7 +215,13 @@ char PieceToChar(p)
 \r
 ChessSquare CharToPiece(c)\r
      int c;\r
-{    switch (c) {\r
+{\r
+     int i;\r
+     for(i=0; i< (int) EmptySquare; i++)\r
+          if(pieceToChar[i] == c) return (ChessSquare) i;\r
+     return EmptySquare;\r
+/* [HGM] code marked for deletion\r
+     switch (c) {\r
       default:\r
       case 'x':        return EmptySquare;\r
       case 'P':        return WhitePawn;\r
@@ -233,28 +239,29 @@ ChessSquare CharToPiece(c)
 #ifdef FAIRY\r
       case 'A': return WhiteCardinal;\r
       case 'C': return WhiteMarshall;\r
-      case 'F': return WhiteFairyPawn;\r
-      case 'H': return WhiteFairyKnight;\r
-      case 'E': return WhiteFairyBishop;\r
-      case 'W': return WhiteFairyRook;\r
-      case 'D': return WhiteFairyCardinal;\r
-      case 'O': return WhiteFairyMarshall;\r
-      case 'G': return WhiteFairyQueen;\r
-      case 'M': return WhiteFairyKing;\r
+      case 'F': return WhiteFerz;\r
+      case 'H': return WhiteNightrider;\r
+      case 'E': return WhiteAlfil;\r
+      case 'W': return WhiteWazir;\r
+      case 'U': return WhiteUnicorn;\r
+      case 'O': return WhiteCannon;\r
+      case 'G': return WhiteGrasshopper;\r
+      case 'M': return WhiteMan;\r
                 \r
       case 'a': return BlackCardinal;\r
       case 'c': return BlackMarshall;\r
-      case 'f': return BlackFairyPawn;\r
-      case 'h': return BlackFairyKnight;\r
-      case 'e': return BlackFairyBishop;\r
-      case 'w': return BlackFairyRook;\r
-      case 'd': return BlackFairyCardinal;\r
-      case 'o': return BlackFairyMarshall;\r
-      case 'g': return BlackFairyQueen;\r
-      case 'm': return BlackFairyKing;\r
+      case 'f': return BlackFerz;\r
+      case 'h': return BlackNightrider;\r
+      case 'e': return BlackAlfil;\r
+      case 'w': return BlackWazir;\r
+      case 'u': return BlackUnicorn;\r
+      case 'o': return BlackCannon;\r
+      case 'g': return BlackGrasshopper;\r
+      case 'm': return BlackMan;\r
                 \r
 #endif\r
     }\r
+*/\r
 }\r
 \r
 void CopyBoard(to, from)\r
@@ -300,15 +307,24 @@ void GenPseudoLegal(board, flags, epfile, callback, closure)
     int i, j, d, s, fs, rs, rt, ft, m;\r
 \r
     for (rf = 0; rf < BOARD_HEIGHT; rf++) \r
-      for (ff = 0; ff < BOARD_WIDTH; ff++) {\r
+      for (ff = BOARD_LEFT; ff < BOARD_RGHT; ff++) {\r
+          ChessSquare piece;\r
+\r
          if (flags & F_WHITE_ON_MOVE) {\r
              if (!WhitePiece(board[rf][ff])) continue;\r
          } else {\r
              if (!BlackPiece(board[rf][ff])) continue;\r
          }\r
-          m = 0;\r
-         switch (board[rf][ff]) {\r
-           case EmptySquare:\r
+          m = 0; piece = board[rf][ff];\r
+          if(gameInfo.variant == VariantCrazyhouse &&\r
+              ( (int) piece > (int) WhiteQueen && (int) piece < (int) WhiteKing\r
+             || (int) piece > (int) BlackQueen && (int) piece < (int) BlackKing ))\r
+                 piece = (ChessSquare) ( DEMOTED piece );\r
+          if(gameInfo.variant == VariantShogi)\r
+                 piece = (ChessSquare) ( SHOGI piece );\r
+\r
+          switch (piece) {\r
+            /* case EmptySquare: [HGM] this is nonsense, and conflicts with Shogi cases */\r
            default:\r
              /* can't happen ([HGM] except for faries...) */\r
              break;\r
@@ -325,7 +341,7 @@ void GenPseudoLegal(board, flags, epfile, callback, closure)
                   /* and move sideways when across the river */\r
                   for (s = -1; s <= 1; s += 2) {\r
                       if (rf >= BOARD_HEIGHT>>1 &&\r
-                          ff + s >= 0 && ff + s < BOARD_WIDTH &&\r
+                          ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT &&\r
                           !WhitePiece(board[rf][ff+s]) ) {\r
                            callback(board, flags, NormalMove,\r
                                     rf, ff, rf, ff+s, closure);\r
@@ -341,12 +357,13 @@ void GenPseudoLegal(board, flags, epfile, callback, closure)
              }\r
              if (rf == 1 && board[2][ff] == EmptySquare &&\r
                   gameInfo.variant != VariantShatranj && /* [HGM] */\r
+                  gameInfo.variant != VariantCourier  && /* [HGM] */\r
                   board[3][ff] == EmptySquare ) {\r
                       callback(board, flags, NormalMove,\r
                                rf, ff, 3, ff, closure);\r
              }\r
              for (s = -1; s <= 1; s += 2) {\r
-                 if (rf < BOARD_HEIGHT-1 && ff + s >= 0 && ff + s < BOARD_WIDTH &&\r
+                  if (rf < BOARD_HEIGHT-1 && ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT &&\r
                      ((flags & F_KRIEGSPIEL_CAPTURE) ||\r
                       BlackPiece(board[rf + 1][ff + s]))) {\r
                      callback(board, flags, \r
@@ -354,7 +371,7 @@ void GenPseudoLegal(board, flags, epfile, callback, closure)
                               rf, ff, rf + 1, ff + s, closure);\r
                  }\r
                  if (rf == BOARD_HEIGHT-4) {\r
-                     if (ff + s >= 0 && ff + s < BOARD_WIDTH &&\r
+                      if (ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT &&\r
                          (epfile == ff + s || epfile == EP_UNKNOWN) &&\r
                           board[BOARD_HEIGHT-4][ff + s] == BlackPawn &&\r
                           board[BOARD_HEIGHT-3][ff + s] == EmptySquare) {\r
@@ -376,7 +393,7 @@ void GenPseudoLegal(board, flags, epfile, callback, closure)
                   /* and move sideways when across the river */\r
                   for (s = -1; s <= 1; s += 2) {\r
                       if (rf < BOARD_HEIGHT>>1 &&\r
-                          ff + s >= 0 && ff + s < BOARD_WIDTH &&\r
+                          ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT &&\r
                           !BlackPiece(board[rf][ff+s]) ) {\r
                            callback(board, flags, NormalMove,\r
                                     rf, ff, rf, ff+s, closure);\r
@@ -392,12 +409,13 @@ void GenPseudoLegal(board, flags, epfile, callback, closure)
              }\r
              if (rf == BOARD_HEIGHT-2 && board[BOARD_HEIGHT-3][ff] == EmptySquare &&\r
                   gameInfo.variant != VariantShatranj && /* [HGM] */\r
+                  gameInfo.variant != VariantCourier  && /* [HGM] */\r
                  board[BOARD_HEIGHT-4][ff] == EmptySquare) {\r
                  callback(board, flags, NormalMove,\r
                           rf, ff, BOARD_HEIGHT-4, ff, closure);\r
              }\r
              for (s = -1; s <= 1; s += 2) {\r
-                 if (rf > 0 && ff + s >= 0 && ff + s < BOARD_WIDTH &&\r
+                  if (rf > 0 && ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT &&\r
                      ((flags & F_KRIEGSPIEL_CAPTURE) ||\r
                       WhitePiece(board[rf - 1][ff + s]))) {\r
                      callback(board, flags, \r
@@ -405,7 +423,7 @@ void GenPseudoLegal(board, flags, epfile, callback, closure)
                               rf, ff, rf - 1, ff + s, closure);\r
                  }\r
                  if (rf == 3) {\r
-                      if (ff + s >= 0 && ff + s < BOARD_WIDTH &&\r
+                      if (ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT &&\r
                          (epfile == ff + s || epfile == EP_UNKNOWN) &&\r
                          board[3][ff + s] == WhitePawn &&\r
                          board[2][ff + s] == EmptySquare) {\r
@@ -416,6 +434,10 @@ void GenPseudoLegal(board, flags, epfile, callback, closure)
              }             \r
              break;\r
 \r
+#ifdef FAIRY\r
+            case WhiteUnicorn:\r
+            case BlackUnicorn:\r
+#endif\r
            case WhiteKnight:\r
            case BlackKnight:\r
             mounted:\r
@@ -424,22 +446,46 @@ void GenPseudoLegal(board, flags, epfile, callback, closure)
                  for (s = 1; s <= 2; s++) {\r
                      rt = rf + i*s;\r
                      ft = ff + j*(3-s);\r
-                     if (rt < 0 || rt >= BOARD_HEIGHT || ft < 0 || ft >= BOARD_WIDTH) continue;\r
-                     if (SameColor(board[rf][ff], board[rt][ft])) continue;\r
+                      if (!(rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT)\r
+                          && ( gameInfo.variant != VariantXiangqi || board[rf+i*(s-1)][ff+j*(2-s)] == EmptySquare)\r
+                          && !SameColor(board[rf][ff], board[rt][ft]))\r
                      callback(board, flags, NormalMove,\r
                               rf, ff, rt, ft, closure);\r
                  }\r
              break;\r
+\r
 #ifdef FAIRY\r
-            case WhiteFairyMarshall:\r
-            case BlackFairyMarshall:\r
+            case SHOGI WhiteKnight:\r
+             for (s = -1; s <= 1; s += 2) {\r
+                  if (rf < BOARD_HEIGHT-2 && ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT &&\r
+                      !SameColor(board[rf][ff], board[rf + 2][ff + s])) {\r
+                     callback(board, flags, \r
+                              rf == BOARD_HEIGHT-2 ? WhitePromotionQueen : NormalMove,\r
+                               rf, ff, rf + 2, ff + s, closure);\r
+                 }\r
+              }\r
+             break;\r
+\r
+            case SHOGI BlackKnight:\r
+             for (s = -1; s <= 1; s += 2) {\r
+                  if (rf > 1 && ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT &&\r
+                      !SameColor(board[rf][ff], board[rf - 2][ff + s])) {\r
+                     callback(board, flags, \r
+                              rf == 1 ? BlackPromotionQueen : NormalMove,\r
+                               rf, ff, rf - 2, ff + s, closure);\r
+                 }\r
+             }             \r
+             break;\r
+\r
+            case WhiteCannon:\r
+            case BlackCannon:\r
               for (d = 0; d <= 1; d++)\r
                 for (s = -1; s <= 1; s += 2) {\r
                   m = 0;\r
                  for (i = 1;; i++) {\r
                      rt = rf + (i * s) * d;\r
                      ft = ff + (i * s) * (1 - d);\r
-                     if (rt < 0 || rt >= BOARD_HEIGHT || ft < 0 || ft >= BOARD_WIDTH) break;\r
+                      if (rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) break;\r
                       if (m == 0 && board[rt][ft] == EmptySquare)\r
                                  callback(board, flags, NormalMove,\r
                                           rf, ff, rt, ft, closure);\r
@@ -452,35 +498,82 @@ void GenPseudoLegal(board, flags, epfile, callback, closure)
                 }\r
              break;\r
 \r
-            case WhiteFairyRook:\r
-            case BlackFairyRook:\r
+            /* Gold General (and all its promoted versions) . First do the */\r
+            /* diagonal forward steps, then proceed as normal Wazir        */\r
+            case SHOGI WhiteWazir:\r
+            case SHOGI (PROMOTED WhitePawn):\r
+            case SHOGI (PROMOTED WhiteKnight):\r
+            case SHOGI (PROMOTED WhiteQueen):\r
+            case SHOGI (PROMOTED WhiteFerz):\r
+             for (s = -1; s <= 1; s += 2) {\r
+                  if (rf < BOARD_HEIGHT-1 && ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT &&\r
+                      !SameColor(board[rf][ff], board[rf + 1][ff + s])) {\r
+                     callback(board, flags, \r
+                              rf == BOARD_HEIGHT-2 ? WhitePromotionQueen : NormalMove,\r
+                              rf, ff, rf + 1, ff + s, closure);\r
+                 }\r
+              }\r
+              goto finishGold;\r
+\r
+            case SHOGI BlackWazir:\r
+            case SHOGI (PROMOTED BlackPawn):\r
+            case SHOGI (PROMOTED BlackKnight):\r
+            case SHOGI (PROMOTED BlackQueen):\r
+            case SHOGI (PROMOTED BlackFerz):\r
+             for (s = -1; s <= 1; s += 2) {\r
+                  if (rf > 0 && ff + s >= BOARD_LEFT && ff + s < BOARD_RGHT &&\r
+                      !SameColor(board[rf][ff], board[rf - 1][ff + s])) {\r
+                     callback(board, flags, \r
+                              rf == 1 ? BlackPromotionQueen : NormalMove,\r
+                              rf, ff, rf - 1, ff + s, closure);\r
+                 }\r
+             }             \r
+\r
+            case WhiteWazir:\r
+            case BlackWazir:\r
+            finishGold:\r
               for (d = 0; d <= 1; d++)\r
-                for (s = -1; s <= 1; s += 2)\r
+                for (s = -1; s <= 1; s += 2) {\r
                       rt = rf + s * d;\r
                       ft = ff + s * (1 - d);\r
-                      if (!(rt < 0 || rt >= BOARD_HEIGHT || ft < 0 || ft >= BOARD_WIDTH)\r
-                          && !SameColor(board[rf][ff], board[rt][ft]))\r
+                      if (!(rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT)\r
+                          && !SameColor(board[rf][ff], board[rt][ft]) &&\r
+                          (gameInfo.variant != VariantXiangqi || InPalace(rt, ft) ) )\r
                                callback(board, flags, NormalMove,\r
                                         rf, ff, rt, ft, closure);\r
+                      }\r
              break;\r
 \r
-           case WhiteFairyBishop:\r
-           case BlackFairyBishop:\r
+            case WhiteAlfil:\r
+            case BlackAlfil:\r
                 /* [HGM] support Shatranj pieces */\r
                 for (rs = -1; rs <= 1; rs += 2) \r
                   for (fs = -1; fs <= 1; fs += 2) {\r
                       rt = rf + 2 * rs;\r
                       ft = ff + 2 * fs;\r
-                      if (!(rt < 0 || rt >= BOARD_HEIGHT || ft < 0 || ft >= BOARD_WIDTH)\r
+                      if (!(rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT)\r
+                          && ( gameInfo.variant != VariantXiangqi ||\r
+                               board[rf+rs][ff+fs] == EmptySquare && (2*rf < BOARD_HEIGHT) == (2*rt < BOARD_HEIGHT) )\r
+                         \r
                           && !SameColor(board[rf][ff], board[rt][ft]))\r
                                callback(board, flags, NormalMove,\r
                                         rf, ff, rt, ft, closure);\r
                  }\r
                 break;\r
 \r
+            /* Shogi Dragon Horse has to continue with Wazir after Bishop */\r
+            case SHOGI WhiteCardinal:\r
+            case SHOGI BlackCardinal:\r
+              m++;\r
+\r
+            /* Capablanca Archbishop continues as Knight                  */\r
             case WhiteCardinal:\r
             case BlackCardinal:\r
               m++;\r
+\r
+            /* Shogi Bishops are ordinary Bishops */\r
+            case SHOGI WhiteBishop:\r
+            case SHOGI BlackBishop:\r
 #endif\r
            case WhiteBishop:\r
            case BlackBishop:\r
@@ -489,19 +582,56 @@ void GenPseudoLegal(board, flags, epfile, callback, closure)
                  for (i = 1;; i++) {\r
                      rt = rf + (i * rs);\r
                      ft = ff + (i * fs);\r
-                     if (rt < 0 || rt >= BOARD_HEIGHT || ft < 0 || ft >= BOARD_WIDTH) break;\r
+                      if (rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) break;\r
                      if (SameColor(board[rf][ff], board[rt][ft])) break;\r
                      callback(board, flags, NormalMove,\r
                               rf, ff, rt, ft, closure);\r
                      if (board[rt][ft] != EmptySquare) break;\r
                  }\r
-                if(m) goto mounted;\r
+                if(m==1) goto mounted;\r
+                if(m==2) goto finishGold;\r
+                /* Bishop falls through */\r
              break;\r
 \r
 #ifdef FAIRY\r
+            /* Shogi Lance is unlike anything, and asymmetric at that */\r
+            case SHOGI WhiteQueen:\r
+              for(i = 1;; i++) {\r
+                      rt = rf + i;\r
+                      ft = ff;\r
+                      if (rt >= BOARD_HEIGHT) break;\r
+                     if (SameColor(board[rf][ff], board[rt][ft])) break;\r
+                     callback(board, flags, NormalMove,\r
+                              rf, ff, rt, ft, closure);\r
+                      if (board[rt][ft] != EmptySquare) break;\r
+              }\r
+              break;\r
+\r
+            case SHOGI BlackQueen:\r
+              for(i = 1;; i++) {\r
+                      rt = rf - i;\r
+                      ft = ff;\r
+                      if (rt < 0) break;\r
+                     if (SameColor(board[rf][ff], board[rt][ft])) break;\r
+                     callback(board, flags, NormalMove,\r
+                              rf, ff, rt, ft, closure);\r
+                      if (board[rt][ft] != EmptySquare) break;\r
+              }\r
+              break;\r
+\r
+            /* Shogi Dragon King has to continue as Ferz after Rook moves */\r
+            case SHOGI WhiteMarshall:\r
+            case SHOGI BlackMarshall:\r
+              m++;\r
+\r
+            /* Capablanca Chancellor sets flag to continue as Knight      */\r
             case WhiteMarshall:\r
             case BlackMarshall:\r
               m++;\r
+\r
+            /* Shogi Rooks are ordinary Rooks */\r
+            case SHOGI WhiteRook:\r
+            case SHOGI BlackRook:\r
 #endif\r
            case WhiteRook:\r
            case BlackRook:\r
@@ -510,13 +640,14 @@ void GenPseudoLegal(board, flags, epfile, callback, closure)
                  for (i = 1;; i++) {\r
                      rt = rf + (i * s) * d;\r
                      ft = ff + (i * s) * (1 - d);\r
-                     if (rt < 0 || rt >= BOARD_HEIGHT || ft < 0 || ft >= BOARD_WIDTH) break;\r
+                      if (rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) break;\r
                      if (SameColor(board[rf][ff], board[rt][ft])) break;\r
                      callback(board, flags, NormalMove,\r
                               rf, ff, rt, ft, closure);\r
                      if (board[rt][ft] != EmptySquare) break;\r
                  }\r
-                if(m) goto mounted;\r
+                if(m==1) goto mounted;\r
+                if(m==2) goto walking;\r
              break;\r
 \r
            case WhiteQueen:\r
@@ -527,7 +658,7 @@ void GenPseudoLegal(board, flags, epfile, callback, closure)
                    for (i = 1;; i++) {\r
                        rt = rf + (i * rs);\r
                        ft = ff + (i * fs);\r
-                       if (rt < 0 || rt >= BOARD_HEIGHT || ft < 0 || ft >= BOARD_WIDTH) break;\r
+                        if (rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) break;\r
                        if (SameColor(board[rf][ff], board[rt][ft])) break;\r
                        callback(board, flags, NormalMove,\r
                                 rf, ff, rt, ft, closure);\r
@@ -537,31 +668,55 @@ void GenPseudoLegal(board, flags, epfile, callback, closure)
              break;\r
 \r
 #ifdef FAIRY\r
-            case WhiteFairyPawn:\r
-            case BlackFairyPawn:\r
+            /* Shogi Pawn and Silver General: first the Pawn move,    */\r
+            /* then the General continues like a Ferz                 */\r
+            case SHOGI WhitePawn:\r
+            case SHOGI WhiteFerz:\r
+                  if (rf < BOARD_HEIGHT-1 &&\r
+                           !SameColor(board[rf][ff], board[rf + 1][ff]) ) \r
+                           callback(board, flags, NormalMove,\r
+                                    rf, ff, rf + 1, ff, closure);\r
+              if(piece != SHOGI WhitePawn) goto finishSilver;\r
+              break;\r
+\r
+            case SHOGI BlackPawn:\r
+            case SHOGI BlackFerz:\r
+                  if (rf > 0 &&\r
+                           !SameColor(board[rf][ff], board[rf - 1][ff]) ) \r
+                           callback(board, flags, NormalMove,\r
+                                    rf, ff, rf - 1, ff, closure);\r
+              if(piece == SHOGI BlackPawn) break;\r
+\r
+            case WhiteFerz:\r
+            case BlackFerz:\r
+            finishSilver:\r
                 /* [HGM] support Shatranj pieces */\r
                 for (rs = -1; rs <= 1; rs += 2) \r
                   for (fs = -1; fs <= 1; fs += 2) {\r
                       rt = rf + rs;\r
                       ft = ff + fs;\r
-                     if (rt < 0 || rt >= BOARD_HEIGHT || ft < 0 || ft >= BOARD_WIDTH) break;\r
-                      if (!SameColor(board[rf][ff], board[rt][ft]))\r
+                      if (rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) break;\r
+                      if (!SameColor(board[rf][ff], board[rt][ft]) &&\r
+                          (gameInfo.variant != VariantXiangqi || InPalace(rt, ft) ) )\r
                                callback(board, flags, NormalMove,\r
                                         rf, ff, rt, ft, closure);\r
                  }\r
                 break;\r
 \r
-            case WhiteFairyKing:\r
-            case BlackFairyKing:\r
+            case WhiteMan:\r
+            case BlackMan:\r
+            case SHOGI WhiteKing:\r
+            case SHOGI BlackKing:\r
 #endif\r
            case WhiteKing:\r
            case BlackKing:\r
+            walking:\r
              for (i = -1; i <= 1; i++)\r
                for (j = -1; j <= 1; j++) {\r
                    if (i == 0 && j == 0) continue;\r
                    rt = rf + i;\r
                    ft = ff + j;\r
-                   if (rt < 0 || rt >= BOARD_HEIGHT || ft < 0 || ft >= BOARD_WIDTH) continue;\r
+                    if (rt < 0 || rt >= BOARD_HEIGHT || ft < BOARD_LEFT || ft >= BOARD_RGHT) continue;\r
                    if (SameColor(board[rf][ff], board[rt][ft])) continue;\r
                    callback(board, flags, NormalMove,\r
                             rf, ff, rt, ft, closure);\r
@@ -602,7 +757,7 @@ void GenLegalCallback(board, flags, kind, rf, ff, rt, ft, closure)
        if (board[rf][ff] == king) return;\r
        for (r = rt-1; r <= rt+1; r++) {\r
          for (f = ft-1; f <= ft+1; f++) {\r
-           if (r >= 0 && r < BOARD_HEIGHT && f >= 0 && f < BOARD_WIDTH &&\r
+            if (r >= 0 && r < BOARD_HEIGHT && f >= BOARD_LEFT && f < BOARD_RGHT &&\r
                board[r][f] == king) return;\r
          }\r
        }\r
@@ -648,79 +803,79 @@ int GenLegal(board, flags, epfile, castlingRights, callback, closure)
     for (ff = BOARD_WIDTH>>1; ff >= (BOARD_WIDTH-1)>>1; ff-- /*ics wild 1*/) {\r
        if ((flags & F_WHITE_ON_MOVE) &&\r
            (flags & F_WHITE_KCASTLE_OK) &&\r
-           board[0][ff] == WhiteKing &&\r
-           board[0][ff + 1] == EmptySquare &&\r
-           board[0][ff + 2] == EmptySquare &&\r
-           board[0][BOARD_WIDTH-3] == EmptySquare &&\r
-           board[0][BOARD_WIDTH-2] == EmptySquare &&\r
-           board[0][BOARD_WIDTH-1] == WhiteRook &&\r
+            board[0][ff] == WhiteKing &&\r
+            board[0][ff + 1] == EmptySquare &&\r
+            board[0][ff + 2] == EmptySquare &&\r
+            board[0][BOARD_RGHT-3] == EmptySquare &&\r
+            board[0][BOARD_RGHT-2] == EmptySquare &&\r
+            board[0][BOARD_RGHT-1] == WhiteRook &&\r
             castlingRights[0] >= 0 && /* [HGM] check rights */\r
             ( castlingRights[2] == ff || castlingRights[6] == ff ) &&\r
             (ignoreCheck ||                             \r
             (!CheckTest(board, flags, 0, ff, 0, ff + 1, FALSE) &&\r
-             !CheckTest(board, flags, 0, ff, 0, BOARD_WIDTH-3, FALSE) &&\r
+              !CheckTest(board, flags, 0, ff, 0, BOARD_RGHT-3, FALSE) &&\r
              !CheckTest(board, flags, 0, ff, 0, ff + 2, FALSE)))) {\r
 \r
            callback(board, flags,\r
                     ff==4 ? WhiteKingSideCastle : WhiteKingSideCastleWild,\r
-                    0, ff, 0, ff + ((BOARD_WIDTH+2)>>2), closure);\r
+                     0, ff, 0, ff + ((gameInfo.boardWidth+2)>>2), closure);\r
        }\r
        if ((flags & F_WHITE_ON_MOVE) &&\r
            (flags & F_WHITE_QCASTLE_OK) &&\r
            board[0][ff] == WhiteKing &&\r
            board[0][ff - 1] == EmptySquare &&\r
            board[0][ff - 2] == EmptySquare &&\r
-           board[0][2] == EmptySquare &&\r
-           board[0][1] == EmptySquare &&\r
-            board[0][0] == WhiteRook &&\r
+            board[0][BOARD_LEFT+2] == EmptySquare &&\r
+            board[0][BOARD_LEFT+1] == EmptySquare &&\r
+            board[0][BOARD_LEFT+0] == WhiteRook &&\r
             castlingRights[1] >= 0 && /* [HGM] check rights */\r
             ( castlingRights[2] == ff || castlingRights[6] == ff ) &&\r
            (ignoreCheck ||\r
             (!CheckTest(board, flags, 0, ff, 0, ff - 1, FALSE) &&\r
-             !CheckTest(board, flags, 0, ff, 0, 3,      FALSE) &&\r
+              !CheckTest(board, flags, 0, ff, 0, BOARD_LEFT+3,      FALSE) &&\r
              !CheckTest(board, flags, 0, ff, 0, ff - 2, FALSE)))) {\r
 \r
            callback(board, flags,\r
                     ff==BOARD_WIDTH>>1 ? WhiteQueenSideCastle : WhiteQueenSideCastleWild,\r
-                    0, ff, 0, ff - ((BOARD_WIDTH+2)>>2), closure);\r
+                     0, ff, 0, ff - ((gameInfo.boardWidth+2)>>2), closure);\r
        }\r
        if (!(flags & F_WHITE_ON_MOVE) &&\r
            (flags & F_BLACK_KCASTLE_OK) &&\r
            board[BOARD_HEIGHT-1][ff] == BlackKing &&\r
            board[BOARD_HEIGHT-1][ff + 1] == EmptySquare &&\r
            board[BOARD_HEIGHT-1][ff + 2] == EmptySquare &&\r
-           board[BOARD_HEIGHT-1][BOARD_WIDTH-3] == EmptySquare &&\r
-           board[BOARD_HEIGHT-1][BOARD_WIDTH-2] == EmptySquare &&\r
-           board[BOARD_HEIGHT-1][BOARD_WIDTH-1] == BlackRook &&\r
+            board[BOARD_HEIGHT-1][BOARD_RGHT-3] == EmptySquare &&\r
+            board[BOARD_HEIGHT-1][BOARD_RGHT-2] == EmptySquare &&\r
+            board[BOARD_HEIGHT-1][BOARD_RGHT-1] == BlackRook &&\r
             castlingRights[3] >= 0 && /* [HGM] check rights */\r
             ( castlingRights[5] == ff || castlingRights[7] == ff ) &&\r
            (ignoreCheck ||\r
             (!CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff + 1, FALSE) &&\r
-             !CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, BOARD_WIDTH-3, FALSE) &&\r
+              !CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, BOARD_RGHT-3, FALSE) &&\r
              !CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff + 2, FALSE)))) {\r
 \r
            callback(board, flags,\r
                     ff==BOARD_WIDTH>>1 ? BlackKingSideCastle : BlackKingSideCastleWild,\r
-                    BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff + ((BOARD_WIDTH+2)>>2), closure);\r
+                     BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff + ((gameInfo.boardWidth+2)>>2), closure);\r
        }\r
        if (!(flags & F_WHITE_ON_MOVE) &&\r
            (flags & F_BLACK_QCASTLE_OK) &&\r
            board[BOARD_HEIGHT-1][ff] == BlackKing &&\r
            board[BOARD_HEIGHT-1][ff - 1] == EmptySquare &&\r
            board[BOARD_HEIGHT-1][ff - 2] == EmptySquare &&\r
-           board[BOARD_HEIGHT-1][2] == EmptySquare &&\r
-           board[BOARD_HEIGHT-1][1] == EmptySquare &&\r
-           board[BOARD_HEIGHT-1][0] == BlackRook &&\r
+            board[BOARD_HEIGHT-1][BOARD_LEFT+2] == EmptySquare &&\r
+            board[BOARD_HEIGHT-1][BOARD_LEFT+1] == EmptySquare &&\r
+            board[BOARD_HEIGHT-1][BOARD_LEFT+0] == BlackRook &&\r
             castlingRights[4] >= 0 && /* [HGM] check rights */\r
             ( castlingRights[5] == ff || castlingRights[7] == ff ) &&\r
            (ignoreCheck ||\r
             (!CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff - 1, FALSE) &&\r
-             !CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, 3,      FALSE) &&\r
+              !CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, BOARD_LEFT+3,      FALSE) &&\r
              !CheckTest(board, flags, BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff - 1, FALSE)))) {\r
 \r
            callback(board, flags,\r
                     ff==BOARD_WIDTH>>1 ? BlackQueenSideCastle : BlackQueenSideCastleWild,\r
-                    BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff - ((BOARD_WIDTH+2)>>2), closure);\r
+                     BOARD_HEIGHT-1, ff, BOARD_HEIGHT-1, ff - ((gameInfo.boardWidth+2)>>2), closure);\r
        }\r
     }\r
 \r
@@ -731,9 +886,9 @@ int GenLegal(board, flags, epfile, castlingRights, callback, closure)
 \r
     if ((flags & F_WHITE_ON_MOVE) != 0) {\r
 \r
-       for (ff = 1; ff < BOARD_WIDTH-1; ff++) {\r
+       for (ff = BOARD_LEFT+1; ff < BOARD_RGHT-1; ff++) {\r
           if (board[0][ff] == WhiteKing) {\r
-             for (ft = 0; ft < BOARD_WIDTH; ft++) {\r
+             for (ft = BOARD_LEFT+0; ft < BOARD_RGHT; ft++) {\r
                 if (board[0][ft] == WhiteRook) {\r
                    callback(board, flags, \r
                             (ft > ff) ? WhiteHSideCastleFR : WhiteASideCastleFR,\r
@@ -745,9 +900,9 @@ int GenLegal(board, flags, epfile, castlingRights, callback, closure)
 \r
     } else {\r
 \r
-       for (ff = 1; ff < BOARD_WIDTH-1; ff++) {\r
+       for (ff = BOARD_LEFT+1; ff < BOARD_RGHT-1; ff++) {\r
           if (board[BOARD_HEIGHT-1][ff] == BlackKing) {\r
-             for (ft = 0; ft < BOARD_WIDTH; ft++) {\r
+             for (ft = BOARD_LEFT+0; ft < BOARD_RGHT; ft++) {\r
                 if (board[BOARD_HEIGHT-1][ft] == BlackRook) {\r
                    callback(board, flags, \r
                             (ft > ff) ? BlackHSideCastleFR : BlackASideCastleFR,\r
@@ -805,6 +960,11 @@ int CheckTest(board, flags, rf, ff, rt, ft, enPassant)
     ChessSquare captured = EmptySquare;\r
     /*  Suppress warnings on uninitialized variables    */\r
 \r
+    if(gameInfo.variant == VariantXiangqi)\r
+        king = flags & F_WHITE_ON_MOVE ? WhiteWazir : BlackWazir;\r
+    if(gameInfo.variant == VariantKnightmate)\r
+        king = flags & F_WHITE_ON_MOVE ? WhiteUnicorn : BlackUnicorn;\r
+\r
     if (rf >= 0) {\r
        if (enPassant) {\r
            captured = board[rf][ft];\r
@@ -820,9 +980,9 @@ int CheckTest(board, flags, rf, ff, rt, ft, enPassant)
        order a1, a2, a3, ... b1, b2, ..., h8 to find the first king,\r
        and we test only whether that one is in check. */\r
     cl.check = 0;\r
-    for (cl.fking = 0; cl.fking < BOARD_WIDTH; cl.fking++)\r
+    for (cl.fking = BOARD_LEFT+0; cl.fking < BOARD_RGHT; cl.fking++)\r
        for (cl.rking = 0; cl.rking < BOARD_HEIGHT; cl.rking++) {\r
-         if (board[cl.rking][cl.fking] == king) {\r
+          if (board[cl.rking][cl.fking] == king) {\r
              GenPseudoLegal(board, flags ^ F_WHITE_ON_MOVE, -1,\r
                             CheckTestCallback, (VOIDSTAR) &cl);\r
              goto undo_move;  /* 2-level break */\r
@@ -858,6 +1018,9 @@ void LegalityTestCallback(board, flags, kind, rf, ff, rt, ft, closure)
 {\r
     register LegalityTestClosure *cl = (LegalityTestClosure *) closure;\r
 \r
+    if (appData.debugMode) {\r
+        fprintf(debugFP, "Legality test: %c%c%c%c\n", ff+AAA, rf+ONE, ft+AAA, rt+ONE);\r
+    }\r
     if (rf == cl->rf && ff == cl->ff && rt == cl->rt && ft == cl->ft)\r
       cl->kind = kind;\r
 }\r
@@ -921,7 +1084,8 @@ int MateTest(board, flags, epfile, castlingRights)
     if (cl.count > 0) {\r
        return inCheck ? MT_CHECK : MT_NONE;\r
     } else {\r
-       return inCheck ? MT_CHECKMATE : MT_STALEMATE;\r
+        return inCheck || gameInfo.variant == VariantXiangqi ?\r
+                         MT_CHECKMATE : MT_STALEMATE;\r
     }\r
 }\r
 \r
@@ -1063,11 +1227,12 @@ ChessMove CoordsToAlgebraic(board, flags, epfile,
        /* Bughouse piece drop */\r
        *outp++ = ToUpper(PieceToChar((ChessSquare) ff));\r
        *outp++ = '@';\r
-       *outp++ = ft + 'a';\r
+        *outp++ = ft + AAA;\r
         if(rt+ONE <= '9')\r
            *outp++ = rt + ONE;\r
         else { *outp++ = (rt+ONE-'0')/10 + '0';*outp++ = (rt+ONE-'0')%10 + '0'; }\r
        *outp = NULLCHAR;\r
+        AlphaRank(out, 5);\r
        return (flags & F_WHITE_ON_MOVE) ? WhiteDrop : BlackDrop;\r
     }\r
 \r
@@ -1086,7 +1251,7 @@ ChessMove CoordsToAlgebraic(board, flags, epfile,
            kind = IllegalMove;\r
        }\r
        /* Pawn move */\r
-       *outp++ = ff + 'a';\r
+        *outp++ = ff + AAA;\r
         if (ff == ft && board[rt][ft] == EmptySquare) { /* [HGM] Xiangqi has straight noncapts! */\r
            /* Non-capture; use style "e5" */\r
             if(rt+ONE <= '9')\r
@@ -1096,7 +1261,7 @@ ChessMove CoordsToAlgebraic(board, flags, epfile,
            /* Capture; use style "exd5" */\r
             if(gameInfo.variant != VariantXiangqi || board[rt][ft] != EmptySquare )\r
             *outp++ = 'x';  /* [HGM] Xiangqi has sideway noncaptures across river! */\r
-           *outp++ = ft + 'a';\r
+            *outp++ = ft + AAA;\r
             if(rt+ONE <= '9')\r
                *outp++ = rt + ONE;\r
             else { *outp++ = (rt+ONE-'0')/10 + '0';*outp++ = (rt+ONE-'0')%10 + '0'; }\r
@@ -1107,7 +1272,8 @@ ChessMove CoordsToAlgebraic(board, flags, epfile,
            *outp++ = ToUpper(promoChar);\r
        }\r
        *outp = NULLCHAR;\r
-       return kind;\r
+        AlphaRank(out, 10);\r
+        return kind;\r
 \r
        \r
       case WhiteKing:\r
@@ -1125,9 +1291,9 @@ ChessMove CoordsToAlgebraic(board, flags, epfile,
        /* Use style "O-O" (oh-oh) for PGN compatibility */\r
        else if (rf == rt &&\r
            rf == ((piece == WhiteKing) ? 0 : BOARD_HEIGHT-1) &&\r
-           ((ff == BOARD_WIDTH>>1 && (ft == 2 || ft == BOARD_WIDTH-2)) ||\r
-            (ff == (BOARD_WIDTH-1)>>1 && (ft == 1 || ft == BOARD_WIDTH-3)))) {\r
-           if(ft==1 || ft==BOARD_WIDTH-2)\r
+            ((ff == BOARD_WIDTH>>1 && (ft == BOARD_LEFT+2 || ft == BOARD_RGHT-2)) ||\r
+             (ff == (BOARD_WIDTH-1)>>1 && (ft == BOARD_LEFT+1 || ft == BOARD_RGHT-3)))) {\r
+            if(ft==BOARD_LEFT+1 || ft==BOARD_RGHT-2)\r
                strcpy(out, "O-O");\r
             else\r
                strcpy(out, "O-O-O");\r
@@ -1175,7 +1341,7 @@ ChessMove CoordsToAlgebraic(board, flags, epfile,
        *outp++ = ToUpper(PieceToChar(piece));\r
        \r
        if (cl.file || (cl.either && !cl.rank)) {\r
-           *outp++ = ff + 'a';\r
+            *outp++ = ff + AAA;\r
        }\r
        if (cl.rank) {\r
             if(rf+ONE <= '9')\r
@@ -1186,21 +1352,20 @@ ChessMove CoordsToAlgebraic(board, flags, epfile,
        if(board[rt][ft] != EmptySquare)\r
          *outp++ = 'x';\r
 \r
-       *outp++ = ft + 'a';\r
+        *outp++ = ft + AAA;\r
         if(rt+ONE <= '9')\r
            *outp++ = rt + ONE;\r
         else { *outp++ = (rt+ONE-'0')/10 + '0';*outp++ = (rt+ONE-'0')%10 + '0'; }\r
        *outp = NULLCHAR;\r
-       return cl.kind;\r
+        AlphaRank(out, 10);\r
+        return cl.kind;\r
        \r
 #ifdef FAIRY\r
       /* [HGM] Always long notation for fairies, don't know how they move */\r
-      case WhiteFairyRook:\r
-      case BlackFairyRook:\r
-      case WhiteFairyKnight:\r
-      case BlackFairyKnight:\r
-      case WhiteFairyQueen:\r
-      case BlackFairyQueen:\r
+      case WhiteNightrider:\r
+      case BlackNightrider:\r
+      case WhiteGrasshopper:\r
+      case BlackGrasshopper:\r
 #endif\r
       case EmptySquare:\r
        /* Moving a nonexistent piece */\r
@@ -1219,12 +1384,12 @@ ChessMove CoordsToAlgebraic(board, flags, epfile,
     if (piece != EmptySquare && piece != WhitePawn && piece != BlackPawn) {\r
        *outp++ = ToUpper(PieceToChar(piece));\r
     }\r
-    *outp++ = ff + 'a';\r
+    *outp++ = ff + AAA;\r
     if(rf+ONE <= '9')\r
        *outp++ = rf + ONE;\r
     else { *outp++ = (rf+ONE-'0')/10 + '0';*outp++ = (rf+ONE-'0')%10 + '0'; }\r
     if (board[rt][ft] != EmptySquare) *outp++ = 'x';\r
-    *outp++ = ft + 'a';\r
+    *outp++ = ft + AAA;\r
     if(rt+ONE <= '9')\r
        *outp++ = rt + ONE;\r
     else { *outp++ = (rt+ONE-'0')/10 + '0';*outp++ = (rt+ONE-'0')%10 + '0'; }\r
@@ -1235,6 +1400,7 @@ ChessMove CoordsToAlgebraic(board, flags, epfile,
     }\r
     *outp = NULLCHAR;\r
 \r
+    AlphaRank(out, 0);\r
     return IllegalMove;\r
 }\r
 \r
diff --git a/moves.h b/moves.h
index 764aef7..8324ef6 100644 (file)
--- a/moves.h
+++ b/moves.h
@@ -53,6 +53,7 @@ extern ChessSquare CharToPiece P((int c));
 \r
 extern void CopyBoard P((Board to, Board from));\r
 extern int CompareBoards P((Board board1, Board board2));\r
+extern char pieceToChar[(int)EmptySquare+1];\r
 \r
 typedef void (*MoveCallback) P((Board board, int flags, ChessMove kind,\r
                                int rf, int ff, int rt, int ft,\r
index e35de38..03e0adc 100644 (file)
--- a/parser.l
+++ b/parser.l
-%a 10000\r
-%o 10000\r
-%e 2000\r
-%k 2500\r
-%p 7000\r
-%n 1000\r
-%{\r
-/*\r
- * parser.l -- lex parser of algebraic chess moves for XBoard\r
- * $Id: parser.l,v 2.1 2003/10/27 19:21:00 mann Exp $\r
- *\r
- * Copyright 1991 by Digital Equipment Corporation, Maynard, Massachusetts.\r
- * Enhancements Copyright 1992-95 Free Software Foundation, Inc.\r
- *\r
- * The following terms apply to Digital Equipment Corporation's copyright\r
- * interest in XBoard:\r
- * ------------------------------------------------------------------------\r
- * All Rights Reserved\r
- *\r
- * Permission to use, copy, modify, and distribute this software and its\r
- * documentation for any purpose and without fee is hereby granted,\r
- * provided that the above copyright notice appear in all copies and that\r
- * both that copyright notice and this permission notice appear in\r
- * supporting documentation, and that the name of Digital not be\r
- * used in advertising or publicity pertaining to distribution of the\r
- * software without specific, written prior permission.\r
- *\r
- * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING\r
- * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL\r
- * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR\r
- * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,\r
- * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,\r
- * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS\r
- * SOFTWARE.\r
- * ------------------------------------------------------------------------\r
- *\r
- * The following terms apply to the enhanced version of XBoard distributed\r
- * by the Free Software Foundation:\r
- * ------------------------------------------------------------------------\r
- * This program is free software; you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation; either version 2 of the License, or\r
- * (at your option) any later version.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program; if not, write to the Free Software\r
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
- * ------------------------------------------------------------------------\r
- */\r
-\r
-/* This parser handles all forms of promotion.\r
- * The parser resolves ambiguous moves by searching and check-testing.\r
- * It also parses comments of the form [anything] or (anything).\r
- */\r
-\r
-#include "config.h"\r
-\r
-#define NO_CONSTRAINT  -1\r
-#undef YYLMAX\r
-#define YYLMAX                 4096\r
-#define UNPUT_BUF_SIZE         YYLMAX\r
-\r
-#ifdef FLEX_SCANNER\r
-/* yytext is probably a char*, but could be a char[].  yy_text is set\r
-   in YY_DECL below, because if yytext is a char*, its value is not\r
-   constant. */\r
-char *yy_text;\r
-#else /*!FLEX_SCANNER*/\r
-/* yytext is definitely a char[], so yy_text can be set here, statically. */\r
-char *yy_text = (char *) yytext;\r
-#endif\r
-\r
-#ifdef FLEX_SCANNER\r
-/* This is flex */\r
-#undef YY_INPUT\r
-#define YY_INPUT(buf, result, max_size) my_yy_input(buf, &result, max_size)\r
-#undef YY_DECL\r
-#define YY_DECL                     \\r
-    int _yylex YY_PROTO((void));    \\r
-    int yylex YY_PROTO((void))      \\r
-    {                               \\r
-       int result = _yylex();      \\r
-       yy_text = (char *) yytext;  \\r
-       return(result);             \\r
-    }                               \\r
-    int _yylex YY_PROTO((void))\r
-#else\r
-/* This is lex */\r
-#undef input\r
-#undef output\r
-#undef unput\r
-#endif\r
-\r
-/* The includes must be here, below the #undef input */\r
-\r
-#include <ctype.h>\r
-\r
-#if STDC_HEADERS\r
-# include <stdlib.h>\r
-# include <string.h>\r
-#else /* not STDC_HEADERS */\r
-# if HAVE_STRING_H\r
-#  include <string.h>\r
-# else /* not HAVE_STRING_H */\r
-#  include <strings.h>\r
-# endif /* not HAVE_STRING_H */\r
-#endif /* not STDC_HEADERS */\r
-\r
-#if HAVE_UNISTD_H\r
-# include <unistd.h>\r
-#endif\r
-\r
-#if defined(_amigados)\r
-# include <errno.h>\r
-# if HAVE_FCNTL_H\r
-#  include <fcntl.h>    /*  isatty() prototype  */\r
-# endif /*  HAVE_FCNTL_H        */\r
-#endif  /*  defined(_amigados)  */\r
-\r
-#include "common.h"\r
-#include "backend.h"\r
-#include "frontend.h"\r
-#include "parser.h"\r
-#include "moves.h"\r
-\r
-extern int PosFlags P((int));\r
-\r
-extern Board   boards[MAX_MOVES];\r
-int            yyboardindex;\r
-int             yyskipmoves = FALSE;\r
-char           currentMoveString[YYLMAX];\r
-#ifndef FLEX_SCANNER\r
-char           unputBuffer[UNPUT_BUF_SIZE];\r
-int            unputCount = 0;\r
-#endif\r
-\r
-#ifdef FLEX_SCANNER\r
-void my_yy_input P((char *buf, int *result, int max_size));\r
-#else /*!FLEX_SCANNER*/\r
-static int input P((void));\r
-static void output P((int ch));\r
-static void unput P((int ch));\r
-int yylook P((void));\r
-int yyback P((int *, int));\r
-#endif\r
-#undef yywrap\r
-int yywrap P((void));\r
-extern void CopyBoard P((Board to, Board from));\r
-\r
-%}\r
-%%\r
-\r
-[RrBbNnQqKkPpACDEFGHMWO][/]?[a-l][0-9][xX:-]?[a-l][0-9](=?\(?[RrBbNnQqKkAaCc]\)?)? {\r
-    /*\r
-     * Fully-qualified algebraic move, possibly with promotion\r
-     * [HGM] Bigger-than-8x8 boards must rely on long algebraic formats\r
-     *       where I allowed piece types A & C (also as promotions)\r
-     *       files a-l and ranks 0-9\r
-     */\r
-    int skip1 = 0, skip2 = 0;\r
-    ChessSquare piece;\r
-    ChessMove result;\r
-    \r
-    if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */\r
-\r
-    /* remove the / */\r
-    if (yytext[1] == '/') skip1 = 1;\r
-    \r
-    /* remove the [xX:-] */\r
-    if ((yytext[3+skip1] == 'x') || (yytext[3+skip1] == 'X') ||\r
-       (yytext[3+skip1] == '-') || (yytext[3+skip1] == ':')) skip2 = 1;\r
-    \r
-    currentMoveString[0] = yytext[1+skip1];\r
-    currentMoveString[1] = yytext[2+skip1];\r
-    currentMoveString[2] = yytext[3+skip1+skip2];\r
-    currentMoveString[3] = yytext[4+skip1+skip2];\r
-    currentMoveString[4] = NULLCHAR;\r
-    \r
-    if (yyleng-skip1-skip2 > 5) {\r
-       if (yytext[yyleng-1] == ')') {\r
-           currentMoveString[4] = ToLower(yytext[yyleng-2]);\r
-       } else {\r
-           currentMoveString[4] = ToLower(yytext[yyleng-1]);\r
-       }\r
-       currentMoveString[5] = NULLCHAR;\r
-    }\r
-\r
-    /* [HGM] do not allow values beyond board size */\r
-    if(currentMoveString[1] - ONE >= BOARD_HEIGHT ||\r
-       currentMoveString[0] - 'a' >= BOARD_WIDTH  ||\r
-       currentMoveString[3] - ONE >= BOARD_HEIGHT ||\r
-       currentMoveString[2] - 'a' >= BOARD_WIDTH     )\r
-      return 0;\r
-\r
-    piece = boards[yyboardindex]\r
-      [currentMoveString[1] - ONE][currentMoveString[0] - 'a'];\r
-    if (ToLower(yytext[0]) != ToLower(PieceToChar(piece)))\r
-      return (int) IllegalMove;\r
-\r
-    result = LegalityTest(boards[yyboardindex],\r
-                         PosFlags(yyboardindex), EP_UNKNOWN,\r
-                          initialRights, /* [HGM] assume all castlings allowed */\r
-                          currentMoveString[1] - ONE,\r
-                         currentMoveString[0] - 'a',\r
-                          currentMoveString[3] - ONE,\r
-                         currentMoveString[2] - 'a',\r
-                         currentMoveString[4]);\r
-\r
-    if (currentMoveString[4] == NULLCHAR &&\r
-       (result == WhitePromotionQueen || result == BlackPromotionQueen)) {\r
-       currentMoveString[4] = 'q';\r
-       currentMoveString[5] = NULLCHAR;\r
-    }\r
-\r
-    return (int) result;\r
-}\r
-\r
-[a-l][0-9][xX:-]?[a-l][0-9](=?\(?[RrBbNnQqKkAaCc]\)?)?      {\r
-    /*\r
-     * Simple algebraic move, possibly with promotion\r
-     * [HGM] Bigger-than-8x8 boards must rely on this format\r
-     *       where I allowed piece types A & C (also as promotions)\r
-     *       files a-l and ranks 0-9\r
-     */\r
-    int skip = 0;\r
-    ChessMove result;\r
-\r
-    if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */\r
-\r
-    /* remove the [xX:-] */\r
-    if ((yytext[2] == 'x') || (yytext[2] == 'X') ||\r
-       (yytext[2] == '-') || (yytext[2] == ':')) skip = 1;\r
-\r
-    currentMoveString[0] = yytext[0];\r
-    currentMoveString[1] = yytext[1];\r
-    currentMoveString[2] = yytext[2+skip];\r
-    currentMoveString[3] = yytext[3+skip];\r
-    currentMoveString[4] = NULLCHAR;\r
-\r
-    if (yyleng-skip > 4) {\r
-       if (yytext[yyleng-1] == ')') {\r
-           currentMoveString[4] = ToLower(yytext[yyleng-2]);\r
-       } else {\r
-           currentMoveString[4] = ToLower(yytext[yyleng-1]);\r
-       }\r
-       currentMoveString[5] = NULLCHAR;\r
-    }\r
-\r
-    /* [HGM] do not allow values beyond board size */\r
-    if(currentMoveString[1] - ONE >= BOARD_HEIGHT ||\r
-       currentMoveString[0] - 'a' >= BOARD_WIDTH  ||\r
-       currentMoveString[3] - ONE >= BOARD_HEIGHT ||\r
-       currentMoveString[2] - 'a' >= BOARD_WIDTH     )\r
-      return 0;\r
-\r
-    result = LegalityTest(boards[yyboardindex],\r
-                         PosFlags(yyboardindex), EP_UNKNOWN,\r
-                          initialRights, /* [HGM] assume all castlings allowed */\r
-                          currentMoveString[1] - ONE,\r
-                         currentMoveString[0] - 'a',\r
-                          currentMoveString[3] - ONE,\r
-                         currentMoveString[2] - 'a',\r
-                         currentMoveString[4]);\r
-\r
-    if (currentMoveString[4] == NULLCHAR &&\r
-       (result == WhitePromotionQueen || result == BlackPromotionQueen)) {\r
-       currentMoveString[4] = 'q';\r
-       currentMoveString[5] = NULLCHAR;\r
-    }\r
-\r
-    return (int) result;\r
-}\r
-\r
-[a-l][0-9](=?\(?[RrBbNnQqKkAaCc]\)?)?       {\r
-    /*\r
-     * Pawn move, possibly with promotion\r
-     */\r
-    DisambiguateClosure cl;\r
-    int skip = 0;\r
-\r
-    if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */\r
-\r
-    /* remove the =() */\r
-    if (yytext[2] == '=') skip++;\r
-    if (yytext[2+skip] == '(') skip++;\r
-\r
-    cl.pieceIn = WhiteOnMove(yyboardindex) ? WhitePawn : BlackPawn;\r
-    cl.rfIn = -1;\r
-    cl.ffIn = yytext[0] - 'a';\r
-    cl.rtIn = yytext[1] - ONE;\r
-    cl.ftIn = yytext[0] - 'a';\r
-    cl.promoCharIn = yytext[2+skip];\r
-\r
-    /* [HGM] do not allow values beyond board size */\r
-    if(cl.rtIn >= BOARD_HEIGHT ||\r
-       cl.ffIn >= BOARD_WIDTH  ||\r
-       cl.ftIn >= BOARD_WIDTH     )\r
-      return 0;\r
-\r
-\r
-    Disambiguate(boards[yyboardindex],\r
-                PosFlags(yyboardindex), EP_UNKNOWN, &cl);\r
-\r
-    currentMoveString[0] = cl.ff + 'a';\r
-    currentMoveString[1] = cl.rf + ONE;\r
-    currentMoveString[2] = cl.ft + 'a';\r
-    currentMoveString[3] = cl.rt + ONE;\r
-    currentMoveString[4] = cl.promoChar;\r
-    currentMoveString[5] = NULLCHAR;\r
-\r
-    return (int) cl.kind;\r
-}\r
-\r
-\r
-(ab|bc|cd|de|ef|fg|gh|hi|ij|jk|kl|lk|kj|ji|ih|hg|gf|fe|ed|dc|cb|ba|aa|bb|cc|dd|ee|ff|gg|hh|ii|jj|kk|ll|([a-l][xX:-][a-l]))(=?\(?[RrBbNnQqKkAaCc]\)?)?(ep|"e.p.")? {\r
-    /*\r
-     * Pawn capture, possibly with promotion, possibly ambiguous\r
-     */\r
-    DisambiguateClosure cl;\r
-    int skip1 = 0, skip2 = 0;\r
-\r
-    if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */\r
-\r
-    /* remove trailing ep or e.p. (nonstandard PGN) */\r
-    if (yytext[yyleng-1] == 'p') {\r
-      yyleng -= 2;\r
-      yytext[yyleng] = NULLCHAR;\r
-    } else if (yytext[yyleng-1] == '.') {\r
-      yyleng -= 4;\r
-      yytext[yyleng] = NULLCHAR;\r
-    }\r
-\r
-    /* remove the [xX:-] and =() */\r
-    if ((yytext[1] == 'x') || (yytext[1] == 'X')\r
-       || (yytext[1] == ':') || (yytext[1] == '-')) skip1 = 1;\r
-    if (yytext[2+skip1] == '=') skip2++;\r
-    if (yytext[2+skip1+skip2] == '(') skip2++;\r
-\r
-    cl.pieceIn = WhiteOnMove(yyboardindex) ? WhitePawn : BlackPawn;\r
-    cl.rfIn = -1;\r
-    cl.ffIn = yytext[0] - 'a';\r
-    cl.rtIn = -1;\r
-    cl.ftIn = yytext[1+skip1] - 'a';\r
-    cl.promoCharIn = yytext[2+skip1+skip2];\r
-\r
-    /* [HGM] do not allow values beyond board size */\r
-    if(cl.ffIn >= BOARD_WIDTH  ||\r
-       cl.ftIn >= BOARD_WIDTH     )\r
-      return 0;\r
-\r
-    Disambiguate(boards[yyboardindex],\r
-                PosFlags(yyboardindex), EP_UNKNOWN, &cl);\r
-\r
-    currentMoveString[0] = cl.ff + 'a';\r
-    currentMoveString[1] = cl.rf + ONE;\r
-    currentMoveString[2] = cl.ft + 'a';\r
-    currentMoveString[3] = cl.rt + ONE;\r
-    currentMoveString[4] = cl.promoChar;\r
-    currentMoveString[5] = NULLCHAR;\r
-\r
-    return (int) cl.kind;\r
-}\r
-\r
-[a-l][xX:]?[a-l][0-9](=?\(?[RrBbNnQqKkAaCc]\)?)?(ep|"e.p.")? {\r
-    /*\r
-     * unambiguously abbreviated Pawn capture, possibly with promotion\r
-     */\r
-    int skip = 0;\r
-    ChessMove result;\r
-\r
-    if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */\r
-\r
-    /* remove trailing ep or e.p. (nonstandard PGN) */\r
-    if (yytext[yyleng-1] == 'p') {\r
-      yyleng -= 2;\r
-      yytext[yyleng] = NULLCHAR;\r
-    } else if (yytext[yyleng-1] == '.') {\r
-      yyleng -= 4;\r
-      yytext[yyleng] = NULLCHAR;\r
-    }\r
-\r
-    /* remove the [xX:-] */\r
-    if ((yytext[1] == 'x') || (yytext[1] == 'X')\r
-       || (yytext[1] == ':') || (yytext[1] == '-')) skip = 1;\r
-\r
-    currentMoveString[0] = yytext[0];\r
-    currentMoveString[2] = yytext[1+skip];\r
-    currentMoveString[3] = yytext[2+skip];\r
-\r
-    /* [HGM] do not allow values beyond board size */\r
-    if(currentMoveString[0] - 'a' >= BOARD_WIDTH  ||\r
-       currentMoveString[3] - ONE >= BOARD_HEIGHT ||\r
-       currentMoveString[2] - 'a' >= BOARD_WIDTH     )\r
-      return 0;\r
-\r
-    if (gameInfo.variant == VariantXiangqi && /* [HGM] In Xiangqi rank stays same */\r
-         currentMoveString[0] != currentMoveString[2] ) {\r
-        if (yytext[2+skip] == ONE) return (int) ImpossibleMove;\r
-        currentMoveString[1] = yytext[2+skip];\r
-    } else \r
-    if (WhiteOnMove(yyboardindex)) {\r
-        if (yytext[2+skip] == ONE) return (int) ImpossibleMove;\r
-       currentMoveString[1] = yytext[2+skip] - 1;\r
-    } else {\r
-        currentMoveString[1] = currentMoveString[3] + 1;\r
-        if (currentMoveString[3] == ONE+BOARD_HEIGHT-1) return (int) ImpossibleMove;\r
-    }\r
-    if (yyleng-skip > 3) {\r
-       if (yytext[yyleng-1] == ')')\r
-         currentMoveString[4] = ToLower(yytext[yyleng-2]);\r
-       else\r
-         currentMoveString[4] = ToLower(yytext[yyleng-1]);\r
-       currentMoveString[5] = NULLCHAR;\r
-    } else {\r
-       currentMoveString[4] = NULLCHAR;\r
-    }\r
-\r
-    result = LegalityTest(boards[yyboardindex],\r
-                         PosFlags(yyboardindex), EP_UNKNOWN,\r
-                          initialRights, /* [HGM] assume all castlings allowed */\r
-                          currentMoveString[1] - ONE,\r
-                         currentMoveString[0] - 'a',\r
-                          currentMoveString[3] - ONE,\r
-                         currentMoveString[2] - 'a',\r
-                         currentMoveString[4]);\r
-\r
-    if (currentMoveString[4] == NULLCHAR &&\r
-       (result == WhitePromotionQueen || result == BlackPromotionQueen)) {\r
-       currentMoveString[4] = 'q';\r
-       currentMoveString[5] = NULLCHAR;\r
-    }\r
-\r
-    if (result != IllegalMove) return (int) result;\r
-\r
-    /* Special case: improperly written en passant capture */\r
-    if (WhiteOnMove(yyboardindex)) {\r
-       if (currentMoveString[3] == '5') {\r
-           currentMoveString[1] = '5';\r
-           currentMoveString[3] = '6';\r
-       } else {\r
-           return (int) IllegalMove;\r
-       }\r
-    } else {\r
-       if (currentMoveString[3] == '4') {\r
-           currentMoveString[1] = '4';\r
-           currentMoveString[3] = '3';\r
-       } else {\r
-           return (int) IllegalMove;\r
-       }\r
-    }\r
-\r
-    result = LegalityTest(boards[yyboardindex],\r
-                         PosFlags(yyboardindex), EP_UNKNOWN,\r
-                          initialRights, /* [HGM] assume all castlings allowed */\r
-                          currentMoveString[1] - ONE,\r
-                         currentMoveString[0] - 'a',\r
-                          currentMoveString[3] - ONE,\r
-                         currentMoveString[2] - 'a',\r
-                         currentMoveString[4]);\r
-\r
-    if (result == WhiteCapturesEnPassant || result == BlackCapturesEnPassant)\r
-      return (int) result;\r
-    else\r
-      return (int) IllegalMove;\r
-}\r
-\r
-[RrBbNnQqKkACDEFGHMWO][xX:-]?[a-l][0-9]  {\r
-    /*\r
-     * piece move, possibly ambiguous\r
-     */\r
-    DisambiguateClosure cl;\r
-    int skip = 0;\r
-\r
-    if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */\r
-\r
-    /* remove the [xX:-] */\r
-    if ((yytext[1] == 'x') || (yytext[1] == 'X')\r
-       || (yytext[1] == ':') || (yytext[1] == '-')) skip = 1;\r
-\r
-    if (WhiteOnMove(yyboardindex)) {\r
-       cl.pieceIn = CharToPiece(ToUpper(yytext[0]));\r
-    } else {\r
-       cl.pieceIn = CharToPiece(ToLower(yytext[0]));\r
-    }\r
-    cl.rfIn = -1;\r
-    cl.ffIn = -1;\r
-    cl.rtIn = yytext[2+skip] - ONE;\r
-    cl.ftIn = yytext[1+skip] - 'a';\r
-    cl.promoCharIn = NULLCHAR;\r
-\r
-    /* [HGM] but do not allow values beyond board size */\r
-    if(cl.rtIn >= BOARD_HEIGHT ||\r
-       cl.ftIn >= BOARD_WIDTH     )\r
-      return 0;\r
-\r
-    Disambiguate(boards[yyboardindex],\r
-                PosFlags(yyboardindex), EP_UNKNOWN, &cl);\r
-\r
-    currentMoveString[0] = cl.ff + 'a';\r
-    currentMoveString[1] = cl.rf + ONE;\r
-    currentMoveString[2] = cl.ft + 'a';\r
-    currentMoveString[3] = cl.rt + ONE;\r
-    currentMoveString[4] = cl.promoChar;\r
-    currentMoveString[5] = NULLCHAR;\r
-\r
-    return (int) cl.kind;\r
-}\r
-\r
-[RrBbNnQqKkACDEFGHMWO][a-l0-9][xX:-]?[a-l][0-9]   {\r
-    /*\r
-     * piece move with rank or file disambiguator\r
-     */\r
-    DisambiguateClosure cl;\r
-    int skip = 0;\r
-\r
-    if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */\r
-\r
-    /* remove the [xX:-] */\r
-    if ((yytext[2] == 'x') || (yytext[2] == 'X')\r
-       || (yytext[2] == ':') || (yytext[2] == '-')) skip = 1;\r
-\r
-    if (WhiteOnMove(yyboardindex)) {\r
-       cl.pieceIn = CharToPiece(ToUpper(yytext[0]));\r
-    } else {\r
-       cl.pieceIn = CharToPiece(ToLower(yytext[0]));\r
-    }\r
-    if (isalpha(yytext[1])) {\r
-       cl.rfIn = -1;\r
-       cl.ffIn = yytext[1] - 'a';\r
-    } else {\r
-        cl.rfIn = yytext[1] - ONE;\r
-       cl.ffIn = -1;\r
-    }\r
-    cl.rtIn = yytext[3+skip] - ONE;\r
-    cl.ftIn = yytext[2+skip] - 'a';\r
-    cl.promoCharIn = NULLCHAR;\r
-\r
-    /* [HGM] do not allow values beyond board size */\r
-    if(cl.rtIn >= BOARD_HEIGHT ||\r
-       cl.rfIn >= BOARD_HEIGHT ||\r
-       cl.ffIn >= BOARD_WIDTH  ||\r
-       cl.ftIn >= BOARD_WIDTH     )\r
-      return 0;\r
-\r
-    Disambiguate(boards[yyboardindex],\r
-                PosFlags(yyboardindex), EP_UNKNOWN, &cl);\r
-\r
-    currentMoveString[0] = cl.ff + 'a';\r
-    currentMoveString[1] = cl.rf + ONE;\r
-    currentMoveString[2] = cl.ft + 'a';\r
-    currentMoveString[3] = cl.rt + ONE;\r
-    currentMoveString[4] = cl.promoChar;\r
-    currentMoveString[5] = NULLCHAR;\r
-\r
-    return (int) cl.kind;\r
-}\r
-\r
-000|0-0-0|ooo|OOO|o-o-o|O-O-O  {\r
-    int rf, ff, rt, ft;\r
-\r
-    if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */\r
-\r
-    /* [HGM] all squares referenced to board edges in stead of absolute */\r
-    if (WhiteOnMove(yyboardindex)) {\r
-        if (boards[yyboardindex][0][(BOARD_WIDTH-1)>>1] == WhiteKing) {\r
-           /* ICS wild castling */\r
-           rf = 0;\r
-            ff = (BOARD_WIDTH-1)>>1;\r
-           rt = 0;\r
-            ft = BOARD_WIDTH-3;\r
-            sprintf(currentMoveString, "%c%c%c%c",ff+'a',rf+ONE,ft+'a',rt+ONE);\r
-       } else {\r
-           rf = 0;\r
-            ff = BOARD_WIDTH>>1;\r
-           rt = 0;\r
-           ft = 2;\r
-            sprintf(currentMoveString, "%c%c%c%c",ff+'a',rf+ONE,ft+'a',rt+ONE);\r
-       }\r
-    } else{ \r
-        if (boards[yyboardindex][BOARD_HEIGHT-1][3] == BlackKing) {\r
-           /* ICS wild castling */\r
-            rf = BOARD_HEIGHT-1;\r
-            ff = (BOARD_WIDTH-1)>>1;\r
-            rt = BOARD_HEIGHT-1;\r
-            ft = BOARD_WIDTH-3;\r
-            sprintf(currentMoveString, "%c%c%c%c",ff+'a',rf+ONE,ft+'a',rt+ONE);\r
-       } else {\r
-            rf = BOARD_HEIGHT-1;\r
-            ff = BOARD_WIDTH>>1;\r
-            rt = BOARD_HEIGHT-1;\r
-           ft = 2;\r
-            sprintf(currentMoveString, "%c%c%c%c",ff+'a',rf+ONE,ft+'a',rt+ONE);\r
-       }\r
-    }\r
-    return (int) LegalityTest(boards[yyboardindex],\r
-                             PosFlags(yyboardindex), EP_UNKNOWN,\r
-                              initialRights, /* [HGM] assume all castlings allowed */\r
-                             rf, ff, rt, ft, NULLCHAR);\r
-}\r
-\r
-00|0-0|oo|OO|o-o|O-O   {\r
-    int rf, ff, rt, ft;\r
-\r
-    if (yyskipmoves) return (int) AmbiguousMove; /* not disambiguated */\r
-\r
-    if (WhiteOnMove(yyboardindex)) {\r
-        if (boards[yyboardindex][0][(BOARD_WIDTH-1)>>1] == WhiteKing) {\r
-           /* ICS wild castling */\r
-           rf = 0;\r
-            ff = (BOARD_WIDTH-1)>>1;\r
-           rt = 0;\r
-           ft = 1;\r
-            sprintf(currentMoveString, "%c%c%c%c",ff+'a',rf+ONE,ft+'a',rt+ONE);\r
-       } else {\r
-           rf = 0;\r
-            ff = BOARD_WIDTH>>1;\r
-           rt = 0;\r
-            ft = BOARD_WIDTH-2;\r
-            sprintf(currentMoveString, "%c%c%c%c",ff+'a',rf+ONE,ft+'a',rt+ONE);\r
-       }\r
-    } else {\r
-        if (boards[yyboardindex][BOARD_HEIGHT-1][(BOARD_WIDTH-1)>>1] == BlackKing) {\r
-           /* ICS wild castling */\r
-            rf = BOARD_HEIGHT-1;\r
-            ff = (BOARD_WIDTH-1)>>1;\r
-            rt = BOARD_HEIGHT-1;\r
-           ft = 1;\r
-            sprintf(currentMoveString, "%c%c%c%c",ff+'a',rf+ONE,ft+'a',rt+ONE);\r
-       } else {\r
-            rf = BOARD_HEIGHT-1;\r
-            ff = BOARD_WIDTH>>1;\r
-            rt = BOARD_HEIGHT-1;\r
-            ft = BOARD_WIDTH-2;\r
-            sprintf(currentMoveString, "%c%c%c%c",ff+'a',rf+ONE,ft+'a',rt+ONE);\r
-       }\r
-    }\r
-    return (int) LegalityTest(boards[yyboardindex],\r
-                             PosFlags(yyboardindex), EP_UNKNOWN,\r
-                              initialRights, /* [HGM] assume all castlings allowed */\r
-                             rf, ff, rt, ft, NULLCHAR);\r
-}\r
-\r
-[PpNnBbRrQqAaCc]@[a-l][0-9] {\r
-    /* Bughouse piece drop.  No legality checking for now. */\r
-    currentMoveString[1] = '@';\r
-    currentMoveString[2] = yytext[2];\r
-    currentMoveString[3] = yytext[3];\r
-    currentMoveString[4] = NULLCHAR;\r
-\r
-    /* [HGM] do not allow values beyond board size */\r
-    if(currentMoveString[1] - ONE >= BOARD_HEIGHT ||\r
-       currentMoveString[0] - 'a' >= BOARD_WIDTH  ||\r
-       currentMoveString[3] - ONE >= BOARD_HEIGHT ||\r
-       currentMoveString[2] - 'a' >= BOARD_WIDTH     )\r
-      return 0;\r
-\r
-    if (WhiteOnMove(yyboardindex)) {\r
-       currentMoveString[0] = ToUpper(yytext[0]);\r
-       return (int) WhiteDrop;\r
-    } else {\r
-       currentMoveString[0] = ToLower(yytext[0]);\r
-       return (int) BlackDrop;\r
-    }\r
-}\r
-\r
-[Rr]esign(s|ed)?  {\r
-    if (WhiteOnMove(yyboardindex))\r
-      return (int) BlackWins;\r
-    else\r
-      return (int) WhiteWins;\r
-}\r
-\r
-(([Ww](hite)?)|([Bb](lack)?))" "(([Rr]esign)|([Ff]orfeit))(s|ed)?  {\r
-    return (int) (ToUpper(yytext[0]) == 'W' ? BlackWins : WhiteWins);\r
-}\r
-\r
-(([Ww](hite)?)|([Bb](lack)?))" "[Dd]isconnect(s|ed)  {\r
-    return (int) GameUnfinished;\r
-}\r
-\r
-[Ss]talemate  {\r
-    return (int) GameIsDrawn;\r
-}\r
-\r
-"+-+"  {\r
-    return (int) GameIsDrawn;\r
-}\r
-\r
-([Cc]heck)?[Mm]ate {\r
-    if (WhiteOnMove(yyboardindex))\r
-      return (int) BlackWins;\r
-    else\r
-      return (int) WhiteWins;\r
-}\r
-\r
-"++"  {\r
-    if (WhiteOnMove(yyboardindex))\r
-      return (int) BlackWins;\r
-    else\r
-      return (int) WhiteWins;\r
-}\r
-\r
-[Dd]raw(n)?(" "by)?(" "[Rr]epetition)|(" "[Aa]gree(d|ment))  {\r
-    return (int) GameIsDrawn;\r
-}\r
-\r
-[Dd]raw(n)?(" (".*")")?  {\r
-    return (int) GameIsDrawn;\r
-}\r
-\r
-(([Ww](hite)?)|([Bb](lack)?))" "([Mm]ate(s|ed)?)|([Ww][io]n(s)?.*)  {\r
-    return (int) (ToUpper(yytext[0]) == 'W' ? WhiteWins : BlackWins);\r
-}\r
-\r
-(([Ww](hite)?)|([Bb](lack)?))" "([Mm]ate(s|ed)?)|([Ll]os[tes]+.*)  {\r
-    return (int) (ToUpper(yytext[0]) == 'W' ? BlackWins : WhiteWins);\r
-}\r
-\r
-("{"[^\}\n]*"} ")?(1-0|"1 - 0"|"1/0"|"1 / 0"|"1:0"|"1 : 0")(" (".*")"|" {".*"}")? { \r
-    return (int) WhiteWins;\r
-}\r
-\r
-("{"[^\}\n]*"} ")?(0-1|"0 - 1"|"0/1"|"0 / 1"|"0:1"|"0 : 1")(" (".*")"|" {".*"}")? { \r
-    return (int) BlackWins;\r
-}\r
-\r
-("{"[^\}\n]*"} ")?("1/2"|"1 / 2")(" "?[-:]" "?("1/2"|"1 / 2"))?(" (".*")"|" {".*"}")? {\r
-    return (int) GameIsDrawn;\r
-}\r
-\r
-("{"[^\}\n]*"} ")?"*"(" (".*")"|" {".*"}")? {\r
-    return (int) GameUnfinished;\r
-}\r
-\r
-[1-9][0-9]*/"."?[ \t\n]*[a-lNnPpRrBQqKACFEWDGHOo]    {\r
-    /* move numbers */\r
-    if ((yyleng == 1) && (yytext[0] == '1'))\r
-      return (int) MoveNumberOne;\r
-}\r
-\r
-\([0-9]+:[0-9][0-9](\.[0-9]+)?\)|\{[0-9]+:[0-9][0-9](\.[0-9]+)?\} {\r
-    /* elapsed time indication, e.g. (0:12) or {10:21.071} */ \r
-    return (int) ElapsedTime;\r
-}\r
-\r
-"[--"[^\]]*"--]" {\r
-    /* position diagram enclosed in [-- --] */\r
-    return (int) PositionDiagram;\r
-}\r
-\r
-^"{--------------"\n[^\}]*\n"--------------}"$ {\r
-    /* position diagram enclosed in {-- --} */\r
-    return (int) PositionDiagram;\r
-}\r
-\r
-\[[ \t\n]*[A-Za-z0-9][A-Za-z0-9_+#=-]*[ \t\n]*\"[^"]*\"[ \t\n]*\] {\r
-    return (int) PGNTag;\r
-}    \r
-\r
-[Gg](nu|NU)" "?[Cc](hess|HESS).*[Gg](ame|AME) {\r
-    return (int) GNUChessGame;\r
-}\r
-\r
-^[#;%]" "[^ ]*(" game file"|" position file").*$ {\r
-    return (int) XBoardGame;\r
-}\r
-\r
-\$[0-9]+       {                               /* numeric annotation glyph */\r
-    return (int) NAG;\r
-}\r
-\r
-\{[^\}]*\}     {                               /* anything in {} */\r
-    return (int) Comment; \r
-}\r
-\r
-;.*$ {                                          /* ; to end of line */\r
-    return (int) Comment;\r
-}\r
-\r
-\[[^\]]*\]     {                               /* anything in [] */\r
-    return (int) Comment; \r
-}\r
-\r
-\([^()]*(\([^()]*\)[^()]*)+[^()]*\)  {                 /* nested () */\r
-    return (int) Comment; \r
-}\r
-\r
-\([^)][^)]+\)   {                              /* >=2 chars in () */\r
-    return (int) Comment; \r
-}       \r
-\r
-^[-a-zA-Z0-9]+:" ".*(\n[ \t]+.*)*  {\r
-        /* Skip mail headers */\r
-}\r
-\r
-[a-zA-Z0-9'-]+                 {\r
-        /* Skip random words */\r
-}\r
-\r
-.|\n                           {\r
-        /* Skip everything else */\r
-}\r
-\r
-%%\r
-\r
-\r
-static char *StringToLex;\r
-\r
-#ifndef FLEX_SCANNER\r
-static FILE *lexFP;\r
-\r
-static int input()\r
-{\r
-    int ret;\r
-    \r
-    if (StringToLex != NULL) {\r
-       ret = *StringToLex;\r
-       if (ret == NULLCHAR)\r
-         ret = EOF;\r
-       else\r
-         StringToLex++;\r
-    } else if (unputCount > 0) {\r
-       ret = unputBuffer[--unputCount];\r
-    } else {\r
-       ret = fgetc(lexFP);\r
-    }    \r
-\r
-    if (ret == EOF) \r
-      return 0;\r
-    else\r
-      return ret;\r
-}\r
-\r
-/*\r
- * Return offset of next pattern within current file\r
- */\r
-int yyoffset()\r
-{\r
-    int offset = ftell(lexFP) - unputCount;\r
-\r
-    if (offset < 0) {\r
-       offset = 0;\r
-    }\r
-    return(offset);\r
-}\r
\r
-static void output(ch)\r
-     int ch;\r
-{\r
-    fprintf(stderr, "PARSER BUG: unmatched character '%c' (0%o)\n",\r
-           ch, ch);\r
-}\r
-\r
-static void unput(ch)\r
-     int ch;\r
-{\r
-    if (ch == 0) return;\r
-    if (StringToLex != NULL) {\r
-       StringToLex--;\r
-    } else {\r
-       if (unputCount >= UNPUT_BUF_SIZE)\r
-         fprintf(stderr, "PARSER BUG: unput buffer overflow '%c' (0%o)\n",\r
-                 ch, ch);\r
-       unputBuffer[unputCount++] = ch;\r
-    }\r
-}\r
-\r
-/* Get ready to lex from a new file.  Kludge below sticks\r
-   an artificial newline at the front of the file, which the\r
-   above grammar ignores, but which makes ^ at start of pattern\r
-   match at the real start of the file.\r
-*/\r
-void yynewfile(f)\r
-     FILE *f;\r
-{\r
-    lexFP = f;\r
-    StringToLex = NULL;\r
-    unputCount = 0;\r
-    unput('\n'); /* kludge */\r
-}\r
-\r
-/* Get ready to lex from a string.  ^ at start of pattern WON'T\r
-   match at the start of the string!\r
-*/\r
-void yynewstr(s)\r
-     char *s;\r
-{\r
-    lexFP = NULL;\r
-    StringToLex = s;\r
-    unputCount = 0;\r
-}\r
-#endif /*!FLEX_SCANNER*/\r
-\r
-#ifdef FLEX_SCANNER\r
-void my_yy_input(buf, result, max_size)\r
-     char *buf;\r
-     int *result;\r
-     int max_size;\r
-{\r
-    int count;\r
-\r
-    if (StringToLex != NULL) {\r
-       count = 0;\r
-       while (*StringToLex != NULLCHAR) {\r
-           *buf++ = *StringToLex++;\r
-           count++;\r
-       }\r
-       *result = count;\r
-       return;\r
-    } else {\r
-       count = fread(buf, 1, max_size, yyin);\r
-       if (count == 0) {\r
-           *result = YY_NULL;\r
-       } else {\r
-           *result = count;\r
-       }\r
-       return;\r
-    }    \r
-}\r
-\r
-static YY_BUFFER_STATE my_file_buffer = NULL;\r
-\r
-/*\r
-    Return offset of next pattern in the current file.\r
-*/\r
-int yyoffset()\r
-{\r
-    int pos = yy_c_buf_p - yy_current_buffer->yy_ch_buf;\r
-\r
-    return(ftell(yy_current_buffer->yy_input_file) -\r
-         yy_n_chars + pos);\r
-}\r
-\r
-\r
-void yynewstr(s)\r
-     char *s;\r
-{\r
-    if (my_file_buffer != NULL)\r
-      yy_delete_buffer(my_file_buffer);\r
-    StringToLex = s;\r
-    my_file_buffer = yy_create_buffer(stdin, YY_BUF_SIZE);\r
-    yy_switch_to_buffer(my_file_buffer);\r
-}\r
-\r
-void yynewfile(f)\r
-     FILE *f;\r
-{\r
-    if (my_file_buffer != NULL)\r
-      yy_delete_buffer(my_file_buffer);\r
-    StringToLex = NULL;\r
-    my_file_buffer = yy_create_buffer(f, YY_BUF_SIZE);\r
-    yy_switch_to_buffer(my_file_buffer);\r
-}\r
-#endif /*FLEX_SCANNER*/\r
-\r
-int yywrap()\r
-{\r
-    return TRUE;\r
-}\r
-\r
-/* Parse a move from the given string s */\r
-/* ^ at start of pattern WON'T work here unless using flex */\r
-ChessMove yylexstr(boardIndex, s)\r
-     int boardIndex;\r
-     char *s;\r
-{\r
-    ChessMove ret;\r
-    char *oldStringToLex;\r
-#ifdef FLEX_SCANNER\r
-    YY_BUFFER_STATE buffer, oldBuffer;\r
-#endif\r
-    \r
-    yyboardindex = boardIndex;\r
-    oldStringToLex = StringToLex;\r
-    StringToLex = s;\r
-#ifdef FLEX_SCANNER\r
-    buffer = yy_create_buffer(stdin, YY_BUF_SIZE);\r
-    oldBuffer = YY_CURRENT_BUFFER;\r
-    yy_switch_to_buffer(buffer);\r
-#endif /*FLEX_SCANNER*/\r
-\r
-    ret = (ChessMove) yylex();\r
-\r
-#ifdef FLEX_SCANNER\r
-    if (oldBuffer != NULL) \r
-      yy_switch_to_buffer(oldBuffer);\r
-    yy_delete_buffer(buffer);\r
-#endif /*FLEX_SCANNER*/\r
-    StringToLex = oldStringToLex;\r
-\r
-    return ret;\r
-}\r
+/* A lexical scanner generated by flex */
+
+/* Scanner skeleton version:
+ * $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.91 96/09/10 16:58:48 vern Exp $
+ */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+
+#include <stdio.h>
+#include <errno.h>
+
+/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
+#ifdef c_plusplus
+#ifndef __cplusplus
+#define __cplusplus
+#endif
+#endif
+
+
+#ifdef __cplusplus
+
+#include <stdlib.h>
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+
+/* Use prototypes in function declarations. */
+#define YY_USE_PROTOS
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else  /* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_PROTOS
+#define YY_USE_CONST
+
+#endif /* __STDC__ */
+#endif /* ! __cplusplus */
+
+#ifdef __TURBOC__
+ #pragma warn -rch
+ #pragma warn -use
+#include <io.h>
+#include <stdlib.h>
+#define YY_USE_CONST
+#define YY_USE_PROTOS
+#endif
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+
+#ifdef YY_USE_PROTOS
+#define YY_PROTO(proto) proto
+#else
+#define YY_PROTO(proto) ()
+#endif
+
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#define YY_BUF_SIZE 16384
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+
+extern int yyleng;
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+/* The funky do-while in the following #define is used to turn the definition
+ * int a single C statement (which needs a semi-colon terminator).  This
+ * avoids problems with code like:
+ *
+ *     if ( condition_holds )
+ *             yyless( 5 );
+ *     else
+ *             do_something_else();
+ *
+ * Prior to using the do-while the compiler would get upset at the
+ * "else" because it interpreted the "if" statement as being all
+ * done when it reached the ';' after the yyless() call.
+ */
+
+/* Return all but the first 'n' matched characters back to the input stream. */
+
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+               *yy_cp = yy_hold_char; \
+               YY_RESTORE_YY_MORE_OFFSET \
+               yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+               YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+               } \
+       while ( 0 )
+
+#define unput(c) yyunput( c, yytext_ptr )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+typedef unsigned int yy_size_t;
+
+
+struct yy_buffer_state
+       {
+       FILE *yy_input_file;
+
+       char *yy_ch_buf;                /* input buffer */
+       char *yy_buf_pos;               /* current position in input buffer */
+
+       /* Size of input buffer in bytes, not including room for EOB
+        * characters.
+        */
+       yy_size_t yy_buf_size;
+
+       /* Number of characters read into yy_ch_buf, not including EOB
+        * characters.
+        */
+       int yy_n_chars;
+
+       /* Whether we "own" the buffer - i.e., we know we created it,
+        * and can realloc() it to grow it, and should free() it to
+        * delete it.
+        */
+       int yy_is_our_buffer;
+
+       /* Whether this is an "interactive" input source; if so, and
+        * if we're using stdio for input, then we want to use getc()
+        * instead of fread(), to make sure we stop fetching input after
+        * each newline.
+        */
+       int yy_is_interactive;
+
+       /* Whether we're considered to be at the beginning of a line.
+        * If so, '^' rules will be active on the next match, otherwise
+        * not.
+        */
+       int yy_at_bol;
+
+       /* Whether to try to fill the input buffer when we reach the
+        * end of it.
+        */
+       int yy_fill_buffer;
+
+       int yy_buffer_status;
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+       /* When an EOF's been seen but there's still some text to process
+        * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+        * shouldn't try reading from the input source any more.  We might
+        * still have a bunch of tokens to match, though, because of
+        * possible backing-up.
+        *
+        * When we actually see the EOF, we change the status to "new"
+        * (via yyrestart()), so that the user can continue scanning by
+        * just pointing yyin at a new input file.
+        */
+#define YY_BUFFER_EOF_PENDING 2
+       };
+
+static YY_BUFFER_STATE yy_current_buffer = 0;
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ */
+#define YY_CURRENT_BUFFER yy_current_buffer
+
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+
+static int yy_n_chars;         /* number of characters read into yy_ch_buf */
+
+
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1;                /* whether we need to initialize */
+static int yy_start = 0;       /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart YY_PROTO(( FILE *input_file ));
+
+void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
+void yy_load_buffer_state YY_PROTO(( void ));
+YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
+void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
+void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
+
+YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
+YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
+YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
+
+static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
+static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
+static void yy_flex_free YY_PROTO(( void * ));
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_is_interactive = is_interactive; \
+       }
+
+#define yy_set_bol(at_bol) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_at_bol = at_bol; \
+       }
+
+#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+
+
+#define YY_USES_REJECT
+typedef unsigned char YY_CHAR;
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+typedef int yy_state_type;
+extern char *yytext;
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state YY_PROTO(( void ));
+static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
+static int yy_get_next_buffer YY_PROTO(( void ));
+static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+       yytext_ptr = yy_bp; \
+       yyleng = (int) (yy_cp - yy_bp); \
+       yy_hold_char = *yy_cp; \
+       *yy_cp = '\0'; \
+       yy_c_buf_p = yy_cp;
+
+#define YY_NUM_RULES 42
+#define YY_END_OF_BUFFER 43
+static yyconst short int yy_acclist[709] =
+    {   0,
+       43,   41,   42,   41,   42,   41,   42,   40,   41,   42,
+       41,   42,   25,   41,   42,   41,   42,   40,   41,   42,
+       40,   41,   42,16410,   40,   41,   42,16410,   41,   42,
+       40,   41,   42,   40,   41,   42,   40,   41,   42,   40,
+       41,   42,   40,   41,   42,   40,   41,   42,   40,   41,
+       42,   40,   41,   42,   40,   41,   42,   40,   41,   42,
+       40,   41,   42,   40,   41,   42,   40,   41,   42,   41,
+       42,   40,   41,   42,   40,   41,   42,   40,   41,   42,
+       40,   41,   42,   40,   41,   42,   40,   41,   42,   40,
+       41,   42,   40,   41,   42,   40,   41,   42,   40,   41,
+
+       42,   40,   41,   42,   40,   41,   42,   40,   41,   42,
+       40,   41,   42,   40,   41,   42,   41,   42,   41,   42,
+       40,   41,   42,   40,   41,   42,   40,   41,   42,16410,
+       40,   41,   42,16410,   41,   42,   40,   41,   42,   40,
+       41,   42,   40,   41,   42,   40,   41,   42,   40,   41,
+       42,   40,   41,   42,   40,   41,   42,   40,   41,   42,
+       40,   41,   42,   40,   41,   42,   40,   41,   42,   40,
+       41,   42,   40,   41,   42,   40,   41,   42,   40,   41,
+       42,   40,   41,   42,   40,   41,   42,   40,   41,   42,
+       40,   41,   42,   40,   41,   42,   40,   41,   42,   40,
+
+       41,   42,   40,   41,   42,   40,   41,   42,   40,   41,
+       42,   40,   41,   42,   40,   41,   42,   40,   41,   42,
+       41,   42,   33,   40,   17,   40,    9,   40,   40,   40,
+    16410, 8218,   40,   35,   40,   40,   40,   40,   40,   40,
+       40,   40,   40,   40,   40,    9,   40,   40,   40,   40,
+       40,   40,   40,   36,   40,    3,   40,   40,    4,   40,
+       40,   40,    3,   40,   40,    4,   40,   40,   40,   40,
+       40,   40,    9,   40,   40,   34,   40,   40,    9,   40,
+       40,   40,16410, 8218,   40,   40,   40,   40,   40,   40,
+       40,   40,   40,   40,   40,   40,    9,   40,   40,   40,
+
+       40,   40,   40,   40,   40,    3,   40,   40,    4,   40,
+       40,   40,    3,   40,   40,    4,   40,   40,   40,   40,
+       40,   40,    9,   40,   40,   15,    9,   40,   23,   40,
+       23,    8,   40, 8218,   22,   40,   22,   24,   40,   40,
+       40,    6,   40,   40,   40,   40,   40,   40,   40,    9,
+       40,   40,   40,   40,   40,   20,   40,    4,   40,   40,
+        3,   40,    3,   40,   40,    4,    5,   40,    4,   40,
+       40,    4,   40,   40,    3,   40,   40,    4,    4,   40,
+        5,    6,   40,    4,   40,   40,   40,    9,   40,   40,
+       34,   39,    9,   40,   23,   40,    8,   40,   22,   40,
+
+       35,   40,   40,   40,    6,   40,   40,   40,   40,   40,
+       40,   40,    9,   40,   40,   40,   40,   40,   20,   40,
+        4,   40,   40,    3,   40,    3,   40,   40,    5,   40,
+        4,   40,   40,    4,   40,   40,    3,   40,   40,    4,
+       40,    5,    6,   40,    4,   40,   40,   40,    9,   40,
+       40,   38,   38,   37,   25,   25,   40,    6,   40,    7,
+       40,    6,   10,   40,   40,   40,   40,   19,   40,   40,
+       21,   40,   16,   40,   40,   40,   40,   40,   20,   20,
+       40,   20,   40,   36,    3,    3,    2,   40,    5,    4,
+        5,   40,   40,    4,    4,   40,    2,    7,   40,    5,
+
+        6,    5,    6,   40,    5,   40,   40,   40,   25,   39,
+       40,    6,   40,    7,   40,   40,   40,   40,   40,   19,
+       40,   40,   21,   40,   16,   40,   40,   40,   40,   40,
+       20,   40,   20,   20,   40,    2,   40,    5,   40,   40,
+        4,   40,    2,    7,   40,    5,    6,   40,    5,   40,
+       40,   40,    7,    1,   40,   40,   40,   19,   40,   40,
+       40,   21,   21,   40,   21,   40,   40,   40,   40,   30,
+       36,    2,    2,   40,    5,    4,    5,    5,   40,    2,
+        7,   39,    1,   40,   40,   40,   19,   40,   40,   40,
+       21,   40,   21,   21,   40,   40,   40,   40,   20,   39,
+
+        2,   40,    5,   40,   27,   38,   23,   23,   22,   22,
+       24,   24,    1,    1,   40,   20,   21,   40,   40,   40,
+       11,   40,   40,   28,   36,   30,    2,    2,    5,   27,
+       34,   39,   39,    1,   40,   40,   40,   40,   21,   39,
+       11,   40,   40,   20,   39,   18,   24,    1,    1,   20,
+       21,   19,   40,   40,   40,   11,   40,   40,   40,   40,
+       21,   39,   40,   11,   40,   40,   12,   40,   40,   40,
+       40,   12,   40,   40,   14,   40,   40,   40,   14,   40,
+       40,   40,   39,   40,   40,   40,   40,   39,   39,   40,
+       40,   31,   40,   39,   39,   31,   40,   13,   31,   32,
+
+       32,   35,   39,   39,   31,   39,   34,   29
+    } ;
+
+static yyconst short int yy_accept[736] =
+    {   0,
+        1,    1,    1,    2,    4,    6,    8,   11,   13,   16,
+       18,   21,   25,   29,   31,   34,   37,   40,   43,   46,
+       49,   52,   55,   58,   61,   64,   67,   70,   72,   75,
+       78,   81,   84,   87,   90,   93,   96,   99,  102,  105,
+      108,  111,  114,  117,  119,  121,  124,  127,  131,  135,
+      137,  140,  143,  146,  149,  152,  155,  158,  161,  164,
+      167,  170,  173,  176,  179,  182,  185,  188,  191,  194,
+      197,  200,  203,  206,  209,  212,  215,  218,  221,  223,
+      223,  224,  225,  225,  225,  225,  225,  226,  226,  226,
+      227,  227,  229,  229,  229,  229,  230,  230,  230,  232,
+
+      232,  234,  234,  235,  236,  236,  237,  237,  237,  238,
+      238,  239,  240,  241,  242,  243,  244,  245,  246,  248,
+      249,  250,  251,  252,  253,  254,  254,  254,  254,  254,
+      255,  256,  258,  258,  259,  261,  262,  263,  265,  265,
+      266,  268,  269,  270,  271,  272,  273,  275,  276,  276,
+      276,  276,  277,  277,  278,  278,  279,  281,  281,  282,
+      284,  284,  286,  286,  287,  288,  288,  289,  290,  291,
+      292,  293,  294,  295,  296,  297,  299,  300,  301,  302,
+      303,  304,  305,  306,  308,  308,  309,  311,  312,  313,
+      315,  315,  316,  318,  319,  320,  321,  322,  323,  325,
+
+      326,  326,  326,  326,  326,  326,  326,  326,  326,  326,
+      326,  326,  327,  327,  327,  327,  329,  331,  332,  334,
+      335,  335,  335,  335,  337,  338,  339,  340,  340,  341,
+      341,  342,  342,  342,  344,  344,  344,  344,  344,  345,
+      346,  347,  348,  349,  350,  352,  353,  354,  355,  356,
+      358,  358,  358,  358,  358,  360,  360,  361,  361,  361,
+      363,  365,  366,  367,  367,  369,  369,  371,  372,  374,
+      375,  375,  377,  378,  379,  381,  384,  386,  387,  388,
+      390,  391,  392,  392,  392,  392,  392,  393,  395,  397,
+      399,  401,  401,  402,  402,  403,  404,  404,  405,  407,
+
+      408,  409,  410,  411,  412,  413,  415,  416,  417,  418,
+      419,  421,  423,  424,  424,  426,  428,  429,  431,  433,
+      434,  436,  437,  437,  439,  440,  442,  445,  447,  448,
+      449,  451,  452,  452,  452,  453,  454,  454,  454,  455,
+      455,  455,  456,  456,  457,  457,  457,  457,  458,  458,
+      458,  458,  458,  458,  458,  458,  460,  460,  460,  462,
+      463,  464,  465,  465,  466,  466,  466,  466,  466,  467,
+      468,  470,  470,  471,  473,  475,  476,  477,  478,  479,
+      480,  482,  484,  484,  484,  484,  484,  485,  486,  486,
+      487,  489,  490,  491,  491,  491,  491,  493,  494,  495,
+
+      495,  497,  497,  500,  502,  505,  507,  508,  509,  509,
+      510,  510,  510,  510,  510,  511,  511,  512,  512,  512,
+      514,  516,  517,  517,  518,  519,  520,  522,  523,  525,
+      527,  528,  529,  530,  531,  533,  534,  536,  538,  540,
+      541,  543,  546,  549,  551,  552,  553,  553,  553,  553,
+      553,  553,  553,  553,  553,  553,  553,  553,  553,  553,
+      554,  556,  556,  556,  556,  556,  557,  558,  558,  560,
+      560,  561,  562,  563,  565,  567,  568,  569,  570,  570,
+      570,  572,  572,  572,  573,  573,  573,  575,  576,  576,
+      577,  578,  578,  580,  580,  582,  582,  582,  582,  582,
+
+      582,  582,  583,  583,  583,  585,  586,  587,  589,  590,
+      591,  593,  594,  596,  597,  598,  599,  601,  603,  605,
+      605,  605,  607,  607,  607,  608,  608,  609,  609,  610,
+      610,  611,  611,  612,  612,  613,  613,  613,  614,  614,
+      614,  616,  616,  616,  618,  618,  619,  619,  619,  619,
+      619,  619,  620,  621,  623,  624,  626,  626,  627,  628,
+      629,  630,  630,  630,  632,  632,  632,  633,  634,  634,
+      634,  636,  637,  638,  639,  641,  643,  644,  646,  646,
+      647,  647,  647,  647,  648,  649,  650,  650,  650,  650,
+      652,  652,  652,  653,  653,  653,  653,  653,  654,  655,
+
+      656,  658,  659,  659,  659,  659,  659,  659,  660,  661,
+      663,  664,  666,  667,  667,  667,  667,  667,  667,  667,
+      668,  668,  668,  668,  668,  669,  670,  670,  670,  670,
+      670,  671,  672,  672,  672,  672,  672,  673,  673,  673,
+      673,  674,  675,  677,  677,  677,  677,  677,  678,  678,
+      679,  681,  681,  681,  681,  681,  682,  683,  683,  683,
+      683,  683,  684,  685,  686,  686,  686,  686,  686,  686,
+      687,  688,  688,  688,  688,  688,  689,  690,  691,  692,
+      692,  692,  692,  692,  692,  694,  694,  694,  694,  694,
+      695,  696,  698,  698,  698,  699,  699,  700,  700,  701,
+
+      701,  701,  703,  703,  704,  705,  705,  705,  705,  705,
+      707,  707,  707,  707,  707,  707,  707,  707,  707,  707,
+      707,  707,  707,  707,  707,  707,  707,  707,  707,  707,
+      707,  707,  708,  709,  709
+    } ;
+
+static yyconst int yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    4,    1,    5,    6,    7,    8,    1,    9,   10,
+       11,   12,   13,    1,   14,   15,   16,   17,   18,   19,
+       20,   20,   20,   20,   20,   20,   20,   21,   22,    1,
+       23,    1,    1,   24,   25,   26,   27,   28,   29,   30,
+       31,   32,   33,   33,   34,   35,   36,   37,   38,   39,
+       40,   41,   42,   33,   43,   33,   44,   45,   33,   33,
+       46,    1,   47,    1,   48,    1,   49,   50,   51,   52,
+
+       53,   54,   55,   56,   57,   58,   59,   60,   61,   62,
+       63,   64,   40,   65,   66,   67,   68,   33,   69,   45,
+       70,   33,   71,    1,   72,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+static yyconst int yy_meta[73] =
+    {   0,
+        1,    2,    3,    2,    1,    1,    1,    1,    4,    5,
+        6,    1,    1,    7,    1,    1,    8,    8,    8,    8,
+        9,    1,   10,    1,   11,   11,   11,   12,   12,   12,
+       12,   12,    4,   11,    4,    4,   11,   12,   12,   11,
+       11,    4,    4,   12,    7,    1,    1,    1,   13,   13,
+       13,   14,   15,   14,   14,   14,   14,   14,   13,   14,
+        4,   11,   12,   12,   11,    4,    4,    4,    4,    4,
+        1,    1
+    } ;
+
+static yyconst short int yy_base[824] =
+    {   0,
+        0,   72, 2710, 5057,  120,  129,    0,  140, 2705,  138,
+      149,  169,  160, 2705,  226,  157, 2651,  151, 2679,  130,
+     2639,  131,  227,  271, 2648, 2633,  244,  331,  390,  447,
+      203,  239,  332,  338,  375,  340,  370,  428,  430,  249,
+     2650,  201,  254,  397, 2694,  147,  253,  506,  344,  257,
+      568,  189, 2641,  229, 2672,  339,  294,  248,  335,  620,
+     2642,  284,  574,  667,  724,  318,  640,  555,  608,  709,
+      590,  610,  690,  746,  761,  462,  449,  644,  577, 2639,
+      455,    0, 2683,  303,  781,  309, 5057, 2679,  439,  354,
+     2673, 2673, 2671,  419,  692, 2671,  491,  160,  809, 2670,
+
+        0, 2683, 5057,  782,    0,  829,    0,    0,  499,  862,
+      712,  582, 2636, 2641, 2615, 2616,  736, 2640, 2639,  717,
+      797, 2627,  769,  829, 2613, 2627,  927,  336,  999, 5057,
+     1023, 1074,    0, 1091, 1142,  834, 1159, 1206,    0, 1218,
+     1265,  838,  847,  842, 2606, 2609, 2608, 2613,  303, 2597,
+      890, 2664, 2663,  572, 2662,  594,  633,  298,  634, 1324,
+      401,  688,  429, 1386, 1433, 2661,  851,  927,  900,  903,
+      751,  689,  892,  946, 2626,  946,  951,  960,  973,  968,
+      972,  690, 1445, 1496, 2659, 1513, 1565, 1010, 1582, 1629,
+     2658, 1641, 1688, 1018, 1036, 1040,  972, 1003, 1023,  694,
+
+      804, 2596,  446,  503,  518, 2649,  542, 1153, 1167, 2648,
+     2586, 5057, 2649, 2648, 2647, 2636, 2643, 2638,    0, 5057,
+     2632, 2627, 2626, 2625, 2624,  808, 1023, 1045, 1073,    0,
+     1072, 1085, 1136, 1735, 2570, 2563, 2576, 2571, 1179, 1229,
+     2554, 1154,  930, 2569, 2607,    0, 2563, 2559, 1214, 1795,
+      569, 1240,  605, 1867, 1930,    0, 1947,    0, 2608, 2606,
+     1218, 1204, 1278,    0, 1998, 2606,  755,  398, 1272, 2015,
+        0, 1288, 1317, 1395, 1379, 2062, 1405, 1391, 2564, 2600,
+     2546, 5057, 1446,  750, 2608,  127, 2608,  885, 1185,  996,
+     1447,  789, 2606, 1238, 1410, 2114, 2602, 1452, 2161, 1602,
+
+     1652, 1181, 1707, 1458, 1506, 1412,    0, 1100, 1179, 1637,
+     2221, 2285, 2302, 2601, 1101, 1701, 1706, 2353, 1523, 1580,
+     1383, 2370, 2600, 1742, 1748, 1457, 2417, 1803, 1816, 1411,
+     1499, 1608, 1103, 2550, 5057,  817,  834, 2591, 5057, 1828,
+     2590, 2589, 2527, 2526, 2579, 2578, 2577, 2577,  388, 2576,
+      349, 2575,  890, 1761, 1029,    0, 1326, 1560,    0, 5057,
+     5057, 2429, 1436, 1590, 2525, 2525, 2522, 2522, 2528, 2522,
+      815,  503,  841, 2489,    0, 2542, 2524, 2525, 2522,    0,
+     2561, 2633,  858,  907,  910, 1727, 2565, 2553, 1645, 5057,
+     2696, 1760, 1085,  618, 1805, 2549, 1241, 1003, 2505, 2493,
+
+        0, 1759,    0, 1834, 2752, 1875, 1834, 2491, 1882, 2549,
+     1901, 1902, 2503, 2488, 2547,  434, 1522,  653,  953, 1219,
+     1291, 2809, 2545, 1912, 1875, 1888, 1899, 1572, 2869, 1505,
+     1519, 1604, 1898, 1915, 2941, 2544, 3013, 3077, 1916, 1951,
+     1591,    0, 3133, 1967, 2025, 1841, 1663, 2494, 2535, 1637,
+     2534, 2472, 2532, 2469, 2529, 2467, 2520, 1748, 1924, 5057,
+     3189, 2483, 2479, 2479, 2474, 2526, 1268, 1972, 2525,  870,
+     2498, 2473,    0, 3254, 3326, 2463, 2463, 2519, 1299, 1946,
+     5057, 2515, 1971, 1097, 1394, 1506, 2508, 1319, 1239, 5057,
+     2454, 2439,    0, 2483, 1817, 2013, 2474, 1582, 2448, 2400,
+
+     2393, 1048, 1250, 1594, 3389, 2005, 2020, 2073, 2069, 1937,
+     3454, 2440, 3526, 2041, 1956, 2075, 2440, 2084, 2010, 2077,
+      430, 5057, 2114, 2425, 2424, 2360, 2345, 2405, 2403, 2341,
+     2339, 2397, 2394, 2328, 2326, 2379, 2373, 1850, 2076, 2077,
+     2380, 2325, 2315, 2035, 2311, 2293, 2330, 2286, 2267, 2304,
+     2279, 2288, 2263, 2044, 2278, 5057, 2008, 5057, 2312, 5057,
+     5057, 2306, 2123, 2296, 2238, 2232, 2283, 1861,  872, 1450,
+     2118, 2127, 2135, 2136, 2278, 2137, 2129, 2273, 2177, 5057,
+     2187, 2142, 2203, 2200, 2177, 5057, 2125, 2129, 2103, 5057,
+     2089, 2136, 2126, 2064, 2105, 2066, 1992, 2011, 1986, 1984,
+
+        0, 1960, 2180, 1990, 1924, 1065, 1113, 2229, 2175, 1960,
+     2172, 2083, 2180, 2191, 1900, 1933, 1299, 1883, 1859, 2126,
+     1806, 1072, 1787, 1760, 3598, 1728, 1719, 1697, 1506, 1747,
+     3670, 2230, 2232, 1665, 1664, 1616, 5057, 1582, 1880, 1999,
+     3742, 2081,    0, 1530, 1479, 1752, 1163, 3814, 2244, 2160,
+     2244, 2252, 1487, 1478, 2229, 1476, 1419, 1392, 1372, 1591,
+     1710, 2254, 1312, 1271, 2256, 1158, 1136, 2225, 2227, 1106,
+      942,  906,  918, 1045, 1456, 2259, 2315,  875,  756, 2293,
+     2211,  733, 2243, 2248,    0,  701,  584,  603, 1827, 2312,
+     2314,    0, 2299,  538, 5057,  421, 2242,  473, 5057,  304,
+
+      315, 5057, 2151, 2378, 2346, 2302,  234,  206, 1795, 2379,
+     2317,  203, 1623, 1642, 1664, 1887, 2369, 2370, 2382, 2383,
+     2434, 2436, 2437, 2442, 2443, 2444, 2446, 2449, 2450, 2514,
+     2030,  159, 5057, 5057, 3883, 3898, 3913, 3928, 3943, 3955,
+     3970, 3985, 3999, 4002, 4005, 4008, 4023, 4038, 4041, 4044,
+     4059, 4074, 4086, 4101, 4116, 4131, 4146, 4161, 4176, 4191,
+     4194, 4209, 4224, 4239, 4254, 4269, 1899, 4272, 4283, 2048,
+     4286, 4301, 4316, 4328, 4343, 4358, 4373, 4388, 4403, 4418,
+     4433, 4448, 4457, 4472, 4487, 4502, 4517, 4532, 4547, 4562,
+     4573, 4588, 4603, 4618, 4633, 4648, 4663, 4678, 4693, 4708,
+
+     4723, 4738, 4753, 4768, 4783, 4798, 4813, 4828, 4839, 4852,
+     4867, 4882, 4897, 4908, 4921, 4936, 4951, 4966, 4981, 4996,
+     5011, 5026, 5041
+    } ;
+
+static yyconst short int yy_def[824] =
+    {   0,
+      734,  734,  734,  734,  734,  734,  735,  736,  734,  734,
+      735,  734,   12,  737,  735,   15,   15,   15,   15,   15,
+      735,   15,   15,  735,   15,  735,   15,  738,   15,   15,
+       29,   29,   29,   29,   29,   29,   29,   29,   30,   29,
+      735,  735,  735,  739,  734,  740,  740,  734,   48,  737,
+      740,   51,   51,   51,   51,   51,  740,   51,   51,  740,
+       51,  740,   51,   51,   51,   64,   64,   64,   64,   64,
+       64,   64,   64,   65,   64,  740,  740,  740,  739,  734,
+      734,  735,  741,  742,  741,  734,  734,  734,  734,  735,
+      734,  735,  734,  743,  743,  735,  743,  734,   12,  734,
+
+      735,  737,  734,  735,  744,  735,  745,  746,  106,  734,
+      106,  106,  735,  735,  735,  735,  106,  104,  735,  735,
+      106,  735,  106,  106,  735,  747,  738,  747,  748,  734,
+      735,  735,  749,  735,  735,  735,  735,  132,  750,  735,
+      135,  106,  106,  735,  735,  735,  735,  735,  739,  751,
+      739,  734,  752,  753,  734,  753,  753,  734,  753,  734,
+      734,  753,  754,  753,  164,  745,  165,  165,  165,  753,
+      753,  753,  753,  165,  164,  753,  753,  165,  753,  165,
+      165,  753,  164,  164,  749,  164,  753,  753,  164,  184,
+      750,  164,  187,  165,  165,  753,  753,  753,  753,  753,
+
+      739,  734,  755,  756,  756,  757,  758,  755,  755,  759,
+      760,  734,  734,  734,  734,  735,  735,  734,  735,  734,
+      734,  734,  734,  735,  734,  734,  735,  734,  106,  761,
+      735,  734,  734,  735,  734,  734,  734,  734,  735,  735,
+      735,  735,  735,  735,  735,  234,  735,  735,  735,  762,
+      763,  764,  765,  766,  735,  767,  735,  768,  767,  735,
+      735,  735,  769,  770,  735,  770,  735,  735,  255,  735,
+      771,  735,  735,  770,  255,  265,  735,  735,  735,  735,
+      735,  734,  739,  734,  772,  734,  773,  774,  774,  774,
+      774,  775,  772,  776,  774,  774,  761,  774,  296,  774,
+
+      774,  774,  774,  774,  774,  774,  299,  774,  774,  774,
+      777,  774,  296,  768,  774,  774,  774,  312,  774,  774,
+      312,  296,  771,  774,  774,  312,  318,  774,  774,  774,
+      774,  774,  739,  734,  734,  778,  778,  779,  734,  780,
+      781,  781,  782,  782,  734,  734,  734,  735,  734,  734,
+      734,  734,  734,  734,  734,  735,  783,  734,  735,  734,
+      734,  735,  783,  735,  734,  734,  734,  734,  735,  735,
+      735,  734,  735,  784,  735,  735,  735,  735,  735,  785,
+      786,  786,  787,  787,  788,  789,  790,  734,  734,  734,
+      735,  791,  734,  734,  791,  395,  735,  735,  734,  734,
+
+      735,  734,  391,  395,  391,  735,  735,  735,  739,  734,
+      734,  734,  734,  734,  792,  734,  774,  793,  793,  774,
+      774,  774,  363,  774,  774,  774,  774,  774,  794,  774,
+      774,  774,  774,  774,  795,  785,  795,  774,  774,  774,
+      774,  438,  438,  774,  774,  774,  739,  734,  796,  797,
+      798,  799,  800,  801,  802,  803,  734,  734,  734,  734,
+      735,  734,  734,  734,  734,  735,  735,  734,  735,  734,
+      735,  735,  804,  805,  805,  735,  735,  735,  806,  807,
+      734,  808,  734,  809,  809,  809,  735,  734,  734,  734,
+      734,  734,  735,  734,  809,  739,  734,  734,  734,  734,
+
+      734,  810,  811,  811,  438,  774,  774,  774,  774,  774,
+      812,  804,  812,  774,  774,  774,  813,  774,  774,  739,
+      734,  734,  797,  798,  798,  799,  799,  800,  800,  801,
+      801,  802,  802,  803,  803,  734,  734,  814,  814,  814,
+      735,  734,  734,  734,  734,  735,  815,  734,  734,  734,
+      734,  735,  735,  735,  735,  734,  734,  734,  734,  734,
+      734,  734,  739,  734,  734,  734,  810,  810,  811,  811,
+      774,  774,  774,  774,  816,  774,  774,  813,  739,  734,
+      734,  797,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  815,  815,  734,  734,  734,  734,  735,  735,  735,
+
+      735,  735,  739,  734,  734,  811,  811,  774,  774,  816,
+      774,  774,  774,  739,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  817,  735,  734,  734,  811,  811,
+      818,  774,  739,  734,  734,  734,  734,  734,  819,  819,
+      817,  641,  735,  734,  734,  811,  811,  818,  819,  648,
+      774,  739,  734,  734,  819,  641,  641,  734,  734,  811,
+      811,  820,  648,  648,  739,  734,  734,  819,  819,  641,
+      641,  734,  734,  811,  811,  820,  820,  648,  648,  739,
+      734,  734,  819,  819,  641,  821,  734,  822,  811,  820,
+      820,  648,  739,  734,  734,  734,  819,  821,  734,  734,
+
+      822,  734,  811,  820,  820,  739,  734,  734,  811,  820,
+      739,  734,  811,  739,  823,  823,  823,  823,  823,  823,
+      823,  823,  823,  823,  823,  823,  823,  823,  823,  823,
+      823,  734,  734,    0,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734
+    } ;
+
+static yyconst short int yy_nxt[5130] =
+    {   0,
+        4,    4,    4,    5,    4,    4,    6,    4,    7,    8,
+        4,    9,   10,    7,    4,    4,   11,   12,   13,   13,
+        4,   14,    4,    4,   15,   16,   17,   18,   19,   19,
+       20,   19,    7,   19,   21,   22,   15,   23,   24,   15,
+       25,   26,    7,   27,    7,   28,    4,    4,   29,   30,
+       31,   32,   33,   34,   35,   36,   37,   38,   39,   40,
+       41,   15,   42,   24,   25,   26,    7,    7,   43,    7,
+       44,    4,    4,    4,    4,    5,    4,   45,    6,   45,
+        7,    8,    4,    9,   10,   46,    4,    4,   47,   48,
+       49,   49,    4,   50,    4,    4,   51,   52,   53,   54,
+
+       55,   55,   56,   55,   46,   55,   57,   58,   51,   59,
+       60,   51,   61,   62,   46,   63,   46,   28,    4,    4,
+       64,   65,   66,   67,   68,   69,   70,   71,   72,   73,
+       74,   75,   76,   51,   77,   60,   61,   62,   46,   46,
+       78,   46,   79,    4,   80,   81,   81,   81,   81,   84,
+       87,   88,   89,  734,  734,   82,   85,   85,   85,   85,
+      110,  733,   90,   94,   91,   92,  114,  155,   80,   93,
+       94,   94,   95,   82,  734,  734,  225,   82,  226,  117,
+      734,  413,   96,   97,   98,   99,   99,   99,   99,  100,
+      414,  115,  110,  101,  101,  101,  101,  101,  101,  101,
+
+      101,   82,  101,   82,   82,  101,  101,  101,  101,  101,
+       82,   82,  101,   82,  146,  113,  111,  101,  101,  101,
+      101,  101,  101,  101,  101,  101,  101,  101,  101,   82,
+      101,  101,  101,  101,   82,   82,   82,   82,   82,  104,
+      118,  105,  106,  106,  106,  106,  107,  110,  168,  108,
+      734,  136,  734,  135,  135,  686,   89,  110,  144,  103,
+      163,   82,  734,  147,  119,  712,  156,  734,   91,  157,
+      104,  734,  734,  158,  109,  109,  109,  109,  109,  109,
+      109,  109,  109,  109,  109,  109,  105,  136,  136,  135,
+      135,  135,   82,  170,  108,  580,  174,  136,  136,  123,
+
+      124,  287,   82,  113,  155,  150,  125,  135,  135,  148,
+      125,  116,  206,  207,  155,  218,  125,  702,  210,  120,
+      120,  120,  120,  120,  120,  120,  120,  120,  120,  120,
+      120,  126,  127,  127,  127,  126,  126,  126,  126,  126,
+      126,  126,  126,  126,  128,  126,  126,   94,  175,  251,
+      179,  126,  126,  126,  126,  734,  173,  154,  734,  734,
+      708,  734,  734,  734,  155,  225,  188,  226,  187,  187,
+      216,  217,  176,  196,  152,  171,  126,  130,  126,  211,
+      136,  136,  130,  135,  135,  135,  136,  136,  136,  136,
+      135,  135,  135,  734,  135,  135,  135,  451,  734,  150,
+
+      172,  126,  126,  131,  287,  734,  132,  132,  132,  132,
+      133,  114,  400,  151,  151,  151,  151,  225,  136,  136,
+       94,   94,   94,  136,  136,  135,  135,  135,  135,  135,
+      135,  293,  294,  734,  134,  502,  115,  502,  135,  135,
+      136,  136,  136,  136,  136,  136,  136,  136,  136,  136,
+      110,  734,  213,  734,  214,  204,  335,   82,  452,  215,
+      137,  401,  198,  138,  138,  138,  138,  139,  152,  155,
+       82,   81,   81,   81,   81,  699,  136,  136,  142,  142,
+      142,  580,  155,  707,  135,  135,  135,  141,  141,  141,
+      581,  140,   94,   94,   94,  141,  141,  141,  142,  142,
+
+      142,  142,  142,  142,  142,  142,  143,   94,   94,   95,
+      197,  199,  206,  336,   82,  234,  234,  234,  234,  159,
+       97,   98,  160,  160,  160,  160,  161,  206,  336,  470,
+      162,  162,  162,  162,  162,  162,  162,  162,  154,  162,
+      154,  154,  162,  162,  162,  162,  162,  154,  154,  162,
+      154,  338,  339,  470,  162,  162,  162,  162,  162,  162,
+      162,  162,  162,  162,  162,  162,  154,  162,  162,  162,
+      162,  154,  154,  154,  154,  154,   82,  110,  734,  150,
+       82,  164,  384,  105,  165,  165,  165,  165,  166,  695,
+      201,  108,  155,  151,  151,  151,  151,  734,  234,  234,
+
+      234,  234,   82,  188,  188,  702,  187,  187,  187,  386,
+      288,  289,  164,  734,  155,  130,  167,  167,  167,  167,
+      167,  167,  167,  167,  167,  167,  167,  167,   82,  180,
+      181,  734,  400,  734,  240,  105,  182,  700,  188,  188,
+      155,   82,   82,  108,  187,  187,  187,  110,  152,  290,
+      291,  387,   82,  155,  155,  103,  188,  188,  188,  188,
+      187,  187,  187,  734,  155,  187,  187,  187,  177,  177,
+      177,  177,  177,  177,  177,  177,  177,  177,  177,  177,
+      183,  490,  734,  184,  184,  184,  184,  185,  188,  188,
+      187,  187,  187,   94,   94,   94,   82,   82,   82,  200,
+
+      182,  503,   82,  699,  170,  221,  182,  222,  155,  155,
+      155,  186,  223,  734,  155,  187,  187,  188,  188,  188,
+      188,  188,  188,  188,  188,  188,  188,  110,  234,  234,
+      234,  234,  734,  246,  246,  246,  246,  189,  188,  188,
+      190,  190,  190,  190,  191,  171,  187,  187,  187,  734,
+      332,  311,  234,  234,  234,  234,  303,  188,  188,   82,
+      239,  410,  187,  187,  187,  399,  411,  412,  192,  734,
+      172,  155,  193,  193,  193,  194,  194,  194,  194,  194,
+      194,  194,  194,  195,  734,  234,  234,  234,  234,  696,
+      204,  293,  294,  303,  194,  194,  194,  208,  208,  208,
+
+      208,  209,  244,  193,  193,  193,  150,  268,  692,  188,
+      188,  354,   94,  234,  234,  234,  234,  333,  468,  187,
+      187,  355,   82,  173,  734,  249,  338,  339,  355,  734,
+      227,  227,  227,  227,  227,  227,  227,  227,  227,  227,
+      227,  227,  229,  338,  339,  234,  234,  234,  234,  230,
+      265,  265,  265,  265,  276,  276,  276,  276,  265,  265,
+      265,  265,  247,  276,  276,  276,  276,  299,  299,  299,
+      299,  384,  471,  229,  103,  152,  469,  231,  231,  231,
+      231,  231,  231,  231,  231,  231,  231,  231,  231,  235,
+      250,  236,  150,   82,  279,  239,  472,  237,  417,  453,
+
+       82,  550,  238,  692,  130,  155,  151,  151,  151,  151,
+      283,   82,  155,  235,  386,  236,  299,  299,  299,  299,
+      479,  687,  237,  155,  606,  551,  238,  126,  127,  127,
+      127,  126,  126,  126,  126,  126,  126,  126,  126,  126,
+      126,  126,  126,  299,  299,  299,  299,  126,  126,  126,
+      126,  302,  301,  130,   82,  103,  387,  304,  686,   82,
+      454,  152,  299,  299,  299,  299,  155,  307,  307,  307,
+      307,  155,  126,  130,  126,  300,  299,  299,  299,  299,
+       82,   82,  374,  290,  299,  299,  299,  299,  299,  299,
+      299,  299,  155,  155,  685,  374,  374,  126,  126,  126,
+
+      252,  252,  252,  253,   82,  126,  126,  126,  126,  126,
+      126,   82,  305,  126,  126,  504,  155,  492,   82,  126,
+      126,  309,  126,  155,  310,  308,  318,  318,  318,  318,
+      155,   82,  457,  311,  327,  327,  327,  327,  305,  356,
+      356,  356,  356,  155,  126,  130,  458,  103,   82,  568,
+      416,  568,  327,  327,  327,  327,  318,  318,  318,  318,
+      155,  357,  357,  357,  357,  331,  493,  103,  629,  126,
+      126,  255,  255,  255,  255,  255,  255,  255,  255,  255,
+      255,  255,  255,  256,  300,  290,   82,  257,  359,  359,
+      359,  359,  330,  734,  258,  399,  259,  688,  260,  260,
+
+      260,  360,  360,  360,  360,  150,  485,  260,   82,   82,
+      260,  390,  548,  260,  260,  103,  447,   82,  257,  486,
+      155,  155,  261,  261,  261,  262,  262,  262,  262,  262,
+      262,  262,  261,  262,  685,  260,  548,  394,  260,  135,
+      135,  135,  135,  135,  135,  135,  135,  135,  135,  135,
+      135,  264,  361,  361,  361,  361,  432,  372,  265,  265,
+      265,  265,  204,  335,  266,  103,  267,  267,  267,  208,
+      208,  208,  208,  209,  152,  267,  204,  335,  267,  630,
+      373,  267,  267,  340,  340,  340,  340,   82,  349,   82,
+      267,  267,  267,   82,  268,  359,  359,  359,  359,  155,
+
+      267,  155,  682,  267,  373,  155,  267,  269,  269,  269,
+      269,  269,  269,  269,  269,  269,  269,  269,  269,  270,
+      391,  391,  391,  391,  681,  661,  271,   82,  390,  369,
+      359,  359,  359,  359,  391,  391,  391,  391,  433,  155,
+      103,  252,  252,  252,  253,  359,  359,  359,  359,  427,
+      270,  491,  103,  492,  272,  272,  272,  273,  273,  273,
+      273,  273,  273,  273,  272,  273,  275,  275,  275,  275,
+      275,  275,  275,  275,  275,  275,  275,  275,  229,  370,
+      379,  276,  276,  276,  276,  230,  130,  264,  356,  356,
+      356,  356,  418,  398,  392,  392,  392,  392,  390,   82,
+
+      266,  419,  561,  546,  403,  403,  403,  403,  455,  229,
+      569,  155,  479,  277,  277,  277,  231,  278,  231,  231,
+      231,  231,  231,  277,  231,   94,   94,   94,  546,  491,
+      394,  679,   82,  403,  403,  403,  403,  154,   97,  363,
+      160,  160,  160,  160,  155,  556,  363,  678,  162,  162,
+      162,  162,  162,  162,  162,  162,  154,  162,  154,  154,
+      162,  162,  162,  162,  162,  154,  154,  162,  154,  456,
+      363,  489,  162,  162,  162,  162,  162,  162,  162,  162,
+      162,  162,  162,  162,  154,  162,  162,  162,  162,  154,
+      154,  154,  154,  154,   82,  405,  405,  405,  405,  420,
+
+      420,  420,  420,  734,  264,  400,  155,  359,  359,  359,
+      359,  404,  404,  404,  404,  399,  734,  266,   82,   82,
+       82,  359,  359,  359,  359,  431,  420,  420,  420,  420,
+      155,  155,  155,  673,  295,  295,  295,  295,  295,  295,
+      295,  295,  295,  295,  295,  295,  296,  394,  150,  734,
+      353,  672,  103,  297,  401,   82,  734,  268,  103,  689,
+       82,  426,  409,  409,  409,  409,   82,  155,  421,  421,
+      421,  421,  155,  443,  443,  443,  443,  296,  155,  671,
+      734,  298,  298,  298,  298,  298,  298,  298,  298,  298,
+      298,  298,  298,  312,  312,  312,  312,  312,  312,  312,
+
+      312,  312,  312,  312,  312,  256,  607,   82,  103,  313,
+      429,  670,  446,   82,   82,  485,  314,  152,  259,  155,
+      315,  315,  315,  429,  429,  155,  155,   82,  734,  315,
+       82,   82,  315,  399,  667,  315,  315,  666,  290,  155,
+      313,  659,  155,  155,  316,  316,  316,  317,  317,  317,
+      317,  317,  317,  317,  316,  317,  290,  315,  430,  646,
+      315,  187,  187,  187,  187,  187,  187,  187,  187,  187,
+      187,  187,  187,   82,  264,  320,  460,  460,  460,  460,
+       82,  318,  318,  318,  318,  155,  658,  266,   82,  319,
+      319,  319,  155,  103,  400,  221,  103,  222,  319,   82,
+
+      155,  319,  223,  509,  319,  319,  461,  461,  461,  461,
+       82,  155,   82,  319,  319,  319,   82,  320,  421,  421,
+      421,  421,  155,  319,  155,  103,  319,  510,  155,  319,
+      321,  321,  321,  321,  321,  321,  321,  321,  321,  321,
+      321,  321,  322,  441,  715,   82,  204,  522,  654,  323,
+      674,  523,  425,  421,  421,  421,  421,  155,  514,  570,
+       82,  484,  484,  484,  484,  150,  717,  637,  421,  421,
+      421,  421,  155,  322,  434,  688,  520,  324,  324,  324,
+      325,  325,  325,  325,  325,  325,  325,  324,  325,  326,
+      326,  326,  326,  326,  326,  326,  326,  326,  326,  326,
+
+      326,  296,  426,  434,  327,  327,  327,  327,  297,   82,
+      372,  390,  103,  152,   82,   82,  653,  438,  438,  438,
+      438,  155,  438,  438,  438,  438,  155,  155,  480,  480,
+      480,  580,  296,  428,  152,  282,  328,  328,  328,  298,
+      329,  298,  298,  298,  298,  298,  328,  298,  362,  103,
+       82,  536,  390,  645,  103,  363,   82,  428,  442,  442,
+      442,  442,  155,  537,  442,  442,  442,  442,  155,  395,
+      455,  675,  644,  481,  355,  495,  495,  495,  495,  362,
+      643,  355,  396,  364,  364,  364,  364,  364,  364,  364,
+      364,  364,  364,  364,  364,  380,  380,  103,  380,  380,
+
+      380,  380,  380,  647,  380,  380,  380,  380,  660,  380,
+      380,   82,  489,  399,  734,  380,  380,  380,  380,  421,
+      421,  421,  421,  155,   82,  639,  485,  734,  639,  103,
+      400,  456,  421,  421,  421,  421,  155,  204,  335,  486,
+      380,  380,  380,  395,  450,  450,  450,  450,  492,   82,
+      461,  461,  461,  461,  713,  320,  396,  734,  638,  539,
+      382,  155,  568,  416,  568,  380,  380,  126,  252,  252,
+      252,  253,  540,  126,  126,  126,  126,  126,  126,  441,
+      703,  126,  126,   82,  150,  491,  489,  126,  126,  717,
+      126,  461,  461,  461,  461,  155,   82,  493,  496,  496,
+
+      496,  496,  468,  290,   89,  498,   82,   82,  155,  388,
+      655,  388,  126,  130,  497,  499,   91,   98,  155,  155,
+       82,   93,  100,   82,   82,  620,  491,  398,  505,  505,
+      505,  505,  155,  506,  655,  155,  155,  126,  126,  264,
+      538,  538,  538,  538,  635,   82,  507,  480,  480,  480,
+      515,  584,  266,  152,  267,  267,  267,  155,  282,   82,
+      508,  634,  416,  267,   82,  492,  267,  516,  440,  267,
+      267,  155,  557,  557,  557,   82,  155,  491,  267,  267,
+      267,  547,  268,  505,  505,  505,  505,  155,  267,  574,
+      628,  267,  481,  627,  267,  262,  262,  262,  262,  262,
+
+      262,  262,  262,  262,  262,  262,  262,  395,  110,  557,
+      557,  557,  548,   82,  519,  150,  577,  558,   82,  440,
+      396,  549,  397,  397,  397,  155,  626,  563,   82,  655,
+      155,  397,  717,   82,  397,  601,  548,  397,  397,  492,
+      155,  505,  505,  505,  505,  155,  397,  397,  397,   82,
+      398,  625,  625,  655,  558,  572,  397,  624,  393,  397,
+      393,  155,  397,  273,  273,  273,  273,  273,  273,  273,
+      273,  273,  273,  273,  273,  362,  468,   82,  110,  150,
+      572,   82,  363,   82,  564,  734,  539,  589,  519,  155,
+      579,   82,   82,  155,  560,  155,  600,  573,  734,  734,
+
+      590,  732,  576,  155,  155,  656,  362,  623,  622,  601,
+      406,  406,  406,  364,  407,  364,  364,  364,  364,  364,
+      406,  364,   82,  204,  335,  150,   82,  621,  586,  657,
+      582,  582,  582,  582,  155,   82,  593,   82,  155,  603,
+      603,  603,  603,   82,   82,   82,  593,  155,  152,  155,
+      620,  204,  522,  103,  590,  155,  155,  155,  582,  582,
+      582,  582,  298,  298,  298,  298,  298,  298,  298,  298,
+      298,  298,  298,  298,  422,  197,  608,  613,  636,  150,
+       82,  423,  150,   82,  663,  619,  618,  586,   82,  611,
+      614,  637,  155,  150,  152,  155,  603,  603,  603,  603,
+
+      155,  609,  612,  617,  633,  422,  616,  709,  664,  424,
+      424,  424,  424,  424,  424,  424,  424,  424,  424,  424,
+      424,  380,  380,  612,  380,  380,  380,  380,  380,  381,
+      380,  380,  380,  380,  150,  380,  380,   82,   82,  615,
+      631,  436,  380,  380,  380,  652,  632,  662,  152,  155,
+      155,  564,   82,  668,  150,  655,  416,  655,  150,  655,
+      683,  416,  152,  694,  155,  665,  380,  380,  380,  680,
+      631,  697,  655,  655,  655,  416,  695,  669,  655,  655,
+      416,  655,  651,  655,  677,  416,  437,  684,  605,  677,
+      604,  380,  380,   82,  264,  150,  655,  655,  655,  284,
+
+      697,  150,  655,  152,  150,  155,  693,  266,  677,  319,
+      319,  319,  706,  677,  416,  711,  416,  416,  319,  150,
+      561,  319,  560,  152,  319,  319,  602,  152,  599,  598,
+      714,  597,  596,  319,  319,  319,  595,  320,  594,  690,
+      593,  145,  677,  319,  677,  677,  319,  704,  416,  319,
+      317,  317,  317,  317,  317,  317,  317,  317,  317,  317,
+      317,  317,  395,  691,  152,  591,  677,  588,  677,  677,
+      152,  717,  717,  152,  705,  396,  677,  439,  439,  439,
+      416,  416,  718,  719,  717,  717,  439,  587,  152,  439,
+      586,  584,  439,  439,  583,  720,  721,  535,  710,  535,
+
+      677,  439,  439,  439,  533,  440,  710,  533,  677,  677,
+      531,  439,  531,  529,  439,  529,  527,  439,  325,  325,
+      325,  325,  325,  325,  325,  325,  325,  325,  325,  325,
+      422,  527,  677,  677,  525,  525,  717,  423,  717,  717,
+      282,  282,  416,  575,  717,  717,  717,  722,  717,  723,
+      724,  717,  717,  282,  282,  725,  726,  727,  566,  728,
+      565,  422,  729,  730,  225,  444,  444,  444,  424,  445,
+      424,  424,  424,  424,  424,  444,  424,  364,  364,  364,
+      364,  364,  364,  364,  364,  364,  364,  364,  364,  473,
+      473,  218,  473,  473,  473,  473,  473,  490,  473,  473,
+
+      473,  473,  562,  473,  473,  282,  489,  282,  282,  473,
+      473,  473,  473,  282,  282,  282,  717,  282,  560,  483,
+      282,  282,  110,  555,  554,  553,  552,  731,  468,  110,
+      545,  544,  543,  542,  473,  473,  473,  458,  535,  533,
+      531,  475,  529,  527,  525,  207,  521,  517,  287,  416,
+      501,  500,   86,  219,  475,  475,  494,  394,  395,  473,
+      473,  380,  380,  390,  380,  380,  380,  380,  380,  483,
+      380,  380,  380,  380,  478,  380,  380,  477,  476,  219,
+      467,  380,  380,  380,  380,  282,  466,  465,  464,  463,
+      462,  225,  225,  219,  218,  218,  218,  344,  344,  342,
+
+      342,  207,  448,  287,  287,  287,  380,  380,  380,  286,
+      416,  286,  379,  408,  370,  264,  390,  256,  378,  377,
+      376,  375,  371,  368,  367,  366,  365,  353,  353,  352,
+      351,  380,  380,  380,  380,  350,  380,  380,  380,  380,
+      380,  349,  380,  380,  380,  380,  349,  380,  380,  348,
+      347,  346,  345,  380,  380,  380,  380,  344,  342,  335,
+      334,  287,  287,  306,  287,  287,  286,  284,  282,  281,
+      219,  280,  244,  130,  250,  248,  219,  245,  380,  380,
+      380,  243,  242,  242,  241,  103,  225,  224,  218,  219,
+      218,  212,  204,  202,  178,  734,  169,  153,  145,  122,
+
+      121,  116,  734,  380,  380,  485,  112,  103,   86,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  486,  734,
+      487,  487,  487,  734,  734,  734,  734,  734,  734,  487,
+      734,  734,  487,  734,  734,  487,  487,  734,  734,  734,
+      734,  734,  734,  734,  487,  487,  487,  734,  734,  734,
+      734,  734,  734,  734,  487,  734,  734,  487,  734,  734,
+      487,  395,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  396,  734,  397,  397,  397,  734,
+      734,  734,  734,  734,  734,  397,  734,  734,  397,  734,
+      734,  397,  397,  734,  734,  734,  734,  734,  734,  734,
+
+      397,  397,  397,  734,  398,  734,  734,  734,  734,  734,
+      397,  734,  734,  397,  734,  734,  397,   82,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  155,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  424,  424,  424,
+      424,  424,  424,  424,  424,  424,  424,  424,  424,  473,
+      473,  734,  473,  473,  473,  473,  473,  474,  473,  473,
+      473,  473,  734,  473,  473,  734,  734,  734,  734,  512,
+      473,  473,  473,  734,  734,  734,  734,  734,  734,  734,
+
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  473,  473,  473,  734,  734,  734,
+      734,  513,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  513,  513,  734,  734,  734,  473,
+      473,  380,  380,  734,  380,  380,  380,  380,  380,  381,
+      380,  380,  380,  380,  734,  380,  380,  734,  734,  734,
+      734,  436,  380,  380,  380,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  380,  380,  380,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  380,  380,  380,  380,  734,  380,  380,  380,  380,
+      380,  381,  380,  380,  380,  380,  734,  380,  380,  734,
+      734,  734,  734,  436,  380,  380,  380,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  380,  380,
+      380,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  380,  380,   82,  485,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  155,  734,  486,
+
+      734,  518,  518,  518,  734,  734,  734,  734,  734,  734,
+      518,  734,  734,  518,  734,  734,  518,  518,  734,  734,
+      734,  734,  734,  734,  734,  518,  518,  518,  734,  734,
+      734,  734,  734,  734,  734,  518,  734,  734,  518,  734,
+      734,  518,  395,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  396,  734,  439,  439,  439,
+      734,  734,  734,  734,  734,  734,  439,  734,  734,  439,
+      734,  734,  439,  439,  734,  734,  734,  734,  734,  734,
+      734,  439,  439,  439,  734,  440,  734,  734,  734,  734,
+      734,  439,  734,  734,  439,  734,  734,  439,  539,  734,
+
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  540,  734,  541,  541,  541,  734,  734,  734,  734,
+      734,  734,  541,  734,  734,  541,  734,  734,  541,  541,
+      734,  734,  734,  734,  734,  734,  734,  541,  541,  541,
+      734,  734,  734,  734,  734,  734,  734,  541,  734,  734,
+      541,  734,  734,  541,  473,  473,  734,  473,  473,  473,
+      473,  473,  734,  473,  473,  473,  473,  734,  473,  473,
+      734,  734,  734,  734,  473,  473,  473,  473,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  473,
+
+      473,  473,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  473,  473,  473,  473,  734,  473,
+      473,  473,  473,  473,  734,  473,  473,  473,  473,  734,
+      473,  473,  734,  734,  734,  734,  473,  473,  473,  473,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  473,  473,  473,  734,  734,  734,  734,  475,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  475,  475,  734,  734,  734,  473,  473,  539,  734,
+
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  540,  734,  571,  571,  571,  734,  734,  734,  734,
+      734,  734,  571,  734,  734,  571,  734,  734,  571,  571,
+      734,  734,  734,  734,  734,  734,  734,  571,  571,  571,
+      734,  734,  734,  734,  734,  734,  734,  571,  734,  734,
+      571,  734,  734,  571,  473,  473,  734,  473,  473,  473,
+      473,  473,  474,  473,  473,  473,  473,  734,  473,  473,
+      734,  734,  734,  734,  512,  473,  473,  473,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  473,
+
+      473,  473,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  473,  473,  473,  473,  734,  473,
+      473,  473,  473,  473,  474,  473,  473,  473,  473,  734,
+      473,  473,  734,  734,  734,  734,  512,  473,  473,  473,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  473,  473,  473,  734,  734,  734,  734,  513,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  513,  513,  734,  734,  734,  473,  473,  640,  640,
+
+      734,  640,  640,  640,  640,  640,  734,  640,  640,  640,
+      640,  734,  640,  640,  734,  734,  734,  734,  640,  640,
+      640,  640,  734,  734,  734,  734,  734,  734,  642,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  640,  640,  640,  734,  734,  734,  734,
+      734,  734,  642,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  640,  640,
+      640,  640,  734,  640,  640,  640,  640,  640,  641,  640,
+      640,  640,  640,  734,  640,  640,  734,  734,  734,  734,
+      649,  640,  640,  640,  734,  734,  734,  734,  734,  734,
+
+      650,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  640,  640,  640,  734,  734,
+      734,  734,  734,  734,  650,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      640,  640,  640,  640,  734,  640,  640,  640,  640,  640,
+      734,  640,  640,  640,  640,  734,  640,  640,  734,  734,
+      734,  734,  640,  640,  640,  640,  734,  734,  734,  734,
+      734,  734,  642,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  640,  640,  640,
+      734,  734,  734,  734,  734,  734,  642,  734,  734,  734,
+
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  640,  640,  640,  640,  734,  640,  640,  640,
+      640,  640,  641,  640,  640,  640,  640,  734,  640,  640,
+      734,  734,  734,  734,  649,  640,  640,  640,  734,  734,
+      734,  734,  734,  734,  650,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  640,
+      640,  640,  734,  734,  734,  734,  734,  734,  650,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  640,  640,   82,  734,  734,   82,
+       82,  734,  734,   82,   82,   82,   82,   82,   83,   83,
+
+       83,   83,   83,  734,   83,   83,   83,   83,   83,   83,
+       83,   83,   83,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  102,  102,  102,  102,  102,  102,  129,  129,
+      129,  129,  129,  129,  129,  129,  129,  129,  129,  129,
+      129,  129,  129,  149,  149,  149,  149,  149,  149,  149,
+      149,  149,  149,  149,  149,  149,  149,  149,  154,  734,
+      734,  154,  154,  154,  734,  154,  154,  154,  154,  154,
+      203,  203,  203,  203,  203,  734,  203,  203,  203,  203,
+      203,  203,  203,  203,  203,  205,  205,  205,  205,  205,
+      205,  205,  205,  205,  205,  205,  205,  205,  205,  205,
+
+      220,  220,  734,  734,  734,  734,  734,  734,  734,  220,
+      220,  220,  220,  220,  228,  228,  228,  232,  232,  232,
+      233,  233,  233,  126,  126,  126,  126,  126,  126,  126,
+      126,  126,  126,  126,  126,  126,  126,  126,  254,  254,
+      254,  254,  254,  254,  254,  254,  254,  254,  254,  254,
+      254,  254,  254,  263,  263,  263,  274,  274,  274,  150,
+      150,  150,  150,  150,  150,  150,  150,  150,  150,  150,
+      150,  150,  150,  150,  285,  285,  285,  285,  285,  285,
+      285,  285,  285,  285,  285,  285,  285,  285,  285,  154,
+      734,  734,  154,  154,  154,  734,  154,  154,  154,  154,
+
+      154,  292,  292,  292,  292,  292,  292,  292,  292,  292,
+      292,  292,  292,  292,  292,  292,  203,  203,  203,  203,
+      203,  203,  203,  203,  203,  203,  203,  203,  203,  203,
+      203,  205,  205,  205,  205,  205,  205,  205,  205,  205,
+      205,  205,  205,  205,  205,  205,  206,  206,  206,  206,
+      206,  206,  206,  206,  206,  206,  206,  206,  206,  206,
+      206,  337,  337,  337,  337,  337,  337,  337,  337,  337,
+      337,  337,  337,  337,  337,  337,  341,  341,  734,  341,
+      341,  341,  341,  341,  341,  341,  341,  341,  341,  341,
+      341,  343,  343,  734,  343,  343,  343,  343,  343,  343,
+
+      343,  343,  343,  343,  343,  343,  358,  358,  358,  381,
+      381,  734,  381,  381,  381,  381,  381,  381,  381,  381,
+      381,  381,  381,  381,  383,  383,  383,  383,  383,  383,
+      383,  383,  383,  383,  383,  383,  383,  383,  383,  126,
+      126,  126,  126,  126,  126,  126,  126,  126,  126,  126,
+      126,  126,  126,  126,  385,  385,  385,  385,  385,  385,
+      385,  385,  385,  385,  385,  385,  385,  385,  385,  254,
+      254,  254,  254,  254,  254,  254,  254,  254,  254,  254,
+      254,  254,  254,  254,  389,  389,  389,  393,  734,  734,
+      393,  734,  393,  393,  734,  393,  734,  393,  402,  402,
+
+      402,  285,  285,  285,  285,  285,  285,  285,  285,  285,
+      285,  285,  285,  285,  285,  285,  415,  415,  415,  415,
+      415,  415,  415,  415,  415,  415,  415,  415,  415,  415,
+      415,  154,  734,  734,  154,  154,  154,  734,  154,  154,
+      154,  154,  154,  292,  292,  292,  292,  292,  292,  292,
+      292,  292,  292,  292,  292,  292,  292,  292,  102,  102,
+      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  102,  435,  435,  734,  435,  435,  435,  435,
+      435,  435,  435,  435,  435,  435,  435,  435,  337,  337,
+      337,  337,  337,  337,  337,  337,  337,  337,  337,  337,
+
+      337,  337,  337,  449,  449,  449,  449,  734,  449,  449,
+      449,  449,  449,  449,  449,  449,  449,  449,  203,  203,
+      203,  203,  203,  203,  203,  203,  203,  203,  203,  203,
+      203,  203,  203,  341,  341,  734,  341,  341,  341,  341,
+      341,  341,  341,  341,  341,  341,  341,  341,  343,  343,
+      734,  343,  343,  343,  343,  343,  343,  343,  343,  343,
+      343,  343,  343,  459,  734,  459,  734,  734,  734,  459,
+      459,  459,  474,  474,  734,  474,  474,  474,  474,  474,
+      474,  474,  474,  474,  474,  474,  474,  380,  380,  734,
+      380,  380,  380,  380,  380,  380,  380,  380,  380,  380,
+
+      380,  380,  381,  381,  734,  381,  381,  381,  381,  381,
+      381,  381,  381,  381,  381,  381,  381,  383,  383,  383,
+      383,  383,  383,  383,  383,  383,  383,  383,  383,  383,
+      383,  383,  385,  385,  385,  385,  385,  385,  385,  385,
+      385,  385,  385,  385,  385,  385,  385,  126,  126,  126,
+      126,  126,  126,  126,  126,  126,  126,  126,  126,  126,
+      126,  126,  482,  482,  482,  482,  482,  482,  482,  482,
+      482,  482,  482,  482,  482,  482,  482,  488,  734,  734,
+      734,  734,  488,  488,  734,  488,  734,  488,  415,  415,
+      415,  415,  415,  415,  415,  415,  415,  415,  415,  415,
+
+      415,  415,  415,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  102,  102,  102,  102,  102,  102,  511,  511,
+      734,  511,  511,  511,  511,  511,  511,  511,  511,  511,
+      511,  511,  511,  435,  435,  734,  435,  435,  435,  435,
+      435,  435,  435,  435,  435,  435,  435,  435,  449,  449,
+      449,  449,  734,  449,  449,  449,  449,  449,  449,  449,
+      449,  449,  449,  203,  203,  203,  203,  203,  203,  203,
+      203,  203,  203,  203,  203,  203,  203,  203,  524,  524,
+      734,  524,  524,  524,  524,  524,  524,  524,  524,  524,
+      524,  524,  524,  526,  526,  734,  526,  526,  526,  526,
+
+      526,  526,  526,  526,  526,  526,  526,  526,  528,  528,
+      734,  528,  528,  528,  528,  528,  528,  528,  528,  528,
+      528,  528,  528,  530,  530,  734,  530,  530,  530,  530,
+      530,  530,  530,  530,  530,  530,  530,  530,  532,  532,
+      734,  532,  532,  532,  532,  532,  532,  532,  532,  532,
+      532,  532,  532,  534,  534,  734,  534,  534,  534,  534,
+      534,  534,  534,  534,  534,  534,  534,  534,  473,  473,
+      734,  473,  473,  473,  473,  473,  473,  473,  473,  473,
+      473,  473,  473,  474,  474,  734,  474,  474,  474,  474,
+      474,  474,  474,  474,  474,  474,  474,  474,  383,  383,
+
+      383,  383,  383,  383,  383,  383,  383,  383,  383,  383,
+      383,  383,  383,  126,  126,  126,  126,  126,  126,  126,
+      126,  126,  126,  126,  126,  126,  126,  126,  482,  482,
+      482,  482,  482,  482,  482,  482,  482,  482,  482,  482,
+      482,  482,  482,  559,  734,  734,  734,  734,  559,  559,
+      734,  559,  567,  567,  567,  567,  567,  567,  567,  567,
+      567,  567,  567,  567,  567,  567,  567,  102,  102,  102,
+      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
+      102,  102,  511,  511,  734,  511,  511,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,  578,  578,  578,
+
+      578,  578,  578,  578,  578,  578,  578,  578,  578,  578,
+      578,  578,  585,  734,  734,  734,  734,  585,  585,  734,
+      585,  592,  592,  734,  592,  592,  592,  592,  592,  592,
+      592,  592,  592,  592,  592,  592,  610,  610,  610,  610,
+      610,  610,  610,  610,  610,  610,  610,  610,  610,  610,
+      610,  641,  641,  734,  641,  641,  641,  641,  641,  641,
+      641,  641,  641,  641,  641,  641,  648,  648,  734,  648,
+      648,  648,  648,  648,  648,  648,  648,  648,  648,  648,
+      648,  640,  640,  734,  640,  640,  640,  640,  640,  640,
+      640,  640,  640,  640,  640,  640,  676,  676,  676,  676,
+
+      676,  676,  676,  676,  676,  676,  676,  676,  676,  676,
+      676,  698,  698,  698,  698,  698,  698,  698,  698,  698,
+      698,  698,  698,  698,  698,  698,  701,  701,  701,  701,
+      701,  701,  701,  701,  701,  701,  701,  701,  701,  701,
+      701,  716,  716,  716,  716,  716,  716,  716,  716,  716,
+      716,  716,  716,  716,  716,  716,    3,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734
+    } ;
+
+static yyconst short int yy_chk[5130] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    2,    2,    2,    2,    2,    2,    2,    2,
+        2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
+        2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
+
+        2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
+        2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
+        2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
+        2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
+        2,    2,    2,    2,    5,    6,    6,    6,    6,    8,
+       10,   10,   11,   20,   22,   46,    8,    8,    8,    8,
+       16,  732,   11,   13,   11,   11,   20,   46,    5,   11,
+       12,   12,   12,   13,   18,   13,   98,   12,   98,   22,
+       13,  286,   12,   12,   12,   12,   12,   12,   12,   12,
+      286,   20,   52,   12,   12,   12,   12,   12,   12,   12,
+
+       12,   12,   12,   12,   12,   12,   12,   12,   12,   12,
+       12,   12,   12,   12,   42,   18,   16,   12,   12,   12,
+       12,   12,   12,   12,   12,   12,   12,   12,   12,   12,
+       12,   12,   12,   12,   12,   12,   12,   12,   12,   15,
+       23,   15,   15,   15,   15,   15,   15,   27,   52,   15,
+       23,   31,   54,   31,   31,  712,   47,   43,   31,   50,
+       50,   47,   32,   42,   23,  708,   47,   27,   47,   47,
+       15,   58,   40,   47,   15,   15,   15,   15,   15,   15,
+       15,   15,   15,   15,   15,   15,   24,   32,   32,   32,
+       32,   32,   62,   54,   24,  707,   58,   40,   40,   27,
+
+       27,  158,   57,   32,   62,  149,   27,   40,   40,   43,
+       43,   40,   84,   84,   57,  158,   43,  701,   86,   24,
+       24,   24,   24,   24,   24,   24,   24,   24,   24,   24,
+       24,   28,   28,   28,   28,   28,   28,   28,   28,   28,
+       28,   28,   28,   28,   28,   28,   28,   49,   59,  128,
+       62,   28,   28,   28,   28,   33,   57,   49,   59,   49,
+      700,   34,   56,   36,   49,  351,   66,  351,   66,   66,
+       90,   90,   59,   66,  149,   56,   28,   28,   28,   86,
+       33,   33,  128,   33,   33,   33,   34,   34,   36,   36,
+       34,   34,   34,   37,   36,   36,   36,  349,   35,   44,
+
+       56,   28,   28,   29,  161,   29,   29,   29,   29,   29,
+       29,   35,  268,   44,   44,   44,   44,  161,   37,   37,
+       94,   94,   94,   35,   35,   37,   37,   37,   35,   35,
+       35,  163,  163,   39,   29,  416,   35,  416,   29,   29,
+       29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
+       30,   38,   89,   39,   89,  203,  203,   77,  349,   89,
+       30,  268,   77,   30,   30,   30,   30,   30,   44,   77,
+       76,   81,   81,   81,   81,  698,   38,   38,   39,   39,
+       39,  521,   76,  696,   38,   38,   38,   39,   39,   39,
+      521,   30,   97,   97,   97,   30,   30,   30,   30,   30,
+
+       30,   30,   30,   30,   30,   30,   30,   48,   48,   48,
+       76,   77,  204,  204,   48,  109,  109,  109,  109,   48,
+       48,   48,   48,   48,   48,   48,   48,  205,  205,  372,
+       48,   48,   48,   48,   48,   48,   48,   48,   48,   48,
+       48,   48,   48,   48,   48,   48,   48,   48,   48,   48,
+       48,  207,  207,  372,   48,   48,   48,   48,   48,   48,
+       48,   48,   48,   48,   48,   48,   48,   48,   48,   48,
+       48,   48,   48,   48,   48,   48,   51,   63,   68,   79,
+      154,   51,  251,   51,   51,   51,   51,   51,   51,  694,
+       79,   51,  154,   79,   79,   79,   79,   63,  112,  112,
+
+      112,  112,  156,   68,   68,  688,   68,   68,   68,  253,
+      156,  156,   51,   71,  156,  251,   51,   51,   51,   51,
+       51,   51,   51,   51,   51,   51,   51,   51,   60,   63,
+       63,   69,  394,   72,  112,   60,   63,  687,   71,   71,
+       60,  157,  159,   60,   71,   71,   71,   78,   79,  157,
+      159,  253,   78,  157,  159,  418,   69,   69,   72,   72,
+       69,   69,   69,   67,   78,   72,   72,   72,   60,   60,
+       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
+       64,  394,   64,   64,   64,   64,   64,   64,   67,   67,
+       67,   67,   67,   95,   95,   95,  162,  172,  182,   78,
+
+       78,  418,  200,  686,   67,   95,   78,   95,  162,  172,
+      182,   64,   95,   73,  200,   64,   64,   64,   64,   64,
+       64,   64,   64,   64,   64,   64,   64,   65,  111,  111,
+      111,  111,   70,  120,  120,  120,  120,   65,   73,   73,
+       65,   65,   65,   65,   65,   70,   73,   73,   73,   74,
+      200,  182,  117,  117,  117,  117,  172,   70,   70,  171,
+      111,  284,   70,   70,   70,  267,  284,  284,   65,   74,
+       70,  171,   65,   65,   65,   65,   65,   65,   65,   65,
+       65,   65,   65,   65,   75,  123,  123,  123,  123,  682,
+       85,  292,  292,  171,   74,   74,   74,   85,   85,   85,
+
+       85,   85,  117,   74,   74,   74,  201,  267,  679,   75,
+       75,  226,   99,  121,  121,  121,  121,  201,  371,   75,
+       75,  226,   99,   75,   99,  123,  336,  336,  226,   99,
+      104,  104,  104,  104,  104,  104,  104,  104,  104,  104,
+      104,  104,  106,  337,  337,  124,  124,  124,  124,  106,
+      136,  136,  136,  136,  142,  142,  142,  142,  144,  144,
+      144,  144,  121,  143,  143,  143,  143,  167,  167,  167,
+      167,  383,  373,  106,  569,  201,  371,  106,  106,  106,
+      106,  106,  106,  106,  106,  106,  106,  106,  106,  110,
+      124,  110,  151,  288,  144,  143,  373,  110,  288,  353,
+
+      173,  470,  110,  678,  383,  288,  151,  151,  151,  151,
+      151,  170,  173,  110,  385,  110,  169,  169,  169,  169,
+      384,  673,  110,  170,  569,  470,  110,  127,  127,  127,
+      127,  127,  127,  127,  127,  127,  127,  127,  127,  127,
+      127,  127,  127,  168,  168,  168,  168,  127,  127,  127,
+      127,  170,  169,  384,  176,  419,  385,  173,  672,  177,
+      353,  151,  174,  174,  174,  174,  176,  177,  177,  177,
+      177,  177,  127,  127,  127,  168,  178,  178,  178,  178,
+      197,  179,  243,  176,  180,  180,  180,  180,  181,  181,
+      181,  181,  197,  179,  671,  243,  243,  127,  127,  129,
+
+      129,  129,  129,  129,  290,  129,  129,  129,  129,  129,
+      129,  198,  174,  129,  129,  419,  290,  398,  188,  129,
+      129,  179,  129,  198,  180,  178,  188,  188,  188,  188,
+      188,  199,  355,  181,  194,  194,  194,  194,  197,  227,
+      227,  227,  227,  199,  129,  129,  355,  674,  196,  502,
+      502,  502,  195,  195,  195,  195,  196,  196,  196,  196,
+      196,  228,  228,  228,  228,  198,  398,  606,  606,  129,
+      129,  131,  131,  131,  131,  131,  131,  131,  131,  131,
+      131,  131,  131,  132,  195,  199,  229,  132,  231,  231,
+      231,  231,  196,  229,  132,  393,  132,  674,  132,  132,
+
+      132,  232,  232,  232,  232,  333,  484,  132,  308,  315,
+      132,  315,  622,  132,  132,  607,  333,  229,  132,  484,
+      308,  315,  132,  132,  132,  132,  132,  132,  132,  132,
+      132,  132,  132,  132,  670,  132,  622,  393,  132,  134,
+      134,  134,  134,  134,  134,  134,  134,  134,  134,  134,
+      134,  135,  233,  233,  233,  233,  308,  242,  135,  135,
+      135,  135,  208,  208,  135,  647,  135,  135,  135,  208,
+      208,  208,  208,  208,  333,  135,  209,  209,  135,  607,
+      242,  135,  135,  209,  209,  209,  209,  309,  289,  302,
+      135,  135,  135,  289,  135,  239,  239,  239,  239,  309,
+
+      135,  302,  667,  135,  242,  289,  135,  137,  137,  137,
+      137,  137,  137,  137,  137,  137,  137,  137,  137,  138,
+      262,  262,  262,  262,  666,  647,  138,  420,  261,  239,
+      249,  249,  249,  249,  261,  261,  261,  261,  309,  420,
+      294,  252,  252,  252,  252,  240,  240,  240,  240,  302,
+      138,  397,  503,  489,  138,  138,  138,  138,  138,  138,
+      138,  138,  138,  138,  138,  138,  140,  140,  140,  140,
+      140,  140,  140,  140,  140,  140,  140,  140,  141,  240,
+      249,  141,  141,  141,  141,  141,  252,  263,  269,  269,
+      269,  269,  294,  397,  263,  263,  263,  263,  272,  421,
+
+      263,  294,  489,  467,  272,  272,  272,  272,  617,  141,
+      503,  421,  479,  141,  141,  141,  141,  141,  141,  141,
+      141,  141,  141,  141,  141,  160,  160,  160,  467,  488,
+      263,  664,  160,  273,  273,  273,  273,  160,  160,  357,
+      160,  160,  160,  160,  160,  479,  357,  663,  160,  160,
+      160,  160,  160,  160,  160,  160,  160,  160,  160,  160,
+      160,  160,  160,  160,  160,  160,  160,  160,  160,  617,
+      357,  488,  160,  160,  160,  160,  160,  160,  160,  160,
+      160,  160,  160,  160,  160,  160,  160,  160,  160,  160,
+      160,  160,  160,  160,  164,  275,  275,  275,  275,  321,
+
+      321,  321,  321,  485,  274,  278,  164,  278,  278,  278,
+      278,  274,  274,  274,  274,  277,  485,  274,  295,  330,
+      306,  277,  277,  277,  277,  306,  295,  295,  295,  295,
+      295,  330,  306,  659,  164,  164,  164,  164,  164,  164,
+      164,  164,  164,  164,  164,  164,  165,  274,  283,  363,
+      291,  658,  570,  165,  278,  291,  363,  277,  675,  675,
+      298,  330,  283,  283,  283,  283,  304,  291,  298,  298,
+      298,  298,  298,  326,  326,  326,  326,  165,  304,  657,
+      363,  165,  165,  165,  165,  165,  165,  165,  165,  165,
+      165,  165,  165,  183,  183,  183,  183,  183,  183,  183,
+
+      183,  183,  183,  183,  183,  184,  570,  331,  629,  184,
+      304,  656,  331,  430,  305,  486,  184,  283,  184,  331,
+      184,  184,  184,  304,  304,  430,  305,  431,  486,  184,
+      417,  319,  184,  319,  654,  184,  184,  653,  417,  431,
+      184,  645,  417,  319,  184,  184,  184,  184,  184,  184,
+      184,  184,  184,  184,  184,  184,  431,  184,  305,  629,
+      184,  186,  186,  186,  186,  186,  186,  186,  186,  186,
+      186,  186,  186,  187,  187,  319,  358,  358,  358,  358,
+      428,  187,  187,  187,  187,  187,  644,  187,  320,  187,
+      187,  187,  428,  660,  320,  498,  504,  498,  187,  441,
+
+      320,  187,  498,  428,  187,  187,  364,  364,  364,  364,
+      300,  441,  432,  187,  187,  187,  332,  187,  300,  300,
+      300,  300,  300,  187,  432,  713,  187,  428,  332,  187,
+      189,  189,  189,  189,  189,  189,  189,  189,  189,  189,
+      189,  189,  190,  320,  714,  310,  450,  450,  638,  190,
+      660,  450,  300,  310,  310,  310,  310,  310,  432,  504,
+      301,  389,  389,  389,  389,  447,  715,  636,  301,  301,
+      301,  301,  301,  190,  332,  713,  447,  190,  190,  190,
+      190,  190,  190,  190,  190,  190,  190,  190,  190,  192,
+      192,  192,  192,  192,  192,  192,  192,  192,  192,  192,
+
+      192,  193,  301,  310,  193,  193,  193,  193,  193,  316,
+      303,  316,  661,  714,  317,  303,  635,  316,  316,  316,
+      316,  316,  317,  317,  317,  317,  317,  303,  386,  386,
+      386,  634,  193,  303,  447,  715,  193,  193,  193,  193,
+      193,  193,  193,  193,  193,  193,  193,  193,  234,  630,
+      324,  458,  324,  628,  646,  234,  325,  303,  324,  324,
+      324,  324,  324,  458,  325,  325,  325,  325,  325,  392,
+      354,  661,  627,  386,  354,  402,  402,  402,  402,  234,
+      626,  354,  392,  234,  234,  234,  234,  234,  234,  234,
+      234,  234,  234,  234,  234,  250,  250,  709,  250,  250,
+
+      250,  250,  250,  630,  250,  250,  250,  250,  646,  250,
+      250,  328,  392,  328,  395,  250,  250,  250,  250,  328,
+      328,  328,  328,  328,  329,  624,  495,  395,  623,  689,
+      329,  354,  329,  329,  329,  329,  329,  340,  340,  495,
+      250,  250,  250,  404,  340,  340,  340,  340,  407,  446,
+      407,  407,  407,  407,  709,  328,  404,  395,  621,  538,
+      250,  446,  568,  568,  568,  250,  250,  254,  254,  254,
+      254,  254,  538,  254,  254,  254,  254,  254,  254,  329,
+      689,  254,  254,  425,  409,  406,  404,  254,  254,  716,
+      254,  406,  406,  406,  406,  425,  426,  407,  409,  409,
+
+      409,  409,  427,  446,  411,  412,  433,  427,  426,  767,
+      639,  767,  254,  254,  411,  412,  411,  412,  433,  427,
+      424,  411,  412,  434,  439,  619,  439,  406,  424,  424,
+      424,  424,  424,  425,  639,  434,  439,  254,  254,  255,
+      459,  459,  459,  459,  618,  510,  426,  480,  480,  480,
+      433,  616,  255,  409,  255,  255,  255,  510,  716,  440,
+      427,  615,  610,  255,  515,  440,  255,  434,  439,  255,
+      255,  440,  483,  483,  483,  444,  515,  444,  255,  255,
+      255,  468,  255,  444,  444,  444,  444,  444,  255,  510,
+      605,  255,  480,  604,  255,  257,  257,  257,  257,  257,
+
+      257,  257,  257,  257,  257,  257,  257,  265,  506,  557,
+      557,  557,  468,  506,  440,  496,  515,  483,  519,  444,
+      265,  468,  265,  265,  265,  506,  602,  496,  507,  640,
+      519,  265,  731,  445,  265,  600,  468,  265,  265,  445,
+      507,  445,  445,  445,  445,  445,  265,  265,  265,  514,
+      265,  599,  598,  640,  557,  507,  265,  597,  770,  265,
+      770,  514,  265,  270,  270,  270,  270,  270,  270,  270,
+      270,  270,  270,  270,  270,  276,  508,  509,  516,  520,
+      507,  508,  276,  516,  496,  539,  540,  544,  445,  509,
+      520,  612,  518,  508,  518,  516,  554,  509,  539,  540,
+
+      544,  731,  514,  612,  518,  642,  276,  596,  595,  554,
+      276,  276,  276,  276,  276,  276,  276,  276,  276,  276,
+      276,  276,  296,  523,  523,  563,  571,  594,  571,  642,
+      523,  523,  523,  523,  296,  572,  593,  577,  571,  563,
+      563,  563,  563,  573,  574,  576,  592,  572,  520,  577,
+      591,  582,  582,  703,  589,  573,  574,  576,  582,  582,
+      582,  582,  296,  296,  296,  296,  296,  296,  296,  296,
+      296,  296,  296,  296,  299,  572,  573,  577,  620,  579,
+      611,  299,  603,  609,  650,  588,  587,  585,  613,  576,
+      579,  620,  611,  614,  563,  609,  603,  603,  603,  603,
+
+      613,  574,  576,  584,  614,  299,  583,  703,  650,  299,
+      299,  299,  299,  299,  299,  299,  299,  299,  299,  299,
+      299,  311,  311,  611,  311,  311,  311,  311,  311,  311,
+      311,  311,  311,  311,  633,  311,  311,  608,  632,  581,
+      609,  311,  311,  311,  311,  633,  613,  649,  579,  608,
+      632,  603,  651,  655,  652,  668,  662,  669,  665,  655,
+      668,  676,  614,  681,  651,  652,  311,  311,  311,  665,
+      608,  683,  697,  683,  649,  578,  681,  655,  684,  668,
+      575,  669,  632,  655,  662,  567,  311,  669,  566,  676,
+      565,  311,  311,  312,  312,  680,  697,  683,  649,  564,
+
+      684,  693,  684,  633,  706,  312,  680,  312,  662,  312,
+      312,  312,  693,  676,  690,  706,  691,  677,  312,  711,
+      562,  312,  559,  652,  312,  312,  555,  665,  553,  552,
+      711,  551,  550,  312,  312,  312,  549,  312,  548,  677,
+      547,  546,  690,  312,  691,  677,  312,  690,  705,  312,
+      313,  313,  313,  313,  313,  313,  313,  313,  313,  313,
+      313,  313,  318,  677,  680,  545,  690,  543,  691,  677,
+      693,  717,  718,  706,  691,  318,  705,  318,  318,  318,
+      704,  710,  717,  718,  719,  720,  318,  542,  711,  318,
+      541,  537,  318,  318,  536,  719,  720,  535,  705,  534,
+
+      705,  318,  318,  318,  533,  318,  704,  532,  704,  710,
+      531,  318,  530,  529,  318,  528,  527,  318,  322,  322,
+      322,  322,  322,  322,  322,  322,  322,  322,  322,  322,
+      327,  526,  704,  710,  525,  524,  721,  327,  722,  723,
+      717,  718,  517,  512,  724,  725,  726,  721,  727,  722,
+      723,  728,  729,  719,  720,  724,  725,  726,  501,  727,
+      500,  327,  728,  729,  499,  327,  327,  327,  327,  327,
+      327,  327,  327,  327,  327,  327,  327,  362,  362,  362,
+      362,  362,  362,  362,  362,  362,  362,  362,  362,  374,
+      374,  497,  374,  374,  374,  374,  374,  494,  374,  374,
+
+      374,  374,  492,  374,  374,  721,  491,  722,  723,  374,
+      374,  374,  374,  724,  725,  726,  730,  727,  487,  482,
+      728,  729,  478,  477,  476,  472,  471,  730,  469,  466,
+      465,  464,  463,  462,  374,  374,  374,  457,  456,  455,
+      454,  374,  453,  452,  451,  449,  448,  436,  423,  415,
+      414,  413,  410,  408,  374,  374,  400,  399,  396,  374,
+      374,  381,  381,  388,  381,  381,  381,  381,  381,  387,
+      381,  381,  381,  381,  379,  381,  381,  378,  377,  376,
+      370,  381,  381,  381,  381,  730,  369,  368,  367,  366,
+      365,  352,  350,  348,  347,  346,  345,  344,  343,  342,
+
+      341,  338,  334,  323,  314,  297,  381,  381,  381,  293,
+      287,  285,  281,  280,  279,  266,  260,  259,  248,  247,
+      245,  244,  241,  238,  237,  236,  235,  225,  224,  223,
+      222,  381,  381,  382,  382,  221,  382,  382,  382,  382,
+      382,  218,  382,  382,  382,  382,  217,  382,  382,  216,
+      215,  214,  213,  382,  382,  382,  382,  211,  210,  206,
+      202,  191,  185,  175,  166,  155,  153,  152,  150,  148,
+      147,  146,  145,  126,  125,  122,  119,  118,  382,  382,
+      382,  116,  115,  114,  113,  102,  100,   96,   93,   92,
+       91,   88,   83,   80,   61,   55,   53,   45,   41,   26,
+
+       25,   21,   19,  382,  382,  391,   17,   14,    9,    3,
+        0,    0,    0,    0,    0,    0,    0,    0,  391,    0,
+      391,  391,  391,    0,    0,    0,    0,    0,    0,  391,
+        0,    0,  391,    0,    0,  391,  391,    0,    0,    0,
+        0,    0,    0,    0,  391,  391,  391,    0,    0,    0,
+        0,    0,    0,    0,  391,    0,    0,  391,    0,    0,
+      391,  405,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  405,    0,  405,  405,  405,    0,
+        0,    0,    0,    0,    0,  405,    0,    0,  405,    0,
+        0,  405,  405,    0,    0,    0,    0,    0,    0,    0,
+
+      405,  405,  405,    0,  405,    0,    0,    0,    0,    0,
+      405,    0,    0,  405,    0,    0,  405,  422,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  422,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  422,  422,  422,
+      422,  422,  422,  422,  422,  422,  422,  422,  422,  429,
+      429,    0,  429,  429,  429,  429,  429,  429,  429,  429,
+      429,  429,    0,  429,  429,    0,    0,    0,    0,  429,
+      429,  429,  429,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  429,  429,  429,    0,    0,    0,
+        0,  429,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  429,  429,    0,    0,    0,  429,
+      429,  435,  435,    0,  435,  435,  435,  435,  435,  435,
+      435,  435,  435,  435,    0,  435,  435,    0,    0,    0,
+        0,  435,  435,  435,  435,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  435,  435,  435,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  435,  435,  437,  437,    0,  437,  437,  437,  437,
+      437,  437,  437,  437,  437,  437,    0,  437,  437,    0,
+        0,    0,    0,  437,  437,  437,  437,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  437,  437,
+      437,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,  437,  437,  438,  438,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  438,    0,  438,
+
+        0,  438,  438,  438,    0,    0,    0,    0,    0,    0,
+      438,    0,    0,  438,    0,    0,  438,  438,    0,    0,
+        0,    0,    0,    0,    0,  438,  438,  438,    0,    0,
+        0,    0,    0,    0,    0,  438,    0,    0,  438,    0,
+        0,  438,  443,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  443,    0,  443,  443,  443,
+        0,    0,    0,    0,    0,    0,  443,    0,    0,  443,
+        0,    0,  443,  443,    0,    0,    0,    0,    0,    0,
+        0,  443,  443,  443,    0,  443,    0,    0,    0,    0,
+        0,  443,    0,    0,  443,    0,    0,  443,  461,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  461,    0,  461,  461,  461,    0,    0,    0,    0,
+        0,    0,  461,    0,    0,  461,    0,    0,  461,  461,
+        0,    0,    0,    0,    0,    0,    0,  461,  461,  461,
+        0,    0,    0,    0,    0,    0,    0,  461,    0,    0,
+      461,    0,    0,  461,  474,  474,    0,  474,  474,  474,
+      474,  474,    0,  474,  474,  474,  474,    0,  474,  474,
+        0,    0,    0,    0,  474,  474,  474,  474,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  474,
+
+      474,  474,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  474,  474,  475,  475,    0,  475,
+      475,  475,  475,  475,    0,  475,  475,  475,  475,    0,
+      475,  475,    0,    0,    0,    0,  475,  475,  475,  475,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  475,  475,  475,    0,    0,    0,    0,  475,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  475,  475,    0,    0,    0,  475,  475,  505,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  505,    0,  505,  505,  505,    0,    0,    0,    0,
+        0,    0,  505,    0,    0,  505,    0,    0,  505,  505,
+        0,    0,    0,    0,    0,    0,    0,  505,  505,  505,
+        0,    0,    0,    0,    0,    0,    0,  505,    0,    0,
+      505,    0,    0,  505,  511,  511,    0,  511,  511,  511,
+      511,  511,  511,  511,  511,  511,  511,    0,  511,  511,
+        0,    0,    0,    0,  511,  511,  511,  511,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  511,
+
+      511,  511,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  511,  511,  513,  513,    0,  513,
+      513,  513,  513,  513,  513,  513,  513,  513,  513,    0,
+      513,  513,    0,    0,    0,    0,  513,  513,  513,  513,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  513,  513,  513,    0,    0,    0,    0,  513,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  513,  513,    0,    0,    0,  513,  513,  625,  625,
+
+        0,  625,  625,  625,  625,  625,    0,  625,  625,  625,
+      625,    0,  625,  625,    0,    0,    0,    0,  625,  625,
+      625,  625,    0,    0,    0,    0,    0,    0,  625,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,  625,  625,  625,    0,    0,    0,    0,
+        0,    0,  625,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  625,  625,
+      631,  631,    0,  631,  631,  631,  631,  631,  631,  631,
+      631,  631,  631,    0,  631,  631,    0,    0,    0,    0,
+      631,  631,  631,  631,    0,    0,    0,    0,    0,    0,
+
+      631,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  631,  631,  631,    0,    0,
+        0,    0,    0,    0,  631,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+      631,  631,  641,  641,    0,  641,  641,  641,  641,  641,
+        0,  641,  641,  641,  641,    0,  641,  641,    0,    0,
+        0,    0,  641,  641,  641,  641,    0,    0,    0,    0,
+        0,    0,  641,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,  641,  641,  641,
+        0,    0,    0,    0,    0,    0,  641,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  641,  641,  648,  648,    0,  648,  648,  648,
+      648,  648,  648,  648,  648,  648,  648,    0,  648,  648,
+        0,    0,    0,    0,  648,  648,  648,  648,    0,    0,
+        0,    0,    0,    0,  648,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  648,
+      648,  648,    0,    0,    0,    0,    0,    0,  648,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  648,  648,  735,    0,    0,  735,
+      735,    0,    0,  735,  735,  735,  735,  735,  736,  736,
+
+      736,  736,  736,    0,  736,  736,  736,  736,  736,  736,
+      736,  736,  736,  737,  737,  737,  737,  737,  737,  737,
+      737,  737,  737,  737,  737,  737,  737,  737,  738,  738,
+      738,  738,  738,  738,  738,  738,  738,  738,  738,  738,
+      738,  738,  738,  739,  739,  739,  739,  739,  739,  739,
+      739,  739,  739,  739,  739,  739,  739,  739,  740,    0,
+        0,  740,  740,  740,    0,  740,  740,  740,  740,  740,
+      741,  741,  741,  741,  741,    0,  741,  741,  741,  741,
+      741,  741,  741,  741,  741,  742,  742,  742,  742,  742,
+      742,  742,  742,  742,  742,  742,  742,  742,  742,  742,
+
+      743,  743,    0,    0,    0,    0,    0,    0,    0,  743,
+      743,  743,  743,  743,  744,  744,  744,  745,  745,  745,
+      746,  746,  746,  747,  747,  747,  747,  747,  747,  747,
+      747,  747,  747,  747,  747,  747,  747,  747,  748,  748,
+      748,  748,  748,  748,  748,  748,  748,  748,  748,  748,
+      748,  748,  748,  749,  749,  749,  750,  750,  750,  751,
+      751,  751,  751,  751,  751,  751,  751,  751,  751,  751,
+      751,  751,  751,  751,  752,  752,  752,  752,  752,  752,
+      752,  752,  752,  752,  752,  752,  752,  752,  752,  753,
+        0,    0,  753,  753,  753,    0,  753,  753,  753,  753,
+
+      753,  754,  754,  754,  754,  754,  754,  754,  754,  754,
+      754,  754,  754,  754,  754,  754,  755,  755,  755,  755,
+      755,  755,  755,  755,  755,  755,  755,  755,  755,  755,
+      755,  756,  756,  756,  756,  756,  756,  756,  756,  756,
+      756,  756,  756,  756,  756,  756,  757,  757,  757,  757,
+      757,  757,  757,  757,  757,  757,  757,  757,  757,  757,
+      757,  758,  758,  758,  758,  758,  758,  758,  758,  758,
+      758,  758,  758,  758,  758,  758,  759,  759,    0,  759,
+      759,  759,  759,  759,  759,  759,  759,  759,  759,  759,
+      759,  760,  760,    0,  760,  760,  760,  760,  760,  760,
+
+      760,  760,  760,  760,  760,  760,  761,  761,  761,  762,
+      762,    0,  762,  762,  762,  762,  762,  762,  762,  762,
+      762,  762,  762,  762,  763,  763,  763,  763,  763,  763,
+      763,  763,  763,  763,  763,  763,  763,  763,  763,  764,
+      764,  764,  764,  764,  764,  764,  764,  764,  764,  764,
+      764,  764,  764,  764,  765,  765,  765,  765,  765,  765,
+      765,  765,  765,  765,  765,  765,  765,  765,  765,  766,
+      766,  766,  766,  766,  766,  766,  766,  766,  766,  766,
+      766,  766,  766,  766,  768,  768,  768,  769,    0,    0,
+      769,    0,  769,  769,    0,  769,    0,  769,  771,  771,
+
+      771,  772,  772,  772,  772,  772,  772,  772,  772,  772,
+      772,  772,  772,  772,  772,  772,  773,  773,  773,  773,
+      773,  773,  773,  773,  773,  773,  773,  773,  773,  773,
+      773,  774,    0,    0,  774,  774,  774,    0,  774,  774,
+      774,  774,  774,  775,  775,  775,  775,  775,  775,  775,
+      775,  775,  775,  775,  775,  775,  775,  775,  776,  776,
+      776,  776,  776,  776,  776,  776,  776,  776,  776,  776,
+      776,  776,  776,  777,  777,    0,  777,  777,  777,  777,
+      777,  777,  777,  777,  777,  777,  777,  777,  778,  778,
+      778,  778,  778,  778,  778,  778,  778,  778,  778,  778,
+
+      778,  778,  778,  779,  779,  779,  779,    0,  779,  779,
+      779,  779,  779,  779,  779,  779,  779,  779,  780,  780,
+      780,  780,  780,  780,  780,  780,  780,  780,  780,  780,
+      780,  780,  780,  781,  781,    0,  781,  781,  781,  781,
+      781,  781,  781,  781,  781,  781,  781,  781,  782,  782,
+        0,  782,  782,  782,  782,  782,  782,  782,  782,  782,
+      782,  782,  782,  783,    0,  783,    0,    0,    0,  783,
+      783,  783,  784,  784,    0,  784,  784,  784,  784,  784,
+      784,  784,  784,  784,  784,  784,  784,  785,  785,    0,
+      785,  785,  785,  785,  785,  785,  785,  785,  785,  785,
+
+      785,  785,  786,  786,    0,  786,  786,  786,  786,  786,
+      786,  786,  786,  786,  786,  786,  786,  787,  787,  787,
+      787,  787,  787,  787,  787,  787,  787,  787,  787,  787,
+      787,  787,  788,  788,  788,  788,  788,  788,  788,  788,
+      788,  788,  788,  788,  788,  788,  788,  789,  789,  789,
+      789,  789,  789,  789,  789,  789,  789,  789,  789,  789,
+      789,  789,  790,  790,  790,  790,  790,  790,  790,  790,
+      790,  790,  790,  790,  790,  790,  790,  791,    0,    0,
+        0,    0,  791,  791,    0,  791,    0,  791,  792,  792,
+      792,  792,  792,  792,  792,  792,  792,  792,  792,  792,
+
+      792,  792,  792,  793,  793,  793,  793,  793,  793,  793,
+      793,  793,  793,  793,  793,  793,  793,  793,  794,  794,
+        0,  794,  794,  794,  794,  794,  794,  794,  794,  794,
+      794,  794,  794,  795,  795,    0,  795,  795,  795,  795,
+      795,  795,  795,  795,  795,  795,  795,  795,  796,  796,
+      796,  796,    0,  796,  796,  796,  796,  796,  796,  796,
+      796,  796,  796,  797,  797,  797,  797,  797,  797,  797,
+      797,  797,  797,  797,  797,  797,  797,  797,  798,  798,
+        0,  798,  798,  798,  798,  798,  798,  798,  798,  798,
+      798,  798,  798,  799,  799,    0,  799,  799,  799,  799,
+
+      799,  799,  799,  799,  799,  799,  799,  799,  800,  800,
+        0,  800,  800,  800,  800,  800,  800,  800,  800,  800,
+      800,  800,  800,  801,  801,    0,  801,  801,  801,  801,
+      801,  801,  801,  801,  801,  801,  801,  801,  802,  802,
+        0,  802,  802,  802,  802,  802,  802,  802,  802,  802,
+      802,  802,  802,  803,  803,    0,  803,  803,  803,  803,
+      803,  803,  803,  803,  803,  803,  803,  803,  804,  804,
+        0,  804,  804,  804,  804,  804,  804,  804,  804,  804,
+      804,  804,  804,  805,  805,    0,  805,  805,  805,  805,
+      805,  805,  805,  805,  805,  805,  805,  805,  806,  806,
+
+      806,  806,  806,  806,  806,  806,  806,  806,  806,  806,
+      806,  806,  806,  807,  807,  807,  807,  807,  807,  807,
+      807,  807,  807,  807,  807,  807,  807,  807,  808,  808,
+      808,  808,  808,  808,  808,  808,  808,  808,  808,  808,
+      808,  808,  808,  809,    0,    0,    0,    0,  809,  809,
+        0,  809,  810,  810,  810,  810,  810,  810,  810,  810,
+      810,  810,  810,  810,  810,  810,  810,  811,  811,  811,
+      811,  811,  811,  811,  811,  811,  811,  811,  811,  811,
+      811,  811,  812,  812,    0,  812,  812,  812,  812,  812,
+      812,  812,  812,  812,  812,  812,  812,  813,  813,  813,
+
+      813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
+      813,  813,  814,    0,    0,    0,    0,  814,  814,    0,
+      814,  815,  815,    0,  815,  815,  815,  815,  815,  815,
+      815,  815,  815,  815,  815,  815,  816,  816,  816,  816,
+      816,  816,  816,  816,  816,  816,  816,  816,  816,  816,
+      816,  817,  817,    0,  817,  817,  817,  817,  817,  817,
+      817,  817,  817,  817,  817,  817,  818,  818,    0,  818,
+      818,  818,  818,  818,  818,  818,  818,  818,  818,  818,
+      818,  819,  819,    0,  819,  819,  819,  819,  819,  819,
+      819,  819,  819,  819,  819,  819,  820,  820,  820,  820,
+
+      820,  820,  820,  820,  820,  820,  820,  820,  820,  820,
+      820,  821,  821,  821,  821,  821,  821,  821,  821,  821,
+      821,  821,  821,  821,  821,  821,  822,  822,  822,  822,
+      822,  822,  822,  822,  822,  822,  822,  822,  822,  822,
+      822,  823,  823,  823,  823,  823,  823,  823,  823,  823,
+      823,  823,  823,  823,  823,  823,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734,  734,
+      734,  734,  734,  734,  734,  734,  734,  734,  734
+    } ;
+
+static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr;
+static char *yy_full_match;
+static int yy_lp;
+static int yy_looking_for_trail_begin = 0;
+static int yy_full_lp;
+static int *yy_full_state;
+#define YY_TRAILING_MASK 0x2000
+#define YY_TRAILING_HEAD_MASK 0x4000
+#define REJECT \
+{ \
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \
+yy_cp = yy_full_match; /* restore poss. backed-over text */ \
+yy_lp = yy_full_lp; /* restore orig. accepting pos. */ \
+yy_state_ptr = yy_full_state; /* restore orig. state */ \
+yy_current_state = *yy_state_ptr; /* restore curr. state */ \
+++yy_lp; \
+goto find_rule; \
+}
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#define INITIAL 0
+/*
+ * parser.l -- lex parser of algebraic chess moves for XBoard
+ * $Id: parser.l,v 2.1 2003/10/27 19:21:00 mann Exp $