#!/usr/bin/ruby
# Copyright 2008 Richard Braakman <eligo@clueonic.net>
# See the COPYING file for details.
FRAGMENTS = {:swap=>{"code"=>"template <typename T>\nvoid swap(T& a, T& b) {\n    T t = a;\n    a = b;\n    b = t;\n}\n", "includes"=>[]}, :ttf=>{"code"=>"static TTF_Font *font;\nstatic void init_text() {\n    SDL_RWops *fontrw = SDL_RWFromMem((void *)fontbits, sizeof(fontbits));\n    if (!TTF_WasInit()) {\n        TTF_Init();\n        font = TTF_OpenFontRW(fontrw, 0, 12);\n    }\n}\n", "fragments"=>[:basicfont], "includes"=>["SDL_ttf.h"], "initialize"=>"init_text();"}, :findelem=>{"code"=>"static int findelem(LinkedList& list, struct ListElement *elem) {\n    struct ListElement *p;\n    int i;\n    if (!elem)\n        return -1;\n    for (i = 0, p = list.root; p; p = p->next, i++) {\n        if (p == elem)\n            return i;\n    }\n    return -1;\n}\n", "includes"=>[]}, :linedraw=>{"code"=>"static void putpixel(SDL_Surface *surface, int x, int y, uint32_t color) {\n\tif (x < 0 || y < 0 || x > surface->w || y > surface->h)\n\t\treturn;\n\n\tswitch (surface->format->BytesPerPixel) {\n\tcase 1:\n\t\t((uint8_t *)surface->pixels)[x + y * surface->pitch] = color;\n\t\tbreak;\n\tcase 2:\n\t\t((uint16_t *)surface->pixels)[x + y * surface->pitch/2] = color;\n\t\tbreak;\n\tcase 4:\n\t\t((uint32_t *)surface->pixels)[x + y * surface->pitch/4] = color;\n\t\tbreak;\n\t}\n}\n\nstatic void linedraw(int x, int y, int dx, int dy, Uint32 color) {\n\tint i, j;\n\n\tSDL_LockSurface(screen);\n\n\tif (abs(dx) > abs(dy)) {\n\t\t/* Normalize dx positive */\n\t\tif (dx < 0) {\n\t\t\tx += dx;\n\t\t\ty += dy;\n\t\t\tdx = -dx;\n\t\t\tdy = -dy;\n\t\t}\n\t\tj = 0;\n\t\tfor (i = 0; i < dx; i++) {\n\t\t\tputpixel(screen, x + i, y, color);\n\t\t\tj += abs(dy);\n\t\t\tif (j >= dx) {\n\t\t\t\tj -= dx;\n\t\t\t\ty += dy > 0 ? 1 : -1;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t/* Normalize dy positive */\n\t\tif (dy < 0) {\n\t\t\tx += dx;\n\t\t\ty += dy;\n\t\t\tdx = -dx;\n\t\t\tdy = -dy;\n\t\t}\n\t\tj = 0;\n\t\tfor (i = 0; i < dy; i++) {\n\t\t\tputpixel(screen, x, y + i, color);\n\t\t\tj += abs(dx);\n\t\t\tif (j >= dy) {\n\t\t\t\tj -= dy;\n\t\t\t\tx += dx > 0 ? 1 : -1;\n\t\t\t}\n\t\t}\n\t}\n\n\tSDL_UnlockSurface(screen);\n}\n", "fragments"=>[:screen], "includes"=>["SDL.h"]}, :packfile=>{"code"=>"static unsigned char *packfile;\nstatic int32_t packfilesize;\nstatic int packfd = -1;\nstatic void closepack() {\n    if (packfd >= 0) {\n        close(packfd);\n        packfd = -1;\n        delete[] packfile;\n        packfile = 0;\n        packfilesize = 0;\n    }\n}\n", "includes"=>["unistd.h", "stdlib.h"]}, :filehandles=>{"code"=>"static FILE *fh[1024];\nstatic int32_t unused_fh() {\n    /* Find a filehandle number to use for a new file.\n     * It must not be handle 0, because 0 is returned as a failure code.\n     */\n    int i;\n    for (i = 1; i < 1024; i++) {\n      if (!fh[i])\n        return i;\n    }\n    return 0;\n}\n", "includes"=>["stdio.h"]}, :joystick=>{"code"=>"static SDL_Joystick *joystick;\n", "includes"=>[]}, :screen=>{"code"=>"static SDL_Surface *screen;\n", "includes"=>["SDL.h"]}, :mouse=>{"code"=>"static Uint8 mousebuttons;\nstatic int mousex;\nstatic int mousey;\n", "includes"=>[]}, :keyboard=>{"code"=>"static Uint8 *keystate;  /* for KeyboardPushed */\nstatic int numkeys;\nstatic Uint8 keyrel[SDLK_LAST];  /* for KeyboardReleased */\n", "includes"=>["SDL.h"]}, :dirhandles=>{"code"=>"struct dirinfo {\n    DIR *dir;\n    char *pattern;\n    char *name;\n    struct dirent curdent;\n};\nstatic struct dirinfo dh[1024];\nstatic int32_t unused_dh() {\n    int i;\n    for (i = 1; i < 1024; i++) {\n      if (!dh[i].dir)\n        return i;\n    }\n    return 0;\n}\n", "includes"=>["sys/types.h", "dirent.h"]}, :frontcolor=>{"code"=>"static SDL_Color frontcolor;\n", "includes"=>["SDL.h"]}, :framerate=>{"code"=>"static int framerate = 60;", "includes"=>[]}, :pack=>{"code"=>"static ssize_t fullwrite(int fd, unsigned char *buf, size_t count) {\n\tsize_t n = 0;\n\twhile (n < count) {\n\t\tssize_t r = write(fd, buf + n, count - n);\n\t\tif (r < 0 && errno == EINTR)\n\t\t\tcontinue;\n\t\tif (r < 0)\n\t\t\treturn r;\n\t\tif (r == 0)\n\t\t\treturn n;\n\t\tn += r;\n\t}\n\treturn n;\n}\n\nstatic int copyfds(int out_fd, int in_fd, size_t count) {\n\tunsigned char buf[32768];\n\tsize_t n = 0;\n\tssize_t r, r2, maxread;\n\twhile (n < count) {\n\t\tif (n + sizeof(buf) <= count) {\n\t\t\tmaxread = sizeof(buf);\n\t\t} else {\n\t\t\tmaxread = count - n;\n\t\t}\n\t\tr = read(in_fd, buf, maxread);\n\t\tif (r < 0 && errno == EINTR)\n\t\t\tcontinue;\n\t\tif (r < 0)\n\t\t\treturn r;\n\t\tif (r == 0)\n\t\t\treturn n;\n\t\tr2 = fullwrite(out_fd, buf, r);\n\t\tif (r2 < 0)\n\t\t\treturn r2;\n\t\tif (r2 == 0)\n\t\t\treturn n;\n\t\tn += r;\n\t}\n\treturn n;\n}\n\nstatic int putword(int fd, uint32_t w) {\n\tunsigned char s[4];\n\n\ts[0] = w;\n\ts[1] = w >> 8;\n\ts[2] = w >> 16;\n\ts[3] = w >> 24;\n\treturn fullwrite(fd, s, 4) == 4;\n}\n\nstatic int addpackfile(const char *name) {\n\tint fromfd;\n\tstruct stat statbuf;\n\tint r;\n\n\tif (packfd < 0)\n\t\treturn 0;\n\tfromfd = open(name, O_RDONLY);\n\tif (fromfd < 0)\n\t\treturn 0;\n\t/* Get file size */\n\tif (fstat(fromfd, &statbuf) < 0) {\n\t\tclose(fromfd);\n\t\treturn 0;\n\t}\n\n\t/* Go to end to add new file */\n\tlseek(packfd, 0, SEEK_END);\n\n\t/* Store without compression, so compressed and uncompressed sizes\n\t * will be the same. */\n\tputword(packfd, statbuf.st_size);\n\tputword(packfd, statbuf.st_size);\n\n\tr = copyfds(packfd, fromfd, statbuf.st_size);\n\tclose(fromfd);\n\tif (r != statbuf.st_size)\n\t\treturn 0;\n\treturn 1;\n}\n", "fragments"=>[:packfile], "includes"=>["unistd.h", "sys/types.h", "sys/stat.h", "fcntl.h", "errno.h"]}, :fileopen=>{"code"=>"static int32_t fileopen(int32_t h, const char *fname, const char *mode) {\n    int handle;\n    if (h < 0) {\n        handle = unused_fh();\n        if (handle == 0)\n          return 0;\n    } else {\n        handle = h;\n    }\n    if (fh[handle]) {\n        fclose(fh[handle]);\n        fh[handle] = 0;\n    }\n    fh[handle] = fopen(fname, mode);\n    if (!fh[handle])\n      return 0;\n    return (h < 0) ? handle : 1;\n}\n", "fragments"=>[:filehandles], "includes"=>["stdio.h"]}, :random=>{"code"=>"static void init_random() {\n    struct timeval tv;\n    unsigned int seed;\n\n    gettimeofday(&tv, 0);\n    seed = tv.tv_usec ^ tv.tv_sec ^ getpid();\n    srandom(seed);\n}\n", "includes"=>[], "initialize"=>"init_random();"}, :listdecl=>{"code"=>"struct ListElement {\n    struct ListElement *next;\n    struct ListElement *prev;\n    /* element data starts here */\n};\nclass LinkedList {\n  public:\n    struct ListElement *root;\n    struct ListElement *current;\n    struct ListElement *last;\n    int length;\n    int index;\n    LinkedList() : root(0), current(0), last(0), length(0), index(-1) {};\n    virtual struct ListElement *alloc_elem() = 0;\n    virtual void del_elem(struct ListElement *elem) = 0;\n};\ntemplate <typename T>\nclass TypedList : public LinkedList {\n  public:\n    struct ListElement *alloc_elem() {\n        char *space = new char [sizeof(struct ListElement) + sizeof(T)];\n        /* \"placement new\" to initialize the data part of the element */\n        new (space + sizeof(struct ListElement)) T();\n        return reinterpret_cast<struct ListElement *>(space);\n    }\n    void del_elem(struct ListElement *elem) {\n        T *realelem = reinterpret_cast<T *> (elem + 1);\n        realelem->~T();\n        delete[] reinterpret_cast<char *>(elem);\n    }\n    ~TypedList() {\n        struct ListElement *p;\n        while (this->root) {\n            p = this->root;\n            this->root = p->next;\n            this->del_elem(p);\n        }\n    }\n};\n#define LIST_CURRENT(list,type) (* (type *) ((list).current + 1))\n", "includes"=>[]}, :unpack=>{"code"=>"static uint32_t word(unsigned char *w) {\n\treturn w[0] | (w[1]<<8) | (w[2]<<16) | (w[3]<<24);\n}\n\nstatic ssize_t fullread(int fd, unsigned char *buf, size_t count) {\n\tsize_t n = 0;\n\tssize_t r = 0;\n\twhile (n < count) {\n\t\tr = read(fd, buf + n, count - n);\n\t\tif (r < 0 && errno == EINTR)\n\t\t\tcontinue;\n\t\tif (r < 0)\n\t\t\treturn r;\n\t\tif (r == 0)\n\t\t\treturn n;\n\t\tn += r;\n\t}\n\treturn n;\n}\n\nstatic unsigned char *packed;\nstatic int packedsize;\n\nstatic unsigned char *packp;\nstatic uint64_t curword;\nstatic int bitsleft;\n\nstatic uint32_t getbits(int bits) {\n\tif (bits > bitsleft) {\n\t\tcurword <<= 32;\n\t\tcurword |= word(packp);\n\t\tpackp += 4;\n\t\tbitsleft += 32;\n\t}\n\tbitsleft -= bits;\n\treturn (curword >> bitsleft) & ((1 << bits) - 1);\n}\n\nstatic uint32_t decodegamma() {\n\tuint32_t w = 1;\n\tdo {\n\t\tw = (w << 1) | getbits(1);\n\t} while (getbits(1));\n\treturn w;\n}\n\nstatic int decode() {\n\tint indexbase = 8;\n\tint lastindex = 1;\n\tint minimumliteral = 0;\n\tint literalbits = 8;\n\tunsigned char *dest = packfile;\n\n\tbitsleft = 0;\n\tcurword = 0;\n\n\tfor (;;) {\n\t\tif (packp - packed > packedsize + 4)\n\t\t\treturn 0;\n\t\tif (dest - packfile > packfilesize)\n\t\t\treturn 0;\n\t\tif (getbits(1)) {\n\t\t\t/* 1 Literal */\n\t\t\t*dest++ = getbits(literalbits) + minimumliteral;\n\t\t} else if (getbits(1)) {\n\t\t\t/* 01 Normal phrase */\n\t\t\tint l;\n\t\t\tint g = decodegamma();\n\t\t\tif (g == 2) {\n\t\t\t\t/* 0100 repeated normal phrase */\n\t\t\t\tl = decodegamma();\n\t\t\t} else {\n\t\t\t\tlastindex = getbits(indexbase) | ((g-3) << indexbase);\n\t\t\t\tl = decodegamma();\n\t\t\t\tif (lastindex >= 0x10000)\n\t\t\t\t\tl += 3;\n\t\t\t\telse if (lastindex >= 0x37ff)\n\t\t\t\t\tl += 2;\n\t\t\t\telse if (lastindex >= 0x27f)\n\t\t\t\t\tl += 1;\n\t\t\t\telse if (lastindex <= 0x7f)\n\t\t\t\t\tl += 4;\n\t\t\t}\n\t\t\tif (dest - packfile < lastindex)\n\t\t\t\treturn 0;\n\t\t\tif (dest - packfile + l > packfilesize)\n\t\t\t\treturn 0;\n\t\t\t/* Unfortunately can't use memmove or memcpy here,\n                         * because l > lastindex is allowed, and the\n                         * overlapping copy should be handled in this\n                         * specific way. */\n\t\t\twhile (l--) {\n\t\t\t\t*dest = *(dest - lastindex);\n\t\t\t\tdest++;\n\t\t\t}\n\t\t} else if (getbits(1)) {\n\t\t\tint x = getbits(4);\n\t\t\tif (!x) {\n\t\t\t\tif (getbits(1)) {\n\t\t\t\t\t/* 00100001 Block sequence */\n\t\t\t\t\tdo {\n\t\t\t\t\t\tint n;\n\t\t\t\t\t\tif (dest - packfile + 256 > packfilesize)\n\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\tfor (n = 0; n < 256; n++) {\n\t\t\t\t\t\t\t*dest++ = getbits(8);\n\t\t\t\t\t\t}\n\t\t\t\t\t} while (getbits(1));\n\t\t\t\t} else if (getbits(1)) {\n\t\t\t\t\t/* 001000001 */\n\t\t\t\t\tliteralbits = 8;\n\t\t\t\t\tminimumliteral = 0;\n\t\t\t\t} else {\n\t\t\t\t\t/* 001000000xxxxxxxx */\n\t\t\t\t\tliteralbits = 7;\n\t\t\t\t\tminimumliteral = getbits(8);\n\t\t\t\t}\n\t\t\t} else if (x == 1) {\n\t\t\t\t/* 0010001 literal byte 00 */\n\t\t\t\t*dest++ = 0;\n\t\t\t} else {\n\t\t\t\t/* 001xxxx single byte match */\n\t\t\t\tif (dest - packfile < x-1)\n\t\t\t\t\treturn 0;\n\t\t\t\t*dest = *(dest-(x-1));\n\t\t\t\tdest++;\n\t\t\t}\n\t\t} else {\n\t\t\tint x = getbits(7);\n\t\t\tint y = getbits(2);\n\t\t\tif (!x && !y) {\n\t\t\t\t/* 000000000000 done */\n\t\t\t\treturn dest - packfile; /* decoded size */\n\t\t\t}\n\t\t\tif (x) {\n\t\t\t\tif (dest - packfile < x)\n\t\t\t\t\treturn 0;\n\t\t\t\tif (dest - packfile + y+2 > packfilesize)\n\t\t\t\t\treturn 0;\n\t\t\t\t/* 000xxxxxxxyy Short match */\n\t\t\t\tlastindex = x;\n\t\t\t\ty += 2;\n\t\t\t\t/* can't memmove, same reason as above */\n\t\t\t        while (y--) {\n\t\t\t\t\t*dest = *(dest - lastindex);\n\t\t\t\t\tdest++;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t/* 0000000000yybbbb New index base */\n\t\t\t\tindexbase = getbits(y+3);\n\t\t\t}\n\t\t}\n\t}\n}\n\nstatic int nextpack() {\n\tunsigned char sizes[8];\n\tif (packfd < 0)\n\t\treturn 0;\n\tif (fullread(packfd, sizes, 8) < 8) {\n\t\tclosepack();\n\t\treturn 0;\n\t}\n\tpackfilesize = word(sizes);\n\tpackedsize = word(sizes + 4);\n\tif (packedsize > packfilesize) {\n\t\tclosepack();\n\t\treturn 0;\n\t}\n\tpackfile = new unsigned char [packfilesize];\n\tif (packedsize == packfilesize) {  /* not compressed */\n\t\tif (fullread(packfd, packfile, packfilesize) < packfilesize) {\n\t\t\tclosepack();\n\t\t\treturn 0;\n\t\t}\n\t\treturn 1;\n\t}\n\tpacked = new unsigned char [packedsize];\n\tpackp = packed + 10;\n\tif (packedsize < 14 ||\n\t    fullread(packfd, packed, packedsize) < packedsize ||\n\t    word(packed + 2) != packfilesize ||\n\t    packed[0] != 'J' || packed[1] != 'C' ||\n\t    decode() != packfilesize) {\n\t\tdelete[] packed;\n\t\tclosepack();\n\t\treturn 0;\n\t}\n\treturn 1;\n}\n", "fragments"=>[:packfile], "includes"=>["unistd.h", "errno.h"]}, :arrays=>{"code"=>"template<typename T>\nclass Array {\n\n  private:\n\n    int size1, size2, size3;\n    T *elems;\n    const char *name;\n    int warncount;\n\n  public:\n\n    Array() : size1(0), size2(0), size3(0), elems(0) {}\n    ~Array() { deallocate_(); }\n\n    void dim(const char *arrayname, int sz1, int sz2 = 1, int sz3 = 1) {\n        deallocate_();\n        elems = new T [sz1 * sz2 * sz3] ();\n        size1 = sz1;\n        size2 = sz2;\n        size3 = sz3;\n        name = arrayname;\n    }\n\n    T & operator() (const char *location, int i1) {\n        if (i1 < 0 || i1 >= size1) {\n            if (++warncount <= 3) {\n                std::cerr << location << \": \" << name << \"(\" << i1 << \") out of range\\n\";\n            }\n            return elems[0];\n        }\n        return elems[i1];\n    }\n\n    T & operator() (const char *location, int i1, int i2) {\n        if (i1 < 0 || i1 >= size1 || i2 < 0 || i2 >= size2) {\n            if (++warncount <= 3) {\n                std::cerr << location << \": \" << name << \"(\" << i1 << \",\" << i2 << \") out of range\\n\";\n            }\n            return elems[0];\n        }\n        return elems[i1 * size2 + i2];\n    }\n\n    T & operator() (const char *location, int i1, int i2, int i3) {\n        if (i1 < 0 || i1 >= size1 || i2 < 0 || i2 >= size2 || i3 < 0 || i3 >= size3) {\n            if (++warncount <= 3) {\n                std::cerr << location << \": \" << name << \"(\" << i1 << \",\" << i2 << \",\" << i3 << \") out of range\\n\";\n            }\n            return elems[0];\n        }\n        return elems[(i1 * size2 + i2) * size3 + i3];\n    }\n\n  private:\n\n    void deallocate_() {\n      delete[] elems;\n      elems = 0;\n    }\n};\n", "includes"=>["iostream"]}, :listfuncs=>{"code"=>"static void insertonly(LinkedList& list, struct ListElement *elem) {\n    elem->next = 0;\n    elem->prev = 0;\n    list.root = elem;\n    list.last = elem;\n    list.current = elem;\n    list.length = 1;\n    list.index = 0;\n}\nstatic void insertfirst(LinkedList& list, struct ListElement *elem) {\n    elem->next = list.root;\n    elem->prev = 0;\n    list.root->prev = elem;\n    list.root = elem;\n    list.current = elem;\n    list.length += 1;\n    list.index = 0;\n}\nstatic void insertlast(LinkedList& list, struct ListElement *elem) {\n    elem->next = 0;\n    elem->prev = list.last;\n    list.last->next = elem;\n    list.last = elem;\n    list.current = elem;\n    list.length += 1;\n    list.index = list.length - 1;\n}\n", "includes"=>[]}, :mods=>{"code"=>"static Mix_Music *mods[1024];\nstatic int32_t unused_mod() {\n    int i;\n    for (i = 1; i < 1024; i++) {\n        if (!mods[i])\n            return i;\n    }\n    return 0;\n}\n", "includes"=>["SDL_mixer.h"]}, :sounds=>{"code"=>"static Mix_Chunk *sounds[1024];\nstatic int32_t unused_sound() {\n    int i;\n    for (i = 1; i < 1024; i++) {\n      if (!sounds[i])\n        return i;\n    }\n    return 0;\n}\n", "includes"=>["SDL_mixer.h"]}, :basicfont=>{"code"=>"/* Vera.ttf Release 1.10, included with permission:\n\nCopyright (c) 2003 by Bitstream, Inc.\nAll Rights Reserved.\nBitstream Vera is a trademark of Bitstream, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of the fonts accompanying this license (\"Fonts\") and associated\ndocumentation files (the \"Font Software\"), to reproduce and distribute\nthe Font Software, including without limitation the rights to use, copy,\nmerge, publish, distribute, and/or sell copies of the Font Software,\nand to permit persons to whom the Font Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright and trademark notices and this permission notice shall\nbe included in all copies of one or more of the Font Software typefaces.\n\nThe Font Software may be modified, altered, or added to, and in particular\nthe designs of glyphs or characters in the Fonts may be modified and\nadditional glyphs or characters may be added to the Fonts, only if the\nfonts are renamed to names not containing either the words \"Bitstream\"\nor the word \"Vera\".\n\nThis License becomes null and void to the extent applicable to Fonts\nor Font Software that has been modified and is distributed under the\n\"Bitstream Vera\" names.\n\nThe Font Software may be sold as part of a larger software package but no\ncopy of one or more of the Font Software typefaces may be sold by itself.\n\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\nOF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL\nBITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL,\nOR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR\nOTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT\nSOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.\n\nExcept as contained in this notice, the names of Gnome, the Gnome\nFoundation, and Bitstream Inc., shall not be used in advertising or\notherwise to promote the sale, use or other dealings in this Font\nSoftware without prior written authorization from the Gnome Foundation\nor Bitstream Inc., respectively. For further information, contact:\nfonts at gnome dot org.http://www.bitstream.com\n\n*/\n\nstatic const char fontbits[] = {\n0,1,0,0,0,17,1,0,0,4,0,16,79,83,47,50,\n180,95,244,99,0,0,235,112,0,0,0,86,80,67,76,84,\n209,138,94,151,0,0,235,200,0,0,0,54,99,109,97,112,\n164,195,232,160,0,0,177,108,0,0,3,88,99,118,116,32,\n255,211,29,57,0,0,30,252,0,0,1,252,102,112,103,109,\n231,180,241,196,0,0,38,96,0,0,0,139,103,97,115,112,\n0,7,0,7,0,1,1,72,0,0,0,12,103,108,121,102,\n12,116,65,207,0,0,38,236,0,0,138,126,104,100,109,120,\n52,240,33,14,0,0,236,0,0,0,21,72,104,101,97,100,\n221,132,162,208,0,1,1,84,0,0,0,54,104,104,101,97,\n16,69,8,111,0,0,235,76,0,0,0,36,104,109,116,120,\n9,198,142,178,0,0,180,196,0,0,4,48,107,101,114,110,\n220,82,213,153,0,0,189,160,0,0,45,138,108,111,99,97,\n243,203,210,61,0,0,187,132,0,0,2,26,109,97,120,112,\n5,71,6,58,0,0,235,44,0,0,0,32,110,97,109,101,\n217,188,200,181,0,0,1,28,0,0,29,223,112,111,115,116,\n180,90,47,187,0,0,184,244,0,0,2,142,112,114,101,112,\n59,7,241,0,0,0,32,248,0,0,5,104,0,0,0,22,\n1,14,0,1,0,0,0,0,0,0,0,58,0,0,0,1,\n0,0,0,0,0,1,0,19,0,58,0,1,0,0,0,0,\n0,2,0,5,0,95,0,1,0,0,0,0,0,3,0,19,\n0,58,0,1,0,0,0,0,0,4,0,19,0,58,0,1,\n0,0,0,0,0,5,0,12,0,100,0,1,0,0,0,0,\n0,6,0,23,0,77,0,1,0,0,0,0,0,7,0,48,\n0,173,0,1,0,0,0,0,0,8,0,14,8,108,0,1,\n0,0,0,0,0,11,0,24,9,131,0,1,0,0,0,0,\n0,13,9,19,0,112,0,3,0,1,4,9,0,0,0,116,\n9,155,0,3,0,1,4,9,0,1,0,38,10,15,0,3,\n0,1,4,9,0,2,0,10,10,89,0,3,0,1,4,9,\n0,3,0,38,10,15,0,3,0,1,4,9,0,4,0,38,\n10,15,0,3,0,1,4,9,0,5,0,24,10,99,0,3,\n0,1,4,9,0,6,0,46,10,53,0,3,0,1,4,9,\n0,7,0,96,10,245,0,3,0,1,4,9,0,8,0,28,\n26,115,0,3,0,1,4,9,0,11,0,48,28,161,0,3,\n0,1,4,9,0,13,18,38,10,123,67,111,112,121,114,105,\n103,104,116,32,40,99,41,32,50,48,48,51,32,98,121,32,\n66,105,116,115,116,114,101,97,109,44,32,73,110,99,46,32,\n65,108,108,32,82,105,103,104,116,115,32,82,101,115,101,114,\n118,101,100,46,66,105,116,115,116,114,101,97,109,32,86,101,\n114,97,32,83,97,110,115,66,105,116,115,116,114,101,97,109,\n86,101,114,97,83,97,110,115,45,82,111,109,97,110,82,101,\n108,101,97,115,101,32,49,46,49,48,67,111,112,121,114,105,\n103,104,116,32,40,99,41,32,50,48,48,51,32,98,121,32,\n66,105,116,115,116,114,101,97,109,44,32,73,110,99,46,13,\n10,65,108,108,32,82,105,103,104,116,115,32,82,101,115,101,\n114,118,101,100,46,13,10,66,105,116,115,116,114,101,97,109,\n32,86,101,114,97,32,105,115,32,97,32,116,114,97,100,101,\n109,97,114,107,32,111,102,32,66,105,116,115,116,114,101,97,\n109,44,32,73,110,99,46,13,10,13,10,80,101,114,109,105,\n115,115,105,111,110,32,105,115,32,104,101,114,101,98,121,32,\n103,114,97,110,116,101,100,44,32,102,114,101,101,32,111,102,\n32,99,104,97,114,103,101,44,32,116,111,32,97,110,121,32,\n112,101,114,115,111,110,32,111,98,116,97,105,110,105,110,103,\n32,97,32,99,111,112,121,32,111,102,32,116,104,101,32,102,\n111,110,116,115,32,97,99,99,111,109,112,97,110,121,105,110,\n103,32,116,104,105,115,32,108,105,99,101,110,115,101,32,40,\n34,70,111,110,116,115,34,41,32,97,110,100,32,97,115,115,\n111,99,105,97,116,101,100,32,100,111,99,117,109,101,110,116,\n97,116,105,111,110,32,102,105,108,101,115,32,40,116,104,101,\n32,34,70,111,110,116,32,83,111,102,116,119,97,114,101,34,\n41,44,32,116,111,32,114,101,112,114,111,100,117,99,101,32,\n97,110,100,32,100,105,115,116,114,105,98,117,116,101,32,116,\n104,101,32,70,111,110,116,32,83,111,102,116,119,97,114,101,\n44,32,105,110,99,108,117,100,105,110,103,32,119,105,116,104,\n111,117,116,32,108,105,109,105,116,97,116,105,111,110,32,116,\n104,101,32,114,105,103,104,116,115,32,116,111,32,117,115,101,\n44,32,99,111,112,121,44,32,109,101,114,103,101,44,32,112,\n117,98,108,105,115,104,44,32,100,105,115,116,114,105,98,117,\n116,101,44,32,97,110,100,47,111,114,32,115,101,108,108,32,\n99,111,112,105,101,115,32,111,102,32,116,104,101,32,70,111,\n110,116,32,83,111,102,116,119,97,114,101,44,32,97,110,100,\n32,116,111,32,112,101,114,109,105,116,32,112,101,114,115,111,\n110,115,32,116,111,32,119,104,111,109,32,116,104,101,32,70,\n111,110,116,32,83,111,102,116,119,97,114,101,32,105,115,32,\n102,117,114,110,105,115,104,101,100,32,116,111,32,100,111,32,\n115,111,44,32,115,117,98,106,101,99,116,32,116,111,32,116,\n104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,110,\n100,105,116,105,111,110,115,58,13,10,13,10,84,104,101,32,\n97,98,111,118,101,32,99,111,112,121,114,105,103,104,116,32,\n97,110,100,32,116,114,97,100,101,109,97,114,107,32,110,111,\n116,105,99,101,115,32,97,110,100,32,116,104,105,115,32,112,\n101,114,109,105,115,115,105,111,110,32,110,111,116,105,99,101,\n32,115,104,97,108,108,32,98,101,32,105,110,99,108,117,100,\n101,100,32,105,110,32,97,108,108,32,99,111,112,105,101,115,\n32,111,102,32,111,110,101,32,111,114,32,109,111,114,101,32,\n111,102,32,116,104,101,32,70,111,110,116,32,83,111,102,116,\n119,97,114,101,32,116,121,112,101,102,97,99,101,115,46,13,\n10,13,10,84,104,101,32,70,111,110,116,32,83,111,102,116,\n119,97,114,101,32,109,97,121,32,98,101,32,109,111,100,105,\n102,105,101,100,44,32,97,108,116,101,114,101,100,44,32,111,\n114,32,97,100,100,101,100,32,116,111,44,32,97,110,100,32,\n105,110,32,112,97,114,116,105,99,117,108,97,114,32,116,104,\n101,32,100,101,115,105,103,110,115,32,111,102,32,103,108,121,\n112,104,115,32,111,114,32,99,104,97,114,97,99,116,101,114,\n115,32,105,110,32,116,104,101,32,70,111,110,116,115,32,109,\n97,121,32,98,101,32,109,111,100,105,102,105,101,100,32,97,\n110,100,32,97,100,100,105,116,105,111,110,97,108,32,103,108,\n121,112,104,115,32,111,114,32,99,104,97,114,97,99,116,101,\n114,115,32,109,97,121,32,98,101,32,97,100,100,101,100,32,\n116,111,32,116,104,101,32,70,111,110,116,115,44,32,111,110,\n108,121,32,105,102,32,116,104,101,32,102,111,110,116,115,32,\n97,114,101,32,114,101,110,97,109,101,100,32,116,111,32,110,\n97,109,101,115,32,110,111,116,32,99,111,110,116,97,105,110,\n105,110,103,32,101,105,116,104,101,114,32,116,104,101,32,119,\n111,114,100,115,32,34,66,105,116,115,116,114,101,97,109,34,\n32,111,114,32,116,104,101,32,119,111,114,100,32,34,86,101,\n114,97,34,46,13,10,13,10,84,104,105,115,32,76,105,99,\n101,110,115,101,32,98,101,99,111,109,101,115,32,110,117,108,\n108,32,97,110,100,32,118,111,105,100,32,116,111,32,116,104,\n101,32,101,120,116,101,110,116,32,97,112,112,108,105,99,97,\n98,108,101,32,116,111,32,70,111,110,116,115,32,111,114,32,\n70,111,110,116,32,83,111,102,116,119,97,114,101,32,116,104,\n97,116,32,104,97,115,32,98,101,101,110,32,109,111,100,105,\n102,105,101,100,32,97,110,100,32,105,115,32,100,105,115,116,\n114,105,98,117,116,101,100,32,117,110,100,101,114,32,116,104,\n101,32,34,66,105,116,115,116,114,101,97,109,32,86,101,114,\n97,34,32,110,97,109,101,115,46,13,10,13,10,84,104,101,\n32,70,111,110,116,32,83,111,102,116,119,97,114,101,32,109,\n97,121,32,98,101,32,115,111,108,100,32,97,115,32,112,97,\n114,116,32,111,102,32,97,32,108,97,114,103,101,114,32,115,\n111,102,116,119,97,114,101,32,112,97,99,107,97,103,101,32,\n98,117,116,32,110,111,32,99,111,112,121,32,111,102,32,111,\n110,101,32,111,114,32,109,111,114,101,32,111,102,32,116,104,\n101,32,70,111,110,116,32,83,111,102,116,119,97,114,101,32,\n116,121,112,101,102,97,99,101,115,32,109,97,121,32,98,101,\n32,115,111,108,100,32,98,121,32,105,116,115,101,108,102,46,\n13,10,13,10,84,72,69,32,70,79,78,84,32,83,79,70,\n84,87,65,82,69,32,73,83,32,80,82,79,86,73,68,69,\n68,32,34,65,83,32,73,83,34,44,32,87,73,84,72,79,\n85,84,32,87,65,82,82,65,78,84,89,32,79,70,32,65,\n78,89,32,75,73,78,68,44,32,69,88,80,82,69,83,83,\n32,79,82,32,73,77,80,76,73,69,68,44,32,73,78,67,\n76,85,68,73,78,71,32,66,85,84,32,78,79,84,32,76,\n73,77,73,84,69,68,32,84,79,32,65,78,89,32,87,65,\n82,82,65,78,84,73,69,83,32,79,70,32,77,69,82,67,\n72,65,78,84,65,66,73,76,73,84,89,44,32,70,73,84,\n78,69,83,83,32,70,79,82,32,65,32,80,65,82,84,73,\n67,85,76,65,82,32,80,85,82,80,79,83,69,32,65,78,\n68,32,78,79,78,73,78,70,82,73,78,71,69,77,69,78,\n84,32,79,70,32,67,79,80,89,82,73,71,72,84,44,32,\n80,65,84,69,78,84,44,32,84,82,65,68,69,77,65,82,\n75,44,32,79,82,32,79,84,72,69,82,32,82,73,71,72,\n84,46,32,73,78,32,78,79,32,69,86,69,78,84,32,83,\n72,65,76,76,32,66,73,84,83,84,82,69,65,77,32,79,\n82,32,84,72,69,32,71,78,79,77,69,32,70,79,85,78,\n68,65,84,73,79,78,32,66,69,32,76,73,65,66,76,69,\n32,70,79,82,32,65,78,89,32,67,76,65,73,77,44,32,\n68,65,77,65,71,69,83,32,79,82,32,79,84,72,69,82,\n32,76,73,65,66,73,76,73,84,89,44,32,73,78,67,76,\n85,68,73,78,71,32,65,78,89,32,71,69,78,69,82,65,\n76,44,32,83,80,69,67,73,65,76,44,32,73,78,68,73,\n82,69,67,84,44,32,73,78,67,73,68,69,78,84,65,76,\n44,32,79,82,32,67,79,78,83,69,81,85,69,78,84,73,\n65,76,32,68,65,77,65,71,69,83,44,32,87,72,69,84,\n72,69,82,32,73,78,32,65,78,32,65,67,84,73,79,78,\n32,79,70,32,67,79,78,84,82,65,67,84,44,32,84,79,\n82,84,32,79,82,32,79,84,72,69,82,87,73,83,69,44,\n32,65,82,73,83,73,78,71,32,70,82,79,77,44,32,79,\n85,84,32,79,70,32,84,72,69,32,85,83,69,32,79,82,\n32,73,78,65,66,73,76,73,84,89,32,84,79,32,85,83,\n69,32,84,72,69,32,70,79,78,84,32,83,79,70,84,87,\n65,82,69,32,79,82,32,70,82,79,77,32,79,84,72,69,\n82,32,68,69,65,76,73,78,71,83,32,73,78,32,84,72,\n69,32,70,79,78,84,32,83,79,70,84,87,65,82,69,46,\n13,10,13,10,69,120,99,101,112,116,32,97,115,32,99,111,\n110,116,97,105,110,101,100,32,105,110,32,116,104,105,115,32,\n110,111,116,105,99,101,44,32,116,104,101,32,110,97,109,101,\n115,32,111,102,32,71,110,111,109,101,44,32,116,104,101,32,\n71,110,111,109,101,32,70,111,117,110,100,97,116,105,111,110,\n44,32,97,110,100,32,66,105,116,115,116,114,101,97,109,32,\n73,110,99,46,44,32,115,104,97,108,108,32,110,111,116,32,\n98,101,32,117,115,101,100,32,105,110,32,97,100,118,101,114,\n116,105,115,105,110,103,32,111,114,32,111,116,104,101,114,119,\n105,115,101,32,116,111,32,112,114,111,109,111,116,101,32,116,\n104,101,32,115,97,108,101,44,32,117,115,101,32,111,114,32,\n111,116,104,101,114,32,100,101,97,108,105,110,103,115,32,105,\n110,32,116,104,105,115,32,70,111,110,116,32,83,111,102,116,\n119,97,114,101,32,119,105,116,104,111,117,116,32,112,114,105,\n111,114,32,119,114,105,116,116,101,110,32,97,117,116,104,111,\n114,105,122,97,116,105,111,110,32,102,114,111,109,32,116,104,\n101,32,71,110,111,109,101,32,70,111,117,110,100,97,116,105,\n111,110,32,111,114,32,66,105,116,115,116,114,101,97,109,32,\n73,110,99,46,44,32,114,101,115,112,101,99,116,105,118,101,\n108,121,46,32,70,111,114,32,102,117,114,116,104,101,114,32,\n105,110,102,111,114,109,97,116,105,111,110,44,32,99,111,110,\n116,97,99,116,58,32,102,111,110,116,115,32,97,116,32,103,\n110,111,109,101,32,100,111,116,32,111,114,103,46,104,116,116,\n112,58,47,47,119,119,119,46,98,105,116,115,116,114,101,97,\n109,46,99,111,109,0,67,0,111,0,112,0,121,0,114,0,\n105,0,103,0,104,0,116,0,32,0,40,0,99,0,41,0,\n32,0,50,0,48,0,48,0,51,0,32,0,98,0,121,0,\n32,0,66,0,105,0,116,0,115,0,116,0,114,0,101,0,\n97,0,109,0,44,0,32,0,73,0,110,0,99,0,46,0,\n32,0,65,0,108,0,108,0,32,0,82,0,105,0,103,0,\n104,0,116,0,115,0,32,0,82,0,101,0,115,0,101,0,\n114,0,118,0,101,0,100,0,46,0,66,0,105,0,116,0,\n115,0,116,0,114,0,101,0,97,0,109,0,32,0,86,0,\n101,0,114,0,97,0,32,0,83,0,97,0,110,0,115,0,\n66,0,105,0,116,0,115,0,116,0,114,0,101,0,97,0,\n109,0,86,0,101,0,114,0,97,0,83,0,97,0,110,0,\n115,0,45,0,82,0,111,0,109,0,97,0,110,0,82,0,\n101,0,108,0,101,0,97,0,115,0,101,0,32,0,49,0,\n46,0,49,0,48,0,67,0,111,0,112,0,121,0,114,0,\n105,0,103,0,104,0,116,0,32,0,40,0,99,0,41,0,\n32,0,50,0,48,0,48,0,51,0,32,0,98,0,121,0,\n32,0,66,0,105,0,116,0,115,0,116,0,114,0,101,0,\n97,0,109,0,44,0,32,0,73,0,110,0,99,0,46,0,\n13,0,10,0,65,0,108,0,108,0,32,0,82,0,105,0,\n103,0,104,0,116,0,115,0,32,0,82,0,101,0,115,0,\n101,0,114,0,118,0,101,0,100,0,46,0,13,0,10,0,\n66,0,105,0,116,0,115,0,116,0,114,0,101,0,97,0,\n109,0,32,0,86,0,101,0,114,0,97,0,32,0,105,0,\n115,0,32,0,97,0,32,0,116,0,114,0,97,0,100,0,\n101,0,109,0,97,0,114,0,107,0,32,0,111,0,102,0,\n32,0,66,0,105,0,116,0,115,0,116,0,114,0,101,0,\n97,0,109,0,44,0,32,0,73,0,110,0,99,0,46,0,\n13,0,10,0,13,0,10,0,80,0,101,0,114,0,109,0,\n105,0,115,0,115,0,105,0,111,0,110,0,32,0,105,0,\n115,0,32,0,104,0,101,0,114,0,101,0,98,0,121,0,\n32,0,103,0,114,0,97,0,110,0,116,0,101,0,100,0,\n44,0,32,0,102,0,114,0,101,0,101,0,32,0,111,0,\n102,0,32,0,99,0,104,0,97,0,114,0,103,0,101,0,\n44,0,32,0,116,0,111,0,32,0,97,0,110,0,121,0,\n32,0,112,0,101,0,114,0,115,0,111,0,110,0,32,0,\n111,0,98,0,116,0,97,0,105,0,110,0,105,0,110,0,\n103,0,32,0,97,0,32,0,99,0,111,0,112,0,121,0,\n32,0,111,0,102,0,32,0,116,0,104,0,101,0,32,0,\n102,0,111,0,110,0,116,0,115,0,32,0,97,0,99,0,\n99,0,111,0,109,0,112,0,97,0,110,0,121,0,105,0,\n110,0,103,0,32,0,116,0,104,0,105,0,115,0,32,0,\n108,0,105,0,99,0,101,0,110,0,115,0,101,0,32,0,\n40,0,34,0,70,0,111,0,110,0,116,0,115,0,34,0,\n41,0,32,0,97,0,110,0,100,0,32,0,97,0,115,0,\n115,0,111,0,99,0,105,0,97,0,116,0,101,0,100,0,\n32,0,100,0,111,0,99,0,117,0,109,0,101,0,110,0,\n116,0,97,0,116,0,105,0,111,0,110,0,32,0,102,0,\n105,0,108,0,101,0,115,0,32,0,40,0,116,0,104,0,\n101,0,32,0,34,0,70,0,111,0,110,0,116,0,32,0,\n83,0,111,0,102,0,116,0,119,0,97,0,114,0,101,0,\n34,0,41,0,44,0,32,0,116,0,111,0,32,0,114,0,\n101,0,112,0,114,0,111,0,100,0,117,0,99,0,101,0,\n32,0,97,0,110,0,100,0,32,0,100,0,105,0,115,0,\n116,0,114,0,105,0,98,0,117,0,116,0,101,0,32,0,\n116,0,104,0,101,0,32,0,70,0,111,0,110,0,116,0,\n32,0,83,0,111,0,102,0,116,0,119,0,97,0,114,0,\n101,0,44,0,32,0,105,0,110,0,99,0,108,0,117,0,\n100,0,105,0,110,0,103,0,32,0,119,0,105,0,116,0,\n104,0,111,0,117,0,116,0,32,0,108,0,105,0,109,0,\n105,0,116,0,97,0,116,0,105,0,111,0,110,0,32,0,\n116,0,104,0,101,0,32,0,114,0,105,0,103,0,104,0,\n116,0,115,0,32,0,116,0,111,0,32,0,117,0,115,0,\n101,0,44,0,32,0,99,0,111,0,112,0,121,0,44,0,\n32,0,109,0,101,0,114,0,103,0,101,0,44,0,32,0,\n112,0,117,0,98,0,108,0,105,0,115,0,104,0,44,0,\n32,0,100,0,105,0,115,0,116,0,114,0,105,0,98,0,\n117,0,116,0,101,0,44,0,32,0,97,0,110,0,100,0,\n47,0,111,0,114,0,32,0,115,0,101,0,108,0,108,0,\n32,0,99,0,111,0,112,0,105,0,101,0,115,0,32,0,\n111,0,102,0,32,0,116,0,104,0,101,0,32,0,70,0,\n111,0,110,0,116,0,32,0,83,0,111,0,102,0,116,0,\n119,0,97,0,114,0,101,0,44,0,32,0,97,0,110,0,\n100,0,32,0,116,0,111,0,32,0,112,0,101,0,114,0,\n109,0,105,0,116,0,32,0,112,0,101,0,114,0,115,0,\n111,0,110,0,115,0,32,0,116,0,111,0,32,0,119,0,\n104,0,111,0,109,0,32,0,116,0,104,0,101,0,32,0,\n70,0,111,0,110,0,116,0,32,0,83,0,111,0,102,0,\n116,0,119,0,97,0,114,0,101,0,32,0,105,0,115,0,\n32,0,102,0,117,0,114,0,110,0,105,0,115,0,104,0,\n101,0,100,0,32,0,116,0,111,0,32,0,100,0,111,0,\n32,0,115,0,111,0,44,0,32,0,115,0,117,0,98,0,\n106,0,101,0,99,0,116,0,32,0,116,0,111,0,32,0,\n116,0,104,0,101,0,32,0,102,0,111,0,108,0,108,0,\n111,0,119,0,105,0,110,0,103,0,32,0,99,0,111,0,\n110,0,100,0,105,0,116,0,105,0,111,0,110,0,115,0,\n58,0,13,0,10,0,13,0,10,0,84,0,104,0,101,0,\n32,0,97,0,98,0,111,0,118,0,101,0,32,0,99,0,\n111,0,112,0,121,0,114,0,105,0,103,0,104,0,116,0,\n32,0,97,0,110,0,100,0,32,0,116,0,114,0,97,0,\n100,0,101,0,109,0,97,0,114,0,107,0,32,0,110,0,\n111,0,116,0,105,0,99,0,101,0,115,0,32,0,97,0,\n110,0,100,0,32,0,116,0,104,0,105,0,115,0,32,0,\n112,0,101,0,114,0,109,0,105,0,115,0,115,0,105,0,\n111,0,110,0,32,0,110,0,111,0,116,0,105,0,99,0,\n101,0,32,0,115,0,104,0,97,0,108,0,108,0,32,0,\n98,0,101,0,32,0,105,0,110,0,99,0,108,0,117,0,\n100,0,101,0,100,0,32,0,105,0,110,0,32,0,97,0,\n108,0,108,0,32,0,99,0,111,0,112,0,105,0,101,0,\n115,0,32,0,111,0,102,0,32,0,111,0,110,0,101,0,\n32,0,111,0,114,0,32,0,109,0,111,0,114,0,101,0,\n32,0,111,0,102,0,32,0,116,0,104,0,101,0,32,0,\n70,0,111,0,110,0,116,0,32,0,83,0,111,0,102,0,\n116,0,119,0,97,0,114,0,101,0,32,0,116,0,121,0,\n112,0,101,0,102,0,97,0,99,0,101,0,115,0,46,0,\n13,0,10,0,13,0,10,0,84,0,104,0,101,0,32,0,\n70,0,111,0,110,0,116,0,32,0,83,0,111,0,102,0,\n116,0,119,0,97,0,114,0,101,0,32,0,109,0,97,0,\n121,0,32,0,98,0,101,0,32,0,109,0,111,0,100,0,\n105,0,102,0,105,0,101,0,100,0,44,0,32,0,97,0,\n108,0,116,0,101,0,114,0,101,0,100,0,44,0,32,0,\n111,0,114,0,32,0,97,0,100,0,100,0,101,0,100,0,\n32,0,116,0,111,0,44,0,32,0,97,0,110,0,100,0,\n32,0,105,0,110,0,32,0,112,0,97,0,114,0,116,0,\n105,0,99,0,117,0,108,0,97,0,114,0,32,0,116,0,\n104,0,101,0,32,0,100,0,101,0,115,0,105,0,103,0,\n110,0,115,0,32,0,111,0,102,0,32,0,103,0,108,0,\n121,0,112,0,104,0,115,0,32,0,111,0,114,0,32,0,\n99,0,104,0,97,0,114,0,97,0,99,0,116,0,101,0,\n114,0,115,0,32,0,105,0,110,0,32,0,116,0,104,0,\n101,0,32,0,70,0,111,0,110,0,116,0,115,0,32,0,\n109,0,97,0,121,0,32,0,98,0,101,0,32,0,109,0,\n111,0,100,0,105,0,102,0,105,0,101,0,100,0,32,0,\n97,0,110,0,100,0,32,0,97,0,100,0,100,0,105,0,\n116,0,105,0,111,0,110,0,97,0,108,0,32,0,103,0,\n108,0,121,0,112,0,104,0,115,0,32,0,111,0,114,0,\n32,0,99,0,104,0,97,0,114,0,97,0,99,0,116,0,\n101,0,114,0,115,0,32,0,109,0,97,0,121,0,32,0,\n98,0,101,0,32,0,97,0,100,0,100,0,101,0,100,0,\n32,0,116,0,111,0,32,0,116,0,104,0,101,0,32,0,\n70,0,111,0,110,0,116,0,115,0,44,0,32,0,111,0,\n110,0,108,0,121,0,32,0,105,0,102,0,32,0,116,0,\n104,0,101,0,32,0,102,0,111,0,110,0,116,0,115,0,\n32,0,97,0,114,0,101,0,32,0,114,0,101,0,110,0,\n97,0,109,0,101,0,100,0,32,0,116,0,111,0,32,0,\n110,0,97,0,109,0,101,0,115,0,32,0,110,0,111,0,\n116,0,32,0,99,0,111,0,110,0,116,0,97,0,105,0,\n110,0,105,0,110,0,103,0,32,0,101,0,105,0,116,0,\n104,0,101,0,114,0,32,0,116,0,104,0,101,0,32,0,\n119,0,111,0,114,0,100,0,115,0,32,0,34,0,66,0,\n105,0,116,0,115,0,116,0,114,0,101,0,97,0,109,0,\n34,0,32,0,111,0,114,0,32,0,116,0,104,0,101,0,\n32,0,119,0,111,0,114,0,100,0,32,0,34,0,86,0,\n101,0,114,0,97,0,34,0,46,0,13,0,10,0,13,0,\n10,0,84,0,104,0,105,0,115,0,32,0,76,0,105,0,\n99,0,101,0,110,0,115,0,101,0,32,0,98,0,101,0,\n99,0,111,0,109,0,101,0,115,0,32,0,110,0,117,0,\n108,0,108,0,32,0,97,0,110,0,100,0,32,0,118,0,\n111,0,105,0,100,0,32,0,116,0,111,0,32,0,116,0,\n104,0,101,0,32,0,101,0,120,0,116,0,101,0,110,0,\n116,0,32,0,97,0,112,0,112,0,108,0,105,0,99,0,\n97,0,98,0,108,0,101,0,32,0,116,0,111,0,32,0,\n70,0,111,0,110,0,116,0,115,0,32,0,111,0,114,0,\n32,0,70,0,111,0,110,0,116,0,32,0,83,0,111,0,\n102,0,116,0,119,0,97,0,114,0,101,0,32,0,116,0,\n104,0,97,0,116,0,32,0,104,0,97,0,115,0,32,0,\n98,0,101,0,101,0,110,0,32,0,109,0,111,0,100,0,\n105,0,102,0,105,0,101,0,100,0,32,0,97,0,110,0,\n100,0,32,0,105,0,115,0,32,0,100,0,105,0,115,0,\n116,0,114,0,105,0,98,0,117,0,116,0,101,0,100,0,\n32,0,117,0,110,0,100,0,101,0,114,0,32,0,116,0,\n104,0,101,0,32,0,34,0,66,0,105,0,116,0,115,0,\n116,0,114,0,101,0,97,0,109,0,32,0,86,0,101,0,\n114,0,97,0,34,0,32,0,110,0,97,0,109,0,101,0,\n115,0,46,0,13,0,10,0,13,0,10,0,84,0,104,0,\n101,0,32,0,70,0,111,0,110,0,116,0,32,0,83,0,\n111,0,102,0,116,0,119,0,97,0,114,0,101,0,32,0,\n109,0,97,0,121,0,32,0,98,0,101,0,32,0,115,0,\n111,0,108,0,100,0,32,0,97,0,115,0,32,0,112,0,\n97,0,114,0,116,0,32,0,111,0,102,0,32,0,97,0,\n32,0,108,0,97,0,114,0,103,0,101,0,114,0,32,0,\n115,0,111,0,102,0,116,0,119,0,97,0,114,0,101,0,\n32,0,112,0,97,0,99,0,107,0,97,0,103,0,101,0,\n32,0,98,0,117,0,116,0,32,0,110,0,111,0,32,0,\n99,0,111,0,112,0,121,0,32,0,111,0,102,0,32,0,\n111,0,110,0,101,0,32,0,111,0,114,0,32,0,109,0,\n111,0,114,0,101,0,32,0,111,0,102,0,32,0,116,0,\n104,0,101,0,32,0,70,0,111,0,110,0,116,0,32,0,\n83,0,111,0,102,0,116,0,119,0,97,0,114,0,101,0,\n32,0,116,0,121,0,112,0,101,0,102,0,97,0,99,0,\n101,0,115,0,32,0,109,0,97,0,121,0,32,0,98,0,\n101,0,32,0,115,0,111,0,108,0,100,0,32,0,98,0,\n121,0,32,0,105,0,116,0,115,0,101,0,108,0,102,0,\n46,0,13,0,10,0,13,0,10,0,84,0,72,0,69,0,\n32,0,70,0,79,0,78,0,84,0,32,0,83,0,79,0,\n70,0,84,0,87,0,65,0,82,0,69,0,32,0,73,0,\n83,0,32,0,80,0,82,0,79,0,86,0,73,0,68,0,\n69,0,68,0,32,0,34,0,65,0,83,0,32,0,73,0,\n83,0,34,0,44,0,32,0,87,0,73,0,84,0,72,0,\n79,0,85,0,84,0,32,0,87,0,65,0,82,0,82,0,\n65,0,78,0,84,0,89,0,32,0,79,0,70,0,32,0,\n65,0,78,0,89,0,32,0,75,0,73,0,78,0,68,0,\n44,0,32,0,69,0,88,0,80,0,82,0,69,0,83,0,\n83,0,32,0,79,0,82,0,32,0,73,0,77,0,80,0,\n76,0,73,0,69,0,68,0,44,0,32,0,73,0,78,0,\n67,0,76,0,85,0,68,0,73,0,78,0,71,0,32,0,\n66,0,85,0,84,0,32,0,78,0,79,0,84,0,32,0,\n76,0,73,0,77,0,73,0,84,0,69,0,68,0,32,0,\n84,0,79,0,32,0,65,0,78,0,89,0,32,0,87,0,\n65,0,82,0,82,0,65,0,78,0,84,0,73,0,69,0,\n83,0,32,0,79,0,70,0,32,0,77,0,69,0,82,0,\n67,0,72,0,65,0,78,0,84,0,65,0,66,0,73,0,\n76,0,73,0,84,0,89,0,44,0,32,0,70,0,73,0,\n84,0,78,0,69,0,83,0,83,0,32,0,70,0,79,0,\n82,0,32,0,65,0,32,0,80,0,65,0,82,0,84,0,\n73,0,67,0,85,0,76,0,65,0,82,0,32,0,80,0,\n85,0,82,0,80,0,79,0,83,0,69,0,32,0,65,0,\n78,0,68,0,32,0,78,0,79,0,78,0,73,0,78,0,\n70,0,82,0,73,0,78,0,71,0,69,0,77,0,69,0,\n78,0,84,0,32,0,79,0,70,0,32,0,67,0,79,0,\n80,0,89,0,82,0,73,0,71,0,72,0,84,0,44,0,\n32,0,80,0,65,0,84,0,69,0,78,0,84,0,44,0,\n32,0,84,0,82,0,65,0,68,0,69,0,77,0,65,0,\n82,0,75,0,44,0,32,0,79,0,82,0,32,0,79,0,\n84,0,72,0,69,0,82,0,32,0,82,0,73,0,71,0,\n72,0,84,0,46,0,32,0,73,0,78,0,32,0,78,0,\n79,0,32,0,69,0,86,0,69,0,78,0,84,0,32,0,\n83,0,72,0,65,0,76,0,76,0,32,0,66,0,73,0,\n84,0,83,0,84,0,82,0,69,0,65,0,77,0,32,0,\n79,0,82,0,32,0,84,0,72,0,69,0,32,0,71,0,\n78,0,79,0,77,0,69,0,32,0,70,0,79,0,85,0,\n78,0,68,0,65,0,84,0,73,0,79,0,78,0,32,0,\n66,0,69,0,32,0,76,0,73,0,65,0,66,0,76,0,\n69,0,32,0,70,0,79,0,82,0,32,0,65,0,78,0,\n89,0,32,0,67,0,76,0,65,0,73,0,77,0,44,0,\n32,0,68,0,65,0,77,0,65,0,71,0,69,0,83,0,\n32,0,79,0,82,0,32,0,79,0,84,0,72,0,69,0,\n82,0,32,0,76,0,73,0,65,0,66,0,73,0,76,0,\n73,0,84,0,89,0,44,0,32,0,73,0,78,0,67,0,\n76,0,85,0,68,0,73,0,78,0,71,0,32,0,65,0,\n78,0,89,0,32,0,71,0,69,0,78,0,69,0,82,0,\n65,0,76,0,44,0,32,0,83,0,80,0,69,0,67,0,\n73,0,65,0,76,0,44,0,32,0,73,0,78,0,68,0,\n73,0,82,0,69,0,67,0,84,0,44,0,32,0,73,0,\n78,0,67,0,73,0,68,0,69,0,78,0,84,0,65,0,\n76,0,44,0,32,0,79,0,82,0,32,0,67,0,79,0,\n78,0,83,0,69,0,81,0,85,0,69,0,78,0,84,0,\n73,0,65,0,76,0,32,0,68,0,65,0,77,0,65,0,\n71,0,69,0,83,0,44,0,32,0,87,0,72,0,69,0,\n84,0,72,0,69,0,82,0,32,0,73,0,78,0,32,0,\n65,0,78,0,32,0,65,0,67,0,84,0,73,0,79,0,\n78,0,32,0,79,0,70,0,32,0,67,0,79,0,78,0,\n84,0,82,0,65,0,67,0,84,0,44,0,32,0,84,0,\n79,0,82,0,84,0,32,0,79,0,82,0,32,0,79,0,\n84,0,72,0,69,0,82,0,87,0,73,0,83,0,69,0,\n44,0,32,0,65,0,82,0,73,0,83,0,73,0,78,0,\n71,0,32,0,70,0,82,0,79,0,77,0,44,0,32,0,\n79,0,85,0,84,0,32,0,79,0,70,0,32,0,84,0,\n72,0,69,0,32,0,85,0,83,0,69,0,32,0,79,0,\n82,0,32,0,73,0,78,0,65,0,66,0,73,0,76,0,\n73,0,84,0,89,0,32,0,84,0,79,0,32,0,85,0,\n83,0,69,0,32,0,84,0,72,0,69,0,32,0,70,0,\n79,0,78,0,84,0,32,0,83,0,79,0,70,0,84,0,\n87,0,65,0,82,0,69,0,32,0,79,0,82,0,32,0,\n70,0,82,0,79,0,77,0,32,0,79,0,84,0,72,0,\n69,0,82,0,32,0,68,0,69,0,65,0,76,0,73,0,\n78,0,71,0,83,0,32,0,73,0,78,0,32,0,84,0,\n72,0,69,0,32,0,70,0,79,0,78,0,84,0,32,0,\n83,0,79,0,70,0,84,0,87,0,65,0,82,0,69,0,\n46,0,13,0,10,0,13,0,10,0,69,0,120,0,99,0,\n101,0,112,0,116,0,32,0,97,0,115,0,32,0,99,0,\n111,0,110,0,116,0,97,0,105,0,110,0,101,0,100,0,\n32,0,105,0,110,0,32,0,116,0,104,0,105,0,115,0,\n32,0,110,0,111,0,116,0,105,0,99,0,101,0,44,0,\n32,0,116,0,104,0,101,0,32,0,110,0,97,0,109,0,\n101,0,115,0,32,0,111,0,102,0,32,0,71,0,110,0,\n111,0,109,0,101,0,44,0,32,0,116,0,104,0,101,0,\n32,0,71,0,110,0,111,0,109,0,101,0,32,0,70,0,\n111,0,117,0,110,0,100,0,97,0,116,0,105,0,111,0,\n110,0,44,0,32,0,97,0,110,0,100,0,32,0,66,0,\n105,0,116,0,115,0,116,0,114,0,101,0,97,0,109,0,\n32,0,73,0,110,0,99,0,46,0,44,0,32,0,115,0,\n104,0,97,0,108,0,108,0,32,0,110,0,111,0,116,0,\n32,0,98,0,101,0,32,0,117,0,115,0,101,0,100,0,\n32,0,105,0,110,0,32,0,97,0,100,0,118,0,101,0,\n114,0,116,0,105,0,115,0,105,0,110,0,103,0,32,0,\n111,0,114,0,32,0,111,0,116,0,104,0,101,0,114,0,\n119,0,105,0,115,0,101,0,32,0,116,0,111,0,32,0,\n112,0,114,0,111,0,109,0,111,0,116,0,101,0,32,0,\n116,0,104,0,101,0,32,0,115,0,97,0,108,0,101,0,\n44,0,32,0,117,0,115,0,101,0,32,0,111,0,114,0,\n32,0,111,0,116,0,104,0,101,0,114,0,32,0,100,0,\n101,0,97,0,108,0,105,0,110,0,103,0,115,0,32,0,\n105,0,110,0,32,0,116,0,104,0,105,0,115,0,32,0,\n70,0,111,0,110,0,116,0,32,0,83,0,111,0,102,0,\n116,0,119,0,97,0,114,0,101,0,32,0,119,0,105,0,\n116,0,104,0,111,0,117,0,116,0,32,0,112,0,114,0,\n105,0,111,0,114,0,32,0,119,0,114,0,105,0,116,0,\n116,0,101,0,110,0,32,0,97,0,117,0,116,0,104,0,\n111,0,114,0,105,0,122,0,97,0,116,0,105,0,111,0,\n110,0,32,0,102,0,114,0,111,0,109,0,32,0,116,0,\n104,0,101,0,32,0,71,0,110,0,111,0,109,0,101,0,\n32,0,70,0,111,0,117,0,110,0,100,0,97,0,116,0,\n105,0,111,0,110,0,32,0,111,0,114,0,32,0,66,0,\n105,0,116,0,115,0,116,0,114,0,101,0,97,0,109,0,\n32,0,73,0,110,0,99,0,46,0,44,0,32,0,114,0,\n101,0,115,0,112,0,101,0,99,0,116,0,105,0,118,0,\n101,0,108,0,121,0,46,0,32,0,70,0,111,0,114,0,\n32,0,102,0,117,0,114,0,116,0,104,0,101,0,114,0,\n32,0,105,0,110,0,102,0,111,0,114,0,109,0,97,0,\n116,0,105,0,111,0,110,0,44,0,32,0,99,0,111,0,\n110,0,116,0,97,0,99,0,116,0,58,0,32,0,102,0,\n111,0,110,0,116,0,115,0,32,0,97,0,116,0,32,0,\n103,0,110,0,111,0,109,0,101,0,32,0,100,0,111,0,\n116,0,32,0,111,0,114,0,103,0,46,0,104,0,116,0,\n116,0,112,0,58,0,47,0,47,0,119,0,119,0,119,0,\n46,0,98,0,105,0,116,0,115,0,116,0,114,0,101,0,\n97,0,109,0,46,0,99,0,111,0,109,0,1,53,0,184,\n0,203,0,203,0,193,0,170,0,156,1,166,0,184,0,102,\n0,0,0,113,0,203,0,160,2,178,0,133,0,117,0,184,\n0,195,1,203,1,137,2,45,0,203,0,166,0,240,0,211,\n0,170,0,135,0,203,3,170,4,0,1,74,0,51,0,203,\n0,0,0,217,5,2,0,244,1,84,0,180,0,156,1,57,\n1,20,1,57,7,6,4,0,4,78,4,180,4,82,4,184,\n4,231,4,205,0,55,4,115,4,205,4,96,4,115,1,51,\n3,162,5,86,5,166,5,86,5,57,3,197,2,18,0,201,\n0,31,0,184,1,223,0,115,0,186,3,233,3,51,3,188,\n4,68,4,14,0,223,3,205,3,170,0,229,3,170,4,4,\n0,0,0,203,0,143,0,164,0,123,0,184,0,20,1,111,\n0,127,2,123,2,82,0,143,0,199,5,205,0,154,0,154,\n0,111,0,203,0,205,1,158,1,211,0,240,0,186,1,131,\n0,213,0,152,3,4,2,72,0,158,1,213,0,193,0,203,\n0,246,0,131,3,84,2,127,0,0,3,51,2,102,0,211,\n0,199,0,164,0,205,0,143,0,154,0,115,4,0,5,213,\n1,10,0,254,2,43,0,164,0,180,0,156,0,0,0,98,\n0,156,0,0,0,29,3,45,5,213,5,213,5,213,5,240,\n0,127,0,123,0,84,0,164,6,184,6,20,7,35,1,211,\n0,184,0,203,0,166,1,195,1,236,6,147,0,160,0,211,\n3,92,3,113,3,219,1,133,4,35,4,168,4,72,0,143,\n1,57,1,20,1,57,3,96,0,143,5,213,1,154,6,20,\n7,35,6,102,1,121,4,96,4,96,4,96,4,123,0,156,\n0,0,2,119,4,96,1,170,0,233,4,96,7,98,0,123,\n0,197,0,127,2,123,0,0,0,180,2,82,5,205,0,102,\n0,188,0,102,0,119,6,16,0,205,1,59,1,133,3,137,\n0,143,0,123,0,0,0,29,0,205,7,74,4,47,0,156,\n0,156,0,0,7,125,0,111,0,0,0,111,3,53,0,106,\n0,111,0,123,0,174,0,178,0,45,3,150,0,143,2,123,\n0,246,0,131,3,84,6,55,5,246,0,143,0,156,4,225,\n2,102,0,143,1,141,2,246,0,205,3,68,0,41,0,102,\n4,238,0,115,0,0,20,0,184,2,128,64,255,251,254,3,\n250,20,3,249,37,3,248,50,3,247,150,3,246,14,3,245,\n254,3,244,254,3,243,37,3,242,14,3,241,150,3,240,37,\n3,239,138,65,5,239,254,3,238,150,3,237,150,3,236,250,\n3,235,250,3,234,254,3,233,58,3,232,66,3,231,254,3,\n230,50,3,229,228,83,5,229,150,3,228,138,65,5,228,83,\n3,227,226,47,5,227,250,3,226,47,3,225,254,3,224,254,\n3,223,50,3,222,20,3,221,150,3,220,254,3,219,18,3,\n218,125,3,217,187,3,216,254,3,214,138,65,5,214,125,3,\n213,212,71,5,213,125,3,212,71,3,211,210,27,5,211,254,\n3,210,27,3,209,254,3,208,254,3,207,254,3,206,254,3,\n205,150,3,204,203,30,5,204,254,3,203,30,3,202,50,3,\n201,254,3,198,133,17,5,198,28,3,197,22,3,196,254,3,\n195,254,3,194,254,3,193,254,3,192,254,3,191,254,3,190,\n254,3,189,254,3,188,254,3,187,254,3,186,17,3,185,134,\n37,5,185,254,3,184,183,187,5,184,254,3,183,182,93,5,\n183,187,3,183,128,4,182,181,37,5,182,93,64,255,3,182,\n64,4,181,37,3,180,254,3,179,150,3,178,254,3,177,254,\n3,176,254,3,175,254,3,174,100,3,173,14,3,172,171,37,\n5,172,100,3,171,170,18,5,171,37,3,170,18,3,169,138,\n65,5,169,250,3,168,254,3,167,254,3,166,254,3,165,18,\n3,164,254,3,163,162,14,5,163,50,3,162,14,3,161,100,\n3,160,138,65,5,160,150,3,159,254,3,158,157,12,5,158,\n254,3,157,12,3,156,155,25,5,156,100,3,155,154,16,5,\n155,25,3,154,16,3,153,10,3,152,254,3,151,150,13,5,\n151,254,3,150,13,3,149,138,65,5,149,150,3,148,147,14,\n5,148,40,3,147,14,3,146,250,3,145,144,187,5,145,254,\n3,144,143,93,5,144,187,3,144,128,4,143,142,37,5,143,\n93,3,143,64,4,142,37,3,141,254,3,140,139,46,5,140,\n254,3,139,46,3,138,134,37,5,138,65,3,137,136,11,5,\n137,20,3,136,11,3,135,134,37,5,135,100,3,134,133,17,\n5,134,37,3,133,17,3,132,254,3,131,130,17,5,131,254,\n3,130,17,3,129,254,3,128,254,3,127,254,3,64,255,126,\n125,125,5,126,254,3,125,125,3,124,100,3,123,84,21,5,\n123,37,3,122,254,3,121,254,3,120,14,3,119,12,3,118,\n10,3,117,254,3,116,250,3,115,250,3,114,250,3,113,250,\n3,112,254,3,111,254,3,110,254,3,108,33,3,107,254,3,\n106,17,66,5,106,83,3,105,254,3,104,125,3,103,17,66,\n5,102,254,3,101,254,3,100,254,3,99,254,3,98,254,3,\n97,58,3,96,250,3,94,12,3,93,254,3,91,254,3,90,\n254,3,89,88,10,5,89,250,3,88,10,3,87,22,25,5,\n87,50,3,86,254,3,85,84,21,5,85,66,3,84,21,3,\n83,1,16,5,83,24,3,82,20,3,81,74,19,5,81,254,\n3,80,11,3,79,254,3,78,77,16,5,78,254,3,77,16,\n3,76,254,3,75,74,19,5,75,254,3,74,73,16,5,74,\n19,3,73,29,13,5,73,16,3,72,13,3,71,254,3,70,\n150,3,69,150,3,68,254,3,67,2,45,5,67,250,3,66,\n187,3,65,75,3,64,254,3,63,254,3,62,61,18,5,62,\n20,3,61,60,15,5,61,18,3,60,59,13,5,60,64,255,\n15,3,59,13,3,58,254,3,57,254,3,56,55,20,5,56,\n250,3,55,54,16,5,55,20,3,54,53,11,5,54,16,3,\n53,11,3,52,30,3,51,13,3,50,49,11,5,50,254,3,\n49,11,3,48,47,11,5,48,13,3,47,11,3,46,45,9,\n5,46,16,3,45,9,3,44,50,3,43,42,37,5,43,100,\n3,42,41,18,5,42,37,3,41,18,3,40,39,37,5,40,\n65,3,39,37,3,38,37,11,5,38,15,3,37,11,3,36,\n254,3,35,254,3,34,15,3,33,1,16,5,33,18,3,32,\n100,3,31,250,3,30,29,13,5,30,100,3,29,13,3,28,\n17,66,5,28,254,3,27,250,3,26,66,3,25,17,66,5,\n25,254,3,24,100,3,23,22,25,5,23,254,3,22,1,16,\n5,22,25,3,21,254,3,20,254,3,19,254,3,18,17,66,\n5,18,254,3,17,2,45,5,17,66,3,16,125,3,15,100,\n3,14,254,3,13,12,22,5,13,254,3,12,1,16,5,12,\n22,3,11,254,3,10,16,3,9,254,3,8,2,45,5,8,\n254,3,7,20,3,6,100,3,4,1,16,5,4,254,3,64,\n21,3,2,45,5,3,254,3,2,1,16,5,2,45,3,1,\n16,3,0,254,3,1,184,1,100,133,141,1,43,43,43,43,\n43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,\n43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,\n43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,\n43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,\n43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,\n43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,\n43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,\n43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,\n43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,\n43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,\n43,0,43,43,43,43,43,43,43,43,43,43,43,43,43,43,\n43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,\n43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,\n43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,\n43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,\n43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,\n43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,\n43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,\n43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,\n43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,29,\n182,6,5,4,3,2,1,0,44,32,16,176,2,37,73,100,\n176,64,81,88,32,200,89,33,45,44,176,2,37,73,100,176,\n64,81,88,32,200,89,33,45,44,32,16,7,32,176,0,80,\n176,13,121,32,184,255,255,80,88,4,27,5,89,176,5,28,\n176,3,37,8,176,4,37,35,225,32,176,0,80,176,13,121,\n32,184,255,255,80,88,4,27,5,89,176,5,28,176,3,37,\n8,225,45,44,75,80,88,32,176,253,69,68,89,33,45,44,\n176,2,37,69,96,68,45,44,75,83,88,176,2,37,176,2,\n37,69,68,89,33,33,45,44,69,68,45,0,0,2,0,102,\n254,150,4,102,5,164,0,3,0,7,0,26,64,12,4,251,\n0,6,251,1,8,5,127,2,4,0,47,196,212,236,49,0,\n16,212,236,212,236,48,19,17,33,17,37,33,17,33,102,4,\n0,252,115,3,27,252,229,254,150,7,14,248,242,114,6,41,\n0,2,1,53,0,0,2,0,5,213,0,3,0,9,0,64,\n64,15,7,0,131,4,129,2,8,7,5,1,3,4,0,0,\n10,16,252,60,236,50,57,57,49,0,47,228,252,204,48,1,\n75,176,11,84,88,189,0,10,0,64,0,1,0,10,0,10,\n255,192,56,17,55,56,89,182,0,11,32,11,80,11,3,93,\n37,51,21,35,17,51,17,3,35,3,1,53,203,203,203,20,\n162,21,254,254,5,213,253,113,254,155,1,101,0,2,0,197,\n3,170,2,233,5,213,0,3,0,7,0,77,64,15,5,1,\n132,4,0,129,8,4,5,6,0,5,2,4,8,16,252,252,\n220,236,49,0,16,244,60,236,50,48,1,75,176,18,84,75,\n176,19,84,91,88,189,0,8,0,64,0,1,0,8,0,8,\n255,192,56,17,55,56,89,64,15,48,9,64,9,80,9,96,\n9,112,9,160,9,191,9,7,93,1,17,35,17,33,17,35,\n17,1,111,170,2,36,170,5,213,253,213,2,43,253,213,2,\n43,0,0,2,0,158,0,0,6,23,5,190,0,3,0,31,\n0,96,64,49,27,11,0,135,7,4,29,9,5,25,13,2,\n135,23,19,15,21,17,31,30,28,27,26,23,22,21,20,19,\n18,17,16,14,13,12,9,8,7,6,5,4,3,2,1,0,\n26,10,24,6,32,16,252,204,23,57,49,0,47,60,212,60,\n60,252,60,60,212,60,60,196,50,236,50,50,48,64,17,11,\n1,11,2,11,12,11,13,20,4,26,17,26,18,20,31,8,\n1,93,1,33,3,33,11,1,33,19,51,3,33,21,33,3,\n33,21,33,3,35,19,33,3,35,19,33,53,33,19,33,53,\n33,19,4,23,254,221,84,1,37,68,104,1,36,105,160,103,\n1,56,254,161,82,1,62,254,155,104,160,103,254,219,103,161,\n104,254,197,1,96,84,254,190,1,105,102,3,133,254,178,3,\n135,254,97,1,159,254,97,154,254,178,153,254,98,1,158,254,\n98,1,158,153,1,78,154,1,159,0,0,3,0,170,254,211,\n4,109,6,20,0,33,0,40,0,47,0,213,64,85,34,2,\n10,11,10,39,1,38,40,2,11,11,10,29,1,30,28,2,\n47,41,47,27,2,41,41,47,66,19,17,16,34,10,27,41,\n4,23,6,9,42,33,5,2,23,134,22,6,134,5,17,35,\n26,138,22,137,16,0,42,138,5,137,2,45,8,22,10,30,\n7,41,26,18,3,0,9,34,16,9,3,1,7,38,8,13,\n5,6,48,16,252,60,236,244,23,60,252,23,60,244,228,236,\n49,0,47,228,236,196,212,228,236,50,196,16,238,16,238,17,\n18,57,17,57,17,18,23,57,17,18,57,48,75,83,88,7,\n16,4,237,7,16,14,237,17,23,57,7,16,14,237,17,23,\n57,7,16,4,237,89,34,1,75,176,9,84,88,189,0,48,\n0,64,0,1,0,48,0,48,255,192,56,17,55,56,89,1,\n75,176,12,84,75,176,16,84,91,75,176,15,84,91,88,189,\n0,48,255,192,0,1,0,48,0,48,0,64,56,17,55,56,\n89,1,35,3,46,1,39,53,30,1,23,17,46,1,53,52,\n54,55,53,51,21,30,1,23,21,46,1,39,17,30,1,21,\n20,6,7,3,17,14,1,21,20,22,23,17,62,1,53,52,\n38,2,180,100,1,105,210,106,102,209,111,221,201,218,204,100,\n93,174,83,83,175,92,227,214,227,214,100,116,122,113,225,127,\n129,123,254,211,1,45,2,45,45,180,64,65,1,1,200,36,\n172,150,163,188,14,235,232,4,31,27,175,42,46,4,254,85,\n35,180,156,169,195,15,3,0,1,154,13,106,88,86,96,213,\n254,79,17,110,90,88,104,0,0,5,0,113,255,227,7,41,\n5,240,0,11,0,23,0,35,0,39,0,51,0,149,64,54,\n36,15,37,38,37,38,15,39,36,39,66,0,146,12,30,146,\n46,141,24,146,36,6,146,12,141,38,18,140,40,36,145,52,\n39,33,27,37,9,3,13,21,14,9,13,15,33,13,43,14,\n27,13,15,49,11,52,16,252,196,236,244,236,16,238,246,238,\n17,57,17,18,57,49,0,16,228,50,244,60,228,236,16,238,\n246,238,16,238,48,75,83,88,7,16,5,237,7,16,5,237,\n89,34,1,75,176,9,84,75,176,11,84,91,75,176,12,84,\n91,75,176,20,84,91,75,176,14,84,91,75,176,13,84,91,\n88,189,0,52,0,64,0,1,0,52,0,52,255,192,56,17,\n55,56,89,1,34,6,21,20,22,51,50,54,53,52,38,39,\n50,22,21,20,6,35,34,38,53,52,54,1,34,6,21,20,\n22,51,50,54,53,52,38,37,51,1,35,19,50,22,21,20,\n6,35,34,38,53,52,54,5,209,87,99,99,87,85,99,99,\n85,158,186,187,157,160,186,187,252,151,86,99,98,87,87,99,\n100,3,49,160,252,90,160,31,158,188,187,159,159,185,186,2,\n145,148,132,130,149,149,130,131,149,127,220,187,187,219,219,187,\n188,219,2,97,149,130,132,148,148,132,129,150,127,249,243,6,\n13,219,187,189,218,219,188,186,220,0,0,2,0,129,255,227,\n5,254,5,240,0,9,0,48,1,205,64,150,13,1,14,12,\n134,17,18,17,11,134,10,11,18,18,17,9,134,0,9,21,\n22,21,7,1,6,8,134,22,22,21,2,1,3,1,134,29,\n30,29,0,134,9,0,30,30,29,32,31,2,33,30,17,10,\n19,10,23,22,21,3,24,20,17,19,10,7,8,2,6,9,\n17,19,19,10,2,1,2,3,0,17,10,19,10,23,22,2,\n24,21,17,19,10,20,17,19,19,10,66,18,11,9,3,6,\n0,10,30,3,40,21,14,6,40,39,6,149,24,43,149,39,\n148,36,145,24,140,14,19,10,46,11,14,9,0,46,18,21,\n39,14,30,3,46,18,39,33,14,17,15,19,33,3,18,27,\n16,49,16,252,236,196,212,212,236,16,198,238,17,57,17,18,\n57,57,17,57,57,17,57,17,57,49,0,47,198,228,246,230,\n238,16,238,16,198,17,18,57,17,23,57,17,23,57,48,75,\n83,88,7,16,5,237,7,5,237,17,23,57,7,16,5,237,\n17,23,57,7,16,5,237,17,23,57,7,5,237,17,23,57,\n7,16,5,237,17,23,57,7,16,8,237,7,16,14,237,17,\n23,57,7,16,14,237,17,23,57,7,16,8,237,7,16,8,\n237,7,16,14,237,17,23,57,89,34,178,15,50,1,1,93,\n64,178,7,11,5,34,9,41,28,0,28,1,31,2,23,11,\n42,0,42,1,38,18,58,0,52,18,68,11,94,0,89,1,\n90,10,85,18,90,26,90,31,89,48,103,30,123,0,155,0,\n154,1,153,2,151,8,149,11,147,21,149,22,149,34,153,45,\n31,9,11,9,12,8,17,12,39,12,40,24,2,27,9,25,\n11,25,12,25,17,28,20,28,21,22,29,31,50,39,0,39,\n1,41,9,35,18,42,19,42,20,40,21,47,50,59,9,52,\n18,57,19,63,50,74,9,76,20,75,21,70,25,79,50,86,\n1,90,9,89,12,85,18,89,19,92,31,95,50,106,12,105,\n17,96,50,117,1,121,12,122,17,147,0,147,1,151,2,149,\n5,156,7,156,8,159,8,154,9,155,11,154,12,144,50,160,\n50,176,50,57,93,0,93,1,14,1,21,20,22,51,50,54,\n55,9,1,62,1,55,51,6,2,7,1,35,39,14,1,35,\n34,0,53,52,54,55,46,1,53,52,54,51,50,22,23,21,\n46,1,35,34,6,21,20,22,1,242,91,85,212,160,95,166,\n73,254,123,1,252,59,66,6,186,12,104,93,1,23,252,143,\n104,228,131,241,254,206,134,134,48,50,222,184,83,165,85,87,\n158,68,105,131,59,3,35,81,161,88,146,194,63,64,2,143,\n253,248,89,203,114,132,254,254,126,254,227,147,89,87,1,19,\n215,128,225,99,63,125,60,162,197,36,36,182,47,49,111,88,\n51,103,0,1,0,197,3,170,1,111,5,213,0,3,0,66,\n64,10,1,132,0,129,4,0,5,2,4,4,16,252,236,49,\n0,16,244,236,48,1,75,176,18,84,75,176,19,84,91,88,\n189,0,4,0,64,0,1,0,4,0,4,255,192,56,17,55,\n56,89,64,13,64,5,80,5,96,5,112,5,144,5,160,5,\n6,93,1,17,35,17,1,111,170,5,213,253,213,2,43,0,\n0,1,0,176,254,242,2,123,6,18,0,13,0,79,64,15,\n6,152,0,151,14,13,7,0,3,18,6,0,19,10,14,16,\n220,228,50,236,17,57,57,49,0,16,252,236,48,1,75,176,\n19,84,88,189,0,14,0,64,0,1,0,14,0,14,255,192,\n56,17,55,56,89,1,75,176,15,84,88,189,0,14,255,192,\n0,1,0,14,0,14,0,64,56,17,55,56,89,1,6,2,\n21,20,18,23,35,38,2,53,52,18,55,2,123,134,130,131,\n133,160,150,149,148,151,6,18,230,254,62,231,231,254,59,229,\n235,1,198,224,223,1,196,236,0,1,0,164,254,242,2,111,\n6,18,0,13,0,31,64,15,7,152,0,151,14,7,1,0,\n11,18,4,19,8,0,14,16,220,60,244,236,17,57,57,49,\n0,16,252,236,48,19,51,22,18,21,20,2,7,35,54,18,\n53,52,2,164,160,150,149,149,150,160,133,131,131,6,18,236,\n254,60,223,224,254,58,235,229,1,197,231,231,1,194,0,1,\n0,61,2,74,3,195,5,240,0,17,0,78,64,44,16,13,\n11,0,4,12,9,7,4,2,4,8,3,153,5,17,12,153,\n10,1,14,145,18,8,12,10,3,9,6,17,3,1,3,2,\n0,20,15,4,11,9,20,13,6,18,16,212,60,228,50,220,\n60,228,50,23,57,17,18,23,57,49,0,16,244,212,60,236,\n50,196,236,50,23,57,18,23,57,48,1,5,5,7,37,17,\n35,17,5,39,37,37,55,5,17,51,17,37,3,195,254,153,\n1,103,58,254,176,114,254,176,58,1,103,254,153,58,1,80,\n114,1,80,4,223,194,195,98,203,254,135,1,121,203,98,195,\n194,99,203,1,121,254,135,203,0,1,0,217,0,0,5,219,\n5,4,0,11,0,35,64,17,0,9,1,156,7,3,5,2,\n21,4,0,23,10,6,21,8,12,16,220,252,60,252,60,236,\n49,0,47,212,60,252,60,196,48,1,17,33,21,33,17,35,\n17,33,53,33,17,3,174,2,45,253,211,168,253,211,2,45,\n5,4,253,211,170,253,211,2,45,170,2,45,0,1,0,158,\n255,18,1,195,0,254,0,5,0,25,64,12,3,158,0,131,\n6,3,4,1,25,0,24,6,16,252,236,212,204,49,0,16,\n252,236,48,55,51,21,3,35,19,240,211,164,129,82,254,172,\n254,192,1,64,0,1,0,100,1,223,2,127,2,131,0,3,\n0,17,182,0,156,2,4,1,0,4,16,220,204,49,0,16,\n212,236,48,19,33,21,33,100,2,27,253,229,2,131,164,0,\n0,1,0,219,0,0,1,174,0,254,0,3,0,17,183,0,\n131,2,1,25,0,24,4,16,252,236,49,0,47,236,48,55,\n51,21,35,219,211,211,254,254,0,1,0,0,255,66,2,178,\n5,213,0,3,0,45,64,20,0,26,1,2,1,2,26,3,\n0,3,66,2,159,0,129,4,2,0,1,3,47,196,57,57,\n49,0,16,244,236,48,75,83,88,7,16,5,237,7,16,5,\n237,89,34,1,51,1,35,2,8,170,253,248,170,5,213,249,\n109,0,0,2,0,135,255,227,4,143,5,240,0,11,0,23,\n0,35,64,19,6,160,18,0,160,12,145,18,140,24,9,28,\n15,30,3,28,21,27,24,16,252,236,244,236,49,0,16,228,\n244,236,16,238,48,1,34,2,17,16,18,51,50,18,17,16,\n2,39,50,0,17,16,0,35,34,0,17,16,0,2,139,156,\n157,157,156,157,157,157,157,251,1,9,254,247,251,251,254,247,\n1,9,5,80,254,205,254,204,254,205,254,205,1,51,1,51,\n1,52,1,51,160,254,115,254,134,254,135,254,115,1,141,1,\n121,1,122,1,141,0,0,1,0,225,0,0,4,90,5,213,\n0,10,0,75,64,21,66,3,160,4,2,160,5,129,7,0,\n160,9,8,31,6,28,3,0,31,1,11,16,212,236,196,252,\n236,49,0,47,236,50,244,236,212,236,48,75,83,88,89,34,\n1,75,176,15,84,88,189,0,11,255,192,0,1,0,11,0,\n11,0,64,56,17,55,56,89,180,15,3,15,4,2,93,55,\n33,17,5,53,37,51,17,33,21,33,254,1,74,254,153,1,\n101,202,1,74,252,164,170,4,115,72,184,72,250,213,170,0,\n0,1,0,150,0,0,4,74,5,240,0,28,0,165,64,39,\n25,26,27,3,24,28,17,5,4,0,17,5,5,4,66,16,\n161,17,148,13,160,20,145,4,0,160,2,0,16,10,2,1,\n10,28,23,16,3,6,29,16,252,196,212,236,192,192,17,18,\n57,49,0,47,236,50,244,236,244,236,48,75,83,88,7,16,\n5,237,7,5,237,17,23,57,89,34,1,75,176,21,84,75,\n176,22,84,91,75,176,20,84,91,88,189,0,29,0,64,0,\n1,0,29,0,29,255,192,56,17,55,56,89,64,50,85,4,\n86,5,86,7,122,4,122,5,118,27,135,25,7,4,0,4,\n25,4,26,4,27,5,28,116,0,118,6,117,26,115,27,116,\n28,130,0,134,25,130,26,130,27,130,28,168,0,168,27,17,\n93,0,93,37,33,21,33,53,54,0,55,62,1,53,52,38,\n35,34,6,7,53,62,1,51,50,4,21,20,6,7,6,0,\n1,137,2,193,252,76,115,1,141,51,97,77,167,134,95,211,\n120,122,212,88,232,1,20,69,91,25,254,244,170,170,170,119,\n1,145,58,109,151,73,119,150,66,67,204,49,50,232,194,92,\n165,112,29,254,235,0,0,1,0,156,255,227,4,115,5,240,\n0,40,0,123,64,46,0,21,19,10,134,9,31,134,32,19,\n160,21,13,160,9,147,6,28,160,32,147,35,145,6,140,21,\n163,41,22,28,19,0,3,20,25,28,38,32,16,28,3,20,\n31,9,6,41,16,252,196,196,212,236,244,236,17,23,57,57,\n49,0,16,236,228,244,228,236,16,230,238,16,238,16,238,16,\n238,17,18,57,48,1,75,176,22,84,75,176,20,84,91,88,\n189,0,41,0,64,0,1,0,41,0,41,255,192,56,17,55,\n56,89,64,9,100,30,97,31,97,32,100,33,4,0,93,1,\n30,1,21,20,4,33,34,38,39,53,30,1,51,50,54,53,\n52,38,43,1,53,51,50,54,53,52,38,35,34,6,7,53,\n62,1,51,50,4,21,20,6,3,63,145,163,254,208,254,232,\n94,199,106,84,200,109,190,199,185,165,174,182,149,158,163,152,\n83,190,114,115,201,89,230,1,12,142,3,37,31,196,144,221,\n242,37,37,195,49,50,150,143,132,149,166,119,112,115,123,36,\n38,180,32,32,209,178,124,171,0,2,0,100,0,0,4,164,\n5,213,0,2,0,13,0,140,64,29,1,13,3,13,0,3,\n3,13,66,0,3,11,7,160,5,1,3,129,9,1,12,10,\n0,28,6,8,4,12,14,16,220,212,60,196,236,50,17,57,\n49,0,47,228,212,60,236,50,18,57,48,75,83,88,7,16,\n4,201,7,16,5,201,89,34,1,75,176,11,84,75,176,13,\n84,91,88,189,0,14,0,64,0,1,0,14,0,14,255,192,\n56,17,55,56,89,64,42,11,0,42,0,72,0,89,0,105,\n0,119,0,138,0,7,22,1,43,0,38,1,43,3,54,1,\n78,1,79,12,79,13,86,1,102,1,117,1,122,3,133,1,\n13,93,0,93,9,1,33,3,51,17,51,21,35,17,35,17,\n33,53,3,6,254,2,1,254,53,254,213,213,201,253,94,5,\n37,252,227,3,205,252,51,168,254,160,1,96,195,0,0,1,\n0,158,255,227,4,100,5,213,0,29,0,117,64,35,4,26,\n7,17,134,16,29,26,160,7,20,160,16,137,13,2,160,0,\n129,13,140,7,164,30,23,28,1,10,3,28,0,10,16,6,\n30,16,252,196,212,236,16,196,238,49,0,16,228,228,244,236,\n16,230,238,16,254,196,16,238,17,18,57,48,1,75,176,22,\n84,75,176,20,84,91,88,189,0,30,0,64,0,1,0,30,\n0,30,255,192,56,17,55,56,89,1,75,176,15,84,88,189,\n0,30,255,192,0,1,0,30,0,30,0,64,56,17,55,56,\n89,19,33,21,33,17,62,1,51,50,0,21,20,0,33,34,\n38,39,53,30,1,51,50,54,53,52,38,35,34,6,7,221,\n3,25,253,160,44,88,44,250,1,36,254,212,254,239,94,195,\n104,90,192,107,173,202,202,173,81,161,84,5,213,170,254,146,\n15,15,254,238,234,241,254,245,32,32,203,49,48,182,156,156,\n182,36,38,0,0,2,0,143,255,227,4,150,5,240,0,11,\n0,36,0,88,64,36,19,6,0,13,134,12,0,160,22,6,\n160,28,22,165,16,160,12,137,34,145,28,140,37,12,34,9,\n28,25,30,19,28,3,33,31,27,37,16,252,236,236,244,236,\n228,49,0,16,228,244,228,252,228,16,238,16,238,16,238,17,\n18,57,48,64,20,203,0,203,1,205,2,205,3,205,4,203,\n5,203,6,7,164,30,178,30,2,93,1,93,1,34,6,21,\n20,22,51,50,54,53,52,38,1,21,46,1,35,34,2,3,\n62,1,51,50,0,21,20,0,35,32,0,17,16,0,33,50,\n22,2,164,136,159,159,136,136,159,159,1,9,76,155,76,200,\n211,15,59,178,107,225,1,5,254,240,226,254,253,254,238,1,\n80,1,27,76,155,3,59,186,162,161,187,187,161,162,186,2,\n121,184,36,38,254,242,254,239,87,93,254,239,235,230,254,234,\n1,141,1,121,1,98,1,165,30,0,0,1,0,168,0,0,\n4,104,5,213,0,6,0,99,64,24,5,17,2,3,2,3,\n17,4,5,4,66,5,160,0,129,3,5,3,1,4,1,0,\n6,7,16,252,204,196,17,57,57,49,0,47,244,236,48,75,\n83,88,7,16,5,237,7,16,5,237,89,34,1,75,176,22,\n84,88,189,0,7,0,64,0,1,0,7,0,7,255,192,56,\n17,55,56,89,64,18,88,2,1,6,3,26,5,57,5,72,\n5,103,3,176,0,176,6,7,93,0,93,19,33,21,1,35,\n1,33,168,3,192,253,226,211,1,254,253,51,5,213,86,250,\n129,5,43,0,0,3,0,139,255,227,4,139,5,240,0,11,\n0,35,0,47,0,67,64,37,24,12,0,160,39,6,160,30,\n45,160,18,145,30,140,39,163,48,24,12,36,42,28,21,36,\n28,15,9,28,21,27,30,3,28,15,33,27,48,16,252,196,\n236,244,196,236,16,238,16,238,17,57,57,49,0,16,236,228,\n244,236,16,238,16,238,57,57,48,1,34,6,21,20,22,51,\n50,54,53,52,38,37,38,38,53,52,54,51,50,22,21,20,\n6,7,22,22,21,20,4,35,34,36,53,52,54,19,20,22,\n51,50,54,53,52,38,35,34,6,2,139,144,165,165,144,144,\n166,165,254,165,130,145,255,222,223,254,145,129,146,163,254,247,\n247,247,254,247,164,72,145,131,130,147,147,130,131,145,2,197,\n154,135,135,154,155,134,135,154,86,32,178,128,179,208,208,179,\n128,178,32,34,198,143,217,232,232,217,143,198,1,97,116,130,\n130,116,116,130,130,0,0,2,0,129,255,227,4,135,5,240,\n0,24,0,36,0,88,64,35,7,31,25,1,134,0,25,160,\n10,165,4,160,0,137,22,31,160,16,145,22,140,37,7,28,\n28,33,19,30,0,34,34,28,13,27,37,16,252,236,228,244,\n236,236,49,0,16,228,244,236,16,230,254,245,238,16,238,17,\n18,57,48,64,22,196,25,194,26,192,27,192,28,192,29,194,\n30,196,31,7,170,18,188,18,233,18,3,93,1,93,55,53,\n30,1,51,50,18,19,14,1,35,34,0,53,52,0,51,32,\n0,17,16,0,33,34,38,1,50,54,53,52,38,35,34,6,\n21,20,22,225,76,156,75,200,211,15,58,178,108,224,254,251,\n1,16,226,1,3,1,17,254,177,254,229,76,156,1,62,136,\n159,159,136,136,159,159,31,184,36,38,1,13,1,18,86,92,\n1,15,235,230,1,22,254,115,254,134,254,159,254,91,30,2,\n151,186,162,161,187,187,161,162,186,0,0,2,0,240,0,0,\n1,195,4,35,0,3,0,7,0,28,64,14,6,131,4,166,\n0,131,2,5,1,3,4,0,24,8,16,252,60,236,50,49,\n0,47,236,244,236,48,55,51,21,35,17,51,21,35,240,211,\n211,211,211,254,254,4,35,254,0,2,0,158,255,18,1,195,\n4,35,0,3,0,9,0,37,64,19,2,131,0,7,158,4,\n131,0,166,10,7,8,5,1,25,4,0,24,10,16,252,60,\n236,50,212,204,49,0,16,228,252,236,16,238,48,19,51,21,\n35,17,51,21,3,35,19,240,211,211,211,164,129,82,4,35,\n254,253,217,172,254,192,1,64,0,1,0,217,0,94,5,219,\n4,166,0,6,0,77,64,42,2,156,3,4,3,1,156,0,\n1,4,4,3,1,156,2,1,5,6,5,0,156,6,5,66,\n5,4,2,1,0,5,3,168,6,167,7,1,2,0,36,4,\n35,7,16,252,236,50,57,49,0,16,244,236,23,57,48,75,\n83,88,7,4,237,7,16,8,237,7,16,8,237,7,16,4,\n237,89,34,9,2,21,1,53,1,5,219,251,248,4,8,250,\n254,5,2,3,240,254,145,254,147,182,1,209,166,1,209,0,\n0,2,0,217,1,96,5,219,3,162,0,3,0,7,0,28,\n64,13,0,156,2,6,156,4,8,5,1,4,0,35,8,16,\n252,60,196,50,49,0,16,212,236,212,236,48,19,33,21,33,\n21,33,21,33,217,5,2,250,254,5,2,250,254,3,162,168,\n240,170,0,1,0,217,0,94,5,219,4,166,0,6,0,79,\n64,43,6,156,0,6,3,4,3,5,156,4,4,3,0,156,\n1,2,1,6,156,5,6,2,2,1,66,6,5,3,2,0,\n5,4,168,1,167,7,6,2,36,4,0,35,7,16,252,60,\n236,57,49,0,16,244,236,23,57,48,75,83,88,7,16,8,\n237,7,16,4,237,7,16,4,237,7,16,8,237,89,34,19,\n53,1,21,1,53,1,217,5,2,250,254,4,6,3,240,182,\n254,47,166,254,47,182,1,109,0,2,0,147,0,0,3,176,\n5,240,0,3,0,36,0,112,64,43,36,30,9,6,4,10,\n29,19,4,0,20,134,19,136,16,149,23,145,0,131,2,29,\n26,13,9,5,4,10,30,1,13,28,26,4,28,5,1,3,\n0,38,26,19,37,16,220,196,252,236,212,236,16,238,17,57,\n57,17,18,57,17,18,57,49,0,47,238,246,254,244,238,16,\n205,17,57,57,23,57,48,1,75,176,12,84,88,189,0,37,\n0,64,0,1,0,37,0,37,255,192,56,17,55,56,89,182,\n121,9,122,10,122,32,3,93,37,51,21,35,19,35,53,52,\n54,63,1,62,1,53,52,38,35,34,6,7,53,62,1,51,\n50,22,21,20,6,15,1,14,1,7,14,1,21,1,135,203,\n203,197,191,56,90,90,57,51,131,108,79,179,97,94,193,103,\n184,223,72,90,88,47,39,8,6,6,254,254,1,145,154,101,\n130,86,89,53,94,49,89,110,70,67,188,57,56,194,159,76,\n137,86,86,47,53,25,21,60,52,0,0,2,0,135,254,156,\n7,113,5,162,0,11,0,76,0,149,64,50,24,12,3,9,\n169,25,21,27,3,169,76,15,52,51,15,172,48,169,55,21,\n172,36,169,55,67,77,51,52,30,26,0,40,18,6,24,12,\n40,26,43,30,40,73,18,43,42,40,73,44,61,77,16,220,\n236,252,236,16,254,253,254,60,198,16,238,17,18,57,57,49,\n0,16,212,196,252,236,16,254,237,212,198,16,197,238,50,16,\n196,238,17,57,57,48,0,75,176,9,84,75,176,12,84,91,\n75,176,16,84,91,75,176,19,84,91,75,176,20,84,91,88,\n189,0,77,255,192,0,1,0,77,0,77,0,64,56,17,55,\n56,89,64,9,15,78,31,78,47,78,63,78,4,1,93,1,\n20,22,51,50,54,53,52,38,35,34,6,1,14,1,35,34,\n38,53,52,54,51,50,22,23,53,51,17,62,1,53,52,38,\n39,38,36,35,34,6,7,6,2,21,20,18,23,22,4,51,\n50,54,55,23,6,4,35,34,36,39,38,2,53,52,18,55,\n54,36,51,50,4,23,30,1,21,16,0,5,2,250,142,124,\n123,141,144,122,121,143,2,33,60,155,103,172,215,216,171,103,\n156,59,143,146,165,63,64,104,254,213,176,123,226,96,157,177,\n115,109,105,1,20,157,129,249,104,90,125,254,217,152,185,254,\n184,128,128,134,136,126,129,1,82,189,212,1,107,123,75,79,\n254,194,254,232,2,25,143,163,164,142,140,165,164,254,72,77,\n73,249,200,200,250,75,76,131,253,32,22,223,177,107,188,80,\n131,139,65,64,102,254,181,193,159,254,234,106,104,109,87,81,\n111,97,103,131,125,125,1,73,189,182,1,74,125,127,135,174,\n160,98,230,123,254,249,254,208,6,0,0,2,0,16,0,0,\n5,104,5,213,0,2,0,10,0,186,64,65,0,17,1,0,\n4,5,4,2,17,5,5,4,1,17,10,3,10,0,17,2,\n0,3,3,10,7,17,5,4,6,17,5,5,4,9,17,3,\n10,8,17,10,3,10,66,0,3,7,149,1,3,129,9,5,\n9,8,7,6,4,3,2,1,0,9,5,10,11,16,212,196,\n23,57,49,0,47,60,228,212,236,18,57,48,75,83,88,7,\n16,5,237,7,5,237,7,16,5,237,7,5,237,7,16,8,\n237,7,16,5,237,7,16,5,237,7,16,8,237,89,34,178,\n32,12,1,1,93,64,58,15,0,88,0,118,0,112,0,140,\n0,5,7,1,8,2,6,3,9,4,22,1,25,2,86,1,\n88,2,80,12,103,1,104,2,120,1,118,2,124,3,114,4,\n119,7,120,8,135,1,136,2,128,12,152,2,153,3,150,4,\n23,93,0,93,9,1,33,1,51,1,35,3,33,3,35,2,\n188,254,238,2,37,254,123,229,2,57,210,136,253,95,136,213,\n5,14,253,25,3,174,250,43,1,127,254,129,0,3,0,201,\n0,0,4,236,5,213,0,8,0,17,0,32,0,67,64,35,\n25,0,149,10,9,149,18,129,1,149,10,173,31,17,11,8,\n2,19,25,31,5,0,14,28,22,5,25,28,46,9,0,28,\n18,4,33,16,252,236,50,252,236,212,236,17,23,57,57,57,\n49,0,47,236,236,244,236,16,238,57,48,178,15,34,1,1,\n93,1,17,33,50,54,53,52,38,35,1,17,33,50,54,53,\n52,38,35,37,33,50,22,21,20,6,7,30,1,21,20,4,\n35,33,1,147,1,68,163,157,157,163,254,188,1,43,148,145,\n145,148,254,11,2,4,231,250,128,124,149,165,254,240,251,253,\n232,2,201,253,221,135,139,140,133,2,102,254,62,111,114,113,\n112,166,192,177,137,162,20,32,203,152,200,218,0,1,0,115,\n255,227,5,39,5,240,0,25,0,54,64,26,13,161,14,174,\n10,149,17,1,161,0,174,4,149,23,145,17,140,26,7,25,\n13,0,48,20,16,26,16,252,236,50,236,49,0,16,228,244,\n236,244,236,16,238,246,238,48,180,15,27,31,27,2,1,93,\n1,21,46,1,35,32,0,17,16,0,33,50,54,55,21,14,\n1,35,32,0,17,16,0,33,50,22,5,39,102,231,130,255,\n0,254,240,1,16,1,0,130,231,102,106,237,132,254,173,254,\n122,1,134,1,83,134,237,5,98,213,95,94,254,199,254,216,\n254,217,254,199,94,95,211,72,72,1,159,1,103,1,104,1,\n159,71,0,2,0,201,0,0,5,176,5,213,0,8,0,17,\n0,46,64,21,0,149,9,129,1,149,16,8,2,16,10,0,\n5,25,13,50,0,28,9,4,18,16,252,236,244,236,17,57,\n57,57,57,49,0,47,236,244,236,48,178,96,19,1,1,93,\n1,17,51,32,0,17,16,0,33,37,33,32,0,17,16,0,\n41,1,1,147,244,1,53,1,31,254,225,254,203,254,66,1,\n159,1,178,1,150,254,104,254,80,254,97,5,47,251,119,1,\n24,1,46,1,44,1,23,166,254,151,254,128,254,126,254,150,\n0,1,0,201,0,0,4,139,5,213,0,11,0,46,64,21,\n6,149,4,2,149,0,129,8,149,4,173,10,5,1,9,7,\n3,28,0,4,12,16,252,236,50,212,196,196,49,0,47,236,\n236,244,236,16,238,48,178,31,13,1,1,93,19,33,21,33,\n17,33,21,33,17,33,21,33,201,3,176,253,26,2,199,253,\n57,2,248,252,62,5,213,170,254,70,170,253,227,170,0,1,\n0,201,0,0,4,35,5,213,0,9,0,41,64,18,6,149,\n4,2,149,0,129,4,173,8,5,1,7,3,28,0,4,10,\n16,252,236,50,212,196,49,0,47,236,244,236,16,238,48,178,\n15,11,1,1,93,19,33,21,33,17,33,21,33,17,35,201,\n3,90,253,112,2,80,253,176,202,5,213,170,254,72,170,253,\n55,0,0,1,0,115,255,227,5,139,5,240,0,29,0,57,\n64,32,0,5,27,1,149,3,27,149,8,18,161,17,174,21,\n149,14,145,8,140,30,2,0,28,17,52,4,51,24,25,11,\n16,30,16,252,236,252,228,252,196,49,0,16,228,244,236,244,\n236,16,254,212,238,17,57,57,48,37,17,33,53,33,17,6,\n4,35,32,0,17,16,0,33,50,4,23,21,38,38,35,32,\n0,17,16,0,33,50,54,4,195,254,182,2,18,117,254,230,\n160,254,162,254,117,1,139,1,94,146,1,7,111,112,252,139,\n254,238,254,237,1,19,1,18,107,168,213,1,145,166,253,127,\n83,85,1,153,1,109,1,110,1,153,72,70,215,95,96,254,\n206,254,209,254,210,254,206,37,0,1,0,201,0,0,5,59,\n5,213,0,11,0,44,64,20,8,149,2,173,4,0,129,10,\n6,7,3,28,5,56,9,1,28,0,4,12,16,252,236,50,\n252,236,50,49,0,47,60,228,50,252,236,48,178,80,13,1,\n1,93,19,51,17,33,17,51,17,35,17,33,17,35,201,202,\n2,222,202,202,253,34,202,5,213,253,156,2,100,250,43,2,\n199,253,57,0,0,1,0,201,0,0,1,147,5,213,0,3,\n0,57,183,0,175,2,1,28,0,4,4,16,252,236,49,0,\n47,236,48,1,75,176,16,84,88,189,0,4,255,192,0,1,\n0,4,0,4,0,64,56,17,55,56,89,64,13,48,5,64,\n5,80,5,96,5,143,5,159,5,6,93,19,51,17,35,201,\n202,202,5,213,250,43,0,1,255,150,254,102,1,147,5,213,\n0,11,0,77,64,19,11,2,0,7,149,5,176,0,129,12,\n5,8,6,57,1,28,0,4,12,16,252,236,228,57,57,49,\n0,16,228,252,236,17,57,57,48,1,75,176,16,84,88,189,\n0,12,255,192,0,1,0,12,0,12,0,64,56,17,55,56,\n89,64,13,48,13,64,13,80,13,96,13,143,13,159,13,6,\n93,19,51,17,16,6,43,1,53,51,50,54,53,201,202,205,\n227,77,63,134,110,5,213,250,147,254,242,244,170,150,194,0,\n0,1,0,201,0,0,5,106,5,213,0,10,0,239,64,40,\n8,17,5,6,5,7,17,6,6,5,3,17,4,5,4,2,\n17,5,5,4,66,8,5,2,3,3,0,175,9,6,5,1,\n4,6,8,1,28,0,4,11,16,252,236,50,212,196,17,57,\n49,0,47,60,236,50,23,57,48,75,83,88,7,16,4,237,\n7,16,5,237,7,16,5,237,7,16,4,237,89,34,178,8,\n3,1,1,93,64,146,20,2,1,4,2,9,8,22,2,40,\n5,40,8,55,2,54,5,52,8,71,2,70,5,67,8,85,\n2,103,2,118,2,119,5,131,2,136,5,143,8,148,2,155,\n8,231,2,21,6,3,9,5,9,6,27,3,25,7,5,10,\n3,10,7,24,3,40,5,43,6,42,7,54,4,54,5,54,\n6,53,7,48,12,65,3,64,4,69,5,64,6,64,7,64,\n12,98,3,96,4,104,5,103,7,119,5,112,12,139,3,139,\n5,142,6,143,7,143,12,154,3,157,6,157,7,182,3,181,\n7,197,3,197,7,215,3,214,7,232,3,233,4,232,5,234,\n6,247,3,248,5,249,6,44,93,113,0,93,113,19,51,17,\n1,33,9,1,33,1,17,35,201,202,2,158,1,4,253,27,\n3,26,254,246,253,51,202,5,213,253,137,2,119,253,72,252,\n227,2,207,253,49,0,0,1,0,201,0,0,4,106,5,213,\n0,5,0,37,64,12,2,149,0,129,4,1,28,3,58,0,\n4,6,16,252,236,236,49,0,47,228,236,48,64,9,48,7,\n80,7,128,3,128,4,4,1,93,19,51,17,33,21,33,201,\n202,2,215,252,95,5,213,250,213,170,0,1,0,201,0,0,\n6,31,5,213,0,12,0,191,64,52,3,17,7,8,7,2,\n17,1,2,8,8,7,2,17,3,2,9,10,9,1,17,10,\n10,9,66,10,7,2,3,8,3,0,175,8,11,5,9,8,\n3,2,1,5,10,6,28,4,62,10,28,0,4,13,16,252,\n236,252,236,17,23,57,49,0,47,60,196,236,50,17,23,57,\n48,75,83,88,7,16,5,237,7,16,8,237,7,16,8,237,\n7,16,5,237,89,34,178,112,14,1,1,93,64,86,3,7,\n15,8,15,9,2,10,21,2,20,7,19,10,38,2,38,7,\n32,7,38,10,32,10,52,7,53,10,105,2,124,2,123,7,\n121,10,128,2,130,7,130,10,144,2,22,4,1,11,3,19,\n1,27,3,35,1,44,3,39,8,40,9,52,1,60,3,86,\n8,89,9,101,8,106,9,118,8,121,9,129,1,141,3,149,\n1,155,3,20,93,0,93,19,33,9,1,33,17,35,17,1,\n35,1,17,35,201,1,45,1,125,1,127,1,45,197,254,127,\n203,254,127,196,5,213,252,8,3,248,250,43,5,31,252,0,\n4,0,250,225,0,1,0,201,0,0,5,51,5,213,0,9,\n0,121,64,30,7,17,1,2,1,2,17,6,7,6,66,7,\n2,3,0,175,8,5,6,1,7,2,28,4,54,7,28,0,\n4,10,16,252,236,252,236,17,57,57,49,0,47,60,236,50,\n57,57,48,75,83,88,7,16,4,237,7,16,4,237,89,34,\n178,31,11,1,1,93,64,48,54,2,56,7,72,2,71,7,\n105,2,102,7,128,2,7,6,1,9,6,21,1,26,6,70,\n1,73,6,87,1,88,6,101,1,105,6,121,6,133,1,138,\n6,149,1,154,6,159,11,16,93,0,93,19,33,1,17,51,\n17,33,1,17,35,201,1,16,2,150,196,254,240,253,106,196,\n5,213,251,31,4,225,250,43,4,225,251,31,0,2,0,115,\n255,227,5,217,5,240,0,11,0,23,0,35,64,19,6,149,\n18,0,149,12,145,18,140,24,9,25,15,51,3,25,21,16,\n24,16,252,236,252,236,49,0,16,228,244,236,16,238,48,1,\n34,0,17,16,0,51,50,0,17,16,0,39,32,0,17,16,\n0,33,32,0,17,16,0,3,39,220,254,253,1,3,220,220,\n1,1,254,255,220,1,58,1,120,254,136,254,198,254,197,254,\n135,1,121,5,76,254,184,254,229,254,230,254,184,1,72,1,\n26,1,27,1,72,164,254,91,254,158,254,159,254,91,1,164,\n1,98,1,98,1,165,0,2,0,201,0,0,4,141,5,213,\n0,8,0,19,0,58,64,24,1,149,16,0,149,9,129,18,\n16,10,8,2,4,0,5,25,13,63,17,0,28,9,4,20,\n16,252,236,50,252,236,17,23,57,49,0,47,244,236,212,236,\n48,64,11,15,21,31,21,63,21,95,21,175,21,5,1,93,\n1,17,51,50,54,53,52,38,35,37,33,50,4,21,20,4,\n43,1,17,35,1,147,254,141,154,154,141,254,56,1,200,251,\n1,1,254,255,251,254,202,5,47,253,207,146,135,134,146,166,\n227,219,221,226,253,168,0,2,0,115,254,248,5,217,5,240,\n0,11,0,29,0,82,64,42,17,16,2,15,1,12,13,12,\n14,1,13,13,12,66,15,30,12,6,149,18,0,149,24,145,\n18,140,13,30,13,27,15,12,3,9,25,27,51,3,25,21,\n16,30,16,252,236,252,236,17,57,57,17,57,49,0,16,196,\n228,244,236,16,238,57,18,57,48,75,83,88,7,16,5,237,\n7,16,5,237,23,57,89,34,1,34,0,17,16,0,51,50,\n0,17,16,0,19,1,35,39,6,6,35,32,0,17,16,0,\n33,32,0,17,16,2,3,39,220,254,253,1,3,220,220,1,\n1,254,255,63,1,10,244,221,33,35,16,254,197,254,135,1,\n121,1,59,1,58,1,120,209,5,76,254,184,254,229,254,230,\n254,184,1,72,1,26,1,27,1,72,250,207,254,221,239,2,\n2,1,165,1,97,1,98,1,165,254,91,254,158,254,252,254,\n142,0,0,2,0,201,0,0,5,84,5,213,0,19,0,28,\n0,177,64,53,9,8,7,3,10,6,17,3,4,3,5,17,\n4,4,3,66,6,4,0,21,3,4,21,149,9,20,149,13,\n129,11,4,5,6,3,17,9,0,28,22,14,5,10,25,25,\n4,17,63,20,10,28,12,4,29,16,252,236,50,252,196,236,\n17,23,57,17,57,57,57,49,0,47,60,244,236,212,236,18,\n57,18,57,18,57,48,75,83,88,7,16,5,237,7,16,5,\n237,17,23,57,89,34,178,64,30,1,1,93,64,66,122,19,\n1,5,0,5,1,5,2,6,3,7,4,21,0,21,1,20,\n2,22,3,23,4,37,0,37,1,37,2,38,3,39,6,38,\n7,38,8,38,9,32,30,54,1,54,2,70,1,70,2,104,\n5,117,4,117,5,119,19,136,6,136,7,152,6,152,7,31,\n93,0,93,1,30,1,23,19,35,3,46,1,43,1,17,35,\n17,33,32,22,21,20,6,1,17,51,50,54,53,52,38,35,\n3,141,65,123,62,205,217,191,74,139,120,220,202,1,200,1,\n0,252,131,253,137,254,146,149,149,146,2,188,22,144,126,254,\n104,1,127,150,98,253,137,5,213,214,216,141,186,2,79,253,\n238,135,131,131,133,0,0,1,0,135,255,227,4,162,5,240,\n0,39,0,126,64,60,13,12,2,14,11,2,30,31,30,8,\n9,2,7,10,2,31,31,30,66,10,11,30,31,4,21,1,\n0,21,161,20,148,24,149,17,4,149,0,148,37,145,17,140,\n40,30,10,11,31,27,7,0,34,27,25,14,45,7,25,20,\n34,40,16,220,196,236,252,236,228,17,18,57,57,57,57,49,\n0,16,228,244,228,236,16,238,246,238,16,198,17,23,57,48,\n75,83,88,7,16,14,237,17,23,57,7,16,14,237,17,23,\n57,89,34,178,15,41,1,1,93,182,31,41,47,41,79,41,\n3,93,1,21,46,1,35,34,6,21,20,22,31,1,30,1,\n21,20,4,33,34,38,39,53,30,1,51,50,54,53,52,38,\n47,1,46,1,53,52,36,51,50,22,4,72,115,204,95,165,\n179,119,166,122,226,215,254,221,254,231,106,239,128,123,236,114,\n173,188,135,154,123,226,202,1,23,245,105,218,5,164,197,55,\n54,128,118,99,101,31,25,43,217,182,217,224,48,47,208,69,\n70,136,126,110,124,31,24,45,192,171,198,228,38,0,0,1,\n255,250,0,0,4,233,5,213,0,7,0,74,64,14,6,2,\n149,0,129,4,1,64,3,28,0,64,5,8,16,212,228,252,\n228,49,0,47,244,236,50,48,1,75,176,10,84,88,189,0,\n8,0,64,0,1,0,8,0,8,255,192,56,17,55,56,89,\n64,19,0,9,31,0,16,1,16,2,31,7,16,9,64,9,\n112,9,159,9,9,93,3,33,21,33,17,35,17,33,6,4,\n239,253,238,203,253,238,5,213,170,250,213,5,43,0,0,1,\n0,178,255,227,5,41,5,213,0,17,0,75,64,22,8,2,\n17,11,0,5,149,14,140,9,0,129,18,8,28,10,56,1,\n28,0,65,18,16,252,236,252,236,49,0,16,228,50,244,236,\n17,57,57,57,57,48,1,75,176,16,84,88,189,0,18,0,\n64,0,1,0,18,0,18,255,192,56,17,55,56,89,182,31,\n19,143,19,159,19,3,93,19,51,17,20,22,51,50,54,53,\n17,51,17,16,0,33,32,0,17,178,203,174,195,194,174,203,\n254,223,254,230,254,229,254,223,5,213,252,117,240,211,211,240,\n3,139,252,92,254,220,254,214,1,42,1,36,0,1,0,16,\n0,0,5,104,5,213,0,6,0,183,64,39,4,17,5,6,\n5,3,17,2,3,6,6,5,3,17,4,3,0,1,0,2,\n17,1,1,0,66,3,4,1,175,0,6,4,3,2,0,5,\n5,1,7,16,212,196,23,57,49,0,47,236,50,57,48,75,\n83,88,7,16,5,237,7,16,8,237,7,16,8,237,7,16,\n5,237,89,34,178,80,8,1,1,93,64,98,0,3,42,3,\n71,4,71,5,90,3,125,3,131,3,7,6,0,7,2,8,\n4,9,6,21,1,20,2,26,4,26,5,42,0,38,1,38,\n2,41,4,41,5,37,6,32,8,56,0,51,1,51,2,60,\n4,60,5,55,6,72,0,69,1,69,2,73,4,73,5,71,\n6,89,0,86,6,102,2,105,4,105,5,122,0,118,1,118,\n2,121,4,121,5,117,6,128,8,152,0,151,6,41,93,0,\n93,33,1,51,9,1,51,1,2,74,253,198,211,1,217,1,\n218,210,253,199,5,213,251,23,4,233,250,43,0,1,0,68,\n0,0,7,166,5,213,0,12,1,123,64,73,5,26,6,5,\n9,10,9,4,26,10,9,3,26,10,11,10,2,26,1,2,\n11,11,10,6,17,7,8,7,5,17,4,5,8,8,7,2,\n17,3,2,12,0,12,1,17,0,0,12,66,10,5,2,3,\n6,3,0,175,11,8,12,11,10,9,8,6,5,4,3,2,\n1,11,7,0,13,16,212,204,23,57,49,0,47,60,236,50,\n50,23,57,48,75,83,88,7,16,5,237,7,16,8,237,7,\n16,8,237,7,16,5,237,7,16,8,237,7,16,5,237,7,\n5,237,7,16,8,237,89,34,178,0,14,1,1,93,64,242,\n6,2,6,5,2,10,0,10,0,10,18,10,40,5,36,10,\n32,10,62,2,62,5,52,10,48,10,76,2,77,5,66,10,\n64,10,89,2,106,2,107,5,103,10,96,10,123,2,127,2,\n124,5,127,5,128,10,150,2,149,5,29,7,0,9,2,8,\n3,0,4,6,5,0,5,0,6,1,7,4,8,0,8,7,\n9,0,9,4,10,10,12,0,14,26,3,21,4,21,8,25,\n12,16,14,32,4,33,5,32,6,32,7,32,8,35,9,36,\n10,37,11,32,14,32,14,60,2,58,3,53,4,51,5,48,\n8,54,9,57,11,63,12,48,14,70,0,70,1,74,2,64,\n4,69,5,64,5,66,6,66,7,66,8,64,8,64,9,68,\n10,77,12,64,14,64,14,88,2,86,8,89,12,80,14,102,\n2,103,3,97,4,98,5,96,6,96,7,96,8,100,9,100,\n10,100,11,119,0,118,1,123,2,120,3,119,4,116,5,121,\n6,121,7,119,8,112,8,120,12,127,12,127,14,134,2,135,\n3,136,4,137,5,133,9,138,11,143,14,151,4,159,14,175,\n14,91,93,0,93,19,51,9,1,51,9,1,51,1,35,9,\n1,35,68,204,1,58,1,57,227,1,58,1,57,205,254,137,\n254,254,197,254,194,254,5,213,251,18,4,238,251,18,4,238,\n250,43,5,16,250,240,0,1,0,61,0,0,5,59,5,213,\n0,11,1,93,64,70,9,17,10,11,10,8,17,7,8,11,\n11,10,8,17,9,8,5,6,5,7,17,6,6,5,3,17,\n4,5,4,2,17,1,2,5,5,4,2,17,3,2,11,0,\n11,1,17,0,0,11,66,11,8,5,2,4,3,0,175,9,\n6,11,8,5,2,4,0,4,6,0,10,12,16,212,196,220,\n196,17,23,57,49,0,47,60,236,50,23,57,48,75,83,88,\n7,16,5,237,7,16,8,237,7,16,8,237,7,16,5,237,\n7,16,5,237,7,16,8,237,7,16,8,237,7,16,5,237,\n89,34,1,75,176,12,84,75,176,13,84,91,75,176,14,84,\n91,88,189,0,12,255,192,0,1,0,12,0,12,0,64,56,\n17,55,56,89,64,184,7,2,8,8,22,2,25,8,23,11,\n39,8,39,11,52,2,56,8,54,11,75,8,88,5,91,8,\n102,2,107,8,119,2,119,11,134,2,128,2,135,5,139,8,\n133,11,148,2,144,2,151,5,157,8,150,11,27,6,1,9,\n3,8,7,7,9,22,1,25,3,25,7,23,9,16,13,38,\n1,40,2,41,3,38,5,40,7,39,9,41,11,32,13,53,\n0,52,1,60,3,59,4,58,6,59,7,52,9,52,10,56,\n11,63,13,72,9,79,13,88,11,95,13,101,0,101,1,106,\n3,106,4,104,5,105,6,105,7,108,9,108,10,120,3,121,\n6,121,7,120,8,125,9,127,10,120,11,128,0,128,1,131,\n2,136,3,133,5,132,8,131,11,143,13,144,0,144,1,148,\n2,151,5,151,6,149,8,147,11,159,13,175,13,64,93,0,\n93,19,51,9,1,51,9,1,35,9,1,35,1,129,217,1,\n115,1,117,217,254,32,2,0,217,254,92,254,89,218,2,21,\n5,213,253,213,2,43,253,51,252,248,2,123,253,133,3,29,\n0,1,255,252,0,0,4,231,5,213,0,8,0,148,64,40,\n3,17,4,5,4,2,17,1,2,5,5,4,2,17,3,2,\n8,0,8,1,17,0,0,8,66,2,3,0,175,6,2,7,\n4,64,5,28,0,64,7,9,16,212,228,252,228,18,57,49,\n0,47,236,50,57,48,75,83,88,7,16,5,237,7,16,8,\n237,7,16,8,237,7,16,5,237,89,34,178,0,10,1,1,\n93,64,60,5,2,20,2,53,2,48,2,48,5,48,8,70,\n2,64,2,64,5,64,8,81,2,81,5,81,8,101,2,132,\n2,147,2,16,22,1,26,3,31,10,38,1,41,3,55,1,\n56,3,64,10,103,1,104,3,120,3,112,10,159,10,13,93,\n0,93,3,51,9,1,51,1,17,35,17,4,217,1,158,1,\n155,217,253,240,203,5,213,253,154,2,102,252,242,253,57,2,\n199,0,0,1,0,92,0,0,5,31,5,213,0,9,0,155,\n64,27,3,17,7,8,7,8,17,2,3,2,66,8,149,0,\n129,3,149,5,8,3,0,1,66,4,0,6,10,16,220,196,\n212,228,17,57,57,49,0,47,236,244,236,48,75,83,88,7,\n16,5,237,7,16,5,237,89,34,1,75,176,9,84,75,176,\n10,84,91,88,189,0,10,0,64,0,1,0,10,0,10,255,\n192,56,17,55,56,89,64,64,5,2,10,7,24,7,41,2,\n38,7,56,7,72,2,71,7,72,8,9,5,3,11,8,0,\n11,22,3,26,8,16,11,47,11,53,3,57,8,63,11,71,\n3,74,8,79,11,85,3,89,8,102,3,105,8,111,11,119,\n3,120,8,127,11,159,11,22,93,0,93,19,33,21,1,33,\n21,33,53,1,33,115,4,149,252,80,3,199,251,61,3,176,\n252,103,5,213,154,251,111,170,154,4,145,0,0,1,0,176,\n254,242,2,88,6,20,0,7,0,83,64,15,4,169,6,178,\n2,169,0,177,8,5,1,3,67,0,8,16,220,252,204,50,\n49,0,16,252,236,244,236,48,1,75,176,12,84,88,189,0,\n8,255,192,0,1,0,8,0,8,0,64,56,17,55,56,89,\n1,75,176,18,84,75,176,19,84,91,88,189,0,8,0,64,\n0,1,0,8,0,8,255,192,56,17,55,56,89,19,33,21,\n35,17,51,21,33,176,1,168,240,240,254,88,6,20,143,249,\n252,143,0,1,0,0,255,66,2,178,5,213,0,3,0,45,\n64,20,2,26,1,1,0,0,26,3,3,2,66,1,159,0,\n129,4,2,0,1,3,47,196,57,57,49,0,16,244,236,48,\n75,83,88,7,16,5,237,7,16,5,237,89,34,19,1,35,\n1,170,2,8,170,253,248,5,213,249,109,6,147,0,0,1,\n0,199,254,242,2,111,6,20,0,7,0,60,64,16,3,169,\n1,178,5,169,0,177,8,0,67,4,6,2,4,8,16,252,\n60,220,236,49,0,16,252,236,244,236,48,1,75,176,15,84,\n75,176,16,84,91,88,189,0,8,255,192,0,1,0,8,0,\n8,0,64,56,17,55,56,89,1,17,33,53,51,17,35,53,\n2,111,254,88,239,239,6,20,248,222,143,6,4,143,0,1,\n0,217,3,168,5,219,5,213,0,6,0,24,64,10,3,4,\n1,0,129,7,3,1,5,7,16,220,204,57,49,0,16,244,\n204,50,57,48,1,1,35,1,1,35,1,3,188,2,31,201,\n254,72,254,72,201,2,31,5,213,253,211,1,139,254,117,2,\n45,0,0,1,255,236,254,29,4,20,254,172,0,3,0,15,\n181,0,169,1,0,2,4,16,196,196,49,0,212,236,48,1,\n21,33,53,4,20,251,216,254,172,143,143,0,0,1,0,170,\n4,240,2,137,6,102,0,3,0,49,64,9,1,180,0,179,\n4,3,68,1,4,16,220,236,49,0,16,244,236,48,0,75,\n176,9,84,75,176,14,84,91,88,189,0,4,255,192,0,1,\n0,4,0,4,0,64,56,17,55,56,89,9,1,35,1,1,\n111,1,26,153,254,186,6,102,254,138,1,118,0,2,0,123,\n255,227,4,45,4,123,0,10,0,37,0,188,64,39,25,31,\n11,23,9,14,0,169,23,6,185,14,17,32,134,31,186,28,\n185,35,184,17,140,23,12,0,23,3,24,13,9,8,11,31,\n3,8,20,69,38,16,252,236,204,212,236,50,50,17,57,57,\n49,0,47,196,228,244,252,244,236,16,198,238,16,238,17,57,\n17,57,18,57,48,64,110,48,29,48,30,48,31,48,32,48,\n33,48,34,63,39,64,29,64,30,64,31,64,32,64,33,64,\n34,80,29,80,30,80,31,80,32,80,33,80,34,80,39,112,\n39,133,29,135,30,135,31,135,32,135,33,133,34,144,39,160,\n39,240,39,30,48,30,48,31,48,32,48,33,64,30,64,31,\n64,32,64,33,80,30,80,31,80,32,80,33,96,30,96,31,\n96,32,96,33,112,30,112,31,112,32,112,33,128,30,128,31,\n128,32,128,33,24,93,1,93,1,34,6,21,20,22,51,50,\n54,61,1,55,17,35,53,14,1,35,34,38,53,52,54,51,\n33,53,52,38,35,34,6,7,53,62,1,51,50,22,2,190,\n223,172,129,111,153,185,184,184,63,188,136,172,203,253,251,1,\n2,167,151,96,182,84,101,190,90,243,240,2,51,102,123,98,\n115,217,180,41,76,253,129,170,102,97,193,162,189,192,18,127,\n139,46,46,170,39,39,252,0,0,2,0,186,255,227,4,164,\n6,20,0,11,0,28,0,56,64,25,3,185,12,15,9,185,\n24,21,140,15,184,27,151,25,0,18,18,71,24,12,6,8,\n26,70,29,16,252,236,50,50,244,236,49,0,47,236,228,244,\n196,236,16,198,238,48,182,96,30,128,30,160,30,3,1,93,\n1,52,38,35,34,6,21,20,22,51,50,54,1,62,1,51,\n50,18,17,16,2,35,34,38,39,21,35,17,51,3,229,167,\n146,146,167,167,146,146,167,253,142,58,177,123,204,255,255,204,\n123,177,58,185,185,2,47,203,231,231,203,203,231,231,2,82,\n100,97,254,188,254,248,254,248,254,188,97,100,168,6,20,0,\n0,1,0,113,255,227,3,231,4,123,0,25,0,63,64,27,\n0,134,1,136,4,14,134,13,136,10,185,17,4,185,23,184,\n17,140,26,7,18,13,0,72,20,69,26,16,252,228,50,236,\n49,0,16,228,244,236,16,254,244,238,16,245,238,48,64,11,\n15,27,16,27,128,27,144,27,160,27,5,1,93,1,21,46,\n1,35,34,6,21,20,22,51,50,54,55,21,14,1,35,34,\n0,17,16,0,33,50,22,3,231,78,157,80,179,198,198,179,\n80,157,78,77,165,93,253,254,214,1,45,1,6,85,162,4,\n53,172,43,43,227,205,205,227,43,43,170,36,36,1,62,1,\n14,1,18,1,58,35,0,2,0,113,255,227,4,90,6,20,\n0,16,0,28,0,56,64,25,26,185,0,14,20,185,5,8,\n140,14,184,1,151,3,23,4,0,8,2,71,17,18,11,69,\n29,16,252,236,244,236,50,50,49,0,47,236,228,244,196,236,\n16,196,238,48,182,96,30,128,30,160,30,3,1,93,1,17,\n51,17,35,53,14,1,35,34,2,17,16,18,51,50,22,1,\n20,22,51,50,54,53,52,38,35,34,6,3,162,184,184,58,\n177,124,203,255,255,203,124,177,253,199,167,146,146,168,168,146,\n146,167,3,182,2,94,249,236,168,100,97,1,68,1,8,1,\n8,1,68,97,254,21,203,231,231,203,203,231,231,0,0,2,\n0,113,255,227,4,127,4,123,0,20,0,27,0,112,64,36,\n0,21,1,9,134,8,136,5,21,169,1,5,185,12,1,187,\n24,185,18,184,12,140,28,27,21,2,8,21,8,0,75,2,\n18,15,69,28,16,252,236,244,236,196,17,18,57,49,0,16,\n228,244,236,228,16,238,16,238,16,244,238,17,18,57,48,64,\n41,63,29,112,29,160,29,208,29,240,29,5,63,0,63,1,\n63,2,63,21,63,27,5,44,7,47,8,47,9,44,10,111,\n0,111,1,111,2,111,21,111,27,9,93,113,1,93,1,21,\n33,30,1,51,50,54,55,21,14,1,35,32,0,17,16,0,\n51,50,0,7,46,1,35,34,6,7,4,127,252,178,12,205,\n183,106,199,98,99,208,107,254,244,254,199,1,41,252,226,1,\n7,184,2,165,136,154,185,14,2,94,90,190,199,52,52,174,\n42,44,1,56,1,10,1,19,1,67,254,221,196,151,180,174,\n158,0,0,1,0,47,0,0,2,248,6,20,0,19,0,112,\n64,28,5,16,1,12,8,169,6,1,135,0,151,14,6,188,\n10,2,19,7,0,7,9,5,8,13,15,11,76,20,16,252,\n60,196,252,60,196,196,18,57,57,49,0,47,228,50,252,236,\n16,238,50,18,57,57,48,1,75,176,10,84,88,189,0,20,\n255,192,0,1,0,20,0,20,0,64,56,17,55,56,89,1,\n75,176,14,84,88,189,0,20,0,64,0,1,0,20,0,20,\n255,192,56,17,55,56,89,182,64,21,80,21,160,21,3,93,\n1,21,35,34,6,29,1,33,21,33,17,35,17,35,53,51,\n53,52,54,51,2,248,176,99,77,1,47,254,209,185,176,176,\n174,189,6,20,153,80,104,99,143,252,47,3,209,143,78,187,\n171,0,0,2,0,113,254,86,4,90,4,123,0,11,0,40,\n0,74,64,35,25,12,29,9,18,134,19,22,185,15,3,185,\n38,35,184,39,188,9,185,15,189,26,29,38,25,0,8,12,\n71,6,18,18,32,69,41,16,252,196,236,244,236,50,50,49,\n0,47,196,228,236,228,244,196,236,16,254,213,238,17,18,57,\n57,48,182,96,42,128,42,160,42,3,1,93,1,52,38,35,\n34,6,21,20,22,51,50,54,23,16,2,33,34,38,39,53,\n30,1,51,50,54,61,1,14,1,35,34,2,17,16,18,51,\n50,22,23,53,51,3,162,165,149,148,165,165,148,149,165,184,\n254,254,250,97,172,81,81,158,82,181,180,57,178,124,206,252,\n252,206,124,178,57,184,2,61,200,220,220,200,199,220,220,235,\n254,226,254,233,29,30,179,44,42,189,191,91,99,98,1,58,\n1,3,1,4,1,58,98,99,170,0,0,1,0,186,0,0,\n4,100,6,20,0,19,0,52,64,25,3,9,0,3,14,1,\n6,135,14,17,184,12,151,10,1,2,8,0,78,13,9,8,\n11,70,20,16,252,236,50,244,236,49,0,47,60,236,244,196,\n236,17,18,23,57,48,178,96,21,1,1,93,1,17,35,17,\n52,38,35,34,6,21,17,35,17,51,17,62,1,51,50,22,\n4,100,184,124,124,149,172,185,185,66,179,117,193,198,2,164,\n253,92,2,158,159,158,190,164,253,135,6,20,253,158,101,100,\n239,0,0,2,0,193,0,0,1,121,6,20,0,3,0,7,\n0,43,64,14,6,190,4,177,0,188,2,5,1,8,4,0,\n70,8,16,252,60,236,50,49,0,47,228,252,236,48,64,11,\n16,9,64,9,80,9,96,9,112,9,5,1,93,19,51,17,\n35,17,51,21,35,193,184,184,184,184,4,96,251,160,6,20,\n233,0,0,2,255,219,254,86,1,121,6,20,0,11,0,15,\n0,68,64,28,11,2,7,0,14,190,12,7,135,5,189,0,\n188,12,177,16,8,16,5,6,79,13,1,8,12,0,70,16,\n16,252,60,236,50,228,57,18,57,49,0,16,236,228,244,236,\n16,238,17,18,57,57,48,64,11,16,17,64,17,80,17,96,\n17,112,17,5,1,93,19,51,17,20,6,43,1,53,51,50,\n54,53,17,51,21,35,193,184,163,181,70,49,105,76,184,184,\n4,96,251,140,214,192,156,97,153,6,40,233,0,1,0,186,\n0,0,4,156,6,20,0,10,0,188,64,41,8,17,5,6,\n5,7,17,6,6,5,3,17,4,5,4,2,17,5,5,4,\n66,8,5,2,3,3,188,0,151,9,6,5,1,4,6,8,\n1,8,0,70,11,16,252,236,50,212,196,17,57,49,0,47,\n60,236,228,23,57,48,75,83,88,7,16,4,237,7,16,5,\n237,7,16,5,237,7,16,4,237,89,34,178,16,12,1,1,\n93,64,95,4,2,10,8,22,2,39,2,41,5,43,8,86,\n2,102,2,103,8,115,2,119,5,130,2,137,5,142,8,147,\n2,150,5,151,8,163,2,18,9,5,9,6,2,11,3,10,\n7,40,3,39,4,40,5,43,6,43,7,64,12,104,3,96,\n12,137,3,133,4,137,5,141,6,143,7,154,3,151,7,170,\n3,167,5,182,7,197,7,214,7,247,3,240,3,247,4,240,\n4,26,93,113,0,93,19,51,17,1,51,9,1,35,1,17,\n35,186,185,2,37,235,253,174,2,107,240,253,199,185,6,20,\n252,105,1,227,253,244,253,172,2,35,253,221,0,1,0,193,\n0,0,1,121,6,20,0,3,0,34,183,0,151,2,1,8,\n0,70,4,16,252,236,49,0,47,236,48,64,13,16,5,64,\n5,80,5,96,5,112,5,240,5,6,1,93,19,51,17,35,\n193,184,184,6,20,249,236,0,0,1,0,186,0,0,7,29,\n4,123,0,34,0,90,64,38,6,18,9,24,15,0,6,29,\n7,21,12,135,29,32,3,184,27,188,25,16,7,0,17,15,\n8,8,6,80,17,8,15,80,28,24,8,26,70,35,16,252,\n236,50,252,252,252,236,17,18,57,49,0,47,60,60,228,244,\n60,196,236,50,17,18,23,57,48,64,19,48,36,80,36,112,\n36,144,36,160,36,160,36,191,36,223,36,255,36,9,1,93,\n1,62,1,51,50,22,21,17,35,17,52,38,35,34,6,21,\n17,35,17,52,38,35,34,6,21,17,35,17,51,21,62,1,\n51,50,22,4,41,69,192,130,175,190,185,114,117,143,166,185,\n114,119,141,166,185,185,63,176,121,122,171,3,137,124,118,245,\n226,253,92,2,158,161,156,190,164,253,135,2,158,162,155,191,\n163,253,135,4,96,174,103,98,124,0,0,1,0,186,0,0,\n4,100,4,123,0,19,0,54,64,25,3,9,0,3,14,1,\n6,135,14,17,184,12,188,10,1,2,8,0,78,13,9,8,\n11,70,20,16,252,236,50,244,236,49,0,47,60,228,244,196,\n236,17,18,23,57,48,180,96,21,207,21,2,1,93,1,17,\n35,17,52,38,35,34,6,21,17,35,17,51,21,62,1,51,\n50,22,4,100,184,124,124,149,172,185,185,66,179,117,193,198,\n2,164,253,92,2,158,159,158,190,164,253,135,4,96,174,101,\n100,239,0,2,0,113,255,227,4,117,4,123,0,11,0,23,\n0,74,64,19,6,185,18,0,185,12,184,18,140,24,9,18,\n15,81,3,18,21,69,24,16,252,236,244,236,49,0,16,228,\n244,236,16,238,48,64,35,63,25,123,0,123,6,127,7,127,\n8,127,9,127,10,127,11,123,12,127,13,127,14,127,15,127,\n16,127,17,123,18,160,25,240,25,17,1,93,1,34,6,21,\n20,22,51,50,54,53,52,38,39,50,0,17,16,0,35,34,\n0,17,16,0,2,115,148,172,171,149,147,172,172,147,240,1,\n18,254,238,240,241,254,239,1,17,3,223,231,201,201,231,232,\n200,199,233,156,254,200,254,236,254,237,254,199,1,57,1,19,\n1,20,1,56,0,2,0,186,254,86,4,164,4,123,0,16,\n0,28,0,62,64,27,26,185,0,14,20,185,5,8,184,14,\n140,1,189,3,188,29,17,18,11,71,23,4,0,8,2,70,\n29,16,252,236,50,50,244,236,49,0,16,228,228,228,244,196,\n236,16,196,238,48,64,9,96,30,128,30,160,30,224,30,4,\n1,93,37,17,35,17,51,21,62,1,51,50,18,17,16,2,\n35,34,38,1,52,38,35,34,6,21,20,22,51,50,54,1,\n115,185,185,58,177,123,204,255,255,204,123,177,2,56,167,146,\n146,167,167,146,146,167,168,253,174,6,10,170,100,97,254,188,\n254,248,254,248,254,188,97,1,235,203,231,231,203,203,231,231,\n0,2,0,113,254,86,4,90,4,123,0,11,0,28,0,62,\n64,27,3,185,12,15,9,185,24,21,184,15,140,27,189,25,\n188,29,24,12,6,8,26,71,0,18,18,69,29,16,252,236,\n244,236,50,50,49,0,16,228,228,228,244,196,236,16,198,238,\n48,64,9,96,30,128,30,160,30,224,30,4,1,93,1,20,\n22,51,50,54,53,52,38,35,34,6,1,14,1,35,34,2,\n17,16,18,51,50,22,23,53,51,17,35,1,47,167,146,146,\n168,168,146,146,167,2,115,58,177,124,203,255,255,203,124,177,\n58,184,184,2,47,203,231,231,203,203,231,231,253,174,100,97,\n1,68,1,8,1,8,1,68,97,100,170,249,246,0,0,1,\n0,186,0,0,3,74,4,123,0,17,0,48,64,20,6,11,\n7,0,17,11,3,135,14,184,9,188,7,10,6,8,0,8,\n70,18,16,252,196,236,50,49,0,47,228,244,236,196,212,204,\n17,18,57,48,180,80,19,159,19,2,1,93,1,46,1,35,\n34,6,21,17,35,17,51,21,62,1,51,50,22,23,3,74,\n31,73,44,156,167,185,185,58,186,133,19,46,28,3,180,18,\n17,203,190,253,178,4,96,174,102,99,5,5,0,1,0,111,\n255,227,3,199,4,123,0,39,0,231,64,60,13,12,2,14,\n11,83,31,30,8,9,2,7,10,83,30,31,30,66,10,11,\n30,31,4,21,0,134,1,137,4,20,134,21,137,24,185,17,\n4,185,37,184,17,140,40,30,10,11,31,27,7,0,82,27,\n8,14,7,8,20,34,69,40,16,252,196,236,212,236,228,17,\n18,57,57,57,57,49,0,16,228,244,236,16,254,245,238,16,\n245,238,18,23,57,48,75,83,88,7,16,14,237,17,23,57,\n7,14,237,17,23,57,89,34,178,0,39,1,1,93,64,109,\n28,10,28,11,28,12,46,9,44,10,44,11,44,12,59,9,\n59,10,59,11,59,12,11,32,0,32,1,36,2,40,10,40,\n11,42,19,47,20,47,21,42,22,40,30,40,31,41,32,41,\n33,36,39,134,10,134,11,134,12,134,13,18,0,0,0,1,\n2,2,6,10,6,11,3,12,3,13,3,14,3,15,3,16,\n3,25,3,26,3,27,3,28,4,29,9,39,47,41,63,41,\n95,41,127,41,128,41,144,41,160,41,240,41,24,93,0,93,\n113,1,21,46,1,35,34,6,21,20,22,31,1,30,1,21,\n20,6,35,34,38,39,53,30,1,51,50,54,53,52,38,47,\n1,46,1,53,52,54,51,50,22,3,139,78,168,90,137,137,\n98,148,63,196,165,247,216,90,195,108,102,198,97,130,140,101,\n171,64,171,152,224,206,102,180,4,63,174,40,40,84,84,64,\n73,33,14,42,153,137,156,182,35,35,190,53,53,89,81,75,\n80,37,15,36,149,130,158,172,30,0,0,1,0,55,0,0,\n2,242,5,158,0,19,0,56,64,25,14,5,8,15,3,169,\n0,17,1,188,8,135,10,11,8,9,2,4,0,8,16,18,\n14,70,20,16,252,60,196,252,60,196,50,57,57,49,0,47,\n236,244,60,196,236,50,17,57,57,48,178,175,21,1,1,93,\n1,17,33,21,33,17,20,22,59,1,21,35,34,38,53,17,\n35,53,51,17,1,119,1,123,254,133,75,115,189,189,213,162,\n135,135,5,158,254,194,143,253,160,137,78,154,159,210,2,96,\n143,1,62,0,0,1,0,174,255,227,4,88,4,96,0,19,\n0,54,64,25,3,9,0,3,14,1,6,135,14,17,140,10,\n1,188,12,13,9,8,11,78,2,8,0,70,20,16,252,236,\n244,236,50,49,0,47,228,50,244,196,236,17,18,23,57,48,\n180,96,21,207,21,2,1,93,19,17,51,17,20,22,51,50,\n54,53,17,51,17,35,53,14,1,35,34,38,174,184,124,124,\n149,173,184,184,67,177,117,193,200,1,186,2,166,253,97,159,\n159,190,164,2,123,251,160,172,102,99,240,0,0,1,0,61,\n0,0,4,127,4,96,0,6,1,18,64,39,3,17,4,5,\n4,2,17,1,2,5,5,4,2,17,3,2,6,0,6,1,\n17,0,0,6,66,2,3,0,191,5,6,5,3,2,1,5,\n4,0,7,16,212,196,23,57,49,0,47,236,50,57,48,75,\n83,88,7,16,5,237,7,16,8,237,7,16,8,237,7,16,\n5,237,89,34,1,75,176,10,84,88,189,0,7,255,192,0,\n1,0,7,0,7,0,64,56,17,55,56,89,1,75,176,20,\n84,75,176,21,84,91,88,189,0,7,0,64,0,1,0,7,\n0,7,255,192,56,17,55,56,89,64,142,72,2,106,2,123,\n2,127,2,134,2,128,2,145,2,164,2,8,6,0,6,1,\n9,3,9,4,21,0,21,1,26,3,26,4,38,0,38,1,\n41,3,41,4,32,8,53,0,53,1,58,3,58,4,48,8,\n70,0,70,1,73,3,73,4,70,5,72,6,64,8,86,0,\n86,1,89,3,89,4,80,8,102,0,102,1,105,3,105,4,\n103,5,104,6,96,8,117,0,116,1,123,3,123,4,117,5,\n122,6,133,0,133,1,137,3,137,4,137,5,134,6,150,0,\n150,1,151,2,154,3,152,4,152,5,151,6,168,5,167,6,\n176,8,192,8,223,8,255,8,62,93,0,93,19,51,9,1,\n51,1,35,61,195,1,94,1,94,195,254,92,250,4,96,252,\n84,3,172,251,160,0,0,1,0,86,0,0,6,53,4,96,\n0,12,2,1,64,73,5,85,6,5,9,10,9,4,85,10,\n9,3,85,10,11,10,2,85,1,2,11,11,10,6,17,7,\n8,7,5,17,4,5,8,8,7,2,17,3,2,12,0,12,\n1,17,0,0,12,66,10,5,2,3,6,3,0,191,11,8,\n12,11,10,9,8,6,5,4,3,2,1,11,7,0,13,16,\n212,204,23,57,49,0,47,60,236,50,50,23,57,48,75,83,\n88,7,16,5,237,7,16,8,237,7,16,8,237,7,16,5,\n237,7,16,8,237,7,16,5,237,7,5,237,7,16,8,237,\n89,34,1,75,176,10,84,75,176,17,84,91,75,176,18,84,\n91,75,176,19,84,91,75,176,11,84,91,88,189,0,13,255,\n192,0,1,0,13,0,13,0,64,56,17,55,56,89,1,75,\n176,12,84,75,176,13,84,91,75,176,16,84,91,88,189,0,\n13,0,64,0,1,0,13,0,13,255,192,56,17,55,56,89,\n64,255,5,2,22,2,22,5,34,10,53,10,73,2,73,5,\n70,10,64,10,91,2,91,5,85,10,80,10,110,2,110,5,\n102,10,121,2,127,2,121,5,127,5,135,2,153,2,152,5,\n148,10,188,2,188,5,206,2,199,3,207,5,29,5,2,9,\n3,6,4,11,5,10,8,11,9,4,11,5,12,21,2,25,\n3,22,4,26,5,27,8,27,9,20,11,21,12,37,0,37,\n1,35,2,39,3,33,4,37,5,34,6,34,7,37,8,39,\n9,36,10,33,11,35,12,57,3,54,4,54,8,57,12,48,\n14,70,2,72,3,70,4,64,4,66,5,64,6,64,7,64,\n8,68,9,68,10,68,11,64,14,64,14,86,0,86,1,86,\n2,80,4,81,5,82,6,82,7,80,8,83,9,84,10,85,\n11,99,0,100,1,101,2,106,3,101,4,106,5,106,6,106,\n7,110,9,97,11,103,12,111,14,117,0,117,1,121,2,125,\n3,120,4,125,5,122,6,127,6,122,7,127,7,120,8,121,\n9,127,9,123,10,118,11,125,12,135,2,136,5,143,14,151,\n0,151,1,148,2,147,3,156,4,155,5,152,6,152,7,153,\n8,64,47,150,12,159,14,166,0,166,1,164,2,164,3,171,\n4,171,5,169,6,169,7,171,8,164,12,175,14,181,2,177,\n3,189,4,187,5,184,9,191,14,196,2,195,3,204,4,202,\n5,121,93,0,93,19,51,27,1,51,27,1,51,1,35,11,\n1,35,86,184,230,229,217,230,229,184,254,219,217,241,242,217,\n4,96,252,150,3,106,252,150,3,106,251,160,3,150,252,106,\n0,1,0,59,0,0,4,121,4,96,0,11,1,90,64,70,\n5,17,6,7,6,4,17,3,4,7,7,6,4,17,5,4,\n1,2,1,3,17,2,2,1,11,17,0,1,0,10,17,9,\n10,1,1,0,10,17,11,10,7,8,7,9,17,8,8,7,\n66,10,7,4,1,4,8,0,191,5,2,10,7,4,1,4,\n8,0,2,8,6,12,16,212,196,212,196,17,23,57,49,0,\n47,60,236,50,23,57,48,75,83,88,7,16,5,237,7,16,\n8,237,7,16,8,237,7,16,5,237,7,16,5,237,7,16,\n8,237,7,16,8,237,7,16,5,237,89,34,1,75,176,10,\n84,75,176,15,84,91,75,176,16,84,91,75,176,17,84,91,\n88,189,0,12,255,192,0,1,0,12,0,12,0,64,56,17,\n55,56,89,1,75,176,20,84,88,189,0,12,0,64,0,1,\n0,12,0,12,255,192,56,17,55,56,89,64,152,10,4,4,\n10,26,4,21,10,38,10,61,4,49,10,85,4,87,7,88,\n10,102,10,118,1,122,4,118,7,116,10,141,4,130,10,153,\n4,159,4,151,7,146,10,144,10,166,1,169,4,175,4,165,\n7,163,10,160,10,28,10,3,4,5,5,9,10,11,26,3,\n21,5,21,9,26,11,41,3,38,5,37,9,42,11,32,13,\n58,1,57,3,55,5,52,7,54,9,57,11,48,13,73,3,\n70,5,69,9,74,11,64,13,89,0,86,1,89,2,89,3,\n87,5,86,6,89,7,86,8,86,9,89,11,80,13,111,13,\n120,1,127,13,155,1,148,7,171,1,164,7,176,13,207,13,\n223,13,255,13,47,93,0,93,9,2,35,9,1,35,9,1,\n51,9,1,4,100,254,107,1,170,217,254,186,254,186,217,1,\n179,254,114,217,1,41,1,41,4,96,253,223,253,193,1,184,\n254,72,2,74,2,22,254,113,1,143,0,1,0,61,254,86,\n4,127,4,96,0,15,1,162,64,67,7,8,2,9,17,0,\n15,10,17,11,10,0,0,15,14,17,15,0,15,13,17,12,\n13,0,0,15,13,17,14,13,10,11,10,12,17,11,11,10,\n66,13,11,9,16,0,11,5,135,3,189,14,11,188,16,14,\n13,12,10,9,6,3,0,8,15,4,15,11,16,16,212,196,\n196,17,23,57,49,0,16,228,50,244,236,17,57,17,57,18,\n57,48,75,83,88,7,16,5,237,7,16,8,237,7,16,8,\n237,7,16,5,237,7,16,8,237,7,5,237,23,50,89,34,\n1,75,176,10,84,75,176,8,84,91,88,189,0,16,255,192,\n0,1,0,16,0,16,0,64,56,17,55,56,89,1,75,176,\n20,84,88,189,0,16,0,64,0,1,0,16,0,16,255,192,\n56,17,55,56,89,64,240,6,0,5,8,6,9,3,13,22,\n10,23,13,16,13,35,13,53,13,73,10,79,10,78,13,90,\n9,90,10,106,10,135,13,128,13,147,13,18,10,0,10,9,\n6,11,5,12,11,14,11,15,23,1,21,2,16,4,16,5,\n23,10,20,11,20,12,26,14,26,15,39,0,36,1,36,2,\n32,4,32,5,41,8,40,9,37,10,36,11,36,12,39,13,\n42,14,42,15,32,17,55,0,53,1,53,2,48,4,48,5,\n56,10,54,11,54,12,56,13,57,14,57,15,48,17,65,0,\n64,1,64,2,64,3,64,4,64,5,64,6,64,7,64,8,\n66,9,69,10,71,13,73,14,73,15,64,17,84,0,81,1,\n81,2,85,3,80,4,80,5,86,6,85,7,86,8,87,9,\n87,10,85,11,85,12,89,14,89,15,80,17,102,1,102,2,\n104,10,105,14,105,15,96,17,123,8,120,14,120,15,137,0,\n138,9,133,11,133,12,137,13,137,14,137,15,153,9,149,11,\n149,12,154,14,154,15,164,11,164,12,171,14,171,15,176,17,\n207,17,223,17,255,17,101,93,0,93,5,14,1,43,1,53,\n51,50,54,63,1,1,51,9,1,51,2,147,78,148,124,147,\n108,76,84,51,33,254,59,195,1,94,1,94,195,104,200,122,\n154,72,134,84,4,78,252,148,3,108,0,1,0,88,0,0,\n3,219,4,96,0,9,0,180,64,26,8,17,2,3,2,3,\n17,7,8,7,66,8,169,0,188,3,169,5,8,3,1,0,\n4,1,6,10,16,220,196,50,196,17,57,57,49,0,47,236,\n244,236,48,75,83,88,7,16,5,237,7,16,5,237,89,34,\n1,75,176,11,84,75,176,12,84,91,88,189,0,10,0,64,\n0,1,0,10,0,10,255,192,56,17,55,56,89,1,75,176,\n19,84,88,189,0,10,255,192,0,1,0,10,0,10,0,64,\n56,17,55,56,89,64,66,5,2,22,2,38,2,71,2,73,\n7,5,11,8,15,11,24,3,27,8,43,8,32,11,54,3,\n57,8,48,11,64,1,64,2,69,3,64,4,64,5,67,8,\n87,3,89,8,95,11,96,1,96,2,102,3,96,4,96,5,\n98,8,127,11,128,11,175,11,27,93,0,93,19,33,21,1,\n33,21,33,53,1,33,113,3,106,253,76,2,180,252,125,2,\n180,253,101,4,96,168,252,219,147,168,3,37,0,1,1,0,\n254,178,4,23,6,20,0,36,0,130,64,52,25,15,21,11,\n6,37,9,26,16,21,29,11,5,32,33,3,0,11,169,9,\n0,169,1,192,9,21,169,19,177,37,12,9,10,5,36,22,\n25,0,29,10,5,19,2,20,0,32,25,67,10,15,5,37,\n16,212,60,196,252,60,196,50,57,57,17,18,57,17,18,57,\n57,17,18,57,57,49,0,16,252,236,196,244,236,16,238,18,\n23,57,18,57,17,57,57,17,18,57,17,18,57,57,48,1,\n75,176,12,84,88,189,0,37,255,192,0,1,0,37,0,37,\n0,64,56,17,55,56,89,178,0,38,1,93,5,21,35,34,\n38,61,1,52,38,43,1,53,51,50,54,61,1,52,54,59,\n1,21,35,34,6,29,1,20,6,7,30,1,29,1,20,22,\n51,4,23,62,249,169,108,142,61,61,143,107,169,249,62,68,\n141,86,91,110,111,90,86,141,190,144,148,221,239,151,116,143,\n115,149,240,221,147,143,88,141,248,157,142,25,27,142,156,248,\n141,88,0,1,1,4,254,29,1,174,6,29,0,3,0,18,\n183,1,0,177,4,0,5,2,4,16,212,236,49,0,16,252,\n204,48,1,17,35,17,1,174,170,6,29,248,0,8,0,0,\n0,1,1,0,254,178,4,23,6,20,0,36,0,158,64,54,\n31,37,27,22,12,15,8,27,11,21,25,15,4,5,32,3,\n0,25,169,27,0,169,35,192,27,15,169,17,177,37,28,25,\n26,21,15,1,4,0,8,26,21,35,18,4,0,26,31,21,\n67,16,0,11,4,37,16,212,60,196,50,252,60,196,17,18,\n57,57,17,18,57,17,18,57,57,17,18,57,57,49,0,16,\n252,236,196,244,236,16,238,18,23,57,17,18,57,57,17,57,\n17,57,57,17,18,57,48,1,75,176,10,84,88,189,0,37,\n0,64,0,1,0,37,0,37,255,192,56,17,55,56,89,1,\n75,176,14,84,88,189,0,37,255,192,0,1,0,37,0,37,\n0,64,56,17,55,56,89,178,0,38,1,93,5,51,50,54,\n61,1,52,54,55,46,1,61,1,52,38,43,1,53,51,50,\n22,29,1,20,22,59,1,21,35,34,6,29,1,20,6,43,\n1,1,0,70,140,85,90,111,111,90,85,140,70,63,249,167,\n108,142,62,62,142,108,167,249,63,190,86,143,248,156,142,27,\n25,142,157,248,142,87,143,147,221,240,149,115,143,116,151,239,\n221,148,0,1,0,217,1,211,5,219,3,49,0,29,0,35,\n64,16,1,16,27,12,0,19,4,156,27,19,156,12,30,0,\n15,30,16,212,196,49,0,16,212,252,212,236,16,192,17,18,\n57,57,48,1,21,6,6,35,34,39,38,39,38,39,38,35,\n34,6,7,53,54,54,51,50,23,22,23,22,23,22,51,50,\n54,5,219,105,179,97,110,146,11,5,7,15,155,94,88,172,\n98,105,179,97,110,147,10,5,8,14,155,94,86,169,3,49,\n178,79,68,59,4,2,3,5,62,77,83,178,79,69,60,4,\n2,3,5,62,76,0,255,255,0,16,0,0,5,104,7,78,\n2,39,0,36,0,0,0,0,0,7,1,3,0,188,1,117,\n0,3,0,16,0,0,5,104,7,109,0,11,0,14,0,33,\n0,203,64,84,12,17,13,12,27,28,27,14,17,28,27,30,\n17,28,27,29,17,28,28,27,13,17,33,15,33,12,17,14,\n12,15,15,33,32,17,15,33,31,17,33,15,33,66,12,27,\n15,13,9,3,193,21,9,30,149,13,9,142,32,28,30,29,\n28,24,32,31,33,13,18,6,14,24,12,6,27,0,86,24,\n28,15,6,86,18,28,33,34,16,212,196,212,236,50,16,212,\n238,50,17,57,17,57,17,18,57,17,57,57,17,18,57,57,\n49,0,47,60,230,214,238,16,212,238,17,18,57,57,57,48,\n75,83,88,7,16,5,237,7,5,237,7,16,8,237,7,16,\n5,237,7,16,5,237,7,5,237,7,5,237,7,16,8,237,\n89,34,178,32,35,1,1,93,64,32,26,12,115,12,155,12,\n3,7,15,8,27,80,35,102,13,105,14,117,13,123,14,121,\n28,121,29,118,32,118,33,128,35,12,93,0,93,1,52,38,\n35,34,6,21,20,22,51,50,54,3,1,33,1,46,1,53,\n52,54,51,50,22,21,20,6,7,1,35,3,33,3,35,3,\n84,89,63,64,87,88,63,63,89,152,254,240,2,33,254,88,\n61,62,159,115,114,161,63,60,2,20,210,136,253,95,136,213,\n6,90,63,89,87,65,63,88,88,254,243,253,25,3,78,41,\n115,73,115,160,161,114,70,118,41,250,139,1,127,254,129,0,\n255,255,0,115,254,117,5,39,5,240,2,39,0,38,0,0,\n0,0,0,7,0,221,1,45,0,0,255,255,0,201,0,0,\n4,139,7,107,2,39,0,40,0,0,0,0,0,7,1,4,\n0,158,1,117,255,255,0,201,0,0,5,51,7,94,2,39,\n0,49,0,0,0,0,0,7,1,5,0,254,1,117,255,255,\n0,115,255,227,5,217,7,78,2,39,0,50,0,0,0,0,\n0,7,1,3,1,39,1,117,255,255,0,178,255,227,5,41,\n7,78,2,39,0,56,0,0,0,0,0,7,1,3,0,238,\n1,117,255,255,0,123,255,227,4,45,6,102,2,39,0,68,\n0,0,0,0,0,7,0,141,0,82,0,0,255,255,0,123,\n255,227,4,45,6,102,2,39,0,68,0,0,0,0,0,7,\n0,67,0,82,0,0,255,255,0,123,255,227,4,45,6,102,\n2,39,0,68,0,0,0,0,0,7,0,215,0,82,0,0,\n255,255,0,123,255,227,4,45,6,16,2,39,0,68,0,0,\n0,0,0,7,0,142,0,82,0,0,255,255,0,123,255,227,\n4,45,6,55,2,39,0,68,0,0,0,0,0,7,0,216,\n0,82,0,0,255,255,0,123,255,227,4,45,7,6,2,39,\n0,68,0,0,0,0,0,7,0,220,0,82,0,0,255,255,\n0,113,254,117,3,231,4,123,2,39,0,70,0,0,0,0,\n0,7,0,221,0,143,0,0,255,255,0,113,255,227,4,127,\n6,102,2,39,0,72,0,0,0,0,0,7,0,141,0,139,\n0,0,255,255,0,113,255,227,4,127,6,102,2,39,0,72,\n0,0,0,0,0,7,0,67,0,139,0,0,255,255,0,113,\n255,227,4,127,6,102,2,39,0,72,0,0,0,0,0,7,\n0,215,0,139,0,0,255,255,0,113,255,227,4,127,6,16,\n2,39,0,72,0,0,0,0,0,7,0,142,0,139,0,0,\n255,255,0,144,0,0,2,111,6,102,2,39,0,214,0,0,\n0,0,0,7,0,141,255,29,0,0,255,255,255,199,0,0,\n1,166,6,102,2,39,0,214,0,0,0,0,0,7,0,67,\n255,29,0,0,255,255,255,222,0,0,2,92,6,102,2,39,\n0,214,0,0,0,0,0,7,0,215,255,29,0,0,255,255,\n255,244,0,0,2,70,6,16,2,39,0,214,0,0,0,0,\n0,7,0,142,255,29,0,0,255,255,0,186,0,0,4,100,\n6,55,2,39,0,81,0,0,0,0,0,7,0,216,0,152,\n0,0,255,255,0,113,255,227,4,117,6,102,2,39,0,82,\n0,0,0,0,0,7,0,141,0,115,0,0,255,255,0,113,\n255,227,4,117,6,102,2,39,0,82,0,0,0,0,0,7,\n0,67,0,115,0,0,255,255,0,113,255,227,4,117,6,102,\n2,39,0,82,0,0,0,0,0,7,0,215,0,115,0,0,\n255,255,0,113,255,227,4,117,6,16,2,39,0,82,0,0,\n0,0,0,7,0,142,0,115,0,0,255,255,0,113,255,227,\n4,117,6,55,2,39,0,82,0,0,0,0,0,7,0,216,\n0,115,0,0,255,255,0,174,255,227,4,88,6,102,2,39,\n0,88,0,0,0,0,0,7,0,141,0,123,0,0,255,255,\n0,174,255,227,4,88,6,102,2,39,0,88,0,0,0,0,\n0,7,0,67,0,123,0,0,255,255,0,174,255,227,4,88,\n6,102,2,39,0,88,0,0,0,0,0,7,0,215,0,123,\n0,0,255,255,0,174,255,227,4,88,6,16,2,39,0,88,\n0,0,0,0,0,7,0,142,0,123,0,0,0,1,0,57,\n255,59,3,199,5,213,0,11,0,39,64,20,8,4,185,10,\n2,0,129,6,194,12,3,89,5,1,87,9,89,7,0,12,\n16,212,60,236,252,60,236,49,0,16,228,244,212,60,236,50,\n48,1,51,17,33,21,33,17,35,17,33,53,33,1,168,176,\n1,111,254,145,176,254,145,1,111,5,213,254,92,153,251,163,\n4,93,153,0,0,2,0,195,3,117,3,61,5,240,0,11,\n0,26,0,32,64,17,6,195,21,196,0,195,12,145,27,9,\n90,18,91,3,90,24,27,16,220,236,252,236,49,0,16,244,\n236,252,236,48,1,34,6,21,20,22,51,50,54,53,52,38,\n39,50,22,23,22,22,21,20,6,35,34,38,53,52,54,2,\n0,80,110,110,80,80,110,111,79,64,118,43,46,46,185,134,\n135,180,184,5,111,111,80,79,109,109,79,79,112,129,49,46,\n45,114,66,132,183,180,135,134,186,0,0,2,0,172,254,199,\n4,35,5,152,0,6,0,33,0,81,64,43,19,22,20,0,\n15,12,1,11,7,134,8,136,11,16,134,15,136,12,185,20,\n22,11,185,29,31,28,184,22,140,34,28,21,0,9,30,19,\n11,15,7,4,18,25,34,16,220,236,212,60,212,60,60,236,\n50,50,49,0,16,228,244,60,196,236,16,196,254,244,238,16,\n245,238,18,57,17,18,57,17,18,57,48,37,17,6,6,21,\n20,22,1,21,38,38,39,3,54,54,55,21,6,6,7,17,\n35,17,38,0,17,16,0,55,17,51,19,22,22,2,166,147,\n164,164,2,16,74,136,68,1,70,137,72,65,137,77,102,241,\n254,247,1,9,241,102,1,73,137,131,3,88,18,226,184,185,\n226,3,161,172,41,42,3,252,160,5,42,39,170,30,35,7,\n254,228,1,32,20,1,51,1,1,1,2,1,50,22,1,31,\n254,225,4,33,0,1,0,129,0,0,4,98,5,240,0,27,\n0,96,64,33,7,22,8,1,134,0,18,10,169,20,8,12,\n4,160,0,148,25,145,16,12,160,14,0,13,9,11,7,28,\n19,15,21,17,28,16,220,60,204,204,252,60,196,212,196,49,\n0,47,236,50,244,228,236,16,212,60,238,50,16,238,17,57,\n57,48,1,75,176,12,84,88,189,0,28,255,192,0,1,0,\n28,0,28,0,64,56,17,55,56,89,180,54,1,54,2,2,\n0,93,1,21,46,1,35,34,6,29,1,33,21,33,17,33,\n21,33,53,51,17,35,53,51,53,16,54,51,50,22,4,78,\n76,136,61,148,116,1,135,254,121,2,45,252,31,236,199,199,\n214,232,61,151,5,180,182,41,41,155,212,215,143,254,47,170,\n170,1,209,143,238,1,5,243,31,0,0,2,0,92,255,61,\n3,162,5,240,0,11,0,62,0,145,64,60,47,48,42,6,\n0,23,29,48,54,4,13,39,138,38,13,138,12,42,198,38,\n197,35,16,198,12,197,60,145,35,63,47,6,0,23,48,4,\n19,29,45,9,54,3,19,87,57,45,87,32,9,87,12,34,\n26,57,38,34,3,87,51,63,16,220,236,228,196,212,228,236,\n212,236,16,238,17,57,17,18,57,17,23,57,57,49,0,16,\n196,244,228,236,16,230,238,16,238,16,238,17,23,57,57,57,\n17,18,57,48,1,75,176,10,84,75,176,11,84,91,75,176,\n12,84,91,75,176,14,84,91,88,189,0,63,0,64,0,1,\n0,63,0,63,255,192,56,17,55,56,89,1,14,1,21,20,\n22,23,62,1,53,52,38,19,21,46,1,35,34,6,21,20,\n23,22,23,30,1,21,20,6,7,30,1,21,20,6,35,34,\n38,39,53,30,1,51,50,54,53,52,47,1,46,1,53,52,\n54,55,46,1,53,52,54,51,50,22,1,123,63,62,139,250,\n63,62,143,204,83,143,56,97,108,206,26,14,211,131,92,93,\n62,57,204,173,73,154,88,87,148,58,102,113,221,25,214,128,\n93,91,59,59,200,166,73,153,3,168,46,90,46,76,133,135,\n45,91,46,75,136,2,147,164,39,39,80,71,90,115,15,8,\n119,154,101,90,140,53,52,109,64,142,168,29,29,164,39,39,\n84,76,102,123,14,120,153,102,91,143,49,44,112,69,130,159,\n29,0,0,1,1,51,1,209,3,133,4,33,0,11,0,18,\n183,9,199,3,12,6,92,0,12,16,212,236,49,0,16,212,\n236,48,1,52,54,51,50,22,21,20,6,35,34,38,1,51,\n173,126,124,171,172,125,125,172,2,250,124,171,171,124,125,172,\n172,0,0,1,0,158,255,59,4,57,5,213,0,13,0,37,\n64,18,8,2,4,193,0,129,6,2,14,0,7,93,5,3,\n93,1,11,14,16,212,212,252,220,236,57,49,0,16,196,50,\n244,236,17,57,48,1,33,17,35,17,35,17,35,17,38,38,\n53,52,36,2,121,1,192,141,190,142,215,235,1,4,5,213,\n249,102,6,31,249,225,3,78,17,221,184,190,232,0,0,1,\n0,186,255,227,4,172,6,20,0,47,0,154,64,48,45,39,\n33,12,4,6,13,32,0,4,42,22,134,23,26,185,19,42,\n185,3,151,19,140,46,12,9,13,29,32,33,39,9,8,36,\n39,8,6,29,8,36,16,22,45,8,16,0,70,48,16,252,\n196,252,204,16,198,238,212,238,16,238,17,57,57,18,57,18,\n57,49,0,47,228,254,238,16,254,213,238,18,23,57,23,57,\n48,64,64,15,5,15,6,15,7,15,39,15,40,138,12,138,\n13,7,10,6,10,7,10,11,10,12,10,13,10,31,13,32,\n10,33,12,34,4,38,25,13,25,31,25,32,58,32,58,33,\n77,31,77,32,73,33,73,34,106,31,106,32,165,6,165,7,\n166,32,24,93,1,93,19,52,54,51,50,22,23,14,1,21,\n20,22,31,1,30,1,21,20,6,35,34,38,39,53,30,1,\n51,50,54,53,52,38,47,1,46,1,53,52,54,55,46,1,\n35,34,6,21,17,35,186,239,218,208,219,3,151,168,58,65,\n57,166,96,225,211,64,136,73,80,140,65,116,120,59,101,92,\n96,87,167,151,8,131,113,130,136,187,4,113,200,219,232,224,\n8,115,96,47,81,42,37,106,142,100,172,183,25,24,164,30,\n29,95,91,63,84,62,55,59,135,91,127,172,29,103,112,139,\n131,251,147,0,0,4,1,27,0,0,6,229,5,205,0,23,\n0,47,0,56,0,76,0,96,64,54,69,66,67,63,50,201,\n72,48,201,57,74,67,202,12,57,202,0,201,24,200,12,201,\n36,72,69,51,48,4,49,66,60,63,57,54,73,49,96,75,\n54,96,67,60,94,18,9,30,75,94,6,9,30,95,42,77,\n16,220,228,252,236,16,254,253,196,238,16,238,50,17,57,57,\n18,57,18,23,57,49,0,47,238,246,254,237,16,237,50,16,\n238,214,238,57,18,57,57,48,1,34,6,7,6,6,21,20,\n22,23,22,22,51,50,54,55,54,54,53,52,38,39,38,38,\n39,50,4,23,22,18,21,20,2,7,6,4,35,34,36,39,\n38,2,53,52,18,55,54,36,19,35,17,51,50,54,53,52,\n38,39,50,22,21,20,6,7,22,22,23,23,35,39,38,38,\n35,35,17,35,17,4,0,131,226,94,94,96,96,94,94,226,\n131,132,227,94,93,93,94,92,94,227,132,152,1,7,109,109,\n108,108,109,109,254,249,152,152,254,249,109,109,108,108,109,109,\n1,7,125,123,123,110,87,88,102,176,174,105,96,24,67,46,\n137,172,129,59,73,54,66,155,5,102,94,94,94,229,130,129,\n227,94,94,95,95,94,93,226,131,133,227,93,94,94,103,110,\n109,109,254,250,154,152,254,251,109,109,110,110,109,109,1,5,\n152,154,1,6,109,109,110,254,98,254,236,62,75,76,63,103,\n119,121,86,112,17,8,77,73,223,209,96,51,254,156,3,68,\n0,3,1,27,0,0,6,229,5,205,0,23,0,47,0,73,\n0,67,64,38,61,203,62,58,204,65,202,36,49,203,48,52,\n204,71,202,24,201,0,200,36,201,12,55,97,68,61,48,94,\n42,9,6,68,94,30,9,6,18,74,16,220,204,252,236,16,\n254,237,50,16,238,49,0,47,238,246,254,253,238,214,238,16,\n253,238,214,238,48,1,50,4,23,22,18,21,20,2,7,6,\n4,35,34,36,39,38,2,53,52,18,55,54,36,23,34,6,\n7,6,6,21,20,22,23,22,22,51,50,54,55,54,54,53,\n52,38,39,38,38,23,21,38,38,35,34,6,21,20,22,51,\n50,54,55,21,6,6,35,34,38,53,52,54,51,50,22,4,\n0,152,1,7,109,109,108,108,109,109,254,249,152,152,254,249,\n109,109,108,108,109,109,1,7,152,131,226,94,94,96,96,94,\n94,226,131,132,227,94,93,93,94,92,94,227,167,66,130,66,\n149,167,171,155,64,122,66,67,137,70,216,251,251,216,73,136,\n5,205,110,109,109,254,250,154,152,254,251,109,109,110,110,109,\n109,1,5,152,154,1,6,109,109,110,103,94,94,94,229,130,\n129,227,94,94,95,95,94,93,226,131,133,227,93,94,94,245,\n129,33,32,175,157,159,174,31,34,127,29,28,244,208,209,242,\n28,0,0,2,1,39,3,147,6,70,5,213,0,12,0,20,\n0,62,64,33,1,6,7,16,10,4,18,14,9,3,6,201,\n13,2,0,129,21,1,9,5,98,3,9,98,11,13,99,15,\n98,19,99,17,21,16,212,228,252,228,212,236,212,236,17,57,\n49,0,16,244,60,60,236,23,50,212,60,60,196,17,57,48,\n1,19,19,51,17,35,17,3,35,3,17,35,17,35,21,35,\n17,35,17,35,53,4,74,174,164,170,113,195,55,203,114,113,\n203,114,201,5,213,255,0,1,0,253,190,1,228,254,209,1,\n47,254,28,2,66,94,254,28,1,228,94,0,0,1,1,115,\n4,238,3,82,6,102,0,3,0,49,64,9,2,180,0,179,\n4,3,68,1,4,16,212,236,49,0,16,244,236,48,0,75,\n176,9,84,75,176,14,84,91,88,189,0,4,255,192,0,1,\n0,4,0,4,0,64,56,17,55,56,89,1,51,1,35,2,\n139,199,254,186,153,6,102,254,136,0,0,2,0,215,5,70,\n3,41,6,16,0,3,0,7,0,146,64,14,6,2,206,4,\n0,205,8,1,100,0,5,100,4,8,16,220,252,212,236,49,\n0,16,252,60,236,50,48,0,75,176,10,84,75,176,13,84,\n91,88,189,0,8,0,64,0,1,0,8,0,8,255,192,56,\n17,55,56,89,1,75,176,12,84,75,176,13,84,91,75,176,\n14,84,91,75,176,23,84,91,88,189,0,8,255,192,0,1,\n0,8,0,8,0,64,56,17,55,56,89,1,75,176,15,84,\n75,176,25,84,91,88,189,0,8,0,64,0,1,0,8,0,\n8,255,192,56,17,55,56,89,64,17,96,1,96,2,96,5,\n96,6,112,1,112,2,112,5,112,6,8,93,1,51,21,35,\n37,51,21,35,2,94,203,203,254,121,203,203,6,16,202,202,\n202,0,0,1,0,217,0,39,5,219,4,221,0,19,0,62,\n64,34,13,12,10,3,2,207,4,0,156,6,12,207,14,10,\n156,18,6,16,8,20,18,14,13,12,8,4,3,2,8,9,\n5,15,0,20,16,220,60,196,50,23,57,49,0,16,212,60,\n204,50,252,60,236,16,254,60,236,57,17,18,57,48,19,33,\n1,23,7,33,21,33,7,33,21,33,1,39,55,33,53,33,\n55,33,217,3,4,1,0,125,174,1,47,254,72,195,2,123,\n252,250,254,254,125,174,254,213,1,182,195,253,135,3,162,1,\n59,102,213,168,240,170,254,199,102,211,170,240,0,2,0,8,\n0,0,7,72,5,213,0,15,0,19,0,135,64,57,17,17,\n14,15,14,16,17,15,15,14,13,17,15,14,12,17,14,15,\n14,66,5,149,3,11,149,17,1,149,16,149,0,129,17,7,\n149,3,173,13,9,17,16,15,13,12,5,14,10,0,4,8,\n6,2,28,18,10,14,20,16,212,212,60,236,50,212,196,196,\n17,18,23,57,49,0,47,60,236,236,196,244,236,236,16,238,\n16,238,48,75,83,88,7,16,5,237,7,5,237,7,16,5,\n237,7,16,5,237,89,34,178,128,21,1,1,93,64,19,103,\n17,119,16,119,17,134,12,133,16,150,17,144,21,160,21,191,\n21,9,93,1,21,33,17,33,21,33,17,33,21,33,17,33,\n3,35,1,23,1,33,17,7,53,253,27,2,199,253,57,2,\n248,252,61,253,240,160,205,2,113,139,254,182,1,203,5,213,\n170,254,70,170,253,227,170,1,127,254,129,5,213,158,252,240,\n3,16,0,3,0,102,255,186,5,229,6,23,0,9,0,19,\n0,43,0,158,64,60,29,31,26,13,43,44,19,10,1,0,\n4,13,41,38,32,20,13,4,42,38,30,26,4,149,38,13,\n149,26,145,38,140,44,43,44,42,20,23,16,32,30,35,19,\n10,1,0,4,29,41,16,7,31,7,25,35,51,16,25,23,\n16,44,16,252,236,252,236,192,17,18,57,57,23,57,18,57,\n57,17,18,57,57,17,57,49,0,16,228,244,236,16,238,16,\n192,16,192,17,18,57,57,18,57,18,23,57,18,57,17,18,\n57,57,48,64,42,87,0,90,21,87,25,85,33,106,21,101,\n33,123,21,118,28,117,33,9,70,19,89,0,86,19,106,0,\n100,19,100,28,106,40,124,0,115,19,118,28,122,40,11,93,\n1,93,9,1,30,1,51,50,0,17,52,38,39,46,1,35,\n34,0,17,20,22,23,7,38,2,53,16,0,33,50,22,23,\n55,23,7,22,18,21,16,0,33,34,38,39,7,39,4,182,\n253,51,62,161,95,220,1,1,39,121,61,161,95,220,254,253,\n39,39,134,78,79,1,121,1,59,130,221,87,162,102,170,78,\n80,254,136,254,198,128,221,91,162,103,4,88,252,178,64,67,\n1,72,1,26,112,184,184,64,67,254,184,254,229,112,188,68,\n158,102,1,8,160,1,98,1,165,77,75,191,89,198,103,254,\n246,158,254,159,254,91,75,75,191,88,0,3,0,221,0,221,\n5,207,3,238,0,11,0,23,0,47,0,255,64,29,45,27,\n21,9,33,3,0,36,24,4,21,15,39,33,21,27,15,33,\n48,12,0,36,24,18,6,42,18,30,48,16,212,196,212,196,\n17,57,57,57,57,49,0,16,212,196,212,196,16,192,17,18,\n23,57,18,57,17,18,57,48,64,190,5,2,5,3,5,4,\n0,5,0,6,0,7,5,8,5,9,5,10,10,16,15,17,\n15,18,15,19,10,20,21,2,21,3,21,4,16,5,16,6,\n16,7,21,8,21,9,21,10,26,14,26,15,26,16,31,17,\n31,18,31,19,26,20,26,21,26,22,36,2,36,3,36,4,\n32,5,32,6,32,7,36,8,36,9,36,10,42,14,42,15,\n42,16,47,17,47,18,47,19,42,20,42,21,42,22,53,2,\n53,3,53,4,48,5,48,6,48,7,53,8,53,9,53,10,\n58,14,58,15,58,16,63,17,63,18,63,19,58,20,58,21,\n58,22,69,2,69,3,69,4,64,5,64,6,64,7,69,8,\n69,9,69,10,74,14,74,15,74,16,79,17,79,18,79,19,\n74,20,74,21,74,22,86,180,31,176,32,176,33,176,34,176,\n38,176,39,176,40,180,41,8,93,1,93,1,30,1,51,50,\n54,53,52,38,35,34,6,7,46,1,35,34,6,21,20,22,\n51,50,54,23,14,1,35,34,38,53,52,54,51,50,22,23,\n62,1,51,50,22,21,20,6,35,34,38,3,147,49,134,84,\n101,128,118,89,82,133,196,49,133,85,102,127,118,89,82,134,\n144,70,157,94,136,186,167,134,95,153,72,68,158,97,134,188,\n167,134,94,149,2,47,88,90,135,105,101,134,135,55,88,88,\n132,106,101,134,136,22,135,127,223,166,175,216,126,138,138,131,\n225,167,175,214,119,0,0,2,0,217,0,0,5,219,5,4,\n0,11,0,15,0,46,64,24,5,208,7,3,156,0,208,9,\n1,12,156,14,13,2,21,4,0,23,12,8,21,10,6,16,\n16,212,60,236,50,252,60,236,50,49,0,47,236,212,60,236,\n252,60,236,48,1,17,33,21,33,17,35,17,33,53,33,17,\n1,33,21,33,3,174,2,45,253,211,168,253,211,2,45,253,\n211,5,2,250,254,5,4,254,125,170,254,125,1,131,170,1,\n131,251,166,170,0,2,0,217,0,0,5,219,4,168,0,6,\n0,10,0,84,64,46,2,156,3,4,3,1,156,0,1,4,\n4,3,1,156,2,1,5,6,5,0,156,6,5,66,5,4,\n2,1,0,5,3,209,6,167,7,156,9,1,8,2,0,36,\n7,4,35,11,16,252,60,236,50,50,57,49,0,47,236,244,\n236,23,57,48,75,83,88,7,4,237,7,16,8,237,7,16,\n8,237,7,16,4,237,89,34,9,2,21,1,53,1,1,33,\n21,33,5,219,252,64,3,192,250,254,5,2,250,254,5,2,\n250,254,3,248,254,235,254,238,178,1,112,170,1,111,252,2,\n170,0,0,2,0,217,0,0,5,219,4,168,0,6,0,10,\n0,86,64,47,6,156,0,6,3,4,3,5,156,4,4,3,\n0,156,1,2,1,6,156,5,6,2,2,1,66,6,5,3,\n2,0,5,4,209,1,167,7,156,8,6,7,2,36,9,4,\n0,35,11,16,252,60,60,236,50,57,49,0,47,236,244,236,\n23,57,48,75,83,88,7,16,8,237,7,16,4,237,7,16,\n4,237,7,16,8,237,89,34,19,53,1,21,1,53,1,1,\n21,33,53,217,5,2,250,254,3,193,1,65,250,254,3,248,\n176,254,145,170,254,144,178,1,18,253,199,170,170,0,0,1,\n0,82,0,0,4,195,5,213,0,24,0,198,64,70,16,2,\n17,22,17,15,2,14,15,22,22,17,15,2,16,15,8,13,\n8,14,2,13,13,8,66,15,11,9,4,0,211,23,6,18,\n11,211,20,9,16,13,129,2,12,9,14,3,5,22,15,3,\n21,18,16,3,0,17,102,19,0,101,1,28,13,102,10,5,\n101,7,3,25,16,212,60,236,50,236,252,236,50,236,18,23,\n57,18,57,57,17,23,57,49,0,47,228,50,212,60,236,50,\n212,60,236,50,17,18,57,48,75,83,88,7,16,5,237,7,\n16,8,237,7,16,8,237,7,16,5,237,89,34,1,75,176,\n12,84,88,189,0,25,255,192,0,1,0,25,0,25,0,64,\n56,17,55,56,89,64,40,134,15,144,15,166,15,160,15,181,\n15,5,39,12,39,13,39,14,41,16,40,17,40,18,55,14,\n57,16,135,12,136,18,166,13,165,14,170,16,169,17,14,93,\n0,93,1,33,17,35,17,33,53,33,53,39,33,53,33,1,\n51,9,1,51,1,33,21,33,7,21,33,4,141,254,99,201,\n254,96,1,160,84,254,180,1,8,254,195,190,1,123,1,121,\n191,254,194,1,8,254,181,84,1,159,1,199,254,57,1,199,\n123,51,155,123,2,74,253,68,2,188,253,182,123,155,51,0,\n0,1,0,174,254,86,4,229,4,96,0,32,0,77,64,37,\n19,25,31,3,22,6,3,9,12,3,1,18,15,6,135,28,\n22,140,10,1,188,0,189,33,25,9,18,9,8,11,78,31,\n2,8,0,70,33,16,252,236,50,244,236,196,18,57,49,0,\n16,228,228,50,244,60,236,220,196,17,23,57,17,18,23,57,\n48,182,31,34,96,34,207,34,3,1,93,19,17,51,17,20,\n22,51,50,54,53,17,51,17,20,22,51,50,54,55,21,14,\n1,35,34,38,39,14,1,35,34,38,39,17,174,184,138,135,\n148,149,184,35,37,9,32,28,41,73,35,69,82,15,50,145,\n98,102,143,42,254,86,6,10,253,72,145,148,168,168,2,141,\n252,162,60,57,11,12,148,23,22,78,80,79,79,78,78,253,\n215,0,0,2,0,104,255,231,3,193,5,45,0,29,0,41,\n0,98,64,25,0,39,33,9,27,6,39,21,6,15,33,27,\n15,21,213,42,12,36,3,0,30,18,36,24,42,16,212,204,\n220,204,57,57,17,57,49,0,16,228,204,220,204,16,206,16,\n206,17,18,57,17,18,57,48,1,75,176,12,84,75,176,11,\n84,91,75,176,14,84,91,75,176,16,84,91,75,176,20,84,\n91,88,189,0,42,0,64,0,1,0,42,0,42,255,192,56,\n17,55,56,89,1,62,1,53,52,38,35,34,6,35,34,38,\n53,52,54,51,50,18,17,16,0,35,34,38,53,52,18,51,\n50,22,7,52,38,35,34,2,21,20,22,51,50,18,2,244,\n15,15,73,72,55,144,36,36,48,144,101,180,214,254,223,213,\n152,203,221,162,101,130,11,87,79,109,141,86,80,109,141,2,\n109,87,163,75,129,131,116,44,31,62,98,254,202,254,249,254,\n177,254,70,216,163,198,1,1,91,224,116,125,254,254,207,116,\n123,1,4,0,0,1,0,25,254,119,5,59,5,193,0,11,\n0,93,64,20,10,4,12,2,5,7,2,0,7,12,10,5,\n4,3,1,0,6,6,8,12,16,212,196,23,57,49,0,16,\n196,212,204,16,206,17,18,57,57,48,64,48,81,3,86,5,\n80,5,90,10,115,3,112,3,118,4,117,5,112,5,122,10,\n128,3,128,5,12,90,9,127,2,127,3,112,5,112,6,123,\n9,116,11,143,2,143,3,128,5,128,6,11,93,1,93,19,\n33,21,33,9,1,33,21,33,53,9,1,55,4,234,252,65,\n2,160,253,74,3,239,250,222,2,213,253,73,5,193,193,253,\n51,253,4,192,149,3,33,2,227,0,0,1,0,156,254,119,\n5,113,5,193,0,7,0,30,64,15,6,2,215,4,214,0,\n175,8,3,103,1,5,103,0,8,16,212,236,212,236,49,0,\n16,252,236,236,50,48,19,33,17,35,17,33,17,35,156,4,\n213,240,253,10,239,5,193,248,182,6,125,249,131,0,0,1,\n255,225,255,240,4,170,4,47,0,35,0,203,64,49,11,2,\n21,31,30,3,0,8,218,15,26,22,0,217,34,216,15,213,\n24,12,30,27,26,25,24,23,6,36,18,1,0,11,2,4,\n35,22,21,5,34,31,18,12,35,18,104,5,35,31,36,16,\n212,212,212,236,18,57,17,18,57,18,57,57,17,23,57,17,\n18,23,57,49,0,47,60,228,244,236,50,50,16,238,17,23,\n57,57,57,48,1,75,176,10,84,88,189,0,36,255,192,0,\n1,0,36,0,36,0,64,56,17,55,56,89,64,86,24,30,\n24,31,2,9,0,9,1,13,2,13,3,15,4,15,5,15,\n6,15,7,15,8,15,9,15,10,15,11,15,12,15,13,15,\n14,15,15,15,16,15,17,15,18,15,19,14,20,13,21,9,\n22,11,23,8,24,15,24,13,25,8,26,9,35,17,0,17,\n1,22,2,22,3,23,20,22,21,17,22,23,23,28,24,28,\n25,17,35,40,93,0,93,1,35,3,14,1,21,20,22,51,\n50,54,55,7,14,1,35,34,38,53,52,54,55,19,33,3,\n35,19,35,34,6,7,35,62,1,51,33,4,135,182,105,15,\n15,47,55,17,46,37,30,30,55,26,118,121,21,34,80,254,\n186,194,181,195,41,54,60,9,160,28,143,165,3,121,3,145,\n254,25,74,92,22,58,49,5,5,141,8,8,102,100,46,144,\n161,1,120,252,111,3,145,64,69,166,125,0,0,1,0,47,\n254,141,3,250,6,14,0,37,0,38,64,20,32,219,0,26,\n13,219,19,26,220,7,177,38,10,105,23,106,29,105,4,38,\n16,220,236,252,236,49,0,16,252,236,220,228,16,222,228,48,\n1,50,19,54,55,18,18,51,50,22,21,20,6,35,34,38,\n39,38,38,35,34,3,6,7,2,2,35,34,38,53,52,54,\n51,50,22,23,22,22,1,55,106,14,2,1,12,190,202,80,\n100,64,55,42,56,12,6,9,16,107,14,4,4,17,189,196,\n79,101,68,61,33,48,15,10,10,254,250,2,176,108,57,2,\n3,1,188,84,65,54,63,38,35,15,72,253,149,193,110,254,\n33,254,98,83,65,56,63,29,28,18,83,0,0,3,0,115,\n1,213,3,59,5,240,0,3,0,30,0,41,0,95,64,51,\n40,7,37,4,31,18,24,16,2,227,0,31,221,16,0,225,\n37,221,5,10,25,223,24,222,21,221,10,224,28,145,42,0,\n24,13,31,16,34,6,2,1,40,17,6,107,4,108,24,34,\n107,13,42,16,220,236,204,252,236,50,50,192,192,17,18,57,\n57,17,18,57,49,0,16,244,228,252,244,236,16,196,238,237,\n214,238,16,238,17,18,57,18,57,17,57,57,48,19,33,21,\n33,1,17,35,53,6,6,35,34,38,53,52,54,51,51,53,\n52,38,35,34,6,7,53,54,54,51,50,22,5,34,6,21,\n20,22,51,50,54,53,53,139,2,176,253,80,2,174,149,44,\n144,93,128,152,191,188,182,117,117,62,136,68,73,145,69,183,\n179,254,236,161,126,98,82,104,130,2,80,123,2,184,254,64,\n112,63,68,135,113,135,138,4,91,91,34,34,127,28,28,176,\n240,67,79,64,77,144,114,29,0,3,0,96,1,213,3,100,\n5,240,0,3,0,15,0,27,0,46,64,25,2,227,0,225,\n22,221,10,224,16,221,4,145,28,0,19,13,1,25,107,7,\n108,19,107,13,28,16,220,236,252,236,57,17,18,57,49,0,\n16,244,236,244,236,252,236,48,19,33,21,33,1,50,22,21,\n20,6,35,34,38,53,52,54,23,34,6,21,20,22,51,50,\n54,53,52,38,139,2,176,253,80,1,88,179,206,206,179,179,\n208,208,179,105,126,127,104,105,125,124,2,80,123,4,27,221,\n191,191,219,220,190,191,221,115,161,136,133,160,160,133,137,160,\n0,1,0,78,0,0,5,207,5,231,0,31,0,64,64,34,\n9,229,25,145,18,15,3,3,0,229,16,1,17,32,22,19,\n15,12,31,6,2,1,0,2,109,6,28,28,15,109,12,28,\n22,32,16,212,236,236,212,236,236,192,192,17,18,57,17,18,\n57,17,18,57,49,0,47,60,236,23,50,244,236,48,37,21,\n33,53,54,18,53,52,0,35,34,0,21,20,18,23,21,33,\n53,33,38,2,53,16,0,33,32,0,17,20,2,7,5,207,\n253,168,177,198,254,248,216,216,254,247,199,178,253,168,1,63,\n158,145,1,127,1,49,1,47,1,129,142,161,178,178,178,97,\n1,76,202,240,1,34,254,221,239,202,254,180,97,178,178,139,\n1,42,184,1,62,1,138,254,119,254,203,194,254,216,141,0,\n0,3,0,123,255,227,7,111,4,123,0,6,0,51,0,62,\n1,3,64,67,39,45,37,61,14,13,0,52,169,37,22,134,\n21,136,18,0,169,14,58,18,185,28,25,46,134,45,186,42,\n3,185,14,187,7,49,10,184,31,25,140,37,63,52,55,38,\n6,15,0,37,55,28,7,38,15,21,0,8,13,61,38,8,\n15,45,55,8,34,69,63,16,252,236,204,212,252,60,212,236,\n196,17,18,57,57,17,57,17,18,57,17,18,57,49,0,16,\n196,228,50,244,60,196,228,252,60,244,236,16,196,238,50,16,\n238,16,244,238,16,238,17,57,17,57,17,18,57,48,64,129,\n48,43,48,44,48,45,48,46,48,47,48,48,64,43,64,44,\n64,45,64,46,64,47,64,48,80,43,80,44,80,45,80,46,\n80,47,80,48,133,43,133,48,128,64,144,64,160,64,176,64,\n192,64,208,64,224,64,224,64,240,64,29,63,0,63,6,63,\n13,63,14,63,15,5,48,44,48,45,48,46,48,47,64,44,\n64,45,64,46,64,47,80,44,80,45,80,46,80,47,111,0,\n111,6,111,13,111,14,111,15,96,44,96,45,96,46,96,47,\n112,44,112,45,112,46,112,47,128,44,128,45,128,46,128,47,\n29,93,113,1,93,1,46,1,35,34,6,7,3,62,1,51,\n50,0,29,1,33,30,1,51,50,54,55,21,14,1,35,34,\n38,39,14,1,35,34,38,53,52,54,51,33,53,52,38,35,\n34,6,7,53,62,1,51,50,22,3,34,6,21,20,22,51,\n50,54,61,1,6,182,1,165,137,153,185,14,68,74,212,132,\n226,1,8,252,178,12,204,183,104,200,100,100,208,106,167,248,\n77,73,216,143,189,210,253,251,1,2,167,151,96,182,84,101,\n190,90,142,213,239,223,172,129,111,153,185,2,148,151,180,174,\n158,1,48,90,94,254,221,250,90,191,200,53,53,174,42,44,\n121,119,120,120,187,168,189,192,18,127,139,46,46,170,39,39,\n96,254,24,102,123,98,115,217,180,41,0,3,0,72,255,162,\n4,156,4,188,0,9,0,19,0,43,0,228,64,60,43,44,\n38,31,29,26,19,10,1,0,4,13,41,38,32,20,13,4,\n42,38,30,26,4,185,38,13,185,26,184,38,140,44,43,44,\n42,20,23,16,32,30,35,19,10,1,0,4,16,7,31,29,\n7,18,35,81,41,16,18,23,69,44,16,252,236,50,244,236,\n50,192,17,18,23,57,18,57,57,17,18,57,57,17,57,49,\n0,16,228,244,236,16,238,16,192,16,192,17,18,57,57,18,\n57,18,23,57,17,57,57,17,18,57,48,64,112,40,1,63,\n45,89,20,86,28,85,29,86,32,106,21,102,33,127,0,123,\n4,127,5,127,6,127,7,127,8,127,9,127,10,127,11,127,\n12,123,13,122,21,123,26,127,27,127,28,127,29,127,30,127,\n31,127,32,123,33,127,34,127,35,127,36,127,37,123,38,155,\n25,149,37,168,25,160,45,240,45,38,89,0,86,19,85,29,\n90,40,105,0,102,19,101,28,106,40,122,0,116,19,118,28,\n122,40,137,30,149,24,154,36,162,24,173,36,17,93,1,93,\n9,1,30,1,51,50,54,53,52,38,39,46,1,35,34,6,\n21,20,22,23,7,46,1,53,16,0,51,50,22,23,55,23,\n7,30,1,21,16,0,35,34,38,39,7,39,3,137,254,25,\n41,103,65,147,172,20,92,42,103,62,151,169,19,20,125,54,\n54,1,17,241,93,159,67,139,95,146,53,54,254,238,240,96,\n161,63,139,96,3,33,253,176,42,40,232,200,79,117,154,41,\n41,235,211,72,110,46,151,77,197,119,1,20,1,56,51,52,\n168,79,179,77,198,120,254,237,254,199,52,51,168,78,0,2,\n0,143,255,227,3,172,5,213,0,32,0,36,0,134,64,47,\n32,26,5,2,4,6,25,0,16,134,15,136,12,0,33,131,\n35,12,149,19,140,35,129,37,6,34,25,22,9,5,1,0,\n26,34,9,0,28,1,34,28,33,38,15,9,28,22,37,16,\n220,236,212,252,236,212,236,17,18,57,17,18,57,17,18,57,\n18,57,49,0,16,228,244,236,16,254,205,16,244,238,18,57,\n57,23,57,48,1,75,176,16,84,75,176,18,84,91,75,176,\n19,84,91,88,189,0,37,255,192,0,1,0,37,0,37,0,\n64,56,17,55,56,89,64,11,116,4,116,5,116,6,116,7,\n118,28,5,93,1,51,21,20,6,15,1,14,1,21,20,22,\n51,50,54,55,21,14,1,35,34,38,53,52,54,63,1,62,\n1,55,62,1,53,19,35,53,51,1,244,190,55,90,90,58,\n51,131,109,78,180,96,94,192,103,184,224,73,89,88,48,38,\n8,7,6,196,202,202,4,68,156,101,130,87,88,53,94,49,\n89,110,70,67,188,57,56,194,159,76,137,86,86,47,53,25,\n21,60,54,1,14,254,0,2,1,53,0,0,2,0,5,213,\n0,3,0,9,0,98,64,15,7,0,131,2,129,4,8,7,\n4,0,3,5,1,0,10,16,252,60,236,50,57,57,49,0,\n47,244,252,204,48,1,75,176,11,84,88,189,0,10,0,64,\n0,1,0,10,0,10,255,192,56,17,55,56,89,1,75,176,\n15,84,75,176,16,84,91,75,176,19,84,91,88,189,0,10,\n255,192,0,1,0,10,0,10,0,64,56,17,55,56,89,182,\n0,11,32,11,80,11,3,93,1,35,53,51,17,35,17,19,\n51,19,2,0,203,203,203,21,162,20,4,215,254,250,43,2,\n143,1,101,254,155,0,0,1,0,217,1,31,5,219,3,94,\n0,5,0,23,64,10,4,156,2,0,6,3,23,1,0,6,\n16,220,212,236,49,0,16,212,196,236,48,19,33,17,35,17,\n33,217,5,2,168,251,166,3,94,253,193,1,149,0,0,1,\n0,61,255,215,5,25,6,125,0,10,0,42,64,24,10,9,\n8,7,6,5,11,2,4,2,0,11,10,9,7,6,5,4,\n3,0,8,1,8,11,16,212,204,23,57,49,0,16,212,204,\n196,17,18,23,57,48,1,51,21,35,1,35,1,7,39,37,\n1,4,92,189,115,253,174,66,254,193,125,25,1,27,1,0,\n6,125,96,249,186,3,115,45,80,98,253,59,0,1,0,31,\n254,86,5,2,6,20,0,35,0,138,64,64,14,13,2,15,\n12,17,25,30,25,11,10,9,8,4,7,17,30,30,25,66,\n25,12,19,10,7,30,1,26,10,169,8,19,138,18,230,22,\n169,15,1,138,0,230,4,169,33,151,15,28,8,36,30,29,\n27,26,25,12,11,9,8,7,10,0,18,36,16,212,204,23,\n57,49,0,16,196,50,196,252,236,244,236,16,238,246,238,16,\n238,50,18,57,57,17,18,57,57,48,75,83,88,7,16,5,\n237,23,50,7,16,5,237,17,23,57,89,34,1,75,176,12,\n84,88,189,0,36,255,192,0,1,0,36,0,36,0,64,56,\n17,55,56,89,1,21,46,1,35,34,6,7,3,33,21,33,\n3,2,6,35,34,38,39,53,30,1,51,50,54,55,19,35,\n53,33,19,62,1,51,50,22,5,2,38,80,44,96,114,25,\n60,1,31,254,195,127,58,188,186,58,100,47,52,97,47,97,\n109,34,137,248,1,23,63,36,198,151,53,100,5,240,164,29,\n28,122,132,254,201,143,253,133,254,227,211,21,22,166,33,33,\n137,166,2,173,143,1,74,183,195,18,0,2,0,217,1,16,\n5,219,3,244,0,29,0,59,0,63,64,31,46,31,57,42,\n0,45,34,19,1,16,27,12,30,42,156,49,57,156,34,4,\n156,27,12,156,19,60,30,0,45,15,60,16,212,60,196,50,\n49,0,16,212,236,212,236,220,252,212,236,192,17,18,57,57,\n17,18,57,57,17,18,57,57,48,1,21,6,6,35,34,39,\n38,39,38,39,38,35,34,6,7,53,54,54,51,50,23,22,\n23,22,23,22,51,50,54,19,21,6,6,35,34,39,38,39,\n38,39,38,35,34,6,7,53,54,54,51,50,23,22,23,22,\n23,22,51,50,54,5,219,105,179,97,110,146,10,7,6,15,\n155,94,88,172,98,105,179,97,110,147,11,5,6,15,155,94,\n86,169,103,105,179,97,110,146,10,7,6,15,155,94,88,172,\n98,105,179,97,110,147,10,5,7,15,155,94,86,169,2,111,\n179,78,69,59,4,3,2,6,61,76,84,179,78,69,59,5,\n2,2,6,61,75,1,218,178,79,69,59,4,3,2,6,61,\n76,83,178,78,69,59,4,2,3,6,61,75,0,2,255,250,\n0,0,5,96,5,193,0,2,0,6,0,56,64,15,0,3,\n1,3,5,4,3,2,1,0,5,7,5,6,7,16,212,204,\n17,23,57,49,0,47,196,204,17,57,48,64,20,99,1,109,\n2,112,1,120,2,127,2,121,5,118,6,7,110,0,127,0,\n2,93,1,93,9,1,33,1,51,1,33,2,172,254,94,3,\n68,253,239,224,2,67,250,154,4,238,251,196,5,15,250,63,\n0,2,0,158,0,141,4,37,4,35,0,6,0,13,0,134,\n64,73,3,232,4,5,4,2,232,1,2,5,5,4,2,232,\n3,2,6,0,6,1,232,0,0,6,10,232,11,12,11,9,\n232,8,9,12,12,11,9,232,10,9,13,7,13,8,232,7,\n7,13,66,9,2,11,4,231,7,0,166,14,9,12,5,2,\n7,3,0,111,5,10,7,111,12,110,14,16,252,252,60,212,\n236,50,17,57,17,18,57,49,0,16,244,60,236,50,57,57,\n48,75,83,88,7,16,4,237,7,16,8,237,7,16,8,237,\n7,16,4,237,7,16,4,237,7,16,8,237,7,16,8,237,\n7,16,4,237,89,34,1,21,1,1,21,1,53,19,21,1,\n1,21,1,53,4,37,254,211,1,45,254,43,35,254,211,1,\n45,254,43,4,35,191,254,244,254,244,191,1,162,82,1,162,\n191,254,244,254,244,191,1,162,82,0,0,2,0,193,0,141,\n4,72,4,35,0,6,0,13,0,134,64,73,12,232,13,12,\n9,10,9,11,232,10,10,9,13,232,7,8,7,12,232,11,\n12,8,8,7,5,232,6,5,2,3,2,4,232,3,3,2,\n6,232,0,1,0,5,232,4,5,1,1,0,66,12,5,10,\n3,231,7,0,166,14,12,8,1,5,0,8,111,10,7,1,\n111,3,0,112,14,16,252,60,252,212,60,236,18,57,17,18,\n57,49,0,16,244,60,236,50,57,57,48,75,83,88,7,16,\n8,237,7,16,4,237,7,16,4,237,7,16,8,237,7,16,\n8,237,7,16,4,237,7,16,4,237,7,16,8,237,89,34,\n19,1,21,1,53,1,1,37,1,21,1,53,1,1,193,1,\n213,254,43,1,45,254,211,1,178,1,213,254,43,1,45,254,\n211,4,35,254,94,82,254,94,191,1,12,1,12,191,254,94,\n82,254,94,191,1,12,1,12,0,3,0,236,0,0,7,20,\n0,254,0,3,0,7,0,11,0,35,64,17,8,4,0,131,\n10,6,2,4,25,5,0,25,1,9,25,8,12,16,212,252,\n212,236,212,236,49,0,47,60,60,236,50,50,48,37,51,21,\n35,37,51,21,35,37,51,21,35,3,150,212,212,2,169,213,\n213,250,173,213,213,254,254,254,254,254,254,0,255,255,0,16,\n0,0,5,104,7,107,2,39,0,36,0,0,0,0,0,7,\n1,6,0,188,1,117,255,255,0,16,0,0,5,104,7,94,\n2,39,0,36,0,0,0,0,0,7,1,5,0,188,1,117,\n255,255,0,115,255,227,5,217,7,94,2,39,0,50,0,0,\n0,0,0,7,1,5,1,39,1,117,0,2,0,115,0,0,\n8,12,5,213,0,16,0,25,0,59,64,31,5,149,3,17,\n1,149,0,129,24,7,149,3,173,9,24,18,16,10,21,6,\n2,28,17,0,4,8,21,25,13,16,26,16,252,236,212,196,\n196,212,236,50,18,57,57,57,57,49,0,47,236,236,50,244,\n236,50,16,238,48,1,21,33,17,33,21,33,17,33,21,33,\n32,0,17,16,0,33,23,35,32,0,17,16,0,33,51,7,\n250,253,26,2,199,253,57,2,248,251,215,254,79,254,65,1,\n191,1,177,103,129,254,191,254,192,1,64,1,65,129,5,213,\n170,254,70,170,253,227,170,1,124,1,112,1,109,1,124,170,\n254,225,254,224,254,223,254,223,0,3,0,113,255,227,7,195,\n4,123,0,6,0,39,0,51,0,132,64,49,7,8,0,16,\n134,15,136,12,0,169,8,46,12,185,22,19,40,3,185,8,\n187,34,37,31,184,25,19,140,52,6,0,22,34,49,9,15,\n0,8,7,75,49,18,9,81,43,18,28,69,52,16,252,236,\n244,252,244,236,196,17,18,57,57,18,57,49,0,16,228,50,\n244,60,196,228,236,50,16,196,238,50,16,238,16,244,238,17,\n18,57,48,64,37,63,53,95,53,112,53,159,53,207,53,208,\n53,240,53,7,63,0,63,6,63,7,63,8,63,9,5,111,\n0,111,6,111,7,111,8,111,9,5,93,113,1,93,1,46,\n1,35,34,6,7,5,21,33,30,1,51,50,54,55,21,14,\n1,35,34,38,39,14,1,35,34,0,17,16,0,51,50,22,\n23,62,1,51,50,0,37,34,6,21,20,22,51,50,54,53,\n52,38,7,10,2,164,137,153,185,14,3,72,252,178,12,204,\n183,106,200,98,100,208,106,160,242,81,71,209,140,241,254,239,\n1,17,241,140,211,66,78,232,143,226,1,8,250,176,148,172,\n171,149,147,172,172,2,148,152,179,174,158,53,90,190,199,52,\n52,174,42,44,110,109,110,109,1,57,1,19,1,20,1,56,\n111,108,107,112,254,221,135,231,201,201,231,232,200,199,233,0,\n0,1,0,0,1,233,4,0,2,121,0,3,0,16,182,2,\n169,0,233,4,1,0,47,198,49,0,16,252,236,48,17,33,\n21,33,4,0,252,0,2,121,144,0,0,1,0,0,1,233,\n8,0,2,121,0,3,0,15,181,2,169,0,4,1,0,47,\n204,49,0,16,212,236,48,17,33,21,33,8,0,248,0,2,\n121,144,0,2,0,174,3,233,3,109,5,213,0,5,0,11,\n0,39,64,19,6,0,158,9,3,129,12,9,10,6,25,7,\n3,4,7,0,25,1,12,16,220,252,204,212,204,16,254,212,\n206,49,0,16,244,60,236,50,48,1,35,53,19,51,3,5,\n35,53,19,51,3,1,129,211,164,129,82,1,154,211,164,129,\n82,3,233,173,1,63,254,193,173,173,1,63,254,193,0,2,\n0,174,3,233,3,109,5,213,0,5,0,11,0,39,64,19,\n9,3,158,6,0,129,12,9,10,7,25,6,1,3,4,1,\n25,0,12,16,220,236,212,204,16,220,238,212,206,49,0,16,\n244,60,236,50,48,1,51,21,3,35,19,37,51,21,3,35,\n19,1,0,211,164,129,82,1,154,211,164,129,82,5,213,172,\n254,192,1,64,172,172,254,192,1,64,0,1,0,174,3,233,\n1,211,5,213,0,5,0,24,64,11,0,158,3,129,6,3,\n4,0,25,1,6,16,220,252,212,204,49,0,16,244,236,48,\n1,35,53,19,51,3,1,129,211,164,129,82,3,233,173,1,\n63,254,193,0,0,1,0,178,3,254,1,215,5,213,0,5,\n0,24,64,11,3,158,0,129,6,3,4,1,113,0,6,16,\n220,236,212,204,49,0,16,244,236,48,1,51,21,3,35,19,\n1,4,211,164,129,82,5,213,152,254,193,1,63,0,0,3,\n0,217,0,150,5,219,4,111,0,3,0,7,0,11,0,41,\n64,20,0,234,2,6,234,4,2,8,156,4,10,12,9,5,\n1,114,4,0,8,12,16,220,212,60,252,60,196,49,0,16,\n212,196,252,196,16,238,16,238,48,1,51,21,35,17,51,21,\n35,1,33,21,33,2,223,246,246,246,246,253,250,5,2,250,\n254,4,111,246,254,18,245,2,65,170,0,2,0,6,254,35,\n3,238,6,117,0,3,0,7,0,34,64,17,2,6,0,8,\n4,6,8,6,4,3,2,1,0,6,5,7,8,16,212,204,\n23,57,49,0,16,212,204,17,57,18,57,48,9,7,1,250,\n254,127,1,129,1,129,254,127,1,244,254,12,254,12,5,129,\n252,207,252,199,3,57,4,37,251,219,251,211,4,45,255,255,\n0,61,254,86,4,127,6,16,2,39,0,92,0,0,0,0,\n0,7,0,142,0,94,0,0,255,255,255,252,0,0,4,231,\n7,78,2,39,0,60,0,0,0,0,0,7,1,3,0,115,\n1,117,0,1,254,137,255,227,2,205,5,240,0,3,0,43,\n64,19,0,15,1,2,1,2,15,3,0,3,66,2,140,0,\n145,4,1,3,4,16,212,204,49,0,16,228,228,48,75,83,\n88,7,16,5,237,7,16,5,237,89,34,1,51,1,35,2,\n45,160,252,92,160,5,240,249,243,0,0,2,0,94,0,82,\n4,188,4,178,0,35,0,47,0,131,64,73,3,9,27,21,\n4,45,30,0,39,28,2,33,29,12,18,45,20,11,10,3,\n19,15,1,29,45,185,19,235,15,236,39,185,29,235,33,48,\n30,12,0,18,4,42,36,20,48,28,21,27,42,29,19,28,\n24,9,3,36,11,10,1,3,2,36,40,2,115,6,116,42,\n40,28,115,24,48,16,220,228,236,244,228,236,18,23,57,18,\n57,57,17,18,57,57,18,57,57,17,18,57,17,18,23,57,\n49,0,16,212,228,236,244,228,236,16,192,17,18,23,57,18,\n57,57,17,18,57,57,17,57,57,18,23,57,48,1,55,23,\n7,22,22,21,20,6,7,23,7,39,6,6,35,34,38,39,\n7,39,55,38,38,53,52,54,55,39,55,23,54,54,51,50,\n22,19,52,38,35,34,6,21,20,22,51,50,54,3,123,207,\n114,206,37,36,38,40,209,114,207,59,116,61,58,120,61,207,\n113,207,37,37,38,38,207,115,207,55,116,64,60,117,92,155,\n114,112,158,157,113,113,156,3,225,209,115,206,59,119,62,63,\n115,57,207,113,207,40,38,37,37,207,115,206,62,118,58,64,\n116,56,206,115,207,39,37,36,254,124,112,154,154,112,114,156,\n157,0,0,1,0,158,0,141,2,115,4,35,0,6,0,71,\n64,37,3,232,4,5,4,2,232,1,2,5,5,4,2,232,\n3,2,6,0,6,1,232,0,6,66,2,4,231,0,166,7,\n2,3,0,111,5,110,7,16,252,236,50,57,49,0,16,244,\n236,57,48,75,83,88,7,4,237,7,16,8,237,7,16,8,\n237,7,16,4,237,89,34,1,21,1,1,21,1,53,2,115,\n254,211,1,45,254,43,4,35,191,254,244,254,244,191,1,162,\n82,0,0,1,0,193,0,141,2,150,4,35,0,6,0,73,\n64,38,5,232,6,5,2,3,2,4,232,3,3,2,6,232,\n0,1,0,5,232,4,5,1,1,0,66,5,3,231,0,166,\n7,5,1,111,3,0,112,7,16,252,60,236,57,49,0,16,\n244,236,57,48,75,83,88,7,16,8,237,7,16,4,237,7,\n16,4,237,7,16,8,237,89,34,19,1,21,1,53,1,1,\n193,1,213,254,43,1,45,254,211,4,35,254,94,82,254,94,\n191,1,12,1,12,0,0,2,0,47,0,0,4,74,6,20,\n0,21,0,25,0,155,64,40,11,20,24,7,3,169,0,16,\n135,14,24,190,22,177,14,151,9,0,188,5,1,17,14,15,\n4,22,2,8,0,15,20,4,8,8,23,0,10,6,76,26,\n16,252,60,196,50,196,252,60,196,16,238,50,17,18,57,57,\n49,0,47,60,230,50,238,254,238,16,238,16,238,50,18,57,\n57,48,1,75,176,10,84,88,189,0,26,255,192,0,1,0,\n26,0,26,0,64,56,17,55,56,89,1,75,176,14,84,88,\n189,0,26,0,64,0,1,0,26,0,26,255,192,56,17,55,\n56,89,64,26,16,22,16,23,16,24,16,25,4,48,27,80,\n27,128,15,128,16,128,27,160,27,208,27,239,27,8,93,0,\n93,1,17,35,17,33,17,35,17,35,53,51,53,52,54,59,\n1,21,35,34,6,29,1,1,51,21,35,4,74,185,254,7,\n185,176,176,173,179,185,176,99,77,1,249,185,185,4,96,251,\n160,3,209,252,47,3,209,143,78,183,175,153,80,104,99,1,\n178,233,0,1,0,47,0,0,4,74,6,20,0,21,0,132,\n64,33,8,19,4,15,11,169,9,4,135,0,151,17,9,188,\n13,2,5,0,10,8,3,8,1,10,12,8,8,16,1,18,\n14,76,22,16,252,60,196,196,252,60,196,16,238,17,18,57,\n57,49,0,47,60,230,50,254,238,16,238,50,18,57,57,48,\n1,75,176,10,84,88,189,0,22,255,192,0,1,0,22,0,\n22,0,64,56,17,55,56,89,1,75,176,14,84,88,189,0,\n22,0,64,0,1,0,22,0,22,255,192,56,17,55,56,89,\n64,17,48,23,80,23,128,10,128,11,128,23,160,23,208,23,\n239,23,8,93,1,33,17,35,17,33,34,6,29,1,33,21,\n33,17,35,17,35,53,51,53,52,54,2,74,2,0,185,254,\n183,99,77,1,47,254,209,185,176,176,174,6,20,249,236,5,\n123,80,104,99,143,252,47,3,209,143,78,187,171,0,0,1,\n0,57,255,59,3,199,5,213,0,19,0,62,64,32,18,6,\n185,0,16,8,185,10,4,0,2,14,10,12,129,2,194,20,\n15,0,89,17,13,1,87,9,5,89,11,7,3,20,16,212,\n60,60,236,50,252,60,60,236,50,49,0,16,228,244,196,50,\n16,196,50,16,238,50,16,238,50,48,37,33,17,35,17,33,\n53,33,17,33,53,33,17,51,17,33,21,33,17,33,3,199,\n254,145,176,254,145,1,111,254,145,1,111,176,1,111,254,145,\n1,111,223,254,92,1,164,154,2,31,153,1,164,254,92,153,\n253,225,0,1,0,219,2,72,1,174,3,70,0,3,0,18,\n183,2,131,0,4,1,25,0,4,16,212,236,49,0,16,212,\n236,48,19,51,21,35,219,211,211,3,70,254,0,1,0,174,\n255,18,1,211,0,254,0,5,0,24,64,11,3,158,0,131,\n6,3,4,1,25,0,6,16,212,236,212,204,49,0,16,252,\n236,48,37,51,21,3,35,19,1,0,211,164,129,82,254,172,\n254,192,1,64,0,2,0,174,255,18,3,109,0,254,0,5,\n0,11,0,39,64,19,9,3,158,6,0,131,12,3,4,1,\n25,0,7,9,10,7,25,6,12,16,220,236,212,204,16,220,\n238,212,206,49,0,16,252,60,236,50,48,37,51,21,3,35,\n19,37,51,21,3,35,19,2,154,211,164,129,82,254,102,211,\n164,129,82,254,172,254,192,1,64,172,172,254,192,1,64,0,\n0,7,0,113,255,227,10,76,5,240,0,11,0,23,0,35,\n0,39,0,51,0,63,0,75,0,174,64,68,36,15,37,38,\n37,38,15,39,36,39,66,64,0,146,12,46,146,30,141,40,\n146,24,70,6,146,52,12,141,58,38,18,140,36,24,145,76,\n37,73,67,39,49,43,67,13,61,9,13,15,14,3,13,21,\n49,13,27,61,14,73,13,21,55,43,13,27,14,33,11,76,\n16,252,228,236,212,196,236,228,16,238,16,238,246,238,16,238,\n17,18,57,17,18,57,49,0,16,228,50,244,60,60,228,50,\n236,50,16,238,246,238,16,238,50,48,75,83,88,7,16,5,\n237,7,16,5,237,89,34,1,75,176,20,84,75,176,9,84,\n91,75,176,11,84,91,75,176,12,84,91,75,176,13,84,91,\n75,176,14,84,91,88,189,0,76,0,64,0,1,0,76,0,\n76,255,192,56,17,55,56,89,1,34,6,21,20,22,51,50,\n54,53,52,38,39,50,22,21,20,6,35,34,38,53,52,54,\n1,50,22,21,20,6,35,34,38,53,52,54,33,51,1,35,\n19,34,6,21,20,22,51,50,54,53,52,38,1,50,22,21,\n20,6,35,34,38,53,52,54,23,34,6,21,20,22,51,50,\n54,53,52,38,8,244,87,100,100,87,85,99,99,85,158,186,\n187,157,160,186,187,249,116,158,188,187,159,159,185,186,4,37,\n160,252,90,160,31,86,99,98,87,87,99,100,3,178,158,186,\n187,157,160,186,187,159,87,99,99,87,85,99,99,2,145,148,\n132,130,149,149,130,131,149,127,220,187,187,219,219,187,188,219,\n2,224,219,187,189,218,219,188,186,220,249,243,5,142,149,130,\n132,148,148,132,129,150,253,159,220,187,187,219,219,187,188,219,\n127,148,132,130,149,149,130,131,149,0,255,255,0,16,0,0,\n5,104,7,109,2,39,0,36,0,0,0,0,0,7,1,7,\n0,188,1,117,255,255,0,201,0,0,4,139,7,109,2,39,\n0,40,0,0,0,0,0,7,1,7,0,158,1,117,255,255,\n0,16,0,0,5,104,7,107,2,39,0,36,0,0,0,0,\n0,7,1,4,0,188,1,117,255,255,0,201,0,0,4,139,\n7,78,2,39,0,40,0,0,0,0,0,7,1,3,0,158,\n1,117,255,255,0,201,0,0,4,139,7,107,2,39,0,40,\n0,0,0,0,0,7,1,6,0,158,1,117,255,255,0,162,\n0,0,2,31,7,107,2,39,0,44,0,0,0,0,0,7,\n1,4,255,47,1,117,255,255,255,254,0,0,2,96,7,109,\n2,39,0,44,0,0,0,0,0,7,1,7,255,47,1,117,\n255,255,0,6,0,0,2,88,7,78,2,39,0,44,0,0,\n0,0,0,7,1,3,255,47,1,117,255,255,0,59,0,0,\n1,186,7,107,2,39,0,44,0,0,0,0,0,7,1,6,\n255,47,1,117,255,255,0,115,255,227,5,217,7,107,2,39,\n0,50,0,0,0,0,0,7,1,4,1,39,1,117,255,255,\n0,115,255,227,5,217,7,109,2,39,0,50,0,0,0,0,\n0,7,1,7,1,39,1,117,255,255,0,115,255,227,5,217,\n7,107,2,39,0,50,0,0,0,0,0,7,1,6,1,39,\n1,117,255,255,0,178,255,227,5,41,7,107,2,39,0,56,\n0,0,0,0,0,7,1,4,0,238,1,117,255,255,0,178,\n255,227,5,41,7,109,2,39,0,56,0,0,0,0,0,7,\n1,7,0,238,1,117,255,255,0,178,255,227,5,41,7,107,\n2,39,0,56,0,0,0,0,0,7,1,6,0,238,1,117,\n0,1,0,193,0,0,1,121,4,96,0,3,0,32,183,0,\n191,2,1,8,0,70,4,16,252,236,49,0,47,236,48,64,\n11,16,5,64,5,80,5,96,5,112,5,5,1,93,19,51,\n17,35,193,184,184,4,96,251,160,0,0,1,0,193,4,238,\n3,63,6,102,0,6,0,55,64,12,4,5,2,180,0,179,\n7,4,2,117,6,7,16,220,236,57,49,0,16,244,236,50,\n57,48,0,75,176,9,84,75,176,14,84,91,88,189,0,7,\n255,192,0,1,0,7,0,7,0,64,56,17,55,56,89,1,\n51,19,35,39,7,35,1,182,148,245,139,180,180,139,6,102,\n254,136,245,245,0,1,0,182,5,29,3,74,6,55,0,27,\n0,99,64,36,0,18,7,14,11,4,1,18,7,15,11,4,\n18,195,25,7,4,195,21,11,237,28,15,1,14,0,7,21,\n86,22,119,7,86,8,118,28,16,244,236,252,236,17,57,57,\n57,57,49,0,16,252,60,252,212,60,236,17,18,57,17,18,\n57,17,18,57,17,18,57,48,0,75,176,9,84,75,176,12,\n84,91,88,189,0,28,255,192,0,1,0,28,0,28,0,64,\n56,17,55,56,89,1,39,46,1,35,34,6,7,35,62,1,\n51,50,22,31,1,30,1,51,50,54,55,51,14,1,35,34,\n38,1,252,57,22,33,13,38,36,2,125,2,102,91,38,64,\n37,57,22,33,13,38,36,2,125,2,102,91,38,64,5,90,\n55,20,19,73,82,135,147,28,33,55,20,19,73,82,135,147,\n28,0,0,1,0,213,5,98,3,43,5,246,0,3,0,47,\n183,2,239,0,238,4,1,0,4,16,212,204,49,0,16,252,\n236,48,0,75,176,9,84,75,176,14,84,91,88,189,0,4,\n255,192,0,1,0,4,0,4,0,64,56,17,55,56,89,19,\n33,21,33,213,2,86,253,170,5,246,148,0,0,1,0,199,\n5,41,3,57,6,72,0,13,0,87,64,14,11,240,4,7,\n0,179,14,7,86,8,1,86,0,14,16,220,236,212,236,49,\n0,16,244,60,212,236,48,0,75,176,9,84,88,189,0,14,\n255,192,0,1,0,14,0,14,0,64,56,17,55,56,89,0,\n75,176,15,84,75,176,16,84,91,75,176,17,84,91,88,189,\n0,14,0,64,0,1,0,14,0,14,255,192,56,17,55,56,\n89,19,51,30,1,51,50,54,55,51,14,1,35,34,38,199,\n118,11,97,87,86,96,13,118,10,158,145,145,158,6,72,75,\n75,74,76,143,144,144,0,1,1,154,5,68,2,102,6,16,\n0,3,0,44,64,9,2,206,0,205,4,1,100,0,4,16,\n212,236,49,0,16,252,236,48,0,75,176,9,84,88,189,0,\n4,255,192,0,1,0,4,0,4,0,64,56,17,55,56,89,\n1,51,21,35,1,154,204,204,6,16,204,0,0,2,0,238,\n4,225,3,18,7,6,0,11,0,23,0,95,64,17,3,193,\n21,242,9,193,15,241,24,0,86,12,120,6,86,18,24,16,\n212,236,244,236,49,0,16,244,236,244,236,48,0,75,176,9,\n84,75,176,12,84,91,88,189,0,24,255,192,0,1,0,24,\n0,24,0,64,56,17,55,56,89,1,75,176,10,84,75,176,\n11,84,91,75,176,12,84,91,88,189,0,24,255,192,0,1,\n0,24,0,24,0,64,56,17,55,56,89,1,52,38,35,34,\n6,21,20,22,51,50,54,55,20,6,35,34,38,53,52,54,\n51,50,22,2,152,88,64,65,87,87,65,64,88,122,159,115,\n115,159,159,115,115,159,5,244,63,88,87,64,65,87,88,64,\n115,160,160,115,115,159,159,0,0,1,1,35,254,117,2,193,\n0,0,0,19,0,31,64,14,9,6,10,13,243,6,0,19,\n0,16,39,3,9,20,16,220,212,236,212,204,49,0,47,212,\n252,196,18,57,48,33,22,22,21,20,6,35,34,38,39,53,\n22,22,51,50,54,53,52,38,39,2,84,55,54,120,118,46,\n87,43,34,74,47,59,60,43,45,62,105,48,89,91,12,12,\n131,17,15,48,46,30,87,61,0,2,0,240,4,238,3,174,\n6,102,0,3,0,7,0,66,64,17,6,2,180,4,0,179,\n8,4,7,3,0,5,1,3,5,7,8,16,212,220,212,204,\n17,57,17,18,57,49,0,16,244,60,236,50,48,0,75,176,\n9,84,75,176,14,84,91,88,189,0,8,255,192,0,1,0,\n8,0,8,0,64,56,17,55,56,89,1,51,3,35,3,51,\n3,35,2,252,178,248,135,129,170,223,137,6,102,254,136,1,\n120,254,136,0,0,1,1,76,254,117,2,193,0,0,0,19,\n0,32,64,15,11,14,10,7,243,14,244,0,1,0,10,4,\n39,17,20,16,212,236,196,212,204,49,0,47,252,252,196,18,\n57,48,33,51,6,6,21,20,22,51,50,54,55,21,6,6,\n35,34,38,53,52,54,1,184,119,45,43,55,54,32,62,31,\n38,68,30,122,115,53,61,88,31,46,46,15,15,133,10,10,\n87,93,48,105,0,1,0,193,4,238,3,63,6,102,0,6,\n0,55,64,12,3,0,180,4,1,179,7,3,5,117,1,7,\n16,220,236,57,49,0,16,244,60,236,57,48,0,75,176,9,\n84,75,176,14,84,91,88,189,0,7,255,192,0,1,0,7,\n0,7,0,64,56,17,55,56,89,1,3,51,23,55,51,3,\n1,182,245,139,180,180,139,245,4,238,1,120,245,245,254,136,\n0,1,255,242,0,0,4,117,5,213,0,13,0,63,64,30,\n12,11,10,4,3,2,6,0,6,149,0,129,8,3,4,1,\n11,14,0,4,5,1,28,12,7,58,9,0,121,14,16,244,\n60,236,196,252,60,196,17,18,57,17,18,57,49,0,47,228,\n236,17,23,57,48,180,48,15,80,15,2,1,93,19,51,17,\n37,23,1,17,33,21,33,17,7,39,55,211,203,1,57,80,\n254,119,2,215,252,94,148,77,225,5,213,253,152,219,111,254,\n238,253,227,170,2,59,106,110,158,0,0,1,0,2,0,0,\n2,72,6,20,0,11,0,94,64,26,10,9,8,4,3,2,\n6,0,151,6,3,4,1,9,10,0,4,122,5,1,8,10,\n122,7,0,12,16,212,60,228,252,60,228,17,18,57,17,18,\n57,49,0,47,236,23,57,48,1,75,176,16,84,88,189,0,\n12,0,64,0,1,0,12,0,12,255,192,56,17,55,56,89,\n64,19,16,13,64,13,80,13,96,13,115,4,122,10,112,13,\n224,13,240,13,9,93,19,51,17,55,23,7,17,35,17,7,\n39,55,199,184,125,76,201,184,123,74,197,6,20,253,166,90,\n106,141,252,227,2,154,88,106,141,0,255,255,0,135,255,227,\n4,162,7,109,2,39,0,54,0,0,0,0,0,7,1,8,\n0,139,1,117,255,255,0,111,255,227,3,199,6,102,2,39,\n0,86,0,0,0,0,0,7,0,224,0,23,0,0,255,255,\n0,92,0,0,5,31,7,109,2,39,0,61,0,0,0,0,\n0,7,1,8,0,190,1,117,255,255,0,88,0,0,3,219,\n6,102,2,39,0,93,0,0,0,0,0,7,0,224,0,27,\n0,0,0,2,1,4,254,162,1,174,5,152,0,3,0,7,\n0,28,64,13,1,245,0,4,245,5,8,4,0,5,6,2,\n8,16,220,60,236,50,49,0,16,212,236,212,236,48,1,17,\n35,17,19,17,35,17,1,174,170,170,170,1,152,253,10,2,\n246,4,0,253,10,2,246,0,0,2,0,10,0,0,5,186,\n5,213,0,12,0,25,0,103,64,32,16,9,169,11,13,149,\n0,129,18,149,14,11,7,7,1,25,19,4,15,13,22,25,\n4,50,10,17,13,28,8,0,121,26,16,244,60,236,50,196,\n244,236,16,196,23,57,49,0,47,198,50,238,246,238,16,238,\n50,48,64,40,32,27,127,27,176,27,3,159,9,159,10,159,\n11,159,12,159,14,159,15,159,16,159,17,191,9,191,10,191,\n11,191,12,191,14,191,15,191,16,191,17,16,93,1,93,19,\n33,32,0,17,16,0,41,1,17,35,53,51,19,17,33,21,\n33,17,51,32,0,17,16,0,33,211,1,160,1,177,1,150,\n254,105,254,80,254,96,201,201,203,1,80,254,176,243,1,53,\n1,31,254,225,254,203,5,213,254,151,254,128,254,126,254,150,\n2,188,144,1,227,254,29,144,253,234,1,24,1,46,1,44,\n1,23,0,2,0,113,255,227,4,117,6,20,0,14,0,40,\n1,39,64,94,37,123,38,37,30,35,30,36,123,35,35,30,\n15,123,35,30,40,123,39,40,30,35,30,38,39,40,39,37,\n36,37,40,40,39,34,35,34,31,32,31,33,32,32,31,66,\n40,39,38,37,34,33,32,31,8,35,30,3,15,35,3,185,\n27,9,185,21,140,27,35,177,41,38,39,18,12,33,32,24,\n40,37,35,34,31,5,30,15,6,12,18,18,81,6,18,24,\n69,41,16,252,236,244,236,17,57,57,23,57,18,57,57,17,\n18,57,57,49,0,16,236,196,244,236,16,238,18,57,18,57,\n18,23,57,48,75,83,88,7,16,14,201,7,16,8,201,7,\n16,8,201,7,16,14,201,7,16,8,237,7,14,237,7,16,\n5,237,7,16,8,237,89,34,178,63,42,1,1,93,64,118,\n22,37,43,31,40,34,47,35,47,36,41,37,45,38,45,39,\n42,40,54,37,70,37,88,32,88,33,96,32,96,33,102,34,\n117,32,117,33,117,34,19,37,35,37,36,38,38,38,39,39,\n40,54,36,54,37,70,36,69,37,90,32,90,33,98,32,98,\n33,127,0,127,1,127,2,122,3,123,9,127,10,127,11,127,\n12,127,13,127,14,127,15,127,16,127,17,127,18,127,19,127,\n20,123,21,122,27,122,28,127,29,127,30,118,32,118,33,120,\n34,160,42,240,42,39,93,0,93,1,46,1,35,34,6,21,\n20,22,51,50,54,53,52,38,19,22,18,21,20,0,35,34,\n0,53,52,0,51,50,22,23,39,5,39,37,39,51,23,37,\n23,5,3,70,50,88,41,167,185,174,146,145,174,54,9,126,\n114,254,228,230,231,254,229,1,20,221,18,52,42,159,254,193,\n33,1,25,181,228,127,1,77,33,254,217,3,147,17,16,216,\n195,188,222,222,188,122,188,1,38,143,254,224,173,255,254,201,\n1,55,255,250,1,55,5,5,180,107,99,92,204,145,111,97,\n98,0,255,255,255,252,0,0,4,231,7,107,2,39,0,60,\n0,0,0,0,0,7,1,4,0,115,1,117,255,255,0,61,\n254,86,4,127,6,102,2,39,0,92,0,0,0,0,0,7,\n0,141,0,94,0,0,0,2,0,201,0,0,4,141,5,213,\n0,12,0,21,0,61,64,27,14,149,9,13,149,2,246,0,\n129,11,21,15,9,3,4,1,18,25,6,63,13,10,1,28,\n0,4,22,16,252,236,50,50,252,236,17,23,57,49,0,47,\n244,252,236,212,236,48,64,9,15,23,31,23,63,23,95,23,\n4,1,93,19,51,17,51,50,4,21,20,4,43,1,17,35,\n19,17,51,50,54,53,52,38,35,201,202,254,251,1,1,254,\n255,251,254,202,202,254,141,154,153,142,5,213,254,248,225,220,\n220,226,254,174,4,39,253,209,146,134,134,145,0,2,0,186,\n254,86,4,164,6,20,0,16,0,28,0,62,64,27,20,185,\n5,8,26,185,0,14,140,8,184,1,189,3,151,29,17,18,\n11,71,23,4,0,8,2,70,29,16,252,236,50,50,244,236,\n49,0,16,236,228,228,244,196,236,16,198,238,48,64,9,96,\n30,128,30,160,30,224,30,4,1,93,37,17,35,17,51,17,\n62,1,51,50,18,17,16,2,35,34,38,1,52,38,35,34,\n6,21,20,22,51,50,54,1,115,185,185,58,177,123,204,255,\n255,204,123,177,2,56,167,146,146,167,167,146,146,167,168,253,\n174,7,190,253,162,100,97,254,188,254,248,254,248,254,188,97,\n1,235,203,231,231,203,203,231,231,0,0,1,0,217,2,45,\n5,219,2,215,0,3,0,17,182,0,156,2,4,1,0,4,\n16,212,196,49,0,16,212,236,48,19,33,21,33,217,5,2,\n250,254,2,215,170,0,0,1,1,25,0,63,5,156,4,197,\n0,11,0,133,64,77,10,156,11,10,7,8,7,9,156,8,\n8,7,4,156,3,4,7,7,6,5,156,6,7,6,4,156,\n5,4,1,2,1,3,156,2,2,1,11,156,0,1,0,10,\n156,9,10,1,1,0,66,10,8,7,6,4,2,1,0,8,\n5,3,11,9,12,11,10,9,7,5,4,3,1,8,2,0,\n8,6,12,16,212,60,204,50,23,57,49,0,16,212,60,204,\n50,23,57,48,75,83,88,7,16,8,237,7,16,5,237,7,\n16,5,237,7,16,8,237,7,16,5,237,7,16,8,237,7,\n16,5,237,7,16,8,237,89,34,9,2,7,1,1,39,1,\n1,55,1,1,5,156,254,55,1,201,119,254,53,254,53,118,\n1,200,254,56,118,1,203,1,203,4,76,254,53,254,55,121,\n1,203,254,53,121,1,201,1,203,121,254,53,1,203,0,1,\n0,137,2,156,2,197,5,223,0,10,0,44,64,24,7,0,\n221,9,3,221,4,2,221,9,247,5,145,11,8,124,6,93,\n3,124,1,124,0,11,16,220,244,228,252,228,49,0,16,244,\n236,236,212,236,16,238,50,48,19,51,17,7,53,55,51,17,\n51,21,33,156,204,223,230,137,205,253,215,3,10,2,99,41,\n116,39,253,43,110,0,0,1,0,94,2,156,2,180,5,240,\n0,24,0,74,64,36,0,125,6,4,0,23,125,6,6,4,\n66,4,2,0,14,221,15,0,221,2,247,11,221,15,18,145,\n25,0,14,8,126,1,21,14,3,25,16,220,196,212,196,236,\n17,57,49,0,16,244,196,236,252,236,16,238,17,18,57,48,\n75,83,88,7,16,5,237,23,50,7,5,237,89,34,1,33,\n21,33,53,54,55,0,53,52,38,35,34,6,7,53,54,54,\n51,50,22,21,20,1,6,1,12,1,168,253,170,34,63,1,\n88,104,85,52,122,72,77,133,57,145,174,254,181,56,3,14,\n114,110,31,56,1,49,94,66,81,35,35,123,28,28,132,108,\n139,254,228,48,0,1,0,98,2,141,2,205,5,240,0,40,\n0,72,64,39,0,21,19,10,221,9,31,221,32,19,221,21,\n13,221,9,248,6,247,28,221,32,248,35,145,41,22,19,0,\n20,25,126,38,16,126,3,20,31,9,41,16,220,196,196,212,\n236,212,236,17,57,57,57,49,0,16,244,228,236,252,228,236,\n212,236,16,238,16,238,17,18,57,48,1,22,22,21,20,6,\n35,34,38,39,53,22,22,51,50,54,53,52,38,35,35,53,\n51,50,54,53,52,38,35,34,6,7,53,54,54,51,50,22,\n21,20,6,2,12,92,101,190,177,57,125,70,52,119,67,109,\n120,111,108,86,94,94,97,100,95,40,102,81,73,128,55,144,\n169,90,4,96,18,109,82,124,134,21,20,121,27,26,79,70,\n74,76,108,63,60,58,61,18,23,115,17,18,118,99,69,96,\n255,255,0,137,255,227,7,127,5,240,0,39,0,240,0,0,\n0,0,0,39,0,188,3,53,0,0,0,7,1,9,4,139,\n253,100,255,255,0,137,255,227,7,63,5,240,0,39,0,240,\n0,0,0,0,0,39,0,188,3,53,0,0,0,7,0,241,\n4,139,253,100,255,255,0,98,255,227,7,127,5,240,0,39,\n0,242,0,0,0,0,0,39,0,188,3,53,0,0,0,7,\n1,9,4,139,253,100,255,255,0,115,255,227,5,139,7,109,\n2,39,0,42,0,0,0,0,0,7,1,10,1,27,1,117,\n255,255,0,113,254,86,4,90,6,72,2,39,0,74,0,0,\n0,0,0,7,0,218,0,139,0,0,255,255,0,201,0,0,\n1,149,7,80,2,39,0,44,0,0,0,0,0,7,1,11,\n255,47,1,117,255,255,0,135,254,117,4,162,5,240,2,39,\n0,54,0,0,0,0,0,7,0,221,0,139,0,0,255,255,\n0,111,254,117,3,199,4,123,2,39,0,86,0,0,0,0,\n0,7,0,221,0,23,0,0,255,255,0,115,255,227,5,39,\n7,107,2,39,0,38,0,0,0,0,0,7,1,4,1,45,\n1,117,255,255,0,113,255,227,3,231,6,102,2,39,0,70,\n0,0,0,0,0,7,0,141,0,137,0,0,255,255,0,115,\n255,227,5,39,7,109,2,39,0,38,0,0,0,0,0,7,\n1,8,1,45,1,117,255,255,0,113,255,227,3,231,6,102,\n2,39,0,70,0,0,0,0,0,7,0,224,0,137,0,0,\n0,2,0,113,255,227,4,244,6,20,0,24,0,36,0,74,\n64,36,7,3,211,9,1,249,34,185,0,22,28,185,13,16,\n140,22,184,5,151,11,2,31,12,4,3,0,8,8,10,6,\n71,25,18,19,69,37,16,252,236,244,60,196,252,23,60,196,\n49,0,47,236,228,244,196,236,16,196,238,253,60,238,50,48,\n182,96,38,128,38,160,38,3,1,93,1,17,33,53,33,53,\n51,21,51,21,35,17,35,53,14,1,35,34,2,17,16,18,\n51,50,22,1,20,22,51,50,54,53,52,38,35,34,6,3,\n162,254,186,1,70,184,154,154,184,58,177,124,203,255,255,203,\n124,177,253,199,167,146,146,168,168,146,146,167,3,182,1,78,\n125,147,147,125,250,252,168,100,97,1,68,1,8,1,8,1,\n68,97,254,21,203,231,231,203,203,231,231,0,0,1,0,100,\n1,223,2,127,2,131,0,3,0,17,182,0,156,2,4,1,\n0,4,16,220,204,49,0,16,212,236,48,19,33,21,33,100,\n2,27,253,229,2,131,164,0,0,1,0,219,2,72,1,174,\n3,70,0,3,0,18,183,2,131,0,4,1,25,0,4,16,\n212,236,49,0,16,212,236,48,19,51,21,35,219,211,211,3,\n70,254,0,1,0,0,255,227,4,143,5,240,0,49,1,28,\n64,58,32,18,211,34,16,43,7,211,9,25,161,26,174,22,\n149,29,1,161,0,174,4,149,47,145,29,140,41,9,50,43,\n34,33,41,35,38,18,16,10,3,13,9,17,8,44,32,38,\n19,7,17,8,17,13,28,25,0,38,42,33,47,60,212,196,\n50,252,196,196,18,57,57,18,57,57,17,18,57,17,23,57,\n18,57,57,17,57,57,49,0,16,196,50,228,244,236,244,236,\n16,238,246,238,16,238,50,221,60,238,50,48,1,75,176,9,\n84,75,176,12,84,91,75,176,13,84,91,75,176,15,84,91,\n75,176,23,84,91,75,176,24,84,91,88,189,0,50,255,192,\n0,1,0,50,0,50,0,64,56,17,55,56,89,64,122,14,\n0,14,1,11,2,11,49,84,20,105,12,108,14,110,15,111,\n16,111,17,111,18,111,19,105,20,107,31,111,32,111,33,111,\n34,111,35,110,36,108,37,105,39,105,45,159,7,159,8,159,\n9,159,10,159,11,159,12,159,13,159,14,159,15,159,16,159,\n17,159,18,159,19,150,31,159,32,159,33,159,34,159,35,159,\n36,159,37,159,38,159,39,159,40,159,41,159,42,159,43,159,\n44,157,45,50,0,8,0,9,16,8,16,9,32,8,32,9,\n85,21,83,30,106,21,103,31,10,93,0,93,1,21,46,1,\n35,34,6,7,33,7,33,14,1,21,20,22,23,33,7,33,\n30,1,51,50,54,55,21,14,1,35,34,0,3,35,55,51,\n52,38,53,52,54,53,35,55,51,18,0,51,50,22,4,143,\n91,169,102,157,202,32,2,65,55,253,230,2,1,1,2,1,\n190,56,254,138,32,202,157,102,169,91,89,185,96,237,254,203,\n40,211,55,139,1,1,194,55,156,40,1,54,236,98,185,5,\n98,213,105,90,200,187,123,24,46,35,32,46,24,123,187,202,\n90,105,211,72,72,1,34,1,3,123,23,47,32,35,47,23,\n123,1,1,1,34,71,0,2,0,215,5,14,3,41,5,217,\n0,3,0,7,0,165,64,13,4,0,206,6,2,8,1,100,\n0,5,100,4,8,16,212,252,220,236,49,0,16,212,60,236,\n50,48,0,75,176,14,84,75,176,17,84,91,88,189,0,8,\n0,64,0,1,0,8,0,8,255,192,56,17,55,56,89,1,\n75,176,14,84,75,176,13,84,91,75,176,23,84,91,88,189,\n0,8,255,192,0,1,0,8,0,8,0,64,56,17,55,56,\n89,1,75,176,17,84,75,176,25,84,91,88,189,0,8,0,\n64,0,1,0,8,0,8,255,192,56,17,55,56,89,0,75,\n176,24,84,88,189,0,8,255,192,0,1,0,8,0,8,0,\n64,56,17,55,56,89,64,17,96,1,96,2,96,5,96,6,\n112,1,112,2,112,5,112,6,8,1,93,1,51,21,35,37,\n51,21,35,2,94,203,203,254,121,203,203,5,217,203,203,203,\n0,1,1,115,4,238,2,240,5,246,0,3,0,127,64,17,\n2,3,0,3,1,0,0,3,66,0,2,250,4,1,3,3,\n4,16,196,16,192,49,0,16,244,204,48,75,83,88,7,16,\n5,201,7,16,5,201,89,34,0,75,176,12,84,88,189,0,\n4,255,192,0,1,0,4,0,4,0,64,56,17,55,56,89,\n0,75,176,14,84,88,189,0,4,0,64,0,1,0,4,0,\n4,255,192,56,17,55,56,89,64,32,6,2,21,2,37,1,\n37,2,54,2,70,2,86,2,106,1,103,2,9,15,0,15,\n1,31,0,31,1,47,0,47,1,6,93,1,93,1,51,3,\n35,2,55,185,228,153,5,246,254,248,0,1,0,182,5,14,\n3,74,5,233,0,29,0,117,64,33,22,16,15,3,19,12,\n7,1,0,3,8,23,12,195,4,19,195,27,8,250,30,16,\n1,15,0,7,22,86,24,7,86,9,30,16,212,236,212,236,\n17,57,57,57,57,49,0,16,244,60,236,212,236,50,18,23,\n57,17,18,23,57,48,0,75,176,12,84,88,189,0,30,255,\n192,0,1,0,30,0,30,0,64,56,17,55,56,89,0,75,\n176,14,84,88,189,0,30,0,64,0,1,0,30,0,30,255,\n192,56,17,55,56,89,180,16,11,31,26,2,93,1,39,46,\n1,35,34,6,29,1,35,52,54,51,50,22,31,1,30,1,\n51,50,54,61,1,51,14,1,35,34,38,1,252,57,25,31,\n12,36,40,125,103,86,36,61,48,57,23,34,15,32,40,125,\n2,103,84,34,59,5,57,33,14,11,50,45,6,101,118,16,\n27,30,13,12,51,41,6,100,119,16,0,1,1,12,4,238,\n2,139,5,246,0,3,0,137,64,17,1,2,3,2,0,3,\n3,2,66,0,1,250,4,1,3,3,4,16,196,16,192,49,\n0,16,244,204,48,75,83,88,7,16,5,201,7,16,5,201,\n89,34,0,75,176,12,84,88,189,0,4,255,192,0,1,0,\n4,0,4,0,64,56,17,55,56,89,0,75,176,14,84,88,\n189,0,4,0,64,0,1,0,4,0,4,255,192,56,17,55,\n56,89,64,42,6,0,6,1,22,0,18,1,36,0,36,1,\n53,1,67,1,85,0,85,1,159,0,159,1,175,0,175,1,\n14,15,0,15,3,31,0,31,3,47,0,47,3,6,93,1,\n93,1,19,35,3,1,199,196,153,230,5,246,254,248,1,8,\n0,1,0,207,4,238,3,49,5,248,0,6,0,119,64,10,\n4,0,5,2,250,7,4,2,6,7,16,212,196,57,49,0,\n16,244,60,196,57,48,0,75,176,12,84,88,189,0,7,255,\n192,0,1,0,7,0,7,0,64,56,17,55,56,89,0,75,\n176,14,84,88,189,0,7,0,64,0,1,0,7,0,7,255,\n192,56,17,55,56,89,1,75,176,14,84,88,189,0,7,255,\n192,0,1,0,7,0,7,0,64,56,17,55,56,89,64,19,\n15,0,15,1,12,4,31,0,31,1,29,4,47,0,47,1,\n45,4,9,0,93,1,51,19,35,39,7,35,1,162,188,211,\n139,166,166,139,5,248,254,246,178,178,0,1,0,207,4,238,\n3,49,5,248,0,6,0,134,64,10,3,4,1,0,250,7,\n3,5,1,7,16,212,196,57,49,0,16,244,196,50,57,48,\n0,75,176,12,84,75,176,9,84,91,75,176,10,84,91,75,\n176,11,84,91,88,189,0,7,255,192,0,1,0,7,0,7,\n0,64,56,17,55,56,89,0,75,176,14,84,88,189,0,7,\n0,64,0,1,0,7,0,7,255,192,56,17,55,56,89,1,\n75,176,14,84,88,189,0,7,255,192,0,1,0,7,0,7,\n0,64,56,17,55,56,89,64,19,0,0,3,3,0,6,16,\n0,18,3,16,6,32,0,34,3,32,6,9,0,93,1,3,\n51,23,55,51,3,1,162,211,139,166,166,139,211,4,238,1,\n10,178,178,254,246,0,0,2,0,63,2,156,2,244,5,223,\n0,2,0,13,0,212,64,22,0,3,11,7,221,5,1,9,\n247,3,145,14,1,12,10,0,93,6,8,4,12,14,16,220,\n212,60,196,236,50,17,57,49,0,16,244,252,212,60,236,50,\n18,57,48,1,75,176,14,84,75,176,15,84,91,75,176,16,\n84,91,75,176,17,84,91,75,176,11,84,91,75,176,10,84,\n91,88,189,0,14,0,64,0,1,0,14,0,14,255,192,56,\n17,55,56,89,0,75,176,17,84,75,176,14,84,91,88,189,\n0,14,255,192,0,1,0,14,0,14,0,64,56,17,55,56,\n89,64,84,11,1,29,1,47,1,57,1,73,1,70,3,89,\n3,105,3,139,3,171,3,187,3,11,1,0,15,1,15,2,\n15,5,15,6,15,7,15,8,15,11,15,12,15,13,19,0,\n31,1,31,2,31,5,31,6,31,7,31,8,31,11,31,12,\n31,13,34,0,53,0,71,0,75,13,83,0,91,13,101,0,\n132,0,165,0,181,0,30,93,1,93,9,1,33,3,51,17,\n51,21,35,21,35,53,33,53,1,221,254,203,1,53,22,166,\n135,135,144,254,98,5,102,254,93,2,28,253,228,109,186,186,\n121,0,0,1,0,199,5,6,3,57,5,248,0,13,0,106,\n64,14,7,0,4,195,11,250,14,7,86,8,1,86,0,14,\n16,212,236,212,236,49,0,16,244,252,196,50,48,0,75,176,\n12,84,88,189,0,14,255,192,0,1,0,14,0,14,0,64,\n56,17,55,56,89,0,75,176,14,84,88,189,0,14,0,64,\n0,1,0,14,0,14,255,192,56,17,55,56,89,1,75,176,\n14,84,75,176,15,84,91,88,189,0,14,255,192,0,1,0,\n14,0,14,0,64,56,17,55,56,89,19,51,30,1,51,50,\n54,55,51,14,1,35,34,38,199,118,13,99,83,82,97,16,\n118,10,160,143,144,159,5,248,54,57,55,56,119,123,122,0,\n0,1,1,154,5,14,2,102,5,219,0,3,0,17,182,0,\n2,250,4,1,0,4,16,212,204,49,0,16,244,204,48,1,\n51,21,35,1,154,204,204,5,219,205,0,0,0,0,0,2,\n0,1,0,0,0,0,0,20,0,3,0,1,0,0,1,26,\n0,0,1,6,0,0,1,0,0,0,0,0,0,0,1,3,\n0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,1,0,0,3,4,5,6,7,8,9,10,11,12,\n13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,\n29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,\n45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,\n61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,\n77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,\n93,94,95,96,97,0,98,99,100,101,102,103,104,105,106,107,\n108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,\n124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,\n140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,\n156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,\n172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,\n188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,\n204,205,206,207,208,209,0,210,211,212,213,214,215,216,217,218,\n219,220,221,222,223,224,0,4,2,62,0,0,0,58,0,32,\n0,4,0,26,0,126,0,255,1,7,1,17,1,31,1,49,\n1,66,1,83,1,97,1,120,1,126,1,146,2,199,2,221,\n3,169,3,192,32,38,32,48,32,58,32,172,33,34,34,6,\n34,30,34,43,34,72,34,101,37,202,251,2,255,255,0,0,\n0,32,0,160,1,6,1,12,1,30,1,48,1,65,1,82,\n1,94,1,120,1,125,1,146,2,198,2,216,3,169,3,192,\n32,19,32,48,32,57,32,172,33,34,34,2,34,15,34,43,\n34,72,34,96,37,202,251,1,255,255,255,227,0,0,255,245,\n0,0,255,216,0,0,255,160,255,94,0,0,255,67,255,104,\n255,20,0,0,0,0,252,246,252,219,0,0,224,150,224,133,\n224,86,223,106,0,0,0,0,222,113,222,95,0,0,218,239,\n5,191,0,1,0,0,0,56,0,0,0,244,0,0,0,252,\n0,0,0,0,0,250,0,0,0,0,0,0,0,250,0,252,\n0,0,0,0,1,2,0,0,0,0,0,0,0,0,1,32,\n1,40,0,0,0,0,1,66,0,0,0,0,0,0,0,172,\n0,163,0,132,0,133,0,189,0,150,0,231,0,134,0,142,\n0,139,0,157,0,169,0,164,1,0,0,138,0,217,0,131,\n0,147,0,241,0,242,0,141,0,151,0,136,0,195,0,221,\n0,240,0,158,0,170,0,243,0,244,0,245,0,162,0,173,\n0,201,0,199,0,174,0,98,0,99,0,144,0,100,0,203,\n0,101,0,200,0,202,0,207,0,204,0,205,0,206,0,232,\n0,102,0,210,0,208,0,209,0,175,0,103,0,239,0,145,\n0,213,0,211,0,212,0,104,0,234,0,236,0,137,0,106,\n0,105,0,107,0,109,0,108,0,110,0,160,0,111,0,113,\n0,112,0,114,0,115,0,117,0,116,0,118,0,119,0,233,\n0,120,0,122,0,121,0,123,0,125,0,124,0,184,0,161,\n0,127,0,126,0,128,0,129,0,235,0,237,0,186,0,253,\n0,254,0,0,0,0,0,0,0,255,0,248,0,214,0,249,\n0,250,0,227,0,228,0,215,0,224,0,218,0,219,0,220,\n0,223,0,216,0,222,0,178,0,179,0,0,0,0,0,0,\n0,182,0,183,0,196,0,0,0,180,0,181,0,197,0,0,\n0,130,0,194,0,135,0,0,0,0,0,0,0,171,0,152,\n0,0,0,0,0,0,0,168,0,154,0,0,0,153,0,238,\n0,0,0,0,0,188,0,0,0,0,0,0,1,1,0,165,\n0,0,0,0,0,0,0,146,0,143,0,0,0,0,0,0,\n0,148,0,149,4,205,0,102,0,0,0,0,2,139,0,0,\n2,139,0,0,3,53,1,53,3,174,0,197,6,180,0,158,\n5,23,0,170,7,154,0,113,6,61,0,129,2,51,0,197,\n3,31,0,176,3,31,0,164,4,0,0,61,6,180,0,217,\n2,139,0,158,2,227,0,100,2,139,0,219,2,178,0,0,\n5,23,0,135,5,23,0,225,5,23,0,150,5,23,0,156,\n5,23,0,100,5,23,0,158,5,23,0,143,5,23,0,168,\n5,23,0,139,5,23,0,129,2,178,0,240,2,178,0,158,\n6,180,0,217,6,180,0,217,6,180,0,217,4,63,0,147,\n8,0,0,135,5,121,0,16,5,125,0,201,5,150,0,115,\n6,41,0,201,5,14,0,201,4,154,0,201,6,51,0,115,\n6,4,0,201,2,92,0,201,2,92,255,150,5,63,0,201,\n4,117,0,201,6,231,0,201,5,252,0,201,6,76,0,115,\n4,211,0,201,6,76,0,115,5,143,0,201,5,20,0,135,\n4,227,255,250,5,219,0,178,5,121,0,16,7,233,0,68,\n5,123,0,61,4,227,255,252,5,123,0,92,3,31,0,176,\n2,178,0,0,3,31,0,199,6,180,0,217,4,0,255,236,\n4,0,0,170,4,231,0,123,5,20,0,186,4,102,0,113,\n5,20,0,113,4,236,0,113,2,209,0,47,5,20,0,113,\n5,18,0,186,2,57,0,193,2,57,255,219,4,162,0,186,\n2,57,0,193,7,203,0,186,5,18,0,186,4,229,0,113,\n5,20,0,186,5,20,0,113,3,74,0,186,4,43,0,111,\n3,35,0,55,5,18,0,174,4,188,0,61,6,139,0,86,\n4,188,0,59,4,188,0,61,4,51,0,88,5,23,1,0,\n2,178,1,4,5,23,1,0,6,180,0,217,5,121,0,16,\n5,121,0,16,5,150,0,115,5,14,0,201,5,252,0,201,\n6,76,0,115,5,219,0,178,4,231,0,123,4,231,0,123,\n4,231,0,123,4,231,0,123,4,231,0,123,4,231,0,123,\n4,102,0,113,4,236,0,113,4,236,0,113,4,236,0,113,\n4,236,0,113,2,57,0,144,2,57,255,199,2,57,255,222,\n2,57,255,244,5,18,0,186,4,229,0,113,4,229,0,113,\n4,229,0,113,4,229,0,113,4,229,0,113,5,18,0,174,\n5,18,0,174,5,18,0,174,5,18,0,174,4,0,0,57,\n4,0,0,195,5,23,0,172,5,23,0,129,4,0,0,92,\n4,184,1,51,5,23,0,158,5,10,0,186,8,0,1,27,\n8,0,1,27,8,0,1,39,4,0,1,115,4,0,0,215,\n6,180,0,217,7,203,0,8,6,76,0,102,6,170,0,221,\n6,180,0,217,6,180,0,217,6,180,0,217,5,23,0,82,\n5,23,0,174,4,35,0,104,5,100,0,25,6,14,0,156,\n4,182,255,225,4,43,0,47,3,197,0,115,3,197,0,96,\n6,29,0,78,7,219,0,123,4,229,0,72,4,63,0,143,\n3,53,1,53,6,180,0,217,5,25,0,61,5,23,0,31,\n6,180,0,217,5,90,255,250,4,229,0,158,4,229,0,193,\n8,0,0,236,5,23,0,0,5,121,0,16,5,121,0,16,\n6,76,0,115,8,143,0,115,8,47,0,113,4,0,0,0,\n8,0,0,0,4,37,0,174,4,37,0,174,2,139,0,174,\n2,139,0,178,6,180,0,217,3,244,0,6,4,188,0,61,\n4,227,255,252,1,86,254,137,5,23,0,94,3,51,0,158,\n3,51,0,193,5,10,0,47,5,10,0,47,4,0,0,57,\n2,139,0,219,2,139,0,174,4,37,0,174,10,188,0,113,\n5,121,0,16,5,14,0,201,5,121,0,16,5,14,0,201,\n5,14,0,201,2,92,0,162,2,92,255,254,2,92,0,6,\n2,92,0,59,6,76,0,115,6,76,0,115,6,76,0,115,\n5,219,0,178,5,219,0,178,5,219,0,178,2,57,0,193,\n4,0,0,193,4,0,0,182,4,0,0,213,4,0,0,199,\n4,0,1,154,4,0,0,238,4,0,1,35,4,0,0,240,\n4,0,1,76,4,0,0,193,4,127,255,242,2,70,0,2,\n5,20,0,135,4,43,0,111,5,123,0,92,4,51,0,88,\n2,178,1,4,6,51,0,10,4,229,0,113,4,227,255,252,\n4,188,0,61,4,215,0,201,5,20,0,186,6,180,0,217,\n6,180,1,25,3,53,0,137,3,53,0,94,3,53,0,98,\n7,193,0,137,7,193,0,137,7,193,0,98,6,51,0,115,\n5,20,0,113,2,92,0,201,5,20,0,135,4,43,0,111,\n5,150,0,115,4,102,0,113,5,150,0,115,4,102,0,113,\n5,20,0,113,2,227,0,100,2,139,0,219,5,23,0,0,\n4,0,0,215,4,0,1,115,4,0,0,182,4,0,1,12,\n4,0,0,207,4,0,0,207,3,53,0,63,4,0,0,199,\n4,0,1,154,0,2,0,0,0,0,0,0,255,43,0,143,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n0,0,0,0,1,12,0,0,0,1,0,2,0,3,0,4,\n0,5,0,6,0,7,0,8,0,9,0,10,0,11,0,12,\n0,13,0,14,0,15,0,16,0,17,0,18,0,19,0,20,\n0,21,0,22,0,23,0,24,0,25,0,26,0,27,0,28,\n0,29,0,30,0,31,0,32,0,33,0,34,0,35,0,36,\n0,37,0,38,0,39,0,40,0,41,0,42,0,43,0,44,\n0,45,0,46,0,47,0,48,0,49,0,50,0,51,0,52,\n0,53,0,54,0,55,0,56,0,57,0,58,0,59,0,60,\n0,61,0,62,0,63,0,64,0,65,0,66,0,67,0,68,\n0,69,0,70,0,71,0,72,0,73,0,74,0,75,0,76,\n0,77,0,78,0,79,0,80,0,81,0,82,0,83,0,84,\n0,85,0,86,0,87,0,88,0,89,0,90,0,91,0,92,\n0,93,0,94,0,95,0,96,0,97,0,98,0,99,0,100,\n0,101,0,102,0,103,0,104,0,105,0,106,0,107,0,108,\n0,109,0,110,0,111,0,112,0,113,0,114,0,115,0,116,\n0,117,0,118,0,119,0,120,0,121,0,122,0,123,0,124,\n0,125,0,126,0,127,0,128,0,129,0,130,0,131,0,132,\n0,133,0,134,0,135,0,136,0,137,0,138,0,139,0,140,\n0,141,0,142,0,143,0,144,0,145,0,146,0,147,0,148,\n0,149,0,150,0,151,0,152,0,153,0,154,0,155,0,156,\n0,157,0,158,0,159,0,160,0,161,0,162,0,163,0,164,\n0,165,0,166,0,167,0,168,0,169,0,170,0,171,0,172,\n0,173,0,174,0,175,0,176,0,177,0,178,0,179,0,180,\n0,181,0,182,0,183,0,184,0,185,0,186,0,187,0,188,\n0,189,0,190,0,191,0,192,0,193,0,194,0,195,0,196,\n0,197,0,198,0,199,0,200,0,201,0,202,0,203,0,204,\n0,205,0,206,0,207,0,208,0,209,0,211,0,212,0,213,\n0,214,0,215,0,216,0,217,0,218,0,219,0,220,0,221,\n0,222,0,223,0,224,0,225,0,226,0,227,0,228,0,229,\n0,230,0,231,0,232,0,233,0,234,0,235,0,236,0,237,\n0,238,0,239,0,240,0,241,0,242,0,243,0,245,0,244,\n0,246,0,248,0,249,0,250,0,251,0,252,0,253,0,254,\n0,255,1,0,1,1,1,2,1,3,1,4,1,5,1,6,\n1,7,1,8,1,9,1,10,1,11,1,12,1,13,9,115,\n102,116,104,121,112,104,101,110,14,112,101,114,105,111,100,99,\n101,110,116,101,114,101,100,4,69,117,114,111,5,99,54,52,\n53,57,5,99,54,52,54,48,5,99,54,52,54,49,5,99,\n54,52,54,50,5,99,54,52,54,51,5,99,54,52,54,54,\n5,99,54,52,54,55,5,99,54,52,54,56,5,99,54,52,\n54,57,0,0,0,0,0,34,0,34,0,34,0,34,0,88,\n0,147,0,255,1,182,2,79,3,131,3,178,3,246,4,33,\n4,110,4,152,4,180,4,202,4,222,5,3,5,69,5,130,\n6,5,6,126,6,225,7,76,7,183,7,252,8,101,8,207,\n8,238,9,22,9,82,9,115,9,174,10,31,10,223,11,88,\n11,176,11,251,12,58,12,105,12,147,12,230,13,20,13,61,\n13,122,14,13,14,47,14,172,15,0,15,69,15,133,15,235,\n16,117,16,241,17,41,17,112,17,224,18,189,19,138,19,235,\n20,80,20,139,20,177,20,225,21,3,21,24,21,64,21,214,\n22,34,22,109,22,185,23,35,23,123,23,223,24,27,24,67,\n24,128,24,248,25,22,25,119,25,179,26,4,26,82,26,161,\n26,216,27,135,27,196,28,0,28,157,29,186,30,135,31,119,\n31,232,32,91,32,114,32,243,33,53,33,66,33,226,33,239,\n33,252,34,9,34,22,34,35,34,48,34,61,34,74,34,87,\n34,100,34,113,34,126,34,139,34,152,34,165,34,178,34,191,\n34,204,34,217,34,230,34,243,35,0,35,13,35,26,35,39,\n35,52,35,65,35,78,35,91,35,104,35,148,35,207,36,52,\n36,143,37,51,37,83,37,129,38,20,38,186,39,75,39,144,\n39,183,40,19,40,88,40,195,41,95,42,37,42,92,42,163,\n42,233,43,122,43,211,44,68,44,143,44,177,45,80,45,160,\n46,14,46,82,46,170,47,135,48,65,48,189,49,5,49,33,\n49,80,49,207,50,72,50,122,50,223,51,70,51,112,51,112,\n51,125,51,138,51,151,51,230,52,122,52,143,52,163,52,209,\n52,255,53,28,53,57,53,103,53,145,53,158,53,171,53,207,\n54,91,54,147,54,205,55,67,55,169,55,235,56,0,56,28,\n56,74,57,15,57,28,57,41,57,54,57,67,57,80,57,93,\n57,106,57,119,57,132,57,145,57,158,57,171,57,184,57,197,\n57,210,57,239,58,28,58,123,58,160,58,229,59,8,59,94,\n59,142,59,196,59,244,60,34,60,95,60,167,60,180,60,193,\n60,206,60,219,60,254,61,99,62,59,62,72,62,85,62,152,\n62,231,62,253,63,97,63,141,63,220,64,58,64,75,64,92,\n64,109,64,122,64,135,64,148,64,161,64,174,64,187,64,200,\n64,213,64,226,65,64,65,86,65,107,66,69,66,170,66,247,\n67,95,67,178,67,255,68,85,68,219,69,42,69,63,0,0,\n0,0,0,1,0,0,45,134,0,1,7,148,24,0,0,10,\n21,120,0,16,0,36,255,211,0,16,0,37,255,183,0,16,\n0,38,0,0,0,16,0,39,0,0,0,16,0,41,0,0,\n0,16,0,42,0,75,0,16,0,43,0,0,0,16,0,45,\n0,114,0,16,0,46,0,0,0,16,0,47,0,0,0,16,\n0,50,0,57,0,16,0,51,0,0,0,16,0,52,0,75,\n0,16,0,53,0,0,0,16,0,55,255,68,0,16,0,57,\n255,136,0,16,0,58,255,173,0,16,0,59,255,154,0,16,\n0,60,255,13,0,16,0,61,0,0,0,16,0,73,0,0,\n0,16,0,81,0,0,0,16,0,82,0,38,0,16,0,85,\n0,0,0,16,0,89,255,201,0,16,0,90,0,0,0,16,\n0,92,255,220,0,16,0,98,255,211,0,16,0,100,0,0,\n0,16,0,103,0,57,0,16,0,120,0,0,0,16,0,121,\n0,38,0,16,0,122,0,38,0,16,0,123,0,38,0,16,\n0,124,0,38,0,16,0,125,0,38,0,16,0,137,0,0,\n0,16,0,144,0,0,0,16,0,173,255,211,0,16,0,174,\n255,211,0,16,0,175,0,57,0,16,0,186,255,220,0,16,\n0,187,255,13,0,16,0,199,255,211,0,16,0,201,255,211,\n0,16,0,208,0,57,0,16,0,209,0,57,0,16,0,210,\n0,57,0,16,0,229,0,0,0,16,0,233,0,0,0,16,\n0,234,255,13,0,16,0,235,255,220,0,16,0,236,0,0,\n0,16,0,246,0,75,0,16,0,251,0,0,0,16,0,253,\n0,0,0,36,0,16,255,211,0,36,0,17,255,220,0,36,\n0,29,255,220,0,36,0,36,0,57,0,36,0,38,255,220,\n0,36,0,42,255,220,0,36,0,50,255,220,0,36,0,52,\n255,220,0,36,0,54,0,0,0,36,0,55,255,97,0,36,\n0,56,0,0,0,36,0,57,255,125,0,36,0,58,255,144,\n0,36,0,59,0,0,0,36,0,60,255,97,0,36,0,70,\n255,220,0,36,0,71,255,220,0,36,0,72,255,220,0,36,\n0,73,255,183,0,36,0,82,255,220,0,36,0,84,255,220,\n0,36,0,87,255,220,0,36,0,88,0,0,0,36,0,89,\n255,136,0,36,0,90,255,173,0,36,0,92,255,117,0,36,\n0,98,0,57,0,36,0,100,255,220,0,36,0,103,255,220,\n0,36,0,104,0,0,0,36,0,111,255,220,0,36,0,112,\n255,220,0,36,0,113,255,220,0,36,0,114,255,220,0,36,\n0,115,255,220,0,36,0,121,255,220,0,36,0,122,255,220,\n0,36,0,123,255,220,0,36,0,124,255,220,0,36,0,125,\n255,220,0,36,0,126,0,0,0,36,0,127,0,0,0,36,\n0,128,0,0,0,36,0,129,0,0,0,36,0,169,255,183,\n0,36,0,170,0,0,0,36,0,173,0,57,0,36,0,174,\n0,57,0,36,0,175,255,220,0,36,0,180,254,248,0,36,\n0,181,255,3,0,36,0,186,255,117,0,36,0,187,255,97,\n0,36,0,197,0,47,0,36,0,199,0,57,0,36,0,201,\n0,57,0,36,0,208,255,220,0,36,0,209,255,220,0,36,\n0,210,255,220,0,36,0,211,0,0,0,36,0,212,0,0,\n0,36,0,213,0,0,0,36,0,227,0,0,0,36,0,234,\n255,97,0,36,0,235,255,117,0,36,0,246,255,220,0,36,\n0,249,0,0,0,36,0,251,255,220,0,36,0,252,255,220,\n0,36,0,253,255,220,0,36,0,254,255,220,0,37,0,16,\n0,0,0,37,0,38,255,220,0,37,0,42,255,220,0,37,\n0,50,255,220,0,37,0,54,255,220,0,37,0,57,255,193,\n0,37,0,58,255,183,0,37,0,60,255,144,0,37,0,100,\n255,220,0,37,0,103,255,220,0,37,0,169,255,193,0,37,\n0,170,255,220,0,37,0,175,255,220,0,37,0,180,255,144,\n0,37,0,181,255,144,0,37,0,187,255,144,0,37,0,197,\n255,173,0,37,0,208,255,220,0,37,0,209,255,220,0,37,\n0,210,255,220,0,37,0,227,255,220,0,37,0,234,255,144,\n0,37,0,246,255,220,0,37,0,249,255,220,0,37,0,251,\n255,220,0,37,0,253,255,220,0,38,0,16,0,0,0,38,\n0,36,0,0,0,38,0,54,0,0,0,38,0,60,255,220,\n0,38,0,98,0,0,0,38,0,169,255,220,0,38,0,170,\n255,220,0,38,0,173,0,0,0,38,0,174,0,0,0,38,\n0,180,0,0,0,38,0,181,0,38,0,38,0,187,255,220,\n0,38,0,197,0,0,0,38,0,199,0,0,0,38,0,201,\n0,0,0,38,0,227,0,0,0,38,0,234,255,220,0,38,\n0,249,0,0,0,39,0,16,0,0,0,39,0,36,255,220,\n0,39,0,57,255,220,0,39,0,58,0,0,0,39,0,60,\n255,144,0,39,0,98,255,220,0,39,0,169,255,220,0,39,\n0,170,255,220,0,39,0,173,255,220,0,39,0,174,255,220,\n0,39,0,180,255,211,0,39,0,181,255,201,0,39,0,187,\n255,144,0,39,0,197,255,68,0,39,0,199,255,220,0,39,\n0,201,255,220,0,39,0,234,255,144,0,41,0,16,0,0,\n0,41,0,17,254,183,0,41,0,29,255,97,0,41,0,36,\n255,68,0,41,0,54,255,220,0,41,0,55,255,220,0,41,\n0,68,255,68,0,41,0,72,255,144,0,41,0,76,255,107,\n0,41,0,82,255,183,0,41,0,85,255,107,0,41,0,88,\n255,144,0,41,0,92,255,68,0,41,0,98,255,68,0,41,\n0,105,255,68,0,41,0,106,255,68,0,41,0,107,255,68,\n0,41,0,108,255,68,0,41,0,109,255,68,0,41,0,110,\n255,68,0,41,0,112,255,144,0,41,0,113,255,144,0,41,\n0,114,255,144,0,41,0,115,255,144,0,41,0,121,255,183,\n0,41,0,122,255,183,0,41,0,123,255,183,0,41,0,124,\n255,183,0,41,0,125,255,183,0,41,0,126,255,144,0,41,\n0,127,255,144,0,41,0,128,255,144,0,41,0,129,255,144,\n0,41,0,169,0,0,0,41,0,170,0,0,0,41,0,173,\n255,68,0,41,0,174,255,68,0,41,0,180,255,211,0,41,\n0,181,0,0,0,41,0,186,255,68,0,41,0,197,254,136,\n0,41,0,199,255,68,0,41,0,201,255,68,0,41,0,227,\n255,220,0,41,0,235,255,68,0,41,0,249,255,220,0,42,\n0,16,0,0,0,42,0,36,0,0,0,42,0,55,255,183,\n0,42,0,58,0,0,0,42,0,60,255,154,0,42,0,98,\n0,0,0,42,0,169,255,220,0,42,0,170,255,220,0,42,\n0,173,0,0,0,42,0,174,0,0,0,42,0,180,255,211,\n0,42,0,181,255,211,0,42,0,187,255,154,0,42,0,197,\n255,201,0,42,0,199,0,0,0,42,0,201,0,0,0,42,\n0,234,255,154,0,43,0,16,0,0,0,43,0,17,255,220,\n0,43,0,29,0,0,0,43,0,169,0,0,0,43,0,170,\n0,0,0,43,0,180,255,183,0,43,0,181,255,193,0,43,\n0,197,255,183,0,45,0,16,255,183,0,45,0,36,255,220,\n0,45,0,98,255,220,0,45,0,169,255,220,0,45,0,170,\n255,220,0,45,0,173,255,220,0,45,0,174,255,220,0,45,\n0,180,255,183,0,45,0,181,255,193,0,45,0,197,255,144,\n0,45,0,199,255,220,0,45,0,201,255,220,0,46,0,16,\n255,41,0,46,0,36,255,220,0,46,0,38,255,144,0,46,\n0,50,255,144,0,46,0,55,255,97,0,46,0,56,255,201,\n0,46,0,58,255,183,0,46,0,60,255,183,0,46,0,68,\n255,220,0,46,0,72,255,154,0,46,0,82,255,154,0,46,\n0,88,255,154,0,46,0,92,255,107,0,46,0,98,255,220,\n0,46,0,100,255,144,0,46,0,103,255,144,0,46,0,104,\n255,201,0,46,0,105,255,220,0,46,0,106,255,220,0,46,\n0,107,255,220,0,46,0,108,255,220,0,46,0,109,255,220,\n0,46,0,110,255,220,0,46,0,112,255,154,0,46,0,113,\n255,154,0,46,0,114,255,154,0,46,0,115,255,154,0,46,\n0,121,255,154,0,46,0,122,255,154,0,46,0,123,255,154,\n0,46,0,124,255,154,0,46,0,125,255,154,0,46,0,126,\n255,154,0,46,0,127,255,154,0,46,0,128,255,154,0,46,\n0,129,255,154,0,46,0,169,255,125,0,46,0,170,0,0,\n0,46,0,173,255,220,0,46,0,174,255,220,0,46,0,175,\n255,144,0,46,0,180,255,193,0,46,0,181,255,193,0,46,\n0,186,255,107,0,46,0,187,255,183,0,46,0,197,0,0,\n0,46,0,199,255,220,0,46,0,201,255,220,0,46,0,208,\n255,144,0,46,0,209,255,144,0,46,0,210,255,144,0,46,\n0,211,255,201,0,46,0,212,255,201,0,46,0,213,255,201,\n0,46,0,234,255,183,0,46,0,235,255,107,0,46,0,251,\n255,144,0,46,0,253,255,144,0,47,0,16,255,220,0,47,\n0,36,0,47,0,47,0,50,255,183,0,47,0,55,254,230,\n0,47,0,56,255,154,0,47,0,57,255,31,0,47,0,58,\n255,68,0,47,0,60,254,240,0,47,0,68,0,0,0,47,\n0,72,255,220,0,47,0,82,255,220,0,47,0,88,255,220,\n0,47,0,92,255,68,0,47,0,98,0,47,0,47,0,103,\n255,183,0,47,0,104,255,154,0,47,0,105,0,0,0,47,\n0,106,0,0,0,47,0,107,0,0,0,47,0,108,0,0,\n0,47,0,109,0,0,0,47,0,110,0,0,0,47,0,112,\n255,220,0,47,0,113,255,220,0,47,0,114,255,220,0,47,\n0,115,255,220,0,47,0,121,255,220,0,47,0,122,255,220,\n0,47,0,123,255,220,0,47,0,124,255,220,0,47,0,125,\n255,220,0,47,0,126,255,220,0,47,0,127,255,220,0,47,\n0,128,255,220,0,47,0,129,255,220,0,47,0,169,0,0,\n0,47,0,170,0,0,0,47,0,173,0,47,0,47,0,174,\n0,47,0,47,0,175,255,183,0,47,0,180,254,97,0,47,\n0,181,253,230,0,47,0,186,255,68,0,47,0,187,254,240,\n0,47,0,197,0,0,0,47,0,199,0,47,0,47,0,201,\n0,47,0,47,0,208,255,183,0,47,0,209,255,183,0,47,\n0,210,255,183,0,47,0,211,255,154,0,47,0,212,255,154,\n0,47,0,213,255,154,0,47,0,234,254,240,0,47,0,235,\n255,68,0,50,0,16,0,57,0,50,0,17,255,173,0,50,\n0,29,255,220,0,50,0,36,255,220,0,50,0,57,255,220,\n0,50,0,59,255,125,0,50,0,60,255,144,0,50,0,98,\n255,220,0,50,0,169,255,220,0,50,0,170,0,0,0,50,\n0,173,255,220,0,50,0,174,255,220,0,50,0,180,255,211,\n0,50,0,181,255,220,0,50,0,187,255,144,0,50,0,197,\n255,68,0,50,0,199,255,220,0,50,0,201,255,220,0,50,\n0,234,255,144,0,51,0,16,255,211,0,51,0,17,254,193,\n0,51,0,29,0,0,0,51,0,36,255,125,0,51,0,56,\n0,0,0,51,0,58,0,0,0,51,0,60,255,211,0,51,\n0,68,255,164,0,51,0,72,255,183,0,51,0,76,255,211,\n0,51,0,81,255,220,0,51,0,82,255,183,0,51,0,85,\n255,220,0,51,0,86,255,220,0,51,0,88,255,220,0,51,\n0,92,0,0,0,51,0,98,255,125,0,51,0,104,0,0,\n0,51,0,105,255,164,0,51,0,106,255,164,0,51,0,107,\n255,164,0,51,0,108,255,164,0,51,0,109,255,164,0,51,\n0,110,255,164,0,51,0,112,255,183,0,51,0,113,255,183,\n0,51,0,114,255,183,0,51,0,115,255,183,0,51,0,120,\n255,220,0,51,0,121,255,183,0,51,0,122,255,183,0,51,\n0,123,255,183,0,51,0,124,255,183,0,51,0,125,255,183,\n0,51,0,126,255,220,0,51,0,127,255,220,0,51,0,128,\n255,220,0,51,0,129,255,220,0,51,0,169,255,220,0,51,\n0,170,0,0,0,51,0,173,255,125,0,51,0,174,255,125,\n0,51,0,180,0,38,0,51,0,181,0,38,0,51,0,186,\n0,0,0,51,0,187,255,211,0,51,0,197,254,183,0,51,\n0,199,255,125,0,51,0,201,255,125,0,51,0,211,0,0,\n0,51,0,212,0,0,0,51,0,213,0,0,0,51,0,228,\n255,220,0,51,0,234,255,211,0,51,0,235,0,0,0,51,\n0,250,255,220,0,52,0,16,0,57,0,52,0,169,0,0,\n0,52,0,170,0,0,0,52,0,180,255,211,0,52,0,181,\n255,220,0,52,0,197,255,125,0,53,0,16,255,173,0,53,\n0,17,255,183,0,53,0,29,255,193,0,53,0,36,255,173,\n0,53,0,38,255,154,0,53,0,55,255,107,0,53,0,57,\n255,144,0,53,0,58,255,173,0,53,0,60,255,125,0,53,\n0,68,255,211,0,53,0,72,255,164,0,53,0,82,255,164,\n0,53,0,88,255,164,0,53,0,92,255,144,0,53,0,98,\n255,173,0,53,0,100,255,154,0,53,0,105,255,211,0,53,\n0,106,255,211,0,53,0,107,255,211,0,53,0,108,255,211,\n0,53,0,109,255,211,0,53,0,110,255,211,0,53,0,112,\n255,164,0,53,0,113,255,164,0,53,0,114,255,164,0,53,\n0,115,255,164,0,53,0,121,255,164,0,53,0,122,255,164,\n0,53,0,123,255,164,0,53,0,124,255,164,0,53,0,125,\n255,164,0,53,0,126,255,164,0,53,0,127,255,164,0,53,\n0,128,255,164,0,53,0,129,255,164,0,53,0,169,255,144,\n0,53,0,170,255,220,0,53,0,173,255,173,0,53,0,174,\n255,173,0,53,0,180,255,107,0,53,0,181,255,125,0,53,\n0,186,255,144,0,53,0,187,255,125,0,53,0,197,255,220,\n0,53,0,199,255,173,0,53,0,201,255,173,0,53,0,234,\n255,125,0,53,0,235,255,144,0,53,0,251,255,154,0,53,\n0,253,255,154,0,54,0,36,0,38,0,54,0,38,0,0,\n0,54,0,42,0,0,0,54,0,50,0,0,0,54,0,52,\n0,0,0,54,0,54,0,0,0,54,0,98,0,38,0,54,\n0,100,0,0,0,54,0,103,0,0,0,54,0,173,0,38,\n0,54,0,174,0,38,0,54,0,175,0,0,0,54,0,199,\n0,38,0,54,0,201,0,38,0,54,0,208,0,0,0,54,\n0,209,0,0,0,54,0,210,0,0,0,54,0,227,0,0,\n0,54,0,246,0,0,0,54,0,249,0,0,0,54,0,251,\n0,0,0,54,0,253,0,0,0,55,0,16,255,68,0,55,\n0,17,255,13,0,55,0,29,255,31,0,55,0,36,255,97,\n0,55,0,38,255,136,0,55,0,55,255,220,0,55,0,68,\n254,173,0,55,0,70,254,164,0,55,0,72,254,164,0,55,\n0,76,255,193,0,55,0,82,254,164,0,55,0,85,254,211,\n0,55,0,86,254,173,0,55,0,88,254,201,0,55,0,90,\n254,173,0,55,0,92,254,193,0,55,0,98,255,97,0,55,\n0,100,255,136,0,55,0,105,254,173,0,55,0,106,254,173,\n0,55,0,107,254,173,0,55,0,108,254,173,0,55,0,109,\n254,173,0,55,0,110,254,173,0,55,0,111,254,164,0,55,\n0,112,254,164,0,55,0,113,254,164,0,55,0,114,254,164,\n0,55,0,115,254,164,0,55,0,121,254,164,0,55,0,122,\n254,164,0,55,0,123,254,164,0,55,0,124,254,164,0,55,\n0,125,254,164,0,55,0,126,254,201,0,55,0,127,254,201,\n0,55,0,128,254,201,0,55,0,129,254,201,0,55,0,169,\n255,68,0,55,0,170,255,144,0,55,0,173,255,97,0,55,\n0,174,255,97,0,55,0,180,0,0,0,55,0,181,255,211,\n0,55,0,186,254,193,0,55,0,197,254,248,0,55,0,199,\n255,97,0,55,0,201,255,97,0,55,0,228,254,173,0,55,\n0,235,254,193,0,55,0,250,254,173,0,55,0,251,255,136,\n0,55,0,252,254,164,0,55,0,253,255,136,0,55,0,254,\n254,164,0,56,0,36,0,0,0,56,0,45,0,0,0,56,\n0,61,255,220,0,56,0,98,0,0,0,56,0,173,0,0,\n0,56,0,174,0,0,0,56,0,199,0,0,0,56,0,201,\n0,0,0,56,0,229,255,220,0,57,0,16,255,136,0,57,\n0,17,254,248,0,57,0,29,255,89,0,57,0,36,255,125,\n0,57,0,50,255,220,0,57,0,68,255,97,0,57,0,72,\n255,97,0,57,0,76,255,211,0,57,0,82,255,97,0,57,\n0,88,255,117,0,57,0,92,255,201,0,57,0,98,255,125,\n0,57,0,103,255,220,0,57,0,105,255,97,0,57,0,106,\n255,97,0,57,0,107,255,97,0,57,0,108,255,97,0,57,\n0,109,255,97,0,57,0,110,255,97,0,57,0,112,255,97,\n0,57,0,113,255,97,0,57,0,114,255,97,0,57,0,115,\n255,97,0,57,0,121,255,97,0,57,0,122,255,97,0,57,\n0,123,255,97,0,57,0,124,255,97,0,57,0,125,255,97,\n0,57,0,126,255,117,0,57,0,127,255,117,0,57,0,128,\n255,117,0,57,0,129,255,117,0,57,0,169,255,78,0,57,\n0,170,255,144,0,57,0,173,255,125,0,57,0,174,255,125,\n0,57,0,175,255,220,0,57,0,180,0,0,0,57,0,181,\n0,0,0,57,0,186,255,201,0,57,0,197,254,230,0,57,\n0,199,255,125,0,57,0,201,255,125,0,57,0,208,255,220,\n0,57,0,209,255,220,0,57,0,210,255,220,0,57,0,235,\n255,201,0,58,0,16,255,173,0,58,0,17,255,21,0,58,\n0,29,255,136,0,58,0,36,255,144,0,58,0,68,255,125,\n0,58,0,72,255,136,0,58,0,76,255,211,0,58,0,82,\n255,136,0,58,0,85,255,164,0,58,0,88,255,183,0,58,\n0,92,255,220,0,58,0,98,255,144,0,58,0,105,255,125,\n0,58,0,106,255,125,0,58,0,107,255,125,0,58,0,108,\n255,125,0,58,0,109,255,125,0,58,0,110,255,125,0,58,\n0,112,255,136,0,58,0,113,255,136,0,58,0,114,255,136,\n0,58,0,115,255,136,0,58,0,121,255,136,0,58,0,122,\n255,136,0,58,0,123,255,136,0,58,0,124,255,136,0,58,\n0,125,255,136,0,58,0,126,255,183,0,58,0,127,255,183,\n0,58,0,128,255,183,0,58,0,129,255,183,0,58,0,169,\n255,144,0,58,0,170,255,220,0,58,0,173,255,144,0,58,\n0,174,255,144,0,58,0,180,255,220,0,58,0,181,0,0,\n0,58,0,186,255,220,0,58,0,197,254,248,0,58,0,199,\n255,144,0,58,0,201,255,144,0,58,0,235,255,220,0,59,\n0,16,255,154,0,59,0,36,0,0,0,59,0,38,255,107,\n0,59,0,50,255,125,0,59,0,55,255,220,0,59,0,72,\n255,164,0,59,0,98,0,0,0,59,0,100,255,107,0,59,\n0,103,255,125,0,59,0,112,255,164,0,59,0,113,255,164,\n0,59,0,114,255,164,0,59,0,115,255,164,0,59,0,169,\n255,144,0,59,0,170,0,0,0,59,0,173,0,0,0,59,\n0,174,0,0,0,59,0,175,255,125,0,59,0,180,255,97,\n0,59,0,181,255,173,0,59,0,197,255,211,0,59,0,199,\n0,0,0,59,0,201,0,0,0,59,0,208,255,125,0,59,\n0,209,255,125,0,59,0,210,255,125,0,59,0,251,255,107,\n0,59,0,253,255,107,0,60,0,16,255,13,0,60,0,17,\n254,97,0,60,0,29,254,240,0,60,0,36,255,97,0,60,\n0,38,255,144,0,60,0,50,255,144,0,60,0,68,254,230,\n0,60,0,72,254,240,0,60,0,76,255,183,0,60,0,82,\n254,240,0,60,0,88,255,21,0,60,0,98,255,97,0,60,\n0,100,255,144,0,60,0,103,255,144,0,60,0,105,254,230,\n0,60,0,106,254,230,0,60,0,107,254,230,0,60,0,108,\n254,230,0,60,0,109,254,230,0,60,0,110,254,230,0,60,\n0,112,254,240,0,60,0,113,254,240,0,60,0,114,254,240,\n0,60,0,115,254,240,0,60,0,121,254,240,0,60,0,122,\n254,240,0,60,0,123,254,240,0,60,0,124,254,240,0,60,\n0,125,254,240,0,60,0,126,255,21,0,60,0,127,255,21,\n0,60,0,128,255,21,0,60,0,129,255,21,0,60,0,169,\n255,31,0,60,0,170,255,107,0,60,0,173,255,97,0,60,\n0,174,255,97,0,60,0,175,255,144,0,60,0,180,255,144,\n0,60,0,181,255,220,0,60,0,197,254,248,0,60,0,199,\n255,97,0,60,0,201,255,97,0,60,0,208,255,144,0,60,\n0,209,255,144,0,60,0,210,255,144,0,60,0,251,255,144,\n0,60,0,253,255,144,0,61,0,16,255,220,0,61,0,169,\n0,0,0,61,0,170,0,0,0,61,0,180,255,220,0,61,\n0,181,255,220,0,61,0,197,255,220,0,72,0,91,255,220,\n0,73,0,16,255,144,0,73,0,17,255,107,0,73,0,29,\n255,183,0,73,0,87,255,220,0,73,0,90,255,220,0,73,\n0,92,255,220,0,73,0,169,255,183,0,73,0,170,255,220,\n0,73,0,180,0,65,0,73,0,181,0,0,0,73,0,186,\n255,220,0,73,0,197,255,21,0,73,0,235,255,220,0,78,\n0,68,255,220,0,78,0,72,255,183,0,78,0,82,255,183,\n0,78,0,88,255,193,0,78,0,92,255,183,0,78,0,105,\n255,220,0,78,0,106,255,220,0,78,0,107,255,220,0,78,\n0,108,255,220,0,78,0,109,255,220,0,78,0,110,255,220,\n0,78,0,112,255,183,0,78,0,113,255,183,0,78,0,114,\n255,183,0,78,0,115,255,183,0,78,0,121,255,183,0,78,\n0,122,255,183,0,78,0,123,255,183,0,78,0,124,255,183,\n0,78,0,125,255,183,0,78,0,126,255,193,0,78,0,127,\n255,193,0,78,0,128,255,193,0,78,0,129,255,193,0,78,\n0,186,255,183,0,78,0,235,255,183,0,81,0,16,0,0,\n0,81,0,17,0,0,0,81,0,29,0,0,0,81,0,169,\n0,0,0,81,0,170,0,0,0,81,0,180,255,107,0,81,\n0,181,255,144,0,81,0,197,255,164,0,82,0,16,0,38,\n0,82,0,17,255,220,0,82,0,29,0,0,0,82,0,91,\n255,193,0,82,0,169,0,0,0,82,0,170,0,0,0,82,\n0,180,255,107,0,82,0,181,255,183,0,82,0,197,255,125,\n0,85,0,16,255,125,0,85,0,17,255,68,0,85,0,29,\n255,220,0,85,0,70,255,211,0,85,0,71,255,220,0,85,\n0,72,255,211,0,85,0,73,0,0,0,85,0,74,255,220,\n0,85,0,75,255,220,0,85,0,80,255,220,0,85,0,81,\n255,220,0,85,0,82,255,211,0,85,0,84,255,220,0,85,\n0,85,255,220,0,85,0,88,0,0,0,85,0,89,0,0,\n0,85,0,90,0,0,0,85,0,91,255,201,0,85,0,92,\n0,0,0,85,0,93,0,0,0,85,0,111,255,211,0,85,\n0,112,255,211,0,85,0,113,255,211,0,85,0,114,255,211,\n0,85,0,115,255,211,0,85,0,120,255,220,0,85,0,121,\n255,211,0,85,0,122,255,211,0,85,0,123,255,211,0,85,\n0,124,255,211,0,85,0,125,255,211,0,85,0,126,0,0,\n0,85,0,127,0,0,0,85,0,128,0,0,0,85,0,129,\n0,0,0,85,0,169,255,183,0,85,0,170,0,0,0,85,\n0,180,0,0,0,85,0,181,0,86,0,85,0,186,0,0,\n0,85,0,197,254,201,0,85,0,230,0,0,0,85,0,235,\n0,0,0,85,0,247,255,220,0,85,0,252,255,211,0,85,\n0,254,255,211,0,89,0,16,255,201,0,89,0,17,255,97,\n0,89,0,29,255,144,0,89,0,169,255,220,0,89,0,170,\n255,220,0,89,0,180,0,0,0,89,0,181,255,220,0,89,\n0,197,254,240,0,90,0,16,0,0,0,90,0,17,255,68,\n0,90,0,29,255,144,0,90,0,169,255,220,0,90,0,170,\n255,220,0,90,0,180,0,0,0,90,0,181,0,0,0,90,\n0,197,255,41,0,91,0,70,255,220,0,91,0,72,255,193,\n0,91,0,82,255,193,0,91,0,111,255,220,0,91,0,112,\n255,193,0,91,0,113,255,193,0,91,0,114,255,193,0,91,\n0,115,255,193,0,91,0,121,255,193,0,91,0,122,255,193,\n0,91,0,123,255,193,0,91,0,124,255,193,0,91,0,125,\n255,193,0,91,0,252,255,220,0,91,0,254,255,220,0,92,\n0,16,255,220,0,92,0,17,254,220,0,92,0,29,255,107,\n0,92,0,169,255,220,0,92,0,170,255,220,0,92,0,180,\n0,0,0,92,0,181,0,0,0,92,0,197,254,211,0,98,\n0,16,255,211,0,98,0,17,255,220,0,98,0,29,255,220,\n0,98,0,36,0,57,0,98,0,38,255,220,0,98,0,42,\n255,220,0,98,0,50,255,220,0,98,0,52,255,220,0,98,\n0,54,0,0,0,98,0,55,255,97,0,98,0,56,0,0,\n0,98,0,57,255,125,0,98,0,58,255,144,0,98,0,59,\n0,0,0,98,0,60,255,97,0,98,0,70,255,220,0,98,\n0,71,255,220,0,98,0,72,255,220,0,98,0,73,255,183,\n0,98,0,82,255,220,0,98,0,84,255,220,0,98,0,87,\n255,220,0,98,0,88,0,0,0,98,0,89,255,136,0,98,\n0,90,255,173,0,98,0,92,255,117,0,98,0,98,0,57,\n0,98,0,100,255,220,0,98,0,103,255,220,0,98,0,104,\n0,0,0,98,0,111,255,220,0,98,0,112,255,220,0,98,\n0,113,255,220,0,98,0,114,255,220,0,98,0,115,255,220,\n0,98,0,121,255,220,0,98,0,122,255,220,0,98,0,123,\n255,220,0,98,0,124,255,220,0,98,0,125,255,220,0,98,\n0,126,0,0,0,98,0,127,0,0,0,98,0,128,0,0,\n0,98,0,129,0,0,0,98,0,169,255,183,0,98,0,170,\n0,0,0,98,0,173,0,57,0,98,0,174,0,57,0,98,\n0,175,255,220,0,98,0,180,254,248,0,98,0,181,255,3,\n0,98,0,186,255,117,0,98,0,187,255,97,0,98,0,197,\n0,47,0,98,0,199,0,57,0,98,0,201,0,57,0,98,\n0,208,255,220,0,98,0,209,255,220,0,98,0,210,255,220,\n0,98,0,211,0,0,0,98,0,212,0,0,0,98,0,213,\n0,0,0,98,0,227,0,0,0,98,0,234,255,97,0,98,\n0,235,255,117,0,98,0,246,255,220,0,98,0,249,0,0,\n0,98,0,251,255,220,0,98,0,252,255,220,0,98,0,253,\n255,220,0,98,0,254,255,220,0,100,0,16,0,0,0,100,\n0,36,0,0,0,100,0,54,0,0,0,100,0,60,255,220,\n0,100,0,98,0,0,0,100,0,169,255,220,0,100,0,170,\n255,220,0,100,0,173,0,0,0,100,0,174,0,0,0,100,\n0,180,0,0,0,100,0,181,0,38,0,100,0,187,255,220,\n0,100,0,197,0,0,0,100,0,199,0,0,0,100,0,201,\n0,0,0,100,0,227,0,0,0,100,0,234,255,220,0,100,\n0,249,0,0,0,103,0,16,0,57,0,103,0,17,255,173,\n0,103,0,29,255,220,0,103,0,36,255,220,0,103,0,57,\n255,220,0,103,0,59,255,125,0,103,0,60,255,144,0,103,\n0,98,255,220,0,103,0,169,255,220,0,103,0,170,0,0,\n0,103,0,173,255,220,0,103,0,174,255,220,0,103,0,180,\n255,211,0,103,0,181,255,220,0,103,0,187,255,144,0,103,\n0,197,255,68,0,103,0,199,255,220,0,103,0,201,255,220,\n0,103,0,234,255,144,0,104,0,36,0,0,0,104,0,45,\n0,0,0,104,0,61,255,220,0,104,0,98,0,0,0,104,\n0,173,0,0,0,104,0,174,0,0,0,104,0,199,0,0,\n0,104,0,201,0,0,0,104,0,229,255,220,0,112,0,91,\n255,220,0,113,0,91,255,220,0,114,0,91,255,220,0,115,\n0,91,255,220,0,120,0,16,0,0,0,120,0,17,0,0,\n0,120,0,29,0,0,0,120,0,169,0,0,0,120,0,170,\n0,0,0,120,0,180,255,107,0,120,0,181,255,144,0,120,\n0,197,255,164,0,121,0,16,0,38,0,121,0,17,255,220,\n0,121,0,29,0,0,0,121,0,91,255,193,0,121,0,169,\n0,0,0,121,0,170,0,0,0,121,0,180,255,107,0,121,\n0,181,255,183,0,121,0,197,255,125,0,122,0,16,0,38,\n0,122,0,17,255,220,0,122,0,29,0,0,0,122,0,91,\n255,193,0,122,0,169,0,0,0,122,0,170,0,0,0,122,\n0,180,255,107,0,122,0,181,255,183,0,122,0,197,255,125,\n0,123,0,16,0,38,0,123,0,17,255,220,0,123,0,29,\n0,0,0,123,0,91,255,193,0,123,0,169,0,0,0,123,\n0,170,0,0,0,123,0,180,255,107,0,123,0,181,255,183,\n0,123,0,197,255,125,0,124,0,16,0,38,0,124,0,17,\n255,220,0,124,0,29,0,0,0,124,0,91,255,193,0,124,\n0,169,0,0,0,124,0,170,0,0,0,124,0,180,255,107,\n0,124,0,181,255,183,0,124,0,197,255,125,0,125,0,16,\n0,38,0,125,0,17,255,220,0,125,0,29,0,0,0,125,\n0,91,255,193,0,125,0,169,0,0,0,125,0,170,0,0,\n0,125,0,180,255,107,0,125,0,181,255,183,0,125,0,197,\n255,125,0,137,0,16,0,38,0,137,0,169,0,0,0,137,\n0,170,0,0,0,137,0,180,255,144,0,137,0,181,255,144,\n0,137,0,197,255,173,0,144,0,16,0,0,0,144,0,169,\n0,0,0,144,0,170,0,0,0,144,0,180,255,173,0,144,\n0,181,255,164,0,144,0,197,255,144,0,169,0,36,0,0,\n0,169,0,37,255,220,0,169,0,38,255,220,0,169,0,39,\n255,220,0,169,0,41,0,0,0,169,0,42,255,220,0,169,\n0,43,0,0,0,169,0,45,255,220,0,169,0,46,0,0,\n0,169,0,47,0,0,0,169,0,50,0,0,0,169,0,51,\n0,0,0,169,0,52,0,0,0,169,0,53,0,0,0,169,\n0,55,255,144,0,169,0,57,255,144,0,169,0,58,255,220,\n0,169,0,59,0,0,0,169,0,60,255,107,0,169,0,61,\n0,0,0,169,0,73,0,0,0,169,0,81,0,0,0,169,\n0,82,0,0,0,169,0,85,0,0,0,169,0,89,255,220,\n0,169,0,90,255,220,0,169,0,92,255,220,0,169,0,98,\n0,0,0,169,0,100,255,220,0,169,0,103,0,0,0,169,\n0,120,0,0,0,169,0,121,0,0,0,169,0,122,0,0,\n0,169,0,123,0,0,0,169,0,124,0,0,0,169,0,125,\n0,0,0,169,0,137,0,0,0,169,0,144,0,151,0,169,\n0,173,0,0,0,169,0,174,0,0,0,169,0,175,0,0,\n0,169,0,186,255,220,0,169,0,187,255,107,0,169,0,199,\n0,0,0,169,0,201,0,0,0,169,0,208,0,0,0,169,\n0,209,0,0,0,169,0,210,0,0,0,169,0,229,0,0,\n0,169,0,233,0,0,0,169,0,234,255,107,0,169,0,235,\n255,220,0,169,0,236,0,0,0,169,0,246,255,220,0,169,\n0,251,255,220,0,169,0,253,255,220,0,170,0,36,255,183,\n0,170,0,37,255,183,0,170,0,38,255,220,0,170,0,39,\n255,220,0,170,0,41,0,0,0,170,0,42,0,0,0,170,\n0,43,0,0,0,170,0,45,255,220,0,170,0,46,0,0,\n0,170,0,47,0,0,0,170,0,50,255,220,0,170,0,51,\n0,0,0,170,0,52,0,0,0,170,0,53,0,0,0,170,\n0,55,255,68,0,170,0,57,255,78,0,170,0,58,255,144,\n0,170,0,59,255,144,0,170,0,60,255,31,0,170,0,61,\n0,0,0,170,0,73,0,0,0,170,0,81,0,0,0,170,\n0,82,0,0,0,170,0,85,0,0,0,170,0,89,255,220,\n0,170,0,90,255,220,0,170,0,92,255,220,0,170,0,98,\n255,183,0,170,0,100,255,220,0,170,0,103,255,220,0,170,\n0,120,0,0,0,170,0,121,0,0,0,170,0,122,0,0,\n0,170,0,123,0,0,0,170,0,124,0,0,0,170,0,125,\n0,0,0,170,0,137,0,0,0,170,0,144,0,0,0,170,\n0,173,255,183,0,170,0,174,255,183,0,170,0,175,255,220,\n0,170,0,186,255,220,0,170,0,187,255,31,0,170,0,199,\n255,183,0,170,0,201,255,183,0,170,0,208,255,220,0,170,\n0,209,255,220,0,170,0,210,255,220,0,170,0,229,0,0,\n0,170,0,233,0,0,0,170,0,234,255,31,0,170,0,235,\n255,220,0,170,0,236,0,0,0,170,0,246,0,0,0,170,\n0,251,255,220,0,170,0,253,255,220,0,173,0,16,255,211,\n0,173,0,17,255,220,0,173,0,29,255,220,0,173,0,36,\n0,57,0,173,0,38,255,220,0,173,0,42,255,220,0,173,\n0,50,255,220,0,173,0,52,255,220,0,173,0,54,0,0,\n0,173,0,55,255,97,0,173,0,56,0,0,0,173,0,57,\n255,125,0,173,0,58,255,144,0,173,0,59,0,0,0,173,\n0,60,255,97,0,173,0,70,255,220,0,173,0,71,255,220,\n0,173,0,72,255,220,0,173,0,73,255,183,0,173,0,82,\n255,220,0,173,0,84,255,220,0,173,0,87,255,220,0,173,\n0,88,0,0,0,173,0,89,255,136,0,173,0,90,255,173,\n0,173,0,92,255,117,0,173,0,98,0,57,0,173,0,100,\n255,220,0,173,0,103,255,220,0,173,0,104,0,0,0,173,\n0,111,255,220,0,173,0,112,255,220,0,173,0,113,255,220,\n0,173,0,114,255,220,0,173,0,115,255,220,0,173,0,121,\n255,220,0,173,0,122,255,220,0,173,0,123,255,220,0,173,\n0,124,255,220,0,173,0,125,255,220,0,173,0,126,0,0,\n0,173,0,127,0,0,0,173,0,128,0,0,0,173,0,129,\n0,0,0,173,0,169,255,183,0,173,0,170,0,0,0,173,\n0,173,0,57,0,173,0,174,0,57,0,173,0,175,255,220,\n0,173,0,180,254,248,0,173,0,181,255,3,0,173,0,186,\n255,117,0,173,0,187,255,97,0,173,0,197,0,47,0,173,\n0,199,0,57,0,173,0,201,0,57,0,173,0,208,255,220,\n0,173,0,209,255,220,0,173,0,210,255,220,0,173,0,211,\n0,0,0,173,0,212,0,0,0,173,0,213,0,0,0,173,\n0,227,0,0,0,173,0,234,255,97,0,173,0,235,255,117,\n0,173,0,246,255,220,0,173,0,249,0,0,0,173,0,251,\n255,220,0,173,0,252,255,220,0,173,0,253,255,220,0,173,\n0,254,255,220,0,174,0,16,255,211,0,174,0,17,255,220,\n0,174,0,29,255,220,0,174,0,36,0,57,0,174,0,38,\n255,220,0,174,0,42,255,220,0,174,0,50,255,220,0,174,\n0,52,255,220,0,174,0,54,0,0,0,174,0,55,255,97,\n0,174,0,56,0,0,0,174,0,57,255,125,0,174,0,58,\n255,144,0,174,0,59,0,0,0,174,0,60,255,97,0,174,\n0,70,255,220,0,174,0,71,255,220,0,174,0,72,255,220,\n0,174,0,73,255,183,0,174,0,82,255,220,0,174,0,84,\n255,220,0,174,0,87,255,220,0,174,0,88,0,0,0,174,\n0,89,255,136,0,174,0,90,255,173,0,174,0,92,255,117,\n0,174,0,98,0,57,0,174,0,100,255,220,0,174,0,103,\n255,220,0,174,0,104,0,0,0,174,0,111,255,220,0,174,\n0,112,255,220,0,174,0,113,255,220,0,174,0,114,255,220,\n0,174,0,115,255,220,0,174,0,121,255,220,0,174,0,122,\n255,220,0,174,0,123,255,220,0,174,0,124,255,220,0,174,\n0,125,255,220,0,174,0,126,0,0,0,174,0,127,0,0,\n0,174,0,128,0,0,0,174,0,129,0,0,0,174,0,169,\n255,183,0,174,0,170,0,0,0,174,0,173,0,57,0,174,\n0,174,0,57,0,174,0,175,255,220,0,174,0,180,254,248,\n0,174,0,181,255,3,0,174,0,186,255,117,0,174,0,187,\n255,97,0,174,0,197,0,47,0,174,0,199,0,57,0,174,\n0,201,0,57,0,174,0,208,255,220,0,174,0,209,255,220,\n0,174,0,210,255,220,0,174,0,211,0,0,0,174,0,212,\n0,0,0,174,0,213,0,0,0,174,0,227,0,0,0,174,\n0,234,255,97,0,174,0,235,255,117,0,174,0,246,255,220,\n0,174,0,249,0,0,0,174,0,251,255,220,0,174,0,252,\n255,220,0,174,0,253,255,220,0,174,0,254,255,220,0,175,\n0,16,0,57,0,175,0,17,255,173,0,175,0,29,255,220,\n0,175,0,36,255,220,0,175,0,57,255,220,0,175,0,59,\n255,125,0,175,0,60,255,144,0,175,0,98,255,220,0,175,\n0,169,255,220,0,175,0,170,0,0,0,175,0,173,255,220,\n0,175,0,174,255,220,0,175,0,180,255,211,0,175,0,181,\n255,220,0,175,0,187,255,144,0,175,0,197,255,68,0,175,\n0,199,255,220,0,175,0,201,255,220,0,175,0,234,255,144,\n0,180,0,36,254,248,0,180,0,37,255,193,0,180,0,38,\n255,183,0,180,0,39,255,193,0,180,0,41,255,193,0,180,\n0,42,255,183,0,180,0,43,255,193,0,180,0,45,255,193,\n0,180,0,46,255,193,0,180,0,47,255,193,0,180,0,50,\n255,183,0,180,0,51,255,193,0,180,0,52,255,183,0,180,\n0,53,255,193,0,180,0,55,0,0,0,180,0,57,0,0,\n0,180,0,58,0,0,0,180,0,59,255,136,0,180,0,60,\n0,0,0,180,0,61,255,220,0,180,0,73,255,183,0,180,\n0,81,255,144,0,180,0,82,255,107,0,180,0,85,255,144,\n0,180,0,89,255,183,0,180,0,90,255,183,0,180,0,92,\n255,183,0,180,0,98,254,248,0,180,0,100,255,183,0,180,\n0,103,255,183,0,180,0,120,255,144,0,180,0,121,255,107,\n0,180,0,122,255,107,0,180,0,123,255,107,0,180,0,124,\n255,107,0,180,0,125,255,107,0,180,0,137,255,193,0,180,\n0,144,254,125,0,180,0,173,254,248,0,180,0,174,254,248,\n0,180,0,175,255,183,0,180,0,186,255,183,0,180,0,187,\n0,0,0,180,0,199,254,248,0,180,0,201,254,248,0,180,\n0,208,255,183,0,180,0,209,255,183,0,180,0,210,255,183,\n0,180,0,229,255,220,0,180,0,233,255,183,0,180,0,234,\n0,0,0,180,0,235,255,183,0,180,0,236,255,193,0,180,\n0,246,255,183,0,180,0,251,255,183,0,180,0,253,255,183,\n0,186,0,16,255,220,0,186,0,17,254,220,0,186,0,29,\n255,107,0,186,0,169,255,220,0,186,0,170,255,220,0,186,\n0,180,0,0,0,186,0,181,0,0,0,186,0,197,254,211,\n0,187,0,16,255,13,0,187,0,17,254,97,0,187,0,29,\n254,240,0,187,0,36,255,97,0,187,0,38,255,144,0,187,\n0,50,255,144,0,187,0,68,254,230,0,187,0,72,254,240,\n0,187,0,76,255,183,0,187,0,82,254,240,0,187,0,88,\n255,21,0,187,0,98,255,97,0,187,0,100,255,144,0,187,\n0,103,255,144,0,187,0,105,254,230,0,187,0,106,254,230,\n0,187,0,107,254,230,0,187,0,108,254,230,0,187,0,109,\n254,230,0,187,0,110,254,230,0,187,0,112,254,240,0,187,\n0,113,254,240,0,187,0,114,254,240,0,187,0,115,254,240,\n0,187,0,121,254,240,0,187,0,122,254,240,0,187,0,123,\n254,240,0,187,0,124,254,240,0,187,0,125,254,240,0,187,\n0,126,255,21,0,187,0,127,255,21,0,187,0,128,255,21,\n0,187,0,129,255,21,0,187,0,169,255,31,0,187,0,170,\n255,107,0,187,0,173,255,97,0,187,0,174,255,97,0,187,\n0,175,255,144,0,187,0,180,255,144,0,187,0,181,255,220,\n0,187,0,197,254,248,0,187,0,199,255,97,0,187,0,201,\n255,97,0,187,0,208,255,144,0,187,0,209,255,144,0,187,\n0,210,255,144,0,187,0,251,255,144,0,187,0,253,255,144,\n0,197,0,36,0,38,0,197,0,37,255,183,0,197,0,38,\n255,144,0,197,0,39,255,183,0,197,0,41,255,183,0,197,\n0,42,255,183,0,197,0,43,255,183,0,197,0,45,0,47,\n0,197,0,46,255,183,0,197,0,47,255,183,0,197,0,50,\n255,144,0,197,0,51,255,183,0,197,0,52,255,144,0,197,\n0,53,255,183,0,197,0,55,254,230,0,197,0,57,254,136,\n0,197,0,58,255,3,0,197,0,59,255,183,0,197,0,60,\n254,136,0,197,0,61,0,0,0,197,0,73,255,220,0,197,\n0,81,255,183,0,197,0,82,255,183,0,197,0,85,255,183,\n0,197,0,89,255,21,0,197,0,90,255,60,0,197,0,92,\n255,144,0,197,0,98,0,38,0,197,0,100,255,144,0,197,\n0,103,255,144,0,197,0,120,255,183,0,197,0,121,255,183,\n0,197,0,122,255,183,0,197,0,123,255,183,0,197,0,124,\n255,183,0,197,0,125,255,183,0,197,0,137,255,183,0,197,\n0,144,0,38,0,197,0,173,0,38,0,197,0,174,0,38,\n0,197,0,175,255,144,0,197,0,186,255,144,0,197,0,187,\n254,136,0,197,0,199,0,38,0,197,0,201,0,38,0,197,\n0,208,255,144,0,197,0,209,255,144,0,197,0,210,255,144,\n0,197,0,229,0,0,0,197,0,233,255,183,0,197,0,234,\n254,136,0,197,0,235,255,144,0,197,0,236,255,183,0,197,\n0,246,255,183,0,197,0,251,255,144,0,197,0,253,255,144,\n0,199,0,16,255,211,0,199,0,17,255,220,0,199,0,29,\n255,220,0,199,0,36,0,57,0,199,0,38,255,220,0,199,\n0,42,255,220,0,199,0,50,255,220,0,199,0,52,255,220,\n0,199,0,54,0,0,0,199,0,55,255,97,0,199,0,56,\n0,0,0,199,0,57,255,125,0,199,0,58,255,144,0,199,\n0,59,0,0,0,199,0,60,255,97,0,199,0,70,255,220,\n0,199,0,71,255,220,0,199,0,72,255,220,0,199,0,73,\n255,183,0,199,0,82,255,220,0,199,0,84,255,220,0,199,\n0,87,255,220,0,199,0,88,0,0,0,199,0,89,255,136,\n0,199,0,90,255,173,0,199,0,92,255,117,0,199,0,98,\n0,57,0,199,0,100,255,220,0,199,0,103,255,220,0,199,\n0,104,0,0,0,199,0,111,255,220,0,199,0,112,255,220,\n0,199,0,113,255,220,0,199,0,114,255,220,0,199,0,115,\n255,220,0,199,0,121,255,220,0,199,0,122,255,220,0,199,\n0,123,255,220,0,199,0,124,255,220,0,199,0,125,255,220,\n0,199,0,126,0,0,0,199,0,127,0,0,0,199,0,128,\n0,0,0,199,0,129,0,0,0,199,0,169,255,183,0,199,\n0,170,0,0,0,199,0,173,0,57,0,199,0,174,0,57,\n0,199,0,175,255,220,0,199,0,180,254,248,0,199,0,181,\n255,3,0,199,0,186,255,117,0,199,0,187,255,97,0,199,\n0,197,0,47,0,199,0,199,0,57,0,199,0,201,0,57,\n0,199,0,208,255,220,0,199,0,209,255,220,0,199,0,210,\n255,220,0,199,0,211,0,0,0,199,0,212,0,0,0,199,\n0,213,0,0,0,199,0,227,0,0,0,199,0,234,255,97,\n0,199,0,235,255,117,0,199,0,246,255,220,0,199,0,249,\n0,0,0,199,0,251,255,220,0,199,0,252,255,220,0,199,\n0,253,255,220,0,199,0,254,255,220,0,201,0,16,255,211,\n0,201,0,17,255,220,0,201,0,29,255,220,0,201,0,36,\n0,57,0,201,0,38,255,220,0,201,0,42,255,220,0,201,\n0,50,255,220,0,201,0,52,255,220,0,201,0,54,0,0,\n0,201,0,55,255,97,0,201,0,56,0,0,0,201,0,57,\n255,125,0,201,0,58,255,144,0,201,0,59,0,0,0,201,\n0,60,255,97,0,201,0,70,255,220,0,201,0,71,255,220,\n0,201,0,72,255,220,0,201,0,73,255,183,0,201,0,82,\n255,220,0,201,0,84,255,220,0,201,0,87,255,220,0,201,\n0,88,0,0,0,201,0,89,255,136,0,201,0,90,255,173,\n0,201,0,92,255,117,0,201,0,98,0,57,0,201,0,100,\n255,220,0,201,0,103,255,220,0,201,0,104,0,0,0,201,\n0,111,255,220,0,201,0,112,255,220,0,201,0,113,255,220,\n0,201,0,114,255,220,0,201,0,115,255,220,0,201,0,121,\n255,220,0,201,0,122,255,220,0,201,0,123,255,220,0,201,\n0,124,255,220,0,201,0,125,255,220,0,201,0,126,0,0,\n0,201,0,127,0,0,0,201,0,128,0,0,0,201,0,129,\n0,0,0,201,0,169,255,183,0,201,0,170,0,0,0,201,\n0,173,0,57,0,201,0,174,0,57,0,201,0,175,255,220,\n0,201,0,180,254,248,0,201,0,181,255,3,0,201,0,186,\n255,117,0,201,0,187,255,97,0,201,0,197,0,47,0,201,\n0,199,0,57,0,201,0,201,0,57,0,201,0,208,255,220,\n0,201,0,209,255,220,0,201,0,210,255,220,0,201,0,211,\n0,0,0,201,0,212,0,0,0,201,0,213,0,0,0,201,\n0,227,0,0,0,201,0,234,255,97,0,201,0,235,255,117,\n0,201,0,246,255,220,0,201,0,249,0,0,0,201,0,251,\n255,220,0,201,0,252,255,220,0,201,0,253,255,220,0,201,\n0,254,255,220,0,208,0,16,0,57,0,208,0,17,255,173,\n0,208,0,29,255,220,0,208,0,36,255,220,0,208,0,57,\n255,220,0,208,0,59,255,125,0,208,0,60,255,144,0,208,\n0,98,255,220,0,208,0,169,255,220,0,208,0,170,0,0,\n0,208,0,173,255,220,0,208,0,174,255,220,0,208,0,180,\n255,211,0,208,0,181,255,220,0,208,0,187,255,144,0,208,\n0,197,255,68,0,208,0,199,255,220,0,208,0,201,255,220,\n0,208,0,234,255,144,0,209,0,16,0,57,0,209,0,17,\n255,173,0,209,0,29,255,220,0,209,0,36,255,220,0,209,\n0,57,255,220,0,209,0,59,255,125,0,209,0,60,255,144,\n0,209,0,98,255,220,0,209,0,169,255,220,0,209,0,170,\n0,0,0,209,0,173,255,220,0,209,0,174,255,220,0,209,\n0,180,255,211,0,209,0,181,255,220,0,209,0,187,255,144,\n0,209,0,197,255,68,0,209,0,199,255,220,0,209,0,201,\n255,220,0,209,0,234,255,144,0,210,0,16,0,57,0,210,\n0,17,255,173,0,210,0,29,255,220,0,210,0,36,255,220,\n0,210,0,57,255,220,0,210,0,59,255,125,0,210,0,60,\n255,144,0,210,0,98,255,220,0,210,0,169,255,220,0,210,\n0,170,0,0,0,210,0,173,255,220,0,210,0,174,255,220,\n0,210,0,180,255,211,0,210,0,181,255,220,0,210,0,187,\n255,144,0,210,0,197,255,68,0,210,0,199,255,220,0,210,\n0,201,255,220,0,210,0,234,255,144,0,211,0,36,0,0,\n0,211,0,45,0,0,0,211,0,61,255,220,0,211,0,98,\n0,0,0,211,0,173,0,0,0,211,0,174,0,0,0,211,\n0,199,0,0,0,211,0,201,0,0,0,211,0,229,255,220,\n0,212,0,36,0,0,0,212,0,45,0,0,0,212,0,61,\n255,220,0,212,0,98,0,0,0,212,0,173,0,0,0,212,\n0,174,0,0,0,212,0,199,0,0,0,212,0,201,0,0,\n0,212,0,229,255,220,0,213,0,36,0,0,0,213,0,45,\n0,0,0,213,0,61,255,220,0,213,0,98,0,0,0,213,\n0,173,0,0,0,213,0,174,0,0,0,213,0,199,0,0,\n0,213,0,201,0,0,0,213,0,229,255,220,0,227,0,36,\n0,38,0,227,0,38,0,0,0,227,0,42,0,0,0,227,\n0,50,0,0,0,227,0,52,0,0,0,227,0,54,0,0,\n0,227,0,98,0,38,0,227,0,100,0,0,0,227,0,103,\n0,0,0,227,0,173,0,38,0,227,0,174,0,38,0,227,\n0,175,0,0,0,227,0,199,0,38,0,227,0,201,0,38,\n0,227,0,208,0,0,0,227,0,209,0,0,0,227,0,210,\n0,0,0,227,0,227,0,0,0,227,0,246,0,0,0,227,\n0,249,0,0,0,227,0,251,0,0,0,227,0,253,0,0,\n0,229,0,16,255,220,0,229,0,169,0,0,0,229,0,170,\n0,0,0,229,0,180,255,220,0,229,0,181,255,220,0,229,\n0,197,255,220,0,233,0,16,0,0,0,233,0,169,0,0,\n0,233,0,170,0,0,0,233,0,180,255,164,0,233,0,181,\n255,144,0,233,0,197,255,183,0,234,0,16,255,13,0,234,\n0,17,254,97,0,234,0,29,254,240,0,234,0,36,255,97,\n0,234,0,38,255,144,0,234,0,50,255,144,0,234,0,68,\n254,230,0,234,0,72,254,240,0,234,0,76,255,183,0,234,\n0,82,254,240,0,234,0,88,255,21,0,234,0,98,255,97,\n0,234,0,100,255,144,0,234,0,103,255,144,0,234,0,105,\n254,230,0,234,0,106,254,230,0,234,0,107,254,230,0,234,\n0,108,254,230,0,234,0,109,254,230,0,234,0,110,254,230,\n0,234,0,112,254,240,0,234,0,113,254,240,0,234,0,114,\n254,240,0,234,0,115,254,240,0,234,0,121,254,240,0,234,\n0,122,254,240,0,234,0,123,254,240,0,234,0,124,254,240,\n0,234,0,125,254,240,0,234,0,126,255,21,0,234,0,127,\n255,21,0,234,0,128,255,21,0,234,0,129,255,21,0,234,\n0,169,255,31,0,234,0,170,255,107,0,234,0,173,255,97,\n0,234,0,174,255,97,0,234,0,175,255,144,0,234,0,180,\n255,144,0,234,0,181,255,220,0,234,0,197,254,248,0,234,\n0,199,255,97,0,234,0,201,255,97,0,234,0,208,255,144,\n0,234,0,209,255,144,0,234,0,210,255,144,0,234,0,251,\n255,144,0,234,0,253,255,144,0,235,0,16,255,220,0,235,\n0,17,254,220,0,235,0,29,255,107,0,235,0,169,255,220,\n0,235,0,170,255,220,0,235,0,180,0,0,0,235,0,181,\n0,0,0,235,0,197,254,211,0,236,0,16,0,0,0,236,\n0,17,255,107,0,236,0,29,255,183,0,236,0,169,0,0,\n0,236,0,170,0,0,0,236,0,180,255,220,0,236,0,181,\n0,0,0,236,0,197,255,68,0,246,0,16,0,0,0,246,\n0,36,0,0,0,246,0,55,255,183,0,246,0,58,0,0,\n0,246,0,60,255,154,0,246,0,98,0,0,0,246,0,169,\n255,220,0,246,0,170,255,220,0,246,0,173,0,0,0,246,\n0,174,0,0,0,246,0,180,255,211,0,246,0,181,255,211,\n0,246,0,187,255,154,0,246,0,197,255,201,0,246,0,199,\n0,0,0,246,0,201,0,0,0,246,0,234,255,154,0,249,\n0,36,0,38,0,249,0,38,0,0,0,249,0,42,0,0,\n0,249,0,50,0,0,0,249,0,52,0,0,0,249,0,54,\n0,0,0,249,0,98,0,38,0,249,0,100,0,0,0,249,\n0,103,0,0,0,249,0,173,0,38,0,249,0,174,0,38,\n0,249,0,175,0,0,0,249,0,199,0,38,0,249,0,201,\n0,38,0,249,0,208,0,0,0,249,0,209,0,0,0,249,\n0,210,0,0,0,249,0,227,0,0,0,249,0,246,0,0,\n0,249,0,249,0,0,0,249,0,251,0,0,0,249,0,253,\n0,0,0,251,0,16,0,0,0,251,0,36,0,0,0,251,\n0,54,0,0,0,251,0,60,255,220,0,251,0,98,0,0,\n0,251,0,169,255,220,0,251,0,170,255,220,0,251,0,173,\n0,0,0,251,0,174,0,0,0,251,0,180,0,0,0,251,\n0,181,0,38,0,251,0,187,255,220,0,251,0,197,0,0,\n0,251,0,199,0,0,0,251,0,201,0,0,0,251,0,227,\n0,0,0,251,0,234,255,220,0,251,0,249,0,0,0,253,\n0,16,0,0,0,253,0,36,0,0,0,253,0,54,0,0,\n0,253,0,60,255,220,0,253,0,98,0,0,0,253,0,169,\n255,220,0,253,0,170,255,220,0,253,0,173,0,0,0,253,\n0,174,0,0,0,253,0,180,0,0,0,253,0,181,0,38,\n0,253,0,187,255,220,0,253,0,197,0,0,0,253,0,199,\n0,0,0,253,0,201,0,0,0,253,0,227,0,0,0,253,\n0,234,255,220,0,253,0,249,0,0,0,0,0,1,0,0,\n1,12,0,77,0,7,0,66,0,4,0,2,0,16,0,64,\n0,7,0,0,4,21,5,104,0,3,0,1,0,1,0,0,\n7,109,254,29,0,0,10,188,254,137,254,137,10,76,0,1,\n0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,12,\n0,1,4,14,1,144,0,5,0,4,5,71,4,204,0,0,\n254,66,5,71,4,204,0,0,2,83,0,143,2,102,8,2,\n2,11,6,3,3,8,4,2,2,4,128,0,0,175,16,0,\n32,74,0,0,0,0,0,0,0,0,66,105,116,115,0,64,\n0,32,251,2,6,20,254,20,1,154,7,109,1,227,0,0,\n0,1,0,0,0,0,0,0,0,1,0,0,66,0,29,177,\n2,139,4,96,0,0,35,99,5,213,0,0,86,101,114,97,\n83,97,110,115,0,0,0,0,0,0,0,0,255,255,255,255,\n54,255,255,254,54,50,56,82,48,48,0,0,64,0,0,0,\n0,0,0,20,0,0,1,16,9,12,5,0,3,3,3,4,\n8,6,9,8,2,4,4,5,8,3,3,3,3,6,6,6,\n6,6,6,6,6,6,6,3,3,8,8,8,5,10,6,7,\n7,7,6,6,7,7,3,3,6,5,8,7,7,6,7,6,\n7,5,7,6,7,6,5,5,4,3,4,8,5,5,6,6,\n6,6,6,3,6,6,3,3,5,3,9,6,6,6,6,4,\n5,4,6,5,7,5,5,6,5,3,5,8,6,6,7,6,\n7,7,7,6,6,6,6,6,6,6,6,6,6,6,3,3,\n3,3,6,6,6,6,6,6,6,6,6,6,5,5,6,6,\n5,5,6,6,9,9,9,5,5,8,9,7,8,8,8,8,\n6,6,5,6,7,5,5,4,4,7,9,6,5,3,8,6,\n6,8,6,6,6,9,6,6,6,7,10,9,5,9,5,5,\n3,3,8,4,5,5,2,6,4,4,6,6,5,3,3,5,\n12,6,6,6,6,6,3,3,3,3,7,7,7,7,7,7,\n3,5,5,5,5,5,5,5,5,5,5,5,3,7,5,5,\n6,3,7,6,5,5,6,6,8,8,4,4,4,9,9,9,\n7,6,3,7,5,7,6,7,6,6,3,3,6,5,5,5,\n5,5,5,4,5,5,0,0,10,13,6,0,3,3,4,5,\n8,6,10,9,3,4,4,5,8,3,4,3,3,6,6,6,\n6,6,6,6,6,6,6,3,3,8,8,8,5,11,7,7,\n8,8,7,6,8,8,3,3,7,6,9,8,8,7,8,7,\n7,5,8,7,9,6,7,6,4,3,4,8,5,5,6,6,\n5,6,6,4,6,6,2,2,5,2,10,6,6,6,6,4,\n5,4,6,6,8,6,6,5,6,3,6,8,7,7,8,7,\n8,8,8,6,6,6,6,6,6,5,6,6,6,6,2,2,\n2,2,6,6,6,6,6,6,6,6,6,6,5,5,6,6,\n5,6,6,6,10,10,10,5,5,8,10,8,8,8,8,8,\n6,7,5,7,8,6,5,5,5,8,10,6,5,4,8,6,\n6,8,7,6,6,10,6,7,7,8,11,10,5,10,5,5,\n3,3,8,5,6,7,2,6,4,4,6,6,5,3,3,5,\n13,7,7,7,7,7,3,3,3,3,8,8,8,8,8,8,\n2,5,5,5,5,5,5,5,5,5,5,6,2,7,5,6,\n5,3,8,6,7,6,7,6,8,8,4,4,4,10,10,10,\n8,6,3,7,5,8,5,8,5,6,4,3,6,5,5,5,\n5,5,5,4,5,5,0,0,11,15,7,0,3,3,3,5,\n9,7,10,10,3,4,4,6,9,4,4,4,4,7,7,7,\n7,7,7,7,7,7,7,4,4,9,9,9,6,12,7,8,\n8,8,7,6,9,8,3,3,7,6,9,8,9,7,9,7,\n8,7,8,7,9,7,7,9,4,4,4,9,6,6,7,7,\n6,7,7,4,7,7,3,3,6,3,11,7,7,7,7,5,\n7,4,7,6,9,6,6,5,7,4,7,9,7,7,8,7,\n8,9,8,7,7,7,7,7,7,6,7,7,7,7,3,3,\n3,3,7,7,7,7,7,7,7,7,7,7,6,6,7,7,\n6,6,7,7,11,11,11,6,6,9,11,9,9,9,9,9,\n7,7,6,7,8,6,6,5,5,8,11,7,6,3,9,7,\n7,9,7,7,7,11,7,7,7,9,12,11,6,11,6,6,\n4,4,9,5,6,7,2,7,4,4,7,7,6,4,4,6,\n15,7,7,7,7,7,3,3,3,3,9,9,9,8,8,8,\n3,6,6,6,6,6,6,6,6,6,6,6,3,8,7,9,\n5,4,8,7,7,6,7,7,9,9,4,4,4,11,11,11,\n9,7,3,8,7,8,6,8,6,7,4,4,7,6,6,6,\n6,6,6,4,6,6,0,0,12,16,7,0,4,4,5,5,\n10,8,11,10,3,5,5,6,10,4,4,4,4,8,8,8,\n8,8,8,8,8,8,8,4,4,10,10,10,6,13,8,8,\n8,9,8,7,9,9,3,3,7,6,10,9,9,8,9,8,\n8,7,9,8,11,9,7,9,5,4,5,10,6,6,8,8,\n7,8,8,4,8,8,3,3,7,3,11,8,8,8,8,5,\n7,5,8,6,9,6,6,5,8,4,8,10,8,8,8,8,\n9,9,9,8,8,8,8,8,8,7,8,8,8,8,3,3,\n3,3,8,8,8,8,8,8,8,8,8,8,6,6,8,8,\n6,7,8,8,12,12,12,6,6,10,12,9,10,10,10,10,\n8,8,6,8,9,7,6,6,6,9,12,8,6,5,10,8,\n8,10,8,7,7,12,8,8,8,9,13,13,6,12,6,6,\n4,4,10,6,6,7,2,8,5,5,7,7,6,4,4,6,\n16,8,8,8,8,8,3,3,3,3,9,9,9,9,9,9,\n3,6,6,6,6,6,6,6,6,6,6,6,3,8,7,9,\n5,4,9,8,7,6,8,8,10,10,5,5,5,12,12,12,\n9,8,3,8,7,8,7,8,7,8,4,4,8,6,6,6,\n6,6,6,5,6,6,0,0,13,17,8,0,4,4,5,5,\n11,8,12,11,3,5,5,7,11,4,5,4,4,8,8,8,\n8,8,8,8,8,8,8,4,4,11,11,11,7,13,9,9,\n9,10,8,7,10,10,3,3,8,7,11,10,10,8,10,8,\n9,7,10,9,11,10,7,10,5,4,5,11,7,7,8,8,\n7,8,8,4,8,8,3,3,7,3,13,8,8,8,8,5,\n7,5,8,7,9,7,7,7,8,4,8,11,9,9,9,8,\n10,10,10,8,8,8,8,8,8,7,8,8,8,8,3,3,\n3,3,8,8,8,8,8,8,8,8,8,8,7,7,8,8,\n7,8,8,8,13,13,13,7,7,11,13,10,11,11,11,11,\n8,8,7,9,10,8,7,6,6,10,13,8,7,5,11,8,\n8,11,9,8,8,13,8,9,9,10,14,13,7,13,7,7,\n4,4,11,6,7,7,2,8,5,5,8,8,7,4,4,7,\n17,9,8,9,8,8,3,3,3,3,10,10,10,10,10,10,\n3,7,7,7,7,7,7,7,7,7,7,7,3,9,7,10,\n7,4,10,8,7,7,8,8,11,11,5,5,5,13,13,13,\n10,8,3,9,7,9,7,9,7,8,5,4,8,7,7,7,\n7,7,7,5,7,7,0,0,14,19,8,0,4,4,5,5,\n12,9,13,12,3,5,5,7,12,4,5,4,5,9,9,9,\n9,9,9,9,9,9,9,5,5,12,12,12,7,14,9,10,\n10,11,9,8,11,10,3,3,9,7,12,10,11,9,11,10,\n9,9,10,9,13,11,9,10,5,5,5,12,7,7,8,9,\n8,9,9,4,9,9,3,3,8,3,13,9,9,9,9,5,\n8,5,9,7,11,7,7,8,9,5,9,12,9,9,10,9,\n10,11,10,8,8,8,8,8,8,8,9,9,9,9,3,3,\n3,3,9,9,9,9,9,9,9,9,9,9,7,7,9,9,\n7,8,9,9,14,14,14,7,7,12,14,11,12,12,12,12,\n9,9,7,9,11,8,7,7,7,11,14,9,7,5,12,9,\n9,12,9,9,9,14,9,9,9,11,15,15,7,14,7,7,\n4,4,12,7,7,9,2,9,6,6,8,8,7,4,4,7,\n19,9,9,9,9,9,3,3,3,3,11,11,11,10,10,10,\n3,7,7,7,7,7,7,7,7,7,7,7,3,9,8,10,\n8,5,11,9,9,7,9,9,12,12,6,6,6,14,14,14,\n11,9,3,9,8,10,8,10,8,9,5,4,9,7,7,7,\n7,7,7,6,7,7,0,0,15,20,9,0,5,5,6,6,\n13,10,14,11,3,6,6,8,13,5,5,5,5,10,10,10,\n10,10,10,10,10,10,10,5,5,13,13,13,8,15,10,10,\n10,11,9,9,12,11,3,3,10,8,13,11,12,9,12,10,\n10,9,11,10,15,10,9,11,6,5,6,13,8,8,9,9,\n8,9,9,5,9,9,3,3,8,3,15,9,9,9,9,6,\n8,6,9,8,13,10,8,8,10,5,10,13,10,10,10,9,\n11,12,11,9,9,9,9,9,9,8,9,9,9,9,3,3,\n3,3,9,9,9,9,9,9,9,9,9,9,8,8,10,10,\n8,9,10,9,15,15,15,8,8,13,15,12,13,13,13,13,\n10,9,8,10,11,9,8,7,7,11,15,9,8,6,13,10,\n10,13,10,9,9,15,10,10,10,12,16,15,8,15,8,8,\n5,5,13,7,8,9,3,10,6,6,9,9,8,5,5,8,\n20,10,9,10,9,9,3,3,3,3,12,12,12,11,11,11,\n3,8,8,8,8,8,8,8,8,8,8,8,3,10,8,11,\n8,5,12,9,9,8,9,9,13,13,6,6,6,15,15,15,\n12,9,3,10,8,10,8,10,8,9,5,5,10,8,8,8,\n8,8,8,6,8,8,0,0,16,21,10,0,5,5,6,6,\n13,10,15,12,3,6,6,8,13,5,6,5,5,10,10,10,\n10,10,10,10,10,10,10,5,5,13,13,13,9,16,11,11,\n11,12,10,9,12,12,5,5,10,9,13,12,13,10,13,11,\n10,9,12,11,17,11,9,12,6,5,6,13,8,8,9,10,\n9,10,9,6,10,10,3,3,9,3,15,10,10,10,10,7,\n9,6,10,9,13,10,9,9,10,5,10,13,11,11,11,10,\n12,13,12,9,9,9,9,9,9,9,9,9,9,9,3,3,\n3,3,10,10,10,10,10,10,10,10,10,10,8,8,10,10,\n8,9,10,10,16,16,16,8,8,13,16,13,13,13,13,13,\n10,10,8,11,12,9,8,8,8,12,16,10,9,6,13,10,\n10,13,11,10,10,16,10,11,11,13,17,15,8,16,8,8,\n5,5,13,8,9,9,3,10,6,6,10,10,8,5,5,8,\n21,11,10,11,10,10,5,5,5,5,13,13,13,12,12,12,\n3,8,8,8,8,8,8,8,8,8,8,9,4,10,9,12,\n9,5,13,10,9,9,10,10,13,13,6,6,6,16,16,16,\n12,10,5,10,9,11,9,11,9,10,6,5,10,8,8,8,\n8,8,8,6,8,8,0,0,17,23,10,0,5,5,7,8,\n14,11,16,13,5,7,7,9,14,5,6,5,6,11,11,11,\n11,11,11,11,11,11,11,6,6,14,14,14,9,17,11,12,\n12,13,11,10,13,13,6,6,12,9,15,13,13,10,13,12,\n11,10,13,11,18,13,10,12,7,6,7,14,9,9,10,10,\n8,10,10,6,10,11,5,5,10,5,17,11,10,10,10,7,\n8,7,11,10,15,10,10,8,11,6,11,14,11,11,12,11,\n13,13,13,10,10,10,10,10,10,8,10,10,10,10,5,5,\n5,5,11,10,10,10,10,10,11,11,11,11,9,9,11,11,\n9,10,11,11,17,17,17,9,9,14,16,13,14,14,14,14,\n11,11,9,11,13,10,9,8,8,13,16,10,9,7,14,11,\n11,14,11,10,10,17,11,11,11,13,18,17,9,17,9,9,\n5,5,14,8,10,10,3,11,7,7,10,10,9,5,5,9,\n23,11,11,11,11,11,6,6,6,6,13,13,13,13,13,13,\n5,9,9,9,9,9,9,9,9,9,9,10,5,11,8,12,\n8,6,13,10,10,10,10,10,14,14,7,7,7,16,16,16,\n13,10,6,11,8,12,8,12,8,10,6,5,11,9,9,9,\n9,9,9,7,9,9,0,0,18,24,11,0,6,6,7,8,\n15,11,17,13,4,7,7,9,15,6,7,6,6,11,11,11,\n11,11,11,11,11,11,11,6,6,15,15,15,10,18,12,12,\n13,14,11,10,14,14,6,6,12,10,16,14,14,11,14,13,\n11,12,14,12,19,13,12,13,7,6,7,15,9,9,10,11,\n9,11,11,6,11,11,5,5,10,5,17,11,11,11,11,8,\n8,7,11,11,16,11,11,9,11,6,11,15,12,12,13,11,\n14,14,14,10,10,10,10,10,10,9,11,11,11,11,5,5,\n5,5,11,11,11,11,11,11,11,11,11,11,9,9,11,11,\n9,11,11,11,18,18,18,9,9,15,17,14,15,15,15,15,\n11,11,9,12,14,11,9,8,8,14,17,11,10,7,15,11,\n11,15,12,11,11,18,11,12,12,14,19,19,9,18,9,9,\n6,6,15,9,11,12,3,11,7,7,11,11,9,6,6,9,\n24,12,11,12,11,11,6,6,6,6,14,14,14,14,14,14,\n5,9,9,9,9,9,9,9,9,9,9,10,5,11,8,13,\n9,6,14,11,12,11,11,11,15,15,7,7,7,17,17,17,\n14,11,6,11,8,13,9,13,9,11,7,6,11,9,9,9,\n9,9,9,7,9,9,0,0,19,26,11,0,6,6,8,8,\n16,12,18,14,4,7,7,10,16,6,7,6,6,12,12,12,\n12,12,12,12,12,12,12,6,6,16,16,16,10,19,13,13,\n13,15,12,11,15,14,6,6,12,11,16,14,15,12,15,13,\n12,12,14,13,20,14,12,13,7,6,7,16,10,10,11,11,\n9,11,11,6,11,12,5,5,11,5,17,12,11,11,11,8,\n9,8,12,11,17,11,11,11,12,6,12,16,13,13,13,12,\n14,15,14,11,11,11,11,11,11,9,11,11,11,11,5,5,\n5,5,12,11,11,11,11,11,12,12,12,12,10,10,12,12,\n10,11,12,12,19,19,19,10,10,16,18,15,16,16,16,16,\n12,12,10,13,14,11,10,9,9,15,18,11,10,8,16,12,\n12,16,13,12,12,19,12,13,13,15,20,19,10,19,10,10,\n6,6,16,9,11,12,3,12,8,8,11,11,10,6,6,10,\n26,13,12,13,12,12,6,6,6,6,15,15,15,14,14,14,\n5,10,10,10,10,10,10,10,10,10,10,11,5,12,9,13,\n11,6,15,11,12,11,12,11,16,16,8,8,8,18,18,18,\n15,11,6,12,9,13,9,13,9,11,7,6,12,10,10,10,\n10,10,10,8,10,10,0,0,20,27,12,0,6,6,8,10,\n17,13,19,15,6,8,8,10,17,6,7,6,7,13,13,13,\n13,13,13,13,13,13,13,7,7,17,17,17,11,20,14,14,\n14,15,13,12,16,15,6,6,13,11,17,15,16,12,16,14,\n13,12,15,14,20,14,12,14,8,7,8,17,10,10,12,13,\n11,13,12,7,13,13,6,6,12,6,20,13,12,13,13,8,\n10,8,13,11,17,11,11,11,13,7,13,17,14,14,14,13,\n15,16,15,12,12,12,12,12,12,11,12,12,12,12,6,6,\n6,6,13,12,12,12,12,12,13,13,13,13,10,10,13,13,\n10,12,13,13,20,20,20,10,10,17,20,16,17,17,17,17,\n13,13,10,13,15,12,10,9,9,15,19,12,11,8,17,13,\n13,17,13,12,12,20,13,14,14,16,21,20,10,20,10,10,\n6,6,17,10,11,12,3,13,8,8,13,13,10,6,6,10,\n27,14,13,14,13,13,6,6,6,6,16,16,16,15,15,15,\n6,10,10,10,10,10,10,10,10,10,10,11,6,13,10,14,\n11,7,15,12,12,11,12,13,17,17,8,8,8,19,19,19,\n16,13,6,13,10,14,11,14,11,13,7,6,13,10,10,10,\n10,10,10,8,10,10,0,0,21,28,13,0,7,7,8,10,\n18,13,20,16,6,8,8,11,18,7,8,7,7,13,13,13,\n13,13,13,13,13,13,13,7,7,18,18,18,11,21,14,14,\n15,16,13,12,16,16,6,6,14,12,18,16,17,13,17,15,\n13,13,15,14,21,14,13,14,8,7,8,18,11,11,13,13,\n12,13,13,7,13,13,6,6,12,6,20,14,13,13,13,9,\n11,8,14,11,17,13,13,11,13,7,13,18,14,14,15,13,\n16,17,15,13,13,13,13,13,13,12,13,13,13,13,6,6,\n6,6,14,13,13,13,13,13,14,14,14,14,11,11,13,13,\n11,12,13,13,21,21,21,11,11,18,20,17,18,18,18,18,\n13,14,11,14,16,12,11,10,10,16,20,13,11,8,18,13,\n13,18,14,13,13,21,13,14,14,17,22,22,11,21,11,11,\n7,7,18,10,13,13,4,13,8,8,13,13,11,7,7,11,\n28,14,13,14,13,13,6,6,6,6,17,17,17,15,15,15,\n6,11,11,11,11,11,11,11,11,11,11,12,6,13,11,14,\n11,7,16,13,13,13,13,13,18,18,8,8,8,20,20,20,\n16,13,6,13,11,15,12,15,12,13,8,7,13,11,11,11,\n11,11,11,8,11,11,0,0,22,30,13,0,7,7,9,10,\n18,14,21,17,6,9,9,11,18,7,8,7,7,14,14,14,\n14,14,14,14,14,14,14,7,7,18,18,18,12,22,15,15,\n15,17,14,13,17,17,6,6,14,12,19,16,17,13,17,15,\n14,13,16,15,22,15,13,15,9,7,9,18,11,11,13,14,\n12,14,13,8,14,14,6,6,13,6,22,14,13,14,14,9,\n11,9,14,14,18,14,14,12,14,7,14,18,15,15,15,14,\n16,17,16,13,13,13,13,13,13,12,13,13,13,13,6,6,\n6,6,14,13,13,13,13,13,14,14,14,14,11,11,14,14,\n11,13,14,14,22,22,22,11,11,18,21,17,18,18,18,18,\n14,14,11,15,17,13,11,10,10,17,21,13,12,9,18,14,\n14,18,15,13,13,22,14,15,15,17,24,22,11,22,11,11,\n7,7,18,11,14,13,4,14,9,9,13,13,11,7,7,11,\n30,15,14,15,14,14,6,6,6,6,17,17,17,16,16,16,\n6,11,11,11,11,11,11,11,11,11,11,12,6,14,11,15,\n12,7,17,13,13,14,13,14,18,18,9,9,9,21,21,21,\n17,14,6,14,11,15,12,15,12,14,8,7,14,11,11,11,\n11,11,11,9,11,11,0,0,23,31,14,0,7,7,9,11,\n19,15,22,18,6,9,9,12,19,7,8,7,8,15,15,15,\n15,15,15,15,15,15,15,8,8,19,19,19,12,23,16,16,\n16,18,15,13,18,17,7,7,15,13,20,17,18,14,18,16,\n15,14,17,16,23,16,14,16,9,8,9,19,12,12,14,15,\n13,15,14,8,15,15,6,6,13,6,22,15,14,14,14,9,\n12,9,15,14,19,14,14,12,15,8,15,19,16,16,16,15,\n17,18,17,14,14,14,14,14,14,13,14,14,14,14,6,6,\n6,6,15,14,14,14,14,14,15,15,15,15,12,12,15,15,\n12,14,15,14,23,23,23,12,12,19,22,18,19,19,19,19,\n15,15,12,16,17,14,12,11,11,18,21,14,12,9,19,15,\n15,19,15,14,14,23,15,16,16,18,25,24,12,23,12,12,\n7,7,19,11,14,14,4,15,9,9,15,15,12,7,7,12,\n31,16,15,16,15,15,7,7,7,7,18,18,18,17,17,17,\n6,12,12,12,12,12,12,12,12,12,12,13,6,15,12,16,\n12,8,18,14,14,14,14,14,19,19,9,9,9,22,22,22,\n18,15,7,15,12,16,13,16,13,15,8,7,15,12,12,12,\n12,12,12,9,12,12,0,0,24,32,14,0,8,8,10,11,\n20,15,23,19,7,9,9,12,20,8,9,8,8,15,15,15,\n15,15,15,15,15,15,15,8,8,20,20,20,13,24,16,16,\n17,18,15,14,19,18,7,7,16,13,21,18,19,14,19,17,\n15,15,18,16,24,16,15,16,9,8,9,20,12,12,14,15,\n13,15,14,8,15,15,7,7,14,6,24,15,14,15,15,10,\n12,9,15,15,20,15,15,13,15,8,15,20,16,16,17,15,\n18,19,18,14,14,14,14,14,14,13,14,14,14,14,7,7,\n7,7,15,14,14,14,14,14,15,15,15,15,12,12,15,15,\n12,14,15,15,24,24,24,12,12,20,23,19,20,20,20,20,\n15,15,12,16,18,14,13,11,11,18,23,14,13,10,20,15,\n15,20,16,15,15,24,15,16,16,19,26,24,12,24,12,12,\n8,8,20,12,15,15,4,15,10,10,15,15,12,8,8,12,\n32,16,15,16,15,15,7,7,7,7,19,19,19,18,18,18,\n7,12,12,12,12,12,12,12,12,12,12,13,6,15,12,16,\n13,8,19,14,15,15,15,15,20,20,10,10,10,23,23,23,\n19,15,7,15,12,17,13,17,13,15,9,8,15,12,12,12,\n12,12,12,10,12,12,0,0,25,34,15,0,8,8,10,12,\n21,16,24,20,7,10,10,13,21,8,9,8,8,16,16,16,\n16,16,16,16,16,16,16,8,8,21,21,21,13,25,17,17,\n17,19,16,14,19,19,7,7,16,14,22,19,20,15,20,17,\n16,15,18,17,25,17,15,17,10,8,10,21,13,13,15,16,\n14,16,15,9,16,16,7,7,14,7,24,16,15,16,16,10,\n13,10,16,15,20,15,15,13,16,8,16,21,17,17,17,16,\n19,20,18,15,15,15,15,15,15,14,15,15,15,15,7,7,\n7,7,16,15,15,15,15,15,16,16,16,16,13,13,16,16,\n13,15,16,16,25,25,25,13,13,21,24,20,21,21,21,21,\n16,16,13,17,19,15,13,12,12,19,25,15,13,10,21,16,\n16,21,17,15,15,25,16,17,17,20,27,26,13,25,13,13,\n8,8,21,12,15,15,4,16,10,10,16,16,13,8,8,13,\n34,17,16,17,16,16,7,7,7,7,20,20,20,18,18,18,\n7,13,13,13,13,13,13,13,13,13,13,14,7,16,13,17,\n13,8,19,15,15,15,15,16,21,21,10,10,10,24,24,24,\n19,16,7,16,13,17,14,17,14,16,9,8,16,13,13,13,\n13,13,13,10,13,13,0,0,26,35,16,0,8,8,10,12,\n22,17,25,20,7,10,10,13,22,8,9,8,9,17,17,17,\n17,17,17,17,17,17,17,9,9,22,22,22,14,26,18,18,\n18,20,16,15,20,20,8,8,17,14,22,19,20,16,20,18,\n17,16,19,18,26,18,16,18,10,9,10,22,13,13,16,17,\n14,17,16,9,17,16,7,7,15,7,25,16,16,17,17,11,\n14,10,16,15,21,15,15,14,17,9,17,22,18,18,18,16,\n19,20,19,16,16,16,16,16,16,14,16,16,16,16,7,7,\n7,7,16,16,16,16,16,16,16,16,16,16,13,13,17,17,\n13,15,17,16,26,26,26,13,13,22,25,20,22,22,22,22,\n17,17,13,18,20,15,14,12,12,20,26,16,14,10,22,17,\n17,22,17,16,16,26,17,18,18,20,28,27,13,26,13,13,\n8,8,22,13,15,16,4,17,10,10,16,16,13,8,8,13,\n35,18,16,18,16,16,8,8,8,8,20,20,20,19,19,19,\n7,13,13,13,13,13,13,13,13,13,13,15,7,17,14,18,\n14,9,20,16,16,15,16,17,22,22,10,10,10,25,25,25,\n20,17,8,17,14,18,14,18,14,17,9,8,17,13,13,13,\n13,13,13,10,13,13,0,0,27,36,16,0,9,9,11,12,\n23,17,26,21,7,11,11,14,23,9,10,9,9,17,17,17,\n17,17,17,17,17,17,17,9,9,23,23,23,14,27,18,19,\n19,21,17,16,21,20,8,8,18,15,23,20,21,16,21,19,\n17,17,20,18,27,19,17,19,11,9,11,23,14,14,17,17,\n15,17,17,10,17,17,8,8,16,8,26,17,17,17,17,11,\n14,11,17,16,22,16,16,14,17,9,17,23,18,18,19,17,\n20,21,20,17,17,17,17,17,17,15,17,17,17,17,8,8,\n8,8,17,17,17,17,17,17,17,17,17,17,14,14,17,17,\n14,16,17,17,27,27,27,14,14,23,26,21,22,23,23,23,\n17,17,14,18,20,16,14,13,13,21,27,17,14,11,23,17,\n17,23,18,17,17,27,17,18,18,21,29,28,14,27,14,14,\n9,9,23,13,16,17,5,17,11,11,17,17,14,9,9,14,\n36,18,17,18,17,17,8,8,8,8,21,21,21,20,20,20,\n8,14,14,14,14,14,14,14,14,14,14,15,8,17,14,19,\n14,9,21,17,17,16,16,17,23,23,11,11,11,26,26,26,\n21,17,8,17,14,19,15,19,15,17,10,9,17,14,14,14,\n14,14,14,11,14,14,0,0,28,38,17,0,9,9,11,13,\n23,18,27,22,8,11,11,14,23,9,10,9,9,18,18,18,\n18,18,18,18,18,18,18,9,9,23,23,23,15,28,19,19,\n20,22,18,16,22,21,8,8,18,16,24,21,22,17,22,19,\n18,17,21,19,28,19,17,19,11,9,11,23,14,14,17,18,\n15,18,17,10,18,18,8,8,16,8,27,18,17,18,18,12,\n15,11,18,17,23,17,17,15,18,9,18,23,19,19,20,18,\n21,22,21,17,17,17,17,17,17,15,17,17,17,17,8,8,\n8,8,18,17,17,17,17,17,18,18,18,18,14,14,18,18,\n14,17,18,18,28,28,28,14,14,23,27,22,23,23,23,23,\n18,18,14,19,21,16,15,13,13,21,28,17,15,11,23,18,\n18,23,19,17,17,28,18,19,19,22,30,29,14,28,15,15,\n9,9,23,14,17,17,5,18,11,11,18,18,14,9,9,15,\n38,19,18,19,18,18,8,8,8,8,22,22,22,21,21,21,\n8,14,14,14,14,14,14,14,14,14,14,16,8,18,15,19,\n15,9,22,17,17,17,17,18,23,23,11,11,11,27,27,27,\n22,18,8,18,15,20,15,20,15,18,10,9,18,14,14,14,\n14,14,14,11,14,14,0,0,0,0,0,2,0,8,0,2,\n255,255,0,3,0,1,0,0,0,2,0,0,12,80,10,236,\n95,15,60,245,0,31,8,0,0,0,0,0,186,185,240,184,\n0,0,0,0,186,194,103,145,254,137,254,29,10,76,7,109,\n0,0,0,8,0,1,0,0,0,0,0,0\n};\n", "includes"=>[]}, :listsort=>{"code"=>"/*\n * Define ordering functions for all the types needed\n */\n\ntypedef int (*ordered_fn)(ListElement *, ListElement*, int);\n\ntemplate <typename T>\nstatic int e_asc(ListElement *elem1, ListElement *elem2, int offset) {\n    T *e1 = reinterpret_cast<T *>(reinterpret_cast<char *>(elem1+1)+offset);\n    T *e2 = reinterpret_cast<T *>(reinterpret_cast<char *>(elem2+1)+offset);\n    return (*e1) <= (*e2);\n}\n\ntemplate <typename T>\nstatic int e_desc(ListElement *elem1, ListElement *elem2, int offset) {\n    T *e1 = reinterpret_cast<T *>(reinterpret_cast<char *>(elem1+1)+offset);\n    T *e2 = reinterpret_cast<T *>(reinterpret_cast<char *>(elem2+1)+offset);\n    return (*e1) >= (*e2);\n}\n\nstatic int e_asc_cistring(ListElement *elem1, ListElement *elem2, int offset) {\n    std::string *e1 = reinterpret_cast<std::string *>(reinterpret_cast<char *>(elem1+1)+offset);\n    std::string *e2 = reinterpret_cast<std::string *>(reinterpret_cast<char *>(elem2+1)+offset);\n    size_t upto = e1->length() < e2->length() ? e1->length() : e2->length();\n    for (size_t i = 0; i < upto; i++) {\n        if (tolower((*e1)[i]) < tolower((*e2)[i]))\n            return 1;\n        if (tolower((*e1)[i]) > tolower((*e2)[i]))\n            return 0;\n    }\n    return e1->length() <= e2->length();\n}\n\nstatic int e_desc_cistring(ListElement *elem1, ListElement *elem2, int offset) {\n    std::string *e1 = reinterpret_cast<std::string *>(reinterpret_cast<char *>(elem1+1)+offset);\n    std::string *e2 = reinterpret_cast<std::string *>(reinterpret_cast<char *>(elem2+1)+offset);\n    size_t upto = e1->length() < e2->length() ? e1->length() : e2->length();\n    for (size_t i = 0; i < upto; i++) {\n        if (tolower((*e1)[i]) > tolower((*e2)[i]))\n            return 1;\n        if (tolower((*e1)[i]) < tolower((*e2)[i]))\n            return 0;\n    }\n    return e1->length() >= e2->length();\n}\n\n/* These are in the order of the PB_Sort_ constants */\nstatic ordered_fn comparators_asc[] = {\n    &e_asc<int8_t>, &e_asc<int16_t>, &e_asc<int32_t>,\n    &e_asc<std::string>, &e_asc<float>, &e_asc<double>,\n    &e_asc<int64_t>, &e_asc<char>\n};\nstatic ordered_fn comparators_desc[] = {\n    &e_desc<int8_t>, &e_desc<int16_t>, &e_desc<int32_t>,\n    &e_desc<std::string>, &e_desc<float>, &e_desc<double>,\n    &e_desc<int64_t>, &e_desc<char>\n};\n/* For PB_Sort_String, indexed by option value */\nstatic ordered_fn comparators_string[] = {\n    &e_asc<std::string>, &e_asc<std::string>,\n    &e_asc_cistring, &e_desc_cistring\n};\n\n/* opt = 0: ascending; opt = 1: descending;\n * opt = 2: case-insensitive asc; opt = 3: case-insensitive desc */\nstatic ordered_fn comparator(int pb_sort, int opt) {\n    if (pb_sort < 0 || pb_sort > 7)\n        return 0;\n    if (opt < 0 || opt > 3)\n        return 0;\n    if (pb_sort == 3)\n        return comparators_string[opt];\n    if  (opt == 0 || opt == 2)\n        return comparators_asc[pb_sort];\n    else\n        return comparators_desc[pb_sort];\n}\n\nclass SortedList {\n  public:\n    ListElement *root;\n    ListElement *last;\n    int length;\n    ordered_fn ordered_p;\n    int offset;\n    SortedList(ordered_fn ordered_p, int offset)\n      : root(), last(), length(), ordered_p(ordered_p), offset(offset) {};\n\n    void clear() {\n        this->root = 0;\n        this->last = 0;\n        this->length = 0;\n    }\n\n    void append(ListElement *first, ListElement *last, int length) {\n        if (!this->root)\n            this->root = first;\n        first->prev = this->last;\n        if (this->last)\n            this->last->next = first;\n        this->last = last;\n        last->next = 0;\n        this->length += length;\n    }\n\n    void append_one(ListElement *e) {\n        if (!this->root)\n            this->root = e;\n        e->prev = this->last;\n        if (this->last)\n            this->last->next = e;\n        this->last = e;\n        e->next = 0;\n        this->length += 1;\n    }\n\n    void insert_first(ListElement *e) {\n        e->prev = 0;\n        e->next = this->root;\n        if (this->root)\n            this->root->prev = e;\n        this->root = e;\n        if (!this->last)\n            this->last = e;\n        this->length += 1;\n    }\n\n    void insert_after(ListElement *p, ListElement *e) {\n        e->prev = p;\n        e->next = p->next;\n        p->next = e;\n        if (this->last == p)\n            this->last = e;\n        this->length += 1;\n    }\n\n    /* Put e in sorted location in list. Start checking from end of list\n     * in order to keep a stable sort */\n    void insert_sort(ListElement *e) {\n        ListElement *p = this->last;\n        while (p && !this->ordered_p(p, e, this->offset)) {\n            p = p->prev;\n        }\n        if (!p)\n            this->insert_first(e);\n        else\n            this->insert_after(p, e);\n    }\n\n    /* Take up to n elements from 'start' list and sort them into this list */\n    ListElement *gobble_n(ListElement *start, int count) {\n        ListElement *p = start;\n        for (int i = 0; p && i < count; i++) {\n            ListElement *n = p->next;\n            this->insert_sort(p);\n            p = n;\n        }\n        return p;\n    }\n\n    /* Take the elements from the start of 'start' list that can be\n     * appended to this list without reordering */\n    ListElement *gobble_more(ListElement *start) {\n        if (!this->last && start) {\n            ListElement *e = start;\n            start = start->next;\n            this->insert_first(e);\n        }\n        if (!start || !this->ordered_p(this->last, start, this->offset))\n            return start;\n        int count = 1;\n        ListElement *p = start;\n        while (p->next && this->ordered_p(p, p->next, this->offset)) {\n            p = p->next;\n            count += 1;\n        }\n        ListElement *n = p->next;\n        this->append(start, p, count);\n        return n;\n    }\n\n    /* Merge other list into this list. Destructive of other list. */\n    void merge(SortedList &l1) {\n        SortedList l2(*this);\n        this->clear();\n        /* Fast merge of already-ordered lists */\n        if (this->ordered_p(l1.last, l2.root, this->offset)) {\n            this->append(l1.root, l1.last, l1.length);\n            this->append(l2.root, l2.last, l2.length);\n            return;\n        }\n        ListElement *p1 = l1.root;\n        ListElement *p2 = l2.root;\n        ListElement *n;\n        while (p1 && p2) {\n            if (this->ordered_p(p1, p2, this->offset)) {\n                n = p1->next;\n                this->append_one(p1);\n                p1 = n;\n                l1.length -= 1;\n            } else {\n                n = p2->next;\n                this->append_one(p2);\n                p2 = n;\n                l2.length -= 1;\n            }\n        }\n        if (p1)\n            this->append(p1, l1.last, l1.length);\n        if (p2)\n            this->append(p2, l2.last, l2.length);\n    }\n\n};\n\nstatic void listsort(LinkedList& list, ordered_fn ordered_p, int offset) {\n    std::stack<SortedList> stack;\n    SortedList current(ordered_p, offset);\n    ListElement *p = list.root;\n\n    /* Natural merge sort variation:\n     * Split the list into small chunks, sort each chunk with insertion sort\n     * The chunks are at least 8 elements long, and are then extended\n     * with whatever part of the list is ordered already.\n     * Push the chunks onto a stack, and merge chunks with the top of the\n     * stack when they are of similar size.\n     * With some care in the helper functions, this approach is a stable\n     * sort (it does not reorder already-ordered elements in the list)\n     * and it is fast on already-ordered lists.\n     */\n    for (;;) {\n        p = current.gobble_n(p, 8);\n        p = current.gobble_more(p);\n        if (!p)\n            break;\n        while (!stack.empty() && current.length * 2 > stack.top().length) {\n            current.merge(stack.top());\n            stack.pop();\n        }\n        stack.push(current);\n        current.clear();\n    }\n\n    while (!stack.empty()) {\n        current.merge(stack.top());\n        stack.pop();\n    }\n    list.root = current.root;\n    list.last = current.last;\n    list.index = findelem(list, list.current);\n    return;\n}\n", "fragments"=>[:findelem], "includes"=>["ctype.h", "stack"]}, :offsetof=>{"code"=>"/* The usual trick of basing offsetof on an offset from the NULL pointer\n * does not work in C++ with classes that have constructors. And because\n * of the use of std::string, the st_ types have constructors.\n * Workaround is to base offsetof on an instance of the class. */\ntemplate<typename T>\nclass empty_wrap {\n    public:\n    static T empty_T;\n};\ntemplate <typename T>\nT empty_wrap<T>::empty_T;\n#define OFFSETOF(STRUCT, FIELD) (int32_t) (((char *) &(empty_wrap<STRUCT>::empty_T.FIELD)) - ((char *) &(empty_wrap<STRUCT>::empty_T)))\n", "includes"=>[]}, :sprites=>{"code"=>"static SDL_Surface *sprites[1024];\nstatic SDL_Rect spriteclips[1024];\nstatic int32_t unused_sprite() {\n    int i;\n    for (i = 1; i < 1024; i++) {\n      if (!sprites[i])\n        return i;\n    }\n    return 0;\n}\n", "includes"=>["SDL.h"]}}
BF = {:nextelement=>{"code"=>"if (!p1.current) {\n  p1.current = p1.root;\n  p1.index = 0;\n  return reinterpret_cast<char *>(p1.current);\n}\nif (!p1.current->next)\n  return 0; /* Don't walk off the end */\np1.current = p1.current->next;\np1.index += 1;\nreturn reinterpret_cast<char *>(p1.current);\n", "includes"=>[], "rtype"=>:*, "params"=>[:"()"], "defaults"=>[], "return"=>"*"}, :mousey=>{"code"=>"return mousey;\n", "fragments"=>[:mouse], "includes"=>[], "rtype"=>:l, "params"=>[], "defaults"=>[], "return"=>"l"}, :freesprite=>{"code"=>"if (p1 < 1024 && sprites[p1]) {\n  SDL_FreeSurface(sprites[p1]);\n  sprites[p1] = 0;\n}\n", "fragments"=>[:sprites], "includes"=>["SDL.h"], "params"=>[:w], "defaults"=>[]}, :fileseek=>{"code"=>"if (!fh[p1])\n  return;\nfseek(fh[p1], p2, SEEK_SET);\n", "fragments"=>[:filehandles], "includes"=>["stdio.h"], "params"=>[:w, :l], "defaults"=>[]}, :random=>{"code"=>"/* Generate a random integer from 0..p1 inclusive */\n/* Strategy: Use libc random(), which returns 0..RAND_MAX inclusive,\n * and take the result modulo (p1+1). Avoid bias if p1+1 does not\n * divide evenly into RAND_MAX+1. Be very careful about overflow. */\nlong v, limit, top;\nif (p1 <= 0)\n  return 0;\nif (p1 == 0x7FFFFFFF)  /* avoid overflow in p1+1 */\n  return random() & 0x7FFFFFFF;\nlimit = p1 + 1;\nif (RAND_MAX % limit == p1)  /* divides evenly? */\n  return random() % limit;\n/* RAND_MAX + 1 would overflow, so move the +1 out of the modulo */\n/* This is safe because of the \"divides evenly\" check above. */\ntop = RAND_MAX - ((RAND_MAX % limit) + 1);\ndo { v = random(); } while (v > top);\nreturn v % limit;\n", "fragments"=>[:random], "includes"=>[], "rtype"=>:l, "params"=>[:l], "defaults"=>[], "return"=>"l"}, :cos=>{"code"=>"return cos(p1);\n", "includes"=>["math.h"], "rtype"=>:f, "params"=>[:f], "defaults"=>[], "return"=>"f"}, :date=>{"code"=>"return time(0);\n", "includes"=>[], "rtype"=>:l, "params"=>[], "defaults"=>[], "return"=>"l"}, :usejpegimagedecoder=>{"code"=>"return 1;\n", "includes"=>[], "rtype"=>:l, "params"=>[], "defaults"=>[], "return"=>"l"}, :countlist=>{"code"=>"return p1.length;\n", "includes"=>[], "rtype"=>:l, "params"=>[:"()"], "defaults"=>[], "return"=>"l"}, :mouselocate=>{"code"=>"SDL_WarpMouse(p1, p2);\n", "includes"=>["SDL.h"], "params"=>[:l, :l], "defaults"=>[]}, :catchsprite=>{"code"=>"int handle;\nif (p1 < 0) {\n    handle = unused_sprite();\n    if (handle == 0)\n      return 0;\n} else {\n    handle = p1;\n}\nif (sprites[handle]) {\n    SDL_FreeSurface(sprites[handle]);\n    sprites[handle] = 0;\n}\n/* Cheat: ignore p2, assume that the source is the current packfile */\nif (!packfile)\n    return 0;\nsprites[handle] = IMG_Load_RW(SDL_RWFromMem(packfile, packfilesize), 1);\ndelete[] packfile;\npackfile = 0;\npackfilesize = 0;\nif (!sprites[handle])\n    return 0;\nreturn (p2 < 0) ? handle : 1;\n", "fragments"=>[:sprites], "includes"=>["SDL.h", "SDL_image.h"], "rtype"=>:w, "params"=>[:w, :l], "defaults"=>[], "return"=>"w"}, :writeword=>{"code"=>"if (!fh[p1])\n    return;\nfputc(p2, fh[p1]);\nfputc((p2 >> 8), fh[p1]);\n", "fragments"=>[:filehandles], "includes"=>["stdio.h"], "params"=>[:w, :w], "defaults"=>[]}, :acos=>{"code"=>"return acos(p1);\n", "includes"=>["math.h"], "rtype"=>:f, "params"=>[:f], "defaults"=>[], "return"=>"f"}, :elapsedmilliseconds=>{"code"=>"/* Instead of going out and parsing /proc/uptime or something,\n * just fake it. Pretend that the system was up for one hour,\n * at the first call to ElapsedMilliseconds. Callers are going\n * to be interested in time differences, not absolute time. */\nstatic struct timeval elapsedbasis;\nstruct timeval tv;\ngettimeofday(&tv, 0);\nif (elapsedbasis.tv_sec == 0) {\n    elapsedbasis = tv;\n    elapsedbasis.tv_sec -= 3600;\n}\nreturn (tv.tv_sec - elapsedbasis.tv_sec) * 1000 +\n       (tv.tv_usec - elapsedbasis.tv_usec) / 1000;\n", "includes"=>["sys/time.h", "time.h"], "rtype"=>:l, "params"=>[], "defaults"=>[], "return"=>"l"}, :initkeyboard=>{"code"=>"keystate = SDL_GetKeyState(&numkeys);\nreturn 1;\n", "includes"=>[], "rtype"=>:l, "params"=>[], "defaults"=>[], "return"=>"l"}, :closescreen=>{"code"=>"SDL_QuitSubSystem(SDL_INIT_VIDEO);\nscreen = 0;\n", "fragments"=>[:screen], "includes"=>["SDL.h"], "params"=>[], "defaults"=>[]}, :right=>{"code"=>"if (p2 >= (int32_t) p1.length())\n  return p1;\nreturn p1.substr(p1.length() - p2);\n", "includes"=>[], "rtype"=>:s, "params"=>[:s, :l], "defaults"=>[], "return"=>"s"}, :changecurrentelement=>{"code"=>"/* p2 is a pointer to the data part of a list element, or NULL */\nif (!p2) {\n    p1.current = 0;\n    p1.index = -1;\n} else {\n    p1.current = reinterpret_cast<ListElement *>(p2) - 1;\n    p1.index = findelem(p1, p1.current);\n}\n", "fragments"=>[:findelem], "includes"=>[], "params"=>[:"()", :*], "defaults"=>[]}, :writestringn=>{"code"=>"if (!fh[p1])\n    return;\nfputs(p2.c_str(), fh[p1]);\nfputc('\\n', fh[p1]);\n", "fragments"=>[:filehandles], "includes"=>["stdio.h"], "params"=>[:w, :s], "defaults"=>[]}, :delay=>{"code"=>"usleep(p1*1000);\n", "includes"=>["unistd.h"], "params"=>[:l], "defaults"=>[]}, :displaysprite=>{"code"=>"SDL_Rect dstrect = { p2, p3, 0, 0 };\nif (p1 >= 1024 || !sprites[p1])\n    return;\nSDL_SetColorKey(sprites[p1], 0, 0);\nSDL_SetAlpha(sprites[p1], 0, 0);\nSDL_BlitSurface(sprites[p1], &spriteclips[p1], screen, &dstrect);\n", "fragments"=>[:sprites, :screen], "includes"=>["SDL.h"], "params"=>[:w, :l, :l], "defaults"=>[]}, :keyboardreleased=>{"code"=>"if (p1 >= numkeys)\n  return 0;\nif (p1 < 0)\n  return 0;\nreturn keyrel[p1] != 0;\n", "fragments"=>[:keyboard], "includes"=>["SDL.h"], "rtype"=>:l, "params"=>[:l], "defaults"=>[], "return"=>"l"}, :stopdrawing=>{"code"=>";  /* cheat -- all output to main screen */\n", "includes"=>[], "params"=>[], "defaults"=>[]}, :replacestring=>{"code"=>"size_t pos;\nif (p2.empty()) /* avoid infinite loop */\n    return p1;\npos = p1.find(p2);\nwhile (pos != std::string::npos) {\n    p1.replace(pos, p2.length(), p3);\n    pos = p1.find(p2, pos + p3.length());\n}\nreturn p1;\n", "includes"=>[], "rtype"=>:s, "params"=>[:s, :s, :s], "defaults"=>[], "return"=>"s"}, :pow=>{"code"=>"return pow(p1, p2);\n", "includes"=>["math.h"], "rtype"=>:f, "params"=>[:f, :f], "defaults"=>[], "return"=>"f"}, :addelement=>{"code"=>"struct ListElement *newelem = p1.alloc_elem();\nif (!newelem)\n    return 0;\nif (p1.length == 0) {\n    insertonly(p1, newelem);\n} else if (!p1.current) {\n    insertfirst(p1, newelem);\n} else if (p1.current == p1.last) {\n    insertlast(p1, newelem);\n} else {\n    newelem->next = p1.current->next;\n    newelem->prev = p1.current;\n    newelem->next->prev = newelem;\n    newelem->prev->next = newelem;\n    p1.current = newelem;\n    p1.length += 1;\n    p1.index += 1;\n}\nreturn reinterpret_cast<char *>(p1.current);\n", "fragments"=>[:listfuncs], "includes"=>[], "rtype"=>:*, "params"=>[:"()"], "defaults"=>[], "return"=>"*"}, :initsound=>{"code"=>"SDL_InitSubSystem(SDL_INIT_AUDIO);\nMix_OpenAudio(44100, AUDIO_S16SYS, 2, 4096);\n", "includes"=>["SDL.h"], "rtype"=>:l, "params"=>[], "defaults"=>[], "return"=>"l"}, :box=>{"code"=>"SDL_Rect dstrect;\nUint32 color;\ndstrect.x = p1;\ndstrect.y = p2;\ndstrect.w = p3;\ndstrect.h = p4;\nif (p5 < 0) {\n  color = SDL_MapRGB(screen->format, frontcolor.r, frontcolor.g, frontcolor.b);\n} else {\n  color = SDL_MapRGB(screen->format, (p5 >> 16) && 0xff, (p5 >> 8) && 0xff, p5 && 0xff);\n}\nSDL_FillRect(screen, &dstrect, color);\n", "fragments"=>[:screen], "includes"=>["SDL.h"], "params"=>[:l, :l, :l, :l, :l], "defaults"=>[-1]}, :isdirectory=>{"code"=>"return p1 < 1024 && dh[p1].dir;\n", "fragments"=>[:dirhandles], "includes"=>[], "rtype"=>:l, "params"=>[:l], "defaults"=>[], "return"=>"l"}, :closenetworkconnection=>{"code"=>"close(p1 - 1);\n", "includes"=>["unistd.h"], "params"=>[:l], "defaults"=>[]}, :val=>{"code"=>"return strtol(p1.c_str(), 0, 10);\n", "includes"=>["stdlib.h"], "rtype"=>:l, "params"=>[:s], "defaults"=>[], "return"=>"l"}, :examinejoystick=>{"code"=>"SDL_JoystickUpdate();\n", "includes"=>["SDL.h"], "params"=>[], "defaults"=>[]}, :flipbuffers=>{"code"=>"static struct timeval lastflip;\nstruct timeval now;\nlong elapsed;\nif (!screen)\n    return;\ngettimeofday(&now, 0);\n/* Convert new.tv_sec - lastflip.tv_sec to 0 or 1 to avoid overflow\n * in elapsed microseconds. */\nelapsed = now.tv_usec - lastflip.tv_usec\n        + !!(now.tv_sec - lastflip.tv_sec) * 1000000;\nif (elapsed < 1000000 / framerate)\n    usleep(1000000 / framerate - elapsed);\nSDL_Flip(screen);\ngettimeofday(&lastflip, 0);\n", "fragments"=>[:framerate, :screen], "includes"=>["SDL.h", "sys/time.h", "time.h"], "params"=>[:l], "defaults"=>[1]}, :pokel=>{"code"=>"* ((int32_t *) p1) = p2;\n", "includes"=>[], "params"=>[:*, :l], "defaults"=>[]}, :linexy=>{"code"=>"linedraw(p1, p2, p3 - p1, p4 - p2, -1);\n", "fragments"=>[:linedraw], "includes"=>[], "params"=>[:l, :l, :l, :l], "defaults"=>[]}, :directoryentryname=>{"code"=>"if (!dh[p1].dir)\n    return \"\";\nreturn dh[p1].curdent.d_name;\n", "fragments"=>[:dirhandles], "includes"=>["string.h"], "rtype"=>:s, "params"=>[:w], "defaults"=>[], "return"=>"s"}, :catchsound=>{"code"=>"int handle;\nSDL_RWops *rw;\nif (p1 < 0) {\n    handle = unused_sound();\n    if (handle == 0)\n        return 0;\n} else {\n   handle = p1;\n}\nif (sounds[handle]) {\n    Mix_FreeChunk(sounds[handle]);\n    sounds[handle] = 0;\n}\nrw = SDL_RWFromMem(packfile, packfilesize);\nif (!rw)\n    return 0;\nsounds[handle] = Mix_LoadWAV_RW(rw, 0);\nSDL_RWclose(rw);\nif (!sounds[handle])\n    return 0;\ndelete[] packfile;\npackfile = 0;\npackfilesize = 0;\nreturn (p1 < 0) ? handle : 1;\n", "fragments"=>[:packfile, :sounds], "includes"=>["SDL_mixer.h"], "rtype"=>:w, "params"=>[:w, :l], "defaults"=>[], "return"=>"w"}, :joystickbutton=>{"code"=>"return SDL_JoystickGetButton(joystick, p1-1);\n", "fragments"=>[:joystick], "includes"=>["SDL.h"], "rtype"=>:l, "params"=>[:l], "defaults"=>[], "return"=>"l"}, :frontcolor=>{"code"=>"frontcolor.r = (p1 >> 16) & 0xff;\nfrontcolor.g = (p1 >> 8) & 0xff;;\nfrontcolor.b = p1 & 0xff;\n", "fragments"=>[:frontcolor], "includes"=>[], "params"=>[:l], "defaults"=>[]}, :openfile=>{"code"=>"return fileopen(p1, p2.c_str(), \"w+\");\n", "fragments"=>[:fileopen], "includes"=>[], "rtype"=>:w, "params"=>[:w, :s], "defaults"=>[], "return"=>"w"}, :openpack=>{"code"=>"closepack();\npackfd = open(p1.c_str(), O_RDONLY);\nreturn packfd >= 0;\n", "fragments"=>[:packfile], "includes"=>["sys/types.h", "sys/stat.h", "fcntl.h"], "rtype"=>:l, "params"=>[:s], "defaults"=>[], "return"=>"l"}, :stopmodule=>{"code"=>"Mix_HaltMusic();\n", "includes"=>["SDL_mixer.h"], "params"=>[:w], "defaults"=>[]}, :firstelement=>{"code"=>"if (!p1.root)\n    return 0;\np1.current = p1.root;\np1.index = 0;\nreturn reinterpret_cast<char *>(p1.current);\n", "includes"=>[], "rtype"=>:*, "params"=>[:"()"], "defaults"=>[], "return"=>"*"}, :examinemouse=>{"code"=>"SDL_PumpEvents();\nmousebuttons = SDL_GetMouseState(&mousex, &mousey);\nreturn 1;\n", "fragments"=>[:mouse], "includes"=>["SDL.h"], "rtype"=>:l, "params"=>[], "defaults"=>[], "return"=>"l"}, :closefile=>{"code"=>"if (fh[p1]) {\n  fclose(fh[p1]);\n  fh[p1] = 0;\n}\n", "fragments"=>[:filehandles], "includes"=>["stdio.h"], "params"=>[:w], "defaults"=>[]}, :sortstructuredlist=>{"code"=>"ordered_fn ordering = comparator(p4, p2);\nif (!ordering)\n    return;\nlistsort(p1, ordering, p3);\n", "fragments"=>[:listsort], "includes"=>[], "params"=>[:"()", :l, :l, :l], "defaults"=>[]}, :textheight=>{"code"=>"int h = 0;\nTTF_SizeText(font, p1.c_str(), 0, &h);\nreturn h;\n", "fragments"=>[:ttf, :screen], "includes"=>["SDL_ttf.h"], "rtype"=>:l, "params"=>[:s], "defaults"=>[], "return"=>"l"}, :addpackfile=>{"code"=>"return addpackfile(p1.c_str());\n", "fragments"=>[:pack], "includes"=>[], "rtype"=>:l, "params"=>[:s, :l], "defaults"=>[0], "return"=>"l"}, :previouselement=>{"code"=>"if (!p1.current || !p1.current->prev)\n  return 0;\np1.current = p1.current->prev;\np1.index -= 1;\nreturn reinterpret_cast<char *>(p1.current);\n", "includes"=>[], "rtype"=>:*, "params"=>[:"()"], "defaults"=>[], "return"=>"*"}, :readstring=>{"code"=>"size_t bufsz = 1024;\nsize_t n = 0;\nchar *buffer = 0;\nif (!fh[p1])\n    return 0;\nfor (;;) {\n    buffer = (char *) realloc(buffer, bufsz);\n    if (fgets(buffer + n, bufsz - n, fh[p1])) {\n        n += strlen(buffer + n);\n        if (buffer[n - 1] == '\\n') {\n            buffer[--n] = 0;\n            break;\n        }\n    } else {\n        break;\n    }\n    bufsz = bufsz * 2;\n}\nif (n > 1 && buffer[n - 1] == '\\r')\n  buffer[--n] = 0;\nstd::string r (buffer, n);\nfree(buffer);\nreturn r;\n", "fragments"=>[:filehandles], "includes"=>["stdlib.h", "stdio.h", "string.h"], "rtype"=>:s, "params"=>[:w], "defaults"=>[], "return"=>"s"}, :mousebutton=>{"code"=>"if (p1 == 1)\n    return (mousebuttons & SDL_BUTTON(SDL_BUTTON_LEFT)) != 0;\nif (p1 == 2)\n    return (mousebuttons & SDL_BUTTON(SDL_BUTTON_RIGHT)) != 0;\n", "fragments"=>[:mouse], "includes"=>["SDL.h"], "rtype"=>:l, "params"=>[:l], "defaults"=>[], "return"=>"l"}, :copysprite=>{"code"=>"int handle;\nSDL_Surface *src;\nif (p1 >= 1024 || !sprites[p1])\n    return 0;\nsrc = sprites[p1];\nif (p2 < 0) {\n    handle = unused_sprite();\n    if (handle == 0)\n      return 0;\n} else {\n    handle = p2;\n}\nif (sprites[handle]) {\n  SDL_FreeSurface(sprites[handle]);\n  sprites[handle] = 0;\n}\nsprites[handle] = SDL_CreateRGBSurface(SDL_HWSURFACE,\n    src->w, src->h, src->format->BitsPerPixel, src->format->Rmask,\n    src->format->Gmask, src->format->Bmask, src->format->Amask);\nif (!sprites[handle])\n    return 0;\nspriteclips[handle].x = 0;\nspriteclips[handle].y = 0;\nspriteclips[handle].w = src->w;\nspriteclips[handle].h = src->h;\nSDL_BlitSurface(src, NULL, sprites[handle], NULL);\nreturn (p2 < 0) ? handle : 1;\n", "fragments"=>[:sprites], "includes"=>["SDL.h"], "rtype"=>:w, "params"=>[:w, :l], "defaults"=>[], "return"=>"w"}, :str=>{"code"=>"char s[256];\nsprintf(s, \"%ld\", (long) p1);\nreturn s;\n", "includes"=>["stdio.h"], "rtype"=>:s, "params"=>[:l], "defaults"=>[], "return"=>"s"}, :usepngimagedecoder=>{"code"=>"return 1;\n", "includes"=>[], "rtype"=>:l, "params"=>[], "defaults"=>[], "return"=>"l"}, :screenoutput=>{"code"=>"return 1;  /* cheat -- all output to main screen */\n", "includes"=>[], "rtype"=>:l, "params"=>[], "defaults"=>[], "return"=>"l"}, :rset=>{"code"=>"int spaces;\nspaces = p2 - p1.length();\nif (spaces < 0)\n  spaces = 0;\nreturn std::string(spaces, ' ') + p1.substr(0, p2);\n", "includes"=>[], "rtype"=>:s, "params"=>[:s, :l], "defaults"=>[], "return"=>"s"}, :sin=>{"code"=>"return sin(p1);\n", "includes"=>["math.h"], "rtype"=>:f, "params"=>[:f], "defaults"=>[], "return"=>"f"}, :formatdate=>{"code"=>"char c;\n/* Allocating s at same length as p1 is safe as long as all formatting\n * codes are at least as long as the string they represent.\n * That's going to be true until the year 100000. Remember to fix\n * this before then. */\nchar *s = new char [p1.length() + 1];\nconst char *q = p1.c_str();\nchar *r = s;\ntime_t t = p2;\nstruct tm *tm = localtime(&t);\nwhile (c = *q++) {\n    if (c == '%') {\n        if (q[0] == 'y' && q[1] == 'y' && q[2] == 'y' && q[3] == 'y') {\n            sprintf(s, \"%04d\", tm->tm_year + 1900);\n            s += strlen(s);\n            q += 4;\n        } else if (q[0] == 'y' && q[1] == 'y') {\n            sprintf(s, \"%02d\", tm->tm_year % 100);\n            s += 2;\n            q += 2;\n        } else if (q[0] == 'm' && q[1] == 'm') {\n            sprintf(s, \"%02d\", tm->tm_mon + 1);\n            s += 2;\n            q += 2;\n        } else if (q[0] == 'd' && q[1] == 'd') {\n            sprintf(s, \"%02d\", tm->tm_mday);\n            s += 2;\n            q += 2;\n        } else if (q[0] == 'h' && q[1] == 'h') {\n            sprintf(s, \"%02d\", tm->tm_hour);\n            s += 2;\n            q += 2;\n        } else if (q[0] == 'i' && q[1] == 'i') {\n            sprintf(s, \"%02d\", tm->tm_min);\n            s += 2;\n            q += 2;\n        } else if (q[0] == 's' && q[1] == 's') {\n            sprintf(s, \"%02d\", tm->tm_sec);\n            s += 2;\n            q += 2;\n        } else {\n            *s++ = c;\n        }\n    } else {\n        *s++ = c;\n    }\n}\n*s++ = 0;\nstd::string rs = r;\ndelete[] r;\nreturn rs;\n", "includes"=>["time.h"], "rtype"=>:s, "params"=>[:s, :l], "defaults"=>[], "return"=>"s"}, :clearlist=>{"code"=>"struct ListElement *p = p1.root;\nstruct ListElement *n;\nwhile (p) {\n    n = p->next;\n    p1.del_elem(p);\n    p = n;\n}\np1.root = 0;\np1.current = 0;\np1.last = 0;\np1.length = 0;\np1.index = -1;\n", "includes"=>[], "params"=>[:"()"], "defaults"=>[]}, :createsprite=>{"code"=>"int handle;\nuint32_t color;\nif (p1 < 0) {\n    handle = unused_sprite();\n    if (handle == 0)\n      return 0;\n} else {\n    handle = p1;\n}\nif (sprites[handle])\n    SDL_FreeSurface(sprites[handle]);\nsprites[handle] = SDL_CreateRGBSurface(SDL_HWSURFACE,\n    p2, p3, screen->format->BitsPerPixel, screen->format->Rmask,\n    screen->format->Gmask, screen->format->Bmask, screen->format->Amask);\nif (!sprites[handle])\n    return 0;\ncolor = SDL_MapRGB(sprites[handle]->format, 0, 0, 0);\nSDL_FillRect(sprites[handle], 0, color);\nspriteclips[handle].x = 0;\nspriteclips[handle].y = 0;\nspriteclips[handle].w = p2; \nspriteclips[handle].h = p3;\nreturn (p2 < 0) ? handle : 1;\n", "fragments"=>[:sprites, :screen], "includes"=>["SDL.h"], "rtype"=>:w, "params"=>[:w, :l, :l], "defaults"=>[], "return"=>"w"}, :readlong=>{"code"=>"int b1, b2, b3, b4;\nif (!fh[p1])\n    return 0;\nb1 = fgetc(fh[p1]);\nif (b1 == EOF)\n  b1 = 0;\nb2 = fgetc(fh[p1]);\nif (b2 == EOF)\n  b2 = 0;\nb3 = fgetc(fh[p1]);\nif (b3 == EOF)\n  b3 = 0;\nb4 = fgetc(fh[p1]);\nif (b4 == EOF)\n  b4 = 0;\nreturn b1 + b2 * 256 + b3 * 256 * 256 + b4 * 256 * 256 * 256;\n", "fragments"=>[:filehandles], "includes"=>["stdio.h"], "rtype"=>:l, "params"=>[:w], "defaults"=>[], "return"=>"l"}, :len=>{"code"=>"return p1.length();\n", "includes"=>[], "rtype"=>:l, "params"=>[:s], "defaults"=>[], "return"=>"l"}, :asin=>{"code"=>"return asin(p1);\n", "includes"=>["math.h"], "rtype"=>:f, "params"=>[:f], "defaults"=>[], "return"=>"f"}, :int=>{"code"=>"return p1;\n", "includes"=>[], "rtype"=>:l, "params"=>[:f], "defaults"=>[], "return"=>"l"}, :examinekeyboard=>{"code"=>"SDL_Event event;\n\n/* KeyboardReleased needs to report whether a key has actually gone\n * from pressed to released since the last poll. Unlike KeyboardPushed,\n * this cannot be done via the implicitly updated keystate array. */\nmemset(keyrel, 0, SDLK_LAST);\nwhile (SDL_PollEvent(&event)) {\n    if (event.type == SDL_KEYUP) {\n        SDLKey sym = event.key.keysym.sym;\n        if (sym >= 0 && sym < SDLK_LAST) {\n            keyrel[sym] = 1;\n        }\n        break;\n    }\n}\n", "fragments"=>[:keyboard], "includes"=>["SDL.h"], "params"=>[], "defaults"=>[]}, :openwindowedscreen=>{"code"=>"uint32_t flags = SDL_HWSURFACE | SDL_DOUBLEBUF;\nif (p6) {\n    flags |= SDL_RESIZABLE;\n}\nif (!SDL_WasInit(SDL_INIT_VIDEO)) {\n    SDL_InitSubSystem(SDL_INIT_VIDEO);\n}\nscreen = SDL_SetVideoMode(p4, p5, 0, flags);\nif (!screen)\n    return 0;\nSDL_ShowCursor(SDL_DISABLE);\n/* SDL_WM_GrabInput(SDL_GRAB_ON);    too annoying while debugging */\nreturn 1;\n", "fragments"=>[:screen], "includes"=>["SDL.h"], "rtype"=>:l, "params"=>[:l, :l, :l, :l, :l, :l, :l, :l], "defaults"=>[], "return"=>"l"}, :swapelements=>{"code"=>"struct ListElement *a;\nstruct ListElement *b;\nif (!p2 || !p3)\n    return;\nif (p2 == p3)\n    return;\n/* p2 and p3 point to the data parts of their elements */\na = reinterpret_cast<ListElement *>(p2) - 1;\nb = reinterpret_cast<ListElement *>(p3) - 1;\n/* Doing the swaps in this order happens to work right\n * even if p2 and p3 are adjacent. */\nif (!a->next) \n    swap(p1.last, b->next->prev);\nelse if (!b->next)\n    swap(a->next->prev, p1.last);\nelse\n    swap(a->next->prev, b->next->prev); /* usual case */\nswap(a->next, b->next);\nif (!a->prev)\n    swap(p1.root, b->prev->next);\nelse if (!b->prev)\n    swap(a->prev->next, p1.root);\nelse\n    swap(a->prev->next, b->prev->next); /* usual case */\nswap(a->prev, b->prev);\nif (p1.current == a || p1.current == b) {\n   /* Swapped element remains the current element, but its index changes */\n   p1.index = findelem(p1, p1.current);\n}\n", "fragments"=>[:findelem, :swap], "includes"=>[], "params"=>[:"()", :*, :*], "defaults"=>[]}, :displaytransparentsprite=>{"code"=>"SDL_Rect dstrect = { p2, p3, 0, 0 };\nuint32_t color;\nif (p1 >= 1024 || !sprites[p1])\n    return;\ncolor = SDL_MapRGB(sprites[p1]->format, 0, 0, 0);\nSDL_SetColorKey(sprites[p1], SDL_SRCCOLORKEY, color);\nSDL_SetAlpha(sprites[p1], 0, 0);\nSDL_BlitSurface(sprites[p1], &spriteclips[p1], screen, &dstrect);\n", "fragments"=>[:sprites], "includes"=>["SDL.h"], "params"=>[:w, :l, :l], "defaults"=>[]}, :deletefile=>{"code"=>"unlink(p1.c_str());\n", "includes"=>["unistd.h"], "params"=>[:s], "defaults"=>[]}, :runprogram=>{"code"=>"/* stub */\n", "includes"=>[], "params"=>[:s], "defaults"=>[]}, :initnetwork=>{"code"=>"return 1;\n", "includes"=>[], "rtype"=>:l, "params"=>[], "defaults"=>[], "return"=>"l"}, :lcase=>{"code"=>"std::string::iterator it;\nfor (it = p1.begin(); it < p1.end(); it++) {\n  *it = tolower(*it);\n}\nreturn p1;\n", "includes"=>["cctype"], "rtype"=>:s, "params"=>[:s], "defaults"=>[], "return"=>"s"}, :deleteelement=>{"code"=>"/* Delete current element, and leave element before it as current.\n * If deleting first element, leave new first element as current if p2. */\nstruct ListElement *e = p1.current;\nif (!e)\n    return;\nif (e->prev)\n    e->prev->next = e->next;\nif (e->next)\n    e->next->prev = e->prev;\nif (p1.root == e)\n    p1.root = e->next;\nif (p1.last == e)\n    p1.last = e->prev;\np1.current = e->prev;\np1.del_elem(e);\np1.index -= 1;\np1.length -= 1;\nif (p2 && !p1.current && p1.root) {\n    p1.current = p1.root;\n    p1.index = 0;\n}\n", "includes"=>[], "params"=>[:"()", :l], "defaults"=>[0]}, :createdirectory=>{"code"=>"mkdir(p1.c_str(), 0777);\n", "includes"=>["sys/stat.h", "sys/types.h"], "params"=>[:s], "defaults"=>[]}, :print=>{"code"=>"puts(p1.c_str());\n", "includes"=>["stdio.h"], "params"=>[:s], "defaults"=>[]}, :sendnetworkstring=>{"code"=>"size_t count = p2.length();\nssize_t r = 0;\nsize_t n = 0;\nwhile (n < count) {\n    /* p1 is a sockfd that was offset by one in OpenNetworkConnection */\n    r = write(p1 - 1, p2.data() + n, count - n);\n    if (r < 0 && errno == EINTR)\n        continue;\n    if (r < 0)\n        return;\n    /* What should happen if write() returns 0 all the time?\n     * I assume it can sometimes return 0 legitimately,\n     * if it failed to write anything this time. */\n    n += r;\n }\n", "includes"=>["unistd.h", "errno.h"], "params"=>[:l, :s], "defaults"=>[]}, :drawingmode=>{"code"=>";  /* cheat -- always draw in mode 1 */\n", "includes"=>[], "params"=>[:l], "defaults"=>[]}, :joystickaxisx=>{"code"=>"int x = SDL_JoystickGetAxis(joystick, 0);\nif (x < -100) return -1;\nif (x > 100) return 1;\nreturn 0;\n", "fragments"=>[:joystick], "includes"=>["SDL.h"], "rtype"=>:l, "params"=>[], "defaults"=>[], "return"=>"l"}, :openconsole=>{"code"=>"return 1;\n", "includes"=>[], "rtype"=>:l, "params"=>[], "defaults"=>[], "return"=>"l"}, :loadmodule=>{"code"=>"int handle;\nif (p1 < 0) {\n    handle = unused_mod();\n    if (handle == 0)\n        return 0;\n} else {\n    handle = p1;\n}\nif (mods[handle]) {\n    Mix_FreeMusic(mods[handle]);\n    mods[handle] = 0;\n}\nmods[handle] = Mix_LoadMUS(p2.c_str());\nif (!mods[handle])\n    return 0;\nreturn (p1 < 0) ? handle : 1;\n", "fragments"=>[:mods], "includes"=>[], "rtype"=>:w, "params"=>[:w, :s], "defaults"=>[], "return"=>"w"}, :circle=>{"code"=>"Uint32 color;\nif (p4 < 0) {\n  color = SDL_MapRGB(screen->format, frontcolor.r, frontcolor.g, frontcolor.b);\n} else {\n  color = SDL_MapRGB(screen->format, (p4 >> 16) && 0xff, (p4 >> 8) && 0xff, p4 && 0xff);\n}\nfilledCircleColor(screen, p1, p2, p3, color);\n", "fragments"=>[:screen], "includes"=>["SDL.h", "SDL_gfxPrimitives.h"], "params"=>[:l, :l, :l, :l], "defaults"=>[]}, :getcurrentdirectory=>{"code"=>"static size_t bufsz = 128;\nchar *buf = new char[bufsz];\nwhile (!getcwd(buf, bufsz)) {\n    if (errno == ERANGE) {\n        bufsz *= 2;\n        continue;\n    }\n    delete[] buf;\n    return \"\";\n}\nstd::string s(buf);\ndelete[] buf;\nreturn s;\n", "includes"=>["unistd.h", "errno.h"], "rtype"=>:s, "params"=>[], "defaults"=>[], "return"=>"s"}, :readfile=>{"code"=>"return fileopen(p1, p2.c_str(), \"r\");\n", "fragments"=>[:fileopen], "includes"=>[], "rtype"=>:w, "params"=>[:w, :s], "defaults"=>[], "return"=>"w"}, :log=>{"code"=>"return log(p1);\n", "includes"=>["math.h"], "rtype"=>:f, "params"=>[:f], "defaults"=>[], "return"=>"f"}, :rgb=>{"code"=>"return ((uint8_t) p1 << 16) | ((uint8_t) p2 << 8) | (uint8_t) p3;\n", "includes"=>[], "rtype"=>:l, "params"=>[:b, :b, :b], "defaults"=>[], "return"=>"l"}, :drawtext=>{"code"=>"SDL_Rect textpos;\nSDL_Surface *textsurf;\nint w;\ntextpos.x = p1;\ntextpos.y = p2;\nif (!screen)\n    return textpos.x;\n/* background color is in p5, but it's not actually supported yet. */\nif (p4 < 0) {\n    textsurf = TTF_RenderText_Blended(font, p3.c_str(), frontcolor);\n} else {\n    SDL_Color color;\n    color.r = (p4 >> 16) & 0xff;\n    color.g = (p4 >> 8) & 0xff;\n    color.b = p4 & 0xff;\n    textsurf = TTF_RenderText_Blended(font, p3.c_str(), color);\n}\nif (!textsurf)\n    return textpos.x;\nSDL_BlitSurface(textsurf, NULL, screen, &textpos);\nw = textsurf->w;\nSDL_FreeSurface(textsurf);  /* cache this? */\nreturn textpos.x + w;\n", "fragments"=>[:ttf, :screen], "includes"=>["SDL_ttf.h"], "rtype"=>:l, "params"=>[:l, :l, :s, :l, :l], "defaults"=>[-1, 0], "return"=>"l"}, :nextpackfile=>{"code"=>"return nextpack();\n", "fragments"=>[:unpack], "includes"=>[], "rtype"=>:l, "params"=>[], "defaults"=>[], "return"=>"l"}, :chr=>{"code"=>"char s[2];\ns[0] = p1;\ns[1] = 0;\nreturn s;\n", "includes"=>["stdlib.h"], "rtype"=>:s, "params"=>[:b], "defaults"=>[], "return"=>"s"}, :lastelement=>{"code"=>"if (!p1.last)\n    return 0;\np1.current = p1.last;\np1.index = p1.length - 1;\nreturn reinterpret_cast<char *>(p1.current);\n", "includes"=>[], "rtype"=>:*, "params"=>[:"()"], "defaults"=>[], "return"=>"*"}, :mousex=>{"code"=>"return mousex;\n", "fragments"=>[:mouse], "includes"=>[], "rtype"=>:l, "params"=>[], "defaults"=>[], "return"=>"l"}, :issprite=>{"code"=>"return p1 < 1024 && sprites[p1];\n", "fragments"=>[:sprites], "includes"=>[], "rtype"=>:l, "params"=>[:w], "defaults"=>[], "return"=>"l"}, :loc=>{"code"=>"if (!fh[p1])\n  return 0;\nreturn ftell(fh[p1]);\n", "fragments"=>[:filehandles], "includes"=>["stdio.h"], "rtype"=>:l, "params"=>[:w], "defaults"=>[], "return"=>"l"}, :sdl_wm_setcaption_=>{"code"=>"SDL_WM_SetCaption(p1.c_str(), p2.c_str());\n", "includes"=>["SDL.h"], "params"=>[:s, :s], "defaults"=>[]}, :closepack=>{"code"=>"closepack();\nreturn 1;\n", "fragments"=>[:pack], "includes"=>[], "rtype"=>:l, "params"=>[], "defaults"=>[], "return"=>"l"}, :listindex=>{"code"=>"return p1.index;\n", "includes"=>[], "rtype"=>:l, "params"=>[:"()"], "defaults"=>[], "return"=>"l"}, :loadsprite=>{"includes"=>[], "rtype"=>:w, "params"=>[:w, :s], "defaults"=>[], "return"=>"w"}, :readword=>{"code"=>"int b1, b2;\nif (!fh[p1])\n    return 0;\nb1 = fgetc(fh[p1]);\nif (b1 == EOF)\n  b1 = 0;\nb2 = fgetc(fh[p1]);\nif (b2 == EOF)\n  b2 = 0;\nreturn b1 + b2 * 256;\n", "fragments"=>[:filehandles], "includes"=>["stdio.h"], "rtype"=>:w, "params"=>[:w], "defaults"=>[], "return"=>"w"}, :releasemouse=>{"code"=>"SDL_WM_GrabInput(p1 ? SDL_GRAB_OFF : SDL_GRAB_ON);\n", "includes"=>["SDL.h"], "rtype"=>:l, "params"=>[:l], "defaults"=>[], "return"=>"l"}, :parsedate=>{"code"=>"char c;\nint n;\nint v;\nstruct tm tm = { 0, 0, 0, 1, 0, 0, 0, 0, 0 };\nconst char *q = p1.c_str();\nconst char *r = p2.c_str();\nwhile (c = *q++) {\n    if (c == '%') {\n        if (q[0] == 'y' && q[1] == 'y' && q[2] == 'y' && q[3] == 'y') {\n            n = sscanf(r, \"%4d\", &v);\n            tm.tm_year = v - 1900;\n        } else if (q[0] == 'y' && q[1] == 'y') {\n            n = sscanf(r, \"%2d\", &v);\n            tm.tm_year = v + 100;\n        } else if (q[0] == 'm' && q[1] == 'm') {\n            n = sscanf(r, \"%2d\", &v);\n            tm.tm_mon = v - 1;\n        } else if (q[0] == 'd' && q[1] == 'd') {\n            n = sscanf(r, \"%2d\", &v);\n            tm.tm_mday = v;\n        } else if (q[0] == 'h' && q[1] == 'h') {\n            n = sscanf(r, \"%2d\", &v);\n            tm.tm_hour = v;\n        } else if (q[0] == 'i' && q[1] == 'i') {\n            n = sscanf(r, \"%2d\", &v);\n            tm.tm_min = v;\n        } else if (q[0] == 's' && q[1] == 's') {\n            n = sscanf(r, \"%2d\", &v);\n            tm.tm_sec = v;\n        } else {\n            n = 1;\n        }\n        if (n == EOF)\n            return -1;\n        r += n;\n        q += n;\n    } else {\n        r++;\n    }\n}\nreturn mktime(&tm);\n", "includes"=>["stdio.h", "time.h"], "rtype"=>:l, "params"=>[:s, :s], "defaults"=>[], "return"=>"l"}, :openscreen=>{"code"=>"uint32_t flags = SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN;\nif (!SDL_WasInit(SDL_INIT_VIDEO)) {\n    SDL_InitSubSystem(SDL_INIT_VIDEO);\n}\nscreen = SDL_SetVideoMode(p1, p2, p3, flags);\nif (!screen)\n    return 0;\nSDL_WM_SetCaption(p4.c_str(), \"\");\nSDL_ShowCursor(SDL_DISABLE);\nreturn 1;\n", "fragments"=>[:screen], "includes"=>["SDL.h"], "rtype"=>:l, "params"=>[:l, :l, :l, :s], "defaults"=>[], "return"=>"l"}, :mid=>{"code"=>"if (p2 > (int32_t) p1.length())\n  return \"\";\nif (p2 <= 0)\n  p2 = 1;\nif (p3 < 0)\n  p3 = 0;\nreturn p1.substr(p2 - 1, p3);\n", "includes"=>[], "rtype"=>:s, "params"=>[:s, :l, :l], "defaults"=>[], "return"=>"s"}, :tan=>{"code"=>"return acos(p1);\n", "includes"=>["math.h"], "rtype"=>:f, "params"=>[:f], "defaults"=>[], "return"=>"f"}, :selectelement=>{"code"=>"int i;\nstruct ListElement *p = p1.root;\nfor (i = 0; p && i < p2; i++) {\n    p = p->next;\n}\nif (p) {\n    p1.current = p;\n    p1.index = i;\n}\n", "includes"=>[], "params"=>[:"()", :l], "defaults"=>[]}, :abs=>{"code"=>"return fabs(p1);\n", "includes"=>["math.h"], "rtype"=>:f, "params"=>[:f], "defaults"=>[], "return"=>"f"}, :clipsprite=>{"code"=>"if (p1 >= 1024 || !sprites[p1])\n    return;\nspriteclips[p1].x = p2;\nspriteclips[p1].y = p3;\nspriteclips[p1].w = p4;\nspriteclips[p1].h = p5;\n", "fragments"=>[:sprites], "includes"=>[], "params"=>[:w, :l, :l, :l, :l], "defaults"=>[]}, :writelong=>{"code"=>"if (!fh[p1])\n    return;\nfputc(p2, fh[p1]);\nfputc((p2 >> 8), fh[p1]);\nfputc((p2 >> 16), fh[p1]);\nfputc((p2 >> 24), fh[p1]);\n", "fragments"=>[:filehandles], "includes"=>["stdio.h"], "params"=>[:w, :l], "defaults"=>[]}, :startdrawing=>{"code"=>";  /* cheat -- all output to main screen */\n", "includes"=>[], "params"=>[:l], "defaults"=>[]}, :findstring=>{"code"=>"size_t pos;\np3--;  /* Convert to 0-based offset */\nif (p3 >= (int32_t) p1.length())\n  return 0;\nif (p3 < 0)\n  p3 = 0;\npos = p1.find(p2, p3);\nreturn pos == std::string::npos ? 0 : pos + 1;\n", "includes"=>["string.h"], "rtype"=>:l, "params"=>[:s, :s, :l], "defaults"=>[], "return"=>"l"}, :atan=>{"code"=>"return acos(p1);\n", "includes"=>["math.h"], "rtype"=>:f, "params"=>[:f], "defaults"=>[], "return"=>"f"}, :sqr=>{"code"=>"return sqrt(p1);\n", "includes"=>["math.h"], "rtype"=>:f, "params"=>[:f], "defaults"=>[], "return"=>"f"}, :keyboardpushed=>{"code"=>"if (p1 >= numkeys)\n  return 0;\nif (p1 < 0)\n  return 0;\nreturn keystate[p1] != 0;\n", "fragments"=>[:keyboard], "includes"=>["SDL.h"], "rtype"=>:l, "params"=>[:l], "defaults"=>[], "return"=>"l"}, :insertelement=>{"code"=>"struct ListElement *newelem = p1.alloc_elem();\nif (!newelem)\n    return 0;\nif (p1.length == 0) {\n    insertonly(p1, newelem);\n} else if (!p1.current || p1.current == p1.root) {\n    insertfirst(p1, newelem);\n} else {\n    newelem->next = p1.current;\n    newelem->prev = p1.current->prev;\n    newelem->next->prev = newelem;\n    newelem->prev->next = newelem;\n    p1.current = newelem;\n    p1.length += 1;\n}\nreturn reinterpret_cast<char *>(p1.current);\n", "fragments"=>[:listfuncs], "includes"=>[], "rtype"=>:*, "params"=>[:"()"], "defaults"=>[], "return"=>"*"}, :getenvironmentvariable=>{"code"=>"char *s = getenv(p1.c_str());\nreturn s ? s : \"\";\n", "includes"=>["stdlib.h"], "rtype"=>:s, "params"=>[:s], "defaults"=>[], "return"=>"s"}, :displaytranslucentsprite=>{"code"=>"SDL_Rect dstrect = { p2, p3, 0, 0 };\nuint32_t color;\nif (p1 >= 1024 || !sprites[p1])\n    return;\ncolor = SDL_MapRGB(sprites[p1]->format, 0, 0, 0);\nSDL_SetColorKey(sprites[p1], SDL_SRCCOLORKEY, color);\nSDL_SetAlpha(sprites[p1], SDL_SRCALPHA, p4);\nSDL_BlitSurface(sprites[p1], &spriteclips[p1], screen, &dstrect);\n", "fragments"=>[:sprites], "includes"=>["SDL.h"], "params"=>[:w, :l, :l, :l], "defaults"=>[]}, :examinedirectory=>{"code"=>"int handle;\nif (p1 < 0) {\n    handle = unused_dh();\n    if (handle == 0)\n      return 0;\n} else {\n    handle = p1;\n}\nif (dh[handle].dir) {\n    closedir(dh[handle].dir);\n    dh[handle].dir = 0;\n    free(dh[handle].pattern);\n    free(dh[handle].name);\n}\ndh[handle].dir = opendir(p2.c_str());\nif (!dh[handle].dir)\n  return 0;\ndh[handle].name = strdup(p2.c_str());\ndh[handle].pattern = strdup(p3.c_str());\nreturn (p1 < 0) ? handle : 1;\n", "fragments"=>[:dirhandles], "includes"=>["sys/types.h", "dirent.h", "stdlib.h", "string.h"], "rtype"=>:w, "params"=>[:w, :s, :s], "defaults"=>[], "return"=>"w"}, :opennetworkconnection=>{"code"=>"char service[10];\nstruct addrinfo hints = {0, };\nstruct addrinfo *addrs;\nstruct addrinfo *addr;\nint sockfd;\nsprintf(service, \"%d\", p2);\nhints.ai_flags = AI_ADDRCONFIG | AI_V4MAPPED | AI_NUMERICSERV;\nhints.ai_family = AF_UNSPEC; /* allow IPv4 or IPv6 addresses */\nhints.ai_socktype = SOCK_STREAM;\nhints.ai_protocol = 0; /* allow any stream protocol */\nif (getaddrinfo(p1.c_str(), service, &hints, &addrs) < 0)\n    return 0;\n/* getaddrinfo can return multiple addresses.\n * Try each in turn until one succeeds. */\nfor (addr = addrs; addr; addr = addr->ai_next) {\n    sockfd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);\n    if (sockfd < 0)\n        continue;\n    if (connect(sockfd, addr->ai_addr, addr->ai_addrlen) >= 0)\n        break; /* got one */\n    close(sockfd);\n}\nfreeaddrinfo(addrs);\nif (!addr)\n    return 0; /* all addresses failed */\nreturn sockfd + 1;  /* offset by one because sockfd might be 0 */\n", "includes"=>["netdb.h", "sys/types.h", "sys/socket.h", "unistd.h"], "rtype"=>:l, "params"=>[:s, :w], "defaults"=>[], "return"=>"l"}, :initjoystick=>{"code"=>"if (SDL_InitSubSystem(SDL_INIT_JOYSTICK) != 0)\n    return 0;\nif (SDL_NumJoysticks() == 0)\n    return 0;\njoystick = SDL_JoystickOpen(0);\nif (!joystick)\n    return 0;\nreturn 1;\n", "fragments"=>[:joystick], "includes"=>["SDL.h"], "rtype"=>:l, "params"=>[], "defaults"=>[], "return"=>"l"}, :setframerate=>{"code"=>"framerate = p1;\n", "fragments"=>[:framerate], "includes"=>[], "params"=>[:l], "defaults"=>[]}, :ucase=>{"code"=>"std::string::iterator it;\nfor (it = p1.begin(); it < p1.end(); it++) {\n  *it = toupper(*it);\n}\nreturn p1;\n", "includes"=>["cctype"], "rtype"=>:s, "params"=>[:s], "defaults"=>[], "return"=>"s"}, :peekc=>{"code"=>"return * (uint8_t *) p1;\n", "includes"=>[], "rtype"=>:c, "params"=>[:*], "defaults"=>[], "return"=>"c"}, :nextdirectoryentry=>{"code"=>"struct dirent *ent;\nif (!dh[p1].dir)\n    return 0;\nent = readdir(dh[p1].dir);\nif (!ent)\n  return 0;\ndh[p1].curdent = *ent;\nif (dh[p1].curdent.d_type == DT_DIR)\n  return 1;\nreturn 2;\n", "fragments"=>[:dirhandles], "includes"=>["sys/types.h", "dirent.h", "unistd.h"], "rtype"=>:w, "params"=>[:w], "defaults"=>[], "return"=>"w"}, :round=>{"code"=>"switch (p2) {\ncase 0: /* #PB_Round_Down */\n    return floor(p1);\ncase 1: /* #PB_Round_Up */\n    return ceil(p1);\ndefault:\ncase 2: /* #PB_Round_Nearest */\n    return round(p1); /* Rounds halfway cases away from zero. */\n}\n", "includes"=>["math.h"], "rtype"=>:f, "params"=>[:f, :l], "defaults"=>[], "return"=>"f"}, :playsound=>{"code"=>"if (p1 > 1024 || p1 < 0 || !sounds[p1])\n    return;\nMix_PlayChannel(-1, sounds[p1], 0);\n", "fragments"=>[:sounds], "includes"=>["SDL_mixer.h"], "params"=>[:w], "defaults"=>[]}, :line=>{"code"=>"Uint32 color;\nif (p5 < 0) {\n  color = SDL_MapRGB(screen->format, frontcolor.r, frontcolor.g, frontcolor.b);\n} else {\n  color = SDL_MapRGB(screen->format, (p5 >> 16) && 0xff, (p5 >> 8) && 0xff, p5 && 0xff);\n}\nlinedraw(p1, p2, p3, p4, color);\n", "fragments"=>[:linedraw], "includes"=>[], "params"=>[:l, :l, :l, :l, :l], "defaults"=>[-1]}, :joystickaxisy=>{"code"=>"int y = SDL_JoystickGetAxis(joystick, 1);\nif (y < -100) return -1;\nif (y > 100) return 1;\nreturn 0;\n", "fragments"=>[:joystick], "includes"=>["SDL.h"], "rtype"=>:l, "params"=>[], "defaults"=>[], "return"=>"l"}, :clearscreen=>{"code"=>"int r, g, b;\nuint32_t color;\nif (!screen)\n    return;\nr = (p1 >> 16) & 0xff;\ng = (p1 >> 8) & 0xff;\nb = p1 & 0xff;\ncolor = SDL_MapRGB(screen->format, r, g, b);\nSDL_FillRect(screen, 0, color);\n", "fragments"=>[:screen], "includes"=>["SDL.h"], "params"=>[:l], "defaults"=>[]}, :printn=>{"code"=>"printf(\"%s\\n\", p1.c_str());\n", "includes"=>["stdio.h"], "params"=>[:s], "defaults"=>[]}, :playmodule=>{"code"=>"if (p1 > 1024 || p1 < 0 || !mods[p1])\n    return;\nMix_PlayMusic(mods[p1], -1);\n", "fragments"=>[:mods], "includes"=>[], "params"=>[:w], "defaults"=>[]}, :resetlist=>{"code"=>"p1.current = 0;\np1.index = -1;\n", "includes"=>[], "params"=>[:"()"], "defaults"=>[]}, :initsprite=>{"code"=>"return SDL_Init(SDL_INIT_VIDEO) == 0;\n", "includes"=>["SDL.h"], "rtype"=>:l, "params"=>[], "defaults"=>[], "return"=>"l"}, :eof=>{"code"=>"/* Can't use feof() here. Eof() should return true when the file\n * pointer is actually at the end of the file, while feof only\n * returns true when a previous read has failed. */\nint c;\nif (!fh[p1])\n  return 0;\nc = getc(fh[p1]);\nif (c == EOF)\n  return 1;\nungetc(c, fh[p1]);\nreturn 0;\n", "fragments"=>[:filehandles], "includes"=>["stdio.h"], "rtype"=>:w, "params"=>[:l], "defaults"=>[], "return"=>"w"}, :createfile=>{"code"=>"return fileopen(p1, p2.c_str(), \"w\");\n", "fragments"=>[:fileopen], "includes"=>[], "rtype"=>:w, "params"=>[:w, :s], "defaults"=>[], "return"=>"w"}, :log10=>{"code"=>"return log10(p1);\n", "includes"=>["math.h"], "rtype"=>:f, "params"=>[:f], "defaults"=>[], "return"=>"f"}, :initmouse=>{"code"=>"return 1;\n", "includes"=>[], "rtype"=>:l, "params"=>[], "defaults"=>[], "return"=>"l"}, :textwidth=>{"code"=>"int w = 0;\nTTF_SizeText(font, p1.c_str(), &w, 0);\nreturn w;\n", "fragments"=>[:ttf, :screen], "includes"=>["SDL_ttf.h"], "rtype"=>:l, "params"=>[:s], "defaults"=>[], "return"=>"l"}, :createpack=>{"code"=>"closepack();\npackfd = open(p1.c_str(), O_CREAT|O_TRUNC|O_WRONLY, 0666);\nreturn packfd >= 0;\n", "fragments"=>[:packfile], "includes"=>["sys/types.h", "sys/stat.h", "fcntl.h"], "rtype"=>:l, "params"=>[:s], "defaults"=>[], "return"=>"l"}}
HEADERINFO = {"math.h"=>{"lib"=>"m"}, "SDL.h"=>{"lib"=>"SDL", "path"=>"/usr/include/SDL"}, "SDL_image.h"=>{"lib"=>"SDL_image", "path"=>"/usr/include/SDL"}, "SDL_mixer.h"=>{"lib"=>"SDL_mixer", "path"=>"/usr/include/SDL"}, "SDL_gfxPrimitives.h"=>{"lib"=>"SDL_gfx", "path"=>"/usr/include/SDL"}, "SDL_ttf.h"=>{"lib"=>"SDL_ttf", "path"=>"/usr/include/SDL"}}
#
# DO NOT MODIFY!!!!
# This file is automatically generated by racc 1.4.5
# from racc grammer file "elice.y".
#
#
# elice.tab.rb: generated by racc (runtime embedded)
#
###### racc/parser.rb begin
unless $".index 'racc/parser.rb'
$".push 'racc/parser.rb'

self.class.module_eval <<'..end racc/parser.rb modeval..id95a390708a', 'racc/parser.rb', 1
#
# $Id: parser.rb,v 1.7 2005/11/20 17:31:32 aamine Exp $
#
# Copyright (c) 1999-2005 Minero Aoki
#
# This program is free software.
# You can distribute/modify this program under the same terms of ruby.
#
# As a special exception, when this code is copied by Racc
# into a Racc output file, you may use that output file
# without restriction.
#

unless defined?(NotImplementedError)
  NotImplementedError = NotImplementError
end

module Racc
  class ParseError < StandardError; end
end
unless defined?(::ParseError)
  ParseError = Racc::ParseError
end

module Racc

  unless defined?(Racc_No_Extentions)
    Racc_No_Extentions = false
  end

  class Parser

    Racc_Runtime_Version = '1.4.5'
    Racc_Runtime_Revision = '$Revision: 1.7 $'.split[1]

    Racc_Runtime_Core_Version_R = '1.4.5'
    Racc_Runtime_Core_Revision_R = '$Revision: 1.7 $'.split[1]
    begin
      require 'racc/cparse'
    # Racc_Runtime_Core_Version_C  = (defined in extention)
      Racc_Runtime_Core_Revision_C = Racc_Runtime_Core_Id_C.split[2]
      unless new.respond_to?(:_racc_do_parse_c, true)
        raise LoadError, 'old cparse.so'
      end
      if Racc_No_Extentions
        raise LoadError, 'selecting ruby version of racc runtime core'
      end

      Racc_Main_Parsing_Routine    = :_racc_do_parse_c
      Racc_YY_Parse_Method         = :_racc_yyparse_c
      Racc_Runtime_Core_Version    = Racc_Runtime_Core_Version_C
      Racc_Runtime_Core_Revision   = Racc_Runtime_Core_Revision_C
      Racc_Runtime_Type            = 'c'
    rescue LoadError
      Racc_Main_Parsing_Routine    = :_racc_do_parse_rb
      Racc_YY_Parse_Method         = :_racc_yyparse_rb
      Racc_Runtime_Core_Version    = Racc_Runtime_Core_Version_R
      Racc_Runtime_Core_Revision   = Racc_Runtime_Core_Revision_R
      Racc_Runtime_Type            = 'ruby'
    end

    def Parser.racc_runtime_type
      Racc_Runtime_Type
    end

    private

    def _racc_setup
      @yydebug = false unless self.class::Racc_debug_parser
      @yydebug = false unless defined?(@yydebug)
      if @yydebug
        @racc_debug_out = $stderr unless defined?(@racc_debug_out)
        @racc_debug_out ||= $stderr
      end
      arg = self.class::Racc_arg
      arg[13] = true if arg.size < 14
      arg
    end

    def _racc_init_sysvars
      @racc_state  = [0]
      @racc_tstack = []
      @racc_vstack = []

      @racc_t = nil
      @racc_val = nil

      @racc_read_next = true

      @racc_user_yyerror = false
      @racc_error_status = 0
    end

    ###
    ### do_parse
    ###

    def do_parse
      __send__(Racc_Main_Parsing_Routine, _racc_setup(), false)
    end

    def next_token
      raise NotImplementedError, "#{self.class}\#next_token is not defined"
    end

    def _racc_do_parse_rb(arg, in_debug)
      action_table, action_check, action_default, action_pointer,
      goto_table,   goto_check,   goto_default,   goto_pointer,
      nt_base,      reduce_table, token_table,    shift_n,
      reduce_n,     use_result,   * = arg

      _racc_init_sysvars
      tok = act = i = nil
      nerr = 0

      catch(:racc_end_parse) {
        while true
          if i = action_pointer[@racc_state[-1]]
            if @racc_read_next
              if @racc_t != 0   # not EOF
                tok, @racc_val = next_token()
                unless tok      # EOF
                  @racc_t = 0
                else
                  @racc_t = (token_table[tok] or 1)   # error token
                end
                racc_read_token(@racc_t, tok, @racc_val) if @yydebug
                @racc_read_next = false
              end
            end
            i += @racc_t
            unless i >= 0 and
                   act = action_table[i] and
                   action_check[i] == @racc_state[-1]
              act = action_default[@racc_state[-1]]
            end
          else
            act = action_default[@racc_state[-1]]
          end
          while act = _racc_evalact(act, arg)
            ;
          end
        end
      }
    end

    ###
    ### yyparse
    ###

    def yyparse(recv, mid)
      __send__(Racc_YY_Parse_Method, recv, mid, _racc_setup(), true)
    end

    def _racc_yyparse_rb(recv, mid, arg, c_debug)
      action_table, action_check, action_default, action_pointer,
      goto_table,   goto_check,   goto_default,   goto_pointer,
      nt_base,      reduce_table, token_table,    shift_n,
      reduce_n,     use_result,   * = arg

      _racc_init_sysvars
      tok = nil
      act = nil
      i = nil
      nerr = 0

      catch(:racc_end_parse) {
        until i = action_pointer[@racc_state[-1]]
          while act = _racc_evalact(action_default[@racc_state[-1]], arg)
            ;
          end
        end
        recv.__send__(mid) do |tok, val|
          unless tok
            @racc_t = 0
          else
            @racc_t = (token_table[tok] or 1)   # error token
          end
          @racc_val = val
          @racc_read_next = false

          i += @racc_t
          unless i >= 0 and
                 act = action_table[i] and
                 action_check[i] == @racc_state[-1]
            act = action_default[@racc_state[-1]]
          end
          while act = _racc_evalact(act, arg)
            ;
          end

          while not (i = action_pointer[@racc_state[-1]]) or
                not @racc_read_next or
                @racc_t == 0   # $
            unless i and i += @racc_t and
                   i >= 0 and
                   act = action_table[i] and
                   action_check[i] == @racc_state[-1]
              act = action_default[@racc_state[-1]]
            end
            while act = _racc_evalact(act, arg)
              ;
            end
          end
        end
      }
    end

    ###
    ### common
    ###

    def _racc_evalact(act, arg)
      action_table, action_check, action_default, action_pointer,
      goto_table,   goto_check,   goto_default,   goto_pointer,
      nt_base,      reduce_table, token_table,    shift_n,
      reduce_n,     use_result,   * = arg
      nerr = 0   # tmp

      if act > 0 and act < shift_n
        #
        # shift
        #
        if @racc_error_status > 0
          @racc_error_status -= 1 unless @racc_t == 1   # error token
        end
        @racc_vstack.push @racc_val
        @racc_state.push act
        @racc_read_next = true
        if @yydebug
          @racc_tstack.push @racc_t
          racc_shift @racc_t, @racc_tstack, @racc_vstack
        end

      elsif act < 0 and act > -reduce_n
        #
        # reduce
        #
        code = catch(:racc_jump) {
          @racc_state.push _racc_do_reduce(arg, act)
          false
        }
        if code
          case code
          when 1 # yyerror
            @racc_user_yyerror = true   # user_yyerror
            return -reduce_n
          when 2 # yyaccept
            return shift_n
          else
            raise '[Racc Bug] unknown jump code'
          end
        end

      elsif act == shift_n
        #
        # accept
        #
        racc_accept if @yydebug
        throw :racc_end_parse, @racc_vstack[0]

      elsif act == -reduce_n
        #
        # error
        #
        case @racc_error_status
        when 0
          unless arg[21]    # user_yyerror
            nerr += 1
            on_error @racc_t, @racc_val, @racc_vstack
          end
        when 3
          if @racc_t == 0   # is $
            throw :racc_end_parse, nil
          end
          @racc_read_next = true
        end
        @racc_user_yyerror = false
        @racc_error_status = 3
        while true
          if i = action_pointer[@racc_state[-1]]
            i += 1   # error token
            if  i >= 0 and
                (act = action_table[i]) and
                action_check[i] == @racc_state[-1]
              break
            end
          end
          throw :racc_end_parse, nil if @racc_state.size <= 1
          @racc_state.pop
          @racc_vstack.pop
          if @yydebug
            @racc_tstack.pop
            racc_e_pop @racc_state, @racc_tstack, @racc_vstack
          end
        end
        return act

      else
        raise "[Racc Bug] unknown action #{act.inspect}"
      end

      racc_next_state(@racc_state[-1], @racc_state) if @yydebug

      nil
    end

    def _racc_do_reduce(arg, act)
      action_table, action_check, action_default, action_pointer,
      goto_table,   goto_check,   goto_default,   goto_pointer,
      nt_base,      reduce_table, token_table,    shift_n,
      reduce_n,     use_result,   * = arg
      state = @racc_state
      vstack = @racc_vstack
      tstack = @racc_tstack

      i = act * -3
      len       = reduce_table[i]
      reduce_to = reduce_table[i+1]
      method_id = reduce_table[i+2]
      void_array = []

      tmp_t = tstack[-len, len] if @yydebug
      tmp_v = vstack[-len, len]
      tstack[-len, len] = void_array if @yydebug
      vstack[-len, len] = void_array
      state[-len, len]  = void_array

      # tstack must be updated AFTER method call
      if use_result
        vstack.push __send__(method_id, tmp_v, vstack, tmp_v[0])
      else
        vstack.push __send__(method_id, tmp_v, vstack)
      end
      tstack.push reduce_to

      racc_reduce(tmp_t, reduce_to, tstack, vstack) if @yydebug

      k1 = reduce_to - nt_base
      if i = goto_pointer[k1]
        i += state[-1]
        if i >= 0 and (curstate = goto_table[i]) and goto_check[i] == k1
          return curstate
        end
      end
      goto_default[k1]
    end

    def on_error(t, val, vstack)
      raise ParseError, sprintf("\nparse error on value %s (%s)",
                                val.inspect, token_to_str(t) || '?')
    end

    def yyerror
      throw :racc_jump, 1
    end

    def yyaccept
      throw :racc_jump, 2
    end

    def yyerrok
      @racc_error_status = 0
    end

    #
    # for debugging output
    #

    def racc_read_token(t, tok, val)
      @racc_debug_out.print 'read    '
      @racc_debug_out.print tok.inspect, '(', racc_token2str(t), ') '
      @racc_debug_out.puts val.inspect
      @racc_debug_out.puts
    end

    def racc_shift(tok, tstack, vstack)
      @racc_debug_out.puts "shift   #{racc_token2str tok}"
      racc_print_stacks tstack, vstack
      @racc_debug_out.puts
    end

    def racc_reduce(toks, sim, tstack, vstack)
      out = @racc_debug_out
      out.print 'reduce '
      if toks.empty?
        out.print ' <none>'
      else
        toks.each {|t| out.print ' ', racc_token2str(t) }
      end
      out.puts " --> #{racc_token2str(sim)}"
          
      racc_print_stacks tstack, vstack
      @racc_debug_out.puts
    end

    def racc_accept
      @racc_debug_out.puts 'accept'
      @racc_debug_out.puts
    end

    def racc_e_pop(state, tstack, vstack)
      @racc_debug_out.puts 'error recovering mode: pop token'
      racc_print_states state
      racc_print_stacks tstack, vstack
      @racc_debug_out.puts
    end

    def racc_next_state(curstate, state)
      @racc_debug_out.puts  "goto    #{curstate}"
      racc_print_states state
      @racc_debug_out.puts
    end

    def racc_print_stacks(t, v)
      out = @racc_debug_out
      out.print '        ['
      t.each_index do |i|
        out.print ' (', racc_token2str(t[i]), ' ', v[i].inspect, ')'
      end
      out.puts ' ]'
    end

    def racc_print_states(s)
      out = @racc_debug_out
      out.print '        ['
      s.each {|st| out.print ' ', st }
      out.puts ' ]'
    end

    def racc_token2str(tok)
      self.class::Racc_token_to_s_table[tok] or
          raise "[Racc Bug] can't convert token #{tok} to string"
    end

    def token_to_str(t)
      self.class::Racc_token_to_s_table[t]
    end

  end

end
..end racc/parser.rb modeval..id95a390708a
end
###### racc/parser.rb end


self.class.module_eval <<'..end elice.y modeval..iddbde152cd4', 'elice.y', 555
require 'strscan'
require 'set'

class ProgramError < Exception
end

..end elice.y modeval..iddbde152cd4

class Parser < Racc::Parser

module_eval <<'..end elice.y modeval..id8638475ce8', 'elice.y', 562
  def parse_file(fname, program, source)
    @program = program
    @scope = @program

    source += "\n"
    @fname = fname
    @s = StringScanner.new(source)

    @included_files = [ fname ]
    @filestack = []

    # This list must be duplicated in the token declaration above
    @keywords = Set[ 
      :XINCLUDEFILE, :INCLUDEFILE,
      :COMPILERSELECT, :COMPILERCASE, :COMPILERENDSELECT,
      :COMPILERIF, :COMPILERENDIF,
      :ENUMERATION, :ENDENUMERATION,
      :STRUCTURE, :ENDSTRUCTURE,
      :DIM, :NEWLIST, :DECLARE, :PROCEDURE, :ENDPROCEDURE, :PROCEDURERETURN,
      :DATASECTION, :ENDDATASECTION, :DATA, :READ,
      :SHARED, :STATIC, :GLOBAL, :PROTECTED,
      :IF, :ELSE, :ELSEIF, :ENDIF,
      :BREAK, :CONTINUE,
      :FOR, :TO, :STEP, :NEXT, :FOREACH,
      :REPEAT, :UNTIL, :FOREVER,
      :WHILE, :WEND,
      :SELECT, :CASE, :DEFAULT, :ENDSELECT,
      :GOTO,
      :END,
      :AND, :OR, :NOT,
      :SIZEOF, :OFFSETOF
    ]

    @skiptokens = false
    @compilerselect = nil

    begin
      @yydebug = true
      do_parse
    rescue ParseError, ProgramError => e
      e.set_backtrace(parse_stack)
      raise e
    end
  end

  def include_file(fname)
    require 'pathname'
    # Construct fname relative to old @fname, if appropriate.
    fname = (Pathname.new(@fname).dirname + fname).to_s
    source = File.read(fname) + "\n"
    @included_files << fname
    @filestack << [@fname, @s]
    @fname = fname
    @s = StringScanner.new(source)
  end

  def next_token
    @s.skip /[ \t\0]+/

    # end of file
    if @s.eos?
      if @filestack.empty?
        return [false, false]   # end-of-input marker
      end
      @fname, @s = @filestack.pop
      return [:LINE, :LINE]    # line always ends at end of a file

    elsif @skiptokens
      if (s = @s.scan_until /(Compiler(Select|Case|EndSelect|If|EndIf))/)
        # Turn @skiptokens off again so that Compiler statement can be
        # parsed. It is parser's responsibility to turn it on again if needed.
        @skiptokens = false
        kw = @s[1].upcase.to_sym
        return [kw, kw]
      end
      raise ParseError, "expected CompilerEndSelect or CompilerEndIf before end of file"

    # end of line
    elsif @s.scan /[\n\r]+/
      return [:LINE, :LINE]

    # comment to end of line
    elsif @s.scan /;[^\n\r]*[\n\r]/
      return [:LINE, :LINE]

    # float literal
    elsif @s.scan /[0-9]*\.[0-9]+/
      return [:NUMBER, @s[0].to_f]

    # integer literal
    elsif @s.scan /[0-9]+/
      return [:NUMBER, @s[0].to_i]

    # hex integer literal
    elsif @s.scan /\$[a-fA-F0-9]+/
      return [:NUMBER, @s[0].slice(1,@s[0].size).to_i(16)]

    # binary integer literal
    elsif @s.scan /%[01]+/
      return [:NUMBER, @s[0].slice(1,@s[0].size).to_i(2)]

    # string literal
    elsif @s.scan /"([^"]*)"/
      # TODO: figure out quoting rules in strings
      return [:STRING, @s[1]]

    # constant
    elsif @s.scan /#([_A-Za-z][_A-Za-z0-9]*)/
      return [:CONSTANT, @s[1].upcase.to_sym]

    # double-char operator
    elsif @s.scan /<>|>=|<=/
      return [@s[0], @s[0]]

    # single-char operator
    elsif @s.scan /[=+-><*\/%@&|!]/
      return [@s[0], @s[0]]

    # field selector (racc has trouble handling it as a literal)
    elsif @s.scan /\\/
      return [:BACKSLASH, @s[0]]

    # syntax helpers
    elsif @s.scan /[\[\](),.:$]/
      return [@s[0], @s[0]]

    # keyword or identifier
    elsif @s.scan /([_A-Za-z][_A-Za-z0-9]*)/
      kw = @s[1].upcase.to_sym
      return [kw, kw] if @keywords.include? kw
      return [:ID, @s[1].downcase.to_sym]

    else
      raise ParseError, "unknown token"
    end
  end

  def on_error(t, val, vstack)
    tname = token_to_str(t) || "?"
    if val.is_a?(String) && tname == val.inspect
      raise ParseError, "unexpected #{val.inspect}"
    elsif val.is_a?(Symbol) && tname == val.to_s
      raise ParseError, "unexpected token #{tname}"
    elsif val.is_a? Symbol
      raise ParseError, "unexpected #{tname} token #{val}"
    else
      raise ParseError, "unexpected #{tname} token #{val.inspect}"
    end
  end

  def parse_stack
    stack = @filestack + [[@fname, @s]]
    stack = stack.reverse.map do |x|
      fname, s = x
      s.scan //
      lineno = s.pre_match.count("\n") + 1
      "#{fname}:#{lineno}"
    end
    return stack
  end

..end elice.y modeval..id8638475ce8

##### racc 1.4.5 generates ###

racc_reduce_table = [
 0, 0, :racc_error,
 1, 84, :_reduce_none,
 3, 84, :_reduce_none,
 0, 85, :_reduce_none,
 1, 85, :_reduce_none,
 3, 85, :_reduce_none,
 5, 85, :_reduce_none,
 1, 88, :_reduce_7,
 1, 88, :_reduce_none,
 2, 88, :_reduce_none,
 1, 88, :_reduce_none,
 1, 88, :_reduce_none,
 1, 89, :_reduce_12,
 1, 89, :_reduce_13,
 1, 89, :_reduce_14,
 1, 89, :_reduce_15,
 1, 89, :_reduce_16,
 1, 89, :_reduce_17,
 1, 89, :_reduce_none,
 2, 89, :_reduce_19,
 1, 89, :_reduce_20,
 1, 89, :_reduce_21,
 1, 89, :_reduce_none,
 1, 89, :_reduce_none,
 1, 89, :_reduce_24,
 1, 89, :_reduce_none,
 1, 89, :_reduce_none,
 1, 89, :_reduce_none,
 1, 89, :_reduce_none,
 1, 89, :_reduce_none,
 1, 89, :_reduce_none,
 1, 89, :_reduce_none,
 1, 89, :_reduce_none,
 1, 89, :_reduce_none,
 1, 89, :_reduce_none,
 1, 89, :_reduce_none,
 2, 89, :_reduce_36,
 1, 89, :_reduce_37,
 1, 89, :_reduce_38,
 1, 89, :_reduce_39,
 2, 89, :_reduce_40,
 1, 86, :_reduce_none,
 2, 86, :_reduce_none,
 3, 86, :_reduce_none,
 3, 118, :_reduce_44,
 0, 119, :_reduce_45,
 2, 119, :_reduce_46,
 1, 120, :_reduce_47,
 3, 120, :_reduce_48,
 2, 94, :_reduce_49,
 1, 122, :_reduce_none,
 1, 122, :_reduce_none,
 2, 95, :_reduce_52,
 2, 96, :_reduce_53,
 1, 97, :_reduce_54,
 2, 98, :_reduce_55,
 1, 99, :_reduce_56,
 3, 101, :_reduce_57,
 0, 125, :_reduce_58,
 5, 90, :_reduce_none,
 0, 124, :_reduce_none,
 3, 124, :_reduce_61,
 5, 102, :_reduce_62,
 0, 126, :_reduce_63,
 3, 126, :_reduce_64,
 2, 127, :_reduce_65,
 0, 129, :_reduce_66,
 3, 129, :_reduce_67,
 5, 100, :_reduce_68,
 6, 92, :_reduce_69,
 4, 93, :_reduce_70,
 6, 133, :_reduce_71,
 0, 131, :_reduce_72,
 2, 131, :_reduce_73,
 0, 132, :_reduce_74,
 1, 132, :_reduce_75,
 3, 132, :_reduce_76,
 1, 135, :_reduce_77,
 3, 135, :_reduce_78,
 3, 135, :_reduce_79,
 0, 134, :_reduce_none,
 3, 134, :_reduce_none,
 3, 134, :_reduce_82,
 2, 136, :_reduce_none,
 2, 136, :_reduce_none,
 4, 136, :_reduce_85,
 0, 139, :_reduce_86,
 3, 139, :_reduce_87,
 2, 103, :_reduce_88,
 1, 137, :_reduce_none,
 3, 137, :_reduce_none,
 1, 140, :_reduce_91,
 1, 138, :_reduce_none,
 3, 138, :_reduce_none,
 1, 141, :_reduce_94,
 1, 91, :_reduce_none,
 3, 91, :_reduce_none,
 1, 142, :_reduce_none,
 3, 142, :_reduce_98,
 4, 142, :_reduce_99,
 1, 143, :_reduce_100,
 4, 110, :_reduce_101,
 2, 144, :_reduce_102,
 1, 144, :_reduce_103,
 5, 111, :_reduce_104,
 10, 112, :_reduce_105,
 0, 146, :_reduce_106,
 2, 146, :_reduce_107,
 1, 147, :_reduce_108,
 2, 147, :_reduce_109,
 7, 113, :_reduce_110,
 6, 109, :_reduce_111,
 0, 148, :_reduce_112,
 3, 148, :_reduce_113,
 5, 148, :_reduce_114,
 5, 114, :_reduce_115,
 0, 149, :_reduce_116,
 5, 149, :_reduce_117,
 4, 149, :_reduce_118,
 2, 115, :_reduce_119,
 2, 116, :_reduce_120,
 3, 106, :_reduce_121,
 3, 107, :_reduce_122,
 3, 108, :_reduce_123,
 1, 150, :_reduce_none,
 4, 150, :_reduce_125,
 3, 150, :_reduce_126,
 5, 150, :_reduce_127,
 6, 150, :_reduce_128,
 1, 105, :_reduce_129,
 2, 105, :_reduce_130,
 1, 128, :_reduce_none,
 2, 128, :_reduce_132,
 1, 151, :_reduce_133,
 2, 151, :_reduce_134,
 3, 151, :_reduce_135,
 4, 104, :_reduce_136,
 4, 152, :_reduce_137,
 0, 130, :_reduce_138,
 1, 130, :_reduce_139,
 3, 130, :_reduce_140,
 1, 153, :_reduce_none,
 1, 153, :_reduce_none,
 1, 153, :_reduce_143,
 1, 153, :_reduce_none,
 2, 153, :_reduce_145,
 4, 153, :_reduce_146,
 3, 153, :_reduce_147,
 6, 153, :_reduce_148,
 1, 153, :_reduce_none,
 4, 153, :_reduce_150,
 6, 153, :_reduce_151,
 3, 153, :_reduce_152,
 1, 154, :_reduce_none,
 3, 154, :_reduce_154,
 3, 154, :_reduce_155,
 1, 155, :_reduce_none,
 3, 155, :_reduce_157,
 3, 155, :_reduce_158,
 1, 156, :_reduce_none,
 2, 156, :_reduce_160,
 3, 156, :_reduce_161,
 3, 156, :_reduce_162,
 1, 117, :_reduce_none,
 3, 117, :_reduce_164,
 3, 117, :_reduce_165,
 3, 157, :_reduce_166,
 3, 157, :_reduce_167,
 3, 157, :_reduce_168,
 3, 157, :_reduce_169,
 3, 157, :_reduce_170,
 3, 157, :_reduce_171,
 1, 157, :_reduce_none,
 1, 158, :_reduce_none,
 2, 158, :_reduce_174,
 1, 159, :_reduce_none,
 3, 159, :_reduce_176,
 1, 160, :_reduce_none,
 3, 160, :_reduce_178,
 1, 145, :_reduce_none,
 3, 145, :_reduce_180,
 3, 145, :_reduce_181,
 1, 121, :_reduce_182,
 1, 123, :_reduce_183,
 1, 87, :_reduce_none,
 1, 87, :_reduce_none,
 2, 87, :_reduce_none ]

racc_reduce_n = 187

racc_shift_n = 337

racc_action_table = [
    78,    80,    81,    84,   110,   146,   144,  -176,    78,    80,
    81,    84,   265,   143,     2,   111,    78,    80,    81,    84,
   231,   264,    47,   270,   184,   250,   185,     2,    57,     2,
   144,    78,    80,    81,    84,   255,    57,   143,   144,   187,
    78,    80,    81,    84,    57,   143,     2,   183,    78,    80,
    81,    84,   151,   152,   263,    77,    79,     2,     2,    57,
   106,     2,    87,    77,    79,     2,    76,    28,    57,    82,
    87,    77,    79,   149,    76,    28,    57,    82,    87,     1,
   151,   152,    76,    28,    90,    82,    77,    79,    78,    80,
    81,    84,     1,    87,     1,    77,    79,    76,    28,    57,
    82,    90,    87,    77,    79,     2,    76,    28,    70,    82,
    87,     1,   151,   152,    76,    28,    57,    82,    78,    80,
    81,    84,     1,     1,   319,    28,     1,   266,   267,   268,
     1,     2,     2,    78,    80,    81,    84,   304,    28,   106,
   106,    70,   310,    77,    79,  -136,    57,   106,     2,   106,
    87,   272,   151,   152,    76,    28,   106,    82,   106,   188,
   106,    57,    78,    80,    81,    84,   231,     2,   106,   234,
     1,   230,   235,    77,    79,   252,     2,   106,     2,   305,
    87,   179,   306,   106,    76,    28,    90,    82,    77,    79,
    57,    78,    80,    81,    84,    87,     1,     1,   231,    76,
    28,   176,    82,   276,    28,    28,    78,    80,    81,    84,
  -136,   -24,    28,     1,    28,  -177,  -175,    77,    79,    57,
     2,    28,     2,    28,    87,    28,   151,   152,    76,    28,
     2,    82,     1,    28,    57,    78,    80,    81,    84,   251,
   106,     1,    28,     1,    90,   173,    77,    79,    28,     2,
     2,   106,   106,    87,   127,   274,   106,    76,    28,     2,
    82,    77,    79,    57,    78,    80,    81,    84,    87,    47,
   127,   249,    76,    28,   101,    82,   -24,    57,    57,    78,
    80,    81,    84,   304,     2,     1,   106,     1,   303,   248,
    77,    79,    57,     2,     2,     1,   154,    87,   151,   152,
   277,    76,    28,    70,    82,    28,    70,    57,    78,    80,
    81,    84,    57,   154,     1,     1,    28,    28,   110,    77,
    79,    28,   166,   112,     1,   109,    87,   151,   152,   111,
    76,    28,   247,    82,    77,    79,    57,    78,    80,    81,
    84,    87,   169,   101,   189,    76,    28,   288,    82,     1,
   158,    28,    78,    80,    81,    84,   117,    70,     1,     1,
    70,   120,   290,    77,    79,    57,   291,   118,   119,   292,
    87,   151,   152,   157,    76,    28,    70,    82,   139,   140,
    57,    78,    80,    81,    84,    78,    80,    81,    84,   110,
   110,    70,    77,    79,   148,   202,   139,   140,   154,    87,
   111,   111,   241,    76,    28,   240,    82,    77,    79,    57,
   239,   312,   299,    57,    87,   151,   152,    70,    76,    28,
    70,    82,   192,    78,    80,    81,    84,    78,    80,    81,
    84,    78,    80,    81,    84,    70,    77,    79,   141,   142,
    77,    79,   147,    87,   141,   142,  -178,    87,    28,   309,
    82,    57,    28,   301,    82,    57,    70,   151,   152,    57,
    78,    80,    81,    84,   151,   152,   151,   152,    70,    78,
    80,    81,    84,   151,   152,   151,   152,   311,    77,    79,
   141,   142,    77,    79,   199,    87,    77,    79,    57,    87,
    28,   255,    82,    87,    28,   200,    82,    57,    28,   315,
    82,   164,    78,    80,    81,    84,    70,   151,   152,   151,
   152,    78,    80,    81,    84,    77,    79,   159,   160,   161,
   162,   163,    87,    70,    77,    79,    70,    28,   206,    82,
    57,    87,   141,   142,    70,    76,    28,   223,    82,    57,
   139,   140,    78,    80,    81,    84,   151,   152,   151,   152,
    70,    78,    80,    81,    84,    90,   131,    77,    79,    78,
    80,    81,    84,   131,    87,   324,    77,    79,    76,    28,
    57,    82,    70,    87,   151,   152,   122,    76,    28,    57,
    82,    70,    78,    80,    81,    84,    70,    57,   151,   152,
   116,    78,    80,    81,    84,   151,   152,    77,    79,    78,
    80,    81,    84,   114,    87,   330,    77,    79,    76,    28,
    57,    82,   205,    87,    77,    79,    70,    76,    28,    57,
    82,    87,   151,   152,   106,    76,    28,    57,    82,    70,
    71,    78,    80,    81,    84,    90,    70,    77,    79,    78,
    80,    81,    84,     6,    87,   nil,    77,    79,    76,    28,
   nil,    82,   nil,    87,    77,    79,   nil,    76,    28,    57,
    82,    87,   nil,   nil,   nil,    76,    28,    57,    82,   nil,
   nil,    78,    80,    81,    84,   nil,   nil,   nil,   nil,    78,
    80,    81,    84,   nil,   nil,   nil,    77,    79,    78,    80,
    81,    84,   nil,    87,    77,    79,   nil,    76,    28,    57,
    82,    87,   nil,   nil,   nil,    76,    28,    57,    82,   nil,
   nil,    78,    80,    81,    84,   nil,    57,   nil,   nil,    78,
    80,    81,    84,   nil,   nil,   nil,    77,    79,    78,    80,
    81,    84,   nil,    87,    77,    79,   nil,    76,    28,    57,
    82,    87,   nil,    77,    79,    76,    28,    57,    82,   nil,
    87,   nil,   nil,   nil,    76,    28,    57,    82,   nil,    78,
    80,    81,    84,   nil,   nil,   nil,    77,    79,    78,    80,
    81,    84,    90,    87,    77,    79,   nil,   nil,    28,   nil,
    82,    87,   nil,    77,    79,    76,    28,    57,    82,   nil,
    87,   nil,   nil,   nil,    76,    28,    57,    82,   nil,    78,
    80,    81,    84,   nil,   nil,   nil,   nil,   nil,    78,    80,
    81,    84,   nil,   nil,    77,    79,    78,    80,    81,    84,
   nil,    87,   nil,    77,    79,    76,    28,    57,    82,   nil,
    87,   nil,   nil,   nil,    76,    28,    57,    82,   nil,    78,
    80,    81,    84,   nil,    57,   nil,   nil,   nil,    78,    80,
    81,    84,   nil,   nil,    77,    79,    78,    80,    81,    84,
   nil,    87,   nil,    77,    79,    76,    28,    57,    82,    90,
    87,    77,    79,   nil,    76,    28,    57,    82,    87,   nil,
   nil,   nil,    76,    28,    57,    82,   nil,   nil,   nil,   nil,
   nil,   nil,   nil,   nil,    77,    79,   nil,   nil,   nil,   nil,
   nil,    87,   nil,    77,    79,    76,    28,   nil,    82,    90,
    87,    77,    79,   nil,    76,    28,   nil,    82,    87,   nil,
   nil,   nil,    76,    28,   nil,    82,    34,    41,    48,    53,
    60,    67,     7,    13,    19,   nil,   nil,    36,   nil,    47,
   nil,   nil,   nil,   nil,    11,   nil,   nil,   nil,    37,   nil,
   nil,   213,    57,    64,   nil,   nil,   nil,    25,    30,    35,
   nil,   nil,   nil,    58,    65,   243,   244,    18,   nil,    29,
   nil,   nil,   nil,    52,    61,    34,    41,    48,    53,    60,
    67,     7,    13,    19,   nil,   nil,    36,   nil,    47,   nil,
   nil,    28,   nil,    11,   nil,   nil,   nil,    37,   nil,   nil,
   213,    57,    64,   282,   283,   nil,    25,    30,    35,   nil,
   nil,   nil,    58,    65,   nil,   nil,    18,   nil,    29,   nil,
   nil,   nil,    52,    61,    34,    41,    48,    53,    60,    67,
     7,    13,    19,   nil,   nil,    36,   nil,    47,   nil,   nil,
    28,   nil,    11,   nil,   nil,   nil,    37,   nil,   nil,   213,
    57,    64,   nil,   nil,   nil,    25,    30,    35,   nil,   nil,
   321,    58,    65,   nil,   nil,    18,   nil,    29,   nil,   nil,
   nil,    52,    61,    34,    41,    48,    53,    60,    67,     7,
    13,    19,   nil,   nil,    36,   nil,    47,   nil,   nil,    28,
   nil,    11,   nil,   nil,   nil,    37,   nil,   nil,   213,    57,
    64,   nil,   nil,   nil,    25,    30,    35,   nil,   nil,   nil,
    58,    65,   nil,   nil,    18,   262,    29,   nil,   nil,   nil,
    52,    61,    34,    41,    48,    53,    60,    67,     7,    13,
    19,   nil,   nil,    36,   nil,    47,   nil,   nil,    28,   nil,
    11,   nil,   nil,   nil,    37,   nil,   nil,   213,    57,    64,
   nil,   nil,   nil,    25,    30,    35,   nil,   nil,   nil,    58,
    65,   nil,   nil,    18,   nil,    29,   nil,   nil,   nil,    52,
    61,    34,    41,    48,    53,    60,    67,     7,    13,    19,
   nil,   nil,    36,   nil,    47,   nil,   nil,    28,   nil,    11,
   nil,   nil,   nil,    37,   nil,   nil,   213,    57,    64,   nil,
   nil,   nil,    25,    30,    35,   nil,   nil,   nil,    58,    65,
   nil,   nil,    18,   nil,    29,   nil,   nil,   nil,    52,    61,
    34,    41,    48,    53,    60,    67,     7,    13,    19,   nil,
   nil,    36,   nil,    47,   nil,   nil,    28,   nil,    11,   nil,
   nil,   nil,    37,   nil,   nil,   213,    57,    64,   nil,   nil,
   nil,    25,    30,    35,   nil,   nil,   nil,    58,    65,   nil,
   nil,    18,   nil,    29,   nil,   nil,   nil,    52,    61,    34,
    41,    48,    53,    60,    67,     7,    13,    19,   nil,   nil,
    36,   nil,    47,   212,   nil,    28,   207,    11,   nil,   nil,
   nil,    37,   210,   211,   213,    57,    64,   nil,   nil,   nil,
    25,    30,    35,   nil,   nil,   nil,    58,    65,   nil,   nil,
    18,   nil,    29,   nil,   nil,   nil,    52,    61,    34,    41,
    48,    53,    60,    67,     7,    13,    19,   nil,   nil,    36,
   nil,    47,   nil,   nil,    28,   nil,    11,   nil,   nil,   nil,
    37,   nil,   nil,   213,    57,    64,   282,   283,   nil,    25,
    30,    35,   nil,   nil,   nil,    58,    65,   nil,   nil,    18,
   nil,    29,   nil,   nil,   nil,    52,    61,    34,    41,    48,
    53,    60,    67,     7,    13,    19,   nil,   nil,    36,   nil,
    47,   nil,   nil,    28,   nil,    11,   nil,   nil,   nil,    37,
   nil,   nil,   213,    57,    64,   nil,   nil,   nil,    25,    30,
    35,   nil,   nil,   335,    58,    65,   nil,   nil,    18,   nil,
    29,   nil,   nil,   nil,    52,    61,   nil,   nil,    34,    41,
    48,    53,    60,    67,     7,    13,    19,    24,   nil,    36,
   nil,    47,    28,    59,    66,   nil,    11,    23,   nil,   nil,
    37,   nil,   nil,    56,    57,    64,   nil,   nil,   nil,    25,
    30,    35,   nil,   nil,   nil,    58,    65,   nil,   nil,    18,
   nil,    29,   nil,   nil,   nil,    52,    61,   nil,   nil,   nil,
   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
   nil,   nil,   nil,    28 ]

racc_action_check = [
   161,   161,   161,   161,   106,    77,   203,   214,   160,   160,
   160,   160,   228,   203,   108,   106,   159,   159,   159,   159,
   201,   228,   213,   232,   123,   201,   125,   246,   161,   100,
   204,   158,   158,   158,   158,   210,   160,   204,    75,   130,
   163,   163,   163,   163,   159,    75,   295,   121,   157,   157,
   157,   157,   232,   232,   225,   161,   161,   265,   102,   158,
   241,   240,   161,   160,   160,   267,   161,   161,   163,   161,
   160,   159,   159,    82,   160,   160,   157,   160,   159,   108,
   108,   108,   159,   159,   158,   159,   158,   158,    11,    11,
    11,    11,   246,   158,   100,   163,   163,   158,   158,    82,
   158,   157,   163,   157,   157,   271,   163,   163,   226,   163,
   157,   295,   295,   295,   157,   157,    11,   157,   164,   164,
   164,   164,   265,   102,   297,   241,   240,   229,   229,   229,
   267,   282,   114,    13,    13,    13,    13,   287,    82,   233,
   291,   227,   287,    11,    11,   230,   164,   304,    65,   212,
    11,   233,   297,   297,    11,    11,   211,    11,   127,   131,
    58,    13,    14,    14,    14,    14,   175,   208,   247,   179,
   271,   175,   179,   164,   164,   206,   135,    57,   308,   281,
   164,   117,   281,    47,   164,   164,    13,   164,    13,    13,
    14,    18,    18,    18,    18,    13,   282,   114,   236,    13,
    13,   113,    13,   236,   233,   291,   152,   152,   152,   152,
   230,    43,   304,    65,   212,    94,    94,    14,    14,    18,
   318,   211,   170,   127,    14,    58,   269,   269,    14,    14,
   169,    14,   208,   247,   152,   151,   151,   151,   151,   202,
   185,   135,    57,   308,    18,   110,    18,    18,    47,    24,
    23,    37,    35,    18,   185,   234,    56,    18,    18,    12,
    18,   152,   152,   151,   167,   167,   167,   167,   152,    56,
    56,   200,   152,   152,    23,   152,    43,    37,    35,    29,
    29,    29,    29,   279,    10,   318,   335,   170,   279,   199,
   151,   151,   167,     0,   209,   169,   194,   151,    85,    85,
   239,   151,   151,   105,   151,   185,   104,    29,   148,   148,
   148,   148,   335,   193,    24,    23,    37,    35,    34,   167,
   167,    56,   101,    34,    12,    34,   167,    99,    99,    34,
   167,   167,   192,   167,    29,    29,   148,   176,   176,   176,
   176,    29,   103,   103,   132,    29,    29,   249,    29,    10,
    96,   335,   319,   319,   319,   319,    46,   253,     0,   209,
   254,    46,   256,   148,   148,   176,   258,    46,    46,   261,
   148,   237,   237,    95,   148,   148,   190,   148,   195,   195,
   319,   144,   144,   144,   144,   143,   143,   143,   143,    81,
   149,    89,   176,   176,    81,   149,   196,   196,    88,   176,
    81,   149,   189,   176,   176,   187,   176,   319,   319,   144,
   186,   289,   273,   143,   319,   289,   289,   136,   319,   319,
   278,   319,   137,   142,   142,   142,   142,   141,   141,   141,
   141,   140,   140,   140,   140,   177,   144,   144,   197,   197,
   143,   143,    79,   144,   198,   198,   215,   143,   144,   284,
   144,   142,   143,   275,   143,   141,   286,   275,   275,   140,
   139,   139,   139,   139,   134,   134,   182,   182,   172,   183,
   183,   183,   183,   181,   181,   180,   180,   288,   142,   142,
   145,   145,   141,   141,   146,   142,   140,   140,   139,   141,
   142,   290,   142,   140,   141,   147,   141,   183,   140,   292,
   140,    97,   243,   243,   243,   243,   294,    97,    97,   174,
   174,   162,   162,   162,   162,   139,   139,    97,    97,    97,
    97,    97,   139,   168,   183,   183,   296,   139,   154,   139,
   243,   183,    74,    74,   298,   183,   183,   166,   183,   162,
    73,    73,   305,   305,   305,   305,   221,   221,   220,   220,
    72,    60,    60,    60,    60,   243,    66,   243,   243,    61,
    61,    61,    61,    59,   243,   306,   162,   162,   243,   243,
   305,   243,   307,   162,   219,   219,    52,   162,   162,    60,
   162,   316,    64,    64,    64,    64,   165,    61,   218,   218,
    41,   120,   120,   120,   120,   217,   217,   305,   305,   119,
   119,   119,   119,    36,   305,   320,    60,    60,   305,   305,
    64,   305,   153,    60,    61,    61,   326,    60,    60,   120,
    60,    61,   216,   216,    28,    61,    61,   119,    61,   328,
     6,    67,    67,    67,    67,    64,     5,    64,    64,   118,
   118,   118,   118,     3,    64,   nil,   120,   120,    64,    64,
   nil,    64,   nil,   120,   119,   119,   nil,   120,   120,    67,
   120,   119,   nil,   nil,   nil,   119,   119,   118,   119,   nil,
   nil,   299,   299,   299,   299,   nil,   nil,   nil,   nil,   252,
   252,   252,   252,   nil,   nil,   nil,    67,    67,   116,   116,
   116,   116,   nil,    67,   118,   118,   nil,    67,    67,   299,
    67,   118,   nil,   nil,   nil,   118,   118,   252,   118,   nil,
   nil,    76,    76,    76,    76,   nil,   116,   nil,   nil,   283,
   283,   283,   283,   nil,   nil,   nil,   299,   299,   231,   231,
   231,   231,   nil,   299,   252,   252,   nil,   299,   299,    76,
   299,   252,   nil,   116,   116,   252,   252,   283,   252,   nil,
   116,   nil,   nil,   nil,   116,   116,   231,   116,   nil,   112,
   112,   112,   112,   nil,   nil,   nil,    76,    76,   263,   263,
   263,   263,   283,    76,   283,   283,   nil,   nil,    76,   nil,
    76,   283,   nil,   231,   231,   283,   283,   112,   283,   nil,
   231,   nil,   nil,   nil,   231,   231,   263,   231,   nil,   270,
   270,   270,   270,   nil,   nil,   nil,   nil,   nil,   235,   235,
   235,   235,   nil,   nil,   112,   112,    87,    87,    87,    87,
   nil,   112,   nil,   263,   263,   112,   112,   270,   112,   nil,
   263,   nil,   nil,   nil,   263,   263,   235,   263,   nil,   266,
   266,   266,   266,   nil,    87,   nil,   nil,   nil,   184,   184,
   184,   184,   nil,   nil,   270,   270,    90,    90,    90,    90,
   nil,   270,   nil,   235,   235,   270,   270,   266,   270,    87,
   235,    87,    87,   nil,   235,   235,   184,   235,    87,   nil,
   nil,   nil,    87,    87,    90,    87,   nil,   nil,   nil,   nil,
   nil,   nil,   nil,   nil,   266,   266,   nil,   nil,   nil,   nil,
   nil,   266,   nil,   184,   184,   266,   266,   nil,   266,    90,
   184,    90,    90,   nil,   184,   184,   nil,   184,    90,   nil,
   nil,   nil,    90,    90,   nil,    90,   191,   191,   191,   191,
   191,   191,   191,   191,   191,   nil,   nil,   191,   nil,   191,
   nil,   nil,   nil,   nil,   191,   nil,   nil,   nil,   191,   nil,
   nil,   191,   191,   191,   nil,   nil,   nil,   191,   191,   191,
   nil,   nil,   nil,   191,   191,   191,   191,   191,   nil,   191,
   nil,   nil,   nil,   191,   191,   242,   242,   242,   242,   242,
   242,   242,   242,   242,   nil,   nil,   242,   nil,   242,   nil,
   nil,   191,   nil,   242,   nil,   nil,   nil,   242,   nil,   nil,
   242,   242,   242,   242,   242,   nil,   242,   242,   242,   nil,
   nil,   nil,   242,   242,   nil,   nil,   242,   nil,   242,   nil,
   nil,   nil,   242,   242,   302,   302,   302,   302,   302,   302,
   302,   302,   302,   nil,   nil,   302,   nil,   302,   nil,   nil,
   242,   nil,   302,   nil,   nil,   nil,   302,   nil,   nil,   302,
   302,   302,   nil,   nil,   nil,   302,   302,   302,   nil,   nil,
   302,   302,   302,   nil,   nil,   302,   nil,   302,   nil,   nil,
   nil,   302,   302,   222,   222,   222,   222,   222,   222,   222,
   222,   222,   nil,   nil,   222,   nil,   222,   nil,   nil,   302,
   nil,   222,   nil,   nil,   nil,   222,   nil,   nil,   222,   222,
   222,   nil,   nil,   nil,   222,   222,   222,   nil,   nil,   nil,
   222,   222,   nil,   nil,   222,   222,   222,   nil,   nil,   nil,
   222,   222,   317,   317,   317,   317,   317,   317,   317,   317,
   317,   nil,   nil,   317,   nil,   317,   nil,   nil,   222,   nil,
   317,   nil,   nil,   nil,   317,   nil,   nil,   317,   317,   317,
   nil,   nil,   nil,   317,   317,   317,   nil,   nil,   nil,   317,
   317,   nil,   nil,   317,   nil,   317,   nil,   nil,   nil,   317,
   317,   325,   325,   325,   325,   325,   325,   325,   325,   325,
   nil,   nil,   325,   nil,   325,   nil,   nil,   317,   nil,   325,
   nil,   nil,   nil,   325,   nil,   nil,   325,   325,   325,   nil,
   nil,   nil,   325,   325,   325,   nil,   nil,   nil,   325,   325,
   nil,   nil,   325,   nil,   325,   nil,   nil,   nil,   325,   325,
   327,   327,   327,   327,   327,   327,   327,   327,   327,   nil,
   nil,   327,   nil,   327,   nil,   nil,   325,   nil,   327,   nil,
   nil,   nil,   327,   nil,   nil,   327,   327,   327,   nil,   nil,
   nil,   327,   327,   327,   nil,   nil,   nil,   327,   327,   nil,
   nil,   327,   nil,   327,   nil,   nil,   nil,   327,   327,   155,
   155,   155,   155,   155,   155,   155,   155,   155,   nil,   nil,
   155,   nil,   155,   155,   nil,   327,   155,   155,   nil,   nil,
   nil,   155,   155,   155,   155,   155,   155,   nil,   nil,   nil,
   155,   155,   155,   nil,   nil,   nil,   155,   155,   nil,   nil,
   155,   nil,   155,   nil,   nil,   nil,   155,   155,   331,   331,
   331,   331,   331,   331,   331,   331,   331,   nil,   nil,   331,
   nil,   331,   nil,   nil,   155,   nil,   331,   nil,   nil,   nil,
   331,   nil,   nil,   331,   331,   331,   331,   331,   nil,   331,
   331,   331,   nil,   nil,   nil,   331,   331,   nil,   nil,   331,
   nil,   331,   nil,   nil,   nil,   331,   331,   332,   332,   332,
   332,   332,   332,   332,   332,   332,   nil,   nil,   332,   nil,
   332,   nil,   nil,   331,   nil,   332,   nil,   nil,   nil,   332,
   nil,   nil,   332,   332,   332,   nil,   nil,   nil,   332,   332,
   332,   nil,   nil,   332,   332,   332,   nil,   nil,   332,   nil,
   332,   nil,   nil,   nil,   332,   332,   nil,   nil,     4,     4,
     4,     4,     4,     4,     4,     4,     4,     4,   nil,     4,
   nil,     4,   332,     4,     4,   nil,     4,     4,   nil,   nil,
     4,   nil,   nil,     4,     4,     4,   nil,   nil,   nil,     4,
     4,     4,   nil,   nil,   nil,     4,     4,   nil,   nil,     4,
   nil,     4,   nil,   nil,   nil,     4,     4,   nil,   nil,   nil,
   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
   nil,   nil,   nil,     4 ]

racc_action_pointer = [
   291,   nil,   nil,   643,  1413,   634,   630,   nil,   nil,   nil,
   282,    85,   257,   130,   159,   nil,   nil,   nil,   188,   nil,
   nil,   nil,   nil,   248,   247,   nil,   nil,   nil,   619,   276,
   nil,   nil,   nil,   nil,   258,   247,   598,   246,   nil,   nil,
   nil,   528,   nil,   209,   nil,   nil,   299,   178,   nil,   nil,
   nil,   nil,   571,   nil,   nil,   nil,   251,   172,   155,   503,
   548,   556,   nil,   nil,   579,   146,   496,   628,   nil,   nil,
   nil,   nil,   548,   467,   457,   -32,   708,   -60,   nil,   377,
   nil,   329,    68,   nil,   nil,   230,   nil,   813,   341,   389,
   853,   nil,   nil,   nil,   161,   318,   296,   439,   nil,   259,
    27,   262,    56,   317,   304,   301,   -56,   nil,    12,   nil,
   240,   nil,   756,   139,   130,   nil,   685,   176,   636,   596,
   588,   -18,   nil,   -38,   nil,   -35,   nil,   153,   nil,   nil,
   -26,   154,   339,   nil,   396,   174,   415,   417,   nil,   457,
   428,   424,   420,   382,   378,   405,   479,   490,   305,   330,
   nil,   232,   203,   546,   523,  1264,   nil,    45,    28,    13,
     5,    -3,   508,    37,   115,   584,   532,   261,   521,   228,
   220,   nil,   466,   nil,   441,   105,   334,   433,   nil,   109,
   407,   405,   398,   466,   845,   235,   345,   339,   nil,   337,
   374,   921,   267,   256,   239,   305,   323,   363,   369,   223,
   214,   -41,   173,   -64,   -40,   nil,   112,   nil,   165,   292,
    30,   151,   144,     4,   -48,   392,   554,   527,   520,   506,
   480,   478,  1068,   nil,   nil,    -7,   106,   139,     6,    78,
   143,   725,   -16,   134,   250,   805,   137,   303,   nil,   234,
    59,    55,   970,   499,   nil,   nil,    25,   163,   nil,   342,
   nil,   nil,   676,   355,   358,   nil,   301,   nil,   305,   nil,
   nil,   304,   nil,   765,   nil,    55,   836,    63,   nil,   158,
   796,   103,   nil,   349,   nil,   389,   nil,   nil,   418,   222,
   nil,   117,   129,   716,   414,   nil,   454,    76,   411,   347,
   486,   135,   433,   nil,   504,    44,   524,    84,   532,   668,
   nil,   nil,  1019,   nil,   142,   539,   499,   570,   176,   nil,
   nil,   nil,   nil,   nil,   nil,   nil,   579,  1117,   218,   349,
   541,   nil,   nil,   nil,   nil,  1166,   614,  1215,   627,   nil,
   nil,  1313,  1362,   nil,   nil,   281,   nil ]

racc_action_default = [
    -3,  -185,  -184,  -187,    -1,    -4,  -187,   -54,   -29,   -17,
  -187,  -187,  -187,  -187,  -187,   -30,   -18,    -7,  -187,   -56,
   -31,   -20,    -8,  -187,  -187,   -37,   -32,   -21,  -187,  -187,
   -38,   -33,   -22,   -10,  -133,  -187,  -187,  -187,   -34,   -23,
   -11,  -187,   -35,  -124,   -12,  -129,  -187,  -187,   -50,   -25,
   -13,  -131,  -187,   -51,   -26,   -14,  -187,  -187,  -187,   -72,
  -187,   -39,   -27,   -15,  -187,  -187,   -72,  -187,   -28,   -16,
  -186,   337,    -5,  -156,  -159,  -163,  -187,  -187,  -142,  -187,
  -141,  -133,  -187,  -144,  -143,   -88,  -149,  -187,  -153,   -80,
  -187,  -183,   -55,  -173,  -179,  -187,  -187,  -172,   -49,  -182,
  -187,   -45,  -187,    -2,   -41,   -58,  -133,  -132,  -187,  -120,
  -187,  -134,  -138,  -187,  -187,   -36,  -187,  -187,  -187,  -187,
  -187,  -187,  -119,   -97,   -19,    -9,  -100,  -187,   -95,  -130,
  -187,  -187,  -187,   -52,   -40,  -187,   -86,  -187,   -53,  -187,
  -187,  -187,  -187,  -187,  -187,  -160,  -187,  -187,  -138,  -133,
  -145,  -187,  -187,  -187,  -187,  -187,  -174,  -187,  -187,  -187,
  -187,  -187,  -187,  -187,  -187,   -86,  -187,  -187,   -42,  -187,
  -187,   -60,  -116,  -135,  -139,  -187,  -187,   -63,   -57,  -126,
  -122,  -123,  -121,  -138,  -187,  -187,  -187,  -187,   -73,  -187,
   -86,  -187,  -187,  -154,  -155,  -157,  -158,  -162,  -161,  -187,
  -187,  -187,  -187,  -164,  -165,  -152,  -147,   -70,  -187,  -187,
  -187,  -187,  -187,  -187,  -181,  -180,  -167,  -168,  -169,  -170,
  -171,  -166,  -187,   -46,   -47,   -44,    -6,   -43,  -187,  -187,
  -125,  -187,  -187,  -187,  -187,  -187,  -187,   -98,   -96,  -187,
  -187,   -74,  -112,  -187,  -103,  -101,  -187,   -74,  -150,  -187,
  -137,  -146,  -187,   -82,   -81,   -91,   -83,   -89,   -84,   -94,
   -92,  -187,  -104,  -187,   -59,  -187,  -187,  -187,  -115,  -140,
  -187,  -187,   -62,   -66,  -127,  -187,   -68,   -99,   -86,  -187,
   -75,   -77,  -187,  -187,  -187,  -102,   -87,  -187,  -187,  -187,
  -187,  -187,  -187,   -48,   -61,  -187,   -86,  -106,   -64,  -187,
   -65,  -128,  -187,   -69,  -187,  -187,  -187,   -86,  -187,  -111,
   -71,  -151,  -148,   -90,   -93,   -85,   -86,  -118,  -187,  -187,
  -187,  -110,   -76,   -78,   -79,  -113,   -86,  -117,   -86,  -107,
   -67,  -112,  -187,  -114,  -105,  -108,  -109 ]

racc_goto_table = [
    43,     5,    98,    91,   128,    17,   284,   260,   100,   124,
   102,    72,    85,    89,   257,    99,   145,   175,   156,   132,
    40,   279,   203,   204,   104,   105,   137,   287,   193,   194,
   108,   113,   300,   115,   121,   195,   196,   167,    92,   271,
    12,   155,   322,   126,   129,   130,   209,   256,   133,   258,
   225,    33,   125,   201,   135,   138,    22,   245,    10,   318,
   334,    99,   134,   103,   191,   229,   136,   107,    99,   233,
   171,     4,   228,     3,   nil,   nil,   nil,   153,   150,   nil,
   nil,   nil,   nil,   197,   198,   214,   215,   314,   236,   nil,
   170,   nil,   nil,   222,   313,   333,   nil,   nil,   nil,   nil,
   nil,   165,   nil,   168,   178,   nil,   nil,   nil,   nil,   172,
   nil,   nil,   nil,   174,   186,   177,   nil,    99,   242,   180,
   181,   182,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
   nil,   nil,   nil,   238,   nil,   nil,   190,   nil,   nil,   nil,
   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   174,
   nil,    43,   nil,   nil,   nil,   224,   208,   nil,   nil,   nil,
   216,   217,   218,   219,   220,   221,   124,   nil,    99,   nil,
   226,   227,   126,   nil,   nil,   nil,   nil,   232,   nil,   nil,
   nil,   nil,   nil,   nil,   174,   237,   nil,    43,   nil,   nil,
   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   259,   261,
   nil,   nil,   nil,   nil,   nil,   nil,   302,   nil,   nil,   253,
   254,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    43,   nil,
   273,   nil,   nil,   nil,   317,   nil,   nil,   nil,   281,   nil,
   nil,   nil,   269,   285,   281,   325,   275,   nil,    43,   nil,
   nil,   278,   nil,   nil,   327,   nil,   nil,   286,   nil,   nil,
   nil,   293,   nil,   289,   331,   nil,   332,   nil,   nil,   nil,
   nil,   nil,   nil,   nil,    99,   nil,   294,   295,   296,   nil,
   nil,   297,   298,   308,   nil,   nil,   nil,   nil,   259,   nil,
   nil,   nil,   nil,   307,   nil,   nil,   nil,   320,   nil,   nil,
   nil,   281,   nil,   323,   nil,   nil,   316,   nil,    43,   nil,
    99,   nil,   nil,   nil,   nil,   nil,    99,   329,   nil,   326,
   nil,   nil,   nil,    43,   nil,   nil,   nil,   nil,   nil,   328,
    99,    43,   nil,    43,   nil,   nil,   nil,    43,    43,   nil,
   nil,   336 ]

racc_goto_check = [
    22,     4,    38,    62,    59,     6,    65,    58,    62,    17,
    35,     4,    34,     4,    57,    34,    72,    47,    75,    48,
    10,    49,    73,    73,     4,     4,    48,    49,    70,    70,
    34,    22,    46,    22,    45,    71,    71,    36,    40,    44,
    50,    51,    52,    45,    45,    45,    53,    54,    38,    55,
    37,     9,     8,    47,    62,    38,     7,    61,     5,    63,
    64,    34,    34,     3,    56,    66,     4,    68,    34,    43,
    42,     2,    41,     1,   nil,   nil,   nil,    62,    22,   nil,
   nil,   nil,   nil,    72,    72,    75,    75,    58,    47,   nil,
    35,   nil,   nil,    56,    57,    65,   nil,   nil,   nil,   nil,
   nil,     4,   nil,     4,    38,   nil,   nil,   nil,   nil,     4,
   nil,   nil,   nil,    34,    45,     4,   nil,    34,    56,    34,
    34,    34,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
   nil,   nil,   nil,    59,   nil,   nil,     4,   nil,   nil,   nil,
   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    34,
   nil,    22,   nil,   nil,   nil,    38,     6,   nil,   nil,   nil,
    34,    34,    34,    34,    34,    34,    17,   nil,    34,   nil,
     4,     4,    45,   nil,   nil,   nil,   nil,    34,   nil,   nil,
   nil,   nil,   nil,   nil,    34,    34,   nil,    22,   nil,   nil,
   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    45,    45,
   nil,   nil,   nil,   nil,   nil,   nil,    56,   nil,   nil,     4,
     4,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    22,   nil,
    45,   nil,   nil,   nil,    56,   nil,   nil,   nil,    45,   nil,
   nil,   nil,    34,    62,    45,    56,    34,   nil,    22,   nil,
   nil,     4,   nil,   nil,    56,   nil,   nil,     4,   nil,   nil,
   nil,    38,   nil,    34,    56,   nil,    56,   nil,   nil,   nil,
   nil,   nil,   nil,   nil,    34,   nil,     4,    34,     4,   nil,
   nil,    34,     4,    62,   nil,   nil,   nil,   nil,    45,   nil,
   nil,   nil,   nil,     4,   nil,   nil,   nil,    38,   nil,   nil,
   nil,    45,   nil,    38,   nil,   nil,     4,   nil,    22,   nil,
    34,   nil,   nil,   nil,   nil,   nil,    34,    38,   nil,     4,
   nil,   nil,   nil,    22,   nil,   nil,   nil,   nil,   nil,     4,
    34,    22,   nil,    22,   nil,   nil,   nil,    22,    22,   nil,
   nil,    22 ]

racc_goto_pointer = [
   nil,    73,    71,    40,     1,    54,     1,    52,    -4,    47,
    16,   nil,   nil,   nil,   nil,   nil,   nil,   -47,   nil,   nil,
   nil,   nil,    -4,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
   nil,   nil,   nil,   nil,     1,   -13,   -64,  -117,   -12,   nil,
    25,   -99,   -35,  -108,  -194,   -13,  -241,   -95,   -40,  -220,
    36,   -48,  -262,  -109,  -163,  -162,   -72,  -196,  -204,   -52,
   nil,  -134,   -10,  -238,  -272,  -236,  -107,   nil,    39,   nil,
  -111,  -106,   -60,  -129,   nil,   -72,   nil,   nil ]

racc_goto_default = [
   nil,   nil,   nil,   nil,   nil,   nil,   246,   nil,   nil,   nil,
   nil,    44,    50,    55,    63,    69,     9,    16,    21,    27,
    32,    39,    83,    49,    54,    62,    68,     8,    15,    20,
    26,    31,    38,    42,    97,   nil,   nil,   nil,   nil,    14,
   nil,   nil,   nil,   nil,   nil,    45,   nil,   nil,   nil,   nil,
   nil,   nil,   280,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
   123,   nil,   nil,   nil,   nil,   nil,   nil,    46,    51,    86,
    88,    73,    74,    75,    93,    94,    95,    96 ]

racc_token_table = {
 false => 0,
 Object.new => 1,
 :LINE => 2,
 :NUMBER => 3,
 :STRING => 4,
 :ID => 5,
 :CONSTANT => 6,
 :INCLUDEFILE => 7,
 :XINCLUDEFILE => 8,
 :COMPILERSELECT => 9,
 :COMPILERCASE => 10,
 :COMPILERENDSELECT => 11,
 :COMPILERIF => 12,
 :COMPILERENDIF => 13,
 :ENUMERATION => 14,
 :ENDENUMERATION => 15,
 :STRUCTURE => 16,
 :ENDSTRUCTURE => 17,
 :DIM => 18,
 :NEWLIST => 19,
 :DECLARE => 20,
 :PROCEDURE => 21,
 :ENDPROCEDURE => 22,
 :PROCEDURERETURN => 23,
 :DATASECTION => 24,
 :ENDDATASECTION => 25,
 :DATA => 26,
 :READ => 27,
 :SHARED => 28,
 :STATIC => 29,
 :GLOBAL => 30,
 :PROTECTED => 31,
 :IF => 32,
 :ELSE => 33,
 :ELSEIF => 34,
 :ENDIF => 35,
 :BREAK => 36,
 :CONTINUE => 37,
 :FOR => 38,
 :TO => 39,
 :STEP => 40,
 :NEXT => 41,
 :FOREACH => 42,
 :REPEAT => 43,
 :UNTIL => 44,
 :FOREVER => 45,
 :WHILE => 46,
 :WEND => 47,
 :SELECT => 48,
 :CASE => 49,
 :DEFAULT => 50,
 :ENDSELECT => 51,
 :GOTO => 52,
 :END => 53,
 :AND => 54,
 :OR => 55,
 :NOT => 56,
 :BACKSLASH => 57,
 :SIZEOF => 58,
 :OFFSETOF => 59,
 "." => 60,
 "," => 61,
 "=" => 62,
 "[" => 63,
 "]" => 64,
 "(" => 65,
 ")" => 66,
 ":" => 67,
 "+" => 68,
 "-" => 69,
 "*" => 70,
 "$" => 71,
 "@" => 72,
 "%" => 73,
 "!" => 74,
 "&" => 75,
 "|" => 76,
 "/" => 77,
 "<>" => 78,
 ">" => 79,
 "<" => 80,
 ">=" => 81,
 "<=" => 82 }

racc_use_result_var = true

racc_nt_base = 83

Racc_arg = [
 racc_action_table,
 racc_action_check,
 racc_action_default,
 racc_action_pointer,
 racc_goto_table,
 racc_goto_check,
 racc_goto_default,
 racc_goto_pointer,
 racc_nt_base,
 racc_reduce_table,
 racc_token_table,
 racc_shift_n,
 racc_reduce_n,
 racc_use_result_var ]

Racc_token_to_s_table = [
'$end',
'error',
'LINE',
'NUMBER',
'STRING',
'ID',
'CONSTANT',
'INCLUDEFILE',
'XINCLUDEFILE',
'COMPILERSELECT',
'COMPILERCASE',
'COMPILERENDSELECT',
'COMPILERIF',
'COMPILERENDIF',
'ENUMERATION',
'ENDENUMERATION',
'STRUCTURE',
'ENDSTRUCTURE',
'DIM',
'NEWLIST',
'DECLARE',
'PROCEDURE',
'ENDPROCEDURE',
'PROCEDURERETURN',
'DATASECTION',
'ENDDATASECTION',
'DATA',
'READ',
'SHARED',
'STATIC',
'GLOBAL',
'PROTECTED',
'IF',
'ELSE',
'ELSEIF',
'ENDIF',
'BREAK',
'CONTINUE',
'FOR',
'TO',
'STEP',
'NEXT',
'FOREACH',
'REPEAT',
'UNTIL',
'FOREVER',
'WHILE',
'WEND',
'SELECT',
'CASE',
'DEFAULT',
'ENDSELECT',
'GOTO',
'END',
'AND',
'OR',
'NOT',
'BACKSLASH',
'SIZEOF',
'OFFSETOF',
'"."',
'","',
'"="',
'"["',
'"]"',
'"("',
'")"',
'":"',
'"+"',
'"-"',
'"*"',
'"$"',
'"@"',
'"%"',
'"!"',
'"&"',
'"|"',
'"/"',
'"<>"',
'">"',
'"<"',
'">="',
'"<="',
'$start',
'all',
'program',
'datadecls',
'endline',
'stmt_or_decl',
'statement',
'enumeration',
'globallist',
'declareproc',
'procedure',
'include_stmt',
'compilerselect',
'compilercase',
'compilerendselect',
'compilerif',
'compilerendif',
'dimensioning',
'constant_def',
'structure_def',
'procreturn',
'proccall',
'varref',
'assignment',
'increment',
'decrement',
'if',
'repeat',
'while',
'for',
'foreach',
'selection',
'goto',
'label',
'expr',
'datadecl',
'datadecltype',
'datalist',
'constant_expr',
'includefile',
'constant_condition',
'enumerated_constants',
'@1',
'structure_fields',
'fieldspec',
'typed_id',
'fielddim',
'exprlist',
'proctype',
'procparams',
'procedure_header',
'procbody',
'procparam',
'procdecl',
'sharelist',
'staticlist',
'statements',
'sharedvar',
'staticvar',
'globaldecl',
'globalvar',
'repeatcond',
'condition',
'step',
'next',
'elsepart',
'cases',
'lvalue',
'typed_id1',
'call_or_array_or_list',
'factor',
'term3',
'term2',
'term',
'comp',
'cond',
'disjunct',
'conjunct']

Racc_debug_parser = false

##### racc system variables end #####

 # reduce 0 omitted

 # reduce 1 omitted

 # reduce 2 omitted

 # reduce 3 omitted

 # reduce 4 omitted

 # reduce 5 omitted

 # reduce 6 omitted

module_eval <<'.,.,', 'elice.y', 47
  def _reduce_7( val, _values, result )
 @program.add_statement(val[0]) if val[0]
   result
  end
.,.,

 # reduce 8 omitted

 # reduce 9 omitted

 # reduce 10 omitted

 # reduce 11 omitted

module_eval <<'.,.,', 'elice.y', 53
  def _reduce_12( val, _values, result )
 return nil
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 54
  def _reduce_13( val, _values, result )
 return nil
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 55
  def _reduce_14( val, _values, result )
 return nil
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 56
  def _reduce_15( val, _values, result )
 return nil
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 57
  def _reduce_16( val, _values, result )
 return nil
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 58
  def _reduce_17( val, _values, result )
 return nil
   result
  end
.,.,

 # reduce 18 omitted

module_eval <<'.,.,', 'elice.y', 60
  def _reduce_19( val, _values, result )
 return val[1]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 61
  def _reduce_20( val, _values, result )
 return nil
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 62
  def _reduce_21( val, _values, result )
 return nil
   result
  end
.,.,

 # reduce 22 omitted

 # reduce 23 omitted

module_eval <<'.,.,', 'elice.y', 65
  def _reduce_24( val, _values, result )
 return nil
   result
  end
.,.,

 # reduce 25 omitted

 # reduce 26 omitted

 # reduce 27 omitted

 # reduce 28 omitted

 # reduce 29 omitted

 # reduce 30 omitted

 # reduce 31 omitted

 # reduce 32 omitted

 # reduce 33 omitted

 # reduce 34 omitted

 # reduce 35 omitted

module_eval <<'.,.,', 'elice.y', 77
  def _reduce_36( val, _values, result )
 return [:read, val[1]]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 78
  def _reduce_37( val, _values, result )
 return [:break]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 79
  def _reduce_38( val, _values, result )
 return [:continue]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 80
  def _reduce_39( val, _values, result )
 return [:end, 0]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 81
  def _reduce_40( val, _values, result )
 return [:end, val[1].coerce_int]
   result
  end
.,.,

 # reduce 41 omitted

 # reduce 42 omitted

 # reduce 43 omitted

module_eval <<'.,.,', 'elice.y', 98
  def _reduce_44( val, _values, result )
 if integer_type? val[1]
        val[2].map! { |v| v.coerce_int }
      elif val[1] == :f
        val[2].map! { |v| v.coerce_float }
      elif val[1] == :s
        if val[2].any { |v| v.expr_type != :s }
          raise ProgramError, "string value expected"
        end
      end
      val[2].each { |v| @program.declare_data(val[1], v) }
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 100
  def _reduce_45( val, _values, result )
 return :l
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 106
  def _reduce_46( val, _values, result )
 unless integer_type?(val[1]) || val[1] == :s || val[1] == :f
        raise ParseError, "Data must be of primitive types (#{val[1]})" 
      end
      return val[1]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 108
  def _reduce_47( val, _values, result )
 return [val[0]]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 109
  def _reduce_48( val, _values, result )
 return val[0] << val[2]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 119
  def _reduce_49( val, _values, result )
    fname = val[1]
    if !fname.is_a? String
      raise ParseError, "IncludeFile filename must be constant string"
    end
    return if val[0] == :XINCLUDEFILE && @included_files.include?(fname)
    include_file(fname)
   result
  end
.,.,

 # reduce 50 omitted

 # reduce 51 omitted

module_eval <<'.,.,', 'elice.y', 126
  def _reduce_52( val, _values, result )
 raise ParseError, "Cannot nest CompilerSelect" if @compilerselect
      @compilerselect = val[1]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 131
  def _reduce_53( val, _values, result )
 raise ParseError, "CompilerCase outside CompilerSelect" if @compilerselect.nil?
      @skiptokens = val[1] != @compilerselect
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 136
  def _reduce_54( val, _values, result )
 raise ParseError, "CompilerEndSelect without CompilerSelect" if @compilerselect.nil?
      @skiptokens = false; @compilerselect = nil
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 140
  def _reduce_55( val, _values, result )
 raise ParseError, "Cannot nest CompilerIf" if @skiptokens
      @skiptokens = val[1] == 0
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 142
  def _reduce_56( val, _values, result )
 @skiptokens = false;
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 147
  def _reduce_57( val, _values, result )
    @program.define_constant(val[0], val[2])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 148
  def _reduce_58( val, _values, result )
 @enumstate =  0
   result
  end
.,.,

 # reduce 59 omitted

 # reduce 60 omitted

module_eval <<'.,.,', 'elice.y', 154
  def _reduce_61( val, _values, result )
 @program.define_constant(val[1], @enumstate)
                             @enumstate += 1
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 157
  def _reduce_62( val, _values, result )
 @program.define_structure(val[1], val[3])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 159
  def _reduce_63( val, _values, result )
 return []
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 160
  def _reduce_64( val, _values, result )
 val[0] << val[1]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 163
  def _reduce_65( val, _values, result )
 return FieldSpec.new(val[0][0], val[0][1], val[1])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 165
  def _reduce_66( val, _values, result )
 return nil
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 175
  def _reduce_67( val, _values, result )
 sz = val[1]
                 if !sz.is_a? Integer
                   raise ParseError, "Field size must be constant integer"
                 end
                 if sz <= 0
                   raise ParseError, "Field arrays must have positive size"
                 end
                 return sz
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 187
  def _reduce_68( val, _values, result )
 name, type = val[1]
         sizes = val[3]
         if sizes.empty?
           raise "Array must have at least one dimension"
         end
         # Dim a(10) creates an array with 11 elements; adjust it here.
         sizes.map! { |sz| BinaryOp.new(:"+", sz, 1).simplify.coerce_int }
         @program.declare_array(name, type, sizes.size)
         return ([:dim, name] + sizes)
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 190
  def _reduce_69( val, _values, result )
 @program.declare_procedure(val[2], val[1], val[4])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 196
  def _reduce_70( val, _values, result )
 @program.add_procedure(val[0], @scope)
                 @scope = @program
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 205
  def _reduce_71( val, _values, result )
 rtype = val[1]
                 name = val[2]
                 params = val[4]
                 @program.declare_procedure(name, rtype, params)
                 @scope = Procedure.new(@program, name, rtype, params)
                 return name
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 207
  def _reduce_72( val, _values, result )
 return :l
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 209
  def _reduce_73( val, _values, result )
 return val[1] if simple_type? val[1]
                     raise ParseError, "Procedures must return simple types"
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 211
  def _reduce_74( val, _values, result )
 return []
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 212
  def _reduce_75( val, _values, result )
 return [val[0]]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 213
  def _reduce_76( val, _values, result )
 val[0] << val[2]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 215
  def _reduce_77( val, _values, result )
 return val[0]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 216
  def _reduce_78( val, _values, result )
 return val[0] << val[2]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 220
  def _reduce_79( val, _values, result )
 name, basetype = val[0]
                 basetype = :l if basetype.nil?
                 return [ name, ListType.new(basetype) ]
   result
  end
.,.,

 # reduce 80 omitted

 # reduce 81 omitted

module_eval <<'.,.,', 'elice.y', 224
  def _reduce_82( val, _values, result )
 @scope.add_statement(val[1]) if val[1]
   result
  end
.,.,

 # reduce 83 omitted

 # reduce 84 omitted

module_eval <<'.,.,', 'elice.y', 230
  def _reduce_85( val, _values, result )
 name, type = val[1]
                @scope.declare_list(name, type)
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 232
  def _reduce_86( val, _values, result )
 return []
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 233
  def _reduce_87( val, _values, result )
 val[0] << val[1] if val[1]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 235
  def _reduce_88( val, _values, result )
 return [:return, val[1].simplify]
   result
  end
.,.,

 # reduce 89 omitted

 # reduce 90 omitted

module_eval <<'.,.,', 'elice.y', 243
  def _reduce_91( val, _values, result )
 name = val[0]
                  var = @program.declare_shared(name)
                  @scope.import_var(var)
   result
  end
.,.,

 # reduce 92 omitted

 # reduce 93 omitted

module_eval <<'.,.,', 'elice.y', 249
  def _reduce_94( val, _values, result )
 name, type = val[0]
                        @scope.declare_static(name, type)
   result
  end
.,.,

 # reduce 95 omitted

 # reduce 96 omitted

 # reduce 97 omitted

module_eval <<'.,.,', 'elice.y', 257
  def _reduce_98( val, _values, result )
 @program.add_statement([:"=", val[0], val[2]])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 260
  def _reduce_99( val, _values, result )
 name, type = val[1]
                  @program.declare_global_list(name, type)
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 263
  def _reduce_100( val, _values, result )
 name, type = val[0]
                        return @program.declare_global(name, type)
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 266
  def _reduce_101( val, _values, result )
 return [:repeat, val[3].simplify] + val[2]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 268
  def _reduce_102( val, _values, result )
 return val[1]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 269
  def _reduce_103( val, _values, result )
 return 0
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 272
  def _reduce_104( val, _values, result )
 return [:while, val[1].simplify] + val[3]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 287
  def _reduce_105( val, _values, result )
 if val[9] && val[1] != val[9]
        raise ParseError, "NEXT has different variable than matching FOR"
      end
      if ! integer_type?(val[1].expr_type)
        raise ParseError, "FOR variable must have integer type"
      end
      if ! integer_type?(val[6].expr_type)
        raise ParseError, "FOR STEP value must have integer type"
      end
      from = val[3].coerce_int.simplify
      to = val[5].coerce_int.simplify
      return [:for, val[1], from, to, val[6]] + val[8]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 289
  def _reduce_106( val, _values, result )
 return 1
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 290
  def _reduce_107( val, _values, result )
 return val[1]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 292
  def _reduce_108( val, _values, result )
 return nil
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 293
  def _reduce_109( val, _values, result )
 return val[1]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 309
  def _reduce_110( val, _values, result )
 name, basetype = val[1]
      unless @scope.list_declared? name
        raise ParseError, "unknown list #{name}"
      end
      list = @scope.lookup_list(name)
      unless list.basetype == basetype || basetype.nil?
        raise ParseError, "#{name} is list of #{list.basetype}, not #{basetype}"
      end
      # Hack: emit.rb will use these functions to implement ForEach.
      # Make sure they are included in the output.
      @program.use_builtin(:resetlist)
      @program.use_builtin(:nextelement)
      return [:foreach, list] + val[5]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 315
  def _reduce_111( val, _values, result )
 return [:if, val[1].simplify, val[3], val[4]]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 320
  def _reduce_112( val, _values, result )
 return []
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 321
  def _reduce_113( val, _values, result )
 return val[2]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 323
  def _reduce_114( val, _values, result )
 return [[:if, val[1].simplify, val[3], val[4]]]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 326
  def _reduce_115( val, _values, result )
 return [:select, val[1].simplify] + val[3]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 328
  def _reduce_116( val, _values, result )
 return []
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 330
  def _reduce_117( val, _values, result )
 val[0] << ([:case, val[2].simplify] + val[4])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 332
  def _reduce_118( val, _values, result )
 val[0] << ([:default] + val[3])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 334
  def _reduce_119( val, _values, result )
 return [:goto, val[1]]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 338
  def _reduce_120( val, _values, result )
 @program.declare_label(val[0], @scope)
      return [:label, val[0]]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 366
  def _reduce_121( val, _values, result )
 lvalue = val[0]
      expr = val[2]
      ltype = lvalue.expr_type
      etype = expr.expr_type
      case ltype
      when ListType
        raise ProgramError, "cannot assign to ${ltype}"
      when PointerType
        unless etype.is_a? PointerType
          raise ProgramError, "cannot convert non-pointer to #{ltype}"
        end
      when :s
        if etype != :s
          raise ProgramError, "type mismatch between string and non-string"
        end
      when :f
        expr = expr.coerce_float
      else
        unless simple_type? ltype
          raise ParseError, "assignment must be to simple type"
        end
        # simple type, not string or float -- must be int or pointer
        expr = expr.coerce_int
      end
      return [:"=", lvalue, expr.simplify]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 392
  def _reduce_122( val, _values, result )
 lvalue = val[0]
      expr = val[2]
      ltype = lvalue.expr_type
      etype = expr.expr_type
      case ltype
      when ListType
        raise ProgramError, "cannot increment ${ltype}"
      when PointerType
        expr = expr.coerce_int
      when :s
        if etype != :s
          raise ProgramError, "type mismatch between string and non-string"
        end
      when :f
        expr = expr.coerce_float
      else
        unless simple_type? ltype
          raise ParseError, "cannot increment structured type"
        end
        # simple type, not string or float -- must be integral
        expr = expr.coerce_int
      end
      return [:"+", lvalue, expr.simplify]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 406
  def _reduce_123( val, _values, result )
 lvalue = val[0]
      expr = val[2]
      ltype = lvalue.expr_type
      if integer_type?(ltype) || ltype.is_a?(PointerType)
        expr = expr.coerce_int
      elsif ltype == :f
        expr = expr.coerce_float
      else
        raise ParseError, "decrement must be of numeric or pointer type"
      end
      return [:"-", lvalue, expr.simplify]
   result
  end
.,.,

 # reduce 124 omitted

module_eval <<'.,.,', 'elice.y', 411
  def _reduce_125( val, _values, result )
  return ListCurrent.new(@scope, val[0]) if val[2].empty?
               return ArrayIndex.new(@scope, val[0], *val[2])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 413
  def _reduce_126( val, _values, result )
 return FieldRef.new(@scope, val[0], val[2])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 415
  def _reduce_127( val, _values, result )
 return FieldRef.new(@scope, val[0], val[2])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 417
  def _reduce_128( val, _values, result )
 return FieldRef.new(@scope, val[0], val[2], val[4])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 422
  def _reduce_129( val, _values, result )
 vname, vtype = val[0]
      return @scope.ref_var(vname, vtype)
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 427
  def _reduce_130( val, _values, result )
 vname, vtype = val[1]
      @scope.protect_var(vname, vtype)
      return @scope.ref_var(vname, vtype)
   result
  end
.,.,

 # reduce 131 omitted

module_eval <<'.,.,', 'elice.y', 431
  def _reduce_132( val, _values, result )
 name, type = val[1]
                            return ["*#{name}".to_sym, PointerType.new(type)]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 433
  def _reduce_133( val, _values, result )
 return [val[0], nil]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 434
  def _reduce_134( val, _values, result )
 return ["#{val[0]}$".to_sym, :s]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 439
  def _reduce_135( val, _values, result )
 if @program.type_defined? val[2]
                           return [val[0], val[2]]
                         else
                           raise ParseError, "Unknown type #{val[2]}"
                         end
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 442
  def _reduce_136( val, _values, result )
 return [:call, ProcedureCall.new(@scope, val[0], *val[2])]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 462
  def _reduce_137( val, _values, result )
 name = val[0]
      args = val[2]

      if args.size == 0 && @scope.list_declared?(name)
        return ListCurrent.new(@scope, name)
      end

      return ArrayIndex.new(@scope, name, *args) if @program.array_declared?(name)

      pc = ProcedureCall.new(@scope, name, *args)
      if pc.expr_type.nil?
        raise ProgramError, "Procedure #{name} has no return value"
      end
      @program.procedure_value_used(name)  # info used for warnings
      return pc
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 464
  def _reduce_138( val, _values, result )
 return []
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 465
  def _reduce_139( val, _values, result )
 return [val[0]]
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 466
  def _reduce_140( val, _values, result )
 val[0] << val[2]
   result
  end
.,.,

 # reduce 141 omitted

 # reduce 142 omitted

module_eval <<'.,.,', 'elice.y', 470
  def _reduce_143( val, _values, result )
 return @program.lookup_constant(val[0])
   result
  end
.,.,

 # reduce 144 omitted

module_eval <<'.,.,', 'elice.y', 472
  def _reduce_145( val, _values, result )
 return VarAddress.new(val[1])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 473
  def _reduce_146( val, _values, result )
 return ListAddress.new(@scope, val[1])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 475
  def _reduce_147( val, _values, result )
 return FieldRef.new(@scope, val[0], val[2])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 477
  def _reduce_148( val, _values, result )
 return FieldRef.new(@scope, val[0], val[2], val[4])
   result
  end
.,.,

 # reduce 149 omitted

module_eval <<'.,.,', 'elice.y', 484
  def _reduce_150( val, _values, result )
 if @program.structure_fields(val[2]).nil?
                raise ParseError, "SizeOf expects a structure name"
              end
              return SizeOf.new(val[2])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 495
  def _reduce_151( val, _values, result )
 fields = @program.structure_fields(val[2])
              if fields.nil?
                raise ParseError, "OffsetOf expects a structure name"
              end
              field = fields.find { |f| f.name == val[4] }
              if field.nil?
                raise ParseError, "#{val[2]} does not have field #{val[4]}"
              end
              return OffsetOf.new(val[2], field)
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 496
  def _reduce_152( val, _values, result )
 return val[1]
   result
  end
.,.,

 # reduce 153 omitted

module_eval <<'.,.,', 'elice.y', 502
  def _reduce_154( val, _values, result )
 return BinaryOp.new(:"%", val[0], val[2])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 503
  def _reduce_155( val, _values, result )
 return BinaryOp.new(:"!", val[0], val[2])
   result
  end
.,.,

 # reduce 156 omitted

module_eval <<'.,.,', 'elice.y', 506
  def _reduce_157( val, _values, result )
 return BinaryOp.new(:"&", val[0], val[2])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 507
  def _reduce_158( val, _values, result )
 return BinaryOp.new(:"|", val[0], val[2])
   result
  end
.,.,

 # reduce 159 omitted

module_eval <<'.,.,', 'elice.y', 510
  def _reduce_160( val, _values, result )
 return BinaryOp.new(:"-", 0, val[1])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 511
  def _reduce_161( val, _values, result )
 return BinaryOp.new(:"*", val[0], val[2])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 512
  def _reduce_162( val, _values, result )
 return BinaryOp.new(:"/", val[0], val[2])
   result
  end
.,.,

 # reduce 163 omitted

module_eval <<'.,.,', 'elice.y', 515
  def _reduce_164( val, _values, result )
 return BinaryOp.new(:"+", val[0], val[2])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 516
  def _reduce_165( val, _values, result )
 return BinaryOp.new(:"-", val[0], val[2])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 518
  def _reduce_166( val, _values, result )
 return BinaryOp.new(:"=", val[0], val[2])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 519
  def _reduce_167( val, _values, result )
 return BinaryOp.new(:"<>", val[0], val[2])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 520
  def _reduce_168( val, _values, result )
 return BinaryOp.new(:">", val[0], val[2])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 521
  def _reduce_169( val, _values, result )
 return BinaryOp.new(:"<", val[0], val[2])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 522
  def _reduce_170( val, _values, result )
 return BinaryOp.new(:">=", val[0], val[2])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 523
  def _reduce_171( val, _values, result )
 return BinaryOp.new(:"<=", val[0], val[2])
   result
  end
.,.,

 # reduce 172 omitted

 # reduce 173 omitted

module_eval <<'.,.,', 'elice.y', 527
  def _reduce_174( val, _values, result )
 return NotCondition.new(val[1])
   result
  end
.,.,

 # reduce 175 omitted

module_eval <<'.,.,', 'elice.y', 530
  def _reduce_176( val, _values, result )
 return BinaryOp.new(:or, val[0], val[2])
   result
  end
.,.,

 # reduce 177 omitted

module_eval <<'.,.,', 'elice.y', 533
  def _reduce_178( val, _values, result )
 return BinaryOp.new(:and, val[0], val[2])
   result
  end
.,.,

 # reduce 179 omitted

module_eval <<'.,.,', 'elice.y', 539
  def _reduce_180( val, _values, result )
 return BinaryOp.new(:and, val[0], val[2])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 540
  def _reduce_181( val, _values, result )
 return BinaryOp.new(:or, val[0], val[2])
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 543
  def _reduce_182( val, _values, result )
 return val[0].evaluate_constant
   result
  end
.,.,

module_eval <<'.,.,', 'elice.y', 546
  def _reduce_183( val, _values, result )
 return val[0].evaluate_constant
   result
  end
.,.,

 # reduce 184 omitted

 # reduce 185 omitted

 # reduce 186 omitted

 def _reduce_none( val, _values, result )
  result
 end

end   # class Parser

self.class.module_eval <<'..end elice.y modeval..id16081ba63b', 'elice.y', 724

# generated statement types:
# array sizing, [:dim, arrayname, sizes...]
# assignment,   [:"=", lvalue, expr]
# procreturn,   [:return, expr]
# proc call,    [:call, expr (proc call)]
# repeat,   [:repeat, cond, statement...]
# while,    [:while, cond, statement...]
# for,      [:for, var, expr (start), expr (stop), expr (step), statement...]
# foreach,  [:foreach, list, statement...]
# if,       [:if, cond, [statement...], [statement...]]
# select,   [:select, expr, [:case, expr, statement...]...]  (and :default)
# goto,     [:goto, label]
# label,    [:label, label]
# break,    [:break]
# continue, [:continue]
# read,     [:read, var]
# exit program, [:end, exitcode]

# Generated expression nodes:
# String, Integer, Float (immediates)
# BasicVar
# VarAddress
# SizeOf
# OffsetOf
# LinkedList
# ListCurrent
# ListAddress
# FieldRef (structure fields)
# ArrayIndex
# ProcedureCall
# NotCondition
# BinaryOp (+ - * / = <> < > >= <= and or & | !)
# and Truncate can be inserted by the coerce_ functions.
# NotNull (converts null pointers to 0 and all other pointers to 1)

def simple_type?(type)
  type == :l || type == :w || type == :b || type == :c || type == :s || type == :f
end

def integer_type?(type)
  type == :l || type == :w || type == :b || type == :c
end

def structure_type?(type)
  type.is_a?(Symbol) && !simple_type?(type)
end

class ListType
  # basetype can be nil to indicate this is a generic list type.
  # Generic lists are used as parameters to certain builtin procedures..
  attr_accessor :basetype

  def initialize(basetype=nil)
    @basetype = basetype
  end

  def ==(other)
    return other.is_a?(ListType) && self.basetype == other.basetype
  end

  def to_s
    return "list" if basetype.nil?
    return "list of #{basetype}"
  end

end

class PointerType
  # basetype can be nil to indicate a generic pointer type.
  # generic pointers cannot be dereferenced, but may be passed to
  # or returned from builtin procedures.
  attr_accessor :basetype

  def initialize(basetype)
    @basetype = basetype
  end

  def ==(other)
    return other.is_a?(PointerType) && self.basetype == other.basetype
  end

  def compatible?(other)
    return false unless other.is_a? PointerType
    return true if @basetype.nil? || other.basetype.nil?
    return @basetype == other.basetype
  end

  def to_s
    return "pointer" if basetype.nil?
    return "pointer to #{basetype}"
  end

end

class Integer

  def expr_type
    :l
  end

  def coerce_int
    self
  end

  def coerce_float
    self.to_f
  end

  def coerce_linkedlist(ltype)
    raise ProgramError, "expected linked list"
  end

  def evaluate_constant
    self
  end

  def constant?
    true
  end

  def simplify
    self
  end

end

class String

  def expr_type
    :s
  end

  def coerce_int
    raise ProgramError, "string in integer context"
  end

  def coerce_float
    raise ProgramError, "string in float context"
  end

  def coerce_linkedlist(ltype)
    raise ProgramError, "expected linked list"
  end

  def evaluate_constant
    self
  end

  def constant?
    true
  end

  def simplify
    self
  end

end

class Float

  def expr_type
    :f
  end

  def coerce_int
    self.to_i
  end

  def coerce_float
    self
  end

  def coerce_linkedlist(ltype)
    raise ProgramError, "expected linked list"
  end

  def evaluate_constant
    self
  end

  def constant?
    true
  end

  def simplify
    self
  end

end

# code-sharing class to set defaults for several methods of the expr-node
# interface.
class ExprNode
  # General note: calling "simplify" is done as a separate step when
  # constructing statements, rather than while creating expression nodes,
  # because some constant expressions actually evaluate differently
  # depending on whether they are assigned to a float or integer variable.
  # When the float-or-int context is known, for example in parameters of
  # procedure calls, simplify can be called early.

  def expr_type
    @type
  end

  def coerce_int
    type = self.expr_type
    return self if integer_type? type
    return Truncate.new(self) if type == :f
    return NotNull.new(self) if type.is_a? PointerType
    raise ProgramError, "expected integer value"
  end

  def coerce_float
    type = self.expr_type
    # promotion of int to float happens automatically in both ruby and C
    return self if type == :f || integer_type?(type)
    raise ProgramError, "expected numeric value"
  end

  def coerce_linkedlist(ltype)
    raise ProgramError, "expected linked list"
  end

  def evaluate_constant
    raise ProgramError, "Expected constant expression"
  end

  def constant?
    false
  end

  def simplify
    self
  end

end

class BasicVar < ExprNode
  attr_reader :type, :name
  attr_accessor :alloc

  # Known alloc types:  :local, :param, :shared, :static, :global
  def initialize(name, type, alloc)
    type = :l if type.nil?
    alloc = :local if alloc.nil?
    @name = name
    @type = type
    @alloc = alloc
  end

  def has_type?(type)
    return true if @type.is_a?(PointerType) && @type.compatible?(type)
    return type.nil? || @type == type
  end

  def <=>(y)
    self.name.to_s <=> y.name.to_s
  end

end

class VarAddress < ExprNode

  def initialize(var)
    @var = var
    @type = PointerType.new(var.expr_type)
  end

end

class SizeOf < ExprNode

  def initialize(name)
    @name = name
    @type = :l
  end

end

class OffsetOf < ExprNode
  attr_reader :name, :field

  def initialize(name, field)
    @name = name
    @field = field
    @type = :l
  end

end

# This node is usually wrapped in ListCurrent or ListAddress.
# It is unwrapped in only one case: when passing a list as a
# procedure argument.
class LinkedList < ExprNode
  attr_reader :basetype, :name
  attr_accessor :alloc

  # Known alloc types:  :global, :local, :param
  def initialize(name, basetype, alloc)
    basetype = :l if basetype.nil?
    alloc = :local if alloc.nil?
    @name = name
    @basetype = basetype
    @alloc = alloc
    @type = ListType.new(@basetype)
  end

  def <=>(y)
    self.name.to_s <=> y.name.to_s
  end

  def coerce_linkedlist(ltype)
    return self if ltype.basetype.nil? || ltype.basetype == basetype
    raise ProgramError, "expected linked list of type #{basetype}"
  end

end

class ListCurrent < ExprNode

  def initialize(scope, name)
    list = scope.lookup_list(name)
    if list.nil?
      raise ProgramError, "unknown linked list #{name}"
    end
    @list = list
    @type = list.basetype
  end

  def coerce_linkedlist(ltype)
    @list.coerce_linkedlist(ltype)
  end

end

class ListAddress < ExprNode

  def initialize(scope, name)
    list = scope.lookup_list(name)
    if list.nil?
      raise ProgramError, "unknown linked list #{name}"
    end
    @list = list
    @type = PointerType.new(list.basetype)
  end

end

# float-to-integer conversion node
class Truncate < ExprNode

  def initialize(expr)
    @expr = expr
  end

  def expr_type
    :l
  end

  def coerce_float
    # undo truncation?
    return @expr if @expr.expr_type == :f
    # otherwise rely on auto-promotion of int to float
    return self
  end

  def evaluate_constant
    @expr.evaluate_constant.to_i
  end

  def simplify
    @expr = @expr.simplify
    return @expr.to_i if @expr.constant?
    return self
  end

end

class NotNull < ExprNode

  def initialize(expr)
    @expr = expr
  end

  def expr_type
    :l
  end

  def simplify
    @expr = @expr.simplify
    return 1 if @expr.is_a? VarAddress  # These are never null
    return self
  end

end

class FieldRef < ExprNode

  def initialize(scope, base, field, index = nil)
    @base = base
    @struct_name = base.expr_type
    if @struct_name.is_a? PointerType
      @struct_name = @struct_name.basetype
    end
    unless structure_type? @struct_name
      raise ProgramError, "field selection of non-structure type"
    end
    fields = scope.program.structure_fields(@struct_name)
    if fields.nil?
      raise ProgramError, "unknown structure type #{@struct_name}"
    end
    @field = fields.find { |f| f.name == field }
    if @field.nil?
      raise ProgramError, "type #{@struct_name} does not have field #{field}"
    end
    if @field.size.nil? && !index.nil?
      raise ProgramError, "indexing field #{field} that is not an array"
    elsif index.nil? && !@field.size.nil?
      # Amazingly, indexing a field seems to be optional. 
      # I'm going to guess that it defaults to index 0.
      index = 0
      emit_warning("defaulting #{@struct_name}.#{field} to #{field}[0]")
    end
    @index = index.coerce_int.simplify if index
  end

  def expr_type
    @field.type
  end

end

class ArrayIndex < ExprNode

  def initialize(scope, name, *indices)
    @name = name
    @type = scope.program.array_type(name)
    if @type.nil?
       raise ProgramError, "unknown array #{name}"
    end
    dim = scope.program.array_dimensions(name)
    if dim != indices.size
      raise ProgramError, "#{name} has #{dim} dimensions"
    end
    @indices = indices.map { |i| i.coerce_int.simplify }
    @location = scope.name   # used for reporting bad indexing at runtime
  end

end

class ProcedureCall < ExprNode

  def initialize(scope, name, *args)
    @name = name
    pdata = scope.program.lookup_procedure(name)
    if pdata.nil?
      raise ProgramError, "unknown procedure #{name}"
    end
    scope.uses_proc(name)
    @type, @params, @defaults = pdata
    reqparams = @params.size - @defaults.size
    if @defaults.size > 0
      if args.size > @params.size || args.size < reqparams
        raise ProgramError, "procedure #{name} expects #{reqparams} to #{@params.size} arguments"
      end
    else
      if args.size != @params.size
        raise ProgramError, "procedure #{name} expects #{@params.size} arguments"
      end
    end
    @args = []
    @params.each_index do |i|
      if i >= args.size
        arg = @defaults[i - reqparams]
      else
        arg = args[i]
      end

      ptype = @params[i]
      if integer_type? ptype
        # TODO: coerce to specific int sizes
        arg = arg.coerce_int
      elsif ptype == :f
        arg = arg.coerce_float
      elsif ptype.is_a? ListType
        arg = arg.coerce_linkedlist(ptype)
      elsif ptype.is_a? PointerType
        if !arg.expr_type.is_a? PointerType
          raise ProgramError, "expected #{ptype} for arg #{i+1} of #{name}"
        end
        if !ptype.compatible?(arg.expr_type)
          emit_warning("passing #{arg.expr_type} as #{ptype}")
        end
      elsif arg.expr_type != ptype
        raise ProgramError, "arg #{i+1} of #{name} should be .#{ptype}"
      end
      @args << arg.simplify
    end

    # Warn about some situations that can cause the target program to crash.
    if @name == :sortstructuredlist && @args[2].is_a?(OffsetOf)
      if (@args[0].expr_type.is_a?(ListType) &&
          @args[0].expr_type.basetype != @args[2].name)
        emit_warning("SortStructuredList: structure in OffsetOf does not match type of list")
      end
      typecodes = [:b, :w, :l, :s, :f, :d, :q, :c]
      if (simple_type?(@args[2].field.type) && @args[3].constant? &&
          @args[2].field.type != typecodes[@args[3]])
        emit_warning("SortStructuredList: field type in OffsetOf does not match sort type")
      end
    end
  end

  def simplify
    return @args[0].coerce_int.simplify if @name == :int
    return self
  end

end

class NotCondition < ExprNode

  def initialize(expr)
    @expr = expr
    @type = :l
  end

  def evaluate_constant
    return (@expr.evaluate_constant == 0) ? 1 : 0
  end

  def simplify
    @expr = @expr.simplify
    return self.evaluate_constant if @expr.constant?
    return self
  end

end

# Known ops: 
#   + - * / % = <> < > >= <= and or & | !
#
class BinaryOp < ExprNode

  def initialize(op, x, y)
    xtype = x.expr_type
    ytype = y.expr_type
    if structure_type?(xtype)
      emit_warning("#{xtype} structure used in #{op} operation")
      x = 0
      xtype = x.expr_type
    end
    if structure_type?(ytype)
      emit_warning("#{ytype} structure used in #{op} operation")
      y = 0
      ytype = y.expr_type
    end

    if (xtype == :s || ytype == :s) && xtype != ytype
      raise ProgramError, "type mismatch between string and non-string"
    end

    if xtype == :s && [:"-", :"*", :"/", :"%", :"&", :"|", :"!"].include?(op)
      raise ProgramError, "operation not valid on strings"
    end

    if xtype.is_a?(PointerType) && ytype.is_a?(PointerType) && !(op == :"=" || op == :"<>")
      raise ProgramError, "operation not valid between pointers"
    end

    if (xtype.is_a? PointerType) != (ytype.is_a? PointerType) && !(op == :"-" || op == :"+" || op == :"=" || op == :"<>")
      raise ProgramError, "operation not valid on pointer type"
    end

    @x = x
    @y = y
    @type = xtype
    @op = op

    # If x is float, coerce y, but not automatically the other way around.
    # Apparently coercion should be left-to-right this way.
    # So 2/3 + 1.0 is 1.0
    # But if the + op itself is coerced, for example with
    #  v.f = 2/3 + 1.0
    # then v.f becomes 1.66666~
    if xtype == :f && integer_type?(ytype)
      @y = @y.coerce_float
    elsif ytype == :f && integer_type?(xtype)
      # rely on auto-promotion
      @type = :f
    end

    if xtype.is_a?(PointerType) && !ytype.is_a?(PointerType)
      if op == :"+" || op == :"-"
        @y = @y.coerce_int
      elsif op == :"=" || op == :"<>"
        @x = @x.coerce_int
        @y = @y.coerce_int
        @type = @x.expr_type
      else
        raise ProgramError, "operation not valid on pointer type"
      end
    elsif ytype.is_a?(PointerType) && !xtype.is_a?(PointerType)
      if op == :"+"
        @x = @x.coerce_int
        @type = ytype
      elsif op == :"=" || op == :"<>"
        @x = @x.coerce_int
        @y = @y.coerce_int
        @type = @x.expr_type
      else
        raise ProgramError, "operation not valid on pointer type"
      end
    end

    # Comparisons always give a boolean result
    if comparison_op?
      @type = :l
    end
  end

  def comparison_op?
    [:"=", :"<>", :">", :"<", :">=", :"<=", :and, :or].include? @op
  end

  def coerce_float
    if comparison_op?
      super
    else
      @x = @x.coerce_float
      @y = @y.coerce_float
      @type = :f
      return self
    end
  end

  def evaluate_constant
    x = @x.evaluate_constant
    y = @y.evaluate_constant

    case @op
    when :"+" then return x + y
    when :"-" then return x - y
    when :"*" then return x * y
    when :"/"
      raise ProgramError, "division by zero" if y == 0
      return x / y
    when :"%"
      raise ProgramError, "division by zero" if y == 0
      return x % y
    when :"=" then return (x == y) ? 1 : 0
    when :"<>" then return (x != y) ? 1 : 0
    when :">" then return (x > y) ? 1 : 0
    when :"<" then return (x < y) ? 1 : 0
    when :">=" then return (x >= y) ? 1 : 0
    when :"<=" then return (x <= y) ? 1 : 0
    when :and then return ((x != 0) && (y != 0)) ? 1 : 0
    when :or then return ((x != 0) || (y != 0)) ? 1 : 0
    when :"&" then return x & y
    when :"|" then return x | y
    when :"!" then return x ^ y
    else
      raise RuntimeError, "unknown op #{@op}"
    end
  end

  def simplify
    @x = @x.simplify
    @y = @y.simplify

    return evaluate_constant if @x.constant? && @y.constant?

    # Other simplifications
    return @y if @op == :"+" && @x == 0
    return @x if @op == :"+" && @y == 0
    return @x if @op == :"-" && @y == 0
    return @y if @op == :"*" && @x == 1
    return @x if @op == :"*" && @y == 1
    # Not sure if this is allowed, since it short-circuits
    return 0 if @op == :"*" && (@x == 0 || @y == 0)
    return 0 if @op == :"/" && @x == 0
    return 0 if @op == :"%" && @x == 0
    return @x if @op == :"/" && @y == 1
    return 0 if @op == :"%" && @y == 1

    return self
  end

end

class FieldSpec
  # If this field is an array field, size is the total number of elements.
  # Otherwise, size is nil.
  # Note that this is different from normal arrays. Fields of size n go
  # from field[0] to field[n-1], while arrays dimensioned as n go from
  # arr[0] to arr[n].
  attr_reader :name, :type, :size

  def initialize(name, type, size)
    type = :l if type.nil?
    @name = name
    @type = type
    @size = size
  end

end

class Scope
  attr_reader :procs_used

  def initialize
    @vars = {}
    @lists = {}
    @code = []
    @procs_used = Set[]
  end

  def protect_var(name, ntype)
    ovar = @vars[name]
    if !ovar.nil? && ovar.alloc != :local
      @vars[name] = BasicVar.new(name, ntype, :local)
    end
  end

  def ref_var(name, ntype)
    ovar = @vars[name]

    if ovar.nil?
      @vars[name] = BasicVar.new(name, ntype, :local)
      return @vars[name]
    end

    if !ovar.has_type? ntype
      raise ProgramError, "Type mismatch: #{name}.#{ntype} was declared #{ovar.alloc} #{name}.#{ovar.type}"
    end

    return ovar
  end

  def lookup_list(name)
    @lists[name]
  end

  def list_declared?(name)
    @lists.has_key?(name)
  end

  def import_var(v)
    @vars[v.name] = v
  end

  def import_list(l)
    @lists[l.name] = l
  end

  def add_statement(stmt)
    @code << stmt
  end

  def lookup_name(name)
    return @lists[name] if list_declared?(name)
    return @vars[name] if @vars.has_key?(name)
    return nil
  end

  def uses_proc(name)
    procs_used.add(name)
  end

end

class Program < Scope

  def initialize
    super
    @constants = {}
    @structures = {}
    @procedures = {}
    @arrays = {}
    @builtins_used = Set[]
    @procedure_value_used = Set[]
    @labels = {}
    @data = []
  end

  def declare_shared(name)
    ovar = @vars[name]
 
    if ovar.nil?
      @vars[name] = BasicVar.new(name, nil, :shared)
      return @vars[name]
    end

    if ovar.alloc == :local
      ovar.alloc = :shared
    end

    return ovar
  end

  def declare_global(name, ntype)
    ovar = @vars[name]

    if ovar.nil?
      @vars[name] = BasicVar.new(name, ntype, :global)
      return @vars[name]
    end

    if !ovar.has_type? ntype
      raise ProgramError, "Type mismatch: #{name}.#{ntype} was declared #{ovar.alloc} #{name}.#{ovar.type}"
    end

    if ovar.alloc == :local or ovar.alloc == :shared
      ovar.alloc = :global
    end

    return ovar
  end

  def declare_global_list(name, elemtype)
    if !@lists[name].nil?
      raise ProgramError, "Redeclaration of linked list #{name}.#{elemtype}"
    end

    @lists[name] = LinkedList.new(name, elemtype, :global)
    return @lists[name]
  end

  def define_constant(name, value)
    if !(value.is_a?(String) || value.is_a?(Integer) || value.is_a?(Float))
      raise ProgramError, "Constant must be defined as simple value"
    end
    if @constants.has_key? name && @constants[name] != value
      raise ProgramError, "Redefinition of constant #{name}"
    end
    @constants[name] = value
  end

  def lookup_constant(name)
    if !@constants.has_key? name
      raise ProgramError, "Unknown constant ##{name}"
    end
    return @constants[name]
  end

  def type_defined?(name)
    @structures.has_key?(name) || simple_type?(name)
  end

  def define_structure(name, fields)
    if type_defined?(name)
      raise ProgramError, "Redefinition of type #{name}"
    end
    @structures[name] = fields
  end

  def structure_fields(name)
    @structures[name]
  end

  def declare_procedure(name, rtype, params)
    types = params.map { |p| p[1] || :l }
    defaults = params.map { |p| p[2] }
    # parameters with defaults must all be at the end of the param list
    # keep only those
    defaults.shift while !defaults.empty? && defaults[0].nil?
    if defaults.any? { |d| d.nil? }
      raise ProgramError, "Procedure #{name} has non-default parameter after default parameter"
    end
    if @procedures.has_key?(name)
      if @procedures[name][0] != rtype
        raise ProgramError, "Redeclaration of procedure #{name} with different return type"
      end
      if @procedures[name][1] != types
        raise ProgramError, "Redeclaration of procedure #{name} with different parameters"
      end
      if @procedures[name][2] != defaults
        raise ProgramError, "Redeclaration of procedure #{name} with different parameter defaults"
      end
    else
      @procedures[name] = [rtype, types, defaults, nil]
    end
  end

  def use_builtin(cname)
    if @builtins_used.add? cname
      BF[cname]["params"].map! { |p| p == :"()" ? ListType.new(nil) : p }
      BF[cname]["params"].map! { |p| p == :"*" ? PointerType.new(nil) : p }
      BF[cname]["rtype"] = PointerType.new(nil) if BF[cname]["rtype"] == :"*"
    end
  end

  def procedure_value_used(name)
    @procedure_value_used.add(name)
  end

  def lookup_procedure(name)
    if @procedures.has_key? name
      return @procedures[name][0..2]  # rtype, params, default param values
    end

    cname = name.to_s.downcase.to_sym
    if BF.has_key? cname
      use_builtin(cname)
      return [BF[cname]["rtype"], BF[cname]["params"], BF[cname]["defaults"]]
    else
      raise ProgramError, "Procedure #{name} not declared"
    end
  end

  def add_procedure(name, p)
    if !@procedures.has_key?(name)
      raise RuntimeError, "Trying to add unknown procedure #{name}"
    end
    @procedures[name][3] = p
  end

  def declare_array(name, ntype, dimensions)
    otype, olddim = @arrays[name]
    if otype
      if ntype && otype != ntype
        raise ProgramError, "Type mismatch: array #{name}.#{ntype} was declared #{name}.#{otype}"
      end
      if olddim != dimensions
        raise ProgramError, "Array #{name} redeclared with different number of dimensions"
      end
    else
      ntype = :l if ntype.nil?
      @arrays[name] = [ntype, dimensions]
    end
  end

  def array_declared?(name)
    @arrays.has_key?(name)
  end

  def array_type(name)
    return nil if @arrays[name].nil?
    @arrays[name][0]
  end

  def array_dimensions(name)
    return nil if @arrays[name].nil?
    @arrays[name][1]
  end

  def declare_label(name, scope)
    if @labels.has_key? name
      raise ProgramError, "redeclaration of label #{name}:"
    end
    @labels[name] = scope
  end

  def label_scope(name)
    @labels[name]
  end

  def add_statement(stmt)
    if (stmt[0] == :return)
      raise ProgramError, "Procreturn outside procedure"
    end
    super
  end

  def globals
    @vars.values.select { |v| v.alloc == :global }
  end

  def global_lists
    @lists.values.select { |l| l.alloc == :global }
  end

  def declare_data(dtype, data)
    @data << [dtype, data]
  end

  # Make it easier to do scope.program regardless of scope
  def program
    self
  end

  # Make it so callers can do scope.name
  def name
    "main program"
  end

end

class Procedure < Scope
  attr_reader :rtype, :name, :program

  def initialize(program, name, rtype, params)
    super()
    @program = program
    @name = name
    @rtype = rtype
    @params = params.map { |p| pname, ptype = p; [pname, ptype || :l] }

    @program.globals.each { |v| import_var(v) }
    @program.global_lists.each { |l| import_list(l) }
    @params.each { |p| pname, ptype = p; declare_param(pname, ptype) }
  end

  def <=>(y)
    self.name.to_s <=> y.name.to_s
  end

  def declare_static(name, ntype)
    ovar = @vars[name]

    # allow shadowing of global vars because they were auto-imported
    # and will be visible in the local scope even if they haven't been
    # used yet.
    if ovar.nil? or ovar.alloc == :global
      @vars[name] = BasicVar.new(name, ntype, :static)
      return @vars[name]
    end

    if ovar.alloc == :local or ovar.alloc == :param or ovar.alloc == :shared
      raise ProgramError, "#{name} was previously declared as #{ovar.alloc}"
    end

    if !ovar.has_type? ntype
      raise ProgramError, "Type mismatch: #{name}.#{ntype} was previously declared as #{name}.#{ovar.type}"
    end

    return ovar
  end

  def declare_param(name, ntype)
    if ntype.is_a? ListType
      newlist = declare_list(name, ntype.basetype)
      newlist.alloc = :param
      return newlist
    end

    ovar = @vars[name]

    if !ovar.nil? and ovar.alloc == :param
      raise ProgramError, "Duplicate parameter #{name}"
    end

    @vars[name] = BasicVar.new(name, ntype, :param)
  end

  def declare_list(name, elemtype)
    if !@lists[name].nil?
      raise ProgramError, "Redeclaration of linked list #{name}.#{elemtype}"
    end

    @lists[name] = LinkedList.new(name, elemtype, :local)
    return @lists[name]
  end

end
..end elice.y modeval..id16081ba63b
class Hash

  def sorted_symbols
    self.keys.map{ |s| s.to_s }.sort.map{ |s| s.to_sym }
  end

end

class Set

  def sorted_symbols
    self.map{ |s| s.to_s }.sort.map{ |s| s.to_sym }
  end

end

def with_tempfile(suffix, &block)
  require 'fcntl'
  dir = ENV['TMPDIR'] || '/tmp'
  charset = "ABCDEFGHIJKLMNOPQRZTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
  flags = Fcntl::O_RDWR | Fcntl::O_CREAT | Fcntl::O_EXCL
  10.times do |i|
    letters = Array.new(8) { charset[rand(charset.length), 1] }
    pathname = dir + "/el" + letters.join + "." + suffix

    begin
      fd = IO.sysopen(pathname, flags, 0600)
    rescue Errno::EEXIST
      dir = '/tmp' if i >= 5
      continue
    end

    begin
      # The block expects to be able to do file.path on its argument
      # IO doesn't remember the path, so open it as a File.
      # There's no race condition here because the file already exists
      # and nobody else can write to it.
      IO.open(fd).close
      retval = File.open(pathname, "w+", &block)
    ensure
      begin
        File.unlink(pathname)
      rescue
      end
    end

    return retval
  end
  raise IOError, "could not create temporary file"
end

def show_cmdline(cmdline)
  cmdline = cmdline.map do |word|
    if word.match(/^[a-zA-Z.\/+\-_0-9]+$/)
      word
    else
      word.inspect
    end
  end
  cmdline.join(" ")
end
self.class.module_eval <<'ENDRUBY', 'warn.rb', 2

class Program

  # Return Procedure object, or nil if procedure is builtin or not defined
  def get_defined_procedure(name)
    return nil if @procedures[name].nil?
    return @procedures[name][3]
  end

  def warn_unused_procs
    used = Set.new(self.procs_used)
    working = used.to_a
    until working.empty?
      proc = get_defined_procedure(working.pop)
      next if proc.nil?
      new_used = proc.procs_used - used
      working.concat(new_used.to_a)
      used.merge(new_used)
    end

    self.proclist.each do |p|
       proc = p[3]
       if proc && !used.include?(proc.name)
         $stderr.puts("warning: procedure #{proc.name} not used")
       end
    end
  end

  def warn_procedure_return
    @procedure_value_used.sorted_symbols.each do |name|
      proc = get_defined_procedure(name)
      next if proc.nil?
      unless proc.always_returns_value
        $stderr.puts("warning: procedure #{proc.name} might exit without ProcedureReturn")
      end
    end
  end

end

class Procedure

  def always_returns_value
    return code_always_returns_value(@code)
  end

  def code_always_returns_value(code)
    return false if code.empty?
    case code.last[0]
    when :return, :goto, :end
      return true
    # If and Select: check all branches
    when :if
      return (code_always_returns_value(code.last[2]) &&
              code_always_returns_value(code.last[3]))
    when :select
      has_default = false
      code.last[2..-1].each do |branch|
        if branch[0] == :default
          has_default = true
          return false unless code_always_returns_value(branch[1..-1])
        else
          return false unless code_always_returns_value(branch[2..-1])
        end
        return false unless has_default
        return true
      end
    # Loops: infinite loops either don't return or use ProcedureReturn
    when :while
      return code.last[1].constant? && code.last[1] == 0
    when :repeat
      return code.last[1].constant? && code.last[1] != 0

    else
      return false
    end
  end

end

ENDRUBY
self.class.module_eval <<'ENDRUBY', 'emit.rb', 2

class Symbol

  def c_type
    return "int8_t" if self == :b
    return "uint8_t" if self == :c
    return "int16_t" if self == :w
    return "int32_t" if self == :l
    return "float" if self == :f
    return "std::string" if self == :s
    return "struct st_#{self}"
  end

  alias_method :c_param_type, :c_type

  def c_initializer
    return "0" if integer_type? self
    return "0.0" if self == :f
    return '""' if self == :s
    return "st_#{self}()"
  end

  def c_id(prefix)
    s = self.to_s
    if s.chomp! '$'
      prefix += "s"
    end
    if s[0..0] == '*'
      prefix += "p"
      s = s[1...s.length]
    end
    return "#{prefix}_#{s}"
  end

end

class NilClass

  def c_type
    return "void"
  end

end

class ListType

  def c_type
    return "LinkedList" if @basetype.nil?
    return "TypedList<#{@basetype.c_type}>"
  end

  def c_param_type
    return "#{c_type}&"
  end

end

class PointerType

  # Pointers are always represented as char *, because pointer
  # addition is defined in terms of bytes and in any case the
  # source laguage plays fast and loose with pointer types.
  # They are cast to the appropriate type when dereferenced.
  def c_type
    "char *"
  end

  alias_method :c_param_type, :c_type

  def c_initializer
    "0"
  end

end

def c_constructor?(type)
  return !integer_type?(type) && type != :f && !type.is_a?(PointerType)
end

class Integer

  def c_expr; self.to_s; end

end

class String

  def c_expr; self.inspect; end

end

class Float

  def c_expr; self.to_s; end

end

class BasicVar

  def c_name
    case @alloc
    when :global, :shared then @name.c_id("g")
    when :param, :local, :static then @name.c_id("v")
    end
  end

  def c_def
    return "#{@type.c_type} #{c_name}"
  end

  def c_expr
    c_name
  end

end

class VarAddress

  def c_expr
    if @var.type == :s
      return "(char *) #{@var.c_name}.data()"
    else
      return "(char *) &#{@var.c_name}"
    end
  end

end

class SizeOf

  def c_expr
    "(int32_t) sizeof(st_#{@name})"
  end

end

class OffsetOf

  def c_expr
    "OFFSETOF(st_#{@name}, #{@field.c_name})"
  end

end

class LinkedList

  def c_name
    @name.c_id("ll")
  end

  def c_def
    return "#{@type.c_type} #{c_name}"
  end

  def c_expr
    c_name
  end

end

class ListCurrent

  def c_expr
    "LIST_CURRENT(#{@list.c_name},#{@type.c_type})"
  end

end

class ListAddress

  def c_expr
    "(char *) (#{@list.c_name}.current ? #{@list.c_name}.current + 1 : 0)"
  end

end

class Truncate

  def c_expr
    "(int32_t)(#{@expr.c_expr})"
  end

end

class NotNull

  def c_expr
    "(#{@expr.c_expr} != 0)"
  end

end

class FieldRef

  def c_expr
    base = @base.c_expr
    sep = "."
    if @base.expr_type.is_a? PointerType
      sep = "->"
      type = @base.expr_type.basetype.c_type
      base = "((#{type} *) #{base})"
    end
    return "#{base}#{sep}#{@field.c_name}[#{@index.c_expr}]" if @index
    return "#{base}#{sep}#{@field.c_name}"
  end

end

class ArrayIndex

  def c_expr
    i = @indices.map { |i| i.c_expr }.join(", ")
    return "#{@name.c_id("a")}(\"#{@location}\", #{i})"
  end

end

class ProcedureCall

  def c_expr
    args = @args.map { |a| a.c_expr }.join(", ")
    "p_#{@name}(#{args})"
  end

end

class NotCondition

  def c_expr
    "!#{@expr.c_expr}"
  end

end

class BinaryOp

  def c_op
    case @op
    when :"=" then :"=="
    when :"<>" then :"!="
    when :and then :"&&"
    when :or then :"||"
    when :"!" then :"^"
    else @op
    end
  end

  def c_expr
    # There is one case where automatic promotion to float does not
    # happen naturally in C. An expression like x.i / y.i, evaluated
    # in float context, needs to use a floating-point division.
    # Use a cast to make sure it isn't done as an integer division.
    # (Similar logic applies to all binary arithmetic. Integer addition
    # might overflow where floating point addition would not, etc.)
    if expr_type == :f && !(@x.expr_type == :f || @y.expr_type == :f)
      return "((float) #{@x.c_expr} #{c_op} #{@y.c_expr})"
    end
    return "(#{@x.c_expr} #{c_op} #{@y.c_expr})"
  end

end

class FieldSpec

  def c_name
    @name.c_id("f")
  end

  def c_def
    if @size
      return "#{@type.c_type} #{c_name}[#{@size}]"
    else
      return "#{@type.c_type} #{c_name}"
    end
  end

end

def c_statement(stmt, scope, indent)
  case stmt[0]
  when :dim   # array sizing, [:dim, arrayname, sizes...]
    name = stmt[1].c_id("a")
    sizes = stmt[2...stmt.size].map { |sz| sz.c_expr }.join(", ")
    return "#{indent}#{name}.dim(\"#{stmt[1]}\", #{sizes});\n"
  when :"="   # assignment,   [:"=", lvalue, expr]
    lvalue = stmt[1].c_expr
    expr =  stmt[2].c_expr
    if stmt[2].expr_type == :"*" && stmt[1].expr_type != :"*"
      # Suppress warnings about casting pointer to int.
      # At some point this will need a proper fix that supports old 32-bit code
      # Fortunately the current code never tries to cast back to pointers
      return "#{indent}#{lvalue} = (int64_t) #{expr};\n"
    else
      return "#{indent}#{lvalue} = #{expr};\n"
    end
  when :"+"   # increment,   [:"+", lvalue, expr]
    lvalue = stmt[1].c_expr
    expr =  stmt[2].c_expr
    return "#{indent}#{lvalue} += #{expr};\n"
  when :"-"   # decrement,   [:"-", lvalue, expr]
    lvalue = stmt[1].c_expr
    expr =  stmt[2].c_expr
    return "#{indent}#{lvalue} -= #{expr};\n"
  when :return   # [:return, expr]
    return "#{indent}return #{stmt[1].c_expr};\n"
  when :call     # [:call, expr]
    return "#{indent}#{stmt[1].c_expr};\n"
  when :repeat   # [:repeat, cond, statement...]
    cond = stmt[1].c_expr
    body = stmt[2...stmt.size].map do |s|
      c_statement(s, scope, indent + "\t")
    end
    return "#{indent}do {\n#{body}#{indent}} while (!#{cond});\n"
  when :while    # while,    [:while, cond, statement...]
    cond = stmt[1].c_expr
    body = stmt[2...stmt.size].map do |s|
      c_statement(s, scope, indent + "\t")
    end
    return "#{indent}while (#{cond}) {\n#{body}#{indent}}\n"
  when :for
    # [:for, var, expr (start), expr (stop), Integer (step), statement...]
    var = stmt[1].c_expr
    init = stmt[2].c_expr
    stop = stmt[3].c_expr
    step = stmt[4]
    body = stmt[5...stmt.size].map do |s|
      c_statement(s, scope, indent + "\t")
    end
    if step >= 0
      return "#{indent}for (#{var} = #{init}; #{var} <= #{stop}; #{var} += #{step}) {\n#{body}#{indent}}\n"
    else
      return "#{indent}for (#{var} = #{init}; #{var} >= #{stop}; #{var} -= #{-step}) {\n#{body}#{indent}}\n"
    end
  when :foreach  # [:foreach, list, statement...]
    list = stmt[1].c_expr
    body = stmt[2...stmt.size].map do |s|
      c_statement(s, scope, indent + "\t")
    end
    return "#{indent}p_resetlist(#{list});\n#{indent}while (p_nextelement(#{list})) {\n#{body}#{indent}}\n"
  when :if       # [:if, cond, [statement...], [statement...]]
    cond = stmt[1].c_expr
    thenpart = stmt[2].map do |s|
      c_statement(s, scope, indent + "\t")
    end
    if stmt[3].empty?
      return "#{indent}if (#{cond}) {\n#{thenpart}#{indent}}\n"
    else
      elsepart = stmt[3].map do |s|
        c_statement(s, scope, indent + "\t")
      end
      return "#{indent}if (#{cond}) {\n#{thenpart}#{indent}} else {\n#{elsepart}#{indent}}\n"
    end
  when :select   # [:select, expr, [:case, expr, statement...]...]
    if stmt[1].expr_type == :s
      expr = stmt[1].c_expr
      cases = stmt[2...stmt.size].map do |c|
        if c[0] == :case
          w = c[1].c_expr
          body = c[2...c.size].map do |s|
            c_statement(s, scope, indent + "\t")
          end
          "if (#{expr} == #{w}) {\n#{body}#{indent}} else "
        else  # [:default, statement...]
          body = c[1...c.size].map do |s|
            c_statement(s, scope, indent + "\t")
          end
          "#{indent}if (1) {\n#{body}\n#{indent}} else "
        end
      end
      return "#{indent}#{cases}{}\n"
    else
      cases = stmt[2...stmt.size].map do |c|
        if c[0] == :case
          w = c[1].c_expr
          body = c[2...c.size].map do |s|
            c_statement(s, scope, indent + "\t")
          end
          "#{indent}case #{w}:\n#{body}#{indent}\tbreak;\n"
        else  # [:default, statement...]
          body = c[1...c.size].map do |s|
            c_statement(s, scope, indent + "\t")
          end
          "#{indent}default:\n#{body}\n#{indent}\tbreak;\n"
        end
      end
      expr = stmt[1].c_expr
      return "#{indent}switch (#{expr}) {\n#{cases}#{indent}}\n"
    end
  when :break    # break from current loop, [:break]
    return "#{indent}break;\n";
  when :continue  # skip to next loop iteration, [:continue]
    return "#{indent}continue;\n";
  when :end      # exit program, [:end, exitcode]
    return "#{indent}exit(#{stmt[1].c_expr});\n"
  when :goto
    # NOTE: fully general use of goto is not supported.
    # The target label must either be in the same scope (either within
    # the same procedure, or from the main program to another part of
    # the main program), or from a procedure to the main program.
    # The former case is translated straight to the C goto/label construct.
    # The latter case is handled by throwing an exception to the main
    # program, which then does the goto from there.
    if scope.program.label_scope(stmt[1]) == scope
      return "#{indent}goto L_#{stmt[1]};\n"
    else
      return "#{indent}throw Lv_#{stmt[1]};\n"
    end
  when :label
    return "L_#{stmt[1]}: ;\n"
  when :read    # read from data section, [:read, lvalue]
    t = stmt[1].expr_type
    pos = "data_#{t}_pos"
    max = "DATA_#{t.to_s.upcase}_MAX"
    return "#{indent}#{stmt[1].c_expr} = #{pos} > #{max} ? #{t.c_initializer} : data_#{t}[#{pos}++];\n"
  end
  raise RuntimeError, "Unknown statement type #{stmt[0].inspect}"
end

class Program

  # Generate list of defined procedures, ordered by name
  def proclist
    # It's okay for procedures to be declared without being defined,
    # as long as they're never actually called. So p[3] can be nil.
    @procedures.values.reject { |p| p[3].nil? }.sort! { |x,y| x[3] <=> y[3] }
  end

  def c_structure(f, name, fields)
    # Define the structure as a C++ struct with a default constructor that
    # initializes all fields.
    f.print "struct st_#{name} {\n"
    fields.each { |field| f.print "\t#{field.c_def};\n" }
    init = fields.map { |field| "#{field.c_name}()" }.join(", ")
    f.print "\tst_#{name}() : #{init} {};\n"
    f.print "};\n"
  end

  # Emit constants from the DataSection
  def c_data(f)
    datatypes = [:b, :c, :w, :l, :s, :f]
    datatypes.each do |t|
      tdata = @data.select { |d| d[0] == t }
      unless tdata.empty?
        type = t.c_type
        # These are constant strings, no need for std::string overhead
        type = "char *" if t == :s
        decl = "static const #{type} data_#{t}[#{tdata.length}]"
        init = tdata.map { |d| d[1].c_expr }.join(", ")
        f.print "#{decl} = {#{init}};\n"
        f.print "static size_t data_#{t}_pos;\n"
        f.print "static const size_t DATA_#{t.to_s.upcase}_MAX = #{tdata.length-1};\n"
        f.print "\n"
      end
    end
  end

  def c_builtin_proto(f, name)
    rtype = BF[name]["rtype"]
    p = BF[name]["params"].map{ |p| p.c_param_type }.join(", ")
    f.print "static #{rtype.c_type} p_#{name}(#{p});\n"
  end

  def c_builtin(f, name)
    rtype = BF[name]["rtype"]
    params = BF[name]["params"]
    p = (0...params.size).map { |i| "#{params[i].c_param_type} p#{i+1}" }.join(", ")
    f.print "static #{rtype.c_type} p_#{name}(#{p}) {\n"
    if BF[name]["code"]
      #f.print "\tfprintf(stdout, \"entering p_#{name}\\n\");\n" # trace
      f.print BF[name]["code"]
    else
      f.print "\tfprintf(stderr, \"%s\", \"#{name} not implemented.\\n\");\n"
      f.print "\texit(1);"
    end
    f.print "\n}\n\n"
  end

  def c_include(f, name)
    return if @includes_printed.include? name
    f.puts "#include <#{name}>\n"
    @includes_printed << name
  end

  def c_fragment(f, name)
    return if @fragments_printed.include? name
    # Add this first, to break dependency loops
    @fragments_printed << name
    if FRAGMENTS[name]["fragments"]
      FRAGMENTS[name]["fragments"].each { |fr| c_fragment(f, fr) }
    end
    FRAGMENTS[name]["includes"].each { |inc| c_include(f, inc) }
    f.puts FRAGMENTS[name]["code"]
  end

  def c_program(f)
    @fragments_printed = Set[]

    # Emit things in alphabetical order to make it easier to debug
    # small changes to the compiler; it makes the output easier to diff.

    @includes_printed = Set[]
    c_include(f, "stdint.h")   # for int32_t and such
    c_include(f, "stdlib.h")   # for exit()
    c_include(f, "stdio.h")    # for fprintf in unimplemented funcs
    c_include(f, "string")     # for std::string
    f.print "\n"

    c_fragment(f, :arrays)
    c_fragment(f, :listdecl)
    c_fragment(f, :offsetof)

    @mainlabels = @labels.sorted_symbols.select { |n| @labels[n] == self }

    unless @mainlabels.empty?
      labels = @mainlabels.map { |l| "Lv_#{l}" }.join(", ")
      f.print "enum label { NOLABEL, #{labels}};\n";
    end

    @structures.sorted_symbols.each do |name|
      c_structure(f, name, @structures[name])
    end

    @arrays.sorted_symbols.each do |name|
      type, dims = @arrays[name]
      f.print "static Array<#{type.c_type}> #{name.c_id("a")};\n"
    end
    f.print "\n"

    c_data(f) unless @data.empty?

    @lists.values.sort.each { |l| f.print "static #{l.c_def};\n" }
    f.print "\n"

    @vars.values.sort.each { |v| f.print "static #{v.c_def};\n" }
    f.print "\n"

    @builtins_used.sorted_symbols.each do |name|
      c_builtin_proto(f, name);
    end

    @builtins_used.sorted_symbols.each do |name|
      if BF[name]["fragments"]
        BF[name]["fragments"].each { |fr| c_fragment(f, fr) } 
      end
      BF[name]["includes"].each { |inc| c_include(f, inc) }
    end
    f.print "\n"

    @builtins_used.sorted_symbols.each { |name| c_builtin(f, name) }

    self.proclist.each { |p| p[3].c_proto(f) }
    f.print "\n"
    self.proclist.each { |p| p[3].c_proc(f) }

    f.print "int main() {\n"

    unless @mainlabels.empty?
      f.print "\tenum label gotolabel = NOLABEL;\n"
    end

    @fragments_printed.sorted_symbols.each do |name|
      if FRAGMENTS[name]["initialize"]
        f.print("\t" + FRAGMENTS[name]["initialize"] + "\n")
      end
    end

    @builtins_used.sorted_symbols.each do |name|
      f.print(BF[name]["initialize"]) if BF[name]["initialize"]
    end

    indent = "\t"
    unless @mainlabels.empty?
      f.print "\tDISPATCH: try {\n"
      f.print "\t\tswitch (gotolabel) {\n"
      f.print "\t\tcase NOLABEL: break;\n"
      @mainlabels.each do |l|
        f.print "\t\tcase Lv_#{l}: goto L_#{l};\n"
      end
      f.print "\t\t}\n";
      indent = "\t\t"
    end

    @code.each do |c|
      s = c_statement(c, self, indent)
      f.print(s) if s
    end

    unless @mainlabels.empty?
      f.print "\t} catch (enum label l) {\n"
      f.print "\t\tgotolabel = l;\n"
      f.print "\t\tgoto DISPATCH;\n"
      f.print "\t};\n"
    end

    f.print "\treturn 0;\n}\n\n"
  end

  def includepaths_needed
    paths = Set[]
    @includes_printed.each do |header|
      if HEADERINFO.has_key?(header) && HEADERINFO[header].has_key?("path")
        paths << HEADERINFO[header]["path"]
      end
    end
    return paths
  end

  def libs_needed
    libs = Set[]
    @includes_printed.each do |header|
      if HEADERINFO.has_key?(header) && HEADERINFO[header].has_key?("lib")
        libs << HEADERINFO[header]["lib"]
      end
    end
    return libs
  end

end

class Procedure < Scope

  def c_proto(f)
    p = @params.map{ |p| p[1].c_param_type }.join(", ")
    f.print "static #{@rtype.c_type} p_#{name}(#{p});\n"
  end

  def c_proc(f)
    p = @params.map { |p| "#{p[1].c_param_type} #{lookup_name(p[0]).c_name}" }.join(", ")
    f.print "static #{@rtype.c_type} p_#{@name}(#{p}) {\n"
    @vars.values.sort.each do |v|
      case v.alloc
      when :local
        init = c_constructor?(v.type) ? "" : " = #{v.type.c_initializer}"
        f.print "\t#{v.c_def}#{init};\n"
      when :static
        f.print "\tstatic #{v.c_def};\n"
      # Nothing for :param
      end
    end

    @lists.values.sort.each do |l|
      if l.alloc == :local
        f.print "\t#{l.c_def};\n"
      end
    end

    #f.print "\tfprintf(stdout, \"entering p_#{@name}\\n\");\n" # trace

    @code.each do |c|
      s = c_statement(c, self, "\t")
      f.print(s) if s
    end

    f.print "\treturn 0;\n" if @type
    f.print "}\n\n"
  end

end

ENDRUBY
self.class.module_eval <<'ENDRUBY', 'main.rb', 2

# Copyright 2008 Richard Braakman <eligo@clueonic.net>
# See the COPYING file for details.

if ARGV.length == 0
  puts "Usage: ruby #{$0} filename.pb"
  exit 2
end

# Make p global to for emit_warning
$p = Parser.new
r = Program.new

def emit_warning(txt)
  $stderr.puts("#{$p.parse_stack[0]} #{txt}")
end

$p.parse_file("prelude", r, <<-ENDPRELUDE)

#PB_Compiler_OS = "Linux"
#PB_OS_Windows = "Windows"
#PB_OS_Linux = "Linux"

; The PB_Key values are chosen to match the SDL ones, which were
; mostly chosen to match ASCII values.
#PB_Key_1 = 49
#PB_Key_2 = 50
#PB_Key_3 = 51
#PB_Key_4 = 52
#PB_Key_5 = 53
#PB_Key_6 = 54
#PB_Key_7 = 55
#PB_Key_8 = 56
#PB_Key_9 = 57
#PB_Key_0 = 48

#PB_Key_A = 97
#PB_Key_B = 98
#PB_Key_C = 99
#PB_Key_D = 100
#PB_Key_E = 101
#PB_Key_F = 102
#PB_Key_G = 103
#PB_Key_H = 104
#PB_Key_I = 105
#PB_Key_J = 106
#PB_Key_K = 107
#PB_Key_L = 108
#PB_Key_M = 109
#PB_Key_N = 110
#PB_Key_O = 111
#PB_Key_P = 112
#PB_Key_Q = 113
#PB_Key_R = 114
#PB_Key_S = 115
#PB_Key_T = 116
#PB_Key_U = 117
#PB_Key_V = 118
#PB_Key_W = 119
#PB_Key_X = 120
#PB_Key_Y = 121
#PB_Key_Z = 122

#PB_Key_Escape = 27
#PB_Key_Minus = 45
#PB_Key_Back = 8
#PB_Key_Return = 13
#PB_Key_LeftShift = 304
#PB_Key_RightShift = 303
#PB_Key_LeftControl = 306
#PB_Key_RightControl = 305
#PB_Key_Space = 32
#PB_Key_Capital = 301
#PB_Key_F1 = 282
#PB_Key_F2 = 283
#PB_Key_F3 = 284
#PB_Key_F4 = 285
#PB_Key_F5 = 286
#PB_Key_F6 = 287
#PB_Key_F7 = 288
#PB_Key_F8 = 289
#PB_Key_F9 = 290
#PB_Key_F10 = 291
#PB_Key_F11 = 292
#PB_Key_F12 = 293
#PB_Key_Up = 273
#PB_Key_Down = 274
#PB_Key_Left = 276
#PB_Key_Right = 275
#PB_Key_Delete = 127
#PB_Key_PageUp = 280
#PB_Key_PageDown = 281
#PB_Key_Pad0 = 256
#PB_Key_Pad1 = 257
#PB_Key_Pad2 = 258
#PB_Key_Pad3 = 259
#PB_Key_Pad4 = 260
#PB_Key_Pad5 = 261
#PB_Key_Pad6 = 262
#PB_Key_Pad7 = 263
#PB_Key_Pad8 = 264
#PB_Key_Pad9 = 265
#PB_Key_Add = 270
#PB_Key_Subtract = 269
#PB_Key_PadEnter = 271

#PB_Event_CloseWindow = 1

#PB_2DDrawing_Transparent = 1

; Not sure what the PureBasic convention is, actually
#True = 1
#False = 0

; Used for Round()
#PB_Round_Down = 0
#PB_Round_Up = 1
#PB_Round_Nearest = 2

; Used for Sort functions
Enumeration
  #PB_Sort_Byte
  #PB_Sort_Word
  #PB_Sort_Long
  #PB_Sort_String
  #PB_Sort_Float
  #PB_Sort_Double
  #PB_Sort_Quad
  #PB_Sort_Character
EndEnumeration

ENDPRELUDE

class Options
  attr_accessor :sources, :passthrough
  attr_writer :outfilename
  attr_writer :savetemps, :verbose

  def initialize
    @sources = []
    @passthrough = []
  end

  def outfilename
    return @outfilename if @outfilename
    return @sources[0].sub(/\.[^.]*$/, '')   # strip suffix
  end

  def with_ccfile(&block)
    if @savetemps
      # g++ puts its temp files in the current directory, regardless
      # of where the source or object files are. Match its behavior.
      filename = outfilename.sub(/.*\//, '')   # keep basename
      File.open(filename + ".cc", "w", &block)
    else
      with_tempfile("cc", &block)
    end
  end

  def verbose?
    @verbose
  end

end

def parse_commandline(opts, args)
  args = args.clone  # avoid destroying caller's array
  while !args.empty?
    arg = args.shift
    case arg
    when "--"
      opts.sources += args
      return 
    when "-o"
      opts.outfilename = args.shift
    when "-save-temps"
      opts.savetemps = true
      opts.passthrough << arg
    when "-v"
      opts.verbose = true
      opts.passthrough << arg
    when /^-/  # Pass unknown options to C++ compiler
      opts.passthrough << arg
    else
      opts.sources << arg
    end
  end
end

$opts = Options.new
parse_commandline($opts, ARGV)

if $opts.sources.empty?
  $stderr.puts "elice: no input files"
  exit 1
end

$opts.sources.each { |source| $p.parse_file(source, r, File.read(source)) }
r.warn_unused_procs
r.warn_procedure_return

status = $opts.with_ccfile do |ccfile|
  r.c_program(ccfile)
  ccfile.close
  cmdline = ["g++"] + $opts.passthrough
  cmdline += r.includepaths_needed.map { |path| "-I#{path}" }
  cmdline += r.libs_needed.map { |lib| "-l#{lib}" }
  cmdline += [ ccfile.path, "-o", $opts.outfilename ]
  $stderr.puts(" " + show_cmdline(cmdline)) if $opts.verbose?
  system(*cmdline)
  code = $? >> 8
  if code != 0
    $stderr.puts("elice: error invoking g++")
    if code == 127
      # 127 is convention for program not found.
      $stderr.puts("perhaps g++ is not installed")
    end
    unless $opts.verbose?
      # show command line if wasn't shown already
      $stderr.puts("elice: g++ command line was:")
      $stderr.puts(" " + show_cmdline(cmdline))
    end
  end
  code  # block's return value
end

exit status

ENDRUBY
