// TO DO: make it check the environment and do something
// sensible if invoked from the command line.  (I.e. don't just crash)

// Add an option for loading .gcg files such as http://web.mit.edu/abader/Public/scrabble/find_treys_move.gcg

/*
 allmoves.cgi to generate moves
 - initial half ply

global to estimate average response to play
 - equivalent to 1 full ply

evaluate *our* response given held tiles. (null-move heuristic)
 - gives value of leave
*/

// this is UNSUPPORTED code to provide a front-end to findmoves.c
// I strongly recommend a rewrite, but I'm putting it online as
// a help to anyone who wants to hook these engines into a web site...
// - graham toal 13Jul03
//
// The master is /usr/local/apache2/cgi-src/bsdi/, and the
// variation on this file, "allmoves-latin1.c" is a work-in-progress
// to make it more 8-bit clean.
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <ctype.h>
#include "cgi_c/www.h"

#define TRUE (0==0)
#define FALSE (0!=0)

static char saved[15][15];
static char rack1[7];
/*static char rack2[7];*/
static int score = 0;
static int remaining = 0;
static long thisrand = 10000L;
#define DEFDICT "sowpods"
static char *dict = DEFDICT;

const char *dicts[] = {
"twl98", "sowpods", "osw", "ospd",
"afrikaans", "french", "italian", "malaysian", "romanian",
/* only foreign languages which use A-Z for now... */
NULL
};

const char premium[6] = {
/*  "star", "empty", "double", "triplet", "doublwrd", "triplwrd"*/
/*  "dws", "sq", "dls", "tls", "dws", "tws" */
'+', '.', '-', '=', '+', '#'
};

const int premiums[15][15] = {
{5,1,1,2,1,1,1,5,1,1,1,2,1,1,5},
{1,4,1,1,1,3,1,1,1,3,1,1,1,4,1},
{1,1,4,1,1,1,2,1,2,1,1,1,4,1,1},
{2,1,1,4,1,1,1,2,1,1,1,4,1,1,2},
{1,1,1,1,4,1,1,1,1,1,4,1,1,1,1},
{1,3,1,1,1,3,1,1,1,3,1,1,1,3,1},
{1,1,2,1,1,1,2,1,2,1,1,1,2,1,1},
{5,1,1,2,1,1,1,0,1,1,1,2,1,1,5},
{1,1,2,1,1,1,2,1,2,1,1,1,2,1,1},
{1,3,1,1,1,3,1,1,1,3,1,1,1,3,1},
{1,1,1,1,4,1,1,1,1,1,4,1,1,1,1},
{2,1,1,4,1,1,1,2,1,1,1,4,1,1,2},
{1,1,4,1,1,1,2,1,2,1,1,1,4,1,1},
{1,4,1,1,1,3,1,1,1,3,1,1,1,4,1},
{5,1,1,2,1,1,1,5,1,1,1,2,1,1,5}
};

char *safedict(char *s)
{
  int i = 0;
  for (;;) {
    if (dicts[i] == NULL) break;
    if (strcmp(dicts[i], s) == 0) return(s);
    i += 1;
  }
  return(DEFDICT);
}

long getseq(void)
{
  int rc;
  long seq = 10000L;
  FILE *seqfile = fopen("/home/gtoal/gtoal.com/wordgames/boardgen/SEQNO", "r");

  if (seqfile == NULL) {
    return(random() & 65535L);
  } else {
    /* read seq from file */
    rc = fscanf(seqfile, "%ld", &seq);
    fclose(seqfile);
    seqfile = fopen("/home/gtoal/gtoal.com/wordgames/boardgen/SEQNO", "w");
    /* write seq to file */
    fprintf(seqfile, "%0ld\n", seq+1L);
    fclose(seqfile);
    if (rc == 1) {
      return(seq);
    } else return(random() & 65535L);
  }
}

