diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,29 @@
+Copyright (c) 1999-2008 Manuel M T Chakravarty 
+												Duncan Coutts
+					              Benedikt Huber
+Portions Copyright (c)  1989,  1990  James  A.  Roskind
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+3. Neither the name of the author nor the names of his contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,5 @@
+#!/usr/bin/env runhaskell
+
+import Distribution.Simple
+
+main = defaultMain
diff --git a/dist/build/Language/C/Parser/Lexer.hs b/dist/build/Language/C/Parser/Lexer.hs
new file mode 100644
--- /dev/null
+++ b/dist/build/Language/C/Parser/Lexer.hs
@@ -0,0 +1,513 @@
+{-# OPTIONS -fglasgow-exts -cpp #-}
+{-# LINE 49 "src/Language/C/Parser/Lexer.x" #-}
+
+module Language.C.Parser.Lexer (lexC, parseError) where
+
+import Data.Char (isDigit)
+import Control.Monad (liftM)
+
+import Language.C.Data.InputStream
+import Language.C.Data.Position  (Position(..),posOf)
+import Language.C.Data.Ident    (mkIdent)
+
+import Language.C.Syntax.Constants
+
+import Language.C.Parser.Tokens
+import Language.C.Parser.ParserMonad
+
+#if __GLASGOW_HASKELL__ >= 603
+#include "ghcconfig.h"
+#else
+#include "config.h"
+#endif
+#if __GLASGOW_HASKELL__ >= 503
+import Data.Array
+import Data.Char (ord)
+import Data.Array.Base (unsafeAt)
+#else
+import Array
+import Char (ord)
+#endif
+#if __GLASGOW_HASKELL__ >= 503
+import GHC.Exts
+#else
+import GlaExts
+#endif
+alex_base :: AlexAddr
+alex_base = AlexA# "\xf8\xff\xff\xff\x6e\x00\x00\x00\x73\x00\x00\x00\x00\x00\x00\x00\x78\x00\x00\x00\x82\x00\x00\x00\x9c\x00\x00\x00\xb6\x00\x00\x00\xbf\x00\x00\x00\xd9\x00\x00\x00\xf3\x00\x00\x00\xfc\x00\x00\x00\x16\x01\x00\x00\x30\x01\x00\x00\x39\x01\x00\x00\x53\x01\x00\x00\x6d\x01\x00\x00\xbe\x01\x00\x00\x1e\x02\x00\x00\x7e\x02\x00\x00\xde\x02\x00\x00\x3e\x03\x00\x00\x9e\x03\x00\x00\xfc\x03\x00\x00\x45\x04\x00\x00\x00\x00\x00\x00\xfc\xff\xff\xff\xfd\xff\xff\xff\xa7\xff\xff\xff\x9c\xff\xff\xff\xa3\xff\xff\xff\xaa\xff\xff\xff\x9a\xff\xff\xff\x00\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x9b\xff\xff\xff\xa2\xff\xff\xff\xac\xff\xff\xff\xae\xff\xff\xff\x6b\x04\x00\x00\xc4\x04\x00\x00\x1b\x05\x00\x00\x00\x00\x00\x00\x62\x01\x00\x00\x68\x05\x00\x00\xae\x00\x00\x00\x5c\x01\x00\x00\x66\x01\x00\x00\xd3\x03\x00\x00\xeb\x03\x00\x00\xfa\x03\x00\x00\x56\x05\x00\x00\x08\x01\x00\x00\xec\xff\xff\xff\xa8\xff\xff\xff\xc7\xff\xff\xff\x32\x00\x00\x00\x48\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\xae\x05\x00\x00\xd4\x05\x00\x00\x5a\x05\x00\x00\x5e\x05\x00\x00\x80\x05\x00\x00\x84\x05\x00\x00\xa6\x05\x00\x00\xca\x05\x00\x00\xd8\x05\x00\x00\x09\x01\x00\x00\x55\x00\x00\x00\xa9\xff\xff\xff\xca\xff\xff\xff\x6f\x00\x00\x00\x8b\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x1e\x06\x00\x00\x64\x06\x00\x00\xf0\x05\x00\x00\x11\x06\x00\x00\x56\x06\x00\x00\x69\x06\x00\x00\x6e\x06\x00\x00\x8a\x06\x00\x00\x8f\x06\x00\x00\x5e\x01\x00\x00\x92\x00\x00\x00\xab\xff\xff\xff\x08\x00\x00\x00\xad\x00\x00\x00\xc8\x00\x00\x00\xac\x00\x00\x00\xd5\x06\x00\x00\xee\x06\x00\x00\xd6\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x07\x00\x00\x3a\x07\x00\x00\x17\x04\x00\x00\x4e\x07\x00\x00\x8e\x07\x00\x00\x9a\x05\x00\x00\xe7\x05\x00\x00\x14\x06\x00\x00\xd3\x07\x00\x00\x1c\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x07\x00\x00\xaf\x07\x00\x00\x51\x06\x00\x00\x33\x08\x00\x00\x79\x08\x00\x00\x65\x06\x00\x00\x94\x06\x00\x00\x96\x06\x00\x00\x91\x08\x00\x00\xda\x08\x00\x00\x00\x00\x00\x00\xee\x07\x00\x00\xf1\x08\x00\x00\x1f\x09\x00\x00\x27\x09\x00\x00\xa5\x06\x00\x00\xed\x06\x00\x00\x3b\x09\x00\x00\x7b\x09\x00\x00\x1e\x07\x00\x00\x4d\x07\x00\x00\x5b\x09\x00\x00\x9b\x09\x00\x00\x52\x07\x00\x00\xbb\x09\x00\x00\xd3\x09\x00\x00\xf2\x09\x00\x00\x3b\x0a\x00\x00\x52\x0a\x00\x00\x89\x0a\x00\x00\xd2\x0a\x00\x00\x00\x00\x00\x00\xa0\x0a\x00\x00\xe9\x0a\x00\x00\x17\x0b\x00\x00\x1f\x0b\x00\x00\x7f\x07\x00\x00\x80\x07\x00\x00\x33\x0b\x00\x00\x73\x0b\x00\x00\x8f\x07\x00\x00\x90\x07\x00\x00\x53\x0b\x00\x00\x93\x0b\x00\x00\xb0\x07\x00\x00\xb3\x0b\x00\x00\xcb\x0b\x00\x00\xea\x0b\x00\x00\x33\x0c\x00\x00\x4a\x0c\x00\x00\x81\x0c\x00\x00\xca\x0c\x00\x00\x00\x00\x00\x00\xec\x0c\x00\x00\x0e\x0d\x00\x00\x9e\x0c\x00\x00\x2f\x0d\x00\x00\x1b\x00\x00\x00\x01\x04\x00\x00\x60\x04\x00\x00\x4e\x0d\x00\x00\xb5\x06\x00\x00\x10\x05\x00\x00\x6f\x0d\x00\x00\xa8\x0a\x00\x00\x00\x00\x00\x00\x79\x0d\x00\x00\x1f\x00\x00\x00\x19\x04\x00\x00\x85\x0d\x00\x00\xc6\x0d\x00\x00\xec\x0d\x00\x00\x08\x0e\x00\x00\xe1\x0c\x00\x00\x00\x00\x00\x00\xc1\x07\x00\x00\x35\x08\x00\x00\x49\x04\x00\x00\x2a\x0e\x00\x00\x49\x0e\x00\x00\x5f\x0e\x00\x00\x67\x0e\x00\x00\xde\x05\x00\x00\x4c\x08\x00\x00\x95\x0e\x00\x00\xda\x0e\x00\x00\x7b\x08\x00\x00\xf2\x0e\x00\x00\x3b\x0f\x00\x00\x7b\x0e\x00\x00\x84\x0f\x00\x00\x00\x00\x00\x00\x1f\x08\x00\x00\x7d\x08\x00\x00\x20\x07\x00\x00\x52\x0f\x00\x00\x9d\x0f\x00\x00\xcb\x0f\x00\x00\xd3\x0f\x00\x00\xcb\x07\x00\x00\xac\x08\x00\x00\x01\x10\x00\x00\x46\x10\x00\x00\xd6\x08\x00\x00\x5e\x10\x00\x00\xa7\x10\x00\x00\xe7\x0f\x00\x00\xf0\x10\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x63\x00\x00\x00\x07\x11\x00\x00\x2d\x11\x00\x00\x44\x11\x00\x00\x6a\x11\x00\x00\x81\x11\x00\x00\xa7\x11\x00\x00\xbe\x11\x00\x00\xe4\x11\x00\x00\xfb\x11\x00\x00\x21\x12\x00\x00\x38\x12\x00\x00\x5e\x12\x00\x00\x00\x00\x00\x00\x66\x00\x00\x00\x3d\x09\x00\x00\x3f\x09\x00\x00\xec\x09\x00\x00\xee\x09\x00\x00\xbe\x10\x00\x00\xa3\x12\x00\x00\x33\x0a\x00\x00\xab\x12\x00\x00\xa2\x0a\x00\x00\xa4\x0a\x00\x00\x31\x08\x00\x00\xc2\x12\x00\x00\xf0\x12\x00\x00\x99\x08\x00\x00\xf8\x12\x00\x00\x10\x13\x00\x00\x59\x13\x00\x00\x70\x13\x00\x00\x96\x13\x00\x00\xad\x13\x00\x00\xd3\x13\x00\x00\xea\x13\x00\x00\x10\x14\x00\x00\x27\x14\x00\x00\x4d\x14\x00\x00\x64\x14\x00\x00\x8a\x14\x00\x00\xa1\x14\x00\x00\xc7\x14\x00\x00\xef\x14\x00\x00\x38\x15\x00\x00\x4f\x15\x00\x00\x75\x15\x00\x00\x8c\x15\x00\x00\xb2\x15\x00\x00\xc9\x15\x00\x00\xef\x15\x00\x00\x06\x16\x00\x00\x2c\x16\x00\x00\x43\x16\x00\x00\x69\x16\x00\x00\x80\x16\x00\x00\xa6\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x00\x00\x00\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\x00\x00\x00\x00\x54\x00\x00\x00\x58\x00\x00\x00\x59\x00\x00\x00\x9d\x00\x00\x00\x5a\x00\x00\x00\x8a\x00\x00\x00\x5c\x00\x00\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00"#
+
+alex_table :: AlexAddr
+alex_table = AlexA# "\x00\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x19\x00\x19\x00\x1a\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x21\x00\x21\x00\x22\x00\x24\x00\x25\x00\x26\x00\x2b\x00\x2b\x00\x3c\x00\x3c\x00\x4d\x00\x02\x00\x1f\x01\xbd\x00\x0f\x00\x28\x00\x26\x01\x27\x01\x6b\x00\x19\x01\x1a\x01\x24\x01\x22\x01\x41\x01\x1e\x01\xac\x00\x25\x01\x2c\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x36\x01\x42\x01\x29\x01\x2f\x01\x2b\x01\x35\x01\x38\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x29\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x1b\x01\x4d\x00\x1c\x01\x31\x01\x28\x00\x37\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x43\x01\x32\x01\x44\x01\x20\x01\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x08\x00\x03\x00\x2b\x00\xa5\x00\xa5\x00\xdd\x00\x2b\x00\xb2\x00\xb2\x00\xdd\x00\x08\x00\x03\x00\xec\x00\x02\x00\x23\x01\x30\x01\x39\x01\x45\x01\x02\x00\x3b\x00\x3a\x01\x3b\x01\x3f\x01\x08\x00\x40\x01\x11\x00\x2d\x01\x2a\x01\x2b\x00\x3b\x00\x38\x01\x1d\x01\x49\x00\x08\x00\x2b\x00\x11\x00\x09\x00\x03\x00\x2b\x00\x05\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x05\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x09\x00\x2b\x00\x11\x00\x09\x00\x03\x00\x48\x00\x2e\x01\x33\x01\x3c\x00\x3c\x00\x28\x01\x2c\x01\x08\x00\x03\x00\x21\x01\x3d\x01\x07\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x09\x00\x4c\x00\x11\x00\x00\x00\x3c\x01\x4c\x00\x37\x01\x00\x00\x5a\x00\x08\x00\x3c\x00\x11\x00\x09\x00\x03\x00\x3c\x00\x3c\x00\x07\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x09\x00\x30\x00\x11\x00\x0b\x00\x03\x00\x59\x00\x3e\x01\x3c\x00\x4d\x00\x4d\x00\x60\x00\x00\x00\x0b\x00\x03\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0b\x00\x5d\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x5d\x00\x2f\x00\x00\x00\x0b\x00\x4d\x00\x00\x00\x0e\x00\x03\x00\x4d\x00\x4d\x00\x60\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0e\x00\x00\x00\x00\x00\x0e\x00\x03\x00\x00\x00\x00\x00\x4d\x00\x34\x01\x00\x00\x00\x00\x00\x00\x0e\x00\x03\x00\x00\x00\x00\x00\x0d\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x3a\x00\x4b\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x10\x00\x36\x00\x47\x00\x00\x00\x0d\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x10\x00\x39\x00\x4a\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x47\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x10\x00\x00\x00\x00\x00\xa6\x00\x00\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\xad\x00\xad\x00\x00\x00\x00\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\xb0\x00\x60\x00\x00\x00\x5c\x00\x00\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x60\x00\x34\x00\x58\x00\x00\x00\x00\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x5e\x00\x60\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x2b\x00\x2b\x00\xb0\x00\x34\x00\x00\x00\x5b\x00\x35\x00\x35\x00\x00\x00\x31\x00\x2b\x00\x2b\x00\x60\x00\x60\x00\x58\x00\x00\x00\x00\x00\x27\x00\x2e\x00\x00\x00\x00\x00\x5f\x00\x60\x00\x00\x00\x20\x00\x12\x00\x12\x00\x0a\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x17\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x0a\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x17\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x0a\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x17\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x0a\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x17\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x0a\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x17\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x0a\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x17\x00\x12\x00\x12\x00\x12\x00\x12\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x60\x00\x00\x00\xff\xff\x60\x00\x12\x00\xff\xff\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x60\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x12\x00\x2b\x00\x2b\x00\x62\x00\x33\x00\x34\x00\x12\x00\x60\x00\x00\x00\x00\x00\x00\x00\x60\x00\xa5\x00\x34\x00\x00\x00\x00\x00\x60\x00\x00\x00\xa5\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\xff\xff\x2b\x00\x2b\x00\xff\xff\x60\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x12\x00\xb2\x00\x34\x00\x12\x00\x12\x00\x2b\x00\x2b\x00\xb2\x00\x60\x00\xa5\x00\x00\x00\x00\x00\x12\x00\xbb\x00\x00\x00\xa5\x00\x12\x00\x34\x00\x12\x00\x00\x00\x12\x00\x8b\x00\x18\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\xb2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x00\x00\x00\x00\x46\x01\x2a\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\xc8\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\xce\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\xa6\x00\x00\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\xad\x00\xad\x00\x60\x00\x00\x00\xff\xff\x00\x00\x41\x00\xff\xff\x00\x00\x00\x00\x60\x00\x60\x00\x00\x00\xb0\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x60\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x00\x00\x00\x2b\x00\x2b\x00\x61\x00\x60\x00\x3c\x00\x3c\x00\x00\x00\x40\x00\x3c\x00\x3c\x00\x00\x00\x45\x00\x60\x00\x45\x00\xb0\x00\x00\x00\x60\x00\x60\x00\x35\x00\x35\x00\x60\x00\x31\x00\x60\x00\x00\x00\x00\x00\x00\x00\x45\x00\x00\x00\x00\x00\xa6\x00\x2e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\xff\xff\x3c\x00\x3c\x00\xff\xff\x60\x00\x3c\x00\x3c\x00\x00\x00\x44\x00\xff\xff\x44\x00\xb0\x00\xff\xff\x60\x00\x8a\x00\x00\x00\x00\x00\x45\x00\x43\x00\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x00\x00\xa6\x00\x3f\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x63\x00\x3c\x00\x3c\x00\x00\x00\x60\x00\xb0\x00\x00\x00\x00\x00\x60\x00\x46\x00\x46\x00\xb0\x00\x42\x00\x45\x00\x00\x00\x00\x00\xff\xff\x45\x00\x43\x00\xff\xff\x00\x00\x3f\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x3c\x00\x00\x00\x60\x00\x00\x00\x00\x00\xb0\x00\xc8\x00\xff\xff\x52\x00\x46\x00\x46\x00\x45\x00\x42\x00\x3c\x00\x3c\x00\x8a\x00\x60\x00\x60\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x00\x00\x00\x00\x60\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x00\x00\x4d\x00\x4d\x00\xff\xff\x51\x00\x60\x00\xff\xff\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x60\x00\x60\x00\x00\x00\x00\x00\x00\x00\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x6c\x00\x00\x00\xff\xff\x50\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x00\x00\x00\x4d\x00\x4d\x00\x00\x00\x56\x00\x00\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x00\x00\x60\x00\x57\x00\x57\x00\x00\x00\x53\x00\x00\x00\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\x00\x50\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\xff\xff\x00\x00\xff\xff\xff\xff\x56\x00\xff\xff\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x60\x00\x00\x00\xa0\x00\x00\x00\xff\xff\x54\x00\x00\x00\xff\xff\x00\x00\xb9\x00\x60\x00\x00\x00\x00\x00\x00\x00\x50\x00\x55\x00\x70\x00\x00\x00\xff\xff\x56\x00\x4d\x00\x4d\x00\x9f\x00\x60\x00\x56\x00\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x60\x00\x7b\x00\x57\x00\x57\x00\x00\x00\x53\x00\x00\x00\x4d\x00\x4d\x00\xb9\x00\x55\x00\x60\x00\x4d\x00\x4d\x00\x50\x00\x60\x00\x60\x00\x00\x00\x00\x00\x56\x00\x56\x00\xaf\x00\x00\x00\xaf\x00\x56\x00\x60\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\x00\x00\x9f\x00\x00\x00\x79\x00\x4d\x00\x4d\x00\x00\x00\x60\x00\xff\xff\x4d\x00\x4d\x00\xff\xff\x60\x00\x00\x00\x00\x00\x00\x00\x56\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x60\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\x00\x00\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\xb8\x00\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x00\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\x4e\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xcc\x00\x00\x00\xff\xff\x7b\x00\x00\x00\xff\xff\x00\x00\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x00\x00\x00\x00\xff\xff\xff\xff\x61\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x62\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x00\x00\x00\x00\x7b\x00\x62\x00\x00\x00\x00\x00\xff\xff\x7b\x00\x8e\x00\xff\xff\xd9\x00\x00\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\x8a\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x6e\x00\x8b\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x90\x00\x90\x00\x00\x00\x8e\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x61\x00\x90\x00\x90\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x00\x00\x00\x00\x9f\x00\xff\xff\x00\x00\x00\x00\xff\xff\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\xff\xff\x6f\x00\x90\x00\xff\xff\x00\x00\x00\x00\xa3\x00\xa3\x00\xff\xff\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x00\x00\xff\xff\x00\x00\x8a\x00\xa3\x00\xa3\x00\xcc\x00\x00\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x69\x00\x00\x00\x00\x00\xff\xff\x00\x00\x69\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\xa0\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x00\x00\x00\x00\x00\x7b\x00\x00\x00\x00\x00\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x00\x00\xd9\x00\xe4\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x00\x69\x00\x00\x00\x00\x00\x6a\x00\x69\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x69\x00\xff\xff\x00\x00\x00\x00\x69\x00\xff\xff\x69\x00\xe0\x00\x69\x00\x8e\x00\x6d\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\xff\xff\xbc\x00\xff\xff\xff\xff\x6f\x00\x00\x00\xbe\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x00\x00\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x00\x00\xfd\x00\x00\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\xfd\x00\x00\x00\xa0\x00\x00\x00\xc9\x00\x00\x00\x00\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x00\x00\xff\xff\x00\x00\xbc\x00\x00\x00\xcd\x00\x6e\x00\x00\x00\xbe\x00\xff\xff\xcf\x00\x00\x00\xff\xff\x00\x00\xc9\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x76\x00\x00\x00\x00\x00\xff\xff\x00\x00\x76\x00\xff\xff\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\xff\xff\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\x00\x00\x00\x76\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x9f\x00\x77\x00\xc9\x00\x00\x00\xda\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x00\x76\x00\x00\x00\xfd\x00\x77\x00\x76\x00\xcd\x00\x00\x00\x00\x00\xff\xff\x00\x00\xcf\x00\xff\xff\x76\x00\x00\x00\x00\x00\x00\x00\x76\x00\x00\x00\x76\x00\xe0\x00\x76\x00\xda\x00\x7a\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\x00\x00\x00\x00\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xda\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x7b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x8e\x00\x7b\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\xee\x00\x00\x00\xee\x00\x7b\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x7b\x00\x8e\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x0b\x01\x00\x00\x0b\x01\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x7b\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x7b\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x84\x00\xff\xff\x8e\x00\xff\xff\xff\xff\x84\x00\xff\xff\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x00\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x00\x00\x00\x00\x00\x00\xee\x00\x00\x00\xee\x00\x00\x00\x84\x00\xff\xff\x84\x00\xff\xff\x00\x00\x8e\x00\x84\x00\x84\x00\x00\x00\x00\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x84\x00\x00\x00\x00\x00\x84\x00\x84\x00\x00\x00\x84\x00\x84\x00\x84\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x84\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x84\x00\x0b\x01\x84\x00\x0b\x01\x8c\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x84\x00\xee\x00\x00\x00\x84\x00\x84\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x84\x00\x00\x00\x84\x00\x00\x00\x8d\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x00\x00\x00\x00\x00\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x00\x00\x00\x00\x00\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x85\x00\xff\xff\xff\xff\xff\xff\xff\xff\x85\x00\xff\xff\x00\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x00\x00\x00\x00\x00\x00\xee\x00\x00\x00\xee\x00\x90\x00\x85\x00\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x85\x00\x00\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x85\x00\x00\x00\x00\x00\x85\x00\x85\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x85\x00\x00\x00\x00\x00\x00\x00\x85\x00\xa3\x00\x85\x00\x0b\x01\x85\x00\x0b\x01\x8f\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x00\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x90\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x90\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x90\x00\xa3\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x90\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x90\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x99\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x99\x00\x00\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x00\x00\x91\x00\x91\x00\x91\x00\x91\x00\x91\x00\x91\x00\x91\x00\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x99\x00\x00\x00\x00\x00\xa3\x00\x99\x00\x99\x00\x00\x00\x00\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x99\x00\x00\x00\x00\x00\x99\x00\x99\x00\x00\x00\x99\x00\x99\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x99\x00\x00\x00\x99\x00\x00\x00\xa1\x00\x00\x00\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x99\x00\x00\x00\x00\x00\x99\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x99\x00\x00\x00\x99\x00\x00\x00\xa2\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x00\x00\x00\x00\x00\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x9a\x00\xaa\x00\x00\x00\x9a\x00\x9a\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x9a\x00\x00\x00\x9a\x00\x00\x00\xa4\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\xaa\x00\x00\x00\x00\x00\xab\x00\xab\x00\x00\x00\xaa\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\xae\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\x00\xaa\x00\xae\x00\xaa\x00\xab\x00\xab\x00\x00\x00\xaa\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xae\x00\xaa\x00\xaa\x00\x00\x00\xab\x00\xab\x00\x00\x00\xaa\x00\xaa\x00\xa6\x00\x00\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\xaa\x00\x00\x00\x00\x00\xab\x00\xab\x00\xb1\x00\xaa\x00\xb1\x00\x00\x00\x00\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb0\x00\x00\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x00\x00\x00\x00\xb5\x00\xb5\x00\x00\x00\xb4\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\x00\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xba\x00\xff\xff\xba\x00\xb9\x00\xff\xff\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xbc\x00\xff\xff\x00\x00\x00\x00\x00\x00\xbe\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\x00\x00\x00\x00\xbb\x00\x00\x00\x00\x00\x00\x00\xc8\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\x00\x00\xc9\x00\x00\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x00\xbe\x00\x00\x00\x00\x00\x00\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x00\xbe\x00\x00\x00\x00\x00\xbe\x00\xbe\x00\x00\x00\x00\x00\x00\x00\xff\xff\xc7\x00\x00\x00\xff\xff\xbe\x00\x00\x00\xc7\x00\x00\x00\xbe\x00\x00\x00\xbe\x00\x00\x00\xbe\x00\x00\x00\xca\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\xc7\x00\x00\x00\x00\x00\xc7\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xc7\x00\xff\xff\x00\x00\x00\x00\xc7\x00\xd9\x00\xc7\x00\xff\x00\xc7\x00\x00\x00\xcb\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\x00\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\xda\x00\xcf\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\xd9\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\xda\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\x00\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\xda\x00\xcf\x00\x00\x00\x00\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\xcf\x00\x00\x00\x00\x00\xcf\x00\xcf\x00\x00\x00\x00\x00\x00\x00\xff\xff\xd8\x00\x00\x00\xff\xff\xcf\x00\x00\x00\xd8\x00\x00\x00\xcf\x00\x00\x00\xcf\x00\x00\x00\xcf\x00\x00\x00\xdb\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\x00\x00\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x00\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x0b\x01\xd8\x00\xff\x00\xd8\x00\x00\x00\xdc\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\x00\x00\x00\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\x00\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe1\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\x00\x00\x00\x00\x00\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\x00\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xe3\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\x00\x00\x00\x00\x00\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\xde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\x00\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe5\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\x00\x00\x00\x00\x00\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\x00\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\x00\x00\x00\x00\x00\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\x00\x00\x00\x00\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\x00\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xee\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xee\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x0b\x01\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x0b\x01\x00\x00\x00\x00\x00\x00\x00\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x00\xff\xff\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\x00\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x00\xf8\x00\x00\x00\x00\x00\x00\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\xf8\x00\x00\x00\x00\x00\xf8\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\x00\x00\x00\x00\xf8\x00\x00\x00\xf8\x00\xff\x00\xf8\x00\x00\x00\xfe\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\x00\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x00\x00\x00\x00\x00\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x00\x00\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x00\x00\x00\x00\x00\x00\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x00\x00\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x00\x00\x00\x00\x00\x00\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x00\x00\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x00\x00\x00\x00\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\x00\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\xf1\x00\x00\x00\x00\x00\xf1\x00\xf1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\xf1\x00\x0d\x01\xf1\x00\x00\x00\x0c\x01\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x00\x00\x00\x00\x00\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x00\x00\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0e\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x00\x00\x00\x00\x00\x00\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\x00\x00\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x00\x00\x00\x00\x00\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x00\x00\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x12\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x00\x00\x00\x00\x00\x00\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x00\x00\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x00\x00\x00\x00\x00\x00\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x00\x00\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x00\x00\x00\x00\x00\x00\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\x00\x00\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
+
+alex_check :: AlexAddr
+alex_check = AlexA# "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0a\x00\x61\x00\x6d\x00\x67\x00\x61\x00\x72\x00\x0a\x00\x0a\x00\x74\x00\x6e\x00\x65\x00\x64\x00\x4c\x00\x6c\x00\x6c\x00\x4c\x00\x6c\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x4c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x4c\x00\x5d\x00\x5e\x00\x5f\x00\x6c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x09\x00\x0a\x00\x55\x00\x69\x00\x6a\x00\x27\x00\x55\x00\x69\x00\x6a\x00\x27\x00\x09\x00\x0a\x00\x27\x00\x20\x00\x2d\x00\x3d\x00\x3d\x00\x2e\x00\x20\x00\x4c\x00\x3d\x00\x3d\x00\x3d\x00\x20\x00\x3d\x00\x22\x00\x3d\x00\x3e\x00\x55\x00\x6c\x00\x3d\x00\x3e\x00\x4c\x00\x20\x00\x75\x00\x22\x00\x09\x00\x0a\x00\x75\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\x75\x00\x22\x00\x09\x00\x0a\x00\x6c\x00\x3d\x00\x26\x00\x55\x00\x55\x00\x3c\x00\x3d\x00\x09\x00\x0a\x00\x2b\x00\x3d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\x4c\x00\x22\x00\xff\xff\x3d\x00\x6c\x00\x3d\x00\xff\xff\x4c\x00\x20\x00\x55\x00\x22\x00\x09\x00\x0a\x00\x75\x00\x75\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\x4c\x00\x22\x00\x09\x00\x0a\x00\x6c\x00\x3d\x00\x75\x00\x55\x00\x55\x00\x55\x00\xff\xff\x09\x00\x0a\x00\xff\xff\xff\xff\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\x4c\x00\xff\xff\xff\xff\x69\x00\x6a\x00\x6c\x00\x6c\x00\xff\xff\x20\x00\x55\x00\xff\xff\x09\x00\x0a\x00\x75\x00\x75\x00\x75\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\xff\xff\x09\x00\x0a\x00\xff\xff\xff\xff\x75\x00\x7c\x00\xff\xff\xff\xff\xff\xff\x09\x00\x0a\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x4c\x00\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x09\x00\x55\x00\x55\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\x6c\x00\x6c\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x75\x00\x75\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x45\x00\x4c\x00\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\x55\x00\x4c\x00\x55\x00\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\x58\x00\x55\x00\x69\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x70\x00\xff\xff\x69\x00\x6a\x00\x65\x00\x6c\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\x75\x00\x6c\x00\x75\x00\xff\xff\xff\xff\x69\x00\x75\x00\xff\xff\xff\xff\x78\x00\x75\x00\xff\xff\x70\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x22\x00\x4c\x00\xff\xff\x0a\x00\x4c\x00\x27\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\x55\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x3f\x00\x69\x00\x6a\x00\x27\x00\x6c\x00\x55\x00\x45\x00\x6c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x46\x00\x75\x00\xff\xff\xff\xff\x75\x00\xff\xff\x4c\x00\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\x0a\x00\x69\x00\x6a\x00\x0d\x00\x6c\x00\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x46\x00\x75\x00\x65\x00\x66\x00\x69\x00\x6a\x00\x4c\x00\x6c\x00\x66\x00\xff\xff\xff\xff\x6e\x00\x22\x00\xff\xff\x6c\x00\x72\x00\x75\x00\x74\x00\xff\xff\x76\x00\x5c\x00\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x2e\x00\x24\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x22\x00\xff\xff\x24\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x24\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x4c\x00\xff\xff\x0a\x00\xff\xff\x4c\x00\x0d\x00\xff\xff\xff\xff\x4c\x00\x55\x00\xff\xff\x45\x00\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\x55\x00\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\x69\x00\x6a\x00\x27\x00\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x75\x00\x4c\x00\x65\x00\xff\xff\x75\x00\x4c\x00\x69\x00\x6a\x00\x75\x00\x6c\x00\x55\x00\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\x2e\x00\x75\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\x69\x00\x6a\x00\x0d\x00\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x0a\x00\x4c\x00\x45\x00\x0d\x00\x75\x00\x5c\x00\xff\xff\xff\xff\x75\x00\x4c\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x2e\x00\x55\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x27\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x65\x00\xff\xff\xff\xff\x4c\x00\x69\x00\x6a\x00\x45\x00\x6c\x00\x75\x00\xff\xff\xff\xff\x0a\x00\x55\x00\x4c\x00\x0d\x00\xff\xff\x75\x00\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\x65\x00\x5c\x00\x27\x00\x4c\x00\x69\x00\x6a\x00\x75\x00\x6c\x00\x69\x00\x6a\x00\x5c\x00\x6c\x00\x55\x00\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x69\x00\x6a\x00\x0a\x00\x6c\x00\x4c\x00\x0d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x75\x00\x55\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x5c\x00\xff\xff\x0d\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x75\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x75\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\xff\xff\x0a\x00\x0d\x00\x4c\x00\x0d\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x55\x00\xff\xff\x5c\x00\xff\xff\x0a\x00\x4c\x00\xff\xff\x0d\x00\xff\xff\x50\x00\x4c\x00\xff\xff\xff\xff\xff\xff\x55\x00\x4c\x00\x27\x00\xff\xff\x27\x00\x55\x00\x69\x00\x6a\x00\x5c\x00\x6c\x00\x55\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x75\x00\x27\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x69\x00\x6a\x00\x70\x00\x6c\x00\x4c\x00\x69\x00\x6a\x00\x75\x00\x6c\x00\x4c\x00\xff\xff\xff\xff\x75\x00\x55\x00\x2b\x00\xff\xff\x2d\x00\x75\x00\x55\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x5c\x00\xff\xff\x5c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x0a\x00\x69\x00\x6a\x00\x0d\x00\x6c\x00\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x75\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\xff\xff\x0a\x00\x0d\x00\xff\xff\x0d\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x22\x00\xff\xff\x0a\x00\x27\x00\xff\xff\x0d\x00\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x0a\x00\x0a\x00\x27\x00\x0d\x00\x0d\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\x27\x00\x27\x00\xff\xff\xff\xff\x0a\x00\x27\x00\x5c\x00\x0d\x00\x5c\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x0a\x00\x0a\x00\xff\xff\x0d\x00\x0d\x00\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\x5c\x00\xff\xff\x0a\x00\x0a\x00\x0a\x00\x0d\x00\x0d\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x27\x00\x27\x00\xff\xff\x5c\x00\x5c\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x27\x00\x27\x00\x27\x00\xff\xff\x0a\x00\x0a\x00\xff\xff\x0d\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x5c\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x0a\x00\x27\x00\x27\x00\x0d\x00\xff\xff\xff\xff\x5c\x00\x5c\x00\x0a\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x27\x00\xff\xff\x5c\x00\x5c\x00\x5c\x00\x22\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x22\x00\xff\xff\xff\xff\x0a\x00\xff\xff\x27\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x5c\x00\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x5c\x00\x55\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\x0a\x00\xff\xff\x0a\x00\x0d\x00\x0a\x00\x0d\x00\x6e\x00\x0d\x00\xff\xff\xff\xff\x72\x00\x27\x00\x74\x00\x75\x00\x76\x00\x5c\x00\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\x22\x00\x27\x00\x0d\x00\x27\x00\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x5c\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x0a\x00\xff\xff\x0a\x00\x0d\x00\x0a\x00\x0d\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x5c\x00\xff\xff\x5c\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x0a\x00\xff\xff\x22\x00\xff\xff\x22\x00\x27\x00\xff\xff\x27\x00\x0a\x00\x27\x00\xff\xff\x0d\x00\xff\xff\x5c\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\x0a\x00\xff\xff\x27\x00\x0d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x3f\x00\xff\xff\xff\xff\x27\x00\xff\xff\x5c\x00\x45\x00\x5c\x00\xff\xff\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\x5c\x00\x65\x00\x66\x00\x22\x00\xff\xff\xff\xff\x0a\x00\xff\xff\x27\x00\x0d\x00\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\x5c\x00\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x5c\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x27\x00\x0a\x00\x0d\x00\x0a\x00\x0d\x00\xff\xff\x0d\x00\x5c\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x22\x00\xff\xff\x22\x00\x27\x00\xff\xff\x27\x00\x0a\x00\x27\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\x5c\x00\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x5c\x00\xff\xff\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\x0a\x00\x5c\x00\x0a\x00\x0d\x00\x27\x00\x0d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x22\x00\xff\xff\x3f\x00\x27\x00\x22\x00\x27\x00\xff\xff\x5c\x00\x45\x00\x27\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x3f\x00\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\x45\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x5c\x00\x76\x00\x5c\x00\x78\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x22\x00\xff\xff\x65\x00\x66\x00\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x22\x00\x0a\x00\x0d\x00\x0a\x00\x0d\x00\x27\x00\x0d\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x22\x00\x27\x00\x3f\x00\x27\x00\xff\xff\x27\x00\xff\xff\xff\xff\x45\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\x5c\x00\x74\x00\x5c\x00\x76\x00\x5c\x00\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x27\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\x5c\x00\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x27\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\x22\x00\xff\xff\xff\xff\x5c\x00\x45\x00\x27\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x3f\x00\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\x45\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x46\x00\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\x45\x00\x46\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\x46\x00\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x4c\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\x2b\x00\x6c\x00\x2d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x65\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x70\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x2b\x00\x0a\x00\x2d\x00\x70\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\x22\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x27\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x5c\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x45\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\x22\x00\xff\xff\x0d\x00\x6e\x00\xff\xff\x27\x00\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\x6e\x00\x0d\x00\xff\xff\xff\xff\x72\x00\x5c\x00\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x5c\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x45\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\x22\x00\xff\xff\x0d\x00\x6e\x00\xff\xff\x27\x00\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\x5c\x00\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x0a\x00\x22\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\x5c\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x45\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
+
+alex_deflt :: AlexAddr
+alex_deflt = AlexA# "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x23\x00\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x69\x00\xed\x00\xff\xff\xff\xff\xff\xff\xff\xff\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x76\x00\xed\x00\xff\xff\xff\xff\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\xc7\x00\xbe\x00\xbe\x00\xc7\x00\xbe\x00\xc7\x00\xbe\x00\xc7\x00\xbe\x00\xc7\x00\xc7\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\xd8\x00\xcf\x00\xcf\x00\xd8\x00\xcf\x00\xd8\x00\xcf\x00\xd8\x00\xcf\x00\xd8\x00\xd8\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
+
+alex_accept = listArray (0::Int,326) [[],[],[(AlexAccSkip)],[(AlexAcc (alex_action_1))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAccSkip)],[],[],[],[],[],[],[],[(AlexAccSkip)],[],[],[],[],[],[],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[],[],[(AlexAcc (alex_action_8))],[(AlexAcc (alex_action_9))],[(AlexAcc (alex_action_9))],[(AlexAcc (alex_action_9))],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_10))],[(AlexAcc (alex_action_10))],[(AlexAcc (alex_action_10))],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_11))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_12))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_26))],[],[],[],[],[],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_15))],[(AlexAcc (alex_action_15))],[],[],[],[(AlexAcc (alex_action_16))],[(AlexAcc (alex_action_16))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_17))],[(AlexAcc (alex_action_17))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_18))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_19))],[],[(AlexAcc (alex_action_20))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_21))],[(AlexAcc (alex_action_22))],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_25))],[(AlexAcc (alex_action_32))],[(AlexAcc (alex_action_27))],[(AlexAcc (alex_action_28))],[(AlexAcc (alex_action_29))],[(AlexAcc (alex_action_31))],[(AlexAcc (alex_action_30))],[(AlexAcc (alex_action_33))],[(AlexAcc (alex_action_34))],[(AlexAcc (alex_action_35))],[(AlexAcc (alex_action_36))],[(AlexAcc (alex_action_37))],[(AlexAcc (alex_action_39))],[(AlexAcc (alex_action_38))],[(AlexAcc (alex_action_41))],[(AlexAcc (alex_action_40))],[(AlexAcc (alex_action_42))],[(AlexAcc (alex_action_43))],[(AlexAcc (alex_action_51))],[(AlexAcc (alex_action_44))],[(AlexAcc (alex_action_45))],[(AlexAcc (alex_action_46))],[(AlexAcc (alex_action_47))],[(AlexAcc (alex_action_48))],[(AlexAcc (alex_action_49))],[(AlexAcc (alex_action_50))],[(AlexAcc (alex_action_52))],[(AlexAcc (alex_action_53))],[(AlexAcc (alex_action_54))],[(AlexAcc (alex_action_55))],[(AlexAcc (alex_action_56))],[(AlexAcc (alex_action_57))],[(AlexAcc (alex_action_58))],[(AlexAcc (alex_action_59))],[(AlexAcc (alex_action_60))],[(AlexAcc (alex_action_61))],[(AlexAcc (alex_action_62))],[(AlexAcc (alex_action_63))],[(AlexAcc (alex_action_64))],[(AlexAcc (alex_action_65))],[(AlexAcc (alex_action_66))],[]]
+{-# LINE 247 "src/Language/C/Parser/Lexer.x" #-}
+
+-- We use the odd looking list of string patterns here rather than normal
+-- string literals since GHC converts the latter into a sequence of string
+-- comparisons (ie a linear search) but it translates the former using its
+-- effecient pattern matching which gives us the expected radix-style search.
+-- This gives change makes a significant performance difference.
+--
+idkwtok :: String -> Position -> P CToken
+idkwtok ('a':'l':'i':'g':'n':'o':'f':[])         = tok CTokAlignof
+idkwtok ('_':'_':'a':'l':'i':'g':'n':'o':'f':[])       = tok CTokAlignof
+idkwtok ('_':'_':'a':'l':'i':'g':'n':'o':'f':'_':'_':[])     = tok CTokAlignof
+idkwtok ('a':'s':'m':[])             = tok CTokAsm
+idkwtok ('_':'_':'a':'s':'m':[])           = tok CTokAsm
+idkwtok ('_':'_':'a':'s':'m':'_':'_':[])         = tok CTokAsm
+idkwtok ('a':'u':'t':'o':[])             = tok CTokAuto
+idkwtok ('b':'r':'e':'a':'k':[])           = tok CTokBreak
+idkwtok ('_':'B':'o':'o':'l':[])           = tok CTokBool
+idkwtok ('c':'a':'s':'e':[])             = tok CTokCase
+idkwtok ('c':'h':'a':'r':[])             = tok CTokChar
+idkwtok ('c':'o':'n':'s':'t':[])           = tok CTokConst
+idkwtok ('_':'_':'c':'o':'n':'s':'t':[])         = tok CTokConst
+idkwtok ('_':'_':'c':'o':'n':'s':'t':'_':'_':[])       = tok CTokConst
+idkwtok ('c':'o':'n':'t':'i':'n':'u':'e':[])         = tok CTokContinue
+idkwtok ('_':'C':'o':'m':'p':'l':'e':'x':[])         = tok CTokComplex
+idkwtok ('_':'_':'c':'o':'m':'p':'l':'e':'x':'_':'_':[]) = tok CTokComplex
+idkwtok ('d':'e':'f':'a':'u':'l':'t':[])         = tok CTokDefault
+idkwtok ('d':'o':[])               = tok CTokDo
+idkwtok ('d':'o':'u':'b':'l':'e':[])           = tok CTokDouble
+idkwtok ('e':'l':'s':'e':[])             = tok CTokElse
+idkwtok ('e':'n':'u':'m':[])             = tok CTokEnum
+idkwtok ('e':'x':'t':'e':'r':'n':[])           = tok CTokExtern
+idkwtok ('f':'l':'o':'a':'t':[])           = tok CTokFloat
+idkwtok ('f':'o':'r':[])             = tok CTokFor
+idkwtok ('g':'o':'t':'o':[])             = tok CTokGoto
+idkwtok ('i':'f':[])               = tok CTokIf
+idkwtok ('i':'n':'l':'i':'n':'e':[])           = tok CTokInline
+idkwtok ('_':'_':'i':'n':'l':'i':'n':'e':[])         = tok CTokInline
+idkwtok ('_':'_':'i':'n':'l':'i':'n':'e':'_':'_':[])       = tok CTokInline
+idkwtok ('i':'n':'t':[])             = tok CTokInt
+idkwtok ('l':'o':'n':'g':[])             = tok CTokLong
+idkwtok ('r':'e':'g':'i':'s':'t':'e':'r':[])         = tok CTokRegister
+idkwtok ('r':'e':'s':'t':'r':'i':'c':'t':[])         = tok CTokRestrict
+idkwtok ('_':'_':'r':'e':'s':'t':'r':'i':'c':'t':[])       = tok CTokRestrict
+idkwtok ('_':'_':'r':'e':'s':'t':'r':'i':'c':'t':'_':'_':[]) = tok CTokRestrict
+idkwtok ('r':'e':'t':'u':'r':'n':[])           = tok CTokReturn
+idkwtok ('s':'h':'o':'r':'t':[])           = tok CTokShort
+idkwtok ('s':'i':'g':'n':'e':'d':[])           = tok CTokSigned
+idkwtok ('_':'_':'s':'i':'g':'n':'e':'d':[])         = tok CTokSigned
+idkwtok ('_':'_':'s':'i':'g':'n':'e':'d':'_':'_':[])       = tok CTokSigned
+idkwtok ('s':'i':'z':'e':'o':'f':[])           = tok CTokSizeof
+idkwtok ('s':'t':'a':'t':'i':'c':[])           = tok CTokStatic
+idkwtok ('s':'t':'r':'u':'c':'t':[])           = tok CTokStruct
+idkwtok ('s':'w':'i':'t':'c':'h':[])           = tok CTokSwitch
+idkwtok ('t':'y':'p':'e':'d':'e':'f':[])         = tok CTokTypedef
+idkwtok ('t':'y':'p':'e':'o':'f':[])           = tok CTokTypeof
+idkwtok ('_':'_':'t':'y':'p':'e':'o':'f':[])         = tok CTokTypeof
+idkwtok ('_':'_':'t':'y':'p':'e':'o':'f':'_':'_':[])       = tok CTokTypeof
+idkwtok ('_':'_':'t':'h':'r':'e':'a':'d':[])         = tok CTokThread
+idkwtok ('u':'n':'i':'o':'n':[])           = tok CTokUnion
+idkwtok ('u':'n':'s':'i':'g':'n':'e':'d':[])         = tok CTokUnsigned
+idkwtok ('v':'o':'i':'d':[])             = tok CTokVoid
+idkwtok ('v':'o':'l':'a':'t':'i':'l':'e':[])         = tok CTokVolatile
+idkwtok ('_':'_':'v':'o':'l':'a':'t':'i':'l':'e':[])       = tok CTokVolatile
+idkwtok ('_':'_':'v':'o':'l':'a':'t':'i':'l':'e':'_':'_':[]) = tok CTokVolatile
+idkwtok ('w':'h':'i':'l':'e':[])           = tok CTokWhile
+idkwtok ('_':'_':'l':'a':'b':'e':'l':'_':'_':[])             = tok CTokLabel
+idkwtok ('_':'_':'a':'t':'t':'r':'i':'b':'u':'t':'e':[]) = tok (CTokGnuC GnuCAttrTok)
+idkwtok ('_':'_':'a':'t':'t':'r':'i':'b':'u':'t':'e':'_':'_':[]) = tok (CTokGnuC GnuCAttrTok)
+idkwtok ('_':'_':'e':'x':'t':'e':'n':'s':'i':'o':'n':'_':'_':[]) = tok (CTokGnuC GnuCExtTok)
+idkwtok ('_':'_':'r':'e':'a':'l':[])   = tok (CTokGnuC GnuCComplexReal)
+idkwtok ('_':'_':'r':'e':'a':'l':'_':'_':[])   = tok (CTokGnuC GnuCComplexReal)
+idkwtok ('_':'_':'i':'m':'a':'g':[])   = tok (CTokGnuC GnuCComplexImag)
+idkwtok ('_':'_':'i':'m':'a':'g':'_':'_':[])   = tok (CTokGnuC GnuCComplexImag)
+idkwtok ('_':'_':'b':'u':'i':'l':'t':'i':'n':'_':rest)
+        | rest == "va_arg"             = tok (CTokGnuC GnuCVaArg)
+        | rest == "offsetof"           = tok (CTokGnuC GnuCOffsetof)
+        | rest == "types_compatible_p" = tok (CTokGnuC GnuCTyCompat)
+
+idkwtok cs = \pos -> do
+  name <- getNewName
+  let ident = mkIdent pos cs name
+  tyident <- isTypeIdent ident
+  if tyident
+    then return (CTokTyIdent pos ident)
+    else return (CTokIdent   pos ident)
+
+ignoreAttribute :: P ()
+ignoreAttribute = skipTokens (0::Int)
+  where skipTokens :: Int -> P ()
+        skipTokens n = do
+          tok <- lexToken
+          case tok of
+            CTokRParen _ | n == 1    -> return ()
+                         | otherwise -> skipTokens (n-1)
+            CTokLParen _             -> skipTokens (n+1)
+            _                        -> skipTokens n
+
+tok :: (Position -> CToken) -> Position -> P CToken
+tok tc pos = return (tc pos)
+
+adjustPos :: String -> Position -> Position
+adjustPos str (Position fname row _) = Position fname' row' 0
+    where
+    str'            = dropWhite . drop 1 $ str
+    (rowStr, str'') = span isDigit str'
+    row'      = read rowStr
+    str'''      = dropWhite str''
+    fnameStr      = takeWhile (/= '"') . drop 1 $ str'''
+    fname'      | null str''' || head str''' /= '"' = fname
+     -- try and get more sharing of file name strings
+     | fnameStr == fname     = fname
+     | otherwise             = fnameStr
+    --
+    dropWhite = dropWhile (\c -> c == ' ' || c == '\t')
+
+-- special utility for the lexer
+unescapeMultiChars :: String -> [Char]
+unescapeMultiChars cs@(_ : _ : _) = case unescapeChar cs of (c,cs') -> c : unescapeMultiChars cs'
+unescapeMultiChars ('\'' : []) = []
+unescapeMultiChars _ = error "Unexpected end of multi-char constant"
+
+{-# INLINE token_ #-}
+-- token that ignores the string
+token_ :: (Position -> CToken) -> Position -> Int -> InputStream -> P CToken
+token_ tok pos _ _ = return (tok pos)
+
+{-# INLINE token_fail #-}
+-- error token
+token_fail :: String -> Position ->
+              Int -> InputStream -> P CToken
+token_fail errmsg pos _ _ =   failP pos [ "Lexical Error !", errmsg ]
+
+
+{-# INLINE token #-}
+-- token that uses the string
+token :: (Position -> a -> CToken) -> (String -> a)
+      -> Position -> Int -> InputStream -> P CToken
+token tok read pos len str = return (tok pos (read $ takeChars len str))
+
+{-# INLINE token_plus #-}
+-- token that may fail
+token_plus :: (Position -> a -> CToken) -> (String -> Either String a)
+      -> Position -> Int -> InputStream -> P CToken
+token_plus tok read pos len str =
+  case read (takeChars len str) of Left err -> failP pos [ "Lexical error ! ", err ]
+                                   Right ok -> return $! tok pos ok
+
+-- -----------------------------------------------------------------------------
+-- The input type
+
+type AlexInput = (Position,   -- current position,
+                  InputStream)     -- current input string
+
+alexInputPrevChar :: AlexInput -> Char
+alexInputPrevChar _ = error "alexInputPrevChar not used"
+
+alexGetChar :: AlexInput -> Maybe (Char,AlexInput)
+alexGetChar (p,is) | inputStreamEmpty is = Nothing
+                   | otherwise  = let (c,s) = takeChar is in
+                                  let p' = alexMove p c in p' `seq`
+                                  Just (c, (p', s))
+
+alexMove :: Position -> Char -> Position
+alexMove (Position f l c) ' '  = Position f l (c+1)
+alexMove (Position f l c) '\n' = Position f (l+1) 1
+alexMove (Position f l c) '\t' = Position f l (((c+7) `div` 8)*8+1)
+alexMove p                '\r' = p
+alexMove (Position f l c) _    = Position f l     (c+1)
+
+lexicalError :: P a
+lexicalError = do
+  pos <- getPos
+  (c,cs) <- liftM takeChar getInput
+  failP pos
+        ["Lexical error !",
+         "The character " ++ show c ++ " does not fit here."]
+
+parseError :: P a
+parseError = do
+  tok <- getLastToken
+  failP (posOf tok)
+        ["Syntax error !",
+         "The symbol `" ++ show tok ++ "' does not fit here."]
+
+lexToken :: P CToken
+lexToken = do
+  pos <- getPos
+  inp <- getInput
+  case alexScan (pos, inp) 0 of
+    AlexEOF -> return CTokEof
+    AlexError inp' -> lexicalError
+    AlexSkip  (pos', inp') len -> do
+        setPos pos'
+        setInput inp'
+        lexToken
+    AlexToken (pos', inp') len action -> do
+        setPos pos'
+        setInput inp'
+        tok <- action pos len inp
+        setLastToken tok
+        return tok
+
+lexC :: (CToken -> P a) -> P a
+lexC cont = do
+  tok <- lexToken
+  cont tok
+
+alex_action_1 = \pos len str -> setPos (adjustPos (takeChars len str) pos) >> lexToken 
+alex_action_4 = \pos len str -> idkwtok (takeChars len str) pos 
+alex_action_5 = token_plus CTokILit (readCInteger OctalRepr) 
+alex_action_6 = token_plus CTokILit (readCInteger DecRepr) 
+alex_action_7 = token_plus CTokILit (readCInteger HexRepr . drop 2) 
+alex_action_8 = token_fail "Invalid integer constant suffix" 
+alex_action_9 = token CTokCLit (cChar . fst . unescapeChar . tail) 
+alex_action_10 = token CTokCLit (cChar_w . fst . unescapeChar . tail . tail) 
+alex_action_11 = token CTokCLit (flip cChars False . unescapeMultiChars .tail) 
+alex_action_12 = token CTokCLit (flip cChars True . unescapeMultiChars . tail . tail) 
+alex_action_13 = token CTokFLit readCFloat 
+alex_action_14 = token CTokFLit readCFloat 
+alex_action_15 = token_fail "Hexadecimal floating constant requires an exponent" 
+alex_action_16 = token CTokSLit (cString . unescapeString . init . tail) 
+alex_action_17 = token CTokSLit (cString_w . unescapeString . init . tail . tail) 
+alex_action_18 = token_fail "Universal character names are unsupported" 
+alex_action_19 = token_fail "Invalid escape sequence" 
+alex_action_20 = token_fail "Universal character names in string literals are unsupported"
+alex_action_21 = token_ CTokLParen 
+alex_action_22 = token_ CTokRParen  
+alex_action_23 = token_ CTokLBracket 
+alex_action_24 = token_ CTokRBracket 
+alex_action_25 = token_ CTokArrow 
+alex_action_26 = token_ CTokDot 
+alex_action_27 = token_ CTokExclam 
+alex_action_28 = token_ CTokTilde 
+alex_action_29 = token_ CTokInc 
+alex_action_30 = token_ CTokDec 
+alex_action_31 = token_ CTokPlus 
+alex_action_32 = token_ CTokMinus 
+alex_action_33 = token_ CTokStar 
+alex_action_34 = token_ CTokSlash 
+alex_action_35 = token_ CTokPercent 
+alex_action_36 = token_ CTokAmper 
+alex_action_37 = token_ CTokShiftL 
+alex_action_38 = token_ CTokShiftR 
+alex_action_39 = token_ CTokLess 
+alex_action_40 = token_ CTokLessEq 
+alex_action_41 = token_ CTokHigh 
+alex_action_42 = token_ CTokHighEq 
+alex_action_43 = token_ CTokEqual 
+alex_action_44 = token_ CTokUnequal 
+alex_action_45 = token_ CTokHat 
+alex_action_46 = token_ CTokBar 
+alex_action_47 = token_ CTokAnd 
+alex_action_48 = token_ CTokOr 
+alex_action_49 = token_ CTokQuest 
+alex_action_50 = token_ CTokColon 
+alex_action_51 = token_ CTokAssign 
+alex_action_52 = token_ CTokPlusAss 
+alex_action_53 = token_ CTokMinusAss 
+alex_action_54 = token_ CTokStarAss 
+alex_action_55 = token_ CTokSlashAss 
+alex_action_56 = token_ CTokPercAss 
+alex_action_57 = token_ CTokAmpAss 
+alex_action_58 = token_ CTokHatAss 
+alex_action_59 = token_ CTokBarAss 
+alex_action_60 = token_ CTokSLAss 
+alex_action_61 = token_ CTokSRAss 
+alex_action_62 = token_ CTokComma 
+alex_action_63 = token_ CTokSemic 
+alex_action_64 = token_ CTokLBrace 
+alex_action_65 = token_ CTokRBrace 
+alex_action_66 = token_ CTokEllipsis 
+{-# LINE 1 "GenericTemplate.hs" #-}
+{-# LINE 1 "<built-in>" #-}
+{-# LINE 1 "<command line>" #-}
+{-# LINE 1 "GenericTemplate.hs" #-}
+-- -----------------------------------------------------------------------------
+-- ALEX TEMPLATE
+--
+-- This code is in the PUBLIC DOMAIN; you may copy it freely and use
+-- it for any purpose whatsoever.
+
+-- -----------------------------------------------------------------------------
+-- INTERNALS and main scanner engine
+
+{-# LINE 35 "GenericTemplate.hs" #-}
+
+{-# LINE 45 "GenericTemplate.hs" #-}
+
+
+data AlexAddr = AlexA# Addr#
+
+#if __GLASGOW_HASKELL__ < 503
+uncheckedShiftL# = shiftL#
+#endif
+
+{-# INLINE alexIndexInt16OffAddr #-}
+alexIndexInt16OffAddr (AlexA# arr) off =
+#ifdef WORDS_BIGENDIAN
+  narrow16Int# i
+  where
+	i    = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)
+	high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))
+	low  = int2Word# (ord# (indexCharOffAddr# arr off'))
+	off' = off *# 2#
+#else
+  indexInt16OffAddr# arr off
+#endif
+
+
+
+
+
+{-# INLINE alexIndexInt32OffAddr #-}
+alexIndexInt32OffAddr (AlexA# arr) off = 
+#ifdef WORDS_BIGENDIAN
+  narrow32Int# i
+  where
+   i    = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`
+		     (b2 `uncheckedShiftL#` 16#) `or#`
+		     (b1 `uncheckedShiftL#` 8#) `or#` b0)
+   b3   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))
+   b2   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))
+   b1   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))
+   b0   = int2Word# (ord# (indexCharOffAddr# arr off'))
+   off' = off *# 4#
+#else
+  indexInt32OffAddr# arr off
+#endif
+
+
+
+
+
+#if __GLASGOW_HASKELL__ < 503
+quickIndex arr i = arr ! i
+#else
+-- GHC >= 503, unsafeAt is available from Data.Array.Base.
+quickIndex = unsafeAt
+#endif
+
+
+
+
+-- -----------------------------------------------------------------------------
+-- Main lexing routines
+
+data AlexReturn a
+  = AlexEOF
+  | AlexError  !AlexInput
+  | AlexSkip   !AlexInput !Int
+  | AlexToken  !AlexInput !Int a
+
+-- alexScan :: AlexInput -> StartCode -> AlexReturn a
+alexScan input (I# (sc))
+  = alexScanUser undefined input (I# (sc))
+
+alexScanUser user input (I# (sc))
+  = case alex_scan_tkn user input 0# input sc AlexNone of
+	(AlexNone, input') ->
+		case alexGetChar input of
+			Nothing -> 
+
+
+
+				   AlexEOF
+			Just _ ->
+
+
+
+				   AlexError input'
+
+	(AlexLastSkip input len, _) ->
+
+
+
+		AlexSkip input len
+
+	(AlexLastAcc k input len, _) ->
+
+
+
+		AlexToken input len k
+
+
+-- Push the input through the DFA, remembering the most recent accepting
+-- state it encountered.
+
+alex_scan_tkn user orig_input len input s last_acc =
+  input `seq` -- strict in the input
+  let 
+	new_acc = check_accs (alex_accept `quickIndex` (I# (s)))
+  in
+  new_acc `seq`
+  case alexGetChar input of
+     Nothing -> (new_acc, input)
+     Just (c, new_input) -> 
+
+
+
+	let
+		base   = alexIndexInt32OffAddr alex_base s
+		(I# (ord_c)) = ord c
+		offset = (base +# ord_c)
+		check  = alexIndexInt16OffAddr alex_check offset
+		
+		new_s = if (offset >=# 0#) && (check ==# ord_c)
+			  then alexIndexInt16OffAddr alex_table offset
+			  else alexIndexInt16OffAddr alex_deflt s
+	in
+	case new_s of 
+	    -1# -> (new_acc, input)
+		-- on an error, we want to keep the input *before* the
+		-- character that failed, not after.
+    	    _ -> alex_scan_tkn user orig_input (len +# 1#) 
+			new_input new_s new_acc
+
+  where
+	check_accs [] = last_acc
+	check_accs (AlexAcc a : _) = AlexLastAcc a input (I# (len))
+	check_accs (AlexAccSkip : _)  = AlexLastSkip  input (I# (len))
+	check_accs (AlexAccPred a pred : rest)
+	   | pred user orig_input (I# (len)) input
+	   = AlexLastAcc a input (I# (len))
+	check_accs (AlexAccSkipPred pred : rest)
+	   | pred user orig_input (I# (len)) input
+	   = AlexLastSkip input (I# (len))
+	check_accs (_ : rest) = check_accs rest
+
+data AlexLastAcc a
+  = AlexNone
+  | AlexLastAcc a !AlexInput !Int
+  | AlexLastSkip  !AlexInput !Int
+
+data AlexAcc a user
+  = AlexAcc a
+  | AlexAccSkip
+  | AlexAccPred a (AlexAccPred user)
+  | AlexAccSkipPred (AlexAccPred user)
+
+type AlexAccPred user = user -> AlexInput -> Int -> AlexInput -> Bool
+
+-- -----------------------------------------------------------------------------
+-- Predicates on a rule
+
+alexAndPred p1 p2 user in1 len in2
+  = p1 user in1 len in2 && p2 user in1 len in2
+
+--alexPrevCharIsPred :: Char -> AlexAccPred _ 
+alexPrevCharIs c _ input _ _ = c == alexInputPrevChar input
+
+--alexPrevCharIsOneOfPred :: Array Char Bool -> AlexAccPred _ 
+alexPrevCharIsOneOf arr _ input _ _ = arr ! alexInputPrevChar input
+
+--alexRightContext :: Int -> AlexAccPred _
+alexRightContext (I# (sc)) user _ _ input = 
+     case alex_scan_tkn user input 0# input sc AlexNone of
+	  (AlexNone, _) -> False
+	  _ -> True
+	-- TODO: there's no need to find the longest
+	-- match when checking the right context, just
+	-- the first match will do.
+
+-- used by wrappers
+iUnbox (I# (i)) = i
diff --git a/dist/build/Language/C/Parser/Parser.hs b/dist/build/Language/C/Parser/Parser.hs
new file mode 100644
--- /dev/null
+++ b/dist/build/Language/C/Parser/Parser.hs
@@ -0,0 +1,6308 @@
+{-# OPTIONS -fglasgow-exts -cpp #-}
+module Language.C.Parser.Parser (parseC, ParseError(..)) where
+
+-- Relevant C99 sections:
+--
+-- 6.5 Expressions .1 - .17 and 6.6 (almost literally)
+--  Supported GNU extensions:
+--     - Allow a compound statement as an expression
+--     - Various __builtin_* forms that take type parameters
+--     - `alignof' expression or type
+--     - `__extension__' to suppress warnings about extensions
+--     - Allow taking address of a label with: && label
+--     - Omitting the `then' part of conditional expressions
+--     - complex numbers
+--
+-- 6.7 C Declarations .1 -.8
+--  Supported GNU extensions:
+--     - '__thread' thread local storage (6.7.1)
+--
+-- 6.8 Statements .1 - .8
+--  Supported GNU extensions:
+--    - case ranges (C99 6.8.1)
+--    - '__label__ ident;' declarations (C99 6.8.2)
+--    - computed gotos (C99 6.8.6)
+--
+-- 6.9 Translation unit
+--  Supported GNU extensions:
+--     - allow empty translation_unit
+--     - allow redundant ';'
+--     - allow extension keyword before external declaration
+--     - asm definitions
+--
+--  Since some of the grammar productions are quite difficult to read,
+--  (especially those involved with the decleration syntax) we document them
+--  with an extended syntax that allows a more consise representation:
+--
+--  Ordinary rules
+--
+--   foo      named terminal or non-terminal
+--
+--   'c'      terminal, literal character token
+--
+--   A B      concatenation
+--
+--   A | B    alternation
+--
+--   (A)      grouping
+--
+--  Extended rules
+--
+--   A?       optional, short hand for (A|) or [A]{ 0==A || 1==A }
+--
+--   ...      stands for some part of the grammar omitted for clarity
+--
+--   {A}      represents sequences, 0 or more.
+--
+--   <permute> modifier which states that any permutation of the immediate subterms is valid
+--
+--
+--- TODO ----------------------------------------------------------------------
+--
+--  !* We ignore the C99 static keyword (see C99 6.7.5.3)
+--  !* We do not distinguish in the AST between incomplete array types and
+--      complete variable length arrays ([ '*' ] means the latter). (see C99 6.7.5.2)
+--  !* The AST doesn't allow recording __attribute__ of unnamed struct field
+--     (see , struct_default_declaring_list, struct_identifier_declarator)
+--  !* see `We're being far to liberal here' (... struct definition within structs)
+--  * Documentation isn't complete and consistent yet.
+
+import Prelude    hiding (reverse)
+import qualified Data.List as List
+
+import Language.C.Parser.Builtin   (builtinTypeNames)
+import Language.C.Parser.Lexer     (lexC, parseError)
+import Language.C.Parser.Tokens    (CToken(..), GnuCTok(..))
+import Language.C.Parser.ParserMonad (P, failP, execParser, getNewName, addTypedef, shadowTypedef,
+                                      enterScope, leaveScope, ParseError(..))
+
+import Language.C.Data.RList
+import Language.C.Data.InputStream
+import Language.C.Data.Ident
+import Language.C.Data.Name
+import Language.C.Data.Node
+import Language.C.Data.Position
+import Language.C.Syntax
+#if __GLASGOW_HASKELL__ >= 503
+import Data.Array
+#else
+import Array
+#endif
+#if __GLASGOW_HASKELL__ >= 503
+import GHC.Exts
+#else
+import GlaExts
+#endif
+
+-- parser produced by Happy Version 1.16
+
+newtype HappyAbsSyn  = HappyAbsSyn (() -> ())
+happyIn6 :: (CTranslUnit) -> (HappyAbsSyn )
+happyIn6 x = unsafeCoerce# x
+{-# INLINE happyIn6 #-}
+happyOut6 :: (HappyAbsSyn ) -> (CTranslUnit)
+happyOut6 x = unsafeCoerce# x
+{-# INLINE happyOut6 #-}
+happyIn7 :: (Reversed [CExtDecl]) -> (HappyAbsSyn )
+happyIn7 x = unsafeCoerce# x
+{-# INLINE happyIn7 #-}
+happyOut7 :: (HappyAbsSyn ) -> (Reversed [CExtDecl])
+happyOut7 x = unsafeCoerce# x
+{-# INLINE happyOut7 #-}
+happyIn8 :: (CExtDecl) -> (HappyAbsSyn )
+happyIn8 x = unsafeCoerce# x
+{-# INLINE happyIn8 #-}
+happyOut8 :: (HappyAbsSyn ) -> (CExtDecl)
+happyOut8 x = unsafeCoerce# x
+{-# INLINE happyOut8 #-}
+happyIn9 :: (CFunDef) -> (HappyAbsSyn )
+happyIn9 x = unsafeCoerce# x
+{-# INLINE happyIn9 #-}
+happyOut9 :: (HappyAbsSyn ) -> (CFunDef)
+happyOut9 x = unsafeCoerce# x
+{-# INLINE happyOut9 #-}
+happyIn10 :: (CDeclr) -> (HappyAbsSyn )
+happyIn10 x = unsafeCoerce# x
+{-# INLINE happyIn10 #-}
+happyOut10 :: (HappyAbsSyn ) -> (CDeclr)
+happyOut10 x = unsafeCoerce# x
+{-# INLINE happyOut10 #-}
+happyIn11 :: (CStat) -> (HappyAbsSyn )
+happyIn11 x = unsafeCoerce# x
+{-# INLINE happyIn11 #-}
+happyOut11 :: (HappyAbsSyn ) -> (CStat)
+happyOut11 x = unsafeCoerce# x
+{-# INLINE happyOut11 #-}
+happyIn12 :: (CStat) -> (HappyAbsSyn )
+happyIn12 x = unsafeCoerce# x
+{-# INLINE happyIn12 #-}
+happyOut12 :: (HappyAbsSyn ) -> (CStat)
+happyOut12 x = unsafeCoerce# x
+{-# INLINE happyOut12 #-}
+happyIn13 :: (CStat) -> (HappyAbsSyn )
+happyIn13 x = unsafeCoerce# x
+{-# INLINE happyIn13 #-}
+happyOut13 :: (HappyAbsSyn ) -> (CStat)
+happyOut13 x = unsafeCoerce# x
+{-# INLINE happyOut13 #-}
+happyIn14 :: (()) -> (HappyAbsSyn )
+happyIn14 x = unsafeCoerce# x
+{-# INLINE happyIn14 #-}
+happyOut14 :: (HappyAbsSyn ) -> (())
+happyOut14 x = unsafeCoerce# x
+{-# INLINE happyOut14 #-}
+happyIn15 :: (()) -> (HappyAbsSyn )
+happyIn15 x = unsafeCoerce# x
+{-# INLINE happyIn15 #-}
+happyOut15 :: (HappyAbsSyn ) -> (())
+happyOut15 x = unsafeCoerce# x
+{-# INLINE happyOut15 #-}
+happyIn16 :: (Reversed [CBlockItem]) -> (HappyAbsSyn )
+happyIn16 x = unsafeCoerce# x
+{-# INLINE happyIn16 #-}
+happyOut16 :: (HappyAbsSyn ) -> (Reversed [CBlockItem])
+happyOut16 x = unsafeCoerce# x
+{-# INLINE happyOut16 #-}
+happyIn17 :: (CBlockItem) -> (HappyAbsSyn )
+happyIn17 x = unsafeCoerce# x
+{-# INLINE happyIn17 #-}
+happyOut17 :: (HappyAbsSyn ) -> (CBlockItem)
+happyOut17 x = unsafeCoerce# x
+{-# INLINE happyOut17 #-}
+happyIn18 :: (CBlockItem) -> (HappyAbsSyn )
+happyIn18 x = unsafeCoerce# x
+{-# INLINE happyIn18 #-}
+happyOut18 :: (HappyAbsSyn ) -> (CBlockItem)
+happyOut18 x = unsafeCoerce# x
+{-# INLINE happyOut18 #-}
+happyIn19 :: (CFunDef) -> (HappyAbsSyn )
+happyIn19 x = unsafeCoerce# x
+{-# INLINE happyIn19 #-}
+happyOut19 :: (HappyAbsSyn ) -> (CFunDef)
+happyOut19 x = unsafeCoerce# x
+{-# INLINE happyOut19 #-}
+happyIn20 :: (Reversed [Ident]) -> (HappyAbsSyn )
+happyIn20 x = unsafeCoerce# x
+{-# INLINE happyIn20 #-}
+happyOut20 :: (HappyAbsSyn ) -> (Reversed [Ident])
+happyOut20 x = unsafeCoerce# x
+{-# INLINE happyOut20 #-}
+happyIn21 :: (CStat) -> (HappyAbsSyn )
+happyIn21 x = unsafeCoerce# x
+{-# INLINE happyIn21 #-}
+happyOut21 :: (HappyAbsSyn ) -> (CStat)
+happyOut21 x = unsafeCoerce# x
+{-# INLINE happyOut21 #-}
+happyIn22 :: (CStat) -> (HappyAbsSyn )
+happyIn22 x = unsafeCoerce# x
+{-# INLINE happyIn22 #-}
+happyOut22 :: (HappyAbsSyn ) -> (CStat)
+happyOut22 x = unsafeCoerce# x
+{-# INLINE happyOut22 #-}
+happyIn23 :: (CStat) -> (HappyAbsSyn )
+happyIn23 x = unsafeCoerce# x
+{-# INLINE happyIn23 #-}
+happyOut23 :: (HappyAbsSyn ) -> (CStat)
+happyOut23 x = unsafeCoerce# x
+{-# INLINE happyOut23 #-}
+happyIn24 :: (CStat) -> (HappyAbsSyn )
+happyIn24 x = unsafeCoerce# x
+{-# INLINE happyIn24 #-}
+happyOut24 :: (HappyAbsSyn ) -> (CStat)
+happyOut24 x = unsafeCoerce# x
+{-# INLINE happyOut24 #-}
+happyIn25 :: (CAsmStmt) -> (HappyAbsSyn )
+happyIn25 x = unsafeCoerce# x
+{-# INLINE happyIn25 #-}
+happyOut25 :: (HappyAbsSyn ) -> (CAsmStmt)
+happyOut25 x = unsafeCoerce# x
+{-# INLINE happyOut25 #-}
+happyIn26 :: (Maybe CTypeQual) -> (HappyAbsSyn )
+happyIn26 x = unsafeCoerce# x
+{-# INLINE happyIn26 #-}
+happyOut26 :: (HappyAbsSyn ) -> (Maybe CTypeQual)
+happyOut26 x = unsafeCoerce# x
+{-# INLINE happyOut26 #-}
+happyIn27 :: ([CAsmOperand]) -> (HappyAbsSyn )
+happyIn27 x = unsafeCoerce# x
+{-# INLINE happyIn27 #-}
+happyOut27 :: (HappyAbsSyn ) -> ([CAsmOperand])
+happyOut27 x = unsafeCoerce# x
+{-# INLINE happyOut27 #-}
+happyIn28 :: (Reversed [CAsmOperand]) -> (HappyAbsSyn )
+happyIn28 x = unsafeCoerce# x
+{-# INLINE happyIn28 #-}
+happyOut28 :: (HappyAbsSyn ) -> (Reversed [CAsmOperand])
+happyOut28 x = unsafeCoerce# x
+{-# INLINE happyOut28 #-}
+happyIn29 :: (CAsmOperand) -> (HappyAbsSyn )
+happyIn29 x = unsafeCoerce# x
+{-# INLINE happyIn29 #-}
+happyOut29 :: (HappyAbsSyn ) -> (CAsmOperand)
+happyOut29 x = unsafeCoerce# x
+{-# INLINE happyOut29 #-}
+happyIn30 :: (Reversed [CStrLit]) -> (HappyAbsSyn )
+happyIn30 x = unsafeCoerce# x
+{-# INLINE happyIn30 #-}
+happyOut30 :: (HappyAbsSyn ) -> (Reversed [CStrLit])
+happyOut30 x = unsafeCoerce# x
+{-# INLINE happyOut30 #-}
+happyIn31 :: (CDecl) -> (HappyAbsSyn )
+happyIn31 x = unsafeCoerce# x
+{-# INLINE happyIn31 #-}
+happyOut31 :: (HappyAbsSyn ) -> (CDecl)
+happyOut31 x = unsafeCoerce# x
+{-# INLINE happyOut31 #-}
+happyIn32 :: (Reversed [CDecl]) -> (HappyAbsSyn )
+happyIn32 x = unsafeCoerce# x
+{-# INLINE happyIn32 #-}
+happyOut32 :: (HappyAbsSyn ) -> (Reversed [CDecl])
+happyOut32 x = unsafeCoerce# x
+{-# INLINE happyOut32 #-}
+happyIn33 :: (CDecl) -> (HappyAbsSyn )
+happyIn33 x = unsafeCoerce# x
+{-# INLINE happyIn33 #-}
+happyOut33 :: (HappyAbsSyn ) -> (CDecl)
+happyOut33 x = unsafeCoerce# x
+{-# INLINE happyOut33 #-}
+happyIn34 :: ((Maybe CStrLit, [CAttr])) -> (HappyAbsSyn )
+happyIn34 x = unsafeCoerce# x
+{-# INLINE happyIn34 #-}
+happyOut34 :: (HappyAbsSyn ) -> ((Maybe CStrLit, [CAttr]))
+happyOut34 x = unsafeCoerce# x
+{-# INLINE happyOut34 #-}
+happyIn35 :: (CDecl) -> (HappyAbsSyn )
+happyIn35 x = unsafeCoerce# x
+{-# INLINE happyIn35 #-}
+happyOut35 :: (HappyAbsSyn ) -> (CDecl)
+happyOut35 x = unsafeCoerce# x
+{-# INLINE happyOut35 #-}
+happyIn36 :: ([CDeclSpec]) -> (HappyAbsSyn )
+happyIn36 x = unsafeCoerce# x
+{-# INLINE happyIn36 #-}
+happyOut36 :: (HappyAbsSyn ) -> ([CDeclSpec])
+happyOut36 x = unsafeCoerce# x
+{-# INLINE happyOut36 #-}
+happyIn37 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )
+happyIn37 x = unsafeCoerce# x
+{-# INLINE happyIn37 #-}
+happyOut37 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])
+happyOut37 x = unsafeCoerce# x
+{-# INLINE happyOut37 #-}
+happyIn38 :: (CDeclSpec) -> (HappyAbsSyn )
+happyIn38 x = unsafeCoerce# x
+{-# INLINE happyIn38 #-}
+happyOut38 :: (HappyAbsSyn ) -> (CDeclSpec)
+happyOut38 x = unsafeCoerce# x
+{-# INLINE happyOut38 #-}
+happyIn39 :: (CStorageSpec) -> (HappyAbsSyn )
+happyIn39 x = unsafeCoerce# x
+{-# INLINE happyIn39 #-}
+happyOut39 :: (HappyAbsSyn ) -> (CStorageSpec)
+happyOut39 x = unsafeCoerce# x
+{-# INLINE happyOut39 #-}
+happyIn40 :: ([CDeclSpec]) -> (HappyAbsSyn )
+happyIn40 x = unsafeCoerce# x
+{-# INLINE happyIn40 #-}
+happyOut40 :: (HappyAbsSyn ) -> ([CDeclSpec])
+happyOut40 x = unsafeCoerce# x
+{-# INLINE happyOut40 #-}
+happyIn41 :: (CTypeSpec) -> (HappyAbsSyn )
+happyIn41 x = unsafeCoerce# x
+{-# INLINE happyIn41 #-}
+happyOut41 :: (HappyAbsSyn ) -> (CTypeSpec)
+happyOut41 x = unsafeCoerce# x
+{-# INLINE happyOut41 #-}
+happyIn42 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )
+happyIn42 x = unsafeCoerce# x
+{-# INLINE happyIn42 #-}
+happyOut42 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])
+happyOut42 x = unsafeCoerce# x
+{-# INLINE happyOut42 #-}
+happyIn43 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )
+happyIn43 x = unsafeCoerce# x
+{-# INLINE happyIn43 #-}
+happyOut43 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])
+happyOut43 x = unsafeCoerce# x
+{-# INLINE happyOut43 #-}
+happyIn44 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )
+happyIn44 x = unsafeCoerce# x
+{-# INLINE happyIn44 #-}
+happyOut44 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])
+happyOut44 x = unsafeCoerce# x
+{-# INLINE happyOut44 #-}
+happyIn45 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )
+happyIn45 x = unsafeCoerce# x
+{-# INLINE happyIn45 #-}
+happyOut45 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])
+happyOut45 x = unsafeCoerce# x
+{-# INLINE happyOut45 #-}
+happyIn46 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )
+happyIn46 x = unsafeCoerce# x
+{-# INLINE happyIn46 #-}
+happyOut46 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])
+happyOut46 x = unsafeCoerce# x
+{-# INLINE happyOut46 #-}
+happyIn47 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )
+happyIn47 x = unsafeCoerce# x
+{-# INLINE happyIn47 #-}
+happyOut47 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])
+happyOut47 x = unsafeCoerce# x
+{-# INLINE happyOut47 #-}
+happyIn48 :: (CTypeSpec) -> (HappyAbsSyn )
+happyIn48 x = unsafeCoerce# x
+{-# INLINE happyIn48 #-}
+happyOut48 :: (HappyAbsSyn ) -> (CTypeSpec)
+happyOut48 x = unsafeCoerce# x
+{-# INLINE happyOut48 #-}
+happyIn49 :: (CStructUnion) -> (HappyAbsSyn )
+happyIn49 x = unsafeCoerce# x
+{-# INLINE happyIn49 #-}
+happyOut49 :: (HappyAbsSyn ) -> (CStructUnion)
+happyOut49 x = unsafeCoerce# x
+{-# INLINE happyOut49 #-}
+happyIn50 :: (Located CStructTag) -> (HappyAbsSyn )
+happyIn50 x = unsafeCoerce# x
+{-# INLINE happyIn50 #-}
+happyOut50 :: (HappyAbsSyn ) -> (Located CStructTag)
+happyOut50 x = unsafeCoerce# x
+{-# INLINE happyOut50 #-}
+happyIn51 :: (Reversed [CDecl]) -> (HappyAbsSyn )
+happyIn51 x = unsafeCoerce# x
+{-# INLINE happyIn51 #-}
+happyOut51 :: (HappyAbsSyn ) -> (Reversed [CDecl])
+happyOut51 x = unsafeCoerce# x
+{-# INLINE happyOut51 #-}
+happyIn52 :: (CDecl) -> (HappyAbsSyn )
+happyIn52 x = unsafeCoerce# x
+{-# INLINE happyIn52 #-}
+happyOut52 :: (HappyAbsSyn ) -> (CDecl)
+happyOut52 x = unsafeCoerce# x
+{-# INLINE happyOut52 #-}
+happyIn53 :: (CDecl) -> (HappyAbsSyn )
+happyIn53 x = unsafeCoerce# x
+{-# INLINE happyIn53 #-}
+happyOut53 :: (HappyAbsSyn ) -> (CDecl)
+happyOut53 x = unsafeCoerce# x
+{-# INLINE happyOut53 #-}
+happyIn54 :: (CDecl) -> (HappyAbsSyn )
+happyIn54 x = unsafeCoerce# x
+{-# INLINE happyIn54 #-}
+happyOut54 :: (HappyAbsSyn ) -> (CDecl)
+happyOut54 x = unsafeCoerce# x
+{-# INLINE happyOut54 #-}
+happyIn55 :: ((Maybe CDeclr, Maybe CExpr)) -> (HappyAbsSyn )
+happyIn55 x = unsafeCoerce# x
+{-# INLINE happyIn55 #-}
+happyOut55 :: (HappyAbsSyn ) -> ((Maybe CDeclr, Maybe CExpr))
+happyOut55 x = unsafeCoerce# x
+{-# INLINE happyOut55 #-}
+happyIn56 :: ((Maybe CDeclr, Maybe CExpr)) -> (HappyAbsSyn )
+happyIn56 x = unsafeCoerce# x
+{-# INLINE happyIn56 #-}
+happyOut56 :: (HappyAbsSyn ) -> ((Maybe CDeclr, Maybe CExpr))
+happyOut56 x = unsafeCoerce# x
+{-# INLINE happyOut56 #-}
+happyIn57 :: (CEnum) -> (HappyAbsSyn )
+happyIn57 x = unsafeCoerce# x
+{-# INLINE happyIn57 #-}
+happyOut57 :: (HappyAbsSyn ) -> (CEnum)
+happyOut57 x = unsafeCoerce# x
+{-# INLINE happyOut57 #-}
+happyIn58 :: (Reversed [(Ident, Maybe CExpr)]) -> (HappyAbsSyn )
+happyIn58 x = unsafeCoerce# x
+{-# INLINE happyIn58 #-}
+happyOut58 :: (HappyAbsSyn ) -> (Reversed [(Ident, Maybe CExpr)])
+happyOut58 x = unsafeCoerce# x
+{-# INLINE happyOut58 #-}
+happyIn59 :: ((Ident, Maybe CExpr)) -> (HappyAbsSyn )
+happyIn59 x = unsafeCoerce# x
+{-# INLINE happyIn59 #-}
+happyOut59 :: (HappyAbsSyn ) -> ((Ident, Maybe CExpr))
+happyOut59 x = unsafeCoerce# x
+{-# INLINE happyOut59 #-}
+happyIn60 :: (CTypeQual) -> (HappyAbsSyn )
+happyIn60 x = unsafeCoerce# x
+{-# INLINE happyIn60 #-}
+happyOut60 :: (HappyAbsSyn ) -> (CTypeQual)
+happyOut60 x = unsafeCoerce# x
+{-# INLINE happyOut60 #-}
+happyIn61 :: (Reversed [CTypeQual]) -> (HappyAbsSyn )
+happyIn61 x = unsafeCoerce# x
+{-# INLINE happyIn61 #-}
+happyOut61 :: (HappyAbsSyn ) -> (Reversed [CTypeQual])
+happyOut61 x = unsafeCoerce# x
+{-# INLINE happyOut61 #-}
+happyIn62 :: (CDeclrR) -> (HappyAbsSyn )
+happyIn62 x = unsafeCoerce# x
+{-# INLINE happyIn62 #-}
+happyOut62 :: (HappyAbsSyn ) -> (CDeclrR)
+happyOut62 x = unsafeCoerce# x
+{-# INLINE happyOut62 #-}
+happyIn63 :: (Maybe CStrLit) -> (HappyAbsSyn )
+happyIn63 x = unsafeCoerce# x
+{-# INLINE happyIn63 #-}
+happyOut63 :: (HappyAbsSyn ) -> (Maybe CStrLit)
+happyOut63 x = unsafeCoerce# x
+{-# INLINE happyOut63 #-}
+happyIn64 :: (CDeclrR) -> (HappyAbsSyn )
+happyIn64 x = unsafeCoerce# x
+{-# INLINE happyIn64 #-}
+happyOut64 :: (HappyAbsSyn ) -> (CDeclrR)
+happyOut64 x = unsafeCoerce# x
+{-# INLINE happyOut64 #-}
+happyIn65 :: (CDeclrR) -> (HappyAbsSyn )
+happyIn65 x = unsafeCoerce# x
+{-# INLINE happyIn65 #-}
+happyOut65 :: (HappyAbsSyn ) -> (CDeclrR)
+happyOut65 x = unsafeCoerce# x
+{-# INLINE happyOut65 #-}
+happyIn66 :: (CDeclrR) -> (HappyAbsSyn )
+happyIn66 x = unsafeCoerce# x
+{-# INLINE happyIn66 #-}
+happyOut66 :: (HappyAbsSyn ) -> (CDeclrR)
+happyOut66 x = unsafeCoerce# x
+{-# INLINE happyOut66 #-}
+happyIn67 :: (CDeclrR) -> (HappyAbsSyn )
+happyIn67 x = unsafeCoerce# x
+{-# INLINE happyIn67 #-}
+happyOut67 :: (HappyAbsSyn ) -> (CDeclrR)
+happyOut67 x = unsafeCoerce# x
+{-# INLINE happyOut67 #-}
+happyIn68 :: (CDeclrR) -> (HappyAbsSyn )
+happyIn68 x = unsafeCoerce# x
+{-# INLINE happyIn68 #-}
+happyOut68 :: (HappyAbsSyn ) -> (CDeclrR)
+happyOut68 x = unsafeCoerce# x
+{-# INLINE happyOut68 #-}
+happyIn69 :: (CDeclrR) -> (HappyAbsSyn )
+happyIn69 x = unsafeCoerce# x
+{-# INLINE happyIn69 #-}
+happyOut69 :: (HappyAbsSyn ) -> (CDeclrR)
+happyOut69 x = unsafeCoerce# x
+{-# INLINE happyOut69 #-}
+happyIn70 :: (CDeclrR) -> (HappyAbsSyn )
+happyIn70 x = unsafeCoerce# x
+{-# INLINE happyIn70 #-}
+happyOut70 :: (HappyAbsSyn ) -> (CDeclrR)
+happyOut70 x = unsafeCoerce# x
+{-# INLINE happyOut70 #-}
+happyIn71 :: (CDeclrR) -> (HappyAbsSyn )
+happyIn71 x = unsafeCoerce# x
+{-# INLINE happyIn71 #-}
+happyOut71 :: (HappyAbsSyn ) -> (CDeclrR)
+happyOut71 x = unsafeCoerce# x
+{-# INLINE happyOut71 #-}
+happyIn72 :: (CDeclrR) -> (HappyAbsSyn )
+happyIn72 x = unsafeCoerce# x
+{-# INLINE happyIn72 #-}
+happyOut72 :: (HappyAbsSyn ) -> (CDeclrR)
+happyOut72 x = unsafeCoerce# x
+{-# INLINE happyOut72 #-}
+happyIn73 :: (CDeclrR) -> (HappyAbsSyn )
+happyIn73 x = unsafeCoerce# x
+{-# INLINE happyIn73 #-}
+happyOut73 :: (HappyAbsSyn ) -> (CDeclrR)
+happyOut73 x = unsafeCoerce# x
+{-# INLINE happyOut73 #-}
+happyIn74 :: (CDeclrR) -> (HappyAbsSyn )
+happyIn74 x = unsafeCoerce# x
+{-# INLINE happyIn74 #-}
+happyOut74 :: (HappyAbsSyn ) -> (CDeclrR)
+happyOut74 x = unsafeCoerce# x
+{-# INLINE happyOut74 #-}
+happyIn75 :: (CDeclr) -> (HappyAbsSyn )
+happyIn75 x = unsafeCoerce# x
+{-# INLINE happyIn75 #-}
+happyOut75 :: (HappyAbsSyn ) -> (CDeclr)
+happyOut75 x = unsafeCoerce# x
+{-# INLINE happyOut75 #-}
+happyIn76 :: (CDeclrR) -> (HappyAbsSyn )
+happyIn76 x = unsafeCoerce# x
+{-# INLINE happyIn76 #-}
+happyOut76 :: (HappyAbsSyn ) -> (CDeclrR)
+happyOut76 x = unsafeCoerce# x
+{-# INLINE happyOut76 #-}
+happyIn77 :: (CDeclrR) -> (HappyAbsSyn )
+happyIn77 x = unsafeCoerce# x
+{-# INLINE happyIn77 #-}
+happyOut77 :: (HappyAbsSyn ) -> (CDeclrR)
+happyOut77 x = unsafeCoerce# x
+{-# INLINE happyOut77 #-}
+happyIn78 :: (([CDecl], Bool)) -> (HappyAbsSyn )
+happyIn78 x = unsafeCoerce# x
+{-# INLINE happyIn78 #-}
+happyOut78 :: (HappyAbsSyn ) -> (([CDecl], Bool))
+happyOut78 x = unsafeCoerce# x
+{-# INLINE happyOut78 #-}
+happyIn79 :: (Reversed [CDecl]) -> (HappyAbsSyn )
+happyIn79 x = unsafeCoerce# x
+{-# INLINE happyIn79 #-}
+happyOut79 :: (HappyAbsSyn ) -> (Reversed [CDecl])
+happyOut79 x = unsafeCoerce# x
+{-# INLINE happyOut79 #-}
+happyIn80 :: (CDecl) -> (HappyAbsSyn )
+happyIn80 x = unsafeCoerce# x
+{-# INLINE happyIn80 #-}
+happyOut80 :: (HappyAbsSyn ) -> (CDecl)
+happyOut80 x = unsafeCoerce# x
+{-# INLINE happyOut80 #-}
+happyIn81 :: (Reversed [Ident]) -> (HappyAbsSyn )
+happyIn81 x = unsafeCoerce# x
+{-# INLINE happyIn81 #-}
+happyOut81 :: (HappyAbsSyn ) -> (Reversed [Ident])
+happyOut81 x = unsafeCoerce# x
+{-# INLINE happyOut81 #-}
+happyIn82 :: (CDecl) -> (HappyAbsSyn )
+happyIn82 x = unsafeCoerce# x
+{-# INLINE happyIn82 #-}
+happyOut82 :: (HappyAbsSyn ) -> (CDecl)
+happyOut82 x = unsafeCoerce# x
+{-# INLINE happyOut82 #-}
+happyIn83 :: (CDeclrR) -> (HappyAbsSyn )
+happyIn83 x = unsafeCoerce# x
+{-# INLINE happyIn83 #-}
+happyOut83 :: (HappyAbsSyn ) -> (CDeclrR)
+happyOut83 x = unsafeCoerce# x
+{-# INLINE happyOut83 #-}
+happyIn84 :: (CDeclrR -> CDeclrR) -> (HappyAbsSyn )
+happyIn84 x = unsafeCoerce# x
+{-# INLINE happyIn84 #-}
+happyOut84 :: (HappyAbsSyn ) -> (CDeclrR -> CDeclrR)
+happyOut84 x = unsafeCoerce# x
+{-# INLINE happyOut84 #-}
+happyIn85 :: (CDeclrR -> CDeclrR) -> (HappyAbsSyn )
+happyIn85 x = unsafeCoerce# x
+{-# INLINE happyIn85 #-}
+happyOut85 :: (HappyAbsSyn ) -> (CDeclrR -> CDeclrR)
+happyOut85 x = unsafeCoerce# x
+{-# INLINE happyOut85 #-}
+happyIn86 :: (CDeclrR -> CDeclrR) -> (HappyAbsSyn )
+happyIn86 x = unsafeCoerce# x
+{-# INLINE happyIn86 #-}
+happyOut86 :: (HappyAbsSyn ) -> (CDeclrR -> CDeclrR)
+happyOut86 x = unsafeCoerce# x
+{-# INLINE happyOut86 #-}
+happyIn87 :: (CDeclrR) -> (HappyAbsSyn )
+happyIn87 x = unsafeCoerce# x
+{-# INLINE happyIn87 #-}
+happyOut87 :: (HappyAbsSyn ) -> (CDeclrR)
+happyOut87 x = unsafeCoerce# x
+{-# INLINE happyOut87 #-}
+happyIn88 :: (CDeclrR) -> (HappyAbsSyn )
+happyIn88 x = unsafeCoerce# x
+{-# INLINE happyIn88 #-}
+happyOut88 :: (HappyAbsSyn ) -> (CDeclrR)
+happyOut88 x = unsafeCoerce# x
+{-# INLINE happyOut88 #-}
+happyIn89 :: (CInit) -> (HappyAbsSyn )
+happyIn89 x = unsafeCoerce# x
+{-# INLINE happyIn89 #-}
+happyOut89 :: (HappyAbsSyn ) -> (CInit)
+happyOut89 x = unsafeCoerce# x
+{-# INLINE happyOut89 #-}
+happyIn90 :: (Maybe CInit) -> (HappyAbsSyn )
+happyIn90 x = unsafeCoerce# x
+{-# INLINE happyIn90 #-}
+happyOut90 :: (HappyAbsSyn ) -> (Maybe CInit)
+happyOut90 x = unsafeCoerce# x
+{-# INLINE happyOut90 #-}
+happyIn91 :: (Reversed CInitList) -> (HappyAbsSyn )
+happyIn91 x = unsafeCoerce# x
+{-# INLINE happyIn91 #-}
+happyOut91 :: (HappyAbsSyn ) -> (Reversed CInitList)
+happyOut91 x = unsafeCoerce# x
+{-# INLINE happyOut91 #-}
+happyIn92 :: ([CDesignator]) -> (HappyAbsSyn )
+happyIn92 x = unsafeCoerce# x
+{-# INLINE happyIn92 #-}
+happyOut92 :: (HappyAbsSyn ) -> ([CDesignator])
+happyOut92 x = unsafeCoerce# x
+{-# INLINE happyOut92 #-}
+happyIn93 :: (Reversed [CDesignator]) -> (HappyAbsSyn )
+happyIn93 x = unsafeCoerce# x
+{-# INLINE happyIn93 #-}
+happyOut93 :: (HappyAbsSyn ) -> (Reversed [CDesignator])
+happyOut93 x = unsafeCoerce# x
+{-# INLINE happyOut93 #-}
+happyIn94 :: (CDesignator) -> (HappyAbsSyn )
+happyIn94 x = unsafeCoerce# x
+{-# INLINE happyIn94 #-}
+happyOut94 :: (HappyAbsSyn ) -> (CDesignator)
+happyOut94 x = unsafeCoerce# x
+{-# INLINE happyOut94 #-}
+happyIn95 :: (CDesignator) -> (HappyAbsSyn )
+happyIn95 x = unsafeCoerce# x
+{-# INLINE happyIn95 #-}
+happyOut95 :: (HappyAbsSyn ) -> (CDesignator)
+happyOut95 x = unsafeCoerce# x
+{-# INLINE happyOut95 #-}
+happyIn96 :: (CExpr) -> (HappyAbsSyn )
+happyIn96 x = unsafeCoerce# x
+{-# INLINE happyIn96 #-}
+happyOut96 :: (HappyAbsSyn ) -> (CExpr)
+happyOut96 x = unsafeCoerce# x
+{-# INLINE happyOut96 #-}
+happyIn97 :: (Reversed [CDesignator]) -> (HappyAbsSyn )
+happyIn97 x = unsafeCoerce# x
+{-# INLINE happyIn97 #-}
+happyOut97 :: (HappyAbsSyn ) -> (Reversed [CDesignator])
+happyOut97 x = unsafeCoerce# x
+{-# INLINE happyOut97 #-}
+happyIn98 :: (CExpr) -> (HappyAbsSyn )
+happyIn98 x = unsafeCoerce# x
+{-# INLINE happyIn98 #-}
+happyOut98 :: (HappyAbsSyn ) -> (CExpr)
+happyOut98 x = unsafeCoerce# x
+{-# INLINE happyOut98 #-}
+happyIn99 :: (Reversed [CExpr]) -> (HappyAbsSyn )
+happyIn99 x = unsafeCoerce# x
+{-# INLINE happyIn99 #-}
+happyOut99 :: (HappyAbsSyn ) -> (Reversed [CExpr])
+happyOut99 x = unsafeCoerce# x
+{-# INLINE happyOut99 #-}
+happyIn100 :: (CExpr) -> (HappyAbsSyn )
+happyIn100 x = unsafeCoerce# x
+{-# INLINE happyIn100 #-}
+happyOut100 :: (HappyAbsSyn ) -> (CExpr)
+happyOut100 x = unsafeCoerce# x
+{-# INLINE happyOut100 #-}
+happyIn101 :: (Located CUnaryOp) -> (HappyAbsSyn )
+happyIn101 x = unsafeCoerce# x
+{-# INLINE happyIn101 #-}
+happyOut101 :: (HappyAbsSyn ) -> (Located CUnaryOp)
+happyOut101 x = unsafeCoerce# x
+{-# INLINE happyOut101 #-}
+happyIn102 :: (CExpr) -> (HappyAbsSyn )
+happyIn102 x = unsafeCoerce# x
+{-# INLINE happyIn102 #-}
+happyOut102 :: (HappyAbsSyn ) -> (CExpr)
+happyOut102 x = unsafeCoerce# x
+{-# INLINE happyOut102 #-}
+happyIn103 :: (CExpr) -> (HappyAbsSyn )
+happyIn103 x = unsafeCoerce# x
+{-# INLINE happyIn103 #-}
+happyOut103 :: (HappyAbsSyn ) -> (CExpr)
+happyOut103 x = unsafeCoerce# x
+{-# INLINE happyOut103 #-}
+happyIn104 :: (CExpr) -> (HappyAbsSyn )
+happyIn104 x = unsafeCoerce# x
+{-# INLINE happyIn104 #-}
+happyOut104 :: (HappyAbsSyn ) -> (CExpr)
+happyOut104 x = unsafeCoerce# x
+{-# INLINE happyOut104 #-}
+happyIn105 :: (CExpr) -> (HappyAbsSyn )
+happyIn105 x = unsafeCoerce# x
+{-# INLINE happyIn105 #-}
+happyOut105 :: (HappyAbsSyn ) -> (CExpr)
+happyOut105 x = unsafeCoerce# x
+{-# INLINE happyOut105 #-}
+happyIn106 :: (CExpr) -> (HappyAbsSyn )
+happyIn106 x = unsafeCoerce# x
+{-# INLINE happyIn106 #-}
+happyOut106 :: (HappyAbsSyn ) -> (CExpr)
+happyOut106 x = unsafeCoerce# x
+{-# INLINE happyOut106 #-}
+happyIn107 :: (CExpr) -> (HappyAbsSyn )
+happyIn107 x = unsafeCoerce# x
+{-# INLINE happyIn107 #-}
+happyOut107 :: (HappyAbsSyn ) -> (CExpr)
+happyOut107 x = unsafeCoerce# x
+{-# INLINE happyOut107 #-}
+happyIn108 :: (CExpr) -> (HappyAbsSyn )
+happyIn108 x = unsafeCoerce# x
+{-# INLINE happyIn108 #-}
+happyOut108 :: (HappyAbsSyn ) -> (CExpr)
+happyOut108 x = unsafeCoerce# x
+{-# INLINE happyOut108 #-}
+happyIn109 :: (CExpr) -> (HappyAbsSyn )
+happyIn109 x = unsafeCoerce# x
+{-# INLINE happyIn109 #-}
+happyOut109 :: (HappyAbsSyn ) -> (CExpr)
+happyOut109 x = unsafeCoerce# x
+{-# INLINE happyOut109 #-}
+happyIn110 :: (CExpr) -> (HappyAbsSyn )
+happyIn110 x = unsafeCoerce# x
+{-# INLINE happyIn110 #-}
+happyOut110 :: (HappyAbsSyn ) -> (CExpr)
+happyOut110 x = unsafeCoerce# x
+{-# INLINE happyOut110 #-}
+happyIn111 :: (CExpr) -> (HappyAbsSyn )
+happyIn111 x = unsafeCoerce# x
+{-# INLINE happyIn111 #-}
+happyOut111 :: (HappyAbsSyn ) -> (CExpr)
+happyOut111 x = unsafeCoerce# x
+{-# INLINE happyOut111 #-}
+happyIn112 :: (CExpr) -> (HappyAbsSyn )
+happyIn112 x = unsafeCoerce# x
+{-# INLINE happyIn112 #-}
+happyOut112 :: (HappyAbsSyn ) -> (CExpr)
+happyOut112 x = unsafeCoerce# x
+{-# INLINE happyOut112 #-}
+happyIn113 :: (CExpr) -> (HappyAbsSyn )
+happyIn113 x = unsafeCoerce# x
+{-# INLINE happyIn113 #-}
+happyOut113 :: (HappyAbsSyn ) -> (CExpr)
+happyOut113 x = unsafeCoerce# x
+{-# INLINE happyOut113 #-}
+happyIn114 :: (CExpr) -> (HappyAbsSyn )
+happyIn114 x = unsafeCoerce# x
+{-# INLINE happyIn114 #-}
+happyOut114 :: (HappyAbsSyn ) -> (CExpr)
+happyOut114 x = unsafeCoerce# x
+{-# INLINE happyOut114 #-}
+happyIn115 :: (Located CAssignOp) -> (HappyAbsSyn )
+happyIn115 x = unsafeCoerce# x
+{-# INLINE happyIn115 #-}
+happyOut115 :: (HappyAbsSyn ) -> (Located CAssignOp)
+happyOut115 x = unsafeCoerce# x
+{-# INLINE happyOut115 #-}
+happyIn116 :: (CExpr) -> (HappyAbsSyn )
+happyIn116 x = unsafeCoerce# x
+{-# INLINE happyIn116 #-}
+happyOut116 :: (HappyAbsSyn ) -> (CExpr)
+happyOut116 x = unsafeCoerce# x
+{-# INLINE happyOut116 #-}
+happyIn117 :: (Reversed [CExpr]) -> (HappyAbsSyn )
+happyIn117 x = unsafeCoerce# x
+{-# INLINE happyIn117 #-}
+happyOut117 :: (HappyAbsSyn ) -> (Reversed [CExpr])
+happyOut117 x = unsafeCoerce# x
+{-# INLINE happyOut117 #-}
+happyIn118 :: (Maybe CExpr) -> (HappyAbsSyn )
+happyIn118 x = unsafeCoerce# x
+{-# INLINE happyIn118 #-}
+happyOut118 :: (HappyAbsSyn ) -> (Maybe CExpr)
+happyOut118 x = unsafeCoerce# x
+{-# INLINE happyOut118 #-}
+happyIn119 :: (Maybe CExpr) -> (HappyAbsSyn )
+happyIn119 x = unsafeCoerce# x
+{-# INLINE happyIn119 #-}
+happyOut119 :: (HappyAbsSyn ) -> (Maybe CExpr)
+happyOut119 x = unsafeCoerce# x
+{-# INLINE happyOut119 #-}
+happyIn120 :: (CExpr) -> (HappyAbsSyn )
+happyIn120 x = unsafeCoerce# x
+{-# INLINE happyIn120 #-}
+happyOut120 :: (HappyAbsSyn ) -> (CExpr)
+happyOut120 x = unsafeCoerce# x
+{-# INLINE happyOut120 #-}
+happyIn121 :: (CConst) -> (HappyAbsSyn )
+happyIn121 x = unsafeCoerce# x
+{-# INLINE happyIn121 #-}
+happyOut121 :: (HappyAbsSyn ) -> (CConst)
+happyOut121 x = unsafeCoerce# x
+{-# INLINE happyOut121 #-}
+happyIn122 :: (CStrLit) -> (HappyAbsSyn )
+happyIn122 x = unsafeCoerce# x
+{-# INLINE happyIn122 #-}
+happyOut122 :: (HappyAbsSyn ) -> (CStrLit)
+happyOut122 x = unsafeCoerce# x
+{-# INLINE happyOut122 #-}
+happyIn123 :: (Reversed [CString]) -> (HappyAbsSyn )
+happyIn123 x = unsafeCoerce# x
+{-# INLINE happyIn123 #-}
+happyOut123 :: (HappyAbsSyn ) -> (Reversed [CString])
+happyOut123 x = unsafeCoerce# x
+{-# INLINE happyOut123 #-}
+happyIn124 :: (Ident) -> (HappyAbsSyn )
+happyIn124 x = unsafeCoerce# x
+{-# INLINE happyIn124 #-}
+happyOut124 :: (HappyAbsSyn ) -> (Ident)
+happyOut124 x = unsafeCoerce# x
+{-# INLINE happyOut124 #-}
+happyIn125 :: ([CAttr]) -> (HappyAbsSyn )
+happyIn125 x = unsafeCoerce# x
+{-# INLINE happyIn125 #-}
+happyOut125 :: (HappyAbsSyn ) -> ([CAttr])
+happyOut125 x = unsafeCoerce# x
+{-# INLINE happyOut125 #-}
+happyIn126 :: ([CAttr]) -> (HappyAbsSyn )
+happyIn126 x = unsafeCoerce# x
+{-# INLINE happyIn126 #-}
+happyOut126 :: (HappyAbsSyn ) -> ([CAttr])
+happyOut126 x = unsafeCoerce# x
+{-# INLINE happyOut126 #-}
+happyIn127 :: ([CAttr]) -> (HappyAbsSyn )
+happyIn127 x = unsafeCoerce# x
+{-# INLINE happyIn127 #-}
+happyOut127 :: (HappyAbsSyn ) -> ([CAttr])
+happyOut127 x = unsafeCoerce# x
+{-# INLINE happyOut127 #-}
+happyIn128 :: (Reversed [CAttr]) -> (HappyAbsSyn )
+happyIn128 x = unsafeCoerce# x
+{-# INLINE happyIn128 #-}
+happyOut128 :: (HappyAbsSyn ) -> (Reversed [CAttr])
+happyOut128 x = unsafeCoerce# x
+{-# INLINE happyOut128 #-}
+happyIn129 :: (Maybe CAttr) -> (HappyAbsSyn )
+happyIn129 x = unsafeCoerce# x
+{-# INLINE happyIn129 #-}
+happyOut129 :: (HappyAbsSyn ) -> (Maybe CAttr)
+happyOut129 x = unsafeCoerce# x
+{-# INLINE happyOut129 #-}
+happyIn130 :: (Reversed [CExpr]) -> (HappyAbsSyn )
+happyIn130 x = unsafeCoerce# x
+{-# INLINE happyIn130 #-}
+happyOut130 :: (HappyAbsSyn ) -> (Reversed [CExpr])
+happyOut130 x = unsafeCoerce# x
+{-# INLINE happyOut130 #-}
+happyInTok :: CToken -> (HappyAbsSyn )
+happyInTok x = unsafeCoerce# x
+{-# INLINE happyInTok #-}
+happyOutTok :: (HappyAbsSyn ) -> CToken
+happyOutTok x = unsafeCoerce# x
+{-# INLINE happyOutTok #-}
+
+happyActOffsets :: HappyAddr
+happyActOffsets = HappyA# "\x00\x00\x9a\x09\x18\x0f\x00\x00\x47\x07\x00\x00\xf3\x08\x18\x20\x18\x0f\x00\x00\x69\x09\xc3\x04\x98\x04\xdb\x04\x8e\x04\x63\x08\x48\x08\x3f\x08\x35\x08\x6a\x04\x00\x00\x19\x08\xee\x07\x00\x00\x00\x00\xd2\x08\x00\x00\x00\x00\xb4\x0e\xb4\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x23\x04\x96\x0e\x7d\x0e\x00\x00\x00\x00\x00\x00\xe9\x07\x00\x00\x19\x0e\xfb\x0d\xfb\x0d\x40\x08\x3b\x08\x33\x08\xc5\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf5\x07\xfe\x07\x00\x00\x00\x00\x11\x05\xf0\x07\xe2\x0d\xed\x07\xf2\x07\x9a\x09\x0e\x08\x41\x00\xeb\x07\xe2\x0d\xe1\x07\xcf\x07\xad\x07\x00\x00\x5f\x07\xe2\x0d\xe2\x0d\x00\x00\x97\x07\xe2\x0d\x92\x07\xe2\x0d\x00\x00\x0a\x08\x64\x07\x9a\x09\x00\x00\x00\x00\x00\x00\x63\x01\x00\x00\xb4\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x07\x4d\x07\x00\x00\x1c\x1a\x1c\x1a\xe2\x0d\x00\x00\xd2\x08\x00\x00\x00\x00\x3b\x07\x00\x00\x00\x00\xd2\x08\x00\x00\xd2\x08\x00\x00\x00\x00\x00\x00\x91\x07\xbb\x02\x00\x00\xeb\x15\x72\x04\x72\x04\x00\x00\x00\x00\x2f\x07\x00\x00\x41\x0a\x8e\x07\x81\x07\x11\x05\xf8\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x07\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x07\xe2\x0d\xe2\x0d\x7e\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\xe2\x0d\x00\x00\xe2\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x0d\xe2\x0d\x23\x04\x23\x04\x00\x00\x00\x00\x00\x00\x00\x00\x51\x07\x00\x00\x32\x04\x2f\x04\xc8\x00\x8d\x11\x00\x00\xc8\x00\xf3\x18\xf3\x18\x6a\x17\x5a\x17\xe8\x07\xe8\x07\x5e\x11\x00\x00\x00\x00\x00\x00\xbf\x01\x00\x00\x00\x00\x00\x00\x41\x12\x45\x02\x45\x02\x00\x00\x7a\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x0f\x00\x00\x1e\x07\x22\x0b\x00\x00\x00\x00\x43\x01\x71\x07\x5c\x09\x6d\x07\x43\x01\x3f\x07\x00\x00\x00\x00\x00\x00\x89\x01\x00\x00\x00\x00\x69\x07\x00\x00\x91\x17\x00\x00\x62\x07\x00\x00\xed\x17\xc6\x0a\x38\x07\x00\x00\x00\x00\x00\x00\x00\x00\x89\x01\x00\x00\x2f\x11\x44\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x07\x25\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x07\x00\x00\x42\x02\x35\x02\x4a\x00\x17\x07\x00\x00\x00\x00\x00\x00\x89\x01\x00\x00\x00\x00\x32\x07\x00\x00\x16\x07\x02\x07\x00\x00\xcf\x06\x00\x00\xcf\x06\x00\x00\x00\x00\x00\x00\x00\x00\x15\x07\x3c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x09\x4b\x09\x1c\x04\x1c\x04\xee\x03\xee\x03\xee\x03\xee\x03\xdb\x04\xdb\x04\xd8\x03\x07\x07\xfc\x06\xf8\x06\xf6\x06\xe2\x0d\xf4\x06\x00\x00\xe2\x06\x0a\x07\x36\x09\xd8\x01\xa9\x06\x00\x00\x00\x00\x48\x0d\x00\x00\x00\x00\x00\x00\xa9\x06\xb0\x19\x8c\x19\x00\x11\x96\x12\xd0\x01\x00\x00\x00\x00\xf5\x06\xef\x06\x00\x00\xea\x06\xb2\x06\xae\x06\xad\x06\x9a\x09\xa6\x07\x76\x06\x72\x06\x71\x06\x9a\x09\xe2\x0d\x00\x00\xb9\x06\xc5\x18\x8d\x06\x8c\x06\x00\x00\x9c\x06\x00\x00\x9b\x06\x97\x06\x9a\x09\x9a\x09\x9a\x09\x00\x00\xe2\x0d\xe2\x0d\x9f\x00\xd1\x10\x9f\x00\xa2\x10\x12\x12\xe2\x0d\x75\x06\x00\x00\x39\x02\x6a\x03\x00\x00\xa6\x07\x30\x06\x00\x00\x60\x06\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x73\x10\x9f\x00\x44\x10\x6c\x06\x6e\x08\x00\x00\xd4\x19\x35\x03\xd4\x19\x5b\x06\x5b\x06\x5b\x06\x56\x06\x00\x00\xe7\x0e\x00\x00\x0f\x01\x3b\x02\xe6\x0f\x3b\x02\xe8\x07\xe8\x07\xb7\x0f\x70\x06\x42\x06\x00\x00\x55\x06\x4f\x06\x14\x00\xeb\x11\x00\x00\x00\x00\x00\x00\x4b\x06\x00\x00\x00\x00\x00\x00\x47\x0c\x05\x06\x35\x03\x3a\x06\x28\x06\xd8\xff\xe2\x0d\x00\x00\xe2\x0d\x00\x00\xe2\x0d\x00\x00\x3c\x00\x9f\x00\x91\x17\x04\x06\x95\x05\xf3\x05\x00\x00\x36\x09\x91\x17\xce\x05\x00\x00\x00\x00\x77\x18\xaa\x0a\x00\x00\x00\x00\x0f\x02\x78\x01\xea\x05\xe5\x05\x4a\x00\xdb\x00\x78\x01\x00\x00\x91\x17\xcb\x05\x00\x00\x36\x09\xb6\x05\x00\x00\x89\x01\x00\x00\x91\x17\xb3\x05\x00\x00\x62\x0a\x00\x00\xc8\x05\xa7\x0b\x17\x00\x69\x05\x12\x01\x9e\x18\x00\x00\x00\x00\x00\x00\x36\x09\x91\x17\x98\x05\x00\x00\xaf\x05\x37\x09\x12\x00\x12\x00\x4a\x00\x00\x00\x4a\x00\x00\x00\x4a\x00\x00\x00\x00\x00\x14\x09\x9a\x05\x66\x05\x00\x00\x00\x00\x00\x00\x14\x09\x01\x09\x00\x00\x4a\x00\x00\x00\xe4\x0c\x00\x00\x88\x05\x81\x05\x00\x00\x1d\x05\x72\x04\x29\x0c\x74\x05\x64\x05\x17\x00\x00\x00\x62\x05\x0e\x05\xfe\x09\x17\x00\x00\x00\x00\x00\x91\x17\x34\x05\x00\x00\x58\x05\x56\x05\x00\x00\x00\x00\xe9\x08\x54\x05\x0c\x00\x5a\x01\x4b\x05\x4a\x00\x4a\x00\xe6\x08\x00\x00\x00\x00\x00\x00\xa7\x0a\x2d\x01\x00\x00\x00\x00\x4a\x05\x48\x05\xe7\x04\x00\x00\x00\x00\x00\x00\x02\x05\x00\x00\xb9\x00\x94\x00\x02\x05\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x00\x00\x2b\x05\x00\x00\x00\x00\x26\x02\x00\x00\x08\x05\x35\x03\x00\x00\x33\x01\xe4\x0c\x64\x03\x00\x00\xc4\x02\x00\x00\xf9\x04\xe2\x0d\x35\x03\xc5\x0b\x36\x09\x13\x05\x10\x05\x13\x00\x00\x00\x4a\x00\x00\x00\xbf\x17\x00\x00\xb1\x04\x00\x00\x49\x18\x1b\x18\x88\x0f\xa3\x0a\xb1\x04\xb1\x04\x00\x00\x59\x0f\x10\x07\xb1\x04\x00\x00\xb1\x04\xb1\x04\x00\x00\x00\x00\x00\x00\x00\x00\x72\x04\x35\x17\x00\x00\xf8\x04\x3f\x03\x00\x00\xf6\x04\x00\x00\xc6\x04\x15\x10\xc6\x04\xc6\x04\xc6\x04\x00\x00\x5f\x03\xb0\x04\x00\x00\xbf\x04\x64\x00\x9a\x09\xdc\x04\xa6\x04\xa6\x04\x15\x10\xa6\x04\xa7\x04\x97\x04\x58\x04\x00\x00\x00\x00\x9a\x09\xe2\x0d\xe2\x0d\x83\x04\x65\x04\x00\x00\x14\x02\x64\x04\x00\x00\x88\x04\x29\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x04\x00\x00\x00\x00\x00\x00\xe2\x0d\x0c\x03\x00\x00\x08\x17\x9b\x02\x00\x00\x39\x03\xf5\x02\x68\x19\x7a\x12\x00\x00\x00\x00\x17\x19\x00\x00\x00\x00\x00\x00\x7b\x04\x8f\x00\xbc\x11\x00\x00\x00\x00\x05\x09\x26\x01\xeb\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x00\x00\x00\x80\x04\x6c\x04\xae\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x0b\x00\x00\x59\x00\xe2\x0d\xa9\x02\x00\x00\xc6\x0c\x68\x04\xd8\xff\x49\x04\xbd\x00\x2b\x00\x2b\x00\x49\x04\x61\x04\x00\x00\x00\x00\xd3\x08\x00\x00\x00\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x04\x4d\x04\x17\x00\xd5\x03\x00\x00\x48\x04\x00\x00\x00\x00\x45\x04\xe2\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x04\x00\x00\x00\x00\xe2\x0d\x3d\x04\x00\x00\x00\x00\x00\x00\x3d\x00\xad\x08\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x02\x00\x00\x00\x00\xab\x0c\x00\x00\x00\x00\xe2\x0d\x2a\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x14\x09\x3d\x00\x00\x00\xd1\x03\x0f\x04\xe2\x0d\xab\x02\x44\x19\xaf\x03\x00\x00\xaf\x03\x00\x00\xaf\x03\xeb\x03\xe2\x0d\x00\x00\x00\x00\x03\x04\x00\x00\xfe\x03\xe9\x03\xe2\x0d\x64\x00\xc0\x03\x64\x00\x00\x00\xe5\x03\xe0\x03\x00\x00\x9a\x09\x9a\x09\xec\x00\x00\x00\x00\x00\xde\x03\x77\x03\x77\x03\x00\x00\x00\x00\xe2\x0d\x00\x00\xab\x02\x9b\x02\x70\x03\x00\x00\xe2\x0d\x00\x00\x00\x00\xc8\x03\x00\x00\x00\x00\x00\x00\xe2\x0d\x00\x00\x00\x00\xc4\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x03\x66\x03\x00\x00\xb9\x03\xa7\x03\x00\x00\x76\x03\x34\x03\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\xe2\x0d\xe2\x0d\x00\x00\x7f\x03\x6f\x03\x44\x03\x06\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
+
+happyGotoOffsets :: HappyAddr
+happyGotoOffsets = HappyA# "\x77\x02\x9a\x06\xfd\x1c\x5e\x03\x38\x00\x00\x00\x00\x00\xd6\x02\xd9\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x03\x00\x00\x00\x00\x4f\x0e\x34\x0e\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x02\x9c\x0a\x80\x0a\x00\x00\x00\x00\x00\x00\xc5\x02\x00\x00\xbd\x0d\x57\x0a\x85\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x03\x82\x00\x00\x00\xad\x1e\x00\x00\x00\x00\x7f\x06\x00\x00\xbf\x02\x00\x00\x83\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x1c\xc7\x1c\x00\x00\x00\x00\xac\x1c\x00\x00\x91\x1c\x00\x00\x5f\x06\x00\x00\x15\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x23\x08\x00\x00\xce\x15\xb4\x15\x92\x1e\x00\x00\xae\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x88\x02\x00\x00\x22\x02\x00\x00\x00\x00\x00\x00\x00\x00\x30\x05\x00\x00\x8b\x00\xfb\xff\xcf\xff\x00\x00\x00\x00\xf9\x07\x00\x00\xb9\x15\x00\x00\x00\x00\xee\x02\x73\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd3\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x1c\xfe\x1e\x5b\x1c\x19\x1f\x90\x14\x34\x1f\x41\x1f\x07\x0c\x85\x0b\x5c\x1f\x4f\x1f\x0b\x0f\x71\x0d\x99\x0d\xf4\x08\xb4\x0d\xc3\x07\x1d\x0b\xf3\x09\xb8\x09\x00\x00\x77\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x1c\x25\x1c\xb7\x02\xa7\x02\x00\x00\x00\x00\x00\x00\x00\x00\x04\x03\x00\x00\x00\x00\x00\x00\xf1\x05\x8a\x00\x00\x00\x51\x05\x84\x02\x16\x00\xa5\x02\x67\x01\x66\x01\x59\x01\x61\x00\x00\x00\x00\x00\x00\x00\xe3\x07\xef\x02\x00\x00\x00\x00\xdc\x00\x83\x03\xa1\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x90\x02\x3e\x08\x00\x00\x00\x00\xb5\x01\x00\x00\xe3\x07\x00\x00\x37\x02\xf7\x02\x00\x00\x00\x00\x00\x00\x1b\x02\xdb\x02\x00\x00\x00\x00\x00\x00\x74\x04\x00\x00\x52\x02\x00\x00\x60\x13\x51\x16\xd5\x02\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x01\xb8\x02\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x02\xbb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x02\x52\x0c\xb0\x16\xde\x07\xb0\x02\x00\x00\x00\x00\x00\x00\xa1\x01\x8f\x02\x00\x00\x00\x00\x00\x00\x9f\x02\x82\x01\x7a\x02\xb0\x07\x00\x00\x95\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe3\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x15\x09\x02\x24\x02\x00\x00\x00\x00\x60\x07\x00\x00\x00\x00\x00\x00\x04\x02\x28\x04\x00\x00\x2b\x13\xa1\x08\xfb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfa\x05\xfc\x01\x5f\x02\x06\x02\xd6\x01\xdf\x05\x5c\x1e\x00\x00\x00\x00\x6d\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x75\x05\x5a\x05\x3f\x05\x00\x00\x68\x1b\x4d\x1b\xf2\x1f\x0e\x07\xe5\x1f\xee\x13\x13\x14\x0a\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87\x01\xf2\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x0b\x0a\x01\x8b\x07\x05\x01\x00\x00\xfd\x06\x00\x00\x9c\x15\x88\x00\x86\x15\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x02\x11\x07\x00\x00\x0b\x03\xa1\x1f\x9e\x13\x89\x1f\x92\x00\x69\x00\xb2\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x01\x57\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x1a\x00\x00\x1f\x01\x00\x00\x00\x00\x65\x02\x41\x1e\x00\x00\xc8\x1e\x00\x00\x26\x1e\x00\x00\x75\x04\xd8\x1f\x4e\x04\xc4\x01\x40\x07\x00\x00\x00\x00\xd6\x14\x13\x04\xbd\x01\x00\x00\x00\x00\x98\x09\xed\x02\x00\x00\x00\x00\x33\x05\xff\x0b\x00\x00\x00\x00\x5a\x07\xfd\x01\x7d\x0b\x00\x00\xed\x03\xb6\x01\x00\x00\xb2\x14\xff\x01\x00\x00\x47\x01\xca\x01\xb2\x03\x8e\x01\x00\x00\xee\x15\x00\x00\x00\x00\xfb\x1a\x29\x07\xca\x00\x00\x00\x6d\x03\x00\x00\x00\x00\x00\x00\x5a\x14\x8c\x03\x68\x01\x00\x00\x00\x00\x4f\x07\x9a\x01\xb2\x04\x19\x07\x00\x00\xfe\x06\x00\x00\xfb\x06\x00\x00\x00\x00\x80\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x02\xfb\x06\x00\x00\xf0\x06\x00\x00\xe0\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x00\xba\x16\x00\x00\x00\x00\xc4\x06\x00\x00\x00\x00\x00\x00\x0e\x16\x2f\x06\x00\x00\x00\x00\x2b\x03\x60\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x06\x00\x00\x0b\x04\x3f\x0d\x00\x00\xdc\x06\xa0\x06\x86\x06\x00\x00\x00\x00\x00\x00\x65\x16\xdf\x03\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x01\x00\x00\x00\x00\x00\x00\x46\x01\x00\x00\xbe\x0c\x8f\x0e\x42\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\xc5\x1a\xd2\x01\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x1e\x25\x01\x28\x1a\x36\x14\x00\x00\x00\x00\xd1\x00\x00\x00\x66\x06\x00\x00\x90\x13\x00\x00\xf2\x05\x00\x00\xc7\x03\x00\x00\xf6\x12\xc1\x16\xd7\x05\xa9\x05\x00\x00\xbe\x12\x94\x16\xa6\x05\x00\x00\xa0\x05\x9d\x05\x00\x00\x00\x00\x00\x00\x00\x00\xce\xff\x54\x15\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x01\x2e\x01\x58\x01\x38\x01\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf5\xff\xd5\x04\x00\x00\x3a\x01\x19\x00\x90\x12\xf6\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\x04\x32\x1b\x17\x1b\xf4\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\x00\x00\x00\x00\x00\x00\x00\xef\x1b\x74\x00\x00\x00\x54\x15\xcb\x1f\x00\x00\x00\x00\x00\x00\xcb\x03\x28\x12\x00\x00\x00\x00\x3d\x15\x00\x00\x00\x00\x00\x00\x48\x16\xc1\x05\xea\x13\x00\x00\x00\x00\xff\x13\x61\x06\x91\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x1a\x00\x00\x00\x00\xf0\x1d\xe2\xff\x00\x00\x87\x1a\x00\x00\x6c\x00\x7f\x00\x2c\x0e\xa0\x0c\x80\x0c\x67\x00\x00\x00\x00\x00\x00\x00\xab\x05\x00\x00\x00\x00\x6f\x09\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x0b\xa8\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x05\x37\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd5\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x21\x05\x23\x05\x00\x00\x00\x00\x00\x00\x58\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\xff\x00\x00\x00\x00\xaa\x1a\x00\x00\x00\x00\x9f\x1d\x6c\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x80\x02\x21\x05\x00\x00\x30\x00\x00\x00\x84\x1d\x1e\x04\x28\x04\x95\x04\x00\x00\x49\x03\x00\x00\x23\x03\x00\x00\x69\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd4\x1b\xf8\xff\x00\x00\xf2\xff\x00\x00\x00\x00\x00\x00\x00\x00\x9d\x04\x65\x01\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xff\xcb\xff\x00\x00\x00\x00\x4e\x1d\x00\x00\x7a\x03\xbc\x1f\xba\xff\x00\x00\x33\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4\x02\xba\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\xff\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x1b\x9e\x1b\x00\x00\x00\x00\x00\x00\x00\x00\xa0\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
+
+happyDefActions :: HappyAddr
+happyDefActions = HappyA# "\xfb\xff\x00\x00\x00\x00\x00\x00\x3e\xfe\x9c\xfe\x90\xfe\x7e\xfe\x00\x00\x7c\xfe\x78\xfe\x75\xfe\x72\xfe\x6d\xfe\x6a\xfe\x68\xfe\x66\xfe\x64\xfe\x62\xfe\x60\xfe\x5d\xfe\x50\xfe\x00\x00\xa6\xfe\xa5\xfe\x3e\xfe\x7f\xfe\x80\xfe\x00\x00\x00\x00\x82\xfe\x81\xfe\x83\xfe\x84\xfe\x00\x00\x00\x00\x00\x00\x46\xfe\x47\xfe\x45\xfe\x44\xfe\xa7\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\xff\xe4\xff\xe3\xff\xe2\xff\xe1\xff\xe0\xff\xdf\xff\x00\x00\x00\x00\xc8\xff\xd8\xff\xb6\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\xfe\x00\x00\x00\x00\xa7\xfe\x3f\xfe\x00\x00\x00\x00\x00\x00\x4b\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x40\xfe\x4c\xfe\x00\x00\x00\x00\xbd\xff\x7e\xfe\x48\xfe\x00\x00\xbc\xff\x00\x00\xb5\xff\x30\xff\x2d\xff\x2e\xff\x2f\xff\xd6\xff\x3e\xfe\xc7\xff\x3e\xfe\x3e\xfe\x00\x00\x86\xfe\x3e\xfe\x87\xfe\x8d\xfe\x43\xfe\x42\xfe\x8b\xfe\x3e\xfe\x89\xfe\x3e\xfe\x85\xfe\x8e\xfe\x8f\xfe\x00\x00\xdf\xfe\x78\xff\x8b\xff\x8a\xff\x89\xff\x6d\xff\x53\xff\x3e\xfe\x52\xff\x00\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x3c\xfe\x7f\xff\x87\xff\x7e\xff\x82\xff\x3e\xfe\x83\xff\x85\xff\x84\xff\x86\xff\x81\xff\x4e\xff\x00\x00\x4d\xff\x80\xff\x88\xff\x61\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\xfe\x00\x00\x5b\xfe\x57\xfe\x56\xfe\x5a\xfe\x59\xfe\x58\xfe\x53\xfe\x52\xfe\x51\xfe\x55\xfe\x54\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x96\xfe\x95\xfe\xf9\xff\xf8\xff\x00\x00\xf7\xff\x00\x00\x00\x00\x00\x00\x00\x00\x99\xff\x00\x00\x9c\xff\x8b\xff\x9b\xff\x8a\xff\x9a\xff\x89\xff\x00\x00\xe6\xff\x0b\xff\x09\xff\x0a\xff\xa7\xff\xfc\xfe\xfb\xfe\x3d\xfe\x00\x00\x3e\xfe\xfa\xff\x00\x00\x8e\xff\x90\xff\x8d\xff\x8f\xff\x91\xff\x8c\xff\xff\xfe\x3e\xfe\xf6\xff\x00\x00\x00\x00\x08\xff\xfa\xfe\x3d\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\xff\x77\xff\x6c\xff\x27\xff\xa7\xff\x3b\xfe\x00\x00\x5b\xff\x3e\xfe\x04\xff\xd8\xfe\xd6\xfe\xf5\xfe\x4a\xfe\x00\x00\x97\xff\x76\xff\x6b\xff\x2b\xff\x27\xff\xa7\xff\x00\x00\x00\x00\x5e\xff\x67\xff\x55\xff\x54\xff\x63\xff\x93\xff\x92\xff\x62\xff\x70\xff\x69\xff\x68\xff\xaa\xff\x6f\xff\x6e\xff\xab\xff\x7c\xff\x73\xff\x74\xff\x72\xff\x7b\xff\x7a\xff\x79\xff\x00\x00\x27\xff\x28\xff\x24\xff\x21\xff\x20\xff\x25\xff\x17\xff\x29\xff\xa7\xff\x00\x00\x3e\xfe\x23\xff\x00\x00\x95\xff\x7d\xff\x71\xff\x27\xff\xa7\xff\x94\xff\x00\x00\x66\xff\x00\x00\x27\xff\xa7\xff\x3e\xfe\xa9\xff\x3e\xfe\xa8\xff\xf4\xff\x98\xfe\x97\xfe\x00\x00\x00\x00\x92\xfe\x9a\xfe\x5c\xfe\x79\xfe\x7a\xfe\x7b\xfe\x76\xfe\x77\xfe\x73\xfe\x74\xfe\x6e\xfe\x70\xfe\x6f\xfe\x71\xfe\x6b\xfe\x6c\xfe\x69\xfe\x67\xfe\x65\xfe\x63\xfe\x00\x00\x00\x00\x61\xfe\x4e\xfe\x4f\xfe\x00\x00\x3e\xfe\x00\x00\x3d\xfe\x2c\xff\xa4\xfe\x00\x00\xdc\xfe\xd9\xfe\xdb\xfe\xda\xfe\x00\x00\xdd\xfe\xf5\xfe\xc9\xfe\x00\x00\xde\xfe\xa3\xfe\x00\x00\x00\x00\x41\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\xff\xd6\xff\x00\x00\x00\x00\x00\x00\x00\x00\xdc\xff\x00\x00\x3e\xfe\x00\x00\x00\x00\xbf\xff\x00\x00\xbb\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\xff\x4c\xfe\x4c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x00\x00\x00\x00\xdd\xff\x00\x00\x00\x00\xe1\xfe\xd7\xff\x00\x00\xd4\xff\x00\x00\xd5\xff\xd3\xff\xd1\xff\xd2\xff\x00\x00\x00\x00\x00\x00\x00\x00\x61\xff\x3e\xfe\xde\xff\x3e\xfe\x00\x00\x3e\xfe\x00\x00\x8a\xfe\x88\xfe\x4f\xff\x4c\xff\x3e\xfe\xc7\xfe\xc5\xfe\xf0\xfe\xec\xfe\xe9\xfe\x9b\xff\x8a\xff\xe5\xfe\x00\x00\xf4\xfe\xf2\xfe\x00\x00\x00\x00\x00\x00\x3d\xfe\x75\xff\x6a\xff\x2a\xff\x00\x00\x58\xff\xbb\xfe\x7d\xfe\xb5\xfe\x35\xff\x00\x00\x00\x00\x00\x00\x37\xfe\x00\x00\x5e\xfe\x00\x00\x99\xfe\x00\x00\x9b\xfe\x00\x00\x00\x00\x3e\xfe\xb7\xfe\x3e\xfe\x00\x00\xf2\xff\x3e\xfe\x3e\xfe\xb7\xfe\xf0\xff\x22\xff\xf5\xfe\x00\x00\x1f\xff\x13\xff\x3d\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\xff\x3e\xfe\xb7\xfe\xf1\xff\x3e\xfe\x00\x00\x96\xff\x27\xff\xa7\xff\x3e\xfe\xb7\xfe\xef\xff\x4a\xfe\x49\xfe\x00\x00\x4a\xfe\x83\xfe\x3e\xfe\x00\x00\x3d\xfe\xd5\xfe\xed\xff\xa6\xff\x3e\xfe\x3e\xfe\xb7\xfe\xf3\xff\x00\x00\x00\x00\x00\x00\x3e\xfe\xf7\xfe\xfe\xfe\x03\xff\x07\xff\x0a\xff\x06\xff\xf9\xfe\x00\x00\x00\x00\x00\x00\x05\xff\x02\xff\xf6\xfe\x00\x00\x00\x00\xfd\xfe\x01\xff\xa2\xff\x00\x00\xec\xff\x00\x00\x00\x00\xf8\xfe\x00\x00\x3e\xfe\x00\x00\x00\x00\x00\x00\x83\xfe\xd4\xfe\x00\x00\x00\x00\x4a\xfe\x83\xfe\xa4\xff\xe8\xff\x3e\xfe\xb7\xfe\xee\xff\x00\x00\x00\x00\x9e\xff\xea\xff\x00\x00\x00\x00\x00\x00\x3e\xfe\x00\x00\x10\xff\x1b\xff\x00\x00\x1e\xff\x1d\xff\x12\xff\x00\x00\x00\x00\xa5\xff\xe9\xff\x00\x00\x00\x00\x00\x00\xa0\xff\x9f\xff\xeb\xff\x27\xff\x29\xff\x00\x00\x3e\xfe\x27\xff\x91\xfe\x5f\xfe\x4d\xfe\x00\x00\x39\xfe\x35\xfe\x36\xfe\x60\xff\x5f\xff\x00\x00\x34\xff\x32\xff\x00\x00\xb4\xfe\x00\x00\x00\x00\x00\x00\xad\xfe\xae\xfe\xba\xfe\x00\x00\x00\x00\x00\x00\xb5\xfe\x3e\xfe\x00\x00\x00\x00\x00\x00\xc2\xfe\xc3\xfe\xc1\xfe\x3e\xfe\xd7\xfe\x3e\xfe\xe3\xfe\x00\x00\xe4\xfe\xf5\xfe\xc9\xfe\x3e\xfe\x3e\xfe\xe8\xfe\xf5\xfe\xc9\xfe\x3e\xfe\xeb\xfe\x3e\xfe\x3e\xfe\xef\xfe\xc4\xfe\xc6\xfe\xc8\xfe\x3d\xfe\x3e\xfe\x4c\xff\x00\x00\x00\x00\x9f\xfe\x00\x00\xd0\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xda\xff\x00\x00\x00\x00\xca\xff\x00\x00\xb4\xff\x00\x00\x00\x00\x27\xff\x27\xff\x00\x00\x27\xff\x00\x00\x00\x00\xc6\xff\xc4\xff\xc3\xff\x00\x00\x4c\xfe\x4c\xfe\x27\xff\x00\x00\xdb\xff\x00\x00\xb3\xff\xb2\xff\x00\x00\x00\x00\xba\xff\xd9\xff\xc9\xff\xcf\xff\xcd\xff\xce\xff\x00\x00\xcc\xff\xa0\xfe\xa1\xfe\x00\x00\x00\x00\xa2\xfe\x3e\xfe\x41\xff\x4a\xff\x00\x00\x00\x00\x3e\xfe\x3d\xfe\x4b\xff\x50\xff\x3e\xfe\xee\xfe\xed\xfe\xea\xfe\x3e\xfe\xc5\xfe\x3d\xfe\xe7\xfe\xe6\xfe\x3e\xfe\xc5\xfe\x3d\xfe\xe2\xfe\xf1\xfe\xf3\xfe\xc0\xfe\xbe\xfe\xbf\xfe\xbd\xfe\x00\x00\x00\x00\x00\x00\xaa\xfe\x00\x00\xaf\xfe\xac\xfe\xa9\xfe\xb0\xfe\xb3\xfe\x00\x00\x94\xfe\x00\x00\x00\x00\x00\x00\x39\xff\x00\x00\x00\x00\x37\xfe\xb7\xfe\x00\x00\x00\x00\x00\x00\xb7\xfe\x00\x00\x65\xff\x64\xff\x00\x00\x1c\xff\x11\xff\x00\x00\x16\xff\x1a\xff\x0e\xff\x0f\xff\x00\x00\x19\xff\x0c\xff\x5d\xff\x5c\xff\xa3\xff\xe7\xff\x00\x00\x00\x00\x83\xfe\x3e\xfe\xd2\xfe\x00\x00\xd3\xfe\xcd\xfe\x00\x00\x00\x00\xe0\xfe\x5a\xff\x59\xff\xb6\xfe\x00\xff\xf5\xff\x00\x00\xd0\xfe\xcc\xfe\x00\x00\x00\x00\xd1\xfe\xcb\xfe\x18\xff\x00\x00\x00\x00\x15\xff\x26\xff\x9d\xff\x00\x00\xa1\xff\x38\xfe\x3a\xfe\x32\xfe\x00\x00\x33\xfe\x33\xff\x38\xff\x31\xff\x00\x00\x37\xff\xb2\xfe\x00\x00\x93\xfe\xab\xfe\x00\x00\x00\x00\xb9\xfe\x57\xff\x56\xff\xbc\xfe\x3d\xfe\x3d\xfe\x47\xff\x45\xff\x3d\xff\x00\x00\x00\x00\x3d\xfe\x3e\xfe\x49\xff\x3e\xfe\x48\xff\x3e\xfe\x40\xff\x00\x00\x51\xff\x9e\xfe\x00\x00\xcb\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\xff\xc2\xff\x00\x00\x00\x00\xc5\xff\x00\x00\x00\x00\x00\x00\xb9\xff\xb1\xff\x00\x00\x00\x00\x00\x00\x9d\xfe\x3f\xff\x00\x00\x43\xff\x00\x00\x00\x00\x46\xff\x3c\xff\x00\x00\x3a\xff\xb8\xfe\x00\x00\xb1\xfe\x36\xff\x34\xfe\x00\x00\x14\xff\xca\xfe\x00\x00\xcf\xfe\xce\xfe\x31\xfe\xa8\xfe\x3b\xff\x3e\xfe\x44\xff\x3e\xff\x00\x00\x00\x00\xb0\xff\x00\x00\x00\x00\xd7\xff\xc1\xff\xc0\xff\x00\x00\xad\xff\xb8\xff\x00\x00\x00\x00\x42\xff\x00\x00\x00\x00\x00\x00\x00\x00\xac\xff\xb7\xff\xae\xff\xaf\xff"#
+
+happyCheck :: HappyAddr
+happyCheck = HappyA# "\xff\xff\x02\x00\x03\x00\x04\x00\x36\x00\x36\x00\x04\x00\x15\x00\x16\x00\x17\x00\x15\x00\x16\x00\x17\x00\x01\x00\x36\x00\x17\x00\x1c\x00\x18\x00\x1c\x00\x01\x00\x74\x00\x02\x00\x02\x00\x35\x00\x19\x00\x0d\x00\x1b\x00\x04\x00\x1d\x00\x1e\x00\x1f\x00\x0d\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x01\x00\x39\x00\x09\x00\x39\x00\x2e\x00\x36\x00\x33\x00\x79\x00\x5c\x00\x1c\x00\x37\x00\x21\x00\x0d\x00\x23\x00\x02\x00\x03\x00\x04\x00\x01\x00\x01\x00\x74\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x79\x00\x79\x00\x0d\x00\x0d\x00\x01\x00\x36\x00\x03\x00\x0d\x00\x34\x00\x35\x00\x19\x00\x39\x00\x1b\x00\x74\x00\x1d\x00\x1e\x00\x1f\x00\x76\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x04\x00\x74\x00\x03\x00\x5c\x00\x74\x00\x5e\x00\x33\x00\x74\x00\x74\x00\x5c\x00\x37\x00\x5e\x00\x5e\x00\x5e\x00\x36\x00\x79\x00\x5e\x00\x77\x00\x78\x00\x79\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x43\x00\x36\x00\x21\x00\x2a\x00\x23\x00\x48\x00\x2d\x00\x5c\x00\x5d\x00\x5e\x00\x21\x00\x2a\x00\x2b\x00\x2c\x00\x04\x00\x79\x00\x01\x00\x76\x00\x03\x00\x56\x00\x33\x00\x01\x00\x14\x00\x36\x00\x5c\x00\x5c\x00\x5d\x00\x5e\x00\x0d\x00\x5c\x00\x5d\x00\x36\x00\x01\x00\x0d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x79\x00\x20\x00\x21\x00\x0d\x00\x23\x00\x23\x00\x77\x00\x78\x00\x79\x00\x20\x00\x21\x00\x2a\x00\x2b\x00\x2c\x00\x04\x00\x36\x00\x02\x00\x01\x00\x54\x00\x02\x00\x33\x00\x01\x00\x5b\x00\x36\x00\x36\x00\x77\x00\x78\x00\x79\x00\x36\x00\x0d\x00\x02\x00\x36\x00\x01\x00\x0d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x43\x00\x54\x00\x21\x00\x0d\x00\x23\x00\x48\x00\x2a\x00\x78\x00\x79\x00\x2d\x00\x01\x00\x2a\x00\x2b\x00\x2c\x00\x04\x00\x2a\x00\x79\x00\x5b\x00\x2a\x00\x56\x00\x33\x00\x7b\x00\x0d\x00\x36\x00\x76\x00\x5c\x00\x5d\x00\x5e\x00\x02\x00\x2a\x00\x5c\x00\x5d\x00\x5e\x00\x36\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x5c\x00\x5d\x00\x21\x00\x76\x00\x23\x00\x43\x00\x37\x00\x07\x00\x79\x00\x79\x00\x48\x00\x2a\x00\x2b\x00\x2c\x00\x04\x00\x1e\x00\x79\x00\x2d\x00\x0a\x00\x04\x00\x33\x00\x01\x00\x0e\x00\x03\x00\x56\x00\x02\x00\x5c\x00\x5d\x00\x5e\x00\x07\x00\x5c\x00\x5d\x00\x5e\x00\x0d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x5c\x00\x5d\x00\x21\x00\x01\x00\x23\x00\x03\x00\x20\x00\x21\x00\x79\x00\x23\x00\x01\x00\x2a\x00\x2b\x00\x2c\x00\x04\x00\x0d\x00\x2a\x00\x2b\x00\x2c\x00\x5c\x00\x33\x00\x5e\x00\x0d\x00\x36\x00\x2a\x00\x33\x00\x02\x00\x07\x00\x36\x00\x77\x00\x78\x00\x79\x00\x01\x00\x36\x00\x41\x00\x42\x00\x43\x00\x44\x00\x79\x00\x41\x00\x42\x00\x43\x00\x44\x00\x21\x00\x0d\x00\x23\x00\x43\x00\x34\x00\x35\x00\x79\x00\x1c\x00\x48\x00\x2a\x00\x2b\x00\x2c\x00\x01\x00\x36\x00\x2a\x00\x1c\x00\x07\x00\x2d\x00\x33\x00\x1c\x00\x1c\x00\x36\x00\x56\x00\x2a\x00\x0d\x00\x07\x00\x43\x00\x05\x00\x06\x00\x07\x00\x5e\x00\x48\x00\x41\x00\x42\x00\x43\x00\x44\x00\x39\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x01\x00\x21\x00\x39\x00\x56\x00\x78\x00\x79\x00\x39\x00\x39\x00\x1e\x00\x5c\x00\x79\x00\x5e\x00\x0d\x00\x20\x00\x21\x00\x21\x00\x5c\x00\x5d\x00\x5e\x00\x05\x00\x06\x00\x07\x00\x36\x00\x09\x00\x2e\x00\x0b\x00\x0c\x00\x0d\x00\x76\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x76\x00\x36\x00\x36\x00\x1c\x00\x5c\x00\x19\x00\x5e\x00\x1b\x00\x74\x00\x1d\x00\x1e\x00\x1f\x00\x79\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x54\x00\x2c\x00\x5c\x00\x5d\x00\x5e\x00\x30\x00\x33\x00\x39\x00\x54\x00\x1c\x00\x37\x00\x5a\x00\x01\x00\x5c\x00\x03\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x79\x00\x6e\x00\x5c\x00\x5d\x00\x5e\x00\x1c\x00\x73\x00\x74\x00\x39\x00\x76\x00\x42\x00\x43\x00\x44\x00\x79\x00\x79\x00\x5a\x00\x54\x00\x5c\x00\x1a\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x39\x00\x6e\x00\x41\x00\x42\x00\x43\x00\x44\x00\x73\x00\x74\x00\x2c\x00\x76\x00\x77\x00\x78\x00\x79\x00\x05\x00\x06\x00\x07\x00\x2c\x00\x09\x00\x07\x00\x0b\x00\x0c\x00\x0d\x00\x54\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x01\x00\x54\x00\x78\x00\x79\x00\x1c\x00\x19\x00\x02\x00\x1b\x00\x54\x00\x1d\x00\x1e\x00\x1f\x00\x0d\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x07\x00\x58\x00\x59\x00\x5c\x00\x5d\x00\x79\x00\x33\x00\x79\x00\x39\x00\x1e\x00\x37\x00\x5c\x00\x5d\x00\x01\x00\x1c\x00\x2d\x00\x3c\x00\x3d\x00\x02\x00\x01\x00\x4b\x00\x03\x00\x42\x00\x43\x00\x44\x00\x0d\x00\x01\x00\x22\x00\x23\x00\x01\x00\x25\x00\x0d\x00\x27\x00\x74\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x0d\x00\x2a\x00\x4b\x00\x0d\x00\x2d\x00\x39\x00\x33\x00\x5a\x00\x1e\x00\x5c\x00\x37\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x0a\x00\x6e\x00\x5c\x00\x5d\x00\x5e\x00\x4c\x00\x73\x00\x74\x00\x76\x00\x76\x00\x77\x00\x78\x00\x79\x00\x79\x00\x00\x00\x01\x00\x42\x00\x43\x00\x44\x00\x5a\x00\x79\x00\x5c\x00\x76\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x07\x00\x6e\x00\x5c\x00\x5d\x00\x5e\x00\x1a\x00\x73\x00\x74\x00\x5c\x00\x5d\x00\x77\x00\x78\x00\x79\x00\x01\x00\x79\x00\x5c\x00\x5d\x00\x5e\x00\x5c\x00\x50\x00\x5e\x00\x20\x00\x21\x00\x07\x00\x23\x00\x0d\x00\x1a\x00\x22\x00\x23\x00\x01\x00\x25\x00\x2d\x00\x27\x00\x79\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x07\x00\x36\x00\x07\x00\x0d\x00\x1e\x00\x36\x00\x33\x00\x01\x00\x1a\x00\x03\x00\x37\x00\x36\x00\x41\x00\x42\x00\x43\x00\x44\x00\x20\x00\x21\x00\x03\x00\x0d\x00\x1e\x00\x06\x00\x41\x00\x42\x00\x43\x00\x44\x00\x07\x00\x22\x00\x23\x00\x1a\x00\x25\x00\x4c\x00\x27\x00\x2d\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x36\x00\x07\x00\x5c\x00\x5d\x00\x7a\x00\x7b\x00\x33\x00\x5a\x00\x1f\x00\x5c\x00\x37\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x1a\x00\x6e\x00\x5c\x00\x5d\x00\x79\x00\x4c\x00\x73\x00\x74\x00\x79\x00\x07\x00\x77\x00\x78\x00\x79\x00\x78\x00\x79\x00\x74\x00\x5c\x00\x5d\x00\x5c\x00\x5a\x00\x1a\x00\x5c\x00\x07\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x07\x00\x6e\x00\x76\x00\x79\x00\x2a\x00\x2b\x00\x73\x00\x74\x00\x36\x00\x36\x00\x77\x00\x78\x00\x79\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x76\x00\x41\x00\x42\x00\x43\x00\x44\x00\x07\x00\x46\x00\x47\x00\x76\x00\x22\x00\x23\x00\x08\x00\x25\x00\x75\x00\x27\x00\x76\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x02\x00\x03\x00\x6d\x00\x19\x00\x06\x00\x1b\x00\x33\x00\x1d\x00\x1e\x00\x1f\x00\x37\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x33\x00\x01\x00\x4c\x00\x5b\x00\x37\x00\x2a\x00\x2b\x00\x78\x00\x79\x00\x03\x00\x5c\x00\x5d\x00\x06\x00\x77\x00\x78\x00\x79\x00\x5a\x00\x2b\x00\x5c\x00\x02\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x02\x00\x6e\x00\x1f\x00\x79\x00\x5c\x00\x5d\x00\x73\x00\x74\x00\x2a\x00\x2b\x00\x77\x00\x78\x00\x79\x00\x21\x00\x5b\x00\x23\x00\x5c\x00\x5d\x00\x07\x00\x2a\x00\x2b\x00\x23\x00\x2a\x00\x2b\x00\x2c\x00\x77\x00\x78\x00\x79\x00\x2a\x00\x2b\x00\x2c\x00\x33\x00\x2b\x00\x77\x00\x78\x00\x79\x00\x19\x00\x33\x00\x1b\x00\x01\x00\x1d\x00\x1e\x00\x1f\x00\x32\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x07\x00\x01\x00\x41\x00\x42\x00\x43\x00\x44\x00\x33\x00\x77\x00\x78\x00\x79\x00\x37\x00\x5e\x00\x42\x00\x43\x00\x44\x00\x04\x00\x46\x00\x47\x00\x19\x00\x04\x00\x1b\x00\x5e\x00\x1d\x00\x1e\x00\x1f\x00\x5b\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x5a\x00\x02\x00\x5c\x00\x02\x00\x5e\x00\x5f\x00\x33\x00\x79\x00\x02\x00\x21\x00\x37\x00\x23\x00\x2b\x00\x79\x00\x04\x00\x23\x00\x17\x00\x18\x00\x2a\x00\x2b\x00\x2c\x00\x07\x00\x2a\x00\x2b\x00\x2c\x00\x73\x00\x74\x00\x33\x00\x78\x00\x79\x00\x36\x00\x33\x00\x11\x00\x12\x00\x36\x00\x04\x00\x77\x00\x78\x00\x79\x00\x19\x00\x04\x00\x1b\x00\x1e\x00\x1d\x00\x1e\x00\x1f\x00\x5e\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x07\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x33\x00\x42\x00\x43\x00\x44\x00\x37\x00\x46\x00\x47\x00\x0b\x00\x0c\x00\x77\x00\x78\x00\x79\x00\x19\x00\x1e\x00\x1b\x00\x5e\x00\x1d\x00\x1e\x00\x1f\x00\x5e\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x79\x00\x04\x00\x77\x00\x78\x00\x79\x00\x04\x00\x33\x00\x3c\x00\x3d\x00\x04\x00\x37\x00\x23\x00\x04\x00\x42\x00\x43\x00\x44\x00\x32\x00\x04\x00\x2a\x00\x2b\x00\x2c\x00\x07\x00\x04\x00\x78\x00\x79\x00\x2a\x00\x2b\x00\x33\x00\x2a\x00\x2b\x00\x36\x00\x41\x00\x42\x00\x43\x00\x44\x00\x02\x00\x77\x00\x78\x00\x79\x00\x19\x00\x1f\x00\x1b\x00\x02\x00\x1d\x00\x1e\x00\x1f\x00\x02\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x07\x00\x01\x00\x2c\x00\x03\x00\x5c\x00\x5d\x00\x33\x00\x02\x00\x78\x00\x79\x00\x37\x00\x1c\x00\x1d\x00\x0d\x00\x01\x00\x77\x00\x78\x00\x79\x00\x19\x00\x2a\x00\x1b\x00\x2b\x00\x1d\x00\x1e\x00\x1f\x00\x3c\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x79\x00\x05\x00\x06\x00\x07\x00\x17\x00\x18\x00\x33\x00\x36\x00\x11\x00\x12\x00\x37\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x36\x00\x21\x00\x30\x00\x23\x00\x43\x00\x41\x00\x42\x00\x43\x00\x44\x00\x48\x00\x2a\x00\x2b\x00\x2c\x00\x43\x00\x05\x00\x06\x00\x07\x00\x2b\x00\x48\x00\x33\x00\x77\x00\x78\x00\x79\x00\x56\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x0b\x00\x0c\x00\x5e\x00\x56\x00\x2b\x00\x42\x00\x43\x00\x44\x00\x30\x00\x5c\x00\x5d\x00\x5e\x00\x05\x00\x06\x00\x07\x00\x2d\x00\x02\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x37\x00\x2b\x00\x77\x00\x78\x00\x79\x00\x13\x00\x14\x00\x15\x00\x16\x00\x2c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x5a\x00\x02\x00\x5c\x00\x02\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x79\x00\x6e\x00\x77\x00\x78\x00\x79\x00\x5e\x00\x73\x00\x74\x00\x02\x00\x76\x00\x5a\x00\x02\x00\x5c\x00\x1e\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x1f\x00\x6e\x00\x77\x00\x78\x00\x79\x00\x01\x00\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\x30\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x5b\x00\x6e\x00\x05\x00\x06\x00\x07\x00\x36\x00\x73\x00\x74\x00\x02\x00\x76\x00\x02\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x1f\x00\x43\x00\x04\x00\x02\x00\x36\x00\x02\x00\x48\x00\x02\x00\x4d\x00\x3b\x00\x3c\x00\x3d\x00\x05\x00\x06\x00\x07\x00\x41\x00\x42\x00\x43\x00\x44\x00\x04\x00\x56\x00\x04\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x3b\x00\x3c\x00\x3d\x00\x4e\x00\x4f\x00\x50\x00\x41\x00\x42\x00\x43\x00\x44\x00\x04\x00\x5c\x00\x05\x00\x06\x00\x07\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x38\x00\x02\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x2b\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x5a\x00\x79\x00\x5c\x00\x02\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x79\x00\x6e\x00\x77\x00\x78\x00\x79\x00\x02\x00\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\x1f\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x5e\x00\x6e\x00\x77\x00\x78\x00\x79\x00\x04\x00\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\x1f\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x2c\x00\x6e\x00\x05\x00\x06\x00\x07\x00\x02\x00\x73\x00\x74\x00\x1f\x00\x76\x00\x02\x00\x1f\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x5e\x00\x01\x00\x04\x00\x4e\x00\x4f\x00\x50\x00\x4e\x00\x4f\x00\x50\x00\x3b\x00\x3c\x00\x3d\x00\x05\x00\x06\x00\x07\x00\x41\x00\x42\x00\x43\x00\x44\x00\x4e\x00\x4f\x00\x50\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x77\x00\x78\x00\x79\x00\x77\x00\x78\x00\x79\x00\x05\x00\x06\x00\x07\x00\x77\x00\x78\x00\x79\x00\x77\x00\x78\x00\x79\x00\x1f\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x38\x00\x02\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x2c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x5a\x00\x79\x00\x5c\x00\x02\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x01\x00\x6e\x00\x77\x00\x78\x00\x79\x00\x02\x00\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\x02\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x08\x00\x6e\x00\x77\x00\x78\x00\x79\x00\x2a\x00\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\x02\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x2c\x00\x6e\x00\x05\x00\x06\x00\x07\x00\x2c\x00\x73\x00\x74\x00\x1e\x00\x76\x00\x5c\x00\x2d\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x1e\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x02\x00\x42\x00\x43\x00\x44\x00\x02\x00\x02\x00\x05\x00\x06\x00\x07\x00\x41\x00\x42\x00\x43\x00\x44\x00\x77\x00\x78\x00\x79\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x4e\x00\x4f\x00\x50\x00\x2b\x00\x2b\x00\x5a\x00\x01\x00\x5c\x00\x46\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x5b\x00\x6e\x00\x5c\x00\x70\x00\x78\x00\x79\x00\x73\x00\x74\x00\x4e\x00\x4f\x00\x50\x00\x2a\x00\x2a\x00\x5a\x00\x79\x00\x5c\x00\x2a\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x02\x00\x6e\x00\x4e\x00\x4f\x00\x50\x00\x02\x00\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\x02\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x5e\x00\x6e\x00\x0c\x00\x0d\x00\x01\x00\x2a\x00\x73\x00\x74\x00\x1b\x00\x76\x00\x01\x00\x1a\x00\x03\x00\x1e\x00\x19\x00\x19\x00\x10\x00\x1b\x00\x04\x00\x1d\x00\x1e\x00\x1f\x00\x0d\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x4e\x00\x4f\x00\x50\x00\x5e\x00\x20\x00\x21\x00\x33\x00\x23\x00\x30\x00\x01\x00\x37\x00\x4e\x00\x4f\x00\x50\x00\x2a\x00\x2b\x00\x2c\x00\x77\x00\x78\x00\x79\x00\x4e\x00\x4f\x00\x50\x00\x33\x00\x2c\x00\x2c\x00\x36\x00\x01\x00\x36\x00\x36\x00\x01\x00\x4e\x00\x4f\x00\x50\x00\x4e\x00\x4f\x00\x50\x00\x41\x00\x42\x00\x43\x00\x44\x00\x43\x00\x0d\x00\x30\x00\x2c\x00\x5a\x00\x48\x00\x5c\x00\x2c\x00\x5e\x00\x5f\x00\x60\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x2c\x00\x03\x00\x56\x00\x4e\x00\x4f\x00\x50\x00\x01\x00\x2c\x00\x5c\x00\x5d\x00\x5e\x00\x02\x00\x73\x00\x74\x00\x2b\x00\x02\x00\x77\x00\x78\x00\x79\x00\x30\x00\x31\x00\x5b\x00\x33\x00\x01\x00\x35\x00\x2c\x00\x01\x00\x38\x00\x01\x00\x5e\x00\x3b\x00\x02\x00\x3d\x00\x3e\x00\x3f\x00\x79\x00\x77\x00\x78\x00\x79\x00\x44\x00\x45\x00\x5e\x00\x47\x00\x04\x00\x02\x00\x4a\x00\x4b\x00\x02\x00\x4d\x00\x4e\x00\x5b\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x4e\x00\x4f\x00\x50\x00\x77\x00\x78\x00\x79\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x01\x00\x4e\x00\x4f\x00\x50\x00\x5e\x00\x65\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x46\x00\x01\x00\x10\x00\x77\x00\x78\x00\x79\x00\x5a\x00\x57\x00\x5c\x00\x2b\x00\x5e\x00\x5f\x00\x60\x00\x1b\x00\x2b\x00\x38\x00\x65\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x1e\x00\x41\x00\x42\x00\x43\x00\x44\x00\x01\x00\x2b\x00\x2c\x00\x73\x00\x74\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x01\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x01\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\x77\x00\x78\x00\x79\x00\x01\x00\x1e\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2b\x00\x31\x00\x10\x00\x2b\x00\x1e\x00\x5a\x00\x36\x00\x5c\x00\x2b\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x1b\x00\x3e\x00\x77\x00\x78\x00\x79\x00\x65\x00\x43\x00\x4e\x00\x4f\x00\x50\x00\x47\x00\x48\x00\x4e\x00\x4f\x00\x50\x00\x01\x00\x4d\x00\x73\x00\x74\x00\x50\x00\x2f\x00\x52\x00\x31\x00\x01\x00\x33\x00\x56\x00\x35\x00\x36\x00\x01\x00\x38\x00\x2a\x00\x5b\x00\x3b\x00\x5e\x00\x3d\x00\x3e\x00\x3f\x00\x77\x00\x78\x00\x79\x00\x43\x00\x44\x00\x45\x00\x1b\x00\x47\x00\x48\x00\x65\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x1a\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x19\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\x77\x00\x78\x00\x79\x00\x10\x00\x36\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x46\x00\x47\x00\x19\x00\xff\xff\x1b\x00\x1b\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x77\x00\x78\x00\x79\x00\x2f\x00\xff\xff\x31\x00\x33\x00\x33\x00\xff\xff\x35\x00\x37\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\x01\x00\x02\x00\x03\x00\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\x78\x00\x79\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\x01\x00\x02\x00\x03\x00\xff\xff\x37\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x77\x00\x78\x00\x79\x00\x01\x00\x02\x00\x03\x00\x01\x00\x02\x00\x03\x00\x1b\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x01\x00\xff\xff\x03\x00\xff\xff\x05\x00\x06\x00\xff\xff\xff\xff\x09\x00\x0a\x00\x2c\x00\xff\xff\xff\xff\x2f\x00\x01\x00\x02\x00\x03\x00\x33\x00\x01\x00\x35\x00\x03\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x0d\x00\xff\xff\xff\xff\x01\x00\x44\x00\x45\x00\x77\x00\x78\x00\x79\x00\xff\xff\x4a\x00\x4b\x00\x4c\x00\xff\xff\x4e\x00\x0d\x00\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\x01\x00\x02\x00\x03\x00\x36\x00\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x43\x00\xff\xff\x36\x00\xff\xff\xff\xff\x48\x00\x5a\x00\xff\xff\x5c\x00\x1b\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x43\x00\x0d\x00\x0e\x00\x0f\x00\x56\x00\x48\x00\x01\x00\x02\x00\x03\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\xff\xff\x2f\x00\xff\xff\x73\x00\x74\x00\x33\x00\x56\x00\x35\x00\xff\xff\xff\xff\x38\x00\xff\xff\x5c\x00\x3b\x00\x5e\x00\x3d\x00\xff\xff\x3f\x00\x0d\x00\x0e\x00\x0f\x00\xff\xff\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x4b\x00\x4c\x00\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\x42\x00\x43\x00\x44\x00\xff\xff\x1b\x00\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\x2f\x00\x30\x00\x33\x00\x32\x00\xff\xff\x34\x00\x37\x00\xff\xff\x37\x00\xff\xff\x39\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x40\x00\x41\x00\x42\x00\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x49\x00\xff\xff\xff\xff\x4c\x00\x78\x00\x79\x00\x4f\x00\xff\xff\xff\xff\x01\x00\xff\xff\x03\x00\xff\xff\xff\xff\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x0d\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x77\x00\x78\x00\x79\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x1b\x00\xff\xff\xff\xff\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\x73\x00\x74\x00\x2f\x00\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\x36\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x43\x00\x01\x00\xff\xff\x03\x00\xff\xff\x48\x00\x5c\x00\x5d\x00\x5e\x00\x4c\x00\x4d\x00\xff\xff\x5a\x00\x0d\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x56\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x1b\x00\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\xff\xff\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\x2f\x00\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\x56\x00\x36\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x43\x00\x03\x00\xff\xff\x01\x00\xff\xff\x48\x00\x01\x00\xff\xff\xff\xff\x4c\x00\x4d\x00\x0d\x00\x5a\x00\xff\xff\x5c\x00\x0d\x00\x5e\x00\x5f\x00\x0d\x00\x56\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x37\x00\x36\x00\x5a\x00\xff\xff\x5c\x00\x36\x00\x5e\x00\x5f\x00\x36\x00\x1b\x00\x41\x00\x42\x00\x43\x00\x44\x00\x43\x00\x46\x00\x47\x00\xff\xff\x43\x00\x48\x00\xff\xff\x43\x00\xff\xff\x48\x00\xff\xff\xff\xff\x48\x00\x73\x00\x74\x00\x2f\x00\x5a\x00\xff\xff\x5c\x00\x56\x00\x5e\x00\x5f\x00\x36\x00\x56\x00\xff\xff\x5c\x00\x56\x00\x5e\x00\xff\xff\x5c\x00\x5d\x00\x5e\x00\x5c\x00\x5d\x00\x5e\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x73\x00\x74\x00\xff\xff\x4c\x00\x4d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\x56\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x01\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\x03\x00\xff\xff\x0d\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x1b\x00\x03\x00\xff\xff\xff\xff\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x36\x00\x2c\x00\x2d\x00\x36\x00\x2f\x00\x3b\x00\x3c\x00\x3d\x00\xff\xff\x1b\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x5a\x00\x56\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x5c\x00\xff\xff\x5e\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x4c\x00\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\x42\x00\x43\x00\x44\x00\x1b\x00\x46\x00\x47\x00\xff\xff\x01\x00\xff\xff\x03\x00\xff\xff\xff\xff\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x04\x00\x36\x00\xff\xff\x5a\x00\x1b\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\xff\xff\x2c\x00\xff\xff\x4c\x00\x2f\x00\x78\x00\x79\x00\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\x56\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\xff\xff\xff\xff\x38\x00\x4c\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\x42\x00\x43\x00\x44\x00\x1b\x00\x46\x00\x47\x00\xff\xff\x01\x00\xff\xff\x03\x00\xff\xff\xff\xff\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\x5a\x00\x1b\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\xff\xff\x2c\x00\xff\xff\x4c\x00\x2f\x00\x78\x00\x79\x00\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\x56\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x4c\x00\x42\x00\x43\x00\x44\x00\xff\xff\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\x42\x00\x43\x00\x44\x00\xff\xff\x1b\x00\x01\x00\x02\x00\xff\xff\x78\x00\x79\x00\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x2c\x00\xff\xff\xff\xff\x2f\x00\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x1b\x00\x42\x00\x43\x00\x44\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x2f\x00\xff\xff\x4c\x00\x78\x00\x79\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x1b\x00\x42\x00\x43\x00\x44\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x2c\x00\xff\xff\x4c\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\x01\x00\x02\x00\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x2c\x00\xff\xff\x37\x00\x2f\x00\xff\xff\xff\xff\x3b\x00\x3c\x00\x3d\x00\xff\xff\x1b\x00\x01\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\xff\xff\xff\xff\x2f\x00\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\x1e\x00\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x2f\x00\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\x4c\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x01\x00\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\x2f\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x1b\x00\x5a\x00\xff\xff\x5c\x00\x01\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x73\x00\x74\x00\x10\x00\x2f\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\x73\x00\x74\x00\xff\xff\x5a\x00\x1b\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x4c\x00\x2f\x00\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x4c\x00\xff\xff\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\xff\xff\xff\xff\xff\xff\x01\x00\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x78\x00\x79\x00\x10\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\x2f\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x73\x00\x74\x00\x10\x00\x2f\x00\x37\x00\xff\xff\xff\xff\x4c\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x1b\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x4c\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x03\x00\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\x0d\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x0d\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\x1b\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\x56\x00\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\x5e\x00\xff\xff\x2f\x00\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x01\x00\xff\xff\x03\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x4c\x00\x5a\x00\x0d\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x31\x00\x03\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\x03\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\x03\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\x03\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\x03\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x01\x00\x31\x00\x03\x00\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\xff\xff\x31\x00\xff\xff\x33\x00\x0d\x00\x35\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\x01\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x5d\x00\x5e\x00\x38\x00\x23\x00\xff\xff\x3b\x00\x0d\x00\x3d\x00\x3e\x00\x3f\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\x32\x00\x33\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x5c\x00\x5d\x00\x5e\x00\xff\xff\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x21\x00\x38\x00\x23\x00\x01\x00\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\x44\x00\x45\x00\x0d\x00\x47\x00\xff\xff\x33\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x01\x00\x1e\x00\x03\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\xff\xff\x79\x00\xff\xff\x0d\x00\xff\xff\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x21\x00\x38\x00\x23\x00\xff\xff\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\x33\x00\x4a\x00\x4b\x00\x36\x00\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\x36\x00\x53\x00\x54\x00\x55\x00\x79\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x5c\x00\x5d\x00\x5e\x00\x43\x00\xff\xff\xff\xff\x1e\x00\x1f\x00\x48\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\x5e\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\x3c\x00\x3d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x79\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\xff\xff\xff\xff\xff\xff\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\x20\x00\x21\x00\xff\xff\x23\x00\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\x21\x00\x36\x00\x23\x00\xff\xff\x77\x00\x78\x00\x79\x00\x4a\x00\xff\xff\x2a\x00\x2b\x00\x2c\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\x21\x00\xff\xff\x23\x00\xff\xff\x21\x00\xff\xff\x23\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x79\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\x36\x00\xff\xff\x3c\x00\x3d\x00\xff\xff\xff\xff\x78\x00\x79\x00\x42\x00\x43\x00\x44\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x21\x00\x36\x00\x23\x00\xff\xff\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x2a\x00\x2b\x00\x2c\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\x79\x00\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\x4c\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x79\x00\x33\x00\xff\xff\xff\xff\x5a\x00\x37\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\x4c\x00\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\x4c\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\x5a\x00\x37\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\x4c\x00\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x33\x00\x25\x00\xff\xff\x27\x00\x37\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\xff\xff\x22\x00\x23\x00\xff\xff\x25\x00\x4c\x00\x27\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\x2e\x00\x2f\x00\x30\x00\xff\xff\xff\xff\x33\x00\x5a\x00\xff\xff\x5c\x00\x37\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\x33\x00\xff\xff\xff\xff\x4c\x00\x37\x00\xff\xff\xff\xff\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\x23\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\xff\xff\x33\x00\x4c\x00\xff\xff\xff\xff\x37\x00\x33\x00\xff\xff\xff\xff\x36\x00\x22\x00\x23\x00\xff\xff\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x4c\x00\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\x36\x00\xff\xff\x3b\x00\xff\xff\xff\xff\xff\xff\x3f\x00\x77\x00\x78\x00\x79\x00\x43\x00\x44\x00\x45\x00\x78\x00\x79\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\x36\x00\x77\x00\x78\x00\x79\x00\x5a\x00\x5e\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x71\x00\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\x36\x00\x71\x00\xff\xff\x73\x00\x74\x00\x3b\x00\x3c\x00\x3d\x00\xff\xff\x79\x00\x37\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x36\x00\xff\xff\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x77\x00\x78\x00\x79\x00\x71\x00\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x37\x00\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\x3d\x00\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x79\x00\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x37\x00\xff\xff\xff\xff\xff\xff\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x36\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x46\x00\x47\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2b\x00\xff\xff\x2d\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\x2b\x00\xff\xff\x2d\x00\xff\xff\xff\xff\x5d\x00\x5e\x00\x5f\x00\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\x2b\x00\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\x31\x00\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\x2b\x00\xff\xff\xff\xff\x3e\x00\xff\xff\xff\xff\x31\x00\xff\xff\x43\x00\xff\xff\xff\xff\x36\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x3e\x00\xff\xff\x50\x00\xff\xff\x52\x00\x43\x00\xff\xff\xff\xff\x56\x00\x47\x00\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x5e\x00\xff\xff\x50\x00\xff\xff\x52\x00\x2c\x00\xff\xff\xff\xff\x56\x00\xff\xff\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x5e\x00\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x5d\x00\x5e\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x5e\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x5e\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x5e\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\xff\xff\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x5d\x00\x5e\x00\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x5d\x00\x5e\x00\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\x47\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x5e\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\xff\xff\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\x4d\x00\xff\xff\xff\xff\x50\x00\xff\xff\x52\x00\xff\xff\x54\x00\x55\x00\x56\x00\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\xff\xff\x5e\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x5e\x00\x5f\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\xff\xff\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\x56\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\x5d\x00\x5e\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\xff\xff\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\x56\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\x5d\x00\x5e\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\xff\xff\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\x56\x00\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\x5d\x00\x5e\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\x43\x00\x44\x00\x45\x00\xff\xff\xff\xff\x48\x00\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\x56\x00\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\x5d\x00\x5e\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\x5d\x00\x5e\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\xff\xff\x38\x00\x5d\x00\x5e\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\xff\xff\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x5e\x00\x53\x00\xff\xff\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x53\x00\x76\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x53\x00\x76\x00\xff\xff\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\xff\xff\x53\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7c\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x53\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x53\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x71\x00\xff\xff\x73\x00\x74\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\x79\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\x70\x00\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\x70\x00\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\x70\x00\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\x70\x00\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\x70\x00\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\x6f\x00\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\xff\xff\x73\x00\x74\x00\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\xff\xff\xff\xff\x73\x00\x74\x00\x3b\x00\x3c\x00\x3d\x00\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x3b\x00\x3c\x00\x3d\x00\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x38\x00\xff\xff\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x31\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\x38\x00\xff\xff\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x38\x00\xff\xff\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x38\x00\xff\xff\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x38\x00\xff\xff\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#
+
+happyTable :: HappyAddr
+happyTable = HappyA# "\x00\x00\xe1\x00\xbd\x00\xbe\x00\xb8\x01\x05\x01\x21\x03\x46\x03\x9d\x02\x9e\x02\x9c\x02\x9d\x02\x9e\x02\x2d\x02\x4a\x02\x48\x03\x24\x02\x6f\x03\xd2\x01\xfe\x01\x79\x03\xc8\x02\x61\x02\x18\x03\xbf\x00\x2e\x02\xc0\x00\x3e\xfe\xc1\x00\xc2\x00\xc3\x00\xff\x01\xc4\x00\xc5\x00\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\xe1\x02\xcd\x01\x6e\x03\xcd\x01\x22\x03\x0c\x01\x7d\x00\x55\x03\x4b\x02\xea\x01\xcc\x00\x12\x01\x43\x02\x13\x01\xbc\x00\xbd\x00\xbe\x00\xfe\x01\x2d\x02\x67\x03\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xf1\x00\x06\x01\xff\x01\x2e\x02\xd6\x01\x14\x01\xfa\x00\x52\x00\xd6\x02\x4e\x02\xbf\x00\xcd\x01\xc0\x00\x68\x03\xc1\x00\xc2\x00\xc3\x00\x4f\x02\xc4\x00\xc5\x00\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\xfa\x00\x9f\x02\xa1\x02\xe0\x00\x9f\x02\x95\x00\x7d\x00\x9f\x02\x70\x03\xe0\x00\xcc\x00\x95\x00\x95\x00\x95\x00\x5e\x00\x0d\x01\x95\x00\x81\x00\xd4\x00\x83\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\x5f\x00\xfe\x00\xfb\x00\x1c\x03\xfc\x00\x60\x00\x1d\x03\xe0\x00\xe1\x01\x95\x00\x0b\x01\xfd\x00\x7b\x00\x7c\x00\x26\x01\x15\x01\x6f\x02\x4f\x02\xfa\x00\x61\x00\x7d\x00\xe0\x02\x5b\x00\xfe\x00\xe0\x00\xe0\x00\x26\x01\x95\x00\x70\x02\x53\x00\x4a\x00\x0c\x01\x42\x02\x43\x02\xff\x00\xce\x00\xcf\x00\xd0\x00\x00\x01\xd2\x00\xd3\x00\x55\x03\x27\x01\x08\x01\x43\x02\x28\x01\x13\x01\x81\x00\xd4\x00\x83\x00\x0f\x01\x08\x01\x29\x01\x7b\x00\x7c\x00\xe5\x01\x5c\x00\x78\x03\xe1\x02\x10\x03\x5b\x03\x7d\x00\x12\x03\x29\x00\x09\x01\x14\x01\xfd\x02\x78\x02\x83\x00\x3d\xfe\x43\x02\xdc\x02\x09\x01\x24\x01\x43\x02\x2a\x01\xce\x00\xcf\x00\xd0\x00\x2b\x01\xd2\x00\xd3\x00\x3d\xfe\x12\x03\xe6\x01\x25\x01\xb6\x01\x3d\xfe\x23\x03\x01\x01\x83\x00\x24\x03\x2d\x02\xb7\x01\x7b\x00\x7c\x00\xeb\x00\x79\x03\x0d\x01\x7c\x02\x5c\x03\x3d\xfe\x7d\x00\x13\x03\x2e\x02\xb8\x01\x37\x03\xe0\x00\x26\x01\x95\x00\x6b\x03\xdd\x02\xe0\x00\x26\x01\x95\x00\x5e\x00\xe7\x01\xce\x00\xcf\x00\xd0\x00\xe8\x01\xd2\x00\xd3\x00\xe0\x00\x26\x01\xec\x00\x7d\x02\xed\x00\x5f\x00\x17\x02\x39\x03\x2c\x01\x15\x01\x60\x00\xee\x00\x7b\x00\x7c\x00\x80\x02\x6c\x03\x10\x01\xae\x02\x6e\x01\x83\x02\x7d\x00\x62\x01\x6f\x01\xfa\x00\x61\x00\x16\x02\xe0\x00\xe1\x01\x95\x00\xa4\x02\xe0\x00\x26\x01\x95\x00\x63\x01\xef\x00\xce\x00\xcf\x00\xd0\x00\xf0\x00\xd2\x00\xd3\x00\xe0\x00\x26\x01\xfb\x00\x6a\x02\xfc\x00\xfa\x00\x27\x01\x08\x01\xf1\x00\x28\x01\xe0\x01\xfd\x00\x7b\x00\x7c\x00\xa7\x02\x6b\x02\x29\x01\x7b\x00\x7c\x00\xe0\x00\x7d\x00\x95\x00\x25\x01\xfe\x00\x17\x02\x7d\x00\xc7\x01\xa5\x02\x09\x01\x18\x02\x57\x01\x83\x00\xfe\x01\x3d\xfe\xff\x00\xce\x00\xcf\x00\x03\x02\xbb\x01\x2a\x01\xce\x00\xcf\x00\x03\x02\xe6\x01\xff\x01\xb6\x01\x3d\xfe\x4d\x02\x4e\x02\xf1\x00\xf9\x01\x3d\xfe\xb7\x01\x7b\x00\x7c\x00\x2d\x02\x3d\xfe\xd5\x02\xdd\x02\xa6\x02\xd6\x02\x7d\x00\xe1\x02\x24\x02\xb8\x01\x3d\xfe\xc8\x01\x2e\x02\xa8\x02\x3d\xfe\x6c\x03\x31\x00\x32\x00\x95\x00\x3d\xfe\xe7\x01\xce\x00\xcf\x00\x03\x02\xcd\x01\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xe0\x01\x04\x01\xcd\x01\x3d\xfe\x81\x02\x83\x00\xcd\x01\xcd\x01\x73\x01\xe0\x00\x2c\x01\x95\x00\x25\x01\x07\x01\x08\x01\x0b\x01\xe0\x00\xe1\x01\x95\x00\x91\x01\x31\x00\x32\x00\x05\x01\x87\x02\x74\x01\x93\x01\x94\x01\x95\x01\x4f\x02\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xcd\x02\x09\x01\x0c\x01\xcc\x01\xe0\x00\x96\x01\x95\x00\xc0\x00\xe2\x02\xc1\x00\x97\x01\x98\x01\xf1\x00\xc4\x00\x99\x01\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\xf2\x02\xe6\xff\xe0\x00\x26\x01\x95\x00\xcf\x01\x7d\x00\xcd\x01\x10\x02\xd2\x01\x9a\x01\x05\x00\xf9\x00\x06\x00\xfa\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x06\x01\x38\x00\xe0\x00\xe1\x01\x95\x00\xe2\x01\x17\x00\x18\x00\xcd\x01\x39\x00\xe7\x00\xcf\x00\x0d\x02\x0a\x01\x0d\x01\x05\x00\x21\x02\x06\x00\x23\x02\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xcd\x01\x38\x00\x02\x02\xce\x00\xcf\x00\x03\x02\x17\x00\x18\x00\xa6\x01\x39\x00\x81\x00\x88\x01\x83\x00\x91\x01\x31\x00\x32\x00\xc0\x01\x92\x01\x25\x02\x93\x01\x94\x01\x95\x01\x28\x02\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x2d\x02\x37\x02\xea\x00\x83\x00\xea\x01\x96\x01\x3f\x03\xc0\x00\x3d\x02\xc1\x00\x97\x01\x98\x01\x2e\x02\xc4\x00\x99\x01\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x74\x00\xd0\x02\xd1\x02\x53\x00\x4a\x00\xf1\x00\x7d\x00\xbb\x01\xcd\x01\x40\x03\x9a\x01\x53\x00\x4a\x00\xdb\x01\xf9\x01\x79\x02\x2b\x02\x1e\x01\x8a\x02\x6f\x02\x86\x02\xfa\x00\xfb\x01\xcf\x00\xfc\x01\x25\x01\xe0\x01\x75\x00\x76\x00\xd6\x00\x77\x00\x70\x02\x78\x00\x8c\x01\x79\x00\x7a\x00\x7b\x00\x7c\x00\x25\x01\xd9\x02\x8d\x01\xd7\x00\xda\x02\xcd\x01\x7d\x00\x05\x00\x8b\x02\x06\x00\x7e\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x8f\x01\x38\x00\xe0\x00\x26\x01\x95\x00\x66\x01\x17\x00\x18\x00\xa4\x01\x39\x00\x81\x00\x88\x01\x83\x00\xf1\x00\x4a\x00\x04\x00\xfb\x01\xcf\x00\xfc\x01\x05\x00\xbb\x01\x06\x00\xbe\x01\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x74\x00\x80\x00\xe0\x00\x26\x01\x95\x00\xcb\x01\x17\x00\x18\x00\xe0\x00\x26\x01\x81\x00\x82\x00\x83\x00\x42\x02\xf1\x00\xe0\x00\xe1\x01\x95\x00\xe0\x00\xf4\x01\x95\x00\x16\x01\x08\x01\xcf\x01\x17\x01\x43\x02\xd1\x01\x75\x00\x76\x00\xfe\x01\x77\x00\x5a\x03\x78\x00\xf1\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x74\x00\xb8\x01\xd3\x01\xff\x01\x36\x03\x09\x01\x7d\x00\x62\x01\xe1\x01\xfa\x00\x7e\x00\xfe\x00\x09\x02\xce\x00\xcf\x00\x03\x02\x0f\x01\x08\x01\xa9\xfe\x63\x01\x2d\x03\xa9\xfe\x04\x02\xce\x00\xcf\x00\x03\x02\xe3\x01\x75\x00\x76\x00\xe9\x01\x77\x00\x67\x01\x78\x00\x1a\x03\x79\x00\x7a\x00\x7b\x00\x7c\x00\x09\x01\xeb\x01\x53\x00\x4a\x00\x47\x02\x48\x02\x7d\x00\x05\x00\xa9\xfe\x06\x00\x7e\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xf8\x01\x80\x00\xe0\x00\x26\x01\xf1\x00\x69\x01\x17\x00\x18\x00\x18\x01\xfa\x01\x81\x00\x82\x00\x83\x00\x06\x02\x83\x00\x07\x02\x53\x00\x4a\x00\xe0\x00\x05\x00\xf4\x00\x06\x00\x36\x01\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x74\x00\x80\x00\x37\x01\x10\x01\x30\x03\x31\x03\x17\x00\x18\x00\xfe\x00\x58\x01\x81\x00\x82\x00\x83\x00\x33\x02\x1d\x01\x1e\x01\x34\x02\x20\x01\x38\x01\x04\x02\xce\x00\xcf\x00\xd0\x00\xf3\x02\x05\x02\xd3\x00\x50\x00\x75\x00\x76\x00\x61\x00\x77\x00\x6b\x00\x78\x00\x71\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\xab\x02\xac\x02\xaa\x00\xf6\x01\xad\x02\xc0\x00\x7d\x00\xc1\x00\x84\x01\x85\x01\x7e\x00\xc4\x00\x86\x01\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x75\x02\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\x7d\x00\x04\x00\x7f\x00\x29\x00\x87\x01\x32\x03\x33\x03\x35\x02\x83\x00\x5a\x02\x53\x00\x4a\x00\x5b\x02\x74\x03\x57\x01\x83\x00\x05\x00\x7b\x03\x06\x00\x7c\x03\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x7d\x03\x80\x00\xd3\x02\xf1\x00\x3b\x03\x3c\x03\x17\x00\x18\x00\x17\x02\xa4\x02\x81\x00\x82\x00\x83\x00\xec\x00\x29\x00\xed\x00\x53\x00\x4a\x00\x12\x02\x17\x02\x89\x02\xed\x00\xee\x00\x7b\x00\x7c\x00\x4f\x03\x57\x01\x83\x00\xee\x00\x7b\x00\x7c\x00\x7d\x00\x72\x03\x81\x00\x88\x01\x83\x00\xf6\x01\x7d\x00\xc0\x00\x73\x03\xc1\x00\x84\x01\x85\x01\x65\x03\xc4\x00\x86\x01\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x22\x02\x74\x03\x2b\x03\xce\x00\xcf\x00\x03\x02\x7d\x00\x50\x03\x57\x01\x83\x00\x87\x01\x95\x00\xe7\x00\xcf\x00\xe8\x00\x61\x03\xe9\x00\xd3\x00\xf6\x01\x63\x03\xc0\x00\x95\x00\xc1\x00\x84\x01\x85\x01\x29\x00\xc4\x00\x86\x01\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x05\x00\x6a\x03\x06\x00\x45\x03\x67\x00\x08\x00\x7d\x00\xf1\x00\x46\x03\xe6\x01\x87\x01\xb6\x01\x48\x03\xf1\x00\x4b\x03\xfc\x00\x9d\x00\x9e\x00\xb7\x01\x7b\x00\x7c\x00\x29\x02\xfd\x00\x7b\x00\x7c\x00\x17\x00\x18\x00\x7d\x00\xea\x00\x83\x00\xb8\x01\x7d\x00\xa3\x00\xa4\x00\xfe\x00\x4c\x03\x81\x00\x88\x01\x83\x00\xf6\x01\x4d\x03\xc0\x00\x4f\x03\xc1\x00\x84\x01\x85\x01\x95\x00\xc4\x00\x86\x01\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x38\x02\xdb\x01\x1e\x01\xdc\x01\x20\x01\xe5\x02\x7d\x00\xe7\x00\xcf\x00\xe8\x00\x87\x01\xe9\x00\xd3\x00\xa5\x00\xa6\x00\x81\x00\x88\x01\x83\x00\xf6\x01\x55\x03\xc0\x00\x95\x00\xc1\x00\x84\x01\x85\x01\x95\x00\xc4\x00\x86\x01\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\xf1\x00\x5e\x03\x2d\x03\x2e\x03\x83\x00\x60\x03\x7d\x00\xdb\x01\x1e\x01\x06\x03\x87\x01\xb6\x01\x07\x03\xe7\x00\xcf\x00\x0d\x02\x52\x03\x0a\x03\xb7\x01\x7b\x00\x7c\x00\x3e\x02\x0b\x03\xde\x01\x83\x00\x33\x01\x34\x01\x7d\x00\x35\x01\x36\x01\xb8\x01\x2b\x03\xce\x00\xcf\x00\x03\x02\x10\x03\x81\x00\x88\x01\x83\x00\xf6\x01\x12\x02\xc0\x00\x15\x03\xc1\x00\x84\x01\x85\x01\x25\x03\xc4\x00\x86\x01\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\xf5\x01\x6f\x02\x3c\x00\xfa\x00\x53\x00\x4a\x00\x7d\x00\x26\x03\xde\x01\x83\x00\x87\x01\x97\x00\x98\x00\x70\x02\x3d\x03\x81\x00\x88\x01\x83\x00\xf6\x01\x3e\x03\xc0\x00\x41\x03\xc1\x00\x84\x01\x85\x01\x97\x02\xc4\x00\x86\x01\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\xf1\x00\x6d\x03\x31\x00\x32\x00\x9d\x00\x9e\x00\x7d\x00\x5e\x00\xa3\x00\xa4\x00\x87\x01\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x5e\x00\xec\x00\xcf\x01\xed\x00\x5f\x00\x43\x02\xce\x00\xcf\x00\x03\x02\x60\x00\xee\x00\x7b\x00\x7c\x00\x5f\x00\x43\x03\x31\x00\x32\x00\x98\x02\x60\x00\x7d\x00\x81\x00\x88\x01\x83\x00\x61\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xa5\x00\xa6\x00\x95\x00\x61\x00\x99\x02\xfb\x01\xcf\x00\xfc\x01\xcf\x01\xe0\x00\x26\x01\x95\x00\x9b\x02\x31\x00\x32\x00\xa3\x02\x9b\x02\x5d\x02\xf6\x00\xf7\x00\x5e\x02\x5f\x02\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x0c\x02\xa2\x02\x81\x00\x88\x01\x83\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\x3c\x00\xe4\x00\xce\x00\xcf\x00\x03\x02\x05\x00\xaa\x02\x06\x00\xae\x02\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xf1\x00\x38\x00\x51\x03\x57\x01\x83\x00\x95\x00\x17\x00\x18\x00\xc9\x02\x39\x00\x05\x00\xca\x02\x06\x00\xd0\x02\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xd8\x02\x38\x00\x81\x00\xe6\x00\x83\x00\xdb\x02\x17\x00\x18\x00\x05\x00\x39\x00\x06\x00\xcf\x01\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x29\x00\x38\x00\x93\x02\x31\x00\x32\x00\x5e\x00\x17\x00\x18\x00\xe4\x02\x39\x00\xe5\x02\xed\x02\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x12\x02\x5f\x00\x19\x01\xef\x02\xb8\x01\xf1\x02\x60\x00\xf2\x02\xf8\x02\xe6\x02\x1d\x01\x1e\x01\x94\x02\x31\x00\x32\x00\x09\x02\xce\x00\xcf\x00\x03\x02\xf9\x02\x61\x00\xfb\x02\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x32\x02\x1d\x01\x1e\x01\x2e\x02\xf6\x00\xf7\x00\x02\x02\xce\x00\xcf\x00\x03\x02\xfc\x02\xff\x02\x95\x02\x31\x00\x32\x00\x64\x01\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\x00\x03\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x1a\x01\x01\x03\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01\x20\x01\x04\x03\x21\x01\xce\x00\xcf\x00\xd0\x00\x22\x01\xd2\x00\xd3\x00\x05\x00\xf1\x00\x06\x00\x09\x02\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xf1\x00\x38\x00\x07\x03\x57\x01\x83\x00\x10\x02\x17\x00\x18\x00\x05\x00\x39\x00\x06\x00\x12\x02\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x95\x00\x38\x00\x08\x03\x57\x01\x83\x00\x1d\x02\x17\x00\x18\x00\x05\x00\x39\x00\x06\x00\x12\x02\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x3c\x00\x38\x00\x8b\x01\x31\x00\x32\x00\x30\x02\x17\x00\x18\x00\x12\x02\x39\x00\x31\x02\x12\x02\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x95\x00\x3c\x02\x2f\x01\x0b\x03\xf6\x00\xf7\x00\x2e\x02\xf6\x00\xf7\x00\x32\x02\x1d\x01\x1e\x01\x9d\x01\x31\x00\x32\x00\x02\x02\xce\x00\xcf\x00\x03\x02\x26\x03\xf6\x00\xf7\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x75\x02\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\xb8\x02\x57\x01\x83\x00\xb9\x02\x57\x01\x83\x00\x74\x01\x31\x00\x32\x00\xba\x02\x57\x01\x83\x00\xbe\x02\x57\x01\x83\x00\x12\x02\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x30\x01\x4c\x02\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01\x20\x01\x51\x02\x21\x01\xce\x00\xcf\x00\xd0\x00\x31\x01\xd2\x00\xd3\x00\x05\x00\xf1\x00\x06\x00\x4d\x02\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x5d\x02\x38\x00\xbf\x02\x57\x01\x83\x00\x62\x02\x17\x00\x18\x00\x05\x00\x39\x00\x06\x00\x63\x02\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x76\x01\x38\x00\xc3\x02\x57\x01\x83\x00\x64\x02\x17\x00\x18\x00\x05\x00\x39\x00\x06\x00\x65\x02\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x7b\x02\x38\x00\x54\x00\x31\x00\x32\x00\xbe\x01\x17\x00\x18\x00\x3f\xfe\x39\x00\x8f\x01\x86\x02\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x8c\x02\xdb\x01\x1e\x01\xdc\x01\x20\x01\xe5\x02\x7f\x01\xe7\x00\xcf\x00\x0d\x02\x80\x01\x81\x01\x30\x00\x31\x00\x32\x00\x02\x02\xce\x00\xcf\x00\x03\x02\xf4\x02\x57\x01\x83\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x75\x02\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\xc6\x02\xf6\x00\xf7\x00\x82\x01\x83\x01\x05\x00\x8a\x01\x06\x00\x91\x01\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x29\x00\x4d\x00\x8f\x01\x77\x01\xde\x01\x83\x00\x17\x00\x18\x00\x2e\x02\xf6\x00\xf7\x00\x9f\x01\xa0\x01\x05\x00\xf1\x00\x06\x00\xa1\x01\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xa2\x01\x38\x00\xea\x02\xf6\x00\xf7\x00\xa3\x01\x17\x00\x18\x00\x05\x00\x39\x00\x06\x00\xa4\x01\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x95\x00\x38\x00\x7f\x02\x95\x01\xc3\x01\xc4\x01\x17\x00\x18\x00\x99\x00\x39\x00\x6f\x02\x9a\x00\xfa\x00\xc6\x01\x9b\x00\x96\x01\x9c\x00\xc0\x00\xc9\x01\xc1\x00\x97\x01\x98\x01\x70\x02\xc4\x00\x99\x01\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\xeb\x02\xf6\x00\xf7\x00\x95\x00\x27\x01\x08\x01\x7d\x00\x28\x01\xcf\x01\xd1\x01\x9a\x01\x2e\x02\xf6\x00\xf7\x00\x29\x01\x7b\x00\x7c\x00\xf9\x02\x57\x01\x83\x00\x02\x03\xf6\x00\xf7\x00\x7d\x00\x3c\x00\x3c\x00\x09\x01\xe5\x01\x3e\xfe\xfe\x00\xd6\x00\xf5\x00\xf6\x00\xf7\x00\x0a\x02\xf6\x00\xf7\x00\x90\x02\xce\x00\xcf\x00\x03\x02\x3e\xfe\xd7\x00\xcf\x01\xe6\xff\x05\x00\x3e\xfe\x06\x00\x3c\x00\x57\x00\x08\x00\x6a\x00\x76\x02\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\x3c\x00\xfa\x00\x3e\xfe\x0b\x02\xf6\x00\xf7\x00\xf8\x01\x3c\x00\xe0\x00\x26\x01\x95\x00\x00\x02\x17\x00\x18\x00\xd8\x00\x02\x02\x81\x00\x88\x01\x83\x00\xd9\x00\xda\x00\x29\x00\x85\x00\xe3\x00\x86\x00\x3c\x00\x55\x01\x87\x00\x56\x01\x95\x00\x88\x00\x5a\x01\x89\x00\xdb\x00\x8a\x00\x2c\x01\x77\x02\x78\x02\x83\x00\x8b\x00\x8c\x00\x95\x00\xdc\x00\x82\x02\x5b\x01\x8d\x00\x8e\x00\x66\x01\xdd\x00\x8f\x00\x69\x01\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\xf5\x00\xf6\x00\xf7\x00\x19\x02\x57\x01\x83\x00\xe0\x00\x94\x00\x95\x00\xe1\x00\x1a\x00\x2e\x02\xf6\x00\xf7\x00\x95\x00\xfc\xff\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x71\x01\x72\x01\x22\x00\x3c\x02\x57\x01\x83\x00\x05\x00\x76\x01\x06\x00\x7a\x01\x57\x00\x08\x00\xbc\x01\x23\x00\x7c\x01\x1a\x01\xff\xff\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01\x20\x01\x40\xfe\x21\x01\xce\x00\xcf\x00\x03\x02\x4c\x00\x3b\x00\x3c\x00\x17\x00\x18\x00\x24\x00\x3d\x00\xda\x00\x3e\x00\x85\x00\x3f\x00\x86\x00\x3e\xfe\x40\x00\x87\x00\x41\x00\x42\x00\x88\x00\x4d\x00\x89\x00\xdb\x00\x8a\x00\x43\x00\x44\x00\x45\x00\x3e\xfe\x8b\x00\x8c\x00\x50\x00\xdc\x00\x3e\xfe\x46\x00\x8d\x00\x8e\x00\x25\x00\xdd\x00\x8f\x00\x47\x00\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x3e\xfe\x48\x00\x26\x00\x27\x00\x28\x00\x29\x00\x49\x00\x9c\x01\x95\x00\x9d\x01\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\xc9\x01\x57\x01\x83\x00\x54\x00\x56\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x57\x00\xda\x00\x22\x00\x5b\x00\x63\x00\x05\x00\x5e\x00\x06\x00\x64\x00\x57\x00\x08\x00\x09\x00\x41\x01\x23\x00\xdb\x00\xca\x01\x57\x01\x83\x00\xff\xff\x5f\x00\xd4\x01\xf6\x00\xf7\x00\xdc\x00\x60\x00\xf5\x00\xf6\x00\xf7\x00\x65\x00\xdd\x00\x17\x00\x18\x00\xde\x00\x24\x00\xdf\x00\xd8\xff\x66\x00\xd8\xff\x61\x00\xd8\xff\xd8\xff\x67\x00\xd8\xff\x96\x00\x6d\x00\xd8\xff\x95\x00\xd8\xff\xd8\xff\xd8\xff\x56\x01\x57\x01\x83\x00\xd8\xff\xd8\xff\xd8\xff\x99\x00\xd8\xff\xd8\xff\xff\xff\xd8\xff\xd8\xff\x25\x00\xd8\xff\xd8\xff\x9a\x00\xd8\xff\xd8\xff\xd8\xff\xd8\xff\xd8\xff\xd8\xff\xd8\xff\x9b\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xd8\xff\xd8\xff\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x63\x01\x57\x01\x83\x00\x9c\x00\xfe\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x04\x02\xce\x00\xcf\x00\xd0\x00\x00\x00\x05\x02\xd3\x00\x83\x01\x00\x00\xc0\x00\x23\x00\xc1\x00\x84\x01\x85\x01\x00\x00\xc4\x00\x86\x01\x76\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x6d\x01\x57\x01\x83\x00\x24\x00\x00\x00\xda\x00\x7d\x00\x85\x00\x00\x00\x86\x00\x87\x01\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\xd6\x01\x5d\x03\xfa\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x06\x02\x83\x00\x8d\x00\x8e\x00\x25\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x94\x00\x95\x00\x9d\x01\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\xd6\x01\x0f\x03\xfa\x00\x00\x00\xa6\x01\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x81\x00\x88\x01\x83\x00\xd6\x01\xea\x02\xfa\x00\xd6\x01\xf0\x02\xfa\x00\x23\x00\xa7\x01\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\xb7\x00\x00\x00\xb8\x00\x00\x00\xb9\x00\xba\x00\x00\x00\x00\x00\xbb\x00\xbc\x00\x3c\x00\x00\x00\x00\x00\x24\x00\xd6\x01\x01\x02\xfa\x00\x85\x00\x6a\x02\x86\x00\xfa\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x6b\x02\x00\x00\x00\x00\xfe\x01\x8b\x00\x8c\x00\x81\x00\xa8\x01\x83\x00\x00\x00\x8d\x00\x8e\x00\x25\x00\x00\x00\x8f\x00\xff\x01\x00\x00\x90\x00\x00\x00\x91\x00\x92\x00\x93\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x94\x00\x95\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\xd6\x01\x0f\x02\xfa\x00\x5e\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x5f\x00\x00\x00\x5e\x00\x00\x00\x00\x00\x60\x00\x05\x00\x00\x00\x06\x00\x23\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x43\x01\x5f\x00\xa7\x00\xa8\x00\xa9\x00\x61\x00\x60\x00\xf9\x00\x01\x02\xfa\x00\x00\x00\xe0\x00\x00\x00\x95\x00\x00\x00\x24\x00\x00\x00\x17\x00\x18\x00\x85\x00\x61\x00\x86\x00\x00\x00\x00\x00\x87\x00\x00\x00\xe0\x00\x88\x00\x95\x00\x89\x00\x00\x00\x8a\x00\xa7\x00\xa8\x00\xa9\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x25\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x90\x00\x00\x00\x91\x00\x92\x00\x93\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x94\x00\x95\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\xdb\x01\x1e\x01\xdc\x01\x20\x01\x0d\x03\x00\x00\xe7\x00\xcf\x00\x0d\x02\x00\x00\x23\x00\xa9\x01\xaa\x01\x00\x00\xc4\x00\xab\x01\x76\x00\xc6\x00\xc7\x00\xac\x01\xad\x01\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x24\x00\x3d\x00\x7d\x00\x3e\x00\x00\x00\x3f\x00\xae\x01\x00\x00\x40\x00\x00\x00\x41\x00\x42\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x00\x44\x00\x45\x00\x00\x00\x00\x00\x00\x00\xaf\x01\xb0\x01\xb1\x01\x46\x00\x00\x00\x00\x00\x25\x00\xde\x01\x83\x00\x47\x00\x00\x00\x00\x00\x6a\x02\x00\x00\xfa\x00\x00\x00\x00\x00\x48\x00\x26\x00\x27\x00\x28\x00\x29\x00\x49\x00\x4a\x00\x6b\x02\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xf7\x02\x00\x00\x00\x00\x22\x00\x81\x00\xf3\x01\x83\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x3e\x01\x23\x00\x00\x00\x00\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\x17\x00\x18\x00\x24\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x00\x00\x5e\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\xf3\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x5f\x00\x62\x01\x00\x00\xfa\x00\x00\x00\x60\x00\xe0\x00\xf4\x00\x95\x00\x25\x00\x3d\xfe\x00\x00\x05\x00\x63\x01\x06\x00\x00\x00\x57\x00\x08\x00\x3f\x01\x61\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x95\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x00\x00\x00\x00\x17\x00\x18\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x02\x00\x00\x00\x00\x22\x00\x00\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x23\x00\x89\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x24\x00\x03\x01\x00\x00\x91\x00\x92\x00\x93\x00\x61\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x95\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x02\x5f\x00\xfa\x00\x00\x00\xe9\x02\x00\x00\x60\x00\x37\x02\x00\x00\x00\x00\x25\x00\x3e\xfe\x6b\x02\x05\x00\x00\x00\x06\x00\x43\x02\x69\x00\x08\x00\x25\x01\x61\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x95\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x00\x00\x00\x00\x17\x00\x18\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\xf1\x01\x00\x00\x00\x00\x22\x00\x00\x00\xe3\x00\x3e\xfe\x05\x00\x00\x00\x06\x00\x5e\x00\x6d\x00\x08\x00\x5e\x00\x23\x00\xe4\x00\xce\x00\xcf\x00\xd0\x00\x3e\xfe\xe5\x00\xd3\x00\x00\x00\x5f\x00\x3e\xfe\x00\x00\x5f\x00\x00\x00\x60\x00\x00\x00\x00\x00\x60\x00\x17\x00\x18\x00\x24\x00\x05\x00\x00\x00\x06\x00\x3e\xfe\x6f\x00\x08\x00\x3e\xfe\x61\x00\x00\x00\xe0\x00\x61\x00\x95\x00\x00\x00\xe0\x00\x26\x01\x95\x00\xe0\x00\x26\x01\x95\x00\x3e\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x3e\xfe\x17\x00\x18\x00\x00\x00\x25\x00\xf2\x01\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\xe6\x00\x83\x00\x00\x00\x3e\xfe\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xd6\x00\x95\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x00\x00\x5a\x02\x00\x00\xd7\x00\x5b\x02\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x23\x00\x5a\x02\x00\x00\x00\x00\x5b\x02\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\xfe\x00\x5c\x02\x57\x03\x5e\x00\x24\x00\x33\x02\x1d\x01\x1e\x01\x00\x00\x23\x00\x00\x00\x04\x02\xce\x00\xcf\x00\x03\x02\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x02\x20\x03\x00\x00\x24\x00\x00\x00\x00\x00\x00\x00\x25\x00\x05\x00\x61\x00\x06\x00\x00\x00\x57\x00\x08\x00\x40\x01\xe0\x00\x00\x00\x95\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x49\x00\x4a\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x25\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x03\x83\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x49\x00\x4a\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x1c\x02\x00\x00\x00\x00\x22\x00\x00\x00\xdb\x01\x1e\x01\xdc\x01\x20\x01\x2a\x02\x00\x00\xe7\x00\xcf\x00\xe8\x00\x23\x00\xe9\x00\xd3\x00\x00\x00\x1a\x00\x00\x00\x5a\x02\x00\x00\x00\x00\x5b\x02\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x02\x3d\xfe\x00\x00\x05\x00\x23\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x49\x01\x3d\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x00\x00\x5c\x02\x00\x00\x25\x00\x24\x00\xde\x01\x83\x00\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x95\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x01\x25\x00\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01\x20\x01\x00\x00\x21\x01\xce\x00\xcf\x00\x03\x02\x26\x00\x27\x00\x28\x00\x29\x00\x49\x00\x4a\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\xdb\x01\x1e\x01\xdc\x01\x20\x01\x31\x02\x00\x00\xe7\x00\xcf\x00\xe8\x00\x23\x00\xe9\x00\xd3\x00\x00\x00\x1a\x00\x00\x00\x5a\x02\x00\x00\x00\x00\x5b\x02\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x00\x00\x00\x05\x00\x23\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x4a\x01\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x5c\x02\x00\x00\x25\x00\x24\x00\xde\x01\x83\x00\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x61\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\xdb\x01\x1e\x01\xdc\x01\x20\x01\xdd\x01\x25\x00\xe7\x00\xcf\x00\xe8\x00\x00\x00\xe9\x00\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x49\x00\x4a\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\xdb\x01\x1e\x01\xdc\x01\x20\x01\x2a\x02\x00\x00\xe7\x00\xcf\x00\x0d\x02\x00\x00\x23\x00\x1a\x00\x18\x03\x00\x00\xde\x01\x83\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x5c\x02\x00\x00\x00\x00\x24\x00\x00\x00\xdb\x01\x1e\x01\xdc\x01\x20\x01\x31\x02\x23\x00\xe7\x00\xcf\x00\x0d\x02\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x24\x00\x00\x00\x25\x00\xde\x01\x83\x00\xdb\x01\x1e\x01\xdc\x01\x20\x01\xdd\x01\x23\x00\xe7\x00\xcf\x00\x0d\x02\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x5c\x02\x00\x00\x25\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\x01\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\x01\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x00\x1a\x00\x3d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\xbe\x01\x00\x00\xed\x02\x24\x00\x00\x00\x00\x00\xd7\x01\x1d\x01\x1e\x01\x00\x00\x23\x00\x1a\x00\xe4\x00\xce\x00\xcf\x00\x03\x02\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x51\x01\x00\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x24\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\xd9\x01\x83\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\x25\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x45\x01\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x44\x01\x69\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x24\x00\x57\x00\x08\x00\x09\x00\x42\x01\x23\x00\x05\x00\x00\x00\x06\x00\x1a\x00\x57\x00\x08\x00\x6a\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x17\x00\x18\x00\x22\x00\x24\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x17\x00\x18\x00\x00\x00\x05\x00\x23\x00\x06\x00\x00\x00\x57\x00\x08\x00\xa9\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x25\x00\x24\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x25\x00\x00\x00\x33\x02\x1d\x01\x1e\x01\x34\x02\x20\x01\x00\x00\x04\x02\xce\x00\xcf\x00\x03\x02\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x05\x00\x00\x00\x06\x00\x00\x00\x72\x00\x08\x00\x00\x00\x00\x00\x00\x00\x71\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x35\x02\x83\x00\x22\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x24\x00\x73\x00\x08\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x17\x00\x18\x00\x22\x00\x24\x00\xde\x02\x00\x00\x00\x00\x25\x00\xd7\x01\x1d\x01\x1e\x01\xd8\x01\x20\x01\x23\x00\xe4\x00\xce\x00\xcf\x00\x03\x02\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x25\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x01\x00\x00\xfa\x00\x00\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x63\x01\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x00\x81\x00\xd9\x01\x83\x00\x00\x00\x00\x00\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xd7\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x5e\x00\x00\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x22\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x23\x00\xd9\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x00\x00\x00\x00\x87\x00\x61\x00\x00\x00\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x95\x00\x00\x00\x24\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x6f\x02\x00\x00\xfa\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x94\x00\x95\x00\xe1\x00\x25\x00\x05\x00\x70\x02\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x46\x01\x00\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x00\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x02\xda\x00\xfa\x00\x85\x00\x00\x00\x86\x00\x3e\xfe\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x6b\x02\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x3e\xfe\x8b\x00\x8c\x00\x00\x00\xdc\x00\x3e\xfe\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x3e\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x94\x00\x95\x00\x6a\x02\xda\x00\xfa\x00\x85\x00\x00\x00\x86\x00\x3e\xfe\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x6b\x02\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x3e\xfe\x8b\x00\x8c\x00\x00\x00\xdc\x00\x3e\xfe\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x3e\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x94\x00\x95\x00\x6a\x02\xda\x00\xfa\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x6b\x02\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x03\x01\xdf\x00\x91\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x04\x01\x95\x00\xfe\x01\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\xff\x01\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x2e\x01\xdf\x00\x91\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x2f\x01\x95\x00\xfe\x01\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\xff\x01\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\xba\x01\xdf\x00\x91\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xbb\x01\x95\x00\xfe\x01\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\xff\x01\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x03\x01\xdf\x00\x91\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x04\x01\x95\x00\xfe\x01\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\xff\x01\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x2e\x01\xdf\x00\x91\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x2f\x01\x95\x00\xfe\x01\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\xff\x01\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x03\x01\xdf\x00\x91\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x04\x01\x95\x00\x62\x01\xda\x00\xfa\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x63\x01\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x2e\x01\xdf\x00\x91\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x2f\x01\x95\x00\xd6\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x3e\xfe\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\xd7\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x3e\xfe\x8b\x00\x8c\x00\x00\x00\xdc\x00\x3e\xfe\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x3e\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\x00\x95\x00\xd6\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\xd7\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\xba\x01\xdf\x00\x91\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xbb\x01\x95\x00\xd6\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\xd7\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x03\x01\xdf\x00\x91\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x04\x01\x95\x00\x6f\x02\xda\x00\xfa\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x70\x02\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x2e\x01\xdf\x00\x91\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x2f\x01\x95\x00\x62\x01\xda\x00\xfa\x00\x85\x00\x00\x00\x86\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x63\x01\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\xf3\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x00\x00\xfe\x01\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xf4\x00\x95\x00\x00\x00\xda\x00\x00\x00\x85\x00\xff\x01\x86\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\xf3\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x00\x00\xd6\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\xf4\x00\x95\x00\x87\x00\xed\x00\x00\x00\x88\x00\xd7\x00\x89\x00\xdb\x00\x8a\x00\xee\x00\x7b\x00\x7c\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x2a\x03\x7d\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\xf3\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x00\x00\x2b\x03\xce\x00\xcf\x00\x03\x02\x00\x00\xe0\x00\xf4\x00\x95\x00\x00\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x00\x00\xec\x00\x87\x00\xed\x00\xfe\x01\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\xee\x00\x7b\x00\x7c\x00\x00\x00\x8b\x00\x8c\x00\xff\x01\xdc\x00\x00\x00\x7d\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\xf3\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x62\x01\x2d\x03\xfa\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xf4\x00\x95\x00\x00\x00\xf1\x00\x00\x00\x63\x01\x00\x00\x5d\x02\xf6\x00\xf7\x00\x5e\x02\x5f\x02\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x86\x00\x00\x00\xe6\x01\x87\x00\xb6\x01\x00\x00\x88\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xb7\x01\x7b\x00\x7c\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x7d\x00\x8d\x00\x8e\x00\xb8\x01\x00\x00\x8f\x00\x00\x00\x00\x00\xf3\x00\x3e\xfe\x91\x00\x92\x00\x93\x00\xf1\x00\x99\x02\xce\x00\xcf\x00\x03\x02\x00\x00\xe0\x00\xf4\x00\x95\x00\x3e\xfe\x00\x00\x00\x00\xa9\x01\xaa\x01\x3e\xfe\xc4\x00\xab\x01\x76\x00\xc6\x00\xc7\x00\xac\x01\xad\x01\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x3e\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x95\x00\xae\x01\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\x1e\x01\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x00\xcf\x00\x0d\x02\x00\x00\x00\x00\x00\x00\xaf\x01\xb0\x01\xb1\x01\xf1\x00\x00\x00\x00\x00\xb2\x01\xf6\x00\xf7\x00\xb3\x01\xb4\x01\x00\x00\x00\x00\x00\x00\xa9\x01\xaa\x01\x00\x00\xc4\x00\xab\x01\x76\x00\xc6\x00\xc7\x00\xac\x01\xad\x01\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x00\x00\xae\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\xbd\x02\x83\x00\xe7\x00\xcf\x00\x0d\x02\x00\x00\x00\x00\x00\x00\xaf\x01\xb0\x01\xb1\x01\x00\x00\x00\x00\x00\x00\xb2\x01\xf6\x00\xf7\x00\xb3\x01\xb4\x01\xa9\x01\xaa\x01\x00\x00\xc4\x00\xab\x01\x76\x00\xc6\x00\xc7\x00\xac\x01\xad\x01\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x00\x00\xae\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\xc2\x02\x83\x00\x00\x00\x00\x00\x00\x00\xaf\x01\xb0\x01\xb1\x01\x00\x00\x00\x00\x00\x00\xb2\x01\xf6\x00\xf7\x00\xb3\x01\xb4\x01\xa9\x01\xaa\x01\x00\x00\xc4\x00\xab\x01\x76\x00\xc6\x00\xc7\x00\xac\x01\xad\x01\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x00\x00\xae\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\xb5\x01\x83\x00\x00\x00\x00\x00\x00\x00\xaf\x01\xb0\x01\xb1\x01\xf2\x01\x00\x00\x00\x00\xa9\x01\xaa\x01\x00\x00\xc4\x00\xab\x01\x76\x00\xc6\x00\xc7\x00\xac\x01\xad\x01\xca\x00\xcb\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x27\x01\x08\x01\x00\x00\x28\x01\x00\x00\x7d\x00\x00\x00\x00\x00\x00\x00\xae\x01\x29\x01\x7b\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\x00\x00\xfb\x00\x09\x01\xfc\x00\x00\x00\x81\x00\xf3\x01\x83\x00\xc4\x02\x00\x00\xfd\x00\x7b\x00\x7c\x00\x70\x02\xce\x00\xcf\x00\x03\x02\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x71\x02\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\x00\x00\x00\x00\x65\x02\xce\x00\xcf\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x02\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\x00\x00\x00\x00\x81\x00\xf3\x01\x83\x00\x00\x00\xec\x00\x00\x00\xed\x00\x00\x00\xfb\x00\x00\x00\xfc\x00\x00\x00\x00\x00\xee\x00\x7b\x00\x7c\x00\x2c\x01\xfd\x00\x7b\x00\x7c\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x2b\x02\x1e\x01\x00\x00\x00\x00\x67\x02\x68\x02\xfb\x01\xcf\x00\xfc\x01\x8e\x02\xce\x00\xcf\x00\x03\x02\x00\x00\xec\x00\xfe\x00\xed\x00\x00\x00\x5d\x02\xf6\x00\xf7\x00\x5e\x02\x5f\x02\xee\x00\x7b\x00\x7c\x00\x04\x02\xce\x00\xcf\x00\x03\x02\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x02\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\x00\x00\x00\x00\x8d\x02\xce\x00\xcf\x00\x03\x02\x75\x00\x76\x00\x00\x00\x77\x00\x00\x00\x78\x00\x00\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\xf1\x00\x00\x00\x00\x00\x8f\x02\x83\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x02\x27\x03\x83\x00\x00\x00\x00\x00\x00\x00\x75\x00\x76\x00\x00\x00\x77\x00\x00\x00\x78\x00\xca\x02\x79\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x7d\x00\x00\x00\x00\x00\x05\x00\x7e\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x00\x00\xcb\x02\x00\x00\x13\x02\x00\x00\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x00\x00\x14\x02\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x81\x00\x82\x00\x83\x00\x75\x00\x76\x00\x00\x00\x77\x00\x00\x00\x78\x00\x00\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x4d\x01\x75\x00\x76\x00\x00\x00\x77\x00\x00\x00\x78\x00\x26\x02\x79\x00\x7a\x00\x7b\x00\x7c\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x05\x00\x7e\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x00\x00\x27\x02\x00\x00\x39\x02\x00\x00\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x00\x00\x3a\x02\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x81\x00\x82\x00\x83\x00\x75\x00\x76\x00\x00\x00\x77\x00\x00\x00\x78\x00\x00\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x02\x76\x00\x7d\x00\x77\x00\x00\x00\x78\x00\x7e\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x29\x03\xb1\x02\xb2\x02\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x00\x00\xb3\x02\x00\x00\xaf\x02\x76\x00\x00\x00\x77\x00\xc0\x01\x78\x00\x00\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\xb0\x02\xb1\x02\xb2\x02\x00\x00\x00\x00\x7d\x00\x05\x00\x00\x00\x06\x00\xb3\x02\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x00\x00\xc1\x01\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x81\x00\x82\x00\x83\x00\x75\x00\x76\x00\x00\x00\x77\x00\x00\x00\x78\x00\x00\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x81\x00\xb4\x02\x83\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x75\x00\x76\x00\x00\x00\x77\x00\x00\x00\x78\x00\x00\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x00\x00\x81\x00\xb4\x02\x83\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x7b\x02\x7e\x00\x00\x00\x00\x00\x75\x00\x76\x00\x00\x00\x77\x00\x00\x00\x78\x00\xfc\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x00\x00\xfd\x00\x7b\x00\x7c\x00\x00\x00\x7d\x00\x7e\x02\x00\x00\x00\x00\x7e\x00\x7d\x00\x00\x00\x00\x00\xfe\x00\x75\x00\x76\x00\x00\x00\x77\x00\x00\x00\x78\x00\x00\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x00\x00\x00\x00\x81\x00\x82\x00\x83\x00\x6b\x01\x7d\x00\x00\x00\x00\x00\x00\x00\x7e\x00\x5b\x01\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x01\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\xfe\x00\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x81\x00\x82\x00\x83\x00\x5f\x00\x8b\x00\x8c\x00\x5f\x01\x60\x01\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\xb8\x01\x81\x00\x82\x00\x83\x00\x05\x00\x95\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\xed\x01\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x1e\x02\x1f\x02\x83\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\xed\x01\x00\x00\x00\x00\x00\x00\xfe\x00\xf5\x02\x00\x00\x17\x00\x18\x00\x33\x02\x1d\x01\x1e\x01\x00\x00\xf1\x00\xec\x01\x04\x02\xce\x00\xcf\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x02\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\xb8\x01\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x02\x1d\x01\x1e\x01\xe7\x02\x20\x01\x00\x00\x09\x02\xce\x00\xcf\x00\x03\x02\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\xed\x01\x00\x00\x77\x02\x28\x03\x83\x00\xee\x01\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x81\x00\xef\x01\x83\x00\xbb\x02\x00\x00\x00\x00\x00\x00\xd7\x01\x1d\x01\x1e\x01\x00\x00\x00\x00\x00\x00\xe4\x00\xce\x00\xcf\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\x00\x00\x00\x00\xa7\x01\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\xd6\x01\x00\x00\x00\x00\x00\x00\xd7\x01\x1d\x01\x1e\x01\xd8\x01\x20\x01\x58\x01\xe4\x00\xce\x00\xcf\x00\xd0\x00\x00\x00\xe5\x00\xd3\x00\xc0\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\x00\xce\x00\xcf\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x00\xbc\x02\x83\x00\xa7\x01\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\xfc\x02\x81\x00\xd9\x01\x83\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\x02\x00\x00\x37\x03\x00\x00\x00\x00\x81\x00\xc1\x02\x83\x00\x85\x00\x00\x00\x86\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x90\x00\x00\x00\x91\x00\x92\x00\x93\x00\x00\x00\x00\x00\xb6\x02\x00\x00\xb7\x02\x00\x00\x00\x00\x94\x00\x95\x00\xb8\x02\x85\x00\x00\x00\x86\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x0f\x01\x90\x00\x00\x00\x91\x00\x92\x00\x93\x00\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x00\x00\x00\x94\x00\x95\x00\xb8\x02\x12\x01\x00\x00\x00\x00\xdb\x00\x00\x00\x00\x00\xda\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x5e\x00\xdc\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\xdb\x00\x00\x00\xde\x00\x00\x00\xdf\x00\x5f\x00\x00\x00\x00\x00\x61\x00\xdc\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x00\x95\x00\x00\x00\xde\x00\x00\x00\xdf\x00\x3c\x00\x00\x00\x00\x00\x61\x00\x00\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x00\x00\x95\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x02\x94\x00\x95\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\x00\x95\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x3e\xfe\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x3e\xfe\x8b\x00\x8c\x00\x00\x00\xdc\x00\x3e\xfe\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x3e\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x01\x94\x00\x95\x00\x3c\xfe\x00\x00\x3c\xfe\x00\x00\x3c\xfe\x3c\xfe\x00\x00\x3c\xfe\x00\x00\x00\x00\x3c\xfe\x00\x00\x3c\xfe\x3c\xfe\x3c\xfe\x00\x00\x00\x00\x00\x00\x3c\xfe\x3c\xfe\x3c\xfe\x00\x00\x3c\xfe\x3c\xfe\x00\x00\x3c\xfe\x3c\xfe\x00\x00\x3c\xfe\x3c\xfe\x00\x00\x3c\xfe\x3c\xfe\x3c\xfe\x3c\xfe\x3c\xfe\x3c\xfe\x3c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\xfe\x3c\xfe\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\xba\x01\xdf\x00\x91\x00\x92\x00\x93\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x01\x95\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x3e\xfe\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x3e\xfe\x8b\x00\x8c\x00\x00\x00\xdc\x00\x3e\xfe\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x3e\xfe\x00\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x94\x00\x95\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\xf3\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x00\x00\x00\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\xf4\x00\x95\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x8f\x00\x00\x00\xde\x00\x90\x00\xdf\x00\x91\x00\x92\x00\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\x00\x95\x00\xda\x00\x00\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x00\x00\xdb\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\xdc\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\xdd\x00\x00\x00\x00\x00\xde\x00\x00\x00\xdf\x00\x00\x00\x92\x00\x93\x00\x61\x00\x85\x00\x00\x00\x86\x00\x00\x00\x00\x00\x87\x00\x00\x00\x95\x00\x88\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x90\x00\x00\x00\x91\x00\x92\x00\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\x00\x95\x00\xb8\x02\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x00\x00\x00\x00\x88\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\xba\x01\x00\x00\x91\x00\x92\x00\x93\x00\x61\x00\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\xbb\x01\x95\x00\x88\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x03\x01\x00\x00\x91\x00\x92\x00\x93\x00\x61\x00\x3c\xfe\x00\x00\x3c\xfe\x3c\xfe\x00\x00\x3c\xfe\x04\x01\x95\x00\x3c\xfe\x00\x00\x3c\xfe\x00\x00\x3c\xfe\x00\x00\x00\x00\x00\x00\x3c\xfe\x3c\xfe\x3c\xfe\x00\x00\x00\x00\x3c\xfe\x00\x00\x3c\xfe\x3c\xfe\x00\x00\x00\x00\x3c\xfe\x00\x00\x00\x00\x3c\xfe\x00\x00\x3c\xfe\x3c\xfe\x3c\xfe\x3c\xfe\x85\x00\x00\x00\x86\x00\x5e\x00\x00\x00\x87\x00\x3c\xfe\x3c\xfe\x88\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x60\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\xba\x01\x00\x00\x91\x00\x92\x00\x93\x00\x61\x00\x85\x00\x00\x00\x86\x00\x00\x00\x00\x00\x87\x00\xbb\x01\x95\x00\x88\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x90\x00\x00\x00\x91\x00\x92\x00\x93\x00\x00\x00\x85\x00\x00\x00\x86\x00\x00\x00\x00\x00\x87\x00\x94\x00\x95\x00\x88\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\xf3\x00\x00\x00\x91\x00\x92\x00\x93\x00\x00\x00\x85\x00\x00\x00\x86\x00\x00\x00\x00\x00\x87\x00\xf4\x00\x95\x00\x88\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x00\x8e\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x90\x00\x00\x00\x91\x00\x92\x00\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\x00\x95\x00\x51\x02\x00\x00\xcc\x02\x53\x02\x54\x02\x55\x02\x56\x02\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x57\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x51\x02\x58\x02\x52\x02\x53\x02\x54\x02\x55\x02\x56\x02\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x57\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x1d\x03\x58\x02\x00\x00\x1e\x03\x54\x02\x55\x02\x56\x02\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x57\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x58\x02\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x03\x17\x00\x18\x00\x00\x00\x58\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x03\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x57\x02\x00\x00\xd3\x02\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x57\x02\x00\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x57\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\xed\x01\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x02\x00\x00\x17\x00\x18\x00\x00\x00\x05\x00\x00\x00\x06\x00\xf1\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x00\x00\x4d\x00\x00\x00\x41\x03\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x00\x00\x4d\x00\x00\x00\x42\x03\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x00\x00\x4d\x00\x00\x00\x91\x02\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x00\x00\x4d\x00\x00\x00\x92\x02\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x00\x00\x4d\x00\x00\x00\x4e\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x00\x00\x75\x03\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x00\x00\x76\x03\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x00\x00\x49\x03\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x00\x00\x38\x03\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x00\x00\x8c\x02\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x00\x00\x39\x01\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x3a\x01\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x3b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x00\x00\x4f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x52\x01\x00\x00\x00\x00\x53\x01\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x00\x00\x78\x01\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x00\x00\x7c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x00\x00\x7d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x03\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x03\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x03\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x03\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x03\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x03\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x5e\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x04\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x03\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x02\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x44\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x46\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x01\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x3d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x6a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x58\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x45\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\xc4\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x51\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x4e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x4c\x01\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x4b\x01\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x47\x01\x00\x00\x17\x00\x18\x00\x05\x00\x00\x00\x06\x00\x00\x00\x57\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x48\x01\x00\x00\x00\x00\x17\x00\x18\x00\x6b\x02\x1d\x01\x1e\x01\x00\x00\x00\x00\x00\x00\x6c\x02\xce\x00\xcf\x00\x03\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x02\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\x72\x02\x1d\x01\x1e\x01\x00\x00\x00\x00\x00\x00\x73\x02\xce\x00\xcf\x00\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x03\x74\x02\x5c\x01\xf6\x00\xf7\x00\x5d\x01\x5e\x01\x34\x03\x00\x00\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01\x20\x01\x33\x03\x40\x02\xce\x00\xcf\x00\x03\x02\x00\x00\x00\x00\x34\x03\x00\x00\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01\x20\x01\x00\x00\x40\x02\xce\x00\xcf\x00\x03\x02\x3f\x02\x00\x00\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01\x20\x01\x00\x00\x40\x02\xce\x00\xcf\x00\x03\x02\x1a\x01\x00\x00\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01\x20\x01\x00\x00\x40\x02\xce\x00\xcf\x00\x03\x02\x30\x01\x00\x00\x1b\x01\x1c\x01\x1d\x01\x1e\x01\x1f\x01\x20\x01\x00\x00\x40\x02\xce\x00\xcf\x00\x03\x02\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
+
+happyReduceArr = array (3, 462) [
+	(3 , happyReduce_3),
+	(4 , happyReduce_4),
+	(5 , happyReduce_5),
+	(6 , happyReduce_6),
+	(7 , happyReduce_7),
+	(8 , happyReduce_8),
+	(9 , happyReduce_9),
+	(10 , happyReduce_10),
+	(11 , happyReduce_11),
+	(12 , happyReduce_12),
+	(13 , happyReduce_13),
+	(14 , happyReduce_14),
+	(15 , happyReduce_15),
+	(16 , happyReduce_16),
+	(17 , happyReduce_17),
+	(18 , happyReduce_18),
+	(19 , happyReduce_19),
+	(20 , happyReduce_20),
+	(21 , happyReduce_21),
+	(22 , happyReduce_22),
+	(23 , happyReduce_23),
+	(24 , happyReduce_24),
+	(25 , happyReduce_25),
+	(26 , happyReduce_26),
+	(27 , happyReduce_27),
+	(28 , happyReduce_28),
+	(29 , happyReduce_29),
+	(30 , happyReduce_30),
+	(31 , happyReduce_31),
+	(32 , happyReduce_32),
+	(33 , happyReduce_33),
+	(34 , happyReduce_34),
+	(35 , happyReduce_35),
+	(36 , happyReduce_36),
+	(37 , happyReduce_37),
+	(38 , happyReduce_38),
+	(39 , happyReduce_39),
+	(40 , happyReduce_40),
+	(41 , happyReduce_41),
+	(42 , happyReduce_42),
+	(43 , happyReduce_43),
+	(44 , happyReduce_44),
+	(45 , happyReduce_45),
+	(46 , happyReduce_46),
+	(47 , happyReduce_47),
+	(48 , happyReduce_48),
+	(49 , happyReduce_49),
+	(50 , happyReduce_50),
+	(51 , happyReduce_51),
+	(52 , happyReduce_52),
+	(53 , happyReduce_53),
+	(54 , happyReduce_54),
+	(55 , happyReduce_55),
+	(56 , happyReduce_56),
+	(57 , happyReduce_57),
+	(58 , happyReduce_58),
+	(59 , happyReduce_59),
+	(60 , happyReduce_60),
+	(61 , happyReduce_61),
+	(62 , happyReduce_62),
+	(63 , happyReduce_63),
+	(64 , happyReduce_64),
+	(65 , happyReduce_65),
+	(66 , happyReduce_66),
+	(67 , happyReduce_67),
+	(68 , happyReduce_68),
+	(69 , happyReduce_69),
+	(70 , happyReduce_70),
+	(71 , happyReduce_71),
+	(72 , happyReduce_72),
+	(73 , happyReduce_73),
+	(74 , happyReduce_74),
+	(75 , happyReduce_75),
+	(76 , happyReduce_76),
+	(77 , happyReduce_77),
+	(78 , happyReduce_78),
+	(79 , happyReduce_79),
+	(80 , happyReduce_80),
+	(81 , happyReduce_81),
+	(82 , happyReduce_82),
+	(83 , happyReduce_83),
+	(84 , happyReduce_84),
+	(85 , happyReduce_85),
+	(86 , happyReduce_86),
+	(87 , happyReduce_87),
+	(88 , happyReduce_88),
+	(89 , happyReduce_89),
+	(90 , happyReduce_90),
+	(91 , happyReduce_91),
+	(92 , happyReduce_92),
+	(93 , happyReduce_93),
+	(94 , happyReduce_94),
+	(95 , happyReduce_95),
+	(96 , happyReduce_96),
+	(97 , happyReduce_97),
+	(98 , happyReduce_98),
+	(99 , happyReduce_99),
+	(100 , happyReduce_100),
+	(101 , happyReduce_101),
+	(102 , happyReduce_102),
+	(103 , happyReduce_103),
+	(104 , happyReduce_104),
+	(105 , happyReduce_105),
+	(106 , happyReduce_106),
+	(107 , happyReduce_107),
+	(108 , happyReduce_108),
+	(109 , happyReduce_109),
+	(110 , happyReduce_110),
+	(111 , happyReduce_111),
+	(112 , happyReduce_112),
+	(113 , happyReduce_113),
+	(114 , happyReduce_114),
+	(115 , happyReduce_115),
+	(116 , happyReduce_116),
+	(117 , happyReduce_117),
+	(118 , happyReduce_118),
+	(119 , happyReduce_119),
+	(120 , happyReduce_120),
+	(121 , happyReduce_121),
+	(122 , happyReduce_122),
+	(123 , happyReduce_123),
+	(124 , happyReduce_124),
+	(125 , happyReduce_125),
+	(126 , happyReduce_126),
+	(127 , happyReduce_127),
+	(128 , happyReduce_128),
+	(129 , happyReduce_129),
+	(130 , happyReduce_130),
+	(131 , happyReduce_131),
+	(132 , happyReduce_132),
+	(133 , happyReduce_133),
+	(134 , happyReduce_134),
+	(135 , happyReduce_135),
+	(136 , happyReduce_136),
+	(137 , happyReduce_137),
+	(138 , happyReduce_138),
+	(139 , happyReduce_139),
+	(140 , happyReduce_140),
+	(141 , happyReduce_141),
+	(142 , happyReduce_142),
+	(143 , happyReduce_143),
+	(144 , happyReduce_144),
+	(145 , happyReduce_145),
+	(146 , happyReduce_146),
+	(147 , happyReduce_147),
+	(148 , happyReduce_148),
+	(149 , happyReduce_149),
+	(150 , happyReduce_150),
+	(151 , happyReduce_151),
+	(152 , happyReduce_152),
+	(153 , happyReduce_153),
+	(154 , happyReduce_154),
+	(155 , happyReduce_155),
+	(156 , happyReduce_156),
+	(157 , happyReduce_157),
+	(158 , happyReduce_158),
+	(159 , happyReduce_159),
+	(160 , happyReduce_160),
+	(161 , happyReduce_161),
+	(162 , happyReduce_162),
+	(163 , happyReduce_163),
+	(164 , happyReduce_164),
+	(165 , happyReduce_165),
+	(166 , happyReduce_166),
+	(167 , happyReduce_167),
+	(168 , happyReduce_168),
+	(169 , happyReduce_169),
+	(170 , happyReduce_170),
+	(171 , happyReduce_171),
+	(172 , happyReduce_172),
+	(173 , happyReduce_173),
+	(174 , happyReduce_174),
+	(175 , happyReduce_175),
+	(176 , happyReduce_176),
+	(177 , happyReduce_177),
+	(178 , happyReduce_178),
+	(179 , happyReduce_179),
+	(180 , happyReduce_180),
+	(181 , happyReduce_181),
+	(182 , happyReduce_182),
+	(183 , happyReduce_183),
+	(184 , happyReduce_184),
+	(185 , happyReduce_185),
+	(186 , happyReduce_186),
+	(187 , happyReduce_187),
+	(188 , happyReduce_188),
+	(189 , happyReduce_189),
+	(190 , happyReduce_190),
+	(191 , happyReduce_191),
+	(192 , happyReduce_192),
+	(193 , happyReduce_193),
+	(194 , happyReduce_194),
+	(195 , happyReduce_195),
+	(196 , happyReduce_196),
+	(197 , happyReduce_197),
+	(198 , happyReduce_198),
+	(199 , happyReduce_199),
+	(200 , happyReduce_200),
+	(201 , happyReduce_201),
+	(202 , happyReduce_202),
+	(203 , happyReduce_203),
+	(204 , happyReduce_204),
+	(205 , happyReduce_205),
+	(206 , happyReduce_206),
+	(207 , happyReduce_207),
+	(208 , happyReduce_208),
+	(209 , happyReduce_209),
+	(210 , happyReduce_210),
+	(211 , happyReduce_211),
+	(212 , happyReduce_212),
+	(213 , happyReduce_213),
+	(214 , happyReduce_214),
+	(215 , happyReduce_215),
+	(216 , happyReduce_216),
+	(217 , happyReduce_217),
+	(218 , happyReduce_218),
+	(219 , happyReduce_219),
+	(220 , happyReduce_220),
+	(221 , happyReduce_221),
+	(222 , happyReduce_222),
+	(223 , happyReduce_223),
+	(224 , happyReduce_224),
+	(225 , happyReduce_225),
+	(226 , happyReduce_226),
+	(227 , happyReduce_227),
+	(228 , happyReduce_228),
+	(229 , happyReduce_229),
+	(230 , happyReduce_230),
+	(231 , happyReduce_231),
+	(232 , happyReduce_232),
+	(233 , happyReduce_233),
+	(234 , happyReduce_234),
+	(235 , happyReduce_235),
+	(236 , happyReduce_236),
+	(237 , happyReduce_237),
+	(238 , happyReduce_238),
+	(239 , happyReduce_239),
+	(240 , happyReduce_240),
+	(241 , happyReduce_241),
+	(242 , happyReduce_242),
+	(243 , happyReduce_243),
+	(244 , happyReduce_244),
+	(245 , happyReduce_245),
+	(246 , happyReduce_246),
+	(247 , happyReduce_247),
+	(248 , happyReduce_248),
+	(249 , happyReduce_249),
+	(250 , happyReduce_250),
+	(251 , happyReduce_251),
+	(252 , happyReduce_252),
+	(253 , happyReduce_253),
+	(254 , happyReduce_254),
+	(255 , happyReduce_255),
+	(256 , happyReduce_256),
+	(257 , happyReduce_257),
+	(258 , happyReduce_258),
+	(259 , happyReduce_259),
+	(260 , happyReduce_260),
+	(261 , happyReduce_261),
+	(262 , happyReduce_262),
+	(263 , happyReduce_263),
+	(264 , happyReduce_264),
+	(265 , happyReduce_265),
+	(266 , happyReduce_266),
+	(267 , happyReduce_267),
+	(268 , happyReduce_268),
+	(269 , happyReduce_269),
+	(270 , happyReduce_270),
+	(271 , happyReduce_271),
+	(272 , happyReduce_272),
+	(273 , happyReduce_273),
+	(274 , happyReduce_274),
+	(275 , happyReduce_275),
+	(276 , happyReduce_276),
+	(277 , happyReduce_277),
+	(278 , happyReduce_278),
+	(279 , happyReduce_279),
+	(280 , happyReduce_280),
+	(281 , happyReduce_281),
+	(282 , happyReduce_282),
+	(283 , happyReduce_283),
+	(284 , happyReduce_284),
+	(285 , happyReduce_285),
+	(286 , happyReduce_286),
+	(287 , happyReduce_287),
+	(288 , happyReduce_288),
+	(289 , happyReduce_289),
+	(290 , happyReduce_290),
+	(291 , happyReduce_291),
+	(292 , happyReduce_292),
+	(293 , happyReduce_293),
+	(294 , happyReduce_294),
+	(295 , happyReduce_295),
+	(296 , happyReduce_296),
+	(297 , happyReduce_297),
+	(298 , happyReduce_298),
+	(299 , happyReduce_299),
+	(300 , happyReduce_300),
+	(301 , happyReduce_301),
+	(302 , happyReduce_302),
+	(303 , happyReduce_303),
+	(304 , happyReduce_304),
+	(305 , happyReduce_305),
+	(306 , happyReduce_306),
+	(307 , happyReduce_307),
+	(308 , happyReduce_308),
+	(309 , happyReduce_309),
+	(310 , happyReduce_310),
+	(311 , happyReduce_311),
+	(312 , happyReduce_312),
+	(313 , happyReduce_313),
+	(314 , happyReduce_314),
+	(315 , happyReduce_315),
+	(316 , happyReduce_316),
+	(317 , happyReduce_317),
+	(318 , happyReduce_318),
+	(319 , happyReduce_319),
+	(320 , happyReduce_320),
+	(321 , happyReduce_321),
+	(322 , happyReduce_322),
+	(323 , happyReduce_323),
+	(324 , happyReduce_324),
+	(325 , happyReduce_325),
+	(326 , happyReduce_326),
+	(327 , happyReduce_327),
+	(328 , happyReduce_328),
+	(329 , happyReduce_329),
+	(330 , happyReduce_330),
+	(331 , happyReduce_331),
+	(332 , happyReduce_332),
+	(333 , happyReduce_333),
+	(334 , happyReduce_334),
+	(335 , happyReduce_335),
+	(336 , happyReduce_336),
+	(337 , happyReduce_337),
+	(338 , happyReduce_338),
+	(339 , happyReduce_339),
+	(340 , happyReduce_340),
+	(341 , happyReduce_341),
+	(342 , happyReduce_342),
+	(343 , happyReduce_343),
+	(344 , happyReduce_344),
+	(345 , happyReduce_345),
+	(346 , happyReduce_346),
+	(347 , happyReduce_347),
+	(348 , happyReduce_348),
+	(349 , happyReduce_349),
+	(350 , happyReduce_350),
+	(351 , happyReduce_351),
+	(352 , happyReduce_352),
+	(353 , happyReduce_353),
+	(354 , happyReduce_354),
+	(355 , happyReduce_355),
+	(356 , happyReduce_356),
+	(357 , happyReduce_357),
+	(358 , happyReduce_358),
+	(359 , happyReduce_359),
+	(360 , happyReduce_360),
+	(361 , happyReduce_361),
+	(362 , happyReduce_362),
+	(363 , happyReduce_363),
+	(364 , happyReduce_364),
+	(365 , happyReduce_365),
+	(366 , happyReduce_366),
+	(367 , happyReduce_367),
+	(368 , happyReduce_368),
+	(369 , happyReduce_369),
+	(370 , happyReduce_370),
+	(371 , happyReduce_371),
+	(372 , happyReduce_372),
+	(373 , happyReduce_373),
+	(374 , happyReduce_374),
+	(375 , happyReduce_375),
+	(376 , happyReduce_376),
+	(377 , happyReduce_377),
+	(378 , happyReduce_378),
+	(379 , happyReduce_379),
+	(380 , happyReduce_380),
+	(381 , happyReduce_381),
+	(382 , happyReduce_382),
+	(383 , happyReduce_383),
+	(384 , happyReduce_384),
+	(385 , happyReduce_385),
+	(386 , happyReduce_386),
+	(387 , happyReduce_387),
+	(388 , happyReduce_388),
+	(389 , happyReduce_389),
+	(390 , happyReduce_390),
+	(391 , happyReduce_391),
+	(392 , happyReduce_392),
+	(393 , happyReduce_393),
+	(394 , happyReduce_394),
+	(395 , happyReduce_395),
+	(396 , happyReduce_396),
+	(397 , happyReduce_397),
+	(398 , happyReduce_398),
+	(399 , happyReduce_399),
+	(400 , happyReduce_400),
+	(401 , happyReduce_401),
+	(402 , happyReduce_402),
+	(403 , happyReduce_403),
+	(404 , happyReduce_404),
+	(405 , happyReduce_405),
+	(406 , happyReduce_406),
+	(407 , happyReduce_407),
+	(408 , happyReduce_408),
+	(409 , happyReduce_409),
+	(410 , happyReduce_410),
+	(411 , happyReduce_411),
+	(412 , happyReduce_412),
+	(413 , happyReduce_413),
+	(414 , happyReduce_414),
+	(415 , happyReduce_415),
+	(416 , happyReduce_416),
+	(417 , happyReduce_417),
+	(418 , happyReduce_418),
+	(419 , happyReduce_419),
+	(420 , happyReduce_420),
+	(421 , happyReduce_421),
+	(422 , happyReduce_422),
+	(423 , happyReduce_423),
+	(424 , happyReduce_424),
+	(425 , happyReduce_425),
+	(426 , happyReduce_426),
+	(427 , happyReduce_427),
+	(428 , happyReduce_428),
+	(429 , happyReduce_429),
+	(430 , happyReduce_430),
+	(431 , happyReduce_431),
+	(432 , happyReduce_432),
+	(433 , happyReduce_433),
+	(434 , happyReduce_434),
+	(435 , happyReduce_435),
+	(436 , happyReduce_436),
+	(437 , happyReduce_437),
+	(438 , happyReduce_438),
+	(439 , happyReduce_439),
+	(440 , happyReduce_440),
+	(441 , happyReduce_441),
+	(442 , happyReduce_442),
+	(443 , happyReduce_443),
+	(444 , happyReduce_444),
+	(445 , happyReduce_445),
+	(446 , happyReduce_446),
+	(447 , happyReduce_447),
+	(448 , happyReduce_448),
+	(449 , happyReduce_449),
+	(450 , happyReduce_450),
+	(451 , happyReduce_451),
+	(452 , happyReduce_452),
+	(453 , happyReduce_453),
+	(454 , happyReduce_454),
+	(455 , happyReduce_455),
+	(456 , happyReduce_456),
+	(457 , happyReduce_457),
+	(458 , happyReduce_458),
+	(459 , happyReduce_459),
+	(460 , happyReduce_460),
+	(461 , happyReduce_461),
+	(462 , happyReduce_462)
+	]
+
+happy_n_terms = 102 :: Int
+happy_n_nonterms = 125 :: Int
+
+happyReduce_3 = happyMonadReduce 1# 0# happyReduction_3
+happyReduction_3 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut7 happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CTranslUnit (reverse happy_var_1))}
+	) (\r -> happyReturn (happyIn6 r))
+
+happyReduce_4 = happySpecReduce_0  1# happyReduction_4
+happyReduction_4  =  happyIn7
+		 (empty
+	)
+
+happyReduce_5 = happySpecReduce_2  1# happyReduction_5
+happyReduction_5 happy_x_2
+	happy_x_1
+	 =  case happyOut7 happy_x_1 of { happy_var_1 -> 
+	happyIn7
+		 (happy_var_1
+	)}
+
+happyReduce_6 = happySpecReduce_2  1# happyReduction_6
+happyReduction_6 happy_x_2
+	happy_x_1
+	 =  case happyOut7 happy_x_1 of { happy_var_1 -> 
+	case happyOut8 happy_x_2 of { happy_var_2 -> 
+	happyIn7
+		 (happy_var_1 `snoc` happy_var_2
+	)}}
+
+happyReduce_7 = happySpecReduce_1  2# happyReduction_7
+happyReduction_7 happy_x_1
+	 =  case happyOut9 happy_x_1 of { happy_var_1 -> 
+	happyIn8
+		 (CFDefExt happy_var_1
+	)}
+
+happyReduce_8 = happySpecReduce_1  2# happyReduction_8
+happyReduction_8 happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	happyIn8
+		 (CDeclExt happy_var_1
+	)}
+
+happyReduce_9 = happySpecReduce_2  2# happyReduction_9
+happyReduction_9 happy_x_2
+	happy_x_1
+	 =  case happyOut8 happy_x_2 of { happy_var_2 -> 
+	happyIn8
+		 (happy_var_2
+	)}
+
+happyReduce_10 = happyReduce 5# 2# happyReduction_10
+happyReduction_10 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut122 happy_x_3 of { happy_var_3 -> 
+	happyIn8
+		 (CAsmExt happy_var_3
+	) `HappyStk` happyRest}
+
+happyReduce_11 = happyMonadReduce 2# 3# happyReduction_11
+happyReduction_11 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut10 happy_x_1 of { happy_var_1 -> 
+	case happyOut13 happy_x_2 of { happy_var_2 -> 
+	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef [] happy_var_1 [] happy_var_2))}}
+	) (\r -> happyReturn (happyIn9 r))
+
+happyReduce_12 = happyMonadReduce 3# 3# happyReduction_12
+happyReduction_12 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut126 happy_x_1 of { happy_var_1 -> 
+	case happyOut10 happy_x_2 of { happy_var_2 -> 
+	case happyOut13 happy_x_3 of { happy_var_3 -> 
+	( leaveScope >> (withNodeInfo happy_var_2 $ CFunDef (liftCAttrs happy_var_1) happy_var_2 [] happy_var_3))}}}
+	) (\r -> happyReturn (happyIn9 r))
+
+happyReduce_13 = happyMonadReduce 3# 3# happyReduction_13
+happyReduction_13 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut36 happy_x_1 of { happy_var_1 -> 
+	case happyOut10 happy_x_2 of { happy_var_2 -> 
+	case happyOut13 happy_x_3 of { happy_var_3 -> 
+	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}
+	) (\r -> happyReturn (happyIn9 r))
+
+happyReduce_14 = happyMonadReduce 3# 3# happyReduction_14
+happyReduction_14 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> 
+	case happyOut10 happy_x_2 of { happy_var_2 -> 
+	case happyOut13 happy_x_3 of { happy_var_3 -> 
+	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}
+	) (\r -> happyReturn (happyIn9 r))
+
+happyReduce_15 = happyMonadReduce 3# 3# happyReduction_15
+happyReduction_15 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOut10 happy_x_2 of { happy_var_2 -> 
+	case happyOut13 happy_x_3 of { happy_var_3 -> 
+	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (reverse happy_var_1) happy_var_2 [] happy_var_3))}}}
+	) (\r -> happyReturn (happyIn9 r))
+
+happyReduce_16 = happyMonadReduce 3# 3# happyReduction_16
+happyReduction_16 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut10 happy_x_2 of { happy_var_2 -> 
+	case happyOut13 happy_x_3 of { happy_var_3 -> 
+	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1) happy_var_2 [] happy_var_3))}}}
+	) (\r -> happyReturn (happyIn9 r))
+
+happyReduce_17 = happyMonadReduce 4# 3# happyReduction_17
+happyReduction_17 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut10 happy_x_3 of { happy_var_3 -> 
+	case happyOut13 happy_x_4 of { happy_var_4 -> 
+	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) happy_var_3 [] happy_var_4))}}}}
+	) (\r -> happyReturn (happyIn9 r))
+
+happyReduce_18 = happyMonadReduce 3# 3# happyReduction_18
+happyReduction_18 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut75 happy_x_1 of { happy_var_1 -> 
+	case happyOut32 happy_x_2 of { happy_var_2 -> 
+	case happyOut13 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ CFunDef [] happy_var_1 (reverse happy_var_2) happy_var_3)}}}
+	) (\r -> happyReturn (happyIn9 r))
+
+happyReduce_19 = happyMonadReduce 4# 3# happyReduction_19
+happyReduction_19 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut126 happy_x_1 of { happy_var_1 -> 
+	case happyOut75 happy_x_2 of { happy_var_2 -> 
+	case happyOut32 happy_x_3 of { happy_var_3 -> 
+	case happyOut13 happy_x_4 of { happy_var_4 -> 
+	( withNodeInfo happy_var_2 $ CFunDef (liftCAttrs happy_var_1) happy_var_2 (reverse happy_var_3) happy_var_4)}}}}
+	) (\r -> happyReturn (happyIn9 r))
+
+happyReduce_20 = happyMonadReduce 4# 3# happyReduction_20
+happyReduction_20 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut36 happy_x_1 of { happy_var_1 -> 
+	case happyOut75 happy_x_2 of { happy_var_2 -> 
+	case happyOut32 happy_x_3 of { happy_var_3 -> 
+	case happyOut13 happy_x_4 of { happy_var_4 -> 
+	( withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 (reverse happy_var_3) happy_var_4)}}}}
+	) (\r -> happyReturn (happyIn9 r))
+
+happyReduce_21 = happyMonadReduce 4# 3# happyReduction_21
+happyReduction_21 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> 
+	case happyOut75 happy_x_2 of { happy_var_2 -> 
+	case happyOut32 happy_x_3 of { happy_var_3 -> 
+	case happyOut13 happy_x_4 of { happy_var_4 -> 
+	( withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 (reverse happy_var_3) happy_var_4)}}}}
+	) (\r -> happyReturn (happyIn9 r))
+
+happyReduce_22 = happyMonadReduce 4# 3# happyReduction_22
+happyReduction_22 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOut75 happy_x_2 of { happy_var_2 -> 
+	case happyOut32 happy_x_3 of { happy_var_3 -> 
+	case happyOut13 happy_x_4 of { happy_var_4 -> 
+	( withNodeInfo happy_var_1 $ CFunDef (reverse happy_var_1) happy_var_2 (reverse happy_var_3) happy_var_4)}}}}
+	) (\r -> happyReturn (happyIn9 r))
+
+happyReduce_23 = happyMonadReduce 4# 3# happyReduction_23
+happyReduction_23 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut75 happy_x_2 of { happy_var_2 -> 
+	case happyOut32 happy_x_3 of { happy_var_3 -> 
+	case happyOut13 happy_x_4 of { happy_var_4 -> 
+	( withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1) happy_var_2 (reverse happy_var_3) happy_var_4)}}}}
+	) (\r -> happyReturn (happyIn9 r))
+
+happyReduce_24 = happyMonadReduce 5# 3# happyReduction_24
+happyReduction_24 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut75 happy_x_3 of { happy_var_3 -> 
+	case happyOut32 happy_x_4 of { happy_var_4 -> 
+	case happyOut13 happy_x_5 of { happy_var_5 -> 
+	( withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1  ++ liftCAttrs happy_var_2) happy_var_3 (reverse happy_var_4) happy_var_5)}}}}}
+	) (\r -> happyReturn (happyIn9 r))
+
+happyReduce_25 = happyMonadReduce 1# 4# happyReduction_25
+happyReduction_25 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut71 happy_x_1 of { happy_var_1 -> 
+	( let declr = reverseDeclr happy_var_1 in
+  	   enterScope >> doFuncParamDeclIdent declr >> return declr)}
+	) (\r -> happyReturn (happyIn10 r))
+
+happyReduce_26 = happySpecReduce_1  5# happyReduction_26
+happyReduction_26 happy_x_1
+	 =  case happyOut12 happy_x_1 of { happy_var_1 -> 
+	happyIn11
+		 (happy_var_1
+	)}
+
+happyReduce_27 = happySpecReduce_1  5# happyReduction_27
+happyReduction_27 happy_x_1
+	 =  case happyOut13 happy_x_1 of { happy_var_1 -> 
+	happyIn11
+		 (happy_var_1
+	)}
+
+happyReduce_28 = happySpecReduce_1  5# happyReduction_28
+happyReduction_28 happy_x_1
+	 =  case happyOut21 happy_x_1 of { happy_var_1 -> 
+	happyIn11
+		 (happy_var_1
+	)}
+
+happyReduce_29 = happySpecReduce_1  5# happyReduction_29
+happyReduction_29 happy_x_1
+	 =  case happyOut22 happy_x_1 of { happy_var_1 -> 
+	happyIn11
+		 (happy_var_1
+	)}
+
+happyReduce_30 = happySpecReduce_1  5# happyReduction_30
+happyReduction_30 happy_x_1
+	 =  case happyOut23 happy_x_1 of { happy_var_1 -> 
+	happyIn11
+		 (happy_var_1
+	)}
+
+happyReduce_31 = happySpecReduce_1  5# happyReduction_31
+happyReduction_31 happy_x_1
+	 =  case happyOut24 happy_x_1 of { happy_var_1 -> 
+	happyIn11
+		 (happy_var_1
+	)}
+
+happyReduce_32 = happyMonadReduce 1# 5# happyReduction_32
+happyReduction_32 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut25 happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 (CAsm happy_var_1))}
+	) (\r -> happyReturn (happyIn11 r))
+
+happyReduce_33 = happyMonadReduce 4# 6# happyReduction_33
+happyReduction_33 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut124 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut125 happy_x_3 of { happy_var_3 -> 
+	case happyOut11 happy_x_4 of { happy_var_4 -> 
+	( withNodeInfo happy_var_2 $ CLabel happy_var_1 happy_var_4 happy_var_3)}}}}
+	) (\r -> happyReturn (happyIn12 r))
+
+happyReduce_34 = happyMonadReduce 4# 6# happyReduction_34
+happyReduction_34 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut120 happy_x_2 of { happy_var_2 -> 
+	case happyOut11 happy_x_4 of { happy_var_4 -> 
+	( withNodeInfo happy_var_1 $ CCase happy_var_2 happy_var_4)}}}
+	) (\r -> happyReturn (happyIn12 r))
+
+happyReduce_35 = happyMonadReduce 3# 6# happyReduction_35
+happyReduction_35 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut11 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ CDefault happy_var_3)}}
+	) (\r -> happyReturn (happyIn12 r))
+
+happyReduce_36 = happyMonadReduce 6# 6# happyReduction_36
+happyReduction_36 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut120 happy_x_2 of { happy_var_2 -> 
+	case happyOut120 happy_x_4 of { happy_var_4 -> 
+	case happyOut11 happy_x_6 of { happy_var_6 -> 
+	( withNodeInfo happy_var_1 $ CCases happy_var_2 happy_var_4 happy_var_6)}}}}
+	) (\r -> happyReturn (happyIn12 r))
+
+happyReduce_37 = happyMonadReduce 5# 7# happyReduction_37
+happyReduction_37 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut16 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ CCompound [] (reverse happy_var_3))}}
+	) (\r -> happyReturn (happyIn13 r))
+
+happyReduce_38 = happyMonadReduce 6# 7# happyReduction_38
+happyReduction_38 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut20 happy_x_3 of { happy_var_3 -> 
+	case happyOut16 happy_x_4 of { happy_var_4 -> 
+	( withNodeInfo happy_var_1 $ CCompound (reverse happy_var_3) (reverse happy_var_4))}}}
+	) (\r -> happyReturn (happyIn13 r))
+
+happyReduce_39 = happyMonadReduce 0# 8# happyReduction_39
+happyReduction_39 (happyRest) tk
+	 = happyThen (( enterScope)
+	) (\r -> happyReturn (happyIn14 r))
+
+happyReduce_40 = happyMonadReduce 0# 9# happyReduction_40
+happyReduction_40 (happyRest) tk
+	 = happyThen (( leaveScope)
+	) (\r -> happyReturn (happyIn15 r))
+
+happyReduce_41 = happySpecReduce_0  10# happyReduction_41
+happyReduction_41  =  happyIn16
+		 (empty
+	)
+
+happyReduce_42 = happySpecReduce_2  10# happyReduction_42
+happyReduction_42 happy_x_2
+	happy_x_1
+	 =  case happyOut16 happy_x_1 of { happy_var_1 -> 
+	case happyOut17 happy_x_2 of { happy_var_2 -> 
+	happyIn16
+		 (happy_var_1 `snoc` happy_var_2
+	)}}
+
+happyReduce_43 = happySpecReduce_1  11# happyReduction_43
+happyReduction_43 happy_x_1
+	 =  case happyOut11 happy_x_1 of { happy_var_1 -> 
+	happyIn17
+		 (CBlockStmt happy_var_1
+	)}
+
+happyReduce_44 = happySpecReduce_1  11# happyReduction_44
+happyReduction_44 happy_x_1
+	 =  case happyOut18 happy_x_1 of { happy_var_1 -> 
+	happyIn17
+		 (happy_var_1
+	)}
+
+happyReduce_45 = happySpecReduce_1  12# happyReduction_45
+happyReduction_45 happy_x_1
+	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
+	happyIn18
+		 (CBlockDecl happy_var_1
+	)}
+
+happyReduce_46 = happySpecReduce_1  12# happyReduction_46
+happyReduction_46 happy_x_1
+	 =  case happyOut19 happy_x_1 of { happy_var_1 -> 
+	happyIn18
+		 (CNestedFunDef happy_var_1
+	)}
+
+happyReduce_47 = happySpecReduce_2  12# happyReduction_47
+happyReduction_47 happy_x_2
+	happy_x_1
+	 =  case happyOut18 happy_x_2 of { happy_var_2 -> 
+	happyIn18
+		 (happy_var_2
+	)}
+
+happyReduce_48 = happyMonadReduce 3# 13# happyReduction_48
+happyReduction_48 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut36 happy_x_1 of { happy_var_1 -> 
+	case happyOut10 happy_x_2 of { happy_var_2 -> 
+	case happyOut13 happy_x_3 of { happy_var_3 -> 
+	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}
+	) (\r -> happyReturn (happyIn19 r))
+
+happyReduce_49 = happyMonadReduce 3# 13# happyReduction_49
+happyReduction_49 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> 
+	case happyOut10 happy_x_2 of { happy_var_2 -> 
+	case happyOut13 happy_x_3 of { happy_var_3 -> 
+	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}
+	) (\r -> happyReturn (happyIn19 r))
+
+happyReduce_50 = happyMonadReduce 3# 13# happyReduction_50
+happyReduction_50 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOut10 happy_x_2 of { happy_var_2 -> 
+	case happyOut13 happy_x_3 of { happy_var_3 -> 
+	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (reverse happy_var_1) happy_var_2 [] happy_var_3))}}}
+	) (\r -> happyReturn (happyIn19 r))
+
+happyReduce_51 = happyMonadReduce 3# 13# happyReduction_51
+happyReduction_51 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut10 happy_x_2 of { happy_var_2 -> 
+	case happyOut13 happy_x_3 of { happy_var_3 -> 
+	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1) happy_var_2 [] happy_var_3))}}}
+	) (\r -> happyReturn (happyIn19 r))
+
+happyReduce_52 = happyMonadReduce 4# 13# happyReduction_52
+happyReduction_52 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut10 happy_x_3 of { happy_var_3 -> 
+	case happyOut13 happy_x_4 of { happy_var_4 -> 
+	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) happy_var_3 [] happy_var_4))}}}}
+	) (\r -> happyReturn (happyIn19 r))
+
+happyReduce_53 = happySpecReduce_3  14# happyReduction_53
+happyReduction_53 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut81 happy_x_2 of { happy_var_2 -> 
+	happyIn20
+		 (happy_var_2
+	)}
+
+happyReduce_54 = happyReduce 4# 14# happyReduction_54
+happyReduction_54 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut20 happy_x_1 of { happy_var_1 -> 
+	case happyOut81 happy_x_3 of { happy_var_3 -> 
+	happyIn20
+		 (happy_var_1 `rappendr` happy_var_3
+	) `HappyStk` happyRest}}
+
+happyReduce_55 = happyMonadReduce 1# 15# happyReduction_55
+happyReduction_55 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CExpr Nothing)}
+	) (\r -> happyReturn (happyIn21 r))
+
+happyReduce_56 = happyMonadReduce 2# 15# happyReduction_56
+happyReduction_56 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut116 happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CExpr (Just happy_var_1))}
+	) (\r -> happyReturn (happyIn21 r))
+
+happyReduce_57 = happyMonadReduce 5# 16# happyReduction_57
+happyReduction_57 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut116 happy_x_3 of { happy_var_3 -> 
+	case happyOut11 happy_x_5 of { happy_var_5 -> 
+	( withNodeInfo happy_var_1 $ CIf happy_var_3 happy_var_5 Nothing)}}}
+	) (\r -> happyReturn (happyIn22 r))
+
+happyReduce_58 = happyMonadReduce 7# 16# happyReduction_58
+happyReduction_58 (happy_x_7 `HappyStk`
+	happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut116 happy_x_3 of { happy_var_3 -> 
+	case happyOut11 happy_x_5 of { happy_var_5 -> 
+	case happyOut11 happy_x_7 of { happy_var_7 -> 
+	( withNodeInfo happy_var_1 $ CIf happy_var_3 happy_var_5 (Just happy_var_7))}}}}
+	) (\r -> happyReturn (happyIn22 r))
+
+happyReduce_59 = happyMonadReduce 5# 16# happyReduction_59
+happyReduction_59 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut116 happy_x_3 of { happy_var_3 -> 
+	case happyOut11 happy_x_5 of { happy_var_5 -> 
+	( withNodeInfo happy_var_1 $ CSwitch happy_var_3 happy_var_5)}}}
+	) (\r -> happyReturn (happyIn22 r))
+
+happyReduce_60 = happyMonadReduce 5# 17# happyReduction_60
+happyReduction_60 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut116 happy_x_3 of { happy_var_3 -> 
+	case happyOut11 happy_x_5 of { happy_var_5 -> 
+	( withNodeInfo happy_var_1 $ CWhile happy_var_3 happy_var_5 False)}}}
+	) (\r -> happyReturn (happyIn23 r))
+
+happyReduce_61 = happyMonadReduce 7# 17# happyReduction_61
+happyReduction_61 (happy_x_7 `HappyStk`
+	happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut11 happy_x_2 of { happy_var_2 -> 
+	case happyOut116 happy_x_5 of { happy_var_5 -> 
+	( withNodeInfo happy_var_1 $ CWhile happy_var_5 happy_var_2 True)}}}
+	) (\r -> happyReturn (happyIn23 r))
+
+happyReduce_62 = happyMonadReduce 9# 17# happyReduction_62
+happyReduction_62 (happy_x_9 `HappyStk`
+	happy_x_8 `HappyStk`
+	happy_x_7 `HappyStk`
+	happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut118 happy_x_3 of { happy_var_3 -> 
+	case happyOut118 happy_x_5 of { happy_var_5 -> 
+	case happyOut118 happy_x_7 of { happy_var_7 -> 
+	case happyOut11 happy_x_9 of { happy_var_9 -> 
+	( withNodeInfo happy_var_1 $ CFor (Left happy_var_3) happy_var_5 happy_var_7 happy_var_9)}}}}}
+	) (\r -> happyReturn (happyIn23 r))
+
+happyReduce_63 = happyMonadReduce 10# 17# happyReduction_63
+happyReduction_63 (happy_x_10 `HappyStk`
+	happy_x_9 `HappyStk`
+	happy_x_8 `HappyStk`
+	happy_x_7 `HappyStk`
+	happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_4 of { happy_var_4 -> 
+	case happyOut118 happy_x_5 of { happy_var_5 -> 
+	case happyOut118 happy_x_7 of { happy_var_7 -> 
+	case happyOut11 happy_x_9 of { happy_var_9 -> 
+	( withNodeInfo happy_var_1 $ CFor (Right happy_var_4) happy_var_5 happy_var_7 happy_var_9)}}}}}
+	) (\r -> happyReturn (happyIn23 r))
+
+happyReduce_64 = happyMonadReduce 3# 18# happyReduction_64
+happyReduction_64 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut124 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ CGoto happy_var_2)}}
+	) (\r -> happyReturn (happyIn24 r))
+
+happyReduce_65 = happyMonadReduce 4# 18# happyReduction_65
+happyReduction_65 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut116 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ CGotoPtr happy_var_3)}}
+	) (\r -> happyReturn (happyIn24 r))
+
+happyReduce_66 = happyMonadReduce 2# 18# happyReduction_66
+happyReduction_66 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CCont)}
+	) (\r -> happyReturn (happyIn24 r))
+
+happyReduce_67 = happyMonadReduce 2# 18# happyReduction_67
+happyReduction_67 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CBreak)}
+	) (\r -> happyReturn (happyIn24 r))
+
+happyReduce_68 = happyMonadReduce 3# 18# happyReduction_68
+happyReduction_68 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut118 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ CReturn happy_var_2)}}
+	) (\r -> happyReturn (happyIn24 r))
+
+happyReduce_69 = happyMonadReduce 6# 19# happyReduction_69
+happyReduction_69 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut26 happy_x_2 of { happy_var_2 -> 
+	case happyOut122 happy_x_4 of { happy_var_4 -> 
+	( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 [] [] [])}}}
+	) (\r -> happyReturn (happyIn25 r))
+
+happyReduce_70 = happyMonadReduce 8# 19# happyReduction_70
+happyReduction_70 (happy_x_8 `HappyStk`
+	happy_x_7 `HappyStk`
+	happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut26 happy_x_2 of { happy_var_2 -> 
+	case happyOut122 happy_x_4 of { happy_var_4 -> 
+	case happyOut27 happy_x_6 of { happy_var_6 -> 
+	( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 happy_var_6 [] [])}}}}
+	) (\r -> happyReturn (happyIn25 r))
+
+happyReduce_71 = happyMonadReduce 10# 19# happyReduction_71
+happyReduction_71 (happy_x_10 `HappyStk`
+	happy_x_9 `HappyStk`
+	happy_x_8 `HappyStk`
+	happy_x_7 `HappyStk`
+	happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut26 happy_x_2 of { happy_var_2 -> 
+	case happyOut122 happy_x_4 of { happy_var_4 -> 
+	case happyOut27 happy_x_6 of { happy_var_6 -> 
+	case happyOut27 happy_x_8 of { happy_var_8 -> 
+	( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 happy_var_6 happy_var_8 [])}}}}}
+	) (\r -> happyReturn (happyIn25 r))
+
+happyReduce_72 = happyMonadReduce 12# 19# happyReduction_72
+happyReduction_72 (happy_x_12 `HappyStk`
+	happy_x_11 `HappyStk`
+	happy_x_10 `HappyStk`
+	happy_x_9 `HappyStk`
+	happy_x_8 `HappyStk`
+	happy_x_7 `HappyStk`
+	happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut26 happy_x_2 of { happy_var_2 -> 
+	case happyOut122 happy_x_4 of { happy_var_4 -> 
+	case happyOut27 happy_x_6 of { happy_var_6 -> 
+	case happyOut27 happy_x_8 of { happy_var_8 -> 
+	case happyOut30 happy_x_10 of { happy_var_10 -> 
+	( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 happy_var_6 happy_var_8 (reverse happy_var_10))}}}}}}
+	) (\r -> happyReturn (happyIn25 r))
+
+happyReduce_73 = happySpecReduce_0  20# happyReduction_73
+happyReduction_73  =  happyIn26
+		 (Nothing
+	)
+
+happyReduce_74 = happySpecReduce_1  20# happyReduction_74
+happyReduction_74 happy_x_1
+	 =  case happyOut60 happy_x_1 of { happy_var_1 -> 
+	happyIn26
+		 (Just happy_var_1
+	)}
+
+happyReduce_75 = happySpecReduce_0  21# happyReduction_75
+happyReduction_75  =  happyIn27
+		 ([]
+	)
+
+happyReduce_76 = happySpecReduce_1  21# happyReduction_76
+happyReduction_76 happy_x_1
+	 =  case happyOut28 happy_x_1 of { happy_var_1 -> 
+	happyIn27
+		 (reverse happy_var_1
+	)}
+
+happyReduce_77 = happySpecReduce_1  22# happyReduction_77
+happyReduction_77 happy_x_1
+	 =  case happyOut29 happy_x_1 of { happy_var_1 -> 
+	happyIn28
+		 (singleton happy_var_1
+	)}
+
+happyReduce_78 = happySpecReduce_3  22# happyReduction_78
+happyReduction_78 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut28 happy_x_1 of { happy_var_1 -> 
+	case happyOut29 happy_x_3 of { happy_var_3 -> 
+	happyIn28
+		 (happy_var_1 `snoc` happy_var_3
+	)}}
+
+happyReduce_79 = happyMonadReduce 4# 23# happyReduction_79
+happyReduction_79 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut122 happy_x_1 of { happy_var_1 -> 
+	case happyOut116 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ CAsmOperand Nothing happy_var_1 happy_var_3)}}
+	) (\r -> happyReturn (happyIn29 r))
+
+happyReduce_80 = happyMonadReduce 7# 23# happyReduction_80
+happyReduction_80 (happy_x_7 `HappyStk`
+	happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_2 of { (CTokIdent  _ happy_var_2) -> 
+	case happyOut122 happy_x_4 of { happy_var_4 -> 
+	case happyOut116 happy_x_6 of { happy_var_6 -> 
+	( withNodeInfo happy_var_4 $ CAsmOperand (Just happy_var_2) happy_var_4 happy_var_6)}}}
+	) (\r -> happyReturn (happyIn29 r))
+
+happyReduce_81 = happyMonadReduce 7# 23# happyReduction_81
+happyReduction_81 (happy_x_7 `HappyStk`
+	happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> 
+	case happyOut122 happy_x_4 of { happy_var_4 -> 
+	case happyOut116 happy_x_6 of { happy_var_6 -> 
+	( withNodeInfo happy_var_4 $ CAsmOperand (Just happy_var_2) happy_var_4 happy_var_6)}}}
+	) (\r -> happyReturn (happyIn29 r))
+
+happyReduce_82 = happySpecReduce_1  24# happyReduction_82
+happyReduction_82 happy_x_1
+	 =  case happyOut122 happy_x_1 of { happy_var_1 -> 
+	happyIn30
+		 (singleton happy_var_1
+	)}
+
+happyReduce_83 = happySpecReduce_3  24# happyReduction_83
+happyReduction_83 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut30 happy_x_1 of { happy_var_1 -> 
+	case happyOut122 happy_x_3 of { happy_var_3 -> 
+	happyIn30
+		 (happy_var_1 `snoc` happy_var_3
+	)}}
+
+happyReduce_84 = happyMonadReduce 2# 25# happyReduction_84
+happyReduction_84 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [])}
+	) (\r -> happyReturn (happyIn31 r))
+
+happyReduce_85 = happyMonadReduce 2# 25# happyReduction_85
+happyReduction_85 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut45 happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [])}
+	) (\r -> happyReturn (happyIn31 r))
+
+happyReduce_86 = happySpecReduce_2  25# happyReduction_86
+happyReduction_86 happy_x_2
+	happy_x_1
+	 =  case happyOut35 happy_x_1 of { happy_var_1 -> 
+	happyIn31
+		 (case happy_var_1 of
+            CDecl declspecs dies at ->
+              CDecl declspecs (List.reverse dies) at
+	)}
+
+happyReduce_87 = happySpecReduce_2  25# happyReduction_87
+happyReduction_87 happy_x_2
+	happy_x_1
+	 =  case happyOut33 happy_x_1 of { happy_var_1 -> 
+	happyIn31
+		 (case happy_var_1 of
+            CDecl declspecs dies at ->
+              CDecl declspecs (List.reverse dies) at
+	)}
+
+happyReduce_88 = happySpecReduce_0  26# happyReduction_88
+happyReduction_88  =  happyIn32
+		 (empty
+	)
+
+happyReduce_89 = happySpecReduce_2  26# happyReduction_89
+happyReduction_89 happy_x_2
+	happy_x_1
+	 =  case happyOut32 happy_x_1 of { happy_var_1 -> 
+	case happyOut31 happy_x_2 of { happy_var_2 -> 
+	happyIn32
+		 (happy_var_1 `snoc` happy_var_2
+	)}}
+
+happyReduce_90 = happyMonadReduce 4# 27# happyReduction_90
+happyReduction_90 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOut71 happy_x_2 of { happy_var_2 -> 
+	case happyOut34 happy_x_3 of { happy_var_3 -> 
+	case happyOut90 happy_x_4 of { happy_var_4 -> 
+	( let declspecs = reverse happy_var_1 in
+  	   do{ declr <- withAsmNameAttrs happy_var_3 happy_var_2
+           ; doDeclIdent declspecs declr
+           ; withNodeInfo happy_var_1 $ CDecl declspecs [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}
+	) (\r -> happyReturn (happyIn33 r))
+
+happyReduce_91 = happyMonadReduce 4# 27# happyReduction_91
+happyReduction_91 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut71 happy_x_2 of { happy_var_2 -> 
+	case happyOut34 happy_x_3 of { happy_var_3 -> 
+	case happyOut90 happy_x_4 of { happy_var_4 -> 
+	( let declspecs = liftTypeQuals happy_var_1 in
+  	   do{ declr <- withAsmNameAttrs happy_var_3 happy_var_2
+           ; doDeclIdent declspecs declr
+           ; withNodeInfo happy_var_1 $ CDecl declspecs [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}
+	) (\r -> happyReturn (happyIn33 r))
+
+happyReduce_92 = happyMonadReduce 5# 27# happyReduction_92
+happyReduction_92 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut71 happy_x_3 of { happy_var_3 -> 
+	case happyOut34 happy_x_4 of { happy_var_4 -> 
+	case happyOut90 happy_x_5 of { happy_var_5 -> 
+	( let declspecs = liftTypeQuals happy_var_1 in
+  	   do{ declr <- withAsmNameAttrs happy_var_4 happy_var_3
+           ; doDeclIdent declspecs declr
+           ; withNodeInfo happy_var_1 $ CDecl (declspecs ++ liftCAttrs happy_var_2) [(Just (reverseDeclr declr), happy_var_5, Nothing)] })}}}}}
+	) (\r -> happyReturn (happyIn33 r))
+
+happyReduce_93 = happyMonadReduce 4# 27# happyReduction_93
+happyReduction_93 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut126 happy_x_1 of { happy_var_1 -> 
+	case happyOut71 happy_x_2 of { happy_var_2 -> 
+	case happyOut34 happy_x_3 of { happy_var_3 -> 
+	case happyOut90 happy_x_4 of { happy_var_4 -> 
+	( let declspecs = liftCAttrs happy_var_1 in
+       do{ declr <- withAsmNameAttrs happy_var_3 happy_var_2
+           ; doDeclIdent declspecs declr
+           ; withNodeInfo happy_var_1 $ CDecl declspecs [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}
+	) (\r -> happyReturn (happyIn33 r))
+
+happyReduce_94 = happyMonadReduce 6# 27# happyReduction_94
+happyReduction_94 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut33 happy_x_1 of { happy_var_1 -> 
+	case happyOut125 happy_x_3 of { happy_var_3 -> 
+	case happyOut71 happy_x_4 of { happy_var_4 -> 
+	case happyOut34 happy_x_5 of { happy_var_5 -> 
+	case happyOut90 happy_x_6 of { happy_var_6 -> 
+	( case happy_var_1 of
+             CDecl declspecs dies at -> do
+               declr <- withAsmNameAttrs (fst happy_var_5, snd happy_var_5 ++ happy_var_3) happy_var_4
+               doDeclIdent declspecs declr
+               return (CDecl declspecs ((Just (reverseDeclr declr), happy_var_6, Nothing) : dies) at))}}}}}
+	) (\r -> happyReturn (happyIn33 r))
+
+happyReduce_95 = happySpecReduce_2  28# happyReduction_95
+happyReduction_95 happy_x_2
+	happy_x_1
+	 =  case happyOut63 happy_x_1 of { happy_var_1 -> 
+	case happyOut125 happy_x_2 of { happy_var_2 -> 
+	happyIn34
+		 ((happy_var_1,happy_var_2)
+	)}}
+
+happyReduce_96 = happyMonadReduce 4# 29# happyReduction_96
+happyReduction_96 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut36 happy_x_1 of { happy_var_1 -> 
+	case happyOut62 happy_x_2 of { happy_var_2 -> 
+	case happyOut34 happy_x_3 of { happy_var_3 -> 
+	case happyOut90 happy_x_4 of { happy_var_4 -> 
+	( do{
+  	   declr <- withAsmNameAttrs happy_var_3 happy_var_2;
+  	   doDeclIdent happy_var_1 declr;
+       withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}
+	) (\r -> happyReturn (happyIn35 r))
+
+happyReduce_97 = happyMonadReduce 4# 29# happyReduction_97
+happyReduction_97 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> 
+	case happyOut62 happy_x_2 of { happy_var_2 -> 
+	case happyOut34 happy_x_3 of { happy_var_3 -> 
+	case happyOut90 happy_x_4 of { happy_var_4 -> 
+	( do{
+  	   declr <- withAsmNameAttrs happy_var_3 happy_var_2;
+  	   doDeclIdent happy_var_1 declr;
+       withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}
+	) (\r -> happyReturn (happyIn35 r))
+
+happyReduce_98 = happyMonadReduce 6# 29# happyReduction_98
+happyReduction_98 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut35 happy_x_1 of { happy_var_1 -> 
+	case happyOut125 happy_x_3 of { happy_var_3 -> 
+	case happyOut62 happy_x_4 of { happy_var_4 -> 
+	case happyOut34 happy_x_5 of { happy_var_5 -> 
+	case happyOut90 happy_x_6 of { happy_var_6 -> 
+	( case happy_var_1 of
+             CDecl declspecs dies at -> do
+               declr <- withAsmNameAttrs (fst happy_var_5, snd happy_var_5 ++ happy_var_3) happy_var_4
+               doDeclIdent declspecs declr
+               return (CDecl declspecs ((Just (reverseDeclr declr), happy_var_6, Nothing) : dies) at))}}}}}
+	) (\r -> happyReturn (happyIn35 r))
+
+happyReduce_99 = happySpecReduce_1  30# happyReduction_99
+happyReduction_99 happy_x_1
+	 =  case happyOut42 happy_x_1 of { happy_var_1 -> 
+	happyIn36
+		 (reverse happy_var_1
+	)}
+
+happyReduce_100 = happySpecReduce_1  30# happyReduction_100
+happyReduction_100 happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	happyIn36
+		 (reverse happy_var_1
+	)}
+
+happyReduce_101 = happySpecReduce_1  30# happyReduction_101
+happyReduction_101 happy_x_1
+	 =  case happyOut46 happy_x_1 of { happy_var_1 -> 
+	happyIn36
+		 (reverse happy_var_1
+	)}
+
+happyReduce_102 = happySpecReduce_1  31# happyReduction_102
+happyReduction_102 happy_x_1
+	 =  case happyOut39 happy_x_1 of { happy_var_1 -> 
+	happyIn37
+		 (singleton (CStorageSpec happy_var_1)
+	)}
+
+happyReduce_103 = happySpecReduce_2  31# happyReduction_103
+happyReduction_103 happy_x_2
+	happy_x_1
+	 =  case happyOut126 happy_x_1 of { happy_var_1 -> 
+	case happyOut39 happy_x_2 of { happy_var_2 -> 
+	happyIn37
+		 (reverseList (liftCAttrs happy_var_1) `snoc` (CStorageSpec happy_var_2)
+	)}}
+
+happyReduce_104 = happySpecReduce_2  31# happyReduction_104
+happyReduction_104 happy_x_2
+	happy_x_1
+	 =  case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut39 happy_x_2 of { happy_var_2 -> 
+	happyIn37
+		 (rmap CTypeQual happy_var_1 `snoc` CStorageSpec happy_var_2
+	)}}
+
+happyReduce_105 = happySpecReduce_3  31# happyReduction_105
+happyReduction_105 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut39 happy_x_3 of { happy_var_3 -> 
+	happyIn37
+		 ((rmap CTypeQual happy_var_1 `rappend` liftCAttrs happy_var_2) `snoc` CStorageSpec happy_var_3
+	)}}}
+
+happyReduce_106 = happySpecReduce_2  31# happyReduction_106
+happyReduction_106 happy_x_2
+	happy_x_1
+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOut38 happy_x_2 of { happy_var_2 -> 
+	happyIn37
+		 (happy_var_1 `snoc` happy_var_2
+	)}}
+
+happyReduce_107 = happySpecReduce_2  31# happyReduction_107
+happyReduction_107 happy_x_2
+	happy_x_1
+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOut127 happy_x_2 of { happy_var_2 -> 
+	happyIn37
+		 (addTrailingAttrs happy_var_1 happy_var_2
+	)}}
+
+happyReduce_108 = happySpecReduce_1  32# happyReduction_108
+happyReduction_108 happy_x_1
+	 =  case happyOut39 happy_x_1 of { happy_var_1 -> 
+	happyIn38
+		 (CStorageSpec happy_var_1
+	)}
+
+happyReduce_109 = happySpecReduce_1  32# happyReduction_109
+happyReduction_109 happy_x_1
+	 =  case happyOut60 happy_x_1 of { happy_var_1 -> 
+	happyIn38
+		 (CTypeQual happy_var_1
+	)}
+
+happyReduce_110 = happyMonadReduce 1# 33# happyReduction_110
+happyReduction_110 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CTypedef)}
+	) (\r -> happyReturn (happyIn39 r))
+
+happyReduce_111 = happyMonadReduce 1# 33# happyReduction_111
+happyReduction_111 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CExtern)}
+	) (\r -> happyReturn (happyIn39 r))
+
+happyReduce_112 = happyMonadReduce 1# 33# happyReduction_112
+happyReduction_112 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CStatic)}
+	) (\r -> happyReturn (happyIn39 r))
+
+happyReduce_113 = happyMonadReduce 1# 33# happyReduction_113
+happyReduction_113 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CAuto)}
+	) (\r -> happyReturn (happyIn39 r))
+
+happyReduce_114 = happyMonadReduce 1# 33# happyReduction_114
+happyReduction_114 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CRegister)}
+	) (\r -> happyReturn (happyIn39 r))
+
+happyReduce_115 = happyMonadReduce 1# 33# happyReduction_115
+happyReduction_115 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CThread)}
+	) (\r -> happyReturn (happyIn39 r))
+
+happyReduce_116 = happySpecReduce_1  34# happyReduction_116
+happyReduction_116 happy_x_1
+	 =  case happyOut43 happy_x_1 of { happy_var_1 -> 
+	happyIn40
+		 (reverse happy_var_1
+	)}
+
+happyReduce_117 = happySpecReduce_1  34# happyReduction_117
+happyReduction_117 happy_x_1
+	 =  case happyOut45 happy_x_1 of { happy_var_1 -> 
+	happyIn40
+		 (reverse happy_var_1
+	)}
+
+happyReduce_118 = happySpecReduce_1  34# happyReduction_118
+happyReduction_118 happy_x_1
+	 =  case happyOut47 happy_x_1 of { happy_var_1 -> 
+	happyIn40
+		 (reverse happy_var_1
+	)}
+
+happyReduce_119 = happyMonadReduce 1# 35# happyReduction_119
+happyReduction_119 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CVoidType)}
+	) (\r -> happyReturn (happyIn41 r))
+
+happyReduce_120 = happyMonadReduce 1# 35# happyReduction_120
+happyReduction_120 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CCharType)}
+	) (\r -> happyReturn (happyIn41 r))
+
+happyReduce_121 = happyMonadReduce 1# 35# happyReduction_121
+happyReduction_121 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CShortType)}
+	) (\r -> happyReturn (happyIn41 r))
+
+happyReduce_122 = happyMonadReduce 1# 35# happyReduction_122
+happyReduction_122 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CIntType)}
+	) (\r -> happyReturn (happyIn41 r))
+
+happyReduce_123 = happyMonadReduce 1# 35# happyReduction_123
+happyReduction_123 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CLongType)}
+	) (\r -> happyReturn (happyIn41 r))
+
+happyReduce_124 = happyMonadReduce 1# 35# happyReduction_124
+happyReduction_124 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CFloatType)}
+	) (\r -> happyReturn (happyIn41 r))
+
+happyReduce_125 = happyMonadReduce 1# 35# happyReduction_125
+happyReduction_125 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CDoubleType)}
+	) (\r -> happyReturn (happyIn41 r))
+
+happyReduce_126 = happyMonadReduce 1# 35# happyReduction_126
+happyReduction_126 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CSignedType)}
+	) (\r -> happyReturn (happyIn41 r))
+
+happyReduce_127 = happyMonadReduce 1# 35# happyReduction_127
+happyReduction_127 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CUnsigType)}
+	) (\r -> happyReturn (happyIn41 r))
+
+happyReduce_128 = happyMonadReduce 1# 35# happyReduction_128
+happyReduction_128 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CBoolType)}
+	) (\r -> happyReturn (happyIn41 r))
+
+happyReduce_129 = happyMonadReduce 1# 35# happyReduction_129
+happyReduction_129 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CComplexType)}
+	) (\r -> happyReturn (happyIn41 r))
+
+happyReduce_130 = happySpecReduce_2  36# happyReduction_130
+happyReduction_130 happy_x_2
+	happy_x_1
+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOut41 happy_x_2 of { happy_var_2 -> 
+	happyIn42
+		 (happy_var_1 `snoc` CTypeSpec happy_var_2
+	)}}
+
+happyReduce_131 = happySpecReduce_2  36# happyReduction_131
+happyReduction_131 happy_x_2
+	happy_x_1
+	 =  case happyOut43 happy_x_1 of { happy_var_1 -> 
+	case happyOut39 happy_x_2 of { happy_var_2 -> 
+	happyIn42
+		 (happy_var_1 `snoc` CStorageSpec happy_var_2
+	)}}
+
+happyReduce_132 = happySpecReduce_2  36# happyReduction_132
+happyReduction_132 happy_x_2
+	happy_x_1
+	 =  case happyOut42 happy_x_1 of { happy_var_1 -> 
+	case happyOut38 happy_x_2 of { happy_var_2 -> 
+	happyIn42
+		 (happy_var_1 `snoc` happy_var_2
+	)}}
+
+happyReduce_133 = happySpecReduce_2  36# happyReduction_133
+happyReduction_133 happy_x_2
+	happy_x_1
+	 =  case happyOut42 happy_x_1 of { happy_var_1 -> 
+	case happyOut41 happy_x_2 of { happy_var_2 -> 
+	happyIn42
+		 (happy_var_1 `snoc` CTypeSpec happy_var_2
+	)}}
+
+happyReduce_134 = happySpecReduce_2  36# happyReduction_134
+happyReduction_134 happy_x_2
+	happy_x_1
+	 =  case happyOut42 happy_x_1 of { happy_var_1 -> 
+	case happyOut127 happy_x_2 of { happy_var_2 -> 
+	happyIn42
+		 (addTrailingAttrs happy_var_1 happy_var_2
+	)}}
+
+happyReduce_135 = happySpecReduce_1  37# happyReduction_135
+happyReduction_135 happy_x_1
+	 =  case happyOut41 happy_x_1 of { happy_var_1 -> 
+	happyIn43
+		 (singleton (CTypeSpec happy_var_1)
+	)}
+
+happyReduce_136 = happySpecReduce_2  37# happyReduction_136
+happyReduction_136 happy_x_2
+	happy_x_1
+	 =  case happyOut126 happy_x_1 of { happy_var_1 -> 
+	case happyOut41 happy_x_2 of { happy_var_2 -> 
+	happyIn43
+		 ((reverseList $ liftCAttrs happy_var_1) `snoc` (CTypeSpec happy_var_2)
+	)}}
+
+happyReduce_137 = happySpecReduce_2  37# happyReduction_137
+happyReduction_137 happy_x_2
+	happy_x_1
+	 =  case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut41 happy_x_2 of { happy_var_2 -> 
+	happyIn43
+		 (rmap CTypeQual happy_var_1 `snoc` CTypeSpec happy_var_2
+	)}}
+
+happyReduce_138 = happySpecReduce_3  37# happyReduction_138
+happyReduction_138 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut41 happy_x_3 of { happy_var_3 -> 
+	happyIn43
+		 (rmap CTypeQual happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec happy_var_3
+	)}}}
+
+happyReduce_139 = happySpecReduce_2  37# happyReduction_139
+happyReduction_139 happy_x_2
+	happy_x_1
+	 =  case happyOut43 happy_x_1 of { happy_var_1 -> 
+	case happyOut60 happy_x_2 of { happy_var_2 -> 
+	happyIn43
+		 (happy_var_1 `snoc` CTypeQual happy_var_2
+	)}}
+
+happyReduce_140 = happySpecReduce_2  37# happyReduction_140
+happyReduction_140 happy_x_2
+	happy_x_1
+	 =  case happyOut43 happy_x_1 of { happy_var_1 -> 
+	case happyOut41 happy_x_2 of { happy_var_2 -> 
+	happyIn43
+		 (happy_var_1 `snoc` CTypeSpec happy_var_2
+	)}}
+
+happyReduce_141 = happySpecReduce_2  37# happyReduction_141
+happyReduction_141 happy_x_2
+	happy_x_1
+	 =  case happyOut43 happy_x_1 of { happy_var_1 -> 
+	case happyOut127 happy_x_2 of { happy_var_2 -> 
+	happyIn43
+		 (addTrailingAttrs happy_var_1 happy_var_2
+	)}}
+
+happyReduce_142 = happySpecReduce_2  38# happyReduction_142
+happyReduction_142 happy_x_2
+	happy_x_1
+	 =  case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOut48 happy_x_2 of { happy_var_2 -> 
+	happyIn44
+		 (happy_var_1 `snoc` CTypeSpec happy_var_2
+	)}}
+
+happyReduce_143 = happySpecReduce_2  38# happyReduction_143
+happyReduction_143 happy_x_2
+	happy_x_1
+	 =  case happyOut45 happy_x_1 of { happy_var_1 -> 
+	case happyOut39 happy_x_2 of { happy_var_2 -> 
+	happyIn44
+		 (happy_var_1 `snoc` CStorageSpec happy_var_2
+	)}}
+
+happyReduce_144 = happySpecReduce_2  38# happyReduction_144
+happyReduction_144 happy_x_2
+	happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOut38 happy_x_2 of { happy_var_2 -> 
+	happyIn44
+		 (happy_var_1 `snoc` happy_var_2
+	)}}
+
+happyReduce_145 = happySpecReduce_2  38# happyReduction_145
+happyReduction_145 happy_x_2
+	happy_x_1
+	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
+	case happyOut127 happy_x_2 of { happy_var_2 -> 
+	happyIn44
+		 (addTrailingAttrs happy_var_1 happy_var_2
+	)}}
+
+happyReduce_146 = happySpecReduce_1  39# happyReduction_146
+happyReduction_146 happy_x_1
+	 =  case happyOut48 happy_x_1 of { happy_var_1 -> 
+	happyIn45
+		 (singleton (CTypeSpec happy_var_1)
+	)}
+
+happyReduce_147 = happySpecReduce_2  39# happyReduction_147
+happyReduction_147 happy_x_2
+	happy_x_1
+	 =  case happyOut126 happy_x_1 of { happy_var_1 -> 
+	case happyOut48 happy_x_2 of { happy_var_2 -> 
+	happyIn45
+		 ((reverseList $ liftCAttrs happy_var_1) `snoc` (CTypeSpec happy_var_2)
+	)}}
+
+happyReduce_148 = happySpecReduce_2  39# happyReduction_148
+happyReduction_148 happy_x_2
+	happy_x_1
+	 =  case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut48 happy_x_2 of { happy_var_2 -> 
+	happyIn45
+		 (rmap CTypeQual happy_var_1 `snoc` CTypeSpec happy_var_2
+	)}}
+
+happyReduce_149 = happySpecReduce_3  39# happyReduction_149
+happyReduction_149 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut48 happy_x_3 of { happy_var_3 -> 
+	happyIn45
+		 (rmap CTypeQual  happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec happy_var_3
+	)}}}
+
+happyReduce_150 = happySpecReduce_2  39# happyReduction_150
+happyReduction_150 happy_x_2
+	happy_x_1
+	 =  case happyOut45 happy_x_1 of { happy_var_1 -> 
+	case happyOut60 happy_x_2 of { happy_var_2 -> 
+	happyIn45
+		 (happy_var_1 `snoc` CTypeQual happy_var_2
+	)}}
+
+happyReduce_151 = happySpecReduce_2  39# happyReduction_151
+happyReduction_151 happy_x_2
+	happy_x_1
+	 =  case happyOut45 happy_x_1 of { happy_var_1 -> 
+	case happyOut127 happy_x_2 of { happy_var_2 -> 
+	happyIn45
+		 (addTrailingAttrs happy_var_1 happy_var_2
+	)}}
+
+happyReduce_152 = happySpecReduce_2  40# happyReduction_152
+happyReduction_152 happy_x_2
+	happy_x_1
+	 =  case happyOut47 happy_x_1 of { happy_var_1 -> 
+	case happyOut39 happy_x_2 of { happy_var_2 -> 
+	happyIn46
+		 (happy_var_1 `snoc` CStorageSpec happy_var_2
+	)}}
+
+happyReduce_153 = happyMonadReduce 2# 40# happyReduction_153
+happyReduction_153 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> 
+	( withNodeInfo happy_var_1 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeDef happy_var_2 at))}}
+	) (\r -> happyReturn (happyIn46 r))
+
+happyReduce_154 = happyMonadReduce 5# 40# happyReduction_154
+happyReduction_154 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOut116 happy_x_4 of { happy_var_4 -> 
+	( withNodeInfo happy_var_1 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeOfExpr happy_var_4 at))}}
+	) (\r -> happyReturn (happyIn46 r))
+
+happyReduce_155 = happyMonadReduce 5# 40# happyReduction_155
+happyReduction_155 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOut82 happy_x_4 of { happy_var_4 -> 
+	( withNodeInfo happy_var_1 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeOfType happy_var_4 at))}}
+	) (\r -> happyReturn (happyIn46 r))
+
+happyReduce_156 = happySpecReduce_2  40# happyReduction_156
+happyReduction_156 happy_x_2
+	happy_x_1
+	 =  case happyOut46 happy_x_1 of { happy_var_1 -> 
+	case happyOut38 happy_x_2 of { happy_var_2 -> 
+	happyIn46
+		 (happy_var_1 `snoc` happy_var_2
+	)}}
+
+happyReduce_157 = happySpecReduce_2  40# happyReduction_157
+happyReduction_157 happy_x_2
+	happy_x_1
+	 =  case happyOut46 happy_x_1 of { happy_var_1 -> 
+	case happyOut127 happy_x_2 of { happy_var_2 -> 
+	happyIn46
+		 (addTrailingAttrs happy_var_1 happy_var_2
+	)}}
+
+happyReduce_158 = happyMonadReduce 1# 41# happyReduction_158
+happyReduction_158 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> 
+	( withNodeInfo happy_var_1 $ \at -> singleton (CTypeSpec (CTypeDef happy_var_1 at)))}
+	) (\r -> happyReturn (happyIn47 r))
+
+happyReduce_159 = happyMonadReduce 4# 41# happyReduction_159
+happyReduction_159 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut116 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ \at -> singleton (CTypeSpec (CTypeOfExpr happy_var_3 at)))}}
+	) (\r -> happyReturn (happyIn47 r))
+
+happyReduce_160 = happyMonadReduce 4# 41# happyReduction_160
+happyReduction_160 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut82 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ \at -> singleton (CTypeSpec (CTypeOfType happy_var_3 at)))}}
+	) (\r -> happyReturn (happyIn47 r))
+
+happyReduce_161 = happyMonadReduce 2# 41# happyReduction_161
+happyReduction_161 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> 
+	( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual  happy_var_1 `snoc` CTypeSpec (CTypeDef happy_var_2 at))}}
+	) (\r -> happyReturn (happyIn47 r))
+
+happyReduce_162 = happyMonadReduce 5# 41# happyReduction_162
+happyReduction_162 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut116 happy_x_4 of { happy_var_4 -> 
+	( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual  happy_var_1 `snoc` CTypeSpec (CTypeOfExpr happy_var_4 at))}}}
+	) (\r -> happyReturn (happyIn47 r))
+
+happyReduce_163 = happyMonadReduce 5# 41# happyReduction_163
+happyReduction_163 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut82 happy_x_4 of { happy_var_4 -> 
+	( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual  happy_var_1 `snoc` CTypeSpec (CTypeOfType happy_var_4 at))}}}
+	) (\r -> happyReturn (happyIn47 r))
+
+happyReduce_164 = happyMonadReduce 2# 41# happyReduction_164
+happyReduction_164 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut126 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> 
+	( withNodeInfo happy_var_2 $ \at -> reverseList (liftCAttrs happy_var_1) `snoc` (CTypeSpec (CTypeDef happy_var_2 at)))}}
+	) (\r -> happyReturn (happyIn47 r))
+
+happyReduce_165 = happyMonadReduce 5# 41# happyReduction_165
+happyReduction_165 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut126 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut116 happy_x_4 of { happy_var_4 -> 
+	( withNodeInfo happy_var_2 $ \at -> reverseList (liftCAttrs happy_var_1) `snoc`  (CTypeSpec (CTypeOfExpr happy_var_4 at)))}}}
+	) (\r -> happyReturn (happyIn47 r))
+
+happyReduce_166 = happyMonadReduce 5# 41# happyReduction_166
+happyReduction_166 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut126 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut82 happy_x_4 of { happy_var_4 -> 
+	( withNodeInfo happy_var_2 $ \at -> reverseList (liftCAttrs happy_var_1) `snoc`  (CTypeSpec (CTypeOfType happy_var_4 at)))}}}
+	) (\r -> happyReturn (happyIn47 r))
+
+happyReduce_167 = happyMonadReduce 3# 41# happyReduction_167
+happyReduction_167 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_3 of { (CTokTyIdent _ happy_var_3) -> 
+	( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual  happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeDef happy_var_3 at))}}}
+	) (\r -> happyReturn (happyIn47 r))
+
+happyReduce_168 = happyMonadReduce 6# 41# happyReduction_168
+happyReduction_168 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut116 happy_x_5 of { happy_var_5 -> 
+	( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual  happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeOfExpr happy_var_5 at))}}}
+	) (\r -> happyReturn (happyIn47 r))
+
+happyReduce_169 = happyMonadReduce 6# 41# happyReduction_169
+happyReduction_169 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut82 happy_x_5 of { happy_var_5 -> 
+	( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual  happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeOfType happy_var_5 at))}}}
+	) (\r -> happyReturn (happyIn47 r))
+
+happyReduce_170 = happySpecReduce_2  41# happyReduction_170
+happyReduction_170 happy_x_2
+	happy_x_1
+	 =  case happyOut47 happy_x_1 of { happy_var_1 -> 
+	case happyOut60 happy_x_2 of { happy_var_2 -> 
+	happyIn47
+		 (happy_var_1 `snoc` CTypeQual happy_var_2
+	)}}
+
+happyReduce_171 = happySpecReduce_2  41# happyReduction_171
+happyReduction_171 happy_x_2
+	happy_x_1
+	 =  case happyOut47 happy_x_1 of { happy_var_1 -> 
+	case happyOut127 happy_x_2 of { happy_var_2 -> 
+	happyIn47
+		 (addTrailingAttrs happy_var_1 happy_var_2
+	)}}
+
+happyReduce_172 = happyMonadReduce 1# 42# happyReduction_172
+happyReduction_172 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut49 happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CSUType happy_var_1)}
+	) (\r -> happyReturn (happyIn48 r))
+
+happyReduce_173 = happyMonadReduce 1# 42# happyReduction_173
+happyReduction_173 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut57 happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CEnumType happy_var_1)}
+	) (\r -> happyReturn (happyIn48 r))
+
+happyReduce_174 = happyMonadReduce 6# 43# happyReduction_174
+happyReduction_174 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut50 happy_x_1 of { happy_var_1 -> 
+	case happyOut125 happy_x_2 of { happy_var_2 -> 
+	case happyOut124 happy_x_3 of { happy_var_3 -> 
+	case happyOut51 happy_x_5 of { happy_var_5 -> 
+	( withNodeInfo happy_var_1 $ CStruct (unL happy_var_1) (Just happy_var_3) (Just$ reverse happy_var_5) happy_var_2)}}}}
+	) (\r -> happyReturn (happyIn49 r))
+
+happyReduce_175 = happyMonadReduce 5# 43# happyReduction_175
+happyReduction_175 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut50 happy_x_1 of { happy_var_1 -> 
+	case happyOut125 happy_x_2 of { happy_var_2 -> 
+	case happyOut51 happy_x_4 of { happy_var_4 -> 
+	( withNodeInfo happy_var_1 $ CStruct (unL happy_var_1) Nothing   (Just$ reverse happy_var_4) happy_var_2)}}}
+	) (\r -> happyReturn (happyIn49 r))
+
+happyReduce_176 = happyMonadReduce 3# 43# happyReduction_176
+happyReduction_176 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut50 happy_x_1 of { happy_var_1 -> 
+	case happyOut125 happy_x_2 of { happy_var_2 -> 
+	case happyOut124 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ CStruct (unL happy_var_1) (Just happy_var_3) Nothing happy_var_2)}}}
+	) (\r -> happyReturn (happyIn49 r))
+
+happyReduce_177 = happySpecReduce_1  44# happyReduction_177
+happyReduction_177 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn50
+		 (L CStructTag (posOf happy_var_1)
+	)}
+
+happyReduce_178 = happySpecReduce_1  44# happyReduction_178
+happyReduction_178 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn50
+		 (L CUnionTag (posOf happy_var_1)
+	)}
+
+happyReduce_179 = happySpecReduce_0  45# happyReduction_179
+happyReduction_179  =  happyIn51
+		 (empty
+	)
+
+happyReduce_180 = happySpecReduce_2  45# happyReduction_180
+happyReduction_180 happy_x_2
+	happy_x_1
+	 =  case happyOut51 happy_x_1 of { happy_var_1 -> 
+	happyIn51
+		 (happy_var_1
+	)}
+
+happyReduce_181 = happySpecReduce_2  45# happyReduction_181
+happyReduction_181 happy_x_2
+	happy_x_1
+	 =  case happyOut51 happy_x_1 of { happy_var_1 -> 
+	case happyOut52 happy_x_2 of { happy_var_2 -> 
+	happyIn51
+		 (happy_var_1 `snoc` happy_var_2
+	)}}
+
+happyReduce_182 = happySpecReduce_2  46# happyReduction_182
+happyReduction_182 happy_x_2
+	happy_x_1
+	 =  case happyOut54 happy_x_1 of { happy_var_1 -> 
+	happyIn52
+		 (case happy_var_1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at
+	)}
+
+happyReduce_183 = happySpecReduce_2  46# happyReduction_183
+happyReduction_183 happy_x_2
+	happy_x_1
+	 =  case happyOut53 happy_x_1 of { happy_var_1 -> 
+	happyIn52
+		 (case happy_var_1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at
+	)}
+
+happyReduce_184 = happySpecReduce_2  46# happyReduction_184
+happyReduction_184 happy_x_2
+	happy_x_1
+	 =  case happyOut52 happy_x_2 of { happy_var_2 -> 
+	happyIn52
+		 (happy_var_2
+	)}
+
+happyReduce_185 = happyMonadReduce 3# 47# happyReduction_185
+happyReduction_185 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut125 happy_x_2 of { happy_var_2 -> 
+	case happyOut56 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ case happy_var_3 of (d,s) -> CDecl (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) [(d,Nothing,s)])}}}
+	) (\r -> happyReturn (happyIn53 r))
+
+happyReduce_186 = happyMonadReduce 2# 47# happyReduction_186
+happyReduction_186 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut126 happy_x_1 of { happy_var_1 -> 
+	case happyOut56 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ case happy_var_2 of (d,s) -> CDecl (liftCAttrs happy_var_1) [(d,Nothing,s)])}}
+	) (\r -> happyReturn (happyIn53 r))
+
+happyReduce_187 = happyReduce 4# 47# happyReduction_187
+happyReduction_187 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut53 happy_x_1 of { happy_var_1 -> 
+	case happyOut125 happy_x_3 of { happy_var_3 -> 
+	case happyOut56 happy_x_4 of { happy_var_4 -> 
+	happyIn53
+		 (case happy_var_1 of
+            CDecl declspecs dies at ->
+              case happy_var_4 of
+                (Just d,s) -> CDecl declspecs ((Just $ appendObjAttrs happy_var_3 d,Nothing,s) : dies) at
+                (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) at
+	) `HappyStk` happyRest}}}
+
+happyReduce_188 = happyMonadReduce 3# 48# happyReduction_188
+happyReduction_188 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> 
+	case happyOut55 happy_x_2 of { happy_var_2 -> 
+	case happyOut125 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ case happy_var_2 of { (Just d,s)  -> CDecl happy_var_1 [(Just $! appendObjAttrs happy_var_3 d,Nothing,s)]
+                                    ; (Nothing,s) -> CDecl happy_var_1 [(Nothing,Nothing,s)]  })}}}
+	) (\r -> happyReturn (happyIn54 r))
+
+happyReduce_189 = happyReduce 5# 48# happyReduction_189
+happyReduction_189 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut54 happy_x_1 of { happy_var_1 -> 
+	case happyOut125 happy_x_3 of { happy_var_3 -> 
+	case happyOut55 happy_x_4 of { happy_var_4 -> 
+	case happyOut125 happy_x_5 of { happy_var_5 -> 
+	happyIn54
+		 (case happy_var_1 of
+            CDecl declspecs dies attr ->
+              case happy_var_4 of
+                (Just d,s) -> CDecl declspecs ((Just$ appendObjAttrs (happy_var_3++happy_var_5) d,Nothing,s) : dies) attr
+                (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) attr
+	) `HappyStk` happyRest}}}}
+
+happyReduce_190 = happyMonadReduce 1# 48# happyReduction_190
+happyReduction_190 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}
+	) (\r -> happyReturn (happyIn54 r))
+
+happyReduce_191 = happySpecReduce_1  49# happyReduction_191
+happyReduction_191 happy_x_1
+	 =  case happyOut62 happy_x_1 of { happy_var_1 -> 
+	happyIn55
+		 ((Just (reverseDeclr happy_var_1), Nothing)
+	)}
+
+happyReduce_192 = happySpecReduce_2  49# happyReduction_192
+happyReduction_192 happy_x_2
+	happy_x_1
+	 =  case happyOut120 happy_x_2 of { happy_var_2 -> 
+	happyIn55
+		 ((Nothing, Just happy_var_2)
+	)}
+
+happyReduce_193 = happySpecReduce_3  49# happyReduction_193
+happyReduction_193 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut62 happy_x_1 of { happy_var_1 -> 
+	case happyOut120 happy_x_3 of { happy_var_3 -> 
+	happyIn55
+		 ((Just (reverseDeclr happy_var_1), Just happy_var_3)
+	)}}
+
+happyReduce_194 = happySpecReduce_1  50# happyReduction_194
+happyReduction_194 happy_x_1
+	 =  case happyOut71 happy_x_1 of { happy_var_1 -> 
+	happyIn56
+		 ((Just (reverseDeclr happy_var_1), Nothing)
+	)}
+
+happyReduce_195 = happySpecReduce_2  50# happyReduction_195
+happyReduction_195 happy_x_2
+	happy_x_1
+	 =  case happyOut120 happy_x_2 of { happy_var_2 -> 
+	happyIn56
+		 ((Nothing, Just happy_var_2)
+	)}
+
+happyReduce_196 = happySpecReduce_3  50# happyReduction_196
+happyReduction_196 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut71 happy_x_1 of { happy_var_1 -> 
+	case happyOut120 happy_x_3 of { happy_var_3 -> 
+	happyIn56
+		 ((Just (reverseDeclr happy_var_1), Just happy_var_3)
+	)}}
+
+happyReduce_197 = happySpecReduce_2  50# happyReduction_197
+happyReduction_197 happy_x_2
+	happy_x_1
+	 =  case happyOut56 happy_x_1 of { happy_var_1 -> 
+	case happyOut127 happy_x_2 of { happy_var_2 -> 
+	happyIn56
+		 (case happy_var_1 of {   (Nothing,expr) -> (Nothing,expr) {- FIXME -}
+                    ; (Just (CDeclr name derived asmname attrs node), bsz) ->
+                                        (Just (CDeclr name derived asmname (attrs++happy_var_2) node),bsz)
+                  }
+	)}}
+
+happyReduce_198 = happyMonadReduce 5# 51# happyReduction_198
+happyReduction_198 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut125 happy_x_2 of { happy_var_2 -> 
+	case happyOut58 happy_x_4 of { happy_var_4 -> 
+	( withNodeInfo happy_var_1 $ CEnum Nothing   (Just$ reverse happy_var_4) happy_var_2)}}}
+	) (\r -> happyReturn (happyIn57 r))
+
+happyReduce_199 = happyMonadReduce 6# 51# happyReduction_199
+happyReduction_199 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut125 happy_x_2 of { happy_var_2 -> 
+	case happyOut58 happy_x_4 of { happy_var_4 -> 
+	( withNodeInfo happy_var_1 $ CEnum Nothing   (Just$ reverse happy_var_4) happy_var_2)}}}
+	) (\r -> happyReturn (happyIn57 r))
+
+happyReduce_200 = happyMonadReduce 6# 51# happyReduction_200
+happyReduction_200 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut125 happy_x_2 of { happy_var_2 -> 
+	case happyOut124 happy_x_3 of { happy_var_3 -> 
+	case happyOut58 happy_x_5 of { happy_var_5 -> 
+	( withNodeInfo happy_var_1 $ CEnum (Just happy_var_3) (Just$ reverse happy_var_5) happy_var_2)}}}}
+	) (\r -> happyReturn (happyIn57 r))
+
+happyReduce_201 = happyMonadReduce 7# 51# happyReduction_201
+happyReduction_201 (happy_x_7 `HappyStk`
+	happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut125 happy_x_2 of { happy_var_2 -> 
+	case happyOut124 happy_x_3 of { happy_var_3 -> 
+	case happyOut58 happy_x_5 of { happy_var_5 -> 
+	( withNodeInfo happy_var_1 $ CEnum (Just happy_var_3) (Just$ reverse happy_var_5) happy_var_2)}}}}
+	) (\r -> happyReturn (happyIn57 r))
+
+happyReduce_202 = happyMonadReduce 3# 51# happyReduction_202
+happyReduction_202 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut125 happy_x_2 of { happy_var_2 -> 
+	case happyOut124 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ CEnum (Just happy_var_3) Nothing happy_var_2)}}}
+	) (\r -> happyReturn (happyIn57 r))
+
+happyReduce_203 = happySpecReduce_1  52# happyReduction_203
+happyReduction_203 happy_x_1
+	 =  case happyOut59 happy_x_1 of { happy_var_1 -> 
+	happyIn58
+		 (singleton happy_var_1
+	)}
+
+happyReduce_204 = happySpecReduce_3  52# happyReduction_204
+happyReduction_204 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut58 happy_x_1 of { happy_var_1 -> 
+	case happyOut59 happy_x_3 of { happy_var_3 -> 
+	happyIn58
+		 (happy_var_1 `snoc` happy_var_3
+	)}}
+
+happyReduce_205 = happySpecReduce_1  53# happyReduction_205
+happyReduction_205 happy_x_1
+	 =  case happyOut124 happy_x_1 of { happy_var_1 -> 
+	happyIn59
+		 ((happy_var_1, Nothing)
+	)}
+
+happyReduce_206 = happySpecReduce_3  53# happyReduction_206
+happyReduction_206 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut124 happy_x_1 of { happy_var_1 -> 
+	case happyOut120 happy_x_3 of { happy_var_3 -> 
+	happyIn59
+		 ((happy_var_1, Just happy_var_3)
+	)}}
+
+happyReduce_207 = happyMonadReduce 1# 54# happyReduction_207
+happyReduction_207 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CConstQual)}
+	) (\r -> happyReturn (happyIn60 r))
+
+happyReduce_208 = happyMonadReduce 1# 54# happyReduction_208
+happyReduction_208 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CVolatQual)}
+	) (\r -> happyReturn (happyIn60 r))
+
+happyReduce_209 = happyMonadReduce 1# 54# happyReduction_209
+happyReduction_209 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CRestrQual)}
+	) (\r -> happyReturn (happyIn60 r))
+
+happyReduce_210 = happyMonadReduce 1# 54# happyReduction_210
+happyReduction_210 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CInlineQual)}
+	) (\r -> happyReturn (happyIn60 r))
+
+happyReduce_211 = happySpecReduce_2  55# happyReduction_211
+happyReduction_211 happy_x_2
+	happy_x_1
+	 =  case happyOut125 happy_x_1 of { happy_var_1 -> 
+	case happyOut60 happy_x_2 of { happy_var_2 -> 
+	happyIn61
+		 (reverseList (map CAttrQual happy_var_1) `snoc` happy_var_2
+	)}}
+
+happyReduce_212 = happySpecReduce_2  55# happyReduction_212
+happyReduction_212 happy_x_2
+	happy_x_1
+	 =  case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut60 happy_x_2 of { happy_var_2 -> 
+	happyIn61
+		 (happy_var_1 `snoc` happy_var_2
+	)}}
+
+happyReduce_213 = happySpecReduce_3  55# happyReduction_213
+happyReduction_213 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut60 happy_x_3 of { happy_var_3 -> 
+	happyIn61
+		 ((happy_var_1 `rappend` map CAttrQual happy_var_2) `snoc` happy_var_3
+	)}}}
+
+happyReduce_214 = happySpecReduce_1  56# happyReduction_214
+happyReduction_214 happy_x_1
+	 =  case happyOut71 happy_x_1 of { happy_var_1 -> 
+	happyIn62
+		 (happy_var_1
+	)}
+
+happyReduce_215 = happySpecReduce_1  56# happyReduction_215
+happyReduction_215 happy_x_1
+	 =  case happyOut64 happy_x_1 of { happy_var_1 -> 
+	happyIn62
+		 (happy_var_1
+	)}
+
+happyReduce_216 = happySpecReduce_0  57# happyReduction_216
+happyReduction_216  =  happyIn63
+		 (Nothing
+	)
+
+happyReduce_217 = happyReduce 4# 57# happyReduction_217
+happyReduction_217 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut122 happy_x_3 of { happy_var_3 -> 
+	happyIn63
+		 (Just happy_var_3
+	) `HappyStk` happyRest}
+
+happyReduce_218 = happySpecReduce_1  58# happyReduction_218
+happyReduction_218 happy_x_1
+	 =  case happyOut68 happy_x_1 of { happy_var_1 -> 
+	happyIn64
+		 (happy_var_1
+	)}
+
+happyReduce_219 = happySpecReduce_1  58# happyReduction_219
+happyReduction_219 happy_x_1
+	 =  case happyOut65 happy_x_1 of { happy_var_1 -> 
+	happyIn64
+		 (happy_var_1
+	)}
+
+happyReduce_220 = happyMonadReduce 1# 59# happyReduction_220
+happyReduction_220 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> 
+	( withNodeInfo happy_var_1 $ mkVarDeclr happy_var_1)}
+	) (\r -> happyReturn (happyIn65 r))
+
+happyReduce_221 = happyMonadReduce 2# 59# happyReduction_221
+happyReduction_221 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> 
+	case happyOut84 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ \at -> happy_var_2 (mkVarDeclr happy_var_1 at))}}
+	) (\r -> happyReturn (happyIn65 r))
+
+happyReduce_222 = happySpecReduce_1  59# happyReduction_222
+happyReduction_222 happy_x_1
+	 =  case happyOut66 happy_x_1 of { happy_var_1 -> 
+	happyIn65
+		 (happy_var_1
+	)}
+
+happyReduce_223 = happySpecReduce_1  60# happyReduction_223
+happyReduction_223 happy_x_1
+	 =  case happyOut67 happy_x_1 of { happy_var_1 -> 
+	happyIn66
+		 (happy_var_1
+	)}
+
+happyReduce_224 = happyMonadReduce 2# 60# happyReduction_224
+happyReduction_224 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut65 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}
+	) (\r -> happyReturn (happyIn66 r))
+
+happyReduce_225 = happyMonadReduce 3# 60# happyReduction_225
+happyReduction_225 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut65 happy_x_3 of { happy_var_3 -> 
+	( withAttribute happy_var_1 happy_var_2 $ ptrDeclr happy_var_3 [])}}}
+	) (\r -> happyReturn (happyIn66 r))
+
+happyReduce_226 = happyMonadReduce 3# 60# happyReduction_226
+happyReduction_226 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut61 happy_x_2 of { happy_var_2 -> 
+	case happyOut65 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}
+	) (\r -> happyReturn (happyIn66 r))
+
+happyReduce_227 = happyMonadReduce 4# 60# happyReduction_227
+happyReduction_227 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut61 happy_x_2 of { happy_var_2 -> 
+	case happyOut126 happy_x_3 of { happy_var_3 -> 
+	case happyOut65 happy_x_4 of { happy_var_4 -> 
+	( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}}
+	) (\r -> happyReturn (happyIn66 r))
+
+happyReduce_228 = happySpecReduce_3  61# happyReduction_228
+happyReduction_228 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut66 happy_x_2 of { happy_var_2 -> 
+	happyIn67
+		 (happy_var_2
+	)}
+
+happyReduce_229 = happyReduce 4# 61# happyReduction_229
+happyReduction_229 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut66 happy_x_2 of { happy_var_2 -> 
+	case happyOut84 happy_x_4 of { happy_var_4 -> 
+	happyIn67
+		 (happy_var_4 happy_var_2
+	) `HappyStk` happyRest}}
+
+happyReduce_230 = happyReduce 4# 61# happyReduction_230
+happyReduction_230 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut66 happy_x_3 of { happy_var_3 -> 
+	happyIn67
+		 (appendDeclrAttrs happy_var_2 happy_var_3
+	) `HappyStk` happyRest}}
+
+happyReduce_231 = happyReduce 5# 61# happyReduction_231
+happyReduction_231 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut66 happy_x_3 of { happy_var_3 -> 
+	case happyOut84 happy_x_5 of { happy_var_5 -> 
+	happyIn67
+		 (appendDeclrAttrs happy_var_2 (happy_var_5 happy_var_3)
+	) `HappyStk` happyRest}}}
+
+happyReduce_232 = happySpecReduce_1  62# happyReduction_232
+happyReduction_232 happy_x_1
+	 =  case happyOut69 happy_x_1 of { happy_var_1 -> 
+	happyIn68
+		 (happy_var_1
+	)}
+
+happyReduce_233 = happyMonadReduce 4# 62# happyReduction_233
+happyReduction_233 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut70 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 [])}}
+	) (\r -> happyReturn (happyIn68 r))
+
+happyReduce_234 = happyMonadReduce 5# 62# happyReduction_234
+happyReduction_234 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut61 happy_x_2 of { happy_var_2 -> 
+	case happyOut70 happy_x_4 of { happy_var_4 -> 
+	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}
+	) (\r -> happyReturn (happyIn68 r))
+
+happyReduce_235 = happyMonadReduce 6# 62# happyReduction_235
+happyReduction_235 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut61 happy_x_2 of { happy_var_2 -> 
+	case happyOut126 happy_x_3 of { happy_var_3 -> 
+	case happyOut70 happy_x_5 of { happy_var_5 -> 
+	( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_5 (reverse happy_var_2))}}}}
+	) (\r -> happyReturn (happyIn68 r))
+
+happyReduce_236 = happyMonadReduce 2# 62# happyReduction_236
+happyReduction_236 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut68 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}
+	) (\r -> happyReturn (happyIn68 r))
+
+happyReduce_237 = happyMonadReduce 3# 62# happyReduction_237
+happyReduction_237 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut61 happy_x_2 of { happy_var_2 -> 
+	case happyOut68 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}
+	) (\r -> happyReturn (happyIn68 r))
+
+happyReduce_238 = happyMonadReduce 4# 62# happyReduction_238
+happyReduction_238 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut61 happy_x_2 of { happy_var_2 -> 
+	case happyOut126 happy_x_3 of { happy_var_3 -> 
+	case happyOut68 happy_x_4 of { happy_var_4 -> 
+	( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}}
+	) (\r -> happyReturn (happyIn68 r))
+
+happyReduce_239 = happySpecReduce_3  63# happyReduction_239
+happyReduction_239 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut68 happy_x_2 of { happy_var_2 -> 
+	happyIn69
+		 (happy_var_2
+	)}
+
+happyReduce_240 = happyReduce 4# 63# happyReduction_240
+happyReduction_240 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut70 happy_x_2 of { happy_var_2 -> 
+	case happyOut84 happy_x_3 of { happy_var_3 -> 
+	happyIn69
+		 (happy_var_3 happy_var_2
+	) `HappyStk` happyRest}}
+
+happyReduce_241 = happyReduce 4# 63# happyReduction_241
+happyReduction_241 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut68 happy_x_2 of { happy_var_2 -> 
+	case happyOut84 happy_x_4 of { happy_var_4 -> 
+	happyIn69
+		 (happy_var_4 happy_var_2
+	) `HappyStk` happyRest}}
+
+happyReduce_242 = happyMonadReduce 1# 64# happyReduction_242
+happyReduction_242 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> 
+	( withNodeInfo happy_var_1 $ mkVarDeclr happy_var_1)}
+	) (\r -> happyReturn (happyIn70 r))
+
+happyReduce_243 = happySpecReduce_3  64# happyReduction_243
+happyReduction_243 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut70 happy_x_2 of { happy_var_2 -> 
+	happyIn70
+		 (happy_var_2
+	)}
+
+happyReduce_244 = happySpecReduce_1  65# happyReduction_244
+happyReduction_244 happy_x_1
+	 =  case happyOut72 happy_x_1 of { happy_var_1 -> 
+	happyIn71
+		 (happy_var_1
+	)}
+
+happyReduce_245 = happySpecReduce_1  65# happyReduction_245
+happyReduction_245 happy_x_1
+	 =  case happyOut74 happy_x_1 of { happy_var_1 -> 
+	happyIn71
+		 (happy_var_1
+	)}
+
+happyReduce_246 = happySpecReduce_1  66# happyReduction_246
+happyReduction_246 happy_x_1
+	 =  case happyOut73 happy_x_1 of { happy_var_1 -> 
+	happyIn72
+		 (happy_var_1
+	)}
+
+happyReduce_247 = happyMonadReduce 2# 66# happyReduction_247
+happyReduction_247 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut71 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}
+	) (\r -> happyReturn (happyIn72 r))
+
+happyReduce_248 = happyMonadReduce 3# 66# happyReduction_248
+happyReduction_248 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut71 happy_x_3 of { happy_var_3 -> 
+	( withAttribute happy_var_1 happy_var_2 $ ptrDeclr happy_var_3 [])}}}
+	) (\r -> happyReturn (happyIn72 r))
+
+happyReduce_249 = happyMonadReduce 3# 66# happyReduction_249
+happyReduction_249 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut61 happy_x_2 of { happy_var_2 -> 
+	case happyOut71 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}
+	) (\r -> happyReturn (happyIn72 r))
+
+happyReduce_250 = happyMonadReduce 4# 66# happyReduction_250
+happyReduction_250 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut61 happy_x_2 of { happy_var_2 -> 
+	case happyOut126 happy_x_3 of { happy_var_3 -> 
+	case happyOut71 happy_x_4 of { happy_var_4 -> 
+	( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}}
+	) (\r -> happyReturn (happyIn72 r))
+
+happyReduce_251 = happySpecReduce_2  67# happyReduction_251
+happyReduction_251 happy_x_2
+	happy_x_1
+	 =  case happyOut74 happy_x_1 of { happy_var_1 -> 
+	case happyOut84 happy_x_2 of { happy_var_2 -> 
+	happyIn73
+		 (happy_var_2 happy_var_1
+	)}}
+
+happyReduce_252 = happySpecReduce_3  67# happyReduction_252
+happyReduction_252 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut72 happy_x_2 of { happy_var_2 -> 
+	happyIn73
+		 (happy_var_2
+	)}
+
+happyReduce_253 = happyReduce 4# 67# happyReduction_253
+happyReduction_253 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut72 happy_x_2 of { happy_var_2 -> 
+	case happyOut84 happy_x_4 of { happy_var_4 -> 
+	happyIn73
+		 (happy_var_4 happy_var_2
+	) `HappyStk` happyRest}}
+
+happyReduce_254 = happyReduce 4# 67# happyReduction_254
+happyReduction_254 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut72 happy_x_3 of { happy_var_3 -> 
+	happyIn73
+		 (appendDeclrAttrs happy_var_2 happy_var_3
+	) `HappyStk` happyRest}}
+
+happyReduce_255 = happyReduce 5# 67# happyReduction_255
+happyReduction_255 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut72 happy_x_3 of { happy_var_3 -> 
+	case happyOut84 happy_x_5 of { happy_var_5 -> 
+	happyIn73
+		 (appendDeclrAttrs happy_var_2 (happy_var_5 happy_var_3)
+	) `HappyStk` happyRest}}}
+
+happyReduce_256 = happyMonadReduce 1# 68# happyReduction_256
+happyReduction_256 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (CTokIdent  _ happy_var_1) -> 
+	( withNodeInfo happy_var_1 $ mkVarDeclr happy_var_1)}
+	) (\r -> happyReturn (happyIn74 r))
+
+happyReduce_257 = happySpecReduce_3  68# happyReduction_257
+happyReduction_257 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut74 happy_x_2 of { happy_var_2 -> 
+	happyIn74
+		 (happy_var_2
+	)}
+
+happyReduce_258 = happyReduce 4# 68# happyReduction_258
+happyReduction_258 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut74 happy_x_3 of { happy_var_3 -> 
+	happyIn74
+		 (appendDeclrAttrs happy_var_2 happy_var_3
+	) `HappyStk` happyRest}}
+
+happyReduce_259 = happySpecReduce_1  69# happyReduction_259
+happyReduction_259 happy_x_1
+	 =  case happyOut76 happy_x_1 of { happy_var_1 -> 
+	happyIn75
+		 (reverseDeclr happy_var_1
+	)}
+
+happyReduce_260 = happySpecReduce_1  70# happyReduction_260
+happyReduction_260 happy_x_1
+	 =  case happyOut77 happy_x_1 of { happy_var_1 -> 
+	happyIn76
+		 (happy_var_1
+	)}
+
+happyReduce_261 = happyMonadReduce 2# 70# happyReduction_261
+happyReduction_261 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut76 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}
+	) (\r -> happyReturn (happyIn76 r))
+
+happyReduce_262 = happyMonadReduce 3# 70# happyReduction_262
+happyReduction_262 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut61 happy_x_2 of { happy_var_2 -> 
+	case happyOut76 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}
+	) (\r -> happyReturn (happyIn76 r))
+
+happyReduce_263 = happyMonadReduce 4# 71# happyReduction_263
+happyReduction_263 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut74 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut81 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ funDeclr happy_var_1 (Left $ reverse happy_var_3) [])}}}
+	) (\r -> happyReturn (happyIn77 r))
+
+happyReduce_264 = happySpecReduce_3  71# happyReduction_264
+happyReduction_264 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut76 happy_x_2 of { happy_var_2 -> 
+	happyIn77
+		 (happy_var_2
+	)}
+
+happyReduce_265 = happyReduce 4# 71# happyReduction_265
+happyReduction_265 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut76 happy_x_2 of { happy_var_2 -> 
+	case happyOut84 happy_x_4 of { happy_var_4 -> 
+	happyIn77
+		 (happy_var_4 happy_var_2
+	) `HappyStk` happyRest}}
+
+happyReduce_266 = happySpecReduce_0  72# happyReduction_266
+happyReduction_266  =  happyIn78
+		 (([], False)
+	)
+
+happyReduce_267 = happySpecReduce_1  72# happyReduction_267
+happyReduction_267 happy_x_1
+	 =  case happyOut79 happy_x_1 of { happy_var_1 -> 
+	happyIn78
+		 ((reverse happy_var_1, False)
+	)}
+
+happyReduce_268 = happySpecReduce_3  72# happyReduction_268
+happyReduction_268 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut79 happy_x_1 of { happy_var_1 -> 
+	happyIn78
+		 ((reverse happy_var_1, True)
+	)}
+
+happyReduce_269 = happySpecReduce_1  73# happyReduction_269
+happyReduction_269 happy_x_1
+	 =  case happyOut80 happy_x_1 of { happy_var_1 -> 
+	happyIn79
+		 (singleton happy_var_1
+	)}
+
+happyReduce_270 = happySpecReduce_3  73# happyReduction_270
+happyReduction_270 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut79 happy_x_1 of { happy_var_1 -> 
+	case happyOut80 happy_x_3 of { happy_var_3 -> 
+	happyIn79
+		 (happy_var_1 `snoc` happy_var_3
+	)}}
+
+happyReduce_271 = happyMonadReduce 1# 74# happyReduction_271
+happyReduction_271 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut36 happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}
+	) (\r -> happyReturn (happyIn80 r))
+
+happyReduce_272 = happyMonadReduce 2# 74# happyReduction_272
+happyReduction_272 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut36 happy_x_1 of { happy_var_1 -> 
+	case happyOut83 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}
+	) (\r -> happyReturn (happyIn80 r))
+
+happyReduce_273 = happyMonadReduce 3# 74# happyReduction_273
+happyReduction_273 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut36 happy_x_1 of { happy_var_1 -> 
+	case happyOut71 happy_x_2 of { happy_var_2 -> 
+	case happyOut125 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}
+	) (\r -> happyReturn (happyIn80 r))
+
+happyReduce_274 = happyMonadReduce 3# 74# happyReduction_274
+happyReduction_274 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut36 happy_x_1 of { happy_var_1 -> 
+	case happyOut65 happy_x_2 of { happy_var_2 -> 
+	case happyOut125 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}
+	) (\r -> happyReturn (happyIn80 r))
+
+happyReduce_275 = happyMonadReduce 1# 74# happyReduction_275
+happyReduction_275 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [])}
+	) (\r -> happyReturn (happyIn80 r))
+
+happyReduce_276 = happyMonadReduce 2# 74# happyReduction_276
+happyReduction_276 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOut83 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}
+	) (\r -> happyReturn (happyIn80 r))
+
+happyReduce_277 = happyMonadReduce 3# 74# happyReduction_277
+happyReduction_277 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> 
+	case happyOut71 happy_x_2 of { happy_var_2 -> 
+	case happyOut125 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}
+	) (\r -> happyReturn (happyIn80 r))
+
+happyReduce_278 = happyMonadReduce 1# 74# happyReduction_278
+happyReduction_278 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}
+	) (\r -> happyReturn (happyIn80 r))
+
+happyReduce_279 = happyMonadReduce 2# 74# happyReduction_279
+happyReduction_279 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> 
+	case happyOut83 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}
+	) (\r -> happyReturn (happyIn80 r))
+
+happyReduce_280 = happyMonadReduce 3# 74# happyReduction_280
+happyReduction_280 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> 
+	case happyOut71 happy_x_2 of { happy_var_2 -> 
+	case happyOut125 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}
+	) (\r -> happyReturn (happyIn80 r))
+
+happyReduce_281 = happyMonadReduce 3# 74# happyReduction_281
+happyReduction_281 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> 
+	case happyOut65 happy_x_2 of { happy_var_2 -> 
+	case happyOut125 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}
+	) (\r -> happyReturn (happyIn80 r))
+
+happyReduce_282 = happyMonadReduce 1# 74# happyReduction_282
+happyReduction_282 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [])}
+	) (\r -> happyReturn (happyIn80 r))
+
+happyReduce_283 = happyMonadReduce 2# 74# happyReduction_283
+happyReduction_283 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut127 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) [])}}
+	) (\r -> happyReturn (happyIn80 r))
+
+happyReduce_284 = happyMonadReduce 2# 74# happyReduction_284
+happyReduction_284 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut83 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}
+	) (\r -> happyReturn (happyIn80 r))
+
+happyReduce_285 = happyMonadReduce 3# 74# happyReduction_285
+happyReduction_285 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut71 happy_x_2 of { happy_var_2 -> 
+	case happyOut125 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [(Just (reverseDeclr$ appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}
+	) (\r -> happyReturn (happyIn80 r))
+
+happyReduce_286 = happySpecReduce_1  75# happyReduction_286
+happyReduction_286 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (CTokIdent  _ happy_var_1) -> 
+	happyIn81
+		 (singleton happy_var_1
+	)}
+
+happyReduce_287 = happySpecReduce_3  75# happyReduction_287
+happyReduction_287 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut81 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_3 of { (CTokIdent  _ happy_var_3) -> 
+	happyIn81
+		 (happy_var_1 `snoc` happy_var_3
+	)}}
+
+happyReduce_288 = happyMonadReduce 1# 76# happyReduction_288
+happyReduction_288 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}
+	) (\r -> happyReturn (happyIn82 r))
+
+happyReduce_289 = happyMonadReduce 2# 76# happyReduction_289
+happyReduction_289 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut40 happy_x_1 of { happy_var_1 -> 
+	case happyOut83 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}
+	) (\r -> happyReturn (happyIn82 r))
+
+happyReduce_290 = happyMonadReduce 2# 76# happyReduction_290
+happyReduction_290 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut127 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) [])}}
+	) (\r -> happyReturn (happyIn82 r))
+
+happyReduce_291 = happyMonadReduce 2# 76# happyReduction_291
+happyReduction_291 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> 
+	case happyOut83 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}
+	) (\r -> happyReturn (happyIn82 r))
+
+happyReduce_292 = happySpecReduce_1  77# happyReduction_292
+happyReduction_292 happy_x_1
+	 =  case happyOut87 happy_x_1 of { happy_var_1 -> 
+	happyIn83
+		 (happy_var_1
+	)}
+
+happyReduce_293 = happySpecReduce_1  77# happyReduction_293
+happyReduction_293 happy_x_1
+	 =  case happyOut88 happy_x_1 of { happy_var_1 -> 
+	happyIn83
+		 (happy_var_1
+	)}
+
+happyReduce_294 = happySpecReduce_1  77# happyReduction_294
+happyReduction_294 happy_x_1
+	 =  case happyOut84 happy_x_1 of { happy_var_1 -> 
+	happyIn83
+		 (happy_var_1 emptyDeclr
+	)}
+
+happyReduce_295 = happySpecReduce_1  78# happyReduction_295
+happyReduction_295 happy_x_1
+	 =  case happyOut85 happy_x_1 of { happy_var_1 -> 
+	happyIn84
+		 (happy_var_1
+	)}
+
+happyReduce_296 = happyMonadReduce 3# 78# happyReduction_296
+happyReduction_296 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut78 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ \at declr -> case happy_var_2 of
+             (params, variadic) -> funDeclr declr (Right (params,variadic)) [] at)}}
+	) (\r -> happyReturn (happyIn84 r))
+
+happyReduce_297 = happySpecReduce_1  79# happyReduction_297
+happyReduction_297 happy_x_1
+	 =  case happyOut86 happy_x_1 of { happy_var_1 -> 
+	happyIn85
+		 (happy_var_1
+	)}
+
+happyReduce_298 = happySpecReduce_2  79# happyReduction_298
+happyReduction_298 happy_x_2
+	happy_x_1
+	 =  case happyOut85 happy_x_1 of { happy_var_1 -> 
+	case happyOut86 happy_x_2 of { happy_var_2 -> 
+	happyIn85
+		 (\decl -> happy_var_2 (happy_var_1 decl)
+	)}}
+
+happyReduce_299 = happyMonadReduce 3# 80# happyReduction_299
+happyReduction_299 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut119 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ \at declr -> arrDeclr declr [] False False happy_var_2 at)}}
+	) (\r -> happyReturn (happyIn86 r))
+
+happyReduce_300 = happyMonadReduce 4# 80# happyReduction_300
+happyReduction_300 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut119 happy_x_3 of { happy_var_3 -> 
+	( withAttributePF happy_var_1 happy_var_2 $ \at declr -> arrDeclr declr [] False False happy_var_3 at)}}}
+	) (\r -> happyReturn (happyIn86 r))
+
+happyReduce_301 = happyMonadReduce 4# 80# happyReduction_301
+happyReduction_301 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut61 happy_x_2 of { happy_var_2 -> 
+	case happyOut119 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ \at declr -> arrDeclr declr (reverse happy_var_2) False False happy_var_3 at)}}}
+	) (\r -> happyReturn (happyIn86 r))
+
+happyReduce_302 = happyMonadReduce 5# 80# happyReduction_302
+happyReduction_302 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut61 happy_x_2 of { happy_var_2 -> 
+	case happyOut126 happy_x_3 of { happy_var_3 -> 
+	case happyOut119 happy_x_4 of { happy_var_4 -> 
+	( withAttributePF happy_var_1 happy_var_3 $ \at declr -> arrDeclr declr (reverse happy_var_2) False False happy_var_4 at)}}}}
+	) (\r -> happyReturn (happyIn86 r))
+
+happyReduce_303 = happyMonadReduce 5# 80# happyReduction_303
+happyReduction_303 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut125 happy_x_3 of { happy_var_3 -> 
+	case happyOut114 happy_x_4 of { happy_var_4 -> 
+	( withAttributePF happy_var_1 happy_var_3 $ \at declr -> arrDeclr declr [] False True (Just happy_var_4) at)}}}
+	) (\r -> happyReturn (happyIn86 r))
+
+happyReduce_304 = happyMonadReduce 6# 80# happyReduction_304
+happyReduction_304 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut61 happy_x_3 of { happy_var_3 -> 
+	case happyOut125 happy_x_4 of { happy_var_4 -> 
+	case happyOut114 happy_x_5 of { happy_var_5 -> 
+	( withAttributePF happy_var_1 happy_var_4 $ \at declr -> arrDeclr declr (reverse happy_var_3) False True (Just happy_var_5) at)}}}}
+	) (\r -> happyReturn (happyIn86 r))
+
+happyReduce_305 = happyMonadReduce 7# 80# happyReduction_305
+happyReduction_305 (happy_x_7 `HappyStk`
+	happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut61 happy_x_2 of { happy_var_2 -> 
+	case happyOut125 happy_x_3 of { happy_var_3 -> 
+	case happyOut125 happy_x_5 of { happy_var_5 -> 
+	case happyOut114 happy_x_6 of { happy_var_6 -> 
+	( withAttributePF happy_var_1 (happy_var_3 ++ happy_var_5) $ \at declr -> arrDeclr declr (reverse happy_var_2) False True  (Just happy_var_6) at)}}}}}
+	) (\r -> happyReturn (happyIn86 r))
+
+happyReduce_306 = happyMonadReduce 4# 80# happyReduction_306
+happyReduction_306 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut125 happy_x_3 of { happy_var_3 -> 
+	( withAttributePF happy_var_1 happy_var_3 $ \at declr -> arrDeclr declr [] True False Nothing at)}}
+	) (\r -> happyReturn (happyIn86 r))
+
+happyReduce_307 = happyMonadReduce 5# 80# happyReduction_307
+happyReduction_307 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut125 happy_x_4 of { happy_var_4 -> 
+	( withAttributePF happy_var_1 (happy_var_2 ++ happy_var_4) $ \at declr -> arrDeclr declr [] True False Nothing at)}}}
+	) (\r -> happyReturn (happyIn86 r))
+
+happyReduce_308 = happyMonadReduce 5# 80# happyReduction_308
+happyReduction_308 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut61 happy_x_2 of { happy_var_2 -> 
+	case happyOut125 happy_x_4 of { happy_var_4 -> 
+	( withAttributePF happy_var_1 happy_var_4 $ \at declr -> arrDeclr declr (reverse happy_var_2) True False Nothing at)}}}
+	) (\r -> happyReturn (happyIn86 r))
+
+happyReduce_309 = happyMonadReduce 6# 80# happyReduction_309
+happyReduction_309 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut61 happy_x_2 of { happy_var_2 -> 
+	case happyOut126 happy_x_3 of { happy_var_3 -> 
+	case happyOut125 happy_x_5 of { happy_var_5 -> 
+	( withAttributePF happy_var_1 (happy_var_3 ++ happy_var_5) $ \at declr -> arrDeclr declr (reverse happy_var_2) True False Nothing at)}}}}
+	) (\r -> happyReturn (happyIn86 r))
+
+happyReduce_310 = happyMonadReduce 1# 81# happyReduction_310
+happyReduction_310 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ ptrDeclr emptyDeclr [])}
+	) (\r -> happyReturn (happyIn87 r))
+
+happyReduce_311 = happyMonadReduce 3# 81# happyReduction_311
+happyReduction_311 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut61 happy_x_2 of { happy_var_2 -> 
+	case happyOut125 happy_x_3 of { happy_var_3 -> 
+	( withAttribute happy_var_1 happy_var_3 $ ptrDeclr emptyDeclr (reverse happy_var_2))}}}
+	) (\r -> happyReturn (happyIn87 r))
+
+happyReduce_312 = happyMonadReduce 2# 81# happyReduction_312
+happyReduction_312 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut83 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}
+	) (\r -> happyReturn (happyIn87 r))
+
+happyReduce_313 = happyMonadReduce 3# 81# happyReduction_313
+happyReduction_313 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut61 happy_x_2 of { happy_var_2 -> 
+	case happyOut83 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}
+	) (\r -> happyReturn (happyIn87 r))
+
+happyReduce_314 = happyMonadReduce 2# 81# happyReduction_314
+happyReduction_314 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut126 happy_x_2 of { happy_var_2 -> 
+	( withAttribute happy_var_1 happy_var_2 $ ptrDeclr emptyDeclr [])}}
+	) (\r -> happyReturn (happyIn87 r))
+
+happyReduce_315 = happyMonadReduce 3# 81# happyReduction_315
+happyReduction_315 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut83 happy_x_3 of { happy_var_3 -> 
+	( withAttribute happy_var_1 happy_var_2 $ ptrDeclr happy_var_3 [])}}}
+	) (\r -> happyReturn (happyIn87 r))
+
+happyReduce_316 = happySpecReduce_3  82# happyReduction_316
+happyReduction_316 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut87 happy_x_2 of { happy_var_2 -> 
+	happyIn88
+		 (happy_var_2
+	)}
+
+happyReduce_317 = happySpecReduce_3  82# happyReduction_317
+happyReduction_317 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut88 happy_x_2 of { happy_var_2 -> 
+	happyIn88
+		 (happy_var_2
+	)}
+
+happyReduce_318 = happySpecReduce_3  82# happyReduction_318
+happyReduction_318 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut84 happy_x_2 of { happy_var_2 -> 
+	happyIn88
+		 (happy_var_2 emptyDeclr
+	)}
+
+happyReduce_319 = happyReduce 4# 82# happyReduction_319
+happyReduction_319 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut87 happy_x_2 of { happy_var_2 -> 
+	case happyOut84 happy_x_4 of { happy_var_4 -> 
+	happyIn88
+		 (happy_var_4 happy_var_2
+	) `HappyStk` happyRest}}
+
+happyReduce_320 = happyReduce 4# 82# happyReduction_320
+happyReduction_320 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut87 happy_x_3 of { happy_var_3 -> 
+	happyIn88
+		 (appendDeclrAttrs happy_var_2 happy_var_3
+	) `HappyStk` happyRest}}
+
+happyReduce_321 = happyReduce 4# 82# happyReduction_321
+happyReduction_321 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut88 happy_x_3 of { happy_var_3 -> 
+	happyIn88
+		 (appendDeclrAttrs happy_var_2 happy_var_3
+	) `HappyStk` happyRest}}
+
+happyReduce_322 = happyReduce 4# 82# happyReduction_322
+happyReduction_322 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut84 happy_x_3 of { happy_var_3 -> 
+	happyIn88
+		 (appendDeclrAttrs happy_var_2 (happy_var_3 emptyDeclr)
+	) `HappyStk` happyRest}}
+
+happyReduce_323 = happyReduce 5# 82# happyReduction_323
+happyReduction_323 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut126 happy_x_2 of { happy_var_2 -> 
+	case happyOut87 happy_x_3 of { happy_var_3 -> 
+	case happyOut84 happy_x_5 of { happy_var_5 -> 
+	happyIn88
+		 (appendDeclrAttrs happy_var_2 (happy_var_5 happy_var_3)
+	) `HappyStk` happyRest}}}
+
+happyReduce_324 = happySpecReduce_2  82# happyReduction_324
+happyReduction_324 happy_x_2
+	happy_x_1
+	 =  case happyOut88 happy_x_1 of { happy_var_1 -> 
+	case happyOut127 happy_x_2 of { happy_var_2 -> 
+	happyIn88
+		 (appendDeclrAttrs happy_var_2 happy_var_1
+	)}}
+
+happyReduce_325 = happyMonadReduce 1# 83# happyReduction_325
+happyReduction_325 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut114 happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ CInitExpr happy_var_1)}
+	) (\r -> happyReturn (happyIn89 r))
+
+happyReduce_326 = happyMonadReduce 3# 83# happyReduction_326
+happyReduction_326 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut91 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ CInitList (reverse happy_var_2))}}
+	) (\r -> happyReturn (happyIn89 r))
+
+happyReduce_327 = happyMonadReduce 4# 83# happyReduction_327
+happyReduction_327 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut91 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ CInitList (reverse happy_var_2))}}
+	) (\r -> happyReturn (happyIn89 r))
+
+happyReduce_328 = happySpecReduce_0  84# happyReduction_328
+happyReduction_328  =  happyIn90
+		 (Nothing
+	)
+
+happyReduce_329 = happySpecReduce_2  84# happyReduction_329
+happyReduction_329 happy_x_2
+	happy_x_1
+	 =  case happyOut89 happy_x_2 of { happy_var_2 -> 
+	happyIn90
+		 (Just happy_var_2
+	)}
+
+happyReduce_330 = happySpecReduce_0  85# happyReduction_330
+happyReduction_330  =  happyIn91
+		 (empty
+	)
+
+happyReduce_331 = happySpecReduce_1  85# happyReduction_331
+happyReduction_331 happy_x_1
+	 =  case happyOut89 happy_x_1 of { happy_var_1 -> 
+	happyIn91
+		 (singleton ([],happy_var_1)
+	)}
+
+happyReduce_332 = happySpecReduce_2  85# happyReduction_332
+happyReduction_332 happy_x_2
+	happy_x_1
+	 =  case happyOut92 happy_x_1 of { happy_var_1 -> 
+	case happyOut89 happy_x_2 of { happy_var_2 -> 
+	happyIn91
+		 (singleton (happy_var_1,happy_var_2)
+	)}}
+
+happyReduce_333 = happySpecReduce_3  85# happyReduction_333
+happyReduction_333 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut91 happy_x_1 of { happy_var_1 -> 
+	case happyOut89 happy_x_3 of { happy_var_3 -> 
+	happyIn91
+		 (happy_var_1 `snoc` ([],happy_var_3)
+	)}}
+
+happyReduce_334 = happyReduce 4# 85# happyReduction_334
+happyReduction_334 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut91 happy_x_1 of { happy_var_1 -> 
+	case happyOut92 happy_x_3 of { happy_var_3 -> 
+	case happyOut89 happy_x_4 of { happy_var_4 -> 
+	happyIn91
+		 (happy_var_1 `snoc` (happy_var_3,happy_var_4)
+	) `HappyStk` happyRest}}}
+
+happyReduce_335 = happySpecReduce_2  86# happyReduction_335
+happyReduction_335 happy_x_2
+	happy_x_1
+	 =  case happyOut93 happy_x_1 of { happy_var_1 -> 
+	happyIn92
+		 (reverse happy_var_1
+	)}
+
+happyReduce_336 = happyMonadReduce 2# 86# happyReduction_336
+happyReduction_336 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut124 happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ \at -> [CMemberDesig happy_var_1 at])}
+	) (\r -> happyReturn (happyIn92 r))
+
+happyReduce_337 = happySpecReduce_1  86# happyReduction_337
+happyReduction_337 happy_x_1
+	 =  case happyOut95 happy_x_1 of { happy_var_1 -> 
+	happyIn92
+		 ([happy_var_1]
+	)}
+
+happyReduce_338 = happySpecReduce_1  87# happyReduction_338
+happyReduction_338 happy_x_1
+	 =  case happyOut94 happy_x_1 of { happy_var_1 -> 
+	happyIn93
+		 (singleton happy_var_1
+	)}
+
+happyReduce_339 = happySpecReduce_2  87# happyReduction_339
+happyReduction_339 happy_x_2
+	happy_x_1
+	 =  case happyOut93 happy_x_1 of { happy_var_1 -> 
+	case happyOut94 happy_x_2 of { happy_var_2 -> 
+	happyIn93
+		 (happy_var_1 `snoc` happy_var_2
+	)}}
+
+happyReduce_340 = happyMonadReduce 3# 88# happyReduction_340
+happyReduction_340 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut120 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ CArrDesig happy_var_2)}}
+	) (\r -> happyReturn (happyIn94 r))
+
+happyReduce_341 = happyMonadReduce 2# 88# happyReduction_341
+happyReduction_341 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut124 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ CMemberDesig happy_var_2)}}
+	) (\r -> happyReturn (happyIn94 r))
+
+happyReduce_342 = happySpecReduce_1  88# happyReduction_342
+happyReduction_342 happy_x_1
+	 =  case happyOut95 happy_x_1 of { happy_var_1 -> 
+	happyIn94
+		 (happy_var_1
+	)}
+
+happyReduce_343 = happyMonadReduce 5# 89# happyReduction_343
+happyReduction_343 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut120 happy_x_2 of { happy_var_2 -> 
+	case happyOut120 happy_x_4 of { happy_var_4 -> 
+	( withNodeInfo happy_var_1 $ CRangeDesig happy_var_2 happy_var_4)}}}
+	) (\r -> happyReturn (happyIn95 r))
+
+happyReduce_344 = happyMonadReduce 1# 90# happyReduction_344
+happyReduction_344 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (CTokIdent  _ happy_var_1) -> 
+	( withNodeInfo happy_var_1 $ CVar happy_var_1)}
+	) (\r -> happyReturn (happyIn96 r))
+
+happyReduce_345 = happySpecReduce_1  90# happyReduction_345
+happyReduction_345 happy_x_1
+	 =  case happyOut121 happy_x_1 of { happy_var_1 -> 
+	happyIn96
+		 (CConst happy_var_1
+	)}
+
+happyReduce_346 = happySpecReduce_1  90# happyReduction_346
+happyReduction_346 happy_x_1
+	 =  case happyOut122 happy_x_1 of { happy_var_1 -> 
+	happyIn96
+		 (CConst (liftStrLit happy_var_1)
+	)}
+
+happyReduce_347 = happySpecReduce_3  90# happyReduction_347
+happyReduction_347 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut116 happy_x_2 of { happy_var_2 -> 
+	happyIn96
+		 (happy_var_2
+	)}
+
+happyReduce_348 = happyMonadReduce 3# 90# happyReduction_348
+happyReduction_348 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut13 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ CStatExpr happy_var_2)}}
+	) (\r -> happyReturn (happyIn96 r))
+
+happyReduce_349 = happyMonadReduce 6# 90# happyReduction_349
+happyReduction_349 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut114 happy_x_3 of { happy_var_3 -> 
+	case happyOut82 happy_x_5 of { happy_var_5 -> 
+	( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinVaArg happy_var_3 happy_var_5)}}}
+	) (\r -> happyReturn (happyIn96 r))
+
+happyReduce_350 = happyMonadReduce 6# 90# happyReduction_350
+happyReduction_350 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut82 happy_x_3 of { happy_var_3 -> 
+	case happyOut97 happy_x_5 of { happy_var_5 -> 
+	( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinOffsetOf happy_var_3 (reverse happy_var_5))}}}
+	) (\r -> happyReturn (happyIn96 r))
+
+happyReduce_351 = happyMonadReduce 6# 90# happyReduction_351
+happyReduction_351 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut82 happy_x_3 of { happy_var_3 -> 
+	case happyOut82 happy_x_5 of { happy_var_5 -> 
+	( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinTypesCompatible happy_var_3 happy_var_5)}}}
+	) (\r -> happyReturn (happyIn96 r))
+
+happyReduce_352 = happyMonadReduce 1# 91# happyReduction_352
+happyReduction_352 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut124 happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ singleton . CMemberDesig happy_var_1)}
+	) (\r -> happyReturn (happyIn97 r))
+
+happyReduce_353 = happyMonadReduce 3# 91# happyReduction_353
+happyReduction_353 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut97 happy_x_1 of { happy_var_1 -> 
+	case happyOut124 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_3 $ (happy_var_1 `snoc`) . CMemberDesig happy_var_3)}}
+	) (\r -> happyReturn (happyIn97 r))
+
+happyReduce_354 = happyMonadReduce 4# 91# happyReduction_354
+happyReduction_354 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut97 happy_x_1 of { happy_var_1 -> 
+	case happyOut116 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_3 $ (happy_var_1 `snoc`) . CArrDesig happy_var_3)}}
+	) (\r -> happyReturn (happyIn97 r))
+
+happyReduce_355 = happySpecReduce_1  92# happyReduction_355
+happyReduction_355 happy_x_1
+	 =  case happyOut96 happy_x_1 of { happy_var_1 -> 
+	happyIn98
+		 (happy_var_1
+	)}
+
+happyReduce_356 = happyMonadReduce 4# 92# happyReduction_356
+happyReduction_356 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut98 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut116 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ CIndex happy_var_1 happy_var_3)}}}
+	) (\r -> happyReturn (happyIn98 r))
+
+happyReduce_357 = happyMonadReduce 3# 92# happyReduction_357
+happyReduction_357 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut98 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_2 $ CCall happy_var_1 [])}}
+	) (\r -> happyReturn (happyIn98 r))
+
+happyReduce_358 = happyMonadReduce 4# 92# happyReduction_358
+happyReduction_358 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut98 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut99 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ CCall happy_var_1 (reverse happy_var_3))}}}
+	) (\r -> happyReturn (happyIn98 r))
+
+happyReduce_359 = happyMonadReduce 3# 92# happyReduction_359
+happyReduction_359 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut98 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut124 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ CMember happy_var_1 happy_var_3 False)}}}
+	) (\r -> happyReturn (happyIn98 r))
+
+happyReduce_360 = happyMonadReduce 3# 92# happyReduction_360
+happyReduction_360 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut98 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut124 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ CMember happy_var_1 happy_var_3 True)}}}
+	) (\r -> happyReturn (happyIn98 r))
+
+happyReduce_361 = happyMonadReduce 2# 92# happyReduction_361
+happyReduction_361 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut98 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_2 $ CUnary CPostIncOp happy_var_1)}}
+	) (\r -> happyReturn (happyIn98 r))
+
+happyReduce_362 = happyMonadReduce 2# 92# happyReduction_362
+happyReduction_362 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut98 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_2 $ CUnary CPostDecOp happy_var_1)}}
+	) (\r -> happyReturn (happyIn98 r))
+
+happyReduce_363 = happyMonadReduce 6# 92# happyReduction_363
+happyReduction_363 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut82 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_4 of { happy_var_4 -> 
+	case happyOut91 happy_x_5 of { happy_var_5 -> 
+	( withNodeInfo happy_var_4 $ CCompoundLit happy_var_2 (reverse happy_var_5))}}}
+	) (\r -> happyReturn (happyIn98 r))
+
+happyReduce_364 = happyMonadReduce 7# 92# happyReduction_364
+happyReduction_364 (happy_x_7 `HappyStk`
+	happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut82 happy_x_2 of { happy_var_2 -> 
+	case happyOutTok happy_x_4 of { happy_var_4 -> 
+	case happyOut91 happy_x_5 of { happy_var_5 -> 
+	( withNodeInfo happy_var_4 $ CCompoundLit happy_var_2 (reverse happy_var_5))}}}
+	) (\r -> happyReturn (happyIn98 r))
+
+happyReduce_365 = happySpecReduce_1  93# happyReduction_365
+happyReduction_365 happy_x_1
+	 =  case happyOut114 happy_x_1 of { happy_var_1 -> 
+	happyIn99
+		 (singleton happy_var_1
+	)}
+
+happyReduce_366 = happySpecReduce_3  93# happyReduction_366
+happyReduction_366 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut99 happy_x_1 of { happy_var_1 -> 
+	case happyOut114 happy_x_3 of { happy_var_3 -> 
+	happyIn99
+		 (happy_var_1 `snoc` happy_var_3
+	)}}
+
+happyReduce_367 = happySpecReduce_1  94# happyReduction_367
+happyReduction_367 happy_x_1
+	 =  case happyOut98 happy_x_1 of { happy_var_1 -> 
+	happyIn100
+		 (happy_var_1
+	)}
+
+happyReduce_368 = happyMonadReduce 2# 94# happyReduction_368
+happyReduction_368 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut100 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ CUnary CPreIncOp happy_var_2)}}
+	) (\r -> happyReturn (happyIn100 r))
+
+happyReduce_369 = happyMonadReduce 2# 94# happyReduction_369
+happyReduction_369 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut100 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ CUnary CPreDecOp happy_var_2)}}
+	) (\r -> happyReturn (happyIn100 r))
+
+happyReduce_370 = happySpecReduce_2  94# happyReduction_370
+happyReduction_370 happy_x_2
+	happy_x_1
+	 =  case happyOut102 happy_x_2 of { happy_var_2 -> 
+	happyIn100
+		 (happy_var_2
+	)}
+
+happyReduce_371 = happyMonadReduce 2# 94# happyReduction_371
+happyReduction_371 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut101 happy_x_1 of { happy_var_1 -> 
+	case happyOut102 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ CUnary (unL happy_var_1) happy_var_2)}}
+	) (\r -> happyReturn (happyIn100 r))
+
+happyReduce_372 = happyMonadReduce 2# 94# happyReduction_372
+happyReduction_372 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut100 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ CSizeofExpr happy_var_2)}}
+	) (\r -> happyReturn (happyIn100 r))
+
+happyReduce_373 = happyMonadReduce 4# 94# happyReduction_373
+happyReduction_373 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut82 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ CSizeofType happy_var_3)}}
+	) (\r -> happyReturn (happyIn100 r))
+
+happyReduce_374 = happyMonadReduce 2# 94# happyReduction_374
+happyReduction_374 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut100 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ CAlignofExpr happy_var_2)}}
+	) (\r -> happyReturn (happyIn100 r))
+
+happyReduce_375 = happyMonadReduce 4# 94# happyReduction_375
+happyReduction_375 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut82 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ CAlignofType happy_var_3)}}
+	) (\r -> happyReturn (happyIn100 r))
+
+happyReduce_376 = happyMonadReduce 2# 94# happyReduction_376
+happyReduction_376 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut100 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ CComplexReal happy_var_2)}}
+	) (\r -> happyReturn (happyIn100 r))
+
+happyReduce_377 = happyMonadReduce 2# 94# happyReduction_377
+happyReduction_377 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut100 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ CComplexImag happy_var_2)}}
+	) (\r -> happyReturn (happyIn100 r))
+
+happyReduce_378 = happyMonadReduce 2# 94# happyReduction_378
+happyReduction_378 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut124 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ CLabAddrExpr happy_var_2)}}
+	) (\r -> happyReturn (happyIn100 r))
+
+happyReduce_379 = happySpecReduce_1  95# happyReduction_379
+happyReduction_379 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn101
+		 (L CAdrOp  (posOf happy_var_1)
+	)}
+
+happyReduce_380 = happySpecReduce_1  95# happyReduction_380
+happyReduction_380 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn101
+		 (L CIndOp  (posOf happy_var_1)
+	)}
+
+happyReduce_381 = happySpecReduce_1  95# happyReduction_381
+happyReduction_381 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn101
+		 (L CPlusOp (posOf happy_var_1)
+	)}
+
+happyReduce_382 = happySpecReduce_1  95# happyReduction_382
+happyReduction_382 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn101
+		 (L CMinOp  (posOf happy_var_1)
+	)}
+
+happyReduce_383 = happySpecReduce_1  95# happyReduction_383
+happyReduction_383 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn101
+		 (L CCompOp (posOf happy_var_1)
+	)}
+
+happyReduce_384 = happySpecReduce_1  95# happyReduction_384
+happyReduction_384 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn101
+		 (L CNegOp  (posOf happy_var_1)
+	)}
+
+happyReduce_385 = happySpecReduce_1  96# happyReduction_385
+happyReduction_385 happy_x_1
+	 =  case happyOut100 happy_x_1 of { happy_var_1 -> 
+	happyIn102
+		 (happy_var_1
+	)}
+
+happyReduce_386 = happyMonadReduce 4# 96# happyReduction_386
+happyReduction_386 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut82 happy_x_2 of { happy_var_2 -> 
+	case happyOut102 happy_x_4 of { happy_var_4 -> 
+	( withNodeInfo happy_var_1 $ CCast happy_var_2 happy_var_4)}}}
+	) (\r -> happyReturn (happyIn102 r))
+
+happyReduce_387 = happySpecReduce_1  97# happyReduction_387
+happyReduction_387 happy_x_1
+	 =  case happyOut102 happy_x_1 of { happy_var_1 -> 
+	happyIn103
+		 (happy_var_1
+	)}
+
+happyReduce_388 = happyMonadReduce 3# 97# happyReduction_388
+happyReduction_388 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut103 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut102 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ CBinary CMulOp happy_var_1 happy_var_3)}}}
+	) (\r -> happyReturn (happyIn103 r))
+
+happyReduce_389 = happyMonadReduce 3# 97# happyReduction_389
+happyReduction_389 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut103 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut102 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ CBinary CDivOp happy_var_1 happy_var_3)}}}
+	) (\r -> happyReturn (happyIn103 r))
+
+happyReduce_390 = happyMonadReduce 3# 97# happyReduction_390
+happyReduction_390 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut103 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut102 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ CBinary CRmdOp happy_var_1 happy_var_3)}}}
+	) (\r -> happyReturn (happyIn103 r))
+
+happyReduce_391 = happySpecReduce_1  98# happyReduction_391
+happyReduction_391 happy_x_1
+	 =  case happyOut103 happy_x_1 of { happy_var_1 -> 
+	happyIn104
+		 (happy_var_1
+	)}
+
+happyReduce_392 = happyMonadReduce 3# 98# happyReduction_392
+happyReduction_392 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut103 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ CBinary CAddOp happy_var_1 happy_var_3)}}}
+	) (\r -> happyReturn (happyIn104 r))
+
+happyReduce_393 = happyMonadReduce 3# 98# happyReduction_393
+happyReduction_393 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut103 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ CBinary CSubOp happy_var_1 happy_var_3)}}}
+	) (\r -> happyReturn (happyIn104 r))
+
+happyReduce_394 = happySpecReduce_1  99# happyReduction_394
+happyReduction_394 happy_x_1
+	 =  case happyOut104 happy_x_1 of { happy_var_1 -> 
+	happyIn105
+		 (happy_var_1
+	)}
+
+happyReduce_395 = happyMonadReduce 3# 99# happyReduction_395
+happyReduction_395 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut105 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut104 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ CBinary CShlOp happy_var_1 happy_var_3)}}}
+	) (\r -> happyReturn (happyIn105 r))
+
+happyReduce_396 = happyMonadReduce 3# 99# happyReduction_396
+happyReduction_396 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut105 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut104 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ CBinary CShrOp happy_var_1 happy_var_3)}}}
+	) (\r -> happyReturn (happyIn105 r))
+
+happyReduce_397 = happySpecReduce_1  100# happyReduction_397
+happyReduction_397 happy_x_1
+	 =  case happyOut105 happy_x_1 of { happy_var_1 -> 
+	happyIn106
+		 (happy_var_1
+	)}
+
+happyReduce_398 = happyMonadReduce 3# 100# happyReduction_398
+happyReduction_398 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut106 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut105 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ CBinary CLeOp happy_var_1 happy_var_3)}}}
+	) (\r -> happyReturn (happyIn106 r))
+
+happyReduce_399 = happyMonadReduce 3# 100# happyReduction_399
+happyReduction_399 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut106 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut105 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ CBinary CGrOp happy_var_1 happy_var_3)}}}
+	) (\r -> happyReturn (happyIn106 r))
+
+happyReduce_400 = happyMonadReduce 3# 100# happyReduction_400
+happyReduction_400 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut106 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut105 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ CBinary CLeqOp happy_var_1 happy_var_3)}}}
+	) (\r -> happyReturn (happyIn106 r))
+
+happyReduce_401 = happyMonadReduce 3# 100# happyReduction_401
+happyReduction_401 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut106 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut105 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ CBinary CGeqOp happy_var_1 happy_var_3)}}}
+	) (\r -> happyReturn (happyIn106 r))
+
+happyReduce_402 = happySpecReduce_1  101# happyReduction_402
+happyReduction_402 happy_x_1
+	 =  case happyOut106 happy_x_1 of { happy_var_1 -> 
+	happyIn107
+		 (happy_var_1
+	)}
+
+happyReduce_403 = happyMonadReduce 3# 101# happyReduction_403
+happyReduction_403 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut107 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut106 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ CBinary CEqOp  happy_var_1 happy_var_3)}}}
+	) (\r -> happyReturn (happyIn107 r))
+
+happyReduce_404 = happyMonadReduce 3# 101# happyReduction_404
+happyReduction_404 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut107 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut106 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ CBinary CNeqOp happy_var_1 happy_var_3)}}}
+	) (\r -> happyReturn (happyIn107 r))
+
+happyReduce_405 = happySpecReduce_1  102# happyReduction_405
+happyReduction_405 happy_x_1
+	 =  case happyOut107 happy_x_1 of { happy_var_1 -> 
+	happyIn108
+		 (happy_var_1
+	)}
+
+happyReduce_406 = happyMonadReduce 3# 102# happyReduction_406
+happyReduction_406 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut108 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut107 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ CBinary CAndOp happy_var_1 happy_var_3)}}}
+	) (\r -> happyReturn (happyIn108 r))
+
+happyReduce_407 = happySpecReduce_1  103# happyReduction_407
+happyReduction_407 happy_x_1
+	 =  case happyOut108 happy_x_1 of { happy_var_1 -> 
+	happyIn109
+		 (happy_var_1
+	)}
+
+happyReduce_408 = happyMonadReduce 3# 103# happyReduction_408
+happyReduction_408 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut109 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut108 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ CBinary CXorOp happy_var_1 happy_var_3)}}}
+	) (\r -> happyReturn (happyIn109 r))
+
+happyReduce_409 = happySpecReduce_1  104# happyReduction_409
+happyReduction_409 happy_x_1
+	 =  case happyOut109 happy_x_1 of { happy_var_1 -> 
+	happyIn110
+		 (happy_var_1
+	)}
+
+happyReduce_410 = happyMonadReduce 3# 104# happyReduction_410
+happyReduction_410 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut110 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut109 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ CBinary COrOp happy_var_1 happy_var_3)}}}
+	) (\r -> happyReturn (happyIn110 r))
+
+happyReduce_411 = happySpecReduce_1  105# happyReduction_411
+happyReduction_411 happy_x_1
+	 =  case happyOut110 happy_x_1 of { happy_var_1 -> 
+	happyIn111
+		 (happy_var_1
+	)}
+
+happyReduce_412 = happyMonadReduce 3# 105# happyReduction_412
+happyReduction_412 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut111 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut110 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ CBinary CLndOp happy_var_1 happy_var_3)}}}
+	) (\r -> happyReturn (happyIn111 r))
+
+happyReduce_413 = happySpecReduce_1  106# happyReduction_413
+happyReduction_413 happy_x_1
+	 =  case happyOut111 happy_x_1 of { happy_var_1 -> 
+	happyIn112
+		 (happy_var_1
+	)}
+
+happyReduce_414 = happyMonadReduce 3# 106# happyReduction_414
+happyReduction_414 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut112 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut111 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ CBinary CLorOp happy_var_1 happy_var_3)}}}
+	) (\r -> happyReturn (happyIn112 r))
+
+happyReduce_415 = happySpecReduce_1  107# happyReduction_415
+happyReduction_415 happy_x_1
+	 =  case happyOut112 happy_x_1 of { happy_var_1 -> 
+	happyIn113
+		 (happy_var_1
+	)}
+
+happyReduce_416 = happyMonadReduce 5# 107# happyReduction_416
+happyReduction_416 (happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut112 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut116 happy_x_3 of { happy_var_3 -> 
+	case happyOut113 happy_x_5 of { happy_var_5 -> 
+	( withNodeInfo happy_var_2 $ CCond happy_var_1 (Just happy_var_3) happy_var_5)}}}}
+	) (\r -> happyReturn (happyIn113 r))
+
+happyReduce_417 = happyMonadReduce 4# 107# happyReduction_417
+happyReduction_417 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut112 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	case happyOut113 happy_x_4 of { happy_var_4 -> 
+	( withNodeInfo happy_var_2 $ CCond happy_var_1 Nothing happy_var_4)}}}
+	) (\r -> happyReturn (happyIn113 r))
+
+happyReduce_418 = happySpecReduce_1  108# happyReduction_418
+happyReduction_418 happy_x_1
+	 =  case happyOut113 happy_x_1 of { happy_var_1 -> 
+	happyIn114
+		 (happy_var_1
+	)}
+
+happyReduce_419 = happyMonadReduce 3# 108# happyReduction_419
+happyReduction_419 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut100 happy_x_1 of { happy_var_1 -> 
+	case happyOut115 happy_x_2 of { happy_var_2 -> 
+	case happyOut114 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_2 $ CAssign (unL happy_var_2) happy_var_1 happy_var_3)}}}
+	) (\r -> happyReturn (happyIn114 r))
+
+happyReduce_420 = happySpecReduce_1  109# happyReduction_420
+happyReduction_420 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn115
+		 (L CAssignOp (posOf happy_var_1)
+	)}
+
+happyReduce_421 = happySpecReduce_1  109# happyReduction_421
+happyReduction_421 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn115
+		 (L CMulAssOp (posOf happy_var_1)
+	)}
+
+happyReduce_422 = happySpecReduce_1  109# happyReduction_422
+happyReduction_422 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn115
+		 (L CDivAssOp (posOf happy_var_1)
+	)}
+
+happyReduce_423 = happySpecReduce_1  109# happyReduction_423
+happyReduction_423 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn115
+		 (L CRmdAssOp (posOf happy_var_1)
+	)}
+
+happyReduce_424 = happySpecReduce_1  109# happyReduction_424
+happyReduction_424 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn115
+		 (L CAddAssOp (posOf happy_var_1)
+	)}
+
+happyReduce_425 = happySpecReduce_1  109# happyReduction_425
+happyReduction_425 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn115
+		 (L CSubAssOp (posOf happy_var_1)
+	)}
+
+happyReduce_426 = happySpecReduce_1  109# happyReduction_426
+happyReduction_426 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn115
+		 (L CShlAssOp (posOf happy_var_1)
+	)}
+
+happyReduce_427 = happySpecReduce_1  109# happyReduction_427
+happyReduction_427 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn115
+		 (L CShrAssOp (posOf happy_var_1)
+	)}
+
+happyReduce_428 = happySpecReduce_1  109# happyReduction_428
+happyReduction_428 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn115
+		 (L CAndAssOp (posOf happy_var_1)
+	)}
+
+happyReduce_429 = happySpecReduce_1  109# happyReduction_429
+happyReduction_429 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn115
+		 (L CXorAssOp (posOf happy_var_1)
+	)}
+
+happyReduce_430 = happySpecReduce_1  109# happyReduction_430
+happyReduction_430 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn115
+		 (L COrAssOp  (posOf happy_var_1)
+	)}
+
+happyReduce_431 = happySpecReduce_1  110# happyReduction_431
+happyReduction_431 happy_x_1
+	 =  case happyOut114 happy_x_1 of { happy_var_1 -> 
+	happyIn116
+		 (happy_var_1
+	)}
+
+happyReduce_432 = happyMonadReduce 3# 110# happyReduction_432
+happyReduction_432 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOut114 happy_x_1 of { happy_var_1 -> 
+	case happyOut117 happy_x_3 of { happy_var_3 -> 
+	( let es = reverse happy_var_3 in withNodeInfo es $ CComma (happy_var_1:es))}}
+	) (\r -> happyReturn (happyIn116 r))
+
+happyReduce_433 = happySpecReduce_1  111# happyReduction_433
+happyReduction_433 happy_x_1
+	 =  case happyOut114 happy_x_1 of { happy_var_1 -> 
+	happyIn117
+		 (singleton happy_var_1
+	)}
+
+happyReduce_434 = happySpecReduce_3  111# happyReduction_434
+happyReduction_434 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut117 happy_x_1 of { happy_var_1 -> 
+	case happyOut114 happy_x_3 of { happy_var_3 -> 
+	happyIn117
+		 (happy_var_1 `snoc` happy_var_3
+	)}}
+
+happyReduce_435 = happySpecReduce_0  112# happyReduction_435
+happyReduction_435  =  happyIn118
+		 (Nothing
+	)
+
+happyReduce_436 = happySpecReduce_1  112# happyReduction_436
+happyReduction_436 happy_x_1
+	 =  case happyOut116 happy_x_1 of { happy_var_1 -> 
+	happyIn118
+		 (Just happy_var_1
+	)}
+
+happyReduce_437 = happySpecReduce_0  113# happyReduction_437
+happyReduction_437  =  happyIn119
+		 (Nothing
+	)
+
+happyReduce_438 = happySpecReduce_1  113# happyReduction_438
+happyReduction_438 happy_x_1
+	 =  case happyOut114 happy_x_1 of { happy_var_1 -> 
+	happyIn119
+		 (Just happy_var_1
+	)}
+
+happyReduce_439 = happySpecReduce_1  114# happyReduction_439
+happyReduction_439 happy_x_1
+	 =  case happyOut113 happy_x_1 of { happy_var_1 -> 
+	happyIn120
+		 (happy_var_1
+	)}
+
+happyReduce_440 = happyMonadReduce 1# 115# happyReduction_440
+happyReduction_440 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ case happy_var_1 of CTokILit _ i -> CIntConst i)}
+	) (\r -> happyReturn (happyIn121 r))
+
+happyReduce_441 = happyMonadReduce 1# 115# happyReduction_441
+happyReduction_441 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ case happy_var_1 of CTokCLit _ c -> CCharConst c)}
+	) (\r -> happyReturn (happyIn121 r))
+
+happyReduce_442 = happyMonadReduce 1# 115# happyReduction_442
+happyReduction_442 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ case happy_var_1 of CTokFLit _ f -> CFloatConst f)}
+	) (\r -> happyReturn (happyIn121 r))
+
+happyReduce_443 = happyMonadReduce 1# 116# happyReduction_443
+happyReduction_443 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ case happy_var_1 of CTokSLit _ s -> CStrLit s)}
+	) (\r -> happyReturn (happyIn122 r))
+
+happyReduce_444 = happyMonadReduce 2# 116# happyReduction_444
+happyReduction_444 (happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	case happyOut123 happy_x_2 of { happy_var_2 -> 
+	( withNodeInfo happy_var_1 $ case happy_var_1 of CTokSLit _ s -> CStrLit (concatCStrings (s : reverse happy_var_2)))}}
+	) (\r -> happyReturn (happyIn122 r))
+
+happyReduce_445 = happySpecReduce_1  117# happyReduction_445
+happyReduction_445 happy_x_1
+	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
+	happyIn123
+		 (case happy_var_1 of CTokSLit _ s -> singleton s
+	)}
+
+happyReduce_446 = happySpecReduce_2  117# happyReduction_446
+happyReduction_446 happy_x_2
+	happy_x_1
+	 =  case happyOut123 happy_x_1 of { happy_var_1 -> 
+	case happyOutTok happy_x_2 of { happy_var_2 -> 
+	happyIn123
+		 (case happy_var_2 of CTokSLit _ s -> happy_var_1 `snoc` s
+	)}}
+
+happyReduce_447 = happySpecReduce_1  118# happyReduction_447
+happyReduction_447 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (CTokIdent  _ happy_var_1) -> 
+	happyIn124
+		 (happy_var_1
+	)}
+
+happyReduce_448 = happySpecReduce_1  118# happyReduction_448
+happyReduction_448 happy_x_1
+	 =  case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> 
+	happyIn124
+		 (happy_var_1
+	)}
+
+happyReduce_449 = happySpecReduce_0  119# happyReduction_449
+happyReduction_449  =  happyIn125
+		 ([]
+	)
+
+happyReduce_450 = happySpecReduce_1  119# happyReduction_450
+happyReduction_450 happy_x_1
+	 =  case happyOut126 happy_x_1 of { happy_var_1 -> 
+	happyIn125
+		 (happy_var_1
+	)}
+
+happyReduce_451 = happySpecReduce_1  120# happyReduction_451
+happyReduction_451 happy_x_1
+	 =  case happyOut127 happy_x_1 of { happy_var_1 -> 
+	happyIn126
+		 (happy_var_1
+	)}
+
+happyReduce_452 = happySpecReduce_2  120# happyReduction_452
+happyReduction_452 happy_x_2
+	happy_x_1
+	 =  case happyOut126 happy_x_1 of { happy_var_1 -> 
+	case happyOut127 happy_x_2 of { happy_var_2 -> 
+	happyIn126
+		 (happy_var_1 ++ happy_var_2
+	)}}
+
+happyReduce_453 = happyReduce 6# 121# happyReduction_453
+happyReduction_453 (happy_x_6 `HappyStk`
+	happy_x_5 `HappyStk`
+	happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest)
+	 = case happyOut128 happy_x_4 of { happy_var_4 -> 
+	happyIn127
+		 (reverse happy_var_4
+	) `HappyStk` happyRest}
+
+happyReduce_454 = happySpecReduce_1  122# happyReduction_454
+happyReduction_454 happy_x_1
+	 =  case happyOut129 happy_x_1 of { happy_var_1 -> 
+	happyIn128
+		 (case happy_var_1 of Nothing -> empty; Just attr -> singleton attr
+	)}
+
+happyReduce_455 = happySpecReduce_3  122# happyReduction_455
+happyReduction_455 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut128 happy_x_1 of { happy_var_1 -> 
+	case happyOut129 happy_x_3 of { happy_var_3 -> 
+	happyIn128
+		 ((maybe id (flip snoc) happy_var_3) happy_var_1
+	)}}
+
+happyReduce_456 = happySpecReduce_0  123# happyReduction_456
+happyReduction_456  =  happyIn129
+		 (Nothing
+	)
+
+happyReduce_457 = happyMonadReduce 1# 123# happyReduction_457
+happyReduction_457 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (CTokIdent  _ happy_var_1) -> 
+	( withNodeInfo happy_var_1 $ Just . CAttr happy_var_1  [])}
+	) (\r -> happyReturn (happyIn129 r))
+
+happyReduce_458 = happyMonadReduce 1# 123# happyReduction_458
+happyReduction_458 (happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
+	( withNodeInfo happy_var_1 $ Just . CAttr (internalIdent "const") [])}
+	) (\r -> happyReturn (happyIn129 r))
+
+happyReduce_459 = happyMonadReduce 4# 123# happyReduction_459
+happyReduction_459 (happy_x_4 `HappyStk`
+	happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (CTokIdent  _ happy_var_1) -> 
+	case happyOut130 happy_x_3 of { happy_var_3 -> 
+	( withNodeInfo happy_var_1 $ Just . CAttr happy_var_1 (reverse happy_var_3))}}
+	) (\r -> happyReturn (happyIn129 r))
+
+happyReduce_460 = happyMonadReduce 3# 123# happyReduction_460
+happyReduction_460 (happy_x_3 `HappyStk`
+	happy_x_2 `HappyStk`
+	happy_x_1 `HappyStk`
+	happyRest) tk
+	 = happyThen (case happyOutTok happy_x_1 of { (CTokIdent  _ happy_var_1) -> 
+	( withNodeInfo happy_var_1 $ Just . CAttr happy_var_1 [])}
+	) (\r -> happyReturn (happyIn129 r))
+
+happyReduce_461 = happySpecReduce_1  124# happyReduction_461
+happyReduction_461 happy_x_1
+	 =  case happyOut120 happy_x_1 of { happy_var_1 -> 
+	happyIn130
+		 (singleton happy_var_1
+	)}
+
+happyReduce_462 = happySpecReduce_3  124# happyReduction_462
+happyReduction_462 happy_x_3
+	happy_x_2
+	happy_x_1
+	 =  case happyOut130 happy_x_1 of { happy_var_1 -> 
+	case happyOut120 happy_x_3 of { happy_var_3 -> 
+	happyIn130
+		 (happy_var_1 `snoc` happy_var_3
+	)}}
+
+happyNewToken action sts stk
+	= lexC(\tk -> 
+	let cont i = happyDoAction i tk action sts stk in
+	case tk of {
+	CTokEof -> happyDoAction 101# tk action sts stk;
+	CTokLParen	_ -> cont 1#;
+	CTokRParen	_ -> cont 2#;
+	CTokLBracket	_ -> cont 3#;
+	CTokRBracket	_ -> cont 4#;
+	CTokArrow	_ -> cont 5#;
+	CTokDot	_ -> cont 6#;
+	CTokExclam	_ -> cont 7#;
+	CTokTilde	_ -> cont 8#;
+	CTokInc	_ -> cont 9#;
+	CTokDec	_ -> cont 10#;
+	CTokPlus	_ -> cont 11#;
+	CTokMinus	_ -> cont 12#;
+	CTokStar	_ -> cont 13#;
+	CTokSlash	_ -> cont 14#;
+	CTokPercent	_ -> cont 15#;
+	CTokAmper	_ -> cont 16#;
+	CTokShiftL	_ -> cont 17#;
+	CTokShiftR	_ -> cont 18#;
+	CTokLess	_ -> cont 19#;
+	CTokLessEq	_ -> cont 20#;
+	CTokHigh	_ -> cont 21#;
+	CTokHighEq	_ -> cont 22#;
+	CTokEqual	_ -> cont 23#;
+	CTokUnequal	_ -> cont 24#;
+	CTokHat	_ -> cont 25#;
+	CTokBar	_ -> cont 26#;
+	CTokAnd	_ -> cont 27#;
+	CTokOr	_ -> cont 28#;
+	CTokQuest	_ -> cont 29#;
+	CTokColon	_ -> cont 30#;
+	CTokAssign	_ -> cont 31#;
+	CTokPlusAss	_ -> cont 32#;
+	CTokMinusAss	_ -> cont 33#;
+	CTokStarAss	_ -> cont 34#;
+	CTokSlashAss	_ -> cont 35#;
+	CTokPercAss	_ -> cont 36#;
+	CTokAmpAss	_ -> cont 37#;
+	CTokHatAss	_ -> cont 38#;
+	CTokBarAss	_ -> cont 39#;
+	CTokSLAss	_ -> cont 40#;
+	CTokSRAss	_ -> cont 41#;
+	CTokComma	_ -> cont 42#;
+	CTokSemic	_ -> cont 43#;
+	CTokLBrace	_ -> cont 44#;
+	CTokRBrace	_ -> cont 45#;
+	CTokEllipsis	_ -> cont 46#;
+	CTokAlignof	_ -> cont 47#;
+	CTokAsm	_ -> cont 48#;
+	CTokAuto	_ -> cont 49#;
+	CTokBreak	_ -> cont 50#;
+	CTokBool	_ -> cont 51#;
+	CTokCase	_ -> cont 52#;
+	CTokChar	_ -> cont 53#;
+	CTokConst	_ -> cont 54#;
+	CTokContinue	_ -> cont 55#;
+	CTokComplex	_ -> cont 56#;
+	CTokDefault	_ -> cont 57#;
+	CTokDo	_ -> cont 58#;
+	CTokDouble	_ -> cont 59#;
+	CTokElse	_ -> cont 60#;
+	CTokEnum	_ -> cont 61#;
+	CTokExtern	_ -> cont 62#;
+	CTokFloat	_ -> cont 63#;
+	CTokFor	_ -> cont 64#;
+	CTokGoto	_ -> cont 65#;
+	CTokIf	_ -> cont 66#;
+	CTokInline	_ -> cont 67#;
+	CTokInt	_ -> cont 68#;
+	CTokLong	_ -> cont 69#;
+	CTokLabel	_ -> cont 70#;
+	CTokRegister	_ -> cont 71#;
+	CTokRestrict	_ -> cont 72#;
+	CTokReturn	_ -> cont 73#;
+	CTokShort	_ -> cont 74#;
+	CTokSigned	_ -> cont 75#;
+	CTokSizeof	_ -> cont 76#;
+	CTokStatic	_ -> cont 77#;
+	CTokStruct	_ -> cont 78#;
+	CTokSwitch	_ -> cont 79#;
+	CTokTypedef	_ -> cont 80#;
+	CTokTypeof	_ -> cont 81#;
+	CTokThread	_ -> cont 82#;
+	CTokUnion	_ -> cont 83#;
+	CTokUnsigned	_ -> cont 84#;
+	CTokVoid	_ -> cont 85#;
+	CTokVolatile	_ -> cont 86#;
+	CTokWhile	_ -> cont 87#;
+	CTokCLit   _ _ -> cont 88#;
+	CTokILit   _ _ -> cont 89#;
+	CTokFLit   _ _ -> cont 90#;
+	CTokSLit   _ _ -> cont 91#;
+	CTokIdent  _ happy_dollar_dollar -> cont 92#;
+	CTokTyIdent _ happy_dollar_dollar -> cont 93#;
+	CTokGnuC GnuCAttrTok _ -> cont 94#;
+	CTokGnuC GnuCExtTok  _ -> cont 95#;
+	CTokGnuC GnuCComplexReal _ -> cont 96#;
+	CTokGnuC GnuCComplexImag _ -> cont 97#;
+	CTokGnuC GnuCVaArg    _ -> cont 98#;
+	CTokGnuC GnuCOffsetof _ -> cont 99#;
+	CTokGnuC GnuCTyCompat _ -> cont 100#;
+	_ -> happyError' tk
+	})
+
+happyError_ tk = happyError' tk
+
+happyThen :: () => P a -> (a -> P b) -> P b
+happyThen = (>>=)
+happyReturn :: () => a -> P a
+happyReturn = (return)
+happyThen1 = happyThen
+happyReturn1 :: () => a -> P a
+happyReturn1 = happyReturn
+happyError' :: () => CToken -> P a
+happyError' tk = (\token -> happyError) tk
+
+header = happySomeParser where
+  happySomeParser = happyThen (happyParse 0#) (\x -> happyReturn (happyOut6 x))
+
+statement = happySomeParser where
+  happySomeParser = happyThen (happyParse 1#) (\x -> happyReturn (happyOut11 x))
+
+expression = happySomeParser where
+  happySomeParser = happyThen (happyParse 2#) (\x -> happyReturn (happyOut116 x))
+
+happySeq = happyDontSeq
+
+
+--  sometimes it is neccessary to reverse an unreversed list
+reverseList :: [a] -> Reversed [a]
+reverseList = Reversed . List.reverse
+
+-- We occasionally need things to have a location when they don't naturally
+-- have one built in as tokens and most AST elements do.
+--
+data Located a = L !a !Position
+
+unL :: Located a -> a
+unL (L a pos) = a
+
+instance Pos (Located a) where
+  posOf (L _ pos) = pos
+
+{-# INLINE withNodeInfo #-}
+withNodeInfo :: Pos node => node -> (NodeInfo -> a) -> P a
+withNodeInfo node mkAttributedNode = do
+  name <- getNewName
+  let attrs = mkNodeInfo (posOf node) name
+  attrs `seq` return (mkAttributedNode attrs)
+
+data CDeclrR = CDeclrR (Maybe Ident) (Reversed [CDerivedDeclr]) (Maybe CStrLit) [CAttr] NodeInfo
+reverseDeclr :: CDeclrR -> CDeclr
+reverseDeclr (CDeclrR ide reversedDDs asmname cattrs at)
+    = CDeclr ide (reverse reversedDDs) asmname cattrs at
+
+{-# INLINE withAttribute #-}
+withAttribute :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR) -> P CDeclrR
+withAttribute node cattrs mkDeclrNode = do
+  name <- getNewName
+  let attrs = mkNodeInfo (posOf node) name
+  let newDeclr = appendDeclrAttrs cattrs $ mkDeclrNode attrs
+  attrs `seq` newDeclr `seq` return newDeclr
+
+-- postfixing variant
+{-# INLINE withAttributePF #-}
+withAttributePF :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR -> CDeclrR) -> P (CDeclrR -> CDeclrR)
+withAttributePF node cattrs mkDeclrCtor = do
+  name <- getNewName
+  let attrs = mkNodeInfo (posOf node) name
+  let newDeclr = appendDeclrAttrs cattrs . mkDeclrCtor attrs
+  attrs `seq` newDeclr `seq` return newDeclr
+
+-- add top level attributes for a declarator.
+--
+-- In the following example
+--
+-- > int declr1, __attribute__((a1)) * __attribute__((a2)) y() __asm__("$" "y") __attribute__((a3));
+--
+-- the attributes `a1' and `a3' are top-level attributes for y.
+-- The (pseudo)-AST for the second declarator is
+--
+-- > CDeclr "y"
+-- >        [CFunDeclr ..., CPtrDeclr __attribute__((a2)) ... ]
+-- >        (asm "$y")
+-- >        [__attribute__((a1)), __attribute__((a3)) ]
+--
+-- So assembler names and preceeding and trailing attributes are recorded in object declarator.
+--
+appendObjAttrs :: [CAttr] -> CDeclr -> CDeclr
+appendObjAttrs newAttrs (CDeclr ident indirections asmname cAttrs at)
+    = CDeclr ident indirections asmname (cAttrs ++ newAttrs) at
+appendObjAttrsR :: [CAttr] -> CDeclrR -> CDeclrR
+appendObjAttrsR newAttrs (CDeclrR ident indirections asmname cAttrs at)
+    = CDeclrR ident indirections asmname (cAttrs ++ newAttrs) at
+
+setAsmName :: Maybe CStrLit  -> CDeclrR -> P CDeclrR
+setAsmName mAsmName (CDeclrR ident indirections oldName cattrs at) =
+    case combineName mAsmName oldName of
+        Left (n1,n2)       -> failP (posOf n2) ["Duplicate assembler name: ",showName n1,showName n2]
+        Right newName      -> return $ CDeclrR ident indirections newName cattrs at
+  where
+  combineName Nothing Nothing = Right Nothing
+  combineName Nothing oldname@(Just _)  = Right oldname
+  combineName newname@(Just _) Nothing  = Right newname
+  combineName (Just n1) (Just n2) = Left (n1,n2)
+  showName (CStrLit cstr _) = show cstr
+
+withAsmNameAttrs :: (Maybe CStrLit, [CAttr]) -> CDeclrR -> P CDeclrR
+withAsmNameAttrs (mAsmName, newAttrs) declr = setAsmName mAsmName (appendObjAttrsR newAttrs declr)
+
+appendDeclrAttrs :: [CAttr] -> CDeclrR -> CDeclrR
+appendDeclrAttrs newAttrs (CDeclrR ident (Reversed []) asmname cattrs at)
+    = CDeclrR ident empty asmname (cattrs ++ newAttrs) at
+appendDeclrAttrs newAttrs (CDeclrR ident (Reversed (x:xs)) asmname cattrs at)
+    = CDeclrR ident (Reversed (appendAttrs x : xs)) asmname cattrs at where
+    appendAttrs (CPtrDeclr typeQuals at)           = CPtrDeclr (typeQuals ++ map CAttrQual newAttrs) at
+    appendAttrs (CArrDeclr typeQuals arraySize at) = CArrDeclr (typeQuals ++ map CAttrQual newAttrs) arraySize at
+    appendAttrs (CFunDeclr parameters cattrs at)   = CFunDeclr parameters (cattrs ++ newAttrs) at
+
+ptrDeclr :: CDeclrR -> [CTypeQual] -> NodeInfo -> CDeclrR
+ptrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals at
+    = CDeclrR ident (derivedDeclrs `snoc` CPtrDeclr tyquals at) asmname cattrs dat
+funDeclr :: CDeclrR -> (Either [Ident] ([CDecl],Bool)) -> [CAttr] -> NodeInfo -> CDeclrR
+funDeclr (CDeclrR ident derivedDeclrs asmname dcattrs dat) params cattrs at
+    = CDeclrR ident (derivedDeclrs `snoc` CFunDeclr params cattrs at) asmname dcattrs dat
+arrDeclr :: CDeclrR -> [CTypeQual] -> Bool -> Bool -> Maybe CExpr -> NodeInfo -> CDeclrR
+arrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals var_sized static_size size_expr_opt at
+    = arr_sz `seq` ( CDeclrR ident (derivedDeclrs `snoc` CArrDeclr tyquals arr_sz at) asmname cattrs dat )
+    where
+    arr_sz = case size_expr_opt of
+                 Just e  -> CArrSize static_size e
+                 Nothing -> CNoArrSize var_sized
+
+liftTypeQuals :: Reversed [CTypeQual] -> [CDeclSpec]
+liftTypeQuals (Reversed tyqs) = revmap [] tyqs
+  where revmap a []     = a
+        revmap a (x:xs) = revmap (CTypeQual x : a) xs
+
+-- lift CAttrs to DeclSpecs
+--
+liftCAttrs :: [CAttr] -> [CDeclSpec]
+liftCAttrs = map (CTypeQual . CAttrQual)
+
+-- when we parsed (decl_spec_1,...,decl_spec_n,attrs), add the __attributes__s to the declspec list
+-- needs special care when @decl_spec_n@ is a SUE definition
+addTrailingAttrs :: Reversed [CDeclSpec] -> [CAttr] -> Reversed [CDeclSpec]
+addTrailingAttrs declspecs new_attrs =
+    case viewr declspecs of
+        (specs_init, CTypeSpec (CSUType (CStruct tag name (Just def) def_attrs su_node) node))
+            -> (specs_init `snoc` CTypeSpec (CSUType (CStruct tag name (Just def) (def_attrs ++ new_attrs) su_node) node))
+        (specs_init, CTypeSpec (CEnumType (CEnum name (Just def) def_attrs e_node) node))
+            -> (specs_init `snoc` CTypeSpec (CEnumType (CEnum name (Just def) (def_attrs ++ new_attrs) e_node) node))
+        _ -> declspecs `rappend` (liftCAttrs new_attrs)
+
+-- convenient instance, the position of a list of things is the position of
+-- the first thing in the list
+--
+instance Pos a => Pos [a] where
+  posOf (x:_) = posOf x
+
+instance Pos a => Pos (Reversed a) where
+  posOf (Reversed x) = posOf x
+
+emptyDeclr     = CDeclrR Nothing empty Nothing [] (mkNodeInfoOnlyPos nopos)
+mkVarDeclr ident = CDeclrR (Just ident) empty Nothing []
+
+-- Take the identifiers and use them to update the typedef'ed identifier set
+-- if the decl is defining a typedef then we add it to the set,
+-- if it's a var decl then that shadows typedefed identifiers
+--
+doDeclIdent :: [CDeclSpec] -> CDeclrR -> P ()
+doDeclIdent declspecs (CDeclrR mIdent _ _ _ _) =
+  case mIdent of
+    Nothing -> return ()
+    Just ident | any iypedef declspecs -> addTypedef ident
+               | otherwise               -> shadowTypedef ident
+
+  where iypedef (CStorageSpec (CTypedef _)) = True
+        iypedef _                           = False
+
+doFuncParamDeclIdent :: CDeclr -> P ()
+doFuncParamDeclIdent (CDeclr _ (CFunDeclr params _ _ : _) _ _ _) =
+  sequence_
+    [ case getCDeclrIdent declr of
+        Nothing -> return ()
+        Just ident -> shadowTypedef ident
+    | CDecl _ dle _  <- either (const []) fst params
+    , (Just declr, _, _) <- dle ]
+doFuncParamDeclIdent _ = return ()
+
+-- extract all identifiers
+getCDeclrIdent :: CDeclr -> Maybe Ident
+getCDeclrIdent (CDeclr mIdent _ _ _ _) = mIdent
+
+happyError :: P a
+happyError = parseError
+
+-- * public interface
+
+-- | @parseC input initialPos@ parses the given preprocessed C-source input and returns the AST or a list of parse errors.
+parseC :: InputStream -> Position -> Either ParseError CTranslUnit
+parseC input initialPosition =
+  execParser header input initialPosition builtinTypeNames (namesStartingFrom 0)
+{-# LINE 1 "GenericTemplate.hs" #-}
+{-# LINE 1 "<built-in>" #-}
+{-# LINE 1 "<command line>" #-}
+{-# LINE 1 "GenericTemplate.hs" #-}
+-- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp 
+
+{-# LINE 28 "GenericTemplate.hs" #-}
+
+
+data Happy_IntList = HappyCons Int# Happy_IntList
+
+
+
+
+
+{-# LINE 49 "GenericTemplate.hs" #-}
+
+{-# LINE 59 "GenericTemplate.hs" #-}
+
+{-# LINE 68 "GenericTemplate.hs" #-}
+
+infixr 9 `HappyStk`
+data HappyStk a = HappyStk a (HappyStk a)
+
+-----------------------------------------------------------------------------
+-- starting the parse
+
+happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll
+
+-----------------------------------------------------------------------------
+-- Accepting the parse
+
+-- If the current token is 0#, it means we've just accepted a partial
+-- parse (a %partial parser).  We must ignore the saved token on the top of
+-- the stack in this case.
+happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =
+	happyReturn1 ans
+happyAccept j tk st sts (HappyStk ans _) = 
+	(happyTcHack j (happyTcHack st)) (happyReturn1 ans)
+
+-----------------------------------------------------------------------------
+-- Arrays only: do the next action
+
+
+
+happyDoAction i tk st
+	= {- nothing -}
+
+
+	  case action of
+		0#		  -> {- nothing -}
+				     happyFail i tk st
+		-1# 	  -> {- nothing -}
+				     happyAccept i tk st
+		n | (n <# (0# :: Int#)) -> {- nothing -}
+
+				     (happyReduceArr ! rule) i tk st
+				     where rule = (I# ((negateInt# ((n +# (1# :: Int#))))))
+		n		  -> {- nothing -}
+
+
+				     happyShift new_state i tk st
+				     where new_state = (n -# (1# :: Int#))
+   where off    = indexShortOffAddr happyActOffsets st
+	 off_i  = (off +# i)
+	 check  = if (off_i >=# (0# :: Int#))
+			then (indexShortOffAddr happyCheck off_i ==#  i)
+			else False
+ 	 action | check     = indexShortOffAddr happyTable off_i
+		| otherwise = indexShortOffAddr happyDefActions st
+
+{-# LINE 127 "GenericTemplate.hs" #-}
+
+
+indexShortOffAddr (HappyA# arr) off =
+#if __GLASGOW_HASKELL__ > 500
+	narrow16Int# i
+#elif __GLASGOW_HASKELL__ == 500
+	intToInt16# i
+#else
+	(i `iShiftL#` 16#) `iShiftRA#` 16#
+#endif
+  where
+#if __GLASGOW_HASKELL__ >= 503
+	i = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)
+#else
+	i = word2Int# ((high `shiftL#` 8#) `or#` low)
+#endif
+	high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))
+	low  = int2Word# (ord# (indexCharOffAddr# arr off'))
+	off' = off *# 2#
+
+
+
+
+
+data HappyAddr = HappyA# Addr#
+
+
+
+
+-----------------------------------------------------------------------------
+-- HappyState data type (not arrays)
+
+{-# LINE 170 "GenericTemplate.hs" #-}
+
+-----------------------------------------------------------------------------
+-- Shifting a token
+
+happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =
+     let i = (case unsafeCoerce# x of { (I# (i)) -> i }) in
+--     trace "shifting the error token" $
+     happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)
+
+happyShift new_state i tk st sts stk =
+     happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)
+
+-- happyReduce is specialised for the common cases.
+
+happySpecReduce_0 i fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happySpecReduce_0 nt fn j tk st@((action)) sts stk
+     = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)
+
+happySpecReduce_1 i fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')
+     = let r = fn v1 in
+       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
+
+happySpecReduce_2 i fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')
+     = let r = fn v1 v2 in
+       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
+
+happySpecReduce_3 i fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')
+     = let r = fn v1 v2 v3 in
+       happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))
+
+happyReduce k i fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happyReduce k nt fn j tk st sts stk
+     = case happyDrop (k -# (1# :: Int#)) sts of
+	 sts1@((HappyCons (st1@(action)) (_))) ->
+        	let r = fn stk in  -- it doesn't hurt to always seq here...
+       		happyDoSeq r (happyGoto nt j tk st1 sts1 r)
+
+happyMonadReduce k nt fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happyMonadReduce k nt fn j tk st sts stk =
+        happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))
+       where sts1@((HappyCons (st1@(action)) (_))) = happyDrop k (HappyCons (st) (sts))
+             drop_stk = happyDropStk k stk
+
+happyMonad2Reduce k nt fn 0# tk st sts stk
+     = happyFail 0# tk st sts stk
+happyMonad2Reduce k nt fn j tk st sts stk =
+       happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))
+       where sts1@((HappyCons (st1@(action)) (_))) = happyDrop k (HappyCons (st) (sts))
+             drop_stk = happyDropStk k stk
+
+             off    = indexShortOffAddr happyGotoOffsets st1
+             off_i  = (off +# nt)
+             new_state = indexShortOffAddr happyTable off_i
+
+
+
+
+happyDrop 0# l = l
+happyDrop n (HappyCons (_) (t)) = happyDrop (n -# (1# :: Int#)) t
+
+happyDropStk 0# l = l
+happyDropStk n (x `HappyStk` xs) = happyDropStk (n -# (1#::Int#)) xs
+
+-----------------------------------------------------------------------------
+-- Moving to a new state after a reduction
+
+
+happyGoto nt j tk st = 
+   {- nothing -}
+   happyDoAction j tk new_state
+   where off    = indexShortOffAddr happyGotoOffsets st
+	 off_i  = (off +# nt)
+ 	 new_state = indexShortOffAddr happyTable off_i
+
+
+
+
+-----------------------------------------------------------------------------
+-- Error recovery (0# is the error token)
+
+-- parse error if we are in recovery and we fail again
+happyFail  0# tk old_st _ stk =
+--	trace "failing" $ 
+    	happyError_ tk
+
+{-  We don't need state discarding for our restricted implementation of
+    "error".  In fact, it can cause some bogus parses, so I've disabled it
+    for now --SDM
+
+-- discard a state
+happyFail  0# tk old_st (HappyCons ((action)) (sts)) 
+						(saved_tok `HappyStk` _ `HappyStk` stk) =
+--	trace ("discarding state, depth " ++ show (length stk))  $
+	happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))
+-}
+
+-- Enter error recovery: generate an error token,
+--                       save the old token and carry on.
+happyFail  i tk (action) sts stk =
+--      trace "entering error recovery" $
+	happyDoAction 0# tk action sts ( (unsafeCoerce# (I# (i))) `HappyStk` stk)
+
+-- Internal happy errors:
+
+notHappyAtAll = error "Internal Happy error\n"
+
+-----------------------------------------------------------------------------
+-- Hack to get the typechecker to accept our action functions
+
+
+happyTcHack :: Int# -> a -> a
+happyTcHack x y = y
+{-# INLINE happyTcHack #-}
+
+
+-----------------------------------------------------------------------------
+-- Seq-ing.  If the --strict flag is given, then Happy emits 
+--	happySeq = happyDoSeq
+-- otherwise it emits
+-- 	happySeq = happyDontSeq
+
+happyDoSeq, happyDontSeq :: a -> b -> b
+happyDoSeq   a b = a `seq` b
+happyDontSeq a b = b
+
+-----------------------------------------------------------------------------
+-- Don't inline any functions from the template.  GHC has a nasty habit
+-- of deciding to inline happyGoto everywhere, which increases the size of
+-- the generated parser quite a bit.
+
+
+{-# NOINLINE happyDoAction #-}
+{-# NOINLINE happyTable #-}
+{-# NOINLINE happyCheck #-}
+{-# NOINLINE happyActOffsets #-}
+{-# NOINLINE happyGotoOffsets #-}
+{-# NOINLINE happyDefActions #-}
+
+{-# NOINLINE happyShift #-}
+{-# NOINLINE happySpecReduce_0 #-}
+{-# NOINLINE happySpecReduce_1 #-}
+{-# NOINLINE happySpecReduce_2 #-}
+{-# NOINLINE happySpecReduce_3 #-}
+{-# NOINLINE happyReduce #-}
+{-# NOINLINE happyMonadReduce #-}
+{-# NOINLINE happyGoto #-}
+{-# NOINLINE happyFail #-}
+
+-- end of Happy Template.
diff --git a/language-c.cabal b/language-c.cabal
new file mode 100644
--- /dev/null
+++ b/language-c.cabal
@@ -0,0 +1,84 @@
+Name:           language-c
+Version:        0.3.0
+Cabal-Version:  >= 1.2
+Build-Type:     Simple
+License:        BSD3
+License-File:   LICENSE
+Copyright:      LICENSE
+Author:         AUTHORS
+Maintainer:     benedikt.huber@gmail.com
+Stability:      experimental
+Homepage:       http://www.sivity.net/projects/language.c
+Synopsis:       Analysis and generation of C code
+Description:    Language C is a haskell library for the analysis and generation of C code.
+                It features a complete, well tested parser and pretty printer for all of C99 and a large 
+                set of GNU extensions.
+Category:       Language
+
+Extra-Source-Files: src/Language/C/Parser/Lexer.x
+                    src/Language/C/Parser/Parser.y
+Flag splitBase
+    Description: Choose the new smaller, split-up base package.
+Flag useByteStrings
+    Description: Use ByteString as InputStream datatype
+    Default: True
+Library
+    Extensions: CPP, DeriveDataTypeable, PatternGuards, BangPatterns, ExistentialQuantification, GeneralizedNewtypeDeriving, ScopedTypeVariables
+    Build-Depends:  filepath
+
+    if flag(splitBase)
+        Build-Depends: base >= 3, process, directory, array, containers, pretty
+    else
+        Build-Depends: base < 3
+        
+    if flag(useByteStrings)
+        Build-Depends: bytestring >= 0.9.0
+    else
+        cpp-options: -DNO_BYTESTRING
+    Build-Tools:    happy, alex
+
+    Hs-Source-Dirs: src
+    Exposed-Modules:  
+                      -- top-level
+                      Language.C
+                      -- data
+                      Language.C.Data
+                      Language.C.Data.Position
+                      Language.C.Data.Ident
+                      Language.C.Data.Error
+                      Language.C.Data.Name
+                      Language.C.Data.Node
+                      Language.C.Data.InputStream
+                      -- syntax
+                      Language.C.Syntax
+                      Language.C.Syntax.AST
+                      Language.C.Syntax.Constants
+                      Language.C.Syntax.Ops
+                      -- parser
+                      Language.C.Parser
+                      -- pretty printer
+                      Language.C.Pretty
+                      -- system
+                      Language.C.System.Preprocess
+                      Language.C.System.GCC
+                      -- analysis [experimental]
+                      Language.C.Analysis
+                      Language.C.Analysis.SemError
+                      Language.C.Analysis.SemRep              
+                      Language.C.Analysis.DefTable
+                      Language.C.Analysis.TravMonad
+                      Language.C.Analysis.AstAnalysis
+                      Language.C.Analysis.DeclAnalysis
+                      Language.C.Analysis.Debug
+                      -- semrep -> code [alpha]
+                      Language.C.Analysis.Export
+    Other-Modules:    
+                      Language.C.Analysis.NameSpaceMap
+                      Language.C.Data.RList
+                      -- parser implementation
+                      Language.C.Parser.Builtin
+                      Language.C.Parser.Lexer 
+                      Language.C.Parser.ParserMonad 
+                      Language.C.Parser.Tokens 
+                      Language.C.Parser.Parser
+
diff --git a/src/Language/C.hs b/src/Language/C.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C.hs
@@ -0,0 +1,45 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C
+-- Copyright   :  (c) 2008 Benedikt Huber
+--                [1995..2007]
+--                   Manuel M. T. Chakravarty
+--                   Duncan Coutts
+--                   Betram Felgenhauer
+-- License     :  BSD-style
+-- Maintainer  : benedikt.huber@gmail.com
+-- Stability   : experimental
+-- Portability : ghc
+--
+-- Library for analysing and generating C code.
+--
+-- See <http://www.sivity.net/projects/language.c>
+-----------------------------------------------------------------------------
+module Language.C (
+    parseCFile,
+    module Language.C.Data,
+    module Language.C.Syntax,
+    module Language.C.Pretty,
+    module Language.C.Parser,
+)
+where
+import Language.C.Data
+import Language.C.Syntax
+import Language.C.Pretty
+import Language.C.Parser
+import Language.C.System.Preprocess
+
+-- | preprocess and parse a C source file
+--
+--   > Synopsis: parseCFile preprocesssor tmp-dir? cpp-opts file
+--   > Example:  parseCFile (newGCC "gcc") Nothing ["-I/usr/include/gtk-2.0"] my-gtk-exts.c
+parseCFile :: (Preprocessor cpp) => cpp -> (Maybe FilePath) -> [String] -> FilePath -> IO (Either ParseError CTranslUnit)
+parseCFile cpp tmp_dir_opt args input_file = do
+    input_stream <- if not (isPreprocessed input_file)
+                        then  let cpp_args = (rawCppArgs args input_file) { cppTmpDir = tmp_dir_opt }
+                              in  runPreprocessor cpp cpp_args >>= handleCppError
+                        else  readInputStream input_file
+    return$ parseC input_stream (Position input_file 1 1)
+    where
+    handleCppError (Left exitCode) = fail $ "Preprocessor failed with " ++ show exitCode
+    handleCppError (Right ok)      = return ok
diff --git a/src/Language/C/Analysis.hs b/src/Language/C/Analysis.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Analysis.hs
@@ -0,0 +1,70 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Analysis
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  alpha
+-- Portability :  ghc
+--
+-- Analysis of the AST.
+--
+-- Currently, we provide a monad for analysis and analyze declarations and types.
+-- Especially note that there is no direct support for analyzing function bodies and
+-- constant expressions.
+--
+-- /NOTE/ This is an experimental interface, and therefore the API will change in the
+-- future.
+--
+-- DONE:
+--
+--  * Name analysis framework
+--
+--  * File-scope analysis
+--
+--  * Declaration analysis
+--
+-- TODO:
+--
+--  * Type checking expressions
+--
+--  * Constant expression evaluation (CEE)
+--
+--  * Typed representation of attributes (depends on CEE)
+--
+--  * Normalized representation of initializers
+--
+--  * Support for analyzing function bodies (depends on CEE)
+--
+--  * Normalizing expressions and statements
+--
+--  * Formal rules how to link back to the AST using NodeInfo fields
+--
+--  * Typed assembler representation
+
+-----------------------------------------------------------------------------
+module Language.C.Analysis (
+    -- * Semantic representation
+    module Language.C.Analysis.SemRep,
+    -- * Error datatypes for the analysis
+    module Language.C.Analysis.SemError,
+    -- * Traversal monad
+    module Language.C.Analysis.TravMonad,
+    -- * Top level analysis
+    module Language.C.Analysis.AstAnalysis,
+    -- * Analyzing declarations
+    module Language.C.Analysis.DeclAnalysis,
+    -- * Debug print
+    module Language.C.Analysis.Debug,
+)
+where
+import Language.C.Analysis.SemError
+import Language.C.Analysis.SemRep
+
+import Language.C.Analysis.DefTable
+import Language.C.Analysis.TravMonad
+
+import Language.C.Analysis.AstAnalysis
+import Language.C.Analysis.DeclAnalysis
+
+import Language.C.Analysis.Debug
diff --git a/src/Language/C/Analysis/AstAnalysis.hs b/src/Language/C/Analysis/AstAnalysis.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Analysis/AstAnalysis.hs
@@ -0,0 +1,238 @@
+{-# LANGUAGE ScopedTypeVariables, PatternGuards #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Parser.Translation
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  alpha
+-- Portability :  ghc
+--
+-- Analyse the parse tree
+--
+-- Traverses the AST, analyses declarations and invokes handlers.
+-----------------------------------------------------------------------------
+module Language.C.Analysis.AstAnalysis (
+    analyseAST,
+    analyseExt,analyseFunDef,analyseExtDecls,
+)
+where
+import Language.C.Analysis.SemError
+import Language.C.Analysis.SemRep
+import Language.C.Analysis.TravMonad
+import Language.C.Analysis.DefTable
+import Language.C.Analysis.DeclAnalysis
+
+import Language.C.Data
+import Language.C.Syntax
+
+import Control.Monad
+import Prelude hiding (reverse)
+import Data.Foldable (foldrM)
+import Data.List hiding (reverse)
+import Data.Maybe
+import Data.Map (Map)
+import qualified Data.Map as Map
+import Debug.Trace
+
+
+-- * analysis
+
+-- | Analyse the given AST
+--
+-- @analyseAST ast@ results in global declaration dictionaries.
+-- If you want to perform specific actions on declarations or definitions, you may provide
+-- callbacks in the @MonadTrav@ @m@.
+--
+-- Returns the set of global declarations and definitions which where successfully translated.
+-- It is the users responsibility to check whether any hard errors occured (@runTrav@ does this for you).
+analyseAST :: (MonadTrav m) => CTranslUnit -> m GlobalDecls
+analyseAST (CTranslUnit decls _file_node) = do
+    mapRecoverM_ analyseExt decls
+    liftM globalDefs getDefTable
+    where
+    mapRecoverM_ f = mapM_ (handleTravError . f)
+
+-- | Analyse an top-level declaration
+analyseExt :: (MonadTrav m) => CExtDecl -> m ()
+analyseExt (CAsmExt asm)
+    = handleAsmBlock asm
+analyseExt (CFDefExt fundef)
+    = analyseFunDef fundef
+analyseExt (CDeclExt decls)
+    = analyseExtDecls decls
+
+-- | Analyse a function definition
+analyseFunDef :: (MonadTrav m) => CFunDef -> m ()
+analyseFunDef (CFunDef declspecs declr oldstyle_decls stmt node_info) = do
+    -- analyse the declarator
+    var_decl_info <- analyseVarDecl True declspecs declr oldstyle_decls
+    let (VarDeclInfo name is_inline storage_spec attrs ty declr_node) = var_decl_info
+    let ident = identOfVarName name
+    -- compute storage
+    fun_storage <- computeFunDefStorage ident storage_spec
+    let var_decl = VarDecl name (DeclAttrs is_inline fun_storage attrs) ty
+    -- improve incomplete type
+    ty' <- improveFunDefType ty
+    -- callback
+    handleVarDecl (Decl var_decl node_info)
+    -- translate the body
+    stmt' <- analyseFunctionBody var_decl stmt
+    -- define the function
+    handleFunDef ident (FunDef var_decl stmt' node_info)
+    where
+    improveFunDefType (FunctionType (FunTypeIncomplete return_ty attrs)) =
+      return . FunctionType $ FunType return_ty [] False attrs
+    improveFunDefType ty = return $ ty
+
+-- | Analyse a top-level declaration other than a function definition
+analyseExtDecls :: (MonadTrav m) => CDecl -> m ()
+analyseExtDecls decl@(CDecl declspecs declrs node)
+    | (Just declspecs') <- hasTypeDef declspecs =
+        case declrs of
+            [(Just tydeclr,Nothing,Nothing)] -> analyseTypeDef declspecs' tydeclr node
+            _ -> astError node "bad typdef declaration: declarator missing or bitfieldsize/initializer present"
+    | null declrs = analyseTypeDecl decl >> return ()
+    | otherwise   = mapM_ (uncurry convertVarDeclr) $ zip (True : repeat False) declrs
+    where
+    convertVarDeclr handle_sue_def (Just declr, init_opt, Nothing) = do
+        -- analyse the declarator
+        vardeclInfo@(VarDeclInfo _ _ _ _ typ _) <- analyseVarDecl handle_sue_def declspecs declr []
+        -- declare / define the object
+        init_opt' <- mapMaybeM init_opt tInit
+        when (isTypeOfExpr typ) $ astError node "we cannot analyse typeof(expr) yet"
+        if (isFunctionType typ)
+            then extFunProto vardeclInfo
+            else extVarDecl vardeclInfo init_opt'
+    convertVarDeclr _ (Nothing,_,_)         = astError node "abstract declarator in object declaration"
+    convertVarDeclr _ (_,_,Just bitfieldSz) = astError node "bitfield size in object declaration"
+    isTypeOfExpr (TypeOfExpr _) = True
+    isTypeOfExpr _ = False
+
+-- | Analyse a typedef
+analyseTypeDef :: (MonadTrav m) => [CDeclSpec] -> CDeclr -> NodeInfo -> m ()
+analyseTypeDef declspecs declr node_info = do
+    -- analyse the declarator
+    (VarDeclInfo name is_inline storage_spec attrs ty declr_node) <- analyseVarDecl True declspecs declr []
+    checkValidTypeDef is_inline storage_spec attrs
+    let ident = identOfVarName name
+    handleTypeDef (TypeDef ident ty attrs node_info)
+    where
+    checkValidTypeDef True _ _ = astError node_info "inline specifier for typeDef"
+    checkValidTypeDef _ NoStorageSpec _ = return ()
+    checkValidTypeDef _ bad_storage _ = astError node_info $ "storage specified for typeDef: " ++ show bad_storage
+
+-- | Analyse declarators
+analyseVarDecl :: (MonadTrav m) => Bool -> [CDeclSpec] -> CDeclr -> [CDecl] -> m VarDeclInfo
+analyseVarDecl handle_sue_def declspecs declr oldstyle_params = do
+    let (storagespecs, decl_attrs, typequals, typespecs, inline) = partitionDeclSpecs declspecs
+    -- analyse the storage specifiers
+    storage_spec  <- canonicalStorageSpec storagespecs
+    -- translate the type into semantic representation
+    typ          <- tType handle_sue_def node typequals typespecs derived_declrs oldstyle_params
+    -- translate attributes
+    attrs'       <- mapM tAttr (decl_attrs ++ declr_attrs)
+    -- create the variable name
+    name         <- mkVarName node nameOpt asmname_opt
+    return $ VarDeclInfo name inline storage_spec attrs' typ node
+    where
+    (CDeclr nameOpt derived_declrs asmname_opt declr_attrs node) = declr
+    isInlineSpec (CInlineQual _) = True
+    isInlineSpec _ = False
+
+-- | compute storage of a function definition
+--
+-- a function definition has static storage with internal linkage if specified `static`,
+-- the previously declared linkage if any if 'extern' or no specifier are present. (See C99 6.2.2, clause 5)
+--
+-- This function won't raise an Trav error if the declaration is incompatible with the existing one,
+-- this case is handled in 'handleFunDef'.
+computeFunDefStorage :: (MonadTrav m) => Ident -> StorageSpec -> m Storage
+computeFunDefStorage _ (StaticSpec b)  = return$ FunLinkage InternalLinkage
+computeFunDefStorage ident other_spec  = do
+  obj_opt <- lookupObject ident
+  let defaultSpec = FunLinkage ExternalLinkage
+  case other_spec of
+    NoStorageSpec  -> return$ maybe defaultSpec declStorage obj_opt
+    (ExternSpec False) -> return$ maybe defaultSpec declStorage obj_opt
+    bad_spec -> throwTravError $ badSpecifierError (nodeInfo ident)
+                  $ "unexpected function storage specifier (only static or extern is allowed)" ++ show bad_spec
+
+-- | handle a function prototype
+extFunProto :: (MonadTrav m) => VarDeclInfo -> m ()
+extFunProto (VarDeclInfo var_name is_inline storage_spec attrs ty node_info) =
+    do  old_fun <- lookupObject (identOfVarName var_name)
+        checkValidSpecs
+        let decl = VarDecl var_name (DeclAttrs is_inline (funDeclLinkage old_fun) attrs) ty
+        handleVarDecl (Decl decl node_info)
+    where
+    funDeclLinkage old_fun =
+        case storage_spec of
+            NoStorageSpec    -> FunLinkage ExternalLinkage -- prototype declaration / external linkage
+            StaticSpec False -> FunLinkage InternalLinkage -- prototype declaration / internal linkage
+            ExternSpec False -> case old_fun of
+                                    Nothing -> FunLinkage ExternalLinkage
+                                    Just f  -> declStorage f
+            _ -> error $ "funDeclLinkage: " ++ show storage_spec
+    checkValidSpecs
+        | hasThreadLocalSpec storage_spec = astError node_info "thread local storage specified for function"
+        | RegSpec <- storage_spec        = astError node_info "invalid `register' storage specified for function"
+        | otherwise                      = return ()
+
+-- | handle a object declaration \/ definition
+--
+-- We have to check the storage specifiers here, as they determine wheter we're dealing with decalartions
+-- or definitions
+-- see [doc\/ExternalDefinitions.txt]
+extVarDecl :: (MonadTrav m) => VarDeclInfo -> (Maybe Initializer) -> m ()
+extVarDecl (VarDeclInfo var_name is_inline storage_spec attrs typ node_info) init_opt =
+    do let ident = identOfVarName var_name
+       old_decl <- lookupObject ident
+       checkValidVarDeclStorage
+       let vardecl linkage = VarDecl var_name (DeclAttrs is_inline linkage attrs) typ
+       let decl linkage = Decl (vardecl linkage) node_info
+       case storage_spec of
+           NoStorageSpec           -- tentative if there is no initializer, external
+               -> handleObjectDef ident $ ObjDef (vardecl (Static ExternalLinkage False)) init_opt node_info
+           StaticSpec thread_local -- tentative if there is no initializer, internal
+               -> handleObjectDef ident $ ObjDef (vardecl (Static InternalLinkage thread_local)) init_opt node_info
+           ExternSpec thread_local
+             | Nothing <- init_opt  -- declaration with either external or old storage
+               -> handleVarDecl $ decl $ maybe (Static ExternalLinkage thread_local) declStorage old_decl
+             | otherwise            -- warning, external definition
+               -> do warn $ badSpecifierError node_info
+                            "Both initializer and `extern` specifier given - treating as definition"
+                     handleObjectDef ident $ ObjDef (vardecl (Static ExternalLinkage thread_local)) init_opt node_info
+           _ -> error$ "extVarDecl: storage_spec: "++show storage_spec
+    where
+    checkValidVarDeclStorage
+        | is_inline               = astError node_info "invalide `inline' specifier for non-function"
+        | RegSpec <- storage_spec = astError node_info "invalid `register' storage specified for external object"
+        | otherwise               = return ()
+
+-- | /TODO/: Bogus
+analyseFunctionBody :: (MonadTrav m) => VarDecl -> CStat -> m Stmt
+analyseFunctionBody _ = return
+
+-- | /TODO/: Bogus
+tStmt :: (MonadTrav m) => CStat -> m Stmt
+tStmt = return
+
+-- | /TODO/: Bogus
+tExpr :: (MonadTrav m) => CExpr -> m Expr
+tExpr = return
+
+-- | /TODO/: Bogus
+tInit :: (MonadTrav m) => CInit -> m Initializer
+tInit = return
+
+
+-- return @Just declspecs@ without @CTypedef@ if the declaration specifier contain @typedef@
+hasTypeDef :: [CDeclSpec] -> Maybe [CDeclSpec]
+hasTypeDef declspecs =
+    case foldr hasTypeDefSpec (False,[]) declspecs of
+        (True,specs') -> Just specs'
+        (False,_)     -> Nothing
+    where
+    hasTypeDefSpec (CStorageSpec (CTypedef n)) (_,specs) = (True, specs)
+    hasTypeDefSpec spec (b,specs) = (b,spec:specs)
diff --git a/src/Language/C/Analysis/Debug.hs b/src/Language/C/Analysis/Debug.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Analysis/Debug.hs
@@ -0,0 +1,163 @@
+{-# LANGUAGE FlexibleInstances, TypeSynonymInstances #-}
+{-# OPTIONS -fno-warn-orphans #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Analysis.Debug
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  prototype
+-- Portability :  ghc
+--
+-- Pretty printing the semantic analysis representation.
+-- This is currently only intended for debugging purposes.
+-----------------------------------------------------------------------------
+module Language.C.Analysis.Debug (
+globalDeclStats,
+prettyAssocs, prettyAssocsWith,
+-- and many pretty instances
+)
+where
+import Language.C.Analysis.SemRep
+import Language.C.Analysis.Export
+
+import Language.C.Data
+import Language.C.Pretty
+import Language.C.Syntax
+
+import Data.Generics
+import Text.PrettyPrint.HughesPJ
+import Data.Map (Map) ; import qualified Data.Map as Map
+
+prettyAssocs :: (Pretty k, Pretty v) => String -> [(k,v)] -> Doc
+prettyAssocs label = prettyAssocsWith label pretty pretty
+prettyAssocsWith :: String -> (k -> Doc) -> (v -> Doc) -> [(k,v)] -> Doc
+prettyAssocsWith label prettyKey prettyVal theMap =
+    text label $$ (nest 8) (vcat $ map prettyEntry theMap)
+    where
+    prettyEntry (k,v) = prettyKey k <+> text " ~> " <+> prettyVal v
+
+instance Pretty GlobalDecls where
+    pretty gd = text "Global Declarations" $$ (nest 4 $ vcat declMaps)
+        where
+        declMaps = [ prettyMap "enumerators" theEnums, prettyMap "declarations" theDecls,
+                     prettyMap "objects" theObjs,  prettyMap "functions" theFuns,
+                     prettyMap "tags"    $ gTags gd,  prettyMap "typeDefs"  $ gTypeDefs gd ]
+        prettyMap :: (Pretty t, Pretty k) => String -> Map k t -> Doc
+        prettyMap label = prettyAssocs label . Map.assocs
+        (theDecls, (theEnums, theObjs, theFuns)) = splitIdentDecls False (gObjs gd)
+
+globalDeclStats :: (FilePath -> Bool) -> GlobalDecls -> [(String,Int)]
+globalDeclStats file_filter gmap =
+    [ ("Enumeration Constants",Map.size enumerators),
+      ("Total Object/Function Declarations",Map.size all_decls),
+      ("Object definitions", Map.size objDefs),
+      ("Function Definitions", Map.size funDefs),
+      ("Tag definitions", Map.size tagDefs),
+      ("TypeDefs", Map.size typeDefs)
+    ]
+    where
+    gmap' = filterGlobalDecls filterFile gmap
+    (all_decls,(enumerators,objDefs,funDefs)) = splitIdentDecls True (gObjs gmap')
+    (tagDefs,typeDefs) = (gTags gmap', gTypeDefs gmap')
+    filterFile :: (CNode n) => n -> Bool
+    filterFile = file_filter . posFile . posOfNode . nodeInfo
+
+
+instance Pretty (Either VarDecl ObjDef) where
+    pretty = either pretty pretty
+instance Pretty (Either VarDecl FunDef) where
+    pretty = either pretty pretty
+instance Pretty Ident where
+    pretty = text . identToString
+instance Pretty SUERef where
+    pretty ref = text (show ref)
+instance Pretty TagDef where
+    pretty (CompDef compty) = pretty compty
+    pretty (EnumDef enumty) = pretty enumty
+instance Pretty IdentDecl where
+    pretty (Declaration decl) = pretty decl
+    pretty (ObjectDef odef) = pretty odef
+    pretty (FunctionDef fdef) = pretty fdef
+    pretty (EnumeratorDef enumerator) = pretty enumerator
+instance Pretty Decl where
+    pretty (Decl vardecl _) =
+        text "declaration" <+>
+        pretty vardecl
+instance Pretty TypeDef where
+    pretty (TypeDef ident ty attrs _) =
+        text "typedef" <+> pretty ident <+> text "as"  <+>
+        pretty attrs <+> pretty ty
+instance Pretty ObjDef where
+    pretty (ObjDef vardecl init_opt _) =
+        text "object" <+>
+        pretty vardecl <+> maybe empty (((text "=") <+>) . pretty) init_opt
+instance Pretty FunDef where
+    pretty (FunDef vardecl _stmt _) =
+        text "function" <+>
+        pretty vardecl
+instance Pretty VarDecl where
+    pretty (VarDecl name attrs ty) =
+        ((hsep . punctuate (text " |")) [pretty name, pretty attrs, pretty ty])
+instance Pretty ParamDecl where
+    pretty (ParamDecl (VarDecl name declattrs ty) _) =
+        pretty declattrs <+> pretty name <+> text "::" <+> pretty ty
+instance Pretty DeclAttrs where
+    pretty (DeclAttrs inline storage attrs) =
+        (if inline then (text "inline") else empty) <+>
+        (hsep $ [ pretty storage, pretty attrs])
+instance Pretty Type where
+  pretty ty = pretty (exportTypeDecl ty)
+instance Pretty TypeQuals where
+    pretty tyQuals = hsep $ map showAttr [ ("const",constant),("volatile",volatile),("restrict",restrict) ]
+        where showAttr (str,select) | select tyQuals = text str
+                                    | otherwise      = empty
+
+instance Pretty CompType where
+    pretty (CompType sue_ref tag members attrs node) =
+        (text.show) tag <+> pretty sue_ref <+>
+        braces (terminateSemi members) <+>
+        pretty attrs
+instance Pretty MemberDecl where
+    pretty (MemberDecl (VarDecl name declattrs ty) bitfield _) =
+        pretty declattrs <+> pretty name <+> text "::" <+> pretty ty <+>
+        (maybe empty (\bf -> text ":" <+> pretty bf) bitfield)
+    pretty (AnonBitField ty bitfield_sz _) =
+        pretty ty <+> text ":" <+> pretty bitfield_sz
+
+instance Pretty EnumType where
+    pretty (EnumType sue_ref enumerators attrs _) =
+      text "enum" <+> pretty sue_ref <+> braces (terminateSemi_ $ map prettyEnr enumerators) <+> pretty attrs
+      where
+      prettyEnr (Enumerator ident expr enumty _) = pretty ident <+> text " = " <+> pretty expr
+
+instance Pretty Enumerator where
+    pretty (Enumerator ident expr enumty _) = text "<" <> text "econst" <+> pretty (sueRef enumty) <> text ">" <+>
+                                              pretty ident <+> text " = " <+> pretty expr
+
+instance Pretty Storage where
+    pretty NoStorage = empty
+    pretty (Auto reg) = text$ if reg then "auto/register" else "auto"
+    pretty (Static linkage thread_local) =
+        (hcat . punctuate (text "/") $ [ text "static",pretty linkage ])
+        <+> (if thread_local then text ", __thread" else empty)
+    pretty (FunLinkage linkage) = text "function/" <> pretty linkage
+instance Pretty Linkage where
+    pretty InternalLinkage = text "internal"
+    pretty ExternalLinkage = text "external"
+instance Pretty VarName where
+    pretty NoName = text "<anonymous>"
+    pretty (VarName ident asmname_opt) = pretty ident <+> (maybe empty pAsmName asmname_opt)
+        where pAsmName asmname = text "" <+> parens (text "asmname" <+> pretty asmname)
+instance Pretty Attributes where
+    pretty = joinComma
+instance Pretty Attr where
+    pretty (Attr ident es _) = pretty ident <+> (if null es then empty else text "(...)")
+
+joinComma :: (Pretty a) => [a] -> Doc
+joinComma = hsep . punctuate comma . map pretty
+terminateSemi :: (Pretty a) => [a] -> Doc
+terminateSemi = terminateSemi_ . map pretty
+terminateSemi_ :: [Doc] -> Doc
+terminateSemi_ = hsep . map (<> semi)
+
diff --git a/src/Language/C/Analysis/DeclAnalysis.hs b/src/Language/C/Analysis/DeclAnalysis.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Analysis/DeclAnalysis.hs
@@ -0,0 +1,514 @@
+{-# LANGUAGE PatternGuards #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Analysis.DeclAnalysis
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  alpha
+-- Portability :  ghc
+--
+-- This module performs the analysis of declarations and the translation of
+-- type specifications in the AST.
+-----------------------------------------------------------------------------
+module Language.C.Analysis.DeclAnalysis (
+  -- * Translating types
+  analyseTypeDecl,
+  tType,tDirectType,tNumType,tArraySize,tTypeQuals,
+  mergeOldStyle,
+  -- * Dissecting type specs
+  canonicalTypeSpec, NumBaseType(..),SignSpec(..),SizeMod(..),NumTypeSpec(..),TypeSpecAnalysis(..),
+  canonicalStorageSpec, StorageSpec(..),hasThreadLocalSpec,
+  -- * Helpers
+  VarDeclInfo(..),
+  tAttr,mkVarName,getOnlyDeclr,nameOfDecl,
+)
+where
+import Language.C.Data.Error
+import Language.C.Data.Node
+import Language.C.Data.Ident
+import Language.C.Syntax
+import Language.C.Analysis.DefTable (TagFwdDecl(..))
+import Language.C.Analysis.SemError
+import Language.C.Analysis.SemRep
+import Language.C.Analysis.TravMonad
+
+import Data.Foldable as F (foldrM)
+import qualified Data.Traversable as T
+import Control.Monad (liftM,when,ap)
+import Data.List (intersperse, mapAccumL)
+import Data.Map (Map)
+import qualified Data.Map as Map
+
+
+-- * handling declarations
+
+-- | analyse and translate a parameter declaration
+-- Should be called in either prototype or block scope
+tParamDecl :: (MonadTrav m) => CDecl -> m ParamDecl
+tParamDecl (CDecl declspecs declrs node) =
+  do declr <- getParamDeclr
+     -- analyse the variable declaration
+     (VarDeclInfo name is_inline storage_spec attrs ty declr_node) <- analyseVarDecl True declspecs declr [] Nothing
+     when (is_inline) $ throwTravError (badSpecifierError node "parameter declaration with inline specifier")
+     -- compute storage of parameter (NoStorage, but might have a register specifier)
+     storage <- throwOnLeft $ computeParamStorage node storage_spec
+     let paramDecl = mkParamDecl name storage attrs ty declr_node
+     handleParamDecl paramDecl
+     return $ paramDecl
+  where
+  getParamDeclr =
+      case declrs of
+          [] -> return (emptyDeclr node)
+          [(Just declr,Nothing,Nothing)] -> return declr
+          _ -> astError node "bad parameter declaration: multiple decls / bitfield or initializer present"
+  mkParamDecl name storage attrs ty declr_node =
+    let vd = VarDecl name (DeclAttrs False storage attrs) ty in
+    case name of
+      NoName -> AbstractParamDecl vd declr_node
+      _ -> ParamDecl vd declr_node
+-- | a parameter declaration has no linkage and either auto or register storage
+computeParamStorage :: NodeInfo -> StorageSpec -> Either BadSpecifierError Storage
+computeParamStorage _ NoStorageSpec = Right (Auto False)
+computeParamStorage _ RegSpec       = Right (Auto True)
+computeParamStorage node spec       = Left . badSpecifierError node $ "Bad storage specified for parameter: " ++ show spec
+
+-- | analyse and translate a member declaration
+tMemberDecls :: (MonadTrav m) => CDecl -> m [MemberDecl]
+tMemberDecls (CDecl declspecs declrs node) = mapM (uncurry tMemberDecl) (zip (True:repeat False) declrs)
+    where
+    tMemberDecl handle_sue_def (Just member_declr,Nothing,bit_field_size_opt) =
+        do var_decl <- analyseVarDecl handle_sue_def declspecs member_declr [] Nothing
+           let (VarDeclInfo name is_inline storage_spec attrs ty declr_node) = var_decl
+           --
+           checkValidMemberSpec is_inline storage_spec
+           return $ MemberDecl (VarDecl name (DeclAttrs False NoStorage attrs) ty) bit_field_size_opt node
+    tMemberDecl handle_sue_def (Nothing,Nothing,Just bit_field_size) =
+        do let (storage_specs, _attrs, typequals, typespecs, is_inline) = partitionDeclSpecs declspecs
+           storage_spec  <- canonicalStorageSpec storage_specs
+           typ           <- tType handle_sue_def node typequals typespecs [] []
+           --
+           return $ AnonBitField typ bit_field_size node
+    tMemberDecl _ _ = astError node "Bad member declaration"
+    checkValidMemberSpec is_inline storage_spec =
+        do  when (is_inline)                     $ astError node "member declaration with inline specifier"
+            when (storage_spec /= NoStorageSpec) $ astError node "storage specifier for member"
+            return ()
+
+data StorageSpec = NoStorageSpec | AutoSpec | RegSpec | ThreadSpec | StaticSpec Bool | ExternSpec Bool
+                    deriving (Eq,Ord,Show,Read)
+
+hasThreadLocalSpec :: StorageSpec -> Bool
+hasThreadLocalSpec ThreadSpec = True
+hasThreadLocalSpec (StaticSpec b) = b
+hasThreadLocalSpec (ExternSpec b) = b
+hasThreadLocalSpec _  = False
+
+data VarDeclInfo = VarDeclInfo VarName Bool {- is-inline? -} StorageSpec Attributes Type NodeInfo
+
+-- | analyse declarators
+analyseVarDecl :: (MonadTrav m) => Bool -> [CDeclSpec] -> CDeclr -> [CDecl] -> (Maybe CInit) -> m VarDeclInfo
+analyseVarDecl handle_sue_def declspecs
+               (CDeclr name_opt derived_declrs asmname_opt declr_attrs node)
+               oldstyle_params init_opt
+    = do let (storage_specs, decl_attrs, typequals, typespecs, inline) = partitionDeclSpecs declspecs
+         -- analyse the storage specifiers
+         storage_spec  <- canonicalStorageSpec storage_specs
+         -- translate the type into semantic representation
+         typ          <- tType handle_sue_def node typequals typespecs derived_declrs oldstyle_params
+         -- translate attributes
+         attrs'       <- mapM tAttr (decl_attrs ++ declr_attrs)
+         -- make name
+         name         <- mkVarName node name_opt asmname_opt
+         return $ VarDeclInfo name inline storage_spec attrs' typ node
+    where
+        isInlineSpec (CInlineQual _) = True
+        isInlineSpec _ = False
+
+
+-- return @True@ if the declarations is a type def
+isTypeDef :: [CDeclSpec] -> Bool
+isTypeDef declspecs = not $ null [ n | (CStorageSpec (CTypedef n)) <- declspecs ]
+
+
+-- * translation
+
+-- | get the type of a /type declaration/
+--
+-- A type declaration @T@ may appear in thre forms:
+--
+--  * @typeof(T)@
+--
+--  * as abstract declarator in a function prototype, as in @f(int)@
+--
+--  * in a declaration without declarators, as in @struct x { int a } ;@
+--
+-- Currently, @analyseTypeDecl@ is exlusively used for analysing types for GNU's @typeof(T)@.
+--
+-- We move attributes to the type, as they have no meaning for the abstract declarator
+analyseTypeDecl :: (MonadTrav m) => CDecl -> m Type
+analyseTypeDecl (CDecl declspecs declrs node)
+    | [] <- declrs = analyseTyDeclr (emptyDeclr node)
+    | [(Just declr,Nothing,Nothing)] <- declrs = analyseTyDeclr declr
+    | otherwise = astError node "Bad declarator for type declaration"
+    where
+    analyseTyDeclr (CDeclr Nothing derived_declrs Nothing attrs _declrnode)
+        | (not (null storagespec) || inline) = astError node "storage specifier for type declaration"
+        | otherwise                          = tType True node (map CAttrQual (attrs++attrs_decl) ++ typequals)
+                                                     typespecs derived_declrs []
+        where
+        (storagespec, attrs_decl, typequals, typespecs, inline) = partitionDeclSpecs declspecs
+    analyseTyDeclr _ = astError node "Non-abstract declarator in type declaration"
+
+
+-- | translate a type
+tType :: (MonadTrav m) => Bool -> NodeInfo -> [CTypeQual] -> [CTypeSpec] -> [CDerivedDeclr] -> [CDecl] -> m Type
+tType handle_sue_def top_node typequals typespecs derived_declrs oldstyle_params
+    = mergeOldStyle top_node oldstyle_params derived_declrs >>= buildType
+    where
+    buildType [] = tDirectType handle_sue_def top_node typequals typespecs
+    buildType (CPtrDeclr ptrquals node : dds) =
+        buildType dds >>= buildPointerType ptrquals node
+    buildType (CArrDeclr arrquals size node : dds)
+        = buildType dds >>= buildArrayType arrquals size node
+    buildType (CFunDeclr ~(Right (params, isVariadic)) attrs node : dds)
+        = buildType dds >>= (liftM FunctionType . buildFunctionType params isVariadic attrs node)
+    buildPointerType ptrquals _node inner_ty
+        = liftM (\(quals,attrs) -> PtrType inner_ty quals attrs) (tTypeQuals ptrquals)
+    buildArrayType arr_quals size _node inner_ty
+        = do (quals,attrs) <- tTypeQuals arr_quals
+             arr_sz        <- tArraySize size
+             return$ ArrayType inner_ty arr_sz quals attrs
+    -- We build functions in function prototype scope.
+    -- When analyzing the  the function body, we push parameters in function body scope.
+    buildFunctionType params is_variadic attrs _node return_ty
+        = do enterPrototypeScope
+             params' <- mapM tParamDecl params
+             leavePrototypeScope
+             attrs'   <- mapM tAttr attrs
+             return $ case (map declType params',is_variadic) of
+               ([],False) -> FunTypeIncomplete return_ty attrs'  -- may be improved later on
+               ([DirectType TyVoid _],False) -> FunType return_ty [] False attrs'
+               _ -> FunType return_ty params' is_variadic attrs'
+
+-- | translate a type without (syntactic) indirections
+-- Due to the GNU @typeof@ extension and typeDefs, this can be an arbitrary type
+tDirectType :: (MonadTrav m) => Bool -> NodeInfo -> [CTypeQual] -> [CTypeSpec] -> m Type
+tDirectType handle_sue_def node ty_quals ty_specs = do
+    (quals,attrs) <- tTypeQuals ty_quals
+    canonTySpec <- canonicalTypeSpec ty_specs
+    let baseType ty_name = DirectType ty_name quals
+    case canonTySpec of
+        TSNone -> return$ baseType (TyIntegral TyInt)
+        TSVoid -> return$ baseType TyVoid
+        TSBool -> return$ baseType (TyIntegral TyBool)
+        TSNum tsnum -> do
+            numType <- tNumType tsnum
+            return . baseType $
+                case numType of
+                    Left (floatType,iscomplex) | iscomplex -> TyComplex floatType
+                                               | otherwise -> TyFloating floatType
+                    Right intType  -> TyIntegral intType
+        TSNonBasic (CSUType su _tnode)      -> liftM (baseType . TyComp) $ tCompTypeDecl handle_sue_def su
+        TSNonBasic (CEnumType enum _tnode)   -> liftM (baseType . TyEnum) $ tEnumTypeDecl handle_sue_def enum
+        TSNonBasic (CTypeDef name t_node)    -> liftM TypeDefType $ typeDefRef t_node name
+        -- TODO: analyse type of expression
+        TSNonBasic (CTypeOfExpr expr _tnode) -> return $ TypeOfExpr expr
+        TSNonBasic (CTypeOfType decl t_node) ->  analyseTypeDecl decl >>= mergeTypeAttributes t_node quals attrs
+        TSNonBasic _ -> astError node "Unexpected typespec"
+
+-- | Merge type attributes
+--
+-- This handles for example the form
+--
+-- > /* tyqual attr typeof(type) */
+-- > const typeof(char volatile) x;
+mergeTypeAttributes :: (MonadTrav m) => NodeInfo -> TypeQuals -> [Attr] -> Type -> m Type
+mergeTypeAttributes node_info quals attrs typ =
+    case typ of
+        DirectType ty_name quals' -> merge quals' [] $ mkDirect ty_name
+        PtrType ty quals' attrs'  -> merge quals' attrs' $ PtrType ty
+        ArrayType ty array_sz quals' attrs' -> merge quals' attrs' $ ArrayType ty array_sz
+        FunctionType (FunType return_ty params inline attrs')
+            | not (null attrs) -> astError node_info "type qualifiers for function type"
+            | otherwise        -> return$ FunctionType (FunType return_ty params inline (attrs' ++ attrs))
+    where
+    mkDirect ty_name quals' attrs' | null attrs' = DirectType ty_name quals'
+                                   | otherwise   = error "_attribute__ s for DirectType"
+    merge quals' attrs' tyf = return $ tyf (mergeTypeQuals quals quals') (attrs' ++ attrs)
+
+typeDefRef :: (MonadTrav m) => NodeInfo -> Ident -> m TypeDefRef
+typeDefRef t_node name = lookupTypeDef name >>= \ty -> return (TypeDefRef name (Just ty) t_node)
+
+-- extract a struct\/union
+-- we emit @declStructUnion@ and @defStructUnion@ actions
+--
+-- TODO: should attributes be part of declarartions too ?
+tCompTypeDecl :: (MonadTrav m) => Bool -> CStructUnion -> m CompTypeRef
+tCompTypeDecl handle_def (CStruct tag ident_opt member_decls_opt attrs node_info) = do
+    -- create reference
+    sue_ref <- createSUERef node_info ident_opt
+    let tag' = tTag tag
+    attrs' <- mapM tAttr attrs
+    -- record tag name
+    let decl = CompTypeRef sue_ref tag' node_info
+    handleTagDecl (CompDecl decl)
+    -- when handle_def is true, enter the definition
+    when (handle_def) $ do
+        maybeM member_decls_opt $ \decls ->
+                tCompType sue_ref tag' decls (attrs') node_info
+            >>= (handleTagDef.CompDef)
+    return decl
+
+tTag :: CStructTag -> CompTyKind
+tTag CStructTag = StructTag
+tTag CUnionTag  = UnionTag
+
+tCompType :: (MonadTrav m) => SUERef -> CompTyKind -> [CDecl] -> Attributes -> NodeInfo -> m CompType
+tCompType tag sue_ref member_decls attrs node
+    = return (CompType tag sue_ref) `ap`
+        (concatMapM tMemberDecls member_decls) `ap`
+        (return attrs) `ap`
+        (return node)
+
+-- | translate a enum type decl
+--
+--  > enum my_enum
+--  > enum your_enum { x, y=3 }
+--
+tEnumTypeDecl :: (MonadTrav m) => Bool -> CEnum -> m EnumTypeRef
+tEnumTypeDecl handle_def (CEnum ident_opt enumerators_opt attrs node_info)
+    | (Nothing, Nothing) <- (ident_opt, enumerators_opt) = astError node_info "both definition and name of enum missing"
+    | Just [] <- enumerators_opt                         = astError node_info "empty enumerator list"
+    | otherwise
+        = do sue_ref <- createSUERef node_info ident_opt
+             attrs' <- mapM tAttr attrs
+             let decl = EnumTypeRef sue_ref node_info
+             when handle_def $ do
+                 maybeM enumerators_opt $ \enumerators ->
+                         tEnumType sue_ref enumerators attrs' node_info
+                    >>=  (handleTagDef . EnumDef)
+             return decl
+
+-- | translate and analyse an enumeration type
+tEnumType :: (MonadTrav m) => SUERef -> [(Ident, Maybe CExpr)] -> Attributes -> NodeInfo -> m EnumType
+tEnumType sue_ref enumerators attrs node = do
+    mapM_ handleEnumeratorDef enumerators'
+    return ty
+    where
+    ty = EnumType sue_ref enumerators' attrs node
+    (_,enumerators') = mapAccumL nextEnumerator (Left 0) enumerators
+    nextEnumerator memo (ident,e) =
+      let (memo',expr) = nextEnrExpr memo e in
+      (memo', Enumerator ident expr ty (nodeInfo ident))
+    nextEnrExpr :: (Either Integer (Expr,Integer)) -> Maybe CExpr -> (Either Integer (Expr,Integer), CExpr)
+    nextEnrExpr (Left i) Nothing = (Left (succ i), intExpr i)
+    nextEnrExpr (Right (e,offs)) Nothing = (Right (e, succ offs), offsExpr e offs)
+    nextEnrExpr _ (Just e) = (Right (e,1), e)
+    intExpr i = CConst (CIntConst (cInteger i) internalNode)
+    offsExpr e offs = CBinary CAddOp e (intExpr offs) internalNode
+
+-- | Mapping from num type specs to C types (C99 6.7.2-2), ignoring the complex qualifier.
+tNumType :: (MonadTrav m) => NumTypeSpec -> m (Either (FloatType,Bool) IntType)
+tNumType (NumTypeSpec basetype sgn sz iscomplex) =
+    case (basetype,sgn,sz) of
+        (BaseChar,_,NoSizeMod)      | Signed <- sgn   -> intType TySChar
+                                      | Unsigned <- sgn -> intType TyUChar
+                                      | otherwise       -> intType TyChar
+        (intbase, _, NoSizeMod)  | optBase BaseInt intbase ->
+            intType$ case sgn of
+                            Unsigned -> TyUInt
+                            _        -> TyInt
+        (intbase, signed, sizemod)    | optBase BaseInt intbase, optSign Signed signed ->
+            intType$ case sizemod of ShortMod    -> TyShort
+                                     LongMod     -> TyLong
+                                     LongLongMod -> TyLLong
+                                     _ -> internalErr "numTypeMapping: unexpected pattern matching error"
+        (intbase, Unsigned, sizemod) | optBase BaseInt intbase ->
+            intType$ case sizemod of ShortMod    -> TyUShort
+                                     LongMod     -> TyULong
+                                     LongLongMod -> TyULLong
+                                     _ -> internalErr "numTypeMapping: unexpected pattern matching error"
+        (BaseFloat, NoSignSpec, NoSizeMod)  -> floatType TyFloat
+        (BaseDouble, NoSignSpec, NoSizeMod) -> floatType TyDouble
+        (BaseDouble, NoSignSpec, LongMod)   -> floatType TyLDouble
+        -- TODO: error analysis
+        (_,_,_)   -> error "Bad AST analysis"
+    where
+    optBase _ NoBaseType = True
+    optBase expect baseTy = expect == baseTy
+    optSign _ NoSignSpec = True
+    optSign expect sign = expect == sign
+    intType = return . Right
+    floatType ft = return (Left (ft,iscomplex))
+
+-- TODO: currently bogus
+tArraySize :: (MonadTrav m) => CArrSize -> m ArraySize
+tArraySize (CNoArrSize False) = return (UnknownArraySize False)
+tArraySize (CNoArrSize True) = return (UnknownArraySize True)
+tArraySize (CArrSize static szexpr) = liftM (ArraySize static) (return szexpr)
+
+tTypeQuals :: (MonadTrav m) => [CTypeQual] -> m (TypeQuals,Attributes)
+tTypeQuals = foldrM go (noTypeQuals,[]) where
+    go (CConstQual _) (tq,attrs) = return$ (tq { constant = True },attrs)
+    go (CVolatQual _) (tq,attrs) = return$ (tq { volatile = True },attrs)
+    go (CRestrQual _) (tq,attrs) = return$ (tq { restrict = True },attrs)
+    go (CAttrQual attr) (tq,attrs) = liftM (\attr' -> (tq,attr':attrs)) (tAttr attr)
+    go (CInlineQual node) (_tq,_attrs) = astError node "unexpected inline qualifier"
+
+
+-- * analysis
+
+
+{-
+To canoicalize type specifiers, we define a canonical form:
+void | bool | (char|int|float|double) (signed|unsigned)? (long long?)? complex? | othertype
+-}
+data NumBaseType = NoBaseType | BaseChar | BaseInt | BaseFloat | BaseDouble deriving (Eq,Ord)
+data SignSpec    = NoSignSpec | Signed | Unsigned deriving (Eq,Ord)
+data SizeMod     = NoSizeMod | ShortMod | LongMod | LongLongMod deriving (Eq,Ord)
+data NumTypeSpec = NumTypeSpec { base :: NumBaseType, signSpec :: SignSpec, sizeMod :: SizeMod, isComplex :: Bool  }
+emptyNumTypeSpec :: NumTypeSpec
+emptyNumTypeSpec = NumTypeSpec { base = NoBaseType, signSpec = NoSignSpec, sizeMod = NoSizeMod, isComplex = False }
+data TypeSpecAnalysis = TSNone | TSVoid | TSBool | TSNum NumTypeSpec | TSNonBasic CTypeSpec
+
+canonicalTypeSpec :: (MonadTrav m) => [CTypeSpec] -> m TypeSpecAnalysis
+canonicalTypeSpec = foldrM go TSNone where
+    getNTS TSNone = Just emptyNumTypeSpec
+    getNTS (TSNum nts) = Just nts
+    getNTS _ = Nothing
+    updLongMod NoSizeMod = Just LongMod
+    updLongMod LongMod   = Just LongLongMod
+    updLongMod _         = Nothing
+    go (CVoidType _)    TSNone = return$  TSVoid
+    go (CBoolType _)    TSNone = return$  TSBool
+    go (CCharType _)    tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa
+                            = return$  TSNum$ nts { base = BaseChar }
+    go (CIntType _)     tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa
+                            = return$  TSNum$ nts { base = BaseInt }
+    go (CFloatType _)   tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa
+                            = return$  TSNum$ nts { base = BaseFloat }
+    go (CDoubleType _)  tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa
+                            = return$  TSNum$ nts { base = BaseDouble }
+    go (CShortType _)   tsa | (Just nts@(NumTypeSpec { sizeMod = NoSizeMod })) <- getNTS tsa
+                            = return$  TSNum$nts { sizeMod = ShortMod }
+    go (CLongType _)    tsa | (Just nts@(NumTypeSpec { sizeMod = szMod })) <- getNTS tsa,
+                              (Just szMod') <- updLongMod szMod
+                            = return$  TSNum$ nts { sizeMod = szMod' }
+    go (CSignedType _)  tsa | (Just nts@(NumTypeSpec { signSpec = NoSignSpec })) <- getNTS tsa
+                            = return$  TSNum$ nts { signSpec = Signed }
+    go (CUnsigType _)   tsa | (Just nts@(NumTypeSpec { signSpec = NoSignSpec })) <- getNTS tsa
+                            = return$  TSNum$ nts { signSpec = Unsigned }
+    go (CComplexType _) tsa | (Just nts@(NumTypeSpec { isComplex = False })) <- getNTS tsa
+                            = return$  TSNum$ nts { isComplex = True }
+    go otherType  TSNone    = return$  TSNonBasic otherType
+    go ty _ts = astError (nodeInfo ty) "Invalid type specifier"
+
+-- compute storage given storage specifiers
+canonicalStorageSpec :: (MonadTrav m) =>[CStorageSpec] -> m StorageSpec
+canonicalStorageSpec storagespecs = liftM elideAuto $ foldrM updStorage NoStorageSpec storagespecs where
+        updStorage (CAuto _) NoStorageSpec     = return$ AutoSpec
+        updStorage (CRegister _) NoStorageSpec = return$ RegSpec
+        updStorage (CThread _) NoStorageSpec   = return$ ThreadSpec
+        updStorage (CThread _) (StaticSpec _)  = return$ StaticSpec True
+        updStorage (CThread _) (ExternSpec _)  = return$ ExternSpec True
+        updStorage (CStatic _) NoStorageSpec   = return$ StaticSpec False
+        updStorage (CExtern _) NoStorageSpec   = return$ ExternSpec False
+        updStorage (CStatic _) ThreadSpec      = return$ StaticSpec True
+        updStorage (CExtern _) ThreadSpec      = return$ ExternSpec True
+        updStorage badSpec old
+            = astError (nodeInfo badSpec) $ "Invalid storage specifier "++show badSpec++" in combination with "++show old
+        elideAuto AutoSpec = NoStorageSpec
+        elideAuto spec = spec
+
+-- | convert old style parameters
+--
+-- This requires matching parameter names and declarations, as in the following example:
+--
+-- > int f(d,c,a,b)
+-- > char a,*b;
+-- > int c;
+-- > { }
+--
+-- is converted to
+--
+-- > int f(int d, int c, char a, char* b)
+--
+-- TODO: This could be moved to syntax, as it operates on the AST only
+mergeOldStyle :: (MonadTrav m) => NodeInfo -> [CDecl] -> [CDerivedDeclr] -> m [CDerivedDeclr]
+mergeOldStyle _node [] declrs = return declrs
+mergeOldStyle node oldstyle_params (CFunDeclr params attrs fdnode : dds) =
+    case params of
+        Left list -> do
+            -- FIXME: This translation doesn't work in the following example
+            -- [| int f(b,a) struct x { }; int b,a; { struct x local; return local.x } |]
+            oldstyle_params' <- liftM concat $ mapM splitCDecl oldstyle_params
+            param_map <- liftM Map.fromList $ mapM attachNameOfDecl oldstyle_params'
+            (newstyle_params,param_map') <- foldrM insertParamDecl ([],param_map) list
+            when (not $ Map.null param_map') $
+                astError node $ "declarations for parameter(s) "++ showParamMap param_map' ++" but no such parameter"
+            return $ (CFunDeclr (Right (newstyle_params, False)) attrs fdnode : dds)
+        Right _newstyle -> astError node "oldstyle parameter list, but newstyle function declaration"
+    where
+        attachNameOfDecl decl = nameOfDecl decl >>= \n -> return (n,decl)
+        insertParamDecl param_name (ps, param_map)
+            = case Map.lookup param_name param_map of
+                Just p -> return (p:ps, Map.delete param_name param_map)
+                Nothing -> return (implicitIntParam param_name : ps, param_map)
+        implicitIntParam param_name =
+            let node = (nodeInfo param_name) in
+            CDecl [CTypeSpec (CIntType node)] [(Just (CDeclr (Just param_name) [] Nothing [] node),Nothing,Nothing)] node
+        showParamMap = concat . intersperse ", " . map identToString . Map.keys
+mergeOldStyle node _ _ = astError node "oldstyle parameter list, but not function type"
+
+-- | split a CDecl into declarators, hereby eliding SUE defs from the second declarator on.
+--
+--   There are several reasons why this isn;t the preferred way for handling multiple-declarator declarations,
+--   but it can be convinient some times.
+--
+-- > splitCDecl [d| struct x { int z; } a,*b; |]
+-- > [ [d| struct x { int z; } a, struct x *b |] ]
+--
+-- /TODO/: This could be moved to syntax, as it operates on the AST only
+splitCDecl :: (MonadTrav m) => CDecl -> m [CDecl]
+splitCDecl decl@(CDecl declspecs declrs node) =
+    case declrs of
+        []      -> internalErr "splitCDecl applied to empty declaration"
+        [declr] -> return [decl]
+        (d1:ds) ->
+            let declspecs' = map elideSUEDef declspecs in
+            return$ (CDecl declspecs [d1] node) : [ CDecl declspecs' [declr] node | declr <- ds ]
+    where
+    elideSUEDef declspec@(CTypeSpec tyspec) =
+        case tyspec of
+            (CEnumType (CEnum name def attrs enum_node) node) ->
+                CTypeSpec (CEnumType (CEnum name Nothing [] enum_node) node)
+            (CSUType (CStruct tag name def attrs su_node) node) ->
+                CTypeSpec (CSUType (CStruct tag name Nothing [] su_node) node)
+            _ -> declspec
+    elideSUEDef declspec = declspec
+
+
+-- | translate @__attribute__@ annotations
+-- TODO: This is a unwrap and wrap stub
+tAttr :: (MonadTrav m) => CAttr -> m Attr
+tAttr (CAttr name cexpr node) = return$ Attr name cexpr node
+
+
+-- | construct a name for a variable
+-- TODO: more or less bogus
+mkVarName :: (MonadTrav m) => NodeInfo -> Maybe Ident -> Maybe AsmName -> m VarName
+mkVarName  node Nothing _ = return NoName
+mkVarName  node (Just n) asm = return $ VarName n Nothing
+
+-- helpers
+nameOfDecl :: (MonadTrav m) => CDecl -> m Ident
+nameOfDecl d = getOnlyDeclr d >>= \declr ->
+    case declr of
+        (CDeclr (Just name) _ _ _ _) -> return name
+        (CDeclr Nothing _ _ _ node) -> internalErr "nameOfDecl: abstract declarator"
+emptyDeclr :: NodeInfo -> CDeclr
+emptyDeclr node = CDeclr Nothing [] Nothing [] node
+getOnlyDeclr :: (MonadTrav m) => CDecl -> m CDeclr
+getOnlyDeclr (CDecl _ [(Just declr,_,_)] _) = return declr
+getOnlyDeclr (CDecl _ _ node) = internalErr "getOnlyDeclr: declaration doesn't have a unique declarator"
diff --git a/src/Language/C/Analysis/DefTable.hs b/src/Language/C/Analysis/DefTable.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Analysis/DefTable.hs
@@ -0,0 +1,305 @@
+{-# LANGUAGE PatternGuards, DeriveDataTypeable  #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Analysis.DefTable
+-- Copyright   :  (c) 2008 Benedikt Huber
+--                  based on code from c2hs
+--                (c) [1999..2001] Manuel M. T. Chakravarty
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  alpha
+-- Portability :  ghc
+--
+-- This module manages symbols in local and global scopes.
+--
+-- There are four different kind of identifiers: ordinary identifiers (henceforth
+-- simply called `identifier'), tag names (names of struct\/union\/enum types),
+-- labels and structure members.
+-----------------------------------------------------------------------------
+module Language.C.Analysis.DefTable (
+    IdentEntry, identOfTyDecl,
+    TagEntry, TagFwdDecl(..),
+    DefTable(..),
+    emptyDefTable,
+    globalDefs,
+    enterFunctionScope,leaveFunctionScope,enterBlockScope,leaveBlockScope,
+    enterMemberDecl,leaveMemberDecl,
+    DeclarationStatus(..),declStatusDescr,
+    defineTypeDef, defineGlobalIdent, defineScopedIdent, defineScopedIdentWhen,
+    declareTag,defineTag,defineLabel,lookupIdent,
+    lookupTag,lookupLabel,lookupIdentInner,lookupTagInner,
+)
+where
+import Language.C.Data
+import Language.C.Data.Name (NameMap,emptyNameMap)
+import Language.C.Analysis.NameSpaceMap
+import Language.C.Analysis.SemRep
+
+import Control.Applicative ((<|>))
+import Data.Map (Map)
+import qualified Data.Map as Map
+import Data.Generics
+
+{- Name spaces, scopes and contexts [Scopes]
+
+ In C, there are 4 categories of identifiers:
+
+  * labels
+  * tag names (@(struct|union|enum) tag-name@), where /all/ tag names live in one namespace
+  * members of structures and unions
+  * ordinary identifiers, denoting objects, functions, typeDefs and enumeration constants
+
+ There are 4 kind of scopes:
+
+  * file scope: outside of parameter lists and blocks
+  * function prototype scope
+  * function scope: labels are visible within the entire function, and declared implicitely
+  * block scope
+
+ While function scope is irrelevant for variable declarations, they might also appear in member declarations.
+ Therefore, there are also 4 kinds of contexts where a variable might be declared:
+
+  * File Scope Context: external declaration \/ definition
+  * Block Scope Context: either external or local definition
+  * Function prototype scope context
+  * Member Declaration context
+
+ See
+   <http://www.embedded.com/design/206901036>
+   C99 6
+-}
+
+-- | All ordinary identifiers map to 'IdenTyDecl': either a typedef or a object\/function\/enumerator
+type IdentEntry = Either TypeDef IdentDecl
+
+identOfTyDecl :: IdentEntry -> Ident
+identOfTyDecl = either identOfTypeDef declIdent
+
+data TagFwdDecl = CompDecl CompTypeRef
+                | EnumDecl EnumTypeRef
+instance HasSUERef TagFwdDecl where
+  sueRef (CompDecl ctr) = sueRef ctr
+  sueRef (EnumDecl etr) = sueRef etr
+instance CNode TagFwdDecl where
+  nodeInfo (CompDecl ctr) = nodeInfo ctr
+  nodeInfo (EnumDecl etr) = nodeInfo etr
+
+-- | Tag names map to forward declarations or definitions of struct\/union\/enum types
+type TagEntry = Either TagFwdDecl TagDef
+
+-- | Table holding current definitions
+data DefTable = DefTable
+    {
+        identDecls   :: NameSpaceMap Ident IdentEntry,    -- ^ declared `ordinary identifiers'
+        tagDecls   :: NameSpaceMap SUERef TagEntry,       -- ^ declared struct/union/enum  tags
+        labelDefs  :: NameSpaceMap Ident Ident,            -- ^ defined labels
+        memberDecls :: NameSpaceMap Ident MemberDecl,      -- ^ member declarations (only local)
+        refTable   :: NameMap Name                         -- ^ link names with definitions
+    }
+
+-- | empty definition table, with all name space maps in global scope
+emptyDefTable :: DefTable
+emptyDefTable = DefTable nameSpaceMap nameSpaceMap nameSpaceMap nameSpaceMap emptyNameMap
+
+-- | get the globally defined entries of a definition table
+globalDefs :: DefTable -> GlobalDecls
+globalDefs deftbl = Map.foldWithKey insertDecl (GlobalDecls e gtags e) (globalNames $ identDecls deftbl)
+    where
+    e = Map.empty
+    (_fwd_decls,gtags) = Map.mapEither id $ globalNames (tagDecls deftbl)
+    insertDecl ident (Left tydef) ds = ds { gTypeDefs = Map.insert ident tydef (gTypeDefs ds)}
+    insertDecl ident (Right obj) ds = ds { gObjs = Map.insert ident obj (gObjs ds) }
+
+leaveScope_ :: (Ord k) => NameSpaceMap k a -> NameSpaceMap k a
+leaveScope_ = fst . leaveScope
+
+enterLocalScope :: DefTable -> DefTable
+enterLocalScope deftbl = deftbl {
+        identDecls = enterNewScope (identDecls deftbl),
+        tagDecls = enterNewScope (tagDecls deftbl)
+    }
+leaveLocalScope :: DefTable -> DefTable
+leaveLocalScope deftbl = deftbl {
+                        identDecls = leaveScope_ (identDecls deftbl),
+                        tagDecls = leaveScope_ (tagDecls deftbl)
+                       }
+
+-- | Enter function scope (and the corresponding block scope)
+enterFunctionScope :: DefTable -> DefTable
+enterFunctionScope deftbl = enterLocalScope  $
+                          deftbl { labelDefs = enterNewScope (labelDefs deftbl) }
+
+-- | Leave function scope, and return the associated DefTable.
+--   Error if not in function scope.
+leaveFunctionScope :: DefTable -> DefTable
+leaveFunctionScope deftbl = leaveLocalScope $ deftbl { labelDefs = leaveScope_ (labelDefs deftbl) }
+
+-- | Enter new block scope
+enterBlockScope :: DefTable -> DefTable
+enterBlockScope = enterLocalScope
+
+-- | Leave innermost block scope
+leaveBlockScope :: DefTable -> DefTable
+leaveBlockScope = leaveLocalScope
+
+-- | Enter new member declaration scope
+enterMemberDecl :: DefTable -> DefTable
+enterMemberDecl deftbl = deftbl { memberDecls = enterNewScope (memberDecls deftbl) }
+
+-- | Leave innermost member declaration scope
+leaveMemberDecl :: DefTable -> ([MemberDecl], DefTable)
+leaveMemberDecl deftbl =
+    let (decls',members) = leaveScope (memberDecls deftbl)
+    in (,) (map snd members)
+           (deftbl { memberDecls = decls' })
+
+-- * declarations
+
+-- | Status of a declaration
+data DeclarationStatus t =
+      NewDecl         -- ^ new entry
+    | Redeclared t    -- ^ old def was overwritten
+    | KeepDef t       -- ^ new def was discarded
+    | Shadowed t      -- ^ new def shadows one in outer scope
+    | KindMismatch t  -- ^ kind mismatch
+    deriving (Data,Typeable)
+declStatusDescr :: DeclarationStatus t -> String
+declStatusDescr NewDecl = "new"
+declStatusDescr (Redeclared _) = "redeclared"
+declStatusDescr (KeepDef _) = "keep old"
+declStatusDescr (Shadowed _) = "shadowed"
+declStatusDescr (KindMismatch _) = "kind mismatch"
+
+compatIdentEntry :: IdentEntry -> IdentEntry -> Bool
+compatIdentEntry (Left _tydef) = either (const True) (const False)
+compatIdentEntry (Right def) = either (const False) $
+  \other_def -> case (def,other_def) of
+                  (EnumeratorDef _, EnumeratorDef _) -> True
+                  (EnumeratorDef _, _) -> True
+                  (_, EnumeratorDef _) -> True
+                  (_,_) -> True
+
+data TagEntryKind = CompKind CompTyKind | EnumKind
+                    deriving (Eq,Ord)
+instance Show TagEntryKind where
+  show (CompKind ctk) = show ctk
+  show EnumKind = "enum"
+
+-- | @sameTagKind ty1 ty2@ returns @True@ if @ty1,ty2@ are the same kind of tag (struct,union or enum)
+tagKind :: TagEntry -> TagEntryKind
+tagKind (Left (CompDecl cd)) = CompKind (compTag cd)
+tagKind (Left (EnumDecl _)) = EnumKind
+tagKind (Right (CompDef cd)) = CompKind (compTag cd)
+tagKind (Right (EnumDef _)) =  EnumKind
+
+compatTagEntry :: TagEntry -> TagEntry -> Bool
+compatTagEntry  te1 te2 = tagKind te1 == tagKind te2
+
+defRedeclStatus :: (t -> t -> Bool) -> t -> Maybe t -> DeclarationStatus t
+defRedeclStatus sameKind def oldDecl =
+    case oldDecl of
+        Just def' | def `sameKind` def' -> Redeclared def'
+                  | otherwise           -> KindMismatch def'
+        Nothing                         -> NewDecl
+defRedeclStatusLocal :: (Ord k) =>
+                        (t -> t -> Bool) -> k -> t -> Maybe t -> NameSpaceMap k t -> DeclarationStatus t
+defRedeclStatusLocal sameKind ident def oldDecl nsm =
+    case defRedeclStatus sameKind def oldDecl of
+        NewDecl -> case lookupName nsm ident of
+                     Just shadowed -> Shadowed shadowed
+                     Nothing       -> NewDecl
+        redecl  -> redecl
+
+defineTypeDef :: Ident -> TypeDef -> DefTable -> (DeclarationStatus IdentEntry, DefTable)
+defineTypeDef ident tydef deftbl =
+  (defRedeclStatus compatIdentEntry (Left tydef) oldDecl, deftbl { identDecls = decls' })
+  where
+  (decls', oldDecl) = defGlobal (identDecls deftbl) ident (Left tydef)
+
+-- | declare\/define a global object\/function\/typeDef
+--
+--  returns @Redeclared def@ if there is already an object\/function\/typeDef
+--  in global scope, or @DifferentKindRedec def@ if the old declaration is of a different kind.
+defineGlobalIdent :: Ident -> IdentDecl -> DefTable -> (DeclarationStatus IdentEntry, DefTable)
+defineGlobalIdent ident def deftbl =
+    (defRedeclStatus compatIdentEntry (Right def) oldDecl, deftbl { identDecls = decls' })
+    where
+    (decls',oldDecl) = defGlobal (identDecls deftbl) ident (Right def)
+-- | declare\/define a object\/function\/typeDef with lexical scope
+--
+--  returns @Redeclared def@ or @DifferentKindRedec def@  if there is already an object\/function\/typeDef
+--  in the same scope.
+defineScopedIdent :: Ident -> IdentDecl -> DefTable -> (DeclarationStatus IdentEntry, DefTable)
+defineScopedIdent = defineScopedIdentWhen (const True)
+
+-- | declare\/define a object\/function\/typeDef with lexical scope, if the given predicate holds on the old
+--   entry.
+--
+--  returns @Keep old_def@ if the old definition shouldn't be overwritten, and otherwise @Redeclared def@ or
+--  @DifferentKindRedec def@  if there is already an object\/function\/typeDef in the same scope.
+defineScopedIdentWhen :: (IdentDecl -> Bool) -> Ident -> IdentDecl -> DefTable ->
+                           (DeclarationStatus IdentEntry, DefTable)
+defineScopedIdentWhen override_def ident def deftbl
+    = (redecl_status, deftbl { identDecls = decls' })
+    where
+    new_def = Right def
+    old_decls = identDecls deftbl
+    old_decl_opt = lookupInnermostScope old_decls ident
+    (decls',redecl_status)  | (Just old_decl) <- old_decl_opt, not (old_decl `compatIdentEntry` new_def)
+                              = (new_decls, KindMismatch old_decl)
+                            | maybe True doOverride old_decl_opt
+                              = (new_decls, redeclStatus' old_decl_opt)
+                            | otherwise
+                              = (old_decls, maybe NewDecl KeepDef old_decl_opt)
+    new_decls = fst (defLocal old_decls ident new_def)
+    doOverride (Left _) = False
+    doOverride (Right old_def) = (override_def old_def)
+    redeclStatus' overriden_decl = defRedeclStatusLocal compatIdentEntry ident new_def overriden_decl old_decls
+
+-- | declare a tag (fwd decl in case the struct name isn't defined yet)
+declareTag :: SUERef -> TagFwdDecl -> DefTable -> (DeclarationStatus TagEntry, DefTable)
+declareTag sueref decl deftbl =
+  case lookupTag sueref deftbl of
+    Nothing -> (NewDecl, deftbl { tagDecls = fst $ defLocal (tagDecls deftbl) sueref (Left decl) })
+    Just old_def | tagKind old_def == tagKind (Left decl) ->  (KeepDef old_def, deftbl)
+                 | otherwise -> (KindMismatch old_def, deftbl)
+
+-- | define a tag
+defineTag :: SUERef -> TagDef -> DefTable -> (DeclarationStatus TagEntry, DefTable)
+defineTag sueref def deftbl =
+    (redeclStatus, deftbl { tagDecls = decls'})
+    where
+    (decls',olddecl) = defLocal (tagDecls deftbl) sueref (Right def)
+    redeclStatus =
+      case olddecl of
+        Just fwd_decl@(Left decl) | tagKind fwd_decl == tagKind (Right def) -> NewDecl -- should be NewDef
+                                  | otherwise -> KindMismatch fwd_decl
+        _ -> defRedeclStatusLocal compatTagEntry sueref (Right def) olddecl (tagDecls deftbl)
+
+-- | define a label
+-- Return the old label if it is already defined in this function's scope
+defineLabel :: Ident -> DefTable -> (DeclarationStatus Ident, DefTable)
+defineLabel ident deftbl =
+    let (labels',old_label) = defLocal (labelDefs deftbl) ident ident
+    in  (maybe NewDecl Redeclared old_label, deftbl { labelDefs = labels' })
+
+-- | lookup identifier (object, function, typeDef, enumerator)
+lookupIdent :: Ident -> DefTable -> Maybe IdentEntry
+lookupIdent ident deftbl = lookupName (identDecls deftbl) ident
+
+-- | lookup tag
+lookupTag :: SUERef -> DefTable -> Maybe TagEntry
+lookupTag sue_ref deftbl = lookupName (tagDecls deftbl) sue_ref
+
+-- | lookup label
+lookupLabel :: Ident -> DefTable -> Maybe Ident
+lookupLabel ident deftbl = lookupName (labelDefs deftbl) ident
+
+-- | lookup an object in the innermost scope
+lookupIdentInner :: Ident -> DefTable -> Maybe IdentEntry
+lookupIdentInner ident deftbl = lookupInnermostScope (identDecls deftbl) ident
+
+-- | lookup an identifier in the innermost scope
+lookupTagInner :: SUERef -> DefTable -> Maybe TagEntry
+lookupTagInner sue_ref deftbl = lookupInnermostScope (tagDecls deftbl) sue_ref
+
diff --git a/src/Language/C/Analysis/Export.hs b/src/Language/C/Analysis/Export.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Analysis/Export.hs
@@ -0,0 +1,204 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Analysis.Export
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  prototype
+-- Portability :  ghc
+--
+-- /WARNING/ : This is just an implementation sketch and not very well tested.
+--
+-- Export 'SemRep' entities to 'AST' nodes.
+-----------------------------------------------------------------------------
+module Language.C.Analysis.Export (
+exportType, exportTypeDecl, exportTypeSpec,
+exportTypeDef,
+exportCompType, exportCompTypeDecl, exportCompTypeRef,
+exportEnumType, exportEnumTypeDecl, exportEnumTypeRef,
+)
+where
+import Language.C.Data.Ident
+import Language.C.Data.Node
+import Language.C.Syntax.AST
+import Language.C.Analysis.SemRep
+import Data.Maybe
+
+exportDeclr :: [CDeclSpec] -> Type -> Attributes -> VarName -> ([CDeclSpec],CDeclr)
+exportDeclr other_specs ty attrs name =
+    (other_specs ++ specs, CDeclr ident derived asmname (exportAttrs attrs) ni)
+    where
+    (specs,derived) = exportType ty
+    (ident,asmname) = case name of (VarName vident asmname_opt) -> (Just vident, asmname_opt)
+                                   _ -> (Nothing,Nothing)
+
+exportTypeDecl :: Type -> CDecl
+exportTypeDecl ty =
+  CDecl declspecs declrs ni
+  where
+  (declspecs,derived) = exportType ty
+  declrs | null derived = []
+         | otherwise = [(Just $ CDeclr Nothing derived Nothing [] ni,Nothing,Nothing)]
+
+exportTypeDef :: TypeDef -> CDecl
+exportTypeDef (TypeDef ident ty attrs node_info) =
+  CDecl (CStorageSpec (CTypedef ni) : declspecs) [declr] node_info
+  where
+  (declspecs,derived) = exportType ty
+  declr = (Just $ CDeclr (Just ident) derived Nothing (exportAttrs attrs) ni, Nothing, Nothing)
+
+exportType :: Type -> ([CDeclSpec],[CDerivedDeclr])
+exportType ty = exportTy [] ty
+    where
+    exportTy dd (PtrType ity tyquals attrs) = exportTy (ptr_declr : dd) ity where
+        ptr_declr = CPtrDeclr (exportTypeQualsAttrs tyquals attrs) ni
+    exportTy dd (ArrayType ity array_sz tyquals attrs) = exportTy (arr_declr : dd) ity where
+        arr_declr = CArrDeclr (exportTypeQualsAttrs tyquals attrs) (exportArraySize array_sz) ni
+    exportTy dd (FunctionType (FunType ity params variadic attrs)) = exportTy (fun_declr : dd) ity where
+        fun_declr = CFunDeclr (Right (map exportParamDecl params,variadic)) (exportAttrs attrs) ni
+    exportTy dd (FunctionType (FunTypeIncomplete ity attrs)) = exportTy (fun_declr : dd) ity where
+        fun_declr = CFunDeclr (Right ([],False)) (exportAttrs attrs) ni
+    exportTy dd (TypeDefType (TypeDefRef ty_ident _ node)) = ([CTypeSpec (CTypeDef ty_ident node)], reverse dd)
+    exportTy dd (DirectType ity quals) = (map CTypeQual (exportTypeQuals quals) ++
+                                        map CTypeSpec (exportTypeSpec ity), reverse dd)
+    exportTy _ (TypeOfExpr _) = error "export of TypeOfExpr isn't supported"
+
+exportTypeQuals :: TypeQuals -> [CTypeQual]
+exportTypeQuals quals = mapMaybe select [(constant,CConstQual ni),(volatile,CVolatQual ni),(restrict,CRestrQual ni)]
+    where
+    select (predicate,tyqual) | predicate quals = Just tyqual
+                              | otherwise       = Nothing
+
+exportTypeQualsAttrs :: TypeQuals -> Attributes -> [CTypeQual]
+exportTypeQualsAttrs tyqs attrs = (exportTypeQuals tyqs ++ map CAttrQual (exportAttrs attrs))
+
+exportArraySize :: ArraySize -> CArrSize
+exportArraySize (ArraySize static e) = CArrSize static e
+exportArraySize (UnknownArraySize complete) = CNoArrSize complete
+
+exportTypeSpec :: TypeName -> [CTypeSpec]
+exportTypeSpec tyname =
+    case tyname of
+        TyVoid -> [CVoidType ni]
+        TyIntegral ity -> exportIntType ity
+        TyFloating fty -> exportFloatType fty
+        TyComplex fty -> exportComplexType fty
+        TyComp comp -> exportCompTypeDecl comp
+        TyEnum enum -> exportEnumTypeDecl enum
+        TyBuiltin TyVaList -> [CTypeDef (internalIdent "va_list") ni]
+
+exportIntType :: IntType -> [CTypeSpec]
+exportIntType ty =
+    case ty of
+      TyBool    -> [CBoolType ni]
+      TyChar    -> [CCharType ni]
+      TySChar   -> [CSignedType ni,CCharType ni]
+      TyUChar   -> [CUnsigType ni,CCharType ni]
+      TyShort   -> [CShortType ni]
+      TyUShort  -> [CUnsigType ni, CShortType ni]
+      TyInt     -> [CIntType ni]
+      TyUInt    -> [CUnsigType ni, CIntType ni]
+      TyLong    -> [CLongType ni]
+      TyULong   -> [CUnsigType ni,CLongType ni]
+      TyLLong   -> [CLongType ni, CLongType ni]
+      TyULLong  -> [CUnsigType ni, CLongType ni, CLongType ni]
+
+exportFloatType :: FloatType -> [CTypeSpec]
+exportFloatType ty =
+    case ty of
+      TyFloat   -> [CFloatType ni]
+      TyDouble  -> [CDoubleType ni]
+      TyLDouble -> [CLongType ni, CDoubleType ni]
+
+exportComplexType :: FloatType -> [CTypeSpec]
+exportComplexType ty = (CComplexType ni) : exportFloatType ty
+
+exportCompTypeDecl :: CompTypeRef -> [CTypeSpec]
+exportCompTypeDecl ty = [CSUType (exportComp ty) ni]
+    where
+    exportComp (CompTypeRef sue_ref comp_tag _n) =
+        CStruct (if comp_tag == StructTag then CStructTag else CUnionTag)
+                (exportSUERef sue_ref) Nothing [] ni
+
+exportEnumTypeDecl :: EnumTypeRef -> [CTypeSpec]
+exportEnumTypeDecl ty = [CEnumType (exportEnum ty) ni]
+    where
+    exportEnum (EnumTypeRef sue_ref _n) =
+        CEnum (exportSUERef sue_ref) Nothing [] ni
+
+exportCompType :: CompType -> [CTypeSpec]
+exportCompType (CompType sue_ref comp_tag members attrs node_info) = [CSUType comp ni]
+    where
+    comp = CStruct (if comp_tag == StructTag then CStructTag else CUnionTag)
+                   (exportSUERef sue_ref)
+                   (Just (map exportMemberDecl members))
+                   (exportAttrs attrs)
+                   node_info
+exportCompTypeRef :: CompType -> [CTypeSpec]
+exportCompTypeRef (CompType sue_ref com_tag  _ _ node_info) = exportCompTypeDecl (CompTypeRef sue_ref com_tag node_info)
+
+exportEnumType :: EnumType -> [CTypeSpec]
+exportEnumType (EnumType sue_ref enumerators attrs node_info) = [CEnumType enum ni]
+    where
+    enum = CEnum (exportSUERef sue_ref)
+                 (Just (map exportEnumerator enumerators))
+                 (exportAttrs attrs)
+                 node_info
+    exportEnumerator (Enumerator ident val _ty _) = (ident,Just val)
+
+exportEnumTypeRef :: EnumType -> [CTypeSpec]
+exportEnumTypeRef (EnumType sue_ref _ _ node_info) = exportEnumTypeDecl (EnumTypeRef sue_ref node_info)
+
+exportSUERef :: SUERef -> Maybe Ident
+exportSUERef = Just . internalIdent . show -- relies on a the source program not having any $'s in it
+
+exportMemberDecl :: MemberDecl -> CDecl
+exportMemberDecl (AnonBitField ty expr node_info) =
+    CDecl (map CTypeSpec $ exportTypeSpec $ fromDirectType ty) [(Nothing,Nothing,Just expr)] node_info
+exportMemberDecl (MemberDecl vardecl bitfieldsz node_info) =
+    let (specs,declarator) = exportVarDecl vardecl
+    in  CDecl specs [(Just declarator, Nothing, bitfieldsz)] node_info
+exportVarDecl :: VarDecl -> ([CDeclSpec],CDeclr)
+
+-- NOTE: that there is an ambiguity between two possible places for __attributes__ s here
+exportVarDecl (VarDecl name attrs ty) = exportDeclr (exportDeclAttrs attrs) ty [] name
+exportParamDecl :: ParamDecl -> CDecl
+exportParamDecl paramdecl =
+    let (specs,declr) = exportVarDecl (getVarDecl paramdecl)
+    in CDecl specs [(Just declr, Nothing , Nothing) ] (nodeInfo paramdecl)
+
+exportDeclAttrs :: DeclAttrs -> [CDeclSpec]
+exportDeclAttrs (DeclAttrs inline storage attrs) =
+       (if inline then [CTypeQual (CInlineQual ni)] else [])
+    ++ map (CStorageSpec) (exportStorage storage)
+    ++ map (CTypeQual . CAttrQual) (exportAttrs attrs)
+
+-- | express storage in terms of storage specifiers.
+--
+-- This isn't always possible and depends on the context the identifier is declared.
+-- Most importantly, if there is a /conflicting/ declaration in scope, export is impossible.
+-- Furthermore, automatic storage is impossible in file scope.
+-- If the storage can actually be specified, the export is correct.
+exportStorage :: Storage -> [CStorageSpec]
+exportStorage NoStorage = []
+exportStorage (Auto reg) = if reg then [CRegister ni] else []
+exportStorage (Static InternalLinkage thread_local) = threadLocal thread_local [CStatic ni]
+exportStorage (Static ExternalLinkage thread_local) = threadLocal thread_local [CExtern ni]
+exportStorage (FunLinkage ExternalLinkage) = []
+exportStorage (FunLinkage InternalLinkage) = [CStatic ni]
+
+threadLocal :: Bool -> [CStorageSpec] -> [CStorageSpec]
+threadLocal False = id
+threadLocal True = ((CThread ni) :)
+
+exportAttrs :: [Attr] -> [CAttr]
+exportAttrs = map exportAttr where
+    exportAttr (Attr ident es n) = CAttr ident es n
+
+fromDirectType :: Type -> TypeName
+fromDirectType (DirectType ty _) = ty
+fromDirectType (TypeDefType (TypeDefRef _ ref _)) = maybe (error "undefined typeDef") fromDirectType ref
+fromDirectType _ = error "fromDirectType"
+
+ni :: NodeInfo
+ni = internalNode
diff --git a/src/Language/C/Analysis/NameSpaceMap.hs b/src/Language/C/Analysis/NameSpaceMap.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Analysis/NameSpaceMap.hs
@@ -0,0 +1,144 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Analysis.NameSpaceMap
+-- Copyright   :  (c) [1995..1999] Manuel M. T. Chakravarty
+--                (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  alpha
+-- Portability :  portable
+--
+-- This module manages name spaces.
+--
+--  * A name space map associates identifiers with their definition.
+--
+--  * Each name space map is organized in a hierarchical way using the notion of
+--    scopes. A name space map, at any moment, always has a global scope and may
+--    have several local scopes. Definitions in inner scopes hide definitions
+--    of the same identifier in outer scopes.
+--
+module Language.C.Analysis.NameSpaceMap (
+    -- * name space maps
+    NameSpaceMap, nameSpaceMap, nsMapToList,
+    globalNames,localNames,hasLocalNames,
+    -- * scope modification
+    defGlobal,
+    enterNewScope, leaveScope,
+    defLocal,
+    lookupName,lookupGlobal,lookupInnermostScope,
+    )
+where
+import Prelude hiding (lookup)
+import qualified Prelude
+import qualified Data.Map as Map (empty, insert, lookup, toList)
+import Data.Map   (Map)
+import Language.C.Data.Ident     (Ident)
+
+{-
+C Namespaces and scopes:
+
+
+-}
+
+-- DevDocs:
+--
+-- * the definitions in the global scope are stored in a finite map, because
+--   they tend to be a lot.
+--
+-- * the definitions of the local scopes are stored in a single list, usually
+--   they are not very many and the definitions entered last are the most
+--   frequently accessed ones; the list structure naturally hides older
+--   definitions, i.e., definitions from outer scopes; adding new definitions
+--   is done in time proportinal to the current size of the scope; removing a
+--   scope is done in constant time (and the definitions of a scope can be
+--   returned as a result of leaving the scope); lookup is proportional to the
+--   number of definitions in the local scopes and the logarithm of the number
+--   of definitions in the global scope -- i.e., efficiency relies on a
+--   relatively low number of local definitions together with frequent lookup
+--   of the most recently defined local identifiers
+--
+
+-- | @NameSpaceMap a@ is a Map from identifiers to @a@, which manages
+-- global and local name spaces.
+data NameSpaceMap k v = NsMap (Map k v)  -- defs in global scope
+                              [[(k, v)]] -- stack of local scopes
+globalNames :: (Ord k) => NameSpaceMap k v -> Map k v
+globalNames (NsMap g _) = g
+hasLocalNames :: NameSpaceMap k v -> Bool
+hasLocalNames (NsMap _ l) = not (null l)
+localNames :: (Ord k) => NameSpaceMap k v -> [[(k,v)]]
+localNames (NsMap _ l) = l
+
+-- | create a name space
+nameSpaceMap :: (Ord k) => NameSpaceMap k v
+nameSpaceMap  = NsMap Map.empty []
+
+
+
+-- | Add global definition
+--
+-- @(ns',oldDef) = defGlobal ns ident def@
+--   adds a global definition @ident := def@ to the namespace.
+--   It returns the modified namespace @ns'@. If the identifier is
+--   already declared in the global namespace, the definition is overwritten
+--   and the old definition @oldDef@ is returned.
+defGlobal :: (Ord k) => NameSpaceMap k a -> k -> a -> (NameSpaceMap k a, Maybe a)
+defGlobal (NsMap gs lss) ident def
+    = (NsMap (Map.insert ident def gs) lss, Map.lookup ident gs)
+
+-- | Enter new local scope
+--
+-- @ns' = enterNewScope ns@ creates and enters a new local scope.
+enterNewScope :: (Ord k) => NameSpaceMap k a -> NameSpaceMap k a
+enterNewScope (NsMap gs lss)  = NsMap gs ([]:lss)
+
+-- | Leave innermost local scope
+--
+-- @(ns',defs) = leaveScope ns@ pops leaves the innermost local scope.
+--  and returns its definitions
+leaveScope :: (Ord k) => NameSpaceMap k a -> (NameSpaceMap k a, [(k, a)])
+leaveScope (NsMap _ [])         = error "NsMaps.leaveScope: No local scope!"
+leaveScope (NsMap gs (ls:lss))  = (NsMap gs lss, ls)
+
+-- | Add local definition
+--
+-- @(ns',oldDef) = defLocal ns ident def@ adds the local definition
+--   @ident := def@ to the innermost local scope, if there is a local scope,
+--     and to the global scope otherwise.
+--   It returns the modified name space @ns'@ and the old  binding of
+--   the identifier @oldDef@, which is overwritten.
+defLocal :: (Ord k) => NameSpaceMap k a -> k -> a -> (NameSpaceMap k a, Maybe a)
+defLocal ns@(NsMap _ []) ident def = defGlobal ns ident def
+defLocal (NsMap    gs (ls:lss)) ident def =
+  (NsMap gs (((ident, def):ls):lss),
+   Prelude.lookup ident ls)
+
+-- | Search for a definition
+--
+-- @def = find ns ident@ returns the definition in some scope (inner to outer),
+-- if there is one.
+lookupName :: (Ord k) => NameSpaceMap k a -> k -> Maybe a
+lookupName ns@(NsMap _ localDefs) ident
+    = case (lookupLocal localDefs) of
+        Nothing  -> lookupGlobal ns ident
+        Just def -> Just def
+  where
+    lookupLocal []       = Nothing
+    lookupLocal (ls:lss) = case (Prelude.lookup ident ls) of
+                        Nothing  -> lookupLocal lss
+                        Just def -> Just def
+
+lookupGlobal :: (Ord k) => NameSpaceMap k a -> k -> Maybe a
+lookupGlobal (NsMap gs _) ident = Map.lookup ident gs
+
+lookupInnermostScope :: (Ord k) => NameSpaceMap k a -> k -> Maybe a
+lookupInnermostScope nsm@(NsMap _gs localDefs) ident  =
+    case localDefs of
+        (ls : _lss) -> Prelude.lookup ident ls
+        [] -> lookupGlobal nsm ident
+
+-- | flatten a namespace into a assoc list
+--
+--  @nameSpaceToList ns = (localDefInnermost ns ++ .. ++ localDefsOutermost ns) ++ globalDefs ns@
+nsMapToList :: (Ord k) => NameSpaceMap k a -> [(k, a)]
+nsMapToList (NsMap gs lss)  = concat lss ++ Map.toList gs
diff --git a/src/Language/C/Analysis/SemError.hs b/src/Language/C/Analysis/SemError.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Analysis/SemError.hs
@@ -0,0 +1,98 @@
+{-# LANGUAGE DeriveDataTypeable, GeneralizedNewtypeDeriving  #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Analysis.SemError
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  alpha
+-- Portability :  ghc
+--
+-- Errors in the semantic analysis
+-----------------------------------------------------------------------------
+module Language.C.Analysis.SemError (
+InvalidASTError(..), invalidAST,
+BadSpecifierError(..), badSpecifierError,
+TypeMismatch(..), typeMismatch,
+RedefError(..), RedefInfo(..), RedefKind(..), redefinition,
+)
+where
+import Data.Typeable
+
+-- this means we cannot use SemError in SemRep, but use rich types here
+import Language.C.Analysis.SemRep
+
+import Language.C.Data.Error
+import Language.C.Data.Node
+
+-- here are the errors available
+
+-- | InvalidASTError is caused by the violation of an invariant in the AST
+newtype InvalidASTError = InvalidAST ErrorInfo deriving (Typeable,Error)
+
+-- | BadSpecifierError is caused by an invalid combination of specifiers
+newtype BadSpecifierError = BadSpecifierError ErrorInfo deriving (Typeable,Error)
+
+-- | RedefError is caused by an invalid redefinition of the same identifier or type
+data RedefError = RedefError ErrorLevel RedefInfo deriving Typeable
+
+data RedefInfo = RedefInfo String RedefKind NodeInfo NodeInfo
+data RedefKind = DuplicateDef | DiffKindRedecl | ShadowedDef
+data TypeMismatch = TypeMismatch String (NodeInfo,Type) (NodeInfo,Type) deriving Typeable
+
+-- Invalid AST
+-- ~~~~~~~~~~~
+
+instance Show InvalidASTError  where show = showError "AST invariant violated"
+
+invalidAST :: NodeInfo -> String -> InvalidASTError
+invalidAST node_info msg = InvalidAST (mkErrorInfo LevelError msg node_info)
+
+-- Bad specifier (e.g. static for a parameter, or extern when there is an initializer)
+-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+instance Show BadSpecifierError     where show = showError "Bad specifier"
+
+badSpecifierError :: NodeInfo -> String -> BadSpecifierError
+badSpecifierError node_info msg = BadSpecifierError (mkErrorInfo LevelError msg node_info)
+
+-- Type mismatch
+-- ~~~~~~~~~~~~~
+typeMismatch :: String -> (NodeInfo, Type) -> (NodeInfo,Type) -> TypeMismatch
+typeMismatch = TypeMismatch
+
+instance Show TypeMismatch where
+    show tm = showError "Type mismatch" (typeMismatchInfo tm)
+instance Error TypeMismatch where
+    errorInfo = typeMismatchInfo
+typeMismatchInfo :: TypeMismatch -> ErrorInfo
+typeMismatchInfo (TypeMismatch reason (node1,_ty2) _t2) =
+    ErrorInfo LevelError (posOfNode node1) [reason]
+
+-- Redefinitions
+-- ~~~~~~~~~~~~~
+
+instance Show RedefError  where
+    show (RedefError lvl info) = showErrorInfo (redefErrLabel info) (redefErrorInfo lvl info)
+instance Error RedefError where
+    errorInfo (RedefError lvl info) = redefErrorInfo lvl info
+    changeErrorLevel (RedefError _lvl info) lvl' = RedefError lvl' info
+
+redefErrLabel :: RedefInfo -> String
+redefErrLabel  (RedefInfo ident _ _ _) = ident ++ " redefined"
+
+redefErrorInfo :: ErrorLevel -> RedefInfo -> ErrorInfo
+redefErrorInfo lvl info@(RedefInfo _ _ node old_node) =
+    ErrorInfo lvl (posOfNode node) ([redefErrReason info] ++ prevDeclMsg old_node)
+
+redefErrReason :: RedefInfo -> String
+redefErrReason (RedefInfo ident DuplicateDef _ _) = "duplicate definition of " ++ ident
+redefErrReason (RedefInfo ident ShadowedDef _ _)   = "this declaration of " ++ ident ++ " shadows a previous one"
+redefErrReason (RedefInfo ident DiffKindRedecl _ _) = ident ++ " previously declared as a different kind of symbol"
+
+prevDeclMsg :: NodeInfo -> [String]
+prevDeclMsg old_node = ["The previous declaration was here: ", show (posOfNode old_node)]
+
+redefinition :: ErrorLevel -> String -> RedefKind -> NodeInfo -> NodeInfo -> RedefError
+redefinition lvl ctx kind new old = RedefError lvl (RedefInfo ctx kind new old)
+
diff --git a/src/Language/C/Analysis/SemRep.hs b/src/Language/C/Analysis/SemRep.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Analysis/SemRep.hs
@@ -0,0 +1,659 @@
+{-# LANGUAGE DeriveDataTypeable  #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Analysis.Syntax
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  alpha
+-- Portability :  ghc
+--
+-- This module contains definitions for representing C translation units.
+-- In contrast to 'Language.C.Syntax.AST', the representation tries to express the semantics of
+-- of a translation unit.
+---------------------------------------------------------------------------------------------------
+module Language.C.Analysis.SemRep(
+-- * Sums of tags and identifiers
+TagDef(..),typeOfTagDef,
+Declaration(..),declIdent,declName,declType,declAttrs,
+IdentDecl(..),objKindDescr, splitIdentDecls,
+-- * Global definitions
+GlobalDecls(..),emptyGlobalDecls,filterGlobalDecls,mergeGlobalDecls,
+-- * Events for visitors
+DeclEvent(..),
+-- * Declarations and definitions
+Decl(..),
+ObjDef(..),isTentative,
+FunDef(..),
+ParamDecl(..),MemberDecl(..),
+TypeDef(..),identOfTypeDef,
+VarDecl(..),
+-- * Declaration attributes
+DeclAttrs(..),isExtDecl,
+Storage(..),declStorage,ThreadLocal,
+Linkage(..),
+-- * Types
+Type(..),
+FunType(..),isFunctionType,
+derefTypeDef,referencedType,hasTypeOfExpr,
+ArraySize(..),
+TypeDefRef(..),
+TypeName(..),BuiltinType(..),
+IntType(..),FloatType(..),
+HasSUERef(..),HasCompTyKind(..),
+CompTypeRef(..),CompType(..),typeOfCompDef,CompTyKind(..),
+EnumTypeRef(..),EnumType(..),typeOfEnumDef,
+Enumerator(..),
+TypeQuals(..),noTypeQuals,mergeTypeQuals,
+-- * Variable names
+VarName(..),identOfVarName,AsmName,
+-- * Attributes (STUB, not yet analyzed)
+Attr(..),Attributes,
+-- * Statements and Expressions (STUB, aliases to Syntax)
+Stmt,Expr,Initializer,AsmBlock,
+)
+where
+import Language.C.Data
+import Language.C.Syntax
+import Language.C.Syntax.Constants
+
+import Data.Map (Map)
+import qualified Data.Map as Map
+import Data.Generics
+import Text.PrettyPrint.HughesPJ
+
+-- | accessor class : struct\/union\/enum names
+class HasSUERef a where
+    sueRef  :: a -> SUERef
+
+-- | accessor class : composite type tags (struct or union)
+class HasCompTyKind a where
+    compTag :: a -> CompTyKind
+
+-- | Composite type definitions (tags)
+data TagDef =  CompDef CompType	  --definition
+     	       | EnumDef EnumType      -- enum definition
+               deriving (Typeable, Data {-! CNode !-})
+
+instance HasSUERef TagDef where
+    sueRef (CompDef ct) = sueRef ct
+    sueRef (EnumDef et) = sueRef et
+
+-- | return the type corresponding to a tag definition
+typeOfTagDef :: TagDef -> TypeName
+typeOfTagDef (CompDef comptype) =  typeOfCompDef comptype
+typeOfTagDef (EnumDef enumtype) =  typeOfEnumDef enumtype
+
+-- | All datatypes aggregating a declaration are instances of @Declaration@
+class Declaration n where
+    -- | get the name, type and declaration attributes of a declaration or definition
+    getVarDecl :: n -> VarDecl
+
+-- | get the declaration corresponding to a definition
+declOfDef :: (Declaration n, CNode n) => n -> Decl
+declOfDef def = let vd = getVarDecl def in Decl vd (nodeInfo def)
+
+-- | get the variable identifier of a declaration (only safe if the
+--    the declaration is known to have a name)
+declIdent :: (Declaration n) => n -> Ident
+declIdent = identOfVarName . declName
+-- | get the variable name of a @Declaration@
+declName ::  (Declaration n) => n -> VarName
+declName = (\(VarDecl n _ _) -> n) . getVarDecl
+-- | get the type of a @Declaration@
+declType ::  (Declaration n) => n -> Type
+declType = (\(VarDecl _ _ ty) -> ty) . getVarDecl
+-- | get the declaration attributes of a @Declaration@
+declAttrs :: (Declaration n) => n -> DeclAttrs
+declAttrs = (\(VarDecl _ specs _) -> specs) . getVarDecl
+
+instance (Declaration a, Declaration b) => Declaration (Either a b) where
+    getVarDecl = either getVarDecl getVarDecl
+
+-- | identifiers, typedefs and enumeration constants (namespace sum)
+data IdentDecl = Declaration Decl           -- ^ object or function declaration
+	             | ObjectDef ObjDef           -- ^ object definition
+	             | FunctionDef FunDef         -- ^ function definition
+	             | EnumeratorDef Enumerator   -- ^ definition of an enumerator
+               deriving (Typeable, Data {-! CNode !-})
+
+instance Declaration IdentDecl where
+  getVarDecl (Declaration decl) = getVarDecl decl
+  getVarDecl (ObjectDef def) = getVarDecl def
+  getVarDecl (FunctionDef def) = getVarDecl def
+  getVarDecl (EnumeratorDef def) = getVarDecl def
+
+-- | textual description of the kind of an object
+objKindDescr :: IdentDecl -> String
+objKindDescr  (Declaration _ ) = "declaration"
+objKindDescr (ObjectDef _) = "object definition"
+objKindDescr (FunctionDef _) = "function definition"
+objKindDescr (EnumeratorDef _) = "enumerator definition"
+
+-- | @splitIdentDecls includeAllDecls@ splits a map of object, function and enumerator declarations and definitions into one map
+-- holding declarations, and three maps for object definitions, enumerator definitions and function definitions.
+-- If @includeAllDecls@ is @True@ all declarations are present in the first map, otherwise only those where no corresponding definition
+-- is available.
+splitIdentDecls :: Bool -> Map Ident IdentDecl -> (Map Ident Decl,
+                                                ( Map Ident Enumerator,
+                                                  Map Ident ObjDef,
+                                                  Map Ident FunDef ) )
+splitIdentDecls include_all = Map.foldWithKey (if include_all then deal else deal') (Map.empty,(Map.empty,Map.empty,Map.empty))
+  where
+  deal ident entry (decls,defs) = (Map.insert ident (declOfDef entry) decls, addDef ident entry defs)
+  deal' ident (Declaration d) (decls,defs) = (Map.insert ident d decls,defs)
+  deal' ident def (decls,defs) = (decls, addDef ident def defs)
+  addDef ident entry (es,os,fs) =
+    case entry of
+        Declaration _   -> (es,os,fs)
+        EnumeratorDef e -> (Map.insert ident e es,os,fs)
+        ObjectDef o     -> (es,Map.insert ident o os,fs)
+        FunctionDef f   -> (es, os,Map.insert ident f fs)
+
+
+-- | global declaration\/definition table returned by the analysis
+data GlobalDecls = GlobalDecls {
+                     gObjs     :: Map Ident IdentDecl,
+                     gTags     :: Map SUERef TagDef,
+                     gTypeDefs :: Map Ident TypeDef
+                   }
+
+-- | empty global declaration table
+emptyGlobalDecls :: GlobalDecls
+emptyGlobalDecls = GlobalDecls Map.empty Map.empty Map.empty
+
+-- | filter global declarations
+filterGlobalDecls :: (DeclEvent -> Bool) -> GlobalDecls -> GlobalDecls
+filterGlobalDecls decl_filter gmap = GlobalDecls
+    {
+        gObjs  = Map.filter (decl_filter . DeclEvent) (gObjs gmap),
+        gTags  = Map.filter (decl_filter . TagEvent) (gTags gmap),
+        gTypeDefs = Map.filter (decl_filter . TypeDefEvent) (gTypeDefs gmap)
+    }
+-- | merge global declarations
+mergeGlobalDecls :: GlobalDecls -> GlobalDecls -> GlobalDecls
+mergeGlobalDecls gmap1 gmap2 = GlobalDecls
+    {
+        gObjs  = Map.union (gObjs gmap1) (gObjs gmap2),
+        gTags  = Map.union  (gTags gmap1) (gTags gmap2),
+        gTypeDefs = Map.union (gTypeDefs gmap1) (gTypeDefs gmap2)
+    }
+
+
+-- * Events
+
+-- | Declaration events
+--
+-- Those events are reported to callbacks, which are executed during the traversal.
+data DeclEvent =
+       TagEvent  TagDef
+       -- ^ file-scope struct\/union\/enum event
+     | DeclEvent IdentDecl
+       -- ^ file-scope declaration or definition
+     | TypeDefEvent TypeDef
+       -- ^ a type definition
+     | AsmEvent AsmBlock
+       -- ^ assembler block
+     deriving ({-! CNode !-})
+
+-- * Declarations and definitions
+
+-- | Declarations, which aren't definitions
+data Decl = Decl VarDecl NodeInfo
+            deriving (Typeable, Data {-! CNode !-})
+
+instance Declaration Decl where
+    getVarDecl   (Decl vd _) =  vd
+
+-- | Object Definitions
+--
+-- An object definition is a declaration together with an initializer.
+--
+-- If the initializer is missing, it is a tentative definition, i.e. a
+-- definition which might be overriden later on.
+data ObjDef = ObjDef VarDecl (Maybe Initializer) NodeInfo
+             deriving (Typeable, Data {-! CNode !-})
+instance Declaration ObjDef where
+    getVarDecl  (ObjDef vd _ _) =  vd
+
+-- | Returns @True@ if the given object definition is tentative.
+isTentative :: ObjDef -> Bool
+isTentative (ObjDef decl init_opt _) | isExtDecl decl = maybe True (const False) init_opt
+                                     | otherwise = False
+
+-- | Function definitions
+--
+-- A function definition is a declaration together with a statement (the function body).
+data FunDef = FunDef VarDecl Stmt NodeInfo
+             deriving (Typeable, Data {-! CNode !-})
+instance Declaration FunDef where
+    getVarDecl (FunDef vd _ _) = vd
+
+
+-- | Parameter declaration
+data ParamDecl = ParamDecl VarDecl NodeInfo
+               | AbstractParamDecl VarDecl NodeInfo
+    deriving (Typeable, Data {-! CNode !-} )
+
+instance Declaration ParamDecl where
+  getVarDecl (ParamDecl vd _) = vd
+  getVarDecl (AbstractParamDecl vd _) = vd
+
+-- | Struct\/Union member declaration
+data MemberDecl = MemberDecl VarDecl (Maybe Expr) NodeInfo
+                  -- ^ @MemberDecl vardecl bitfieldsize node@
+                | AnonBitField Type Expr NodeInfo
+                  -- ^ @AnonBitField typ size@
+    deriving (Typeable, Data {-! CNode !-} )
+
+instance Declaration MemberDecl where
+  getVarDecl (MemberDecl vd _ _) = vd
+  getVarDecl (AnonBitField ty _ _) = VarDecl NoName (DeclAttrs False NoStorage []) ty
+
+-- | @typedef@ definitions.
+--
+-- The identifier is a new name for the given type.
+data TypeDef = TypeDef Ident Type Attributes NodeInfo
+               deriving (Typeable, Data {-! CNode !-} )
+
+-- | return the idenitifier of a @typedef@
+identOfTypeDef :: TypeDef -> Ident
+identOfTypeDef (TypeDef ide _ _ _) = ide
+
+-- | Generic variable declarations
+data VarDecl = VarDecl VarName DeclAttrs Type
+              deriving (Typeable, Data)
+
+instance Declaration VarDecl where
+  getVarDecl = id
+
+-- @isExtDecl d@ returns true if the declaration has /linkage/
+isExtDecl :: (Declaration n) => n -> Bool
+isExtDecl = hasLinkage . declStorage
+
+-- | Declaration attributes of the form @DeclAttrs isInlineFunction storage linkage attrs@
+--
+-- They specify the storage and linkage of a declared object.
+data DeclAttrs = DeclAttrs Bool Storage Attributes
+                 -- ^ @DeclAttrs inline storage attrs@
+               deriving (Typeable, Data)
+
+-- | get the 'Storage' of a declaration
+declStorage :: (Declaration d) => d -> Storage
+declStorage d = case declAttrs d of (DeclAttrs _ st _) -> st
+
+-- In C we have
+--  Identifiers can either have internal, external or no linkage
+--  (same object everywhere, same object within the translation unit, unique).
+--  * top-level identifiers
+--      static : internal linkage (objects and function defs)
+--      extern : linkage of prior declaration (if specified), external linkage otherwise
+--      no-spec: external linkage
+--  * storage duration
+--      * static storage duration: objects with external or internal linkage, or local ones with the static keyword
+--      * automatic storage duration: otherwise (register)
+-- See http://publications.gbdirect.co.uk/c_book/chapter8/declarations_and_definitions.html, Table 8.1, 8.2
+
+-- | Storage duration and linkage of a variable
+data Storage  =  NoStorage                  -- ^ no storage
+               | Auto Register              -- ^ automatic storage (optional: register)
+               | Static Linkage ThreadLocal -- ^ static storage, with linkage and thread local specifier (gnu c)
+               | FunLinkage Linkage         -- ^ function, either internal or external linkage
+               deriving (Typeable, Data, Show, Eq, Ord)
+
+type ThreadLocal = Bool
+type Register    = Bool
+
+-- | Linkage: Either internal to the translation unit or external
+data Linkage = InternalLinkage | ExternalLinkage
+               deriving (Typeable, Data, Show, Eq, Ord)
+
+-- | return @True@ if the object has linkage
+hasLinkage :: Storage -> Bool
+hasLinkage (Static _ _) = True
+hasLinkage _ = False
+
+-- * types
+
+-- | types of C objects
+data Type =
+       DirectType TypeName TypeQuals
+     -- ^ a non-derived type
+     | PtrType Type TypeQuals Attributes
+     -- ^ pointer type
+     | ArrayType Type ArraySize TypeQuals Attributes
+     -- ^ array type
+     | FunctionType FunType
+     -- ^ function type
+     | TypeDefType TypeDefRef
+     -- ^ a defined type
+     | TypeOfExpr Expr
+     -- ^ (GNU) typeof (/broken/ and should be removed, but we do not yet have expression type analysis)
+     deriving (Typeable, Data)
+
+-- | Function types are of the form @FunType return-type params isVariadic attrs@.
+--
+-- If the parameter types aren't yet known, the function has type @FunTypeIncomplete type attrs@.
+data FunType = FunType Type [ParamDecl] Bool Attributes
+            |  FunTypeIncomplete Type Attributes
+               deriving (Typeable, Data)
+
+-- | resolve typedefs, if possible
+derefTypeDef :: Type -> Type
+derefTypeDef (TypeDefType (TypeDefRef _ (Just actual_ty) _)) = derefTypeDef actual_ty
+derefTypeDef ty = ty
+
+-- may not be called on undefined typeDefs or typeof(expr)
+referencedType :: Type -> Maybe Type
+referencedType (PtrType ty _ _) = Just ty
+referencedType (FunctionType (FunType ty _ _ _)) = Just ty
+referencedType (ArrayType ty _ _ _) = Just ty
+referencedType (TypeDefType (TypeDefRef _ (Just actual_ty) _)) = Just actual_ty
+referencedType (DirectType _ _) = Nothing
+referencedType _ = error "referencedType: failed to resolve type"
+
+hasTypeOfExpr :: Type -> Bool
+hasTypeOfExpr (TypeOfExpr _) = True
+hasTypeOfExpr ty = maybe False hasTypeOfExpr (referencedType ty)
+
+-- | return @True@ if the given type is a function type
+--
+--   Result is undefined in the presence of TypeOfExpr or undefined typeDefs
+isFunctionType :: Type -> Bool
+isFunctionType ty =
+    case ty of  TypeDefType (TypeDefRef _ (Just actual_ty) _) -> isFunctionType actual_ty
+                TypeDefType _ -> error "isFunctionType: unresolved typeDef"
+                TypeOfExpr _  -> error "isFunctionType: typeof(expr)"
+                FunctionType _ -> True
+                _ -> False
+
+-- | An array type may either have unknown size or a specified array size, the latter either variable or constant.
+-- Furthermore, when used as a function parameters, the size may be qualified as /static/.
+-- In a function prototype, the size may be `Unspecified variable size' (@[*]@).
+data ArraySize =  UnknownArraySize Bool
+                -- ^ @UnknownArraySize is-starred@
+                | ArraySize Bool Expr
+                -- ^ @FixedSizeArray is-static size-expr@
+               deriving (Typeable, Data)
+
+-- | normalized type representation
+data TypeName =
+      TyVoid
+    | TyIntegral IntType
+    | TyFloating FloatType
+    | TyComplex  FloatType
+    | TyComp CompTypeRef
+    | TyEnum EnumTypeRef
+    | TyBuiltin BuiltinType
+    deriving (Typeable, Data)
+
+-- | Builtin type (va_list)
+data BuiltinType = TyVaList
+                   deriving (Typeable, Data)
+
+-- | typdef references
+-- If the actual type is known, it is attached for convenience
+data TypeDefRef = TypeDefRef Ident (Maybe Type) NodeInfo
+               deriving (Typeable, Data {-! CNode !-})
+
+-- | integral types (C99 6.7.2.2)
+data IntType =
+      TyBool
+    | TyChar
+    | TySChar
+    | TyUChar
+    | TyShort
+    | TyUShort
+    | TyInt
+    | TyUInt
+    | TyLong
+    | TyULong
+    | TyLLong
+    | TyULLong
+    deriving (Typeable, Data, Eq, Ord)
+
+instance Show IntType where
+    show TyBool = "_Bool"
+    show TyChar = "char"
+    show TySChar = "signed char"
+    show TyUChar = "unsigned char"
+    show TyShort = "short"
+    show TyUShort = "unsigned short"
+    show TyInt = "int"
+    show TyUInt = "unsigned int"
+    show TyLong = "long"
+    show TyULong = "unsigned long"
+    show TyLLong = "long long"
+    show TyULLong = "unsigned long long"
+
+-- | floating point type (C99 6.7.2.2)
+data FloatType =
+      TyFloat
+    | TyDouble
+    | TyLDouble
+    deriving (Typeable, Data, Eq, Ord)
+
+instance Show FloatType where
+    show TyFloat = "float"
+    show TyDouble = "double"
+    show TyLDouble = "long double"
+
+-- | composite type declarations
+data CompTypeRef = CompTypeRef SUERef CompTyKind NodeInfo
+                    deriving (Typeable, Data {-! CNode !-})
+
+instance HasSUERef  CompTypeRef where sueRef  (CompTypeRef ref _ _) = ref
+instance HasCompTyKind CompTypeRef where compTag (CompTypeRef _ tag _)  = tag
+
+data EnumTypeRef = EnumTypeRef SUERef NodeInfo
+    deriving (Typeable, Data {-! CNode !-})
+instance HasSUERef  EnumTypeRef where sueRef  (EnumTypeRef ref _) = ref
+
+-- | Composite type (struct or union).
+data CompType =  CompType SUERef CompTyKind [MemberDecl] Attributes NodeInfo
+                 deriving (Typeable, Data {-! CNode !-} )
+instance HasSUERef  CompType where sueRef  (CompType ref _ _ _ _) = ref
+instance HasCompTyKind CompType where compTag (CompType _ tag _ _ _) = tag
+
+-- | return the type of a composite type definition
+typeOfCompDef :: CompType -> TypeName
+typeOfCompDef (CompType ref tag _ _ _) = TyComp (CompTypeRef ref tag internalNode)
+
+-- | a tag to determine wheter we refer to a @struct@ or @union@, see 'CompType'.
+data CompTyKind =  StructTag
+                 | UnionTag
+    deriving (Eq,Ord,Typeable,Data)
+
+instance Show CompTyKind where
+    show StructTag = "struct"
+    show UnionTag  = "union"
+
+-- | Representation of C enumeration types
+data EnumType = EnumType SUERef [Enumerator] Attributes NodeInfo
+                 -- ^ @EnumType name enumeration-constants attrs node@
+                 deriving (Typeable, Data {-! CNode !-} )
+
+instance HasSUERef EnumType where sueRef  (EnumType ref _ _ _) = ref
+
+-- | return the type of an enum definition
+typeOfEnumDef :: EnumType -> TypeName
+typeOfEnumDef (EnumType ref _ _ _) = TyEnum (EnumTypeRef ref internalNode)
+
+-- | An Enumerator consists of an identifier, a constant expressions and the link to its type
+data Enumerator = Enumerator Ident Expr EnumType NodeInfo
+                  deriving (Typeable, Data {-! CNode !-})
+instance Declaration Enumerator where
+  getVarDecl (Enumerator ide _ enumty _) =
+    VarDecl
+      (VarName ide Nothing)
+      (DeclAttrs False NoStorage [])
+      (DirectType (typeOfEnumDef enumty) noTypeQuals)
+
+-- | Type qualifiers: constant, volatile and restrict
+data TypeQuals = TypeQuals { constant :: Bool, volatile :: Bool, restrict :: Bool }
+    deriving (Typeable, Data)
+
+-- | no type qualifiers
+noTypeQuals :: TypeQuals
+noTypeQuals = TypeQuals False False False
+
+-- | merge (/&&/) two type qualifier sets
+mergeTypeQuals :: TypeQuals -> TypeQuals -> TypeQuals
+mergeTypeQuals (TypeQuals c1 v1 r1) (TypeQuals c2 v2 r2) = TypeQuals (c1 && c2) (v1 && v2) (r1 && r2)
+
+-- * initializers
+
+-- | 'Initializer' is currently an alias for 'CInit'.
+--
+-- We're planning a normalized representation, but this depends on the implementation of
+-- constant expression evaluation
+type Initializer = CInit
+
+-- | Normalized C Initializers
+-- * If the expression has scalar type, the initializer is an expression
+-- * If the expression has struct type, the initializer is a map from designators to initializers
+-- * If the expression has array type, the initializer is a list of values
+-- Not implemented yet, as it depends on constant expression evaluation
+
+
+-- * names and attributes
+
+-- | @VarName name assembler-name@ is a name of an declared object
+data VarName =  VarName Ident (Maybe AsmName)
+              | NoName
+               deriving (Typeable, Data)
+identOfVarName :: VarName -> Ident
+identOfVarName NoName            = error "identOfVarName: NoName"
+identOfVarName (VarName ident _) = ident
+
+-- | Top level assembler block (alias for @CStrLit@)
+type AsmBlock = CStrLit
+
+-- | Assembler name (alias for @CStrLit@)
+type AsmName = CStrLit
+
+-- | @__attribute__@ annotations
+--
+-- Those are of the form @Attr attribute-name attribute-parameters@,
+-- and serve as generic properties of some syntax tree elements.
+--
+-- Some examples:
+--
+-- * labels can be attributed with /unused/ to indicate that their not used
+--
+-- * struct definitions can be attributed with /packed/ to tell the compiler to use the most compact representation
+--
+-- * declarations can be attributed with /deprecated/
+--
+-- * function declarations can be attributes with /noreturn/ to tell the compiler that the function will never return,
+--
+-- * or with /const/ to indicate that it is a pure function
+--
+-- /TODO/: ultimatively, we want to parse attributes and represent them in a typed way
+data Attr = Attr Ident [Expr] NodeInfo
+            deriving (Typeable, Data {-! CNode !-})
+
+type Attributes = [Attr]
+
+-- * statements and expressions (Type aliases)
+
+-- | 'Stmt' is an alias for 'CStat' (Syntax)
+type Stmt = CStat
+-- | 'Expr' is currently an alias for 'CExpr' (Syntax)
+type Expr = CExpr
+
+
+
+--------------------------------------------------------
+-- DERIVES GENERATED CODE
+-- DO NOT MODIFY BELOW THIS LINE
+-- CHECKSUM: 1672142450
+
+instance CNode TagDef
+    where nodeInfo (CompDef d) = nodeInfo d
+          nodeInfo (EnumDef d) = nodeInfo d
+instance Pos TagDef
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode IdentDecl
+    where nodeInfo (Declaration d) = nodeInfo d
+          nodeInfo (ObjectDef d) = nodeInfo d
+          nodeInfo (FunctionDef d) = nodeInfo d
+          nodeInfo (EnumeratorDef d) = nodeInfo d
+instance Pos IdentDecl
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode DeclEvent
+    where nodeInfo (TagEvent d) = nodeInfo d
+          nodeInfo (DeclEvent d) = nodeInfo d
+          nodeInfo (TypeDefEvent d) = nodeInfo d
+          nodeInfo (AsmEvent d) = nodeInfo d
+instance Pos DeclEvent
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode Decl
+    where nodeInfo (Decl _ nodeinfo) = nodeinfo
+instance Pos Decl
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode ObjDef
+    where nodeInfo (ObjDef _ _ nodeinfo) = nodeinfo
+instance Pos ObjDef
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode FunDef
+    where nodeInfo (FunDef _ _ nodeinfo) = nodeinfo
+instance Pos FunDef
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode ParamDecl
+    where nodeInfo (ParamDecl _ nodeinfo) = nodeinfo
+          nodeInfo (AbstractParamDecl _ nodeinfo) = nodeinfo
+instance Pos ParamDecl
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode MemberDecl
+    where nodeInfo (MemberDecl _ _ nodeinfo) = nodeinfo
+          nodeInfo (AnonBitField _ _ nodeinfo) = nodeinfo
+instance Pos MemberDecl
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode TypeDef
+    where nodeInfo (TypeDef _ _ _ nodeinfo) = nodeinfo
+instance Pos TypeDef
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode TypeDefRef
+    where nodeInfo (TypeDefRef _ _ nodeinfo) = nodeinfo
+instance Pos TypeDefRef
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CompTypeRef
+    where nodeInfo (CompTypeRef _ _ nodeinfo) = nodeinfo
+instance Pos CompTypeRef
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode EnumTypeRef
+    where nodeInfo (EnumTypeRef _ nodeinfo) = nodeinfo
+instance Pos EnumTypeRef
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CompType
+    where nodeInfo (CompType _ _ _ _ nodeinfo) = nodeinfo
+instance Pos CompType
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode EnumType
+    where nodeInfo (EnumType _ _ _ nodeinfo) = nodeinfo
+instance Pos EnumType
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode Enumerator
+    where nodeInfo (Enumerator _ _ _ nodeinfo) = nodeinfo
+instance Pos Enumerator
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode Attr
+    where nodeInfo (Attr _ _ nodeinfo) = nodeinfo
+instance Pos Attr
+    where posOf x = posOfNode (nodeInfo x)
diff --git a/src/Language/C/Analysis/TravMonad.hs b/src/Language/C/Analysis/TravMonad.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Analysis/TravMonad.hs
@@ -0,0 +1,429 @@
+{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances, FlexibleContexts,FlexibleInstances,
+             PatternSignatures, PatternGuards, RankNTypes, ScopedTypeVariables #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Analysis.TravMonad
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  alpha
+-- Portability :  ghc
+--
+-- Monad for Traversals of the C AST.
+--
+-- For the traversal, we maintain a symboltable and need MonadError and unique
+-- name generation facilities.
+-- Furthermore, the user may provide callbacks to handle declarations and definitions.
+-----------------------------------------------------------------------------
+module Language.C.Analysis.TravMonad (
+    -- * AST traversal monad
+    MonadTrav(..),
+    -- * Handling declarations
+    handleTagDecl, handleTagDef, handleEnumeratorDef, handleTypeDef,
+    handleObjectDef,handleFunDef,handleVarDecl,handleParamDecl,
+    handleAsmBlock,
+    -- * Symbol table scope modification
+    enterPrototypeScope,leavePrototypeScope,
+    enterFunctionScope,leaveFunctionScope,
+    enterBlockScope,leaveBlockScope,
+    -- * Symbol table lookup (delegate)
+    lookupTypeDef, lookupObject,
+    -- * Symbol table modification
+    createSUERef,
+    -- * Additional error handling facilities
+    hadHardErrors,handleTravError,throwOnLeft,
+    astError, warn,
+    -- * Trav - default MonadTrav implementation
+    Trav(..),
+    runTrav,runTrav_,
+    TravState,initTravState,withExtDeclHandler,modifyUserState,userState,
+    -- * Helpers
+    mapMaybeM,maybeM,mapSndM,concatMapM,
+)
+where
+import Language.C.Data
+import Language.C.Data.RList as RList
+import Language.C.Syntax
+
+import Language.C.Analysis.SemError
+import Language.C.Analysis.SemRep
+import Language.C.Analysis.DefTable hiding (enterBlockScope,leaveBlockScope,
+                                            enterFunctionScope,leaveFunctionScope)
+import qualified Language.C.Analysis.DefTable as ST
+
+import Data.Maybe
+import Control.Monad(liftM)
+
+-- | Traversal monad
+class (Monad m) => MonadTrav m where
+    -- error handling facilities
+
+    -- | throw an 'Error'
+    throwTravError :: Error e => e -> m a
+    -- | catch an 'Error' (we could implement dynamically-typed catch here)
+    catchTravError :: m a -> (CError -> m a) -> m a
+    -- | remember that an 'Error' occured (without throwing it)
+    recordError    :: Error e => e -> m ()
+    -- | return the list of recorded errors
+    getErrors      :: m [CError]
+
+    -- symbol table handling
+
+    -- | return the definition table
+    getDefTable :: m DefTable
+    -- | perform an action modifying the definition table
+    withDefTable :: (DefTable -> (a, DefTable)) -> m a
+
+    -- | unique name generation
+    genName :: m Name
+
+    -- | handling declarations and definitions
+    handleDecl :: DeclEvent -> m ()
+
+-- * handling declarations
+
+-- check wheter a redefinition is ok
+checkRedef :: (MonadTrav m, CNode t, CNode t1) => String -> t -> (DeclarationStatus t1) -> m ()
+checkRedef subject new_decl redecl_status =
+    case redecl_status of
+        NewDecl -> return ()
+        Redeclared old_def   -> throwTravError $
+            redefinition LevelError subject DuplicateDef (nodeInfo new_decl) (nodeInfo old_def)
+        KindMismatch old_def -> throwTravError $
+            redefinition LevelError subject DiffKindRedecl (nodeInfo new_decl) (nodeInfo old_def)
+        Shadowed _old_def     ->  return ()
+            -- warn $
+            -- redefinition LevelWarn subject ShadowedDef (nodeInfo new_decl) (nodeInfo old_def)
+        KeepDef _old_def      -> return ()
+
+-- | forward declaration of a tag. Only neccessary for name analysis, but otherwise no semantic
+-- consequences.
+handleTagDecl :: (MonadTrav m) => TagFwdDecl -> m ()
+handleTagDecl decl = do
+    redecl <- withDefTable $ declareTag (sueRef decl) decl
+    checkRedef (show $ sueRef decl) decl redecl
+
+-- | define the given composite type or enumeration
+-- If there is a declaration visible, overwrite it with the definition.
+-- Otherwise, enter a new definition in the current namespace.
+-- If there is already a definition present, yield an error (redeclaration).
+handleTagDef :: (MonadTrav m) => TagDef -> m ()
+handleTagDef def = do
+    redecl <- withDefTable $ defineTag (sueRef def) def
+    checkRedef (show $ sueRef def) def redecl
+    handleDecl (TagEvent def)
+
+handleEnumeratorDef :: (MonadTrav m) => Enumerator ->  m ()
+handleEnumeratorDef enumerator = do
+    let ident = declIdent enumerator
+    redecl <- withDefTable $ defineScopedIdent ident (EnumeratorDef enumerator)
+    checkRedef (show ident) ident redecl
+    return ()
+
+handleTypeDef :: (MonadTrav m) => TypeDef -> m ()
+handleTypeDef typeDef@(TypeDef ident _ _ _) = do
+    redecl <- withDefTable $ defineTypeDef ident typeDef
+    checkRedef (show ident) typeDef redecl
+    handleDecl (TypeDefEvent typeDef)
+    return ()
+
+handleAsmBlock :: (MonadTrav m) => AsmBlock -> m ()
+handleAsmBlock asm = handleDecl (AsmEvent asm)
+
+redefErr :: (MonadTrav m, CNode old, CNode new) => Ident -> ErrorLevel -> new -> old -> RedefKind -> m ()
+redefErr name lvl new old kind =
+  throwTravError $ redefinition lvl (show name) kind (nodeInfo new) (nodeInfo old)
+
+-- TODO: unused
+checkIdentTyRedef :: (MonadTrav m) => IdentEntry -> (DeclarationStatus IdentEntry) -> m ()
+checkIdentTyRedef (Right decl) status = checkVarRedef decl status
+checkIdentTyRedef (Left tydef) (KindMismatch old_def) =
+  redefErr (identOfTypeDef tydef) LevelError tydef old_def DiffKindRedecl
+checkIdentTyRedef (Left tydef) (Redeclared old_def) =
+  redefErr (identOfTypeDef tydef) LevelError tydef old_def DuplicateDef
+checkIdentTyRedef (Left _tydef) _ = return ()
+
+checkVarRedef :: (MonadTrav m) => IdentDecl -> (DeclarationStatus IdentEntry) -> m ()
+checkVarRedef def redecl =
+    case redecl of
+        -- always an error
+        KindMismatch old_def -> redefVarErr old_def DiffKindRedecl
+        -- types have to match
+        KeepDef (Right old_def) -> throwOnLeft $ checkCompatibleTypes new_ty (declType old_def)
+        -- redeclaration: old entry has to be a declaration or tentative, type have to match
+        Redeclared (Right old_def) | isTentativeG old_def ->
+                                      throwOnLeft $ checkCompatibleTypes new_ty (declType old_def)
+                                   | otherwise -> redefVarErr old_def DuplicateDef
+        -- NewDecl/Shadowed is ok
+        _ -> return ()
+    where
+    redefVarErr old_def kind = redefErr (declIdent def) LevelError def old_def kind
+    new_ty = declType def
+    isTentativeG (Declaration _) = True
+    isTentativeG (ObjectDef od)  = isTentative od
+    isTentativeG _               = False
+
+-- | handle variable declarations (external object declarations and function prototypes)
+-- variable declarations are either function prototypes, or external declarations, and not very
+-- interesting on their own. we only put them in the symbol table and call the handle.
+-- declarations never override definitions
+handleVarDecl :: (MonadTrav m) => Decl -> m ()
+handleVarDecl decl = do
+    def <- enterDecl decl (const False)
+    handleDecl (DeclEvent def)
+
+-- | handle parameter declaration. The interesting part is that parameters can be abstract
+-- (if they are part of a type). If they have a name, we enter the name (usually in function prototype or function scope),
+-- checking if there are duplicate definitions. 
+-- FIXME: I think it would be more transparent to handle parameter declarations in a special way
+handleParamDecl :: (MonadTrav m) => ParamDecl -> m ()
+handleParamDecl (AbstractParamDecl _ _) = return ()
+handleParamDecl (ParamDecl vardecl node) = do
+    let def = ObjectDef (ObjDef vardecl Nothing node)
+    redecl <- withDefTable $ defineScopedIdent (declIdent def) def
+    checkVarRedef def redecl
+    return ()
+
+-- shared impl
+enterDecl :: (MonadTrav m) => Decl -> (IdentDecl -> Bool) -> m IdentDecl
+enterDecl decl cond = do
+    let def = Declaration decl
+    redecl <- withDefTable $
+              defineScopedIdentWhen cond (declIdent def) def
+    checkVarRedef def redecl
+    return def
+
+-- | handle function definitions
+handleFunDef :: (MonadTrav m) => Ident -> FunDef -> m ()
+handleFunDef ident fun_def = do
+    let def = FunctionDef fun_def
+    redecl <- withDefTable $
+              defineScopedIdentWhen isDeclaration ident def
+    checkVarRedef def redecl
+    handleDecl (DeclEvent def)
+
+isDeclaration :: IdentDecl -> Bool
+isDeclaration (Declaration _) = True
+isDeclaration _ = False
+
+checkCompatibleTypes :: Type -> Type -> Either TypeMismatch ()
+checkCompatibleTypes _ _ = Right ()
+
+-- | handle object defintions (maybe tentative)
+handleObjectDef :: (MonadTrav m) => Ident -> ObjDef -> m ()
+handleObjectDef ident obj_def = do
+    let def = ObjectDef obj_def
+    redecl <- withDefTable $
+              defineScopedIdentWhen (\o -> shouldOverride def o) ident def
+    checkVarRedef def redecl
+    handleDecl (DeclEvent def)
+    where
+    isTentativeDef (ObjectDef object_def) = isTentative object_def
+    isTentativeDef _ = False
+    shouldOverride def o | isDeclaration o = True
+                         | not (isTentativeDef def) = True
+                         | isTentativeDef o = True
+                         | otherwise = False
+
+-- * scope manipulation
+--
+--  * file scope: outside of parameter lists and blocks (outermost)
+--
+--  * function prototype scope
+--
+--  * function scope: labels are visible within the entire function, and declared implicitely
+--
+--  * block scope
+updDefTable :: (MonadTrav m) => (DefTable -> DefTable) -> m ()
+updDefTable f = withDefTable (\st -> ((),f st))
+
+enterPrototypeScope :: (MonadTrav m) => m ()
+enterPrototypeScope = updDefTable (ST.enterBlockScope)
+
+leavePrototypeScope :: (MonadTrav m) => m ()
+leavePrototypeScope = updDefTable (ST.leaveBlockScope)
+
+enterFunctionScope :: (MonadTrav m) => m ()
+enterFunctionScope = updDefTable (ST.enterFunctionScope)
+
+leaveFunctionScope :: (MonadTrav m) => m ()
+leaveFunctionScope = updDefTable (ST.leaveFunctionScope)
+
+enterBlockScope :: (MonadTrav m) => m ()
+enterBlockScope = updDefTable (ST.enterBlockScope)
+
+leaveBlockScope :: (MonadTrav m) => m ()
+leaveBlockScope = updDefTable (ST.leaveBlockScope)
+
+-- * Lookup
+
+-- | lookup a type definition
+-- the 'wrong kind of object' is an internal error here,
+-- because the parser should distinguish typeDefs and other
+-- objects
+lookupTypeDef :: (MonadTrav m) => Ident -> m Type
+lookupTypeDef ident =
+    getDefTable >>= \symt ->
+    case lookupIdent ident symt of
+        Nothing                             -> astError (nodeInfo ident) "unbound typeDef"
+        Just (Left (TypeDef _ident ty _ _)) -> return ty
+        Just (Right d)                      -> astError (nodeInfo ident) (wrongKindErrMsg d)
+    where
+    wrongKindErrMsg d = "wrong kind of object: excepcted typeDef but found: "++(objKindDescr d)
+
+
+-- | lookup an object, function or enumerator
+lookupObject :: (MonadTrav m) => Ident -> m (Maybe IdentDecl)
+lookupObject ident = do
+    old_decl <- liftM (lookupIdent ident) getDefTable
+    mapMaybeM old_decl $ \obj ->
+        case obj of
+        Right objdef -> return objdef
+        Left _tydef  -> astError (nodeInfo ident) (mismatchErr "lookupObject" "an object" "a typeDef")
+
+
+mismatchErr :: String -> String -> String -> String
+mismatchErr ctx expect found = ctx ++ ": Expected " ++ expect ++ ", but found: " ++ found
+
+-- * inserting declarations
+
+-- | create a reference to a struct\/union\/enum
+--
+-- This currently depends on the fact the structs are tagged with unique names.
+-- We could use the name generation of TravMonad as well, which might be the better
+-- choice when dealing with autogenerated code.
+createSUERef :: (MonadTrav m) => NodeInfo -> Maybe Ident -> m SUERef
+createSUERef _node_info (Just ident) = return$ NamedRef ident
+createSUERef node_info Nothing | (Just name) <- nameOfNode node_info = return $ AnonymousRef name
+                               | otherwise = astError node_info "struct/union/enum definition without unique name"
+
+-- * error handling facilities
+
+handleTravError :: (MonadTrav m) => m a -> m (Maybe a)
+handleTravError a = liftM Just a `catchTravError` (\e -> recordError e >> return Nothing)
+
+-- | check wheter non-recoverable errors occured
+hadHardErrors :: [CError] -> Bool
+hadHardErrors = (not . null . filter isHardError)
+
+-- | raise an error caused by a malformed AST
+astError :: (MonadTrav m) => NodeInfo -> String -> m a
+astError node msg = throwTravError $ invalidAST node msg
+
+-- | raise an error based on an Either argument
+throwOnLeft :: (MonadTrav m, Error e) => Either e a -> m a
+throwOnLeft (Left err) = throwTravError err
+throwOnLeft (Right v)  = return v
+
+warn :: (Error e, MonadTrav m) => e -> m ()
+warn err = recordError (changeErrorLevel err LevelWarn)
+
+-- * The Trav datatype
+
+-- | simple traversal monad, providing user state and callbacks
+newtype Trav s a = Trav { unTrav :: TravState s -> Either CError (a, TravState s) }
+modify :: (TravState s -> TravState s) -> Trav s ()
+modify f = Trav (\s -> Right ((),f s))
+gets :: (TravState s -> a) -> Trav s a
+gets f   = Trav (\s -> Right (f s, s))
+get ::  Trav s (TravState s)
+get      = Trav (\s -> Right (s,s))
+put :: TravState s -> Trav s ()
+put s    = Trav (\_ -> Right ((),s))
+
+runTrav :: forall s a. s -> Trav s a -> Either [CError] (a, TravState s)
+runTrav state traversal =
+    case unTrav action (initTravState state) of
+        Left trav_err                                 -> Left [trav_err]
+        Right (v, ts) | hadHardErrors (travErrors ts) -> Left (travErrors ts)
+                      | otherwise                     -> Right (v,ts)
+    where
+    action = do withDefTable $ defineTypeDef (identOfTypeDef va_list) va_list
+                traversal
+    va_list = (TypeDef (internalIdent "__builtin_va_list")
+                       (DirectType (TyBuiltin TyVaList) noTypeQuals)
+                       []
+                       (internalNode))
+
+runTrav_ :: Trav () a -> Either [CError] (a,[CError])
+runTrav_ t = fmap fst . runTrav () $
+    do r <- t
+       es <- getErrors
+       return (r,es)
+
+withExtDeclHandler :: Trav s a -> (DeclEvent -> Trav s ()) -> Trav s a
+withExtDeclHandler action handler =
+    do modify $ \st -> st { doHandleExtDecl = handler }
+       action
+
+instance Monad (Trav s) where
+    return x  = Trav (\s -> Right (x,s))
+    m >>= k   = Trav (\s -> case unTrav m s of
+                              Right (x,s1) -> unTrav (k x) s1
+                              Left e       -> Left e)
+
+instance MonadTrav (Trav s) where
+    -- error handling facilities
+    throwTravError e = Trav (\_ -> Left (toError e))
+    catchTravError a handler = Trav (\s -> case unTrav a s of
+                                             Left e  -> unTrav (handler e) s
+                                             Right r -> Right r)
+    recordError e = modify $ \st -> st { rerrors = (rerrors st) `snoc` toError e }
+    getErrors = gets (RList.reverse . rerrors)
+    -- symbol table handling
+    getDefTable = gets symbolTable
+    withDefTable f = do
+        ts <- get
+        let (r,symt') = f (symbolTable ts)
+        put $ ts { symbolTable = symt' }
+        return r
+    -- unique name generation
+    genName = generateName
+    -- handling declarations and definitions
+    handleDecl d = ($ d) =<< gets doHandleExtDecl
+
+data TravState s =
+    TravState {
+        symbolTable :: DefTable,
+        rerrors :: RList CError,
+        nameGenerator :: [Name],
+        doHandleExtDecl :: (DeclEvent -> Trav s ()),
+        userState :: s
+      }
+
+travErrors :: TravState s -> [CError]
+travErrors = RList.reverse . rerrors
+
+initTravState :: s -> TravState s
+initTravState userst =
+    TravState {
+        symbolTable = emptyDefTable,
+        rerrors = RList.empty,
+        nameGenerator = namesStartingFrom 0,
+        doHandleExtDecl = const (return ()),
+        userState = userst
+      }
+
+-- * Trav specific operations
+modifyUserState :: (s -> s) -> Trav s ()
+modifyUserState f = modify $ \ts -> ts { userState = f (userState ts) }
+
+generateName :: Trav s Name
+generateName =
+    get >>= \ts ->
+    do let (new_name : gen') = nameGenerator ts
+       put $ ts { nameGenerator = gen'}
+       return new_name
+
+-- * helpers
+mapMaybeM :: (Monad m) => (Maybe a) -> (a -> m b) -> m (Maybe b)
+mapMaybeM m f = maybe (return Nothing) (liftM Just . f) m
+
+maybeM :: (Monad m) => (Maybe a) -> (a -> m ()) -> m ()
+maybeM m f = maybe (return ()) f m
+
+mapSndM :: (Monad m) => (b -> m c) -> (a,b) -> m (a,c)
+mapSndM f (a,b) = liftM ((,) a) (f b)
+
+concatMapM :: (Monad m) => (a -> m [b]) -> [a] -> m [b]
+concatMapM f = liftM concat . mapM f
diff --git a/src/Language/C/Data.hs b/src/Language/C/Data.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Data.hs
@@ -0,0 +1,39 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Data
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  : benedikt.huber@gmail.com
+-- Stability   : experimental
+-- Portability : ghc
+--
+-- Common data types for Language.C: Identifiers, unique names, source code locations,
+-- ast node attributes and extensible errors.
+-----------------------------------------------------------------------------
+module Language.C.Data (
+     -- * Input stream
+     module Language.C.Data.InputStream,
+     -- * Identifiers
+     SUERef(..), isAnonymousRef,
+     Ident,mkIdent, identToString, internalIdent, isInternalIdent, builtinIdent,
+     -- * Unqiue names
+     Name(..),namesStartingFrom,
+     -- * Source code positions
+     Position(..),Pos(..),
+     posFile,posRow,posColumn,
+     nopos,builtinPos,internalPos,
+     isSourcePos,isBuiltinPos,isInternalPos,
+     -- * Syntax tree nodes
+     NodeInfo(..),CNode(..),
+     fileOfNode,posOfNode,nameOfNode,
+     internalNode,mkNodeInfoOnlyPos,mkNodeInfo,
+     -- * Extensible errors
+     module Language.C.Data.Error
+)
+where
+import Language.C.Data.InputStream
+import Language.C.Data.Ident
+import Language.C.Data.Name
+import Language.C.Data.Position
+import Language.C.Data.Error
+import Language.C.Data.Node
diff --git a/src/Language/C/Data/Error.hs b/src/Language/C/Data/Error.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Data/Error.hs
@@ -0,0 +1,171 @@
+{-# LANGUAGE ExistentialQuantification, DeriveDataTypeable #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Data.Error
+-- Copyright   :  (c) 2008 Benedikt Huber, Manuel M. T. Chakravarty
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  experimental
+-- Portability :  ghc
+--
+-- Base type for errors occuring in parsing, analysing and pretty-printing.
+-- With ideas from Simon Marlow's
+-- "An extensible dynamically-typed hierarchy of execeptions [2006]"
+-----------------------------------------------------------------------------
+module Language.C.Data.Error (
+    -- * Severity Level
+    ErrorLevel(..), isHardError,
+    -- * Error class
+    Error(..), errorPos, errorLevel, errorMsgs,
+    -- * Error 'supertype'
+    CError(..),
+    -- * Infos attached to errors
+    ErrorInfo(..),showError,showErrorInfo,mkErrorInfo,
+    -- * Default error types
+    UnsupportedFeature, unsupportedFeature, unsupportedFeature_,
+    UserError, userErr,
+    -- * Raising internal errors
+    internalErr,
+)
+where
+import Data.Typeable
+import Data.Generics
+import Language.C.Data.Node
+import Language.C.Data.Position
+
+-- | Error levels (severity)
+data ErrorLevel = LevelWarn
+                | LevelError
+                | LevelFatal
+              deriving (Eq, Ord)
+
+instance Show ErrorLevel where
+    show LevelWarn  = "WARNING"
+    show LevelError = "ERROR"
+    show LevelFatal = "FATAL ERROR"
+
+-- | return @True@ when the given error makes it impossible to continue
+--   analysis or compilation.
+isHardError :: (Error ex) => ex -> Bool
+isHardError = ( > LevelWarn) . errorLevel
+
+-- | information attached to every error in Language.C
+data ErrorInfo = ErrorInfo ErrorLevel Position [String] deriving Typeable
+
+-- to faciliate newtype deriving
+instance Show ErrorInfo where show = showErrorInfo "error"
+instance Error ErrorInfo where
+    errorInfo = id
+    changeErrorLevel (ErrorInfo _ pos msgs) lvl' = ErrorInfo lvl' pos msgs
+
+mkErrorInfo :: ErrorLevel -> String -> NodeInfo -> ErrorInfo
+mkErrorInfo lvl msg node = ErrorInfo lvl (posOfNode node) (lines msg)
+
+-- | `supertype' of all errors
+data CError
+    = forall err. (Error err) => CError err
+    deriving Typeable
+
+-- | errors in Language.C are instance of 'Error'
+class (Typeable e, Show e) => Error e where
+    -- | obtain source location etc. of an error
+    errorInfo        :: e -> ErrorInfo
+    -- | wrap error in 'CError'
+    toError          :: e -> CError
+    -- | try to cast a generic 'CError' to the specific error type
+    fromError     :: CError -> (Maybe e)
+    -- | modify the error level
+    changeErrorLevel :: e -> ErrorLevel -> e
+
+    -- default implementation
+    fromError (CError e) = cast e
+    toError = CError
+    changeErrorLevel e lvl =
+        if errorLevel e == lvl
+            then e
+            else error $ "changeErrorLevel: not possible for " ++ show e
+
+instance Show CError where
+    show (CError e) = show e
+instance Error CError where
+    errorInfo (CError err) = errorInfo err
+    toError = id
+    fromError = Just
+    changeErrorLevel (CError e) = CError . changeErrorLevel e
+
+-- | position of an @Error@
+errorPos   :: (Error e) => e -> Position
+errorPos = ( \(ErrorInfo _ pos _) -> pos ) . errorInfo
+
+-- | severity level of an @Error@
+errorLevel :: (Error e) => e -> ErrorLevel
+errorLevel = ( \(ErrorInfo lvl _ _) -> lvl ) . errorInfo
+
+-- | message lines of an @Error@
+errorMsgs   :: (Error e) => e -> [String]
+errorMsgs = ( \(ErrorInfo _ _ msgs) -> msgs ) . errorInfo
+
+-- | error raised if a operation requires an unsupported or not yet implemented feature.
+data UnsupportedFeature = UnsupportedFeature String Position deriving Typeable
+instance Error UnsupportedFeature where
+    errorInfo (UnsupportedFeature msg pos) = ErrorInfo LevelError pos (lines msg)
+instance Show UnsupportedFeature where show = showError "Unsupported Feature"
+
+unsupportedFeature :: (Pos a) => String -> a -> UnsupportedFeature
+unsupportedFeature msg a = UnsupportedFeature msg (posOf a)
+
+unsupportedFeature_ :: String -> UnsupportedFeature
+unsupportedFeature_ msg = UnsupportedFeature msg internalPos
+
+-- | unspecified error raised by the user (in case the user does not want to define
+--   her own error types).
+newtype UserError     = UserError ErrorInfo deriving Typeable
+instance Error UserError where
+    errorInfo (UserError info) = info
+instance Show UserError where show = showError "User Error"
+
+userErr :: String -> UserError
+userErr msg = UserError (ErrorInfo LevelError internalPos (lines msg))
+
+-- other errors to be defined elsewhere
+
+showError :: (Error e) => String -> e -> String
+showError short_msg = showErrorInfo short_msg . errorInfo
+
+-- | converts an error into a string using a fixed format
+--
+-- * either the lines of the long error message or the short message has to be non-empty
+--
+-- * the format is
+--
+-- >    <fname>:<row>: (column <col>) [<err lvl>]
+-- >      >>> <line_1>
+-- >      <line_2>
+-- >        ...
+-- >      <line_n>
+showErrorInfo :: String -> ErrorInfo -> String
+showErrorInfo short_msg (ErrorInfo level pos msgs) =
+    header ++ showMsgLines (if null short_msg then msgs else short_msg:msgs)
+    where
+    header = (posFile pos) ++ ":" ++ show (posRow pos) ++ ": " ++
+             "(column " ++ show (posColumn pos) ++ ") " ++
+             "[" ++ show level ++ "]"
+    showMsgLines []     = internalErr "No short message or error message provided."
+    showMsgLines (x:xs) = indent ++ ">>> " ++ x ++ "\n" ++ unlines (map (indent++) xs)
+
+
+-- internal errors
+internalErrPrefix :: String
+internalErrPrefix = unlines [ "Language.C : Internal Error" ,
+                              "This is propably a bug, and should be reported at "++
+                              "http://www.sivity.net/projects/language.c/newticket"]
+
+-- | raise a fatal internal error; message may have multiple lines
+internalErr     :: String -> a
+internalErr msg  = error (internalErrPrefix ++ "\n"
+                       ++ indentLines msg
+                       ++ "\n")
+indent :: String
+indent = "  "
+indentLines :: String -> String
+indentLines = unlines . map (indent++) . lines
diff --git a/src/Language/C/Data/Ident.hs b/src/Language/C/Data/Ident.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Data/Ident.hs
@@ -0,0 +1,135 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Data.Ident
+-- Copyright   :  (c) [1995..1999] Manuel M. T. Chakravarty
+--                (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  experimental
+-- Portability :  ghc
+--
+-- This module provides the notion of identifiers in C, speed up using hashing.
+-- Identifiers are associated optionally associated with a 'NodeInfo', i.e. with 
+-- a unique 'Name' and a source location ('Position'). The ordering relation on
+-- identifiers is based on the hash and does not follow the lexical order.
+-----------------------------------------------------------------------------
+module Language.C.Data.Ident (
+    Ident(..),
+    SUERef(..), isAnonymousRef,
+    mkIdent, builtinIdent, internalIdent, internalIdentAt, isInternalIdent, identToString, dumpIdent)
+where
+  
+-- TODO (comment from manuel):
+--  * Hashing is not 8bit clean.
+
+import Data.Char
+import Language.C.Data.Position
+import Language.C.Data.Node
+import Language.C.Data.Name   (Name,nameId)
+import Data.Generics
+
+-- | References uniquely determining a struct, union or enum type.
+-- Those are either identified by an string identifier, or by a unique
+-- name (anonymous types).
+data SUERef =  AnonymousRef Name
+             | NamedRef Ident
+    deriving (Typeable, Data, Ord, Eq)
+instance Show SUERef where
+    show (AnonymousRef name) = "$" ++ show (nameId name)
+    show (NamedRef ident) = identToString ident
+
+-- | Return true if the struct\/union\/enum reference is anonymous.
+isAnonymousRef :: SUERef -> Bool
+isAnonymousRef (AnonymousRef _) = True
+isAnonymousRef _ = False
+
+-- | C identifiers
+data Ident = Ident String       -- lexeme
+                   {-# UNBOXED #-}   !Int         -- hash to speed up equality check
+                   NodeInfo        -- attributes of this ident. incl. position
+             deriving (Data,Typeable)
+
+-- the definition of the equality allows identifiers to be equal that are
+-- defined at different source text positions, and aims at speeding up the
+-- equality test, by comparing the lexemes only if the two numbers are equal
+--
+instance Eq Ident where
+  (Ident s h _) == (Ident s' h' _) = (h == h') && (s == s')
+
+-- this does *not* follow the alphanumerical ordering of the lexemes
+--
+instance Ord Ident where
+  compare (Ident s h _) (Ident s' h' _) = compare (h, s) (h', s')
+
+-- for displaying identifiers
+instance Show Ident where
+  showsPrec _ ide = showString ("`" ++ identToString ide ++ "'")
+
+-- identifiers are attributed
+instance CNode Ident where
+  nodeInfo (Ident _ _ at) = at
+instance Pos Ident where
+  posOf = posOfNode . nodeInfo
+-- to speed up the equality test we compute some hash-like value for each
+-- identifiers lexeme and store it in the identifiers representation
+
+-- hash function from the dragon book pp437; assumes 7 bit characters and needs
+-- the (nearly) full range of values guaranteed for `Int' by the Haskell
+-- language definition; can handle 8 bit characters provided we have 29 bit
+-- for the `Int's without sign
+--
+quad                 :: String -> Int
+quad (c1:c2:c3:c4:s)  = ((ord c4 * bits21
+                          + ord c3 * bits14
+                          + ord c2 * bits7
+                          + ord c1)
+                         `mod` bits28)
+                        + (quad s `mod` bits28)
+quad (c1:c2:c3:[]  )  = ord c3 * bits14 + ord c2 * bits7 + ord c1
+quad (c1:c2:[]     )  = ord c2 * bits7 + ord c1
+quad (c1:[]        )  = ord c1
+quad ([]           )  = 0
+
+bits7 :: Int
+bits7  = 2^(7::Int)
+bits14 :: Int
+bits14 = 2^(14::Int)
+bits21 :: Int
+bits21 = 2^(21::Int)
+bits28 :: Int
+bits28 = 2^(28::Int)
+
+-- | build an identifier from a string.
+--
+-- * only minimal error checking, e.g., the characters of the identifier are
+--   not checked for being alphanumerical only; the correct lexis of the
+--   identifier should be ensured by the caller, e.g., the scanner.
+--
+-- * for reasons of simplicity the complete lexeme is hashed.
+mkIdent            :: Position -> String -> Name -> Ident
+mkIdent pos s name  = Ident s (quad s) (mkNodeInfo pos name)
+
+-- | returns an /internal/ identifier (has internal position and no unique name)
+internalIdent   :: String -> Ident
+internalIdent s  = Ident s (quad s) (mkNodeInfoOnlyPos internalPos)
+
+-- | return an /internal/ identifier with position info
+internalIdentAt :: Position -> String -> Ident
+internalIdentAt pos s = Ident s (quad s) (mkNodeInfoOnlyPos pos)
+
+-- | returns a /builtin/ identifier (has builtin position and no unique name)
+builtinIdent   :: String -> Ident
+builtinIdent s  = Ident s (quad s) (mkNodeInfoOnlyPos builtinPos)
+
+-- | return @True@ if the given identifier is /internal/
+isInternalIdent :: Ident -> Bool
+isInternalIdent (Ident _ _ nodeinfo) = isInternalPos (posOfNode nodeinfo)
+
+-- | string of an identifier
+identToString               :: Ident -> String
+identToString (Ident s _ _)  = s
+
+-- | dump the identifier string and its positions for debugging purposes
+dumpIdent     :: Ident -> String
+dumpIdent ide  = identToString ide ++ " at " ++ show (nodeInfo ide)
diff --git a/src/Language/C/Data/InputStream.hs b/src/Language/C/Data/InputStream.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Data/InputStream.hs
@@ -0,0 +1,77 @@
+{-# LANGUAGE CPP, BangPatterns #-}
+{-# OPTIONS -Wall #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Data.InputStream
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  experimental
+-- Portability :  ghc
+--
+-- Compile time input abstraction for the parser.
+-- Supports either ByteString or String.
+-------------------------------------------------------------------------------
+module Language.C.Data.InputStream (
+    InputStream, readInputStream,inputStreamToString,inputStreamFromString,
+    takeChar,inputStreamEmpty,takeChars,
+    countLines,
+)
+where
+#ifndef NO_BYTESTRING
+import Data.ByteString.Char8 (ByteString)
+import qualified Data.ByteString.Char8 as BS
+#endif
+
+-- Generic InputStream stuff
+
+-- | read a file into an 'InputStream'
+readInputStream :: FilePath -> IO InputStream
+
+-- | convert 'InputStream' to 'String'
+inputStreamToString :: InputStream -> String
+{-# INLINE inputStreamToString #-}
+
+-- | convert a 'String' to an 'InputStream'
+inputStreamFromString :: String -> InputStream
+
+-- | @(c,is') = takeChar is@ reads and removes
+-- the first character @c@ from the 'InputStream' @is@
+takeChar :: InputStream -> (Char, InputStream)
+{-# INLINE takeChar #-}
+
+-- | return @True@ if the given input stream is empty
+inputStreamEmpty :: InputStream -> Bool
+{-# INLINE inputStreamEmpty #-}
+
+-- | @str = takeChars n is@ returns the first @n@ characters
+-- of the given input stream, without removing them
+takeChars :: Int -> InputStream -> [Char]
+{-# INLINE takeChars #-}
+
+-- | @countLines@ returns the number of text lines  in the
+-- given 'InputStream'
+countLines :: InputStream -> Int
+
+#ifndef NO_BYTESTRING
+type InputStream = ByteString
+takeChar bs = BS.head bs `seq`  (BS.head bs, BS.tail bs)
+inputStreamEmpty = BS.null
+#ifndef __HADDOCK__
+takeChars !n bstr = BS.unpack $ BS.take n bstr --leaks
+#endif
+readInputStream = BS.readFile
+inputStreamToString = BS.unpack
+inputStreamFromString = BS.pack
+countLines = length . BS.lines
+#else
+type InputStream = String
+takeChar bs = (head bs, tail bs)
+inputStreamEmpty = null
+takeChars n str = take n str
+readInputStream = readFile
+inputStreamToString = id
+inputStreamFromString = id
+countLines = length . lines
+#endif
+
diff --git a/src/Language/C/Data/Name.hs b/src/Language/C/Data/Name.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Data/Name.hs
@@ -0,0 +1,36 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Data.Name
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  experimental
+-- Portability :  ghc
+--
+-- Unique Names with fast equality (newtype 'Int')
+module Language.C.Data.Name (
+Name(..),namesStartingFrom,
+NameMap,emptyNameMap,
+) where
+import Data.Ix
+import Data.IntMap (IntMap)
+import qualified Data.IntMap as IntMap
+import Data.Generics
+
+-- | Name is a unique identifier
+newtype Name = Name { nameId :: Int } deriving (Show, Read, Eq, Ord, Ix, Data, Typeable)
+
+instance Enum Name where
+    toEnum = Name
+    fromEnum (Name n) = n
+
+-- | get the infinite stream of unique names starting from the given integer
+namesStartingFrom :: Int -> [Name]
+namesStartingFrom k = [Name k..]
+
+-- | NameMap is currently just an alias for IntMap, but that might change in the future
+type NameMap = IntMap
+emptyNameMap :: NameMap v
+emptyNameMap = IntMap.empty
+
diff --git a/src/Language/C/Data/Node.hs b/src/Language/C/Data/Node.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Data/Node.hs
@@ -0,0 +1,80 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Syntax.Attributes
+-- Copyright   :  (c) [1995..1999] Manuel M. T. Chakravarty
+--                (c) 2008 Benedikt Huber (stripped radically)
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  experimental
+-- Portability :  ghc
+--
+-- source position and unqiue name
+-----------------------------------------------------------------------------
+module Language.C.Data.Node (
+   NodeInfo(..), internalNode,mkNodeInfoOnlyPos,mkNodeInfo,
+   CNode(nodeInfo), fileOfNode,
+   posOfNode, nameOfNode,
+   eqByName,
+) where
+import Language.C.Data.Position
+import Language.C.Data.Name     (Name)
+import Data.Generics
+
+-- | Parsed entity attribute
+data NodeInfo = OnlyPos   Position           -- only pos (for internal stuff only)
+              | NodeInfo Position Name      -- pos and unique name
+           deriving (Show,Read,Data,Typeable)
+
+-- name equality of attributes, used to define (name) equality of objects
+instance Eq NodeInfo where
+  (NodeInfo   _ id1) == (NodeInfo   _ id2) = id1 == id2
+  _               == _               =
+    error "Attributes: Attempt to compare `OnlyPos' attributes!"
+
+-- attribute ordering
+instance Ord NodeInfo where
+  (NodeInfo   _ id1) <= (NodeInfo   _ id2) = id1 <= id2
+  _               <= _               =
+    error "Attributes: Attempt to compare `OnlyPos' attributes!"
+
+instance Pos NodeInfo where
+  posOf (OnlyPos pos) = pos
+  posOf (NodeInfo pos _) = pos
+
+-- | a class for convenient access to the attributes of an attributed object
+class CNode a where
+  nodeInfo :: a -> NodeInfo
+instance CNode NodeInfo where
+  nodeInfo = id
+instance (CNode a, CNode b) => CNode (Either a b) where
+  nodeInfo = either nodeInfo nodeInfo
+
+nameOfNode :: NodeInfo -> Maybe Name
+nameOfNode (OnlyPos _) = Nothing
+nameOfNode (NodeInfo _ name) = Just name
+posOfNode :: NodeInfo -> Position
+posOfNode ni = case ni of (OnlyPos pos  ) -> pos; (NodeInfo   pos _) -> pos
+fileOfNode :: (CNode a) => a -> FilePath
+fileOfNode = posFile . posOfNode . nodeInfo
+
+-- | equality by name
+eqByName           :: CNode a => a -> a -> Bool
+eqByName obj1 obj2  = (nodeInfo obj1) == (nodeInfo obj2)
+
+
+-- attribute identifier creation
+-- -----------------------------
+
+internalNode :: NodeInfo
+internalNode = OnlyPos nopos
+
+-- | Given only a source position, create a new attribute identifier
+mkNodeInfoOnlyPos :: Position -> NodeInfo
+mkNodeInfoOnlyPos pos  = OnlyPos pos
+
+-- | Given a source position and a unique name, create a new attribute
+-- identifier
+mkNodeInfo :: Position -> Name -> NodeInfo
+mkNodeInfo pos name  = NodeInfo pos name
+
diff --git a/src/Language/C/Data/Position.hs b/src/Language/C/Data/Position.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Data/Position.hs
@@ -0,0 +1,112 @@
+{-# LANGUAGE DeriveDataTypeable, PatternGuards #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Data.Position
+-- Copyright   :  (c) [1995..2000] Manuel M. T. Chakravarty
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  experimental
+-- Portability :  ghc
+--
+-- Source code position
+-----------------------------------------------------------------------------
+module Language.C.Data.Position (
+  --
+  -- source text positions
+  --
+  Position(Position),
+  posFile,posRow,posColumn,isSourcePos,
+  nopos, isNoPos,
+  builtinPos, isBuiltinPos,
+  internalPos, isInternalPos,
+  incPos, tabPos, retPos,
+  Pos(..),
+) where
+import Data.Generics
+
+-- | uniform representation of source file positions; the order of the arguments
+-- is important as it leads to the desired ordering of source positions
+data Position = Position String         -- file name
+        {-# UNPACK #-}   !Int           -- row
+        {-# UNPACK #-}   !Int           -- column
+  deriving (Eq, Ord, Typeable, Data)
+
+instance Show Position where
+  show pos@(Position fname row col)
+    | isNoPos pos = "<no file>"
+    | isBuiltinPos pos = "<builtin>"
+    | isInternalPos pos = "<internal>"
+    | otherwise = show (fname, row, col)
+instance Read Position where
+    readsPrec p s = case s of
+                       '<' : _  -> readInternal s
+                       _        -> map (\((file,row,pos),r) -> (Position file row pos,r)) . readsPrec p $ s
+readInternal :: ReadS Position
+readInternal s | (Just rest) <- readString "<no file>" s = [(nopos,rest)]
+               | (Just rest) <- readString "<builtin>" s = [(builtinPos,rest)]
+               | (Just rest) <- readString "<internal>" s = [(internalPos,rest)]
+               | otherwise                             = []
+    where readString [] r = return r
+          readString (c:cs) (c':cs') | c == c'    = readString cs cs'
+                                     | otherwise = Nothing
+          readString (_:_) [] = Nothing
+
+-- | get the source file of the specified position. Fails unless @isSourcePos pos@.
+posFile :: Position -> String
+posFile (Position fname _ _) = fname
+
+-- | get the line number of the specified position. Fails unless @isSourcePos pos@
+posRow  :: Position -> Int
+posRow (Position _ row _) = row
+
+-- | get the column of the specified position. Fails unless @isSourcePos pos@
+posColumn :: Position -> Int
+posColumn (Position _ _ col) = col
+
+-- | class of type which aggregate a source code location
+class Pos a where
+    posOf :: a -> Position
+
+-- | returns @True@ if the given position refers to an actual source file
+isSourcePos :: Position -> Bool
+isSourcePos (Position _ row col) = row >= 0 && col >= 0
+
+-- | no position (for unknown position information)
+nopos :: Position
+nopos  = Position "<no file>" (-1) 0
+
+isNoPos :: Position -> Bool
+isNoPos (Position _ (-1) 0) = True
+isNoPos _                   = False
+
+-- | position attached to built-in objects
+--
+builtinPos :: Position
+builtinPos  = Position "<built into the parser>" (-1) 1
+
+-- | returns @True@ if the given position refers to a builtin definition
+isBuiltinPos :: Position -> Bool
+isBuiltinPos (Position _ (-1) 1) = True
+isBuiltinPos _                   = False
+
+-- | position used for internal errors
+internalPos :: Position
+internalPos = Position "<internal error>" (-1) 2
+
+-- | returns @True@ if the given position is internal
+isInternalPos :: Position -> Bool
+isInternalPos (Position _ (-1) 2) = True
+isInternalPos _                      = False
+
+-- | advance column
+incPos :: Position -> Int -> Position
+incPos (Position fname row col) n = Position fname row (col + n)
+
+-- | advance column to next tab positions (tabs are considered to be at every 8th column)
+tabPos :: Position -> Position
+tabPos (Position fname row col) =
+        Position fname row (col + 8 - (col - 1) `mod` 8)
+
+-- | advance to next line
+retPos :: Position -> Position
+retPos (Position fname row _col) = Position fname (row + 1) 1
diff --git a/src/Language/C/Data/RList.hs b/src/Language/C/Data/RList.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Data/RList.hs
@@ -0,0 +1,52 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Data.RList
+-- Copyright   :  (c) [2007..2008] Duncan Coutts, Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  : benedikt.huber@gmail.com
+-- Stability   : experimental
+-- Portability : ghc
+--
+-- Due to the way the grammar is constructed we very often have to build lists
+-- in reverse. To make sure we do this consistently and correctly we have a
+-- newtype to wrap the reversed style of list:
+-----------------------------------------------------------------------------
+module Language.C.Data.RList (
+    RList,Reversed(..),
+    empty,singleton,snoc,rappend,appendr,rappendr,rmap,reverse,
+    viewr,
+)
+where
+import Prelude hiding (reverse)
+import qualified Data.List as List
+
+newtype Reversed a = Reversed a
+type RList a = Reversed [a]
+empty :: Reversed [a]
+empty = Reversed []
+
+singleton :: a -> Reversed [a]
+singleton x = Reversed [x]
+
+snoc :: Reversed [a] -> a -> Reversed [a]
+snoc (Reversed xs) x = Reversed (x : xs)
+infixr 5 `snoc`
+
+rappend :: Reversed [a] -> [a] -> Reversed [a]
+rappend (Reversed xs) ys = Reversed (List.reverse ys ++ xs)
+
+appendr :: [a] -> Reversed [a] -> Reversed [a]
+appendr xs (Reversed ys) = Reversed (ys ++ List.reverse xs)
+
+rappendr :: Reversed [a] -> Reversed [a] -> Reversed [a]
+rappendr (Reversed xs) (Reversed ys) = Reversed (ys ++ xs)
+
+rmap :: (a -> b) -> Reversed [a] -> Reversed [b]
+rmap f (Reversed xs) = Reversed (map f xs)
+
+reverse :: Reversed [a] -> [a]
+reverse (Reversed xs) = List.reverse xs
+
+viewr :: Reversed [a] -> (Reversed [a] , a)
+viewr (Reversed []) = error "viewr: empty RList"
+viewr (Reversed (x:xs)) = (Reversed xs, x)
diff --git a/src/Language/C/Parser.hs b/src/Language/C/Parser.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Parser.hs
@@ -0,0 +1,18 @@
+{-# OPTIONS  #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Parser
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  : benedikt.huber@gmail.com
+-- Stability   : experimental
+-- Portability : ghc
+--
+-- Language.C parser
+-----------------------------------------------------------------------------
+module Language.C.Parser (
+    parseC,
+    ParseError(..)
+)
+where
+import Language.C.Parser.Parser (parseC, ParseError(..))
diff --git a/src/Language/C/Parser/Builtin.hs b/src/Language/C/Parser/Builtin.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Parser/Builtin.hs
@@ -0,0 +1,21 @@
+-- |
+-- Module      :  Language.C.Parser.Builtin
+-- Copyright   :  (c) 2001 Manuel M. T. Chakravarty
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Portability :  portable
+--
+-- This module provides information about builtin entities.
+--
+--  Currently, only builtin type names are supported.  The only builtin type
+--  name is `__builtin_va_list', which is a builtin of GNU C.
+--
+module Language.C.Parser.Builtin (
+  builtinTypeNames
+) where
+import Language.C.Data.Ident (Ident, builtinIdent)
+
+-- predefined type names
+--
+builtinTypeNames :: [Ident]
+builtinTypeNames  = [builtinIdent "__builtin_va_list"]
diff --git a/src/Language/C/Parser/Lexer.x b/src/Language/C/Parser/Lexer.x
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Parser/Lexer.x
@@ -0,0 +1,454 @@
+-----------------------------------------------------------------------------
+-- Module      :  Lexer.x
+-- Copyright   : (c) [1999..2004] Manuel M T Chakravarty
+--               (c) 2005 Duncan Coutts
+--               (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Portability :  portable
+--
+--  Lexer for C files, after being processed by the C preprocessor
+--
+--  We assume that the input already went through cpp.  Thus, we do not handle
+--  comments and preprocessor directives here.  It supports the
+--  C99 `restrict' extension: <http://www.lysator.liu.se/c/restrict.html> as
+--  well as inline functions.
+--
+--  Comments:
+--
+--  * Universal character names and multi-character character constants,
+--    as well as trigraphs are unsupported. They are lexed, but yield an error.
+--
+--  * We add `typedef-name' (K&R 8.9) as a token, as proposed in K&R A13.
+--    However, as these tokens cannot be recognized lexically, but require a
+--    context analysis, they are never produced by the lexer, but instead have
+--    to be introduced in a later phase (by converting the corresponding
+--    identifiers).
+--
+--  * We also recognize GNU C `__attribute__', `__extension__', `__complex__',
+--    `__const',  `__const__', `__imag', `__imag__', `__inline', `__inline__',
+--    `__real', `__real__, `__restrict', and `__restrict__'.
+--
+--  * Any line starting with `#pragma' is ignored.
+--
+--  With K&R we refer to ``The C Programming Language'', second edition, Brain
+--  W. Kernighan and Dennis M. Ritchie, Prentice Hall, 1988.
+--
+--  With C99 we refer to ``ISO/IEC 9899:TC3'',
+--  available online at http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf.
+--
+--- TODO ----------------------------------------------------------------------
+--
+--  * There are more GNU C specific keywords.  Add them and change `Parser.y'
+--    correspondingly (in particular, most tokens within __attribute ((...))
+--    expressions are actually keywords, but we handle them as identifiers at
+--    the moment).
+--
+--  * Add support for bytestrings
+
+{
+
+module Language.C.Parser.Lexer (lexC, parseError) where
+
+import Data.Char (isDigit)
+import Control.Monad (liftM)
+
+import Language.C.Data.InputStream
+import Language.C.Data.Position  (Position(..),posOf)
+import Language.C.Data.Ident    (mkIdent)
+
+import Language.C.Syntax.Constants
+
+import Language.C.Parser.Tokens
+import Language.C.Parser.ParserMonad
+}
+
+$space = [ \ \t ]                           -- horizontal white space
+$eol   = \n                                 -- end of line
+
+$letter   = [a-zA-Z]
+$identletter = [a-zA-Z_\$]                  -- GNU extension: allow $ in variable names
+$octdigit = 0-7
+$digit    = 0-9
+$digitNZ  = 1-9
+$hexdigit = [0-9a-fA-F]
+
+$inchar   = \0-\255 # [ \\ \' \n \r ]       -- valid character in char constant
+$instr    = \0-\255 # [ \\ \" \n \r ]       -- valid character in a string literal
+$anyButNL = \0-\255 # \n
+$infname  = \ -\127 # [ \\ \" ]             -- valid character in a filename
+
+@sp  = $space*
+
+-- character escape sequence (follows K&R A2.5.2)
+--
+-- * also used for strings
+-- * C99: 6.4.4.4
+@charesc  = \\([ntvbrfaeE\\\?\'\"]|$octdigit{1,3}|x$hexdigit+)
+@ucn      = \\u$hexdigit{4}|\\U$hexdigit{8}
+
+-- components of integer constants
+--
+-- * C99: 6.4.4.1
+@int = $digitNZ$digit*
+
+-- integer suffixes
+@llsuffix  = ll|LL
+@gnusuffix = [ij]?
+@intsuffix = [uU][lL]?|[uU]@llsuffix|[lL][uU]?|@llsuffix[uU]?
+@intgnusuffix = @intsuffix@gnusuffix?|@gnusuffix@intsuffix?
+
+-- components of float constants (follows K&R A2.5.3)
+--
+-- * C99: 6.4.4.2
+@digits    = $digit+
+@intpart   = @digits
+@fractpart = @digits
+
+@mantpart  = @intpart?\.@fractpart|@intpart\.
+@exppart   = [eE][\+\-]?@digits
+
+@hexprefix = 0x
+@hexdigits = $hexdigit+
+@hexmant   = @hexdigits?\.@hexdigits|@hexdigits\.
+@binexp    = [pP][\+\-]?@digits
+
+@floatsuffix    = [fFlL]
+@floatgnusuffix = @floatsuffix@gnusuffix?|@gnusuffix@floatsuffix?
+
+
+
+tokens :-
+
+-- whitespace (follows K&R A2.1)
+--
+-- * horizontal and vertical tabs, newlines, and form feeds are filter out by
+--   `Lexers.ctrlLexer'
+--
+-- * comments are not handled, as we assume the input already went through cpp
+--
+$white+         ;
+
+-- #line directive (K&R A12.6)
+--
+-- * allows further ints after the file name a la GCC; as the GCC CPP docu
+--   doesn't say how many ints there can be, we allow an unbound number
+--
+\#$space*@int$space*(\"($infname|@charesc)*\"$space*)?(@int$space*)*$eol
+  { \pos len str -> setPos (adjustPos (takeChars len str) pos) >> lexToken }
+
+-- #pragma directive (K&R A12.8)
+--
+-- * we simply ignore any #pragma (but take care to update the position
+--   information)
+--
+\#$space*pragma$anyButNL*$eol   ;
+
+-- #ident directive, eg used by rcs/cvs
+--
+-- * we simply ignore any #ident (but take care to update the position
+--   information)
+--
+\#$space*ident$anyButNL*$eol    ;
+
+-- identifiers and keywords (follows K&R A2.3 and A2.4)
+--
+$identletter($identletter|$digit)*  { \pos len str -> idkwtok (takeChars len str) pos }
+
+-- constants (follows K&R A2.5)
+--
+-- * K&R,C99 explicitly mention `enumeration-constants'; however, as they are
+--   lexically identifiers, we do not have an extra case for them
+--
+
+-- integer constants (follows K&R A2.5.1, C99 6.4.4.1)
+-- FIXME: 0 is lexed as octal integer constant
+0$octdigit*@intgnusuffix?       { token_plus CTokILit (readCInteger OctalRepr) }
+$digitNZ$digit*@intgnusuffix?   { token_plus CTokILit (readCInteger DecRepr) }
+0[xX]$hexdigit+@intgnusuffix?   { token_plus CTokILit (readCInteger HexRepr . drop 2) }
+
+(0$octdigit*|$digitNZ$digit*|0[xX]$hexdigit+)[uUlL]+ { token_fail "Invalid integer constant suffix" }
+
+-- character constants (follows K&R A2.5.2, C99 6.4.4.4)
+--
+-- * Universal Character Names are unsupported and cause an error.
+\'($inchar|@charesc)\'  { token CTokCLit (cChar . fst . unescapeChar . tail) }
+L\'($inchar|@charesc)\' { token CTokCLit (cChar_w . fst . unescapeChar . tail . tail) }
+\'($inchar|@charesc){2,}\' { token CTokCLit (flip cChars False . unescapeMultiChars .tail) }
+L\'($inchar|@charesc){2,}\' { token CTokCLit (flip cChars True . unescapeMultiChars . tail . tail) }
+
+-- float constants (follows K&R A2.5.3. C99 6.4.4.2)
+--
+-- * NOTE: Hexadecimal floating constants without binary exponents are forbidden.
+--         They generate a lexer error, because they are hard to recognize in the parser.
+(@mantpart@exppart?|@intpart@exppart)@floatgnusuffix?  { token CTokFLit readCFloat }
+@hexprefix(@hexmant|@hexdigits)@binexp@floatgnusuffix? { token CTokFLit readCFloat }
+@hexprefix@hexmant                                     { token_fail "Hexadecimal floating constant requires an exponent" }
+
+-- string literal (follows K&R A2.6)
+-- C99: 6.4.5.
+\"($instr|@charesc)*\"      { token CTokSLit (cString . unescapeString . init . tail) }
+L\"($instr|@charesc)*\"     { token CTokSLit (cString_w . unescapeString . init . tail . tail) }
+
+L?\'@ucn\'                        { token_fail "Universal character names are unsupported" }
+L?\'\\[^0-7'\"\?\\abfnrtvuUx]\'     { token_fail "Invalid escape sequence" }
+L?\"($inchar|@charesc)*@ucn($inchar|@charesc|@ucn)*\" { token_fail "Universal character names in string literals are unsupported"}
+
+-- operators and separators
+--
+"("   { token_ CTokLParen }
+")"   { token_ CTokRParen  }
+"["   { token_ CTokLBracket }
+"]"   { token_ CTokRBracket }
+"->"  { token_ CTokArrow }
+"."   { token_ CTokDot }
+"!"   { token_ CTokExclam }
+"~"   { token_ CTokTilde }
+"++"  { token_ CTokInc }
+"--"  { token_ CTokDec }
+"+"   { token_ CTokPlus }
+"-"   { token_ CTokMinus }
+"*"   { token_ CTokStar }
+"/"   { token_ CTokSlash }
+"%"   { token_ CTokPercent }
+"&"   { token_ CTokAmper }
+"<<"  { token_ CTokShiftL }
+">>"  { token_ CTokShiftR }
+"<"   { token_ CTokLess }
+"<="  { token_ CTokLessEq }
+">"   { token_ CTokHigh }
+">="  { token_ CTokHighEq }
+"=="  { token_ CTokEqual }
+"!="  { token_ CTokUnequal }
+"^"   { token_ CTokHat }
+"|"   { token_ CTokBar }
+"&&"  { token_ CTokAnd }
+"||"  { token_ CTokOr }
+"?"   { token_ CTokQuest }
+":"   { token_ CTokColon }
+"="   { token_ CTokAssign }
+"+="  { token_ CTokPlusAss }
+"-="  { token_ CTokMinusAss }
+"*="  { token_ CTokStarAss }
+"/="  { token_ CTokSlashAss }
+"%="  { token_ CTokPercAss }
+"&="  { token_ CTokAmpAss }
+"^="  { token_ CTokHatAss }
+"|="  { token_ CTokBarAss }
+"<<=" { token_ CTokSLAss }
+">>=" { token_ CTokSRAss }
+","   { token_ CTokComma }
+\;    { token_ CTokSemic }
+"{"   { token_ CTokLBrace }
+"}"   { token_ CTokRBrace }
+"..." { token_ CTokEllipsis }
+
+
+{
+
+-- We use the odd looking list of string patterns here rather than normal
+-- string literals since GHC converts the latter into a sequence of string
+-- comparisons (ie a linear search) but it translates the former using its
+-- effecient pattern matching which gives us the expected radix-style search.
+-- This gives change makes a significant performance difference.
+--
+idkwtok :: String -> Position -> P CToken
+idkwtok ('a':'l':'i':'g':'n':'o':'f':[])         = tok CTokAlignof
+idkwtok ('_':'_':'a':'l':'i':'g':'n':'o':'f':[])       = tok CTokAlignof
+idkwtok ('_':'_':'a':'l':'i':'g':'n':'o':'f':'_':'_':[])     = tok CTokAlignof
+idkwtok ('a':'s':'m':[])             = tok CTokAsm
+idkwtok ('_':'_':'a':'s':'m':[])           = tok CTokAsm
+idkwtok ('_':'_':'a':'s':'m':'_':'_':[])         = tok CTokAsm
+idkwtok ('a':'u':'t':'o':[])             = tok CTokAuto
+idkwtok ('b':'r':'e':'a':'k':[])           = tok CTokBreak
+idkwtok ('_':'B':'o':'o':'l':[])           = tok CTokBool
+idkwtok ('c':'a':'s':'e':[])             = tok CTokCase
+idkwtok ('c':'h':'a':'r':[])             = tok CTokChar
+idkwtok ('c':'o':'n':'s':'t':[])           = tok CTokConst
+idkwtok ('_':'_':'c':'o':'n':'s':'t':[])         = tok CTokConst
+idkwtok ('_':'_':'c':'o':'n':'s':'t':'_':'_':[])       = tok CTokConst
+idkwtok ('c':'o':'n':'t':'i':'n':'u':'e':[])         = tok CTokContinue
+idkwtok ('_':'C':'o':'m':'p':'l':'e':'x':[])         = tok CTokComplex
+idkwtok ('_':'_':'c':'o':'m':'p':'l':'e':'x':'_':'_':[]) = tok CTokComplex
+idkwtok ('d':'e':'f':'a':'u':'l':'t':[])         = tok CTokDefault
+idkwtok ('d':'o':[])               = tok CTokDo
+idkwtok ('d':'o':'u':'b':'l':'e':[])           = tok CTokDouble
+idkwtok ('e':'l':'s':'e':[])             = tok CTokElse
+idkwtok ('e':'n':'u':'m':[])             = tok CTokEnum
+idkwtok ('e':'x':'t':'e':'r':'n':[])           = tok CTokExtern
+idkwtok ('f':'l':'o':'a':'t':[])           = tok CTokFloat
+idkwtok ('f':'o':'r':[])             = tok CTokFor
+idkwtok ('g':'o':'t':'o':[])             = tok CTokGoto
+idkwtok ('i':'f':[])               = tok CTokIf
+idkwtok ('i':'n':'l':'i':'n':'e':[])           = tok CTokInline
+idkwtok ('_':'_':'i':'n':'l':'i':'n':'e':[])         = tok CTokInline
+idkwtok ('_':'_':'i':'n':'l':'i':'n':'e':'_':'_':[])       = tok CTokInline
+idkwtok ('i':'n':'t':[])             = tok CTokInt
+idkwtok ('l':'o':'n':'g':[])             = tok CTokLong
+idkwtok ('r':'e':'g':'i':'s':'t':'e':'r':[])         = tok CTokRegister
+idkwtok ('r':'e':'s':'t':'r':'i':'c':'t':[])         = tok CTokRestrict
+idkwtok ('_':'_':'r':'e':'s':'t':'r':'i':'c':'t':[])       = tok CTokRestrict
+idkwtok ('_':'_':'r':'e':'s':'t':'r':'i':'c':'t':'_':'_':[]) = tok CTokRestrict
+idkwtok ('r':'e':'t':'u':'r':'n':[])           = tok CTokReturn
+idkwtok ('s':'h':'o':'r':'t':[])           = tok CTokShort
+idkwtok ('s':'i':'g':'n':'e':'d':[])           = tok CTokSigned
+idkwtok ('_':'_':'s':'i':'g':'n':'e':'d':[])         = tok CTokSigned
+idkwtok ('_':'_':'s':'i':'g':'n':'e':'d':'_':'_':[])       = tok CTokSigned
+idkwtok ('s':'i':'z':'e':'o':'f':[])           = tok CTokSizeof
+idkwtok ('s':'t':'a':'t':'i':'c':[])           = tok CTokStatic
+idkwtok ('s':'t':'r':'u':'c':'t':[])           = tok CTokStruct
+idkwtok ('s':'w':'i':'t':'c':'h':[])           = tok CTokSwitch
+idkwtok ('t':'y':'p':'e':'d':'e':'f':[])         = tok CTokTypedef
+idkwtok ('t':'y':'p':'e':'o':'f':[])           = tok CTokTypeof
+idkwtok ('_':'_':'t':'y':'p':'e':'o':'f':[])         = tok CTokTypeof
+idkwtok ('_':'_':'t':'y':'p':'e':'o':'f':'_':'_':[])       = tok CTokTypeof
+idkwtok ('_':'_':'t':'h':'r':'e':'a':'d':[])         = tok CTokThread
+idkwtok ('u':'n':'i':'o':'n':[])           = tok CTokUnion
+idkwtok ('u':'n':'s':'i':'g':'n':'e':'d':[])         = tok CTokUnsigned
+idkwtok ('v':'o':'i':'d':[])             = tok CTokVoid
+idkwtok ('v':'o':'l':'a':'t':'i':'l':'e':[])         = tok CTokVolatile
+idkwtok ('_':'_':'v':'o':'l':'a':'t':'i':'l':'e':[])       = tok CTokVolatile
+idkwtok ('_':'_':'v':'o':'l':'a':'t':'i':'l':'e':'_':'_':[]) = tok CTokVolatile
+idkwtok ('w':'h':'i':'l':'e':[])           = tok CTokWhile
+idkwtok ('_':'_':'l':'a':'b':'e':'l':'_':'_':[])             = tok CTokLabel
+idkwtok ('_':'_':'a':'t':'t':'r':'i':'b':'u':'t':'e':[]) = tok (CTokGnuC GnuCAttrTok)
+idkwtok ('_':'_':'a':'t':'t':'r':'i':'b':'u':'t':'e':'_':'_':[]) = tok (CTokGnuC GnuCAttrTok)
+idkwtok ('_':'_':'e':'x':'t':'e':'n':'s':'i':'o':'n':'_':'_':[]) = tok (CTokGnuC GnuCExtTok)
+idkwtok ('_':'_':'r':'e':'a':'l':[])   = tok (CTokGnuC GnuCComplexReal)
+idkwtok ('_':'_':'r':'e':'a':'l':'_':'_':[])   = tok (CTokGnuC GnuCComplexReal)
+idkwtok ('_':'_':'i':'m':'a':'g':[])   = tok (CTokGnuC GnuCComplexImag)
+idkwtok ('_':'_':'i':'m':'a':'g':'_':'_':[])   = tok (CTokGnuC GnuCComplexImag)
+idkwtok ('_':'_':'b':'u':'i':'l':'t':'i':'n':'_':rest)
+        | rest == "va_arg"             = tok (CTokGnuC GnuCVaArg)
+        | rest == "offsetof"           = tok (CTokGnuC GnuCOffsetof)
+        | rest == "types_compatible_p" = tok (CTokGnuC GnuCTyCompat)
+
+idkwtok cs = \pos -> do
+  name <- getNewName
+  let ident = mkIdent pos cs name
+  tyident <- isTypeIdent ident
+  if tyident
+    then return (CTokTyIdent pos ident)
+    else return (CTokIdent   pos ident)
+
+ignoreAttribute :: P ()
+ignoreAttribute = skipTokens (0::Int)
+  where skipTokens :: Int -> P ()
+        skipTokens n = do
+          tok <- lexToken
+          case tok of
+            CTokRParen _ | n == 1    -> return ()
+                         | otherwise -> skipTokens (n-1)
+            CTokLParen _             -> skipTokens (n+1)
+            _                        -> skipTokens n
+
+tok :: (Position -> CToken) -> Position -> P CToken
+tok tc pos = return (tc pos)
+
+adjustPos :: String -> Position -> Position
+adjustPos str (Position fname row _) = Position fname' row' 0
+    where
+    str'            = dropWhite . drop 1 $ str
+    (rowStr, str'') = span isDigit str'
+    row'      = read rowStr
+    str'''      = dropWhite str''
+    fnameStr      = takeWhile (/= '"') . drop 1 $ str'''
+    fname'      | null str''' || head str''' /= '"' = fname
+     -- try and get more sharing of file name strings
+     | fnameStr == fname     = fname
+     | otherwise             = fnameStr
+    --
+    dropWhite = dropWhile (\c -> c == ' ' || c == '\t')
+
+-- special utility for the lexer
+unescapeMultiChars :: String -> [Char]
+unescapeMultiChars cs@(_ : _ : _) = case unescapeChar cs of (c,cs') -> c : unescapeMultiChars cs'
+unescapeMultiChars ('\'' : []) = []
+unescapeMultiChars _ = error "Unexpected end of multi-char constant"
+
+{-# INLINE token_ #-}
+-- token that ignores the string
+token_ :: (Position -> CToken) -> Position -> Int -> InputStream -> P CToken
+token_ tok pos _ _ = return (tok pos)
+
+{-# INLINE token_fail #-}
+-- error token
+token_fail :: String -> Position ->
+              Int -> InputStream -> P CToken
+token_fail errmsg pos _ _ =   failP pos [ "Lexical Error !", errmsg ]
+
+
+{-# INLINE token #-}
+-- token that uses the string
+token :: (Position -> a -> CToken) -> (String -> a)
+      -> Position -> Int -> InputStream -> P CToken
+token tok read pos len str = return (tok pos (read $ takeChars len str))
+
+{-# INLINE token_plus #-}
+-- token that may fail
+token_plus :: (Position -> a -> CToken) -> (String -> Either String a)
+      -> Position -> Int -> InputStream -> P CToken
+token_plus tok read pos len str =
+  case read (takeChars len str) of Left err -> failP pos [ "Lexical error ! ", err ]
+                                   Right ok -> return $! tok pos ok
+
+-- -----------------------------------------------------------------------------
+-- The input type
+
+type AlexInput = (Position,   -- current position,
+                  InputStream)     -- current input string
+
+alexInputPrevChar :: AlexInput -> Char
+alexInputPrevChar _ = error "alexInputPrevChar not used"
+
+alexGetChar :: AlexInput -> Maybe (Char,AlexInput)
+alexGetChar (p,is) | inputStreamEmpty is = Nothing
+                   | otherwise  = let (c,s) = takeChar is in
+                                  let p' = alexMove p c in p' `seq`
+                                  Just (c, (p', s))
+
+alexMove :: Position -> Char -> Position
+alexMove (Position f l c) ' '  = Position f l (c+1)
+alexMove (Position f l c) '\n' = Position f (l+1) 1
+alexMove (Position f l c) '\t' = Position f l (((c+7) `div` 8)*8+1)
+alexMove p                '\r' = p
+alexMove (Position f l c) _    = Position f l     (c+1)
+
+lexicalError :: P a
+lexicalError = do
+  pos <- getPos
+  (c,cs) <- liftM takeChar getInput
+  failP pos
+        ["Lexical error !",
+         "The character " ++ show c ++ " does not fit here."]
+
+parseError :: P a
+parseError = do
+  tok <- getLastToken
+  failP (posOf tok)
+        ["Syntax error !",
+         "The symbol `" ++ show tok ++ "' does not fit here."]
+
+lexToken :: P CToken
+lexToken = do
+  pos <- getPos
+  inp <- getInput
+  case alexScan (pos, inp) 0 of
+    AlexEOF -> return CTokEof
+    AlexError inp' -> lexicalError
+    AlexSkip  (pos', inp') len -> do
+        setPos pos'
+        setInput inp'
+        lexToken
+    AlexToken (pos', inp') len action -> do
+        setPos pos'
+        setInput inp'
+        tok <- action pos len inp
+        setLastToken tok
+        return tok
+
+lexC :: (CToken -> P a) -> P a
+lexC cont = do
+  tok <- lexToken
+  cont tok
+}
diff --git a/src/Language/C/Parser/Parser.y b/src/Language/C/Parser/Parser.y
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Parser/Parser.y
@@ -0,0 +1,2238 @@
+-----------------------------------------------------------------------------
+-- Module      :  Parser.y
+-- Copyright   :  (c) 2005-2007 Duncan Coutts
+--                (c) 2008 Benedikt Huber
+--                (c) [1999..2004] Manuel M T Chakravarty
+--                Portions copyright 1989, 1990 James A. Roskind
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Portability :  portable
+--
+--  Parser for C translation units, which have already been run through the C
+--  preprocessor. It is recommended to use the `strict' flag for happy.
+--
+--  The parser recognizes all of ISO C 99 and most GNU C extensions.
+--
+--  With C99 we refer to the ISO C99 standard, specifically the section numbers
+--  used below refer to this report:
+--
+--    <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf>
+--
+-- GNU extensions are documented in the gcc parser
+--
+--    <http://gcc.gnu.org/viewcvs/trunk/gcc/c-parser.c>
+--
+-- and in: <http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html>
+--
+-- The set of supported extensions is documented in
+--
+--    <http://www.sivity.net/projects/language.c/wiki/Cee>
+------------------------------------------------------------------
+{
+module Language.C.Parser.Parser (parseC, ParseError(..)) where
+
+-- Relevant C99 sections:
+--
+-- 6.5 Expressions .1 - .17 and 6.6 (almost literally)
+--  Supported GNU extensions:
+--     - Allow a compound statement as an expression
+--     - Various __builtin_* forms that take type parameters
+--     - `alignof' expression or type
+--     - `__extension__' to suppress warnings about extensions
+--     - Allow taking address of a label with: && label
+--     - Omitting the `then' part of conditional expressions
+--     - complex numbers
+--
+-- 6.7 C Declarations .1 -.8
+--  Supported GNU extensions:
+--     - '__thread' thread local storage (6.7.1)
+--
+-- 6.8 Statements .1 - .8
+--  Supported GNU extensions:
+--    - case ranges (C99 6.8.1)
+--    - '__label__ ident;' declarations (C99 6.8.2)
+--    - computed gotos (C99 6.8.6)
+--
+-- 6.9 Translation unit
+--  Supported GNU extensions:
+--     - allow empty translation_unit
+--     - allow redundant ';'
+--     - allow extension keyword before external declaration
+--     - asm definitions
+--
+--  Since some of the grammar productions are quite difficult to read,
+--  (especially those involved with the decleration syntax) we document them
+--  with an extended syntax that allows a more consise representation:
+--
+--  Ordinary rules
+--
+--   foo      named terminal or non-terminal
+--
+--   'c'      terminal, literal character token
+--
+--   A B      concatenation
+--
+--   A | B    alternation
+--
+--   (A)      grouping
+--
+--  Extended rules
+--
+--   A?       optional, short hand for (A|) or [A]{ 0==A || 1==A }
+--
+--   ...      stands for some part of the grammar omitted for clarity
+--
+--   {A}      represents sequences, 0 or more.
+--
+--   <permute> modifier which states that any permutation of the immediate subterms is valid
+--
+--
+--- TODO ----------------------------------------------------------------------
+--
+--  !* We ignore the C99 static keyword (see C99 6.7.5.3)
+--  !* We do not distinguish in the AST between incomplete array types and
+--      complete variable length arrays ([ '*' ] means the latter). (see C99 6.7.5.2)
+--  !* The AST doesn't allow recording __attribute__ of unnamed struct field
+--     (see , struct_default_declaring_list, struct_identifier_declarator)
+--  !* see `We're being far to liberal here' (... struct definition within structs)
+--  * Documentation isn't complete and consistent yet.
+
+import Prelude    hiding (reverse)
+import qualified Data.List as List
+
+import Language.C.Parser.Builtin   (builtinTypeNames)
+import Language.C.Parser.Lexer     (lexC, parseError)
+import Language.C.Parser.Tokens    (CToken(..), GnuCTok(..))
+import Language.C.Parser.ParserMonad (P, failP, execParser, getNewName, addTypedef, shadowTypedef,
+                                      enterScope, leaveScope, ParseError(..))
+
+import Language.C.Data.RList
+import Language.C.Data.InputStream
+import Language.C.Data.Ident
+import Language.C.Data.Name
+import Language.C.Data.Node
+import Language.C.Data.Position
+import Language.C.Syntax
+
+}
+
+%name header header
+%name statement statement
+%name expression expression
+
+%tokentype { CToken }
+
+%monad { P } { >>= } { return }
+%lexer { lexC } { CTokEof }
+
+%expect 1
+
+%token
+
+'('		{ CTokLParen	_ }
+')'		{ CTokRParen	_ }
+'['		{ CTokLBracket	_ }
+']'		{ CTokRBracket	_ }
+"->"		{ CTokArrow	_ }
+'.'		{ CTokDot	_ }
+'!'		{ CTokExclam	_ }
+'~'		{ CTokTilde	_ }
+"++"		{ CTokInc	_ }
+"--"		{ CTokDec	_ }
+'+'		{ CTokPlus	_ }
+'-'		{ CTokMinus	_ }
+'*'		{ CTokStar	_ }
+'/'		{ CTokSlash	_ }
+'%'		{ CTokPercent	_ }
+'&'		{ CTokAmper	_ }
+"<<"		{ CTokShiftL	_ }
+">>"		{ CTokShiftR	_ }
+'<'		{ CTokLess	_ }
+"<="		{ CTokLessEq	_ }
+'>'		{ CTokHigh	_ }
+">="		{ CTokHighEq	_ }
+"=="		{ CTokEqual	_ }
+"!="		{ CTokUnequal	_ }
+'^'		{ CTokHat	_ }
+'|'		{ CTokBar	_ }
+"&&"		{ CTokAnd	_ }
+"||"		{ CTokOr	_ }
+'?'		{ CTokQuest	_ }
+':'		{ CTokColon	_ }
+'='		{ CTokAssign	_ }
+"+="		{ CTokPlusAss	_ }
+"-="		{ CTokMinusAss	_ }
+"*="		{ CTokStarAss	_ }
+"/="		{ CTokSlashAss	_ }
+"%="		{ CTokPercAss	_ }
+"&="		{ CTokAmpAss	_ }
+"^="		{ CTokHatAss	_ }
+"|="		{ CTokBarAss	_ }
+"<<="		{ CTokSLAss	_ }
+">>="		{ CTokSRAss	_ }
+','		{ CTokComma	_ }
+';'		{ CTokSemic	_ }
+'{'		{ CTokLBrace	_ }
+'}'		{ CTokRBrace	_ }
+"..."		{ CTokEllipsis	_ }
+alignof		{ CTokAlignof	_ }
+asm		{ CTokAsm	_ }
+auto		{ CTokAuto	_ }
+break		{ CTokBreak	_ }
+"_Bool"		{ CTokBool	_ }
+case		{ CTokCase	_ }
+char		{ CTokChar	_ }
+const		{ CTokConst	_ }
+continue	{ CTokContinue	_ }
+"_Complex"	{ CTokComplex	_ }
+default		{ CTokDefault	_ }
+do		{ CTokDo	_ }
+double		{ CTokDouble	_ }
+else		{ CTokElse	_ }
+enum		{ CTokEnum	_ }
+extern		{ CTokExtern	_ }
+float		{ CTokFloat	_ }
+for		{ CTokFor	_ }
+goto		{ CTokGoto	_ }
+if		{ CTokIf	_ }
+inline		{ CTokInline	_ }
+int		{ CTokInt	_ }
+long		{ CTokLong	_ }
+"__label__"	{ CTokLabel	_ }
+register	{ CTokRegister	_ }
+restrict	{ CTokRestrict	_ }
+return		{ CTokReturn	_ }
+short		{ CTokShort	_ }
+signed		{ CTokSigned	_ }
+sizeof		{ CTokSizeof	_ }
+static		{ CTokStatic	_ }
+struct		{ CTokStruct	_ }
+switch		{ CTokSwitch	_ }
+typedef		{ CTokTypedef	_ }
+typeof		{ CTokTypeof	_ }
+"__thread"	{ CTokThread	_ }
+union		{ CTokUnion	_ }
+unsigned	{ CTokUnsigned	_ }
+void		{ CTokVoid	_ }
+volatile	{ CTokVolatile	_ }
+while		{ CTokWhile	_ }
+cchar		{ CTokCLit   _ _ }		-- character constant
+cint		{ CTokILit   _ _ }		-- integer constant
+cfloat		{ CTokFLit   _ _ }		-- float constant
+cstr		{ CTokSLit   _ _ }		-- string constant (no escapes)
+ident		{ CTokIdent  _ $$ }		-- identifier
+tyident		{ CTokTyIdent _ $$ }		-- `typedef-name' identifier
+"__attribute__"	{ CTokGnuC GnuCAttrTok _ }	-- special GNU C tokens
+"__extension__"	{ CTokGnuC GnuCExtTok  _ }	-- special GNU C tokens
+"__real__"        { CTokGnuC GnuCComplexReal _ }
+"__imag__"        { CTokGnuC GnuCComplexImag _ }
+-- special GNU C builtin 'functions' that actually take types as parameters:
+"__builtin_va_arg"		{ CTokGnuC GnuCVaArg    _ }
+"__builtin_offsetof"		{ CTokGnuC GnuCOffsetof _ }
+"__builtin_types_compatible_p"	{ CTokGnuC GnuCTyCompat _ }
+
+%%
+
+
+-- parse a complete C header file
+--
+header :: { CTranslUnit }
+header
+  : translation_unit	{% withNodeInfo $1 $ CTranslUnit (reverse $1) }
+
+
+-- parse a complete C translation unit (C99 6.9)
+--
+-- * GNU extensions:
+--     allow empty translation_unit
+--     allow redundant ';'
+--
+translation_unit :: { Reversed [CExtDecl] }
+translation_unit
+  : {- empty -}					{ empty }
+  | translation_unit ';'			{ $1 }
+  | translation_unit external_declaration	{ $1 `snoc` $2 }
+
+
+-- parse external C declaration (C99 6.9)
+--
+-- * GNU extensions:
+--     allow extension keyword before external declaration
+--     asm definitions
+external_declaration :: { CExtDecl }
+external_declaration
+  : function_definition		              { CFDefExt $1 }
+  | declaration			                  { CDeclExt $1 }
+  | "__extension__" external_declaration  { $2 }
+  | asm '(' string_literal ')' ';'		  { CAsmExt $3 }
+
+
+-- parse C function definition (C99 6.9.1)
+--
+-- function_definition :- specifiers? fun-declarator compound-statement
+--                        specifiers? old-fun-declarator  declaration-list compound-statement
+--
+-- The specifiers are a list consisting of type-names (int, struct foo, ...),
+-- storage-class specifiers (extern, static,...) and type qualifiers (const, volatile, ...).
+--
+--   declaration_specifier      :- <permute> type-qualifier* storage-class+ typename+    "extern unsigned static volatile int f()"
+--   type_specifier             :- <permute> type-qualifier* typename+                   "const int f()", "long int f()"
+--   declaration_qualifier_list :- <permute> type_qualifier* storage-class+              "extern static const f()"
+--   type_qualifier_list        :- type-qualifier+                                       "const f()"
+--
+-- * GNU extension:
+--    __attribute__ annotations
+--
+function_definition :: { CFunDef }
+function_definition
+  :                            function_declarator compound_statement
+  	{% leaveScope >> (withNodeInfo $1 $ CFunDef [] $1 [] $2) }
+
+  |                      attrs function_declarator compound_statement
+    {% leaveScope >> (withNodeInfo $2 $ CFunDef (liftCAttrs $1) $2 [] $3) }
+
+  | declaration_specifier      function_declarator compound_statement
+	  {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }
+
+  | type_specifier             function_declarator compound_statement
+	  {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }
+
+  | declaration_qualifier_list function_declarator compound_statement
+	  {% leaveScope >> (withNodeInfo $1 $ CFunDef (reverse $1) $2 [] $3) }
+
+  | type_qualifier_list   function_declarator compound_statement
+	  {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 [] $3) }
+
+  | type_qualifier_list   attrs function_declarator compound_statement
+	  {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1 ++ liftCAttrs $2) $3 [] $4) }
+
+  -- old function declarators
+
+  |                            function_declarator_old declaration_list compound_statement
+  	{% withNodeInfo $1 $ CFunDef [] $1 (reverse $2) $3 }
+
+  |                      attrs function_declarator_old declaration_list compound_statement
+  	{% withNodeInfo $2 $ CFunDef (liftCAttrs $1) $2 (reverse $3) $4 }
+
+  | declaration_specifier      function_declarator_old declaration_list compound_statement
+  	{% withNodeInfo $1 $ CFunDef $1 $2 (reverse $3) $4 }
+
+  | type_specifier             function_declarator_old declaration_list compound_statement
+  	{% withNodeInfo $1 $ CFunDef $1 $2 (reverse $3) $4 }
+
+  | declaration_qualifier_list function_declarator_old declaration_list compound_statement
+  	{% withNodeInfo $1 $ CFunDef (reverse $1) $2 (reverse $3) $4 }
+
+  | type_qualifier_list   function_declarator_old declaration_list compound_statement
+  	{% withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 (reverse $3) $4 }
+
+  | type_qualifier_list attrs  function_declarator_old declaration_list compound_statement
+  	{% withNodeInfo $1 $ CFunDef (liftTypeQuals $1  ++ liftCAttrs $2) $3 (reverse $4) $5 }
+
+-- Read declarator and put function
+function_declarator :: { CDeclr }
+function_declarator
+  : identifier_declarator
+  	{% let declr = reverseDeclr $1 in
+  	   enterScope >> doFuncParamDeclIdent declr >> return declr }
+
+
+-- parse C statement (C99 6.8)
+--
+-- * GNU extension: ' __asm__ (...); ' statements
+--
+statement :: { CStat }
+statement
+  : labeled_statement			{ $1 }
+  | compound_statement		{ $1 }
+  | expression_statement	{ $1 }
+  | selection_statement		{ $1 }
+  | iteration_statement		{ $1 }
+  | jump_statement			  { $1 }
+  | asm_statement			    {% withNodeInfo $1 (CAsm $1) }
+
+
+-- parse C labeled statement (C99 6.8.1)
+--
+-- * GNU extension: case ranges
+--
+labeled_statement :: { CStat }
+labeled_statement
+  : identifier ':' attrs_opt statement		{% withNodeInfo $2 $ CLabel $1 $4 $3 }
+  | case constant_expression ':' statement	{% withNodeInfo $1 $ CCase $2 $4 }
+  | default ':' statement			{% withNodeInfo $1 $ CDefault $3 }
+  | case constant_expression "..." constant_expression ':' statement
+  	{% withNodeInfo $1 $ CCases $2 $4 $6 }
+
+
+-- parse C compound statement (C99 6.8.2)
+--
+-- * GNU extension: '__label__ ident;' declarations
+--
+compound_statement :: { CStat }
+compound_statement
+  : '{' enter_scope block_item_list leave_scope '}'
+  	{% withNodeInfo $1 $ CCompound [] (reverse $3) }
+
+  | '{' enter_scope label_declarations block_item_list leave_scope '}'
+  	{% withNodeInfo $1 $ CCompound (reverse $3) (reverse $4) }
+
+
+-- No syntax for these, just side effecting semantic actions.
+--
+enter_scope :: { () }
+enter_scope : {% enterScope }
+leave_scope :: { () }
+leave_scope : {% leaveScope }
+
+
+block_item_list :: { Reversed [CBlockItem] }
+block_item_list
+  : {- empty -}			{ empty }
+  | block_item_list block_item	{ $1 `snoc` $2 }
+
+block_item :: { CBlockItem }
+block_item
+  : statement			{ CBlockStmt $1 }
+  | nested_declaration		{ $1 }
+
+nested_declaration :: { CBlockItem }
+nested_declaration
+  : declaration				{ CBlockDecl $1 }
+  | nested_function_definition		{ CNestedFunDef $1 }
+  | "__extension__" nested_declaration	{ $2 }
+
+nested_function_definition :: { CFunDef }
+nested_function_definition
+  : declaration_specifier      function_declarator compound_statement
+	{% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }
+
+  | type_specifier             function_declarator compound_statement
+	{% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }
+
+  | declaration_qualifier_list function_declarator compound_statement
+	{% leaveScope >> (withNodeInfo $1 $ CFunDef (reverse $1) $2 [] $3) }
+
+  | type_qualifier_list   function_declarator compound_statement
+	{% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 [] $3) }
+
+  | type_qualifier_list   attrs function_declarator compound_statement
+	{% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1 ++ liftCAttrs $2) $3 [] $4) }
+
+
+label_declarations :: { Reversed [Ident] }
+label_declarations
+  : "__label__" identifier_list ';'			{ $2 }
+  | label_declarations "__label__" identifier_list ';'	{ $1 `rappendr` $3 }
+
+
+-- parse C expression statement (C99 6.8.3)
+--
+expression_statement :: { CStat }
+expression_statement
+  : ';'				{% withNodeInfo $1 $ CExpr Nothing }
+  | expression ';'		{% withNodeInfo $1 $ CExpr (Just $1) }
+
+
+-- parse C selection statement (C99 6.8.4)
+--
+selection_statement :: { CStat }
+selection_statement
+  : if '(' expression ')' statement
+	{% withNodeInfo $1 $ CIf $3 $5 Nothing }
+
+  | if '(' expression ')' statement else statement
+	{% withNodeInfo $1 $ CIf $3 $5 (Just $7) }
+
+  | switch '(' expression ')' statement	
+	{% withNodeInfo $1 $ CSwitch $3 $5 }
+
+
+-- parse C iteration statement (C99 6.8.5)
+--
+iteration_statement :: { CStat }
+iteration_statement
+  : while '(' expression ')' statement
+  	{% withNodeInfo $1 $ CWhile $3 $5 False }
+
+  | do statement while '(' expression ')' ';'
+  	{% withNodeInfo $1 $ CWhile $5 $2 True }
+
+  | for '(' expression_opt ';' expression_opt ';' expression_opt ')' statement
+	{% withNodeInfo $1 $ CFor (Left $3) $5 $7 $9 }
+
+  | for '(' enter_scope declaration expression_opt ';' expression_opt ')' statement leave_scope
+	{% withNodeInfo $1 $ CFor (Right $4) $5 $7 $9 }
+
+
+-- parse C jump statement (C99 6.8.6)
+--
+-- * GNU extension: computed gotos
+--
+jump_statement :: { CStat }
+jump_statement
+  : goto identifier ';'			{% withNodeInfo $1 $ CGoto $2 }
+  | goto '*' expression ';'		{% withNodeInfo $1 $ CGotoPtr $3 }
+  | continue ';'			{% withNodeInfo $1 $ CCont }
+  | break ';'				{% withNodeInfo $1 $ CBreak }
+  | return expression_opt ';'		{% withNodeInfo $1 $ CReturn $2 }
+
+
+-- parse GNU C __asm__ statement (compatible with C99: J.5.10)
+--
+-- asm_stmt    :- asm volatile? ( "asm..." : output-operands : input-operands : asm-clobbers )
+-- asm_operand :- [operand-name] "constraint" ( expr )
+-- asm_clobber :- "r1", "r2", ...
+--
+asm_statement :: { CAsmStmt }
+asm_statement
+  : asm maybe_type_qualifier '(' string_literal ')' ';'
+  	{% withNodeInfo $1 $ CAsmStmt $2 $4 [] [] [] }
+
+  | asm maybe_type_qualifier '(' string_literal ':' asm_operands ')' ';'
+  	{% withNodeInfo $1 $ CAsmStmt $2 $4 $6 [] [] }
+
+  | asm maybe_type_qualifier '(' string_literal ':' asm_operands ':' asm_operands ')' ';'
+  	{% withNodeInfo $1 $ CAsmStmt $2 $4 $6 $8 [] }
+
+  | asm maybe_type_qualifier '(' string_literal ':' asm_operands ':' asm_operands ':' asm_clobbers ')' ';'
+  	{% withNodeInfo $1 $ CAsmStmt $2 $4 $6 $8 (reverse $10) }
+
+
+maybe_type_qualifier :: { Maybe CTypeQual }
+maybe_type_qualifier
+  : {- empty -}		  { Nothing }
+  | type_qualifier	{ Just $1 }
+
+asm_operands :: { [CAsmOperand] }
+asm_operands
+  : {- empty -}				{ [] }
+  | nonnull_asm_operands		{ reverse $1 }
+
+nonnull_asm_operands :: { Reversed [CAsmOperand] }
+nonnull_asm_operands
+  : asm_operand					{ singleton $1 }
+  | nonnull_asm_operands ',' asm_operand	{ $1 `snoc` $3 }
+
+asm_operand :: { CAsmOperand }
+asm_operand
+  : string_literal '(' expression ')'			            {% withNodeInfo $1 $ CAsmOperand Nothing $1 $3 }
+  | '[' ident ']' string_literal '(' expression ')'   {% withNodeInfo $4 $ CAsmOperand (Just $2) $4 $6 }
+  | '[' tyident ']' string_literal '(' expression ')'	{% withNodeInfo $4 $ CAsmOperand (Just $2) $4 $6 }
+
+
+asm_clobbers :: { Reversed [CStrLit] }
+asm_clobbers
+  : string_literal			            { singleton $1 }
+  | asm_clobbers ',' string_literal	{ $1 `snoc` $3 }
+
+{-
+---------------------------------------------------------------------------------------------------------------
+---------------------------------------------------------------------------------------------------------------
+-- Declarations
+---------------------------------------------------------------------------------------------------------------
+---------------------------------------------------------------------------------------------------------------
+
+Declarations are the most complicated part of the grammar, and shall be summarized here.
+To allow a lightweight notation, we will use the modifier <permute> to indicate that the order of the immidieate right-hand
+sides doesn't matter.
+ - <permute> a* b+ c   === any sequence of a's, b's and c's, which contains exactly 1 'c' and at least one 'b'
+
+-- storage class and type qualifier
+---------------------------------------------------------------------------------------------------------------
+attr                       :-   __attribute__((..))
+storage_class              :-   typedef | extern | static | auto | register | __thread
+type_qualifier             :-   const | volatile | restrict | inline
+type_qualifier_list        :-   type_qualifier+
+
+declaration_qualifier      :-   storage_class | type_qualifier
+declaration_qualifier_list :-   <permute> type_qualifier* storage_class+
+
+qualifiers                 :-   declaration_qualifier_list | type_qualifier_list
+                           :=   <permute> (type_qualifier|storage_class)+
+
+-- type names
+---------------------------------------------------------------------------------------------------------------
+declaration_specifier      :- <permute> type_qualifier* storage_class+ (basic_type_name+ | elaborated_type_name | tyident )
+type_specifier             :- <permute> type_qualifier* (basic_type_name+ | elaborated_type_name | tyident)
+
+specifiers                 :- declaration_specifier | type_specifier
+                           := <permute> type_qualifier* storage_class* (basic_type_name+ | elaborated_type_name | tyident )
+
+-- struct/union/enum declarations
+---------------------------------------------------------------------------------------------------------------
+sue_declaration_specifier :- <permute> type_qualifier* storage_class+ elaborated_type_name
+sue_type_specifier        :- <permute> type_qualifier* elaborated_type_name
+
+sue_declaration           := sue_declaration_specifier | sue_type_specifier
+                          :- <permute> type_qualifier* storage_class* elaborated_type_name
+
+-- declarators
+---------------------------------------------------------------------------------------------------------------
+identifier_declarator :- ( '*' (type_qualifier | attr)* ) * ident     [ array_decl | "(" parameter-list ")" ]
+                               plus additional parenthesis' ending ^^ here
+typedef_declartor     :-
+declarator            :- identifier_declarator | typedef_declarator
+
+-- Declaration lists
+---------------------------------------------------------------------------------------------------------------
+default_declaring_list :- qualifiers ( identifier_declarator asm*attrs* initializer? )_comma_list
+
+declaring_list         :- specifiers ( declarator asm*attrs* initializer? )_comma_list
+
+declaration_list := default_declaring_list | declaring_list
+
+-- Declaration
+---------------------------------------------------------------------------------------------------------------
+declaration = sue_declaration | declaration_list
+
+---------------------------------------------------------------------------------------------------------------
+---------------------------------------------------------------------------------------------------------------
+-- Attributes
+-- (citing http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html)
+---------------------------------------------------------------------------------------------------------------
+---------------------------------------------------------------------------------------------------------------
+
+"Attributes may appear after the colon following a label (expect case and default)"
+
+labeled_statement :- identifier ':' attrs_opt statement
+
+"Attributes may go either immediately after the struct/union/enum keyword or after the closing brace"
+
+struct attrs_opt ...
+struct ... { } attrs_opt
+
+"In general: Attributes appear as part of declarations, either belonging to a declaration or declarator"
+
+"Any list of specifiers and qualifiers at the start of a declaration may contain attribute specifiers"
+"An attribute list may appear immediately before the comma, = or semicolon terminating a declaration of an identifier"
+
+---------------------------------------------------------------------------------------------------------------
+For the parser, we modified the following rules to be interleaved with attributes:
+
+default_declaring_list' :-  (declaration_qualifier_list' | type_qualifier_list' attr*)
+                                             identifier_declarator asm*attr* initializer?
+                                 { ',' attr* identifier_declarator asm*attr* initializer? }
+declaring_list' :-          specifier' declarator asm*attr* initializer?
+                                 { ',' attr* declarator asm*attr* initializer? }
+
+
+type_qualifier_list' is like type_qualifier_list, but with preceeding and/or interleaving (but not terminating) __attribute__ annotations.
+declaration_qualifier_list', declaration_specifier' and type_specifier' are like their unprimed variants, but with arbitrary preceeding, interleaving and/or terminating __attribute__ annotations.
+
+"An attribute list may appear immediately before a declarator other than the first in a comma seperated list of declarators"
+
+"The attribute specifiers may be the only specifiers present (implicit int)" [not supported]
+
+"Attribute specifiers may be mixed with type qualifiers appearing inside the [] of an parameter array declarator"
+
+tbc.
+-}
+
+
+
+-- parse C declaration (C99 6.7)
+declaration :: { CDecl }
+declaration
+  : sue_declaration_specifier ';'
+  	{% withNodeInfo $1 $ CDecl (reverse $1) [] }
+
+  | sue_type_specifier ';'
+  	{% withNodeInfo $1 $ CDecl (reverse $1) [] }
+
+  | declaring_list ';'
+  	{ case $1 of
+            CDecl declspecs dies at ->
+              CDecl declspecs (List.reverse dies) at }
+
+  | default_declaring_list ';'
+  	{ case $1 of
+            CDecl declspecs dies at ->
+              CDecl declspecs (List.reverse dies) at }
+
+
+declaration_list :: { Reversed [CDecl] }
+declaration_list
+  : {- empty -}					{ empty }
+  | declaration_list declaration		{ $1 `snoc` $2 }
+
+
+-- Note that if a typedef were redeclared, then a declaration
+-- specifier must be supplied
+--
+-- Can't redeclare typedef names
+--
+-- * SUMMARY: default_declaring_list :- qualifier* identifier_declarator asm_attrs initializer?
+--                                                 { ',' identifier_declarator asm_attrs initializer? }
+--
+-- * GNU extensions
+--   __attribute__ annotations imm. before an declarator (see Attribute Syntax, paragraph 11)
+--   asm + __attribute__ annotations (end of declarations, see Attribute Syntax, paragraph 12)
+--   The assembler annotation is used to specifiy an assembler name for the declarator.
+--
+default_declaring_list :: { CDecl }
+default_declaring_list
+  : declaration_qualifier_list identifier_declarator asm_attrs_opt {-{}-} initializer_opt
+  	{% let declspecs = reverse $1 in
+  	   do{ declr <- withAsmNameAttrs $3 $2
+           ; doDeclIdent declspecs declr
+           ; withNodeInfo $1 $ CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }}
+
+  | type_qualifier_list identifier_declarator asm_attrs_opt {-{}-} initializer_opt
+  	{% let declspecs = liftTypeQuals $1 in
+  	   do{ declr <- withAsmNameAttrs $3 $2
+           ; doDeclIdent declspecs declr
+           ; withNodeInfo $1 $ CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }}
+
+  | type_qualifier_list attrs identifier_declarator asm_attrs_opt {-{}-} initializer_opt -- FIX 1600
+  	{% let declspecs = liftTypeQuals $1 in
+  	   do{ declr <- withAsmNameAttrs $4 $3
+           ; doDeclIdent declspecs declr
+           ; withNodeInfo $1 $ CDecl (declspecs ++ liftCAttrs $2) [(Just (reverseDeclr declr), $5, Nothing)] }}
+
+  -- GNU extension: __attribute__ as the only qualifier
+  | attrs identifier_declarator asm_attrs_opt {-{}-} initializer_opt
+    {% let declspecs = liftCAttrs $1 in
+       do{ declr <- withAsmNameAttrs $3 $2
+           ; doDeclIdent declspecs declr
+           ; withNodeInfo $1 $ CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }}
+
+  | default_declaring_list ',' attrs_opt identifier_declarator asm_attrs_opt {-{}-} initializer_opt
+  	{% case $1 of
+             CDecl declspecs dies at -> do
+               declr <- withAsmNameAttrs (fst $5, snd $5 ++ $3) $4
+               doDeclIdent declspecs declr
+               return (CDecl declspecs ((Just (reverseDeclr declr), $6, Nothing) : dies) at) }
+
+-- assembler, followed by attribute annotation
+asm_attrs_opt :: { (Maybe CStrLit, [CAttr]) }
+asm_attrs_opt
+  : asm_opt attrs_opt
+  { ($1,$2) }
+
+--
+-- SUMMARY: declaring_list :- specifier* declarator asm_attrs initializer?
+--                                 { ',' declarator asm_attrs initializer? }
+--
+-- GNU extensions:
+--      __attribute__ annotations imm. before an declarator (see Attribute Syntax, paragraph 11)
+--      asm + __attribute__ annotations (end of declarations, see Attribute Syntax, paragraph 12)
+--
+declaring_list :: { CDecl }
+declaring_list
+  : declaration_specifier declarator asm_attrs_opt initializer_opt
+  	{% do{
+  	   declr <- withAsmNameAttrs $3 $2;
+  	   doDeclIdent $1 declr;
+       withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr declr), $4, Nothing)] }
+    }
+
+  | type_specifier declarator asm_attrs_opt initializer_opt
+  	{% do{
+  	   declr <- withAsmNameAttrs $3 $2;
+  	   doDeclIdent $1 declr;
+       withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr declr), $4, Nothing)] }
+    }
+
+  | declaring_list ',' attrs_opt declarator asm_attrs_opt initializer_opt
+  	{% case $1 of
+             CDecl declspecs dies at -> do
+               declr <- withAsmNameAttrs (fst $5, snd $5 ++ $3) $4
+               doDeclIdent declspecs declr
+               return (CDecl declspecs ((Just (reverseDeclr declr), $6, Nothing) : dies) at) }
+
+
+-- parse C declaration specifiers (C99 6.7)
+--
+-- * <permute> type_qualifier* storage_class+ (basic_type_name+ | elaborated_type_name | tyident )
+--
+declaration_specifier :: { [CDeclSpec] }
+declaration_specifier
+  : basic_declaration_specifier		{ reverse $1 }	-- Arithmetic or void
+  | sue_declaration_specifier		{ reverse $1 }	  -- Struct/Union/Enum
+  | typedef_declaration_specifier	{ reverse $1 }	-- Typedef
+
+
+-- A mixture of type qualifiers (const, volatile, restrict, inline) and storage class specifiers
+-- (extern, static, auto, register, __thread), in any order, but containing at least one storage class specifier.
+--
+-- declaration_qualifier_list :- <permute> type_qualifier* storage_class+
+--
+-- GNU extensions
+--   * arbitrary interleaved __attribute__ annotations
+--
+declaration_qualifier_list :: { Reversed [CDeclSpec] }
+declaration_qualifier_list
+  : storage_class
+  	{ singleton (CStorageSpec $1) }
+
+  | attrs storage_class
+  	{ reverseList (liftCAttrs $1) `snoc` (CStorageSpec $2) }
+
+  | type_qualifier_list storage_class
+  	{ rmap CTypeQual $1 `snoc` CStorageSpec $2 }
+
+  | type_qualifier_list attrs storage_class
+  	{ (rmap CTypeQual $1 `rappend` liftCAttrs $2) `snoc` CStorageSpec $3 }
+
+  | declaration_qualifier_list declaration_qualifier
+  	{ $1 `snoc` $2 }
+
+  | declaration_qualifier_list attr
+  	{ addTrailingAttrs $1 $2 }
+
+--
+-- declaration_qualifier :- storage_class | type_qualifier
+--
+declaration_qualifier :: { CDeclSpec }
+declaration_qualifier
+  : storage_class		{ CStorageSpec $1 }
+  | type_qualifier		{ CTypeQual $1 }     -- const or volatile
+
+
+-- parse C storage class specifier (C99 6.7.1)
+--
+-- * GNU extensions: '__thread' thread local storage
+--
+storage_class :: { CStorageSpec }
+storage_class
+  : typedef			{% withNodeInfo $1 $ CTypedef }
+  | extern			{% withNodeInfo $1 $ CExtern }
+  | static			{% withNodeInfo $1 $ CStatic }
+  | auto			{% withNodeInfo $1 $ CAuto }
+  | register			{% withNodeInfo $1 $ CRegister }
+  | "__thread"			{% withNodeInfo $1 $ CThread }
+
+
+-- parse C type specifier (C99 6.7.2)
+--
+-- This recignises a whole list of type specifiers rather than just one
+-- as in the C99 grammar.
+--
+-- type_specifier :- <permute> type_qualifier* (basic_type_name+ | elaborated_type_name | tyident)
+--
+type_specifier :: { [CDeclSpec] }
+type_specifier
+  : basic_type_specifier		{ reverse $1 }	-- Arithmetic or void
+  | sue_type_specifier			{ reverse $1 }	-- Struct/Union/Enum
+  | typedef_type_specifier		{ reverse $1 }	-- Typedef
+
+basic_type_name :: { CTypeSpec }
+basic_type_name
+  : void			{% withNodeInfo $1 $ CVoidType }
+  | char			{% withNodeInfo $1 $ CCharType }
+  | short			{% withNodeInfo $1 $ CShortType }
+  | int				{% withNodeInfo $1 $ CIntType }
+  | long			{% withNodeInfo $1 $ CLongType }
+  | float			{% withNodeInfo $1 $ CFloatType }
+  | double			{% withNodeInfo $1 $ CDoubleType }
+  | signed			{% withNodeInfo $1 $ CSignedType }
+  | unsigned			{% withNodeInfo $1 $ CUnsigType }
+  | "_Bool"			{% withNodeInfo $1 $ CBoolType }
+  | "_Complex"			{% withNodeInfo $1 $ CComplexType }
+
+
+-- A mixture of type qualifiers, storage class and basic type names in any
+-- order, but containing at least one basic type name and at least one storage
+-- class specifier.
+--
+-- basic_declaration_specifier :- <permute> type_qualifier* storage_class+ basic_type_name+
+--
+--   GNU extensions
+--     arbitrary interleaved __attribute__ annotations
+--
+basic_declaration_specifier :: { Reversed [CDeclSpec] }
+basic_declaration_specifier
+  : declaration_qualifier_list basic_type_name
+  	{ $1 `snoc` CTypeSpec $2 }
+
+  | basic_type_specifier storage_class
+  	{ $1 `snoc` CStorageSpec $2 }
+
+  | basic_declaration_specifier declaration_qualifier
+  	{ $1 `snoc` $2 }
+
+  | basic_declaration_specifier basic_type_name
+  	{ $1 `snoc` CTypeSpec $2 }
+
+  | basic_declaration_specifier attr
+  	{ addTrailingAttrs $1 $2 }
+
+
+-- A mixture of type qualifiers and basic type names in any order, but
+-- containing at least one basic type name.
+--
+-- basic_type_specifier :- <permute> type_qualifier* basic_type_name+
+--
+--   GNU extensions
+--     arbitrary interleaved __attribute__ annotations
+--
+basic_type_specifier :: { Reversed [CDeclSpec] }
+basic_type_specifier
+  -- Arithmetic or void
+  : basic_type_name
+  	{ singleton (CTypeSpec $1) }
+
+  | attrs basic_type_name
+  	{ (reverseList $ liftCAttrs $1) `snoc` (CTypeSpec $2) }
+
+  | type_qualifier_list basic_type_name
+  	{ rmap CTypeQual $1 `snoc` CTypeSpec $2 }
+
+  | type_qualifier_list attrs basic_type_name
+  	{ rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec $3 }
+
+  | basic_type_specifier type_qualifier
+  	{ $1 `snoc` CTypeQual $2 }
+
+  | basic_type_specifier basic_type_name
+  	{ $1 `snoc` CTypeSpec $2 }
+
+  | basic_type_specifier attr
+     { addTrailingAttrs $1 $2 }
+
+
+-- A named or anonymous struct, union or enum type along with at least one
+-- storage class and any mix of type qualifiers.
+--
+-- * Summary:
+--   sue_declaration_specifier :- <permute> type_qualifier* storage_class+ elaborated_type_name
+--
+sue_declaration_specifier :: { Reversed [CDeclSpec] }
+sue_declaration_specifier
+  : declaration_qualifier_list elaborated_type_name
+  	{ $1 `snoc` CTypeSpec $2 }
+
+  | sue_type_specifier storage_class
+  	{ $1 `snoc` CStorageSpec $2 }
+
+  | sue_declaration_specifier declaration_qualifier
+  	{ $1 `snoc` $2 }
+  	
+  | sue_declaration_specifier attr
+  	{ addTrailingAttrs $1 $2 }
+
+
+-- A struct, union or enum type (named or anonymous) with optional leading and
+-- trailing type qualifiers.
+--
+-- * Summary:
+--   sue_type_specifier :- <permute> type_qualifier* elaborated_type_name
+--
+-- * GNU Extensions: records __attribute__ annotations
+--
+sue_type_specifier :: { Reversed [CDeclSpec] }
+sue_type_specifier
+  -- struct/union/enum
+  : elaborated_type_name
+  	{ singleton (CTypeSpec $1) }
+
+  | attrs elaborated_type_name
+  	{ (reverseList $ liftCAttrs $1) `snoc` (CTypeSpec $2) }
+
+  | type_qualifier_list elaborated_type_name
+  	{ rmap CTypeQual $1 `snoc` CTypeSpec $2 }
+
+  | type_qualifier_list attrs elaborated_type_name
+  	{ rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec $3 }
+
+  | sue_type_specifier type_qualifier
+  	{ $1 `snoc` CTypeQual $2 }
+  	
+  | sue_type_specifier attr
+    { addTrailingAttrs $1 $2 }
+
+-- A typedef'ed type identifier with at least one storage qualifier and any
+-- number of type qualifiers
+--
+-- * Summary:
+--   typedef_declaration_specifier :- <permute> type_qualifier* storage_class+ tyident
+--
+-- * Note:
+--   the tyident can also be a: typeof '(' ... ')'
+--
+typedef_declaration_specifier :: { Reversed [CDeclSpec] }
+typedef_declaration_specifier
+  : typedef_type_specifier storage_class
+  	{ $1 `snoc` CStorageSpec $2 }
+  	
+  | declaration_qualifier_list tyident
+  	{% withNodeInfo $1 $ \at -> $1 `snoc` CTypeSpec (CTypeDef $2 at) }
+
+  | declaration_qualifier_list typeof '(' expression ')'
+  	{% withNodeInfo $1 $ \at -> $1 `snoc` CTypeSpec (CTypeOfExpr $4 at) }
+
+  | declaration_qualifier_list typeof '(' type_name ')'
+  	{% withNodeInfo $1 $ \at -> $1 `snoc` CTypeSpec (CTypeOfType $4 at) }
+
+  | typedef_declaration_specifier declaration_qualifier
+  	{ $1 `snoc` $2 }
+
+  | typedef_declaration_specifier attr
+  	{ addTrailingAttrs $1 $2 }
+
+
+-- typedef'ed type identifier with optional leading and trailing type qualifiers
+--
+-- * Summary:
+--   type_qualifier* ( tyident | typeof '('...')' ) type_qualifier*
+--
+typedef_type_specifier :: { Reversed [CDeclSpec] }
+typedef_type_specifier
+  : tyident
+  	{% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeDef $1 at)) }
+
+  | typeof '(' expression ')'
+  	{% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeOfExpr $3 at)) }
+
+  | typeof '(' type_name ')'
+  	{% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeOfType $3 at)) }
+
+  | type_qualifier_list tyident
+  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `snoc` CTypeSpec (CTypeDef $2 at) }
+
+  | type_qualifier_list typeof '(' expression ')'
+  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `snoc` CTypeSpec (CTypeOfExpr $4 at) }
+
+  | type_qualifier_list typeof '(' type_name ')'
+  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `snoc` CTypeSpec (CTypeOfType $4 at) }
+
+  -- repeat with attrs (this could be easier if type qualifier list wouldn't allow leading attributes)
+  | attrs tyident
+  	{% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc` (CTypeSpec (CTypeDef $2 at)) }
+
+  | attrs typeof '(' expression ')'
+  	{% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc`  (CTypeSpec (CTypeOfExpr $4 at)) }
+
+  | attrs typeof '(' type_name ')'
+  	{% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc`  (CTypeSpec (CTypeOfType $4 at)) }
+
+  | type_qualifier_list attrs tyident
+  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeDef $3 at) }
+
+  | type_qualifier_list attrs typeof '(' expression ')'
+  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeOfExpr $5 at) }
+
+  | type_qualifier_list attrs typeof '(' type_name ')'
+  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeOfType $5 at) }
+
+  | typedef_type_specifier type_qualifier
+  	{ $1 `snoc` CTypeQual $2 }
+
+  | typedef_type_specifier attr
+  	{ addTrailingAttrs $1 $2 }
+
+
+-- A named or anonymous struct, union or enum type.
+--
+-- * Summary:
+--   (struct|union|enum) (identifier? '{' ... '}' | identifier)
+--
+elaborated_type_name :: { CTypeSpec }
+elaborated_type_name
+  : struct_or_union_specifier	{% withNodeInfo $1 $ CSUType $1 }
+  | enum_specifier		{% withNodeInfo $1 $ CEnumType $1 }
+
+
+-- parse C structure or union declaration (C99 6.7.2.1)
+--
+-- * Summary:
+--    (struct|union) (identifier? '{' ... '}' | identifier)
+--
+struct_or_union_specifier :: { CStructUnion }
+struct_or_union_specifier
+  : struct_or_union attrs_opt identifier '{' struct_declaration_list  '}'
+  	{% withNodeInfo $1 $ CStruct (unL $1) (Just $3) (Just$ reverse $5) $2 }
+
+  | struct_or_union attrs_opt '{' struct_declaration_list  '}'
+  	{% withNodeInfo $1 $ CStruct (unL $1) Nothing   (Just$ reverse $4) $2 }
+
+  | struct_or_union attrs_opt identifier
+  	{% withNodeInfo $1 $ CStruct (unL $1) (Just $3) Nothing $2 }
+
+
+struct_or_union :: { Located CStructTag }
+struct_or_union
+  : struct			{ L CStructTag (posOf $1) }
+  | union			{ L CUnionTag (posOf $1) }
+
+
+struct_declaration_list :: { Reversed [CDecl] }
+struct_declaration_list
+  : {- empty -}						{ empty }
+  | struct_declaration_list ';'				{ $1 }
+  | struct_declaration_list struct_declaration		{ $1 `snoc` $2 }
+
+
+-- parse C structure declaration (C99 6.7.2.1)
+--
+struct_declaration :: { CDecl }
+struct_declaration
+  : struct_declaring_list ';'
+  	{ case $1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at }
+
+  | struct_default_declaring_list';'
+  	{ case $1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at }
+
+  | "__extension__" struct_declaration	{ $2 }
+
+
+--
+--  * Note: doesn't redeclare typedef
+--
+--  TODO: FIXME: AST doesn't allow recording attributes of unnamed struct members
+struct_default_declaring_list :: { CDecl }
+struct_default_declaring_list
+  : type_qualifier_list attrs_opt struct_identifier_declarator
+  	{% withNodeInfo $1 $ case $3 of (d,s) -> CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [(d,Nothing,s)] }
+
+  -- GNU extension: __attribute__ as only type qualifier
+  | attrs struct_identifier_declarator
+    {% withNodeInfo $1 $ case $2 of (d,s) -> CDecl (liftCAttrs $1) [(d,Nothing,s)] }
+  -- attrs_opt apply to the declared object
+  | struct_default_declaring_list ',' attrs_opt struct_identifier_declarator
+  	{ case $1 of
+            CDecl declspecs dies at ->
+              case $4 of
+                (Just d,s) -> CDecl declspecs ((Just $ appendObjAttrs $3 d,Nothing,s) : dies) at
+                (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) at } -- FIXME
+
+-- * GNU extensions:
+--     allow anonymous nested structures and unions
+--     FIXME: cannot record attribute of unnamed field
+struct_declaring_list :: { CDecl }
+struct_declaring_list
+  : type_specifier struct_declarator attrs_opt
+  	{% withNodeInfo $1 $ case $2 of { (Just d,s)  -> CDecl $1 [(Just $! appendObjAttrs $3 d,Nothing,s)]
+                                    ; (Nothing,s) -> CDecl $1 [(Nothing,Nothing,s)]  } } {- DO FIXME -}
+  | struct_declaring_list ',' attrs_opt struct_declarator attrs_opt
+  	{ case $1 of
+            CDecl declspecs dies attr ->
+              case $4 of
+                (Just d,s) -> CDecl declspecs ((Just$ appendObjAttrs ($3++$5) d,Nothing,s) : dies) attr
+                (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) attr }
+
+  -- FIXME: We're being far too liberal in the parsing here, we really want to just
+  -- allow unnamed struct and union fields but we're actually allowing any
+  -- unnamed struct member. Making it allow only unnamed structs or unions in
+  -- the parser is far too tricky, it makes things ambiguous. So we'll have to
+  -- diagnose unnamed fields that are not structs/unions in a later stage.
+
+  -- Note that a plain type specifier can have a trailing attribute
+
+  | type_specifier
+     {% withNodeInfo $1 $ CDecl $1 []  }
+
+
+-- parse C structure declarator (C99 6.7.2.1)
+--
+struct_declarator :: { (Maybe CDeclr, Maybe CExpr) }
+struct_declarator
+  : declarator					       { (Just (reverseDeclr $1), Nothing) }
+  | ':' constant_expression			   { (Nothing, Just $2) }
+  | declarator ':' constant_expression { (Just (reverseDeclr $1), Just $3) }
+
+-- FIXME: anonymous bitfield doesn't allow recording of attributes
+struct_identifier_declarator :: { (Maybe CDeclr, Maybe CExpr) }
+struct_identifier_declarator
+  : identifier_declarator				{ (Just (reverseDeclr $1), Nothing) }
+  | ':' constant_expression				{ (Nothing, Just $2) }
+  | identifier_declarator ':' constant_expression	{ (Just (reverseDeclr $1), Just $3) }
+  | struct_identifier_declarator attr
+    {  case $1 of {   (Nothing,expr) -> (Nothing,expr) {- FIXME -}
+                    ; (Just (CDeclr name derived asmname attrs node), bsz) ->
+                                        (Just (CDeclr name derived asmname (attrs++$2) node),bsz)
+                  }
+    }
+
+-- parse C enumeration declaration (C99 6.7.2.2)
+--
+-- * Summary:
+--   enum (identifier? '{' ... '}' | identifier)
+--
+enum_specifier :: { CEnum }
+enum_specifier
+  : enum attrs_opt '{' enumerator_list '}'
+  	{% withNodeInfo $1 $ CEnum Nothing   (Just$ reverse $4) $2 }
+
+  | enum attrs_opt '{' enumerator_list ',' '}'
+  	{% withNodeInfo $1 $ CEnum Nothing   (Just$ reverse $4) $2 }
+
+  | enum attrs_opt identifier '{' enumerator_list '}'
+  	{% withNodeInfo $1 $ CEnum (Just $3) (Just$ reverse $5) $2 }
+
+  | enum attrs_opt identifier '{' enumerator_list ',' '}'
+  	{% withNodeInfo $1 $ CEnum (Just $3) (Just$ reverse $5) $2 }
+
+  | enum attrs_opt identifier
+  	{% withNodeInfo $1 $ CEnum (Just $3) Nothing $2           }
+
+enumerator_list :: { Reversed [(Ident, Maybe CExpr)] }
+enumerator_list
+  : enumerator					{ singleton $1 }
+  | enumerator_list ',' enumerator		{ $1 `snoc` $3 }
+
+
+enumerator :: { (Ident, Maybe CExpr) }
+enumerator
+  : identifier					{ ($1, Nothing) }
+  | identifier '=' constant_expression		{ ($1, Just $3) }
+
+
+-- parse C type qualifier (C99 6.7.3)
+--
+type_qualifier :: { CTypeQual }
+type_qualifier
+  : const		{% withNodeInfo $1 $ CConstQual }
+  | volatile		{% withNodeInfo $1 $ CVolatQual }
+  | restrict		{% withNodeInfo $1 $ CRestrQual }
+  | inline		{% withNodeInfo $1 $ CInlineQual }
+
+-- a list containing at least one type_qualifier (const, volatile, restrict, inline)
+--    and additionally CAttrs
+type_qualifier_list :: { Reversed [CTypeQual] }
+type_qualifier_list
+  : attrs_opt type_qualifier	             { reverseList (map CAttrQual $1) `snoc` $2 }
+  | type_qualifier_list type_qualifier	     { $1 `snoc` $2 }
+  | type_qualifier_list attrs type_qualifier { ($1 `rappend` map CAttrQual $2) `snoc` $3}	
+
+-- parse C declarator (C99 6.7.5)
+--
+declarator :: { CDeclrR }
+declarator
+  : identifier_declarator		{ $1 }
+  | typedef_declarator			{ $1 }
+
+
+-- Parse GNU C's asm annotations
+--
+-- Those annotations allow to give an assembler name to a function or identifier.
+asm_opt :: { Maybe CStrLit }
+asm_opt
+  : {- empty -}				          { Nothing }
+  | asm '(' string_literal ')'	{ Just $3 }
+
+--
+-- typedef_declarator :-
+
+typedef_declarator :: { CDeclrR }
+typedef_declarator
+  -- would be ambiguous as parameter
+  : paren_typedef_declarator		{ $1 }
+
+  -- not ambiguous as param
+  | parameter_typedef_declarator	{ $1 }
+
+
+-- parameter_typedef_declarator :- tyident declarator_postfix?
+--                              | '(' attrs? clean_typedef_declarator ')' declarator_postfix?
+--                              |  '*' attrs? type_qualifier_list? parameter_typedef_declarator
+--
+parameter_typedef_declarator :: { CDeclrR }
+parameter_typedef_declarator
+  : tyident
+  	{% withNodeInfo $1 $ mkVarDeclr $1 }
+
+  | tyident postfixing_abstract_declarator
+  	{% withNodeInfo $1 $ \at -> $2 (mkVarDeclr $1 at) }
+
+  | clean_typedef_declarator
+  	{ $1 }
+
+
+-- The  following have at least one '*'.
+-- There is no (redundant) '(' between the '*' and the tyident.
+--
+-- clean_typedef_declarator :-  '(' attrs? clean_typedef_declarator ')' declarator_postfix?
+--                            | '*' attrs? type_qualifier_list? parameter_typedef_declarator
+--
+clean_typedef_declarator :: { CDeclrR }
+clean_typedef_declarator
+  : clean_postfix_typedef_declarator
+  	{ $1 }
+
+  | '*' parameter_typedef_declarator
+  	{% withNodeInfo $1 $ ptrDeclr $2 [] }
+
+  | '*' attrs parameter_typedef_declarator
+  	{% withAttribute $1 $2 $ ptrDeclr $3 [] }
+
+  | '*' type_qualifier_list  parameter_typedef_declarator
+  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }
+
+  | '*' type_qualifier_list attrs parameter_typedef_declarator
+  	{% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2)  }
+
+-- clean_postfix_typedef_declarator :- ( attrs? clean_typedef_declarator ) declarator_postfix?
+--
+clean_postfix_typedef_declarator :: { CDeclrR }
+clean_postfix_typedef_declarator
+  : '(' clean_typedef_declarator ')'						              { $2 }
+  | '(' clean_typedef_declarator ')' postfixing_abstract_declarator		  { $4 $2 }
+  | '(' attrs clean_typedef_declarator ')'	                              { appendDeclrAttrs $2 $3 }
+  | '(' attrs clean_typedef_declarator ')' postfixing_abstract_declarator { appendDeclrAttrs $2 ($5 $3) }
+
+
+-- The following have a redundant '(' placed
+-- immediately to the left of the tyident
+--
+paren_typedef_declarator :: { CDeclrR }
+paren_typedef_declarator
+  : paren_postfix_typedef_declarator
+  	{ $1 }
+
+  -- redundant paren
+  | '*' '(' simple_paren_typedef_declarator ')'
+  	{% withNodeInfo $1 $ ptrDeclr $3 [] }
+
+  | '*' type_qualifier_list '(' simple_paren_typedef_declarator ')'
+  	{% withNodeInfo $1 $ ptrDeclr $4 (reverse $2) }
+  | '*' type_qualifier_list attrs '(' simple_paren_typedef_declarator ')'
+  	{% withAttribute $1 $3 $ ptrDeclr $5 (reverse $2)  }
+
+  | '*' paren_typedef_declarator
+  	{% withNodeInfo $1 $ ptrDeclr $2 [] }
+
+  | '*' type_qualifier_list paren_typedef_declarator
+  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }
+  | '*' type_qualifier_list attrs paren_typedef_declarator
+  	{% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) }
+
+-- redundant paren to left of tname
+paren_postfix_typedef_declarator :: { CDeclrR }
+paren_postfix_typedef_declarator
+  : '(' paren_typedef_declarator ')'
+  	{ $2 }
+
+  -- redundant paren
+  | '(' simple_paren_typedef_declarator postfixing_abstract_declarator ')'
+  	{ $3 $2 }
+
+  | '(' paren_typedef_declarator ')' postfixing_abstract_declarator
+  	{ $4 $2 }
+
+
+-- Just a type name in any number of nested brackets
+--
+simple_paren_typedef_declarator :: { CDeclrR }
+simple_paren_typedef_declarator
+  : tyident
+  	{% withNodeInfo $1 $ mkVarDeclr $1 }
+
+  | '(' simple_paren_typedef_declarator ')'
+  	{ $2 }
+
+--
+-- Declarators
+-- * Summary
+--   declarator :- ( '*' (type_qualifier | attr)* )* ident ( array_decl | "(" parameter-list ")" )?
+--      + additional parenthesis
+--
+identifier_declarator :: { CDeclrR }
+identifier_declarator
+  : unary_identifier_declarator			{ $1 }
+  | paren_identifier_declarator			{ $1 }
+
+
+unary_identifier_declarator :: { CDeclrR }
+unary_identifier_declarator
+  : postfix_identifier_declarator
+  	{ $1 }
+
+  | '*' identifier_declarator
+  	{% withNodeInfo $1 $ ptrDeclr $2 [] }
+
+  | '*' attrs identifier_declarator
+  	{% withAttribute $1 $2 $ ptrDeclr $3 [] }
+
+  | '*' type_qualifier_list identifier_declarator
+  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }
+
+  | '*' type_qualifier_list attrs identifier_declarator
+  	{% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) }
+
+postfix_identifier_declarator :: { CDeclrR }
+postfix_identifier_declarator
+  : paren_identifier_declarator postfixing_abstract_declarator
+  	{ $2 $1 }
+
+   | '('  unary_identifier_declarator ')'
+   	{ $2 }
+
+   | '(' unary_identifier_declarator ')' postfixing_abstract_declarator
+   	{ $4 $2 }
+
+   | '(' attrs unary_identifier_declarator ')'
+     { appendDeclrAttrs $2 $3 }
+
+   | '(' attrs unary_identifier_declarator ')' postfixing_abstract_declarator
+     { appendDeclrAttrs $2 ($5 $3) }
+
+
+-- just an identifier in any number of nested parenthesis
+paren_identifier_declarator :: { CDeclrR }
+paren_identifier_declarator
+  : ident
+  	{% withNodeInfo $1 $ mkVarDeclr $1 }
+
+  | '(' paren_identifier_declarator ')'
+  	{ $2 }
+
+  | '(' attrs paren_identifier_declarator ')'
+  	{ appendDeclrAttrs $2 $3 }
+
+function_declarator_old :: { CDeclr }
+function_declarator_old
+  : old_function_declarator
+    { reverseDeclr $1 }
+
+old_function_declarator :: { CDeclrR }
+old_function_declarator
+  : postfix_old_function_declarator
+  	{ $1 }
+
+  | '*' old_function_declarator
+  	{% withNodeInfo $1 $ ptrDeclr $2 [] } -- FIXME: no attr possible here ???
+
+  | '*' type_qualifier_list old_function_declarator
+  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }
+
+postfix_old_function_declarator :: { CDeclrR }
+postfix_old_function_declarator
+  : paren_identifier_declarator '(' identifier_list ')'
+  	{% withNodeInfo $2 $ funDeclr $1 (Left $ reverse $3) [] }
+
+  | '(' old_function_declarator ')'
+  	{ $2 }
+
+  | '(' old_function_declarator ')' postfixing_abstract_declarator
+  	{ $4 $2 }
+
+
+-- parse C parameter type list (C99 6.7.5)
+--
+parameter_type_list :: { ([CDecl], Bool) }
+parameter_type_list
+  : {- empty -}				{ ([], False)}
+  | parameter_list			{ (reverse $1, False) }
+  | parameter_list ',' "..."		{ (reverse $1, True) }
+
+parameter_list :: { Reversed [CDecl] }
+parameter_list
+  : parameter_declaration				{ singleton $1 }
+  | parameter_list ',' parameter_declaration	{ $1 `snoc` $3 }
+
+parameter_declaration :: { CDecl }
+parameter_declaration
+  : declaration_specifier
+  	{% withNodeInfo $1 $ CDecl $1 [] }
+
+  | declaration_specifier abstract_declarator
+  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] }
+
+  | declaration_specifier identifier_declarator attrs_opt
+  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }
+
+  | declaration_specifier parameter_typedef_declarator attrs_opt
+  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }
+
+  | declaration_qualifier_list
+  	{% withNodeInfo $1 $ CDecl (reverse $1) [] }
+
+  | declaration_qualifier_list abstract_declarator
+  	{% withNodeInfo $1 $ CDecl (reverse $1) [(Just (reverseDeclr $2), Nothing, Nothing)] }
+
+  | declaration_qualifier_list identifier_declarator attrs_opt
+  	{% withNodeInfo $1 $ CDecl (reverse $1) [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }
+
+  | type_specifier
+  	{% withNodeInfo $1 $ CDecl $1 [] }
+
+  | type_specifier abstract_declarator
+  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] }
+
+  | type_specifier identifier_declarator attrs_opt
+  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }
+
+  | type_specifier parameter_typedef_declarator attrs_opt
+  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }
+
+  | type_qualifier_list
+  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [] }
+  | type_qualifier_list attr
+  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [] }
+
+  | type_qualifier_list abstract_declarator
+  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr $2), Nothing, Nothing)] }
+
+  | type_qualifier_list identifier_declarator attrs_opt
+  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr$ appendDeclrAttrs $3 $2), Nothing, Nothing)] }
+
+
+identifier_list :: { Reversed [Ident] }
+identifier_list
+  : ident				{ singleton $1 }
+  | identifier_list ',' ident		{ $1 `snoc` $3 }
+
+
+-- parse C type name (C99 6.7.6)
+--
+type_name :: { CDecl }
+type_name
+  :  type_specifier
+  	{% withNodeInfo $1 $ CDecl $1 [] }
+
+  |  type_specifier abstract_declarator
+  	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] }
+
+  |  type_qualifier_list attr
+  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [] }
+
+  |  type_qualifier_list abstract_declarator
+  	{% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr $2), Nothing, Nothing)] }
+
+-- parse C abstract declarator (C99 6.7.6)
+--
+-- postfix starts with '('
+-- postfixing starts with '(' or '['
+-- unary start with '*'
+abstract_declarator :: { CDeclrR }
+abstract_declarator
+  : unary_abstract_declarator	    { $1 }
+  | postfix_abstract_declarator		{ $1 }
+  | postfixing_abstract_declarator  { $1 emptyDeclr }
+
+--
+-- FIXME
+--  | postfixing_abstract_declarator attrs_opt	{ $1 emptyDeclr }
+
+
+postfixing_abstract_declarator :: { CDeclrR -> CDeclrR }
+postfixing_abstract_declarator
+  : array_abstract_declarator
+  	{ $1 }
+
+  | '(' parameter_type_list ')'
+  	{% withNodeInfo $1 $ \at declr -> case $2 of
+             (params, variadic) -> funDeclr declr (Right (params,variadic)) [] at }
+
+
+-- * TODO: Note that we recognise but ignore the C99 static keyword (see C99 6.7.5.3)
+--
+-- * TODO: We do not distinguish in the AST between incomplete array types and
+-- complete variable length arrays ([ '*' ] means the latter). (see C99 6.7.5.2)
+--
+array_abstract_declarator :: { CDeclrR -> CDeclrR }
+array_abstract_declarator
+  : postfix_array_abstract_declarator
+  	{ $1 }
+
+  | array_abstract_declarator postfix_array_abstract_declarator
+  	{ \decl -> $2 ($1 decl) }
+
+--
+-- TODO: record static
+postfix_array_abstract_declarator :: { CDeclrR -> CDeclrR }
+postfix_array_abstract_declarator
+  : '[' assignment_expression_opt ']'
+  	{% withNodeInfo $1 $ \at declr -> arrDeclr declr [] False False $2 at }
+
+  | '[' attrs assignment_expression_opt ']'
+  	{% withAttributePF $1 $2 $ \at declr -> arrDeclr declr [] False False $3 at }
+
+  | '[' type_qualifier_list assignment_expression_opt ']'
+  	{% withNodeInfo $1 $ \at declr -> arrDeclr declr (reverse $2) False False $3 at }
+
+  | '[' type_qualifier_list attrs assignment_expression_opt ']'
+  	{% withAttributePF $1 $3 $ \at declr -> arrDeclr declr (reverse $2) False False $4 at }
+
+  | '[' static attrs_opt assignment_expression ']'
+  	{% withAttributePF $1 $3 $ \at declr -> arrDeclr declr [] False True (Just $4) at }
+
+  | '[' static type_qualifier_list attrs_opt assignment_expression ']'
+  	{% withAttributePF $1 $4 $ \at declr -> arrDeclr declr (reverse $3) False True (Just $5) at }
+
+  | '[' type_qualifier_list attrs_opt static attrs_opt assignment_expression ']'
+  	{% withAttributePF $1 ($3 ++ $5) $ \at declr -> arrDeclr declr (reverse $2) False True  (Just $6) at }
+
+  | '[' '*' attrs_opt ']'
+  	{% withAttributePF $1 $3 $ \at declr -> arrDeclr declr [] True False Nothing at }
+  | '[' attrs '*' attrs_opt ']'
+  	{% withAttributePF $1 ($2 ++ $4) $ \at declr -> arrDeclr declr [] True False Nothing at }
+
+  | '[' type_qualifier_list '*' attrs_opt ']'
+  	{% withAttributePF $1 $4 $ \at declr -> arrDeclr declr (reverse $2) True False Nothing at }
+  | '[' type_qualifier_list attrs '*' attrs_opt ']'
+  	{% withAttributePF $1 ($3 ++ $5) $ \at declr -> arrDeclr declr (reverse $2) True False Nothing at }
+
+unary_abstract_declarator :: { CDeclrR }
+unary_abstract_declarator
+  : '*'
+  	{% withNodeInfo $1 $ ptrDeclr emptyDeclr [] }
+
+  | '*' type_qualifier_list attrs_opt
+  	{% withAttribute $1 $3 $ ptrDeclr emptyDeclr (reverse $2)  }
+
+  | '*' abstract_declarator
+  	{% withNodeInfo $1 $ ptrDeclr $2 [] }
+
+  | '*' type_qualifier_list abstract_declarator
+  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }
+
+  | '*' attrs
+  	{% withAttribute $1 $2 $ ptrDeclr emptyDeclr [] }
+  | '*' attrs abstract_declarator
+  	{% withAttribute $1 $2 $ ptrDeclr $3 [] }
+
+-- postfix_ad starts with '(', postfixing with '(' or '[', unary_abstract starts with '*'
+postfix_abstract_declarator :: { CDeclrR }
+postfix_abstract_declarator
+  : '(' unary_abstract_declarator ')'					{ $2 }
+  | '(' postfix_abstract_declarator ')'					{ $2 }
+  | '(' postfixing_abstract_declarator ')'				{ $2 emptyDeclr }
+  | '(' unary_abstract_declarator ')' postfixing_abstract_declarator	{ $4 $2 }
+
+-- FIX 0700
+  | '(' attrs unary_abstract_declarator ')'				     	{ appendDeclrAttrs $2 $3 }
+  | '(' attrs postfix_abstract_declarator ')'					{ appendDeclrAttrs $2 $3 }
+  | '(' attrs postfixing_abstract_declarator ')'				{ appendDeclrAttrs $2 ($3 emptyDeclr) }
+  | '(' attrs unary_abstract_declarator ')' postfixing_abstract_declarator	{ appendDeclrAttrs $2 ($5 $3) }
+  | postfix_abstract_declarator attr						    { appendDeclrAttrs $2 $1 }
+
+
+-- parse C initializer (C99 6.7.8)
+--
+initializer :: { CInit }
+initializer
+  : assignment_expression		{% withNodeInfo $1 $ CInitExpr $1 }
+  | '{' initializer_list '}'		{% withNodeInfo $1 $ CInitList (reverse $2) }
+  | '{' initializer_list ',' '}'	{% withNodeInfo $1 $ CInitList (reverse $2) }
+
+
+initializer_opt :: { Maybe CInit }
+initializer_opt
+  : {- empty -}			{ Nothing }
+  | '=' initializer		{ Just $2 }
+
+
+initializer_list :: { Reversed CInitList }
+initializer_list
+  : {- empty -}						{ empty }
+  | initializer						{ singleton ([],$1) }
+  | designation initializer				{ singleton ($1,$2) }
+  | initializer_list ',' initializer			{ $1 `snoc` ([],$3) }
+  | initializer_list ',' designation initializer	{ $1 `snoc` ($3,$4) }
+
+
+-- designation
+--
+-- * GNU extensions:
+--     old style member designation: 'ident :'
+--     array range designation
+--
+designation :: { [CDesignator] }
+designation
+  : designator_list '='		{ reverse $1 }
+  | identifier ':'		{% withNodeInfo $1 $ \at -> [CMemberDesig $1 at] }
+  | array_designator		{ [$1] }
+
+
+designator_list :: { Reversed [CDesignator] }
+designator_list
+ : designator				{ singleton $1 }
+ | designator_list designator		{ $1 `snoc` $2 }
+
+
+designator :: { CDesignator }
+designator
+  : '[' constant_expression ']'		{% withNodeInfo $1 $ CArrDesig $2 }
+  | '.' identifier			{% withNodeInfo $1 $ CMemberDesig $2 }
+  | array_designator			{ $1 }
+
+
+array_designator :: { CDesignator }
+array_designator
+  : '[' constant_expression "..." constant_expression ']'
+  	{% withNodeInfo $1 $ CRangeDesig $2 $4 }
+
+
+-- parse C primary expression (C99 6.5.1)
+--
+-- We cannot use a typedef name as a variable
+--
+-- * GNU extensions:
+--     allow a compound statement as an expression
+--     __builtin_va_arg
+--     __builtin_offsetof
+--     __builtin_types_compatible_p
+primary_expression :: { CExpr }
+primary_expression
+  : ident		       {% withNodeInfo $1 $ CVar $1 }
+  | constant	  	 { CConst $1 }
+  | string_literal { CConst (liftStrLit $1) }
+  | '(' expression ')'	{ $2 }
+
+  -- GNU extensions
+  | '(' compound_statement ')'
+  	{% withNodeInfo $1 $ CStatExpr $2 }
+
+  | "__builtin_va_arg" '(' assignment_expression ',' type_name ')'
+  	{% withNodeInfo $1 $ CBuiltinExpr . CBuiltinVaArg $3 $5 }
+
+  | "__builtin_offsetof" '(' type_name ',' offsetof_member_designator ')'
+  	{% withNodeInfo $1 $ CBuiltinExpr . CBuiltinOffsetOf $3 (reverse $5) }
+
+  | "__builtin_types_compatible_p" '(' type_name ',' type_name ')'
+  	{% withNodeInfo $1 $ CBuiltinExpr . CBuiltinTypesCompatible $3 $5 }
+
+
+offsetof_member_designator :: { Reversed [CDesignator] }
+offsetof_member_designator
+  : identifier						                        {% withNodeInfo $1 $ singleton . CMemberDesig $1 }
+  | offsetof_member_designator '.' identifier		  {% withNodeInfo $3 $ ($1 `snoc`) . CMemberDesig $3 }
+  | offsetof_member_designator '[' expression ']'	{% withNodeInfo $3 $ ($1 `snoc`) . CArrDesig $3 }
+
+
+-- parse C postfix expression (C99 6.5.2)
+--
+postfix_expression :: { CExpr }
+postfix_expression
+  : primary_expression
+  	{ $1 }
+
+  | postfix_expression '[' expression ']'
+  	{% withNodeInfo $2 $ CIndex $1 $3 }
+
+  | postfix_expression '(' ')'
+  	{% withNodeInfo $2 $ CCall $1 [] }
+
+  | postfix_expression '(' argument_expression_list ')'
+  	{% withNodeInfo $2 $ CCall $1 (reverse $3) }
+
+  | postfix_expression '.' identifier
+  	{% withNodeInfo $2 $ CMember $1 $3 False }
+
+  | postfix_expression "->" identifier
+  	{% withNodeInfo $2 $ CMember $1 $3 True }
+
+  | postfix_expression "++"
+  	{% withNodeInfo $2 $ CUnary CPostIncOp $1 }
+
+  | postfix_expression "--"
+  	{% withNodeInfo $2 $ CUnary CPostDecOp $1 }
+
+  | '(' type_name ')' '{' initializer_list '}'
+  	{% withNodeInfo $4 $ CCompoundLit $2 (reverse $5) }
+
+  | '(' type_name ')' '{' initializer_list ',' '}'
+  	{% withNodeInfo $4 $ CCompoundLit $2 (reverse $5) }
+
+
+argument_expression_list :: { Reversed [CExpr] }
+argument_expression_list
+  : assignment_expression				{ singleton $1 }
+  | argument_expression_list ',' assignment_expression	{ $1 `snoc` $3 }
+
+
+-- parse C unary expression (C99 6.5.3)
+--
+-- * GNU extensions:
+--     'alignof' expression or type
+--     '__real' and '__imag' expression
+--     '__extension__' to suppress warnings about extensions
+--     allow taking address of a label with: && label
+--
+unary_expression :: { CExpr }
+unary_expression
+  : postfix_expression			{ $1 }
+  | "++" unary_expression		{% withNodeInfo $1 $ CUnary CPreIncOp $2 }
+  | "--" unary_expression		{% withNodeInfo $1 $ CUnary CPreDecOp $2 }
+  | "__extension__" cast_expression	{ $2 }
+  | unary_operator cast_expression	{% withNodeInfo $1 $ CUnary (unL $1) $2 }
+  | sizeof unary_expression		{% withNodeInfo $1 $ CSizeofExpr $2 }
+  | sizeof '(' type_name ')'		{% withNodeInfo $1 $ CSizeofType $3 }
+  -- GNU: alignof, complex and && extension
+  | alignof unary_expression		{% withNodeInfo $1 $ CAlignofExpr $2 }
+  | alignof '(' type_name ')'		{% withNodeInfo $1 $ CAlignofType $3 }
+  | "__real__" unary_expression    {% withNodeInfo $1 $ CComplexReal $2 }
+  | "__imag__" unary_expression    {% withNodeInfo $1 $ CComplexImag $2 }
+  | "&&" identifier			{% withNodeInfo $1 $ CLabAddrExpr $2 }
+
+
+unary_operator :: { Located CUnaryOp }
+unary_operator
+  : '&'		{ L CAdrOp  (posOf $1) }
+  | '*'		{ L CIndOp  (posOf $1) }
+  | '+'		{ L CPlusOp (posOf $1) }
+  | '-'		{ L CMinOp  (posOf $1) }
+  | '~'		{ L CCompOp (posOf $1) }
+  | '!'		{ L CNegOp  (posOf $1) }
+
+
+-- parse C cast expression (C99 6.5.4)
+--
+cast_expression :: { CExpr }
+cast_expression
+  : unary_expression			{ $1 }
+  | '(' type_name ')' cast_expression	{% withNodeInfo $1 $ CCast $2 $4 }
+
+
+-- parse C multiplicative expression (C99 6.5.5)
+--
+multiplicative_expression :: { CExpr }
+multiplicative_expression
+  : cast_expression
+  	{ $1 }
+
+  | multiplicative_expression '*' cast_expression
+  	{% withNodeInfo $2 $ CBinary CMulOp $1 $3 }
+
+  | multiplicative_expression '/' cast_expression
+  	{% withNodeInfo $2 $ CBinary CDivOp $1 $3 }
+
+  | multiplicative_expression '%' cast_expression
+  	{% withNodeInfo $2 $ CBinary CRmdOp $1 $3 }
+
+
+-- parse C additive expression (C99 6.5.6)
+--
+additive_expression :: { CExpr }
+additive_expression
+  : multiplicative_expression
+  	{ $1 }
+
+  | additive_expression '+' multiplicative_expression
+  	{% withNodeInfo $2 $ CBinary CAddOp $1 $3 }
+
+  | additive_expression '-' multiplicative_expression
+  	{% withNodeInfo $2 $ CBinary CSubOp $1 $3 }
+
+
+-- parse C shift expression (C99 6.5.7)
+--
+shift_expression :: { CExpr }
+shift_expression
+  : additive_expression
+  	{ $1 }
+
+  | shift_expression "<<" additive_expression
+  	{% withNodeInfo $2 $ CBinary CShlOp $1 $3 }
+
+  | shift_expression ">>" additive_expression
+  	{% withNodeInfo $2 $ CBinary CShrOp $1 $3 }
+
+
+-- parse C relational expression (C99 6.5.8)
+--
+relational_expression :: { CExpr }
+relational_expression
+  : shift_expression
+  	{ $1 }
+
+  | relational_expression '<' shift_expression
+  	{% withNodeInfo $2 $ CBinary CLeOp $1 $3 }
+
+  | relational_expression '>' shift_expression
+  	{% withNodeInfo $2 $ CBinary CGrOp $1 $3 }
+
+  | relational_expression "<=" shift_expression
+  	{% withNodeInfo $2 $ CBinary CLeqOp $1 $3 }
+
+  | relational_expression ">=" shift_expression
+  	{% withNodeInfo $2 $ CBinary CGeqOp $1 $3 }
+
+
+-- parse C equality expression (C99 6.5.9)
+--
+equality_expression :: { CExpr }
+equality_expression
+  : relational_expression
+  	{ $1 }
+
+  | equality_expression "==" relational_expression
+  	{% withNodeInfo $2 $ CBinary CEqOp  $1 $3 }
+
+  | equality_expression "!=" relational_expression
+  	{% withNodeInfo $2 $ CBinary CNeqOp $1 $3 }
+
+
+-- parse C bitwise and expression (C99 6.5.10)
+--
+and_expression :: { CExpr }
+and_expression
+  : equality_expression
+  	{ $1 }
+
+  | and_expression '&' equality_expression
+  	{% withNodeInfo $2 $ CBinary CAndOp $1 $3 }
+
+
+-- parse C bitwise exclusive or expression (C99 6.5.11)
+--
+exclusive_or_expression :: { CExpr }
+exclusive_or_expression
+  : and_expression
+  	{ $1 }
+
+  | exclusive_or_expression '^' and_expression
+  	{% withNodeInfo $2 $ CBinary CXorOp $1 $3 }
+
+
+-- parse C bitwise or expression (C99 6.5.12)
+--
+inclusive_or_expression :: { CExpr }
+inclusive_or_expression
+  : exclusive_or_expression
+  	{ $1 }
+
+  | inclusive_or_expression '|' exclusive_or_expression
+  	{% withNodeInfo $2 $ CBinary COrOp $1 $3 }
+
+
+-- parse C logical and expression (C99 6.5.13)
+--
+logical_and_expression :: { CExpr }
+logical_and_expression
+  : inclusive_or_expression
+  	{ $1 }
+
+  | logical_and_expression "&&" inclusive_or_expression
+  	{% withNodeInfo $2 $ CBinary CLndOp $1 $3 }
+
+
+-- parse C logical or expression (C99 6.5.14)
+--
+logical_or_expression :: { CExpr }
+logical_or_expression
+  : logical_and_expression
+  	{ $1 }
+
+  | logical_or_expression "||" logical_and_expression
+  	{% withNodeInfo $2 $ CBinary CLorOp $1 $3 }
+
+
+-- parse C conditional expression (C99 6.5.15)
+--
+-- * GNU extensions:
+--     omitting the `then' part
+conditional_expression :: { CExpr }
+conditional_expression
+  : logical_or_expression
+  	{ $1 }
+
+  | logical_or_expression '?' expression ':' conditional_expression
+  	{% withNodeInfo $2 $ CCond $1 (Just $3) $5 }
+
+  | logical_or_expression '?' ':' conditional_expression
+  	{% withNodeInfo $2 $ CCond $1 Nothing $4 }
+
+
+-- parse C assignment expression (C99 6.5.16)
+--
+-- * NOTE: LHS of assignment is more restricted than in gcc.
+--         `x ? y : z = 3' parses in gcc as `(x ? y : z) = 3',
+--         but `x ? y : z' is not an unary expression.
+assignment_expression :: { CExpr }
+assignment_expression
+  : conditional_expression
+  	{ $1 }
+
+  | unary_expression assignment_operator assignment_expression
+  	{% withNodeInfo $2 $ CAssign (unL $2) $1 $3 }
+
+
+assignment_operator :: { Located CAssignOp }
+assignment_operator
+  : '='			{ L CAssignOp (posOf $1) }
+  | "*="		{ L CMulAssOp (posOf $1) }
+  | "/="		{ L CDivAssOp (posOf $1) }
+  | "%="		{ L CRmdAssOp (posOf $1) }
+  | "+="		{ L CAddAssOp (posOf $1) }
+  | "-="		{ L CSubAssOp (posOf $1) }
+  | "<<="		{ L CShlAssOp (posOf $1) }
+  | ">>="		{ L CShrAssOp (posOf $1) }
+  | "&="		{ L CAndAssOp (posOf $1) }
+  | "^="		{ L CXorAssOp (posOf $1) }
+  | "|="		{ L COrAssOp  (posOf $1) }
+
+
+-- parse C expression (C99 6.5.17)
+--
+expression :: { CExpr }
+expression
+  : assignment_expression
+  	{ $1 }
+
+  | assignment_expression ',' comma_expression
+  	{% let es = reverse $3 in withNodeInfo es $ CComma ($1:es) }
+
+comma_expression :: { Reversed [CExpr] }
+comma_expression
+  : assignment_expression			{ singleton $1 }
+  | comma_expression ',' assignment_expression	{ $1 `snoc` $3 }
+
+
+-- The following was used for clarity
+expression_opt :: { Maybe CExpr }
+expression_opt
+  : {- empty -}		{ Nothing }
+  | expression		{ Just $1 }
+
+
+-- The following was used for clarity
+assignment_expression_opt :: { Maybe CExpr }
+assignment_expression_opt
+  : {- empty -}				{ Nothing }
+  | assignment_expression		{ Just $1 }
+
+
+-- parse C constant expression (C99 6.6)
+--
+constant_expression :: { CExpr }
+constant_expression
+  : conditional_expression			{ $1 }
+
+
+-- parse C constants
+--
+constant :: { CConst }
+constant
+  : cint	  {% withNodeInfo $1 $ case $1 of CTokILit _ i -> CIntConst i }
+  | cchar	  {% withNodeInfo $1 $ case $1 of CTokCLit _ c -> CCharConst c }
+  | cfloat	{% withNodeInfo $1 $ case $1 of CTokFLit _ f -> CFloatConst f }
+
+
+string_literal :: { CStrLit }
+string_literal
+  : cstr
+  	{% withNodeInfo $1 $ case $1 of CTokSLit _ s -> CStrLit s }
+
+  | cstr string_literal_list
+  	{% withNodeInfo $1 $ case $1 of CTokSLit _ s -> CStrLit (concatCStrings (s : reverse $2)) }
+
+
+string_literal_list :: { Reversed [CString] }
+string_literal_list
+  : cstr			{ case $1 of CTokSLit _ s -> singleton s }
+  | string_literal_list cstr	{ case $2 of CTokSLit _ s -> $1 `snoc` s }
+
+
+identifier :: { Ident }
+identifier
+  : ident		{ $1 }
+  | tyident		{ $1 }
+
+
+-- parse GNU C attribute annotation
+attrs_opt ::	{ [CAttr] }
+attrs_opt
+  : {- empty -}						{ [] }
+  | attrs         				{ $1 }
+
+-- GNU C attribute annotation
+attrs :: { [CAttr] }
+attrs
+  : attr						{ $1 }
+  | attrs attr	    { $1 ++ $2 }
+
+attr :: { [CAttr] }
+attr
+  : "__attribute__" '(' '(' attribute_list ')' ')'	{ reverse $4 }
+
+attribute_list :: { Reversed [CAttr] }
+  : attribute						          { case $1 of Nothing -> empty; Just attr -> singleton attr }
+  | attribute_list ',' attribute	{ (maybe id (flip snoc) $3) $1 }
+
+
+attribute :: { Maybe CAttr }
+attribute
+  : {- empty -}						         { Nothing }
+  | ident						               {% withNodeInfo $1 $ Just . CAttr $1  [] }
+  | const						               {% withNodeInfo $1 $ Just . CAttr (internalIdent "const") [] }
+  | ident '(' attribute_params ')' {% withNodeInfo $1 $ Just . CAttr $1 (reverse $3) }
+  | ident '(' ')'					         {% withNodeInfo $1 $ Just . CAttr $1 [] }
+
+attribute_params :: { Reversed [CExpr] }
+attribute_params
+  : constant_expression					              { singleton $1 }
+  | attribute_params ',' constant_expression	{ $1 `snoc` $3 }
+
+
+{
+
+--  sometimes it is neccessary to reverse an unreversed list
+reverseList :: [a] -> Reversed [a]
+reverseList = Reversed . List.reverse
+
+-- We occasionally need things to have a location when they don't naturally
+-- have one built in as tokens and most AST elements do.
+--
+data Located a = L !a !Position
+
+unL :: Located a -> a
+unL (L a pos) = a
+
+instance Pos (Located a) where
+  posOf (L _ pos) = pos
+
+{-# INLINE withNodeInfo #-}
+withNodeInfo :: Pos node => node -> (NodeInfo -> a) -> P a
+withNodeInfo node mkAttributedNode = do
+  name <- getNewName
+  let attrs = mkNodeInfo (posOf node) name
+  attrs `seq` return (mkAttributedNode attrs)
+
+data CDeclrR = CDeclrR (Maybe Ident) (Reversed [CDerivedDeclr]) (Maybe CStrLit) [CAttr] NodeInfo
+reverseDeclr :: CDeclrR -> CDeclr
+reverseDeclr (CDeclrR ide reversedDDs asmname cattrs at)
+    = CDeclr ide (reverse reversedDDs) asmname cattrs at
+
+{-# INLINE withAttribute #-}
+withAttribute :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR) -> P CDeclrR
+withAttribute node cattrs mkDeclrNode = do
+  name <- getNewName
+  let attrs = mkNodeInfo (posOf node) name
+  let newDeclr = appendDeclrAttrs cattrs $ mkDeclrNode attrs
+  attrs `seq` newDeclr `seq` return newDeclr
+
+-- postfixing variant
+{-# INLINE withAttributePF #-}
+withAttributePF :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR -> CDeclrR) -> P (CDeclrR -> CDeclrR)
+withAttributePF node cattrs mkDeclrCtor = do
+  name <- getNewName
+  let attrs = mkNodeInfo (posOf node) name
+  let newDeclr = appendDeclrAttrs cattrs . mkDeclrCtor attrs
+  attrs `seq` newDeclr `seq` return newDeclr
+
+-- add top level attributes for a declarator.
+--
+-- In the following example
+--
+-- > int declr1, __attribute__((a1)) * __attribute__((a2)) y() __asm__("$" "y") __attribute__((a3));
+--
+-- the attributes `a1' and `a3' are top-level attributes for y.
+-- The (pseudo)-AST for the second declarator is
+--
+-- > CDeclr "y"
+-- >        [CFunDeclr ..., CPtrDeclr __attribute__((a2)) ... ]
+-- >        (asm "$y")
+-- >        [__attribute__((a1)), __attribute__((a3)) ]
+--
+-- So assembler names and preceeding and trailing attributes are recorded in object declarator.
+--
+appendObjAttrs :: [CAttr] -> CDeclr -> CDeclr
+appendObjAttrs newAttrs (CDeclr ident indirections asmname cAttrs at)
+    = CDeclr ident indirections asmname (cAttrs ++ newAttrs) at
+appendObjAttrsR :: [CAttr] -> CDeclrR -> CDeclrR
+appendObjAttrsR newAttrs (CDeclrR ident indirections asmname cAttrs at)
+    = CDeclrR ident indirections asmname (cAttrs ++ newAttrs) at
+
+setAsmName :: Maybe CStrLit  -> CDeclrR -> P CDeclrR
+setAsmName mAsmName (CDeclrR ident indirections oldName cattrs at) =
+    case combineName mAsmName oldName of
+        Left (n1,n2)       -> failP (posOf n2) ["Duplicate assembler name: ",showName n1,showName n2]
+        Right newName      -> return $ CDeclrR ident indirections newName cattrs at
+  where
+  combineName Nothing Nothing = Right Nothing
+  combineName Nothing oldname@(Just _)  = Right oldname
+  combineName newname@(Just _) Nothing  = Right newname
+  combineName (Just n1) (Just n2) = Left (n1,n2)
+  showName (CStrLit cstr _) = show cstr
+
+withAsmNameAttrs :: (Maybe CStrLit, [CAttr]) -> CDeclrR -> P CDeclrR
+withAsmNameAttrs (mAsmName, newAttrs) declr = setAsmName mAsmName (appendObjAttrsR newAttrs declr)
+
+appendDeclrAttrs :: [CAttr] -> CDeclrR -> CDeclrR
+appendDeclrAttrs newAttrs (CDeclrR ident (Reversed []) asmname cattrs at)
+    = CDeclrR ident empty asmname (cattrs ++ newAttrs) at
+appendDeclrAttrs newAttrs (CDeclrR ident (Reversed (x:xs)) asmname cattrs at)
+    = CDeclrR ident (Reversed (appendAttrs x : xs)) asmname cattrs at where
+    appendAttrs (CPtrDeclr typeQuals at)           = CPtrDeclr (typeQuals ++ map CAttrQual newAttrs) at
+    appendAttrs (CArrDeclr typeQuals arraySize at) = CArrDeclr (typeQuals ++ map CAttrQual newAttrs) arraySize at
+    appendAttrs (CFunDeclr parameters cattrs at)   = CFunDeclr parameters (cattrs ++ newAttrs) at
+
+ptrDeclr :: CDeclrR -> [CTypeQual] -> NodeInfo -> CDeclrR
+ptrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals at
+    = CDeclrR ident (derivedDeclrs `snoc` CPtrDeclr tyquals at) asmname cattrs dat
+funDeclr :: CDeclrR -> (Either [Ident] ([CDecl],Bool)) -> [CAttr] -> NodeInfo -> CDeclrR
+funDeclr (CDeclrR ident derivedDeclrs asmname dcattrs dat) params cattrs at
+    = CDeclrR ident (derivedDeclrs `snoc` CFunDeclr params cattrs at) asmname dcattrs dat
+arrDeclr :: CDeclrR -> [CTypeQual] -> Bool -> Bool -> Maybe CExpr -> NodeInfo -> CDeclrR
+arrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals var_sized static_size size_expr_opt at
+    = arr_sz `seq` ( CDeclrR ident (derivedDeclrs `snoc` CArrDeclr tyquals arr_sz at) asmname cattrs dat )
+    where
+    arr_sz = case size_expr_opt of
+                 Just e  -> CArrSize static_size e
+                 Nothing -> CNoArrSize var_sized
+
+liftTypeQuals :: Reversed [CTypeQual] -> [CDeclSpec]
+liftTypeQuals (Reversed tyqs) = revmap [] tyqs
+  where revmap a []     = a
+        revmap a (x:xs) = revmap (CTypeQual x : a) xs
+
+-- lift CAttrs to DeclSpecs
+--
+liftCAttrs :: [CAttr] -> [CDeclSpec]
+liftCAttrs = map (CTypeQual . CAttrQual)
+
+-- when we parsed (decl_spec_1,...,decl_spec_n,attrs), add the __attributes__s to the declspec list
+-- needs special care when @decl_spec_n@ is a SUE definition
+addTrailingAttrs :: Reversed [CDeclSpec] -> [CAttr] -> Reversed [CDeclSpec]
+addTrailingAttrs declspecs new_attrs =
+    case viewr declspecs of
+        (specs_init, CTypeSpec (CSUType (CStruct tag name (Just def) def_attrs su_node) node))
+            -> (specs_init `snoc` CTypeSpec (CSUType (CStruct tag name (Just def) (def_attrs ++ new_attrs) su_node) node))
+        (specs_init, CTypeSpec (CEnumType (CEnum name (Just def) def_attrs e_node) node))
+            -> (specs_init `snoc` CTypeSpec (CEnumType (CEnum name (Just def) (def_attrs ++ new_attrs) e_node) node))
+        _ -> declspecs `rappend` (liftCAttrs new_attrs)
+
+-- convenient instance, the position of a list of things is the position of
+-- the first thing in the list
+--
+instance Pos a => Pos [a] where
+  posOf (x:_) = posOf x
+
+instance Pos a => Pos (Reversed a) where
+  posOf (Reversed x) = posOf x
+
+emptyDeclr     = CDeclrR Nothing empty Nothing [] (mkNodeInfoOnlyPos nopos)
+mkVarDeclr ident = CDeclrR (Just ident) empty Nothing []
+
+-- Take the identifiers and use them to update the typedef'ed identifier set
+-- if the decl is defining a typedef then we add it to the set,
+-- if it's a var decl then that shadows typedefed identifiers
+--
+doDeclIdent :: [CDeclSpec] -> CDeclrR -> P ()
+doDeclIdent declspecs (CDeclrR mIdent _ _ _ _) =
+  case mIdent of
+    Nothing -> return ()
+    Just ident | any iypedef declspecs -> addTypedef ident
+               | otherwise               -> shadowTypedef ident
+
+  where iypedef (CStorageSpec (CTypedef _)) = True
+        iypedef _                           = False
+
+doFuncParamDeclIdent :: CDeclr -> P ()
+doFuncParamDeclIdent (CDeclr _ (CFunDeclr params _ _ : _) _ _ _) =
+  sequence_
+    [ case getCDeclrIdent declr of
+        Nothing -> return ()
+        Just ident -> shadowTypedef ident
+    | CDecl _ dle _  <- either (const []) fst params
+    , (Just declr, _, _) <- dle ]
+doFuncParamDeclIdent _ = return ()
+
+-- extract all identifiers
+getCDeclrIdent :: CDeclr -> Maybe Ident
+getCDeclrIdent (CDeclr mIdent _ _ _ _) = mIdent
+
+happyError :: P a
+happyError = parseError
+
+-- * public interface
+
+-- | @parseC input initialPos@ parses the given preprocessed C-source input and returns the AST or a list of parse errors.
+parseC :: InputStream -> Position -> Either ParseError CTranslUnit
+parseC input initialPosition =
+  execParser header input initialPosition builtinTypeNames (namesStartingFrom 0)
+}
diff --git a/src/Language/C/Parser/ParserMonad.hs b/src/Language/C/Parser/ParserMonad.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Parser/ParserMonad.hs
@@ -0,0 +1,149 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Syntax.ParserMonad
+-- Copyright   :  (c) [1999..2004] Manuel M T Chakravarty
+--                (c) 2005-2007 Duncan Coutts
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Portability :  portable
+--
+-- Monad for the C lexer and parser
+--
+--  This monad has to be usable with Alex and Happy. Some things in it are
+--  dictated by that, eg having to be able to remember the last token.
+--
+--  The monad also provides a unique name supply (via the Name module)
+--
+--  For parsing C we have to maintain a set of identifiers that we know to be
+--  typedef'ed type identifiers. We also must deal correctly with scope so we
+--  keep a list of sets of identifiers so we can save the outer scope when we
+--  enter an inner scope.
+module Language.C.Parser.ParserMonad (
+  P,
+  execParser,
+  failP,
+  getNewName,        -- :: P Name
+  addTypedef,        -- :: Ident -> P ()
+  shadowTypedef,     -- :: Ident -> P ()
+  isTypeIdent,       -- :: Ident -> P Bool
+  enterScope,        -- :: P ()
+  leaveScope,        -- :: P ()
+  setPos,            -- :: Position -> P ()
+  getPos,            -- :: P Position
+  getInput,          -- :: P String
+  setInput,          -- :: String -> P ()
+  getLastToken,      -- :: P CToken
+  setLastToken,      -- :: CToken -> P ()
+  ParseError(..),
+  ) where
+import Language.C.Data.Error (internalErr, showErrorInfo,ErrorInfo(..),ErrorLevel(..))
+import Language.C.Data.Position  (Position(..))
+import Language.C.Data.InputStream
+import Language.C.Data.Name    (Name)
+import Language.C.Data.Ident    (Ident)
+import Language.C.Parser.Tokens (CToken)
+
+import Data.Set  (Set)
+import qualified Data.Set as Set (fromList, insert, member, delete)
+
+newtype ParseError = ParseError ([String],Position)
+instance Show ParseError where
+    show (ParseError (msgs,pos)) = showErrorInfo "Syntax Error !" (ErrorInfo LevelError pos msgs)
+
+
+data ParseResult a
+  = POk !PState a
+  | PFailed [String] Position   -- The error message and position
+
+data PState = PState {
+        curPos     :: !Position,        -- position at current input location
+        curInput   :: !InputStream,      -- the current input
+        prevToken  ::  CToken,          -- the previous token
+        namesupply :: ![Name],          -- the name unique supply
+        tyidents   :: !(Set Ident),     -- the set of typedef'ed identifiers
+        scopes     :: ![Set Ident]      -- the tyident sets for outer scopes
+     }
+
+newtype P a = P { unP :: PState -> ParseResult a }
+
+instance Monad P where
+  return = returnP
+  (>>=) = thenP
+  fail m = getPos >>= \pos -> failP pos [m]
+
+execParser :: P a -> InputStream -> Position -> [Ident] -> [Name]
+           -> Either ParseError a
+execParser (P parser) input pos builtins names =
+  case parser initialState of
+    PFailed message errpos -> Left (ParseError (message,errpos))
+    POk _ result -> Right result
+  where initialState = PState {
+          curPos = pos,
+          curInput = input,
+          prevToken = internalErr "CLexer.execParser: Touched undefined token!",
+          namesupply = names,
+          tyidents = Set.fromList builtins,
+          scopes   = []
+        }
+
+{-# INLINE returnP #-}
+returnP :: a -> P a
+returnP a = P $ \s -> POk s a
+
+{-# INLINE thenP #-}
+thenP :: P a -> (a -> P b) -> P b
+(P m) `thenP` k = P $ \s ->
+        case m s of
+                POk s' a        -> (unP (k a)) s'
+                PFailed err pos -> PFailed err pos
+
+failP :: Position -> [String] -> P a
+failP pos msg = P $ \_ -> PFailed msg pos
+
+getNewName :: P Name
+getNewName = P $ \s@PState{namesupply=(n:ns)} -> POk s{namesupply=ns} n
+
+setPos :: Position -> P ()
+setPos pos = P $ \s -> POk s{curPos=pos} ()
+
+getPos :: P Position
+getPos = P $ \s@PState{curPos=pos} -> POk s pos
+
+addTypedef :: Ident -> P ()
+addTypedef ident = (P $ \s@PState{tyidents=tyids} ->
+                             POk s{tyidents = ident `Set.insert` tyids} ())
+
+shadowTypedef :: Ident -> P ()
+shadowTypedef ident = (P $ \s@PState{tyidents=tyids} ->
+                             -- optimisation: mostly the ident will not be in
+                             -- the tyident set so do a member lookup to avoid
+                             --  churn induced by calling delete
+                             POk s{tyidents = if ident `Set.member` tyids
+                                                then ident `Set.delete` tyids
+                                                else tyids } ())
+
+isTypeIdent :: Ident -> P Bool
+isTypeIdent ident = P $ \s@PState{tyidents=tyids} ->
+                             POk s $! Set.member ident tyids
+
+enterScope :: P ()
+enterScope = P $ \s@PState{tyidents=tyids,scopes=ss} ->
+                     POk s{scopes=tyids:ss} ()
+
+leaveScope :: P ()
+leaveScope = P $ \s@PState{scopes=ss} ->
+                     case ss of
+                       []          -> error "leaveScope: already in global scope"
+                       (tyids:ss') -> POk s{tyidents=tyids, scopes=ss'} ()
+
+getInput :: P InputStream
+getInput = P $ \s@PState{curInput=i} -> POk s i
+
+setInput :: InputStream -> P ()
+setInput i = P $ \s -> POk s{curInput=i} ()
+
+getLastToken :: P CToken
+getLastToken = P $ \s@PState{prevToken=tok} -> POk s tok
+
+setLastToken :: CToken -> P ()
+setLastToken tok = P $ \s -> POk s{prevToken=tok} ()
diff --git a/src/Language/C/Parser/Tokens.hs b/src/Language/C/Parser/Tokens.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Parser/Tokens.hs
@@ -0,0 +1,344 @@
+{-# OPTIONS  #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Parser.Tokens
+-- Copyright   :  [1999..2004] Manuel M T Chakravarty
+--                2005 Duncan Coutts
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Portability :  portable
+--
+--  C Tokens for the C lexer.
+--
+-----------------------------------------------------------------------------
+module Language.C.Parser.Tokens (CToken(..), GnuCTok(..)) where
+
+import Language.C.Data.Position  (Position, Pos(..))
+import Language.C.Data.Ident    (Ident, identToString)
+import Language.C.Syntax.Constants     (CChar, CInteger, CFloat, CString)
+
+-- token definition
+-- ----------------
+
+-- possible tokens (EXPORTED)
+--
+data CToken = CTokLParen   !Position            -- `('
+            | CTokRParen   !Position            -- `)'
+            | CTokLBracket !Position            -- `['
+            | CTokRBracket !Position            -- `]'
+            | CTokArrow    !Position            -- `->'
+            | CTokDot      !Position            -- `.'
+            | CTokExclam   !Position            -- `!'
+            | CTokTilde    !Position            -- `~'
+            | CTokInc      !Position            -- `++'
+            | CTokDec      !Position            -- `--'
+            | CTokPlus     !Position            -- `+'
+            | CTokMinus    !Position            -- `-'
+            | CTokStar     !Position            -- `*'
+            | CTokSlash    !Position            -- `/'
+            | CTokPercent  !Position            -- `%'
+            | CTokAmper    !Position            -- `&'
+            | CTokShiftL   !Position            -- `<<'
+            | CTokShiftR   !Position            -- `>>'
+            | CTokLess     !Position            -- `<'
+            | CTokLessEq   !Position            -- `<='
+            | CTokHigh     !Position            -- `>'
+            | CTokHighEq   !Position            -- `>='
+            | CTokEqual    !Position            -- `=='
+            | CTokUnequal  !Position            -- `!='
+            | CTokHat      !Position            -- `^'
+            | CTokBar      !Position            -- `|'
+            | CTokAnd      !Position            -- `&&'
+            | CTokOr       !Position            -- `||'
+            | CTokQuest    !Position            -- `?'
+            | CTokColon    !Position            -- `:'
+            | CTokAssign   !Position            -- `='
+            | CTokPlusAss  !Position            -- `+='
+            | CTokMinusAss !Position            -- `-='
+            | CTokStarAss  !Position            -- `*='
+            | CTokSlashAss !Position            -- `/='
+            | CTokPercAss  !Position            -- `%='
+            | CTokAmpAss   !Position            -- `&='
+            | CTokHatAss   !Position            -- `^='
+            | CTokBarAss   !Position            -- `|='
+            | CTokSLAss    !Position            -- `<<='
+            | CTokSRAss    !Position            -- `>>='
+            | CTokComma    !Position            -- `,'
+            | CTokSemic    !Position            -- `;'
+            | CTokLBrace   !Position            -- `{'
+            | CTokRBrace   !Position            --
+            | CTokEllipsis !Position            -- `...'
+            | CTokAlignof  !Position            -- `alignof'
+                                                -- (or `__alignof',
+                                                -- `__alignof__')
+            | CTokAsm      !Position            -- `asm'
+                                                -- (or `__asm',
+                                                -- `__asm__')
+            | CTokAuto     !Position            -- `auto'
+            | CTokBreak    !Position            -- `break'
+            | CTokBool     !Position            -- `_Bool'
+            | CTokCase     !Position            -- `case'
+            | CTokChar     !Position            -- `char'
+            | CTokConst    !Position            -- `const'
+                                                -- (or `__const', `__const__')
+            | CTokContinue !Position            -- `continue'
+            | CTokComplex  !Position            -- `_Complex'
+            | CTokDefault  !Position            -- `default'
+            | CTokDo       !Position            -- `do'
+            | CTokDouble   !Position            -- `double'
+            | CTokElse     !Position            -- `else'
+            | CTokEnum     !Position            -- `enum'
+            | CTokExtern   !Position            -- `extern'
+            | CTokFloat    !Position            -- `float'
+            | CTokFor      !Position            -- `for'
+            | CTokGoto     !Position            -- `goto'
+            | CTokIf       !Position            -- `if'
+            | CTokInline   !Position            -- `inline'
+                                                -- (or `__inline',
+                                                -- `__inline__')
+            | CTokInt      !Position            -- `int'
+            | CTokLong     !Position            -- `long'
+            | CTokLabel    !Position            -- `__label__'
+            | CTokRegister !Position            -- `register'
+            | CTokRestrict !Position            -- `restrict'
+                                                -- (or `__restrict',
+                                                -- `__restrict__')
+            | CTokReturn   !Position            -- `return'
+            | CTokShort    !Position            -- `short'
+            | CTokSigned   !Position            -- `signed'
+                                                -- (or `__signed',
+                                                -- `__signed__')
+            | CTokSizeof   !Position            -- `sizeof'
+            | CTokStatic   !Position            -- `static'
+            | CTokStruct   !Position            -- `struct'
+            | CTokSwitch   !Position            -- `switch'
+            | CTokTypedef  !Position            -- `typedef'
+            | CTokTypeof   !Position            -- `typeof'
+            | CTokThread   !Position            -- `__thread'
+            | CTokUnion    !Position            -- `union'
+            | CTokUnsigned !Position            -- `unsigned'
+            | CTokVoid     !Position            -- `void'
+            | CTokVolatile !Position            -- `volatile'
+                                                -- (or `__volatile',
+                                                -- `__volatile__')
+            | CTokWhile    !Position            -- `while'
+            | CTokCLit     !Position !CChar     -- character constant
+            | CTokILit     !Position !CInteger  -- integer constant
+            | CTokFLit     !Position CFloat     -- float constant
+            | CTokSLit     !Position CString    -- string constant
+            | CTokIdent    !Position !Ident     -- identifier
+
+              -- not generated here, but in `CParser.parseCHeader'
+            | CTokTyIdent  !Position !Ident     -- `typedef-name' identifier
+            | CTokGnuC !GnuCTok !Position       -- special GNU C tokens
+            | CTokEof                           -- end of file
+
+-- special tokens used in GNU C extensions to ANSI C
+--
+data GnuCTok = GnuCAttrTok              -- `__attribute__'
+             | GnuCExtTok               -- `__extension__'
+             | GnuCVaArg                -- `__builtin_va_arg'
+             | GnuCOffsetof             -- `__builtin_offsetof'
+             | GnuCTyCompat             -- `__builtin_types_compatible_p'
+             | GnuCComplexReal          -- `__real__'
+             | GnuCComplexImag          -- `__imag__'
+
+instance Pos CToken where
+  posOf (CTokLParen   pos  ) = pos
+  posOf (CTokRParen   pos  ) = pos
+  posOf (CTokLBracket pos  ) = pos
+  posOf (CTokRBracket pos  ) = pos
+  posOf (CTokArrow    pos  ) = pos
+  posOf (CTokDot      pos  ) = pos
+  posOf (CTokExclam   pos  ) = pos
+  posOf (CTokTilde    pos  ) = pos
+  posOf (CTokInc      pos  ) = pos
+  posOf (CTokDec      pos  ) = pos
+  posOf (CTokPlus     pos  ) = pos
+  posOf (CTokMinus    pos  ) = pos
+  posOf (CTokStar     pos  ) = pos
+  posOf (CTokSlash    pos  ) = pos
+  posOf (CTokPercent  pos  ) = pos
+  posOf (CTokAmper    pos  ) = pos
+  posOf (CTokShiftL   pos  ) = pos
+  posOf (CTokShiftR   pos  ) = pos
+  posOf (CTokLess     pos  ) = pos
+  posOf (CTokLessEq   pos  ) = pos
+  posOf (CTokHigh     pos  ) = pos
+  posOf (CTokHighEq   pos  ) = pos
+  posOf (CTokEqual    pos  ) = pos
+  posOf (CTokUnequal  pos  ) = pos
+  posOf (CTokHat      pos  ) = pos
+  posOf (CTokBar      pos  ) = pos
+  posOf (CTokAnd      pos  ) = pos
+  posOf (CTokOr       pos  ) = pos
+  posOf (CTokQuest    pos  ) = pos
+  posOf (CTokColon    pos  ) = pos
+  posOf (CTokAssign   pos  ) = pos
+  posOf (CTokPlusAss  pos  ) = pos
+  posOf (CTokMinusAss pos  ) = pos
+  posOf (CTokStarAss  pos  ) = pos
+  posOf (CTokSlashAss pos  ) = pos
+  posOf (CTokPercAss  pos  ) = pos
+  posOf (CTokAmpAss   pos  ) = pos
+  posOf (CTokHatAss   pos  ) = pos
+  posOf (CTokBarAss   pos  ) = pos
+  posOf (CTokSLAss    pos  ) = pos
+  posOf (CTokSRAss    pos  ) = pos
+  posOf (CTokComma    pos  ) = pos
+  posOf (CTokSemic    pos  ) = pos
+  posOf (CTokLBrace   pos  ) = pos
+  posOf (CTokRBrace   pos  ) = pos
+  posOf (CTokEllipsis pos  ) = pos
+  posOf (CTokAlignof  pos  ) = pos
+  posOf (CTokAsm      pos  ) = pos
+  posOf (CTokAuto     pos  ) = pos
+  posOf (CTokBreak    pos  ) = pos
+  posOf (CTokBool     pos  ) = pos
+  posOf (CTokCase     pos  ) = pos
+  posOf (CTokChar     pos  ) = pos
+  posOf (CTokConst    pos  ) = pos
+  posOf (CTokContinue pos  ) = pos
+  posOf (CTokComplex  pos  ) = pos
+  posOf (CTokDefault  pos  ) = pos
+  posOf (CTokDo       pos  ) = pos
+  posOf (CTokDouble   pos  ) = pos
+  posOf (CTokElse     pos  ) = pos
+  posOf (CTokEnum     pos  ) = pos
+  posOf (CTokExtern   pos  ) = pos
+  posOf (CTokFloat    pos  ) = pos
+  posOf (CTokFor      pos  ) = pos
+  posOf (CTokGoto     pos  ) = pos
+  posOf (CTokInt      pos  ) = pos
+  posOf (CTokInline   pos  ) = pos
+  posOf (CTokIf       pos  ) = pos
+  posOf (CTokLong     pos  ) = pos
+  posOf (CTokLabel    pos  ) = pos
+  posOf (CTokRegister pos  ) = pos
+  posOf (CTokRestrict pos  ) = pos
+  posOf (CTokReturn   pos  ) = pos
+  posOf (CTokShort    pos  ) = pos
+  posOf (CTokSigned   pos  ) = pos
+  posOf (CTokSizeof   pos  ) = pos
+  posOf (CTokStatic   pos  ) = pos
+  posOf (CTokStruct   pos  ) = pos
+  posOf (CTokSwitch   pos  ) = pos
+  posOf (CTokTypedef  pos  ) = pos
+  posOf (CTokTypeof   pos  ) = pos
+  posOf (CTokThread   pos  ) = pos
+  posOf (CTokUnion    pos  ) = pos
+  posOf (CTokUnsigned pos  ) = pos
+  posOf (CTokVoid     pos  ) = pos
+  posOf (CTokVolatile pos  ) = pos
+  posOf (CTokWhile    pos  ) = pos
+  posOf (CTokCLit     pos _) = pos
+  posOf (CTokILit     pos _) = pos
+  posOf (CTokFLit     pos _) = pos
+  posOf (CTokSLit     pos _) = pos
+  posOf (CTokIdent    pos _) = pos
+  posOf (CTokTyIdent  pos _) = pos
+  posOf (CTokGnuC   _ pos  ) = pos
+  posOf CTokEof = error "tokenPos: Eof"
+instance Show CToken where
+  showsPrec _ (CTokLParen   _  ) = showString "("
+  showsPrec _ (CTokRParen   _  ) = showString ")"
+  showsPrec _ (CTokLBracket _  ) = showString "["
+  showsPrec _ (CTokRBracket _  ) = showString "]"
+  showsPrec _ (CTokArrow    _  ) = showString "->"
+  showsPrec _ (CTokDot      _  ) = showString "."
+  showsPrec _ (CTokExclam   _  ) = showString "!"
+  showsPrec _ (CTokTilde    _  ) = showString "~"
+  showsPrec _ (CTokInc      _  ) = showString "++"
+  showsPrec _ (CTokDec      _  ) = showString "--"
+  showsPrec _ (CTokPlus     _  ) = showString "+"
+  showsPrec _ (CTokMinus    _  ) = showString "-"
+  showsPrec _ (CTokStar     _  ) = showString "*"
+  showsPrec _ (CTokSlash    _  ) = showString "/"
+  showsPrec _ (CTokPercent  _  ) = showString "%"
+  showsPrec _ (CTokAmper    _  ) = showString "&"
+  showsPrec _ (CTokShiftL   _  ) = showString "<<"
+  showsPrec _ (CTokShiftR   _  ) = showString ">>"
+  showsPrec _ (CTokLess     _  ) = showString "<"
+  showsPrec _ (CTokLessEq   _  ) = showString "<="
+  showsPrec _ (CTokHigh     _  ) = showString ">"
+  showsPrec _ (CTokHighEq   _  ) = showString ">="
+  showsPrec _ (CTokEqual    _  ) = showString "=="
+  showsPrec _ (CTokUnequal  _  ) = showString "!="
+  showsPrec _ (CTokHat      _  ) = showString "^"
+  showsPrec _ (CTokBar      _  ) = showString "|"
+  showsPrec _ (CTokAnd      _  ) = showString "&&"
+  showsPrec _ (CTokOr       _  ) = showString "||"
+  showsPrec _ (CTokQuest    _  ) = showString "?"
+  showsPrec _ (CTokColon    _  ) = showString ":"
+  showsPrec _ (CTokAssign   _  ) = showString "="
+  showsPrec _ (CTokPlusAss  _  ) = showString "+="
+  showsPrec _ (CTokMinusAss _  ) = showString "-="
+  showsPrec _ (CTokStarAss  _  ) = showString "*="
+  showsPrec _ (CTokSlashAss _  ) = showString "/="
+  showsPrec _ (CTokPercAss  _  ) = showString "%="
+  showsPrec _ (CTokAmpAss   _  ) = showString "&="
+  showsPrec _ (CTokHatAss   _  ) = showString "^="
+  showsPrec _ (CTokBarAss   _  ) = showString "|="
+  showsPrec _ (CTokSLAss    _  ) = showString "<<="
+  showsPrec _ (CTokSRAss    _  ) = showString ">>="
+  showsPrec _ (CTokComma    _  ) = showString ","
+  showsPrec _ (CTokSemic    _  ) = showString ";"
+  showsPrec _ (CTokLBrace   _  ) = showString "{"
+  showsPrec _ (CTokRBrace   _  ) = showString "}"
+  showsPrec _ (CTokEllipsis _  ) = showString "..."
+  showsPrec _ (CTokAlignof  _  ) = showString "alignof"
+  showsPrec _ (CTokAsm      _  ) = showString "asm"
+  showsPrec _ (CTokAuto     _  ) = showString "auto"
+  showsPrec _ (CTokBool _)       = showString "_Bool"
+  showsPrec _ (CTokBreak    _  ) = showString "break"
+  showsPrec _ (CTokCase     _  ) = showString "case"
+  showsPrec _ (CTokChar     _  ) = showString "char"
+  showsPrec _ (CTokComplex _)    = showString "_Complex"
+  showsPrec _ (CTokConst    _  ) = showString "const"
+  showsPrec _ (CTokContinue _  ) = showString "continue"
+  showsPrec _ (CTokDefault  _  ) = showString "default"
+  showsPrec _ (CTokDouble   _  ) = showString "double"
+  showsPrec _ (CTokDo       _  ) = showString "do"
+  showsPrec _ (CTokElse     _  ) = showString "else"
+  showsPrec _ (CTokEnum     _  ) = showString "enum"
+  showsPrec _ (CTokExtern   _  ) = showString "extern"
+  showsPrec _ (CTokFloat    _  ) = showString "float"
+  showsPrec _ (CTokFor      _  ) = showString "for"
+  showsPrec _ (CTokGoto     _  ) = showString "goto"
+  showsPrec _ (CTokIf       _  ) = showString "if"
+  showsPrec _ (CTokInline   _  ) = showString "inline"
+  showsPrec _ (CTokInt      _  ) = showString "int"
+  showsPrec _ (CTokLong     _  ) = showString "long"
+  showsPrec _ (CTokLabel    _  ) = showString "__label__"
+  showsPrec _ (CTokRegister _  ) = showString "register"
+  showsPrec _ (CTokRestrict _  ) = showString "restrict"
+  showsPrec _ (CTokReturn   _  ) = showString "return"
+  showsPrec _ (CTokShort    _  ) = showString "short"
+  showsPrec _ (CTokSigned   _  ) = showString "signed"
+  showsPrec _ (CTokSizeof   _  ) = showString "sizeof"
+  showsPrec _ (CTokStatic   _  ) = showString "static"
+  showsPrec _ (CTokStruct   _  ) = showString "struct"
+  showsPrec _ (CTokSwitch   _  ) = showString "switch"
+  showsPrec _ (CTokTypedef  _  ) = showString "typedef"
+  showsPrec _ (CTokTypeof   _  ) = showString "typeof"
+  showsPrec _ (CTokThread   _  ) = showString "__thread"
+  showsPrec _ (CTokUnion    _  ) = showString "union"
+  showsPrec _ (CTokUnsigned _  ) = showString "unsigned"
+  showsPrec _ (CTokVoid     _  ) = showString "void"
+  showsPrec _ (CTokVolatile _  ) = showString "volatile"
+  showsPrec _ (CTokWhile    _  ) = showString "while"
+  showsPrec _ (CTokCLit     _ c) = shows c
+  showsPrec _ (CTokILit     _ i) = shows i
+  showsPrec _ (CTokFLit     _ f) = shows f
+  showsPrec _ (CTokSLit     _ s) = shows s
+  showsPrec _ (CTokIdent    _ i) = (showString . identToString) i
+  showsPrec _ (CTokTyIdent  _ i) = (showString . identToString) i
+  showsPrec _ (CTokGnuC GnuCAttrTok _) = showString "__attribute__"
+  showsPrec _ (CTokGnuC GnuCExtTok  _) = showString "__extension__"
+  showsPrec _ (CTokGnuC GnuCComplexReal _) = showString "__real__"
+  showsPrec _ (CTokGnuC GnuCComplexImag  _) = showString "__imag__"
+  showsPrec _ (CTokGnuC GnuCVaArg    _) = showString "__builtin_va_arg"
+  showsPrec _ (CTokGnuC GnuCOffsetof _) = showString "__builtin_offsetof"
+  showsPrec _ (CTokGnuC GnuCTyCompat _) = showString "__builtin_types_compatible_p"
+  showsPrec _ CTokEof = error "show CToken : CTokEof"
+
diff --git a/src/Language/C/Pretty.hs b/src/Language/C/Pretty.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Pretty.hs
@@ -0,0 +1,474 @@
+{-# OPTIONS  #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Pretty
+-- Copyright   :  Copyright (c) 2007 Bertram Felgenhauer
+--                          (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  : benedikt.huber@gmail.com
+-- Stability   : experimental
+-- Portability : portable
+--
+-- This module provides a pretty printer for the parse tree
+-- ('Language.C.Syntax.AST').
+-----------------------------------------------------------------------------
+module Language.C.Pretty (
+    -- * Pretty Printing
+    Pretty (..),
+    -- * Testing
+    prettyUsingInclude
+) where
+import Data.List (partition,nub,isSuffixOf)
+import qualified Data.Set as Set
+import Text.PrettyPrint.HughesPJ
+import Debug.Trace {- for warnings -}
+
+import Language.C.Data
+import Language.C.Syntax
+
+-- | A class of types which can be pretty printed
+class Pretty p where
+    -- | pretty print the given value
+    pretty     :: p -> Doc
+    -- | @prettyPrec prec p@ pretty prints p assuming
+    -- that the surrounding context has a precedence of
+    -- @prec@
+    prettyPrec :: Int -> p -> Doc
+
+    pretty       = prettyPrec 0
+    prettyPrec _ = pretty
+
+-- pretty print optional chunk
+maybeP :: (p -> Doc) -> Maybe p -> Doc
+maybeP = maybe empty
+
+-- pretty print when flag is true
+ifP :: Bool -> Doc -> Doc
+ifP flag doc = if flag then doc else empty
+
+-- pretty print _optional_ list, i.e. [] ~ Nothing and (x:xs) ~ Just (x:xs)
+mlistP :: ([p] -> Doc) -> [p] -> Doc
+mlistP pp xs = maybeP pp (if null xs then Nothing else Just xs)
+
+-- pretty print identifier
+identP :: Ident -> Doc
+identP = text . identToString
+
+-- pretty print attribute annotations
+attrlistP :: [CAttr] -> Doc
+attrlistP [] = empty
+attrlistP attrs = text "__attribute__" <> parens (parens (hcat . punctuate comma . map pretty $ attrs))
+
+-- analogous to showParen
+parenPrec :: Int -> Int -> Doc -> Doc
+parenPrec prec prec2 t = if prec <= prec2 then t else parens t
+
+-- indent a chunk of code
+ii :: Doc -> Doc
+ii = nest 4
+
+-- Pretty instances
+instance Pretty CTranslUnit where
+    pretty (CTranslUnit edecls _) = vcat (map pretty edecls)
+
+-- | Pretty print the given tranlation unit, but replace declarations from header files with @#include@ directives.
+--
+-- The resulting file may not compile (because of missing @#define@ directives and similar things), but is very usefull
+-- for testing, as otherwise the pretty printed file will be cluttered with declarations from system headers.
+prettyUsingInclude :: CTranslUnit -> Doc
+prettyUsingInclude (CTranslUnit edecls _) =
+  includeWarning headerFiles
+    $$
+  (vcat $ map (either includeHeader pretty) mappedDecls)
+  where
+    (headerFiles,mappedDecls) = foldr addDecl (Set.empty,[]) $ map tagIncludedDecls edecls
+    tagIncludedDecls edecl | isHeaderFile ((posFile . posOf) edecl) = Left ((posFile . posOf) edecl)
+                           | otherwise = Right edecl
+    addDecl decl@(Left headerRef) (headerSet, ds)
+      | Set.member headerRef headerSet = (headerSet, ds)
+      | otherwise = (Set.insert headerRef headerSet, decl : ds)
+    addDecl decl (headerSet,ds) = (headerSet, decl : ds)
+    includeHeader hFile = text "#include" <+> doubleQuotes (text hFile)
+    isHeaderFile = (".h" `isSuffixOf`)
+    includeWarning hs | Set.null hs = empty
+                      | otherwise = text "/* Warning: The #include directives in this file aren't neccessarily correct. */"
+
+-- TODO: Check need of __extension__
+instance Pretty CExtDecl where
+    pretty (CDeclExt decl) = pretty decl <> semi
+    pretty (CFDefExt fund) = pretty fund
+    pretty (CAsmExt  asmStmt) = text "asm" <> parens (pretty asmStmt) <> semi
+
+-- TODO: Check that old-style and new-style aren't mixed
+instance Pretty CFunDef where
+    pretty (CFunDef declspecs declr decls stat _) =          -- Example:
+            hsep (map pretty declspecs)                      -- __attribute__((noreturn)) static long
+        <+> pretty declr                                     -- foo(b)
+        $+$ (ii . vcat . map (<> semi) . map pretty) decls   --     register long b;
+        $$ prettyPrec (-1) stat                              -- {  ...
+                                                             -- }
+
+instance Pretty CStat where
+    pretty (CLabel ident stat cattrs _) = identP ident <> text ":" <+> attrlistP cattrs $$ pretty stat
+    pretty (CCase expr stat _) =
+        text "case" <+> pretty expr <> text ":" $$ pretty stat
+    pretty (CCases expr1 expr2 stat _) =
+        text "case" <+> pretty expr1 <+> text "..."
+                    <+> pretty expr2 <> text ":" $$ pretty stat
+    pretty (CDefault stat _) = text "default:" $$ pretty stat
+    pretty (CExpr expr _) = ii $ maybeP pretty expr <> semi
+    pretty c@(CCompound _ _ _) = prettyPrec 0 c
+    pretty (CIf expr stat estat _) =
+        ii $  text "if" <+> text "(" <> pretty expr <> text ")"
+                $+$ prettyPrec (-1) stat
+              $$ maybeP prettyElse estat
+      where
+        prettyElse (CIf else_if_expr else_if_stat else_stat _) =
+          text "else if" <+> text "(" <> pretty else_if_expr <> text ")"
+            $+$ prettyPrec (-1) else_if_stat
+          $$ maybeP prettyElse else_stat
+        prettyElse else_stmt =
+          text "else" <+> prettyPrec (-1) else_stmt
+
+    pretty (CSwitch expr stat _) =
+        ii $ text "switch" <+> text "(" <> pretty expr <> text ")"
+               $+$ prettyPrec (-1) stat
+    pretty (CWhile expr stat False _) =
+        ii $ text "while" <+> text "(" <> pretty expr <> text ")"
+               $+$ prettyPrec (-1) stat
+    pretty (CWhile expr stat True _) =
+        ii $ text "do" $+$ prettyPrec (-1) stat
+               $$ text "while" <+> text "(" <> pretty expr <> text ");"
+    pretty (CFor for_init cond step stat _) =
+        ii $ text "for" <+> text "("
+               <> either (maybeP pretty) pretty for_init <> semi
+               <+> maybeP pretty cond <> semi
+               <+> maybeP pretty step <> text ")" $+$ prettyPrec (-1) stat
+    pretty (CGoto ident _) = ii $ text "goto" <+> identP ident <> semi
+    pretty (CGotoPtr expr _) = ii $ text "goto" <+> text "*" <+> prettyPrec 30 expr <> semi
+    pretty (CCont _) = ii $ text "continue" <> semi
+    pretty (CBreak _) = ii $ text "break" <> semi
+    pretty (CReturn Nothing _) = ii $ text "return" <> semi
+    pretty (CReturn (Just e) _) = ii $ text "return" <+> pretty e <> semi
+    pretty (CAsm asmStmt _) = pretty asmStmt
+    prettyPrec p (CCompound localLabels bis _) =
+        let inner = text "{" $+$ mlistP ppLblDecls localLabels $+$ vcat (map pretty bis) $$ text "}"
+        in  if p == -1 then inner else ii inner
+        where ppLblDecls =  vcat . map (\l -> text "__label__" <+> identP l <+> semi)
+    prettyPrec _ p = pretty p
+
+instance Pretty CAsmStmt where
+    pretty (CAsmStmt tyQual expr outOps inOps clobbers _) =
+        ii $ text "__asm__" <+>
+             maybeP pretty tyQual <>
+             parens asmStmt <> semi
+      where
+        asmStmt = pretty expr <+>
+                  (if all null [inOps,outOps] && null clobbers then empty else ops)
+        ops     =  text ":" <+> hcat (punctuate comma (map pretty outOps)) <+>
+                   text ":" <+> hcat (punctuate comma (map pretty inOps)) <+>
+                   (if null clobbers then empty else clobs)
+        clobs   =  text ":" <+> hcat (punctuate comma (map pretty clobbers))
+
+instance Pretty CAsmOperand where
+    -- asm_operand :~ [operand-name] "constraint" ( expr )
+    pretty (CAsmOperand mArgName cnstr expr _) =
+        maybeP (\argName -> text "[" <> identP argName <> text "]") mArgName <+>
+        pretty cnstr <+>
+        parens (pretty expr)
+
+-- TODO: Check need of __extension__
+instance Pretty CBlockItem where
+    pretty (CBlockStmt stat) = pretty stat
+    pretty (CBlockDecl decl) = ii $ pretty decl <> semi
+    pretty (CNestedFunDef fundef) = ii $ pretty fundef
+
+instance Pretty CDecl where
+    -- CAVEAT:
+    -- we may not print __attribute__s directly after typespecs,
+    -- as this may change the semantics of the declaration.
+    -- The parser fixes this, but to avoid hard-to-track code generator
+    -- errors, we enforce this invariant on the AST level.
+    pretty (CDecl specs divs _) =
+        hsep (map pretty checked_specs) <+> hsep (punctuate comma (map p divs))
+            where
+            -- possible hint for AST improvement - (declr, initializer, expr, attrs)
+            -- currently there are no sensible attributes for unnamed bitfields though
+            p (declr, initializer, expr) =
+                maybeP (prettyDeclr False 0) declr <+>
+                maybeP ((text ":" <+>) . pretty) expr <+>
+                attrlistP (getAttrs declr) <+>
+                maybeP ((text "=" <+>) . pretty) initializer
+            checked_specs =
+                case any isAttrAfterSUE  (zip specs (tail specs)) of
+                    True -> trace
+                              ("Warning: AST Invariant violated: __attribute__ specifier following struct/union/enum:"++
+                               (show $ map pretty specs))
+                            specs
+                    False -> specs
+            isAttrAfterSUE (CTypeSpec ty,CTypeQual (CAttrQual _)) = isSUEDef ty
+            isAttrAfterSUE _ = False
+            getAttrs Nothing = []
+            getAttrs (Just (CDeclr _ _ _ cattrs _)) = cattrs
+
+instance Pretty CDeclSpec where
+    pretty (CStorageSpec sp) = pretty sp
+    pretty (CTypeSpec sp) = pretty sp
+    pretty (CTypeQual qu) = pretty qu
+
+instance Pretty CStorageSpec where
+    pretty sp = text (show sp)
+
+instance Pretty CTypeSpec where
+    pretty (CVoidType _)        = text "void"
+    pretty (CCharType _)        = text "char"
+    pretty (CShortType _)       = text "short"
+    pretty (CIntType _)         = text "int"
+    pretty (CLongType _)        = text "long"
+    pretty (CFloatType _)       = text "float"
+    pretty (CDoubleType _)      = text "double"
+    pretty (CSignedType _)      = text "signed"
+    pretty (CUnsigType _)       = text "unsigned"
+    pretty (CBoolType _)        = text "_Bool"
+    pretty (CComplexType _)     = text "_Complex"
+    pretty (CSUType union _)    = pretty union
+    pretty (CEnumType enum _)   = pretty enum
+    pretty (CTypeDef ident _)   = identP ident
+    pretty (CTypeOfExpr expr _) =
+        text "typeof" <> text "(" <> pretty expr <> text ")"
+    pretty (CTypeOfType decl _) =
+        text "typeof" <> text "(" <> pretty decl <> text ")"
+
+instance Pretty CTypeQual where
+    pretty (CConstQual _) = text "const"
+    pretty (CVolatQual _) = text "volatile"
+    pretty (CRestrQual _) = text "__restrict"
+    pretty (CInlineQual _) = text "inline"
+    pretty (CAttrQual a)  = attrlistP [a]
+
+instance Pretty CStructUnion where
+    pretty (CStruct tag ident Nothing cattrs _) = pretty tag <+> attrlistP cattrs <+> maybeP identP ident
+    pretty (CStruct tag ident (Just []) cattrs _) =
+        pretty tag <+> attrlistP cattrs <+> maybeP identP ident <+> text "{ }"
+    pretty (CStruct tag ident (Just decls) cattrs _) = vcat [
+        pretty tag <+> attrlistP cattrs <+> maybeP identP ident <+> text "{",
+        ii $ sep (map (<> semi) (map pretty decls)),
+        text "}"]
+
+instance Pretty CStructTag where
+    pretty CStructTag = text "struct"
+    pretty CUnionTag  = text "union"
+
+instance Pretty CEnum where
+    pretty (CEnum enum_ident Nothing cattrs _) = text "enum" <+> attrlistP cattrs <+> maybeP identP enum_ident
+    pretty (CEnum enum_ident (Just vals) cattrs _) = vcat [
+        text "enum" <+> attrlistP cattrs <+> maybeP identP enum_ident <+> text "{",
+        ii $ sep (punctuate comma (map p vals)),
+        text "}"] where
+        p (ident, expr) = identP ident <+> maybeP ((text "=" <+>) . pretty) expr
+
+--  Analyze a declarator and return a human-readable description
+--   See C99 Spec p 115ff.
+-- describeDeclr :: CDeclr -> Doc
+-- describeDeclr declr =
+--     let declrs = reverse (declrChain declr) in
+--     endDescr (foldl descrDeclr undefined declrs)
+--
+--   where
+--   declrChain declr@(CVarDeclr _ _ _ _) = [declr]
+--   declrChain declr@(CPtrDeclr _ ideclr _)   = declr : declrChain ideclr
+--   declrChain declr@(CArrDeclr ideclr _ _ _) = declr : declrChain ideclr
+--   declrChain declr@(CFunDeclr ideclr _ _ _)   = declr : declrChain ideclr
+--
+--   descrDeclr _ (CVarDeclr ident asm cattrs _) = single False $ \_ ->
+--       maybe (text "<anonymous>") identP ident <+>
+--       maybeP (\asmname -> parens (text "asm:" <+> pretty asmname)) asm <+>
+--       text "is" <+> (if null cattrs then empty else prettyList (map CAttrQual cattrs) <> comma)
+--   descrDeclr (pre,isPlural) (CPtrDeclr quals declr _) = single isPlural $ \pluralize ->
+--       pre <+> indefArticle isPlural <> prettyList quals <+> pluralize "pointer to" "pointers to"
+--   descrDeclr (pre,isPlural) (CArrDeclr declr quals expr _) = plural isPlural $ \pluralize ->
+--       pre <+> indefArticle' isPlural <> prettyList quals <+> pluralize "array of" "arrays of"
+--   descrDeclr (pre,isPlural) (CFunDeclr declr params cattrs _) = single isPlural $ \pluralize ->
+--       pre <+> indefArticle isPlural <> prettyList (map CAttrQual cattrs) <+> pluralize "function returning" "functions returning"
+--   endDescr (pre, isPlural) =  pre <+> text (if isPlural then "<typed objects>" else "a <typed object>")
+--   single :: Bool -> ( (String -> String -> Doc) -> a ) -> (a, Bool)
+--   single isPlural mkDescr = (mkDescr (pluralize isPlural), isPlural)
+--   plural :: Bool -> ( (String -> String -> Doc) -> a ) -> (a, Bool)
+--   plural isPlural mkDescr = (mkDescr (pluralize isPlural), True)
+--   indefArticle isPlural  = text$ if isPlural then "" else "a "
+--   indefArticle' isPlural = text$ if isPlural then "" else "an "
+--   pluralize isPlural s p = text (if isPlural then p else s)
+--   prettyList :: (Pretty a) => [a] -> Doc
+--   prettyList = hsep . punctuate comma . map pretty
+instance Pretty CDeclr where
+    prettyPrec prec declr = prettyDeclr True prec declr
+
+prettyDeclr :: Bool -> Int -> CDeclr -> Doc
+prettyDeclr show_attrs prec (CDeclr name derived_declrs asmname cattrs _) =
+    ppDeclr prec (reverse derived_declrs) <+> prettyAsmName asmname <+> ifP show_attrs (attrlistP cattrs)
+    where
+    ppDeclr _ [] = maybeP identP name
+    --'*' __attribute__? qualifiers declarator
+    ppDeclr p (CPtrDeclr quals _ : declrs) =
+        parenPrec p 5 $ text "*" <+> hsep (map pretty quals) <+> ppDeclr 5 declrs
+
+    -- declarator[ __attribute__? qualifiers expr ]
+    ppDeclr p (CArrDeclr quals size _ : declrs) =
+        parenPrec p 6 $ ppDeclr 6 declrs <> brackets (hsep (map pretty quals) <+> pretty size)
+    -- declarator ( arguments )
+    -- or (__attribute__ declarator) (arguments)
+    ppDeclr _ (CFunDeclr params fun_attrs _ : declrs) =
+        (if not (null fun_attrs) then parens (attrlistP fun_attrs <+> ppDeclr 5 declrs) else ppDeclr 6 declrs)
+        <> parens (prettyParams params)
+    prettyParams (Right (decls, isVariadic)) =
+     sep (punctuate comma (map pretty decls))
+     <> (if isVariadic then text "," <+> text "..." else empty)
+    prettyParams (Left oldStyleIds) =
+     hsep (punctuate comma (map identP oldStyleIds))
+    prettyAsmName asm_name_opt
+        = maybe empty (\asm_name -> text "__asm__" <> parens (pretty asm_name)) asm_name_opt
+
+instance Pretty CArrSize where
+  pretty (CNoArrSize completeType) = ifP completeType (text "*")
+  pretty (CArrSize staticMod expr) = ifP staticMod (text "static") <+> pretty expr
+-- initializer :: { CInit }
+-- initializer :- assignment_expression
+--              | '{' (designation? initializer)_cs_list '}'
+instance Pretty CInit where
+    pretty (CInitExpr expr _) = pretty expr
+    pretty (CInitList initl _) =
+        text "{" <+> hsep (punctuate comma (map p initl)) <+> text "}" where
+        p ([], initializer)     = pretty initializer
+        p (desigs, initializer) = hsep (map pretty desigs) <+> text "=" <+> pretty initializer
+
+-- designation :- designator_list '='
+--             | array_range_designator
+-- arr_designator :- '[' constant_expression ']'
+-- member_designator :-  '.' identifier
+-- arr_range _designator :- '[' constant_expression "..." constant_expression ']'
+
+instance Pretty CDesignator where
+    pretty (CArrDesig expr _) = text "[" <> pretty expr <> text "]"
+    pretty (CMemberDesig ident _) = text "." <> identP ident
+    pretty (CRangeDesig expr1 expr2 _) =
+        text "[" <> pretty expr1 <+> text "..." <+> pretty expr2 <> text "]"
+
+instance Pretty CAttr where
+    pretty (CAttr attrName [] _) = identP attrName
+    pretty (CAttr attrName attrParams _) = identP attrName <> parens (hsep . punctuate comma . map pretty $ attrParams)
+
+instance Pretty CExpr where
+    prettyPrec p (CComma exprs _) =
+        parenPrec p (-1) $ hsep (punctuate comma (map (prettyPrec 2) exprs))
+    prettyPrec p (CAssign op expr1 expr2 _) =
+        parenPrec p 2 $ prettyPrec 3 expr1 <+> pretty op <+> prettyPrec 2 expr2
+    prettyPrec p (CCond expr1 expr2 expr3 _) =
+        parenPrec p 2 $ prettyPrec 4 expr1 <+> text "?" -- NB: assignment only has a higher precedence if cond is on the rhs
+           <+> maybeP pretty expr2 <+> text ":" <+> prettyPrec 4 expr3
+    prettyPrec p (CBinary op expr1 expr2 _) =
+        let prec = binPrec op
+        in  parenPrec p prec $ prettyPrec prec expr1
+                             <+> pretty op <+> prettyPrec (prec + 1) expr2
+    prettyPrec p (CCast decl expr _) =
+        parenPrec p 25 $ text "(" <> pretty decl <> text ")"
+                       <+> prettyPrec 25 expr
+    prettyPrec p (CUnary CPostIncOp expr _) =
+        parenPrec p 26 $ prettyPrec 26 expr <> text "++"
+    prettyPrec p (CUnary CPostDecOp expr _) =
+        parenPrec p 26 $ prettyPrec 26 expr <> text "--"
+    prettyPrec p (CUnary op expr@(CUnary _ _ _) _) =
+        --                             parens aren't neccessary, but look nicer imho
+        parenPrec p 25 $ pretty op <+> parens (prettyPrec 25 expr)
+    prettyPrec p (CUnary op expr _) =
+        parenPrec p 25 $ pretty op <> prettyPrec 25 expr
+    prettyPrec p (CSizeofExpr expr _) =
+        parenPrec p 25 $ text "sizeof" <> parens (pretty expr)
+    prettyPrec p (CSizeofType decl _) =
+        parenPrec p 25 $ text "sizeof" <> parens (pretty decl)
+    prettyPrec p (CAlignofExpr expr _) =
+        parenPrec p 25 $ text "__alignof" <> parens (pretty expr)
+    prettyPrec p (CAlignofType decl _) =
+        parenPrec p 25 $ text "__alignof" <> parens (pretty decl)
+    prettyPrec p (CComplexReal expr _) =
+        parenPrec p 25 $ text "__real" <+> prettyPrec 25 expr
+    prettyPrec p (CComplexImag expr _) =
+        parenPrec p 25 $ text "__imag" <+> prettyPrec 25 expr
+    prettyPrec p (CIndex expr1 expr2 _) =
+        parenPrec p 26 $ prettyPrec 26 expr1
+                       <> text "[" <> pretty expr2 <> text "]"
+    prettyPrec p (CCall expr args _) =
+        parenPrec p 30 $ prettyPrec 30 expr <> text "("
+            <> (sep . punctuate comma . map pretty) args <> text ")"
+    prettyPrec p (CMember expr ident deref _) =
+        parenPrec p 26 $ prettyPrec 26 expr
+                       <> text (if deref then "->" else ".") <> identP ident
+    prettyPrec _p (CVar ident _) = identP ident
+    prettyPrec _p (CConst constant) = pretty constant
+    prettyPrec _p (CCompoundLit decl initl _) =
+        parens (pretty decl) <+> (braces . hsep . punctuate comma) (map p initl) where
+        p ([], initializer)           = pretty initializer
+        p ([struct_mem], initializer) = pretty struct_mem <+> text "=" <+> pretty initializer
+        p (badDecls , initializer)  =
+            error $ "Inconsistent AST: more than one left-hand-side in CCompoundLit init-list entry" ++
+                    (show $ (hsep $ punctuate comma $ map pretty badDecls) <+> text "=" <+> pretty initializer)
+
+    prettyPrec _p (CStatExpr stat _) =
+        text "(" <> pretty stat <> text ")"
+
+    -- unary_expr :- && ident  {- address of label -}
+    prettyPrec _p (CLabAddrExpr ident _) = text "&&" <> identP ident
+
+    prettyPrec _p (CBuiltinExpr builtin) = pretty builtin
+
+instance Pretty CBuiltin where
+    pretty (CBuiltinVaArg expr ty_name _) =
+        text "__builtin_va_arg" <+>
+        (parens $ pretty expr <> comma <+> pretty ty_name)
+    -- The first desig has to be a member field.
+    pretty (CBuiltinOffsetOf ty_name (CMemberDesig field1 _ : desigs) _) =
+        text "__builtin_offsetof" <+>
+        (parens $ pretty ty_name <> comma <+> identP field1 <> hcat (map pretty desigs) )
+    pretty (CBuiltinOffsetOf _ty_name otherDesigs _) =
+        error $ "Inconsistent AST: Cannot interpret designators in offsetOf: "++ show (hcat$ map pretty otherDesigs)
+    pretty (CBuiltinTypesCompatible ty1 ty2 _) =
+        text "__builtin_types_compatible_p" <+>
+        (parens $ pretty ty1 <> comma <+> pretty ty2)
+
+instance Pretty CAssignOp where
+    pretty = text . show
+
+instance Pretty CBinaryOp where
+    pretty = text . show
+
+instance Pretty CUnaryOp where
+    pretty = text . show
+
+instance Pretty CConst where
+    pretty (CIntConst   int_const _) = text (show int_const)
+    pretty (CCharConst  chr _) = text (show chr)
+    pretty (CFloatConst flt _) = text (show flt)
+    pretty (CStrConst   str _) = text (show str)
+
+instance Pretty CStrLit where
+    pretty (CStrLit   str _) = text (show str)
+
+-- precedence of C operators
+binPrec :: CBinaryOp -> Int
+binPrec CMulOp = 20
+binPrec CDivOp = 20
+binPrec CRmdOp = 20
+binPrec CAddOp = 19
+binPrec CSubOp = 19
+binPrec CShlOp = 18
+binPrec CShrOp = 18
+binPrec CLeOp  = 17
+binPrec CGrOp  = 17
+binPrec CLeqOp = 17
+binPrec CGeqOp = 17
+binPrec CEqOp  = 16
+binPrec CNeqOp = 16
+binPrec CAndOp = 15
+binPrec CXorOp = 14
+binPrec COrOp  = 13
+binPrec CLndOp = 12
+binPrec CLorOp = 11
diff --git a/src/Language/C/Syntax.hs b/src/Language/C/Syntax.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Syntax.hs
@@ -0,0 +1,20 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Syntax
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  : benedikt.huber@gmail.com
+-- Stability   : experimental
+-- Portability : ghc
+--
+-- Syntax of C files: The abstract syntax tree and constants.
+-----------------------------------------------------------------------------
+module Language.C.Syntax (
+     -- * Constants
+     module Language.C.Syntax.Constants,
+     -- * Syntax tree
+     module Language.C.Syntax.AST,
+)
+where
+import Language.C.Syntax.AST
+import Language.C.Syntax.Constants
diff --git a/src/Language/C/Syntax/AST.hs b/src/Language/C/Syntax/AST.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Syntax/AST.hs
@@ -0,0 +1,731 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Syntax.AST
+-- Copyright   :  (c) [1999..2007] Manuel M T Chakravarty
+--                (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  : benedikt.huber@gmail.com
+-- Stability   : experimental
+-- Portability : ghc
+--
+-- Abstract syntax of C source and header files.
+--
+--  The tree structure is based on the grammar in Appendix A of K&R.  The
+--  abstract syntax simplifies the concrete syntax by merging similar concrete
+--  constructs into a single type of abstract tree structure: declarations are
+--  merged with structure declarations, parameter declarations and type names,
+--  and declarators are merged with abstract declarators.
+--
+--  With K&R we refer to ``The C Programming Language'', second edition, Brain
+--  W. Kernighan and Dennis M. Ritchie, Prentice Hall, 1988. The AST supports all
+--  of C99 <http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf> and several
+--  GNU extensions <http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html>.
+-----------------------------------------------------------------------------
+module Language.C.Syntax.AST (
+  -- * C translation units
+  CTranslUnit(..),  CExtDecl(..),
+  -- * Declarations
+  CFunDef(..),  CDecl(..),
+  CStructUnion(..),  CStructTag(..), CEnum(..),
+  -- * Declaration attributes
+  CDeclSpec(..), partitionDeclSpecs,
+  CStorageSpec(..), CTypeSpec(..), isSUEDef, CTypeQual(..), CAttr(..),
+  -- * Declarators
+  CDeclr(..),CDerivedDeclr(..),CArrSize(..),
+  -- * Initialization
+  CInit(..), CInitList, CDesignator(..),
+  -- * Statements
+  CStat(..), CBlockItem(..),
+  CAsmStmt(..), CAsmOperand(..),
+  -- * Expressions
+  CExpr(..),
+  CAssignOp(..), CBinaryOp(..), CUnaryOp(..),
+  CBuiltin(..),
+  -- * Constants
+  CConst(..),CStrLit(..),cstringOfLit,liftStrLit,
+) where
+import Data.List
+import Language.C.Syntax.Constants
+import Language.C.Syntax.Ops
+import Language.C.Data.Ident
+import Language.C.Data.Node
+import Language.C.Data.Position
+import Data.Generics
+
+-- | Complete C tranlsation unit (C99 6.9, K&R A10)
+--
+-- A complete C translation unit, for example representing a C header or source file.
+-- It consists of a list of external (i.e. toplevel) declarations.
+data CTranslUnit = CTranslUnit [CExtDecl] NodeInfo
+                   deriving (Data,Typeable {-! CNode !-})
+
+-- | External C declaration (C99 6.9, K&R A10)
+--
+-- Either a toplevel declaration, function definition or external assembler.
+data CExtDecl = CDeclExt CDecl
+              | CFDefExt CFunDef
+              | CAsmExt  CStrLit
+              deriving (Data,Typeable {-! CNode !-})
+
+-- | C function definition (C99 6.9.1, K&R A10.1)
+--
+-- A function definition is of the form @CFunDef specifiers declarator decllist? stmt@.
+--
+-- * @specifiers@ are the type and storage-class specifiers of the function.
+--   The only storage-class specifiers allowed are /extern/ and /static/.
+--
+-- * The @declarator@ must be such that the declared identifier has /function type/.
+--   The return type shall be void or an object type other than array type.
+--
+-- * The optional declaration list @decllist@ is for old-style function declarations.
+--
+-- * The statement @stmt@ is a compound statement.
+data CFunDef = CFunDef [CDeclSpec]      -- type specifier and qualifier
+                       CDeclr           -- declarator
+                       [CDecl]          -- optional declaration list
+                       CStat            -- compound statement
+                       NodeInfo
+               deriving (Data,Typeable {-! CNode !-})
+
+-- | C declarations (K&R A8, C99 6.7), including structure declarations, parameter
+--   declarations and type names.
+--
+-- A declaration is of the form @CDecl specifiers init-declarator-list@, where the form of the declarator list's
+--  elements depends on the kind of declaration:
+--
+-- 1) Toplevel declarations (K&R A8, C99 6.7 declaration)
+--
+--   * C99 requires that there is at least one specifier, though this is merely a syntactic restriction
+--
+--   * at most one storage class specifier is allowed per declaration
+--
+--   * the elements of the non-empty @init-declarator-list@ are of the form @(Just declr, init?, Nothing)@.
+--      The declarator @declr@ has to be present and non-abstract and the initialization expression is
+--      optional.
+--
+-- 2) Structure declarations (K&R A8.3, C99 6.7.2.1 struct-declaration)
+--
+--   Those are the declarations of a structure's members.
+--
+--   * do not allow storage specifiers
+--
+--   * in strict C99, the list of declarators has to be non-empty
+--
+--   * the elements of @init-declarator-list@ are either of the form @(Just declr, Nothing, size?)@,
+--     representing a member with optional bit-field size, or of the form @(Nothing, Nothing, Just size)@,
+--     for unnamed bitfields. @declr@ has to be non-abstract.
+--
+--   * no member of a structure shall have incomplete type
+--
+-- 3) Parameter declarations (K&R A8.6.3, C99 6.7.5 parameter-declaration)
+--
+--   * @init-declarator-list@ must contain at most one triple of the form @(Just declr, Nothing, Nothing)@,
+--     i.e. consist of a single declarator, which is allowed to be abstract (i.e. unnamed).
+--
+-- 4) Type names (A8.8, C99 6.7.6)
+--
+--   * do not allow storage specifiers
+--
+--   * @init-declarator-list@ must contain at most one triple of the form @(Just declr, Nothing, Nothing)@.
+--     where @declr@ is an abstract declarator (i.e. doesn't contain a declared identifier)
+--
+data CDecl = CDecl [CDeclSpec]          -- type specifier and qualifier, __attribute__
+                   [(Maybe CDeclr,      -- declarator (may be omitted)
+                     Maybe CInit,       -- optional initialize
+                     Maybe CExpr)]      -- optional size (const expr)
+                   NodeInfo
+             deriving (Data,Typeable {-! CNode !-})
+
+-- | C declarator (K&R A8.5, C99 6.7.5) and abstract declarator (K&R A8.8, C99 6.7.6)
+--
+-- A declarator declares a single object, function, or type. It is always associated with
+-- a declaration ('CDecl'), which specifies the declaration's type and the additional storage qualifiers and
+-- attributes, which apply to the declared object.
+--
+-- A declarator is of the form @CDeclr name? indirections asm-name? attrs _@, where
+-- @name@ is the name of the declared object (missing for abstract declarators),
+-- @declquals@ is a set of additional declaration specifiers,
+-- @asm-name@ is the optional assembler name and attributes is a set of
+-- attrs is a set of @__attribute__@ annotations for the declared object.
+--
+-- @indirections@ is a set of pointer, array and function declarators, which modify the type of the declared object as
+-- described below. If the /declaration/ specifies the non-derived type @T@,
+-- and we have @indirections = [D1, D2, ..., Dn]@ than the declared object has type
+-- @(D1 `indirect` (D2 `indirect` ...  (Dn `indirect` T)))@, where
+--
+--  * @(CPtrDeclr attrs) `indirect` T@ is /attributed pointer to T/
+--
+--  * @(CFunDeclr attrs) `indirect` T@ is /attributed function returning T/
+--
+--  * @(CArrayDeclr attrs) `indirect` T@ is /attributed array of elemements of type T/
+--
+-- Examples (simplified attributes):
+--
+--  * /x/ is an int
+--
+-- > int x;
+-- > CDeclr "x" []
+--
+--  * /x/ is a restrict pointer to a const pointer to int
+--
+-- > const int * const * restrict x;
+-- > CDeclr "x" [CPtrDeclr [restrict], CPtrDeclr [const]]
+--
+--  * /f/ is an function return a constant pointer to int
+--
+-- > int* const f();
+-- > CDeclr "f" [CFunDeclr [],CPtrDeclr [const]]
+--
+--  * /f/ is a constant pointer to a function returning int
+--
+-- > int (* const f)(); ==>
+-- > CDeclr "f" [CPtrDeclr [const], CFunDeclr []]
+data CDeclr = CDeclr (Maybe Ident) [CDerivedDeclr] (Maybe CStrLit) [CAttr] NodeInfo
+              deriving (Data,Typeable {-! CNode !-})
+
+-- | Derived declarators, see 'CDeclr'
+--
+-- Indirections are qualified using type-qualifiers and generic attributes, and additionally
+--
+--    * The size of an array is either a constant expression, variable length ('*') or missing; in the last case, the
+--      type of the array is incomplete. The qualifier static is allowed for function arguments only, indicating that
+--      the supplied argument is an array of at least the given size.
+--
+--    * New style parameter lists have the form @Right (declarations, isVariadic)@, old style parameter lists have the
+--      form @Left (parameter-names)@
+data CDerivedDeclr =
+              CPtrDeclr [CTypeQual] NodeInfo
+              -- ^ Pointer declarator @CPtrDeclr tyquals declr@
+            | CArrDeclr [CTypeQual] (CArrSize) NodeInfo
+              -- ^ Array declarator @CArrDeclr declr tyquals size-expr?@
+            | CFunDeclr (Either [Ident] ([CDecl],Bool)) [CAttr] NodeInfo
+              -- ^ Function declarator @CFunDeclr declr (old-style-params | new-style-params) c-attrs@
+            deriving (Data,Typeable {-! CNode !-})
+
+-- | Size of an array
+data CArrSize = CNoArrSize Bool     -- ^ @CUnknownSize isCompleteType@
+              | CArrSize Bool CExpr -- ^ @CArrSize isStatic expr@
+              deriving (Data,Typeable)
+
+-- | C statement (K&R A9, C99 6.8)
+--
+data CStat = CLabel  Ident CStat [CAttr] NodeInfo  -- ^ An (attributed) label followed by a statement
+           | CCase CExpr CStat NodeInfo            -- ^ A statement of the form @case expr : stmt@
+           | CCases CExpr CExpr CStat NodeInfo     -- ^ A case range of the form @case lower ... upper : stmt@
+           | CDefault CStat NodeInfo               -- ^ The default case @default : stmt@
+           | CExpr (Maybe CExpr) NodeInfo
+           -- ^ A simple statement, that is in C: evaluating an expression with side-effects
+           --   and discarding the result.
+           | CCompound [Ident] [CBlockItem] NodeInfo    -- ^ compound statement @CCompound localLabels blockItems at@
+           | CIf CExpr CStat (Maybe CStat) NodeInfo     -- ^ conditional statement @CIf ifExpr thenStmt maybeElseStmt at@
+           | CSwitch CExpr CStat NodeInfo
+           -- ^ switch statement @CSwitch selectorExpr switchStmt@, where @switchStmt@ usually includes
+           -- /case/, /break/ and /default/ statements
+           | CWhile CExpr CStat Bool NodeInfo      -- ^ while or do-while statement @CWhile guard stmt isDoWhile at@
+           | CFor (Either (Maybe CExpr) CDecl)
+                  (Maybe CExpr)
+                  (Maybe CExpr)
+                  CStat
+                  NodeInfo
+           -- ^ for statement @CFor init expr-2 expr-3 stmt@, where @init@ is either a declaration or
+           -- initializing expression
+           | CGoto Ident NodeInfo            -- ^ goto statement @CGoto label@
+           | CGotoPtr CExpr NodeInfo         -- ^ computed goto @CGotoPtr labelExpr@
+           | CCont NodeInfo                  -- ^ continue statement
+           | CBreak    NodeInfo              -- ^ break statement
+           | CReturn (Maybe CExpr)NodeInfo   -- ^ return statement @CReturn returnExpr@
+           | CAsm CAsmStmt NodeInfo          -- ^ assembly statement
+           deriving (Data,Typeable {-! CNode !-})
+
+-- | GNU Assembler statement
+--
+-- > CAsmStatement type-qual? asm-expr out-ops in-ops clobbers _
+--
+-- is an inline assembler statement.
+-- The only type-qualifier (if any) allowed is /volatile/.
+-- @asm-expr@ is the actual assembler epxression (a string), @out-ops@ and @in-ops@ are the input
+-- and output operands of the statement.
+-- @clobbers@ is a list of registers which are clobbered when executing the assembler statement
+data CAsmStmt
+  = CAsmStmt (Maybe CTypeQual)     -- maybe volatile
+                    CStrLit        -- assembler expression (String)
+                   [CAsmOperand]   -- output operands
+                   [CAsmOperand]   -- input operands
+                   [CStrLit]       -- Clobbers
+                    NodeInfo
+    deriving (Data,Typeable {-! CNode !-})
+-- | Assembler operand
+--
+-- @CAsmOperand argName? constraintExpr arg@ specifies an operand for an assembler
+-- statement.
+data CAsmOperand = CAsmOperand (Maybe Ident)   -- argument name
+                                CStrLit        -- constraint expr
+                                CExpr          -- argument
+                                NodeInfo
+                   deriving (Data,Typeable {-! CNode !-})
+-- | C99 Block items
+--
+--  Things that may appear in compound statements: either statements, declarations
+--   or nested function definitions.
+data CBlockItem = CBlockStmt    CStat           -- ^ A statement
+                | CBlockDecl    CDecl           -- ^ A local declaration
+                | CNestedFunDef CFunDef         -- ^ A nested function (GNU C)
+                  deriving (Data,Typeable {-! CNode !-})
+-- | C declaration specifiers and qualifiers
+--
+-- Declaration specifiers include at most one storage-class specifier (C99 6.7.1),
+-- type specifiers (6.7.2) and type qualifiers (6.7.3).
+data CDeclSpec = CStorageSpec CStorageSpec  -- ^ storage-class specifier or typedef
+               | CTypeSpec    CTypeSpec     -- ^ type name
+               | CTypeQual    CTypeQual     -- ^ type qualifier
+                 deriving (Data,Typeable {-! CNode !-})
+
+-- | Seperate the declaration specifiers
+--
+-- Note that inline isn't actually a type qualifier, but a function specifier.
+-- @__attribute__@ of a declaration qualify declarations or declarators (but not types),
+-- and are therefore seperated as well.
+partitionDeclSpecs :: [CDeclSpec] -> ([CStorageSpec], [CAttr], [CTypeQual], [CTypeSpec], Bool)
+partitionDeclSpecs = foldr deals ([],[],[],[],False) where
+    deals (CTypeQual (CInlineQual _)) (sts,ats,tqs,tss,_) = (sts,ats,tqs,tss,True)
+    deals (CStorageSpec sp) (sts,ats,tqs,tss,inline)  = (sp:sts,ats,tqs,tss,inline)
+    deals (CTypeQual (CAttrQual attr)) (sts,ats,tqs,tss,inline)  = (sts,attr:ats,tqs,tss,inline)
+    deals (CTypeQual tq) (sts,ats,tqs,tss,inline)     = (sts,ats,tq:tqs,tss,inline)
+    deals (CTypeSpec ts) (sts,ats,tqs,tss,inline)     = (sts,ats,tqs,ts:tss,inline)
+
+-- | C storage class specifier (and typedefs) (K&R A8.1, C99 6.7.1)
+data CStorageSpec = CAuto     NodeInfo     -- ^ auto
+                  | CRegister NodeInfo     -- ^ register
+                  | CStatic   NodeInfo     -- ^ static
+                  | CExtern   NodeInfo     -- ^ extern
+                  | CTypedef  NodeInfo     -- ^ typedef
+                  | CThread   NodeInfo     -- ^ GNUC thread local storage
+                 deriving (Eq,Ord,Data,Typeable {-! CNode !-})
+instance Show CStorageSpec where
+    show (CAuto _) = "auto"
+    show (CRegister _) = "register"
+    show (CStatic _) = "static"
+    show (CExtern _) = "extern"
+    show (CTypedef _) = "typedef"
+    show (CThread _) = "__thread"
+
+-- | C type specifier (K&R A8.2, C99 6.7.2)
+--
+-- Type specifiers are either basic types such as @char@ or @int@,
+-- @struct@, @union@ or @enum@ specifiers or typedef names.
+--
+-- As a GNU extension, a @typeof@ expression also is a type specifier.
+data CTypeSpec = CVoidType    NodeInfo
+               | CCharType    NodeInfo
+               | CShortType   NodeInfo
+               | CIntType     NodeInfo
+               | CLongType    NodeInfo
+               | CFloatType   NodeInfo
+               | CDoubleType  NodeInfo
+               | CSignedType  NodeInfo
+               | CUnsigType   NodeInfo
+               | CBoolType    NodeInfo
+               | CComplexType NodeInfo
+               | CSUType      CStructUnion NodeInfo  -- ^ Struct or Union specifier
+               | CEnumType    CEnum        NodeInfo  -- ^ Enumeration specifier
+               | CTypeDef     Ident        NodeInfo  -- ^ Typedef name
+               | CTypeOfExpr  CExpr        NodeInfo  -- ^ @typeof(expr)@
+               | CTypeOfType  CDecl        NodeInfo  -- ^ @typeof(type)@
+               deriving (Data,Typeable {-! CNode !-})
+
+-- | returns @True@ if the given typespec is a struct, union or enum /definition/
+isSUEDef :: CTypeSpec -> Bool
+isSUEDef (CSUType (CStruct _ _ (Just _) _ _) _) = True
+isSUEDef (CEnumType (CEnum _ (Just _) _ _) _) = True
+isSUEDef _ = False
+
+-- | C type qualifiers (K&R A8.2, C99 6.7.3), function specifiers (C99 6.7.4), and attributes.
+--
+-- @const@, @volatile@ and @restrict@ type qualifiers and @inline@ function specifier.
+-- Additionally, @__attribute__@ annotations for declarations and declarators.
+data CTypeQual = CConstQual NodeInfo
+               | CVolatQual NodeInfo
+               | CRestrQual NodeInfo
+               | CInlineQual NodeInfo
+               | CAttrQual  CAttr
+               deriving (Data,Typeable {-! CNode !-})
+
+-- | C structure or union specifiers (K&R A8.3, C99 6.7.2.1)
+--
+-- @CStruct tag identifier struct-decls c-attrs@ represents a struct or union specifier (depending on @tag@).
+--
+--   * either @identifier@ or the declaration list @struct-decls@ (or both) have to be present.
+--
+--     Example: in @struct foo x;@, the identifier is present, in @struct { int y; } x@ the declaration list, and
+--     in @struct foo { int y; } x;@ both of them.
+--
+--   * @c-attrs@ is a list of @__attribute__@ annotations associated with the struct or union specifier
+data CStructUnion = CStruct CStructTag
+                            (Maybe Ident)
+                            (Maybe [CDecl])    -- member declarations
+                            [CAttr]            -- __attribute__s
+                            NodeInfo
+                    deriving (Data,Typeable {-! CNode !-})
+
+-- | A tag to determine wheter we refer to a @struct@ or @union@, see 'CStructUnion'.
+data CStructTag = CStructTag
+                | CUnionTag
+                deriving (Eq,Data,Typeable)
+
+-- | C enumeration specifier (K&R A8.4, C99 6.7.2.2)
+--
+-- @CEnum identifier enumerator-list attrs@ represent as enum specifier
+--
+--  * Either the identifier or the enumerator-list (or both) have to be present.
+--
+--  * If @enumerator-list@ is present, it has to be non-empty.
+--
+--  * The enumerator list is of the form @(enumeration-constant, enumeration-value?)@, where the latter
+--    is an optional constant integral expression.
+--
+--  * @attrs@ is a list of @__attribute__@ annotations associated with the enumeration specifier
+data CEnum = CEnum (Maybe Ident)
+                   (Maybe [(Ident,             -- variant name
+                            Maybe CExpr)])     -- explicit variant value
+                   [CAttr]                     -- __attribute__s
+                   NodeInfo
+             deriving (Data,Typeable {-! CNode !-})
+
+
+-- | C initialization (K&R A8.7, C99 6.7.8)
+--
+-- Initializers are either assignment expressions or initializer lists
+-- (surrounded in curly braces), whose elements are themselves
+-- initializers, paired with an optional list of designators.
+data CInit = CInitExpr CExpr
+                       NodeInfo            -- ^ assignment expression
+           | CInitList CInitList
+                       NodeInfo            -- ^ initialization list (see 'CInitList')
+             deriving (Data,Typeable {-! CNode !-})
+
+-- | Initializer List
+--
+-- The members of an initializer list are of the form @(designator-list,initializer)@.
+-- @designator-list@ is allowed to be empty - in this case the initializer refers to the
+-- ''next'' member of the compound type (see C99 6.7.8).
+--
+-- Examples (simplified expressions and identifiers):
+--
+-- > -- { [0], [3] = 4, [2] = 5, 8 }
+-- > let init1 = ([CArrDesig 0, CArrDesig 3], CInitExpr 4)
+-- >     init2 = ([CArrDesig 2], CInitExpr 5)
+-- >     init3 = ([], CInitExpr 8)
+-- > in  CInitList [init1, init2, init3]
+--
+-- > -- { .s = { {2,3} , .a = { 1 } } }
+-- > let init_1  = [ ([], CInitExpr 1) ]
+-- >     init_23 = zip (repeat []) [CInitExpr 2, CInitExpr 3]
+-- >     init_s_1 = ([], CInitList init_23)
+-- >     init_s_a = ([CMemberDesig "a"], CInitList init_1)
+-- >     init_s  = ((CMemberDesig "s"), CInitList [init_s_1,init_s_a])
+-- > in  CInitList [init_s]
+type CInitList = [([CDesignator], CInit)]
+
+-- | Designators
+--
+-- A designator specifies a member of an object, either an element or range of an array,
+-- or the named member of a struct \/ union.
+data CDesignator = CArrDesig     CExpr
+                                 NodeInfo  -- ^ array position designator
+                 | CMemberDesig  Ident
+                                 NodeInfo  -- ^ member designator
+                 | CRangeDesig   CExpr
+                                 CExpr
+                                 NodeInfo  -- ^ array range designator @CRangeDesig from to _@ (GNU C)
+                   deriving (Data,Typeable {-! CNode !-})
+
+-- | @__attribute__@ annotations
+--
+-- Those are of the form @CAttr attribute-name attribute-parameters@,
+-- and serve as generic properties of some syntax tree elements.
+data CAttr = CAttr Ident [CExpr] NodeInfo
+             deriving (Data,Typeable {-! CNode !-})
+
+-- | C expression (K&R A7)
+--
+-- * these can be arbitrary expression, as the argument of `sizeof' can be
+--   arbitrary, even if appearing in a constant expression
+--
+-- * GNU C extensions: @alignof@, @__real@, @__imag@, @({ stmt-expr })@, @&& label@ and built-ins
+--
+data CExpr = CComma       [CExpr]       -- comma expression list, n >= 2
+                          NodeInfo
+           | CAssign      CAssignOp     -- assignment operator
+                          CExpr         -- l-value
+                          CExpr         -- r-value
+                          NodeInfo
+           | CCond        CExpr         -- conditional
+                   (Maybe CExpr)        -- true-expression (GNU allows omitting)
+                          CExpr         -- false-expression
+                          NodeInfo
+           | CBinary      CBinaryOp     -- binary operator
+                          CExpr         -- lhs
+                          CExpr         -- rhs
+                          NodeInfo
+           | CCast        CDecl         -- type name
+                          CExpr
+                          NodeInfo
+           | CUnary       CUnaryOp      -- unary operator
+                          CExpr
+                          NodeInfo
+           | CSizeofExpr  CExpr
+                          NodeInfo
+           | CSizeofType  CDecl         -- type name
+                          NodeInfo
+           | CAlignofExpr CExpr
+                          NodeInfo
+           | CAlignofType CDecl         -- type name
+                          NodeInfo
+           | CComplexReal CExpr         -- real part of complex number
+                          NodeInfo
+           | CComplexImag CExpr         -- imaginary part of complex number
+                          NodeInfo
+           | CIndex       CExpr         -- array
+                          CExpr         -- index
+                          NodeInfo
+           | CCall        CExpr         -- function
+                          [CExpr]       -- arguments
+                          NodeInfo
+           | CMember      CExpr         -- structure
+                          Ident         -- member name
+                          Bool          -- deref structure? (True for `->')
+                          NodeInfo
+           | CVar         Ident         -- identifier (incl. enumeration const)
+                          NodeInfo
+           | CConst       CConst        -- ^ integer, character, floating point and string constants
+           | CCompoundLit CDecl
+                          CInitList     -- type name & initialiser list
+                          NodeInfo      -- ^ C99 compound literal
+           | CStatExpr    CStat NodeInfo  -- ^ GNU C compound statement as expr
+           | CLabAddrExpr Ident NodeInfo  -- ^ GNU C address of label
+           | CBuiltinExpr CBuiltin        -- ^ builtin expressions, see 'CBuiltin'
+           deriving (Data,Typeable {-! CNode !-})
+
+
+-- | GNU Builtins, which cannot be typed in C99
+data CBuiltin =
+          CBuiltinVaArg CExpr CDecl NodeInfo            -- ^ @(expr, type)@
+        | CBuiltinOffsetOf CDecl [CDesignator] NodeInfo -- ^ @(type, designator-list)@
+        | CBuiltinTypesCompatible CDecl CDecl NodeInfo  -- ^ @(type,type)@
+        deriving (Data,Typeable {-! CNode !-})
+
+-- | C constant (K&R A2.5 & A7.2)
+data CConst = CIntConst   CInteger NodeInfo
+            | CCharConst  CChar NodeInfo
+            | CFloatConst CFloat NodeInfo
+            | CStrConst   CString NodeInfo
+            deriving (Data,Typeable {-! CNode !-})
+
+-- | Attributed string literals
+data CStrLit = CStrLit CString NodeInfo
+            deriving (Data,Typeable {-! CNode !-})
+
+cstringOfLit :: CStrLit -> CString
+cstringOfLit (CStrLit cstr _) = cstr
+
+-- | Lift a string literal to a C constant
+liftStrLit :: CStrLit -> CConst
+liftStrLit (CStrLit str at) = CStrConst str at
+
+
+
+--------------------------------------------------------
+-- DERIVES GENERATED CODE
+-- DO NOT MODIFY BELOW THIS LINE
+-- CHECKSUM: 1181183062
+
+instance CNode CTranslUnit
+    where nodeInfo (CTranslUnit _ nodeinfo) = nodeinfo
+instance Pos CTranslUnit
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CExtDecl
+    where nodeInfo (CDeclExt d) = nodeInfo d
+          nodeInfo (CFDefExt d) = nodeInfo d
+          nodeInfo (CAsmExt d) = nodeInfo d
+instance Pos CExtDecl
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CFunDef
+    where nodeInfo (CFunDef _ _ _ _ nodeinfo) = nodeinfo
+instance Pos CFunDef
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CDecl
+    where nodeInfo (CDecl _ _ nodeinfo) = nodeinfo
+instance Pos CDecl
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CDeclr
+    where nodeInfo (CDeclr _ _ _ _ nodeinfo) = nodeinfo
+instance Pos CDeclr
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CDerivedDeclr
+    where nodeInfo (CPtrDeclr _ nodeinfo) = nodeinfo
+          nodeInfo (CArrDeclr _ _ nodeinfo) = nodeinfo
+          nodeInfo (CFunDeclr _ _ nodeinfo) = nodeinfo
+instance Pos CDerivedDeclr
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CStat
+    where nodeInfo (CLabel _ _ _ nodeinfo) = nodeinfo
+          nodeInfo (CCase _ _ nodeinfo) = nodeinfo
+          nodeInfo (CCases _ _ _ nodeinfo) = nodeinfo
+          nodeInfo (CDefault _ nodeinfo) = nodeinfo
+          nodeInfo (CExpr _ nodeinfo) = nodeinfo
+          nodeInfo (CCompound _ _ nodeinfo) = nodeinfo
+          nodeInfo (CIf _ _ _ nodeinfo) = nodeinfo
+          nodeInfo (CSwitch _ _ nodeinfo) = nodeinfo
+          nodeInfo (CWhile _ _ _ nodeinfo) = nodeinfo
+          nodeInfo (CFor _ _ _ _ nodeinfo) = nodeinfo
+          nodeInfo (CGoto _ nodeinfo) = nodeinfo
+          nodeInfo (CGotoPtr _ nodeinfo) = nodeinfo
+          nodeInfo (CCont nodeinfo) = nodeinfo
+          nodeInfo (CBreak nodeinfo) = nodeinfo
+          nodeInfo (CReturn _ nodeinfo) = nodeinfo
+          nodeInfo (CAsm _ nodeinfo) = nodeinfo
+instance Pos CStat
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CAsmStmt
+    where nodeInfo (CAsmStmt _ _ _ _ _ nodeinfo) = nodeinfo
+instance Pos CAsmStmt
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CAsmOperand
+    where nodeInfo (CAsmOperand _ _ _ nodeinfo) = nodeinfo
+instance Pos CAsmOperand
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CBlockItem
+    where nodeInfo (CBlockStmt d) = nodeInfo d
+          nodeInfo (CBlockDecl d) = nodeInfo d
+          nodeInfo (CNestedFunDef d) = nodeInfo d
+instance Pos CBlockItem
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CDeclSpec
+    where nodeInfo (CStorageSpec d) = nodeInfo d
+          nodeInfo (CTypeSpec d) = nodeInfo d
+          nodeInfo (CTypeQual d) = nodeInfo d
+instance Pos CDeclSpec
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CStorageSpec
+    where nodeInfo (CAuto nodeinfo) = nodeinfo
+          nodeInfo (CRegister nodeinfo) = nodeinfo
+          nodeInfo (CStatic nodeinfo) = nodeinfo
+          nodeInfo (CExtern nodeinfo) = nodeinfo
+          nodeInfo (CTypedef nodeinfo) = nodeinfo
+          nodeInfo (CThread nodeinfo) = nodeinfo
+instance Pos CStorageSpec
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CTypeSpec
+    where nodeInfo (CVoidType nodeinfo) = nodeinfo
+          nodeInfo (CCharType nodeinfo) = nodeinfo
+          nodeInfo (CShortType nodeinfo) = nodeinfo
+          nodeInfo (CIntType nodeinfo) = nodeinfo
+          nodeInfo (CLongType nodeinfo) = nodeinfo
+          nodeInfo (CFloatType nodeinfo) = nodeinfo
+          nodeInfo (CDoubleType nodeinfo) = nodeinfo
+          nodeInfo (CSignedType nodeinfo) = nodeinfo
+          nodeInfo (CUnsigType nodeinfo) = nodeinfo
+          nodeInfo (CBoolType nodeinfo) = nodeinfo
+          nodeInfo (CComplexType nodeinfo) = nodeinfo
+          nodeInfo (CSUType _ nodeinfo) = nodeinfo
+          nodeInfo (CEnumType _ nodeinfo) = nodeinfo
+          nodeInfo (CTypeDef _ nodeinfo) = nodeinfo
+          nodeInfo (CTypeOfExpr _ nodeinfo) = nodeinfo
+          nodeInfo (CTypeOfType _ nodeinfo) = nodeinfo
+instance Pos CTypeSpec
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CTypeQual
+    where nodeInfo (CConstQual nodeinfo) = nodeinfo
+          nodeInfo (CVolatQual nodeinfo) = nodeinfo
+          nodeInfo (CRestrQual nodeinfo) = nodeinfo
+          nodeInfo (CInlineQual nodeinfo) = nodeinfo
+          nodeInfo (CAttrQual d) = nodeInfo d
+instance Pos CTypeQual
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CStructUnion
+    where nodeInfo (CStruct _ _ _ _ nodeinfo) = nodeinfo
+instance Pos CStructUnion
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CEnum
+    where nodeInfo (CEnum _ _ _ nodeinfo) = nodeinfo
+instance Pos CEnum
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CInit
+    where nodeInfo (CInitExpr _ nodeinfo) = nodeinfo
+          nodeInfo (CInitList _ nodeinfo) = nodeinfo
+instance Pos CInit
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CDesignator
+    where nodeInfo (CArrDesig _ nodeinfo) = nodeinfo
+          nodeInfo (CMemberDesig _ nodeinfo) = nodeinfo
+          nodeInfo (CRangeDesig _ _ nodeinfo) = nodeinfo
+instance Pos CDesignator
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CAttr
+    where nodeInfo (CAttr _ _ nodeinfo) = nodeinfo
+instance Pos CAttr
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CExpr
+    where nodeInfo (CComma _ nodeinfo) = nodeinfo
+          nodeInfo (CAssign _ _ _ nodeinfo) = nodeinfo
+          nodeInfo (CCond _ _ _ nodeinfo) = nodeinfo
+          nodeInfo (CBinary _ _ _ nodeinfo) = nodeinfo
+          nodeInfo (CCast _ _ nodeinfo) = nodeinfo
+          nodeInfo (CUnary _ _ nodeinfo) = nodeinfo
+          nodeInfo (CSizeofExpr _ nodeinfo) = nodeinfo
+          nodeInfo (CSizeofType _ nodeinfo) = nodeinfo
+          nodeInfo (CAlignofExpr _ nodeinfo) = nodeinfo
+          nodeInfo (CAlignofType _ nodeinfo) = nodeinfo
+          nodeInfo (CComplexReal _ nodeinfo) = nodeinfo
+          nodeInfo (CComplexImag _ nodeinfo) = nodeinfo
+          nodeInfo (CIndex _ _ nodeinfo) = nodeinfo
+          nodeInfo (CCall _ _ nodeinfo) = nodeinfo
+          nodeInfo (CMember _ _ _ nodeinfo) = nodeinfo
+          nodeInfo (CVar _ nodeinfo) = nodeinfo
+          nodeInfo (CConst d) = nodeInfo d
+          nodeInfo (CCompoundLit _ _ nodeinfo) = nodeinfo
+          nodeInfo (CStatExpr _ nodeinfo) = nodeinfo
+          nodeInfo (CLabAddrExpr _ nodeinfo) = nodeinfo
+          nodeInfo (CBuiltinExpr d) = nodeInfo d
+instance Pos CExpr
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CBuiltin
+    where nodeInfo (CBuiltinVaArg _ _ nodeinfo) = nodeinfo
+          nodeInfo (CBuiltinOffsetOf _ _ nodeinfo) = nodeinfo
+          nodeInfo (CBuiltinTypesCompatible _ _ nodeinfo) = nodeinfo
+instance Pos CBuiltin
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CConst
+    where nodeInfo (CIntConst _ nodeinfo) = nodeinfo
+          nodeInfo (CCharConst _ nodeinfo) = nodeinfo
+          nodeInfo (CFloatConst _ nodeinfo) = nodeinfo
+          nodeInfo (CStrConst _ nodeinfo) = nodeinfo
+instance Pos CConst
+    where posOf x = posOfNode (nodeInfo x)
+
+instance CNode CStrLit
+    where nodeInfo (CStrLit _ nodeinfo) = nodeinfo
+instance Pos CStrLit
+    where posOf x = posOfNode (nodeInfo x)
diff --git a/src/Language/C/Syntax/Constants.hs b/src/Language/C/Syntax/Constants.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Syntax/Constants.hs
@@ -0,0 +1,281 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Syntax.Constants
+-- Copyright   :  (c) 2007..2008 Duncan Coutts, Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  : benedikt.huber@gmail.com
+-- Stability   : experimental
+-- Portability : ghc
+--
+-- This module provides support for representing, checking and exporting c
+-- constants, i.e. integral, float, character and string constants.
+-----------------------------------------------------------------------------
+module Language.C.Syntax.Constants (
+  -- * Utilities
+  escapeChar, unescapeChar, unescapeString,
+  Flags(..), noFlags, setFlag, clearFlag, testFlag,
+  -- * C char constants (and multi-character character constants)
+  cChar, cChar_w, cChars, CChar(..), getCChar, getCCharAsInt, isWideChar, showCharConst,
+  -- * C integral constants
+  CIntFlag(..), CIntRepr(..), cInteger, CInteger(..), getCInteger,readCInteger,
+  -- * C floating point constants
+  cFloat,  CFloat(..), readCFloat,
+  -- * C string literals
+  cString, cString_w, CString(..), getCString, showStringLit, concatCStrings,
+)
+where
+import Data.Bits
+import Data.Char
+import Numeric (showOct, showHex, readHex, readOct, readDec)
+import Language.C.Data.Node
+import Language.C.Data.Position
+import Data.Generics
+
+-- | C char constants (abstract)
+data CChar = CChar
+              {-# UNPACK #-} !Char
+              {-# UNPACK #-} !Bool  -- wide flag
+           | CChars
+                              [Char] -- multi-character character constant
+              {-# UNPACK #-} !Bool   -- wide flag
+           deriving (Eq,Ord,Data,Typeable)
+
+instance Show CChar where
+    showsPrec _ (CChar c wideflag)   = _showWideFlag wideflag . showCharConst c
+    showsPrec _ (CChars cs wideflag) = _showWideFlag wideflag . (sQuote $ concatMap escapeCChar cs)
+
+-- | @showCharConst c@ prepends _a_ String representing the C char constant corresponding to @c@.
+-- If neccessary uses octal or hexadecimal escape sequences.
+showCharConst :: Char -> ShowS
+showCharConst c = sQuote $ escapeCChar c
+
+_showWideFlag :: Bool -> ShowS
+_showWideFlag flag = if flag then showString "L" else id
+
+-- | get the haskell representation of a char constant
+getCChar :: CChar -> [Char]
+getCChar (CChar  c _)   = [c]
+getCChar (CChars  cs _) = cs
+
+-- | get integer value of a C char constant
+-- undefined result for multi-char char constants
+getCCharAsInt :: CChar -> Integer
+getCCharAsInt (CChar c _) = fromIntegral (fromEnum c)
+getCCharAsInt (CChars _cs _) = error "integer value of multi-character character constants is implementation defined"
+
+-- | return @true@ if the character constant is /wide/.
+isWideChar :: CChar -> Bool
+isWideChar (CChar _ wideFlag) = wideFlag
+isWideChar (CChars _ wideFlag) = wideFlag
+
+-- | construct a character constant from a haskell 'Char'
+-- Use 'cchar_w' if you want a wide character constant.
+cChar :: Char -> CChar
+cChar c = CChar c False
+
+-- | construct a wide chararacter constant
+cChar_w :: Char -> CChar
+cChar_w c = CChar c True
+
+-- | create a multi-character character constant
+cChars :: [Char] -> Bool -> CChar
+cChars = CChars
+
+-- | datatype for memorizing the representation of an integer
+data CIntRepr = DecRepr | HexRepr | OctalRepr deriving (Eq,Ord,Enum,Bounded,Data,Typeable)
+
+-- | datatype representing type flags for integers
+data CIntFlag = FlagUnsigned | FlagLong | FlagLongLong | FlagImag deriving (Eq,Ord,Enum,Bounded,Data,Typeable)
+instance Show CIntFlag where
+    show FlagUnsigned = "u"
+    show FlagLong = "L"
+    show FlagLongLong = "LL"
+    show FlagImag = "i"
+
+{-# SPECIALIZE setFlag :: CIntFlag -> Flags CIntFlag -> Flags CIntFlag #-}
+{-# SPECIALIZE clearFlag :: CIntFlag -> Flags CIntFlag -> Flags CIntFlag #-}
+{-# SPECIALIZE testFlag :: CIntFlag -> Flags CIntFlag -> Bool #-}
+
+data CInteger = CInteger
+                 {-# UNPACK #-} !Integer
+                 {-# UNPACK #-} !CIntRepr
+                 {-# UNPACK #-} !(Flags CIntFlag)  -- integer flags
+                 deriving (Eq,Ord,Data,Typeable)
+instance Show CInteger where
+    showsPrec _ (CInteger i repr flags) = showInt i . showString (concatMap showIFlag [FlagUnsigned .. ]) where
+        showIFlag f = if testFlag f flags then show f else []
+        showInt i = case repr of DecRepr -> shows i
+                                 OctalRepr -> showString "0" . showOct i
+                                 HexRepr -> showString "0x" . showHex i
+
+-- To be used in the lexer
+-- Note that the flag lexer won't scale
+readCInteger :: CIntRepr -> String -> Either String CInteger
+readCInteger repr str =
+  case readNum str of
+    [(n,suffix)] -> mkCInt n suffix
+    parseFailed  -> Left $ "Bad Integer literal: "++show parseFailed
+  where
+    readNum = case repr of DecRepr -> readDec; HexRepr -> readHex; OctalRepr -> readOct
+    mkCInt n suffix = either Left (Right . CInteger n (repr' str))  $ readSuffix suffix
+    repr' ('0':[]) = DecRepr -- hacking away lexer bug
+    repr' _ = repr
+    readSuffix = parseFlags noFlags
+    parseFlags flags [] = Right flags
+    parseFlags flags ('l':'l':fs) = parseFlags (setFlag FlagLongLong flags) fs
+    parseFlags flags ('L':'L':fs) = parseFlags (setFlag FlagLongLong flags) fs
+    parseFlags flags (f:fs) =
+      let go1 flag = parseFlags (setFlag flag flags) fs in
+      case f of
+        'l' -> go1 FlagLong ; 'L' -> go1 FlagLong
+        'u' -> go1 FlagUnsigned ; 'U' -> go1 FlagUnsigned
+        'i' -> go1 FlagImag ; 'I' -> go1 FlagImag; 'j' -> go1 FlagImag; 'J' -> go1 FlagImag
+        _ -> Left $ "Unexpected flag " ++ show f
+
+getCInteger :: CInteger -> Integer
+getCInteger (CInteger i _ _) = i
+
+-- | construct a integer constant (without type flags) from a haskell integer
+cInteger :: Integer -> CInteger
+cInteger i = CInteger i DecRepr noFlags
+
+
+-- | Floats (represented as strings)
+data CFloat = CFloat
+                {-# UNPACK #-} !String
+                 deriving (Eq,Ord,Data,Typeable)
+instance Show CFloat where
+  showsPrec _ (CFloat internal) = showString internal
+
+cFloat :: Float -> CFloat
+cFloat = CFloat . show
+
+-- dummy implementation
+readCFloat :: String -> CFloat
+readCFloat = CFloat
+
+-- | C String literals
+data CString = CString
+                [Char]    -- characters
+                Bool      -- wide flag
+                deriving (Eq,Ord,Data,Typeable)
+instance Show CString where
+    showsPrec _ (CString str wideflag) = _showWideFlag wideflag . showStringLit str
+
+-- construction
+cString :: String -> CString
+cString str = CString str False
+cString_w :: String -> CString
+cString_w str = CString str True
+
+-- selectors
+getCString :: CString -> String
+getCString (CString str _) = str
+isWideString :: CString -> Bool
+isWideString (CString _ wideflag) = wideflag
+
+-- | concatenate a list of C string literals
+concatCStrings :: [CString] -> CString
+concatCStrings cs = CString (concatMap getCString cs) (any isWideString cs)
+
+-- | @showStringLiteral s@ prepends a String representing the C string literal corresponding to @s@.
+-- If neccessary it uses octal or hexadecimal escape sequences.
+showStringLit :: String -> ShowS
+showStringLit = dQuote . concatMap showStringChar
+  where
+  showStringChar c | isSChar c = return c
+                     | c == '"'  = "\\\""
+                     | otherwise = escapeChar c
+
+
+
+-- | @isAsciiSourceChar b@ returns @True@ if the given character is a character which
+--   may appear in a ASCII C source file and is printable.
+isAsciiSourceChar :: Char -> Bool
+isAsciiSourceChar c = isAscii c && isPrint c
+
+-- | @isCChar c@ returns true, if c is a source character which does not have to be escaped in
+--   C char constants (C99: 6.4.4.4)
+isCChar :: Char -> Bool
+isCChar '\\' = False
+isCChar '\'' = False
+isCChar '\n' = False
+isCChar c = isAsciiSourceChar c
+
+-- | @escapeCChar c@ escapes c for use in a char constant
+escapeCChar :: Char -> String
+escapeCChar '\'' = "\\'"
+escapeCChar c | isCChar c = [c]
+              | otherwise = escapeChar c
+
+-- | @isSChar c@ returns true if c is a source character which does not have to be escaped in C string
+--  literals (C99: 6.4.5)
+isSChar :: Char -> Bool
+isSChar '\\' = False
+isSChar '\"' = False
+isSChar '\n' = False
+isSChar c = isAsciiSourceChar c
+
+escapeChar :: Char -> String
+escapeChar '\\' = "\\\\"
+escapeChar '\a' = "\\a"
+escapeChar '\b' = "\\b"
+escapeChar '\ESC' = "\\e";
+escapeChar '\f' = "\\f"
+escapeChar '\n' = "\\n"
+escapeChar '\r' = "\\r"
+escapeChar '\t' = "\\t"
+escapeChar '\v' = "\\v"
+escapeChar c  | (ord c) < 512   = '\\' : showOct (ord c) ""
+              | otherwise       = '\\' : 'x'  : showHex (ord c) ""
+
+unescapeChar :: String -> (Char, String)
+unescapeChar ('\\':c:cs)  = case c of
+       'n'  -> ('\n', cs)
+       't'  -> ('\t', cs)
+       'v'  -> ('\v', cs)
+       'b'  -> ('\b', cs)
+       'r'  -> ('\r', cs)
+       'f'  -> ('\f', cs)
+       'a'  -> ('\a', cs)
+       'e'  -> ('\ESC', cs)  -- GNU extension
+       'E'  -> ('\ESC', cs)  -- GNU extension
+       '\\' -> ('\\', cs)
+       '?'  -> ('?', cs)
+       '\'' -> ('\'', cs)
+       '"'  -> ('"', cs)
+       'x'  -> case head' "bad escape sequence" (readHex cs) of
+                 (i, cs') -> (toEnum i, cs')
+       _    -> case head' "bad escape sequence" (readOct (c:cs)) of
+                 (i, cs') -> (toEnum i, cs')
+unescapeChar (c   :cs)    = (c, cs)
+unescapeChar []  = error $ "unescape char: empty string"
+
+unescapeString :: String -> String
+unescapeString [] = []
+unescapeString cs = case unescapeChar cs of
+                        (c, cs') -> c : unescapeString cs'
+
+-- helpers
+sQuote :: String -> ShowS
+sQuote s t = "'" ++ s ++ "'" ++ t
+dQuote :: String -> ShowS
+dQuote s t = ('"' : s) ++ "\"" ++ t
+head' :: String -> [a] -> a
+head' err []  = error err
+head' _ (x:_) = x
+
+-- TODO: Move to seperate file ?
+newtype Flags f = Flags Integer deriving (Eq,Ord,Data,Typeable)
+noFlags :: Flags f
+noFlags = Flags 0
+setFlag :: (Enum f) => f -> Flags f -> Flags f
+setFlag flag (Flags k)   = Flags$ k  `setBit` fromEnum flag
+clearFlag :: (Enum f) => f -> Flags f -> Flags f
+clearFlag flag (Flags k) = Flags$ k `clearBit` fromEnum flag
+testFlag :: (Enum f) => f -> Flags f -> Bool
+testFlag flag (Flags k)  = k `testBit` fromEnum flag
+
+
+
diff --git a/src/Language/C/Syntax/Ops.hs b/src/Language/C/Syntax/Ops.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Syntax/Ops.hs
@@ -0,0 +1,113 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Syntax.Ops
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  : benedikt.huber@gmail.com
+-- Stability   : experimental
+-- Portability : ghc
+--
+-- Unary, binary and asssignment operators. Exported via AST.
+-----------------------------------------------------------------------------
+module Language.C.Syntax.Ops (
+-- * Assignment operators
+CAssignOp(..),
+-- * Unary operators
+CUnaryOp(..),
+-- * Binary operators
+CBinaryOp(..),
+)
+where
+import Data.Generics
+-- | C assignment operators (K&R A7.17)
+data CAssignOp = CAssignOp
+               | CMulAssOp
+               | CDivAssOp
+               | CRmdAssOp              -- ^ remainder and assignment
+               | CAddAssOp
+               | CSubAssOp
+               | CShlAssOp
+               | CShrAssOp
+               | CAndAssOp
+               | CXorAssOp
+               | COrAssOp
+               deriving (Eq, Ord,Data,Typeable)
+instance Show CAssignOp where
+  show CAssignOp = "="
+  show CMulAssOp = "*="
+  show CDivAssOp = "/="
+  show CRmdAssOp = "%="
+  show CAddAssOp = "+="
+  show CSubAssOp = "-="
+  show CShlAssOp = "<<="
+  show CShrAssOp = ">>="
+  show CAndAssOp = "&="
+  show CXorAssOp = "^="
+  show COrAssOp  = "|="
+
+-- | C binary operators (K&R A7.6-15)
+--
+data CBinaryOp = CMulOp
+               | CDivOp
+               | CRmdOp                 -- ^ remainder of division
+               | CAddOp
+               | CSubOp
+               | CShlOp                 -- ^ shift left
+               | CShrOp                 -- ^ shift right
+               | CLeOp                  -- ^ less
+               | CGrOp                  -- ^ greater
+               | CLeqOp                 -- ^ less or equal
+               | CGeqOp                 -- ^ greater or equal
+               | CEqOp                  -- ^ equal
+               | CNeqOp                 -- ^ not equal
+               | CAndOp                 -- ^ bitwise and
+               | CXorOp                 -- ^ exclusive bitwise or
+               | COrOp                  -- ^ inclusive bitwise or
+               | CLndOp                 -- ^ logical and
+               | CLorOp                 -- ^ logical or
+               deriving (Eq,Ord,Data,Typeable)
+instance Show CBinaryOp where
+  show CMulOp = "*"
+  show CDivOp = "/"
+  show CRmdOp = "%"
+  show CAddOp = "+"
+  show CSubOp = "-"
+  show CShlOp = "<<"
+  show CShrOp = ">>"
+  show CLeOp  = "<"
+  show CGrOp  = ">"
+  show CLeqOp = "<="
+  show CGeqOp = ">="
+  show CEqOp  = "=="
+  show CNeqOp = "!="
+  show CAndOp = "&"
+  show CXorOp = "^"
+  show COrOp  = "|"
+  show CLndOp = "&&"
+  show CLorOp = "||"
+
+-- | C unary operator (K&R A7.3-4)
+--
+data CUnaryOp = CPreIncOp               -- ^ prefix increment operator
+              | CPreDecOp               -- ^ prefix decrement operator
+              | CPostIncOp              -- ^ postfix increment operator
+              | CPostDecOp              -- ^ postfix decrement operator
+              | CAdrOp                  -- ^ address operator
+              | CIndOp                  -- ^ indirection operator
+              | CPlusOp                 -- ^ prefix plus
+              | CMinOp                  -- ^ prefix minus
+              | CCompOp                 -- ^ one's complement
+              | CNegOp                  -- ^ logical negation
+              deriving (Eq,Ord,Data,Typeable)
+instance Show CUnaryOp where
+  show CPreIncOp  = "++"
+  show CPreDecOp  = "--"
+  show CPostIncOp = "++"
+  show CPostDecOp = "--"
+  show CAdrOp     = "&"
+  show CIndOp     = "*"
+  show CPlusOp    = "+"
+  show CMinOp     = "-"
+  show CCompOp    = "~"
+  show CNegOp     = "!"
diff --git a/src/Language/C/System/GCC.hs b/src/Language/C/System/GCC.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/System/GCC.hs
@@ -0,0 +1,106 @@
+{-# LANGUAGE PatternGuards #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.System.Gcc
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  experimental
+-- Portability :  portable
+--
+-- Invoking gcc for preprocessing and compiling.
+-----------------------------------------------------------------------------
+module Language.C.System.GCC (
+    GCC,newGCC,
+)
+where
+import Language.C.Data.RList as RList
+import Language.C.System.Preprocess
+import Data.Maybe
+import System.Cmd
+import System.Directory
+import Data.List
+
+-- | @GCC@ represents a reference to the gcc compiler
+newtype GCC = GCC { gccPath :: FilePath }
+
+-- | create a reference to @gcc@
+newGCC :: FilePath -> GCC
+newGCC = GCC
+
+instance Preprocessor GCC where
+    parseCPPArgs _ = gccParseCPPArgs
+    runCPP gcc cpp_args =
+        do  -- copy the input to the outputfile, because in case the input is preprocessed,
+            -- gcc -E will do nothing.
+            maybe (return()) (copyFile (inputFile cpp_args)) (outputFile cpp_args)
+            rawSystem (gccPath gcc) (buildCppArgs cpp_args)
+
+-- | Parse arguments for preprocessing via GCC.
+--   At least one .c, .hc or .h file has to be present.
+--   For now we only support the most important gcc options.
+--
+--   1) Parse all flags relevant to CppArgs
+--   2) Move -c,-S,-M? to other_args
+--   3) Strip -E
+--   4) The rest goes into extra_args
+gccParseCPPArgs :: [String] -> Either String (CppArgs, [String])
+gccParseCPPArgs args =
+    case mungeArgs ((Nothing,Nothing,RList.empty),(RList.empty,RList.empty)) args of
+        Left err                   -> Left err
+        Right ((Nothing,_,_),_)  -> Left "No .c / .hc / .h source file given"
+        Right ((Just input_file,output_file_opt,cpp_opts),(extra_args,other_args))
+            -> Right ((rawCppArgs (RList.reverse extra_args) input_file)
+                      { outputFile = output_file_opt, cppOptions = RList.reverse cpp_opts },
+                      RList.reverse other_args)
+    where
+    mungeArgs :: ParseArgsState -> [String] -> Either String ParseArgsState
+    mungeArgs parsed@( cpp_args@(inp,out,cpp_opts),
+                          unparsed@(extra,other))
+              unparsed_args =
+        case unparsed_args of
+            ("-E":rest) -> mungeArgs parsed rest
+
+            (flag:rest) |  flag == "-c"
+                        || flag == "-S"
+                        || "-M" `isPrefixOf` flag
+                        -> mungeArgs (cpp_args,(extra,other `snoc` flag)) rest
+
+            ("-o":file:rest)   | isJust out -> Left "two output files given"
+                               | otherwise          -> mungeArgs ((inp,Just file,cpp_opts),unparsed) rest
+
+            (cpp_opt:rest)     | Just (opt,rest') <- getArgOpt cpp_opt rest
+                               -> mungeArgs ((inp,out,cpp_opts `snoc` opt),unparsed) rest'
+
+            (cfile:rest)       | any (flip isSuffixOf cfile) (words ".c .hc .h")
+                               -> if isJust inp
+                                   then Left "two input files given"
+                                   else mungeArgs ((Just cfile,out,cpp_opts),unparsed) rest
+
+            (unknown:rest)     -> mungeArgs (cpp_args,(extra `snoc` unknown,other)) rest
+
+            []                 -> Right parsed
+
+    getArgOpt cpp_opt rest | "-I" `isPrefixOf` cpp_opt = Just (IncludeDir (drop 2 cpp_opt),rest)
+                           | "-U" `isPrefixOf` cpp_opt = Just (Undefine (drop 2 cpp_opt),rest)
+                           | "-D" `isPrefixOf` cpp_opt = Just (getDefine (drop 2 cpp_opt),rest)
+    getArgOpt "-include" (f:rest')                     = Just (IncludeFile f, rest')
+    getArgOpt _ _ = Nothing
+    getDefine opt = let (key,val) = break (== '=') opt in Define key (if null val then "" else tail val)
+
+type ParseArgsState = ((Maybe FilePath, Maybe FilePath, RList CppOption), (RList String, RList String))
+
+
+buildCppArgs :: CppArgs -> [String]
+buildCppArgs (CppArgs options extra_args _tmpdir input_file output_file_opt) = do
+       (concatMap tOption options)
+    ++ outputFileOpt
+    ++ ["-E", input_file]
+    ++ extra_args
+    where
+    tOption (IncludeDir incl)  = ["-I",incl]
+    tOption (Define key value) = [ "-D" ++ key ++ (if null value then "" else "=" ++ value) ]
+    tOption (Undefine key)     = [ "-U" ++ key ]
+    tOption (IncludeFile f)    = [ "-include", f]
+    outputFileOpt = concat [ ["-o",output_file] | output_file <- maybeToList output_file_opt ]
+
diff --git a/src/Language/C/System/Preprocess.hs b/src/Language/C/System/Preprocess.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/System/Preprocess.hs
@@ -0,0 +1,119 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Language.C.Wrapper.Preprocess
+-- Copyright   :  (c) 2008 Benedikt Huber
+-- License     :  BSD-style
+-- Maintainer  :  benedikt.huber@gmail.com
+-- Stability   :  experimental
+-- Portability :  portable
+--
+-- Invoking external preprocessors.
+-----------------------------------------------------------------------------
+module Language.C.System.Preprocess (
+    Preprocessor(..),
+    CppOption(..),
+    CppArgs(..),rawCppArgs,addCppOption,addExtraOption,
+    runPreprocessor,
+    isPreprocessed,
+)
+where
+import Language.C.Data.InputStream
+import System.Exit
+import System.Directory
+import System.FilePath
+import System.Environment
+import System.IO
+import Control.Exception
+import Control.Monad
+import Data.List
+
+-- | 'Preprocessor' encapsulates the abstract interface for invoking C preprocessors
+class Preprocessor cpp where
+    -- | parse the given command line arguments, and return a pair of parsed and ignored arguments
+    parseCPPArgs :: cpp -> [String] -> Either String (CppArgs, [String])
+    -- | run the preprocessor
+    runCPP :: cpp -> CppArgs -> IO ExitCode
+
+-- | file extension of a preprocessed file
+preprocessedExt :: String
+preprocessedExt = ".i"
+
+-- | Generic Options for the preprocessor
+data CppOption =
+        IncludeDir FilePath
+      | Define String String
+      | Undefine String
+      | IncludeFile FilePath
+
+-- | Generic arguments for the preprocessor
+data CppArgs = CppArgs {
+        cppOptions :: [CppOption],
+        extraOptions :: [String],
+        cppTmpDir  :: Maybe FilePath,
+        inputFile  :: FilePath,
+        outputFile :: Maybe FilePath
+    }
+
+-- | use the given preprocessor arguments without analyzing them
+rawCppArgs :: [String] -> FilePath -> CppArgs
+rawCppArgs opts input_file =
+    CppArgs { inputFile = input_file, cppOptions = [], extraOptions = opts, outputFile = Nothing, cppTmpDir = Nothing }
+
+-- | add a typed option to the given preprocessor arguments
+addCppOption :: CppArgs -> CppOption -> CppArgs
+addCppOption cpp_args opt =
+    cpp_args { cppOptions = opt : (cppOptions cpp_args) }
+
+-- | add a string option to the given preprocessor arguments
+addExtraOption :: CppArgs -> String -> CppArgs
+addExtraOption cpp_args extra =
+    cpp_args { extraOptions = extra : (extraOptions cpp_args) }
+
+-- | run the preprocessor and return an 'InputStream' if preprocesssing succeeded
+runPreprocessor :: (Preprocessor cpp) => cpp -> CppArgs -> IO (Either ExitCode InputStream)
+runPreprocessor cpp cpp_args = do
+    bracket
+        getActualOutFile
+        -- remove outfile if it was temporary
+        removeTmpOutFile
+        -- invoke preprocessor
+        invokeCpp
+    where
+    getActualOutFile :: IO FilePath
+    getActualOutFile = maybe (mkOutputFile (cppTmpDir cpp_args) (inputFile cpp_args)) return (outputFile cpp_args)
+    invokeCpp actual_out_file = do
+        exit_code <- runCPP cpp (cpp_args { outputFile = Just actual_out_file})
+        case exit_code of
+            ExitSuccess   -> liftM Right (readInputStream actual_out_file)
+            ExitFailure _ -> return $ Left exit_code
+    removeTmpOutFile out_file = maybe (removeFile out_file) (\_ -> return ()) (outputFile cpp_args)
+
+-- | create an output file, given  @Maybe tmpdir@ and @inputfile@
+mkOutputFile :: Maybe FilePath -> FilePath -> IO FilePath
+mkOutputFile tmp_dir_opt input_file =
+    do tmpDir <- getTempDir tmp_dir_opt
+       mkTmpFile tmpDir (getOutputFileName input_file)
+    where
+    getTempDir (Just tmpdir) = return tmpdir
+    getTempDir Nothing       = getTemporaryDirectory
+
+-- | compute output file name from input file name
+getOutputFileName :: FilePath -> FilePath
+getOutputFileName fp | hasExtension fp = replaceExtension filename preprocessedExt
+                     | otherwise       = addExtension filename preprocessedExt
+    where
+    filename = takeFileName fp
+
+-- | create a temporary file
+mkTmpFile :: FilePath -> FilePath -> IO FilePath
+mkTmpFile tmp_dir file_templ = do
+    -- putStrLn $ "TmpDir: "++tmp_dir
+    -- putStrLn $ "FileTempl: "++file_templ
+    (path,file_handle) <- openTempFile tmp_dir file_templ
+    hClose file_handle
+    return path
+
+-- | guess whether a file is preprocessed (file end with .i)
+isPreprocessed :: FilePath -> Bool
+isPreprocessed = (".i" `isSuffixOf`)
+
