Mercurial > ~dholland > hg > ag > index.cgi
diff tests/agcl/examples/good/dsl.cpp @ 0:13d2b8934445
Import AnaGram (near-)release tree into Mercurial.
author | David A. Holland |
---|---|
date | Sat, 22 Dec 2007 17:52:45 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/agcl/examples/good/dsl.cpp Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,3838 @@ + // C Prologue +/***** + + AnaGram Programming Examples + + A Dos Script Language + + Copyright 1993 Parsifal Software. All Rights Reserved. + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + +*****/ + +#include "stack.h" +#include "charsink.h" +#include "strdict.h" +#include "array.h" +#include "symbol.h" +#include "query.h" + +#ifdef __BCPLUSPLUS__ +extern unsigned _stklen = 0x4000; // set stack size +#endif + + +// Define stacks for temporary storage + +stack <action_pointer> as(25); // Stack actions +stack <int> is(100); // Stack string indices +stack <char *> ps(1000,20); // Stack parameter strings +stack <query_item> qs(23); // Stack query items + + +// Define data structures for symbol table + +#define N_STRINGS 2000 + +string_accumulator sa(64000U,500); +string_dictionary sd(N_STRINGS); +array <symbol_table_entry> st(N_STRINGS); + + +/* + * AnaGram, A System for Syntax Directed Programming + * File generated by: ... + * + * AnaGram Parsing Engine + * Copyright 1993-2002 Parsifal Software. All Rights Reserved. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + */ + +#ifndef DSL_H +#include "dsl.h" +#endif + +#ifndef DSL_H +#error Mismatched header file +#endif + +#include <ctype.h> +#include <stdio.h> + +#define RULE_CONTEXT (&((PCB).cs[(PCB).ssx])) +#define ERROR_CONTEXT ((PCB).cs[(PCB).error_frame_ssx]) +#define CONTEXT ((PCB).cs[(PCB).ssx]) + + + +dsl_pcb_type dsl_pcb; +#define PCB dsl_pcb +#define CHANGE_REDUCTION(x) dsl_change_reduction(dsl_##x##_token) +int dsl_change_reduction(dsl_token_type); + + +#line - "dsl.syn" +#include <stdlib.h> +#include <ctype.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <time.h> +#include <assert.h> +#include <errno.h> + +#if defined(__MSDOS__) || defined(__WINDOWS__) +#include <io.h> +#include <conio.h> +#include <process.h> +#else +#include <unistd.h> + +/* This is only meant to compile, not run. (Unix) */ +static int kbhit(void) { return 0; } +static int getch(void) { return '?'; } +static void ungetch(int) { } +static void strupr(char *) { } +static int spawnvp(int, const char *, char *const *) { return -1; } +#define O_TEXT 0 +#define O_BINARY 0 +#define P_WAIT 0 +#define _MAX_PATH 128 +#define _MAX_DRIVE 4 +#define _MAX_DIR 128 +#define _MAX_FNAME 16 +#define _MAX_EXT 4 +static void _splitpath(const char *, char *, char *, char *, char *) {} +static void _makepath(char *, const char *, const char *, const char *, + const char *) {} + +#endif + +#ifdef __MSDOS__ +#include <dos.h> +#else + +/* This is only meant to compile, not run. (Windows, Unix) */ + +#define far +struct find_t { int attrib; char name[16]; }; +int _dos_findfirst(const char *, int, struct find_t *) { return -1; } +int _dos_findnext(struct find_t *) { return -1; } +#define _A_SUBDIR 1 +struct diskfree_t { + unsigned avail_clusters, bytes_per_sector, sectors_per_cluster; +}; +void _dos_getdiskfree(int, struct diskfree_t *f) { + f->avail_clusters = 0; + f->bytes_per_sector = 512; + f->sectors_per_cluster = 4; +} +void _dos_getftime(int, unsigned short *d, unsigned short *t) { *d=*t=0; } + +#endif /* not MSDOS */ + +#include "edit.h" + + +#include "screen.h" +#include "util.h" +#include "redirect.h" + +#define GET_CONTEXT CONTEXT.pointer = PCB.pointer;\ + CONTEXT.line=PCB.line;\ + CONTEXT.column = PCB.column; + + +int debug_switch = 0; +char *error_msg = NULL; +unsigned errorlevel_index; +int errorlevel; +int exitcode = 0; +int exitflag = 0; +int first_line = 1; +int first_column = 1; +unsigned stderr_index; + +void display_queries(screen_descriptor *); + +#define FIRST_LINE first_line +#define FIRST_COLUMN first_column + + +/***** + + Internal Functions + +*****/ + +long file_exists(void) { + FILE *f = fopen((sa--).top(),"r"); + if (f != NULL) fclose(f); + return f != NULL; +} + +long directory_exists(void) { + struct find_t ff; + int result; + + sa << "\\*.*"; + result = _dos_findfirst((sa--).top(),_A_SUBDIR,&ff); + return result == 0; +} + +long string_length(void) { + return size(sa--); +} + +long get_file_length(void) { + int handle = open((sa--).top(), O_RDONLY); + long length; + if (handle < 0) return 0; + length = filelength(handle); + close(handle); + return length; +} + +long disk_space(void) { + struct diskfree_t free; + int drive = toupper(*(sa--).top()) - 64; + long avail; + + _dos_getdiskfree(drive, &free); + avail = (long) free.avail_clusters + * (long) free.bytes_per_sector + * (long) free.sectors_per_cluster; + return avail; +} + +long file_time(void) { + int handle = open((sa--).top(), O_RDONLY); +#ifdef __BCPLUSPLUS__ + unsigned date, time; +#else + unsigned short date, time; +#endif + struct tm t; + + if (handle < 0) return 0; + _dos_getftime(handle, &date, &time); + close(handle); + t.tm_year = ((date & 0xfe00) >> 9) + 80; + t.tm_mon = ((date & 0x1e00) >> 5) - 1; + t.tm_mday = date & 0x001f; + ; + t.tm_hour = (time & 0xf800) >> 11; + t.tm_min = (time & 0x07e0) >> 5; + t.tm_sec = (time & 0x001f) << 1; + return mktime(&t); +} + + +// Support for reduction procecures + +// Compare top strings on string accumulator + +/* + pops top two strings from string accumulator using strcmp + and returns + -1 if first string is less than top string + 0 if strings match + +1 if top string is greater than first string +*/ + +int string_comp(void) { + int n = size(sa); + array<char> right_string((sa--).top(), n+1); + return strcmp((sa--).top(),right_string); +} + +/* + replace the top string on the stack, with a substring where the index + of the first character in the substring is given by "first" and the index + of the last character is given by "last" +*/ + +void extract(unsigned first, unsigned last) { + int n = last - first + 1; + assert (last >= first); + array <char> x( (sa--).top() + first, n+1 ); + x[n] = 0; + ++sa << x; +} + +/* + Look up the top string on the accumulator stack in the string dictionary. + If it has a value in the symbol table, replace it with the symbol table + value. If the value is numeric, convert it to integer. Otherwise, leave the + string untouched on the stack. +*/ + +void lookup(void) { + unsigned index = sd[sa.top()]; + if (index == 0) return; + switch (st[index].type) { + case string_type: + case value_type: { + --sa; // discard name + ++sa << st[index].data.text; // stack value + break; + } + case integer_type: { + --sa; // discard name + (++sa).printf("%ld", st[index].data.integer); // convert to ascii + break; + } + default: + /* not supposed to happen? */ + break; + } +} + +/* + Find the data type of a symbol and change the reduction accordingly. + Return the dictionary index for strings, and the value itself for integers. +*/ + +long name_type(void) { + unsigned index = sd << (sa--).top(); + switch (st[index].type) { + case value_type: + case string_type: { + CHANGE_REDUCTION(string_name); + return index; + } + case built_in_function_type: { + CHANGE_REDUCTION(built_in_name); + return index; + } + case undefined_type: { + CHANGE_REDUCTION(undefined_name); + return index; + } + case integer_type: return st[index].data.integer; + default: + /* not supposed to happen? */ + break; + } + return 0; +} + +/* + Store a string formula. A string formula is a sequence of string identifiers + the values of which are to be concatenated. The parser has accumulated the + identifiers on the integer_stack, is. The formula is terminated by a zero + entry. +*/ + +int *formula(void) { + int n = size(is << 0); + int *f = new int[n]; + while (n--) is >> f[n]; + return f; +} + +/* + Make a copy of an action that has been identified in the text stream. + An action pointer was stacked at the beginning of the action text on the + action stack, as. +*/ + +action_pointer copy_action(void) { + action_pointer ap; + as >> ap; // pop action descriptor + unsigned length = (unsigned) (PCB.pointer - ap.pointer); + unsigned char *action = memdup(ap.pointer,length + 1); + action[length] = 0; + ap.pointer = action; + return ap; +} + + +// Internal Commands + +int echo(int, char *args[]) { + int i; + const char *cs = ""; + for (i = 1; args[i]; i++) printf("%s%s", cs, args[i]), cs = " "; + printf("\n"); + fflush(stdout); + return 0; +} + +int pause(int, char *[]) { + int c; + while (kbhit()) getch(); // Empty buffer + printf("Press any key to continue . . .\n"); + c = getch(); + if (c == 3) exit(1); + return c; +} + +int exit_script(int n_args, char *args[]) { + if (n_args > 1) sscanf(args[1], "%d", &exitcode); + exit(exitcode); + return exitcode; +} + +/* +int return_script(int n_args, char *args[]) { + if (n_args > 1) sscanf(args[1], "%d", &exitcode); + PCB.exit_flag = AG_SUCCESS_CODE; + return exitcode; +} +*/ + +int subdirs(int, char *args[]) { + struct find_t file_block; + int flag; + int length = strlen(args[1]); + array <char> name(args[1],length + 5); + + strcat(name, "\\*.*"); + for (flag = _dos_findfirst(name, _A_SUBDIR, &file_block); + flag == 0; flag = _dos_findnext(&file_block)) { + if ((file_block.attrib & _A_SUBDIR) == 0) continue; + if (strcmp(file_block.name, ".") == 0) continue; + if (strcmp(file_block.name, "..") == 0) continue; + puts(file_block.name); + } + return 0; +} + +int files(int, char *args[]) { + struct find_t file_block; + int flag; + int length = strlen(args[1]); + array<char> name(args[1],length + 5); + + strcat(name, "\\*.*"); + for (flag = _dos_findfirst(name, 0, &file_block); + flag == 0; flag = _dos_findnext(&file_block)) { + puts(file_block.name); + } + return 0; +} + + +/***** + + Execute Command Line + +*****/ + + +void perform_action(action_pointer ap) { + dsl_pcb_type save_pcb = PCB; + + PCB.pointer = ap.pointer; + first_line = ap.line; + first_column = ap.column; + dsl(); + exitflag = PCB.exit_flag != AG_SUCCESS_CODE; + PCB = save_pcb; + if (exitflag) PCB.exit_flag = AG_SEMANTIC_ERROR_CODE; +} + +void exec(void) { + int n = size(ps << (char *) NULL); + int n_args = n - 1; + unsigned index; + unsigned uc_index; + int i; + + array <char *> args(n); + while (n--) ps >> args[n]; + + index = sd[args[0]]; + while (index && st[index].type == string_type) { + args[0] = st[index].data.text; // stack value + index = sd[args[0]]; + } + if (debug_switch) { + for (i = 0; args[i]; i++) fprintf(stderr, "%s ", args[i]); + fprintf(stderr,"\nPress any key to continue\n"); + while (!kbhit()); + getch(); + } + strupr(args[0]); + uc_index = sd[args[0]]; + if (n_args == 1 && strlen(args[0]) == 2 && args[0][1] == ':') { + errorlevel = system(args[0]); + } + else if ( *args[0] && uc_index) switch (st[uc_index].type) { + case internal_type: { + errorlevel = (*st[uc_index].data.proc)(n_args, args); + break; + } + case dos_type: { + int i; + for (i = 1; args[i]; i++) args[i][-1] = ' '; + errorlevel = system(args[0]); + if (errorlevel == -1) { + fprintf(stderr,"Error invoking %s: %s\n", args[0], strerror(errno)); + exit(1); + } + break; + } + default: + /* not supposed to happen? */ + break; + } + else if ( *args[0] && index) switch (st[index].type) { + case action_type: { + action_descriptor d = *st[index].data.action; + stack <symbol_table_entry> old_entries(d.n_args); + for (i = 0; i < d.n_args && args[i+1]; i++) { + old_entries << st[d.args[i]]; + st[d.args[i]].type = value_type; + st[d.args[i]].data.text = memdup(args[i+1], 1 + strlen(args[i+1])); + } + perform_action(d.ap); + for (i = d.n_args; i--;) { + release(st[d.args[i]]); + old_entries >> st[d.args[i]]; + } + break; + } + default: { + char **tmpargs = args; + errorlevel = spawnvp(P_WAIT,args[0], tmpargs); + if (errorlevel == -1) { + fprintf(stderr,"Error invoking %s: %s\n", args[0], strerror(errno)); + exit(1); + } + } + } + else { + } + st[errorlevel_index].data.integer = errorlevel; + while (n_args--) --sa; + --ps; + if (kbhit()) { + int c = getch(); + if (c == 3) exit(1); + ungetch(c); + } +} + +void discard_temp_file(char *file_name) { + unlink(file_name); // Delete file + delete [] file_name; // Free storage for name +} + + +/***** + + Execute Command with piped input + +*****/ + + +void exec_pipe_in(char *file_name) { + { + redirect sin(STDIN, file_name); + exec(); + } + discard_temp_file(file_name); +} + + +/***** + + Execute Command with redirected I/O + +*****/ + +void exec_redirect_in(void) { + redirect sin(STDIN, (sa--).top()); + exec(); +} + +char *exec_pipe_out(void) { + fflush(stdout); + redirect sout(STDOUT); + exec(); + fflush(stdout); + return save_file(sout); +} + +char *exec_pipe_in_pipe_out(char *file_name) { + char *result; + { + redirect sin(STDIN, file_name); + fflush(stdout); + redirect sout(STDOUT); + exec(); + fflush(stdout); + result = save_file(sout); + } + discard_temp_file(file_name); + return result; +} + +char *exec_redirect_in_pipe_out(void) { + fflush(stdout); + redirect sout(STDOUT); + exec_redirect_in(); + fflush(stdout); + return save_file(sout); +} + +unsigned check_integer(void) { + unsigned index = sd << (sa--).top(); + if (st[index].type == integer_type) return index; + CHANGE_REDUCTION(undeclared_variable); + if (st[index].type == string_type) CHANGE_REDUCTION(string_variable); + return index; +} + +void assign_value(unsigned index) { + char *text = copy(sa--); + release(st[index]); + st[index].type = value_type; + st[index].data.text = text; +} + +void grab_output(char *temp_name) { + unlink(sa.top()); // delete old file + rename(temp_name, (sa--).top()); // rename temp file + delete [] temp_name; // discard name string +} + +void append_output(char *temp_name) { + fflush(stdout); + redirect sout(STDOUT, (sa--).top(), 1); // append to file named on sa + redirect sin(STDIN, temp_name); + char buf[2000]; + int n; + while (1) { + n = read(STDIN, buf, 2000); + if (n == 0) break; + write(STDOUT, buf, n); + } + fflush(stdout); + unlink(temp_name); + delete [] temp_name; +} + +void action_string(void) { + action_pointer ap; + as >> ap; + unsigned length = (unsigned)(PCB.pointer - ap.pointer); + array <unsigned char> action(ap.pointer,length + 1); + action[length] = 0; + fflush(stdout); + redirect sout(STDOUT); + char *result; + + ap.pointer = action; + perform_action(ap); + fflush(stdout); + result = content(sout); + ++sa << result; + delete [] result; +} + + +// Program Control functions + +// If/else statement + +int do_if(int pc, int cc) { + action_pointer ap; + as >> ap; + if (!pc && cc && exitflag == 0) { + unsigned length = (unsigned) (PCB.pointer - ap.pointer); + array<unsigned char> q(ap.pointer, length+1); + q[length] = 0; + ap.pointer = q; + perform_action(ap); + } + return pc || cc; +} + +// While statement + +void do_while(int cc) { + unsigned length; + action_pointer ap; + as >> ap; + if (cc == 0) return; + length = (unsigned) (PCB.pointer - ap.pointer); + array<unsigned char> q(ap.pointer, length+1); + q[length] = 0; + ap.pointer = q; + perform_action(ap); + if (exitflag) return; + PCB.pointer = CONTEXT.pointer; + PCB.line = CONTEXT.line; + PCB.column = CONTEXT.column; +} + + +// For Statement +// Note that this is the for statement in the DOS batch languange for, not C + +void do_for_loop(void) { + int n,k; + char *q; + const char *seps = " \t\v\f\r\n"; + action_pointer ap; + as >> ap; + unsigned length = (unsigned)(PCB.pointer - ap.pointer); + array <unsigned char> action(ap.pointer, length + 1); + action[length] = 0; + + ap.pointer = action; + n = size(sa); + array<char> text((sa--).top(), n + 1); + + + unsigned index = sd << (sa--).top(); + + ++ps; + for (q = strtok(text, seps); q != NULL; q = strtok(NULL,seps)) { + if (*q == '(') { + int k = strlen(q) - 1; + assert(q[k] == ')'); + q[k] = 0; + q++; + } + else if (*q == '"') { + int k = strlen(q) - 1; + assert(q[k] == '"'); + q[k] = 0; + q++; + } + ps << q; + } + k = n = size(ps); + array<char *> args(n); + while (k--) ps >> args[k]; + --ps; + symbol_table_entry save_table_entry = st[index]; + st[index].type = value_type; + + for (k = 0; k < n && exitflag == 0; k++) { + st[index].data.text = args[k]; + perform_action(ap); + } + st[index] = save_table_entry; +} + +void invoke_script(void) { + int handle = open(sa.top(), O_TEXT | O_RDONLY); + long size; + unsigned n; + action_pointer ap; + + if (handle < 0) { + fprintf(stderr,"Cannot open %s\n", (sa--).top()); + exit(1); + } + --sa; + size = filelength(handle); + assert(size < 65536L); + array <unsigned char> data((unsigned) size+1); + n = (unsigned) read(handle,data,(unsigned) size); + data[n] = 0; + close(handle); + exitflag = 0; + ap.pointer = data; + ap.line = ap.column = 1; + perform_action(ap); + st[errorlevel_index].data.integer = exitcode; + exitflag = exitcode = 0; + return; +} + +internal_commands_descriptor internal_commands[] = { + {"ECHO", echo}, + {"EXIT", exit_script}, + {"FILES", files}, + {"PAUSE", pause}, +// {"RETURN", return_script}, + {"SUBDIRS", subdirs}, + {NULL, NULL} +}; + +struct built_ins_descriptor built_ins[] = { + {"file_exists", file_exists}, + {"directory_exists", directory_exists}, + {"string_length", string_length}, + {"file_length", get_file_length}, + {"disk_space", disk_space}, + {"file_time", file_time}, + {NULL, NULL} +}; + +void set_extension(char *path, const char *e) { + char s[_MAX_PATH]; + char drive[_MAX_DRIVE]; + char dir[_MAX_DIR]; + char file[_MAX_FNAME]; + char ext[_MAX_EXT]; + + _splitpath(path,drive,dir,file,ext); + _makepath(s, drive, dir, file, e); + ++sa << s; +} + +/* + Note that if this program is called without any arguments, it looks for a + script with the same name as the executable. Thus, to make an install + program that picks up the install script without any arguments, you simply + rename DSL.EXE to INSTALL.EXE. Then when you run it without any arguments + it will run the INSTALL.DSL script. +*/ + +int main(int argc, char *argv[]) { + int arg_number = 0; + int i = 1; + int j = 0; + + init_dos_internals(); + set_arg(j++, argv[0]); + if (argc > i && (argv[i][0] == '/' || argv[i][0] == '-')) { + if (toupper(argv[i][1]) != 'D') { + printf("Unrecognized switch -- /%c\n", argv[i][1]); + return 1; + } + debug_switch = 1; + i++; + } + if (argc > i) arg_number = i++; + set_extension(argv[arg_number], "DSL"); + set_arg(j++,copy(sa)); + while (i < argc) set_arg(j++, argv[i++]); + define_integer("argc", j); + invoke_script(); // Takes file name from sa + return exitcode; +} +#line - "dsl.cpp" + +#ifndef CONVERT_CASE +#define CONVERT_CASE(c) (c) +#endif +#ifndef TAB_SPACING +#define TAB_SPACING 8 +#endif + +#define ag_rp_1(v) (++sa << sd[v], lookup()) + +#define ag_rp_2(v) (++sa << sd[v], lookup()) + +#define ag_rp_3(v) (++sa << sd[v], lookup()) + +#define ag_rp_4() (sa << '[') + +#define ag_rp_5() (concat(sa) << ']', lookup()) + +#define ag_rp_6() (concat(sa)) + +#define ag_rp_7() (concat(sa)) + +#define ag_rp_8(c) (++sa << c) + +#define ag_rp_9(c) (sa << c) + +#define ag_rp_10() (action_string()) + +#define ag_rp_11() (as << CONTEXT) + +static void ag_rp_12(void) { +#line - "dsl.syn" +action_pointer a; as >> a; +#line - "dsl.cpp" +} + +#define ag_rp_13() (--sa) + +#define ag_rp_14() (--sa) + +#define ag_rp_15() (--sa) + +#define ag_rp_16() (++sa) + +#define ag_rp_17(c) (sa << c) + +#define ag_rp_18() (sa << '(') + +#define ag_rp_19() (concat(sa) << ')') + +#define ag_rp_20() (++sa) + +#define ag_rp_21(c) (sa << c) + +#define ag_rp_22(c) (sa << c) + +#define ag_rp_23() ('\a') + +#define ag_rp_24() ('\b') + +#define ag_rp_25() ('\f') + +#define ag_rp_26() ('\n') + +#define ag_rp_27() ('\r') + +#define ag_rp_28() ('\t') + +#define ag_rp_29() ('\v') + +#define ag_rp_30() ('\\') + +#define ag_rp_31() ('\?') + +#define ag_rp_32() ('\'') + +#define ag_rp_33() ('"') + +#define ag_rp_34(d) (d-'0') + +#define ag_rp_35(n, d) (8*n + d-'0') + +#define ag_rp_36(n, d) (8*n + d-'0') + +#define ag_rp_37(n) ((int) n) + +#define ag_rp_38(n, d) (16*n + d) + +#define ag_rp_39() (exec()) + +#define ag_rp_40() (exec_redirect_in()) + +#define ag_rp_41(file) (exec_pipe_in(file)) + +#define ag_rp_42(file) (grab_output(file)) + +#define ag_rp_43(file) (append_output(file)) + +#define ag_rp_44() (exec_pipe_out()) + +#define ag_rp_45() (exec_redirect_in_pipe_out()) + +#define ag_rp_46(file) (exec_pipe_in_pipe_out(file)) + +#define ag_rp_47() (sa << 0, ++ps << (sa.top())) + +#define ag_rp_48() (ps << (sa.top()), sa << 0) + +#define ag_rp_49() (ps << (sa.top()), sa << 0) + +#define ag_rp_50(pc) (do_if(pc,1)) + +#define ag_rp_51(cc) (cc) + +#define ag_rp_52(cc) (cc) + +#define ag_rp_53(pc, cc) (do_if(pc,cc!=0)) + +#define ag_rp_54(cc) ((int) cc) + +#define ag_rp_55(cc) (do_if(0,cc != 0)) + +#define ag_rp_56(v) (assign_value(v)) + +#define ag_rp_57(v, x) (st[v].data.integer = (int) x) + +#define ag_rp_58(v) (st[v].data.text = copy(sa--)) + +#define ag_rp_59(v, n, x) (st[v].data.text[(unsigned)n] = (char) x) + +#define ag_rp_60() (check_integer()) + +#define ag_rp_61(cc) (do_while(cc != 0)) + +#define ag_rp_62() (do_for_loop()) + +#define ag_rp_63(n) (define_action(n)) + +#define ag_rp_64(x) (define_integer((sa--).top(), x)) + +#define ag_rp_65() (define_string()) + +#define ag_rp_66() (0) + +#define ag_rp_67(n) (n+1) + +#define ag_rp_68(c) (++sa << c) + +#define ag_rp_69(c) (sa << c) + +#define ag_rp_70(c) (sa << c) + +#define ag_rp_71(c, x, y) (c != 0 ? x : y) + +#define ag_rp_72(x, y) (x != 0 || y!=0) + +#define ag_rp_73(x, y) (x != 0 && y !=0) + +#define ag_rp_74(x, y) (x | y) + +#define ag_rp_75(x, y) (x ^ y) + +#define ag_rp_76(x, y) (x & y) + +#define ag_rp_77(x, y) (x == y) + +#define ag_rp_78(x, y) (x != y) + +#define ag_rp_79() (string_comp() == 0) + +#define ag_rp_80() (string_comp() != 0) + +#define ag_rp_81(x, y) (x < y) + +#define ag_rp_82(x, y) (x > y) + +#define ag_rp_83(x, y) (x <= y) + +#define ag_rp_84(x, y) (x >= y) + +#define ag_rp_85() (string_comp() < 0) + +#define ag_rp_86() (string_comp() > 0) + +#define ag_rp_87() (string_comp() <= 0) + +#define ag_rp_88() (string_comp() >= 0) + +#define ag_rp_89(x, y) (x << (int) y) + +#define ag_rp_90(x, y) (x >> (int) y) + +#define ag_rp_91(x, y) (x + y) + +#define ag_rp_92(x, y) (x - y) + +#define ag_rp_93(x, y) (x * y) + +#define ag_rp_94(x, y) (x / y) + +#define ag_rp_95(x, y) (x % y) + +static long ag_rp_96(long x) { +#line - "dsl.syn" + assert(x); + return x; + +#line - "dsl.cpp" +} + +#define ag_rp_97(x) (x) + +#define ag_rp_98(x) (-x) + +#define ag_rp_99(x) (~x) + +#define ag_rp_100(x) (!x) + +#define ag_rp_101(x) (x) + +#define ag_rp_102(x) (x) + +#define ag_rp_103(n) (((unsigned char *) (sa--).top())[(int) n]) + +static long ag_rp_104(void) { +#line - "dsl.syn" + long temp; + sscanf((sa--).top(), "%ld", &temp); + return temp; + +#line - "dsl.cpp" +} + +#define ag_rp_105(x) (x) + +#define ag_rp_106(x) ((*st[(unsigned)x].data.func)()) + +#define ag_rp_107() (name_type()) + +#define ag_rp_108() (concat(sa)) + +#define ag_rp_109(first, last) (extract((unsigned)first, (unsigned) last)) + +#define ag_rp_110() (sa << '[') + +#define ag_rp_111() (concat(sa) << ']', lookup()) + +#define ag_rp_112(x) (++sa << st[(unsigned)x].data.text) + +#define ag_rp_113(x) (++sa << sd[(unsigned)x]) + +#define ag_rp_114() (action_string()) + +#define ag_rp_115(x) (++sa,sa.printf("%ld",x)) + +#define ag_rp_116() (0) + +#define ag_rp_117(x, d) (16*x + d) + +#define ag_rp_118(d) (d - '0') + +#define ag_rp_119(d) ((d&7) + 9) + +#define ag_rp_120() (0) + +#define ag_rp_121(n, d) (8*n + d-'0') + +#define ag_rp_122(d) (d-'0') + +#define ag_rp_123(n, d) (10*n + d-'0') + +#define ag_rp_124(c) (c) + +#define ag_rp_125(scd) (display_queries(scd)) + +#define ag_rp_126() (reset(qs), new screen_descriptor) + +#define ag_rp_127(scd) (scd->title = formula(), scd) + +#define ag_rp_128(scd, c) (scd->color = (char) c, scd) + +#define ag_rp_129(scd, c) (scd->entry_color = (char) c, scd) + +#define ag_rp_130(scd, c) (scd->highlight_color = (char) c, scd) + +#define ag_rp_131(scd, w, h) (scd->width = (unsigned)w, scd->height = (unsigned) h, scd) + +#define ag_rp_132(scd, px, py) (scd->pos.x = (unsigned) px,scd->pos.y = (unsigned) py, scd) + +#define ag_rp_133(scd, q) (qs << *q, delete q, scd) + +#define ag_rp_134(scd, q) (qs << *q, delete q, scd) + +#define ag_rp_135(fg, bg) (COLOR((unsigned)fg,(unsigned)bg)) + +#define ag_rp_136() (clear(new query_item)) + +#define ag_rp_137(q) (q->id = sd << (sa--).top(), q) + +#define ag_rp_138(q) (q->value = formula(), q) + +#define ag_rp_139(q) (q->prompt = formula(), q) + +#define ag_rp_140(q) (q->explanation = formula(),q) + +#define ag_rp_141() (clear(new query_item)) + +#define ag_rp_142(q) (q->prompt = formula(), q) + +#define ag_rp_143(q) (q->explanation = formula(),q) + +#define ag_rp_144(q) (q->action = copy_action(), q) + +#define ag_rp_145() (reset(is) << (sd << (sa--).top())) + +#define ag_rp_146() (is << (sd << (sa--).top())) + +#define ag_rp_147() (sa << '[') + +#define ag_rp_148() (concat(sa) << ']') + + +#define READ_COUNTS +#define WRITE_COUNTS +#undef V +#define V(i,t) (*t (&(PCB).vs[(PCB).ssx + i])) +#undef VS +#define VS(i) (PCB).vs[(PCB).ssx + i] + +#ifndef GET_CONTEXT +#define GET_CONTEXT CONTEXT = (PCB).input_context +#endif + +typedef enum { + ag_action_1, + ag_action_2, + ag_action_3, + ag_action_4, + ag_action_5, + ag_action_6, + ag_action_7, + ag_action_8, + ag_action_9, + ag_action_10, + ag_action_11, + ag_action_12 +} ag_parser_action; + + +#ifndef NULL_VALUE_INITIALIZER +#define NULL_VALUE_INITIALIZER = { 0 } +#endif + +static dsl_vs_type const ag_null_value NULL_VALUE_INITIALIZER; + +static const unsigned char far ag_rpx[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 0, 6, 0, 7, 8, 9, 0, 10, + 0, 11, 0, 0, 12, 0, 13, 14, 15, 0, 0, 0, 0, 0, 0, 16, 0, 17, + 18, 19, 0, 20, 0, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 0, 0, 0, 0, 0, 34, 35, 36, 37, 0, 38, 0, 0, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, + 0, 51, 52, 53, 54, 55, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 57, + 58, 59, 60, 61, 0, 0, 62, 63, 64, 65, 66, 0, 0, 67, 68, 69, 70, 0, + 71, 0, 72, 0, 73, 0, 74, 0, 75, 0, 76, 0, 77, 78, 79, 80, 0, 81, + 82, 83, 84, 85, 86, 87, 88, 0, 89, 90, 0, 91, 92, 0, 93, 94, 95, 96, + 0, 97, 98, 99,100,101,102,103,104, 0,105,106, 0,107, 0,108, 0,109, + 110,111, 0,112,113,114,115, 0, 0, 0, 0, 0, 0,116,117,118,119,120, + 121,122,123,124, 0, 0,125,126, 0,127,128,129,130,131,132,133,134,135, + 136, 0,137,138,139,140,141, 0,142,143,144,145,146, 0, 0, 0,147,148 +}; + +static const unsigned char far ag_key_itt[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 1, + 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0 +}; + +static const unsigned short far ag_key_pt[] = { + 0,213, 0,216, 0,220, 0,224, 0,222, 0,221, 0,226, 0,227, + 0,228, 0,164, 0,165, 0,250, 0,251, 0,252, 0,253, 0,255, + 0,256, 0,257, 0,258, 0,259, 0,260, 0,261, 0,262, 0,263, +0 +}; + +static const unsigned char far ag_key_ch[] = { + 0, 42, 47,255, 47, 97,105,115,255, 42, 47,255, 42, 47,255, 88,120,255, + 60, 61,255, 61, 62,255,101,111,255,108,110,120,255,105,111,255,116,255, + 102,110,255, 99,105,116,255, 33, 38, 46, 47, 48, 60, 61, 62, 97, 98, 99, + 100,101,102,104,105,108,112,115,116,118,119,124,255, 47, 97,105,115,255, + 47,255, 42, 47,255,110,120,255,105,111,255,102,110,255, 99,105,116,255, + 47, 97, 98, 99,100,101,102,104,105,108,112,115,116,118,119,255, 42, 47, + 255,108,110,120,255,105,111,255,102,110,255, 99,105,116,255, 47, 97, 98, + 99,100,101,102,104,105,108,112,115,116,118,119,255,102,110,255, 99,116, + 255, 47, 97,102,105,115,119,255, 42, 47,255, 60, 61,255, 61, 62,255, 33, + 38, 46, 47, 60, 61, 62,124,255,102,110,255, 99,116,255, 97,102,105,115, + 119,255, 42, 47,255, 88,120,255, 47, 48,255, 88,120,255, 48,255, 47,255, + 34, 39, 63, 92, 97, 98,102,110,114,116,118,120,255, 92,255, 42, 47,255, + 60, 61,255, 61, 62,255,105,116,255, 33, 38, 46, 47, 60, 61, 62, 97, 98, + 99,100,101,102,104,105,108,115,116,124,255, 42, 47,255, 47, 62,100,255, + 42, 47,255, 47, 62,255, 47, 62,255, 47, 98, 99,101,102,104,108,115,116, + 255, 62,255, 47,119,255, 47,101,255, 88,120,255, 47, 48,255,105,116,255, + 33, 38, 46, 47, 60, 61, 62, 97, 98, 99,101,102,104,105,108,115,116,124, + 255, 42, 47,255, 60, 61,255, 61, 62,255,105,116,255, 33, 38, 46, 47, 60, + 61, 62, 97, 98, 99,101,102,104,105,108,115,116,124,255, 42, 47,255, 60, + 61,255, 61, 62,255,105,116,255, 33, 38, 46, 47, 60, 61, 62,104,105,108, + 115,116,124,255, 42, 47,255, 47,255, 60, 61,255, 61, 62,255,105,116,255, + 33, 38, 46, 47, 60, 61, 62, 97, 98, 99,101,102,104,105,108,115,116,124, + 255, 33, 60, 61, 62,255,105,116,255, 33, 38, 46, 47, 61, 97, 98, 99,101, + 102,104,105,108,115,116,124,255,105,116,255, 38, 46, 47, 97, 98, 99,101, + 102,104,105,108,115,116,124,255,105,116,255, 46, 47, 97, 98, 99,101,102, + 104,105,108,115,116,124,255, 42, 47,255, 60, 61,255, 61, 62,255,108,110, + 255,105,116,255, 33, 38, 46, 47, 60, 61, 62, 97, 98, 99,100,101,102,104, + 105,108,115,116,119,124,255, 47,101,112,255, 47,100,101,112,118,255, 47, + 99,255, 99,255,105,255, 47, 62,100,255,102,110,255, 99,116,255, 47, 97, + 101,102,105,115,119,255,101,255, 42, 47,255, 47,105,255, 47,105,255, 60, + 62,255,100,255,105,255, 46,255, 42, 47,255, 61, 62,255,105,116,255, 33, + 38, 46, 47, 60, 61, 62, 97, 98, 99,100,101,102,104,105,108,115,116,124, + 255 +}; + +static const unsigned char far ag_key_act[] = { + 0,0,0,4,2,7,7,7,4,3,3,4,0,0,4,5,5,4,0,0,4,0,0,4,7,5,4,7,7,7,4,7,7,4,5, + 4,5,6,4,7,7,7,4,3,3,3,2,2,2,3,2,7,7,7,2,2,2,7,2,7,7,2,7,7,7,3,4,3,7,7, + 7,4,3,4,0,0,4,7,7,4,7,7,4,5,7,4,7,7,7,4,2,7,7,7,7,2,2,7,2,7,7,2,7,7,7, + 4,0,0,4,7,7,7,4,7,7,4,5,7,4,7,7,7,4,2,7,7,7,7,2,2,7,2,7,7,2,7,7,7,4,5, + 7,4,7,7,4,3,7,7,2,2,7,4,0,0,4,0,0,4,0,0,4,3,3,3,2,2,3,2,3,4,5,7,4,7,7, + 4,7,7,2,2,7,4,0,0,4,5,5,4,2,2,4,5,5,4,2,4,3,4,0,0,0,0,0,0,0,0,0,0,0,0, + 4,2,4,0,0,4,0,0,4,0,0,4,7,7,4,3,3,3,2,2,3,2,7,7,7,7,7,7,7,7,7,2,7,3,4, + 0,0,4,2,3,7,4,0,0,4,2,3,4,3,3,4,3,7,7,7,7,7,7,7,7,4,3,4,3,7,4,3,7,4,5, + 5,4,3,2,4,7,7,4,3,3,3,3,3,3,3,7,7,7,7,7,7,7,7,2,7,3,4,0,0,4,0,0,4,0,0, + 4,7,7,4,3,3,3,2,2,3,2,7,7,7,7,7,7,7,7,2,7,3,4,0,0,4,0,0,4,0,0,4,7,7,4, + 3,3,3,2,2,3,2,7,7,7,2,7,3,4,0,0,4,2,4,0,0,4,0,0,4,7,7,4,3,3,3,3,2,3,2, + 7,7,7,7,7,7,7,7,2,7,3,4,3,3,3,3,4,7,7,4,3,3,3,3,3,7,7,7,7,7,7,7,7,2,7, + 3,4,7,7,4,3,3,3,7,7,7,7,7,7,7,7,2,7,3,4,7,7,4,3,3,7,7,7,7,7,7,7,7,2,7, + 3,4,0,0,4,0,0,4,0,0,4,7,7,4,7,7,4,3,3,3,2,2,3,2,7,7,7,7,2,7,7,7,7,2,7, + 7,3,4,3,7,7,4,3,7,7,7,7,4,3,7,4,7,4,7,4,3,3,7,4,5,7,4,7,7,4,3,7,7,7,2, + 2,7,4,7,4,0,0,4,2,7,4,3,7,4,3,3,4,7,4,7,4,3,4,0,0,4,0,0,4,7,7,4,3,3,3, + 2,3,3,2,7,7,7,7,7,7,7,7,7,2,7,3,4 +}; + +static const unsigned short far ag_key_parm[] = { + 0, 14, 17, 0, 0, 12, 14, 16, 0, 13, 14, 0, 14, 17, 0, 20, 18, 0, + 239,237, 0,238,212, 0, 40, 10, 0, 0, 26, 44, 0, 36, 6, 0, 14, 0, + 2, 8, 0, 22, 30, 16, 0,236,232,249, 0, 0, 0,235, 0, 12, 46, 34, + 0, 0, 0, 28, 0, 32, 42, 0, 24, 38, 4,231, 0, 17, 12, 14, 16, 0, + 14, 0, 14, 17, 0, 26, 44, 0, 36, 6, 0, 2, 14, 0, 22, 30, 16, 0, + 0, 12, 46, 34, 40, 0, 0, 28, 0, 32, 42, 0, 24, 38, 4, 0, 14, 17, + 0, 0, 26, 44, 0, 36, 6, 0, 2, 14, 0, 22, 30, 16, 0, 0, 12, 46, + 34, 40, 0, 0, 28, 0, 32, 42, 0, 24, 38, 4, 0, 2, 14, 0, 22, 16, + 0, 17, 12, 6, 0, 0, 4, 0, 14, 17, 0,239,237, 0,238,212, 0,236, + 232,249, 0, 0,235, 0,231, 0, 2, 14, 0, 22, 16, 0, 12, 6, 0, 0, + 4, 0, 14, 17, 0, 20, 18, 0, 0, 0, 0, 20, 18, 0, 0, 0, 17, 0, + 69, 68, 67, 66, 59, 60, 61, 62, 63, 64, 65, 77, 0, 0, 0, 14, 17, 0, + 239,237, 0,238,212, 0, 30, 16, 0,236,232,249, 0, 0,235, 0, 12, 46, + 34, 10, 26, 36, 28, 14, 32, 0, 24,231, 0, 14, 17, 0, 0,212, 10, 0, + 14, 17, 0, 0,212, 0, 17,212, 0, 17, 46, 34, 26, 36, 28, 32, 30, 24, + 0,212, 0, 17, 4, 0, 17, 0, 0, 20, 18, 0, 14, 0, 0, 30, 16, 0, + 236,232,249, 17,237,235,238, 12, 46, 34, 26, 36, 28, 14, 32, 0, 24,231, + 0, 14, 17, 0,239,237, 0,238,212, 0, 30, 16, 0,236,232,249, 0, 0, + 235, 0, 12, 46, 34, 26, 36, 28, 14, 32, 0, 24,231, 0, 14, 17, 0,239, + 237, 0,238,212, 0, 30, 16, 0,236,232,249, 0, 0,235, 0, 28, 14, 32, + 0, 24,231, 0, 14, 17, 0, 0, 0,239,237, 0,238,212, 0, 30, 16, 0, + 236,232,249, 17, 0,235, 0, 12, 46, 34, 26, 36, 28, 14, 32, 0, 24,231, + 0,236,237,235,238, 0, 30, 16, 0,236,232,249, 17,235, 12, 46, 34, 26, + 36, 28, 14, 32, 0, 24,231, 0, 30, 16, 0,232,249, 17, 12, 46, 34, 26, + 36, 28, 14, 32, 0, 24,231, 0, 30, 16, 0,249, 17, 12, 46, 34, 26, 36, + 28, 14, 32, 0, 24,231, 0, 14, 17, 0,239,237, 0,238,212, 0, 0, 26, + 0, 30, 16, 0,236,232,249, 0, 0,235, 0, 12, 46, 34, 10, 0, 36, 28, + 14, 32, 0, 24, 4,231, 0, 17, 44, 42, 0, 17, 40, 44, 42, 38, 0, 14, + 34, 0, 34, 0, 8, 0, 17,212, 10, 0, 2, 14, 0, 22, 16, 0, 17, 12, + 0, 6, 0, 0, 4, 0, 0, 0, 14, 17, 0, 0, 2, 0, 17, 2, 0,237, + 238, 0, 10, 0, 2, 0,249, 0, 14, 17, 0,238,212, 0, 30, 16, 0,236, + 232,249, 0,237,235, 0, 12, 46, 34, 10, 26, 36, 28, 14, 32, 0, 24,231, + 0 +}; + +static const unsigned short far ag_key_jmp[] = { + 0, 0, 0, 0, 1, 0, 6, 9, 0, 15, 17, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 44, 0, 0, 50, 53, 57, 0, 67, 71, 0, 0, 0, + 0, 34, 0, 96,101,104, 0, 19, 21, 23, 12, 15, 18, 25, 21, 27, 33, 39, + 24, 27, 31, 73, 36, 82, 90, 39,109,114,122,127, 0,129,131,137,140, 0, + 146, 0, 0, 0, 0,172,176, 0,186,190, 0, 0,201, 0,217,222,225, 0, + 74,148,154,160,165, 77, 80,192, 83,203,211, 86,230,235,243, 0, 0, 0, + 0,272,275,279, 0,289,293, 0, 0,304, 0,320,325,328, 0,106,248,254, + 260,265,109,113,295,116,306,314,119,333,338,346, 0, 0,362, 0,364,369, + 0,351,353,359,139,142,374, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,379, + 381,383,152,155,385,158,387, 0, 0,398, 0,400,405, 0,389,395,170,173, + 410, 0, 0, 0, 0, 0, 0, 0,182,185, 0, 0, 0, 0,191, 0,415, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,198, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,474,477, 0,417,419,421,213,216,423,219,425,431, + 437,442,444,449,454,463,466,222,482,487, 0, 0, 0, 0,245,489,491, 0, + 0, 0, 0,252,493, 0,495,497, 0,499,501,507,512,517,522,531,539,543, + 0,548, 0,550,552, 0,557,559, 0, 0, 0, 0,563,279, 0,626,629, 0, + 565,567,569,571,573,575,577,579,585,591,596,601,606,615,618,285,634,639, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,696,699, 0,641,643,645,307,310, + 647,313,649,655,661,666,671,676,685,688,316,704,709, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,739,742, 0,711,713,715,338,341,717,344,719,728,731, + 347,747,752, 0, 0, 0, 0,364, 0, 0, 0, 0, 0, 0, 0,811,814, 0, + 754,756,758,760,369,762,372,764,770,776,781,786,791,800,803,375,819,824, + 0,826,828,830,832, 0,891,894, 0,834,836,838,840,842,844,850,856,861, + 866,871,880,883,402,899,904, 0,959,962, 0,906,908,910,912,918,924,929, + 934,939,948,951,422,967,972, 0,1025,1028, 0,974,976,978,984,990,995, + 1000,1005,1014,1017,440,1033,1038, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1067,1070, 0,1099,1102, 0,1040,1042,1044,457,460,1046,463,1048,1054, + 1060,1065,466,1074,1079,1088,1091,469,1107,1112,1117, 0,1119,1121,1132, + 0,1138,1140,1147,1158,1164, 0,1172,1174, 0,1179, 0,1184, 0,1186, + 1188,1190, 0, 0,1207, 0,1209,1214, 0,1192,1194,1200,1204,514,517,1219, + 0,1224, 0, 0, 0, 0,530,1228, 0,1230,1232, 0,1234,1236, 0,1238, + 0,1240, 0,1242, 0, 0, 0, 0, 0, 0, 0,1303,1306, 0,1244,1246, + 1248,548,1250,1252,551,1254,1260,1266,1271,1273,1278,1283,1292,1295,554, + 1311,1316, 0 +}; + +static const unsigned short far ag_key_index[] = { + 4, 9, 43, 67, 0, 72, 72, 72, 90,123, 0, 0, 0,145, 67, 0, 0, 0, + 161, 0, 0, 72, 72, 0,145,176,188, 0,194, 72,196,211, 0,225,248, 72, + 72,255,258, 72, 0, 0, 72,258, 0,261, 0,258,258,258,271,258, 0,273, + 276,196, 0,282, 0,194,288, 67,211,319,319,350,367,319,319,282,282,282, + 282, 0, 0,194,194,194,194,194,378,378,397,378,397,288,405,425,425,425, + 425,443, 67, 72,188,188,188,188,196,472, 0, 0,211,211, 0, 72, 0,194, + 0,194, 72, 0,493, 72, 0,497, 72, 0, 72, 0,503,506,503,506, 72, 0, + 196, 72, 0,508,194, 0,194, 0,282, 0, 0, 0,510,258,258,258,520,528, + 145, 0, 0, 0, 0, 0, 4, 0, 0,397, 0,282,194,282,194,282,194,194, + 194,194,194,282,194,282, 0,282, 0, 0, 0,282, 0,282, 0,194,194,194, + 194,194,194,282,194,282,194,194,282,194,282,194,282,194, 0,211, 0, 0, + 0,258, 0,196, 72, 0, 72, 0,196, 0, 0, 72, 0, 72, 0,196,194,194, + 196,196,194, 0, 72, 0, 0,196,196,196,196,196,258, 0,258, 0,533,536, + 319, 0,194,288, 0,378,378,194,378,378,288,288,288,288,405,405,378,378, + 378,378,539,288,288,405,425,425,425,425, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,196,196,542,194,258,258,544, 0,546,546,282,194, + 0,557,196,196,196,196,196,196,282,194,194,194, 0, 0, 72, 0,196, 0, + 282,194, 0,196, 0, 0 +}; + +static const unsigned char far ag_key_ends[] = { +99,116,105,111,110,0, 110,116,0, 116,114,105,110,103,0, 47,0, +42,0, 61,0, 38,0, 46,0, 61,0, 99,116,105,111,110,0, +117,116,116,111,110,0, 111,108,111,114,0, 102,97,117,108,116,0, +115,101,0, 116,114,121,0, 112,108,97,110,97,116,105,111,110,0, +101,108,100,0, 114,0, 105,103,104,108,105,103,104,116,0, +111,99,97,116,105,111,110,0, 114,111,109,112,116,0, 114,101,101,110,0, +122,101,0, 114,105,110,103,0, 105,116,108,101,0, +97,114,105,97,98,108,101,0, 104,105,108,101,0, 124,0, 47,0, +99,116,105,111,110,0, 110,116,0, 116,114,105,110,103,0, 42,0, +99,116,105,111,110,0, 117,116,116,111,110,0, 111,108,111,114,0, +101,102,97,117,108,116,0, 116,114,121,0, +112,108,97,110,97,116,105,111,110,0, 101,108,100,0, 114,0, +105,103,104,108,105,103,104,116,0, 116,0, 111,99,97,116,105,111,110,0, +114,111,109,112,116,0, 114,101,101,110,0, 122,101,0, +114,105,110,103,0, 105,116,108,101,0, 97,114,105,97,98,108,101,0, +104,105,108,101,0, 99,116,105,111,110,0, 117,116,116,111,110,0, +111,108,111,114,0, 101,102,97,117,108,116,0, 115,101,0, +116,114,121,0, 112,108,97,110,97,116,105,111,110,0, 101,108,100,0, +114,0, 105,103,104,108,105,103,104,116,0, 116,0, +111,99,97,116,105,111,110,0, 114,111,109,112,116,0, 114,101,101,110,0, +122,101,0, 114,105,110,103,0, 105,116,108,101,0, +97,114,105,97,98,108,101,0, 104,105,108,101,0, 47,0, +99,116,105,111,110,0, 111,114,0, 116,0, 114,101,101,110,0, +114,105,110,103,0, 104,105,108,101,0, 61,0, 38,0, 46,0, 61,0, +124,0, 99,116,105,111,110,0, 111,114,0, 116,0, 114,101,101,110,0, +114,105,110,103,0, 104,105,108,101,0, 47,0, 61,0, 38,0, 46,0, +61,0, 99,116,105,111,110,0, 117,116,116,111,110,0, 111,108,111,114,0, +111,0, 110,116,114,121,0, 105,101,108,100,0, +105,103,104,108,105,103,104,116,0, 110,116,0, +111,99,97,116,105,111,110,0, 122,101,0, 114,105,110,103,0, +105,116,108,101,0, 124,0, 62,0, 111,0, 62,0, 47,0, 62,0, 47,0, +117,116,116,111,110,0, 111,108,111,114,0, 110,116,114,121,0, +105,101,108,100,0, 105,103,104,108,105,103,104,116,0, +111,99,97,116,105,111,110,0, 105,122,101,0, 105,116,108,101,0, +62,0, 47,0, 104,105,108,101,0, 47,0, 108,115,101,0, 42,0, 61,0, +38,0, 46,0, 47,0, 61,0, 61,0, 61,0, 99,116,105,111,110,0, +117,116,116,111,110,0, 111,108,111,114,0, 110,116,114,121,0, +105,101,108,100,0, 105,103,104,108,105,103,104,116,0, 110,116,0, +111,99,97,116,105,111,110,0, 122,101,0, 114,105,110,103,0, +105,116,108,101,0, 124,0, 61,0, 38,0, 46,0, 61,0, +99,116,105,111,110,0, 117,116,116,111,110,0, 111,108,111,114,0, +110,116,114,121,0, 105,101,108,100,0, 105,103,104,108,105,103,104,116,0, +110,116,0, 111,99,97,116,105,111,110,0, 122,101,0, 114,105,110,103,0, +105,116,108,101,0, 124,0, 61,0, 38,0, 46,0, 61,0, +105,103,104,108,105,103,104,116,0, 110,116,0, +111,99,97,116,105,111,110,0, 122,101,0, 114,105,110,103,0, +105,116,108,101,0, 124,0, 61,0, 38,0, 46,0, 47,0, 61,0, +99,116,105,111,110,0, 117,116,116,111,110,0, 111,108,111,114,0, +110,116,114,121,0, 105,101,108,100,0, 105,103,104,108,105,103,104,116,0, +110,116,0, 111,99,97,116,105,111,110,0, 122,101,0, 114,105,110,103,0, +105,116,108,101,0, 124,0, 61,0, 61,0, 61,0, 61,0, 61,0, 38,0, +46,0, 47,0, 61,0, 99,116,105,111,110,0, 117,116,116,111,110,0, +111,108,111,114,0, 110,116,114,121,0, 105,101,108,100,0, +105,103,104,108,105,103,104,116,0, 110,116,0, +111,99,97,116,105,111,110,0, 122,101,0, 114,105,110,103,0, +105,116,108,101,0, 124,0, 38,0, 46,0, 47,0, 99,116,105,111,110,0, +117,116,116,111,110,0, 111,108,111,114,0, 110,116,114,121,0, +105,101,108,100,0, 105,103,104,108,105,103,104,116,0, 110,116,0, +111,99,97,116,105,111,110,0, 122,101,0, 114,105,110,103,0, +105,116,108,101,0, 124,0, 46,0, 47,0, 99,116,105,111,110,0, +117,116,116,111,110,0, 111,108,111,114,0, 110,116,114,121,0, +105,101,108,100,0, 105,103,104,108,105,103,104,116,0, 110,116,0, +111,99,97,116,105,111,110,0, 122,101,0, 114,105,110,103,0, +105,116,108,101,0, 124,0, 61,0, 38,0, 46,0, 61,0, +99,116,105,111,110,0, 117,116,116,111,110,0, 111,108,111,114,0, +111,0, 115,101,0, 116,114,121,0, 105,101,108,100,0, +105,103,104,108,105,103,104,116,0, 110,116,0, +111,99,97,116,105,111,110,0, 122,101,0, 114,105,110,103,0, +105,116,108,101,0, 104,105,108,101,0, 124,0, 47,0, +120,112,108,97,110,97,116,105,111,110,0, 114,111,109,112,116,0, +47,0, 101,102,97,117,108,116,0, 120,112,108,97,110,97,116,105,111,110,0, +114,111,109,112,116,0, 97,114,105,97,98,108,101,0, 42,0, +111,108,111,114,0, 111,108,111,114,0, 110,0, 47,0, 62,0, 111,0, +47,0, 99,116,105,111,110,0, 108,115,101,0, 111,114,0, 116,0, +114,101,101,110,0, 114,105,110,103,0, 104,105,108,101,0, +108,115,101,0, 102,0, 47,0, 102,0, 61,0, 61,0, 111,0, 102,0, +46,0, 61,0, 38,0, 46,0, 61,0, 61,0, 99,116,105,111,110,0, +117,116,116,111,110,0, 111,108,111,114,0, 111,0, 110,116,114,121,0, +105,101,108,100,0, 105,103,104,108,105,103,104,116,0, 110,116,0, +111,99,97,116,105,111,110,0, 122,101,0, 114,105,110,103,0, +105,116,108,101,0, 124,0, +}; + +#define AG_TCV(x) ag_tcv[(x)] + +static const unsigned short far ag_tcv[] = { + 27,195,195,195,195,195,195,195,195, 10, 16, 10, 10, 10,195,195,195,195, + 195,195,195,195,195,195,195,195, 27,195,195,195,195,195, 10,246, 55,205, + 195,244,234,171,215,214,242,240,254,241,195,243,169,196,196,196,196,196, + 196,196,197,197,229,218,209,217,211,230,219,168,168,168,168,168,168,198, + 198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198, + 198,204, 75,203,233,198,195,168,168,168,168,168,168,198,198,198,198,198, + 198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,207,210,206, + 245,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195, + 195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195, + 195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195, + 195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195, + 195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195, + 195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195, + 195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195,195, + 195,195,195,195 +}; + +#ifndef SYNTAX_ERROR +#define SYNTAX_ERROR fprintf(stderr,"%s, line %d, column %d\n", \ + (PCB).error_message, (PCB).line, (PCB).column) +#endif + +#ifndef FIRST_LINE +#define FIRST_LINE 1 +#endif + +#ifndef FIRST_COLUMN +#define FIRST_COLUMN 1 +#endif + +#ifndef PARSER_STACK_OVERFLOW +#define PARSER_STACK_OVERFLOW {fprintf(stderr, \ + "\nParser stack overflow, line %d, column %d\n",\ + (PCB).line, (PCB).column);} +#endif + +#ifndef REDUCTION_TOKEN_ERROR +#define REDUCTION_TOKEN_ERROR {fprintf(stderr, \ + "\nReduction token error, line %d, column %d\n", \ + (PCB).line, (PCB).column);} +#endif + + +#ifndef INPUT_CODE +#define INPUT_CODE(T) (T) +#endif + +typedef enum + {ag_accept_key, ag_set_key, ag_jmp_key, ag_end_key, ag_no_match_key, + ag_cf_accept_key, ag_cf_set_key, ag_cf_end_key} key_words; + +static void ag_get_key_word(int ag_k) { + int ag_save = (int) ((PCB).la_ptr - (PCB).pointer); + const unsigned char *ag_p; + int ag_ch; + while (1) { + switch (ag_key_act[ag_k]) { + case ag_cf_end_key: { + const unsigned char *sp = ag_key_ends + ag_key_jmp[ag_k]; + do { + if ((ag_ch = *sp++) == 0) { + int ag_k1 = ag_key_parm[ag_k]; + int ag_k2 = ag_key_pt[ag_k1]; + if (ag_key_itt[ag_k2 + CONVERT_CASE(*(PCB).la_ptr)]) goto ag_fail; + (PCB).token_number = (dsl_token_type) ag_key_pt[ag_k1 + 1]; + return; + } + } while (CONVERT_CASE(*(PCB).la_ptr++) == ag_ch); + goto ag_fail; + } + case ag_end_key: { + const unsigned char *sp = ag_key_ends + ag_key_jmp[ag_k]; + do { + if ((ag_ch = *sp++) == 0) { + (PCB).token_number = (dsl_token_type) ag_key_parm[ag_k]; + return; + } + } while (CONVERT_CASE(*(PCB).la_ptr++) == ag_ch); + } + case ag_no_match_key: +ag_fail: + (PCB).la_ptr = (PCB).pointer + ag_save; + return; + case ag_cf_set_key: { + int ag_k1 = ag_key_parm[ag_k]; + int ag_k2 = ag_key_pt[ag_k1]; + ag_k = ag_key_jmp[ag_k]; + if (ag_key_itt[ag_k2 + CONVERT_CASE(*(PCB).la_ptr)]) break; + ag_save = (int) ((PCB).la_ptr - (PCB).pointer); + (PCB).token_number = (dsl_token_type) ag_key_pt[ag_k1+1]; + break; + } + case ag_set_key: + ag_save = (int) ((PCB).la_ptr - (PCB).pointer); + (PCB).token_number = (dsl_token_type) ag_key_parm[ag_k]; + case ag_jmp_key: + ag_k = ag_key_jmp[ag_k]; + break; + case ag_accept_key: + (PCB).token_number = (dsl_token_type) ag_key_parm[ag_k]; + return; + case ag_cf_accept_key: { + int ag_k1 = ag_key_parm[ag_k]; + int ag_k2 = ag_key_pt[ag_k1]; + if (ag_key_itt[ag_k2 + CONVERT_CASE(*(PCB).la_ptr)]) + (PCB).la_ptr = (PCB).pointer + ag_save; + else (PCB).token_number = (dsl_token_type) ag_key_pt[ag_k1+1]; + return; + } + } + ag_ch = CONVERT_CASE(*(PCB).la_ptr++); + ag_p = &ag_key_ch[ag_k]; + if (ag_ch <= 255) while (*ag_p < ag_ch) ag_p++; + if (ag_ch > 255 || *ag_p != ag_ch) { + (PCB).la_ptr = (PCB).pointer + ag_save; + return; + } + ag_k = (int) (ag_p - ag_key_ch); + } +} + + +#ifndef AG_NEWLINE +#define AG_NEWLINE 10 +#endif + +#ifndef AG_RETURN +#define AG_RETURN 13 +#endif + +#ifndef AG_FORMFEED +#define AG_FORMFEED 12 +#endif + +#ifndef AG_TABCHAR +#define AG_TABCHAR 9 +#endif + +static void ag_track(void) { + int ag_k = (int) ((PCB).la_ptr - (PCB).pointer); + while (ag_k--) { + switch (*(PCB).pointer++) { + case AG_NEWLINE: + (PCB).column = 1, (PCB).line++; + case AG_RETURN: + case AG_FORMFEED: + break; + case AG_TABCHAR: + (PCB).column += (TAB_SPACING) - ((PCB).column - 1) % (TAB_SPACING); + break; + default: + (PCB).column++; + } + } +} + + +static void ag_prot(void) { + int ag_k; + ag_k = 128 - ++(PCB).btsx; + if (ag_k <= (PCB).ssx) { + (PCB).exit_flag = AG_STACK_ERROR_CODE; + PARSER_STACK_OVERFLOW; + return; + } + (PCB).bts[(PCB).btsx] = (PCB).sn; + (PCB).bts[ag_k] = (PCB).ssx; + (PCB).vs[ag_k] = (PCB).vs[(PCB).ssx]; + (PCB).ss[ag_k] = (PCB).ss[(PCB).ssx]; + (PCB).cs[ag_k] = (PCB).cs[(PCB).ssx]; +} + +static void ag_undo(void) { + if ((PCB).drt == -1) return; + while ((PCB).btsx) { + int ag_k = 128 - (PCB).btsx; + (PCB).sn = (PCB).bts[(PCB).btsx--]; + (PCB).ssx = (PCB).bts[ag_k]; + (PCB).vs[(PCB).ssx] = (PCB).vs[ag_k]; + (PCB).ss[(PCB).ssx] = (PCB).ss[ag_k]; + (PCB).cs[(PCB).ssx] = (PCB).cs[ag_k]; + } + (PCB).token_number = (dsl_token_type) (PCB).drt; + (PCB).ssx = (PCB).dssx; + (PCB).sn = (PCB).dsn; + (PCB).drt = -1; +} + + + +static const int far ag_rtt[] = { + 29, 30, 31, 0,154,157,155,158, 0 +}; + +static const unsigned short far ag_tstt[] = { +228,227,226,207,27,17,16,14,10,0,1,11,12,119,199, +254,246,245,244,243,242,241,240,234,233,230,229,219,218,217,215,214,211,210, + 209,207,206,205,204,203,198,197,196,195,171,169,168,75,55,16,14,13,10,0, + 11,12, +14,10,0,1,11,12, +228,227,226,207,27,17,16,0,7,21,22,23,24,25,26,43,116,117,118,200, +254,246,245,244,243,242,241,240,234,233,230,229,219,218,217,215,214,211,210, + 209,207,206,205,204,203,198,197,196,195,171,169,168,75,55,16,10,0,19,20, +198,168,14,10,0,1,11,12,119,199, +198,168,14,10,0,1,11,12,119,199, +254,246,245,244,243,242,241,240,234,233,230,229,218,198,197,196,195,171,169, + 168,75,14,10,0,1,11,12,119,199, +263,262,261,260,259,258,257,256,255,254,253,252,251,250,246,245,244,243,242, + 241,240,234,233,230,229,228,227,226,224,220,219,218,217,216,215,211,210, + 209,207,206,205,198,197,196,195,171,169,168,75,55,17,16,14,10,0,1,11,12, + 119,199, +263,262,261,260,259,258,257,256,255,254,253,252,251,250,246,245,244,243,242, + 241,240,234,233,230,229,228,227,226,224,220,219,218,217,216,215,213,211, + 210,209,207,206,205,198,197,196,195,171,169,168,75,55,27,17,16,14,10,0, + 1,11,12,119,199, +198,168,0,9,223, +198,168,0,9,223, +254,246,245,244,243,242,241,240,234,233,230,229,218,198,197,196,195,171,169, + 168,75,0,8,208,225, +254,250,246,245,244,243,242,241,240,234,233,230,229,228,227,226,224,220,218, + 216,215,206,198,197,196,195,171,169,168,75,55,17,16,0,7,89,90,200, +228,227,226,207,17,16,0,7,22,23,24,43,116,117,118,200, +27,0, +254,246,245,244,243,242,241,240,234,233,230,229,219,218,217,215,214,211,210, + 209,207,206,205,204,203,198,197,196,195,171,169,168,75,55,10,0, +16,0, +254,249,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,219, + 218,217,215,214,212,211,210,209,207,206,205,204,198,197,196,169,168,27, + 17,16,14,10,0,1,11,12,119,121,199, +217,0,105, +217,0,105, +254,246,245,244,243,242,241,240,234,233,230,229,218,198,197,196,195,171,169, + 168,75,0, +207,14,10,0,1,11,12,119,199, +207,0,40,41,43, +17,16,0,7,200, +254,250,246,245,244,243,242,241,240,234,233,230,229,228,227,226,224,220,218, + 216,215,206,198,197,196,195,171,169,168,75,55,0,2,4,5,23,28,29,30,31,36, + 48,54,80,81,85,91,92,93,94,96,97,98,100,101,102,103,104,111,112,116,117, + 118,174,175,201,202,208, +254,246,245,244,243,242,241,240,234,233,230,229,219,218,217,215,211,210,209, + 207,206,205,198,197,196,195,171,169,168,165,164,75,55,17,16,14,10,0,1, + 11,12,119,199, +217,215,207,198,168,55,0,4,9,40,41,43,50,54,105,108,152,153,157,158,202,223, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,99,105,108,110,122,125,127,129,130,132,134,137,140, + 142,143,144,145,150,151,152,153,154,155,157,158,161,162,163,166,202,223, + 247,248, +254,246,245,244,243,242,241,240,234,233,230,229,218,198,197,196,195,171,169, + 168,75,14,10,0,1,11,12,208, +254,246,245,244,243,242,241,240,234,233,230,229,219,218,217,215,211,210,209, + 207,206,205,198,197,196,195,171,169,168,75,55,17,16,0,2,4,5,7,37,40,41, + 42,43,44,48,54,84,86,87,105,109,200,201,202,208, +254,246,245,244,243,242,241,240,234,233,230,229,219,218,217,215,214,211,210, + 209,207,206,205,204,203,198,197,196,195,171,169,168,77,75,69,68,67,66, + 65,64,63,62,61,60,59,55,10,0,56,58,70,71,72,73,74, +254,246,245,244,243,242,241,240,234,233,230,229,219,218,217,215,214,211,210, + 209,207,206,205,204,203,198,197,196,195,171,169,168,75,55,16,10,0,51,53, +263,258,257,256,255,254,253,252,251,249,246,245,244,243,242,241,240,239,238, + 237,236,235,234,233,232,231,230,229,228,227,226,221,219,218,217,215,214, + 212,211,210,209,207,206,205,204,203,198,197,196,195,171,169,168,75,55, + 27,17,16,14,10,0,1,11,12,119,199, +254,246,245,244,243,242,241,240,234,233,230,229,221,219,218,217,215,214,212, + 211,210,209,207,206,205,204,203,198,197,196,195,171,169,168,75,55,17,16, + 14,10,0,1,11,12,119,199, +215,14,10,0,1,11,12,119,199, +207,14,10,0,1,11,12,119,199, +254,246,245,244,243,242,241,240,234,233,230,229,219,218,217,215,214,212,211, + 210,209,207,206,205,204,203,198,197,196,195,171,169,168,75,55,17,16,14, + 10,0,1,11,12,119,199, +204,0,32, +215,14,10,0,1,11,12,119,199, +215,0,50, +207,0,43, +198,168,14,10,0,1,11,12,119,199, +205,0,37, +215,0,50, +263,258,257,256,255,253,252,251,206,17,16,0,7,42,176,178,179,180,181,183, + 184,185,186,187,192,200, +198,168,0,9,223, +219,217,0,105,109, +217,0,105, +217,0,105, +212,211,210,0,86,87,88, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,212,211,210,209,207, + 206,198,197,196,195,171,169,168,75,55,17,16,0,2,4,5,28,29,30,31,34,38, + 40,41,43,48,54,82,83,201,202,208, +207,0,40,41,43, +220,0,103,111, +213,206,17,16,0,7,89,90,200, +206,17,16,0,7,89,90,200, +206,0,42, +254,246,245,244,243,242,241,240,234,233,230,229,218,217,215,207,205,198,197, + 196,195,171,169,168,165,164,75,55,14,10,0,1,11,12,119,199, +217,215,207,198,168,55,0,4,9,40,41,43,50,54,105,108,152,153,157,158,202,223, +217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6,9,37,40,41,43,50, + 54,105,110,152,153,154,155,157,158,161,162,163,166,202,223,247,248, +219,204,0,32,109, +228,227,226,218,207,206,205,27,17,16,0,37,106,107, +254,246,245,244,243,242,241,240,234,233,230,229,219,218,217,215,214,211,210, + 209,207,206,205,204,203,198,197,196,195,169,168,77,75,69,68,67,66,65,64, + 63,62,61,60,59,55,10,0,58,70,71,72,73,74,172, +197,196,169,0, +196,169,0, +197,196,169,168,0,79, +254,246,245,244,243,242,241,240,234,233,230,229,219,218,217,215,211,210,209, + 207,206,205,198,197,196,195,171,169,168,75,55,17,16,14,10,0,1,11,12,119, + 199, +263,258,257,256,255,254,253,252,251,249,244,243,242,241,240,239,238,237,236, + 235,234,233,232,231,230,229,228,227,226,219,218,217,214,212,211,210,209, + 207,206,205,204,27,17,16,14,10,0,1,11,12,119,199, +263,258,257,256,255,254,253,252,251,249,244,243,242,241,240,239,238,237,236, + 235,234,233,232,231,230,229,228,227,226,219,218,217,214,212,211,210,209, + 207,206,205,204,27,17,16,14,10,0,1,11,12,119,199, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,14,10,0, + 1,11,12,119,199, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,14,10,0, + 1,11,12,119,199, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,14,10,0, + 1,11,12,119,199, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,14,10,0, + 1,11,12,119,199, +215,0,50,156, +217,215,207,198,168,55,0,4,9,40,41,43,50,54,105,153,157,158,202,223, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,105,110,143,144,145,150,151,152,153,154,155,157,158, + 161,162,163,166,202,223,247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,105,110,143,144,145,150,151,152,153,154,155,157,158, + 161,162,163,166,202,223,247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,105,110,143,144,145,150,151,152,153,154,155,157,158, + 161,162,163,166,202,223,247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,105,110,143,144,145,150,151,152,153,154,155,157,158, + 161,162,163,166,202,223,247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,99,105,108,110,122,125,127,129,130,132,134,137,140, + 142,143,144,145,150,151,152,153,154,155,157,158,161,162,163,166,202,223, + 247,248, +244,243,242,0,146,147,149, +241,240,0,143,144, +219,204,0,32,109, +239,212,0,88,141, +238,237,236,235,211,209,205,0,37,84,87,135,136,138,139, +238,237,211,209,0,84,87,138,139, +236,235,0,135,136, +234,0,133, +233,0,131, +210,0,86, +232,0,128, +231,230,0,123,126, +228,227,226,218,207,206,27,17,16,0,106,107, +254,246,245,244,243,242,241,240,234,233,230,229,218,198,197,196,195,171,169, + 168,75,0, +254,246,245,244,243,242,241,240,234,233,230,229,219,218,217,215,211,210,209, + 207,206,205,198,197,196,195,171,169,168,165,164,75,55,17,16,14,10,0,1, + 11,12,119,199, +254,246,245,244,243,242,241,240,234,233,230,229,219,218,217,215,211,210,209, + 207,206,205,198,197,196,195,171,169,168,165,164,75,55,17,16,14,10,0,1, + 11,12,119,199, +254,246,245,244,243,242,241,240,234,233,230,229,219,218,217,215,211,210,209, + 207,206,205,198,197,196,195,171,169,168,165,164,75,55,17,16,14,10,0,1, + 11,12,119,199, +254,246,245,244,243,242,241,240,234,233,230,229,219,218,217,215,211,210,209, + 207,206,205,198,197,196,195,171,169,168,165,164,75,55,17,16,14,10,0,1, + 11,12,119,199, +204,0,32, +263,258,257,256,255,254,253,252,251,249,246,245,244,243,242,241,240,239,238, + 237,236,235,234,233,232,231,230,229,228,227,226,221,220,219,218,217,215, + 214,213,212,211,210,209,207,206,205,204,203,198,197,196,195,171,169,168, + 75,55,27,17,16,14,10,0,1,11,12,119,199, +196,169,0, +197,196,169,168,0,78,79, +196,169,0, +196,169,0, +215,0,48, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,207,198,197,196,195, + 171,169,168,75,55,14,10,0,1,11,12,119,199, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,207,198,197,196,195, + 171,169,168,75,55,0,33, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,99,105,108,110,122,125,127,129,130,132,134,137,140, + 142,143,144,145,150,151,152,153,154,155,157,158,161,162,163,166,202,223, + 247,248, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,198,197,196,195,171, + 169,168,75,55,0,2,4,5,28,29,30,31,48,54,201,202,208, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,99,105,108,110,122,125,127,129,130,132,134,137,140, + 142,143,144,145,150,151,152,153,154,155,157,158,161,162,163,166,202,223, + 247,248, +207,14,10,0,1,11,12,119,199, +207,0,43, +262,261,207,206,17,16,0,7,40,41,42,43,190,191,200, +207,14,10,0,1,11,12,119,199, +207,0,43, +262,261,260,259,206,17,16,0,7,42,188,189,190,191,200, +217,14,10,0,1,11,12,119,199, +217,0,105, +217,14,10,0,1,11,12,119,199, +217,0,105, +257,14,10,0,1,11,12,119,199, +257,0,178,186, +257,14,10,0,1,11,12,119,199, +257,0,178,186, +217,14,10,0,1,11,12,119,199, +217,0,105, +17,16,0,7,200, +217,14,10,0,1,11,12,119,199, +217,0,105, +222,0,113, +217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6,9,37,40,41,43,50, + 54,105,110,152,153,154,155,157,158,161,162,163,166,202,223,247,248, +217,215,207,198,168,55,0,4,9,40,41,43,50,54,105,108,152,153,157,158,202,223, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,99,105,108,110,122,125,127,129,130,132,134,137,140, + 142,143,144,145,150,151,152,153,154,155,157,158,161,162,163,166,202,223, + 247,248, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,207,198,197,196,195, + 171,169,168,75,55,0,2,4,5,28,29,30,31,34,38,40,41,43,48,54,201,202,208, +254,246,245,244,243,242,241,240,234,233,230,229,218,217,215,207,205,198,197, + 196,195,171,169,168,165,164,75,55,14,10,0,1,11,12,119,199, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,207,198,197,196,195, + 171,169,168,75,55,0,2,4,5,28,29,30,31,34,38,40,41,43,48,54,201,202,208, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,207,198,197,196,195, + 171,169,168,75,55,0,2,4,5,28,29,30,31,34,38,40,41,43,48,54,201,202,208, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,198,197,196,195,171, + 169,168,75,55,0,2,4,5,28,29,30,31,36,48,54,81,201,202,208, +204,0,32, +205,0,37, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,207,198,197,196,195, + 171,169,168,75,55,0,2,4,5,28,29,30,31,34,38,40,41,43,48,54,201,202,208, +212,211,210,209,206,17,16,0,84, +254,250,246,245,244,243,242,241,240,234,233,230,229,228,227,226,224,220,218, + 216,215,198,197,196,195,171,169,168,75,55,17,16,0,2,4,5,7,23,28,29,30, + 31,36,48,54,80,81,85,94,96,97,98,100,101,102,103,104,111,112,116,117, + 118,174,175,200,201,202,208, +213,0,95, +254,250,246,245,244,243,242,241,240,234,233,230,229,228,227,226,224,220,218, + 216,215,198,197,196,195,171,169,168,75,55,17,16,0,2,4,5,7,23,28,29,30, + 31,36,48,54,80,81,85,94,96,97,98,100,101,102,103,104,111,112,116,117, + 118,174,175,200,201,202,208, +214,205,0,37,49, +219,204,0,32,109, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,207,198,197,196,195, + 171,169,168,75,55,0,160, +215,0,50, +217,215,207,198,168,55,0,4,9,40,41,43,50,54,105,152,153,157,158,202,223, +228,227,226,207,206,27,17,16,14,10,0,1,11,12,119,199, +171,0, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,207,198,197,196,195, + 171,169,168,75,55,0,2,4,5,28,29,30,31,34,38,40,41,43,48,54,201,202,208, +238,237,236,235,214,211,209,205,0,37,49,84,87,135,136,138,139, +214,0,49, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,14,10,0, + 1,11,12,119,199, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,105,110,143,144,145,148,150,151,152,153,154,155,157, + 158,161,162,163,166,202,223,247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,14,10,0, + 1,11,12,119,199, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,105,110,143,144,145,148,150,151,152,153,154,155,157, + 158,161,162,163,166,202,223,247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,14,10,0, + 1,11,12,119,199, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,105,110,143,144,145,150,151,152,153,154,155,157,158, + 161,162,163,166,202,223,247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,105,110,142,143,144,145,150,151,152,153,154,155,157, + 158,161,162,163,166,202,223,247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,105,110,142,143,144,145,150,151,152,153,154,155,157, + 158,161,162,163,166,202,223,247,248, +217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6,9,37,40,41,43,50, + 54,105,110,152,153,154,155,157,158,161,162,163,166,202,223,247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,105,110,140,142,143,144,145,150,151,152,153,154,155, + 157,158,161,162,163,166,202,223,247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,14,10,0, + 1,11,12,119,199, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,105,110,140,142,143,144,145,150,151,152,153,154,155, + 157,158,161,162,163,166,202,223,247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,14,10,0, + 1,11,12,119,199, +217,215,207,198,168,55,0,4,9,40,41,43,50,54,105,108,152,153,157,158,202,223, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,14,10,0, + 1,11,12,119,199, +217,215,207,198,168,55,0,4,9,40,41,43,50,54,105,108,152,153,157,158,202,223, +217,215,207,198,168,55,0,4,9,40,41,43,50,54,105,108,152,153,157,158,202,223, +217,215,207,198,168,55,0,4,9,40,41,43,50,54,105,108,152,153,157,158,202,223, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,14,10,0, + 1,11,12,119,199, +217,215,207,198,168,55,0,4,9,40,41,43,50,54,105,108,152,153,157,158,202,223, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,14,10,0, + 1,11,12,119,199, +217,215,207,198,168,55,0,4,9,40,41,43,50,54,105,108,152,153,157,158,202,223, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,105,110,137,140,142,143,144,145,150,151,152,153,154, + 155,157,158,161,162,163,166,202,223,247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,105,110,137,140,142,143,144,145,150,151,152,153,154, + 155,157,158,161,162,163,166,202,223,247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,105,110,137,140,142,143,144,145,150,151,152,153,154, + 155,157,158,161,162,163,166,202,223,247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,105,110,137,140,142,143,144,145,150,151,152,153,154, + 155,157,158,161,162,163,166,202,223,247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,105,108,110,134,137,140,142,143,144,145,150,151,152, + 153,154,155,157,158,161,162,163,166,202,223,247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,105,108,110,134,137,140,142,143,144,145,150,151,152, + 153,154,155,157,158,161,162,163,166,202,223,247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,14,10,0, + 1,11,12,119,199, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,105,108,110,132,134,137,140,142,143,144,145,150,151, + 152,153,154,155,157,158,161,162,163,166,202,223,247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,14,10,0, + 1,11,12,119,199, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,105,108,110,130,132,134,137,140,142,143,144,145,150, + 151,152,153,154,155,157,158,161,162,163,166,202,223,247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,105,108,110,129,130,132,134,137,140,142,143,144,145, + 150,151,152,153,154,155,157,158,161,162,163,166,202,223,247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,14,10,0, + 1,11,12,119,199, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,105,108,110,127,129,130,132,134,137,140,142,143,144, + 145,150,151,152,153,154,155,157,158,161,162,163,166,202,223,247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,14,10,0, + 1,11,12,119,199, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,105,108,110,125,127,129,130,132,134,137,140,142,143, + 144,145,150,151,152,153,154,155,157,158,161,162,163,166,202,223,247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,14,10,0, + 1,11,12,119,199, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,99,105,108,110,122,125,127,129,130,132,134,137,140, + 142,143,144,145,150,151,152,153,154,155,157,158,161,162,163,166,202,223, + 247,248, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,207,198,197,196,195, + 171,169,168,75,55,0,2,4,5,40,41,43,44,46,47,48,54,201,202,208, +197,196,169,168,0,79, +254,246,245,244,243,242,241,240,234,233,230,229,219,218,217,215,214,211,210, + 209,207,206,205,204,203,198,197,196,195,171,169,168,75,55,16,10,0,51,53, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,207,198,197,196,195, + 171,169,168,75,55,0,2,4,5,28,29,30,31,34,38,40,41,43,48,54,201,202,208, +214,0,49, +204,0,32, +214,0,49, +17,16,0,7,200, +217,14,10,0,1,11,12,119,199, +217,0,105, +217,14,10,0,1,11,12,119,199, +217,0,105, +17,16,0,7,200, +217,0,105, +217,0,105, +217,14,10,0,1,11,12,119,199, +217,0,105, +217,14,10,0,1,11,12,119,199, +217,0,105, +17,16,0,7,200, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,99,105,108,110,122,125,127,129,130,132,134,137,140, + 142,143,144,145,150,151,152,153,154,155,157,158,161,162,163,166,202,223, + 247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,99,105,108,110,122,125,127,129,130,132,134,137,140, + 142,143,144,145,150,151,152,153,154,155,157,158,161,162,163,166,202,223, + 247,248, +17,16,0,7,200, +17,16,0,7,200, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,99,105,108,110,122,125,127,129,130,132,134,137,140, + 142,143,144,145,150,151,152,153,154,155,157,158,161,162,163,166,202,223, + 247,248, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,198,197,196,195,171, + 169,168,75,55,0,2,4,5,48,54,177,193,201,202,208, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,207,198,197,196,195, + 171,169,168,75,55,14,10,0,1,11,12,119,199, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,207,198,197,196,195, + 171,169,168,75,55,0,2,4,5,28,29,30,31,34,38,40,41,43,48,54,201,202,208, +217,0,105, +218,206,205,17,16,0,37,106,107, +218,206,17,16,0,106,107, +205,0,37, +205,0,37, +205,0,37, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,212,211,210,207,206, + 198,197,196,195,171,169,168,75,55,17,16,0,2,4,5,28,29,30,31,34,38,40,41, + 43,48,54,82,83,201,202,208, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,207,198,197,196,195, + 171,169,168,75,55,0,2,4,5,28,29,30,31,38,40,41,43,48,54,201,202,208, +205,0,37, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,207,198,197,196,195, + 171,169,168,75,55,0,2,4,5,28,29,30,31,34,38,40,41,43,48,54,201,202,208, +216,207,17,16,14,10,0,1,11,12,119,199, +216,207,17,16,0,7,40,41,43,89,90,200, +263,258,257,256,255,254,253,252,251,249,244,243,242,241,240,239,238,237,236, + 235,234,233,232,231,230,229,228,227,226,219,218,217,214,212,211,210,209, + 207,206,205,204,27,17,16,14,10,0,1,11,12,119,199, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,207,198,197,196,195, + 171,169,168,75,55,0,2,4,5,28,29,30,31,34,38,40,41,43,48,54,201,202,208, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,99,105,108,110,122,125,127,129,130,132,134,137,140, + 142,143,144,145,150,151,152,153,154,155,157,158,161,162,163,166,202,223, + 247,248, +219,204,0,32,109, +214,205,0,37,49, +244,243,242,0,146,147,149, +244,243,242,0,146,147,149, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,99,105,108,110,122,125,127,129,130,132,134,137,140, + 142,143,144,145,150,151,152,153,154,155,157,158,161,162,163,166,202,223, + 247,248, +241,240,0,143,144, +241,240,0,143,144, +205,0,37, +205,0,37, +205,0,37, +205,0,37, +205,0,37, +205,0,37, +239,212,0,88,141, +239,212,0,88,141, +239,212,0,88,141, +239,212,0,88,141, +238,237,211,209,205,0,37,84,87,138,139, +238,237,211,209,0,84,87,138,139, +238,237,211,209,0,84,87,138,139, +236,235,0,135,136, +234,0,133, +233,0,131, +210,0,86, +232,0,128, +229,0,124, +204,0,32, +205,203,0,35,37, +205,203,0,35,37, +207,0,40,41,43, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,198,197,196,195,171, + 169,168,75,55,0,2,4,5,48,54,177,193,201,202,208, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,198,197,196,195,171, + 169,168,75,55,0,2,4,5,48,54,177,193,201,202,208, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,198,197,196,195,171, + 169,168,75,55,0,2,4,5,48,54,177,193,201,202,208, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,198,197,196,195,171, + 169,168,75,55,0,2,4,5,48,54,177,193,201,202,208, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,198,197,196,195,171, + 169,168,75,55,0,2,4,5,48,54,177,193,201,202,208, +254,246,245,244,243,242,241,240,234,233,230,229,218,198,197,196,195,171,169, + 168,75,0,2,208, +254,0,182, +254,0,182, +254,0,182, +204,0,32, +205,17,16,0,7,37,200, +221,207,205,0,37,114,115, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,99,105,108,110,122,125,127,129,130,132,134,137,140, + 142,143,144,145,150,151,152,153,154,155,157,158,161,162,163,166,202,223, + 247,248, +212,211,210,206,17,16,0, +212,211,210,206,205,17,16,0,37, +216,0,97,98, +205,203,0,35,37, +249,0,159, +249,214,0,49,159, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,14,10,0, + 1,11,12,119,199, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,99,105,108,110,122,125,127,129,130,132,134,137,140, + 142,143,144,145,150,151,152,153,154,155,157,158,161,162,163,166,202,223, + 247,248, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,207,198,197,196,195, + 171,169,168,75,55,0,2,4,5,40,41,43,44,47,48,54,201,202,208, +263,258,257,256,255,254,253,252,251,249,246,245,244,243,242,241,240,238,237, + 236,235,234,233,232,231,230,229,228,227,226,221,219,218,217,215,214,212, + 211,210,209,207,206,205,204,203,198,197,196,195,171,169,168,75,55,27,17, + 16,14,10,0,1,11,12,119,199, +205,17,16,0,7,37,200, +205,17,16,0,7,37,200, +205,17,16,0,7,37,200, +205,17,16,0,7,37,200, +205,17,16,0,7,37,200, +17,16,0,7,200, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,14,10,0, + 1,11,12,119,199, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,99,105,108,110,122,125,127,129,130,132,134,137,140, + 142,143,144,145,150,151,152,153,154,155,157,158,161,162,163,166,202,223, + 247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,99,105,108,110,122,125,127,129,130,132,134,137,140, + 142,143,144,145,150,151,152,153,154,155,157,158,161,162,163,166,202,223, + 247,248, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,99,105,108,110,122,125,127,129,130,132,134,137,140, + 142,143,144,145,150,151,152,153,154,155,157,158,161,162,163,166,202,223, + 247,248, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,207,198,197,196,195, + 171,169,168,75,55,0,194, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,198,197,196,195,171, + 169,168,75,55,0,2,4,5,48,54,193,201,202,208, +207,14,10,0,1,11,12,119,199, +207,0,40,41,43, +218,206,17,16,0,106,107, +207,0,40,41,43, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,14,10,0, + 1,11,12,119,199, +246,245,241,240,217,215,207,205,198,197,196,171,169,168,165,164,55,0,3,4,6, + 9,37,40,41,43,50,54,99,105,108,110,122,125,127,129,130,132,134,137,140, + 142,143,144,145,150,151,152,153,154,155,157,158,161,162,163,166,202,223, + 247,248, +254,246,245,244,243,242,241,240,234,233,230,229,218,215,207,198,197,196,195, + 171,169,168,75,55,0,2,4,5,28,29,30,31,34,38,40,41,43,48,54,201,202,208, +204,0,32, +214,0,49, +205,203,0,35,37, + +}; + + +static unsigned const char far ag_astt[6843] = { + 8,8,8,8,8,8,8,1,1,7,1,1,1,1,1,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,1,3,9,7,3,1,1,9,5,3,3,1,1,1,1,1,8,1,1,7,1,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,8,1,7,1,1,5,5,1,1,7,1,1,1,1,3,5,5,1,1,7,1,1,1,1,3,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7,1,1,1,1,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 1,1,7,1,1,1,1,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7,1,1,1,1,3,2,2,7,1, + 1,2,2,7,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,7,1,1,1,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,5,8,8,8,8,8,8,8,8,8,1,1,7,1,1,1,1,1,1,1,1,1, + 1,5,3,3,3,3,1,1,1,1,1,3,7,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,5,3,7,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,10,10,10,10,10,5,5,5,1,1,7,1,1,1,1,2,3,1,7,1,1,7,1,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,4,5,1,1,7,1,1,1,1, + 3,1,7,2,1,2,1,1,5,3,1,2,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,2,1,2,8,2,2,2,2, + 2,2,2,2,2,7,2,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,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,1,1,7,1,1,1,1,3,1,1,1,2,2,2,7,1,2,2,1,2,1,1,1,1,1,1,2,2,1,1,1,1,1,1, + 1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,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,1,1,1,2,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,1,9,5,3,3,1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,1,1,1,1,2,2,2,2, + 2,2,2,2,2,1,1,7,2,2,2,3,3,2,1,3,2,1,1,1,3,3,3,3,3,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,1,1,2,2,2,2,2,2,2,2,2,2,2, + 3,2,7,3,2,2,2,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,3,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,7,3,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7,1, + 1,1,1,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,1,1,7,1,1,1,1,3,5,1,1,7,1,1,1,1,3,5,1,1,7,1,1,1,1,3,10,10,10,10, + 10,10,10,10,10,10,10,10,5,10,5,5,5,5,5,5,5,5,5,5,5,5,10,10,10,10,10,10,10, + 10,5,5,5,1,1,7,1,1,1,1,3,1,5,1,5,1,1,7,1,1,1,1,3,1,7,1,1,7,2,5,5,1,1,7,1,1, + 1,1,3,1,4,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,7,3,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2, + 7,1,1,1,1,4,1,1,1,4,1,1,4,1,1,1,1,7,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,5,5, + 5,8,1,5,2,2,2,2,2,2,2,2,2,5,5,7,2,1,1,1,2,2,2,1,1,2,1,2,1,1,1,1,1,1,1,1,7, + 2,1,2,1,5,3,1,8,5,1,1,7,1,1,1,1,5,1,1,7,1,1,3,1,1,7,3,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7,1,1,1,1,3,1,1,1,2,2,2,7,1,2,2,1, + 2,1,1,1,1,1,1,2,2,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,1,1,1,2, + 1,1,2,1,2,2,1,1,1,2,1,1,1,1,1,1,5,1,1,5,5,5,1,5,5,1,5,5,5,7,1,2,2,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,1,1,7,1,1,1,1,1,1,1,10,10,10,5,10,10,5,2,2,2,2,5,2,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7,1,1,1,1,3,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,1,1,7,1,1,1,1,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7,1,1,1,1,3,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,1,1,7,1,1,1,1,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7,1,1,1,1, + 3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7,1,1,1,1,3,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,1,1,7,1,1,1,1,3,1,7,1,2,1,1,1,2,2,2,7,2,2,2,1,2,1,1,1,2,2,2,1, + 1,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,1,1,1,2,1,1,2,1,1,1, + 1,2,1,2,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2, + 1,2,1,1,1,2,1,1,2,1,1,1,1,2,1,2,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1, + 2,2,2,2,2,7,2,1,2,2,1,2,1,2,1,1,1,2,1,1,2,1,1,1,1,2,1,2,2,1,1,1,2,1,1,1,1, + 1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,1,1,1,2,1,1,2,1,1,1,1, + 2,1,2,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1, + 2,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,1,1,1,2,1,1,1,1,1, + 1,1,5,1,1,1,1,1,5,1,1,1,1,5,1,1,1,1,5,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1,1,1,1, + 1,1,1,5,1,1,1,1,1,1,5,1,1,1,5,1,1,5,1,1,5,1,1,5,1,1,1,5,1,1,5,5,5,1,5,5,5, + 5,5,7,2,2,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,4, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1, + 7,1,1,1,1,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,1,1,7,1,1,1,1,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,1,1,7,1,1,1,1,3,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7,1,1,1,1,3,1,5,1,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7,1,1,1,1,3,2,2,7,2,2,2,2,7,1,1,2,2,5,2,2,5, + 2,7,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7,1,1,1,1,3,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,7,1,1,1,1,1,1,1,1,1,2,2,2,1,2, + 2,2,2,2,7,2,1,2,2,1,2,1,2,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,1,1,1,2,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,7,2,1, + 1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,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,1,1,1,2,1,1,1,1,5,1,1, + 7,1,1,1,1,3,1,7,2,1,1,1,1,1,1,7,3,1,1,1,2,1,1,1,5,1,1,7,1,1,1,1,3,1,7,2,1, + 1,1,1,1,1,1,7,3,1,1,1,1,1,1,5,1,1,7,1,1,1,1,3,1,7,1,5,1,1,7,1,1,1,1,3,1,7, + 1,5,1,1,7,1,1,1,1,3,1,7,1,1,5,1,1,7,1,1,1,1,3,1,7,1,1,5,1,1,7,1,1,1,1,3,1, + 7,1,1,1,7,2,1,5,1,1,7,1,1,1,1,3,1,7,1,1,7,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2, + 1,2,2,1,2,1,2,1,1,1,1,1,1,1,1,2,2,1,1,1,2,1,1,1,1,1,1,1,2,2,2,7,1,2,2,1,2, + 1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,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,1,1,1,2,1,1,1,1,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,7,2,1,1,1,2,2,2,1,1,2,1,2,1,1,1, + 1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7,1,1,1,1, + 3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,7,2,1,1,1,2,2,2,1,1,2,1, + 2,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,7,2,1,1,1,2,2, + 2,1,1,2,1,2,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,7,2,1, + 1,1,2,2,2,1,1,1,1,1,1,1,1,5,1,1,4,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2, + 2,2,2,2,2,5,2,1,1,1,2,2,2,1,1,2,1,2,1,1,1,1,1,4,4,4,1,4,4,4,7,1,2,1,2,2,2, + 2,2,2,2,2,2,2,2,1,1,1,1,1,2,1,2,2,2,2,2,2,2,2,2,2,1,1,5,2,1,1,3,3,1,1,1,1, + 1,1,1,3,1,1,3,2,1,1,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,2,1,2,2,2,2,2,2, + 2,2,2,2,2,1,1,1,1,1,2,1,2,2,2,2,2,2,2,2,2,2,1,1,5,2,1,1,3,3,1,1,1,1,1,1,1, + 3,1,1,3,2,1,1,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,3,1,1,7,1,1,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,7,1,1,7,1,1,1,1,2,2,2,7,1,2,2,1,2, + 1,1,1,1,1,2,2,1,1,5,5,5,5,5,5,5,5,1,1,7,1,1,1,1,3,2,7,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,1,2,2,2,2,2,2,2,2,2,7,2,1,1,1,2,2,2,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1, + 1,1,1,7,1,3,1,1,1,1,1,1,1,7,2,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7,1,1, + 1,1,3,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,1,1,1,2,1,1,2,2, + 1,1,1,1,2,1,2,2,1,1,1,2,1,1,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7,1, + 1,1,1,3,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,1,1,1,2,1,1,2, + 2,1,1,1,1,2,1,2,2,1,1,1,2,1,1,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7, + 1,1,1,1,3,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,1,1,1,2,1,1, + 2,1,1,1,1,2,1,2,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1, + 2,2,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1, + 1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1, + 1,2,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,1,1,1,2,1,1,2,1,2, + 2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,2,1,1,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,1,1,7,1,1,1,1,3,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,2,1,1,1,1,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,1,1,7,1,1,1,1,3,1,1,1,2,2,2,7,1,2,2,1,2,1,1,1,1,1,1,2,2,1,1,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7,1,1,1,1,3,1,1,1,2,2,2,7,1,2,2,1,2,1,1, + 1,1,1,1,2,2,1,1,1,1,1,2,2,2,7,1,2,2,1,2,1,1,1,1,1,1,2,2,1,1,1,1,1,2,2,2,7, + 1,2,2,1,2,1,1,1,1,1,1,2,2,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7,1,1, + 1,1,3,1,1,1,2,2,2,7,1,2,2,1,2,1,1,1,1,1,1,2,2,1,1,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,1,1,7,1,1,1,1,3,1,1,1,2,2,2,7,1,2,2,1,2,1,1,1,1,1,1,2,2,1,1,1,1, + 1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,2,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2, + 1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2, + 2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1, + 1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2, + 2,7,2,1,2,2,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,2,1,1,1, + 1,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,2,2,1,1,1,2,1,1,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1, + 7,1,1,1,1,3,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,2,1,1,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,1,1,7,1,1,1,1,3,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1, + 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1, + 1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,2,2,1,1,1,2,1,1,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7,1,1,1, + 1,3,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,2,1,1,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,1,1,7,1,1,1,1,3,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2, + 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,1,1,1,2,1,1,1,1,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7,1,1,1,1,3,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2, + 2,7,2,1,2,2,1,2,1,2,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, + 1,1,1,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,7,2,2,2,1, + 1,2,1,1,1,1,1,1,1,1,2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,7,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2, + 2,2,2,2,2,7,2,1,1,1,2,2,2,1,1,2,1,2,1,1,1,1,1,1,7,1,1,4,1,1,7,2,1,1,7,2,1, + 5,1,1,7,1,1,1,1,3,1,7,1,5,1,1,7,1,1,1,1,3,1,7,1,1,1,7,2,1,1,7,1,1,7,1,5,1, + 1,7,1,1,1,1,3,1,7,1,5,1,1,7,1,1,1,1,3,1,7,1,1,1,7,2,1,1,1,1,1,1,1,1,1,2,2, + 2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,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,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1, + 2,1,2,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,1,1,1,2,1,1,1, + 1,1,1,7,2,1,1,1,7,2,1,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2, + 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,1,1,1,2,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,7,1,1,1,1,1,1,1,1,1,1,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7,1,1,1,1,3,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,1,2,2,2,2,2,2,2,2,2,7,2,1,1,1,2,2,2,1,1,2,1,2,1,1,1,1,1,1,7,1,1,5, + 1,5,5,7,1,2,2,1,5,5,5,7,2,2,1,4,1,1,4,1,1,4,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 5,5,5,1,5,2,2,2,2,2,2,2,2,2,5,5,7,2,1,1,1,2,2,2,1,1,2,1,2,1,1,1,1,1,1,1,2, + 2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,7,2,1,1,1,2,2,2,2,2,1,2,1,1, + 1,1,1,1,4,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,7,2,1,1,1,2,2, + 2,1,1,2,1,2,1,1,1,1,1,5,5,5,5,1,1,7,1,1,1,1,3,8,1,1,1,7,1,2,1,2,1,1,1,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,1,1,7,1,1,1,1,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2, + 7,2,1,1,1,2,2,2,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2, + 1,2,2,1,2,1,2,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,1,1,1, + 2,1,1,1,1,1,1,4,1,1,1,1,7,1,3,1,1,1,4,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1, + 2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,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,1,1,1,2,1,1,1,1,1,1,4,1,1,1,1,4,1,1,1,4,1,1,4,1,1,4,1,1,4, + 1,1,4,1,1,4,1,1,1,4,1,1,1,1,4,1,1,1,1,4,1,1,1,1,4,1,1,1,1,1,1,1,7,1,1,1,1, + 1,1,1,1,1,4,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,4,1,1,1,4,1,1,4,1,1,4,1,1,4,1,1, + 7,1,1,5,1,1,1,7,3,1,1,1,7,2,1,1,7,2,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,7,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,7,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, + 7,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,7,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,7,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,7,1,1,1,7,1,1,7,1,1,7, + 1,1,4,1,1,1,1,7,2,1,1,1,8,1,7,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2, + 1,2,2,1,2,1,2,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,1,1,1, + 2,1,1,1,1,4,4,4,4,4,4,7,4,4,4,4,1,4,4,7,1,1,7,1,1,1,1,7,2,1,1,7,1,1,1,7,2, + 1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7,1,1,1,1,3,1,1,1,1,1,1,1,1,2,2,2, + 1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,2,2,1,1,1,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2, + 7,2,2,2,3,1,2,1,3,1,1,1,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7, + 1,1,1,1,3,1,1,1,7,2,1,1,1,1,1,7,2,1,1,1,1,1,7,2,1,1,1,1,1,7,2,1,1,1,1,1,7, + 2,1,1,1,1,7,2,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7,1,1,1,1,3,1,1,1,1, + 1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2, + 7,2,1,2,2,1,2,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1, + 1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,1,1,2,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,2,1,1,1,1,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,7,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,7,1,1,1,1,1,1,1,1,1,5,1,1,7,1,1,1,1,3,1,7,2,1,2,1,5,5,5,7,2,2, + 1,7,2,1,2,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,7,1,1,1,1,3,1,1,1,1,1,1,1, + 1,2,2,2,1,2,2,2,2,2,7,2,1,2,2,1,2,1,2,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,1,1,1,2,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2, + 2,2,2,2,7,2,1,1,1,2,2,2,1,1,2,1,2,1,1,1,1,1,1,4,1,1,7,2,1,1,7,2,1 +}; + + +static const unsigned short far ag_pstt[] = { +3,3,3,3,3,3,3,1,2,0,2,2,1,2,3, +5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,3,5, + 1,6,1, +1,138,461,138,138,1, +5,6,7,8,15,4,9,3,14,0,14,14,14,14,15,13,12,11,10,9, +16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,17,16,4,16,17, +460,460,1,2,5,2,2,1,2,490, +460,460,1,2,6,2,2,1,2,489, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,1,2,7,2,2,1,2,488, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,8,2,2,1, + 2,469, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2, + 9,2,2,1,2,462, +140,140,10,19,18, +140,140,11,20,18, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,12,23,21,22, +25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,98,25,25,25, + 25,25,25,25,25,25,4,9,13,24,24,25,9, +5,6,7,8,4,9,19,17,17,17,17,13,12,11,10,9, +20,15, +9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,11, +12,17, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,460,460,460,460,460,141,142,142,142,141,460, + 460,460,1,2,18,2,2,1,2,142,485, +26,19,27, +26,20,28, +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,136, +460,1,29,22,29,29,1,29,487, +8,23,133,30,37, +4,9,99,97,9, +32,36,32,32,32,32,32,32,32,32,32,32,32,5,6,7,42,35,32,39,51,56,32,32,32,32, + 32,32,32,32,57,25,128,38,38,55,38,48,47,49,43,32,31,55,51,50,55,54,56, + 55,54,52,44,55,55,55,53,53,40,46,12,11,10,45,41,34,33,37, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,26, + 2,2,1,2,479, +26,57,8,140,140,57,27,60,193,203,30,37,58,31,59,61,60,60,201,202,33,18, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,28,185,82,186,193, + 74,203,30,37,79,31,92,59,84,80,91,90,89,88,87,86,85,83,81,80,78,77,80, + 76,75,82,82,80,73,201,202,65,64,63,211,33,18,68,67, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,1,138,461, + 138,138,1,93, +32,32,32,32,32,32,32,32,32,32,32,32,95,32,26,51,96,94,97,8,99,66,32,32,32, + 32,32,32,32,32,57,4,9,30,44,43,42,39,41,40,30,36,37,98,32,31,41,41,41, + 41,41,9,34,33,37, +59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59, + 59,59,59,59,59,59,59,101,100,71,70,69,68,67,66,65,64,63,62,61,56,59,31, + 58,60,60,60,103,102,60, +53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,54,50,53,53,53,53,53,53,53,53, + 53,53,53,53,53,53,53,53,53,53,53,32,52,104, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,1,2,33,2,2,1,2,464, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,1,2,34,2,2,1,2,463, +460,1,2,35,2,2,1,2,482, +460,1,2,36,2,2,1,2,512, +33,33,33,33,33,33,33,33,33,33,33,33,460,33,460,460,460,460,460,460,460,460, + 460,460,460,460,33,33,33,33,33,33,33,33,460,460,460,1,2,37,2,2,1,2,470, +105,28,106, +460,1,2,39,2,2,1,2,478, +57,40,107, +8,41,223, +460,460,1,2,42,2,2,1,2,486, +66,93,108, +57,44,109, +110,113,124,116,118,120,122,127,99,4,9,45,224,222,128,126,123,121,119,117, + 115,112,125,114,111,9, +140,140,46,129,18, +95,26,24,131,130, +26,23,132, +26,25,133, +134,96,94,50,137,136,135, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,83,83,83,141,8,83,32,32,32,32,32, + 32,32,32,57,83,83,51,128,138,138,138,23,24,25,139,139,35,30,37,32,31, + 140,141,34,33,37, +8,52,113,30,37, +35,121,120,40, +143,98,4,9,54,142,142,143,9, +98,4,9,55,144,144,101,9, +99,56,103, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,460,460,1,2,57,2,2,1,2,477, +26,57,8,140,140,57,58,60,193,203,30,37,58,31,59,145,60,60,201,202,33,18, +26,57,8,66,140,217,217,62,215,140,211,211,57,59,185,146,186,193,74,203,30, + 37,79,31,59,204,146,146,204,73,201,202,65,64,63,211,33,18,68,67, +95,105,194,147,148, +123,123,123,150,123,123,66,123,123,123,61,149,135,135, +151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151, + 151,151,151,151,151,151,151,151,151,151,151,151,101,100,71,70,69,68,67, + 66,65,64,63,62,61,151,151,62,151,151,151,103,102,151,151, +218,218,218,208, +216,216,207, +213,213,213,214,206,212, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,66,2,2,1,2, + 467, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,1,2,67,2,2,1,2,510, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,1,2,68,2,2,1,2,509, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,69, + 2,2,1,2,508, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,70, + 2,2,1,2,507, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,71, + 2,2,1,2,503, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,72, + 2,2,1,2,502, +57,73,152,191, +26,57,8,140,140,57,74,188,193,203,30,37,58,31,59,188,201,202,33,18, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,75,185,146,186,193, + 74,203,30,37,79,31,59,184,78,77,184,76,75,146,146,184,73,201,202,65,64, + 63,211,33,18,68,67, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,76,185,146,186,193, + 74,203,30,37,79,31,59,183,78,77,183,76,75,146,146,183,73,201,202,65,64, + 63,211,33,18,68,67, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,77,185,146,186,193, + 74,203,30,37,79,31,59,182,78,77,182,76,75,146,146,182,73,201,202,65,64, + 63,211,33,18,68,67, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,78,185,146,186,193, + 74,203,30,37,79,31,59,181,78,77,181,76,75,146,146,181,73,201,202,65,64, + 63,211,33,18,68,67, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,79,185,82,186,193, + 74,203,30,37,79,31,154,59,153,80,91,90,89,88,87,86,85,83,81,80,78,77,80, + 76,75,82,82,80,73,201,202,65,64,63,211,33,18,68,67, +155,157,159,172,160,158,156, +71,72,169,162,161, +95,105,194,147,163, +165,134,160,164,166, +167,169,173,175,96,97,66,84,149,172,171,176,174,170,168, +167,169,96,97,155,180,179,178,177, +173,175,153,182,181, +183,151,184, +185,149,186, +94,147,187, +188,145,189, +190,192,143,193,191, +123,123,123,150,123,123,123,123,123,92,134,134, +33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,139, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,94, + 2,2,1,2,472, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,95, + 2,2,1,2,481, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,96, + 2,2,1,2,473, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,97, + 2,2,1,2,471, +105,38,194, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,1,2,99,2,2,1,2,468, +77,77,100, +213,213,213,214,101,195,195, +79,79,75, +78,78,74, +51,104,196, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,1,2,105,2,2,1,2,466, +26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,106, + 197, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,107,185,82,186,193, + 74,203,30,37,79,31,198,59,84,80,91,90,89,88,87,86,85,83,81,80,78,77,80, + 76,75,82,82,80,73,201,202,65,64,63,211,33,18,68,67, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,32,32,32,32,32,32,32,32,57,108, + 128,199,199,199,23,24,25,32,31,34,33,37, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,109,185,82,186,193, + 74,203,30,37,79,31,200,59,84,80,91,90,89,88,87,86,85,83,81,80,78,77,80, + 76,75,82,82,80,73,201,202,65,64,63,211,33,18,68,67, +460,1,2,110,2,2,1,2,525, +8,111,240, +202,204,8,99,4,9,112,241,201,30,206,37,205,203,9, +460,1,2,113,2,2,1,2,520, +8,114,234, +202,204,209,211,99,4,9,115,235,213,212,210,208,207,9, +460,1,2,116,2,2,1,2,518, +26,117,214, +460,1,2,118,2,2,1,2,517, +26,119,215, +460,1,2,120,2,2,1,2,515, +124,121,216,125, +460,1,2,122,2,2,1,2,514, +124,123,217,125, +460,1,2,124,2,2,1,2,519, +26,125,218, +4,9,126,226,9, +460,1,2,127,2,2,1,2,513, +26,128,219, +220,129,221, +26,57,8,66,140,217,217,62,215,140,211,211,57,130,185,146,186,193,74,203,30, + 37,79,31,59,222,146,146,222,73,201,202,65,64,63,211,33,18,68,67, +26,57,8,140,140,57,131,60,193,203,30,37,58,31,59,223,60,60,201,202,33,18, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,132,185,82,186,193, + 74,203,30,37,79,31,224,59,84,80,91,90,89,88,87,86,85,83,81,80,78,77,80, + 76,75,82,82,80,73,201,202,65,64,63,211,33,18,68,67, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,8,32,32,32,32,32,32,32,32,57,133, + 128,138,138,138,23,24,25,225,225,35,30,37,32,31,34,33,37, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,460,460,1,2,134,2,2,1,2,474, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,8,32,32,32,32,32,32,32,32,57,135, + 128,138,138,138,23,24,25,226,226,35,30,37,32,31,34,33,37, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,8,32,32,32,32,32,32,32,32,57,136, + 128,138,138,138,23,24,25,227,227,35,30,37,32,31,34,33,37, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,32,32,32,32,32,32,32,32,57,137, + 128,38,38,38,23,24,25,43,32,31,228,34,33,37, +105,34,106, +66,94,229, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,8,32,32,32,32,32,32,32,32,57,84, + 128,138,138,138,23,24,25,230,230,35,30,37,32,31,34,33,37, +90,90,90,97,85,85,85,141,231, +32,36,32,32,32,32,32,32,32,32,32,32,32,5,6,7,42,35,32,39,51,32,32,32,32,32, + 32,32,32,57,4,9,99,128,38,38,97,106,38,48,47,49,43,32,31,106,51,50,106, + 109,52,44,106,106,106,53,53,40,46,12,11,10,45,41,9,34,33,37, +232,102,233, +32,36,32,32,32,32,32,32,32,32,32,32,32,5,6,7,42,35,32,39,51,32,32,32,32,32, + 32,32,32,57,4,9,99,128,38,38,97,105,38,48,47,49,43,32,31,105,51,50,105, + 110,52,44,105,105,105,53,53,40,46,12,11,10,45,41,9,34,33,37, +234,66,145,149,205, +95,105,146,147,163, +198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198,198, + 198,198,198,198,198,147,235, +57,148,236, +26,57,8,140,140,57,149,237,193,203,30,37,58,31,59,237,237,201,202,33,18, +460,460,460,460,460,460,460,460,1,2,150,2,2,1,2,480, +219,151, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,8,32,32,32,32,32,32,32,32,57,152, + 128,138,138,138,23,24,25,238,238,35,30,37,32,31,34,33,37, +167,169,173,175,234,96,97,66,153,149,205,172,171,176,174,170,168, +234,154,190, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,155, + 2,2,1,2,506, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,156,185,146,186, + 193,74,203,30,37,79,31,59,179,78,77,179,178,76,75,146,146,179,73,201, + 202,65,64,63,211,33,18,68,67, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,157, + 2,2,1,2,505, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,158,185,146,186, + 193,74,203,30,37,79,31,59,179,78,77,179,177,76,75,146,146,179,73,201, + 202,65,64,63,211,33,18,68,67, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,159, + 2,2,1,2,504, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,160,185,146,186, + 193,74,203,30,37,79,31,59,176,78,77,176,76,75,146,146,176,73,201,202,65, + 64,63,211,33,18,68,67, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,161,185,146,186, + 193,74,203,30,37,79,31,59,239,239,78,77,239,76,75,146,146,239,73,201, + 202,65,64,63,211,33,18,68,67, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,162,185,146,186, + 193,74,203,30,37,79,31,59,240,240,78,77,240,76,75,146,146,240,73,201, + 202,65,64,63,211,33,18,68,67, +26,57,8,66,140,217,217,62,215,140,211,211,57,163,185,146,186,193,74,203,30, + 37,241,31,59,187,146,146,187,73,201,202,65,64,63,211,33,18,68,67, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,164,185,146,186, + 193,74,203,30,37,79,31,59,80,242,80,78,77,80,76,75,146,146,80,73,201, + 202,65,64,63,211,33,18,68,67, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,165, + 2,2,1,2,501, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,166,185,146,186, + 193,74,203,30,37,79,31,59,80,243,80,78,77,80,76,75,146,146,80,73,201, + 202,65,64,63,211,33,18,68,67, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,167, + 2,2,1,2,500, +26,57,8,140,140,57,168,60,193,203,30,37,58,31,59,244,60,60,201,202,33,18, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,169, + 2,2,1,2,499, +26,57,8,140,140,57,170,60,193,203,30,37,58,31,59,245,60,60,201,202,33,18, +26,57,8,140,140,57,171,60,193,203,30,37,58,31,59,246,60,60,201,202,33,18, +26,57,8,140,140,57,172,60,193,203,30,37,58,31,59,247,60,60,201,202,33,18, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,173, + 2,2,1,2,498, +26,57,8,140,140,57,174,60,193,203,30,37,58,31,59,248,60,60,201,202,33,18, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,175, + 2,2,1,2,497, +26,57,8,140,140,57,176,60,193,203,30,37,58,31,59,249,60,60,201,202,33,18, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,177,185,146,186, + 193,74,203,30,37,79,31,59,80,250,81,80,78,77,80,76,75,146,146,80,73,201, + 202,65,64,63,211,33,18,68,67, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,178,185,146,186, + 193,74,203,30,37,79,31,59,80,251,81,80,78,77,80,76,75,146,146,80,73,201, + 202,65,64,63,211,33,18,68,67, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,179,185,146,186, + 193,74,203,30,37,79,31,59,80,252,81,80,78,77,80,76,75,146,146,80,73,201, + 202,65,64,63,211,33,18,68,67, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,180,185,146,186, + 193,74,203,30,37,79,31,59,80,253,81,80,78,77,80,76,75,146,146,80,73,201, + 202,65,64,63,211,33,18,68,67, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,181,185,82,186,193, + 74,203,30,37,79,31,59,254,80,255,83,81,80,78,77,80,76,75,82,82,80,73, + 201,202,65,64,63,211,33,18,68,67, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,182,185,82,186,193, + 74,203,30,37,79,31,59,254,80,256,83,81,80,78,77,80,76,75,82,82,80,73, + 201,202,65,64,63,211,33,18,68,67, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,183, + 2,2,1,2,496, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,184,185,82,186,193, + 74,203,30,37,79,31,59,84,80,257,85,83,81,80,78,77,80,76,75,82,82,80,73, + 201,202,65,64,63,211,33,18,68,67, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,185, + 2,2,1,2,495, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,186,185,82,186,193, + 74,203,30,37,79,31,59,84,80,258,86,85,83,81,80,78,77,80,76,75,82,82,80, + 73,201,202,65,64,63,211,33,18,68,67, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,187,185,82,186,193, + 74,203,30,37,79,31,59,84,80,259,87,86,85,83,81,80,78,77,80,76,75,82,82, + 80,73,201,202,65,64,63,211,33,18,68,67, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,188, + 2,2,1,2,494, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,189,185,82,186,193, + 74,203,30,37,79,31,59,84,80,260,88,87,86,85,83,81,80,78,77,80,76,75,82, + 82,80,73,201,202,65,64,63,211,33,18,68,67, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,190, + 2,2,1,2,493, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,191,185,82,186,193, + 74,203,30,37,79,31,59,84,80,261,89,88,87,86,85,83,81,80,78,77,80,76,75, + 82,82,80,73,201,202,65,64,63,211,33,18,68,67, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,192, + 2,2,1,2,492, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,193,185,82,186,193, + 74,203,30,37,79,31,262,59,84,80,91,90,89,88,87,86,85,83,81,80,78,77,80, + 76,75,82,82,80,73,201,202,65,64,63,211,33,18,68,67, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,8,32,32,32,32,32,32,32,32,57,194, + 44,43,42,264,30,37,263,264,264,32,31,34,33,37, +213,213,213,214,80,82, +53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,54,55,53,53,53,53,53,53,53,53, + 53,53,53,53,53,53,53,53,53,53,53,196,52,104, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,8,32,32,32,32,32,32,32,32,57,197, + 128,138,138,138,23,24,25,265,265,35,30,37,32,31,34,33,37, +234,198,266, +105,29,106, +234,200,112, +4,9,201,244,9, +460,1,2,202,2,2,1,2,524, +26,203,267, +460,1,2,204,2,2,1,2,523, +26,205,268, +4,9,206,232,9, +26,207,269, +26,208,270, +460,1,2,209,2,2,1,2,522, +26,210,271, +460,1,2,211,2,2,1,2,521, +26,212,272, +4,9,213,231,9, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,214,185,82,186,193, + 74,203,30,37,79,31,273,59,84,80,91,90,89,88,87,86,85,83,81,80,78,77,80, + 76,75,82,82,80,73,201,202,65,64,63,211,33,18,68,67, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,215,185,82,186,193, + 74,203,30,37,79,31,274,59,84,80,91,90,89,88,87,86,85,83,81,80,78,77,80, + 76,75,82,82,80,73,201,202,65,64,63,211,33,18,68,67, +4,9,216,228,9, +4,9,217,227,9, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,218,185,82,186,193, + 74,203,30,37,79,31,275,59,84,80,91,90,89,88,87,86,85,83,81,80,78,77,80, + 76,75,82,82,80,73,201,202,65,64,63,211,33,18,68,67, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,32,32,32,32,32,32,32,32,57,219, + 276,276,276,32,31,277,276,34,33,37, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,1,2,220,2,2,1,2,484, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,8,32,32,32,32,32,32,32,32,57,221, + 128,138,138,138,23,24,25,278,278,35,30,37,32,31,34,33,37, +26,222,279, +150,123,66,123,123,223,149,126,126, +150,123,123,123,224,125,125, +66,122,229, +66,89,229, +66,88,229, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,83,83,83,8,83,32,32,32,32,32,32, + 32,32,57,83,83,228,128,138,138,138,23,24,25,139,139,35,30,37,32,31,140, + 280,34,33,37, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,8,32,32,32,32,32,32,32,32,57,229, + 128,138,138,138,23,24,25,31,35,30,37,32,31,34,33,37, +66,95,229, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,8,32,32,32,32,32,32,32,32,57,231, + 128,138,138,138,23,24,25,281,281,35,30,37,32,31,34,33,37, +460,460,460,460,1,2,232,2,2,1,2,475, +282,8,4,9,233,24,107,30,37,24,282,9, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,1,2,234,2,2,1,2,476, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,8,32,32,32,32,32,32,32,32,57,235, + 128,138,138,138,23,24,25,283,283,35,30,37,32,31,34,33,37, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,236,185,82,186,193, + 74,203,30,37,79,31,284,59,84,80,91,90,89,88,87,86,85,83,81,80,78,77,80, + 76,75,82,82,80,73,201,202,65,64,63,211,33,18,68,67, +95,105,195,147,148, +234,66,238,229,192, +155,157,159,174,160,158,156, +155,157,159,173,160,158,156, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,241,185,82,186,193, + 74,203,30,37,79,31,285,59,153,80,91,90,89,88,87,86,85,83,81,80,78,77,80, + 76,75,82,82,80,73,201,202,65,64,63,211,33,18,68,67, +71,72,171,162,161, +71,72,170,162,161, +66,168,149, +66,167,149, +66,166,149, +66,165,149, +66,159,149, +66,158,149, +165,134,164,164,166, +165,134,163,164,166, +165,134,162,164,166, +165,134,161,164,166, +167,169,96,97,66,254,149,172,171,170,168, +167,169,96,97,157,180,179,178,177, +167,169,96,97,156,180,179,178,177, +173,175,154,182,181, +183,152,184, +185,150,186, +94,148,187, +188,146,189, +286,262,287, +105,48,194, +66,289,264,45,288, +66,289,265,27,229, +8,266,129,30,37, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,32,32,32,32,32,32,32,32,57,267, + 276,276,276,32,31,290,276,34,33,37, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,32,32,32,32,32,32,32,32,57,268, + 276,276,276,32,31,291,276,34,33,37, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,32,32,32,32,32,32,32,32,57,269, + 276,276,276,32,31,292,276,34,33,37, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,32,32,32,32,32,32,32,32,57,270, + 276,276,276,32,31,293,276,34,33,37, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,32,32,32,32,32,32,32,32,57,271, + 276,276,276,32,31,294,276,34,33,37, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,272,295,37, +296,273,297, +296,274,298, +296,275,299, +105,245,300, +66,4,9,277,225,301,9, +302,303,66,278,229,303,303, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,279,185,82,186,193, + 74,203,30,37,79,31,304,59,84,80,91,90,89,88,87,86,85,83,81,80,78,77,80, + 76,75,82,82,80,73,201,202,65,64,63,211,33,18,68,67, +92,92,92,87,87,87,280, +91,91,91,86,66,86,86,281,229, +39,282,305,44, +66,289,283,199,229, +306,284,307, +306,234,285,190,307, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,286, + 2,2,1,2,491, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,287,185,82,186,193, + 74,203,30,37,79,31,144,59,84,80,91,90,89,88,87,86,85,83,81,80,78,77,80, + 76,75,82,82,80,73,201,202,65,64,63,211,33,18,68,67, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,8,32,32,32,32,32,32,32,32,57,288, + 44,43,42,47,30,37,263,47,32,31,34,33,37, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460, + 460,460,1,2,289,2,2,1,2,465, +66,4,9,290,243,301,9, +66,4,9,291,242,301,9, +66,4,9,292,239,301,9, +66,4,9,293,238,301,9, +66,4,9,294,237,301,9, +4,9,295,236,9, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,296, + 2,2,1,2,516, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,297,185,82,186,193, + 74,203,30,37,79,31,230,59,84,80,91,90,89,88,87,86,85,83,81,80,78,77,80, + 76,75,82,82,80,73,201,202,65,64,63,211,33,18,68,67, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,298,185,82,186,193, + 74,203,30,37,79,31,229,59,84,80,91,90,89,88,87,86,85,83,81,80,78,77,80, + 76,75,82,82,80,73,201,202,65,64,63,211,33,18,68,67, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,299,185,82,186,193, + 74,203,30,37,79,31,233,59,84,80,91,90,89,88,87,86,85,83,81,80,78,77,80, + 76,75,82,82,80,73,201,202,65,64,63,211,33,18,68,67, +250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250, + 250,250,250,250,250,300,308, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,32,32,32,32,32,32,32,32,57,301, + 309,309,309,32,31,309,34,33,37, +460,1,2,302,2,2,1,2,483, +8,303,132,30,37, +150,123,123,123,304,127,127, +8,305,111,30,37, +460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,460,1,2,306, + 2,2,1,2,511, +69,70,71,72,26,57,8,66,140,217,217,62,215,140,211,211,57,307,185,82,186,193, + 74,203,30,37,79,31,310,59,84,80,91,90,89,88,87,86,85,83,81,80,78,77,80, + 76,75,82,82,80,73,201,202,65,64,63,211,33,18,68,67, +32,32,32,32,32,32,32,32,32,32,32,32,32,51,8,32,32,32,32,32,32,32,32,57,308, + 128,138,138,138,23,24,25,311,311,35,30,37,32,31,34,33,37, +105,246,300, +234,310,197, +66,289,311,251,229, + +}; + + +static const unsigned short far ag_sbt[] = { + 0, 15, 56, 62, 82, 121, 131, 141, 170, 230, 292, 297, 302, 327, + 365, 381, 383, 419, 421, 469, 472, 475, 497, 506, 511, 516, 584, 627, + 649, 710, 738, 793, 848, 887, 953, 999,1008,1017,1062,1065,1074,1077, + 1080,1090,1093,1096,1122,1127,1132,1135,1138,1145,1196,1201,1205,1214, + 1222,1225,1261,1283,1323,1328,1342,1396,1400,1403,1409,1450,1502,1554, + 1579,1604,1629,1654,1658,1678,1727,1776,1825,1874,1935,1942,1947,1952, + 1957,1972,1981,1986,1989,1992,1995,1998,2003,2015,2037,2080,2123,2166, + 2209,2212,2280,2283,2290,2293,2296,2299,2331,2357,2418,2454,2515,2524, + 2527,2542,2551,2554,2569,2578,2581,2590,2593,2602,2606,2615,2619,2628, + 2631,2636,2645,2648,2651,2691,2713,2774,2816,2852,2894,2936,2974,2977, + 2980,3022,3031,3099,3102,3170,3175,3180,3206,3209,3230,3246,3248,3290, + 3307,3310,3335,3385,3410,3460,3485,3534,3584,3634,3674,3725,3750,3801, + 3826,3848,3873,3895,3917,3939,3964,3986,4011,4033,4085,4137,4189,4241, + 4295,4349,4374,4429,4454,4510,4567,4592,4650,4675,4734,4759,4820,4859, + 4865,4904,4946,4949,4952,4955,4960,4969,4972,4981,4984,4989,4992,4995, + 5004,5007,5016,5019,5024,5085,5146,5151,5156,5217,5251,5283,5325,5328, + 5337,5344,5347,5350,5353,5403,5444,5447,5489,5501,5513,5565,5607,5668, + 5673,5678,5685,5692,5753,5758,5763,5766,5769,5772,5775,5778,5781,5786, + 5791,5796,5801,5812,5821,5830,5835,5838,5841,5844,5847,5850,5853,5858, + 5863,5868,5902,5936,5970,6004,6038,6062,6065,6068,6071,6074,6081,6088, + 6149,6156,6165,6169,6174,6177,6182,6207,6268,6306,6371,6378,6385,6392, + 6399,6406,6411,6436,6497,6558,6619,6645,6678,6687,6692,6699,6704,6729, + 6790,6832,6835,6838,6843 +}; + + +static const unsigned short far ag_sbe[] = { + 9, 53, 58, 69, 118, 125, 135, 164, 224, 286, 294, 299, 323, 360, + 371, 382, 418, 420, 462, 470, 473, 496, 500, 507, 513, 547, 621, 633, + 666, 733, 771, 840, 884, 947, 993,1002,1011,1056,1063,1068,1075,1078, + 1084,1091,1094,1107,1124,1129,1133,1136,1141,1176,1197,1202,1209,1217, + 1223,1255,1267,1296,1325,1338,1388,1399,1402,1407,1444,1496,1548,1573, + 1598,1623,1648,1655,1664,1695,1744,1793,1842,1891,1938,1944,1949,1954, + 1964,1976,1983,1987,1990,1993,1996,2000,2012,2036,2074,2117,2160,2203, + 2210,2274,2282,2287,2292,2295,2297,2325,2355,2374,2441,2471,2518,2525, + 2533,2545,2552,2561,2572,2579,2584,2591,2596,2603,2609,2616,2622,2629, + 2633,2639,2646,2649,2664,2697,2730,2798,2846,2876,2918,2959,2975,2978, + 3004,3029,3063,3100,3134,3172,3177,3204,3207,3215,3240,3247,3272,3298, + 3308,3329,3352,3404,3427,3479,3502,3551,3601,3647,3691,3744,3767,3820, + 3832,3867,3879,3901,3923,3958,3970,4005,4017,4050,4102,4154,4206,4258, + 4312,4368,4391,4448,4471,4527,4586,4609,4669,4692,4753,4776,4844,4863, + 4901,4928,4947,4950,4953,4957,4963,4970,4975,4982,4986,4990,4993,4998, + 5005,5010,5017,5021,5041,5102,5148,5153,5173,5240,5277,5307,5326,5333, + 5341,5345,5348,5351,5383,5427,5445,5471,5495,5505,5559,5589,5624,5670, + 5675,5681,5688,5709,5755,5760,5764,5767,5770,5773,5776,5779,5783,5788, + 5793,5798,5806,5816,5825,5832,5836,5839,5842,5845,5848,5851,5855,5860, + 5864,5891,5925,5959,5993,6027,6059,6063,6066,6069,6072,6077,6084,6105, + 6155,6163,6166,6171,6175,6179,6201,6224,6292,6365,6374,6381,6388,6395, + 6402,6408,6430,6453,6514,6575,6643,6668,6681,6688,6696,6700,6723,6746, + 6814,6833,6836,6840,6843 +}; + + +static const unsigned char far ag_fl[] = { + 2,1,1,2,1,2,2,1,1,2,0,1,3,1,1,1,1,2,0,1,2,1,1,1,1,1,0,5,1,3,1,3,1,2,1, + 1,2,1,2,2,2,2,1,1,1,4,1,3,1,1,2,1,2,1,0,3,2,1,2,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,2,2,2,2,1,2,0,1,2,4,4,3,3,2,4,4,1,1,2,1,2,0,1,0,2,2,4,1, + 3,3,4,1,3,3,6,4,2,1,1,1,1,1,1,2,1,3,0,1,4,4,6,1,5,0,1,6,3,5,5,1,1,2,3, + 1,2,2,1,5,1,3,1,3,1,3,1,3,1,3,1,3,3,3,3,1,3,3,3,3,3,3,3,3,1,3,3,1,3,3, + 1,3,3,3,1,1,2,2,2,2,1,1,3,2,1,3,2,3,1,1,3,1,7,0,5,1,1,1,1,2,3,1,1,1,1, + 1,1,2,1,1,1,2,1,2,3,1,1,2,2,2,5,3,4,4,6,6,4,4,5,2,2,5,5,5,5,2,2,5,5,3, + 1,3,1,1,1,0,5,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,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,0,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 +}; + +static const unsigned short far ag_ptt[] = { + 0, 1, 1, 11, 12, 12, 12,200, 19, 19, 20, 20,200, 24, 24, 24, 25, 25, + 26, 26, 21, 28, 28, 28, 28, 28, 33, 28, 36, 36, 34, 34,208,208, 38, 38, + 40, 41, 41, 41, 41, 41, 44, 44, 44, 44, 46, 46, 47, 47,201, 48, 48, 51, + 53, 51,202, 54, 54, 56, 56, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 70, 70, 70, 72, 73, 74, 71, 78, 78, 83, 83, 80, 80, 80, 80, 80, + 85, 85, 85, 81, 82, 82, 89, 89, 90, 90, 93, 93, 93, 22, 91, 91, 91, 91, + 92, 92, 92, 92, 97, 96, 94, 94, 94, 94, 94,104,104, 94,100,107,107,100, + 100,100, 29,103,115,115,101, 23, 23, 23,225,119,119,225,223,223,223, 99, + 99,122,122,125,125,127,127,129,129,130,130,132,132,132,132,132,134,134, + 134,134,134,134,134,134,134,137,137,137,140,140,140,142,142,142,142,148, + 145,145,145,145,145,110,110,110,110,110,110,110,156,154,108,108,152,152, + 160,152,153,153,153,153,153,153,247,247,247,166,166,161,161, 79, 79,162, + 162,163,163,248,172,172,102,174,174,174,174,174,174,174,174,174,174,178, + 184,184,184,184,184,184,185,185,185,185,185,177,177,193,193,193,194,193, + 121, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 45, 45, 45, 45, 45, 45, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 76, 76,120,120,167,167,167,170,170,173,173,173,173,173, + 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173, + 173,173,173,173,173,173,173,173,173,173,199,199, 7, 5, 4, 35, 32, 37, + 42, 43, 2, 84, 86, 87, 88, 95, 49, 50, 98,105,106,109,111,114,113, 9, + 112, 8,116,117,118,124,123,126,128,131,133,135,136,138,139,141,143,144, + 146,147,149,150,151, 3, 6,159,175,176,179,180,182,181,183,186,187,188, + 189,190,191,192 +}; + +static const unsigned short far *ag_valid(int ag_k) { + const unsigned short far *ag_tp = &ag_tstt[ag_sbt[(PCB).sn+1]]; + while (*--ag_tp != (unsigned short) ag_k) if (*ag_tp == 0) return NULL; + return ag_tp; +} + +int dsl_change_reduction(dsl_token_type ag_k) { + if (!ag_valid(ag_k)) return 0; + (PCB).reduction_token = ag_k; + return 1; +} + +static void ag_default(const int *ag_tp) { + (PCB).ag_dsn = (PCB).sn; + (PCB).ag_dtl = ag_tp; + while (!ag_valid((dsl_token_type) *ag_tp)) ag_tp++; + (PCB).reduction_token = (dsl_token_type) *ag_tp; +} + + + +static void ag_ra(void) +{ + switch(ag_rpx[(PCB).ag_ap]) { + case 1: ag_rp_1(V(0,(unsigned *))); break; + case 2: ag_rp_2(V(0,(unsigned *))); break; + case 3: ag_rp_3(V(0,(unsigned *))); break; + case 4: ag_rp_4(); break; + case 5: ag_rp_5(); break; + case 6: ag_rp_6(); break; + case 7: ag_rp_7(); break; + case 8: ag_rp_8(V(0,(int *))); break; + case 9: ag_rp_9(V(1,(int *))); break; + case 10: ag_rp_10(); break; + case 11: ag_rp_11(); break; + case 12: ag_rp_12(); break; + case 13: ag_rp_13(); break; + case 14: ag_rp_14(); break; + case 15: ag_rp_15(); break; + case 16: ag_rp_16(); break; + case 17: ag_rp_17(V(0,(int *))); break; + case 18: ag_rp_18(); break; + case 19: ag_rp_19(); break; + case 20: ag_rp_20(); break; + case 21: ag_rp_21(V(0,(int *))); break; + case 22: ag_rp_22(V(0,(int *))); break; + case 23: V(0,(int *)) = ag_rp_23(); break; + case 24: V(0,(int *)) = ag_rp_24(); break; + case 25: V(0,(int *)) = ag_rp_25(); break; + case 26: V(0,(int *)) = ag_rp_26(); break; + case 27: V(0,(int *)) = ag_rp_27(); break; + case 28: V(0,(int *)) = ag_rp_28(); break; + case 29: V(0,(int *)) = ag_rp_29(); break; + case 30: V(0,(int *)) = ag_rp_30(); break; + case 31: V(0,(int *)) = ag_rp_31(); break; + case 32: V(0,(int *)) = ag_rp_32(); break; + case 33: V(0,(int *)) = ag_rp_33(); break; + case 34: V(0,(int *)) = ag_rp_34(V(1,(int *))); break; + case 35: V(0,(int *)) = ag_rp_35(V(0,(int *)), V(1,(int *))); break; + case 36: V(0,(int *)) = ag_rp_36(V(0,(int *)), V(1,(int *))); break; + case 37: V(0,(int *)) = ag_rp_37(V(1,(long *))); break; + case 38: V(0,(long *)) = ag_rp_38(V(0,(long *)), V(1,(long *))); break; + case 39: ag_rp_39(); break; + case 40: ag_rp_40(); break; + case 41: ag_rp_41(V(0,(char * *))); break; + case 42: ag_rp_42(V(0,(char * *))); break; + case 43: ag_rp_43(V(0,(char * *))); break; + case 44: V(0,(char * *)) = ag_rp_44(); break; + case 45: V(0,(char * *)) = ag_rp_45(); break; + case 46: V(0,(char * *)) = ag_rp_46(V(0,(char * *))); break; + case 47: ag_rp_47(); break; + case 48: ag_rp_48(); break; + case 49: ag_rp_49(); break; + case 50: ag_rp_50(V(0,(int *))); break; + case 51: V(0,(int *)) = ag_rp_51(V(2,(int *))); break; + case 52: V(0,(int *)) = ag_rp_52(V(2,(int *))); break; + case 53: V(0,(int *)) = ag_rp_53(V(0,(int *)), V(4,(int *))); break; + case 54: V(0,(int *)) = ag_rp_54(V(2,(long *))); break; + case 55: V(0,(int *)) = ag_rp_55(V(0,(int *))); break; + case 56: ag_rp_56(V(0,(unsigned *))); break; + case 57: ag_rp_57(V(0,(unsigned *)), V(2,(long *))); break; + case 58: ag_rp_58(V(0,(unsigned *))); break; + case 59: ag_rp_59(V(0,(unsigned *)), V(2,(long *)), V(4,(long *))); break; + case 60: ag_default(&ag_rtt[0]); V(0,(unsigned *)) = ag_rp_60(); break; + case 61: ag_rp_61(V(2,(long *))); break; + case 62: ag_rp_62(); break; + case 63: ag_rp_63(V(1,(int *))); break; + case 64: ag_rp_64(V(3,(long *))); break; + case 65: ag_rp_65(); break; + case 66: V(0,(int *)) = ag_rp_66(); break; + case 67: V(0,(int *)) = ag_rp_67(V(0,(int *))); break; + case 68: ag_rp_68(V(0,(int *))); break; + case 69: ag_rp_69(V(1,(int *))); break; + case 70: ag_rp_70(V(1,(int *))); break; + case 71: V(0,(long *)) = ag_rp_71(V(0,(long *)), V(2,(long *)), V(4,(long *))); break; + case 72: V(0,(long *)) = ag_rp_72(V(0,(long *)), V(2,(long *))); break; + case 73: V(0,(long *)) = ag_rp_73(V(0,(long *)), V(2,(long *))); break; + case 74: V(0,(long *)) = ag_rp_74(V(0,(long *)), V(2,(long *))); break; + case 75: V(0,(long *)) = ag_rp_75(V(0,(long *)), V(2,(long *))); break; + case 76: V(0,(long *)) = ag_rp_76(V(0,(long *)), V(2,(long *))); break; + case 77: V(0,(long *)) = ag_rp_77(V(0,(long *)), V(2,(long *))); break; + case 78: V(0,(long *)) = ag_rp_78(V(0,(long *)), V(2,(long *))); break; + case 79: V(0,(long *)) = ag_rp_79(); break; + case 80: V(0,(long *)) = ag_rp_80(); break; + case 81: V(0,(long *)) = ag_rp_81(V(0,(long *)), V(2,(long *))); break; + case 82: V(0,(long *)) = ag_rp_82(V(0,(long *)), V(2,(long *))); break; + case 83: V(0,(long *)) = ag_rp_83(V(0,(long *)), V(2,(long *))); break; + case 84: V(0,(long *)) = ag_rp_84(V(0,(long *)), V(2,(long *))); break; + case 85: V(0,(long *)) = ag_rp_85(); break; + case 86: V(0,(long *)) = ag_rp_86(); break; + case 87: V(0,(long *)) = ag_rp_87(); break; + case 88: V(0,(long *)) = ag_rp_88(); break; + case 89: V(0,(long *)) = ag_rp_89(V(0,(long *)), V(2,(long *))); break; + case 90: V(0,(long *)) = ag_rp_90(V(0,(long *)), V(2,(long *))); break; + case 91: V(0,(long *)) = ag_rp_91(V(0,(long *)), V(2,(long *))); break; + case 92: V(0,(long *)) = ag_rp_92(V(0,(long *)), V(2,(long *))); break; + case 93: V(0,(long *)) = ag_rp_93(V(0,(long *)), V(2,(long *))); break; + case 94: V(0,(long *)) = ag_rp_94(V(0,(long *)), V(2,(long *))); break; + case 95: V(0,(long *)) = ag_rp_95(V(0,(long *)), V(2,(long *))); break; + case 96: V(0,(long *)) = ag_rp_96(V(0,(long *))); break; + case 97: V(0,(long *)) = ag_rp_97(V(1,(long *))); break; + case 98: V(0,(long *)) = ag_rp_98(V(1,(long *))); break; + case 99: V(0,(long *)) = ag_rp_99(V(1,(long *))); break; + case 100: V(0,(long *)) = ag_rp_100(V(1,(long *))); break; + case 101: V(0,(long *)) = ag_rp_101(V(0,(long *))); break; + case 102: V(0,(long *)) = ag_rp_102(V(0,(int *))); break; + case 103: V(0,(long *)) = ag_rp_103(V(2,(long *))); break; + case 104: V(0,(long *)) = ag_rp_104(); break; + case 105: V(0,(long *)) = ag_rp_105(V(1,(long *))); break; + case 106: V(0,(long *)) = ag_rp_106(V(0,(long *))); break; + case 107: ag_default(&ag_rtt[4]); V(0,(long *)) = ag_rp_107(); break; + case 108: ag_rp_108(); break; + case 109: ag_rp_109(V(3,(long *)), V(5,(long *))); break; + case 110: ag_rp_110(); break; + case 111: ag_rp_111(); break; + case 112: ag_rp_112(V(0,(long *))); break; + case 113: ag_rp_113(V(0,(long *))); break; + case 114: ag_rp_114(); break; + case 115: ag_rp_115(V(1,(long *))); break; + case 116: V(0,(long *)) = ag_rp_116(); break; + case 117: V(0,(long *)) = ag_rp_117(V(0,(long *)), V(1,(long *))); break; + case 118: V(0,(long *)) = ag_rp_118(V(0,(int *))); break; + case 119: V(0,(long *)) = ag_rp_119(V(0,(int *))); break; + case 120: V(0,(long *)) = ag_rp_120(); break; + case 121: V(0,(long *)) = ag_rp_121(V(0,(long *)), V(1,(int *))); break; + case 122: V(0,(long *)) = ag_rp_122(V(0,(int *))); break; + case 123: V(0,(long *)) = ag_rp_123(V(0,(long *)), V(1,(int *))); break; + case 124: V(0,(int *)) = ag_rp_124(V(1,(int *))); break; + case 125: ag_rp_125(V(0,(screen_descriptor * *))); break; + case 126: V(0,(screen_descriptor * *)) = ag_rp_126(); break; + case 127: V(0,(screen_descriptor * *)) = ag_rp_127(V(0,(screen_descriptor * *))); break; + case 128: V(0,(screen_descriptor * *)) = ag_rp_128(V(0,(screen_descriptor * *)), V(1,(int *))); break; + case 129: V(0,(screen_descriptor * *)) = ag_rp_129(V(0,(screen_descriptor * *)), V(2,(int *))); break; + case 130: V(0,(screen_descriptor * *)) = ag_rp_130(V(0,(screen_descriptor * *)), V(2,(int *))); break; + case 131: V(0,(screen_descriptor * *)) = ag_rp_131(V(0,(screen_descriptor * *)), V(3,(long *)), V(5,(long *))); break; + case 132: V(0,(screen_descriptor * *)) = ag_rp_132(V(0,(screen_descriptor * *)), V(3,(long *)), V(5,(long *))); break; + case 133: V(0,(screen_descriptor * *)) = ag_rp_133(V(0,(screen_descriptor * *)), V(1,(query_item * *))); break; + case 134: V(0,(screen_descriptor * *)) = ag_rp_134(V(0,(screen_descriptor * *)), V(1,(query_item * *))); break; + case 135: V(0,(int *)) = ag_rp_135(V(2,(long *)), V(4,(long *))); break; + case 136: V(0,(query_item * *)) = ag_rp_136(); break; + case 137: V(0,(query_item * *)) = ag_rp_137(V(0,(query_item * *))); break; + case 138: V(0,(query_item * *)) = ag_rp_138(V(0,(query_item * *))); break; + case 139: V(0,(query_item * *)) = ag_rp_139(V(0,(query_item * *))); break; + case 140: V(0,(query_item * *)) = ag_rp_140(V(0,(query_item * *))); break; + case 141: V(0,(query_item * *)) = ag_rp_141(); break; + case 142: V(0,(query_item * *)) = ag_rp_142(V(0,(query_item * *))); break; + case 143: V(0,(query_item * *)) = ag_rp_143(V(0,(query_item * *))); break; + case 144: V(0,(query_item * *)) = ag_rp_144(V(0,(query_item * *))); break; + case 145: ag_rp_145(); break; + case 146: ag_rp_146(); break; + case 147: ag_rp_147(); break; + case 148: ag_rp_148(); break; + } + (PCB).la_ptr = (PCB).pointer; +} + +#define TOKEN_NAMES dsl_token_names +const char *const dsl_token_names[264] = { + "script file", + "ws", + "literal", + "integer constant", + "string literal", + "paren string", + "character constant", + "eol", + "literals", + "name", + "white", + "comment", + "comment head", + "\"*/\"", + "\"/*\"", + "", + "'\\n'", + "\"//\"", + "not eol", + "", + "", + "script file", + "execution block", + "declaration", + "", + "", + "", + "eof", + "word", + "integer variable", + "string variable", + "undeclared variable", + "'['", + "", + "parameter string", + "']'", + "string", + "'#'", + "param word", + "text char", + "action text", + "action text head", + "'}'", + "'{'", + "action word", + "", + "action parameter string", + "action param word", + "paren string chars", + "')'", + "'('", + "paren string char", + "not paren", + "", + "string chars", + "'\\\"'", + "string char", + "not double quote", + "escape sequence", + "\"\\\\a\"", + "\"\\\\b\"", + "\"\\\\f\"", + "\"\\\\n\"", + "\"\\\\r\"", + "\"\\\\t\"", + "\"\\\\v\"", + "\"\\\\\\\\\"", + "\"\\\\?\"", + "\"\\\\\\'\"", + "\"\\\\\\\"\"", + "octal escape", + "hex escape", + "one octal", + "two octal", + "three octal", + "'\\\\'", + "", + "\"\\\\x\"", + "hex number", + "hex digit", + "command", + "identifier", + "parameters", + "", + "'<'", + "piped command", + "'|'", + "'>'", + "\">>\"", + "", + "", + "command sequence", + "if sequence", + "", + "statement", + "\"else\"", + "if statement", + "if condition", + "\"if\"", + "conditional exp", + "assignment", + "for statement", + "screen description", + "while statement", + "", + "'='", + "';'", + "", + "string exp", + "'@'", + "primary exp", + "\"while\"", + "\"for\"", + "\"in\"", + "\"do\"", + "", + "\"action\"", + "\"int\"", + "\"string\"", + "", + "letter", + "digit", + "logical or exp", + "'\\?'", + "':'", + "logical and exp", + "\"||\"", + "inclusive or exp", + "\"&&\"", + "exclusive or exp", + "and exp", + "'^'", + "equality exp", + "'&'", + "relational exp", + "\"==\"", + "\"!=\"", + "shift exp", + "\"<=\"", + "\">=\"", + "additive exp", + "\"<<\"", + "multiplicative exp", + "'+'", + "'-'", + "unary exp", + "'*'", + "'/'", + "nonzero", + "'%'", + "'~'", + "'!'", + "string term", + "string element", + "numeric name", + "built_in name", + "built_in argument", + "string name", + "undefined name", + "\"..\"", + "", + "hex constant", + "octal constant", + "decimal constant", + "\"0x\"", + "\"0X\"", + "", + "", + "", + "'0'", + "", + "'\\''", + "char constant element", + "not single quote", + "screen items", + "\"screen\"", + "\"title\"", + "formula", + "color spec", + "\"entry\"", + "\"highlight\"", + "\"size\"", + "','", + "\"location\"", + "query line", + "button line", + "\"color\"", + "\"field\"", + "\"variable\"", + "\"default\"", + "\"prompt\"", + "\"explanation\"", + "\"button\"", + "formula element", + "", + "", + "", + "", + "", + "", + "eol", + "paren string", + "string literal", + "']'", + "'['", + "'#'", + "'}'", + "'{'", + "literal", + "'<'", + "'|'", + "'>'", + "\">>\"", + "\"else\"", + "')'", + "'('", + "\"if\"", + "'='", + "';'", + "'@'", + "\"while\"", + "\"do\"", + "\"in\"", + "name", + "\"for\"", + "literals", + "\"action\"", + "\"int\"", + "\"string\"", + "':'", + "'\\?'", + "\"||\"", + "\"&&\"", + "'^'", + "'&'", + "\"==\"", + "\"!=\"", + "\"<=\"", + "\">=\"", + "\"<<\"", + "'+'", + "'-'", + "'*'", + "'/'", + "'%'", + "'~'", + "'!'", + "integer constant", + "character constant", + "\"..\"", + "\"screen\"", + "\"title\"", + "\"entry\"", + "\"highlight\"", + "','", + "\"size\"", + "\"location\"", + "\"color\"", + "\"field\"", + "\"variable\"", + "\"default\"", + "\"prompt\"", + "\"explanation\"", + "\"button\"", + +}; + +#ifndef MISSING_FORMAT +#define MISSING_FORMAT "Missing %s" +#endif +#ifndef UNEXPECTED_FORMAT +#define UNEXPECTED_FORMAT "Unexpected %s" +#endif +#ifndef UNNAMED_TOKEN +#define UNNAMED_TOKEN "input" +#endif + + +static void ag_diagnose(void) { + int ag_snd = (PCB).sn; + int ag_k = ag_sbt[ag_snd]; + + if (*TOKEN_NAMES[ag_tstt[ag_k]] && ag_astt[ag_k + 1] == ag_action_8) { + sprintf((PCB).ag_msg, MISSING_FORMAT, TOKEN_NAMES[ag_tstt[ag_k]]); + } + else if (ag_astt[ag_sbe[(PCB).sn]] == ag_action_8 + && (ag_k = (int) ag_sbe[(PCB).sn] + 1) == (int) ag_sbt[(PCB).sn+1] - 1 + && *TOKEN_NAMES[ag_tstt[ag_k]]) { + sprintf((PCB).ag_msg, MISSING_FORMAT, TOKEN_NAMES[ag_tstt[ag_k]]); + } + else if ((PCB).token_number && *TOKEN_NAMES[(PCB).token_number]) { + sprintf((PCB).ag_msg, UNEXPECTED_FORMAT, TOKEN_NAMES[(PCB).token_number]); + } + else if (isprint(INPUT_CODE((*(PCB).pointer))) && INPUT_CODE((*(PCB).pointer)) != '\\') { + char buf[20]; + sprintf(buf, "\'%c\'", (char) INPUT_CODE((*(PCB).pointer))); + sprintf((PCB).ag_msg, UNEXPECTED_FORMAT, buf); + } + else sprintf((PCB).ag_msg, UNEXPECTED_FORMAT, UNNAMED_TOKEN); + (PCB).error_message = (PCB).ag_msg; + + +} +static int ag_action_1_r_proc(void); +static int ag_action_2_r_proc(void); +static int ag_action_3_r_proc(void); +static int ag_action_4_r_proc(void); +static int ag_action_1_s_proc(void); +static int ag_action_3_s_proc(void); +static int ag_action_1_proc(void); +static int ag_action_2_proc(void); +static int ag_action_3_proc(void); +static int ag_action_4_proc(void); +static int ag_action_5_proc(void); +static int ag_action_6_proc(void); +static int ag_action_7_proc(void); +static int ag_action_8_proc(void); +static int ag_action_9_proc(void); +static int ag_action_10_proc(void); +static int ag_action_11_proc(void); +static int ag_action_8_proc(void); + + +static int (*const ag_r_procs_scan[])(void) = { + ag_action_1_r_proc, + ag_action_2_r_proc, + ag_action_3_r_proc, + ag_action_4_r_proc +}; + +static int (*const ag_s_procs_scan[])(void) = { + ag_action_1_s_proc, + ag_action_2_r_proc, + ag_action_3_s_proc, + ag_action_4_r_proc +}; + +static int (*const ag_gt_procs_scan[])(void) = { + ag_action_1_proc, + ag_action_2_proc, + ag_action_3_proc, + ag_action_4_proc, + ag_action_5_proc, + ag_action_6_proc, + ag_action_7_proc, + ag_action_8_proc, + ag_action_9_proc, + ag_action_10_proc, + ag_action_11_proc, + ag_action_8_proc +}; + + +static int ag_action_10_proc(void) { + int ag_t = (PCB).token_number; + (PCB).btsx = 0, (PCB).drt = -1; + do { + ag_track(); + (PCB).token_number = (dsl_token_type) AG_TCV(INPUT_CODE(*(PCB).la_ptr)); + (PCB).la_ptr++; + if (ag_key_index[(PCB).sn]) { + unsigned ag_k = ag_key_index[(PCB).sn]; + int ag_ch = CONVERT_CASE(INPUT_CODE(*(PCB).pointer)); + if (ag_ch <= 255) { + while (ag_key_ch[ag_k] < ag_ch) ag_k++; + if (ag_key_ch[ag_k] == ag_ch) ag_get_key_word(ag_k); + } + } + } while ((PCB).token_number == (dsl_token_type) ag_t); + (PCB).la_ptr = (PCB).pointer; + return 1; +} + +static int ag_action_11_proc(void) { + int ag_t = (PCB).token_number; + + (PCB).btsx = 0, (PCB).drt = -1; + do { + (*(int *) &(PCB).vs[(PCB).ssx]) = *(PCB).pointer; + (PCB).ssx--; + ag_track(); + ag_ra(); + if ((PCB).exit_flag != AG_RUNNING_CODE) return 0; + (PCB).ssx++; + (PCB).token_number = (dsl_token_type) AG_TCV(INPUT_CODE(*(PCB).la_ptr)); + (PCB).la_ptr++; + if (ag_key_index[(PCB).sn]) { + unsigned ag_k = ag_key_index[(PCB).sn]; + int ag_ch = CONVERT_CASE(INPUT_CODE(*(PCB).pointer)); + if (ag_ch <= 255) { + while (ag_key_ch[ag_k] < ag_ch) ag_k++; + if (ag_key_ch[ag_k] == ag_ch) ag_get_key_word(ag_k); + } + } + } + while ((PCB).token_number == (dsl_token_type) ag_t); + (PCB).la_ptr = (PCB).pointer; + return 1; +} + +static int ag_action_3_r_proc(void) { + int ag_sd = ag_fl[(PCB).ag_ap] - 1; + if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; + (PCB).btsx = 0, (PCB).drt = -1; + (PCB).reduction_token = (dsl_token_type) ag_ptt[(PCB).ag_ap]; + ag_ra(); + return (PCB).exit_flag == AG_RUNNING_CODE; +} + +static int ag_action_3_s_proc(void) { + int ag_sd = ag_fl[(PCB).ag_ap] - 1; + if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; + (PCB).btsx = 0, (PCB).drt = -1; + (PCB).reduction_token = (dsl_token_type) ag_ptt[(PCB).ag_ap]; + ag_ra(); + return (PCB).exit_flag == AG_RUNNING_CODE; +} + +static int ag_action_4_r_proc(void) { + int ag_sd = ag_fl[(PCB).ag_ap] - 1; + if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; + (PCB).reduction_token = (dsl_token_type) ag_ptt[(PCB).ag_ap]; + return 1; +} + +static int ag_action_2_proc(void) { + (PCB).btsx = 0, (PCB).drt = -1; + if ((PCB).ssx >= 128) { + (PCB).exit_flag = AG_STACK_ERROR_CODE; + PARSER_STACK_OVERFLOW; + } + (*(int *) &(PCB).vs[(PCB).ssx]) = *(PCB).pointer; + GET_CONTEXT; + (PCB).ss[(PCB).ssx] = (PCB).sn; + (PCB).ssx++; + (PCB).sn = (PCB).ag_ap; + ag_track(); + return 0; +} + +static int ag_action_9_proc(void) { + if ((PCB).drt == -1) { + (PCB).drt=(PCB).token_number; + (PCB).dssx=(PCB).ssx; + (PCB).dsn=(PCB).sn; + } + ag_prot(); + (PCB).vs[(PCB).ssx] = ag_null_value; + GET_CONTEXT; + (PCB).ss[(PCB).ssx] = (PCB).sn; + (PCB).ssx++; + (PCB).sn = (PCB).ag_ap; + (PCB).la_ptr = (PCB).pointer; + return (PCB).exit_flag == AG_RUNNING_CODE; +} + +static int ag_action_2_r_proc(void) { + (PCB).ssx++; + (PCB).sn = (PCB).ag_ap; + return 0; +} + +static int ag_action_7_proc(void) { + --(PCB).ssx; + (PCB).la_ptr = (PCB).pointer; + (PCB).exit_flag = AG_SUCCESS_CODE; + return 0; +} + +static int ag_action_1_proc(void) { + ag_track(); + (PCB).exit_flag = AG_SUCCESS_CODE; + return 0; +} + +static int ag_action_1_r_proc(void) { + (PCB).exit_flag = AG_SUCCESS_CODE; + return 0; +} + +static int ag_action_1_s_proc(void) { + (PCB).exit_flag = AG_SUCCESS_CODE; + return 0; +} + +static int ag_action_4_proc(void) { + int ag_sd = ag_fl[(PCB).ag_ap] - 1; + (PCB).reduction_token = (dsl_token_type) ag_ptt[(PCB).ag_ap]; + (PCB).btsx = 0, (PCB).drt = -1; + (*(int *) &(PCB).vs[(PCB).ssx]) = *(PCB).pointer; + if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; + else GET_CONTEXT; + (PCB).ss[(PCB).ssx] = (PCB).sn; + ag_track(); + while ((PCB).exit_flag == AG_RUNNING_CODE) { + unsigned ag_t1 = ag_sbe[(PCB).sn] + 1; + unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1; + do { + unsigned ag_tx = (ag_t1 + ag_t2)/2; + if (ag_tstt[ag_tx] < (unsigned short)(PCB).reduction_token) ag_t1 = ag_tx + 1; + else ag_t2 = ag_tx; + } while (ag_t1 < ag_t2); + if (ag_tstt[ag_t1] != (PCB).reduction_token) { + (PCB).exit_flag = AG_REDUCTION_ERROR_CODE; + REDUCTION_TOKEN_ERROR; break;} + (PCB).ag_ap = ag_pstt[ag_t1]; + if ((ag_s_procs_scan[ag_astt[ag_t1]])() == 0) break; + } + return 0; +} + +static int ag_action_3_proc(void) { + int ag_sd = ag_fl[(PCB).ag_ap] - 1; + (PCB).btsx = 0, (PCB).drt = -1; + (*(int *) &(PCB).vs[(PCB).ssx]) = *(PCB).pointer; + if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; + else GET_CONTEXT; + (PCB).ss[(PCB).ssx] = (PCB).sn; + ag_track(); + (PCB).reduction_token = (dsl_token_type) ag_ptt[(PCB).ag_ap]; + ag_ra(); + while ((PCB).exit_flag == AG_RUNNING_CODE) { + unsigned ag_t1 = ag_sbe[(PCB).sn] + 1; + unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1; + do { + unsigned ag_tx = (ag_t1 + ag_t2)/2; + if (ag_tstt[ag_tx] < (unsigned short)(PCB).reduction_token) ag_t1 = ag_tx + 1; + else ag_t2 = ag_tx; + } while (ag_t1 < ag_t2); + if (ag_tstt[ag_t1] != (PCB).reduction_token) { + (PCB).exit_flag = AG_REDUCTION_ERROR_CODE; + REDUCTION_TOKEN_ERROR; break;} + (PCB).ag_ap = ag_pstt[ag_t1]; + if ((ag_s_procs_scan[ag_astt[ag_t1]])() == 0) break; + } + return 0; +} + +static int ag_action_8_proc(void) { + ag_undo(); + (PCB).la_ptr = (PCB).pointer; + (PCB).exit_flag = AG_SYNTAX_ERROR_CODE; + ag_diagnose(); + SYNTAX_ERROR; + {(PCB).la_ptr = (PCB).pointer + 1; ag_track();} + return (PCB).exit_flag == AG_RUNNING_CODE; +} + +static int ag_action_5_proc(void) { + int ag_sd = ag_fl[(PCB).ag_ap]; + (PCB).btsx = 0, (PCB).drt = -1; + if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; + else { + GET_CONTEXT; + (PCB).ss[(PCB).ssx] = (PCB).sn; + } + (PCB).la_ptr = (PCB).pointer; + (PCB).reduction_token = (dsl_token_type) ag_ptt[(PCB).ag_ap]; + ag_ra(); + while ((PCB).exit_flag == AG_RUNNING_CODE) { + unsigned ag_t1 = ag_sbe[(PCB).sn] + 1; + unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1; + do { + unsigned ag_tx = (ag_t1 + ag_t2)/2; + if (ag_tstt[ag_tx] < (unsigned short)(PCB).reduction_token) ag_t1 = ag_tx + 1; + else ag_t2 = ag_tx; + } while (ag_t1 < ag_t2); + if (ag_tstt[ag_t1] != (PCB).reduction_token) { + (PCB).exit_flag = AG_REDUCTION_ERROR_CODE; + REDUCTION_TOKEN_ERROR; break;} + (PCB).ag_ap = ag_pstt[ag_t1]; + if ((ag_r_procs_scan[ag_astt[ag_t1]])() == 0) break; + } + return (PCB).exit_flag == AG_RUNNING_CODE; +} + +static int ag_action_6_proc(void) { + int ag_sd = ag_fl[(PCB).ag_ap]; + (PCB).reduction_token = (dsl_token_type) ag_ptt[(PCB).ag_ap]; + if ((PCB).drt == -1) { + (PCB).drt=(PCB).token_number; + (PCB).dssx=(PCB).ssx; + (PCB).dsn=(PCB).sn; + } + if (ag_sd) { + (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; + } + else { + ag_prot(); + (PCB).vs[(PCB).ssx] = ag_null_value; + GET_CONTEXT; + (PCB).ss[(PCB).ssx] = (PCB).sn; + } + (PCB).la_ptr = (PCB).pointer; + while ((PCB).exit_flag == AG_RUNNING_CODE) { + unsigned ag_t1 = ag_sbe[(PCB).sn] + 1; + unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1; + do { + unsigned ag_tx = (ag_t1 + ag_t2)/2; + if (ag_tstt[ag_tx] < (unsigned short)(PCB).reduction_token) ag_t1 = ag_tx + 1; + else ag_t2 = ag_tx; + } while (ag_t1 < ag_t2); + if (ag_tstt[ag_t1] != (PCB).reduction_token) { + (PCB).exit_flag = AG_REDUCTION_ERROR_CODE; + REDUCTION_TOKEN_ERROR; break;} + (PCB).ag_ap = ag_pstt[ag_t1]; + if ((ag_r_procs_scan[ag_astt[ag_t1]])() == 0) break; + } + return (PCB).exit_flag == AG_RUNNING_CODE; +} + + +void init_dsl(void) { + (PCB).la_ptr = (PCB).pointer; + (PCB).ss[0] = (PCB).sn = (PCB).ssx = 0; + (PCB).exit_flag = AG_RUNNING_CODE; + (PCB).line = FIRST_LINE; + (PCB).column = FIRST_COLUMN; + (PCB).btsx = 0, (PCB).drt = -1; +} + +void dsl(void) { + init_dsl(); + (PCB).exit_flag = AG_RUNNING_CODE; + while ((PCB).exit_flag == AG_RUNNING_CODE) { + unsigned ag_t1 = ag_sbt[(PCB).sn]; + if (ag_tstt[ag_t1]) { + unsigned ag_t2 = ag_sbe[(PCB).sn] - 1; + (PCB).token_number = (dsl_token_type) AG_TCV(INPUT_CODE(*(PCB).la_ptr)); + (PCB).la_ptr++; + if (ag_key_index[(PCB).sn]) { + unsigned ag_k = ag_key_index[(PCB).sn]; + int ag_ch = CONVERT_CASE(INPUT_CODE(*(PCB).pointer)); + if (ag_ch <= 255) { + while (ag_key_ch[ag_k] < ag_ch) ag_k++; + if (ag_key_ch[ag_k] == ag_ch) ag_get_key_word(ag_k); + } + } + do { + unsigned ag_tx = (ag_t1 + ag_t2)/2; + if (ag_tstt[ag_tx] > (unsigned short)(PCB).token_number) + ag_t1 = ag_tx + 1; + else ag_t2 = ag_tx; + } while (ag_t1 < ag_t2); + if (ag_tstt[ag_t1] != (unsigned short)(PCB).token_number) + ag_t1 = ag_sbe[(PCB).sn]; + } + (PCB).ag_ap = ag_pstt[ag_t1]; + (ag_gt_procs_scan[ag_astt[ag_t1]])(); + } +} + +