void generate_graphic(char saved[15][15], char *format)
{
  int x,y;
  int pass;
  FILE *outf, *commfile;
  char *NL, *GT, *LT;
  char *path = "/usr/local/bin/";

  remove("/home/gtoal/tmp/SCRABBLEBOARD");
  commfile = fopen("/home/gtoal/tmp/SCRABBLEBOARD", "w");
  if (commfile == NULL) {
    fprintf(stdout, "ERROR: Cannot generate script file /home/gtoal/tmp/SCRABBLEBOARD - %s<BR>\n",
      strerror(errno));
    return;
  }
  thisrand = getseq();
  for (pass = 1; pass >= 0; --pass) {
    if (pass == 0) {
      NL = "<BR>";
      GT = "&gt;";
      LT = "&lt;";
      outf = stdout;
    } else {
      NL = "";
      GT = ">";
      LT = "<";
      outf = commfile;
    }
    if (pass == 0) fprintf(outf, "<!--\n");
    fprintf(outf, "#!/bin/sh%s\n", NL);
    fprintf(outf, "cd /home/gtoal/gtoal.com/wordgames/in-progress/png\n");
    fprintf(outf, "cat %s /home/gtoal/gtoal.com/wordgames/boardgen/temp/wsc_%0ld.dat %s%sEOD%s\n", GT, thisrand, LT, LT, NL);
    for (y = 0; y < 15; y++) {
      for (x = 0; x < 15; x++) {
        if (isalpha(saved[x][y])) {
          if (islower(saved[x][y])) {
            fprintf(outf, "%c", toupper(saved[x][y]));
	  } else {
            fprintf(outf, "%c", tolower(saved[x][y]));
	  }
        } else {
          fprintf(outf, "%c", premium[premiums[x][y]]);
        }
      }
      fprintf(outf, "%s\n", NL);
    }

    for (x = 0; x < 7; x++) {
      if (isalpha(rack1[x])) {
        fprintf(outf, "%c", toupper(rack1[x]));
      } else if (rack1[x] == '?') {
        fprintf(outf, "*");
      } else if (rack1[x] == ' ') {
        fprintf(outf, "?");
      }
    }

/***
    fprintf(outf, "?");

    for (x = 0; x < 7; x++) {
      if (isalpha(rack2[x])) {
        fprintf(outf, "%c", toupper(rack2[x]));
      } else if (rack2[x] == '?') {
        fprintf(outf, "_");
      } else if (rack2[x] == ' ') {
      }
    }
***/

    /* Add score and tiles left (0 prints as nothing) */

    fprintf(outf, " %d %d%s\n", score, remaining, NL);
    fprintf(outf, "EOD%s\n", NL);
    fprintf(outf,
      "./wsc_png /home/gtoal/gtoal.com/wordgames/boardgen/temp/wsc_%0ld.dat /home/gtoal/gtoal.com/wordgames/boardgen/temp/wsc_%0ld.png %s\n",
      thisrand, thisrand, NL);
      /* Find all plays! */

    /* print board */
    if (pass == 0) {
      char command[1024];
      fprintf(stdout, "\n-->\n<IMG SRC='/wordgames/boardgen/temp/wsc_%0ld.png'>%s\n", thisrand, NL);
      fprintf(stdout, "<H2>Here are all the possible plays on this board:</H2>\n<PRE>");
      fflush(stdout);
      sprintf(command,
        "/home/gtoal/gtoal.com/wordgames/scrabble_solver/findmoves /home/gtoal/gtoal.com/wordgames/boardgen/temp/wsc_%0ld.dat %s",
        thisrand, safedict(dict));
      system(command);
      fflush(stdout);
      fprintf(stdout, "\n - executed by %s\n", command);
      fprintf(stdout, "</PRE>\n");
      fprintf(stdout,
        "You can bookmark these results at <A HREF=\"http://www.gtoal.com/cgi-bin/allmoves.cgi?savedgame=%0ld\">http://www.gtoal.com/cgi-bin/allmoves.cgi?savedgame=%0ld</A><BR>\n",
        thisrand, thisrand);
      fflush(stdout);
    }

    fflush(outf);
    if (pass == 1) {
      char cline[256];
      fclose(commfile);
      /* Execute the batch file now */
      fprintf(stdout, "\n<PRE>\n");
      fflush(stdout);
      remove("/home/gtoal/tmp/SCRABBLELOG");
      system("/bin/chmod +x /home/gtoal/tmp/SCRABBLEBOARD");
      system("/bin/sh -x < /home/gtoal/tmp/SCRABBLEBOARD > /home/gtoal/tmp/SCRABBLELOG 2>&1");
      system("/bin/chmod 777 /home/gtoal/tmp/SCRABBLELOG");
      sprintf(cline, "/bin/rm /home/gtoal/gtoal.com/wordgames/boardgen/temp/sc%0ld-*.pnm", thisrand);
/*      system(cline);*/
      sprintf(cline, "/bin/rm /home/gtoal/gtoal.com/wordgames/boardgen/temp/ra%0ld*.pnm", thisrand);
/*      system(cline);*/
      fflush(stdout);
      fprintf(stdout, "\n</PRE>\n");
      fflush(stdout);
    }
  }
}

void dumpargs(stringArray name, stringArray value, int num)
{
  int i;
  char *s;

  fprintf(stdout, "<H1>CGI FORM test script reports:</H1>\n");
  fprintf(stdout, "The following %d name/value pairs are submitted<p>\n",num);
  fprintf(stdout, "<ul>\n");
  for(i=0; i < num; i++)
    fprintf(stdout, "<li> <code>%s = %s</code>\n",name[i],value[i]);
  fprintf(stdout, "</ul>\n");
}

void cgi_bin(int argc, char **argv)
{
  int t, r, c, i, num;
  char tile[128];

  char *board, *s, *oldboard, *startline;
  char urls[1024], *url;
  char *line[128];
  int lines = 0;
  int startrow, startcol;
  int Found = FALSE;

  char *format;
  stringArray name;  /* name[i]  is a string of char with a passed name */
  stringArray value; /* value[i] is a string of char with a passed value */


  tile[0] = '\0';

  num = getnamevalue(&name, &value);

  if (strcasecmp(getenv("REQUEST_METHOD"), "GET") == 0) {

  for (i = 0; i < num; i++) {
    if ((name[i] != NULL) && (strcasecmp(name[i], "savedgame")) == 0) {
      /* file number is in 'value[i]' */
      if (value[i] != NULL) {
        char command[1024];
        int fnum;

        if (isdigit(value[i][0])) fnum = (int)atol(value[i]); else break;
        /* display saved game and exit */

        fprintf(stdout, "Content-type: text/html\n");
        fprintf(stdout, "\n");
        fprintf(stdout, "<HTML><HEAD><TITLE>Scrabble Move Generator</TITLE></HEAD><BODY BGCOLOR='#FFFFFF'>\n");
        fprintf(stdout, "\n");
        fprintf(stdout, "<IMG SRC='http://www.gtoal.com/wordgames/boardgen/temp/wsc_%0d.png'>\n", fnum);
        fprintf(stdout, "<H2>Here are all the possible plays on this board:</H2>\n<PRE>");
        fflush(stdout);
        sprintf(command,
          "/home/gtoal/gtoal.com/wordgames/scrabble_solver/findmoves /home/gtoal/gtoal.com/wordgames/boardgen/temp/wsc_%0d.dat %s",
          fnum, "sowpods"); /* Hack */
        system(command);
        fflush(stdout);
        fprintf(stdout, "</PRE>\n"); fflush(stdout);

        exit(0);
      }
    }
  }

  fprintf(stdout, "Content-type: text/html\n");
  fprintf(stdout, "\n");

  fprintf(stdout, "<HTML><HEAD><TITLE>Scrabble Move Generator</TITLE></HEAD><BODY BGCOLOR='#FFFFFF'>\n");
  fprintf(stdout, "\n");
  fprintf(stdout, "<FORM ACTION='/cgi-bin/allmoves.cgi' METHOD='POST'>\n");
  //  fprintf(stdout, "Enter your Scrabble position and I'll generate all the possible moves using ");
  fprintf(stdout, "It's your turn.  Enter your tiles and I'll work out the possible moves and likely replies.<BR><BR><BR>\n");

  fprintf(stdout, "<input name=\"dict\" type=\"hidden\" value=\"sowpods\">");

  //fprintf(stdout, "<select name=\"dict\"><option>twl98<option selected>sowpods<option>osw<option>ospd");
  //fprintf(stdout, "<option>afrikaans<option>french<option>italian<option>romanian</select>");
  //fprintf(stdout, ".<BR><BR>\n");
  fprintf(stdout, "Enter your rack here:<BR>\n");
  fprintf(stdout, "<select name=\"R0\" size=\"1\"><option>a<option>b<option>c<option>d<option>e<option>f<option>g<option>h<option>i<option>j<option>k<option>l<option>m<option>n<option>o<option>p<option>q<option>r<option>s<option>t<option>u<option>v<option>w<option>x<option>y<option>z<option>BLANK<option selected>No tile</SELECT>");
  fprintf(stdout, "<select name=\"R1\" size=\"1\"><option>a<option>b<option>c<option>d<option>e<option>f<option>g<option>h<option>i<option>j<option>k<option>l<option>m<option>n<option>o<option>p<option>q<option>r<option>s<option>t<option>u<option>v<option>w<option>x<option>y<option>z<option>BLANK<option selected>No tile</SELECT>");
  fprintf(stdout, "<select name=\"R2\" size=\"1\"><option>a<option>b<option>c<option>d<option>e<option>f<option>g<option>h<option>i<option>j<option>k<option>l<option>m<option>n<option>o<option>p<option>q<option>r<option>s<option>t<option>u<option>v<option>w<option>x<option>y<option>z<option>BLANK<option selected>No tile</SELECT>");
  fprintf(stdout, "<select name=\"R3\" size=\"1\"><option>a<option>b<option>c<option>d<option>e<option>f<option>g<option>h<option>i<option>j<option>k<option>l<option>m<option>n<option>o<option>p<option>q<option>r<option>s<option>t<option>u<option>v<option>w<option>x<option>y<option>z<option>BLANK<option selected>No tile</SELECT>");
  fprintf(stdout, "<select name=\"R4\" size=\"1\"><option>a<option>b<option>c<option>d<option>e<option>f<option>g<option>h<option>i<option>j<option>k<option>l<option>m<option>n<option>o<option>p<option>q<option>r<option>s<option>t<option>u<option>v<option>w<option>x<option>y<option>z<option>BLANK<option selected>No tile</SELECT>");
  fprintf(stdout, "<select name=\"R5\" size=\"1\"><option>a<option>b<option>c<option>d<option>e<option>f<option>g<option>h<option>i<option>j<option>k<option>l<option>m<option>n<option>o<option>p<option>q<option>r<option>s<option>t<option>u<option>v<option>w<option>x<option>y<option>z<option>BLANK<option selected>No tile</SELECT>");
  fprintf(stdout, "<select name=\"R6\" size=\"1\"><option>a<option>b<option>c<option>d<option>e<option>f<option>g<option>h<option>i<option>j<option>k<option>l<option>m<option>n<option>o<option>p<option>q<option>r<option>s<option>t<option>u<option>v<option>w<option>x<option>y<option>z<option>BLANK<option selected>No tile</select><br>\n");
  fprintf(stdout, "\n");
#ifdef NEVER
  fprintf(stdout, "Enter Player 2's rack here:<BR>\n");
  fprintf(stdout, "<select name=\"S0\" size=\"1\"><option>a<option>b<option>c<option>d<option>e<option>f<option>g<option>h<option>i<option>j<option>k<option>l<option>m<option>n<option>o<option>p<option>q<option>r<option>s<option>t<option>u<option>v<option>w<option>x<option>y<option>z<option>BLANK<option selected>No tile</SELECT>");
  fprintf(stdout, "<select name=\"S1\" size=\"1\"><option>a<option>b<option>c<option>d<option>e<option>f<option>g<option>h<option>i<option>j<option>k<option>l<option>m<option>n<option>o<option>p<option>q<option>r<option>s<option>t<option>u<option>v<option>w<option>x<option>y<option>z<option>BLANK<option selected>No tile</SELECT>");
  fprintf(stdout, "<select name=\"S2\" size=\"1\"><option>a<option>b<option>c<option>d<option>e<option>f<option>g<option>h<option>i<option>j<option>k<option>l<option>m<option>n<option>o<option>p<option>q<option>r<option>s<option>t<option>u<option>v<option>w<option>x<option>y<option>z<option>BLANK<option selected>No tile</SELECT>");
  fprintf(stdout, "<select name=\"S3\" size=\"1\"><option>a<option>b<option>c<option>d<option>e<option>f<option>g<option>h<option>i<option>j<option>k<option>l<option>m<option>n<option>o<option>p<option>q<option>r<option>s<option>t<option>u<option>v<option>w<option>x<option>y<option>z<option>BLANK<option selected>No tile</SELECT>");
  fprintf(stdout, "<select name=\"S4\" size=\"1\"><option>a<option>b<option>c<option>d<option>e<option>f<option>g<option>h<option>i<option>j<option>k<option>l<option>m<option>n<option>o<option>p<option>q<option>r<option>s<option>t<option>u<option>v<option>w<option>x<option>y<option>z<option>BLANK<option selected>No tile</SELECT>");
  fprintf(stdout, "<select name=\"S5\" size=\"1\"><option>a<option>b<option>c<option>d<option>e<option>f<option>g<option>h<option>i<option>j<option>k<option>l<option>m<option>n<option>o<option>p<option>q<option>r<option>s<option>t<option>u<option>v<option>w<option>x<option>y<option>z<option>BLANK<option selected>No tile</SELECT>");
  fprintf(stdout, "<select name=\"S6\" size=\"1\"><option>a<option>b<option>c<option>d<option>e<option>f<option>g<option>h<option>i<option>j<option>k<option>l<option>m<option>n<option>o<option>p<option>q<option>r<option>s<option>t<option>u<option>v<option>w<option>x<option>y<option>z<option>BLANK<option selected>No tile</select><br>\n");
  fprintf(stdout, "\n");
#endif
  fprintf(stdout, "Score: <INPUT NAME=score VALUE=\"\"><BR>\n");
  fprintf(stdout, "Number of tiles left: <INPUT NAME=remaining VALUE=\"\"><BR>\n");
  fprintf(stdout, "\n");
  fprintf(stdout, "<TABLE BORDER Align='center'>\n");
  fprintf(stdout, "\n");
  fprintf(stdout, "Enter this play in <em>lower case</em>.  Enter blanks in UPPER CASE.\n");
  fprintf(stdout, "\n");
  fprintf(stdout, "<TR Align='center'><TD></TD>\n");
  fprintf(stdout, "\n");
  fprintf(stdout, "<TD>A</TD><TD>B</TD><TD>C</TD><TD>D</TD><TD>E</TD><TD>F</TD><TD>G</TD><TD>H</TD><TD>I</TD><TD>J</TD><TD>K</TD><TD>L</TD><TD>M</TD><TD>N</TD><TD>O</TD></TR>\n");
  fprintf(stdout, "<TR Align='center'><TD>1</TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='a1' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='a2' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='a3' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='a4' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='a5' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='a6' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='a7' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='a8' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='a9' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='a10' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='a11' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='a12' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='a13' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='a14' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='a15' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "</TR>\n");
  fprintf(stdout, "\n");
  fprintf(stdout, "<TR Align='center'><TD>2</TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='b1' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='b2' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='b3' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='b4' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='b5' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='b6' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='b7' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='b8' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='b9' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='b10' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='b11' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='b12' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='b13' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='b14' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='b15' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "</TR>\n");
  fprintf(stdout, "\n");
  fprintf(stdout, "<TR Align='center'><TD>3</TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='c1' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='c2' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='c3' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='c4' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='c5' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='c6' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='c7' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='c8' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='c9' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='c10' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='c11' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='c12' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='c13' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='c14' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='c15' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "</TR>\n");
  fprintf(stdout, "\n");
  fprintf(stdout, "<TR Align='center'><TD>4</TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='d1' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='d2' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='d3' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='d4' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='d5' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='d6' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='d7' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='d8' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='d9' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='d10' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='d11' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='d12' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='d13' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='d14' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='d15' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "</TR>\n");
  fprintf(stdout, "\n");
  fprintf(stdout, "<TR Align='center'><TD>5</TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='e1' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='e2' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='e3' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='e4' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='e5' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='e6' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='e7' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='e8' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='e9' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='e10' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='e11' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='e12' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='e13' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='e14' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='e15' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "</TR>\n");
  fprintf(stdout, "\n");
  fprintf(stdout, "<TR Align='center'><TD>6</TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='f1' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='f2' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='f3' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='f4' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='f5' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='f6' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='f7' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='f8' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='f9' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='f10' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='f11' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='f12' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='f13' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='f14' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='f15' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "</TR>\n");
  fprintf(stdout, "\n");
  fprintf(stdout, "<TR Align='center'><TD>7</TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='g1' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='g2' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='g3' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='g4' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='g5' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='g6' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='g7' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='g8' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='g9' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='g10' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='g11' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='g12' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='g13' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='g14' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='g15' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "</TR>\n");
  fprintf(stdout, "\n");
  fprintf(stdout, "<TR Align='center'><TD>8</TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='h1' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='h2' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='h3' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='h4' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='h5' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='h6' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='h7' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='h8' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='h9' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='h10' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='h11' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='h12' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='h13' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='h14' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='h15' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "</TR>\n");
  fprintf(stdout, "\n");
  fprintf(stdout, "<TR Align='center'><TD>9</TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='i1' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='i2' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='i3' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='i4' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='i5' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='i6' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='i7' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='i8' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='i9' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='i10' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='i11' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='i12' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='i13' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='i14' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='i15' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "</TR>\n");
  fprintf(stdout, "\n");
  fprintf(stdout, "<TR Align='center'><TD>10</TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='j1' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='j2' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='j3' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='j4' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='j5' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='j6' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='j7' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='j8' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='j9' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='j10' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='j11' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='j12' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='j13' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='j14' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='j15' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "</TR>\n");
  fprintf(stdout, "\n");
  fprintf(stdout, "<TR Align='center'><TD>11</TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='k1' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='k2' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='k3' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='k4' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='k5' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='k6' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='k7' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='k8' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='k9' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='k10' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='k11' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='k12' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='k13' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='k14' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='k15' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "</TR>\n");
  fprintf(stdout, "\n");
  fprintf(stdout, "<TR Align='center'><TD>12</TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='l1' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='l2' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='l3' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='l4' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='l5' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='l6' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='l7' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='l8' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='l9' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='l10' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='l11' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='l12' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='l13' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='l14' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='l15' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "</TR>\n");
  fprintf(stdout, "\n");
  fprintf(stdout, "<TR Align='center'><TD>13</TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='m1' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='m2' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='m3' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='m4' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='m5' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='m6' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='m7' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='m8' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='m9' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='m10' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='m11' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='m12' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='m13' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='m14' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='m15' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "</TR>\n");
  fprintf(stdout, "\n");
  fprintf(stdout, "<TR Align='center'><TD>14</TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='n1' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='n2' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='n3' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='n4' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='n5' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='n6' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='n7' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='n8' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='n9' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='n10' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='n11' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='n12' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='n13' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='n14' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='n15' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "</TR>\n");
  fprintf(stdout, "\n");
  fprintf(stdout, "<TR Align='center'><TD>15</TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='o1' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='o2' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='o3' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='o4' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='o5' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='o6' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='o7' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='o8' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='o9' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='o10' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='o11' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='o12' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='o13' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='o14' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "<TD><INPUT TYPE='Text' NAME='o15' VALUE=\"\" SIZE=1 MAXLENGTH=1></TD>\n");
  fprintf(stdout, "</TR>\n");
  fprintf(stdout, "</TABLE><BR>\n");
  fprintf(stdout, "\n");
  fprintf(stdout, "<INPUT TYPE='submit' VALUE='Find all moves!'>\n");
  fprintf(stdout, "</FORM><BR>\n");

  } else if (strcasecmp(getenv("REQUEST_METHOD"), "POST") == 0) {
    int i;
    int row, col, x, y;

  fprintf(stdout, "Content-type: text/html\n");
  fprintf(stdout, "\n");

#ifdef NEVER
    fprintf(stdout, "<HTML><HEAD><TITLE>Scrabble Move Generator</TITLE></HEAD><BODY BGCOLOR='#FFFFFF'>\n");
    fprintf(stdout, "<PRE>\n"); fflush(stdout);
    for (r = 0; r <= argc; r++) {
      fprintf(stdout, "Argv[%d] = \"%s\"<BR>\n", r, (argv[r] == NULL ? "NULL" : argv[r]));
    }
    fprintf(stdout, "QUERY_STRING = \"%s\"<BR>\n", (getenv("QUERY_STRING") == NULL ? "NULL" : getenv("QUERY_STRING")));
    fflush(stdout); fprintf(stdout, "</PRE>\n");
    fprintf(stdout, "<PRE>\n"); fflush(stdout);
    system("printenv");
    fflush(stdout);
    fprintf(stdout, "*********** POST DATA:");
    for (;;) {
      i = fgetc(stdin);
      if (i == EOF) break;
      fputc(i&255, stdout);
    }
    fprintf(stdout, ":POST DATA **********\n");
    dumpargs(name, value, num);
    fprintf(stdout, "</PRE>\n");
#else
    fprintf(stdout, "<HTML><HEAD><TITLE>Scrabble Move Generator</TITLE></HEAD><BODY BGCOLOR='#FFFFFF'>\n");
    for (x = 0; x < 15; x++) {
      for (y = 0; y < 15; y++) {
        saved[x][y] = '.';
      }
    }
    format = "GIF";
    for (i = 0; i < num; i++) {
      if (strcasecmp(name[i], "format") == 0) {
        format = strdup(value[i]);
      } else if (strcasecmp(name[i], "dict") == 0) {
          dict = value[i]; /* TO DO - IMPORTANT - VET THE FILENAME */
      } else if (strcasecmp(name[i], "score") == 0) {
          if (value[i] != NULL) if (isdigit(value[i][0])) score = (int)atol(value[i]);
      } else if (strcasecmp(name[i], "remaining") == 0) {
          if (value[i] != NULL) if (isdigit(value[i][0])) remaining = (int)atol(value[i]);
      } else if (isalpha(name[i][0]) && isdigit(name[i][1])) {
	if (name[i][0] == 'R') {
          /* Rack element */
          int tile  = value[i][0];
          if (tile == 'B') tile = '?';
          if (tile == 'N') tile = ' ';
          rack1[name[i][1]-'0'] = tile;
#ifdef NEVER
	} else if (name[i][0] == 'S') {
          /* Rack element */
          int tile  = value[i][0];
          if (tile == 'B') tile = '?';
          if (tile == 'N') tile = ' ';
          rack2[name[i][1]-'0'] = tile;
#endif
	} else {
          /* Must be a board square */
        if (name[i] != NULL) {
          y = (name[i][0])-'a'; /* 0-15 */
          x = (atoi(name[i]+1))-1; /* 0-15 */
          /* Should have an assertion for 0..15 */
          if (value[i] == NULL) {
            saved[x][y] = '.';
          } else {
            saved[x][y] = value[i][0];
          }
	}
	}
      }
    }
    generate_graphic(saved, format);
#endif
    fflush(stdout);
  } else {
    fprintf(stdout, "Content-type: text/html\n");
    fprintf(stdout, "\n");
    fprintf(stdout, "<HTML><BODY>Error!\n");
    /* ERROR */
  }

  fprintf(stdout, "<BR>\n");
  fprintf(stdout, "</BODY></HTML>\n\n");
  fflush(stdout);
}

int main(int argc, char **argv)
{
  cgi_bin(argc, argv);
  exit(0);
  return(0);
}