diff --git a/AUTHORS b/AUTHORS
--- a/AUTHORS
+++ b/AUTHORS
@@ -7,6 +7,7 @@
 
 Iavor Diatchki          <iavor.diatchki@gmail.com>
 Kevin Charter           <kcharter@gmail.com>
+Aleksey Kliger
 
 This project originated from the C parser component of c2hs,
 for many additional contributors see AUTHORS.c2hs.
diff --git a/ChangeLog b/ChangeLog
deleted file mode 100644
--- a/ChangeLog
+++ /dev/null
@@ -1,53 +0,0 @@
-Changes 0.3.1.1 - 0.3.2 (Bug fix release)
-==========================================================================
-  * Add UNPACK pragma for Ident
-  * Allow '\r' at the end of line pragmas
-  * Fix bug '0 is lexed as octal integer constant'
-  * Fix pretty-printing of if-then-else
-
-	* API Changes (hdiff)
-		= Language.C.Analysis.TravMonad
-			+ travErrors :: TravState s -> [CError]
-
-Changes 0.3.1 - 0.3.1.1 (Bug fix release)
-==========================================================================
-  * Fix cabal file for compilation with GHC 6.10.1 (Aaron Tomb)
-  * Fix bug #22: Set file permission after copying input (thanks to Kevin Charter for reporting this bug)
-  * Fix bug #21: typedef can have more than one declarator (thanks to bkomuves for reporting this bug)
-  * Fix bug #18: adjustPos (change to line of another file) should set column offset to one
-  * Enhancement: add 'parseCFilePre' to module Language.C
-  * Enhancement: Add initPos and adjustPos to Data.Position
-
-Changes 0.3 - 0.3.1
-==========================================================================
-Thu Aug 21 benedikt.huber@gmail.com
-  * add aliases for exposed parsers, in order to document them
-
-Fri Aug 15 benedikt.huber@gmail.com
-  * Remove NameMap from Data.Name. We will do this right when neccessary.
-  * Parser public API: expose parsers and the Parser Monad
-  * ParserMonad: Return updated name supply when executing parser
-  * Parser: Expose expression, statement, declaration and file parsers
-  * Data: Add newNameSupply ~ (namesStartingFrom 0)
-
-Thu Aug 14 17:13:29 CEST 2008  iavor.diatchki@gmail.com
-  * Add a utility function to create a "blank" set of cpp arguments.
-  * Make that analysis traversal monad abstract.
-  * Export the type synonym "Register" (and bump version)
-
-Wed Aug 13 12:00:57 CEST 2008  benedikt.huber@gmail.com
-  * add Data.Position: internalIdentAt
-
-
-Old Changes
-==========================================================================
-
-Mon Jun  9 23:12:46 CEST 2008  benedikt.huber@gmail.com
-  * License switched to 3-clause BSD
-  $
--  In accordance with the original authors, Language.C is now licensed as BSD-3.
-   See:
-   http://haskell.org/pipermail/c2hs/2008-June/000833.html
-   http://haskell.org/pipermail/c2hs/2008-June/000834.html
-   http://haskell.org/pipermail/c2hs/2008-June/000835.html
-
diff --git a/ChangeLog.md b/ChangeLog.md
new file mode 100644
--- /dev/null
+++ b/ChangeLog.md
@@ -0,0 +1,210 @@
+# Changelog
+
+## 0.10.2
+
+- Accept C23 `bool` keyword.
+
+## 0.10.1
+
+- Support `0.0f16` syntax.
+
+## 0.10.0
+
+- Support for half-precision floating point `__fp16`, `_Float16`, and `_Float16x`.
+- Support for bfloat16 `__bf16`.
+- Support alignment specifier `_Alignas` in struct declatations.
+
+## 0.9.4
+
+- Support `happy-2.1`.
+
+## 0.9.3
+
+- Add support for `__builtin_bit_cast` to support clang toolchain,
+  enabling builds with GHC 9.4+ on Windows.
+
+## 0.9.2
+
+- Add support for 128 bit builtin integer types
+
+## 0.9.1
+
+- Support parsing an empty list of clobbers after a colon in `asm` statements
+
+## 0.9.0.2
+
+- Correct lower bound on GHC
+
+## 0.9.0.1
+
+- Scrap dependency on syb
+
+Thanks to @vmchale
+
+## 0.9
+
+- Make `Trav` a monad transformer
+- Add `runTravTWithTravState`
+- Tests now use Cabal-3
+- Implement alignment calculation and correct size calculation
+- Add `Show` instance for `Type`
+- Add machine descriptions for x86_64 and armv7l
+- Small correction in output of prettyprinter
+- Allow zeros as line numbers in preprocessed directives
+
+Thanks to @aweinstock314, @ersran9, @expipiplus1, @jkoppel, @trofi and @visq
+
+## Changes since 0.7.0
+
+Wed May 23 07:08:02 2018 +0200
+  * Support IEC 60559 types and literals. Closes #52.
+
+Wed May 16 07:08:15 2018 +0200
+  * introduce flag for optional IEC 60559 type support (see #43)
+
+Wed May 16 06:36:04 2018 +0200
+  * WIP: towards a complete Export (#51)
+
+Thu Feb 22 13:22:50 2018 -0500
+  * [syntax] GHC.Generics.Generic and Control.DeepSeq.NFData instances (#49)
+    (.cabal) drop splitBase flag
+
+Tue Feb 20 08:34:39 2018 +0300
+  * Selectively hide Prelude.<>:  GHC 8.4 compat (#45)
+
+Tue Feb 20 00:09:16 2018 -0500
+  * (Analysis) Minimal support for `__float128` (#47)
+
+Sat Nov 25 08:59:59 2017 +0100
+  * Consider builtin_convertvector from #34 for pretty printing
+
+Sat Nov 25 00:46:33 2017 -0600
+  * add support for `_Float128` (#41)
+
+## Changes since 0.6.0
+
+Mon Jul 31 2017
+  * Improve TypeCheck output (#31)
+
+Sun Jul 30 2017
+  * Add `__float128` (fixes #33)
+
+Mon Maz 22 2017
+  * Support clang’s `__builtin_convertvector` (Fixes #34)
+
+Wed Mar 8 2017
+  * Move file and parent information to new datatype FilePosition for performance reasons
+
+## Changes since 0.5.0
+
+Thu Feb 23 2017
+  * Make gccParseCPPArgs grab the arg to -MF -MT and -MQ
+
+Wed Feb 15 2017
+  * In enums, allow multiple attribute specifiers per enumerator
+
+Tue Feb 21 2017
+  * Allow typedef redefinition if it denotes the same type
+
+Tue Feb 21 2017
+  * Change TypeDefRef to store Type, not Maybe Type
+
+Tue Feb 14 2017
+  * Parse (and ignore) Clang __attribute__((availability(id=major.minor.rev)))
+
+Sun Sep 11 2016
+  * Add `__builtin_bswap32/64`.
+
+Wed Jun 22 2016
+  * Add `_Alignof` to Lexer.x (fixes #7)
+
+Mon Jun 27 2016
+  * Updates for C11 (part 1)
+  * `_Nullable` and `_Nonnull` support as well as Warnings/lint fixes provided by Anthony Cowley (https://github.com/acowley)
+
+Wed Mar 16 2016
+  * Consider storage specifier "ThreadSpec" for global and local declarations
+
+Tue Mar 15 2016
+  * Support C11 `_NoReturn`, genearlize is_inline to FunSpecs (Syntax) / FunAttrs (SemRep)
+
+## Changes since 0.4.3
+
+Wed Mar 2 2016
+  * Add direct base type BaseInt128 (complements previous `__int128` patch)
+    ryan.gl.scott@gmail.com
+
+Sun Feb 28 2016
+  * Parse gcc-specific `__int128` type
+
+Thu Dec 4 2014
+  * Scott Kovach <dskovach@gmail.com>: added derived Eq,Ord instances to NodeInfo
+
+## Changes since 0.4.2
+
+Sat Jan 11 2014
+  * Allow unicode characters in string/char literals and filenames
+
+Mon Oct 27 2014
+  * macos-attributes
+
+Tue Aug 13 2013
+  * Do not derive Error instances for newtypes (type parameter has non-parametric role)
+
+Mon Aug 12 2013
+  * Fix bug caused by applying posFile to nopos (reported by Mikhail Sosonkin)
+
+## Changes since 0.4.1
+
+Tue Mar 19 2013
+  * TypeCheck: Return Left str instead of fail str (do not rely on MonadError instance of Either)
+  * Improve printing of SUERefs and Ident
+
+Thu Feb 28 2013
+  * Fix parsing and printing of octal character escapes.
+
+Tue Jun 12 2012
+  * Export Annotated type class from AST module
+
+Wed Aug 24 2012
+  * Patch for alex-3.0
+
+## Changes 0.3.1 - 0.4.1
+
+Tue Aug 16 2011:
+  * Port to ghc-7.2
+
+Fri Apr 15 2011: Alexander Bernauer <bernauer@inf.ethz.ch>
+  * Show instances (popular request) for AST types, DumpAst demo
+
+## Changes 0.3 - 0.3.1
+
+Thu Aug 21 benedikt.huber@gmail.com
+  * add aliases for exposed parsers, in order to document them
+
+Fri Aug 15 benedikt.huber@gmail.com
+  * Remove NameMap from Data.Name. We will do this right when neccessary.
+  * Parser public API: expose parsers and the Parser Monad
+  * ParserMonad: Return updated name supply when executing parser
+  * Parser: Expose expression, statement, declaration and file parsers
+  * Data: Add newNameSupply ~ (namesStartingFrom 0)
+
+Thu Aug 14 17:13:29 CEST 2008  iavor.diatchki@gmail.com
+  * Add a utility function to create a "blank" set of cpp arguments.
+  * Make that analysis traversal monad abstract.
+  * Export the type synonym "Register" (and bump version)
+
+Wed Aug 13 12:00:57 CEST 2008  benedikt.huber@gmail.com
+  * add Data.Position: internalIdentAt
+
+## Old Changes
+
+Mon Jun  9 23:12:46 CEST 2008  benedikt.huber@gmail.com
+  * License switched to 3-clause BSD
+  $
+-  In accordance with the original authors, Language.C is now licensed as BSD-3.
+   See:
+   http://haskell.org/pipermail/c2hs/2008-June/000833.html
+   http://haskell.org/pipermail/c2hs/2008-June/000834.html
+   http://haskell.org/pipermail/c2hs/2008-June/000835.html
+
diff --git a/README b/README
deleted file mode 100644
--- a/README
+++ /dev/null
@@ -1,34 +0,0 @@
-= Language.C =
-
-Language.C is a parser and pretty-printer framework for C99 and the extensions of gcc.
-
-See http://www.sivity.net/projects/language.c/
-
-== Build and Install ==
-
-cabal install
-
--- or --
-
-runhaskell Setup configure FLAGS
-runhaskell Setup build
-runhaskell Setup install
-
-Provide the set of flags passing
- --flags="<flags-seperated-by-space>"
-to configure.
-
-== Sources ==
-
-see src/README
-
-== Examples ==
-
-A couple of small examples are available in /examples
-
-== Testing ==
-
-A couple of regression tests can be run via
-> cd test/harness; make
-
-For more tests, see test/README.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,46 @@
+# Language.C
+
+Language.C is a parser and pretty-printer framework for C11 and the extensions of gcc.
+
+See http://visq.github.io/language-c/
+
+## C Language Compatibility
+
+language-c has no comprehensive C23 support yet, but supports
+ - the `bool` keyword
+
+Currently unsupported C11 constructs:
+ - static assertion 6.7.10 (`_Static_assert`)
+ - generic selection 6.5.1.1 (`_Generic`)
+ - `_Atomic`, `_Thread_local`
+ - Universal character names
+
+Currently unsupported GNU C extensions:
+ - `__auto_type`
+ - `__builtin_offsetof`
+   `char a[__builtin_offsetof (struct S, sa->f)`
+ - `_Decimal32`
+ - Extended assembler
+   `__asm__ __volatile__ ("" : : : )`;
+   `__asm__ goto ("" : : : : label)`;
+ - `__attribute__((packed))`: types featuring this attribute may have an
+   incorrect size or alignment calculated.
+
+### IEC 60559:
+
+Since `language-c-0.8`, extended floating point types are supported (gcc 7 feature). Package maintainers may decide to disable these types (flag `iecFpExtension`) to work around the fact that the `_Float128` type is redefined by glibc >= 2.26 if gcc < 7 is used for preprocessing:
+
+```
+  /* The type _Float128 exists only since GCC 7.0.  */
+  # if !__GNUC_PREREQ (7, 0) || defined __cplusplus
+  typedef __float128 _Float128;
+  # endif
+```
+
+## Examples
+
+A couple of small examples are available in `examples`.
+
+## Testing
+
+See `test/README`.
diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/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
deleted file mode 100644
--- a/dist/build/Language/C/Parser/Lexer.hs
+++ /dev/null
@@ -1,522 +0,0 @@
-{-# 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"
-#elif defined(__GLASGOW_HASKELL__)
-#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\xfc\xff\xff\xff\x78\x00\x00\x00\x82\x00\x00\x00\xb3\x00\x00\x00\xbd\x00\x00\x00\xee\x00\x00\x00\xf7\x00\x00\x00\x11\x01\x00\x00\x2b\x01\x00\x00\x45\x01\x00\x00\x5f\x01\x00\x00\x79\x01\x00\x00\x69\x01\x00\x00\x83\x01\x00\x00\xd4\x01\x00\x00\x34\x02\x00\x00\x94\x02\x00\x00\xf4\x02\x00\x00\x54\x03\x00\x00\xb4\x03\x00\x00\x12\x04\x00\x00\x5b\x04\x00\x00\x00\x00\x00\x00\xfd\xff\xff\xff\xfe\xff\xff\xff\xa8\xff\xff\xff\x9d\xff\xff\xff\xa4\xff\xff\xff\xab\xff\xff\xff\x9b\xff\xff\xff\x00\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x9c\xff\xff\xff\xa3\xff\xff\xff\xad\xff\xff\xff\xaf\xff\xff\xff\x81\x04\x00\x00\xda\x04\x00\x00\x31\x05\x00\x00\x00\x00\x00\x00\x7e\x05\x00\x00\xa9\x05\x00\x00\x71\x01\x00\x00\x75\x01\x00\x00\x7b\x01\x00\x00\xe9\x03\x00\x00\x01\x04\x00\x00\x10\x04\x00\x00\x83\x05\x00\x00\x8d\x00\x00\x00\xec\xff\xff\xff\xa9\xff\xff\xff\xc8\xff\xff\xff\x31\x00\x00\x00\x49\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x00\x00\xcf\x05\x00\x00\xf5\x05\x00\x00\xe7\x05\x00\x00\xeb\x05\x00\x00\xf9\x05\x00\x00\xfd\x05\x00\x00\x03\x06\x00\x00\x1c\x06\x00\x00\x24\x06\x00\x00\xc7\x00\x00\x00\x3b\x00\x00\x00\xaa\xff\xff\xff\xcb\xff\xff\xff\x6c\x00\x00\x00\x4a\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x6a\x06\x00\x00\xb0\x06\x00\x00\x3d\x06\x00\x00\x5c\x06\x00\x00\xa2\x06\x00\x00\xb5\x06\x00\x00\xba\x06\x00\x00\xd6\x06\x00\x00\xdb\x06\x00\x00\x74\x01\x00\x00\x8e\x00\x00\x00\xe8\xff\xff\xff\x38\x00\x00\x00\xa8\x00\x00\x00\xc1\x00\x00\x00\x87\x00\x00\x00\x21\x07\x00\x00\x3a\x07\x00\x00\x76\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x07\x00\x00\x86\x07\x00\x00\x0b\x01\x00\x00\x9a\x07\x00\x00\xda\x07\x00\x00\x31\x01\x00\x00\x49\x01\x00\x00\x4a\x01\x00\x00\x1f\x08\x00\x00\x68\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\x07\x00\x00\xfb\x07\x00\x00\x2d\x04\x00\x00\x7f\x08\x00\x00\xc5\x08\x00\x00\x4e\x04\x00\x00\xae\x05\x00\x00\xbe\x05\x00\x00\xdd\x08\x00\x00\x26\x09\x00\x00\x00\x00\x00\x00\x3a\x08\x00\x00\x3d\x09\x00\x00\x6b\x09\x00\x00\x73\x09\x00\x00\xc4\x05\x00\x00\xea\x05\x00\x00\x87\x09\x00\x00\xc7\x09\x00\x00\xef\x05\x00\x00\x0f\x06\x00\x00\xa7\x09\x00\x00\xe7\x09\x00\x00\x25\x06\x00\x00\x07\x0a\x00\x00\x1f\x0a\x00\x00\x3e\x0a\x00\x00\x87\x0a\x00\x00\x9e\x0a\x00\x00\xd5\x0a\x00\x00\x1e\x0b\x00\x00\x00\x00\x00\x00\xec\x0a\x00\x00\x35\x0b\x00\x00\x63\x0b\x00\x00\x6b\x0b\x00\x00\x6d\x06\x00\x00\x7d\x06\x00\x00\x7f\x0b\x00\x00\xbf\x0b\x00\x00\xab\x06\x00\x00\xb1\x06\x00\x00\x9f\x0b\x00\x00\xdf\x0b\x00\x00\xe2\x06\x00\x00\xff\x0b\x00\x00\x17\x0c\x00\x00\x36\x0c\x00\x00\x7f\x0c\x00\x00\x96\x0c\x00\x00\xcd\x0c\x00\x00\x16\x0d\x00\x00\x00\x00\x00\x00\x38\x0d\x00\x00\x5a\x0d\x00\x00\xea\x0c\x00\x00\x7b\x0d\x00\x00\x1f\x00\x00\x00\x82\x01\x00\x00\x03\x07\x00\x00\x9a\x0d\x00\x00\xbb\x0d\x00\x00\x26\x05\x00\x00\xd0\x0d\x00\x00\xf4\x0a\x00\x00\x00\x00\x00\x00\xda\x0d\x00\x00\x27\x00\x00\x00\x17\x04\x00\x00\xe6\x0d\x00\x00\x27\x0e\x00\x00\x4d\x0e\x00\x00\x69\x0e\x00\x00\x2d\x0d\x00\x00\x00\x00\x00\x00\xf1\x06\x00\x00\x39\x07\x00\x00\x5f\x04\x00\x00\x8b\x0e\x00\x00\xaa\x0e\x00\x00\xc0\x0e\x00\x00\xc8\x0e\x00\x00\xb0\x05\x00\x00\x6a\x07\x00\x00\xf6\x0e\x00\x00\x3b\x0f\x00\x00\x9c\x07\x00\x00\x53\x0f\x00\x00\x9c\x0f\x00\x00\xdc\x0e\x00\x00\xe5\x0f\x00\x00\x00\x00\x00\x00\x9e\x07\x00\x00\x81\x08\x00\x00\x6c\x07\x00\x00\xb3\x0f\x00\x00\xfe\x0f\x00\x00\x2c\x10\x00\x00\x34\x10\x00\x00\x8a\x07\x00\x00\x98\x08\x00\x00\x62\x10\x00\x00\xa7\x10\x00\x00\xc7\x08\x00\x00\xbf\x10\x00\x00\x08\x11\x00\x00\x48\x10\x00\x00\x51\x11\x00\x00\x00\x00\x00\x00\x63\x00\x00\x00\x66\x00\x00\x00\x68\x11\x00\x00\x8e\x11\x00\x00\xa5\x11\x00\x00\xcb\x11\x00\x00\xe2\x11\x00\x00\x08\x12\x00\x00\x1f\x12\x00\x00\x45\x12\x00\x00\x5c\x12\x00\x00\x82\x12\x00\x00\x99\x12\x00\x00\xbf\x12\x00\x00\x00\x00\x00\x00\x6b\x00\x00\x00\xc9\x08\x00\x00\xf8\x08\x00\x00\x22\x09\x00\x00\x89\x09\x00\x00\x1f\x11\x00\x00\x04\x13\x00\x00\x8b\x09\x00\x00\x0c\x13\x00\x00\x38\x0a\x00\x00\x3a\x0a\x00\x00\xcb\x07\x00\x00\x23\x13\x00\x00\x51\x13\x00\x00\xcc\x07\x00\x00\x59\x13\x00\x00\x71\x13\x00\x00\xba\x13\x00\x00\xd1\x13\x00\x00\xf7\x13\x00\x00\x0e\x14\x00\x00\x34\x14\x00\x00\x4b\x14\x00\x00\x71\x14\x00\x00\x88\x14\x00\x00\xae\x14\x00\x00\xc5\x14\x00\x00\xeb\x14\x00\x00\x02\x15\x00\x00\x28\x15\x00\x00\x50\x15\x00\x00\x99\x15\x00\x00\xb0\x15\x00\x00\xd6\x15\x00\x00\xed\x15\x00\x00\x13\x16\x00\x00\x2a\x16\x00\x00\x50\x16\x00\x00\x67\x16\x00\x00\x8d\x16\x00\x00\xa4\x16\x00\x00\xca\x16\x00\x00\xe1\x16\x00\x00\x07\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x01\x00\x00\x57\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x5a\x00\x00\x00\x5c\x00\x00\x00\x5e\x00\x00\x00\x9e\x00\x00\x00\x5f\x00\x00\x00\x64\x00\x00\x00\x86\x00\x00\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d\x00\x00\x00"#
-
-alex_table :: AlexAddr
-alex_table = AlexA# "\x00\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x03\x00\x1a\x00\x1a\x00\x1b\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x22\x00\x22\x00\x23\x00\x25\x00\x26\x00\x27\x00\x2c\x00\x2c\x00\x3d\x00\x3d\x00\x02\x00\x20\x01\xbe\x00\x10\x00\x29\x00\x27\x01\x28\x01\x6c\x00\x1a\x01\x1b\x01\x25\x01\x23\x01\x42\x01\x1f\x01\xad\x00\x26\x01\x2d\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x37\x01\x43\x01\x2a\x01\x30\x01\x2c\x01\x36\x01\x39\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2a\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x1c\x01\x4e\x00\x1d\x01\x32\x01\x29\x00\x38\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x44\x01\x33\x01\x45\x01\x21\x01\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x09\x00\x03\x00\x2c\x00\x4e\x00\x04\x00\x2c\x00\x4a\x00\xa6\x00\xa6\x00\xde\x00\x09\x00\x03\x00\xde\x00\x02\x00\x04\x00\xb3\x00\xb3\x00\xed\x00\x02\x00\x31\x01\x3c\x00\x4d\x00\x3a\x01\x09\x00\x3b\x01\x12\x00\x3c\x01\x40\x01\x3c\x00\x2c\x00\x3d\x00\x29\x01\x2d\x01\x09\x00\x2c\x00\x12\x00\x3d\x00\x2c\x00\x49\x00\x06\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x06\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x0a\x00\x03\x00\x2c\x00\x3d\x00\x04\x00\x3d\x00\x22\x01\x41\x01\x34\x01\x3d\x00\x0a\x00\x03\x00\x2e\x01\x2b\x01\x04\x00\x46\x01\x2f\x01\x3e\x01\x00\x00\x00\x00\x3f\x01\x00\x00\x00\x00\x0a\x00\x38\x01\x12\x00\x00\x00\x00\x00\x4d\x00\x3b\x00\x5b\x00\x3d\x01\x4e\x00\x0a\x00\x00\x00\x12\x00\x00\x00\x3d\x00\x37\x00\x08\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x08\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x09\x00\x03\x00\x3a\x00\x5a\x00\x04\x00\x4e\x00\x4e\x00\x00\x00\x00\x00\x0a\x00\x03\x00\x37\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x00\x09\x00\x35\x01\x12\x00\x00\x00\x00\x00\x4c\x00\x5e\x00\xff\xff\x4e\x00\x0a\x00\xff\xff\x12\x00\x0c\x00\x03\x00\x48\x00\x4e\x00\x04\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0c\x00\x63\x00\x4b\x00\x0c\x00\x03\x00\x4e\x00\x00\x00\x04\x00\x00\x00\x00\x00\xff\xff\x48\x00\x00\x00\xff\xff\x00\x00\x24\x01\x00\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0c\x00\x00\x00\x00\x00\x0f\x00\x03\x00\x39\x01\x1e\x01\x04\x00\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\x62\x00\x00\x00\x00\x00\x00\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0f\x00\x00\x00\x8c\x00\x0f\x00\x03\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x64\x00\xff\xff\x11\x00\x00\x00\x00\x00\x0e\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0f\x00\x00\x00\x00\x00\x0f\x00\x03\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x11\x00\x8b\x00\x00\x00\x0e\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0f\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x11\x00\x00\x00\x8b\x00\x6d\x00\x00\x00\x00\x00\x00\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x31\x00\x00\x00\x00\x00\x5d\x00\x61\x00\x61\x00\x00\x00\x00\x00\x00\x00\x61\x00\x35\x00\xa6\x00\x59\x00\x61\x00\x61\x00\x00\x00\x00\x00\xa6\x00\x00\x00\x61\x00\x00\x00\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x2c\x00\x2c\x00\x00\x00\x30\x00\x2c\x00\x2c\x00\x5c\x00\x35\x00\x61\x00\x00\x00\x2c\x00\x2c\x00\x61\x00\x61\x00\xa6\x00\x59\x00\x61\x00\x61\x00\x28\x00\x00\x00\xa6\x00\x00\x00\x61\x00\x00\x00\x00\x00\x21\x00\x13\x00\x13\x00\x0b\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x18\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x0b\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x18\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x0b\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x15\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x18\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x0b\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x18\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x0b\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x18\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x0b\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x18\x00\x13\x00\x13\x00\x13\x00\x13\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x13\x00\x61\x00\x00\x00\xff\xff\x00\x00\x13\x00\xff\xff\x00\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x13\x00\x2c\x00\x2c\x00\x70\x00\x34\x00\x35\x00\x13\x00\xff\xff\x00\x00\x00\x00\xff\xff\x61\x00\xb3\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\xff\xff\x2c\x00\x2c\x00\xff\xff\x61\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00\x13\x00\x6f\x00\x35\x00\x13\x00\x13\x00\x2c\x00\x2c\x00\x00\x00\x61\x00\xb3\x00\x00\x00\x00\x00\x13\x00\xbc\x00\x00\x00\xb3\x00\x13\x00\x35\x00\x13\x00\x00\x00\x13\x00\xa1\x00\x19\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\xc9\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\xcf\x00\x00\x00\x2b\x00\x00\x00\x00\x00\x79\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\xa7\x00\x00\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\xae\x00\xae\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x33\x00\xff\xff\x00\x00\x00\x00\xff\xff\x61\x00\x00\x00\xff\xff\xbc\x00\x2f\x00\x00\x00\x71\x00\x5f\x00\xa7\x00\x61\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\xae\x00\xae\x00\xb1\x00\x00\x00\xff\xff\x00\x00\x36\x00\x36\x00\x00\x00\x32\x00\x7c\x00\x2c\x00\x2c\x00\xb1\x00\x61\x00\x00\x00\x00\x00\x00\x00\x2f\x00\xff\xff\x33\x00\x60\x00\xff\xff\x61\x00\xff\xff\x00\x00\x00\x00\xff\xff\xa7\x00\x2f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x00\x00\xa0\x00\x00\x00\xc9\x00\x00\x00\xb1\x00\x00\x00\x00\x00\x7c\x00\x36\x00\x36\x00\xb1\x00\x32\x00\x7c\x00\x00\x00\x00\x00\xff\xff\x7a\x00\x44\x00\xff\xff\x00\x00\x2f\x00\x00\x00\x8f\x00\x00\x00\x00\x00\xa7\x00\x40\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\xff\xff\x00\x00\x00\x00\xff\xff\x42\x00\xb1\x00\x00\x00\x7c\x00\x61\x00\x47\x00\x47\x00\xb1\x00\x43\x00\x61\x00\x00\x00\x00\x00\x00\x00\x61\x00\x44\x00\x00\x00\x00\x00\x40\x00\x46\x00\x8f\x00\x00\x00\x00\x00\x61\x00\x40\x00\x8f\x00\x7c\x00\x00\x00\x61\x00\x45\x00\x3d\x00\x3d\x00\x46\x00\x41\x00\x3d\x00\x3d\x00\x00\x00\x46\x00\x46\x00\x00\x00\xb1\x00\x00\x00\x61\x00\x00\x00\x47\x00\x47\x00\x61\x00\x43\x00\x3d\x00\x3d\x00\x00\x00\x61\x00\x3d\x00\x3d\x00\x61\x00\x45\x00\x40\x00\x8f\x00\x3d\x00\x3d\x00\x61\x00\x61\x00\x61\x00\x46\x00\x46\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x46\x00\x61\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3d\x00\xff\xff\x61\x00\x53\x00\xff\xff\x00\x00\x00\x00\x3d\x00\x3d\x00\x00\x00\x61\x00\x46\x00\x61\x00\x00\x00\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x91\x00\x00\x00\x4e\x00\x4e\x00\x61\x00\x52\x00\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x61\x00\x61\x00\x00\x00\x00\x00\xff\xff\x55\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x00\x4e\x00\x00\x00\x57\x00\xa4\x00\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x61\x00\x91\x00\x58\x00\x58\x00\x00\x00\x54\x00\x00\x00\x91\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x00\x51\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x00\x00\x00\x00\xff\xff\x00\x00\x57\x00\xff\xff\x00\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x61\x00\x00\x00\x00\x00\x00\x00\xff\xff\x55\x00\x00\x00\xff\xff\x00\x00\xba\x00\x61\x00\x00\x00\x00\x00\x00\x00\x51\x00\x56\x00\xa4\x00\x00\x00\x91\x00\x57\x00\x4e\x00\x4e\x00\xa4\x00\x61\x00\x57\x00\x00\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x61\x00\xff\xff\x58\x00\x58\x00\x00\x00\x54\x00\x00\x00\x4e\x00\x4e\x00\xba\x00\x56\x00\x61\x00\x4e\x00\x4e\x00\x51\x00\x61\x00\x61\x00\x00\x00\x00\x00\x57\x00\x57\x00\x00\x00\x00\x00\x00\x00\x57\x00\x61\x00\x47\x01\x00\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\xa8\x00\x00\x00\xa4\x00\x4e\x00\x4e\x00\x00\x00\x61\x00\xff\xff\x4e\x00\x4e\x00\xff\xff\x61\x00\x00\x00\x00\x00\x00\x00\x57\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x61\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\xb9\x00\x00\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\xff\xff\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x00\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\x4f\x00\xff\xff\x00\x00\x00\x00\xff\xff\xbd\x00\x00\x00\xcd\x00\x00\x00\xff\xff\xbf\x00\x00\x00\xff\xff\xff\xff\xca\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x50\x00\x00\x00\x00\x00\x00\x00\xff\xff\x62\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xcd\x00\x63\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\x67\x00\xbd\x00\x00\x00\x00\x00\x63\x00\x00\x00\xbf\x00\xff\xff\xff\xff\xca\x00\xff\xff\xda\x00\x00\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x00\x00\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\x8b\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x6f\x00\x8c\x00\x00\x00\xff\xff\x00\x00\xda\x00\xff\xff\x00\x00\x00\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\xff\xff\xff\xff\x00\x00\x00\x00\x8c\x00\x00\x00\xca\x00\x00\x00\xfe\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x62\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x00\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\xfe\x00\xff\xff\x00\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x74\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x6a\x00\x00\x00\x00\x00\xff\xff\x00\x00\x6a\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\x65\x00\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x7f\x00\x00\x00\x00\x00\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x00\x6a\x00\x00\x00\x00\x00\x6b\x00\x6a\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x6a\x00\xff\xff\x00\x00\x00\x00\x6a\x00\x00\x00\x6a\x00\xe1\x00\x6a\x00\x8f\x00\x6e\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\xff\xff\xce\x00\x00\x00\xff\xff\x70\x00\x00\x00\xd0\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\x00\x00\x00\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xa1\x00\x00\x00\xdb\x00\x00\x00\x00\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\xff\xff\x00\x00\xce\x00\x00\x00\xef\x00\x6f\x00\x00\x00\xd0\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xdb\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x77\x00\x00\x00\x00\x00\xff\xff\x00\x00\x77\x00\xff\xff\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x00\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef\x00\x00\x00\x77\x00\x00\x00\x00\x00\xff\xff\x00\x00\xa0\x00\x78\x00\xdb\x00\x00\x00\x0c\x01\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x77\x00\x00\x00\x00\x00\x78\x00\x77\x00\xef\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xff\xff\x77\x00\x00\x00\x00\x00\x00\x00\x77\x00\x00\x00\x77\x00\xe1\x00\x77\x00\x0c\x01\x7b\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\x80\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x0c\x01\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x7c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x8f\x00\x7c\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\xef\x00\x00\x00\xef\x00\x7c\x00\x00\x00\xff\xff\xff\xff\xff\xff\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\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x7c\x00\x8f\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\x8f\x00\x00\x00\x0c\x01\x00\x00\x0c\x01\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x7c\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x00\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x7c\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\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\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x85\x00\xff\xff\x8f\x00\xff\xff\xff\xff\x85\x00\xff\xff\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x00\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x7d\x00\x00\x00\x00\x00\x00\x00\xef\x00\x00\x00\xef\x00\x00\x00\x85\x00\xff\xff\x85\x00\xff\xff\x00\x00\x8f\x00\x85\x00\x85\x00\x00\x00\x00\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x85\x00\x00\x00\x00\x00\x85\x00\x85\x00\x00\x00\x85\x00\x85\x00\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x85\x00\x0c\x01\x85\x00\x0c\x01\x8d\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\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x85\x00\x00\x00\x85\x00\x00\x00\x8e\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\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x00\x00\x00\x00\x00\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x86\x00\x00\x00\xff\xff\x00\x00\x00\x00\x86\x00\x00\x00\x00\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\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\x00\x00\x00\x00\x91\x00\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x00\x00\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x00\x86\x00\x00\x00\x00\x00\x86\x00\x86\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x86\x00\x00\x00\x00\x00\x00\x00\x86\x00\xa4\x00\x86\x00\x00\x00\x86\x00\x00\x00\x90\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x00\x00\x00\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\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\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x91\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x91\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x96\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x97\x00\x00\x00\x00\x00\x00\x00\x91\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\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x91\x00\xa4\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\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x98\x00\x91\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x91\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9a\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x00\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\x00\x00\x00\x00\x9a\x00\x00\x00\x9a\x00\x00\x00\x00\x00\xa4\x00\x9a\x00\x9a\x00\x00\x00\x00\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\x93\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x9a\x00\x9a\x00\x00\x00\x9a\x00\x9a\x00\x9a\x00\x00\x00\x00\x00\x00\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\xa2\x00\x00\x00\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x9a\x00\x00\x00\x00\x00\x9a\x00\x9a\x00\x00\x00\x00\x00\x00\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\xa3\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\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\x00\x99\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\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x00\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\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x9b\x00\xab\x00\x00\x00\x9b\x00\x9b\x00\x00\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x00\x00\x9b\x00\x00\x00\x9b\x00\x00\x00\x9b\x00\x00\x00\xa5\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\xab\x00\x00\x00\x00\x00\xac\x00\xac\x00\x00\x00\xab\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\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\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\xaf\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\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\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x00\xab\x00\xaf\x00\xab\x00\xac\x00\xac\x00\x00\x00\xab\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x00\xab\x00\xab\x00\x00\x00\xac\x00\xac\x00\x00\x00\xab\x00\xab\x00\xa7\x00\x00\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xab\x00\x00\x00\x00\x00\xac\x00\xac\x00\xb0\x00\xab\x00\xb0\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\xb2\x00\x00\x00\xb2\x00\x00\x00\xb1\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\x00\x00\x00\x00\xb6\x00\xb6\x00\x00\x00\xb5\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xbb\x00\xff\xff\xbb\x00\xba\x00\xff\xff\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbc\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xbd\x00\xff\xff\x00\x00\x00\x00\x00\x00\xbf\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc4\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xc5\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xca\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\x00\x00\x00\x00\xbc\x00\x00\x00\x00\x00\x00\x00\xc9\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\x00\x00\xca\x00\x00\x00\xc6\x00\xc6\x00\xc6\x00\xc6\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\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\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\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xc6\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\x00\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\x00\xbf\x00\x00\x00\x00\x00\x00\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\xbf\x00\x00\x00\x00\x00\xbf\x00\xbf\x00\x00\x00\x00\x00\x00\x00\xff\xff\xc8\x00\x00\x00\xff\xff\xbf\x00\x00\x00\xc8\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x00\x00\xcb\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x00\xc8\x00\x00\x00\x00\x00\xc8\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xc8\x00\xff\xff\x00\x00\x00\x00\xc8\x00\xda\x00\xc8\x00\x00\x01\xc8\x00\x00\x00\xcc\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\x00\x00\x00\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\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\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\xc7\x00\x00\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x00\xdb\x00\xd0\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd5\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\x00\xd6\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\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\x00\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\xda\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\x00\x00\xdb\x00\x00\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\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\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\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xd7\x00\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x00\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x00\xd0\x00\x00\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\xd0\x00\x00\x00\x00\x00\xd0\x00\xd0\x00\x00\x00\x00\x00\x00\x00\xff\xff\xd9\x00\x00\x00\xff\xff\xd0\x00\x00\x00\xd9\x00\x00\x00\xd0\x00\x00\x00\xd0\x00\x00\x00\xd0\x00\x00\x00\xdc\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\x00\x00\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x00\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x00\xd9\x00\x00\x00\x00\x00\xd9\x00\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x0c\x01\xd9\x00\x00\x01\xd9\x00\x00\x00\xdd\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xe2\x00\xe2\x00\xe2\x00\xe2\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\x00\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\xe2\x00\x00\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\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\xe3\x00\xe3\x00\xe3\x00\xe3\x00\x00\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\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\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\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\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xe4\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xdf\x00\xe6\x00\xe6\x00\xe6\x00\xe6\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\x00\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\xe6\x00\x00\x00\x00\x00\x00\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\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\xe7\x00\x00\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\xe8\x00\xe8\x00\xe8\x00\xe8\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\x00\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\x00\xe8\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\x00\x00\x00\x00\x00\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\x00\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\xea\x00\xea\x00\xea\x00\xea\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\x00\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\x00\xea\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\x00\x00\x00\x00\x00\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\xeb\x00\x00\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\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\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\x00\x00\x00\x00\x00\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\x00\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xec\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\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\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xe0\x00\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\xef\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf5\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xfb\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x0c\x01\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x0c\x01\x00\x00\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\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\xff\xff\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfc\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\x00\x00\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\x00\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x00\xf9\x00\x00\x00\x00\x00\x00\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\x00\xf9\x00\x00\x00\x00\x00\xf9\x00\xf9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\x00\x00\x00\x00\x00\x00\x00\xf9\x00\x00\x00\xf9\x00\x00\x01\xf9\x00\x00\x00\xff\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\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\x00\x00\x00\x00\x00\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\x00\xfd\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\x02\x01\x02\x01\x02\x01\x02\x01\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x00\x00\x00\x00\x00\x00\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x00\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\x00\x00\x00\x00\x00\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\x00\xf0\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\x06\x01\x06\x01\x06\x01\x06\x01\x00\x00\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x05\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x00\x00\x00\x00\x00\x00\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x06\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x00\x00\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x07\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x00\x00\x00\x00\x00\x00\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x08\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x09\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x00\x00\x00\x00\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\x00\x00\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\xf3\x00\x00\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf1\x00\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\xf2\x00\x00\x00\x00\x00\xf2\x00\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\xf2\x00\x0e\x01\xf2\x00\x00\x00\x0d\x01\xf6\x00\xf6\x00\xf6\x00\xf6\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\x00\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\xf6\x00\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x00\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\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\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x00\x00\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x0f\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x00\x00\x00\x00\x00\x00\x10\x01\x10\x01\x10\x01\x10\x01\x10\x01\x10\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\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\xf7\x00\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x00\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\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\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x00\x00\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x13\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x00\x00\x00\x00\x00\x00\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x14\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x00\x00\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x00\x00\x00\x00\x00\x00\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x16\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x00\x00\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x00\x00\x00\x00\x00\x00\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\x00\x00\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\x19\x01\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\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\x6c\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\x4c\x00\x0d\x00\x55\x00\x4c\x00\x69\x00\x6a\x00\x27\x00\x09\x00\x0a\x00\x27\x00\x20\x00\x0d\x00\x69\x00\x6a\x00\x27\x00\x20\x00\x3d\x00\x4c\x00\x4c\x00\x3d\x00\x20\x00\x3d\x00\x22\x00\x3d\x00\x3d\x00\x6c\x00\x55\x00\x55\x00\x3c\x00\x3d\x00\x20\x00\x75\x00\x22\x00\x55\x00\x75\x00\x6c\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\x09\x00\x0a\x00\x75\x00\x75\x00\x0d\x00\x55\x00\x2b\x00\x3d\x00\x26\x00\x75\x00\x09\x00\x0a\x00\x3d\x00\x3e\x00\x0d\x00\x2e\x00\x3d\x00\x3d\x00\xff\xff\xff\xff\x3d\x00\xff\xff\xff\xff\x20\x00\x3d\x00\x22\x00\xff\xff\xff\xff\x6c\x00\x4c\x00\x4c\x00\x3d\x00\x55\x00\x20\x00\xff\xff\x22\x00\xff\xff\x75\x00\x55\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\x09\x00\x0a\x00\x6c\x00\x6c\x00\x0d\x00\x75\x00\x55\x00\xff\xff\xff\xff\x09\x00\x0a\x00\x75\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\x20\x00\x7c\x00\x22\x00\xff\xff\xff\xff\x4c\x00\x6c\x00\x0a\x00\x55\x00\x20\x00\x0d\x00\x22\x00\x09\x00\x0a\x00\x55\x00\x75\x00\x0d\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\x27\x00\x6c\x00\x09\x00\x0a\x00\x75\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x0a\x00\x75\x00\xff\xff\x0d\x00\xff\xff\x2d\x00\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\x09\x00\x0a\x00\x3d\x00\x3e\x00\x0d\x00\x0a\x00\x0a\x00\xff\xff\x0d\x00\x0d\x00\x27\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\xff\xff\x5c\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\x27\x00\x27\x00\x09\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\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\x09\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\x20\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\x5c\x00\x5c\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\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x4c\x00\xff\xff\xff\xff\x4c\x00\x4c\x00\x4c\x00\xff\xff\xff\xff\xff\xff\x55\x00\x4c\x00\x46\x00\x55\x00\x55\x00\x55\x00\xff\xff\xff\xff\x4c\x00\xff\xff\x55\x00\xff\xff\x69\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x70\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\x6c\x00\x6c\x00\x6c\x00\xff\xff\x69\x00\x6a\x00\x75\x00\x6c\x00\x66\x00\x75\x00\x75\x00\x75\x00\x69\x00\xff\xff\x6c\x00\xff\xff\x75\x00\xff\xff\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\xff\xff\x27\x00\x0d\x00\xff\xff\xff\xff\xff\xff\x55\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\x4c\x00\xff\xff\xff\xff\xff\xff\x3f\x00\x69\x00\x6a\x00\x27\x00\x6c\x00\x55\x00\x45\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x4c\x00\x46\x00\x75\x00\xff\xff\xff\xff\xff\xff\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\x27\x00\x75\x00\x65\x00\x66\x00\x69\x00\x6a\x00\xff\xff\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\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\x24\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\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\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\x0a\x00\xff\xff\x0a\x00\x0d\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\x4c\x00\x0d\x00\xff\xff\xff\xff\x0a\x00\x4c\x00\xff\xff\x0d\x00\x22\x00\x55\x00\xff\xff\x27\x00\x58\x00\x2e\x00\x55\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\x27\x00\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x27\x00\x69\x00\x6a\x00\x45\x00\x6c\x00\xff\xff\xff\xff\xff\xff\x75\x00\x0a\x00\x4c\x00\x78\x00\x0d\x00\x75\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x2e\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\xff\xff\x65\x00\xff\xff\xff\xff\x27\x00\x69\x00\x6a\x00\x45\x00\x6c\x00\x27\x00\xff\xff\xff\xff\x0a\x00\x5c\x00\x4c\x00\x0d\x00\xff\xff\x75\x00\xff\xff\x5c\x00\xff\xff\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\x0a\x00\xff\xff\xff\xff\x0d\x00\x4c\x00\x65\x00\xff\xff\x27\x00\x4c\x00\x69\x00\x6a\x00\x45\x00\x6c\x00\x55\x00\xff\xff\xff\xff\xff\xff\x55\x00\x4c\x00\xff\xff\xff\xff\x75\x00\x4c\x00\x5c\x00\xff\xff\xff\xff\x4c\x00\x55\x00\x5c\x00\x27\x00\xff\xff\x55\x00\x4c\x00\x69\x00\x6a\x00\x55\x00\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x55\x00\xff\xff\x65\x00\xff\xff\x75\x00\xff\xff\x69\x00\x6a\x00\x75\x00\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\x4c\x00\x6c\x00\x75\x00\x5c\x00\x69\x00\x6a\x00\x75\x00\x6c\x00\x4c\x00\x55\x00\x75\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x75\x00\x55\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\x0a\x00\x6c\x00\x4c\x00\x0d\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x75\x00\x55\x00\xff\xff\x27\x00\xff\xff\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\x27\x00\xff\xff\x69\x00\x6a\x00\x4c\x00\x6c\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x55\x00\x75\x00\xff\xff\xff\xff\x0a\x00\x4c\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x5c\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\x27\x00\x5c\x00\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\xff\xff\xff\xff\x0a\x00\xff\xff\x4c\x00\x0d\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x55\x00\xff\xff\xff\xff\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\x5c\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\xff\xff\xff\xff\xff\xff\x75\x00\x55\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\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\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\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\x22\x00\xff\xff\x22\x00\xff\xff\x0a\x00\x27\x00\xff\xff\x0d\x00\x0a\x00\x5c\x00\xff\xff\x0d\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\x0a\x00\x27\x00\x0a\x00\x0d\x00\x0a\x00\x0d\x00\xff\xff\x0d\x00\x22\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\xff\xff\x27\x00\xff\xff\x27\x00\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\xff\xff\x5c\x00\x0d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x27\x00\x27\x00\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\xff\xff\x0a\x00\xff\xff\xff\xff\x0d\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\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x27\x00\xff\xff\xff\xff\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\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\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\xff\xff\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\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\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\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\x0a\x00\x0d\x00\x6e\x00\x0d\x00\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\x0a\x00\x22\x00\xff\xff\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\xff\xff\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\xff\xff\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\xff\xff\x27\x00\xff\xff\xff\xff\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\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\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\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\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\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\x0a\x00\x22\x00\xff\xff\x0d\x00\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\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\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\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2b\x00\xff\xff\x2d\x00\xff\xff\x65\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\xff\xff\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\xff\xff\x1c\x00\x1c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x24\x00\x24\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\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x85\x00\x6a\x00\xee\x00\xff\xff\xff\xff\xff\xff\xff\xff\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x9a\x00\x77\x00\xee\x00\xff\xff\xff\xff\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\x86\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\x00\x9b\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\xf9\x00\xc8\x00\xbf\x00\xbf\x00\xc8\x00\xbf\x00\xc8\x00\xbf\x00\xc8\x00\xbf\x00\xc8\x00\xc8\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf9\x00\xd9\x00\xd0\x00\xd0\x00\xd9\x00\xd0\x00\xd9\x00\xd0\x00\xd9\x00\xd0\x00\xd9\x00\xd9\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\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf2\x00\xf9\x00\xf9\x00\xf9\x00\xf9\x00\xf9\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,327) [[],[],[(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" #-}
-
--- Fix the 'octal' lexing of '0'
-readCOctal :: String -> Either String CInteger
-readCOctal s@('0':r) =
-    case r of
-        (c:_) | isDigit c -> readCInteger OctalRepr r
-        _                 -> readCInteger DecRepr s
-
--- 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)
-
-linePragmaAdjust :: String -> Position -> Position
-linePragmaAdjust str p@(Position fname row _) = Position fname' row' 1
-    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 (linePragmaAdjust (takeChars len str) pos) >> lexToken 
-alex_action_4 =  \pos len str -> idkwtok (takeChars len str) pos 
-alex_action_5 =  token_plus CTokILit readCOctal 
-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 "templates/GenericTemplate.hs" #-}
-{-# LINE 1 "templates/GenericTemplate.hs" #-}
-{-# LINE 1 "<built-in>" #-}
-{-# LINE 1 "<command line>" #-}
-{-# LINE 1 "templates/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 "templates/GenericTemplate.hs" #-}
-
-{-# LINE 45 "templates/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
deleted file mode 100644
--- a/dist/build/Language/C/Parser/Parser.hs
+++ /dev/null
@@ -1,6337 +0,0 @@
-{-# OPTIONS_GHC -fno-warn-overlapping-patterns #-}
-{-# OPTIONS -fglasgow-exts -cpp #-}
-module Language.C.Parser.Parser (
-  -- * Parse a C translation unit
-  parseC,
-  -- * Exposed Parsers
-  translUnitP, extDeclP, statementP, expressionP
-) 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 qualified Data.Array as Happy_Data_Array
-#else
-import qualified Array as Happy_Data_Array
-#endif
-#if __GLASGOW_HASKELL__ >= 503
-import qualified GHC.Exts as Happy_GHC_Exts
-#else
-import qualified GlaExts as Happy_GHC_Exts
-#endif
-
--- parser produced by Happy Version 1.18.4
-
-newtype HappyAbsSyn  = HappyAbsSyn HappyAny
-#if __GLASGOW_HASKELL__ >= 607
-type HappyAny = Happy_GHC_Exts.Any
-#else
-type HappyAny = forall a . a
-#endif
-happyIn7 :: (CTranslUnit) -> (HappyAbsSyn )
-happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn7 #-}
-happyOut7 :: (HappyAbsSyn ) -> (CTranslUnit)
-happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut7 #-}
-happyIn8 :: (Reversed [CExtDecl]) -> (HappyAbsSyn )
-happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn8 #-}
-happyOut8 :: (HappyAbsSyn ) -> (Reversed [CExtDecl])
-happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut8 #-}
-happyIn9 :: (CExtDecl) -> (HappyAbsSyn )
-happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn9 #-}
-happyOut9 :: (HappyAbsSyn ) -> (CExtDecl)
-happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut9 #-}
-happyIn10 :: (CFunDef) -> (HappyAbsSyn )
-happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn10 #-}
-happyOut10 :: (HappyAbsSyn ) -> (CFunDef)
-happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut10 #-}
-happyIn11 :: (CDeclr) -> (HappyAbsSyn )
-happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn11 #-}
-happyOut11 :: (HappyAbsSyn ) -> (CDeclr)
-happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut11 #-}
-happyIn12 :: (CStat) -> (HappyAbsSyn )
-happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn12 #-}
-happyOut12 :: (HappyAbsSyn ) -> (CStat)
-happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut12 #-}
-happyIn13 :: (CStat) -> (HappyAbsSyn )
-happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn13 #-}
-happyOut13 :: (HappyAbsSyn ) -> (CStat)
-happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut13 #-}
-happyIn14 :: (CStat) -> (HappyAbsSyn )
-happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn14 #-}
-happyOut14 :: (HappyAbsSyn ) -> (CStat)
-happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut14 #-}
-happyIn15 :: (()) -> (HappyAbsSyn )
-happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn15 #-}
-happyOut15 :: (HappyAbsSyn ) -> (())
-happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut15 #-}
-happyIn16 :: (()) -> (HappyAbsSyn )
-happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn16 #-}
-happyOut16 :: (HappyAbsSyn ) -> (())
-happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut16 #-}
-happyIn17 :: (Reversed [CBlockItem]) -> (HappyAbsSyn )
-happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn17 #-}
-happyOut17 :: (HappyAbsSyn ) -> (Reversed [CBlockItem])
-happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut17 #-}
-happyIn18 :: (CBlockItem) -> (HappyAbsSyn )
-happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn18 #-}
-happyOut18 :: (HappyAbsSyn ) -> (CBlockItem)
-happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut18 #-}
-happyIn19 :: (CBlockItem) -> (HappyAbsSyn )
-happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn19 #-}
-happyOut19 :: (HappyAbsSyn ) -> (CBlockItem)
-happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut19 #-}
-happyIn20 :: (CFunDef) -> (HappyAbsSyn )
-happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn20 #-}
-happyOut20 :: (HappyAbsSyn ) -> (CFunDef)
-happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut20 #-}
-happyIn21 :: (Reversed [Ident]) -> (HappyAbsSyn )
-happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn21 #-}
-happyOut21 :: (HappyAbsSyn ) -> (Reversed [Ident])
-happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut21 #-}
-happyIn22 :: (CStat) -> (HappyAbsSyn )
-happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn22 #-}
-happyOut22 :: (HappyAbsSyn ) -> (CStat)
-happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut22 #-}
-happyIn23 :: (CStat) -> (HappyAbsSyn )
-happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn23 #-}
-happyOut23 :: (HappyAbsSyn ) -> (CStat)
-happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut23 #-}
-happyIn24 :: (CStat) -> (HappyAbsSyn )
-happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn24 #-}
-happyOut24 :: (HappyAbsSyn ) -> (CStat)
-happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut24 #-}
-happyIn25 :: (CStat) -> (HappyAbsSyn )
-happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn25 #-}
-happyOut25 :: (HappyAbsSyn ) -> (CStat)
-happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut25 #-}
-happyIn26 :: (CAsmStmt) -> (HappyAbsSyn )
-happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn26 #-}
-happyOut26 :: (HappyAbsSyn ) -> (CAsmStmt)
-happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut26 #-}
-happyIn27 :: (Maybe CTypeQual) -> (HappyAbsSyn )
-happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn27 #-}
-happyOut27 :: (HappyAbsSyn ) -> (Maybe CTypeQual)
-happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut27 #-}
-happyIn28 :: ([CAsmOperand]) -> (HappyAbsSyn )
-happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn28 #-}
-happyOut28 :: (HappyAbsSyn ) -> ([CAsmOperand])
-happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut28 #-}
-happyIn29 :: (Reversed [CAsmOperand]) -> (HappyAbsSyn )
-happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn29 #-}
-happyOut29 :: (HappyAbsSyn ) -> (Reversed [CAsmOperand])
-happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut29 #-}
-happyIn30 :: (CAsmOperand) -> (HappyAbsSyn )
-happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn30 #-}
-happyOut30 :: (HappyAbsSyn ) -> (CAsmOperand)
-happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut30 #-}
-happyIn31 :: (Reversed [CStrLit]) -> (HappyAbsSyn )
-happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn31 #-}
-happyOut31 :: (HappyAbsSyn ) -> (Reversed [CStrLit])
-happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut31 #-}
-happyIn32 :: (CDecl) -> (HappyAbsSyn )
-happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn32 #-}
-happyOut32 :: (HappyAbsSyn ) -> (CDecl)
-happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut32 #-}
-happyIn33 :: (Reversed [CDecl]) -> (HappyAbsSyn )
-happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn33 #-}
-happyOut33 :: (HappyAbsSyn ) -> (Reversed [CDecl])
-happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut33 #-}
-happyIn34 :: (CDecl) -> (HappyAbsSyn )
-happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn34 #-}
-happyOut34 :: (HappyAbsSyn ) -> (CDecl)
-happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut34 #-}
-happyIn35 :: ((Maybe CStrLit, [CAttr])) -> (HappyAbsSyn )
-happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn35 #-}
-happyOut35 :: (HappyAbsSyn ) -> ((Maybe CStrLit, [CAttr]))
-happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut35 #-}
-happyIn36 :: (CDecl) -> (HappyAbsSyn )
-happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn36 #-}
-happyOut36 :: (HappyAbsSyn ) -> (CDecl)
-happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut36 #-}
-happyIn37 :: ([CDeclSpec]) -> (HappyAbsSyn )
-happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn37 #-}
-happyOut37 :: (HappyAbsSyn ) -> ([CDeclSpec])
-happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut37 #-}
-happyIn38 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )
-happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn38 #-}
-happyOut38 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])
-happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut38 #-}
-happyIn39 :: (CDeclSpec) -> (HappyAbsSyn )
-happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn39 #-}
-happyOut39 :: (HappyAbsSyn ) -> (CDeclSpec)
-happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut39 #-}
-happyIn40 :: (CStorageSpec) -> (HappyAbsSyn )
-happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn40 #-}
-happyOut40 :: (HappyAbsSyn ) -> (CStorageSpec)
-happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut40 #-}
-happyIn41 :: ([CDeclSpec]) -> (HappyAbsSyn )
-happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn41 #-}
-happyOut41 :: (HappyAbsSyn ) -> ([CDeclSpec])
-happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut41 #-}
-happyIn42 :: (CTypeSpec) -> (HappyAbsSyn )
-happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn42 #-}
-happyOut42 :: (HappyAbsSyn ) -> (CTypeSpec)
-happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut42 #-}
-happyIn43 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )
-happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn43 #-}
-happyOut43 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])
-happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut43 #-}
-happyIn44 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )
-happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn44 #-}
-happyOut44 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])
-happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut44 #-}
-happyIn45 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )
-happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn45 #-}
-happyOut45 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])
-happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut45 #-}
-happyIn46 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )
-happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn46 #-}
-happyOut46 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])
-happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut46 #-}
-happyIn47 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )
-happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn47 #-}
-happyOut47 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])
-happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut47 #-}
-happyIn48 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )
-happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn48 #-}
-happyOut48 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])
-happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut48 #-}
-happyIn49 :: (CTypeSpec) -> (HappyAbsSyn )
-happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn49 #-}
-happyOut49 :: (HappyAbsSyn ) -> (CTypeSpec)
-happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut49 #-}
-happyIn50 :: (CStructUnion) -> (HappyAbsSyn )
-happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn50 #-}
-happyOut50 :: (HappyAbsSyn ) -> (CStructUnion)
-happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut50 #-}
-happyIn51 :: (Located CStructTag) -> (HappyAbsSyn )
-happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn51 #-}
-happyOut51 :: (HappyAbsSyn ) -> (Located CStructTag)
-happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut51 #-}
-happyIn52 :: (Reversed [CDecl]) -> (HappyAbsSyn )
-happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn52 #-}
-happyOut52 :: (HappyAbsSyn ) -> (Reversed [CDecl])
-happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut52 #-}
-happyIn53 :: (CDecl) -> (HappyAbsSyn )
-happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn53 #-}
-happyOut53 :: (HappyAbsSyn ) -> (CDecl)
-happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut53 #-}
-happyIn54 :: (CDecl) -> (HappyAbsSyn )
-happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn54 #-}
-happyOut54 :: (HappyAbsSyn ) -> (CDecl)
-happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut54 #-}
-happyIn55 :: (CDecl) -> (HappyAbsSyn )
-happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn55 #-}
-happyOut55 :: (HappyAbsSyn ) -> (CDecl)
-happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut55 #-}
-happyIn56 :: ((Maybe CDeclr, Maybe CExpr)) -> (HappyAbsSyn )
-happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn56 #-}
-happyOut56 :: (HappyAbsSyn ) -> ((Maybe CDeclr, Maybe CExpr))
-happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut56 #-}
-happyIn57 :: ((Maybe CDeclr, Maybe CExpr)) -> (HappyAbsSyn )
-happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn57 #-}
-happyOut57 :: (HappyAbsSyn ) -> ((Maybe CDeclr, Maybe CExpr))
-happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut57 #-}
-happyIn58 :: (CEnum) -> (HappyAbsSyn )
-happyIn58 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn58 #-}
-happyOut58 :: (HappyAbsSyn ) -> (CEnum)
-happyOut58 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut58 #-}
-happyIn59 :: (Reversed [(Ident, Maybe CExpr)]) -> (HappyAbsSyn )
-happyIn59 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn59 #-}
-happyOut59 :: (HappyAbsSyn ) -> (Reversed [(Ident, Maybe CExpr)])
-happyOut59 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut59 #-}
-happyIn60 :: ((Ident, Maybe CExpr)) -> (HappyAbsSyn )
-happyIn60 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn60 #-}
-happyOut60 :: (HappyAbsSyn ) -> ((Ident, Maybe CExpr))
-happyOut60 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut60 #-}
-happyIn61 :: (CTypeQual) -> (HappyAbsSyn )
-happyIn61 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn61 #-}
-happyOut61 :: (HappyAbsSyn ) -> (CTypeQual)
-happyOut61 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut61 #-}
-happyIn62 :: (Reversed [CTypeQual]) -> (HappyAbsSyn )
-happyIn62 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn62 #-}
-happyOut62 :: (HappyAbsSyn ) -> (Reversed [CTypeQual])
-happyOut62 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut62 #-}
-happyIn63 :: (CDeclrR) -> (HappyAbsSyn )
-happyIn63 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn63 #-}
-happyOut63 :: (HappyAbsSyn ) -> (CDeclrR)
-happyOut63 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut63 #-}
-happyIn64 :: (Maybe CStrLit) -> (HappyAbsSyn )
-happyIn64 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn64 #-}
-happyOut64 :: (HappyAbsSyn ) -> (Maybe CStrLit)
-happyOut64 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut64 #-}
-happyIn65 :: (CDeclrR) -> (HappyAbsSyn )
-happyIn65 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn65 #-}
-happyOut65 :: (HappyAbsSyn ) -> (CDeclrR)
-happyOut65 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut65 #-}
-happyIn66 :: (CDeclrR) -> (HappyAbsSyn )
-happyIn66 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn66 #-}
-happyOut66 :: (HappyAbsSyn ) -> (CDeclrR)
-happyOut66 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut66 #-}
-happyIn67 :: (CDeclrR) -> (HappyAbsSyn )
-happyIn67 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn67 #-}
-happyOut67 :: (HappyAbsSyn ) -> (CDeclrR)
-happyOut67 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut67 #-}
-happyIn68 :: (CDeclrR) -> (HappyAbsSyn )
-happyIn68 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn68 #-}
-happyOut68 :: (HappyAbsSyn ) -> (CDeclrR)
-happyOut68 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut68 #-}
-happyIn69 :: (CDeclrR) -> (HappyAbsSyn )
-happyIn69 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn69 #-}
-happyOut69 :: (HappyAbsSyn ) -> (CDeclrR)
-happyOut69 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut69 #-}
-happyIn70 :: (CDeclrR) -> (HappyAbsSyn )
-happyIn70 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn70 #-}
-happyOut70 :: (HappyAbsSyn ) -> (CDeclrR)
-happyOut70 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut70 #-}
-happyIn71 :: (CDeclrR) -> (HappyAbsSyn )
-happyIn71 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn71 #-}
-happyOut71 :: (HappyAbsSyn ) -> (CDeclrR)
-happyOut71 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut71 #-}
-happyIn72 :: (CDeclrR) -> (HappyAbsSyn )
-happyIn72 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn72 #-}
-happyOut72 :: (HappyAbsSyn ) -> (CDeclrR)
-happyOut72 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut72 #-}
-happyIn73 :: (CDeclrR) -> (HappyAbsSyn )
-happyIn73 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn73 #-}
-happyOut73 :: (HappyAbsSyn ) -> (CDeclrR)
-happyOut73 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut73 #-}
-happyIn74 :: (CDeclrR) -> (HappyAbsSyn )
-happyIn74 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn74 #-}
-happyOut74 :: (HappyAbsSyn ) -> (CDeclrR)
-happyOut74 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut74 #-}
-happyIn75 :: (CDeclrR) -> (HappyAbsSyn )
-happyIn75 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn75 #-}
-happyOut75 :: (HappyAbsSyn ) -> (CDeclrR)
-happyOut75 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut75 #-}
-happyIn76 :: (CDeclr) -> (HappyAbsSyn )
-happyIn76 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn76 #-}
-happyOut76 :: (HappyAbsSyn ) -> (CDeclr)
-happyOut76 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut76 #-}
-happyIn77 :: (CDeclrR) -> (HappyAbsSyn )
-happyIn77 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn77 #-}
-happyOut77 :: (HappyAbsSyn ) -> (CDeclrR)
-happyOut77 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut77 #-}
-happyIn78 :: (CDeclrR) -> (HappyAbsSyn )
-happyIn78 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn78 #-}
-happyOut78 :: (HappyAbsSyn ) -> (CDeclrR)
-happyOut78 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut78 #-}
-happyIn79 :: (([CDecl], Bool)) -> (HappyAbsSyn )
-happyIn79 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn79 #-}
-happyOut79 :: (HappyAbsSyn ) -> (([CDecl], Bool))
-happyOut79 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut79 #-}
-happyIn80 :: (Reversed [CDecl]) -> (HappyAbsSyn )
-happyIn80 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn80 #-}
-happyOut80 :: (HappyAbsSyn ) -> (Reversed [CDecl])
-happyOut80 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut80 #-}
-happyIn81 :: (CDecl) -> (HappyAbsSyn )
-happyIn81 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn81 #-}
-happyOut81 :: (HappyAbsSyn ) -> (CDecl)
-happyOut81 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut81 #-}
-happyIn82 :: (Reversed [Ident]) -> (HappyAbsSyn )
-happyIn82 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn82 #-}
-happyOut82 :: (HappyAbsSyn ) -> (Reversed [Ident])
-happyOut82 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut82 #-}
-happyIn83 :: (CDecl) -> (HappyAbsSyn )
-happyIn83 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn83 #-}
-happyOut83 :: (HappyAbsSyn ) -> (CDecl)
-happyOut83 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut83 #-}
-happyIn84 :: (CDeclrR) -> (HappyAbsSyn )
-happyIn84 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn84 #-}
-happyOut84 :: (HappyAbsSyn ) -> (CDeclrR)
-happyOut84 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut84 #-}
-happyIn85 :: (CDeclrR -> CDeclrR) -> (HappyAbsSyn )
-happyIn85 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn85 #-}
-happyOut85 :: (HappyAbsSyn ) -> (CDeclrR -> CDeclrR)
-happyOut85 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut85 #-}
-happyIn86 :: (CDeclrR -> CDeclrR) -> (HappyAbsSyn )
-happyIn86 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn86 #-}
-happyOut86 :: (HappyAbsSyn ) -> (CDeclrR -> CDeclrR)
-happyOut86 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut86 #-}
-happyIn87 :: (CDeclrR -> CDeclrR) -> (HappyAbsSyn )
-happyIn87 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn87 #-}
-happyOut87 :: (HappyAbsSyn ) -> (CDeclrR -> CDeclrR)
-happyOut87 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut87 #-}
-happyIn88 :: (CDeclrR) -> (HappyAbsSyn )
-happyIn88 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn88 #-}
-happyOut88 :: (HappyAbsSyn ) -> (CDeclrR)
-happyOut88 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut88 #-}
-happyIn89 :: (CDeclrR) -> (HappyAbsSyn )
-happyIn89 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn89 #-}
-happyOut89 :: (HappyAbsSyn ) -> (CDeclrR)
-happyOut89 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut89 #-}
-happyIn90 :: (CInit) -> (HappyAbsSyn )
-happyIn90 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn90 #-}
-happyOut90 :: (HappyAbsSyn ) -> (CInit)
-happyOut90 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut90 #-}
-happyIn91 :: (Maybe CInit) -> (HappyAbsSyn )
-happyIn91 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn91 #-}
-happyOut91 :: (HappyAbsSyn ) -> (Maybe CInit)
-happyOut91 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut91 #-}
-happyIn92 :: (Reversed CInitList) -> (HappyAbsSyn )
-happyIn92 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn92 #-}
-happyOut92 :: (HappyAbsSyn ) -> (Reversed CInitList)
-happyOut92 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut92 #-}
-happyIn93 :: ([CDesignator]) -> (HappyAbsSyn )
-happyIn93 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn93 #-}
-happyOut93 :: (HappyAbsSyn ) -> ([CDesignator])
-happyOut93 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut93 #-}
-happyIn94 :: (Reversed [CDesignator]) -> (HappyAbsSyn )
-happyIn94 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn94 #-}
-happyOut94 :: (HappyAbsSyn ) -> (Reversed [CDesignator])
-happyOut94 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut94 #-}
-happyIn95 :: (CDesignator) -> (HappyAbsSyn )
-happyIn95 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn95 #-}
-happyOut95 :: (HappyAbsSyn ) -> (CDesignator)
-happyOut95 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut95 #-}
-happyIn96 :: (CDesignator) -> (HappyAbsSyn )
-happyIn96 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn96 #-}
-happyOut96 :: (HappyAbsSyn ) -> (CDesignator)
-happyOut96 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut96 #-}
-happyIn97 :: (CExpr) -> (HappyAbsSyn )
-happyIn97 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn97 #-}
-happyOut97 :: (HappyAbsSyn ) -> (CExpr)
-happyOut97 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut97 #-}
-happyIn98 :: (Reversed [CDesignator]) -> (HappyAbsSyn )
-happyIn98 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn98 #-}
-happyOut98 :: (HappyAbsSyn ) -> (Reversed [CDesignator])
-happyOut98 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut98 #-}
-happyIn99 :: (CExpr) -> (HappyAbsSyn )
-happyIn99 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn99 #-}
-happyOut99 :: (HappyAbsSyn ) -> (CExpr)
-happyOut99 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut99 #-}
-happyIn100 :: (Reversed [CExpr]) -> (HappyAbsSyn )
-happyIn100 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn100 #-}
-happyOut100 :: (HappyAbsSyn ) -> (Reversed [CExpr])
-happyOut100 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut100 #-}
-happyIn101 :: (CExpr) -> (HappyAbsSyn )
-happyIn101 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn101 #-}
-happyOut101 :: (HappyAbsSyn ) -> (CExpr)
-happyOut101 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut101 #-}
-happyIn102 :: (Located CUnaryOp) -> (HappyAbsSyn )
-happyIn102 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn102 #-}
-happyOut102 :: (HappyAbsSyn ) -> (Located CUnaryOp)
-happyOut102 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut102 #-}
-happyIn103 :: (CExpr) -> (HappyAbsSyn )
-happyIn103 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn103 #-}
-happyOut103 :: (HappyAbsSyn ) -> (CExpr)
-happyOut103 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut103 #-}
-happyIn104 :: (CExpr) -> (HappyAbsSyn )
-happyIn104 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn104 #-}
-happyOut104 :: (HappyAbsSyn ) -> (CExpr)
-happyOut104 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut104 #-}
-happyIn105 :: (CExpr) -> (HappyAbsSyn )
-happyIn105 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn105 #-}
-happyOut105 :: (HappyAbsSyn ) -> (CExpr)
-happyOut105 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut105 #-}
-happyIn106 :: (CExpr) -> (HappyAbsSyn )
-happyIn106 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn106 #-}
-happyOut106 :: (HappyAbsSyn ) -> (CExpr)
-happyOut106 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut106 #-}
-happyIn107 :: (CExpr) -> (HappyAbsSyn )
-happyIn107 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn107 #-}
-happyOut107 :: (HappyAbsSyn ) -> (CExpr)
-happyOut107 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut107 #-}
-happyIn108 :: (CExpr) -> (HappyAbsSyn )
-happyIn108 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn108 #-}
-happyOut108 :: (HappyAbsSyn ) -> (CExpr)
-happyOut108 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut108 #-}
-happyIn109 :: (CExpr) -> (HappyAbsSyn )
-happyIn109 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn109 #-}
-happyOut109 :: (HappyAbsSyn ) -> (CExpr)
-happyOut109 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut109 #-}
-happyIn110 :: (CExpr) -> (HappyAbsSyn )
-happyIn110 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn110 #-}
-happyOut110 :: (HappyAbsSyn ) -> (CExpr)
-happyOut110 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut110 #-}
-happyIn111 :: (CExpr) -> (HappyAbsSyn )
-happyIn111 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn111 #-}
-happyOut111 :: (HappyAbsSyn ) -> (CExpr)
-happyOut111 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut111 #-}
-happyIn112 :: (CExpr) -> (HappyAbsSyn )
-happyIn112 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn112 #-}
-happyOut112 :: (HappyAbsSyn ) -> (CExpr)
-happyOut112 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut112 #-}
-happyIn113 :: (CExpr) -> (HappyAbsSyn )
-happyIn113 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn113 #-}
-happyOut113 :: (HappyAbsSyn ) -> (CExpr)
-happyOut113 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut113 #-}
-happyIn114 :: (CExpr) -> (HappyAbsSyn )
-happyIn114 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn114 #-}
-happyOut114 :: (HappyAbsSyn ) -> (CExpr)
-happyOut114 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut114 #-}
-happyIn115 :: (CExpr) -> (HappyAbsSyn )
-happyIn115 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn115 #-}
-happyOut115 :: (HappyAbsSyn ) -> (CExpr)
-happyOut115 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut115 #-}
-happyIn116 :: (Located CAssignOp) -> (HappyAbsSyn )
-happyIn116 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn116 #-}
-happyOut116 :: (HappyAbsSyn ) -> (Located CAssignOp)
-happyOut116 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut116 #-}
-happyIn117 :: (CExpr) -> (HappyAbsSyn )
-happyIn117 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn117 #-}
-happyOut117 :: (HappyAbsSyn ) -> (CExpr)
-happyOut117 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut117 #-}
-happyIn118 :: (Reversed [CExpr]) -> (HappyAbsSyn )
-happyIn118 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn118 #-}
-happyOut118 :: (HappyAbsSyn ) -> (Reversed [CExpr])
-happyOut118 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut118 #-}
-happyIn119 :: (Maybe CExpr) -> (HappyAbsSyn )
-happyIn119 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn119 #-}
-happyOut119 :: (HappyAbsSyn ) -> (Maybe CExpr)
-happyOut119 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut119 #-}
-happyIn120 :: (Maybe CExpr) -> (HappyAbsSyn )
-happyIn120 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn120 #-}
-happyOut120 :: (HappyAbsSyn ) -> (Maybe CExpr)
-happyOut120 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut120 #-}
-happyIn121 :: (CExpr) -> (HappyAbsSyn )
-happyIn121 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn121 #-}
-happyOut121 :: (HappyAbsSyn ) -> (CExpr)
-happyOut121 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut121 #-}
-happyIn122 :: (CConst) -> (HappyAbsSyn )
-happyIn122 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn122 #-}
-happyOut122 :: (HappyAbsSyn ) -> (CConst)
-happyOut122 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut122 #-}
-happyIn123 :: (CStrLit) -> (HappyAbsSyn )
-happyIn123 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn123 #-}
-happyOut123 :: (HappyAbsSyn ) -> (CStrLit)
-happyOut123 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut123 #-}
-happyIn124 :: (Reversed [CString]) -> (HappyAbsSyn )
-happyIn124 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn124 #-}
-happyOut124 :: (HappyAbsSyn ) -> (Reversed [CString])
-happyOut124 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut124 #-}
-happyIn125 :: (Ident) -> (HappyAbsSyn )
-happyIn125 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn125 #-}
-happyOut125 :: (HappyAbsSyn ) -> (Ident)
-happyOut125 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut125 #-}
-happyIn126 :: ([CAttr]) -> (HappyAbsSyn )
-happyIn126 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn126 #-}
-happyOut126 :: (HappyAbsSyn ) -> ([CAttr])
-happyOut126 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut126 #-}
-happyIn127 :: ([CAttr]) -> (HappyAbsSyn )
-happyIn127 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn127 #-}
-happyOut127 :: (HappyAbsSyn ) -> ([CAttr])
-happyOut127 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut127 #-}
-happyIn128 :: ([CAttr]) -> (HappyAbsSyn )
-happyIn128 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn128 #-}
-happyOut128 :: (HappyAbsSyn ) -> ([CAttr])
-happyOut128 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut128 #-}
-happyIn129 :: (Reversed [CAttr]) -> (HappyAbsSyn )
-happyIn129 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn129 #-}
-happyOut129 :: (HappyAbsSyn ) -> (Reversed [CAttr])
-happyOut129 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut129 #-}
-happyIn130 :: (Maybe CAttr) -> (HappyAbsSyn )
-happyIn130 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn130 #-}
-happyOut130 :: (HappyAbsSyn ) -> (Maybe CAttr)
-happyOut130 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut130 #-}
-happyIn131 :: (Reversed [CExpr]) -> (HappyAbsSyn )
-happyIn131 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyIn131 #-}
-happyOut131 :: (HappyAbsSyn ) -> (Reversed [CExpr])
-happyOut131 x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOut131 #-}
-happyInTok :: (CToken) -> (HappyAbsSyn )
-happyInTok x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyInTok #-}
-happyOutTok :: (HappyAbsSyn ) -> (CToken)
-happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x
-{-# INLINE happyOutTok #-}
-
-
-happyActOffsets :: HappyAddr
-happyActOffsets = HappyA# "\x00\x00\x1d\x0f\xd3\x09\x31\x0f\x00\x00\x80\x07\x00\x00\x7f\x09\x77\x0f\x31\x0f\x00\x00\xc8\x09\x1f\x05\x05\x05\x7f\x03\xf0\x04\x65\x08\x54\x08\x49\x08\x3e\x08\xc6\x04\x00\x00\x2b\x08\xef\x07\x00\x00\x00\x00\x0b\x09\x00\x00\x00\x00\xcd\x0e\xcd\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x82\x04\xaf\x0e\x96\x0e\x00\x00\x00\x00\x00\x00\xf6\x07\x00\x00\x32\x0e\x14\x0e\x14\x0e\x48\x08\x47\x08\x24\x08\xb6\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\x07\xe6\x07\x00\x00\x00\x00\x4a\x05\xd2\x07\xfb\x0d\xd0\x07\xd6\x07\xd3\x09\xf5\x07\x24\x00\xed\x07\xfb\x0d\xec\x07\xd5\x07\xc6\x07\x00\x00\x76\x07\x00\x00\xae\x07\x00\x00\x95\x04\x8e\x04\x01\x01\xd5\x11\x00\x00\x01\x01\x00\x00\x9a\x19\x9a\x19\x11\x18\x01\x18\x21\x08\x21\x08\x00\x00\x00\x00\x71\x07\x00\x00\xa6\x11\x00\x00\x00\x00\x00\x00\xd9\x01\x00\x00\x00\x00\x00\x00\x4a\x05\x89\x12\x00\x00\x3d\x01\x3d\x01\xcb\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x07\x1d\x0f\x55\x07\x00\x00\xb8\x07\x6f\x09\x7a\x01\x59\x07\x5b\x07\xb3\x12\x00\x00\x00\x00\x4b\x00\xb2\x07\xb4\x09\xaa\x07\x4b\x00\x86\x07\x00\x00\x00\x00\x00\x00\xed\x01\x00\x00\x00\x00\xa7\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x38\x18\x00\x00\x9d\x07\x00\x00\x94\x18\xff\x0a\x72\x07\x00\x00\x00\x00\x00\x00\x00\x00\xed\x01\x00\x00\x77\x11\x97\x07\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x07\x5f\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x62\x07\x00\x00\x6e\x02\x48\x02\x0f\x00\x52\x07\x00\x00\x00\x00\x00\x00\xed\x01\x00\x00\x00\x00\x7b\x07\x00\x00\x4f\x07\x53\x07\x00\x00\x1b\x07\x00\x00\x1b\x07\x00\x00\x00\x00\xfb\x0d\xfb\x0d\x00\x00\x4d\x07\xfb\x0d\x41\x07\xfb\x0d\x00\x00\x43\x08\x14\x07\xd3\x09\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x65\x07\x00\x00\x2e\x07\xf4\x06\x00\x00\xc3\x1a\xc3\x1a\xfb\x0d\x00\x00\x0b\x09\x00\x00\x00\x00\xf0\x06\x00\x00\x00\x00\x0b\x09\x00\x00\x0b\x09\x00\x00\x00\x00\x00\x00\x4e\x07\x97\x03\xe7\x1a\xab\x04\xab\x04\x7a\x0a\x4c\x07\x4b\x07\x9f\x1a\xfb\x0d\xfb\x0d\x97\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\xfb\x0d\x00\x00\xfb\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x0d\xfb\x0d\x36\x04\x36\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x07\x6e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x09\xa3\x09\x8a\x04\x8a\x04\x4f\x04\x4f\x04\x4f\x04\x4f\x04\x7f\x03\x7f\x03\x1d\x04\x35\x07\x2b\x07\x16\x07\x0c\x07\xfb\x0d\x25\x07\x00\x00\xfb\x06\x00\x00\x61\x0d\x00\x00\x00\x00\x00\x00\xb7\x06\x57\x1a\x33\x1a\x48\x11\x00\x0f\x00\x00\x00\x00\x0f\x07\x0e\x07\x00\x00\xf3\x06\xdd\x06\xdb\x06\xc7\x06\xd3\x09\xdf\x07\xad\x06\x94\x06\x7c\x06\xd3\x09\xfb\x0d\x00\x00\xcb\x06\x6c\x19\xab\x06\xa7\x06\x00\x00\xc4\x06\x00\x00\xc3\x06\xc1\x06\xea\x00\xd8\x00\x38\x18\xa1\x06\x5d\x06\xaa\x06\x00\x00\x6f\x09\x38\x18\x86\x06\x00\x00\x00\x00\x1e\x19\x5b\x0b\x00\x00\x00\x00\xb1\x01\x93\x01\x8e\x06\x88\x06\x0f\x00\x47\x00\x93\x01\x00\x00\x38\x18\x66\x06\x00\x00\x49\x06\x00\x00\x6f\x09\x3e\x06\x00\x00\x00\x00\x00\x00\x00\x00\xed\x01\x00\x00\x62\x06\x00\x00\x38\x18\x3d\x06\x00\x00\x9b\x0a\x00\x00\x29\x06\xe0\x0b\x09\x00\xce\x05\x74\x02\xff\x0f\x74\x02\x21\x08\x21\x08\xd0\x0f\x24\x06\xfb\x05\x00\x00\x1b\x01\x45\x19\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x19\x11\xd8\x00\xea\x10\x5a\x12\x6f\x09\x38\x18\x04\x06\x00\x00\x19\x06\x9e\x09\x12\x00\x12\x00\x0f\x00\x00\x00\x0f\x00\x00\x00\x0f\x00\x00\x00\x00\x00\xdc\x0c\x09\x06\xf4\x05\xcc\x03\x03\x06\xfe\x05\x77\x00\xca\x00\x00\x00\x00\x00\xef\x05\x00\x00\x00\x00\xcd\x02\x00\x00\xcb\x05\xcc\x03\xaa\x05\x00\x00\x00\x00\x00\x00\xdc\x0c\x4b\x09\x00\x00\x0f\x00\x00\x00\xfd\x0c\x00\x00\xc8\x05\xc1\x05\x8c\x05\x8c\x05\xbb\x10\x00\x00\xf1\x00\xc9\x00\x8c\x05\x00\x00\x56\x05\x66\x18\x00\x00\x53\x05\x00\x00\xf0\x18\xc2\x18\xa1\x0f\xde\x12\x53\x05\x53\x05\x00\x00\x72\x0f\x49\x07\x53\x05\x00\x00\x53\x05\x53\x05\x00\x00\xab\x04\x62\x0c\x9d\x05\x9b\x05\x09\x00\x00\x00\x90\x05\x46\x05\x37\x0a\x09\x00\x00\x00\x00\x00\x6f\x09\x38\x18\x6d\x05\x00\x00\x8f\x05\x8d\x05\xdc\x17\x00\x00\x00\x00\x00\x00\x2f\x09\x84\x05\x0e\x00\xbe\x00\x83\x05\x0f\x00\x0f\x00\x2c\x09\x00\x00\x00\x00\x00\x00\xe3\x0a\x65\x00\x00\x00\x00\x00\x81\x05\x79\x05\x10\x05\x00\x00\x00\x00\x00\x00\x35\x05\x35\x05\xd3\x09\xd3\x09\xd3\x09\x00\x00\xfb\x0d\xfb\x0d\xfb\x0d\x42\x05\x00\x00\xaa\x01\xc9\x03\xdf\x07\xf2\x04\x00\x00\x23\x05\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x8c\x10\xd8\x00\x5d\x10\x2d\x05\xa7\x08\x00\x00\x7b\x1a\x9a\x03\x7b\x1a\x1c\x05\x1c\x05\x1c\x05\x30\x0c\x00\x00\xa2\x09\x31\x05\x2f\x05\x2d\x00\x33\x12\x00\x00\x00\x00\xfe\x0b\xfb\x0d\x00\x00\xfb\x0d\x00\x00\xfb\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x02\xfd\x0c\xdc\x02\x00\x00\x99\x01\x00\x00\xd4\x04\xfb\x0d\x9a\x03\xfe\x0b\x21\x05\x0d\x05\x13\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x04\x09\x05\xed\x02\x00\x00\xf9\x04\x00\x00\xc0\x04\x2e\x10\xc0\x04\xc0\x04\xc0\x04\x00\x00\xa3\x03\x89\x04\x00\x00\xa2\x04\x2a\x00\xd3\x09\xc7\x04\x9c\x04\x97\x04\x7f\x04\x00\x00\x00\x00\x88\x04\x88\x04\xa1\x04\x00\x00\x00\x00\x22\x09\x00\x00\x00\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x0a\x0f\x00\x00\x00\xaf\x17\xd4\x02\x00\x00\xa0\x03\x98\x03\x0f\x1a\xc2\x12\x00\x00\x00\x00\xbe\x19\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x04\x9a\x04\x8b\x04\x86\x04\x09\x00\x0a\x04\x00\x00\x7a\x04\x00\x00\x00\x00\x68\x04\xfb\x0d\x00\x00\x00\x00\x00\x00\xb4\x04\x9f\x00\x04\x12\x00\x00\x00\x00\xdc\x0a\x3e\x09\x24\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x01\x2b\x00\x2b\x00\x16\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x02\xfb\x0d\xf4\x00\x00\x00\xe4\x0c\x64\x04\x77\x00\x00\x00\x00\x00\x00\x00\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\x00\x00\x00\x2b\x00\x5f\x01\xcd\x00\x3e\x04\x00\x00\x00\x00\xfb\x0d\x3c\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x03\x1b\x04\xfb\x0d\x9e\x00\xeb\x19\xc8\x03\x00\x00\xc8\x03\x00\x00\xc8\x03\x06\x04\xfb\x0d\x00\x00\x00\x00\xcd\x00\x1f\x09\x00\x00\x00\x00\x00\x00\x00\x00\xd3\x09\xfb\x0d\xfb\x0d\xf5\x03\x00\x00\x0a\x01\xef\x03\x00\x00\x1a\x04\x49\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdf\x03\x00\x00\x00\x00\x00\x00\xfb\x0d\x40\x03\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x97\x01\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x0b\x00\x00\x00\x00\x80\x0c\x00\x00\x00\x00\xfb\x0d\x63\x0b\x00\x00\x00\x00\x00\x00\x03\x04\x00\x00\x01\x04\xe1\x03\xfb\x0d\x2a\x00\xb6\x03\x2a\x00\x00\x00\xd8\x03\xd3\x03\x00\x00\x00\x00\x00\x00\xfb\x0d\x00\x00\x9e\x00\xd4\x02\x6a\x03\x00\x00\xfb\x0d\x00\x00\x00\x00\xb9\x03\x00\x00\x00\x00\x00\x00\xfb\x0d\x00\x00\x00\x00\x00\x00\x4a\x03\x4a\x03\x00\x00\xd3\x09\xd3\x09\xd5\x00\x00\x00\x00\x00\xa8\x03\x3b\x03\x3b\x03\x00\x00\x00\x00\x7a\x03\x00\x00\x00\x00\x74\x03\x72\x03\x00\x00\x46\x03\x0b\x03\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x00\x00\xfb\x0d\xfb\x0d\x6c\x03\x5b\x03\x17\x03\xe9\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
-
-happyGotoOffsets :: HappyAddr
-happyGotoOffsets = HappyA# "\x36\x03\x71\x00\xd3\x06\xc6\x1d\x3c\x03\x38\x00\x00\x00\x00\x00\xc5\x02\x35\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\x4d\x03\x00\x00\x00\x00\x71\x0d\xa4\x0b\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x02\xd5\x0a\xb9\x0a\x00\x00\x00\x00\x00\x00\xa7\x02\x00\x00\x20\x0c\xbe\x03\x60\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\x07\x03\x1a\x00\x00\x00\x76\x1f\x00\x00\x00\x00\xb8\x06\x00\x00\x95\x02\x00\x00\x4c\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x03\x00\x00\x00\x00\x00\x00\x2a\x06\xc3\x00\x00\x00\x8a\x05\x00\x00\x14\x00\x16\x01\x6c\x02\x7d\x01\xa2\x01\xcb\x00\x00\x00\x00\x00\x96\x08\x00\x00\x9a\x00\x00\x00\x00\x00\x00\x00\x99\x08\xe2\x02\x00\x00\x00\x00\xbb\x02\x15\x01\x00\x00\xa8\x0a\xd7\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xca\x15\x71\x02\x5d\x02\x6a\x02\x77\x08\x00\x00\x00\x00\x70\x02\x00\x00\x5b\x08\x00\x00\x40\x00\xc6\x02\x00\x00\x00\x00\x00\x00\x52\x02\x9e\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\x04\x00\x00\x66\x02\x00\x00\xa8\x13\x16\x17\xa9\x02\x00\x00\x00\x00\x00\x00\x00\x00\x51\x02\x90\x02\xec\x00\x00\x00\x00\x00\x1a\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x02\x4f\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x02\x9a\x13\xe8\x16\x35\x08\x75\x02\x00\x00\x00\x00\x00\x00\x4a\x02\x5c\x02\x00\x00\x00\x00\x00\x00\x62\x02\x31\x02\x56\x02\xf3\x07\x00\x00\xee\x07\x00\x00\x00\x00\xab\x1d\x90\x1d\x00\x00\x00\x00\x75\x1d\x00\x00\x5a\x1d\x00\x00\x98\x06\x00\x00\x4e\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xeb\x01\xe9\x07\x00\x00\x7b\x16\x53\x16\x5b\x1f\x00\x00\xe7\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x02\x00\x00\x5b\x02\x00\x00\x00\x00\x00\x00\x00\x00\x69\x05\x9b\x00\x78\x00\x50\x00\x89\x16\x00\x00\x00\x00\xac\x03\x3f\x1d\xc7\x1f\x24\x1d\xe2\x1f\x08\x15\x84\x15\xfd\x1f\xf1\x0b\x6f\x0b\xf0\x0c\xbb\x0c\x40\x0c\x3a\x0b\x9b\x0c\x1a\x0b\xfc\x07\x26\x07\xc1\x0b\x2c\x0a\x9d\x09\x00\x00\x40\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x1d\xee\x1c\xdb\x01\xcd\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x99\x07\x00\x00\x00\x00\x00\x00\xc6\x01\x61\x04\x00\x00\x73\x13\xda\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x06\x35\x02\x33\x02\xea\x01\x7e\x01\x18\x06\x25\x1f\x00\x00\x00\x00\xa6\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x03\x91\x20\x87\x04\xdd\x01\xce\x07\x00\x00\x00\x00\xa6\x15\x4c\x04\xb7\x01\x00\x00\x00\x00\xda\x13\x26\x03\x00\x00\x00\x00\x6c\x05\x30\x13\x00\x00\x00\x00\xa2\x07\x36\x02\xb6\x0b\x00\x00\x26\x04\xa0\x01\x00\x00\x00\x00\xa7\x01\x4e\x15\xc7\x01\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x02\xb0\x01\x00\x00\x00\x00\xeb\x03\x60\x01\x00\x00\xa9\x16\x00\x00\x00\x00\xc4\x1b\x6a\x07\x14\x01\x40\x20\x18\x14\x28\x20\x9f\x01\x18\x00\x2c\x14\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x03\x00\x00\x00\x00\x00\x00\x00\x00\x84\x20\x47\x07\x77\x20\x68\x14\xaf\x14\x2a\x15\xc5\x03\x4d\x01\x00\x00\x00\x00\x73\x07\xd3\x01\xeb\x04\x27\x07\x00\x00\x20\x07\x00\x00\x15\x07\x00\x00\x00\x00\xbf\x03\x00\x00\x00\x00\xb9\x01\x00\x00\x00\x00\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x01\x00\x00\x00\x00\x00\x00\x00\x00\x44\x04\x15\x07\x00\x00\xd9\x06\x00\x00\xa9\x1b\x00\x00\x00\x00\x00\x00\x16\x02\xf7\x01\xa9\x14\x00\x00\x6f\x13\x0d\x0e\xf4\x01\x00\x00\x00\x00\x0a\x14\x00\x00\x96\x06\x00\x00\x00\x04\x00\x00\x3e\x13\x60\x17\x76\x06\x68\x06\x00\x00\x06\x13\x59\x17\x2b\x06\x00\x00\x10\x06\xe2\x05\x00\x00\xdb\x00\x62\x17\x00\x00\x00\x00\xdf\x05\x00\x00\x00\x00\x00\x00\xe0\x16\xd9\x05\x00\x00\x00\x00\xd2\x14\x64\x03\x42\x01\x00\x00\x00\x00\x00\x00\x31\x16\x5c\x01\x00\x00\x00\x00\xff\x05\x00\x00\xf9\x08\x60\x07\x00\x00\xf1\x05\xe4\x05\xe1\x05\x00\x00\x00\x00\x00\x00\x92\x0c\x18\x04\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x01\x00\x00\x00\x00\x00\x00\x5e\x01\x57\x01\xae\x05\x93\x05\x78\x05\x00\x00\x31\x1c\x16\x1c\xd3\x1c\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x01\x33\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x54\x09\x43\x01\xc4\x07\x3e\x01\x00\x00\x36\x07\x00\x00\x40\x16\xd5\xff\xe1\x14\x00\x00\x00\x00\x00\x00\xc7\x02\x00\x00\x8a\x02\x00\x00\x00\x00\xf9\x00\x96\x14\x00\x00\x00\x00\x13\x1b\x0a\x1f\x00\x00\x91\x1f\x00\x00\xef\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x1b\x9d\x02\x00\x00\x00\x00\x00\x00\x00\x00\xd4\x1e\xd3\x00\xf1\x1a\x00\x00\x00\x00\x7f\x00\x00\x00\xb4\x05\x00\x00\x00\x00\x00\x00\x00\x00\xce\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x01\x67\x01\x36\x01\x1d\x01\x17\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4\xff\x0e\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x80\x00\x00\x00\x00\x00\x00\x00\x99\x05\x00\x00\x00\x00\x6b\x0e\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x09\x5c\x05\x00\x00\x31\x16\x6a\x20\x00\x00\x00\x00\x00\x00\x04\x04\xb9\x16\x00\x00\x00\x00\x22\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x04\xb0\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x1e\x00\x00\x00\x00\x00\x00\x1a\x17\xfa\x05\x64\x14\x00\x00\x00\x00\x80\x16\x9a\x06\xca\x04\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x02\xaa\x0d\x36\x0d\xfa\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x1e\xd9\xff\x00\x00\x50\x1b\x00\x00\x4d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xff\x00\x00\x91\x06\xbf\x03\x5a\x05\x00\x00\x00\x00\x00\x00\x83\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x00\x00\x68\x1e\x57\x04\x61\x04\x78\x04\x00\x00\x09\x04\x00\x00\x86\x03\x00\x00\x4d\x1e\x00\x00\x00\x00\x5a\x05\xab\x03\x00\x00\x00\x00\x00\x00\x00\x00\xf3\x04\xfb\x1b\xe0\x1b\x00\x00\x00\x00\x00\x00\x00\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\xb8\x1c\x44\x00\x00\x00\x00\x00\x00\x00\x2c\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x1b\x00\x00\x00\x00\x73\x1b\x00\x00\x00\x00\x32\x1e\x35\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d\x1c\xf5\xff\x00\x00\xf1\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x1e\x00\x00\x5f\x03\x5b\x20\xd0\xff\x00\x00\xfc\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x1d\x00\x00\x00\x00\x00\x00\xec\x01\xd0\xff\x00\x00\xd6\x04\x9e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x32\x00\xa5\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf9\xff\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x1c\x67\x1c\x00\x00\x00\x00\x00\x00\x91\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
-
-happyDefActions :: HappyAddr
-happyDefActions = HappyA# "\xfa\xff\x3d\xfe\x00\x00\x00\x00\x00\x00\x3d\xfe\x9b\xfe\x8f\xfe\x7d\xfe\x00\x00\x7b\xfe\x77\xfe\x74\xfe\x71\xfe\x6c\xfe\x69\xfe\x67\xfe\x65\xfe\x63\xfe\x61\xfe\x5f\xfe\x5c\xfe\x4f\xfe\x00\x00\xa5\xfe\xa4\xfe\x3d\xfe\x7e\xfe\x7f\xfe\x00\x00\x00\x00\x81\xfe\x80\xfe\x82\xfe\x83\xfe\x00\x00\x00\x00\x00\x00\x45\xfe\x46\xfe\x44\xfe\x43\xfe\xa6\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\xff\xe3\xff\xe2\xff\xe1\xff\xe0\xff\xdf\xff\xde\xff\x00\x00\x00\x00\xc7\xff\xd7\xff\xb5\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\xfe\x00\x00\x00\x00\xa6\xfe\x3e\xfe\x00\x00\xf7\xff\x00\x00\xf6\xff\x00\x00\x00\x00\x00\x00\x00\x00\x98\xff\x00\x00\x77\xff\x9b\xff\x8a\xff\x9a\xff\x89\xff\x99\xff\x88\xff\x6c\xff\x52\xff\x3d\xfe\x51\xff\x00\x00\xe5\xff\x0a\xff\x08\xff\x09\xff\xa6\xff\xfb\xfe\xfa\xfe\x00\x00\x3c\xfe\x3b\xfe\x00\x00\x3d\xfe\x00\x00\x8d\xff\x7e\xff\x86\xff\x7d\xff\x81\xff\x3d\xfe\x8f\xff\x82\xff\x84\xff\x83\xff\x8c\xff\x85\xff\x80\xff\x8e\xff\x4d\xff\x90\xff\x00\x00\x8b\xff\x4c\xff\x7f\xff\x87\xff\xfe\xfe\x60\xff\x00\x00\x3d\xfe\x00\x00\xf5\xff\x00\x00\x3d\xfe\x00\x00\x3c\xfe\x00\x00\x00\x00\x07\xff\xf9\xfe\x3c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\xff\x76\xff\x6b\xff\x26\xff\xa6\xff\x3a\xfe\x00\x00\x5a\xff\x2b\xff\x2f\xff\x2c\xff\x2d\xff\x2e\xff\x3d\xfe\x03\xff\xd7\xfe\xd5\xfe\xf4\xfe\x49\xfe\x00\x00\x96\xff\x75\xff\x6a\xff\x2a\xff\x26\xff\xa6\xff\x00\x00\x00\x00\x5d\xff\x00\x00\x66\xff\x54\xff\x53\xff\x62\xff\x92\xff\x91\xff\x61\xff\x6f\xff\x68\xff\x67\xff\xa9\xff\x6e\xff\x6d\xff\xaa\xff\x7b\xff\x72\xff\x73\xff\x71\xff\x7a\xff\x79\xff\x78\xff\x00\x00\x26\xff\x27\xff\x23\xff\x20\xff\x1f\xff\x24\xff\x16\xff\x28\xff\xa6\xff\x00\x00\x3d\xfe\x22\xff\x00\x00\x94\xff\x7c\xff\x70\xff\x26\xff\xa6\xff\x93\xff\x00\x00\x65\xff\x00\x00\x26\xff\xa6\xff\x3d\xfe\xa8\xff\x3d\xfe\xa7\xff\xf3\xff\x00\x00\x00\x00\x4a\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x3f\xfe\x4b\xfe\x00\x00\x00\x00\xbc\xff\x7d\xfe\x47\xfe\x00\x00\xbb\xff\x00\x00\xb4\xff\xd5\xff\x3d\xfe\xc6\xff\x3d\xfe\x3d\xfe\x00\x00\x85\xfe\x3d\xfe\x86\xfe\x8c\xfe\x42\xfe\x41\xfe\x8a\xfe\x3d\xfe\x88\xfe\x3d\xfe\x84\xfe\x8d\xfe\x8e\xfe\x00\x00\xde\xfe\x8a\xff\x89\xff\x88\xff\x00\x00\x00\x00\x00\x00\x3c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\xfe\x00\x00\x5a\xfe\x56\xfe\x55\xfe\x59\xfe\x58\xfe\x57\xfe\x52\xfe\x51\xfe\x50\xfe\x54\xfe\x53\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x95\xfe\x94\xfe\xf8\xff\xf9\xff\x97\xfe\x96\xfe\x00\x00\x00\x00\x91\xfe\x99\xfe\x5b\xfe\x78\xfe\x79\xfe\x7a\xfe\x75\xfe\x76\xfe\x72\xfe\x73\xfe\x6d\xfe\x6f\xfe\x6e\xfe\x70\xfe\x6a\xfe\x6b\xfe\x68\xfe\x66\xfe\x64\xfe\x62\xfe\x00\x00\x00\x00\x60\xfe\x4d\xfe\x4e\xfe\xa3\xfe\x00\x00\xdb\xfe\xd8\xfe\xda\xfe\xd9\xfe\x00\x00\xdc\xfe\xf4\xfe\xc8\xfe\xdd\xfe\xa2\xfe\x00\x00\x00\x00\x40\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\xff\xd5\xff\x00\x00\x00\x00\x00\x00\x00\x00\xdb\xff\x00\x00\x3d\xfe\x00\x00\x00\x00\xbe\xff\x00\x00\xba\xff\x00\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\xb6\xfe\x3d\xfe\x00\x00\xf1\xff\x3d\xfe\x3d\xfe\xb6\xfe\xef\xff\x21\xff\xf4\xfe\x00\x00\x1e\xff\x12\xff\x3c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\xff\x3d\xfe\xb6\xfe\xf0\xff\x4e\xff\x4b\xff\x3d\xfe\x00\x00\x95\xff\x74\xff\x69\xff\x29\xff\x26\xff\xa6\xff\x00\x00\x57\xff\x3d\xfe\xb6\xfe\xee\xff\x49\xfe\x48\xfe\x00\x00\x49\xfe\x82\xfe\x3d\xfe\xef\xfe\xeb\xfe\xe8\xfe\x9a\xff\x89\xff\xe4\xfe\x00\x00\xf3\xfe\xf1\xfe\x00\x00\x3c\xfe\xe0\xfe\xd4\xfe\xec\xff\xa5\xff\x00\x00\x00\x00\x00\x00\x00\x00\x3c\xfe\x3d\xfe\x3d\xfe\xb6\xfe\xf2\xff\x00\x00\x00\x00\x00\x00\x3d\xfe\xf6\xfe\xfd\xfe\x02\xff\x06\xff\x09\xff\x05\xff\xf8\xfe\x00\x00\x00\x00\x34\xff\x00\x00\x00\x00\x00\x00\x36\xfe\x00\x00\x38\xfe\x34\xfe\x35\xfe\x5f\xff\x5e\xff\x00\x00\x33\xff\x31\xff\x00\x00\x00\x00\x04\xff\x01\xff\xf5\xfe\x00\x00\x00\x00\xfc\xfe\x00\xff\xa1\xff\x00\x00\xeb\xff\x00\x00\x00\x00\x26\xff\x26\xff\x00\x00\x28\xff\x00\x00\x3d\xfe\x26\xff\xf7\xfe\x00\x00\x3d\xfe\xd6\xfe\x3d\xfe\xe2\xfe\x00\x00\xe3\xfe\xf4\xfe\xc8\xfe\x3d\xfe\x3d\xfe\xe7\xfe\xf4\xfe\xc8\xfe\x3d\xfe\xea\xfe\x3d\xfe\x3d\xfe\xee\xfe\x3d\xfe\x00\x00\x00\x00\x00\x00\x82\xfe\xd3\xfe\x00\x00\x00\x00\x49\xfe\x82\xfe\xa3\xff\xe7\xff\x3d\xfe\x3d\xfe\xb6\xfe\xed\xff\x00\x00\x00\x00\x3d\xfe\x4b\xff\x9d\xff\xe9\xff\x00\x00\x00\x00\x00\x00\x3d\xfe\x00\x00\x0f\xff\x1a\xff\x00\x00\x1d\xff\x1c\xff\x11\xff\x00\x00\x00\x00\xa4\xff\xe8\xff\x00\x00\x00\x00\x00\x00\x9f\xff\x9e\xff\xea\xff\x26\xff\x26\xff\x00\x00\x00\x00\x00\x00\xbd\xff\x4b\xfe\x4b\xfe\x00\x00\x00\x00\xdc\xff\x00\x00\x00\x00\xd6\xff\x00\x00\xd3\xff\x00\x00\xd4\xff\xd2\xff\xd0\xff\xd1\xff\x00\x00\x00\x00\x00\x00\x00\x00\x60\xff\x3d\xfe\xdd\xff\x3d\xfe\x00\x00\x3d\xfe\x00\x00\x89\xfe\x87\xfe\x3d\xfe\xc6\xfe\xc4\xfe\x00\x00\x00\x00\x00\x00\x3c\xfe\xba\xfe\x7c\xfe\xb4\xfe\x00\x00\x5d\xfe\x00\x00\x98\xfe\x00\x00\x9a\xfe\x90\xfe\x5e\xfe\x4c\xfe\xb3\xfe\x00\x00\x00\x00\x00\x00\xac\xfe\xad\xfe\xb9\xfe\x00\x00\x00\x00\x00\x00\xb4\xfe\x00\x00\x00\x00\x00\x00\xc1\xfe\xc2\xfe\xc0\xfe\xc3\xfe\xc5\xfe\xc7\xfe\x3c\xfe\x00\x00\x00\x00\x9e\xfe\x00\x00\xcf\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xff\x00\x00\x00\x00\xc9\xff\x00\x00\xb3\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc5\xff\xc3\xff\xc2\xff\xb6\xfe\xb6\xfe\x00\x00\x64\xff\x63\xff\x00\x00\x1b\xff\x10\xff\x00\x00\x15\xff\x19\xff\x0d\xff\x0e\xff\x00\x00\x18\xff\x0b\xff\x3d\xfe\x40\xff\x49\xff\x00\x00\x00\x00\x3d\xfe\x3c\xfe\x4a\xff\x4f\xff\x3d\xfe\x5c\xff\x5b\xff\xa2\xff\xe6\xff\x00\x00\x00\x00\x00\x00\x00\x00\x82\xfe\x3d\xfe\xd1\xfe\x00\x00\xd2\xfe\xcc\xfe\x00\x00\x00\x00\xed\xfe\xec\xfe\xe9\xfe\x3d\xfe\xc4\xfe\x3c\xfe\xe6\xfe\xe5\xfe\x3d\xfe\xc4\xfe\x3c\xfe\xe1\xfe\xf0\xfe\xf2\xfe\xdf\xfe\x00\x00\x00\x00\x00\x00\x26\xff\x59\xff\x58\xff\xb5\xfe\xff\xfe\xf4\xff\x00\x00\x00\x00\x00\x00\x38\xff\x00\x00\x00\x00\x36\xfe\x37\xfe\x39\xfe\x31\xfe\x00\x00\x32\xfe\x32\xff\x37\xff\x30\xff\x00\x00\x36\xff\x00\x00\x3c\xfe\x3c\xfe\x00\x00\xcf\xfe\xcb\xfe\x00\x00\x00\x00\xd0\xfe\xca\xfe\x56\xff\x55\xff\x46\xff\x44\xff\x3c\xff\x00\x00\x00\x00\x3c\xfe\x3d\xfe\x48\xff\x3d\xfe\x47\xff\x3d\xfe\x3f\xff\x00\x00\x50\xff\x17\xff\x00\x00\x00\x00\x14\xff\x25\xff\x9c\xff\xa0\xff\x00\x00\x4b\xfe\x4b\xfe\x00\x00\xda\xff\x00\x00\xb2\xff\xb1\xff\x00\x00\x00\x00\xb9\xff\xd8\xff\xc8\xff\xce\xff\xcc\xff\xcd\xff\x00\x00\xcb\xff\x9f\xfe\xa0\xfe\x00\x00\x00\x00\xa1\xfe\xbf\xfe\xbd\xfe\xbe\xfe\xbc\xfe\x00\x00\xa9\xfe\x00\x00\xae\xfe\xab\xfe\xa8\xfe\xaf\xfe\xb2\xfe\x00\x00\x93\xfe\xb1\xfe\x00\x00\x92\xfe\xaa\xfe\x00\x00\x00\x00\xb8\xfe\xbb\xfe\x9d\xfe\x00\x00\xca\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\xff\xc1\xff\x00\x00\x00\x00\xc4\xff\x13\xff\x3e\xff\x00\x00\x42\xff\x00\x00\x00\x00\x45\xff\x3b\xff\x00\x00\x39\xff\xc9\xfe\x00\x00\xce\xfe\x35\xff\x33\xfe\x00\x00\x30\xfe\xcd\xfe\x3a\xff\x3d\xfe\x43\xff\x3d\xff\x00\x00\x00\x00\x00\x00\xb8\xff\xb0\xff\x00\x00\x00\x00\x00\x00\x9c\xfe\xb7\xfe\x00\x00\xb0\xfe\xa7\xfe\x00\x00\x00\x00\xaf\xff\x00\x00\x00\x00\xd6\xff\xc0\xff\x41\xff\xbf\xff\x00\x00\xac\xff\xb7\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\xff\xb6\xff\xad\xff\xae\xff"#
-
-happyCheck :: HappyAddr
-happyCheck = HappyA# "\xff\xff\x02\x00\x03\x00\x04\x00\x36\x00\x74\x00\x15\x00\x16\x00\x17\x00\x15\x00\x16\x00\x17\x00\x17\x00\x04\x00\x35\x00\x01\x00\x01\x00\x18\x00\x03\x00\x01\x00\x04\x00\x02\x00\x1c\x00\x02\x00\x19\x00\x74\x00\x1b\x00\x0d\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\x03\x00\x14\x00\x02\x00\x5b\x00\x0d\x00\x33\x00\x39\x00\x20\x00\x21\x00\x37\x00\x23\x00\x0d\x00\x21\x00\x02\x00\x03\x00\x04\x00\x1e\x00\x2e\x00\x2a\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x79\x00\x01\x00\x79\x00\x36\x00\x76\x00\x01\x00\x2e\x00\x36\x00\x76\x00\x36\x00\x19\x00\x09\x00\x1b\x00\x0d\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\x74\x00\x01\x00\x5e\x00\x74\x00\x74\x00\x5c\x00\x33\x00\x5e\x00\x74\x00\x5c\x00\x37\x00\x5e\x00\x5e\x00\x0d\x00\x02\x00\x03\x00\x04\x00\x77\x00\x78\x00\x79\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x5c\x00\x5d\x00\x42\x00\x43\x00\x44\x00\x5b\x00\x36\x00\x5c\x00\x5d\x00\x5e\x00\x19\x00\x5e\x00\x1b\x00\x79\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\x04\x00\x01\x00\x01\x00\x79\x00\x03\x00\x5c\x00\x33\x00\x5e\x00\x74\x00\x5c\x00\x37\x00\x5e\x00\x02\x00\x0d\x00\x0d\x00\x36\x00\x36\x00\x77\x00\x78\x00\x79\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x79\x00\x76\x00\x21\x00\x1e\x00\x23\x00\x23\x00\x01\x00\x07\x00\x5c\x00\x5d\x00\x5e\x00\x2a\x00\x2b\x00\x2c\x00\x04\x00\x7b\x00\x79\x00\x01\x00\x0d\x00\x02\x00\x33\x00\x01\x00\x2c\x00\x36\x00\x36\x00\x2a\x00\x5c\x00\x54\x00\x36\x00\x0d\x00\x02\x00\x54\x00\x01\x00\x0d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x43\x00\x20\x00\x21\x00\x0d\x00\x23\x00\x48\x00\x77\x00\x78\x00\x79\x00\x01\x00\x21\x00\x2a\x00\x2b\x00\x2c\x00\x04\x00\x79\x00\x01\x00\x1e\x00\x2a\x00\x56\x00\x33\x00\x0d\x00\x79\x00\x36\x00\x5c\x00\x5c\x00\x5d\x00\x5e\x00\x0d\x00\x5c\x00\x5d\x00\x36\x00\x01\x00\x36\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x2d\x00\x02\x00\x21\x00\x0d\x00\x23\x00\x43\x00\x36\x00\x78\x00\x79\x00\x79\x00\x48\x00\x2a\x00\x2b\x00\x2c\x00\x04\x00\x5c\x00\x5d\x00\x5e\x00\x02\x00\x07\x00\x33\x00\x01\x00\x2d\x00\x36\x00\x56\x00\x07\x00\x5c\x00\x5d\x00\x5e\x00\x1e\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\x21\x00\x23\x00\x23\x00\x5c\x00\x5d\x00\x79\x00\x07\x00\x01\x00\x2a\x00\x2b\x00\x2c\x00\x04\x00\x07\x00\x79\x00\x2a\x00\x5c\x00\x04\x00\x33\x00\x76\x00\x0d\x00\x37\x00\x36\x00\x5c\x00\x5d\x00\x5e\x00\x5c\x00\x5d\x00\x77\x00\x78\x00\x79\x00\x36\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\x43\x00\x20\x00\x21\x00\x79\x00\x23\x00\x48\x00\x2a\x00\x2b\x00\x2c\x00\x04\x00\x0d\x00\x2a\x00\x2b\x00\x2c\x00\x02\x00\x33\x00\x79\x00\x1c\x00\x36\x00\x56\x00\x33\x00\x7a\x00\x7b\x00\x36\x00\x1c\x00\x5c\x00\x5d\x00\x5e\x00\x4b\x00\x41\x00\x42\x00\x43\x00\x44\x00\x74\x00\x41\x00\x42\x00\x43\x00\x44\x00\x21\x00\x2d\x00\x23\x00\x77\x00\x78\x00\x79\x00\x79\x00\x79\x00\x39\x00\x2a\x00\x2b\x00\x2c\x00\x01\x00\x36\x00\x54\x00\x39\x00\x2a\x00\x5c\x00\x33\x00\x5e\x00\x03\x00\x36\x00\x21\x00\x06\x00\x0d\x00\x54\x00\x43\x00\x05\x00\x06\x00\x07\x00\x2c\x00\x48\x00\x41\x00\x42\x00\x43\x00\x44\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x01\x00\x36\x00\x54\x00\x56\x00\x78\x00\x79\x00\x1f\x00\x34\x00\x35\x00\x5c\x00\x79\x00\x5e\x00\x0d\x00\x20\x00\x21\x00\x2a\x00\x20\x00\x21\x00\x2d\x00\x05\x00\x06\x00\x07\x00\x1e\x00\x09\x00\x1a\x00\x0b\x00\x0c\x00\x0d\x00\x07\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x2d\x00\x36\x00\x5c\x00\x5d\x00\x36\x00\x19\x00\x01\x00\x1b\x00\x03\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\x34\x00\x35\x00\x5c\x00\x5d\x00\x5e\x00\x74\x00\x33\x00\x54\x00\x0a\x00\x79\x00\x37\x00\x5a\x00\x0e\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\x54\x00\x6e\x00\x5c\x00\x5d\x00\x5e\x00\x1c\x00\x73\x00\x74\x00\x1c\x00\x76\x00\x42\x00\x43\x00\x44\x00\x79\x00\x2c\x00\x5a\x00\x79\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\x39\x00\x6e\x00\x76\x00\x39\x00\x54\x00\x1c\x00\x73\x00\x74\x00\x4b\x00\x76\x00\x77\x00\x78\x00\x79\x00\x05\x00\x06\x00\x07\x00\x0a\x00\x09\x00\x79\x00\x0b\x00\x0c\x00\x0d\x00\x76\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x01\x00\x1c\x00\x78\x00\x79\x00\x1c\x00\x19\x00\x39\x00\x1b\x00\x76\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\x77\x00\x78\x00\x79\x00\x1c\x00\x39\x00\x33\x00\x07\x00\x39\x00\x1c\x00\x37\x00\x1c\x00\x1c\x00\x01\x00\x1a\x00\x2a\x00\x3c\x00\x3d\x00\x2d\x00\x01\x00\x1a\x00\x03\x00\x42\x00\x43\x00\x44\x00\x0d\x00\x07\x00\x22\x00\x23\x00\x1a\x00\x25\x00\x0d\x00\x27\x00\x39\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x39\x00\x07\x00\x39\x00\x39\x00\x20\x00\x21\x00\x33\x00\x5a\x00\x76\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\x36\x00\x6e\x00\x5c\x00\x5d\x00\x5e\x00\x4c\x00\x73\x00\x74\x00\x1a\x00\x76\x00\x77\x00\x78\x00\x79\x00\x79\x00\x07\x00\x41\x00\x42\x00\x43\x00\x44\x00\x5a\x00\x50\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\x07\x00\x6e\x00\x5c\x00\x5d\x00\x5e\x00\x07\x00\x73\x00\x74\x00\x5c\x00\x5d\x00\x77\x00\x78\x00\x79\x00\x01\x00\x79\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x2a\x00\x74\x00\x03\x00\x2d\x00\x0d\x00\x06\x00\x22\x00\x23\x00\x79\x00\x25\x00\x76\x00\x27\x00\x79\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x07\x00\x02\x00\x03\x00\x36\x00\x1e\x00\x06\x00\x33\x00\x58\x00\x59\x00\x2a\x00\x37\x00\x36\x00\x2d\x00\x1f\x00\x1a\x00\x36\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x79\x00\x41\x00\x42\x00\x43\x00\x44\x00\x07\x00\x22\x00\x23\x00\x76\x00\x25\x00\x4c\x00\x27\x00\x08\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x33\x00\x5a\x00\x75\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\x76\x00\x6e\x00\x5c\x00\x5d\x00\x6d\x00\x4c\x00\x73\x00\x74\x00\x00\x00\x01\x00\x77\x00\x78\x00\x79\x00\x78\x00\x79\x00\x01\x00\x77\x00\x78\x00\x79\x00\x5a\x00\x2b\x00\x5c\x00\x5b\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\x41\x00\x42\x00\x43\x00\x44\x00\x73\x00\x74\x00\x36\x00\x02\x00\x77\x00\x78\x00\x79\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x5b\x00\x41\x00\x42\x00\x43\x00\x44\x00\x07\x00\x46\x00\x47\x00\x02\x00\x22\x00\x23\x00\x2b\x00\x25\x00\x01\x00\x27\x00\x01\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x4e\x00\x4f\x00\x50\x00\x19\x00\x04\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\x32\x00\x13\x00\x14\x00\x15\x00\x16\x00\x5b\x00\x33\x00\x01\x00\x4c\x00\x03\x00\x37\x00\x5c\x00\x5d\x00\x78\x00\x79\x00\x41\x00\x42\x00\x43\x00\x44\x00\x0d\x00\x5c\x00\x5d\x00\x5a\x00\x5e\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\x5a\x00\x6e\x00\x5c\x00\x04\x00\x5e\x00\x5f\x00\x73\x00\x74\x00\x2a\x00\x2b\x00\x77\x00\x78\x00\x79\x00\x21\x00\x5e\x00\x23\x00\x2a\x00\x2b\x00\x07\x00\x2a\x00\x2b\x00\x23\x00\x2a\x00\x2b\x00\x2c\x00\x73\x00\x74\x00\x02\x00\x2a\x00\x2b\x00\x2c\x00\x33\x00\x02\x00\x77\x00\x78\x00\x79\x00\x19\x00\x33\x00\x1b\x00\x2b\x00\x1d\x00\x1e\x00\x1f\x00\x04\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\x2a\x00\x2b\x00\x36\x00\x5c\x00\x5d\x00\x33\x00\x4e\x00\x4f\x00\x50\x00\x37\x00\x77\x00\x78\x00\x79\x00\x41\x00\x42\x00\x43\x00\x44\x00\x19\x00\x04\x00\x1b\x00\x04\x00\x1d\x00\x1e\x00\x1f\x00\x2c\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\x2a\x00\x5c\x00\x01\x00\x5e\x00\x5f\x00\x33\x00\x79\x00\x2b\x00\x21\x00\x37\x00\x23\x00\x1e\x00\x79\x00\x5e\x00\x23\x00\x5c\x00\x5d\x00\x2a\x00\x2b\x00\x2c\x00\x07\x00\x2a\x00\x2b\x00\x2c\x00\x73\x00\x74\x00\x33\x00\x17\x00\x18\x00\x36\x00\x33\x00\x79\x00\x1e\x00\x36\x00\x5e\x00\x77\x00\x78\x00\x79\x00\x19\x00\x04\x00\x1b\x00\x04\x00\x1d\x00\x1e\x00\x1f\x00\x30\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\x11\x00\x12\x00\x77\x00\x78\x00\x79\x00\x19\x00\x02\x00\x1b\x00\x5e\x00\x1d\x00\x1e\x00\x1f\x00\x04\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\x36\x00\x77\x00\x78\x00\x79\x00\x04\x00\x33\x00\x77\x00\x78\x00\x79\x00\x37\x00\x23\x00\x41\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\x5c\x00\x5d\x00\x33\x00\x0b\x00\x0c\x00\x36\x00\x41\x00\x42\x00\x43\x00\x44\x00\x02\x00\x77\x00\x78\x00\x79\x00\x19\x00\x02\x00\x1b\x00\x02\x00\x1d\x00\x1e\x00\x1f\x00\x1f\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\x2d\x00\x03\x00\x2a\x00\x2b\x00\x33\x00\x3c\x00\x78\x00\x79\x00\x37\x00\x2a\x00\x2b\x00\x0d\x00\x2b\x00\x77\x00\x78\x00\x79\x00\x19\x00\x2b\x00\x1b\x00\x02\x00\x1d\x00\x1e\x00\x1f\x00\x2b\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\x5c\x00\x5d\x00\x33\x00\x36\x00\x1c\x00\x1d\x00\x37\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x36\x00\x21\x00\x2c\x00\x23\x00\x43\x00\x77\x00\x78\x00\x79\x00\x1e\x00\x48\x00\x2a\x00\x2b\x00\x2c\x00\x43\x00\x05\x00\x06\x00\x07\x00\x02\x00\x48\x00\x33\x00\x77\x00\x78\x00\x79\x00\x56\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x17\x00\x18\x00\x5e\x00\x56\x00\x02\x00\x42\x00\x43\x00\x44\x00\x02\x00\x5c\x00\x5d\x00\x5e\x00\x05\x00\x06\x00\x07\x00\x11\x00\x12\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x37\x00\x02\x00\x77\x00\x78\x00\x79\x00\x77\x00\x78\x00\x79\x00\x0b\x00\x0c\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\x2c\x00\x73\x00\x74\x00\x1e\x00\x76\x00\x5a\x00\x5c\x00\x5c\x00\x2d\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\x1e\x00\x6e\x00\x77\x00\x78\x00\x79\x00\x30\x00\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\x5b\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\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\x4d\x00\x04\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\x5e\x00\x5c\x00\x05\x00\x06\x00\x07\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x30\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\x02\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x5a\x00\x79\x00\x5c\x00\x2b\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\x4e\x00\x4f\x00\x50\x00\x1f\x00\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\x01\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\x02\x00\x6e\x00\x05\x00\x06\x00\x07\x00\x2c\x00\x73\x00\x74\x00\x1f\x00\x76\x00\x2a\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x5e\x00\x04\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\x4e\x00\x4f\x00\x50\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\x01\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\x2c\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\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\x1f\x00\x73\x00\x74\x00\x5a\x00\x76\x00\x5c\x00\x01\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\x05\x00\x06\x00\x07\x00\x1f\x00\x73\x00\x74\x00\x02\x00\x76\x00\x02\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x01\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x2b\x00\x42\x00\x43\x00\x44\x00\x2b\x00\x5b\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\x77\x00\x78\x00\x79\x00\x5c\x00\x2a\x00\x5a\x00\x46\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\x2a\x00\x6e\x00\x2a\x00\x70\x00\x78\x00\x79\x00\x73\x00\x74\x00\x77\x00\x78\x00\x79\x00\x02\x00\x02\x00\x5a\x00\x79\x00\x5c\x00\x5e\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\x2a\x00\x6e\x00\x4e\x00\x4f\x00\x50\x00\x1e\x00\x73\x00\x74\x00\x5a\x00\x76\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\x1b\x00\x6e\x00\x0c\x00\x0d\x00\x19\x00\x10\x00\x73\x00\x74\x00\x04\x00\x76\x00\x01\x00\x5b\x00\x03\x00\x02\x00\x02\x00\x19\x00\x02\x00\x1b\x00\x5e\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\x01\x00\x20\x00\x21\x00\x33\x00\x23\x00\x57\x00\x2b\x00\x37\x00\x4e\x00\x4f\x00\x50\x00\x2a\x00\x2b\x00\x2c\x00\x46\x00\x4e\x00\x4f\x00\x50\x00\x2b\x00\x5e\x00\x33\x00\x2c\x00\x01\x00\x36\x00\x2c\x00\x36\x00\x5a\x00\x01\x00\x5c\x00\x30\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x41\x00\x42\x00\x43\x00\x44\x00\x43\x00\x0d\x00\x2c\x00\x30\x00\x5a\x00\x48\x00\x5c\x00\x2c\x00\x5e\x00\x5f\x00\x60\x00\x37\x00\x01\x00\x73\x00\x74\x00\x3b\x00\x3c\x00\x3d\x00\x2c\x00\x56\x00\x03\x00\x41\x00\x42\x00\x43\x00\x44\x00\x5c\x00\x5d\x00\x5e\x00\x01\x00\x73\x00\x74\x00\x2b\x00\x02\x00\x77\x00\x78\x00\x79\x00\x30\x00\x31\x00\x2c\x00\x33\x00\x02\x00\x35\x00\x5b\x00\x5e\x00\x38\x00\x01\x00\x65\x00\x3b\x00\x01\x00\x3d\x00\x3e\x00\x3f\x00\x79\x00\x4e\x00\x4f\x00\x50\x00\x44\x00\x45\x00\x01\x00\x47\x00\x04\x00\x5e\x00\x4a\x00\x4b\x00\x01\x00\x4d\x00\x4e\x00\x5e\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x01\x00\x77\x00\x78\x00\x79\x00\x2c\x00\x65\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x01\x00\x77\x00\x78\x00\x79\x00\x1e\x00\x65\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x01\x00\x01\x00\x10\x00\x4e\x00\x4f\x00\x50\x00\x5a\x00\x1e\x00\x5c\x00\x01\x00\x5e\x00\x5f\x00\x60\x00\x1b\x00\x2b\x00\x38\x00\x2b\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x1e\x00\x41\x00\x42\x00\x43\x00\x44\x00\x2b\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\x65\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\x01\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x5b\x00\x31\x00\x10\x00\x65\x00\x2a\x00\x5a\x00\x36\x00\x5c\x00\x1b\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x1b\x00\x3e\x00\x77\x00\x78\x00\x79\x00\x1a\x00\x43\x00\x77\x00\x78\x00\x79\x00\x47\x00\x48\x00\x77\x00\x78\x00\x79\x00\x19\x00\x4d\x00\x73\x00\x74\x00\x50\x00\x2f\x00\x52\x00\x31\x00\x10\x00\x33\x00\x56\x00\x35\x00\x36\x00\xff\xff\x38\x00\xff\xff\xff\xff\x3b\x00\x5e\x00\x3d\x00\x3e\x00\x3f\x00\x4e\x00\x4f\x00\x50\x00\x43\x00\x44\x00\x45\x00\xff\xff\x47\x00\x48\x00\xff\xff\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\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\x4e\x00\x4f\x00\x50\x00\xff\xff\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\x4e\x00\x4f\x00\x50\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\x77\x00\x78\x00\x79\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\x02\x00\x03\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x2c\x00\xff\xff\xff\xff\x2f\x00\x42\x00\x43\x00\x44\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\x01\x00\x02\x00\x03\x00\x44\x00\x45\x00\x77\x00\x78\x00\x79\x00\xff\xff\x4a\x00\x4b\x00\x4c\x00\x04\x00\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\x78\x00\x79\x00\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\x01\x00\x43\x00\x03\x00\xff\xff\x05\x00\x06\x00\x48\x00\xff\xff\x09\x00\x0a\x00\x1b\x00\xff\xff\x38\x00\xff\xff\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x56\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\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\x0d\x00\x0e\x00\x0f\x00\x44\x00\x45\x00\x01\x00\x02\x00\x03\x00\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\x0d\x00\x0e\x00\x0f\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\x36\x00\xff\xff\xff\xff\xff\xff\x48\x00\x3b\x00\x3c\x00\x3d\x00\x1b\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\x5a\x00\x56\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x2b\x00\x2c\x00\x5e\x00\xff\xff\x2f\x00\x30\x00\xff\xff\x32\x00\xff\xff\x34\x00\xff\xff\xff\xff\x37\x00\xff\xff\x39\x00\x3a\x00\x37\x00\xff\xff\x73\x00\x74\x00\xff\xff\x40\x00\x41\x00\x42\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x49\x00\x46\x00\x47\x00\x4c\x00\xff\xff\xff\xff\x4f\x00\xff\xff\xff\xff\x01\x00\xff\xff\x03\x00\x78\x00\x79\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\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\xff\xff\xff\xff\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\x42\x00\x43\x00\x44\x00\x0d\x00\x46\x00\x47\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\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\x36\x00\x5a\x00\xff\xff\x5c\x00\x36\x00\x5e\x00\x5f\x00\x36\x00\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x43\x00\x78\x00\x79\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\xff\xff\xff\xff\xff\xff\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\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\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\x73\x00\x74\x00\x2c\x00\x2d\x00\x36\x00\x2f\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\x1b\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\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\x73\x00\x74\x00\x4c\x00\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\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\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\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\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\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\x5a\x00\x01\x00\x5c\x00\x03\x00\x5e\x00\x5f\x00\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\x73\x00\x74\x00\x1b\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\xff\xff\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\x01\x00\xff\xff\x03\x00\x73\x00\x74\x00\x56\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x0d\x00\x5e\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\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\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\x73\x00\x74\x00\x36\x00\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\x1b\x00\x5e\x00\x5f\x00\x60\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\x56\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x5e\x00\xff\xff\x10\x00\x2f\x00\xff\xff\x73\x00\x74\x00\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\xff\xff\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\xff\xff\x2c\x00\xff\xff\x4c\x00\x2f\x00\xff\xff\xff\xff\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\xff\xff\x36\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x01\x00\xff\xff\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x01\x00\x02\x00\xff\xff\xff\xff\x0d\x00\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\x79\x00\xff\xff\x10\x00\x73\x00\x74\x00\xff\xff\xff\xff\x36\x00\x2f\x00\xff\xff\x5a\x00\xff\xff\x5c\x00\x1b\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2c\x00\xff\xff\xff\xff\x2f\x00\xff\xff\x73\x00\x74\x00\x4c\x00\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x5e\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\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\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\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\x5a\x00\x2f\x00\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\xff\xff\x1b\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\x73\x00\x74\x00\xff\xff\x2f\x00\xff\xff\x4c\x00\x78\x00\x79\x00\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\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\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\xff\xff\xff\xff\x4c\x00\x73\x00\x74\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2f\x00\xff\xff\xff\xff\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\xff\xff\xff\xff\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\xff\xff\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\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\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\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2f\x00\xff\xff\xff\xff\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\xff\xff\xff\xff\x10\x00\x2f\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x1b\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\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\xff\xff\xff\xff\xff\xff\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\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\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\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\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\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\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\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x5c\x00\x5d\x00\x5e\x00\xff\xff\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x0d\x00\x38\x00\xff\xff\x01\x00\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x0d\x00\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\x1e\x00\x03\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x5d\x00\x5e\x00\xff\xff\x36\x00\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\x43\x00\x35\x00\xff\xff\xff\xff\x38\x00\x48\x00\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\x56\x00\xff\xff\xff\xff\x4a\x00\x4b\x00\xff\xff\x5c\x00\x4e\x00\x5e\x00\xff\xff\x51\x00\x36\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x5c\x00\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\xff\xff\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\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x33\x00\x42\x00\x43\x00\x44\x00\x37\x00\x46\x00\x47\x00\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\x78\x00\x79\x00\x37\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\x42\x00\x43\x00\x44\x00\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\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x33\x00\x42\x00\x43\x00\x44\x00\x37\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\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\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\x78\x00\x79\x00\xff\xff\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\x48\x00\x49\x00\x4a\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\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\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x21\x00\xff\xff\x23\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\x21\x00\xff\xff\x23\x00\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\x23\x00\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\x33\x00\x79\x00\xff\xff\x36\x00\x78\x00\x79\x00\x33\x00\xff\xff\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\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\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\x79\x00\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\x4c\x00\xff\xff\xff\xff\xff\xff\x79\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x79\x00\xff\xff\xff\xff\xff\xff\x5a\x00\x4c\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\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\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\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\xff\xff\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\x2e\x00\x2f\x00\x30\x00\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\x22\x00\x23\x00\x33\x00\x25\x00\xff\xff\x27\x00\x37\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\x22\x00\x23\x00\x37\x00\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\xff\xff\x4c\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\x77\x00\x78\x00\x79\x00\xff\xff\x22\x00\x23\x00\x4c\x00\x25\x00\xff\xff\x27\x00\xff\xff\x29\x00\x2a\x00\x2b\x00\x2c\x00\x77\x00\x78\x00\x79\x00\xff\xff\x23\x00\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\x37\x00\x2a\x00\x2b\x00\x2c\x00\x36\x00\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\x33\x00\xff\xff\xff\xff\x36\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x23\x00\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x32\x00\x33\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\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\x36\x00\xff\xff\xff\xff\xff\xff\x71\x00\xff\xff\x73\x00\x74\x00\xff\xff\x37\x00\x77\x00\x78\x00\x79\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x46\x00\x47\x00\xff\xff\xff\xff\x79\x00\xff\xff\xff\xff\xff\xff\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\x37\x00\xff\xff\xff\xff\x36\x00\x71\x00\xff\xff\x73\x00\x74\x00\x3b\x00\x3c\x00\x3d\x00\xff\xff\x79\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x77\x00\x78\x00\x79\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\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\xff\xff\xff\xff\xff\xff\x71\x00\xff\xff\x73\x00\x74\x00\xff\xff\xff\xff\x77\x00\x78\x00\x79\x00\x37\x00\x77\x00\x78\x00\x79\x00\x3b\x00\x3c\x00\x3d\x00\x37\x00\x36\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\xff\xff\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\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\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\x73\x00\x74\x00\x77\x00\x78\x00\x79\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x33\x00\xff\xff\x35\x00\x36\x00\xff\xff\x38\x00\x5d\x00\x5e\x00\x3b\x00\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x54\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\x00\x5e\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\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\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\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\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\x73\x00\x74\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x88\x00\x4c\x00\x4d\x00\xa2\x01\x7b\x03\x5e\x03\x12\x03\x13\x03\x11\x03\x12\x03\x13\x03\x60\x03\x3d\xfe\xe6\x02\x25\x02\x8d\x01\x72\x03\xaa\x00\xcb\x01\x35\x03\x25\x03\x1a\x02\x7a\x03\x4e\x00\x69\x03\x4f\x00\x26\x02\x50\x00\x51\x00\x52\x00\xcc\x01\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xd4\x02\x16\x03\xf8\x00\x7b\x02\x82\x02\xef\x00\x5f\x00\x84\x01\xc7\x00\xb9\x00\x60\x00\xc8\x00\xf7\x01\xbc\x00\x3d\x01\x4c\x00\x4d\x00\x75\x01\x36\x03\x7b\x03\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x9c\x00\x25\x02\x4f\x03\xba\x00\x83\x02\xcb\x01\x76\x01\xbd\x00\xe2\x01\xf9\x00\x4e\x00\x71\x03\x4f\x00\x26\x02\x50\x00\x51\x00\x52\x00\xcc\x01\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x14\x03\x97\x01\x86\x00\x14\x03\x14\x03\x84\x00\x5f\x00\x86\x00\x73\x03\x84\x00\x60\x00\x86\x00\x86\x00\xd6\x00\x4b\x00\x4c\x00\x4d\x00\x68\x00\x69\x00\x6a\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\xf0\x00\x4b\x00\xc8\x01\x63\x00\xc9\x01\x2a\x00\xb6\x00\x84\x00\x98\x01\x86\x00\x4e\x00\x86\x00\x4f\x00\xc9\x00\x50\x00\x51\x00\x52\x00\xbe\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\xaa\x00\xcb\x01\x06\x02\x4f\x03\xaa\x00\x84\x00\x5f\x00\x86\x00\x6a\x03\x84\x00\x60\x00\x86\x00\x55\x03\xcc\x01\x07\x02\xdd\x01\xbd\x00\x68\x00\x69\x00\x6a\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x9c\x00\x39\x03\xab\x00\xfb\x02\xac\x00\xc4\x00\x25\x02\x3b\x03\x84\x00\x98\x01\x86\x00\xad\x00\x5d\x00\x5e\x00\xd7\x00\xe1\x02\xb7\x00\xd3\x02\x26\x02\xe0\x02\x5f\x00\x25\x02\x9d\x01\xae\x00\xc5\x00\x56\x03\xde\x01\x0a\x03\x3c\xfe\xf7\x01\x6d\x03\x0b\x03\xf6\x01\x26\x02\xaf\x00\x62\x00\x63\x00\x64\x00\xb0\x00\x66\x00\x67\x00\x3c\xfe\xd8\x00\xb9\x00\xf7\x01\xd9\x00\x3c\xfe\x68\x00\x69\x00\x6a\x00\xcb\x01\xb5\x00\xda\x00\x5d\x00\x5e\x00\x9e\x01\xbe\x00\xd4\x02\x6e\x03\xe1\x02\x3c\xfe\x5f\x00\xcc\x01\x60\x02\xba\x00\x84\x00\x84\x00\xd7\x00\x86\x00\xf7\x01\xf0\x00\x4b\x00\xb6\x00\xd5\x00\xa1\x00\xdb\x00\x62\x00\x63\x00\x64\x00\xdc\x00\x66\x00\x67\x00\x54\x03\x41\x03\x9f\x01\xd6\x00\xa0\x01\xa2\x00\xae\x00\xb1\x00\x6a\x00\xc6\x00\xa3\x00\xa1\x01\x5d\x00\x5e\x00\x96\x00\x84\x00\xd7\x00\x86\x00\xf9\x01\x19\x03\x5f\x00\xec\x02\xe8\x02\xa2\x01\xa4\x00\x1a\x03\x84\x00\xd7\x00\x86\x00\x42\x03\x84\x00\xd7\x00\x86\x00\xf7\x01\xa3\x01\x62\x00\x63\x00\x64\x00\xa4\x01\x66\x00\x67\x00\x84\x00\xd7\x00\x97\x00\xc3\x00\x98\x00\xc4\x00\xf0\x00\x4b\x00\xdd\x00\x1b\x03\x6c\x00\x99\x00\x5d\x00\x5e\x00\x86\x02\x1d\x03\xb7\x00\xfa\x01\x84\x00\x89\x02\x5f\x00\x28\x03\x6d\x00\x0c\x02\xc5\x00\x84\x00\x98\x01\x86\x00\xf0\x00\x4b\x00\xc1\x02\x80\x02\x6a\x00\xa1\x00\x9a\x00\x62\x00\x63\x00\x64\x00\x9b\x00\x66\x00\x67\x00\x84\x00\xd7\x00\xab\x00\xcb\x01\xac\x00\xa2\x00\xd8\x00\xb9\x00\x9c\x00\xd9\x00\xa3\x00\xad\x00\x5d\x00\x5e\x00\x1c\x03\xcc\x01\xda\x00\x5d\x00\x5e\x00\x67\x02\x5f\x00\x60\x02\x98\x02\xae\x00\xa4\x00\x5f\x00\xda\x01\xdb\x01\xba\x00\x99\x02\x84\x00\xd7\x00\x86\x00\x8c\x02\xaf\x00\x62\x00\x63\x00\xd0\x01\x9a\x02\xdb\x00\x62\x00\x63\x00\xd0\x01\x9f\x01\xa8\x02\xa0\x01\x0d\x02\x8c\x00\x6a\x00\x9c\x00\xc6\x00\x84\x01\xa1\x01\x5d\x00\x5e\x00\x97\x01\xa1\x00\xb4\x02\x84\x01\x68\x02\x84\x00\x5f\x00\x86\x00\xa8\xfe\xa2\x01\xbc\x00\xa8\xfe\xd6\x00\xec\x01\xa2\x00\x6e\x03\x32\x00\x33\x00\xd7\x01\xa3\x00\xa3\x01\x62\x00\x63\x00\xd0\x01\x90\x02\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x25\x02\xbd\x00\x16\x02\xa4\x00\x87\x02\x6a\x00\xa8\xfe\xda\x02\xe1\x01\x84\x00\xdd\x00\x86\x00\x26\x02\xc0\x00\xb9\x00\x37\x03\xb8\x00\xb9\x00\x38\x03\x46\x02\x32\x00\x33\x00\x91\x02\x8d\x02\x19\x02\x48\x02\x49\x02\x4a\x02\x1b\x02\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x1e\x02\xba\x00\xf0\x00\x4b\x00\xba\x00\x4b\x02\xa9\x00\x4f\x00\xaa\x00\x50\x00\x4c\x02\x4d\x02\x9c\x00\x53\x00\x4e\x02\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xe0\x01\xe1\x01\x84\x00\x98\x01\x86\x00\x42\x02\x5f\x00\x20\x02\x70\x01\xbe\x00\x4f\x02\x06\x00\x71\x01\x07\x00\xe2\x01\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\x16\x00\x2f\x02\x39\x00\x84\x00\xd7\x00\x86\x00\x89\x01\x18\x00\x19\x00\xa8\x01\x3a\x00\x92\x00\x63\x00\xe9\x01\xc1\x00\xe5\xff\x06\x00\xbb\x00\x07\x00\x86\x01\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\x16\x00\x84\x01\x39\x00\xe2\x01\x84\x01\x35\x02\xc6\x01\x18\x00\x19\x00\x43\x02\x3a\x00\x68\x00\xc3\x01\x6a\x00\x46\x02\x32\x00\x33\x00\x44\x02\x47\x02\x60\x02\x48\x02\x49\x02\x4a\x02\x3f\x01\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x92\x01\x1a\x02\x95\x00\x6a\x00\x83\x01\x4b\x02\x84\x01\x4f\x00\x40\x01\x50\x00\x4c\x02\x4d\x02\xd6\x00\x53\x00\x4e\x02\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x0d\x01\x70\x03\x8c\x00\x6a\x00\x89\x01\x84\x01\x5f\x00\x86\x01\x84\x01\x99\x01\x4f\x02\xa8\x01\xc6\x01\x97\x01\x82\x01\xea\x02\x23\x02\xcf\x00\xeb\x02\x06\x02\x88\x01\xaa\x00\xc8\x01\x63\x00\xc9\x01\xd6\x00\x8a\x01\x0e\x01\x55\x00\x98\x01\x0f\x01\x07\x02\x10\x01\x84\x01\x11\x01\x5c\x00\x5d\x00\x5e\x00\x84\x01\x9a\x01\x84\x01\x84\x01\xc0\x00\xb9\x00\x5f\x00\x06\x00\x9b\x01\x07\x00\x12\x01\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\x16\x00\xba\x00\x39\x00\x84\x00\xd7\x00\x86\x00\x68\x01\x18\x00\x19\x00\xa7\x01\x3a\x00\x68\x00\xc3\x01\x6a\x00\x9c\x00\xa9\x01\xcf\x01\x62\x00\x63\x00\xd0\x01\x06\x00\xbc\x01\x07\x00\xc5\x01\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\x16\x00\x0d\x01\x14\x01\x84\x00\x98\x01\x86\x00\xc7\x01\x18\x00\x19\x00\x84\x00\xd7\x00\x68\x00\x15\x01\x6a\x00\xf6\x01\x9c\x00\x7d\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x30\x03\xd4\x01\x75\x02\x31\x03\xf7\x01\x76\x02\x0e\x01\x55\x00\xc1\x00\x0f\x01\xd5\x01\x10\x01\x9c\x00\x11\x01\x5c\x00\x5d\x00\x5e\x00\x0d\x01\x20\x03\x21\x03\x9f\x00\x04\x03\x22\x03\x5f\x00\x2b\x03\x2c\x03\xdd\x02\x12\x01\xae\x00\xde\x02\x2e\x03\xa4\x00\xae\x00\x2b\x02\xce\x00\xcf\x00\x2c\x02\xd1\x00\x9c\x00\xd1\x01\x62\x00\x63\x00\xd0\x01\xe7\x00\x0e\x01\x55\x00\xed\x00\x0f\x01\x69\x01\x10\x01\xfa\x00\x11\x01\x5c\x00\x5d\x00\x5e\x00\x7e\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x5f\x00\x06\x00\x04\x01\x07\x00\x12\x01\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\x16\x00\x0a\x01\x14\x01\x84\x00\xd7\x00\x2b\x01\x6b\x01\x18\x00\x19\x00\x87\x00\x05\x00\x68\x00\x15\x01\x6a\x00\x2d\x02\x6a\x00\x05\x00\x7f\x02\x80\x02\x6a\x00\x06\x00\x7d\x03\x07\x00\x2a\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\x16\x00\x0d\x01\x14\x01\x38\x02\x62\x00\x63\x00\xd0\x01\x18\x00\x19\x00\xae\x00\x7e\x03\x68\x00\x15\x01\x6a\x00\x2b\x02\xce\x00\xcf\x00\x2c\x02\xd1\x00\x2a\x00\xd1\x01\x62\x00\x63\x00\x64\x00\xb5\x02\xd2\x01\x67\x00\x7f\x03\x0e\x01\x55\x00\x75\x03\x0f\x01\x76\x03\x10\x01\x77\x03\x11\x01\x5c\x00\x5d\x00\x5e\x00\x38\x03\xa6\x00\xa7\x00\xbe\x01\x69\x03\x4f\x00\x5f\x00\x50\x00\xbf\x01\xc0\x01\x12\x01\x53\x00\xc1\x01\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5a\x03\x20\x01\x21\x01\x22\x01\x23\x01\x2a\x00\x5f\x00\x65\x01\x13\x01\xaa\x00\xc2\x01\xf0\x00\x4b\x00\x2d\x02\x6a\x00\xf9\x02\x62\x00\x63\x00\xd0\x01\x66\x01\x3d\x03\x3e\x03\x06\x00\x86\x00\x07\x00\x6c\x03\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\x16\x00\x06\x00\x14\x01\x07\x00\x58\x03\x00\x01\x09\x00\x18\x00\x19\x00\xfe\x02\xff\x02\x68\x00\x15\x01\x6a\x00\x97\x00\x86\x00\x98\x00\x00\x03\x01\x03\xee\x01\xfa\x01\x19\x03\x98\x00\x99\x00\x5d\x00\x5e\x00\x18\x00\x19\x00\x5d\x03\x99\x00\x5d\x00\x5e\x00\x5f\x00\x5e\x03\x68\x00\xc3\x01\x6a\x00\xbe\x01\x5f\x00\x4f\x00\x60\x03\x50\x00\xbf\x01\xc0\x01\x63\x03\x53\x00\xc1\x01\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x17\x02\xfa\x01\x8f\x02\xa2\x01\xf0\x00\x4b\x00\x5f\x00\x26\x02\xa6\x00\xa7\x00\xc2\x01\x49\x03\x8c\x00\x6a\x00\xe5\x01\x62\x00\x63\x00\xd0\x01\xbe\x01\x64\x03\x4f\x00\x65\x03\x50\x00\xbf\x01\xc0\x01\x3d\x00\x53\x00\xc1\x01\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x06\x00\x40\x03\x07\x00\x3f\x03\x02\x01\x09\x00\x5f\x00\x9c\x00\x43\x03\x9f\x01\xc2\x01\xa0\x01\x49\x03\x9c\x00\x86\x00\xac\x00\xf0\x00\x4b\x00\xa1\x01\x5d\x00\x5e\x00\x21\x02\xad\x00\x5d\x00\x5e\x00\x18\x00\x19\x00\x5f\x00\x1e\x01\x1f\x01\xa2\x01\x5f\x00\x9c\x00\x4f\x03\xae\x00\x86\x00\x68\x00\xc3\x01\x6a\x00\xbe\x01\x51\x03\x4f\x00\x53\x03\x50\x00\xbf\x01\xc0\x01\x86\x01\x53\x00\xc1\x01\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x30\x02\x92\x01\xcf\x00\x93\x01\xd1\x00\x9d\x02\x5f\x00\x92\x00\x63\x00\x93\x00\xc2\x01\x94\x00\x67\x00\x24\x01\x25\x01\x68\x00\xc3\x01\x6a\x00\xbe\x01\xe3\x02\x4f\x00\x86\x00\x50\x00\xbf\x01\xc0\x01\xf0\x02\x53\x00\xc1\x01\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x9c\x00\xae\x00\xfb\x02\xfc\x02\x6a\x00\xf1\x02\x5f\x00\x4a\x03\x8c\x00\x6a\x00\xc2\x01\xa0\x01\xd1\x01\x62\x00\x63\x00\xd0\x01\x4c\x03\xf4\x02\xa1\x01\x5d\x00\x5e\x00\x36\x02\xf5\x02\x95\x01\x6a\x00\xf0\x00\x4b\x00\x5f\x00\x26\x01\x27\x01\xa2\x01\xf9\x02\x62\x00\x63\x00\xd0\x01\xf6\x02\x68\x00\xc3\x01\x6a\x00\xbe\x01\xf7\x02\x4f\x00\x0a\x03\x50\x00\xbf\x01\xc0\x01\xee\x01\x53\x00\xc1\x01\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xbd\x01\x06\x02\x18\x03\xaa\x00\xe4\x00\xe5\x00\x5f\x00\x0d\x03\xd3\x01\x6a\x00\xc2\x01\xe6\x00\xe7\x00\x07\x02\x0e\x03\x68\x00\xc3\x01\x6a\x00\xbe\x01\x0f\x03\x4f\x00\x10\x03\x50\x00\xbf\x01\xc0\x01\x17\x03\x53\x00\xc1\x01\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x9c\x00\x6f\x03\x32\x00\x33\x00\xf0\x00\x4b\x00\x5f\x00\xa1\x00\x18\x01\x19\x01\xc2\x01\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\xa1\x00\x97\x00\x3d\x00\x98\x00\xa2\x00\x4b\x03\x8c\x00\x6a\x00\x2b\x03\xa3\x00\x99\x00\x5d\x00\x5e\x00\xa2\x00\x45\x03\x32\x00\x33\x00\x1f\x03\xa3\x00\x5f\x00\x68\x00\xc3\x01\x6a\x00\xa4\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x1e\x01\x1f\x01\x86\x00\xa4\x00\x23\x03\xc8\x01\x63\x00\xc9\x01\x26\x03\x84\x00\xd7\x00\x86\x00\x10\x03\x32\x00\x33\x00\x24\x01\x25\x01\x77\x02\xa6\x00\xa7\x00\x78\x02\x79\x02\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\xe8\x01\x27\x03\x68\x00\xc3\x01\x6a\x00\xf1\x02\x8c\x00\x6a\x00\x26\x01\x27\x01\x8f\x00\x62\x00\x63\x00\xd0\x01\x06\x00\x7c\x02\x07\x00\x7d\x02\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\x16\x00\x9c\x00\x39\x00\xf2\x02\x8c\x00\x6a\x00\x63\x02\x18\x00\x19\x00\x3e\xfe\x3a\x00\x06\x00\xbc\x01\x07\x00\x8c\x02\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\x16\x00\x92\x02\x39\x00\x68\x00\x91\x00\x6a\x00\x86\x01\x18\x00\x19\x00\x06\x00\x3a\x00\x07\x00\x2a\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\x16\x00\x9c\x02\x39\x00\x95\x02\x32\x00\x33\x00\xa1\x00\x18\x00\x19\x00\x9d\x02\x3a\x00\xa5\x02\xa7\x02\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\xee\x01\xa2\x00\xca\x00\xb3\x02\xa2\x01\xb4\x02\xa3\x00\xbc\x02\xbd\x02\x9e\x02\xce\x00\xcf\x00\x96\x02\x32\x00\x33\x00\xe5\x01\x62\x00\x63\x00\xd0\x01\xbf\x02\xa4\x00\xc0\x02\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x2a\x02\xce\x00\xcf\x00\x05\x03\xa6\x00\xa7\x00\xcf\x01\x62\x00\x63\x00\xd0\x01\x86\x00\xd1\x02\x97\x02\x32\x00\x33\x00\x66\x01\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x86\x01\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\xcb\x00\xd6\x02\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd7\x02\xd2\x00\x62\x00\x63\x00\x64\x00\xd3\x00\x66\x00\x67\x00\x06\x00\x9c\x00\x07\x00\xda\x02\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\x16\x00\x9c\x00\x39\x00\x26\x02\xa6\x00\xa7\x00\xdc\x02\x18\x00\x19\x00\x06\x00\x3a\x00\x07\x00\xdf\x02\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\x16\x00\xdf\x01\x39\x00\x23\x03\xa6\x00\xa7\x00\xe0\x01\x18\x00\x19\x00\x06\x00\x3a\x00\x07\x00\xe5\x01\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\x16\x00\xec\x01\x39\x00\x41\x02\x32\x00\x33\x00\xe4\x01\x18\x00\x19\x00\xee\x01\x3a\x00\xfb\x01\xfc\x01\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x86\x00\x12\x02\xe0\x00\x26\x02\xa6\x00\xa7\x00\xa2\x02\xa6\x00\xa7\x00\x2a\x02\xce\x00\xcf\x00\x52\x02\x32\x00\x33\x00\xcf\x01\x62\x00\x63\x00\xd0\x01\xa3\x02\xa6\x00\xa7\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x7d\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x26\x02\xa6\x00\xa7\x00\xb8\x02\x8c\x00\x6a\x00\x76\x01\x32\x00\x33\x00\xbd\x02\x8c\x00\x6a\x00\xc2\x02\x8c\x00\x6a\x00\xee\x01\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\xe1\x00\x19\x02\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\x3d\x00\xd2\x00\x62\x00\x63\x00\x64\x00\xe2\x00\x66\x00\x67\x00\x06\x00\x9c\x00\x07\x00\x20\x02\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\x16\x00\xee\x01\x39\x00\xc3\x02\x8c\x00\x6a\x00\x28\x02\x18\x00\x19\x00\x06\x00\x3a\x00\x07\x00\x29\x02\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\x16\x00\x78\x01\x39\x00\xc4\x02\x8c\x00\x6a\x00\xee\x01\x18\x00\x19\x00\x06\x00\x3a\x00\x07\x00\x34\x02\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\x16\x00\x86\x00\x39\x00\xf1\x00\x32\x00\x33\x00\xee\x01\x18\x00\x19\x00\x3a\x02\x3a\x00\x3b\x02\x3c\x02\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x40\x02\x92\x01\xcf\x00\x93\x01\xd1\x00\x9d\x02\x3d\x02\x92\x00\x63\x00\xe9\x01\x3e\x02\x2a\x00\x31\x00\x32\x00\x33\x00\xcf\x01\x62\x00\x63\x00\xd0\x01\xc8\x02\x8c\x00\x6a\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x7d\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\xc9\x02\x8c\x00\x6a\x00\xbc\x01\x54\x02\x06\x00\x46\x02\x07\x00\x57\x02\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\x16\x00\x55\x02\xea\x00\x56\x02\x79\x01\x95\x01\x6a\x00\x18\x00\x19\x00\xcd\x02\x8c\x00\x6a\x00\x58\x02\x59\x02\x06\x00\x9c\x00\x07\x00\x86\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\x16\x00\x64\x02\x39\x00\xd8\x02\xa6\x00\xa7\x00\x66\x02\x18\x00\x19\x00\x06\x00\x3a\x00\x07\x00\x1b\x01\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\x16\x00\x1a\x01\x39\x00\x85\x02\x4a\x02\x1c\x01\x1d\x01\x18\x00\x19\x00\x69\x02\x3a\x00\x06\x02\x6b\x01\xaa\x00\x5d\x01\x5e\x01\x4b\x02\x68\x01\x4f\x00\x86\x00\x50\x00\x4c\x02\x4d\x02\x07\x02\x53\x00\x4e\x02\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\xa5\x00\xa6\x00\xa7\x00\x74\x01\xd8\x00\xb9\x00\x5f\x00\xd9\x00\x78\x01\x7c\x01\x4f\x02\xe6\x01\xa6\x00\xa7\x00\xda\x00\x5d\x00\x5e\x00\x73\x01\xe7\x01\xa6\x00\xa7\x00\x7e\x01\x86\x00\x5f\x00\x3d\x00\x88\x01\xba\x00\x3d\x00\x3d\xfe\x06\x00\x6c\x00\x07\x00\x86\x01\xf4\x00\x09\x00\x0a\x00\x49\x01\xf7\x01\x62\x00\x63\x00\xd0\x01\x3d\xfe\x6d\x00\xe5\xff\x86\x01\x06\x00\x3d\xfe\x07\x00\x3d\x00\xf4\x00\x09\x00\x03\x01\xa5\x02\x9e\x01\x18\x00\x19\x00\x8e\x01\xce\x00\xcf\x00\x3d\x00\x3d\xfe\xaa\x00\x8f\x00\x62\x00\x63\x00\xd0\x01\x84\x00\xd7\x00\x86\x00\xc5\x01\x18\x00\x19\x00\x3f\x01\xcd\x01\x68\x00\xc3\x01\x6a\x00\x6e\x00\x6f\x00\x3d\x00\x70\x00\xcf\x01\x71\x00\x2a\x00\x86\x00\x72\x00\xda\x01\xff\xff\x73\x00\x8a\x00\x74\x00\x75\x00\x76\x00\xdd\x00\xa5\x00\xa6\x00\xa7\x00\x77\x00\x78\x00\x8b\x00\x79\x00\x88\x02\x86\x00\x7a\x00\x7b\x00\x8e\x00\x7c\x00\x7d\x00\x86\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\xe9\x00\x68\x00\x90\x01\x6a\x00\x3d\x00\xff\xff\x84\x00\x85\x00\x86\x00\x87\x00\x1b\x00\x0e\x02\x8c\x00\x6a\x00\x3f\xfe\xfb\xff\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xea\x00\xed\x00\x23\x00\x26\x02\xa6\x00\xa7\x00\x06\x00\xf3\x00\x07\x00\xf1\x00\xf4\x00\x09\x00\x61\x02\x24\x00\xf4\x00\xcb\x00\xf8\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xfc\x00\xd2\x00\x62\x00\x63\x00\xd0\x01\xfd\x00\x3c\x00\x3d\x00\x18\x00\x19\x00\x25\x00\x3e\x00\x6f\x00\x3f\x00\x70\x00\x40\x00\x71\x00\x3d\xfe\x41\x00\x72\x00\x42\x00\x43\x00\x73\x00\xff\xff\x74\x00\x75\x00\x76\x00\x44\x00\x45\x00\x46\x00\x3d\xfe\x77\x00\x78\x00\xfe\x00\x79\x00\x3d\xfe\x47\x00\x7a\x00\x7b\x00\x26\x00\x7c\x00\x7d\x00\x48\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x3d\xfe\x49\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x4a\x00\x51\x02\x86\x00\x52\x02\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x34\x02\x8c\x00\x6a\x00\xff\x00\x00\x01\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x06\x01\x6f\x00\x23\x00\xff\xff\x17\x01\x06\x00\xa1\x00\x07\x00\x1a\x01\xf4\x00\x09\x00\x0a\x00\x4a\x01\x24\x00\x75\x00\x6f\x01\x8c\x00\x6a\x00\x1b\x01\xa2\x00\x80\x01\x8c\x00\x6a\x00\x79\x00\xa3\x00\x81\x01\x8c\x00\x6a\x00\x1c\x01\x7c\x00\x18\x00\x19\x00\x7e\x00\x25\x00\x80\x00\xd7\xff\x1d\x01\xd7\xff\xa4\x00\xd7\xff\xd7\xff\x00\x00\xd7\xff\x00\x00\x00\x00\xd7\xff\x86\x00\xd7\xff\xd7\xff\xd7\xff\x8b\x01\xa6\x00\xa7\x00\xd7\xff\xd7\xff\xd7\xff\x00\x00\xd7\xff\xd7\xff\x00\x00\xd7\xff\xd7\xff\x26\x00\xd7\xff\xd7\xff\x00\x00\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\xd7\xff\xd7\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\xa5\x00\xa6\x00\xa7\x00\x00\x00\xae\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\xd1\x01\x62\x00\x63\x00\x64\x00\x00\x00\xd2\x01\x67\x00\x3e\x02\x00\x00\x4f\x00\x24\x00\x50\x00\xbf\x01\xc0\x01\x00\x00\x53\x00\xc1\x01\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x8b\x00\x8c\x00\x6a\x00\x25\x00\x00\x00\x6f\x00\x5f\x00\x70\x00\x00\x00\x71\x00\xc2\x01\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\xa5\x00\xa6\x00\xa7\x00\x00\x00\x77\x00\x78\x00\x00\x00\x79\x00\xd3\x01\x6a\x00\x7a\x00\x7b\x00\x26\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x85\x00\x86\x00\x52\x02\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\xb4\x00\x8c\x00\x6a\x00\x00\x00\x59\x02\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x68\x00\xc3\x01\x6a\x00\x8d\x01\x47\x03\xaa\x00\x8d\x01\x09\x03\xaa\x00\x24\x00\x5a\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x8d\x01\xa2\x02\xaa\x00\x8d\x01\xa8\x02\xaa\x00\x00\x00\x00\x00\x92\x01\xcf\x00\x3d\x00\x00\x00\x00\x00\x25\x00\x92\x00\x63\x00\xe9\x01\x70\x00\x01\x02\x71\x00\xaa\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x02\x02\x8d\x01\xce\x01\xaa\x00\x77\x00\x78\x00\x68\x00\x5b\x02\x6a\x00\x00\x00\x7a\x00\x7b\x00\x26\x00\x8a\x02\x7d\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x85\x00\x86\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x95\x01\x6a\x00\x00\x00\x3c\xfe\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x38\x01\x3c\xfe\x39\x01\x00\x00\x3a\x01\x3b\x01\x3c\xfe\x00\x00\x3c\x01\x3d\x01\x24\x00\x00\x00\xe1\x00\x00\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\x3c\xfe\xd2\x00\x62\x00\x63\x00\xd0\x01\x00\x00\x84\x00\x00\x00\x86\x00\x00\x00\x25\x00\x8d\x01\xeb\x01\xaa\x00\x70\x00\x65\x01\x71\x00\xaa\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x66\x01\x28\x01\x29\x01\x2a\x01\x77\x00\x78\x00\xa9\x00\xce\x01\xaa\x00\x00\x00\x7a\x00\x7b\x00\x26\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x85\x00\x86\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x28\x01\x29\x01\x2a\x01\x3c\xfe\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x3c\xfe\xae\x00\x00\x00\x00\x00\x00\x00\x3c\xfe\x2b\x02\xce\x00\xcf\x00\x24\x00\x00\x00\x00\x00\xd1\x01\x62\x00\x63\x00\xd0\x01\x00\x00\x00\x00\x06\x00\x3c\xfe\x07\x00\x00\x00\xf4\x00\x09\x00\x46\x01\x3c\x00\x3d\x00\x86\x00\x00\x00\x25\x00\x3e\x00\x00\x00\x3f\x00\x00\x00\x40\x00\x00\x00\x00\x00\x41\x00\x00\x00\x42\x00\x43\x00\x8e\x00\x00\x00\x18\x00\x19\x00\x00\x00\x44\x00\x45\x00\x46\x00\x00\x00\x00\x00\x8f\x00\x62\x00\x63\x00\x64\x00\x47\x00\x90\x00\x67\x00\x26\x00\x00\x00\x00\x00\x48\x00\x00\x00\x00\x00\x01\x02\x00\x00\xaa\x00\x06\x03\x6a\x00\x49\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x4a\x00\x4b\x00\x02\x02\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\xbb\x02\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x91\x00\x6a\x00\x00\x00\x24\x00\x00\x00\x00\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\x00\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x25\x00\x00\x00\x77\x00\x78\x00\x00\x00\x79\x00\x00\x00\xa1\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x9e\x00\x80\x00\x81\x00\x82\x00\x83\x00\xa2\x00\x65\x01\x00\x00\xaa\x00\x00\x00\xa3\x00\x84\x00\x9f\x00\x86\x00\x26\x00\x3c\xfe\x00\x00\x06\x00\x66\x01\x07\x00\x00\x00\xf4\x00\x09\x00\x47\x01\xa4\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x86\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x16\x02\x00\x00\x00\x00\x23\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x24\x00\x74\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x25\x00\xb3\x00\x00\x00\x81\x00\x82\x00\x83\x00\xa4\x00\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\xa2\x00\xaa\x00\x00\x00\x25\x02\x00\x00\xa3\x00\xa1\x02\x00\x00\x00\x00\x26\x00\x3d\xfe\x02\x02\x92\x00\x63\x00\x93\x00\x26\x02\x94\x00\x67\x00\xf7\x01\xa4\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x86\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\xaf\x01\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\xa1\x00\x06\x00\x00\x00\x07\x00\xa1\x00\x06\x01\x09\x00\xa1\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x95\x00\x6a\x00\x00\x00\xa2\x00\xa3\x00\x00\x00\xa2\x00\x00\x00\xa3\x00\x00\x00\x00\x00\xa3\x00\x18\x00\x19\x00\x25\x00\x06\x00\x00\x00\x07\x00\xa4\x00\x08\x01\x09\x00\x3d\xfe\xa4\x00\x00\x00\x84\x00\xa4\x00\x86\x00\x00\x00\x84\x00\xd7\x00\x86\x00\x84\x00\xd7\x00\x86\x00\x3d\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x18\x00\x19\x00\x00\x00\x26\x00\xb0\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2f\x02\x86\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x00\x00\x75\x02\x00\x00\xd6\x00\x76\x02\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x4b\x01\x1b\x00\x24\x00\x75\x02\x00\x00\x00\x00\x76\x02\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x18\x00\x19\x00\x77\x02\x66\x03\xa1\x00\x25\x00\x00\x00\x06\x00\x00\x00\x07\x00\x24\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x4d\x01\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x02\x34\x03\x00\x00\x25\x00\x00\x00\x18\x00\x19\x00\x26\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xd7\x00\x86\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x4a\x00\x4b\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x26\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x51\x01\x27\x00\x28\x00\x29\x00\x2a\x00\x4a\x00\x4b\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x11\x02\x00\x00\x00\x00\x23\x00\x00\x00\x92\x01\xcf\x00\x93\x01\xd1\x00\x22\x02\x00\x00\x92\x00\x63\x00\x93\x00\x24\x00\x94\x00\x67\x00\x06\x00\x1b\x00\x07\x00\x75\x02\x0b\x01\x09\x00\x76\x02\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\xfe\x18\x00\x19\x00\x24\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x48\x01\x00\x00\x3c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x3c\xfe\x00\x00\x77\x02\x00\x00\x26\x00\x25\x00\x95\x01\x6a\x00\x00\x00\x65\x01\x00\x00\xaa\x00\x18\x00\x19\x00\x3c\xfe\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x66\x01\x86\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x52\x01\x27\x00\x28\x00\x29\x00\x2a\x00\x4a\x00\x4b\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x18\x00\x19\x00\xa1\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x06\x00\x00\x00\x07\x00\x24\x00\xf4\x00\x09\x00\x03\x01\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x86\x00\x00\x00\x23\x00\x25\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\xa1\x00\x00\x00\x06\x00\x24\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x4e\x01\x00\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x77\x02\x00\x00\x26\x00\x25\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x00\x00\xa2\x01\x00\x00\x00\x00\x00\x00\x26\x00\x9e\x02\xce\x00\xcf\x00\x9f\x02\xd1\x00\x00\x00\xe5\x01\x62\x00\x63\x00\xd0\x01\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\xcb\x01\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\xe6\x02\x00\x00\x00\x00\xcc\x01\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x4c\x01\x1b\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x9c\x00\x00\x00\x23\x00\x18\x00\x19\x00\x00\x00\x00\x00\xa1\x00\x25\x00\x00\x00\x06\x00\x00\x00\x07\x00\x24\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x4f\x01\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x02\x00\x00\x00\x00\x25\x00\x00\x00\x18\x00\x19\x00\x26\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x00\x86\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x26\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x50\x01\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x92\x01\xcf\x00\x93\x01\xd1\x00\x22\x02\x00\x00\x92\x00\x63\x00\xe9\x01\x00\x00\x24\x00\x1b\x00\x45\x01\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x63\x02\x00\x00\x06\x00\x25\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x2a\x01\x00\x00\x24\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x18\x00\x19\x00\x00\x00\x25\x00\x00\x00\x26\x00\x95\x01\x6a\x00\x00\x00\x00\x00\x24\x00\x00\x00\x00\x00\x59\x01\x00\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x25\x00\x00\x00\x26\x00\x00\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x0c\x01\x09\x00\x00\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x00\x00\x00\x00\x26\x00\x18\x00\x19\x00\x92\x01\xcf\x00\x93\x01\xd1\x00\x29\x02\x00\x00\x92\x00\x63\x00\xe9\x01\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x01\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x95\x01\x6a\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x25\x00\xd1\x02\x00\x00\x00\x00\x26\x00\x8e\x01\xce\x00\xcf\x00\x8f\x01\xd1\x00\x24\x00\x8f\x00\x62\x00\x63\x00\xd0\x01\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x26\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x90\x01\x6a\x00\x00\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x08\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x92\x01\xcf\x00\x93\x01\xd1\x00\x07\x03\x00\x00\x92\x00\x63\x00\xe9\x01\x0a\x01\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x00\x00\x00\x00\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x25\x00\x00\x00\x00\x00\x00\x00\x26\x00\x95\x01\x6a\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x26\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x01\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x66\x01\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x6d\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x3d\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x00\x00\x00\x00\x00\x00\x24\x00\x6e\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\x00\x00\x00\x00\x72\x00\x3d\xfe\x00\x00\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\x00\x00\x86\x00\x00\x00\x25\x00\x77\x00\x78\x00\x00\x00\x79\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x06\x02\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x84\x00\x85\x00\x86\x00\x87\x00\x26\x00\x00\x00\x07\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x2d\x01\x2e\x01\x2f\x01\x30\x01\x31\x01\x32\x01\x33\x01\x34\x01\x35\x01\x36\x01\x37\x01\x00\x00\x01\x02\x6f\x00\xaa\x00\x70\x00\x00\x00\x71\x00\x3d\xfe\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x02\x02\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x77\x00\x78\x00\x00\x00\x79\x00\x3d\xfe\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x3d\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x85\x00\x86\x00\x01\x02\x6f\x00\xaa\x00\x70\x00\x00\x00\x71\x00\x3d\xfe\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x02\x02\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x77\x00\x78\x00\x00\x00\x79\x00\x3d\xfe\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x3d\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x85\x00\x86\x00\x01\x02\x6f\x00\xaa\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x02\x02\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xb3\x00\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xb4\x00\x86\x00\xcb\x01\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\xcc\x01\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xdf\x00\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xe0\x00\x86\x00\xcb\x01\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\xcc\x01\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xa6\x01\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xa7\x01\x86\x00\xcb\x01\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\xcc\x01\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xb3\x00\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xb4\x00\x86\x00\xcb\x01\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\xcc\x01\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xdf\x00\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xe0\x00\x86\x00\xcb\x01\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\xcc\x01\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xa6\x01\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xa7\x01\x86\x00\xcb\x01\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\xcc\x01\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xb3\x00\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xb4\x00\x86\x00\x65\x01\x6f\x00\xaa\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x66\x01\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xdf\x00\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xe0\x00\x86\x00\x6c\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\x3d\xfe\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x6d\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x77\x00\x78\x00\x00\x00\x79\x00\x3d\xfe\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x3d\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x6c\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x6d\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xa6\x01\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xa7\x01\x86\x00\x6c\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x6d\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xb3\x00\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xb4\x00\x86\x00\x06\x02\x6f\x00\xaa\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x07\x02\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xdf\x00\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\xe0\x00\x86\x00\x65\x01\x6f\x00\xaa\x00\x70\x00\x00\x00\x71\x00\x00\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x66\x01\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x79\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x9e\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\xcb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x9f\x00\x86\x00\x00\x00\x6f\x00\x00\x00\x70\x00\xcc\x01\x71\x00\x00\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x79\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x9e\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x6c\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\x9f\x00\x86\x00\x72\x00\x00\x00\x00\x00\x73\x00\x6d\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x79\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x9e\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x00\x00\x00\x84\x00\x9f\x00\x86\x00\x00\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\x00\x00\x6d\x00\x72\x00\x00\x00\xcb\x01\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\xcc\x01\x79\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x9e\x00\x80\x00\x81\x00\x82\x00\x83\x00\x01\x02\xfb\x02\xaa\x00\x00\x00\x00\x00\x00\x00\x84\x00\x9f\x00\x86\x00\x00\x00\xa1\x00\x00\x00\x02\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\xa2\x00\x71\x00\x00\x00\x00\x00\x72\x00\xa3\x00\x00\x00\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x84\x00\x7d\x00\x86\x00\x00\x00\x9e\x00\x3d\xfe\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x9f\x00\x86\x00\x3d\xfe\x00\x00\x00\x00\xb0\x01\xb1\x01\x3d\xfe\x53\x00\xb2\x01\x55\x00\x56\x00\x57\x00\xb3\x01\xb4\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x00\x00\x3d\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x84\x00\x00\x00\x86\x00\xb5\x01\x00\x00\x00\x00\x00\x00\x00\x00\x92\x01\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x92\x00\x63\x00\xe9\x01\x00\x00\x00\x00\x00\x00\xb6\x01\xb7\x01\xb8\x01\x00\x00\x00\x00\x00\x00\x5c\x02\xa6\x00\xa7\x00\x5d\x02\x5e\x02\x00\x00\x00\x00\x00\x00\xb0\x01\xb1\x01\x00\x00\x53\x00\xb2\x01\x55\x00\x56\x00\x57\x00\xb3\x01\xb4\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x00\x00\x92\x01\xcf\x00\x93\x01\xd1\x00\x29\x02\x5f\x00\x92\x00\x63\x00\x93\x00\xb5\x01\x94\x00\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\xc7\x02\x6a\x00\x92\x00\x63\x00\xe9\x01\x00\x00\x00\x00\x00\x00\xb6\x01\xb7\x01\xb8\x01\x00\x00\x00\x00\x00\x00\x5c\x02\xa6\x00\xa7\x00\x5d\x02\x5e\x02\xb0\x01\xb1\x01\x00\x00\x53\x00\xb2\x01\x55\x00\x56\x00\x57\x00\xb3\x01\xb4\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x95\x01\x6a\x00\xb5\x01\x92\x01\xcf\x00\x93\x01\xd1\x00\x94\x01\x00\x00\x92\x00\x63\x00\xe9\x01\x00\x00\x68\x00\xcc\x02\x6a\x00\x00\x00\x00\x00\x00\x00\xb6\x01\xb7\x01\xb8\x01\x00\x00\x00\x00\x00\x00\x5c\x02\xa6\x00\xa7\x00\x5d\x02\x5e\x02\xb0\x01\xb1\x01\x00\x00\x53\x00\xb2\x01\x55\x00\x56\x00\x57\x00\xb3\x01\xb4\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x00\x00\x92\x01\xcf\x00\x93\x01\xd1\x00\x94\x01\x5f\x00\x92\x00\x63\x00\x93\x00\xb5\x01\x94\x00\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\x01\x6a\x00\x00\x00\x68\x00\x5f\x02\x6a\x00\x00\x00\x00\x00\x00\x00\xb6\x01\xb7\x01\xb8\x01\xb9\x01\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x01\xb1\x01\x00\x00\x53\x00\xb2\x01\x55\x00\x56\x00\x57\x00\xb3\x01\xb4\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\xb5\x01\x95\x01\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\xba\x01\x6a\x00\xb6\x01\xb7\x01\xb8\x01\x00\x00\x00\x00\x00\x00\xb0\x01\xb1\x01\x00\x00\x53\x00\xb2\x01\x55\x00\x56\x00\x57\x00\xb3\x01\xb4\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x00\x00\xd8\x00\xb9\x00\x00\x00\xd9\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\xb5\x01\xda\x00\x5d\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\xab\x00\xba\x00\xac\x00\x00\x00\x68\x00\xba\x01\x6a\x00\xce\x02\x00\x00\xad\x00\x5d\x00\x5e\x00\x07\x02\x62\x00\x63\x00\xd0\x01\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\xae\x00\x00\x00\x00\x00\x08\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x00\x00\x00\x00\xfc\x01\x62\x00\x63\x00\xd0\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfd\x01\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x00\x00\x00\x00\x68\x00\xba\x01\x6a\x00\x00\x00\x97\x00\x00\x00\x98\x00\x00\x00\xab\x00\x00\x00\xac\x00\x00\x00\x00\x00\x99\x00\x5d\x00\x5e\x00\xdd\x00\xad\x00\x5d\x00\x5e\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\xae\x00\x00\x00\x23\x02\xcf\x00\x00\x00\x00\x00\xfe\x01\xff\x01\xc8\x01\x63\x00\xc9\x01\xf2\x01\x62\x00\x63\x00\xd0\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x02\xa6\x00\xa7\x00\x78\x02\x79\x02\x97\x00\x00\x00\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x00\x5d\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x9f\x01\x00\x00\xa0\x01\x00\x00\x00\x00\x00\x00\x97\x00\x00\x00\x98\x00\xa1\x01\x5d\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x99\x00\x5d\x00\x5e\x00\x5f\x00\x9c\x00\x00\x00\xa2\x01\xf3\x01\x6a\x00\x5f\x00\x00\x00\x77\x02\xa6\x00\xa7\x00\x78\x02\x79\x02\x00\x00\xd4\x02\x62\x00\x63\x00\xd0\x01\x00\x00\x00\x00\xf1\x01\x62\x00\x63\x00\xd0\x01\x0e\x01\x55\x00\x00\x00\x0f\x01\x00\x00\x10\x01\x00\x00\x11\x01\x5c\x00\x5d\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x01\x55\x00\x5f\x00\x0f\x01\x00\x00\x10\x01\x12\x01\x11\x01\x5c\x00\x5d\x00\x5e\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6\x02\x00\x00\x00\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x06\x00\x81\x02\x07\x00\x00\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\x16\x00\x00\x00\xb7\x02\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x68\x00\x15\x01\x6a\x00\x0e\x01\x55\x00\x00\x00\x0f\x01\x00\x00\x10\x01\x00\x00\x11\x01\x5c\x00\x5d\x00\x5e\x00\x00\x00\x68\x00\x15\x01\x6a\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x12\x01\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x55\x01\x0e\x01\x55\x00\x00\x00\x0f\x01\x00\x00\x10\x01\xef\x01\x11\x01\x5c\x00\x5d\x00\x5e\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x06\x00\x12\x01\x07\x00\x00\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\x16\x00\x00\x00\xf0\x01\x00\x00\x1c\x02\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x68\x00\x15\x01\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\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\x16\x00\x00\x00\x1d\x02\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x68\x00\x15\x01\x6a\x00\x0e\x01\x55\x00\x00\x00\x0f\x01\x00\x00\x10\x01\x00\x00\x11\x01\x5c\x00\x5d\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x12\x01\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x54\x01\x00\x00\x0e\x01\x55\x00\x00\x00\x0f\x01\x00\x00\x10\x01\x31\x02\x11\x01\x5c\x00\x5d\x00\x5e\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x06\x00\x12\x01\x07\x00\x00\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\x16\x00\x00\x00\x32\x02\x00\x00\xd7\x01\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x68\x00\x15\x01\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\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\x16\x00\x00\x00\xd8\x01\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x68\x00\x15\x01\x6a\x00\xa9\x02\x55\x00\x00\x00\x0f\x01\x00\x00\x10\x01\x00\x00\x11\x01\x5c\x00\x5d\x00\x5e\x00\x00\x00\xf7\x02\xab\x02\xac\x02\xa9\x02\x55\x00\x5f\x00\x0f\x01\x00\x00\x10\x01\xad\x02\x11\x01\x5c\x00\x5d\x00\x5e\x00\x00\x00\xaa\x02\xab\x02\xac\x02\x0e\x01\x55\x00\x5f\x00\x0f\x01\x00\x00\x10\x01\xad\x02\x11\x01\x5c\x00\x5d\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x0e\x01\x55\x00\x12\x01\x0f\x01\x00\x00\x10\x01\x00\x00\x11\x01\x5c\x00\x5d\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x84\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\xae\x02\x6a\x00\x00\x00\x0e\x01\x55\x00\x6d\x01\x0f\x01\x00\x00\x10\x01\x00\x00\x11\x01\x5c\x00\x5d\x00\x5e\x00\x68\x00\xae\x02\x6a\x00\x00\x00\xac\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x12\x01\xad\x00\x5d\x00\x5e\x00\xae\x00\x68\x00\x15\x01\x6a\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\xae\x00\x00\x00\xd1\x01\x62\x00\x63\x00\xd0\x01\x00\x00\x00\x00\x6e\x01\x00\x00\x00\x00\x68\x00\x15\x01\x6a\x00\x7e\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x00\x00\x00\x00\x00\x00\x5e\x01\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x98\x00\x00\x00\x00\x00\xae\x00\x00\x00\x00\x00\x00\x00\x99\x00\x5d\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x02\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x15\x01\x6a\x00\x00\x00\x00\x00\x7f\x02\xec\x02\x6a\x00\xf9\x02\x62\x00\x63\x00\xd0\x01\x00\x00\x00\x00\x00\x00\x62\x01\x63\x01\x06\x00\x00\x00\x07\x00\x00\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\xab\x01\xa2\x01\x00\x00\x00\x00\x00\x00\x12\x02\x00\x00\x18\x00\x19\x00\x00\x00\x8d\x01\x13\x02\x14\x02\x6a\x00\x8e\x01\xce\x00\xcf\x00\x8f\x01\xd1\x00\x00\x00\x8f\x00\x62\x00\x63\x00\x64\x00\x00\x00\x90\x00\x67\x00\x00\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\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\xab\x01\xaa\x01\x00\x00\x00\x00\xae\x00\xb9\x02\x00\x00\x18\x00\x19\x00\x2b\x02\xce\x00\xcf\x00\x00\x00\x9c\x00\x00\x00\xd1\x01\x62\x00\x63\x00\xd0\x01\x68\x00\x90\x01\x6a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7e\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\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\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00\xac\x01\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x68\x00\xad\x01\x6a\x00\xc5\x02\x7f\x02\xed\x02\x6a\x00\x8e\x01\xce\x00\xcf\x00\xca\x02\x9f\x00\x00\x00\x8f\x00\x62\x00\x63\x00\xd0\x01\x00\x00\x00\x00\x00\x00\x8f\x00\x62\x00\x63\x00\xd0\x01\x00\x00\x5a\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x00\x00\x5a\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\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\xc0\x02\x00\x00\x68\x00\xc6\x02\x6a\x00\x00\x00\x00\x00\x18\x00\x19\x00\x68\x00\xcb\x02\x6a\x00\xb0\x02\x00\x00\x05\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x71\x00\x00\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\xb0\x02\x00\x00\xb1\x02\x00\x00\x00\x00\x85\x00\x86\x00\xb2\x02\x70\x00\x00\x00\x71\x00\x00\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x00\x00\x7d\x00\x00\x00\xc0\x00\x7f\x00\x00\x00\x81\x00\x82\x00\x83\x00\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\x00\x00\x00\x85\x00\x86\x00\xb2\x02\xc3\x00\x00\x00\x00\x00\x75\x00\x00\x00\x00\x00\x6f\x00\x00\x00\xa2\x00\x00\x00\x00\x00\xa1\x00\x79\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x75\x00\x00\x00\x7e\x00\x00\x00\x80\x00\xa2\x00\x00\x00\x00\x00\xa4\x00\x79\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x86\x00\x00\x00\x7e\x00\x00\x00\x80\x00\x3d\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\x00\x00\x86\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x79\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x02\x85\x00\x86\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\x00\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x79\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\x3d\xfe\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x77\x00\x78\x00\x00\x00\x79\x00\x3d\xfe\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x3d\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbc\x01\x85\x00\x86\x00\x3b\xfe\x00\x00\x3b\xfe\x00\x00\x3b\xfe\x3b\xfe\x00\x00\x3b\xfe\x00\x00\x00\x00\x3b\xfe\x00\x00\x3b\xfe\x3b\xfe\x3b\xfe\x00\x00\x00\x00\x00\x00\x3b\xfe\x3b\xfe\x3b\xfe\x00\x00\x3b\xfe\x3b\xfe\x00\x00\x3b\xfe\x3b\xfe\x00\x00\x3b\xfe\x3b\xfe\x00\x00\x3b\xfe\x3b\xfe\x3b\xfe\x3b\xfe\x3b\xfe\x3b\xfe\x3b\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\xfe\x3b\xfe\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\xa6\x01\x80\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x01\x86\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\x3d\xfe\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x3d\xfe\x77\x00\x78\x00\x00\x00\x79\x00\x3d\xfe\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x3d\xfe\x00\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\x85\x00\x86\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x79\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x9e\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\x9f\x00\x86\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x79\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x7e\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x6f\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x00\x00\x75\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x79\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x80\x00\x00\x00\x82\x00\x83\x00\xa4\x00\x70\x00\x00\x00\x71\x00\x00\x00\x00\x00\x72\x00\x00\x00\x86\x00\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x81\x00\x82\x00\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\xb2\x02\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x00\x00\x00\x00\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\xa6\x01\x00\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\xa7\x01\x86\x00\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\xb3\x00\x00\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x3b\xfe\x00\x00\x3b\xfe\x3b\xfe\x00\x00\x3b\xfe\xb4\x00\x86\x00\x3b\xfe\x00\x00\x3b\xfe\x00\x00\x3b\xfe\x00\x00\x00\x00\x00\x00\x3b\xfe\x3b\xfe\x3b\xfe\x00\x00\x00\x00\x3b\xfe\x00\x00\x3b\xfe\x3b\xfe\x00\x00\x00\x00\x3b\xfe\x00\x00\x00\x00\x3b\xfe\x00\x00\x3b\xfe\x3b\xfe\x3b\xfe\x3b\xfe\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x3b\xfe\x3b\xfe\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\xa6\x01\x00\x00\x81\x00\x82\x00\x83\x00\xa4\x00\x70\x00\x00\x00\x71\x00\x00\x00\x00\x00\x72\x00\xa7\x01\x86\x00\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x81\x00\x82\x00\x83\x00\x00\x00\x70\x00\x00\x00\x71\x00\x00\x00\x00\x00\x72\x00\x85\x00\x86\x00\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x9e\x00\x00\x00\x81\x00\x82\x00\x83\x00\x00\x00\x70\x00\x00\x00\x71\x00\x00\x00\x00\x00\x72\x00\x9f\x00\x86\x00\x73\x00\x00\x00\x74\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x78\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x00\x00\x7d\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x81\x00\x82\x00\x83\x00\x00\x00\x70\x00\x00\x00\x71\x00\xa1\x00\x00\x00\x72\x00\x85\x00\x86\x00\x73\x00\x00\x00\x00\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x77\x00\x78\x00\x00\x00\x00\x00\xa3\x00\x00\x00\x7a\x00\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x00\x83\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x02\x86\x00\x27\x03\x6e\x02\x6f\x02\x70\x02\x71\x02\x06\x00\x00\x00\x07\x00\x00\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\x72\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x6c\x02\x73\x02\x6d\x02\x6e\x02\x6f\x02\x70\x02\x71\x02\x06\x00\x00\x00\x07\x00\x00\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\x72\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x31\x03\x73\x02\x00\x00\x32\x03\x6f\x02\x70\x02\x71\x02\x06\x00\x00\x00\x07\x00\x00\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\x72\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x73\x02\x07\x00\x00\x00\xf4\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\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe3\x02\x18\x00\x19\x00\x00\x00\x67\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\x02\x06\x00\x00\x00\x07\x00\x00\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\x72\x02\x00\x00\x2e\x03\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x72\x02\x00\x00\xd7\x02\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x72\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x02\x00\x00\x18\x00\x19\x00\x00\x00\x06\x00\x00\x00\x07\x00\x9c\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\x16\x00\x00\x00\xea\x00\x00\x00\x43\x03\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x16\x00\x00\x00\xea\x00\x00\x00\x44\x03\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x16\x00\x00\x00\xea\x00\x00\x00\x93\x02\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x16\x00\x00\x00\xea\x00\x00\x00\x94\x02\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x16\x00\x00\x00\xea\x00\x00\x00\xeb\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x16\x00\x00\x00\x77\x03\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x16\x00\x00\x00\x78\x03\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x16\x00\x00\x00\x61\x03\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x16\x00\x00\x00\x3a\x03\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x16\x00\x00\x00\x92\x02\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x16\x00\x00\x00\x41\x01\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x42\x01\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\x43\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x16\x00\x00\x00\x57\x01\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x5a\x01\x00\x00\x00\x00\x5b\x01\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x16\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x16\x00\x00\x00\x7c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x16\x00\x00\x00\x7e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x16\x00\x00\x00\x7f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x16\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\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\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x03\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\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\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x03\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\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\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x03\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\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\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x66\x03\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\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\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x03\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\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\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x03\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x51\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\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\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x02\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\xee\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\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\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x29\x03\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x69\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x6b\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\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\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x02\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x45\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\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\x6c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\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\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\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\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\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\x64\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x59\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x56\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x07\x00\x00\x00\xf4\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x53\x01\x02\x02\xce\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x03\x02\x62\x00\x63\x00\xd0\x01\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x04\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x09\x02\xce\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x0a\x02\x62\x00\x63\x00\xd0\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x03\x0b\x02\x5f\x01\xa6\x00\xa7\x00\x60\x01\x61\x01\x02\x03\x00\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\x01\x03\xf4\x01\x62\x00\x63\x00\xd0\x01\x00\x00\x00\x00\x02\x03\x00\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\x00\x00\xf4\x01\x62\x00\x63\x00\xd0\x01\xcb\x00\x00\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\x00\x00\xf4\x01\x62\x00\x63\x00\xd0\x01\xe1\x00\x00\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\x00\x00\xf4\x01\x62\x00\x63\x00\xd0\x01\x37\x02\x00\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\x00\x00\xf4\x01\x62\x00\x63\x00\xd0\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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 = Happy_Data_Array.array (4, 463) [
-	(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),
-	(463 , happyReduce_463)
-	]
-
-happy_n_terms = 102 :: Int
-happy_n_nonterms = 125 :: Int
-
-happyReduce_4 = happyMonadReduce 1# 0# happyReduction_4
-happyReduction_4 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut8 happy_x_1 of { happy_var_1 -> 
-	( withNodeInfo happy_var_1 $ CTranslUnit (reverse happy_var_1))}
-	) (\r -> happyReturn (happyIn7 r))
-
-happyReduce_5 = happySpecReduce_0  1# happyReduction_5
-happyReduction_5  =  happyIn8
-		 (empty
-	)
-
-happyReduce_6 = happySpecReduce_2  1# happyReduction_6
-happyReduction_6 happy_x_2
-	happy_x_1
-	 =  case happyOut8 happy_x_1 of { happy_var_1 -> 
-	happyIn8
-		 (happy_var_1
-	)}
-
-happyReduce_7 = happySpecReduce_2  1# happyReduction_7
-happyReduction_7 happy_x_2
-	happy_x_1
-	 =  case happyOut8 happy_x_1 of { happy_var_1 -> 
-	case happyOut9 happy_x_2 of { happy_var_2 -> 
-	happyIn8
-		 (happy_var_1 `snoc` happy_var_2
-	)}}
-
-happyReduce_8 = happySpecReduce_1  2# happyReduction_8
-happyReduction_8 happy_x_1
-	 =  case happyOut10 happy_x_1 of { happy_var_1 -> 
-	happyIn9
-		 (CFDefExt happy_var_1
-	)}
-
-happyReduce_9 = happySpecReduce_1  2# happyReduction_9
-happyReduction_9 happy_x_1
-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> 
-	happyIn9
-		 (CDeclExt happy_var_1
-	)}
-
-happyReduce_10 = happySpecReduce_2  2# happyReduction_10
-happyReduction_10 happy_x_2
-	happy_x_1
-	 =  case happyOut9 happy_x_2 of { happy_var_2 -> 
-	happyIn9
-		 (happy_var_2
-	)}
-
-happyReduce_11 = happyReduce 5# 2# happyReduction_11
-happyReduction_11 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut123 happy_x_3 of { happy_var_3 -> 
-	happyIn9
-		 (CAsmExt happy_var_3
-	) `HappyStk` happyRest}
-
-happyReduce_12 = happyMonadReduce 2# 3# happyReduction_12
-happyReduction_12 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut11 happy_x_1 of { happy_var_1 -> 
-	case happyOut14 happy_x_2 of { happy_var_2 -> 
-	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef [] happy_var_1 [] happy_var_2))}}
-	) (\r -> happyReturn (happyIn10 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 happyOut127 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_2 of { happy_var_2 -> 
-	case happyOut14 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 (happyIn10 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 happyOut37 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_2 of { happy_var_2 -> 
-	case happyOut14 happy_x_3 of { happy_var_3 -> 
-	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}
-	) (\r -> happyReturn (happyIn10 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 happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_2 of { happy_var_2 -> 
-	case happyOut14 happy_x_3 of { happy_var_3 -> 
-	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}
-	) (\r -> happyReturn (happyIn10 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 happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_2 of { happy_var_2 -> 
-	case happyOut14 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 (happyIn10 r))
-
-happyReduce_17 = happyMonadReduce 3# 3# happyReduction_17
-happyReduction_17 (happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_2 of { happy_var_2 -> 
-	case happyOut14 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 (happyIn10 r))
-
-happyReduce_18 = happyMonadReduce 4# 3# happyReduction_18
-happyReduction_18 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	case happyOut14 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 (happyIn10 r))
-
-happyReduce_19 = happyMonadReduce 3# 3# happyReduction_19
-happyReduction_19 (happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut76 happy_x_1 of { happy_var_1 -> 
-	case happyOut33 happy_x_2 of { happy_var_2 -> 
-	case happyOut14 happy_x_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_1 $ CFunDef [] happy_var_1 (reverse happy_var_2) happy_var_3)}}}
-	) (\r -> happyReturn (happyIn10 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 happyOut127 happy_x_1 of { happy_var_1 -> 
-	case happyOut76 happy_x_2 of { happy_var_2 -> 
-	case happyOut33 happy_x_3 of { happy_var_3 -> 
-	case happyOut14 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 (happyIn10 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 happyOut37 happy_x_1 of { happy_var_1 -> 
-	case happyOut76 happy_x_2 of { happy_var_2 -> 
-	case happyOut33 happy_x_3 of { happy_var_3 -> 
-	case happyOut14 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 (happyIn10 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 happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOut76 happy_x_2 of { happy_var_2 -> 
-	case happyOut33 happy_x_3 of { happy_var_3 -> 
-	case happyOut14 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 (happyIn10 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 happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOut76 happy_x_2 of { happy_var_2 -> 
-	case happyOut33 happy_x_3 of { happy_var_3 -> 
-	case happyOut14 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 (happyIn10 r))
-
-happyReduce_24 = happyMonadReduce 4# 3# happyReduction_24
-happyReduction_24 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut76 happy_x_2 of { happy_var_2 -> 
-	case happyOut33 happy_x_3 of { happy_var_3 -> 
-	case happyOut14 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 (happyIn10 r))
-
-happyReduce_25 = happyMonadReduce 5# 3# happyReduction_25
-happyReduction_25 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut76 happy_x_3 of { happy_var_3 -> 
-	case happyOut33 happy_x_4 of { happy_var_4 -> 
-	case happyOut14 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 (happyIn10 r))
-
-happyReduce_26 = happyMonadReduce 1# 4# happyReduction_26
-happyReduction_26 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut72 happy_x_1 of { happy_var_1 -> 
-	( let declr = reverseDeclr happy_var_1 in
-  	   enterScope >> doFuncParamDeclIdent declr >> return declr)}
-	) (\r -> happyReturn (happyIn11 r))
-
-happyReduce_27 = happySpecReduce_1  5# happyReduction_27
-happyReduction_27 happy_x_1
-	 =  case happyOut13 happy_x_1 of { happy_var_1 -> 
-	happyIn12
-		 (happy_var_1
-	)}
-
-happyReduce_28 = happySpecReduce_1  5# happyReduction_28
-happyReduction_28 happy_x_1
-	 =  case happyOut14 happy_x_1 of { happy_var_1 -> 
-	happyIn12
-		 (happy_var_1
-	)}
-
-happyReduce_29 = happySpecReduce_1  5# happyReduction_29
-happyReduction_29 happy_x_1
-	 =  case happyOut22 happy_x_1 of { happy_var_1 -> 
-	happyIn12
-		 (happy_var_1
-	)}
-
-happyReduce_30 = happySpecReduce_1  5# happyReduction_30
-happyReduction_30 happy_x_1
-	 =  case happyOut23 happy_x_1 of { happy_var_1 -> 
-	happyIn12
-		 (happy_var_1
-	)}
-
-happyReduce_31 = happySpecReduce_1  5# happyReduction_31
-happyReduction_31 happy_x_1
-	 =  case happyOut24 happy_x_1 of { happy_var_1 -> 
-	happyIn12
-		 (happy_var_1
-	)}
-
-happyReduce_32 = happySpecReduce_1  5# happyReduction_32
-happyReduction_32 happy_x_1
-	 =  case happyOut25 happy_x_1 of { happy_var_1 -> 
-	happyIn12
-		 (happy_var_1
-	)}
-
-happyReduce_33 = happyMonadReduce 1# 5# happyReduction_33
-happyReduction_33 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut26 happy_x_1 of { happy_var_1 -> 
-	( withNodeInfo happy_var_1 (CAsm happy_var_1))}
-	) (\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 happyOut125 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut126 happy_x_3 of { happy_var_3 -> 
-	case happyOut12 happy_x_4 of { happy_var_4 -> 
-	( withNodeInfo happy_var_2 $ CLabel happy_var_1 happy_var_4 happy_var_3)}}}}
-	) (\r -> happyReturn (happyIn13 r))
-
-happyReduce_35 = happyMonadReduce 4# 6# happyReduction_35
-happyReduction_35 (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 happyOut121 happy_x_2 of { happy_var_2 -> 
-	case happyOut12 happy_x_4 of { happy_var_4 -> 
-	( withNodeInfo happy_var_1 $ CCase happy_var_2 happy_var_4)}}}
-	) (\r -> happyReturn (happyIn13 r))
-
-happyReduce_36 = happyMonadReduce 3# 6# happyReduction_36
-happyReduction_36 (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 happyOut12 happy_x_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_1 $ CDefault happy_var_3)}}
-	) (\r -> happyReturn (happyIn13 r))
-
-happyReduce_37 = happyMonadReduce 6# 6# happyReduction_37
-happyReduction_37 (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 happyOut121 happy_x_2 of { happy_var_2 -> 
-	case happyOut121 happy_x_4 of { happy_var_4 -> 
-	case happyOut12 happy_x_6 of { happy_var_6 -> 
-	( withNodeInfo happy_var_1 $ CCases happy_var_2 happy_var_4 happy_var_6)}}}}
-	) (\r -> happyReturn (happyIn13 r))
-
-happyReduce_38 = happyMonadReduce 5# 7# happyReduction_38
-happyReduction_38 (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 happyOut17 happy_x_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_1 $ CCompound [] (reverse happy_var_3))}}
-	) (\r -> happyReturn (happyIn14 r))
-
-happyReduce_39 = happyMonadReduce 6# 7# happyReduction_39
-happyReduction_39 (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 happyOut21 happy_x_3 of { happy_var_3 -> 
-	case happyOut17 happy_x_4 of { happy_var_4 -> 
-	( withNodeInfo happy_var_1 $ CCompound (reverse happy_var_3) (reverse happy_var_4))}}}
-	) (\r -> happyReturn (happyIn14 r))
-
-happyReduce_40 = happyMonadReduce 0# 8# happyReduction_40
-happyReduction_40 (happyRest) tk
-	 = happyThen (( enterScope)
-	) (\r -> happyReturn (happyIn15 r))
-
-happyReduce_41 = happyMonadReduce 0# 9# happyReduction_41
-happyReduction_41 (happyRest) tk
-	 = happyThen (( leaveScope)
-	) (\r -> happyReturn (happyIn16 r))
-
-happyReduce_42 = happySpecReduce_0  10# happyReduction_42
-happyReduction_42  =  happyIn17
-		 (empty
-	)
-
-happyReduce_43 = happySpecReduce_2  10# happyReduction_43
-happyReduction_43 happy_x_2
-	happy_x_1
-	 =  case happyOut17 happy_x_1 of { happy_var_1 -> 
-	case happyOut18 happy_x_2 of { happy_var_2 -> 
-	happyIn17
-		 (happy_var_1 `snoc` happy_var_2
-	)}}
-
-happyReduce_44 = happySpecReduce_1  11# happyReduction_44
-happyReduction_44 happy_x_1
-	 =  case happyOut12 happy_x_1 of { happy_var_1 -> 
-	happyIn18
-		 (CBlockStmt happy_var_1
-	)}
-
-happyReduce_45 = happySpecReduce_1  11# happyReduction_45
-happyReduction_45 happy_x_1
-	 =  case happyOut19 happy_x_1 of { happy_var_1 -> 
-	happyIn18
-		 (happy_var_1
-	)}
-
-happyReduce_46 = happySpecReduce_1  12# happyReduction_46
-happyReduction_46 happy_x_1
-	 =  case happyOut32 happy_x_1 of { happy_var_1 -> 
-	happyIn19
-		 (CBlockDecl happy_var_1
-	)}
-
-happyReduce_47 = happySpecReduce_1  12# happyReduction_47
-happyReduction_47 happy_x_1
-	 =  case happyOut20 happy_x_1 of { happy_var_1 -> 
-	happyIn19
-		 (CNestedFunDef happy_var_1
-	)}
-
-happyReduce_48 = happySpecReduce_2  12# happyReduction_48
-happyReduction_48 happy_x_2
-	happy_x_1
-	 =  case happyOut19 happy_x_2 of { happy_var_2 -> 
-	happyIn19
-		 (happy_var_2
-	)}
-
-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 happyOut37 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_2 of { happy_var_2 -> 
-	case happyOut14 happy_x_3 of { happy_var_3 -> 
-	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}
-	) (\r -> happyReturn (happyIn20 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 happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_2 of { happy_var_2 -> 
-	case happyOut14 happy_x_3 of { happy_var_3 -> 
-	( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}
-	) (\r -> happyReturn (happyIn20 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 happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_2 of { happy_var_2 -> 
-	case happyOut14 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 (happyIn20 r))
-
-happyReduce_52 = happyMonadReduce 3# 13# happyReduction_52
-happyReduction_52 (happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut11 happy_x_2 of { happy_var_2 -> 
-	case happyOut14 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 (happyIn20 r))
-
-happyReduce_53 = happyMonadReduce 4# 13# happyReduction_53
-happyReduction_53 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut11 happy_x_3 of { happy_var_3 -> 
-	case happyOut14 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 (happyIn20 r))
-
-happyReduce_54 = happySpecReduce_3  14# happyReduction_54
-happyReduction_54 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut82 happy_x_2 of { happy_var_2 -> 
-	happyIn21
-		 (happy_var_2
-	)}
-
-happyReduce_55 = happyReduce 4# 14# happyReduction_55
-happyReduction_55 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut21 happy_x_1 of { happy_var_1 -> 
-	case happyOut82 happy_x_3 of { happy_var_3 -> 
-	happyIn21
-		 (happy_var_1 `rappendr` happy_var_3
-	) `HappyStk` happyRest}}
-
-happyReduce_56 = happyMonadReduce 1# 15# happyReduction_56
-happyReduction_56 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
-	( withNodeInfo happy_var_1 $ CExpr Nothing)}
-	) (\r -> happyReturn (happyIn22 r))
-
-happyReduce_57 = happyMonadReduce 2# 15# happyReduction_57
-happyReduction_57 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut117 happy_x_1 of { happy_var_1 -> 
-	( withNodeInfo happy_var_1 $ CExpr (Just happy_var_1))}
-	) (\r -> happyReturn (happyIn22 r))
-
-happyReduce_58 = happyMonadReduce 5# 16# happyReduction_58
-happyReduction_58 (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 happyOut117 happy_x_3 of { happy_var_3 -> 
-	case happyOut12 happy_x_5 of { happy_var_5 -> 
-	( withNodeInfo happy_var_1 $ CIf happy_var_3 happy_var_5 Nothing)}}}
-	) (\r -> happyReturn (happyIn23 r))
-
-happyReduce_59 = happyMonadReduce 7# 16# happyReduction_59
-happyReduction_59 (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 happyOut117 happy_x_3 of { happy_var_3 -> 
-	case happyOut12 happy_x_5 of { happy_var_5 -> 
-	case happyOut12 happy_x_7 of { happy_var_7 -> 
-	( withNodeInfo happy_var_1 $ CIf happy_var_3 happy_var_5 (Just happy_var_7))}}}}
-	) (\r -> happyReturn (happyIn23 r))
-
-happyReduce_60 = happyMonadReduce 5# 16# 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 happyOut117 happy_x_3 of { happy_var_3 -> 
-	case happyOut12 happy_x_5 of { happy_var_5 -> 
-	( withNodeInfo happy_var_1 $ CSwitch happy_var_3 happy_var_5)}}}
-	) (\r -> happyReturn (happyIn23 r))
-
-happyReduce_61 = happyMonadReduce 5# 17# happyReduction_61
-happyReduction_61 (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 happyOut117 happy_x_3 of { happy_var_3 -> 
-	case happyOut12 happy_x_5 of { happy_var_5 -> 
-	( withNodeInfo happy_var_1 $ CWhile happy_var_3 happy_var_5 False)}}}
-	) (\r -> happyReturn (happyIn24 r))
-
-happyReduce_62 = happyMonadReduce 7# 17# happyReduction_62
-happyReduction_62 (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 happyOut12 happy_x_2 of { happy_var_2 -> 
-	case happyOut117 happy_x_5 of { happy_var_5 -> 
-	( withNodeInfo happy_var_1 $ CWhile happy_var_5 happy_var_2 True)}}}
-	) (\r -> happyReturn (happyIn24 r))
-
-happyReduce_63 = happyMonadReduce 9# 17# happyReduction_63
-happyReduction_63 (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 happyOut119 happy_x_3 of { happy_var_3 -> 
-	case happyOut119 happy_x_5 of { happy_var_5 -> 
-	case happyOut119 happy_x_7 of { happy_var_7 -> 
-	case happyOut12 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 (happyIn24 r))
-
-happyReduce_64 = happyMonadReduce 10# 17# happyReduction_64
-happyReduction_64 (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 happyOut32 happy_x_4 of { happy_var_4 -> 
-	case happyOut119 happy_x_5 of { happy_var_5 -> 
-	case happyOut119 happy_x_7 of { happy_var_7 -> 
-	case happyOut12 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 (happyIn24 r))
-
-happyReduce_65 = happyMonadReduce 3# 18# happyReduction_65
-happyReduction_65 (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 -> 
-	( withNodeInfo happy_var_1 $ CGoto happy_var_2)}}
-	) (\r -> happyReturn (happyIn25 r))
-
-happyReduce_66 = happyMonadReduce 4# 18# happyReduction_66
-happyReduction_66 (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 happyOut117 happy_x_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_1 $ CGotoPtr happy_var_3)}}
-	) (\r -> happyReturn (happyIn25 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 $ CCont)}
-	) (\r -> happyReturn (happyIn25 r))
-
-happyReduce_68 = happyMonadReduce 2# 18# happyReduction_68
-happyReduction_68 (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 (happyIn25 r))
-
-happyReduce_69 = happyMonadReduce 3# 18# happyReduction_69
-happyReduction_69 (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 $ CReturn happy_var_2)}}
-	) (\r -> happyReturn (happyIn25 r))
-
-happyReduce_70 = happyMonadReduce 6# 19# happyReduction_70
-happyReduction_70 (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 happyOut27 happy_x_2 of { happy_var_2 -> 
-	case happyOut123 happy_x_4 of { happy_var_4 -> 
-	( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 [] [] [])}}}
-	) (\r -> happyReturn (happyIn26 r))
-
-happyReduce_71 = happyMonadReduce 8# 19# happyReduction_71
-happyReduction_71 (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 happyOut27 happy_x_2 of { happy_var_2 -> 
-	case happyOut123 happy_x_4 of { happy_var_4 -> 
-	case happyOut28 happy_x_6 of { happy_var_6 -> 
-	( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 happy_var_6 [] [])}}}}
-	) (\r -> happyReturn (happyIn26 r))
-
-happyReduce_72 = happyMonadReduce 10# 19# happyReduction_72
-happyReduction_72 (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 happyOut27 happy_x_2 of { happy_var_2 -> 
-	case happyOut123 happy_x_4 of { happy_var_4 -> 
-	case happyOut28 happy_x_6 of { happy_var_6 -> 
-	case happyOut28 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 (happyIn26 r))
-
-happyReduce_73 = happyMonadReduce 12# 19# happyReduction_73
-happyReduction_73 (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 happyOut27 happy_x_2 of { happy_var_2 -> 
-	case happyOut123 happy_x_4 of { happy_var_4 -> 
-	case happyOut28 happy_x_6 of { happy_var_6 -> 
-	case happyOut28 happy_x_8 of { happy_var_8 -> 
-	case happyOut31 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 (happyIn26 r))
-
-happyReduce_74 = happySpecReduce_0  20# happyReduction_74
-happyReduction_74  =  happyIn27
-		 (Nothing
-	)
-
-happyReduce_75 = happySpecReduce_1  20# happyReduction_75
-happyReduction_75 happy_x_1
-	 =  case happyOut61 happy_x_1 of { happy_var_1 -> 
-	happyIn27
-		 (Just happy_var_1
-	)}
-
-happyReduce_76 = happySpecReduce_0  21# happyReduction_76
-happyReduction_76  =  happyIn28
-		 ([]
-	)
-
-happyReduce_77 = happySpecReduce_1  21# happyReduction_77
-happyReduction_77 happy_x_1
-	 =  case happyOut29 happy_x_1 of { happy_var_1 -> 
-	happyIn28
-		 (reverse happy_var_1
-	)}
-
-happyReduce_78 = happySpecReduce_1  22# happyReduction_78
-happyReduction_78 happy_x_1
-	 =  case happyOut30 happy_x_1 of { happy_var_1 -> 
-	happyIn29
-		 (singleton happy_var_1
-	)}
-
-happyReduce_79 = happySpecReduce_3  22# happyReduction_79
-happyReduction_79 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut29 happy_x_1 of { happy_var_1 -> 
-	case happyOut30 happy_x_3 of { happy_var_3 -> 
-	happyIn29
-		 (happy_var_1 `snoc` happy_var_3
-	)}}
-
-happyReduce_80 = happyMonadReduce 4# 23# happyReduction_80
-happyReduction_80 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut123 happy_x_1 of { happy_var_1 -> 
-	case happyOut117 happy_x_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_1 $ CAsmOperand Nothing happy_var_1 happy_var_3)}}
-	) (\r -> happyReturn (happyIn30 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 { (CTokIdent  _ happy_var_2) -> 
-	case happyOut123 happy_x_4 of { happy_var_4 -> 
-	case happyOut117 happy_x_6 of { happy_var_6 -> 
-	( withNodeInfo happy_var_4 $ CAsmOperand (Just happy_var_2) happy_var_4 happy_var_6)}}}
-	) (\r -> happyReturn (happyIn30 r))
-
-happyReduce_82 = happyMonadReduce 7# 23# happyReduction_82
-happyReduction_82 (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 happyOut123 happy_x_4 of { happy_var_4 -> 
-	case happyOut117 happy_x_6 of { happy_var_6 -> 
-	( withNodeInfo happy_var_4 $ CAsmOperand (Just happy_var_2) happy_var_4 happy_var_6)}}}
-	) (\r -> happyReturn (happyIn30 r))
-
-happyReduce_83 = happySpecReduce_1  24# happyReduction_83
-happyReduction_83 happy_x_1
-	 =  case happyOut123 happy_x_1 of { happy_var_1 -> 
-	happyIn31
-		 (singleton happy_var_1
-	)}
-
-happyReduce_84 = happySpecReduce_3  24# happyReduction_84
-happyReduction_84 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut31 happy_x_1 of { happy_var_1 -> 
-	case happyOut123 happy_x_3 of { happy_var_3 -> 
-	happyIn31
-		 (happy_var_1 `snoc` happy_var_3
-	)}}
-
-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 (happyIn32 r))
-
-happyReduce_86 = happyMonadReduce 2# 25# happyReduction_86
-happyReduction_86 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut46 happy_x_1 of { happy_var_1 -> 
-	( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [])}
-	) (\r -> happyReturn (happyIn32 r))
-
-happyReduce_87 = happySpecReduce_2  25# happyReduction_87
-happyReduction_87 happy_x_2
-	happy_x_1
-	 =  case happyOut36 happy_x_1 of { happy_var_1 -> 
-	happyIn32
-		 (case happy_var_1 of
-            CDecl declspecs dies at ->
-              CDecl declspecs (List.reverse dies) at
-	)}
-
-happyReduce_88 = happySpecReduce_2  25# happyReduction_88
-happyReduction_88 happy_x_2
-	happy_x_1
-	 =  case happyOut34 happy_x_1 of { happy_var_1 -> 
-	happyIn32
-		 (case happy_var_1 of
-            CDecl declspecs dies at ->
-              CDecl declspecs (List.reverse dies) at
-	)}
-
-happyReduce_89 = happySpecReduce_0  26# happyReduction_89
-happyReduction_89  =  happyIn33
-		 (empty
-	)
-
-happyReduce_90 = happySpecReduce_2  26# happyReduction_90
-happyReduction_90 happy_x_2
-	happy_x_1
-	 =  case happyOut33 happy_x_1 of { happy_var_1 -> 
-	case happyOut32 happy_x_2 of { happy_var_2 -> 
-	happyIn33
-		 (happy_var_1 `snoc` happy_var_2
-	)}}
-
-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 happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOut72 happy_x_2 of { happy_var_2 -> 
-	case happyOut35 happy_x_3 of { happy_var_3 -> 
-	case happyOut91 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 (happyIn34 r))
-
-happyReduce_92 = happyMonadReduce 4# 27# happyReduction_92
-happyReduction_92 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut72 happy_x_2 of { happy_var_2 -> 
-	case happyOut35 happy_x_3 of { happy_var_3 -> 
-	case happyOut91 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 (happyIn34 r))
-
-happyReduce_93 = happyMonadReduce 5# 27# happyReduction_93
-happyReduction_93 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut72 happy_x_3 of { happy_var_3 -> 
-	case happyOut35 happy_x_4 of { happy_var_4 -> 
-	case happyOut91 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 (happyIn34 r))
-
-happyReduce_94 = happyMonadReduce 4# 27# happyReduction_94
-happyReduction_94 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut127 happy_x_1 of { happy_var_1 -> 
-	case happyOut72 happy_x_2 of { happy_var_2 -> 
-	case happyOut35 happy_x_3 of { happy_var_3 -> 
-	case happyOut91 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 (happyIn34 r))
-
-happyReduce_95 = happyMonadReduce 6# 27# happyReduction_95
-happyReduction_95 (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 happyOut34 happy_x_1 of { happy_var_1 -> 
-	case happyOut126 happy_x_3 of { happy_var_3 -> 
-	case happyOut72 happy_x_4 of { happy_var_4 -> 
-	case happyOut35 happy_x_5 of { happy_var_5 -> 
-	case happyOut91 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 (happyIn34 r))
-
-happyReduce_96 = happySpecReduce_2  28# happyReduction_96
-happyReduction_96 happy_x_2
-	happy_x_1
-	 =  case happyOut64 happy_x_1 of { happy_var_1 -> 
-	case happyOut126 happy_x_2 of { happy_var_2 -> 
-	happyIn35
-		 ((happy_var_1,happy_var_2)
-	)}}
-
-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 happyOut37 happy_x_1 of { happy_var_1 -> 
-	case happyOut63 happy_x_2 of { happy_var_2 -> 
-	case happyOut35 happy_x_3 of { happy_var_3 -> 
-	case happyOut91 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 (happyIn36 r))
-
-happyReduce_98 = happyMonadReduce 4# 29# happyReduction_98
-happyReduction_98 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOut63 happy_x_2 of { happy_var_2 -> 
-	case happyOut35 happy_x_3 of { happy_var_3 -> 
-	case happyOut91 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 (happyIn36 r))
-
-happyReduce_99 = happyMonadReduce 6# 29# happyReduction_99
-happyReduction_99 (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 happyOut36 happy_x_1 of { happy_var_1 -> 
-	case happyOut126 happy_x_3 of { happy_var_3 -> 
-	case happyOut63 happy_x_4 of { happy_var_4 -> 
-	case happyOut35 happy_x_5 of { happy_var_5 -> 
-	case happyOut91 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 (happyIn36 r))
-
-happyReduce_100 = happySpecReduce_1  30# happyReduction_100
-happyReduction_100 happy_x_1
-	 =  case happyOut43 happy_x_1 of { happy_var_1 -> 
-	happyIn37
-		 (reverse happy_var_1
-	)}
-
-happyReduce_101 = happySpecReduce_1  30# happyReduction_101
-happyReduction_101 happy_x_1
-	 =  case happyOut45 happy_x_1 of { happy_var_1 -> 
-	happyIn37
-		 (reverse happy_var_1
-	)}
-
-happyReduce_102 = happySpecReduce_1  30# happyReduction_102
-happyReduction_102 happy_x_1
-	 =  case happyOut47 happy_x_1 of { happy_var_1 -> 
-	happyIn37
-		 (reverse happy_var_1
-	)}
-
-happyReduce_103 = happySpecReduce_1  31# happyReduction_103
-happyReduction_103 happy_x_1
-	 =  case happyOut40 happy_x_1 of { happy_var_1 -> 
-	happyIn38
-		 (singleton (CStorageSpec happy_var_1)
-	)}
-
-happyReduce_104 = happySpecReduce_2  31# happyReduction_104
-happyReduction_104 happy_x_2
-	happy_x_1
-	 =  case happyOut127 happy_x_1 of { happy_var_1 -> 
-	case happyOut40 happy_x_2 of { happy_var_2 -> 
-	happyIn38
-		 (reverseList (liftCAttrs happy_var_1) `snoc` (CStorageSpec happy_var_2)
-	)}}
-
-happyReduce_105 = happySpecReduce_2  31# happyReduction_105
-happyReduction_105 happy_x_2
-	happy_x_1
-	 =  case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut40 happy_x_2 of { happy_var_2 -> 
-	happyIn38
-		 (rmap CTypeQual happy_var_1 `snoc` CStorageSpec happy_var_2
-	)}}
-
-happyReduce_106 = happySpecReduce_3  31# happyReduction_106
-happyReduction_106 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut40 happy_x_3 of { happy_var_3 -> 
-	happyIn38
-		 ((rmap CTypeQual happy_var_1 `rappend` liftCAttrs happy_var_2) `snoc` CStorageSpec happy_var_3
-	)}}}
-
-happyReduce_107 = happySpecReduce_2  31# happyReduction_107
-happyReduction_107 happy_x_2
-	happy_x_1
-	 =  case happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOut39 happy_x_2 of { happy_var_2 -> 
-	happyIn38
-		 (happy_var_1 `snoc` happy_var_2
-	)}}
-
-happyReduce_108 = happySpecReduce_2  31# happyReduction_108
-happyReduction_108 happy_x_2
-	happy_x_1
-	 =  case happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOut128 happy_x_2 of { happy_var_2 -> 
-	happyIn38
-		 (addTrailingAttrs happy_var_1 happy_var_2
-	)}}
-
-happyReduce_109 = happySpecReduce_1  32# happyReduction_109
-happyReduction_109 happy_x_1
-	 =  case happyOut40 happy_x_1 of { happy_var_1 -> 
-	happyIn39
-		 (CStorageSpec happy_var_1
-	)}
-
-happyReduce_110 = happySpecReduce_1  32# happyReduction_110
-happyReduction_110 happy_x_1
-	 =  case happyOut61 happy_x_1 of { happy_var_1 -> 
-	happyIn39
-		 (CTypeQual happy_var_1
-	)}
-
-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 $ CTypedef)}
-	) (\r -> happyReturn (happyIn40 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 $ CExtern)}
-	) (\r -> happyReturn (happyIn40 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 $ CStatic)}
-	) (\r -> happyReturn (happyIn40 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 $ CAuto)}
-	) (\r -> happyReturn (happyIn40 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 $ CRegister)}
-	) (\r -> happyReturn (happyIn40 r))
-
-happyReduce_116 = happyMonadReduce 1# 33# happyReduction_116
-happyReduction_116 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
-	( withNodeInfo happy_var_1 $ CThread)}
-	) (\r -> happyReturn (happyIn40 r))
-
-happyReduce_117 = happySpecReduce_1  34# happyReduction_117
-happyReduction_117 happy_x_1
-	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
-	happyIn41
-		 (reverse happy_var_1
-	)}
-
-happyReduce_118 = happySpecReduce_1  34# happyReduction_118
-happyReduction_118 happy_x_1
-	 =  case happyOut46 happy_x_1 of { happy_var_1 -> 
-	happyIn41
-		 (reverse happy_var_1
-	)}
-
-happyReduce_119 = happySpecReduce_1  34# happyReduction_119
-happyReduction_119 happy_x_1
-	 =  case happyOut48 happy_x_1 of { happy_var_1 -> 
-	happyIn41
-		 (reverse happy_var_1
-	)}
-
-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 $ CVoidType)}
-	) (\r -> happyReturn (happyIn42 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 $ CCharType)}
-	) (\r -> happyReturn (happyIn42 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 $ CShortType)}
-	) (\r -> happyReturn (happyIn42 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 $ CIntType)}
-	) (\r -> happyReturn (happyIn42 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 $ CLongType)}
-	) (\r -> happyReturn (happyIn42 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 $ CFloatType)}
-	) (\r -> happyReturn (happyIn42 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 $ CDoubleType)}
-	) (\r -> happyReturn (happyIn42 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 $ CSignedType)}
-	) (\r -> happyReturn (happyIn42 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 $ CUnsigType)}
-	) (\r -> happyReturn (happyIn42 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 $ CBoolType)}
-	) (\r -> happyReturn (happyIn42 r))
-
-happyReduce_130 = happyMonadReduce 1# 35# happyReduction_130
-happyReduction_130 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
-	( withNodeInfo happy_var_1 $ CComplexType)}
-	) (\r -> happyReturn (happyIn42 r))
-
-happyReduce_131 = happySpecReduce_2  36# happyReduction_131
-happyReduction_131 happy_x_2
-	happy_x_1
-	 =  case happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOut42 happy_x_2 of { happy_var_2 -> 
-	happyIn43
-		 (happy_var_1 `snoc` CTypeSpec happy_var_2
-	)}}
-
-happyReduce_132 = happySpecReduce_2  36# happyReduction_132
-happyReduction_132 happy_x_2
-	happy_x_1
-	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
-	case happyOut40 happy_x_2 of { happy_var_2 -> 
-	happyIn43
-		 (happy_var_1 `snoc` CStorageSpec happy_var_2
-	)}}
-
-happyReduce_133 = happySpecReduce_2  36# happyReduction_133
-happyReduction_133 happy_x_2
-	happy_x_1
-	 =  case happyOut43 happy_x_1 of { happy_var_1 -> 
-	case happyOut39 happy_x_2 of { happy_var_2 -> 
-	happyIn43
-		 (happy_var_1 `snoc` happy_var_2
-	)}}
-
-happyReduce_134 = happySpecReduce_2  36# happyReduction_134
-happyReduction_134 happy_x_2
-	happy_x_1
-	 =  case happyOut43 happy_x_1 of { happy_var_1 -> 
-	case happyOut42 happy_x_2 of { happy_var_2 -> 
-	happyIn43
-		 (happy_var_1 `snoc` CTypeSpec happy_var_2
-	)}}
-
-happyReduce_135 = happySpecReduce_2  36# happyReduction_135
-happyReduction_135 happy_x_2
-	happy_x_1
-	 =  case happyOut43 happy_x_1 of { happy_var_1 -> 
-	case happyOut128 happy_x_2 of { happy_var_2 -> 
-	happyIn43
-		 (addTrailingAttrs happy_var_1 happy_var_2
-	)}}
-
-happyReduce_136 = happySpecReduce_1  37# happyReduction_136
-happyReduction_136 happy_x_1
-	 =  case happyOut42 happy_x_1 of { happy_var_1 -> 
-	happyIn44
-		 (singleton (CTypeSpec happy_var_1)
-	)}
-
-happyReduce_137 = happySpecReduce_2  37# happyReduction_137
-happyReduction_137 happy_x_2
-	happy_x_1
-	 =  case happyOut127 happy_x_1 of { happy_var_1 -> 
-	case happyOut42 happy_x_2 of { happy_var_2 -> 
-	happyIn44
-		 ((reverseList $ liftCAttrs happy_var_1) `snoc` (CTypeSpec happy_var_2)
-	)}}
-
-happyReduce_138 = happySpecReduce_2  37# happyReduction_138
-happyReduction_138 happy_x_2
-	happy_x_1
-	 =  case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut42 happy_x_2 of { happy_var_2 -> 
-	happyIn44
-		 (rmap CTypeQual happy_var_1 `snoc` CTypeSpec happy_var_2
-	)}}
-
-happyReduce_139 = happySpecReduce_3  37# happyReduction_139
-happyReduction_139 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut42 happy_x_3 of { happy_var_3 -> 
-	happyIn44
-		 (rmap CTypeQual happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec happy_var_3
-	)}}}
-
-happyReduce_140 = happySpecReduce_2  37# happyReduction_140
-happyReduction_140 happy_x_2
-	happy_x_1
-	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
-	case happyOut61 happy_x_2 of { happy_var_2 -> 
-	happyIn44
-		 (happy_var_1 `snoc` CTypeQual happy_var_2
-	)}}
-
-happyReduce_141 = happySpecReduce_2  37# happyReduction_141
-happyReduction_141 happy_x_2
-	happy_x_1
-	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
-	case happyOut42 happy_x_2 of { happy_var_2 -> 
-	happyIn44
-		 (happy_var_1 `snoc` CTypeSpec happy_var_2
-	)}}
-
-happyReduce_142 = happySpecReduce_2  37# happyReduction_142
-happyReduction_142 happy_x_2
-	happy_x_1
-	 =  case happyOut44 happy_x_1 of { happy_var_1 -> 
-	case happyOut128 happy_x_2 of { happy_var_2 -> 
-	happyIn44
-		 (addTrailingAttrs happy_var_1 happy_var_2
-	)}}
-
-happyReduce_143 = happySpecReduce_2  38# happyReduction_143
-happyReduction_143 happy_x_2
-	happy_x_1
-	 =  case happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOut49 happy_x_2 of { happy_var_2 -> 
-	happyIn45
-		 (happy_var_1 `snoc` CTypeSpec happy_var_2
-	)}}
-
-happyReduce_144 = happySpecReduce_2  38# happyReduction_144
-happyReduction_144 happy_x_2
-	happy_x_1
-	 =  case happyOut46 happy_x_1 of { happy_var_1 -> 
-	case happyOut40 happy_x_2 of { happy_var_2 -> 
-	happyIn45
-		 (happy_var_1 `snoc` CStorageSpec happy_var_2
-	)}}
-
-happyReduce_145 = happySpecReduce_2  38# happyReduction_145
-happyReduction_145 happy_x_2
-	happy_x_1
-	 =  case happyOut45 happy_x_1 of { happy_var_1 -> 
-	case happyOut39 happy_x_2 of { happy_var_2 -> 
-	happyIn45
-		 (happy_var_1 `snoc` happy_var_2
-	)}}
-
-happyReduce_146 = happySpecReduce_2  38# happyReduction_146
-happyReduction_146 happy_x_2
-	happy_x_1
-	 =  case happyOut45 happy_x_1 of { happy_var_1 -> 
-	case happyOut128 happy_x_2 of { happy_var_2 -> 
-	happyIn45
-		 (addTrailingAttrs happy_var_1 happy_var_2
-	)}}
-
-happyReduce_147 = happySpecReduce_1  39# happyReduction_147
-happyReduction_147 happy_x_1
-	 =  case happyOut49 happy_x_1 of { happy_var_1 -> 
-	happyIn46
-		 (singleton (CTypeSpec happy_var_1)
-	)}
-
-happyReduce_148 = happySpecReduce_2  39# happyReduction_148
-happyReduction_148 happy_x_2
-	happy_x_1
-	 =  case happyOut127 happy_x_1 of { happy_var_1 -> 
-	case happyOut49 happy_x_2 of { happy_var_2 -> 
-	happyIn46
-		 ((reverseList $ liftCAttrs happy_var_1) `snoc` (CTypeSpec happy_var_2)
-	)}}
-
-happyReduce_149 = happySpecReduce_2  39# happyReduction_149
-happyReduction_149 happy_x_2
-	happy_x_1
-	 =  case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut49 happy_x_2 of { happy_var_2 -> 
-	happyIn46
-		 (rmap CTypeQual happy_var_1 `snoc` CTypeSpec happy_var_2
-	)}}
-
-happyReduce_150 = happySpecReduce_3  39# happyReduction_150
-happyReduction_150 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut49 happy_x_3 of { happy_var_3 -> 
-	happyIn46
-		 (rmap CTypeQual  happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec happy_var_3
-	)}}}
-
-happyReduce_151 = happySpecReduce_2  39# happyReduction_151
-happyReduction_151 happy_x_2
-	happy_x_1
-	 =  case happyOut46 happy_x_1 of { happy_var_1 -> 
-	case happyOut61 happy_x_2 of { happy_var_2 -> 
-	happyIn46
-		 (happy_var_1 `snoc` CTypeQual happy_var_2
-	)}}
-
-happyReduce_152 = happySpecReduce_2  39# happyReduction_152
-happyReduction_152 happy_x_2
-	happy_x_1
-	 =  case happyOut46 happy_x_1 of { happy_var_1 -> 
-	case happyOut128 happy_x_2 of { happy_var_2 -> 
-	happyIn46
-		 (addTrailingAttrs happy_var_1 happy_var_2
-	)}}
-
-happyReduce_153 = happySpecReduce_2  40# happyReduction_153
-happyReduction_153 happy_x_2
-	happy_x_1
-	 =  case happyOut48 happy_x_1 of { happy_var_1 -> 
-	case happyOut40 happy_x_2 of { happy_var_2 -> 
-	happyIn47
-		 (happy_var_1 `snoc` CStorageSpec happy_var_2
-	)}}
-
-happyReduce_154 = happyMonadReduce 2# 40# happyReduction_154
-happyReduction_154 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut38 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 (happyIn47 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 happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOut117 happy_x_4 of { happy_var_4 -> 
-	( withNodeInfo happy_var_1 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeOfExpr happy_var_4 at))}}
-	) (\r -> happyReturn (happyIn47 r))
-
-happyReduce_156 = happyMonadReduce 5# 40# happyReduction_156
-happyReduction_156 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOut83 happy_x_4 of { happy_var_4 -> 
-	( withNodeInfo happy_var_1 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeOfType happy_var_4 at))}}
-	) (\r -> happyReturn (happyIn47 r))
-
-happyReduce_157 = happySpecReduce_2  40# happyReduction_157
-happyReduction_157 happy_x_2
-	happy_x_1
-	 =  case happyOut47 happy_x_1 of { happy_var_1 -> 
-	case happyOut39 happy_x_2 of { happy_var_2 -> 
-	happyIn47
-		 (happy_var_1 `snoc` happy_var_2
-	)}}
-
-happyReduce_158 = happySpecReduce_2  40# happyReduction_158
-happyReduction_158 happy_x_2
-	happy_x_1
-	 =  case happyOut47 happy_x_1 of { happy_var_1 -> 
-	case happyOut128 happy_x_2 of { happy_var_2 -> 
-	happyIn47
-		 (addTrailingAttrs happy_var_1 happy_var_2
-	)}}
-
-happyReduce_159 = happyMonadReduce 1# 41# happyReduction_159
-happyReduction_159 (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 (happyIn48 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 happyOut117 happy_x_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_1 $ \at -> singleton (CTypeSpec (CTypeOfExpr happy_var_3 at)))}}
-	) (\r -> happyReturn (happyIn48 r))
-
-happyReduce_161 = happyMonadReduce 4# 41# happyReduction_161
-happyReduction_161 (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 happyOut83 happy_x_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_1 $ \at -> singleton (CTypeSpec (CTypeOfType happy_var_3 at)))}}
-	) (\r -> happyReturn (happyIn48 r))
-
-happyReduce_162 = happyMonadReduce 2# 41# happyReduction_162
-happyReduction_162 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut62 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 (happyIn48 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 happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut117 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 (happyIn48 r))
-
-happyReduce_164 = happyMonadReduce 5# 41# happyReduction_164
-happyReduction_164 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut83 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 (happyIn48 r))
-
-happyReduce_165 = happyMonadReduce 2# 41# happyReduction_165
-happyReduction_165 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut127 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 (happyIn48 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 happyOut127 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut117 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 (happyIn48 r))
-
-happyReduce_167 = happyMonadReduce 5# 41# happyReduction_167
-happyReduction_167 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut127 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut83 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 (happyIn48 r))
-
-happyReduce_168 = happyMonadReduce 3# 41# happyReduction_168
-happyReduction_168 (happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut127 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 (happyIn48 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 happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut117 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 (happyIn48 r))
-
-happyReduce_170 = happyMonadReduce 6# 41# happyReduction_170
-happyReduction_170 (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 happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut83 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 (happyIn48 r))
-
-happyReduce_171 = happySpecReduce_2  41# happyReduction_171
-happyReduction_171 happy_x_2
-	happy_x_1
-	 =  case happyOut48 happy_x_1 of { happy_var_1 -> 
-	case happyOut61 happy_x_2 of { happy_var_2 -> 
-	happyIn48
-		 (happy_var_1 `snoc` CTypeQual happy_var_2
-	)}}
-
-happyReduce_172 = happySpecReduce_2  41# happyReduction_172
-happyReduction_172 happy_x_2
-	happy_x_1
-	 =  case happyOut48 happy_x_1 of { happy_var_1 -> 
-	case happyOut128 happy_x_2 of { happy_var_2 -> 
-	happyIn48
-		 (addTrailingAttrs happy_var_1 happy_var_2
-	)}}
-
-happyReduce_173 = happyMonadReduce 1# 42# happyReduction_173
-happyReduction_173 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut50 happy_x_1 of { happy_var_1 -> 
-	( withNodeInfo happy_var_1 $ CSUType happy_var_1)}
-	) (\r -> happyReturn (happyIn49 r))
-
-happyReduce_174 = happyMonadReduce 1# 42# happyReduction_174
-happyReduction_174 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut58 happy_x_1 of { happy_var_1 -> 
-	( withNodeInfo happy_var_1 $ CEnumType happy_var_1)}
-	) (\r -> happyReturn (happyIn49 r))
-
-happyReduce_175 = happyMonadReduce 6# 43# happyReduction_175
-happyReduction_175 (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 happyOut51 happy_x_1 of { happy_var_1 -> 
-	case happyOut126 happy_x_2 of { happy_var_2 -> 
-	case happyOut125 happy_x_3 of { happy_var_3 -> 
-	case happyOut52 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 (happyIn50 r))
-
-happyReduce_176 = happyMonadReduce 5# 43# happyReduction_176
-happyReduction_176 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut51 happy_x_1 of { happy_var_1 -> 
-	case happyOut126 happy_x_2 of { happy_var_2 -> 
-	case happyOut52 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 (happyIn50 r))
-
-happyReduce_177 = happyMonadReduce 3# 43# happyReduction_177
-happyReduction_177 (happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut51 happy_x_1 of { happy_var_1 -> 
-	case happyOut126 happy_x_2 of { happy_var_2 -> 
-	case happyOut125 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 (happyIn50 r))
-
-happyReduce_178 = happySpecReduce_1  44# happyReduction_178
-happyReduction_178 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn51
-		 (L CStructTag (posOf happy_var_1)
-	)}
-
-happyReduce_179 = happySpecReduce_1  44# happyReduction_179
-happyReduction_179 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn51
-		 (L CUnionTag (posOf happy_var_1)
-	)}
-
-happyReduce_180 = happySpecReduce_0  45# happyReduction_180
-happyReduction_180  =  happyIn52
-		 (empty
-	)
-
-happyReduce_181 = happySpecReduce_2  45# happyReduction_181
-happyReduction_181 happy_x_2
-	happy_x_1
-	 =  case happyOut52 happy_x_1 of { happy_var_1 -> 
-	happyIn52
-		 (happy_var_1
-	)}
-
-happyReduce_182 = happySpecReduce_2  45# happyReduction_182
-happyReduction_182 happy_x_2
-	happy_x_1
-	 =  case happyOut52 happy_x_1 of { happy_var_1 -> 
-	case happyOut53 happy_x_2 of { happy_var_2 -> 
-	happyIn52
-		 (happy_var_1 `snoc` happy_var_2
-	)}}
-
-happyReduce_183 = happySpecReduce_2  46# happyReduction_183
-happyReduction_183 happy_x_2
-	happy_x_1
-	 =  case happyOut55 happy_x_1 of { happy_var_1 -> 
-	happyIn53
-		 (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 happyOut54 happy_x_1 of { happy_var_1 -> 
-	happyIn53
-		 (case happy_var_1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at
-	)}
-
-happyReduce_185 = happySpecReduce_2  46# happyReduction_185
-happyReduction_185 happy_x_2
-	happy_x_1
-	 =  case happyOut53 happy_x_2 of { happy_var_2 -> 
-	happyIn53
-		 (happy_var_2
-	)}
-
-happyReduce_186 = happyMonadReduce 3# 47# happyReduction_186
-happyReduction_186 (happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut126 happy_x_2 of { happy_var_2 -> 
-	case happyOut57 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 (happyIn54 r))
-
-happyReduce_187 = happyMonadReduce 2# 47# happyReduction_187
-happyReduction_187 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut127 happy_x_1 of { happy_var_1 -> 
-	case happyOut57 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 (happyIn54 r))
-
-happyReduce_188 = happyReduce 4# 47# happyReduction_188
-happyReduction_188 (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 happyOut126 happy_x_3 of { happy_var_3 -> 
-	case happyOut57 happy_x_4 of { happy_var_4 -> 
-	happyIn54
-		 (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_189 = happyMonadReduce 3# 48# happyReduction_189
-happyReduction_189 (happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOut56 happy_x_2 of { happy_var_2 -> 
-	case happyOut126 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 (happyIn55 r))
-
-happyReduce_190 = happyReduce 5# 48# happyReduction_190
-happyReduction_190 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut55 happy_x_1 of { happy_var_1 -> 
-	case happyOut126 happy_x_3 of { happy_var_3 -> 
-	case happyOut56 happy_x_4 of { happy_var_4 -> 
-	case happyOut126 happy_x_5 of { happy_var_5 -> 
-	happyIn55
-		 (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_191 = happyMonadReduce 1# 48# happyReduction_191
-happyReduction_191 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut41 happy_x_1 of { happy_var_1 -> 
-	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}
-	) (\r -> happyReturn (happyIn55 r))
-
-happyReduce_192 = happySpecReduce_1  49# happyReduction_192
-happyReduction_192 happy_x_1
-	 =  case happyOut63 happy_x_1 of { happy_var_1 -> 
-	happyIn56
-		 ((Just (reverseDeclr happy_var_1), Nothing)
-	)}
-
-happyReduce_193 = happySpecReduce_2  49# happyReduction_193
-happyReduction_193 happy_x_2
-	happy_x_1
-	 =  case happyOut121 happy_x_2 of { happy_var_2 -> 
-	happyIn56
-		 ((Nothing, Just happy_var_2)
-	)}
-
-happyReduce_194 = happySpecReduce_3  49# happyReduction_194
-happyReduction_194 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut63 happy_x_1 of { happy_var_1 -> 
-	case happyOut121 happy_x_3 of { happy_var_3 -> 
-	happyIn56
-		 ((Just (reverseDeclr happy_var_1), Just happy_var_3)
-	)}}
-
-happyReduce_195 = happySpecReduce_1  50# happyReduction_195
-happyReduction_195 happy_x_1
-	 =  case happyOut72 happy_x_1 of { happy_var_1 -> 
-	happyIn57
-		 ((Just (reverseDeclr happy_var_1), Nothing)
-	)}
-
-happyReduce_196 = happySpecReduce_2  50# happyReduction_196
-happyReduction_196 happy_x_2
-	happy_x_1
-	 =  case happyOut121 happy_x_2 of { happy_var_2 -> 
-	happyIn57
-		 ((Nothing, Just happy_var_2)
-	)}
-
-happyReduce_197 = happySpecReduce_3  50# happyReduction_197
-happyReduction_197 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut72 happy_x_1 of { happy_var_1 -> 
-	case happyOut121 happy_x_3 of { happy_var_3 -> 
-	happyIn57
-		 ((Just (reverseDeclr happy_var_1), Just happy_var_3)
-	)}}
-
-happyReduce_198 = happySpecReduce_2  50# happyReduction_198
-happyReduction_198 happy_x_2
-	happy_x_1
-	 =  case happyOut57 happy_x_1 of { happy_var_1 -> 
-	case happyOut128 happy_x_2 of { happy_var_2 -> 
-	happyIn57
-		 (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_199 = happyMonadReduce 5# 51# happyReduction_199
-happyReduction_199 (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 happyOut59 happy_x_4 of { happy_var_4 -> 
-	( withNodeInfo happy_var_1 $ CEnum Nothing   (Just$ reverse happy_var_4) happy_var_2)}}}
-	) (\r -> happyReturn (happyIn58 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 happyOut126 happy_x_2 of { happy_var_2 -> 
-	case happyOut59 happy_x_4 of { happy_var_4 -> 
-	( withNodeInfo happy_var_1 $ CEnum Nothing   (Just$ reverse happy_var_4) happy_var_2)}}}
-	) (\r -> happyReturn (happyIn58 r))
-
-happyReduce_201 = happyMonadReduce 6# 51# happyReduction_201
-happyReduction_201 (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 happyOut126 happy_x_2 of { happy_var_2 -> 
-	case happyOut125 happy_x_3 of { happy_var_3 -> 
-	case happyOut59 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 (happyIn58 r))
-
-happyReduce_202 = happyMonadReduce 7# 51# happyReduction_202
-happyReduction_202 (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 happyOut126 happy_x_2 of { happy_var_2 -> 
-	case happyOut125 happy_x_3 of { happy_var_3 -> 
-	case happyOut59 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 (happyIn58 r))
-
-happyReduce_203 = happyMonadReduce 3# 51# happyReduction_203
-happyReduction_203 (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_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_1 $ CEnum (Just happy_var_3) Nothing happy_var_2)}}}
-	) (\r -> happyReturn (happyIn58 r))
-
-happyReduce_204 = happySpecReduce_1  52# happyReduction_204
-happyReduction_204 happy_x_1
-	 =  case happyOut60 happy_x_1 of { happy_var_1 -> 
-	happyIn59
-		 (singleton happy_var_1
-	)}
-
-happyReduce_205 = happySpecReduce_3  52# happyReduction_205
-happyReduction_205 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut59 happy_x_1 of { happy_var_1 -> 
-	case happyOut60 happy_x_3 of { happy_var_3 -> 
-	happyIn59
-		 (happy_var_1 `snoc` happy_var_3
-	)}}
-
-happyReduce_206 = happySpecReduce_1  53# happyReduction_206
-happyReduction_206 happy_x_1
-	 =  case happyOut125 happy_x_1 of { happy_var_1 -> 
-	happyIn60
-		 ((happy_var_1, Nothing)
-	)}
-
-happyReduce_207 = happySpecReduce_3  53# happyReduction_207
-happyReduction_207 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut125 happy_x_1 of { happy_var_1 -> 
-	case happyOut121 happy_x_3 of { happy_var_3 -> 
-	happyIn60
-		 ((happy_var_1, Just happy_var_3)
-	)}}
-
-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 $ CConstQual)}
-	) (\r -> happyReturn (happyIn61 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 $ CVolatQual)}
-	) (\r -> happyReturn (happyIn61 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 $ CRestrQual)}
-	) (\r -> happyReturn (happyIn61 r))
-
-happyReduce_211 = happyMonadReduce 1# 54# happyReduction_211
-happyReduction_211 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
-	( withNodeInfo happy_var_1 $ CInlineQual)}
-	) (\r -> happyReturn (happyIn61 r))
-
-happyReduce_212 = happySpecReduce_2  55# happyReduction_212
-happyReduction_212 happy_x_2
-	happy_x_1
-	 =  case happyOut126 happy_x_1 of { happy_var_1 -> 
-	case happyOut61 happy_x_2 of { happy_var_2 -> 
-	happyIn62
-		 (reverseList (map CAttrQual happy_var_1) `snoc` happy_var_2
-	)}}
-
-happyReduce_213 = happySpecReduce_2  55# happyReduction_213
-happyReduction_213 happy_x_2
-	happy_x_1
-	 =  case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut61 happy_x_2 of { happy_var_2 -> 
-	happyIn62
-		 (happy_var_1 `snoc` happy_var_2
-	)}}
-
-happyReduce_214 = happySpecReduce_3  55# happyReduction_214
-happyReduction_214 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut61 happy_x_3 of { happy_var_3 -> 
-	happyIn62
-		 ((happy_var_1 `rappend` map CAttrQual happy_var_2) `snoc` happy_var_3
-	)}}}
-
-happyReduce_215 = happySpecReduce_1  56# happyReduction_215
-happyReduction_215 happy_x_1
-	 =  case happyOut72 happy_x_1 of { happy_var_1 -> 
-	happyIn63
-		 (happy_var_1
-	)}
-
-happyReduce_216 = happySpecReduce_1  56# happyReduction_216
-happyReduction_216 happy_x_1
-	 =  case happyOut65 happy_x_1 of { happy_var_1 -> 
-	happyIn63
-		 (happy_var_1
-	)}
-
-happyReduce_217 = happySpecReduce_0  57# happyReduction_217
-happyReduction_217  =  happyIn64
-		 (Nothing
-	)
-
-happyReduce_218 = happyReduce 4# 57# happyReduction_218
-happyReduction_218 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut123 happy_x_3 of { happy_var_3 -> 
-	happyIn64
-		 (Just happy_var_3
-	) `HappyStk` happyRest}
-
-happyReduce_219 = happySpecReduce_1  58# happyReduction_219
-happyReduction_219 happy_x_1
-	 =  case happyOut69 happy_x_1 of { happy_var_1 -> 
-	happyIn65
-		 (happy_var_1
-	)}
-
-happyReduce_220 = happySpecReduce_1  58# happyReduction_220
-happyReduction_220 happy_x_1
-	 =  case happyOut66 happy_x_1 of { happy_var_1 -> 
-	happyIn65
-		 (happy_var_1
-	)}
-
-happyReduce_221 = happyMonadReduce 1# 59# happyReduction_221
-happyReduction_221 (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 (happyIn66 r))
-
-happyReduce_222 = happyMonadReduce 2# 59# happyReduction_222
-happyReduction_222 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> 
-	case happyOut85 happy_x_2 of { happy_var_2 -> 
-	( withNodeInfo happy_var_1 $ \at -> happy_var_2 (mkVarDeclr happy_var_1 at))}}
-	) (\r -> happyReturn (happyIn66 r))
-
-happyReduce_223 = happySpecReduce_1  59# happyReduction_223
-happyReduction_223 happy_x_1
-	 =  case happyOut67 happy_x_1 of { happy_var_1 -> 
-	happyIn66
-		 (happy_var_1
-	)}
-
-happyReduce_224 = happySpecReduce_1  60# happyReduction_224
-happyReduction_224 happy_x_1
-	 =  case happyOut68 happy_x_1 of { happy_var_1 -> 
-	happyIn67
-		 (happy_var_1
-	)}
-
-happyReduce_225 = happyMonadReduce 2# 60# happyReduction_225
-happyReduction_225 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut66 happy_x_2 of { happy_var_2 -> 
-	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}
-	) (\r -> happyReturn (happyIn67 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 happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut66 happy_x_3 of { happy_var_3 -> 
-	( withAttribute happy_var_1 happy_var_2 $ ptrDeclr happy_var_3 [])}}}
-	) (\r -> happyReturn (happyIn67 r))
-
-happyReduce_227 = happyMonadReduce 3# 60# happyReduction_227
-happyReduction_227 (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 happyOut62 happy_x_2 of { happy_var_2 -> 
-	case happyOut66 happy_x_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}
-	) (\r -> happyReturn (happyIn67 r))
-
-happyReduce_228 = happyMonadReduce 4# 60# happyReduction_228
-happyReduction_228 (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 happyOut62 happy_x_2 of { happy_var_2 -> 
-	case happyOut127 happy_x_3 of { happy_var_3 -> 
-	case happyOut66 happy_x_4 of { happy_var_4 -> 
-	( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}}
-	) (\r -> happyReturn (happyIn67 r))
-
-happyReduce_229 = happySpecReduce_3  61# happyReduction_229
-happyReduction_229 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut67 happy_x_2 of { happy_var_2 -> 
-	happyIn68
-		 (happy_var_2
-	)}
-
-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 happyOut67 happy_x_2 of { happy_var_2 -> 
-	case happyOut85 happy_x_4 of { happy_var_4 -> 
-	happyIn68
-		 (happy_var_4 happy_var_2
-	) `HappyStk` happyRest}}
-
-happyReduce_231 = happyReduce 4# 61# happyReduction_231
-happyReduction_231 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut67 happy_x_3 of { happy_var_3 -> 
-	happyIn68
-		 (appendDeclrAttrs happy_var_2 happy_var_3
-	) `HappyStk` happyRest}}
-
-happyReduce_232 = happyReduce 5# 61# happyReduction_232
-happyReduction_232 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut67 happy_x_3 of { happy_var_3 -> 
-	case happyOut85 happy_x_5 of { happy_var_5 -> 
-	happyIn68
-		 (appendDeclrAttrs happy_var_2 (happy_var_5 happy_var_3)
-	) `HappyStk` happyRest}}}
-
-happyReduce_233 = happySpecReduce_1  62# happyReduction_233
-happyReduction_233 happy_x_1
-	 =  case happyOut70 happy_x_1 of { happy_var_1 -> 
-	happyIn69
-		 (happy_var_1
-	)}
-
-happyReduce_234 = happyMonadReduce 4# 62# happyReduction_234
-happyReduction_234 (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 happyOut71 happy_x_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 [])}}
-	) (\r -> happyReturn (happyIn69 r))
-
-happyReduce_235 = happyMonadReduce 5# 62# happyReduction_235
-happyReduction_235 (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 happyOut62 happy_x_2 of { happy_var_2 -> 
-	case happyOut71 happy_x_4 of { happy_var_4 -> 
-	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}
-	) (\r -> happyReturn (happyIn69 r))
-
-happyReduce_236 = happyMonadReduce 6# 62# happyReduction_236
-happyReduction_236 (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 happyOut62 happy_x_2 of { happy_var_2 -> 
-	case happyOut127 happy_x_3 of { happy_var_3 -> 
-	case happyOut71 happy_x_5 of { happy_var_5 -> 
-	( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_5 (reverse happy_var_2))}}}}
-	) (\r -> happyReturn (happyIn69 r))
-
-happyReduce_237 = happyMonadReduce 2# 62# happyReduction_237
-happyReduction_237 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut69 happy_x_2 of { happy_var_2 -> 
-	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}
-	) (\r -> happyReturn (happyIn69 r))
-
-happyReduce_238 = happyMonadReduce 3# 62# happyReduction_238
-happyReduction_238 (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 happyOut62 happy_x_2 of { happy_var_2 -> 
-	case happyOut69 happy_x_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}
-	) (\r -> happyReturn (happyIn69 r))
-
-happyReduce_239 = happyMonadReduce 4# 62# happyReduction_239
-happyReduction_239 (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 happyOut62 happy_x_2 of { happy_var_2 -> 
-	case happyOut127 happy_x_3 of { happy_var_3 -> 
-	case happyOut69 happy_x_4 of { happy_var_4 -> 
-	( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}}
-	) (\r -> happyReturn (happyIn69 r))
-
-happyReduce_240 = happySpecReduce_3  63# happyReduction_240
-happyReduction_240 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut69 happy_x_2 of { happy_var_2 -> 
-	happyIn70
-		 (happy_var_2
-	)}
-
-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 happyOut71 happy_x_2 of { happy_var_2 -> 
-	case happyOut85 happy_x_3 of { happy_var_3 -> 
-	happyIn70
-		 (happy_var_3 happy_var_2
-	) `HappyStk` happyRest}}
-
-happyReduce_242 = happyReduce 4# 63# happyReduction_242
-happyReduction_242 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut69 happy_x_2 of { happy_var_2 -> 
-	case happyOut85 happy_x_4 of { happy_var_4 -> 
-	happyIn70
-		 (happy_var_4 happy_var_2
-	) `HappyStk` happyRest}}
-
-happyReduce_243 = happyMonadReduce 1# 64# happyReduction_243
-happyReduction_243 (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 (happyIn71 r))
-
-happyReduce_244 = happySpecReduce_3  64# happyReduction_244
-happyReduction_244 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut71 happy_x_2 of { happy_var_2 -> 
-	happyIn71
-		 (happy_var_2
-	)}
-
-happyReduce_245 = happySpecReduce_1  65# happyReduction_245
-happyReduction_245 happy_x_1
-	 =  case happyOut73 happy_x_1 of { happy_var_1 -> 
-	happyIn72
-		 (happy_var_1
-	)}
-
-happyReduce_246 = happySpecReduce_1  65# happyReduction_246
-happyReduction_246 happy_x_1
-	 =  case happyOut75 happy_x_1 of { happy_var_1 -> 
-	happyIn72
-		 (happy_var_1
-	)}
-
-happyReduce_247 = happySpecReduce_1  66# happyReduction_247
-happyReduction_247 happy_x_1
-	 =  case happyOut74 happy_x_1 of { happy_var_1 -> 
-	happyIn73
-		 (happy_var_1
-	)}
-
-happyReduce_248 = happyMonadReduce 2# 66# happyReduction_248
-happyReduction_248 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut72 happy_x_2 of { happy_var_2 -> 
-	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}
-	) (\r -> happyReturn (happyIn73 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 happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut72 happy_x_3 of { happy_var_3 -> 
-	( withAttribute happy_var_1 happy_var_2 $ ptrDeclr happy_var_3 [])}}}
-	) (\r -> happyReturn (happyIn73 r))
-
-happyReduce_250 = happyMonadReduce 3# 66# happyReduction_250
-happyReduction_250 (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 happyOut62 happy_x_2 of { happy_var_2 -> 
-	case happyOut72 happy_x_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}
-	) (\r -> happyReturn (happyIn73 r))
-
-happyReduce_251 = happyMonadReduce 4# 66# happyReduction_251
-happyReduction_251 (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 happyOut62 happy_x_2 of { happy_var_2 -> 
-	case happyOut127 happy_x_3 of { happy_var_3 -> 
-	case happyOut72 happy_x_4 of { happy_var_4 -> 
-	( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}}
-	) (\r -> happyReturn (happyIn73 r))
-
-happyReduce_252 = happySpecReduce_2  67# happyReduction_252
-happyReduction_252 happy_x_2
-	happy_x_1
-	 =  case happyOut75 happy_x_1 of { happy_var_1 -> 
-	case happyOut85 happy_x_2 of { happy_var_2 -> 
-	happyIn74
-		 (happy_var_2 happy_var_1
-	)}}
-
-happyReduce_253 = happySpecReduce_3  67# happyReduction_253
-happyReduction_253 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut73 happy_x_2 of { happy_var_2 -> 
-	happyIn74
-		 (happy_var_2
-	)}
-
-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 happyOut73 happy_x_2 of { happy_var_2 -> 
-	case happyOut85 happy_x_4 of { happy_var_4 -> 
-	happyIn74
-		 (happy_var_4 happy_var_2
-	) `HappyStk` happyRest}}
-
-happyReduce_255 = happyReduce 4# 67# happyReduction_255
-happyReduction_255 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut73 happy_x_3 of { happy_var_3 -> 
-	happyIn74
-		 (appendDeclrAttrs happy_var_2 happy_var_3
-	) `HappyStk` happyRest}}
-
-happyReduce_256 = happyReduce 5# 67# happyReduction_256
-happyReduction_256 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut73 happy_x_3 of { happy_var_3 -> 
-	case happyOut85 happy_x_5 of { happy_var_5 -> 
-	happyIn74
-		 (appendDeclrAttrs happy_var_2 (happy_var_5 happy_var_3)
-	) `HappyStk` happyRest}}}
-
-happyReduce_257 = happyMonadReduce 1# 68# happyReduction_257
-happyReduction_257 (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 (happyIn75 r))
-
-happyReduce_258 = happySpecReduce_3  68# happyReduction_258
-happyReduction_258 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut75 happy_x_2 of { happy_var_2 -> 
-	happyIn75
-		 (happy_var_2
-	)}
-
-happyReduce_259 = happyReduce 4# 68# happyReduction_259
-happyReduction_259 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut75 happy_x_3 of { happy_var_3 -> 
-	happyIn75
-		 (appendDeclrAttrs happy_var_2 happy_var_3
-	) `HappyStk` happyRest}}
-
-happyReduce_260 = happySpecReduce_1  69# happyReduction_260
-happyReduction_260 happy_x_1
-	 =  case happyOut77 happy_x_1 of { happy_var_1 -> 
-	happyIn76
-		 (reverseDeclr happy_var_1
-	)}
-
-happyReduce_261 = happySpecReduce_1  70# happyReduction_261
-happyReduction_261 happy_x_1
-	 =  case happyOut78 happy_x_1 of { happy_var_1 -> 
-	happyIn77
-		 (happy_var_1
-	)}
-
-happyReduce_262 = happyMonadReduce 2# 70# happyReduction_262
-happyReduction_262 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut77 happy_x_2 of { happy_var_2 -> 
-	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}
-	) (\r -> happyReturn (happyIn77 r))
-
-happyReduce_263 = happyMonadReduce 3# 70# happyReduction_263
-happyReduction_263 (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 happyOut62 happy_x_2 of { happy_var_2 -> 
-	case happyOut77 happy_x_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}
-	) (\r -> happyReturn (happyIn77 r))
-
-happyReduce_264 = happyMonadReduce 4# 71# happyReduction_264
-happyReduction_264 (happy_x_4 `HappyStk`
-	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 happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut82 happy_x_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_2 $ funDeclr happy_var_1 (Left $ reverse happy_var_3) [])}}}
-	) (\r -> happyReturn (happyIn78 r))
-
-happyReduce_265 = happySpecReduce_3  71# happyReduction_265
-happyReduction_265 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut77 happy_x_2 of { happy_var_2 -> 
-	happyIn78
-		 (happy_var_2
-	)}
-
-happyReduce_266 = happyReduce 4# 71# happyReduction_266
-happyReduction_266 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut77 happy_x_2 of { happy_var_2 -> 
-	case happyOut85 happy_x_4 of { happy_var_4 -> 
-	happyIn78
-		 (happy_var_4 happy_var_2
-	) `HappyStk` happyRest}}
-
-happyReduce_267 = happySpecReduce_0  72# happyReduction_267
-happyReduction_267  =  happyIn79
-		 (([], False)
-	)
-
-happyReduce_268 = happySpecReduce_1  72# happyReduction_268
-happyReduction_268 happy_x_1
-	 =  case happyOut80 happy_x_1 of { happy_var_1 -> 
-	happyIn79
-		 ((reverse happy_var_1, False)
-	)}
-
-happyReduce_269 = happySpecReduce_3  72# happyReduction_269
-happyReduction_269 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut80 happy_x_1 of { happy_var_1 -> 
-	happyIn79
-		 ((reverse happy_var_1, True)
-	)}
-
-happyReduce_270 = happySpecReduce_1  73# happyReduction_270
-happyReduction_270 happy_x_1
-	 =  case happyOut81 happy_x_1 of { happy_var_1 -> 
-	happyIn80
-		 (singleton happy_var_1
-	)}
-
-happyReduce_271 = happySpecReduce_3  73# happyReduction_271
-happyReduction_271 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut80 happy_x_1 of { happy_var_1 -> 
-	case happyOut81 happy_x_3 of { happy_var_3 -> 
-	happyIn80
-		 (happy_var_1 `snoc` happy_var_3
-	)}}
-
-happyReduce_272 = happyMonadReduce 1# 74# happyReduction_272
-happyReduction_272 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> 
-	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}
-	) (\r -> happyReturn (happyIn81 r))
-
-happyReduce_273 = happyMonadReduce 2# 74# happyReduction_273
-happyReduction_273 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> 
-	case happyOut84 happy_x_2 of { happy_var_2 -> 
-	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}
-	) (\r -> happyReturn (happyIn81 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 happyOut37 happy_x_1 of { happy_var_1 -> 
-	case happyOut72 happy_x_2 of { happy_var_2 -> 
-	case happyOut126 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 (happyIn81 r))
-
-happyReduce_275 = happyMonadReduce 3# 74# happyReduction_275
-happyReduction_275 (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 happyOut66 happy_x_2 of { happy_var_2 -> 
-	case happyOut126 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 (happyIn81 r))
-
-happyReduce_276 = happyMonadReduce 1# 74# happyReduction_276
-happyReduction_276 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> 
-	( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [])}
-	) (\r -> happyReturn (happyIn81 r))
-
-happyReduce_277 = happyMonadReduce 2# 74# happyReduction_277
-happyReduction_277 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOut84 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 (happyIn81 r))
-
-happyReduce_278 = happyMonadReduce 3# 74# happyReduction_278
-happyReduction_278 (happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> 
-	case happyOut72 happy_x_2 of { happy_var_2 -> 
-	case happyOut126 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 (happyIn81 r))
-
-happyReduce_279 = happyMonadReduce 1# 74# happyReduction_279
-happyReduction_279 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut41 happy_x_1 of { happy_var_1 -> 
-	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}
-	) (\r -> happyReturn (happyIn81 r))
-
-happyReduce_280 = happyMonadReduce 2# 74# happyReduction_280
-happyReduction_280 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOut84 happy_x_2 of { happy_var_2 -> 
-	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}
-	) (\r -> happyReturn (happyIn81 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 happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOut72 happy_x_2 of { happy_var_2 -> 
-	case happyOut126 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 (happyIn81 r))
-
-happyReduce_282 = happyMonadReduce 3# 74# happyReduction_282
-happyReduction_282 (happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOut66 happy_x_2 of { happy_var_2 -> 
-	case happyOut126 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 (happyIn81 r))
-
-happyReduce_283 = happyMonadReduce 1# 74# happyReduction_283
-happyReduction_283 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> 
-	( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [])}
-	) (\r -> happyReturn (happyIn81 r))
-
-happyReduce_284 = happyMonadReduce 2# 74# happyReduction_284
-happyReduction_284 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut128 happy_x_2 of { happy_var_2 -> 
-	( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) [])}}
-	) (\r -> happyReturn (happyIn81 r))
-
-happyReduce_285 = happyMonadReduce 2# 74# happyReduction_285
-happyReduction_285 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut84 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 (happyIn81 r))
-
-happyReduce_286 = happyMonadReduce 3# 74# happyReduction_286
-happyReduction_286 (happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut72 happy_x_2 of { happy_var_2 -> 
-	case happyOut126 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 (happyIn81 r))
-
-happyReduce_287 = happySpecReduce_1  75# happyReduction_287
-happyReduction_287 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (CTokIdent  _ happy_var_1) -> 
-	happyIn82
-		 (singleton happy_var_1
-	)}
-
-happyReduce_288 = happySpecReduce_3  75# happyReduction_288
-happyReduction_288 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut82 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_3 of { (CTokIdent  _ happy_var_3) -> 
-	happyIn82
-		 (happy_var_1 `snoc` happy_var_3
-	)}}
-
-happyReduce_289 = happyMonadReduce 1# 76# happyReduction_289
-happyReduction_289 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut41 happy_x_1 of { happy_var_1 -> 
-	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}
-	) (\r -> happyReturn (happyIn83 r))
-
-happyReduce_290 = happyMonadReduce 2# 76# happyReduction_290
-happyReduction_290 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut41 happy_x_1 of { happy_var_1 -> 
-	case happyOut84 happy_x_2 of { happy_var_2 -> 
-	( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}
-	) (\r -> happyReturn (happyIn83 r))
-
-happyReduce_291 = happyMonadReduce 2# 76# happyReduction_291
-happyReduction_291 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut128 happy_x_2 of { happy_var_2 -> 
-	( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) [])}}
-	) (\r -> happyReturn (happyIn83 r))
-
-happyReduce_292 = happyMonadReduce 2# 76# happyReduction_292
-happyReduction_292 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut62 happy_x_1 of { happy_var_1 -> 
-	case happyOut84 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 (happyIn83 r))
-
-happyReduce_293 = happySpecReduce_1  77# happyReduction_293
-happyReduction_293 happy_x_1
-	 =  case happyOut88 happy_x_1 of { happy_var_1 -> 
-	happyIn84
-		 (happy_var_1
-	)}
-
-happyReduce_294 = happySpecReduce_1  77# happyReduction_294
-happyReduction_294 happy_x_1
-	 =  case happyOut89 happy_x_1 of { happy_var_1 -> 
-	happyIn84
-		 (happy_var_1
-	)}
-
-happyReduce_295 = happySpecReduce_1  77# happyReduction_295
-happyReduction_295 happy_x_1
-	 =  case happyOut85 happy_x_1 of { happy_var_1 -> 
-	happyIn84
-		 (happy_var_1 emptyDeclr
-	)}
-
-happyReduce_296 = happySpecReduce_1  78# happyReduction_296
-happyReduction_296 happy_x_1
-	 =  case happyOut86 happy_x_1 of { happy_var_1 -> 
-	happyIn85
-		 (happy_var_1
-	)}
-
-happyReduce_297 = happyMonadReduce 3# 78# happyReduction_297
-happyReduction_297 (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 happyOut79 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 (happyIn85 r))
-
-happyReduce_298 = happySpecReduce_1  79# happyReduction_298
-happyReduction_298 happy_x_1
-	 =  case happyOut87 happy_x_1 of { happy_var_1 -> 
-	happyIn86
-		 (happy_var_1
-	)}
-
-happyReduce_299 = happySpecReduce_2  79# happyReduction_299
-happyReduction_299 happy_x_2
-	happy_x_1
-	 =  case happyOut86 happy_x_1 of { happy_var_1 -> 
-	case happyOut87 happy_x_2 of { happy_var_2 -> 
-	happyIn86
-		 (\decl -> happy_var_2 (happy_var_1 decl)
-	)}}
-
-happyReduce_300 = happyMonadReduce 3# 80# happyReduction_300
-happyReduction_300 (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 $ \at declr -> arrDeclr declr [] False False happy_var_2 at)}}
-	) (\r -> happyReturn (happyIn87 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 happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut120 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 (happyIn87 r))
-
-happyReduce_302 = happyMonadReduce 4# 80# happyReduction_302
-happyReduction_302 (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 happyOut62 happy_x_2 of { happy_var_2 -> 
-	case happyOut120 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 (happyIn87 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 happyOut62 happy_x_2 of { happy_var_2 -> 
-	case happyOut127 happy_x_3 of { happy_var_3 -> 
-	case happyOut120 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 (happyIn87 r))
-
-happyReduce_304 = happyMonadReduce 5# 80# happyReduction_304
-happyReduction_304 (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_3 of { happy_var_3 -> 
-	case happyOut115 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 (happyIn87 r))
-
-happyReduce_305 = happyMonadReduce 6# 80# happyReduction_305
-happyReduction_305 (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 happyOut62 happy_x_3 of { happy_var_3 -> 
-	case happyOut126 happy_x_4 of { happy_var_4 -> 
-	case happyOut115 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 (happyIn87 r))
-
-happyReduce_306 = happyMonadReduce 7# 80# happyReduction_306
-happyReduction_306 (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 happyOut62 happy_x_2 of { happy_var_2 -> 
-	case happyOut126 happy_x_3 of { happy_var_3 -> 
-	case happyOut126 happy_x_5 of { happy_var_5 -> 
-	case happyOut115 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 (happyIn87 r))
-
-happyReduce_307 = happyMonadReduce 4# 80# happyReduction_307
-happyReduction_307 (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_3 of { happy_var_3 -> 
-	( withAttributePF happy_var_1 happy_var_3 $ \at declr -> arrDeclr declr [] True False Nothing at)}}
-	) (\r -> happyReturn (happyIn87 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 happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut126 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 (happyIn87 r))
-
-happyReduce_309 = happyMonadReduce 5# 80# happyReduction_309
-happyReduction_309 (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 happyOut62 happy_x_2 of { happy_var_2 -> 
-	case happyOut126 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 (happyIn87 r))
-
-happyReduce_310 = happyMonadReduce 6# 80# happyReduction_310
-happyReduction_310 (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 happyOut62 happy_x_2 of { happy_var_2 -> 
-	case happyOut127 happy_x_3 of { happy_var_3 -> 
-	case happyOut126 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 (happyIn87 r))
-
-happyReduce_311 = happyMonadReduce 1# 81# happyReduction_311
-happyReduction_311 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
-	( withNodeInfo happy_var_1 $ ptrDeclr emptyDeclr [])}
-	) (\r -> happyReturn (happyIn88 r))
-
-happyReduce_312 = happyMonadReduce 3# 81# happyReduction_312
-happyReduction_312 (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 happyOut62 happy_x_2 of { happy_var_2 -> 
-	case happyOut126 happy_x_3 of { happy_var_3 -> 
-	( withAttribute happy_var_1 happy_var_3 $ ptrDeclr emptyDeclr (reverse happy_var_2))}}}
-	) (\r -> happyReturn (happyIn88 r))
-
-happyReduce_313 = happyMonadReduce 2# 81# happyReduction_313
-happyReduction_313 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut84 happy_x_2 of { happy_var_2 -> 
-	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}
-	) (\r -> happyReturn (happyIn88 r))
-
-happyReduce_314 = happyMonadReduce 3# 81# happyReduction_314
-happyReduction_314 (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 happyOut62 happy_x_2 of { happy_var_2 -> 
-	case happyOut84 happy_x_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}
-	) (\r -> happyReturn (happyIn88 r))
-
-happyReduce_315 = happyMonadReduce 2# 81# happyReduction_315
-happyReduction_315 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut127 happy_x_2 of { happy_var_2 -> 
-	( withAttribute happy_var_1 happy_var_2 $ ptrDeclr emptyDeclr [])}}
-	) (\r -> happyReturn (happyIn88 r))
-
-happyReduce_316 = happyMonadReduce 3# 81# happyReduction_316
-happyReduction_316 (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 happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut84 happy_x_3 of { happy_var_3 -> 
-	( withAttribute happy_var_1 happy_var_2 $ ptrDeclr happy_var_3 [])}}}
-	) (\r -> happyReturn (happyIn88 r))
-
-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 -> 
-	happyIn89
-		 (happy_var_2
-	)}
-
-happyReduce_318 = happySpecReduce_3  82# happyReduction_318
-happyReduction_318 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut89 happy_x_2 of { happy_var_2 -> 
-	happyIn89
-		 (happy_var_2
-	)}
-
-happyReduce_319 = happySpecReduce_3  82# happyReduction_319
-happyReduction_319 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut85 happy_x_2 of { happy_var_2 -> 
-	happyIn89
-		 (happy_var_2 emptyDeclr
-	)}
-
-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 happyOut88 happy_x_2 of { happy_var_2 -> 
-	case happyOut85 happy_x_4 of { happy_var_4 -> 
-	happyIn89
-		 (happy_var_4 happy_var_2
-	) `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 happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut88 happy_x_3 of { happy_var_3 -> 
-	happyIn89
-		 (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 happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut89 happy_x_3 of { happy_var_3 -> 
-	happyIn89
-		 (appendDeclrAttrs happy_var_2 happy_var_3
-	) `HappyStk` happyRest}}
-
-happyReduce_323 = happyReduce 4# 82# happyReduction_323
-happyReduction_323 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut85 happy_x_3 of { happy_var_3 -> 
-	happyIn89
-		 (appendDeclrAttrs happy_var_2 (happy_var_3 emptyDeclr)
-	) `HappyStk` happyRest}}
-
-happyReduce_324 = happyReduce 5# 82# happyReduction_324
-happyReduction_324 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut127 happy_x_2 of { happy_var_2 -> 
-	case happyOut88 happy_x_3 of { happy_var_3 -> 
-	case happyOut85 happy_x_5 of { happy_var_5 -> 
-	happyIn89
-		 (appendDeclrAttrs happy_var_2 (happy_var_5 happy_var_3)
-	) `HappyStk` happyRest}}}
-
-happyReduce_325 = happySpecReduce_2  82# happyReduction_325
-happyReduction_325 happy_x_2
-	happy_x_1
-	 =  case happyOut89 happy_x_1 of { happy_var_1 -> 
-	case happyOut128 happy_x_2 of { happy_var_2 -> 
-	happyIn89
-		 (appendDeclrAttrs happy_var_2 happy_var_1
-	)}}
-
-happyReduce_326 = happyMonadReduce 1# 83# happyReduction_326
-happyReduction_326 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut115 happy_x_1 of { happy_var_1 -> 
-	( withNodeInfo happy_var_1 $ CInitExpr happy_var_1)}
-	) (\r -> happyReturn (happyIn90 r))
-
-happyReduce_327 = happyMonadReduce 3# 83# happyReduction_327
-happyReduction_327 (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 happyOut92 happy_x_2 of { happy_var_2 -> 
-	( withNodeInfo happy_var_1 $ CInitList (reverse happy_var_2))}}
-	) (\r -> happyReturn (happyIn90 r))
-
-happyReduce_328 = happyMonadReduce 4# 83# happyReduction_328
-happyReduction_328 (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 happyOut92 happy_x_2 of { happy_var_2 -> 
-	( withNodeInfo happy_var_1 $ CInitList (reverse happy_var_2))}}
-	) (\r -> happyReturn (happyIn90 r))
-
-happyReduce_329 = happySpecReduce_0  84# happyReduction_329
-happyReduction_329  =  happyIn91
-		 (Nothing
-	)
-
-happyReduce_330 = happySpecReduce_2  84# happyReduction_330
-happyReduction_330 happy_x_2
-	happy_x_1
-	 =  case happyOut90 happy_x_2 of { happy_var_2 -> 
-	happyIn91
-		 (Just happy_var_2
-	)}
-
-happyReduce_331 = happySpecReduce_0  85# happyReduction_331
-happyReduction_331  =  happyIn92
-		 (empty
-	)
-
-happyReduce_332 = happySpecReduce_1  85# happyReduction_332
-happyReduction_332 happy_x_1
-	 =  case happyOut90 happy_x_1 of { happy_var_1 -> 
-	happyIn92
-		 (singleton ([],happy_var_1)
-	)}
-
-happyReduce_333 = happySpecReduce_2  85# happyReduction_333
-happyReduction_333 happy_x_2
-	happy_x_1
-	 =  case happyOut93 happy_x_1 of { happy_var_1 -> 
-	case happyOut90 happy_x_2 of { happy_var_2 -> 
-	happyIn92
-		 (singleton (happy_var_1,happy_var_2)
-	)}}
-
-happyReduce_334 = happySpecReduce_3  85# happyReduction_334
-happyReduction_334 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut92 happy_x_1 of { happy_var_1 -> 
-	case happyOut90 happy_x_3 of { happy_var_3 -> 
-	happyIn92
-		 (happy_var_1 `snoc` ([],happy_var_3)
-	)}}
-
-happyReduce_335 = happyReduce 4# 85# happyReduction_335
-happyReduction_335 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest)
-	 = case happyOut92 happy_x_1 of { happy_var_1 -> 
-	case happyOut93 happy_x_3 of { happy_var_3 -> 
-	case happyOut90 happy_x_4 of { happy_var_4 -> 
-	happyIn92
-		 (happy_var_1 `snoc` (happy_var_3,happy_var_4)
-	) `HappyStk` happyRest}}}
-
-happyReduce_336 = happySpecReduce_2  86# happyReduction_336
-happyReduction_336 happy_x_2
-	happy_x_1
-	 =  case happyOut94 happy_x_1 of { happy_var_1 -> 
-	happyIn93
-		 (reverse happy_var_1
-	)}
-
-happyReduce_337 = happyMonadReduce 2# 86# happyReduction_337
-happyReduction_337 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut125 happy_x_1 of { happy_var_1 -> 
-	( withNodeInfo happy_var_1 $ \at -> [CMemberDesig happy_var_1 at])}
-	) (\r -> happyReturn (happyIn93 r))
-
-happyReduce_338 = happySpecReduce_1  86# happyReduction_338
-happyReduction_338 happy_x_1
-	 =  case happyOut96 happy_x_1 of { happy_var_1 -> 
-	happyIn93
-		 ([happy_var_1]
-	)}
-
-happyReduce_339 = happySpecReduce_1  87# happyReduction_339
-happyReduction_339 happy_x_1
-	 =  case happyOut95 happy_x_1 of { happy_var_1 -> 
-	happyIn94
-		 (singleton happy_var_1
-	)}
-
-happyReduce_340 = happySpecReduce_2  87# happyReduction_340
-happyReduction_340 happy_x_2
-	happy_x_1
-	 =  case happyOut94 happy_x_1 of { happy_var_1 -> 
-	case happyOut95 happy_x_2 of { happy_var_2 -> 
-	happyIn94
-		 (happy_var_1 `snoc` happy_var_2
-	)}}
-
-happyReduce_341 = happyMonadReduce 3# 88# happyReduction_341
-happyReduction_341 (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 happyOut121 happy_x_2 of { happy_var_2 -> 
-	( withNodeInfo happy_var_1 $ CArrDesig happy_var_2)}}
-	) (\r -> happyReturn (happyIn95 r))
-
-happyReduce_342 = happyMonadReduce 2# 88# happyReduction_342
-happyReduction_342 (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 -> 
-	( withNodeInfo happy_var_1 $ CMemberDesig happy_var_2)}}
-	) (\r -> happyReturn (happyIn95 r))
-
-happyReduce_343 = happySpecReduce_1  88# happyReduction_343
-happyReduction_343 happy_x_1
-	 =  case happyOut96 happy_x_1 of { happy_var_1 -> 
-	happyIn95
-		 (happy_var_1
-	)}
-
-happyReduce_344 = happyMonadReduce 5# 89# happyReduction_344
-happyReduction_344 (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 happyOut121 happy_x_2 of { happy_var_2 -> 
-	case happyOut121 happy_x_4 of { happy_var_4 -> 
-	( withNodeInfo happy_var_1 $ CRangeDesig happy_var_2 happy_var_4)}}}
-	) (\r -> happyReturn (happyIn96 r))
-
-happyReduce_345 = happyMonadReduce 1# 90# happyReduction_345
-happyReduction_345 (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 (happyIn97 r))
-
-happyReduce_346 = happySpecReduce_1  90# happyReduction_346
-happyReduction_346 happy_x_1
-	 =  case happyOut122 happy_x_1 of { happy_var_1 -> 
-	happyIn97
-		 (CConst happy_var_1
-	)}
-
-happyReduce_347 = happySpecReduce_1  90# happyReduction_347
-happyReduction_347 happy_x_1
-	 =  case happyOut123 happy_x_1 of { happy_var_1 -> 
-	happyIn97
-		 (CConst (liftStrLit happy_var_1)
-	)}
-
-happyReduce_348 = happySpecReduce_3  90# happyReduction_348
-happyReduction_348 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut117 happy_x_2 of { happy_var_2 -> 
-	happyIn97
-		 (happy_var_2
-	)}
-
-happyReduce_349 = happyMonadReduce 3# 90# happyReduction_349
-happyReduction_349 (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 happyOut14 happy_x_2 of { happy_var_2 -> 
-	( withNodeInfo happy_var_1 $ CStatExpr happy_var_2)}}
-	) (\r -> happyReturn (happyIn97 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 happyOut115 happy_x_3 of { happy_var_3 -> 
-	case happyOut83 happy_x_5 of { happy_var_5 -> 
-	( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinVaArg happy_var_3 happy_var_5)}}}
-	) (\r -> happyReturn (happyIn97 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 happyOut83 happy_x_3 of { happy_var_3 -> 
-	case happyOut98 happy_x_5 of { happy_var_5 -> 
-	( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinOffsetOf happy_var_3 (reverse happy_var_5))}}}
-	) (\r -> happyReturn (happyIn97 r))
-
-happyReduce_352 = happyMonadReduce 6# 90# happyReduction_352
-happyReduction_352 (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 happyOut83 happy_x_3 of { happy_var_3 -> 
-	case happyOut83 happy_x_5 of { happy_var_5 -> 
-	( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinTypesCompatible happy_var_3 happy_var_5)}}}
-	) (\r -> happyReturn (happyIn97 r))
-
-happyReduce_353 = happyMonadReduce 1# 91# happyReduction_353
-happyReduction_353 (happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut125 happy_x_1 of { happy_var_1 -> 
-	( withNodeInfo happy_var_1 $ singleton . CMemberDesig happy_var_1)}
-	) (\r -> happyReturn (happyIn98 r))
-
-happyReduce_354 = happyMonadReduce 3# 91# happyReduction_354
-happyReduction_354 (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 happyOut125 happy_x_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_3 $ (happy_var_1 `snoc`) . CMemberDesig happy_var_3)}}
-	) (\r -> happyReturn (happyIn98 r))
-
-happyReduce_355 = happyMonadReduce 4# 91# happyReduction_355
-happyReduction_355 (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 happyOut117 happy_x_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_3 $ (happy_var_1 `snoc`) . CArrDesig happy_var_3)}}
-	) (\r -> happyReturn (happyIn98 r))
-
-happyReduce_356 = happySpecReduce_1  92# happyReduction_356
-happyReduction_356 happy_x_1
-	 =  case happyOut97 happy_x_1 of { happy_var_1 -> 
-	happyIn99
-		 (happy_var_1
-	)}
-
-happyReduce_357 = happyMonadReduce 4# 92# happyReduction_357
-happyReduction_357 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut99 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut117 happy_x_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_2 $ CIndex happy_var_1 happy_var_3)}}}
-	) (\r -> happyReturn (happyIn99 r))
-
-happyReduce_358 = happyMonadReduce 3# 92# happyReduction_358
-happyReduction_358 (happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut99 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 (happyIn99 r))
-
-happyReduce_359 = happyMonadReduce 4# 92# happyReduction_359
-happyReduction_359 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut99 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut100 happy_x_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_2 $ CCall happy_var_1 (reverse happy_var_3))}}}
-	) (\r -> happyReturn (happyIn99 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 happyOut99 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 -> 
-	( withNodeInfo happy_var_2 $ CMember happy_var_1 happy_var_3 False)}}}
-	) (\r -> happyReturn (happyIn99 r))
-
-happyReduce_361 = happyMonadReduce 3# 92# happyReduction_361
-happyReduction_361 (happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut99 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 -> 
-	( withNodeInfo happy_var_2 $ CMember happy_var_1 happy_var_3 True)}}}
-	) (\r -> happyReturn (happyIn99 r))
-
-happyReduce_362 = happyMonadReduce 2# 92# happyReduction_362
-happyReduction_362 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut99 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 (happyIn99 r))
-
-happyReduce_363 = happyMonadReduce 2# 92# happyReduction_363
-happyReduction_363 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut99 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 (happyIn99 r))
-
-happyReduce_364 = happyMonadReduce 6# 92# happyReduction_364
-happyReduction_364 (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 happyOut83 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_4 of { happy_var_4 -> 
-	case happyOut92 happy_x_5 of { happy_var_5 -> 
-	( withNodeInfo happy_var_4 $ CCompoundLit happy_var_2 (reverse happy_var_5))}}}
-	) (\r -> happyReturn (happyIn99 r))
-
-happyReduce_365 = happyMonadReduce 7# 92# happyReduction_365
-happyReduction_365 (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 happyOut83 happy_x_2 of { happy_var_2 -> 
-	case happyOutTok happy_x_4 of { happy_var_4 -> 
-	case happyOut92 happy_x_5 of { happy_var_5 -> 
-	( withNodeInfo happy_var_4 $ CCompoundLit happy_var_2 (reverse happy_var_5))}}}
-	) (\r -> happyReturn (happyIn99 r))
-
-happyReduce_366 = happySpecReduce_1  93# happyReduction_366
-happyReduction_366 happy_x_1
-	 =  case happyOut115 happy_x_1 of { happy_var_1 -> 
-	happyIn100
-		 (singleton happy_var_1
-	)}
-
-happyReduce_367 = happySpecReduce_3  93# happyReduction_367
-happyReduction_367 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut100 happy_x_1 of { happy_var_1 -> 
-	case happyOut115 happy_x_3 of { happy_var_3 -> 
-	happyIn100
-		 (happy_var_1 `snoc` happy_var_3
-	)}}
-
-happyReduce_368 = happySpecReduce_1  94# happyReduction_368
-happyReduction_368 happy_x_1
-	 =  case happyOut99 happy_x_1 of { happy_var_1 -> 
-	happyIn101
-		 (happy_var_1
-	)}
-
-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 happyOut101 happy_x_2 of { happy_var_2 -> 
-	( withNodeInfo happy_var_1 $ CUnary CPreIncOp happy_var_2)}}
-	) (\r -> happyReturn (happyIn101 r))
-
-happyReduce_370 = happyMonadReduce 2# 94# happyReduction_370
-happyReduction_370 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut101 happy_x_2 of { happy_var_2 -> 
-	( withNodeInfo happy_var_1 $ CUnary CPreDecOp happy_var_2)}}
-	) (\r -> happyReturn (happyIn101 r))
-
-happyReduce_371 = happySpecReduce_2  94# happyReduction_371
-happyReduction_371 happy_x_2
-	happy_x_1
-	 =  case happyOut103 happy_x_2 of { happy_var_2 -> 
-	happyIn101
-		 (happy_var_2
-	)}
-
-happyReduce_372 = happyMonadReduce 2# 94# happyReduction_372
-happyReduction_372 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut102 happy_x_1 of { happy_var_1 -> 
-	case happyOut103 happy_x_2 of { happy_var_2 -> 
-	( withNodeInfo happy_var_1 $ CUnary (unL happy_var_1) happy_var_2)}}
-	) (\r -> happyReturn (happyIn101 r))
-
-happyReduce_373 = happyMonadReduce 2# 94# happyReduction_373
-happyReduction_373 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut101 happy_x_2 of { happy_var_2 -> 
-	( withNodeInfo happy_var_1 $ CSizeofExpr happy_var_2)}}
-	) (\r -> happyReturn (happyIn101 r))
-
-happyReduce_374 = happyMonadReduce 4# 94# happyReduction_374
-happyReduction_374 (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 happyOut83 happy_x_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_1 $ CSizeofType happy_var_3)}}
-	) (\r -> happyReturn (happyIn101 r))
-
-happyReduce_375 = happyMonadReduce 2# 94# happyReduction_375
-happyReduction_375 (happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> 
-	case happyOut101 happy_x_2 of { happy_var_2 -> 
-	( withNodeInfo happy_var_1 $ CAlignofExpr happy_var_2)}}
-	) (\r -> happyReturn (happyIn101 r))
-
-happyReduce_376 = happyMonadReduce 4# 94# happyReduction_376
-happyReduction_376 (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 happyOut83 happy_x_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_1 $ CAlignofType happy_var_3)}}
-	) (\r -> happyReturn (happyIn101 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 happyOut101 happy_x_2 of { happy_var_2 -> 
-	( withNodeInfo happy_var_1 $ CComplexReal happy_var_2)}}
-	) (\r -> happyReturn (happyIn101 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 happyOut101 happy_x_2 of { happy_var_2 -> 
-	( withNodeInfo happy_var_1 $ CComplexImag happy_var_2)}}
-	) (\r -> happyReturn (happyIn101 r))
-
-happyReduce_379 = happyMonadReduce 2# 94# happyReduction_379
-happyReduction_379 (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 -> 
-	( withNodeInfo happy_var_1 $ CLabAddrExpr happy_var_2)}}
-	) (\r -> happyReturn (happyIn101 r))
-
-happyReduce_380 = happySpecReduce_1  95# happyReduction_380
-happyReduction_380 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn102
-		 (L CAdrOp  (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 -> 
-	happyIn102
-		 (L CIndOp  (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 -> 
-	happyIn102
-		 (L CPlusOp (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 -> 
-	happyIn102
-		 (L CMinOp  (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 -> 
-	happyIn102
-		 (L CCompOp (posOf happy_var_1)
-	)}
-
-happyReduce_385 = happySpecReduce_1  95# happyReduction_385
-happyReduction_385 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn102
-		 (L CNegOp  (posOf happy_var_1)
-	)}
-
-happyReduce_386 = happySpecReduce_1  96# happyReduction_386
-happyReduction_386 happy_x_1
-	 =  case happyOut101 happy_x_1 of { happy_var_1 -> 
-	happyIn103
-		 (happy_var_1
-	)}
-
-happyReduce_387 = happyMonadReduce 4# 96# happyReduction_387
-happyReduction_387 (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 happyOut83 happy_x_2 of { happy_var_2 -> 
-	case happyOut103 happy_x_4 of { happy_var_4 -> 
-	( withNodeInfo happy_var_1 $ CCast happy_var_2 happy_var_4)}}}
-	) (\r -> happyReturn (happyIn103 r))
-
-happyReduce_388 = happySpecReduce_1  97# happyReduction_388
-happyReduction_388 happy_x_1
-	 =  case happyOut103 happy_x_1 of { happy_var_1 -> 
-	happyIn104
-		 (happy_var_1
-	)}
-
-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 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 CMulOp happy_var_1 happy_var_3)}}}
-	) (\r -> happyReturn (happyIn104 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 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 CDivOp happy_var_1 happy_var_3)}}}
-	) (\r -> happyReturn (happyIn104 r))
-
-happyReduce_391 = happyMonadReduce 3# 97# happyReduction_391
-happyReduction_391 (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 CRmdOp happy_var_1 happy_var_3)}}}
-	) (\r -> happyReturn (happyIn104 r))
-
-happyReduce_392 = happySpecReduce_1  98# happyReduction_392
-happyReduction_392 happy_x_1
-	 =  case happyOut104 happy_x_1 of { happy_var_1 -> 
-	happyIn105
-		 (happy_var_1
-	)}
-
-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 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 CAddOp happy_var_1 happy_var_3)}}}
-	) (\r -> happyReturn (happyIn105 r))
-
-happyReduce_394 = happyMonadReduce 3# 98# happyReduction_394
-happyReduction_394 (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 CSubOp happy_var_1 happy_var_3)}}}
-	) (\r -> happyReturn (happyIn105 r))
-
-happyReduce_395 = happySpecReduce_1  99# happyReduction_395
-happyReduction_395 happy_x_1
-	 =  case happyOut105 happy_x_1 of { happy_var_1 -> 
-	happyIn106
-		 (happy_var_1
-	)}
-
-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 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 CShlOp happy_var_1 happy_var_3)}}}
-	) (\r -> happyReturn (happyIn106 r))
-
-happyReduce_397 = happyMonadReduce 3# 99# happyReduction_397
-happyReduction_397 (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 CShrOp happy_var_1 happy_var_3)}}}
-	) (\r -> happyReturn (happyIn106 r))
-
-happyReduce_398 = happySpecReduce_1  100# happyReduction_398
-happyReduction_398 happy_x_1
-	 =  case happyOut106 happy_x_1 of { happy_var_1 -> 
-	happyIn107
-		 (happy_var_1
-	)}
-
-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 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 CLeOp happy_var_1 happy_var_3)}}}
-	) (\r -> happyReturn (happyIn107 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 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 CGrOp happy_var_1 happy_var_3)}}}
-	) (\r -> happyReturn (happyIn107 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 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 CLeqOp happy_var_1 happy_var_3)}}}
-	) (\r -> happyReturn (happyIn107 r))
-
-happyReduce_402 = happyMonadReduce 3# 100# happyReduction_402
-happyReduction_402 (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 CGeqOp happy_var_1 happy_var_3)}}}
-	) (\r -> happyReturn (happyIn107 r))
-
-happyReduce_403 = happySpecReduce_1  101# happyReduction_403
-happyReduction_403 happy_x_1
-	 =  case happyOut107 happy_x_1 of { happy_var_1 -> 
-	happyIn108
-		 (happy_var_1
-	)}
-
-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 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 CEqOp  happy_var_1 happy_var_3)}}}
-	) (\r -> happyReturn (happyIn108 r))
-
-happyReduce_405 = happyMonadReduce 3# 101# happyReduction_405
-happyReduction_405 (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 CNeqOp happy_var_1 happy_var_3)}}}
-	) (\r -> happyReturn (happyIn108 r))
-
-happyReduce_406 = happySpecReduce_1  102# happyReduction_406
-happyReduction_406 happy_x_1
-	 =  case happyOut108 happy_x_1 of { happy_var_1 -> 
-	happyIn109
-		 (happy_var_1
-	)}
-
-happyReduce_407 = happyMonadReduce 3# 102# happyReduction_407
-happyReduction_407 (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 CAndOp happy_var_1 happy_var_3)}}}
-	) (\r -> happyReturn (happyIn109 r))
-
-happyReduce_408 = happySpecReduce_1  103# happyReduction_408
-happyReduction_408 happy_x_1
-	 =  case happyOut109 happy_x_1 of { happy_var_1 -> 
-	happyIn110
-		 (happy_var_1
-	)}
-
-happyReduce_409 = happyMonadReduce 3# 103# happyReduction_409
-happyReduction_409 (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 CXorOp happy_var_1 happy_var_3)}}}
-	) (\r -> happyReturn (happyIn110 r))
-
-happyReduce_410 = happySpecReduce_1  104# happyReduction_410
-happyReduction_410 happy_x_1
-	 =  case happyOut110 happy_x_1 of { happy_var_1 -> 
-	happyIn111
-		 (happy_var_1
-	)}
-
-happyReduce_411 = happyMonadReduce 3# 104# happyReduction_411
-happyReduction_411 (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 COrOp happy_var_1 happy_var_3)}}}
-	) (\r -> happyReturn (happyIn111 r))
-
-happyReduce_412 = happySpecReduce_1  105# happyReduction_412
-happyReduction_412 happy_x_1
-	 =  case happyOut111 happy_x_1 of { happy_var_1 -> 
-	happyIn112
-		 (happy_var_1
-	)}
-
-happyReduce_413 = happyMonadReduce 3# 105# happyReduction_413
-happyReduction_413 (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 CLndOp happy_var_1 happy_var_3)}}}
-	) (\r -> happyReturn (happyIn112 r))
-
-happyReduce_414 = happySpecReduce_1  106# happyReduction_414
-happyReduction_414 happy_x_1
-	 =  case happyOut112 happy_x_1 of { happy_var_1 -> 
-	happyIn113
-		 (happy_var_1
-	)}
-
-happyReduce_415 = happyMonadReduce 3# 106# happyReduction_415
-happyReduction_415 (happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut113 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut112 happy_x_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_2 $ CBinary CLorOp happy_var_1 happy_var_3)}}}
-	) (\r -> happyReturn (happyIn113 r))
-
-happyReduce_416 = happySpecReduce_1  107# happyReduction_416
-happyReduction_416 happy_x_1
-	 =  case happyOut113 happy_x_1 of { happy_var_1 -> 
-	happyIn114
-		 (happy_var_1
-	)}
-
-happyReduce_417 = happyMonadReduce 5# 107# happyReduction_417
-happyReduction_417 (happy_x_5 `HappyStk`
-	happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut113 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut117 happy_x_3 of { happy_var_3 -> 
-	case happyOut114 happy_x_5 of { happy_var_5 -> 
-	( withNodeInfo happy_var_2 $ CCond happy_var_1 (Just happy_var_3) happy_var_5)}}}}
-	) (\r -> happyReturn (happyIn114 r))
-
-happyReduce_418 = happyMonadReduce 4# 107# happyReduction_418
-happyReduction_418 (happy_x_4 `HappyStk`
-	happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut113 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	case happyOut114 happy_x_4 of { happy_var_4 -> 
-	( withNodeInfo happy_var_2 $ CCond happy_var_1 Nothing happy_var_4)}}}
-	) (\r -> happyReturn (happyIn114 r))
-
-happyReduce_419 = happySpecReduce_1  108# happyReduction_419
-happyReduction_419 happy_x_1
-	 =  case happyOut114 happy_x_1 of { happy_var_1 -> 
-	happyIn115
-		 (happy_var_1
-	)}
-
-happyReduce_420 = happyMonadReduce 3# 108# happyReduction_420
-happyReduction_420 (happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut101 happy_x_1 of { happy_var_1 -> 
-	case happyOut116 happy_x_2 of { happy_var_2 -> 
-	case happyOut115 happy_x_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_2 $ CAssign (unL happy_var_2) happy_var_1 happy_var_3)}}}
-	) (\r -> happyReturn (happyIn115 r))
-
-happyReduce_421 = happySpecReduce_1  109# happyReduction_421
-happyReduction_421 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn116
-		 (L CAssignOp (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 -> 
-	happyIn116
-		 (L CMulAssOp (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 -> 
-	happyIn116
-		 (L CDivAssOp (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 -> 
-	happyIn116
-		 (L CRmdAssOp (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 -> 
-	happyIn116
-		 (L CAddAssOp (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 -> 
-	happyIn116
-		 (L CSubAssOp (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 -> 
-	happyIn116
-		 (L CShlAssOp (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 -> 
-	happyIn116
-		 (L CShrAssOp (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 -> 
-	happyIn116
-		 (L CAndAssOp (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 -> 
-	happyIn116
-		 (L CXorAssOp (posOf happy_var_1)
-	)}
-
-happyReduce_431 = happySpecReduce_1  109# happyReduction_431
-happyReduction_431 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn116
-		 (L COrAssOp  (posOf happy_var_1)
-	)}
-
-happyReduce_432 = happySpecReduce_1  110# happyReduction_432
-happyReduction_432 happy_x_1
-	 =  case happyOut115 happy_x_1 of { happy_var_1 -> 
-	happyIn117
-		 (happy_var_1
-	)}
-
-happyReduce_433 = happyMonadReduce 3# 110# happyReduction_433
-happyReduction_433 (happy_x_3 `HappyStk`
-	happy_x_2 `HappyStk`
-	happy_x_1 `HappyStk`
-	happyRest) tk
-	 = happyThen (case happyOut115 happy_x_1 of { happy_var_1 -> 
-	case happyOut118 happy_x_3 of { happy_var_3 -> 
-	( let es = reverse happy_var_3 in withNodeInfo es $ CComma (happy_var_1:es))}}
-	) (\r -> happyReturn (happyIn117 r))
-
-happyReduce_434 = happySpecReduce_1  111# happyReduction_434
-happyReduction_434 happy_x_1
-	 =  case happyOut115 happy_x_1 of { happy_var_1 -> 
-	happyIn118
-		 (singleton happy_var_1
-	)}
-
-happyReduce_435 = happySpecReduce_3  111# happyReduction_435
-happyReduction_435 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut118 happy_x_1 of { happy_var_1 -> 
-	case happyOut115 happy_x_3 of { happy_var_3 -> 
-	happyIn118
-		 (happy_var_1 `snoc` happy_var_3
-	)}}
-
-happyReduce_436 = happySpecReduce_0  112# happyReduction_436
-happyReduction_436  =  happyIn119
-		 (Nothing
-	)
-
-happyReduce_437 = happySpecReduce_1  112# happyReduction_437
-happyReduction_437 happy_x_1
-	 =  case happyOut117 happy_x_1 of { happy_var_1 -> 
-	happyIn119
-		 (Just happy_var_1
-	)}
-
-happyReduce_438 = happySpecReduce_0  113# happyReduction_438
-happyReduction_438  =  happyIn120
-		 (Nothing
-	)
-
-happyReduce_439 = happySpecReduce_1  113# happyReduction_439
-happyReduction_439 happy_x_1
-	 =  case happyOut115 happy_x_1 of { happy_var_1 -> 
-	happyIn120
-		 (Just happy_var_1
-	)}
-
-happyReduce_440 = happySpecReduce_1  114# happyReduction_440
-happyReduction_440 happy_x_1
-	 =  case happyOut114 happy_x_1 of { happy_var_1 -> 
-	happyIn121
-		 (happy_var_1
-	)}
-
-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 CTokILit _ i -> CIntConst i)}
-	) (\r -> happyReturn (happyIn122 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 CTokCLit _ c -> CCharConst c)}
-	) (\r -> happyReturn (happyIn122 r))
-
-happyReduce_443 = happyMonadReduce 1# 115# 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 CTokFLit _ f -> CFloatConst f)}
-	) (\r -> happyReturn (happyIn122 r))
-
-happyReduce_444 = happyMonadReduce 1# 116# happyReduction_444
-happyReduction_444 (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 (happyIn123 r))
-
-happyReduce_445 = happyMonadReduce 2# 116# happyReduction_445
-happyReduction_445 (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 $ case happy_var_1 of CTokSLit _ s -> CStrLit (concatCStrings (s : reverse happy_var_2)))}}
-	) (\r -> happyReturn (happyIn123 r))
-
-happyReduce_446 = happySpecReduce_1  117# happyReduction_446
-happyReduction_446 happy_x_1
-	 =  case happyOutTok happy_x_1 of { happy_var_1 -> 
-	happyIn124
-		 (case happy_var_1 of CTokSLit _ s -> singleton s
-	)}
-
-happyReduce_447 = happySpecReduce_2  117# happyReduction_447
-happyReduction_447 happy_x_2
-	happy_x_1
-	 =  case happyOut124 happy_x_1 of { happy_var_1 -> 
-	case happyOutTok happy_x_2 of { happy_var_2 -> 
-	happyIn124
-		 (case happy_var_2 of CTokSLit _ s -> happy_var_1 `snoc` s
-	)}}
-
-happyReduce_448 = happySpecReduce_1  118# happyReduction_448
-happyReduction_448 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (CTokIdent  _ happy_var_1) -> 
-	happyIn125
-		 (happy_var_1
-	)}
-
-happyReduce_449 = happySpecReduce_1  118# happyReduction_449
-happyReduction_449 happy_x_1
-	 =  case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> 
-	happyIn125
-		 (happy_var_1
-	)}
-
-happyReduce_450 = happySpecReduce_0  119# happyReduction_450
-happyReduction_450  =  happyIn126
-		 ([]
-	)
-
-happyReduce_451 = happySpecReduce_1  119# happyReduction_451
-happyReduction_451 happy_x_1
-	 =  case happyOut127 happy_x_1 of { happy_var_1 -> 
-	happyIn126
-		 (happy_var_1
-	)}
-
-happyReduce_452 = happySpecReduce_1  120# happyReduction_452
-happyReduction_452 happy_x_1
-	 =  case happyOut128 happy_x_1 of { happy_var_1 -> 
-	happyIn127
-		 (happy_var_1
-	)}
-
-happyReduce_453 = happySpecReduce_2  120# happyReduction_453
-happyReduction_453 happy_x_2
-	happy_x_1
-	 =  case happyOut127 happy_x_1 of { happy_var_1 -> 
-	case happyOut128 happy_x_2 of { happy_var_2 -> 
-	happyIn127
-		 (happy_var_1 ++ happy_var_2
-	)}}
-
-happyReduce_454 = happyReduce 6# 121# happyReduction_454
-happyReduction_454 (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 happyOut129 happy_x_4 of { happy_var_4 -> 
-	happyIn128
-		 (reverse happy_var_4
-	) `HappyStk` happyRest}
-
-happyReduce_455 = happySpecReduce_1  122# happyReduction_455
-happyReduction_455 happy_x_1
-	 =  case happyOut130 happy_x_1 of { happy_var_1 -> 
-	happyIn129
-		 (case happy_var_1 of Nothing -> empty; Just attr -> singleton attr
-	)}
-
-happyReduce_456 = happySpecReduce_3  122# happyReduction_456
-happyReduction_456 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut129 happy_x_1 of { happy_var_1 -> 
-	case happyOut130 happy_x_3 of { happy_var_3 -> 
-	happyIn129
-		 ((maybe id (flip snoc) happy_var_3) happy_var_1
-	)}}
-
-happyReduce_457 = happySpecReduce_0  123# happyReduction_457
-happyReduction_457  =  happyIn130
-		 (Nothing
-	)
-
-happyReduce_458 = happyMonadReduce 1# 123# happyReduction_458
-happyReduction_458 (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 (happyIn130 r))
-
-happyReduce_459 = happyMonadReduce 1# 123# happyReduction_459
-happyReduction_459 (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 (happyIn130 r))
-
-happyReduce_460 = happyMonadReduce 4# 123# happyReduction_460
-happyReduction_460 (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 happyOut131 happy_x_3 of { happy_var_3 -> 
-	( withNodeInfo happy_var_1 $ Just . CAttr happy_var_1 (reverse happy_var_3))}}
-	) (\r -> happyReturn (happyIn130 r))
-
-happyReduce_461 = happyMonadReduce 3# 123# happyReduction_461
-happyReduction_461 (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 (happyIn130 r))
-
-happyReduce_462 = happySpecReduce_1  124# happyReduction_462
-happyReduction_462 happy_x_1
-	 =  case happyOut121 happy_x_1 of { happy_var_1 -> 
-	happyIn131
-		 (singleton happy_var_1
-	)}
-
-happyReduce_463 = happySpecReduce_3  124# happyReduction_463
-happyReduction_463 happy_x_3
-	happy_x_2
-	happy_x_1
-	 =  case happyOut131 happy_x_1 of { happy_var_1 -> 
-	case happyOut121 happy_x_3 of { happy_var_3 -> 
-	happyIn131
-		 (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
-
-translation_unit = happySomeParser where
-  happySomeParser = happyThen (happyParse 0#) (\x -> happyReturn (happyOut7 x))
-
-external_declaration = happySomeParser where
-  happySomeParser = happyThen (happyParse 1#) (\x -> happyReturn (happyOut9 x))
-
-statement = happySomeParser where
-  happySomeParser = happyThen (happyParse 2#) (\x -> happyReturn (happyOut12 x))
-
-expression = happySomeParser where
-  happySomeParser = happyThen (happyParse 3#) (\x -> happyReturn (happyOut117 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 =
-  fmap fst $ execParser translUnitP input initialPosition builtinTypeNames (namesStartingFrom 0)
-
--- | @translUnitP@ provides a parser for a complete C translation unit, i.e. a list of external declarations.
-translUnitP :: P CTranslUnit
-translUnitP = translation_unit
--- | @extDeclP@ provides a parser for an external (file-scope) declaration
-extDeclP :: P CExtDecl
-extDeclP = external_declaration
--- | @statementP@ provides a parser for C statements
-statementP :: P CStat
-statementP = statement
--- | @expressionP@ provides a parser for C expressions
-expressionP :: P CExpr
-expressionP = expression
-{-# LINE 1 "templates/GenericTemplate.hs" #-}
-{-# LINE 1 "templates/GenericTemplate.hs" #-}
-{-# LINE 1 "<built-in>" #-}
-{-# LINE 1 "<command line>" #-}
-{-# LINE 1 "templates/GenericTemplate.hs" #-}
--- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp 
-
-{-# LINE 28 "templates/GenericTemplate.hs" #-}
-
-
-data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList
-
-
-
-
-
-{-# LINE 49 "templates/GenericTemplate.hs" #-}
-
-{-# LINE 59 "templates/GenericTemplate.hs" #-}
-
-{-# LINE 68 "templates/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 Happy_GHC_Exts.<# (0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}
-
-				     (happyReduceArr Happy_Data_Array.! rule) i tk st
-				     where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))
-		n		  -> {- nothing -}
-
-
-				     happyShift new_state i tk st
-				     where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))
-   where off    = indexShortOffAddr happyActOffsets st
-	 off_i  = (off Happy_GHC_Exts.+# i)
-	 check  = if (off_i Happy_GHC_Exts.>=# (0# :: Happy_GHC_Exts.Int#))
-			then (indexShortOffAddr happyCheck off_i Happy_GHC_Exts.==#  i)
-			else False
- 	 action | check     = indexShortOffAddr happyTable off_i
-		| otherwise = indexShortOffAddr happyDefActions st
-
-{-# LINE 127 "templates/GenericTemplate.hs" #-}
-
-
-indexShortOffAddr (HappyA# arr) off =
-#if __GLASGOW_HASKELL__ > 500
-	Happy_GHC_Exts.narrow16Int# i
-#elif __GLASGOW_HASKELL__ == 500
-	Happy_GHC_Exts.intToInt16# i
-#else
-	Happy_GHC_Exts.iShiftRA# (Happy_GHC_Exts.iShiftL# i 16#) 16#
-#endif
-  where
-#if __GLASGOW_HASKELL__ >= 503
-	i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)
-#else
-	i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.shiftL# high 8#) low)
-#endif
-	high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))
-	low  = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))
-	off' = off Happy_GHC_Exts.*# 2#
-
-
-
-
-
-data HappyAddr = HappyA# Happy_GHC_Exts.Addr#
-
-
-
-
------------------------------------------------------------------------------
--- HappyState data type (not arrays)
-
-{-# LINE 170 "templates/GenericTemplate.hs" #-}
-
------------------------------------------------------------------------------
--- Shifting a token
-
-happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =
-     let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.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 Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.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 Happy_GHC_Exts.+# nt)
-             new_state = indexShortOffAddr happyTable off_i
-
-
-
-
-happyDrop 0# l = l
-happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t
-
-happyDropStk 0# l = l
-happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.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 Happy_GHC_Exts.+# 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 ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)
-
--- Internal happy errors:
-
-notHappyAtAll = error "Internal Happy error\n"
-
------------------------------------------------------------------------------
--- Hack to get the typechecker to accept our action functions
-
-
-happyTcHack :: Happy_GHC_Exts.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
--- a/language-c.cabal
+++ b/language-c.cabal
@@ -1,97 +1,125 @@
-Name:           language-c
-Version:        0.3.2.1
-Cabal-Version:  >= 1.2.3
-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/
-Bug-reports:    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
+cabal-version:   2.2
+name:            language-c
+version:         0.10.2
+license:         BSD-3-Clause
+license-file:    LICENSE
+copyright:       LICENSE
+maintainer:      language.c@monoid.al
+author:          AUTHORS
+tested-with:
+    ghc ==9.14.1 ghc ==9.12.2 ghc ==9.10.3 ghc ==9.8.4 ghc ==9.6.7
+    ghc ==9.4.8 ghc ==9.2.8 ghc ==9.0.2 ghc ==8.10.7 ghc ==8.8.4
+    ghc ==8.6.5 ghc ==8.4.4 ghc ==8.2.2 ghc ==8.0.2
 
-Extra-Source-Files: AUTHORS AUTHORS.c2hs ChangeLog README
-                    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
-Flag separateSYB
-  description: Data.Generics available in separate package.
+homepage:        https://visq.github.io/language-c/
+bug-reports:     https://github.com/visq/language-c/issues/
+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 C11 and clang/GNU extensions.
 
-Library
-    Extensions: CPP, DeriveDataTypeable, PatternGuards, BangPatterns, ExistentialQuantification, GeneralizedNewtypeDeriving, ScopedTypeVariables
-    Build-Depends:  filepath
+category:        Language
+build-type:      Simple
+extra-doc-files:
+    ChangeLog.md
+    README.md
+    AUTHORS
+    AUTHORS.c2hs
 
-    if flag(splitBase)
-        Build-Depends: base >= 3 && < 5, process, directory, array, containers, pretty
+source-repository head
+    type:     git
+    location: https://github.com/visq/language-c.git
 
-        If flag(separateSYB)
-          Build-Depends:
-            base >=4 && <5,
-            syb
-        Else
-          Build-Depends:
-            base <4
-    else
-        Build-Depends: base < 3
+flag usebytestrings
+    description: Use ByteString as InputStream datatype
+    manual:      True
 
-    if flag(useByteStrings)
-        Build-Depends: bytestring >= 0.9.0
+flag iecfpextension
+    description:
+        Support IEC 60559 floating point extension (defines _Float128)
+
+    manual:      True
+
+library
+    exposed-modules:
+        Language.C
+        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
+        Language.C.Syntax
+        Language.C.Syntax.AST
+        Language.C.Syntax.Constants
+        Language.C.Syntax.Ops
+        Language.C.Syntax.Utils
+        Language.C.Parser
+        Language.C.Pretty
+        Language.C.System.Preprocess
+        Language.C.System.GCC
+        Language.C.Analysis
+        Language.C.Analysis.ConstEval
+        Language.C.Analysis.Builtins
+        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
+        Language.C.Analysis.TypeCheck
+        Language.C.Analysis.TypeConversions
+        Language.C.Analysis.TypeUtils
+        Language.C.Analysis.NameSpaceMap
+        Language.C.Analysis.MachineDescs
+        Language.C.Analysis.Export
+
+    build-tool-depends: happy:happy, alex:alex
+    hs-source-dirs:     src
+    other-modules:
+        Language.C.Data.RList
+        Language.C.Parser.Builtin
+        Language.C.Parser.Lexer
+        Language.C.Parser.ParserMonad
+        Language.C.Parser.Tokens
+        Language.C.Parser.Parser
+
+    default-language:   Haskell2010
+    default-extensions:
+        CPP DeriveDataTypeable DeriveGeneric PatternGuards BangPatterns
+        ExistentialQuantification GeneralizedNewtypeDeriving
+        ScopedTypeVariables
+
+    ghc-options:        -Wall -Wno-redundant-constraints
+    build-depends:
+        base >=4.9 && <5,
+        array <0.6,
+        containers >=0.3 && <0.9,
+        deepseq >=1.4.0.0 && <1.6,
+        directory <1.4,
+        filepath <1.6,
+        mtl <2.4,
+        pretty <1.2,
+        process <1.7
+
+    if flag(usebytestrings)
+        build-depends: bytestring >=0.9.0 && <0.13
+
     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
+    if flag(iecfpextension)
+        cpp-options: -DIEC_60559_TYPES_EXT
 
+test-suite language-c-harness
+    type:             exitcode-stdio-1.0
+    main-is:          test/harness/run-harness.hs
+    default-language: Haskell2010
+    build-depends:
+        base <5,
+        directory,
+        process,
+        filepath
diff --git a/src/Language/C.hs b/src/Language/C.hs
--- a/src/Language/C.hs
+++ b/src/Language/C.hs
@@ -29,11 +29,11 @@
 import Language.C.Parser
 import Language.C.System.Preprocess
 
--- | preprocess (if neccessary) and parse a C source file
+-- | preprocess (if necessary) 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 :: (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 }
diff --git a/src/Language/C/Analysis.hs b/src/Language/C/Analysis.hs
--- a/src/Language/C/Analysis.hs
+++ b/src/Language/C/Analysis.hs
@@ -61,7 +61,6 @@
 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
diff --git a/src/Language/C/Analysis/AstAnalysis.hs b/src/Language/C/Analysis/AstAnalysis.hs
--- a/src/Language/C/Analysis/AstAnalysis.hs
+++ b/src/Language/C/Analysis/AstAnalysis.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE ScopedTypeVariables, PatternGuards #-}
+{-# OPTIONS_GHC -Wwarn=incomplete-patterns #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Language.C.Parser.Translation
@@ -13,28 +14,44 @@
 -- Traverses the AST, analyses declarations and invokes handlers.
 -----------------------------------------------------------------------------
 module Language.C.Analysis.AstAnalysis (
+    -- * Top-level analysis
     analyseAST,
-    analyseExt,analyseFunDef,analyseExtDecls,
+    analyseExt,analyseFunDef,analyseDecl,
+    -- * Building blocks for additional analyses
+    analyseFunctionBody,
+    defineParams,
+    -- * Type checking
+    tExpr, ExprSide(..),
+    tStmt, StmtCtx(..),
+    tDesignator,
+    defaultMD
 )
 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.ConstEval
+import Language.C.Analysis.DefTable (globalDefs, defineLabel, inFileScope,
+                                     lookupLabel, insertType, lookupType)
 import Language.C.Analysis.DeclAnalysis
+import Language.C.Analysis.TypeUtils
+import Language.C.Analysis.TypeCheck
 
 import Language.C.Data
-import Language.C.Syntax
+import Language.C.Pretty
+import Language.C.Syntax.AST
+import Language.C.Syntax.Constants
+import Language.C.Syntax.Ops
+import Language.C.Syntax.Utils
+import Text.PrettyPrint.HughesPJ
 
-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
 
+import Prelude hiding (mapM, mapM_, reverse)
+import Control.Monad hiding (mapM, mapM_)
+import qualified Data.Map as Map
+import Data.Maybe
+import Data.Traversable (mapM)
+import Data.Foldable (mapM_)
 
 -- * analysis
 
@@ -45,54 +62,72 @@
 -- 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).
+-- It is the users responsibility to check whether any hard errors occurred (@runTrav@ does this for you).
 analyseAST :: (MonadTrav m) => CTranslUnit -> m GlobalDecls
 analyseAST (CTranslUnit decls _file_node) = do
+    -- analyse all declarations, but recover from errors
     mapRecoverM_ analyseExt decls
+    -- check we are in global scope afterwards
+    getDefTable >>= \dt -> unless (inFileScope dt) $
+        error "Internal Error: Not in filescope after analysis"
+    -- get the global definition table (XXX: remove ?)
     liftM globalDefs getDefTable
     where
     mapRecoverM_ f = mapM_ (handleTravError . f)
 
 -- | Analyse an top-level declaration
 analyseExt :: (MonadTrav m) => CExtDecl -> m ()
-analyseExt (CAsmExt asm)
+analyseExt (CAsmExt asm _)
     = handleAsmBlock asm
 analyseExt (CFDefExt fundef)
     = analyseFunDef fundef
-analyseExt (CDeclExt decls)
-    = analyseExtDecls decls
+analyseExt (CDeclExt decl)
+    = analyseDecl False decl
 
 -- | 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
+    var_decl_info <- analyseVarDecl' True declspecs declr oldstyle_decls Nothing
+    let (VarDeclInfo name fun_spec storage_spec attrs ty _declr_node) = var_decl_info
+    when (isNoName name) $ astError node_info "NoName in analyseFunDef"
     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
+    -- compute storage
+    fun_storage <- computeFunDefStorage ident storage_spec
+    let var_decl = VarDecl name (DeclAttrs fun_spec fun_storage attrs) ty'
+    -- callback for declaration
+    handleVarDecl False (Decl var_decl node_info)
+    -- process body
+    stmt' <- analyseFunctionBody node_info var_decl stmt
+    -- callback for definition
     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
+    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)
+voidM :: Monad m => m a -> m ()
+voidM m = m >> return ()
+
+-- | Analyse a declaration other than a function definition
+--
+--   Note: static assertions are not analysed
+analyseDecl :: (MonadTrav m) => Bool -> CDecl -> m ()
+analyseDecl _is_local (CStaticAssert _expr _strlit _annot) = return () -- TODO
+analyseDecl is_local decl@(CDecl declspecs declrs node)
     | null declrs =
         case typedef_spec of Just _  -> astError node "bad typedef declaration: missing declarator"
-                             Nothing -> analyseTypeDecl decl >> return ()
+                             Nothing -> voidM$ analyseTypeDecl decl
     | (Just declspecs') <- typedef_spec = mapM_ (uncurry (analyseTyDef declspecs')) declr_list
-    | otherwise   = mapM_ (uncurry analyseVarDeclr) declr_list
+    | otherwise   = do let (storage_specs, attrs, typequals, typespecs, funspecs, _alignspecs) =
+                             partitionDeclSpecs declspecs
+                       canonTySpecs <- canonicalTypeSpec typespecs
+                       -- TODO: alignspecs not yet processed
+                       let specs =
+                             (storage_specs, attrs, typequals, canonTySpecs, funspecs)
+                       mapM_ (uncurry (analyseVarDeclr specs)) declr_list
     where
     declr_list = zip (True : repeat False) declrs
     typedef_spec = hasTypeDef declspecs
@@ -102,52 +137,39 @@
             (Just tydeclr, Nothing , Nothing) -> analyseTypeDef handle_sue_def declspecs' tydeclr node
             _ -> astError node "bad typdef declaration: bitfieldsize or initializer present"
 
-    analyseVarDeclr handle_sue_def (Just declr, init_opt, Nothing) = do
+    analyseVarDeclr specs handle_sue_def (Just declr, init_opt, Nothing) = do
         -- analyse the declarator
-        vardeclInfo@(VarDeclInfo _ _ _ _ typ _) <- analyseVarDecl handle_sue_def declspecs declr []
+        let (storage_specs, attrs, typequals, canonTySpecs, inline) = specs
+        vardeclInfo@(VarDeclInfo _ _ _ _ typ _) <-
+          analyseVarDecl handle_sue_def storage_specs attrs typequals canonTySpecs inline
+                         declr [] Nothing
         -- declare / define the object
-        init_opt' <- mapMaybeM init_opt tInit
-        when (isTypeOfExpr typ) $ astError node "we cannot analyse typeof(expr) yet"
-        if (isFunctionType typ)
+        if isFunctionType typ
             then extFunProto vardeclInfo
-            else extVarDecl vardeclInfo init_opt'
-    analyseVarDeclr _ (Nothing,_,_)         = astError node "abstract declarator in object declaration"
-    analyseVarDeclr _ (_,_,Just bitfieldSz) = astError node "bitfield size in object declaration"
-
-    isTypeOfExpr (TypeOfExpr _) = True
-    isTypeOfExpr _ = False
+            else (if is_local then localVarDecl else extVarDecl)
+                 -- XXX: if Initializer becomes different from CInit, this
+                 -- will have to change.
+                 vardeclInfo init_opt
+        _init_opt' <- mapMaybeM init_opt (tInit typ)
+        return ()
+    analyseVarDeclr _ _ (Nothing,_,_)         = astError node "abstract declarator in object declaration"
+    analyseVarDeclr _ _ (_,_,Just _bitfieldSz) = astError node "bitfield size in object declaration"
 
 -- | Analyse a typedef
 analyseTypeDef :: (MonadTrav m) => Bool -> [CDeclSpec] -> CDeclr -> NodeInfo -> m ()
 analyseTypeDef handle_sue_def declspecs declr node_info = do
     -- analyse the declarator
-    (VarDeclInfo name is_inline storage_spec attrs ty declr_node) <- analyseVarDecl handle_sue_def declspecs declr []
-    checkValidTypeDef is_inline storage_spec attrs
+    (VarDeclInfo name fun_attrs storage_spec attrs ty _node) <- analyseVarDecl' handle_sue_def declspecs declr [] Nothing
+    checkValidTypeDef fun_attrs storage_spec attrs
+    when (isNoName name) $ astError node_info "NoName in analyseTypeDef"
     let ident = identOfVarName name
     handleTypeDef (TypeDef ident ty attrs node_info)
     where
-    checkValidTypeDef True _ _ = astError node_info "inline specifier for typeDef"
+    checkValidTypeDef fun_attrs  _ _ | fun_attrs /= noFunctionAttrs =
+                                         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`,
@@ -156,23 +178,34 @@
 -- 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 _ (StaticSpec _)  = 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
+    ClKernelSpec  -> 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
 
+-- (private) Get parameters of a function type
+getParams :: Type -> Maybe [ParamDecl]
+getParams (FunctionType (FunType _ params _) _) = Just params
+getParams _ = Nothing
+
 -- | 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)
+extFunProto (VarDeclInfo var_name fun_spec storage_spec attrs ty node_info) =
+    do  when (isNoName var_name) $ astError node_info "NoName in extFunProto"
+        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)
+        let decl = VarDecl var_name (DeclAttrs fun_spec (funDeclLinkage old_fun) attrs) ty
+        handleVarDecl False (Decl decl node_info)
+        -- XXX: structs should be handled in 'function prototype scope' too
+        enterPrototypeScope
+        maybe (return ()) (mapM_ handleParamDecl) (getParams ty)
+        leavePrototypeScope
     where
     funDeclLinkage old_fun =
         case storage_spec of
@@ -184,57 +217,558 @@
             _ -> 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 ()
+        | 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
+-- see [http://www.sivity.net/projects/language.c/wiki/ExternalDefinitions]
+extVarDecl :: (MonadTrav m) => VarDeclInfo -> Maybe Initializer -> m ()
+extVarDecl (VarDeclInfo var_name fun_spec storage_spec attrs typ node_info) init_opt =
+    do when (isNoName var_name) $ astError node_info "NoName in extVarDecl"
+       (storage,is_def) <- globalStorage storage_spec
+       let vardecl = VarDecl var_name (DeclAttrs fun_spec storage attrs) typ
+       if is_def
+           then handleObjectDef False ident $ ObjDef vardecl init_opt node_info
+           else handleVarDecl False $ Decl vardecl node_info
     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 ()
+       ident = identOfVarName var_name
+       globalStorage _ | fun_spec /= noFunctionAttrs =
+                           astError node_info "invalid function specifier for external variable"
+       globalStorage AutoSpec      = astError node_info "file-scope declaration specifies storage `auto'"
+       globalStorage RegSpec       =
+         do when (isJust init_opt) $ astError node_info "initializer given for global register variable"
+            case var_name of
+              NoName -> astError node_info "global register variable has no name"
+              VarName _ Nothing -> astError node_info "no register specified for global register variable"
+              _ -> return ()
+            dt <- getDefTable
+            when (hasFunDef dt) $ astError node_info "global register variable appears after a function definition"
+            return (Static InternalLinkage False, False)
+       -- tentative if there is no initializer, external
+       globalStorage NoStorageSpec = return (Static ExternalLinkage False, True)
+       globalStorage ThreadSpec    = return (Static ExternalLinkage True, True)
+       -- tentative if there is no initializer, internal
+       globalStorage (StaticSpec thread_local) = return (Static InternalLinkage thread_local, True)
+       globalStorage (ExternSpec thread_local) =
+           case init_opt of
+               -- declaration with either external or old storage
+               Nothing -> do old_decl <- lookupObject ident
+                             return (maybe (Static ExternalLinkage thread_local) declStorage old_decl,False)
+               -- warning, external definition
+               Just _  -> do warn $ badSpecifierError node_info "Both initializer and `extern` specifier given - treating as definition"
+                             return (Static ExternalLinkage thread_local, True)
+       hasFunDef dt = any (isFuncDef . snd) (Map.toList $ gObjs $ globalDefs dt)
+       isFuncDef (FunctionDef fd) = not $ (isInline . functionAttrs) fd
+       isFuncDef _ = False
 
--- | /TODO/: Bogus
-analyseFunctionBody :: (MonadTrav m) => VarDecl -> CStat -> m Stmt
-analyseFunctionBody _ = return
+-- | handle a function-scope object declaration \/ definition
+-- see [http://www.sivity.net/projects/language.c/wiki/LocalDefinitions]
+localVarDecl :: (MonadTrav m) => VarDeclInfo -> Maybe Initializer -> m ()
+localVarDecl (VarDeclInfo var_name fun_attrs storage_spec attrs typ node_info) init_opt =
+    do when (isNoName var_name) $ astError node_info "NoName in localVarDecl"
+       (storage,is_def) <- localStorage storage_spec
+       let vardecl = VarDecl var_name (DeclAttrs fun_attrs storage attrs) typ
+       if is_def
+           then handleObjectDef True ident (ObjDef vardecl init_opt node_info)
+           else handleVarDecl True (Decl vardecl node_info)
+    where
+    ident = identOfVarName var_name
+    localStorage NoStorageSpec = return (Auto False,True)
+    localStorage ThreadSpec    = return (Auto True,True)
+    localStorage RegSpec = return (Auto True,True)
+    -- static no linkage
+    localStorage (StaticSpec thread_local) =
+      return (Static NoLinkage thread_local,True)
+    localStorage (ExternSpec thread_local)
+      | isJust init_opt = astError node_info "extern keyword and initializer for local"
+      | otherwise =
+          do old_decl <- lookupObject ident
+             return (maybe (Static ExternalLinkage thread_local) declStorage old_decl,False)
+    localStorage _ = astError node_info "bad storage specifier for local"
 
--- | /TODO/: Bogus
-tStmt :: (MonadTrav m) => CStat -> m Stmt
-tStmt = return
+defineParams :: MonadTrav m => NodeInfo -> VarDecl -> m ()
+defineParams ni decl =
+  case getParams (declType decl) of
+    Nothing -> astError ni
+               "expecting complete function type in function definition"
+    Just params -> mapM_ handleParamDecl params
 
--- | /TODO/: Bogus
-tExpr :: (MonadTrav m) => CExpr -> m Expr
-tExpr = return
+analyseFunctionBody :: (MonadTrav m) => NodeInfo -> VarDecl -> CStat -> m Stmt
+analyseFunctionBody node_info decl s@(CCompound localLabels items _) =
+  do enterFunctionScope
+     mapM_ (withDefTable . defineLabel) (localLabels ++ getLabels s)
+     defineParams node_info decl
+     -- record parameters
+     mapM_ (tBlockItem [FunCtx decl]) items
+     leaveFunctionScope
+     return s -- XXX: bogus
 
--- | /TODO/: Bogus
-tInit :: (MonadTrav m) => CInit -> m Initializer
-tInit = return
+analyseFunctionBody _ _ s = astError (nodeInfo s) "Function body is no compound statement"
 
+data StmtCtx = FunCtx VarDecl
+             | LoopCtx
+             | SwitchCtx
 
+-- | Given a context, determine the type declaration for the enclosing
+--   function, if possible, given a context.
+enclosingFunctionType :: [StmtCtx] -> Maybe Type
+enclosingFunctionType [] = Nothing
+enclosingFunctionType (FunCtx vd : _) = Just $ declType vd
+enclosingFunctionType (_ : cs) = enclosingFunctionType cs
+
+inLoop :: [StmtCtx] -> Bool
+inLoop c = any isLoop c
+  where isLoop LoopCtx = True
+        isLoop _ = False
+
+inSwitch :: [StmtCtx] -> Bool
+inSwitch c = any isSwitch c
+  where isSwitch SwitchCtx = True
+        isSwitch _ = False
+
+data ExprSide = LValue | RValue
+                deriving (Eq, Show)
+
+-- | Typecheck a statement, given a statement context. The type of a
+--   statement is usually @void@, but expression statements and blocks
+--   can sometimes have other types.
+tStmt :: MonadTrav m => [StmtCtx] -> CStat -> m Type
+tStmt c (CLabel _ s _ _)         = tStmt c s
+tStmt c (CExpr e _)              =
+  maybe (return voidType) (tExpr c RValue) e
+tStmt c (CCompound ls body _)    =
+  do enterBlockScope
+     mapM_ (withDefTable . defineLabel) ls
+     t <- foldM (const $ tBlockItem c) voidType body
+     leaveBlockScope
+     return t
+tStmt c (CIf e sthen selse _)    =
+  checkGuard c e >> tStmt c sthen
+                 >> maybe (return ()) (voidM . tStmt c) selse
+                 >> return voidType
+tStmt c (CSwitch e s ni)         =
+  tExpr c RValue e >>= checkIntegral' ni >>
+  tStmt (SwitchCtx : c) s
+tStmt c (CWhile e s _ _)         =
+  checkGuard c e >> tStmt (LoopCtx : c) s
+tStmt _ (CGoto l ni)             =
+  do dt <- getDefTable
+     case lookupLabel l dt of
+       Just _ -> return voidType
+       Nothing -> typeError ni $ "undefined label in goto: " ++ identToString l
+tStmt c (CCont ni)               =
+  do unless (inLoop c) $ astError ni "continue statement outside of loop"
+     return voidType
+tStmt c (CBreak ni)              =
+  do unless (inLoop c || inSwitch c) $
+            astError ni "break statement outside of loop or switch statement"
+     return voidType
+tStmt c (CReturn (Just e) ni)    =
+  do t <- tExpr c RValue e
+     rt <- case enclosingFunctionType c of
+             Just (FunctionType (FunType rt _ _) _) -> return rt
+             Just (FunctionType (FunTypeIncomplete rt) _) -> return rt
+             Just ft -> astError ni $ "bad function type: " ++ pType ft
+             Nothing -> astError ni "return statement outside function"
+     case (rt, t) of
+       -- apparently it's ok to return void from a void function?
+       (DirectType TyVoid _ _, DirectType TyVoid _ _) -> return ()
+       _ -> assignCompatible' ni CAssignOp rt t
+     return voidType
+tStmt _ (CReturn Nothing _)      = return voidType
+-- XXX: anything to do for assembly?
+tStmt _ (CAsm _ _)               = return voidType
+tStmt c (CCase e s ni)           =
+  do unless (inSwitch c) $
+            astError ni "case statement outside of switch statement"
+     tExpr c RValue e >>= checkIntegral' ni
+     tStmt c s
+tStmt c (CCases e1 e2 s ni)      =
+  do unless (inSwitch c) $
+            astError ni "case statement outside of switch statement"
+     tExpr c RValue e1 >>= checkIntegral' ni
+     tExpr c RValue e2 >>= checkIntegral' ni
+     tStmt c s
+tStmt c (CDefault s ni)          =
+  do unless (inSwitch c) $
+            astError ni "default statement outside of switch statement"
+     tStmt c s
+tStmt c (CFor i g inc s _)       =
+  do enterBlockScope
+     either (maybe (return ()) checkExpr) (analyseDecl True) i
+     maybe (return ()) (checkGuard c) g
+     maybe (return ()) checkExpr inc
+     _ <- tStmt (LoopCtx : c) s
+     leaveBlockScope
+     return voidType
+  where checkExpr e = voidM$ tExpr c RValue e
+tStmt c (CGotoPtr e ni)          =
+  do t <- tExpr c RValue e
+     case t of
+       (PtrType _ _ _) -> return voidType
+       _               -> typeError ni "can't goto non-pointer"
+
+-- | Typecheck a block item. When statement expressions are blocks,
+--   they have the type of their last expression statement, so this
+--   needs to return a type.
+tBlockItem :: MonadTrav m => [StmtCtx] -> CBlockItem -> m Type
+tBlockItem c (CBlockStmt s) = tStmt c s
+tBlockItem _ (CBlockDecl d) = analyseDecl True d >> return voidType
+-- TODO: fixup analyseFunDef to handle nested functions
+tBlockItem _ (CNestedFunDef fd) = analyseFunDef fd >> return voidType
+
+checkGuard :: MonadTrav m => [StmtCtx] -> CExpr -> m ()
+checkGuard c e = tExpr c RValue e >>= checkScalar' (nodeInfo e)
+
+-- XXX: this is bogus, correct only for IA32. We should eventually
+-- have a collection of these and allow people to choose one.
+defaultMD :: MachineDesc
+defaultMD =
+  MachineDesc
+  { iSize = \it ->
+            case it of
+              TyBool    -> 1
+              TyChar    -> 1
+              TySChar   -> 1
+              TyUChar   -> 1
+              TyShort   -> 2
+              TyUShort  -> 2
+              TyInt     -> 4
+              TyUInt    -> 4
+              TyLong    -> 4
+              TyULong   -> 4
+              TyLLong   -> 8
+              TyULLong  -> 8
+              TyInt128  -> 16
+              TyUInt128 -> 16
+  , fSize = \ft ->
+            case ft of
+              TyFloat   -> 4
+              TyDouble  -> 8
+              TyLDouble -> 16
+  , builtinSize = \bt ->
+                  case bt of
+                    TyVaList -> 4
+                    TyAny    -> 4
+  , ptrSize = 4
+  , voidSize = 1
+  , iAlign = \it ->
+             case it of
+               TyBool    -> 1
+               TyChar    -> 1
+               TySChar   -> 1
+               TyUChar   -> 1
+               TyShort   -> 2
+               TyUShort  -> 2
+               TyInt     -> 4
+               TyUInt    -> 4
+               TyLong    -> 4
+               TyULong   -> 4
+               TyLLong   -> 8
+               TyULLong  -> 8
+               TyInt128  -> 16
+               TyUInt128 -> 16
+  , fAlign = \ft ->
+             case ft of
+               TyFloat   -> 4
+               TyDouble  -> 8
+               TyLDouble -> 16
+  , builtinAlign = \bt ->
+                   case bt of
+                     TyVaList -> 4
+                     TyAny    -> 4
+  , ptrAlign = 4
+  , voidAlign = 1
+  }
+
+tExpr :: MonadTrav m => [StmtCtx] -> ExprSide -> CExpr -> m Type
+tExpr c side e =
+  case nameOfNode (nodeInfo e) of
+    Just n ->
+      do dt <- getDefTable
+         case lookupType dt n of
+           Just t -> return t
+           Nothing ->
+             do t <- tExpr' c side e
+                withDefTable (\dt' -> (t, insertType dt' n t))
+    Nothing -> tExpr' c side e
+
+-- | Typecheck an expression, with information about whether it
+--   appears as an lvalue or an rvalue.
+tExpr' :: MonadTrav m => [StmtCtx] -> ExprSide -> CExpr -> m Type
+tExpr' c side (CBinary op le re ni)    =
+  do when (side == LValue) $ typeError ni "binary operator as lvalue"
+     lt <- tExpr c RValue le
+     rt <- tExpr c RValue re
+     binopType' ni op lt rt
+tExpr' c side (CUnary CAdrOp e ni)     =
+  do when (side == LValue) $
+          typeError ni "address-of operator as lvalue"
+     case e of
+       CCompoundLit _ _ _ -> simplePtr `liftM` tExpr c RValue e
+       CVar i _ -> lookupObject i >>=
+                   typeErrorOnLeft ni . maybe (notFound i) varAddrType
+       _        -> simplePtr `liftM` tExpr c LValue e
+tExpr' c _ (CUnary CIndOp e ni)     =
+  tExpr c RValue e >>= (typeErrorOnLeft ni . derefType)
+tExpr' c _ (CUnary CCompOp e ni)    =
+  do t <- tExpr c RValue e
+     checkIntegral' ni t
+     return t
+tExpr' c side (CUnary CNegOp e ni)      =
+  do when (side == LValue) $
+          typeError ni "logical negation used as lvalue"
+     tExpr c RValue e >>= checkScalar' ni
+     return boolType
+tExpr' c side (CUnary op e _)          =
+  tExpr c (if isEffectfulOp op then LValue else side) e
+tExpr' c _ (CIndex b i ni)             =
+  do bt <- tExpr c RValue b
+     it <- tExpr c RValue i
+     addrTy <- binopType' ni CAddOp bt it
+     typeErrorOnLeft ni $ derefType addrTy
+tExpr' c side (CCond e1 me2 e3 ni)     =
+  do t1 <- tExpr c RValue e1
+     checkScalar' (nodeInfo e1) t1
+     t3 <- tExpr c side e3
+     case me2 of
+       Just e2 ->
+         do t2 <- tExpr c side e2
+            conditionalType' ni t2 t3
+       Nothing -> conditionalType' ni t1 t3
+tExpr' c _ (CMember e m deref ni)   =
+  do t <- tExpr c RValue e
+     bt <- if deref then typeErrorOnLeft ni (derefType t) else return t
+     fieldType ni m bt
+tExpr' c side (CComma es _)            =
+  mapM (tExpr c side) es >>= return . last
+tExpr' c side (CCast d e ni)           =
+  do dt <- analyseTypeDecl d
+     et <- tExpr c side e
+     typeErrorOnLeft ni $ castCompatible dt et
+     return dt
+tExpr' c side (CSizeofExpr e ni)       =
+  do when (side == LValue) $ typeError ni "sizeof as lvalue"
+     _ <- tExpr c RValue e
+     return size_tType
+tExpr' c side (CAlignofExpr e ni)      =
+  do when (side == LValue) $ typeError ni "alignof as lvalue"
+     _ <- tExpr c RValue e
+     return size_tType
+tExpr' c side (CComplexReal e ni)      = complexBaseType ni c side e
+tExpr' c side (CComplexImag e ni)      = complexBaseType ni c side e
+tExpr' _ side (CLabAddrExpr _ ni)      =
+  do when (side == LValue) $ typeError ni "label address as lvalue"
+     return $ PtrType voidType noTypeQuals []
+tExpr' _ side (CCompoundLit d initList ni) =
+  do when (side == LValue) $ typeError ni "compound literal as lvalue"
+     lt <- analyseTypeDecl d
+     tInitList ni (canonicalType lt) initList
+     return lt
+tExpr' _ RValue (CAlignofType _ _)     = return size_tType
+tExpr' _ RValue (CSizeofType _ _)      = return size_tType
+tExpr' _ LValue (CAlignofType _ ni)    =
+  typeError ni "alignoftype as lvalue"
+tExpr' _ LValue (CSizeofType _ ni)     =
+  typeError ni "sizeoftype as lvalue"
+tExpr' ctx side (CGenericSelection expr list ni) = do
+  ty_sel <- tExpr ctx side expr
+  ty_list <- mapM analyseAssoc list
+  def_expr_ty <-
+    case dropWhile (isJust . fst) ty_list of
+      [(Nothing,tExpr'')] -> return (Just tExpr'')
+      [] -> return Nothing
+      _ -> astError ni "more than one default clause in generic selection"
+  case dropWhile (maybe True (not . typesMatch ty_sel) . fst) ty_list of
+    ((_,expr_ty) : _ ) -> return expr_ty
+    [] -> case def_expr_ty of
+      (Just expr_ty) -> return expr_ty
+      Nothing -> astError ni ("no clause matches for generic selection (not fully supported) - selector type is " ++ show (pretty ty_sel) ++
+                              ", available types are " ++ show (map (pretty.fromJust.fst) (filter (isJust.fst) ty_list)))
+  where
+    analyseAssoc (mdecl,expr') = do
+      tDecl <- mapM analyseTypeDecl mdecl
+      tExpr'' <- tExpr ctx side expr'
+      return (tDecl, tExpr'')
+    typesMatch (DirectType tn1 _ _) (DirectType tn2 _ _) = directTypesMatch tn1 tn2
+    typesMatch _ _ = False -- not fully supported
+    directTypesMatch TyVoid TyVoid = True
+    directTypesMatch (TyIntegral t1) (TyIntegral t2) = t1 == t2
+    directTypesMatch (TyFloating t1) (TyFloating t2) = t1 == t2
+    directTypesMatch (TyComplex t1) (TyComplex t2) = t1 == t2
+    directTypesMatch _ _ = False -- TODO: not fully supported
+tExpr' _ _ (CVar i ni)              =
+  lookupObject i >>=
+  maybe (typeErrorOnLeft ni $ notFound i) (return . declType)
+tExpr' _ _ (CConst c)                  = constType c
+tExpr' _ _ (CBuiltinExpr b)            = builtinType b
+tExpr' c side (CCall (CVar i _) args ni)
+  | identToString i == "__builtin_choose_expr" =
+    case args of
+      [g, e1, e2] ->
+        -- XXX: the MachineDesc parameter below should be configurable
+        do b <- constEval defaultMD Map.empty g
+           case boolValue b of
+             Just True -> tExpr c side e1
+             Just False -> tExpr c side e2
+             Nothing ->
+               astError ni "non-constant argument to __builtin_choose_expr"
+      _ -> astError ni "wrong number of arguments to __builtin_choose_expr"
+tExpr' c _ (CCall fe args ni)          =
+  do let defType = FunctionType
+                   (FunTypeIncomplete
+                    (DirectType (TyIntegral TyInt) noTypeQuals noAttributes))
+                   noAttributes
+         fallback i = do warn $ invalidAST ni $
+                                "unknown function: " ++ identToString i
+                         return defType
+     t <- case fe of
+            CVar i _ -> lookupObject i >>=
+                        maybe (fallback i) (const $ tExpr c RValue fe)
+            _ -> tExpr c RValue fe
+     atys <- mapM (tExpr c RValue) args
+     -- XXX: we don't actually want to return the canonical return type here
+     case canonicalType t of
+       PtrType (FunctionType (FunType rt pdecls varargs) _) _ _ ->
+         do let ptys = map declType pdecls
+            mapM_ checkArg $ zip3 ptys atys args
+            unless varargs $ when (length atys /= length ptys) $
+                   typeError ni "incorrect number of arguments"
+            return $ canonicalType rt
+       PtrType (FunctionType (FunTypeIncomplete rt) _) _ _ ->
+         do -- warn $ invalidAST ni "incomplete function type"
+            return $ canonicalType rt
+       _  -> typeError ni $ "attempt to call non-function of type " ++ pType t
+  where checkArg (pty, aty, arg) =
+          do attrs <- deepTypeAttrs pty
+             if isTransparentUnion attrs
+               then
+                 case canonicalType pty of
+                   DirectType (TyComp ctr) _ _ ->
+                     do td <- lookupSUE (nodeInfo arg) (sueRef ctr)
+                        _ms <- tagMembers (nodeInfo arg) td
+                        {-
+                        when (null $ rights $ matches ms) $
+                             astError (nodeInfo arg) $
+                             "argument matches none of the elements " ++
+                             "of transparent union"
+                        -}
+                        return ()
+                     -- where matches =
+                     --         map (\d -> assignCompatible
+                     --                    CAssignOp
+                     --                    (snd d)
+                     --                    aty
+                     --             )
+                   _ -> astError (nodeInfo arg)
+                        "non-composite has __transparent_union__ attribute"
+               else
+                 assignCompatible' (nodeInfo arg) CAssignOp pty aty
+        isTransparentUnion =
+          any (\(Attr n _ _) -> identToString n == "__transparent_union__")
+tExpr' c _ (CAssign op le re ni)       =
+  do lt <- tExpr c LValue le
+     rt <- tExpr c RValue re
+     when (constant $ typeQuals lt) $
+          typeError ni $ "assignment to lvalue with `constant' qualifier: "
+                         ++ (render . pretty) le
+     case (canonicalType lt, re) of
+       (lt', CConst (CIntConst i _))
+         | isPointerType lt' && getCInteger i == 0 -> return ()
+       (_, _) -> assignCompatible' ni op lt rt
+     return lt
+tExpr' c _ (CStatExpr s _)             =
+  do enterBlockScope
+     mapM_ (withDefTable . defineLabel) (getLabels s)
+     t <- tStmt c s
+     leaveBlockScope
+     return t
+
+tInitList :: MonadTrav m => NodeInfo -> Type -> CInitList -> m ()
+tInitList _ (ArrayType (DirectType (TyIntegral TyChar) _ _) _ _ _)
+              [([], CInitExpr e@(CConst (CStrConst _ _)) _)] =
+  tExpr [] RValue e >> return ()
+tInitList ni t@(ArrayType _ _ _ _) initList =
+  do let default_ds =
+           repeat (CArrDesig (CConst (CIntConst (cInteger 0) ni)) ni)
+     checkInits t default_ds initList
+tInitList ni t@(DirectType (TyComp ctr) _ _) initList =
+  do td <- lookupSUE ni (sueRef ctr)
+     ms <- tagMembers ni td
+     let default_ds = map (\m -> CMemberDesig (fst m) ni) ms
+     checkInits t default_ds initList
+tInitList _ (PtrType (DirectType TyVoid _ _) _ _ ) _ =
+          return () -- XXX: more checking
+tInitList _ t [([], i)] = voidM$ tInit t i
+tInitList ni t _ = typeError ni $ "initializer list for type: " ++ pType t
+
+checkInits :: MonadTrav m => Type -> [CDesignator] -> CInitList -> m ()
+checkInits _ _ [] = return ()
+checkInits t dds ((ds, i) : is) =
+  do (dds', ds') <- case (dds, ds) of
+                      ([], []) ->
+                        typeError (nodeInfo i) "excess elements in initializer"
+                      (dd' : rest, []) -> return (rest, [dd'])
+                      (_, d : _) -> return (advanceDesigList dds d, ds)
+     t' <- tDesignator t ds'
+     _ <- tInit t' i
+     checkInits t dds' is
+
+advanceDesigList :: [CDesignator] -> CDesignator -> [CDesignator]
+advanceDesigList ds d = drop 1 $ dropWhile (not . matchDesignator d) ds
+
+matchDesignator :: CDesignator -> CDesignator -> Bool
+matchDesignator (CMemberDesig m1 _) (CMemberDesig m2 _) = m1 == m2
+matchDesignator _ _ = True -- XXX: for now, array ranges aren't checked
+
+tDesignator :: MonadTrav m => Type -> [CDesignator] -> m Type
+-- XXX: check that initializers are within array size
+tDesignator (ArrayType bt _ _ _) (CArrDesig e ni : ds) =
+  do tExpr [] RValue e >>= checkIntegral' ni
+     tDesignator bt ds
+tDesignator (ArrayType bt _ _ _) (CRangeDesig e1 e2 ni : ds) =
+  do tExpr [] RValue e1 >>= checkIntegral' ni
+     tExpr [] RValue e2 >>= checkIntegral' ni
+     tDesignator bt ds
+tDesignator (ArrayType _ _ _ _) (d : _) =
+  typeError (nodeInfo d) "member designator in array initializer"
+tDesignator t@(DirectType (TyComp _) _ _) (CMemberDesig m ni : ds) =
+  do mt <- fieldType ni m t
+     tDesignator (canonicalType mt) ds
+tDesignator (DirectType (TyComp _) _ _) (d : _) =
+  typeError (nodeInfo d) "array designator in compound initializer"
+tDesignator t [] = return t
+tDesignator _t _ =
+  error "unepxected type with designator"
+
+tInit :: MonadTrav m => Type -> CInit -> m Initializer
+tInit t i@(CInitExpr e ni) =
+  do it <- tExpr [] RValue e
+     assignCompatible' ni CAssignOp t it
+     return i
+tInit t i@(CInitList initList ni) =
+  tInitList ni (canonicalType t) initList >> return i
+
+complexBaseType :: MonadTrav m => NodeInfo -> [StmtCtx] -> ExprSide -> CExpr -> m Type
+complexBaseType ni c side e =
+  do t <- tExpr c side e
+     case canonicalType t of
+       DirectType (TyComplex ft) quals attrs ->
+         return $ DirectType (TyFloating ft) quals attrs
+       _ -> typeError ni $ "expected complex type, got: " ++ pType t
+
+
+-- | Return the type of a builtin.
+builtinType :: MonadTrav m => CBuiltin -> m Type
+builtinType (CBuiltinVaArg _ d _)           = analyseTypeDecl d
+builtinType (CBuiltinOffsetOf _ _ _)        = return size_tType
+builtinType (CBuiltinTypesCompatible _ _ _) = return boolType
+builtinType (CBuiltinConvertVector _expr ty _) = analyseTypeDecl ty
+builtinType (CBuiltinBitCast ty _expr _)    = analyseTypeDecl ty
+
 -- return @Just declspecs@ without @CTypedef@ if the declaration specifier contain @typedef@
 hasTypeDef :: [CDeclSpec] -> Maybe [CDeclSpec]
 hasTypeDef declspecs =
@@ -242,5 +776,5 @@
         (True,specs') -> Just specs'
         (False,_)     -> Nothing
     where
-    hasTypeDefSpec (CStorageSpec (CTypedef n)) (_,specs) = (True, specs)
+    hasTypeDefSpec (CStorageSpec (CTypedef _)) (_,specs) = (True, specs)
     hasTypeDefSpec spec (b,specs) = (b,spec:specs)
diff --git a/src/Language/C/Analysis/AstAnalysis.hs-boot b/src/Language/C/Analysis/AstAnalysis.hs-boot
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Analysis/AstAnalysis.hs-boot
@@ -0,0 +1,13 @@
+module Language.C.Analysis.AstAnalysis where
+
+import Language.C.Analysis.SemRep
+import Language.C.Analysis.TravMonad
+import Language.C.Syntax.AST
+
+data StmtCtx = FunCtx VarDecl
+             | LoopCtx
+             | SwitchCtx
+
+data ExprSide = LValue | RValue
+
+tExpr :: MonadTrav m => [StmtCtx] -> ExprSide -> CExpr -> m Type
diff --git a/src/Language/C/Analysis/Builtins.hs b/src/Language/C/Analysis/Builtins.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Analysis/Builtins.hs
@@ -0,0 +1,226 @@
+module Language.C.Analysis.Builtins (builtins) where
+
+import Language.C.Analysis.DefTable
+import Language.C.Analysis.SemRep
+import Language.C.Analysis.TypeUtils
+import Language.C.Data.Ident
+import Language.C.Data.Node
+
+builtins :: DefTable
+builtins = foldr doIdent (foldr doTypeDef emptyDefTable typedefs) idents
+  where doTypeDef d = snd . defineTypeDef (identOfTypeDef d) d
+        doIdent   d = snd . defineGlobalIdent (declIdent d) d
+        dName     s = VarName (builtinIdent s) Nothing
+        param ty    = ParamDecl (VarDecl
+                                 NoName
+                                 (DeclAttrs noFunctionAttrs (Auto False) [])
+                                 ty) undefNode
+        fnAttrs     = DeclAttrs noFunctionAttrs (FunLinkage ExternalLinkage) []
+        varAttrs    = DeclAttrs noFunctionAttrs (Static InternalLinkage False) []
+        fnType r as = FunctionType (FunType r (map param as) False) noAttributes
+        fnType' r as = FunctionType (FunType r (map param as) True) noAttributes
+        func n r as = Declaration
+                      (Decl
+                       (VarDecl (dName n) fnAttrs (fnType r as))
+                       undefNode)
+        func' n r as = Declaration
+                       (Decl
+                        (VarDecl (dName n) fnAttrs (fnType' r as))
+                        undefNode)
+        var n t     = Declaration
+                      (Decl (VarDecl (dName n) varAttrs t) undefNode)
+        typedef n t = TypeDef (builtinIdent n) t [] undefNode
+        typedefs    = [ typedef "__builtin_va_list"
+                                valistType
+                      ]
+        idents      = [ func "__builtin_expect"
+                             (integral TyLong)
+                             [integral TyLong, integral TyLong]
+                      , func "__builtin_bswap16"
+                             uint16_tType
+                             [uint16_tType]
+                      , func "__builtin_bswap32"
+                             uint32_tType
+                             [uint32_tType]
+                      , func "__builtin_bswap64"
+                             uint64_tType
+                             [uint64_tType]
+                      , func "__builtin_fabs"
+                             (floating TyDouble)
+                             [floating TyDouble]
+                      , func "__builtin_fabsf"
+                             (floating TyFloat)
+                             [floating TyFloat]
+                      , func "__builtin_fabsl"
+                             (floating TyLDouble)
+                             [floating TyLDouble]
+                      , func "__builtin_inf" (floating TyDouble) []
+                      , func "__builtin_inff" (floating TyFloat) []
+                      , func "__builtin_infl" (floating TyLDouble) []
+                      , func "__builtin_huge_val" (floating TyDouble) []
+                      , func "__builtin_huge_valf" (floating TyFloat) []
+                      , func "__builtin_huge_vall" (floating TyLDouble) []
+                      , func "__builtin_copysign"
+                             (floating TyDouble)
+                             [ floating TyDouble, floating TyDouble ]
+                      , func "__builtin_va_start"
+                             voidType
+                             [ valistType , voidPtr ]
+                      , func "__builtin_va_end"
+                             voidType
+                             [valistType]
+                      , func "__builtin_va_copy"
+                             voidType
+                             [ valistType, valistType ]
+                      , func "__builtin_va_arg_pack" (integral TyInt) []
+                      , func "__builtin_va_arg_pack_len" (integral TyInt) []
+                      , func "__builtin_alloca"
+                             voidPtr
+                             [ size_tType ]
+                      , func "__builtin_memcpy"
+                             voidPtr
+                             [ voidPtr
+                             , constVoidPtr
+                             , size_tType
+                             ]
+                      , func "__builtin_strspn"
+                             size_tType
+                             [ constCharPtr, constCharPtr ]
+                      , func "__builtin_strcspn"
+                             size_tType
+                             [ constCharPtr, constCharPtr ]
+                      , func "__builtin_strchr"
+                             charPtr
+                             [ constCharPtr, integral TyInt]
+                      , func "__builtin_strncpy"
+                             charPtr
+                             [ constCharPtr -- XXX: restrict
+                             , constCharPtr -- XXX: restrict
+                             , size_tType
+                             ]
+                      , func "__builtin_strncat"
+                             charPtr
+                             [ constCharPtr -- XXX: restrict
+                             , constCharPtr -- XXX: restrict
+                             , size_tType
+                             ]
+                      , func "__builtin_strcmp"
+                             (integral TyInt)
+                             [ constCharPtr, constCharPtr ]
+                      , func "__builtin_strpbrk"
+                             charPtr
+                             [ constCharPtr, constCharPtr ]
+                      , func "__builtin_bzero"
+                             voidType
+                             [ voidPtr, size_tType ]
+                      , func "__builtin_clz"
+                             (integral TyInt)
+                             [ integral TyUInt ]
+                      , func "__builtin_constant_p"
+                             (integral TyInt)
+                             [DirectType (TyBuiltin TyAny) noTypeQuals noAttributes]
+                      -- XXX: I don't know if the following has the
+                      -- correct type. It doesn't seem to be
+                      -- documented.
+                      , func "__builtin_extract_return_addr"
+                             voidPtr
+                             [ voidPtr ]
+                      , func "__builtin_return_address"
+                             voidPtr
+                             [ integral TyUInt ]
+                      , func "__builtin_frame_address"
+                             voidPtr
+                             [ integral TyUInt ]
+                      , func "__builtin_expect"
+                             (integral TyLong)
+                             [ integral TyLong, integral TyLong ]
+                      , func "__builtin_prefetch"
+                             voidType
+                             [ constVoidPtr ]
+                      , var "__func__"
+                            stringType
+                      , var "__PRETTY_FUNCTION__"
+                            stringType
+                      , var "__FUNCTION__"
+                            stringType
+                      -- Builtin GCC error checking functions
+                      , func "__builtin_object_size"
+                             size_tType
+                             [ voidPtr, integral TyInt ]
+                      , func "__builtin___memcpy_chk"
+                             voidPtr
+                             [ voidPtr, constVoidPtr, size_tType, size_tType ]
+                      , func "__builtin___mempcpy_chk"
+                             voidPtr
+                             [ voidPtr, constVoidPtr, size_tType, size_tType ]
+                      , func "__builtin___memmove_chk"
+                             voidPtr
+                             [ voidPtr, constVoidPtr, size_tType, size_tType ]
+                      , func "__builtin___memset_chk"
+                             voidPtr
+                             [ voidPtr, integral TyInt, size_tType, size_tType ]
+                      , func "__builtin___strcpy_chk"
+                             charPtr
+                             [ constCharPtr -- XXX: restrict
+                             , constCharPtr -- XXX: restrict
+                             , size_tType
+                             ]
+                      , func "__builtin___stpcpy_chk"
+                             charPtr
+                             [ constCharPtr -- XXX: restrict
+                             , constCharPtr -- XXX: restrict
+                             , size_tType
+                             ]
+                      , func "__builtin___strncpy_chk"
+                             charPtr
+                             [ constCharPtr -- XXX: restrict
+                             , constCharPtr -- XXX: restrict
+                             , size_tType
+                             , size_tType
+                             ]
+                      , func "__builtin___strcat_chk"
+                             charPtr
+                             [ constCharPtr -- XXX: restrict
+                             , constCharPtr -- XXX: restrict
+                             , size_tType
+                             ]
+                      , func "__builtin___strncat_chk"
+                             charPtr
+                             [ constCharPtr -- XXX: restrict
+                             , constCharPtr -- XXX: restrict
+                             , size_tType
+                             , size_tType
+                             ]
+                      , func' "__builtin___sprintf_chk"
+                             (integral TyInt)
+                             [ charPtr
+                             , integral TyInt
+                             , size_tType
+                             , constCharPtr
+                             ]
+                      , func' "__builtin___snprintf_chk"
+                             (integral TyInt)
+                             [ charPtr
+                             , size_tType
+                             , integral TyInt
+                             , size_tType
+                             , constCharPtr
+                             ]
+                      , func "__builtin___vsprintf_chk"
+                             (integral TyInt)
+                             [ charPtr
+                             , integral TyInt
+                             , size_tType
+                             , constCharPtr
+                             , valistType
+                             ]
+                      , func "__builtin___vsnprintf_chk"
+                             (integral TyInt)
+                             [ charPtr
+                             , size_tType
+                             , integral TyInt
+                             , size_tType
+                             , constCharPtr
+                             , valistType
+                             ]
+                      ]
diff --git a/src/Language/C/Analysis/ConstEval.hs b/src/Language/C/Analysis/ConstEval.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Analysis/ConstEval.hs
@@ -0,0 +1,237 @@
+{-# LANGUAGE RelaxedPolyRec #-}
+module Language.C.Analysis.ConstEval where
+
+import Prelude hiding (Foldable(..))
+import Control.Monad
+import Data.Bits
+import Data.Foldable
+import Data.Maybe
+import qualified Data.Map as Map
+import Language.C.Syntax.AST
+import Language.C.Syntax.Constants
+import {-# SOURCE #-} Language.C.Analysis.AstAnalysis (tExpr, ExprSide(..))
+import Language.C.Analysis.Debug ()
+import Language.C.Analysis.DeclAnalysis
+import Language.C.Analysis.DefTable
+import Language.C.Data
+import Language.C.Pretty
+import Language.C.Analysis.SemRep
+import Language.C.Analysis.TravMonad
+import Language.C.Analysis.TypeUtils
+import Text.PrettyPrint.HughesPJ
+
+data MachineDesc =
+  MachineDesc
+  { iSize        :: IntType -> Integer
+  , fSize        :: FloatType -> Integer
+  , builtinSize  :: BuiltinType -> Integer
+  , ptrSize      :: Integer
+  , voidSize     :: Integer
+  , iAlign       :: IntType -> Integer
+  , fAlign       :: FloatType -> Integer
+  , builtinAlign :: BuiltinType -> Integer
+  , ptrAlign     :: Integer
+  , voidAlign    :: Integer
+  }
+
+intExpr :: (Pos n, MonadName m) => n -> Integer -> m CExpr
+intExpr n i =
+  genName >>= \name ->
+    return $ CConst $ CIntConst (cInteger i) (mkNodeInfo (posOf n) name)
+
+sizeofType :: (MonadTrav m, CNode n) => MachineDesc -> n -> Type -> m Integer
+sizeofType md _ (DirectType TyVoid _ _) = return $ voidSize md
+sizeofType md _ (DirectType (TyIntegral it) _ _) = return $ iSize md it
+sizeofType md _ (DirectType (TyFloating ft) _ _) = return $ fSize md ft
+sizeofType md _ (DirectType (TyComplex ft) _ _) = return $ 2 * fSize md ft
+sizeofType md _ (DirectType (TyComp ctr) _ _) = fst <$> compSizeAndAlign md ctr
+sizeofType md _ (DirectType (TyEnum _) _ _) = return $ iSize md TyInt
+sizeofType md _ (DirectType (TyBuiltin b) _ _) = return $ builtinSize md b
+sizeofType md _ (PtrType _ _ _)  = return $ ptrSize md
+sizeofType md _ (ArrayType _ (UnknownArraySize _) _ _) = return $ ptrSize md
+sizeofType md n (ArrayType bt (ArraySize _ sz) _ _) =
+  do sz' <- constEval md Map.empty sz
+     case sz' of
+       CConst (CIntConst i _) ->
+         do s <- sizeofType md n bt
+            return $ getCInteger i * s
+       _ -> return $ ptrSize md
+            {-
+            astError (nodeInfo sz) $
+            "array size is not a constant: " ++ (render . pretty) sz
+            -}
+sizeofType md n (TypeDefType (TypeDefRef _ t _) _ _) = sizeofType md n t
+sizeofType md _ (FunctionType _ _) = return $ ptrSize md
+
+alignofType :: (MonadTrav m, CNode n) => MachineDesc -> n -> Type -> m Integer
+alignofType md _ (DirectType TyVoid _ _) = return $ voidAlign md
+alignofType md _ (DirectType (TyIntegral it) _ _) = return $ iAlign md it
+alignofType md _ (DirectType (TyFloating ft) _ _) = return $ fAlign md ft
+alignofType md _ (DirectType (TyComplex ft) _ _) = return $ fAlign md ft
+alignofType md _ (DirectType (TyComp ctr) _ _) = snd <$> compSizeAndAlign md ctr
+alignofType md _ (DirectType (TyEnum _) _ _) = return $ iAlign md TyInt
+alignofType md _ (DirectType (TyBuiltin b) _ _) = return $ builtinAlign md b
+alignofType md _ (PtrType _ _ _)  = return $ ptrAlign md
+alignofType md _ (ArrayType _ (UnknownArraySize _) _ _) = return $ ptrAlign md
+alignofType md n (ArrayType bt (ArraySize _ _) _ _) = alignofType md n bt
+alignofType md n (TypeDefType (TypeDefRef _ t _) _ _) = alignofType md n t
+alignofType _ n t = astError (nodeInfo n) $
+                 "can't find alignment of type: " ++ (render . pretty) t
+
+compSizeAndAlign
+  :: MonadTrav m =>
+     MachineDesc ->
+     CompTypeRef ->
+     m (Integer, Integer)
+     -- ^ (size, alignment)
+compSizeAndAlign md ctr =
+  do dt <- getDefTable
+     case lookupTag (sueRef ctr) dt of
+       Just (Left _)   -> astError (nodeInfo ctr)
+                          "composite declared but not defined"
+       Just (Right (CompDef (CompType _ tag ms _ ni))) ->
+         do let ts = map declType ms
+            sizes <- mapM (sizeofType md ni) ts
+            aligns <- mapM (alignofType md ni) ts
+            let alignment = maximum (1 : aligns)
+                size = case tag of
+                  UnionTag -> roundToAlignment alignment (maximum (0 : sizes))
+                  StructTag ->
+                    let sizeAndNextAlignment =
+                          zip sizes (drop 1 aligns ++ [alignment])
+                        offsets = foldl'
+                          (\offset (memberSize, nextAlign)
+                           -> roundToAlignment nextAlign (offset + memberSize))
+                          0
+                          sizeAndNextAlignment
+                    in offsets
+            return (size, alignment)
+       Just (Right (EnumDef _)) -> return $ (iSize md TyInt, iAlign md TyInt)
+       Nothing         -> astError (nodeInfo ctr) "unknown composite"
+
+-- | Find the next multiple of an alignment
+roundToAlignment
+  :: Integer
+  -- ^ The alignment
+  -> Integer
+  -- ^ The value to align
+  -> Integer
+  -- ^ The next multiple of alignment
+roundToAlignment alignment value =
+  alignment * ((value + (alignment - 1)) `quot` alignment)
+
+{- Expression evaluation -}
+
+-- Use the withWordBytes function to wrap the results around to the
+-- correct word size
+intOp :: CBinaryOp -> Integer -> Integer -> Integer
+intOp CAddOp i1 i2 = i1 + i2
+intOp CSubOp i1 i2 = i1 - i2
+intOp CMulOp i1 i2 = i1 * i2
+intOp CDivOp i1 i2 = i1 `div` i2
+intOp CRmdOp i1 i2 = i1 `mod` i2
+intOp CShlOp i1 i2 = i1 `shiftL` fromInteger i2
+intOp CShrOp i1 i2 = i1 `shiftR` fromInteger i2
+intOp CLeOp  i1 i2 = toInteger $ fromEnum $ i1 < i2
+intOp CGrOp  i1 i2 = toInteger $ fromEnum $ i1 > i2
+intOp CLeqOp i1 i2 = toInteger $ fromEnum $ i1 <= i2
+intOp CGeqOp i1 i2 = toInteger $ fromEnum $ i1 >= i2
+intOp CEqOp  i1 i2 = toInteger $ fromEnum $ i1 == i2
+intOp CNeqOp i1 i2 = toInteger $ fromEnum $ i1 /= i2
+intOp CAndOp i1 i2 = i1 .&. i2
+intOp CXorOp i1 i2 = i1 `xor` i2
+intOp COrOp  i1 i2 = i1 .|. i2
+intOp CLndOp i1 i2 = toInteger $ fromEnum $ (i1 /= 0) && (i2 /= 0)
+intOp CLorOp i1 i2 = toInteger $ fromEnum $ (i1 /= 0) || (i2 /= 0)
+
+-- Use the withWordBytes function to wrap the results around to the
+-- correct word size
+intUnOp :: CUnaryOp -> Integer -> Maybe Integer
+intUnOp CPlusOp i = Just i
+intUnOp CMinOp  i = Just $ -i
+intUnOp CCompOp i = Just $ complement i
+intUnOp CNegOp  i = Just $ toInteger $ fromEnum $ i == 0
+intUnOp _       _ = Nothing
+
+withWordBytes :: Int -> Integer -> Integer
+withWordBytes bytes n = n `rem` (1 `shiftL` (bytes `shiftL` 3))
+
+boolValue :: CExpr -> Maybe Bool
+boolValue (CConst (CIntConst i _))  = Just $ getCInteger i /= 0
+boolValue (CConst (CCharConst c _)) = Just $ getCCharAsInt c /= 0
+boolValue (CConst (CStrConst _ _))  = Just True
+boolValue _                         = Nothing
+
+intValue :: CExpr -> Maybe Integer
+intValue (CConst (CIntConst i _))  = Just $ getCInteger i
+intValue (CConst (CCharConst c _)) = Just $ getCCharAsInt c
+intValue _                         = Nothing
+
+constEval :: (MonadTrav m) =>
+             MachineDesc -> Map.Map Ident CExpr -> CExpr -> m CExpr
+constEval md env (CCond e1 me2 e3 ni) =
+  do e1'  <- constEval md env e1
+     me2' <- maybe (return Nothing) (\e -> Just `liftM` constEval md env e) me2
+     e3'  <- constEval md env e3
+     case boolValue e1' of
+       Just True  -> return $ fromMaybe e1' me2'
+       Just False -> return e3'
+       Nothing    -> return $ CCond e1' me2' e3' ni
+constEval md env e@(CBinary op e1 e2 ni) =
+  do e1' <- constEval md env e1
+     e2' <- constEval md env e2
+     t <- tExpr [] RValue e
+     bytes <- fromIntegral `liftM` sizeofType md e t
+     case (intValue e1', intValue e2') of
+       (Just i1, Just i2) -> intExpr ni (withWordBytes bytes (intOp op i1 i2))
+       (_, _)             -> return $ CBinary op e1' e2' ni
+constEval md env (CUnary op e ni) =
+  do e' <- constEval md env e
+     t <- tExpr [] RValue e
+     bytes <- fromIntegral `liftM` sizeofType md e t
+     case intValue e' of
+       Just i  -> case intUnOp op i of
+                    Just i' -> intExpr ni (withWordBytes bytes i')
+                    Nothing -> astError ni
+                               "invalid unary operator applied to constant"
+       Nothing -> return $ CUnary op e' ni
+constEval md env (CCast d e ni) =
+  do e' <- constEval md env e
+     t <- analyseTypeDecl d
+     bytes <- fromIntegral `liftM` sizeofType md d t
+     case intValue e' of
+       Just i -> intExpr ni (withWordBytes bytes i)
+       Nothing -> return $ CCast d e' ni
+constEval md _ (CSizeofExpr e ni) =
+  do t <- tExpr [] RValue e
+     sz <- sizeofType md e t
+     intExpr ni sz
+constEval md _ (CSizeofType d ni) =
+  do t <- analyseTypeDecl d
+     sz <- sizeofType md d t
+     intExpr ni sz
+constEval md _ (CAlignofExpr e ni) =
+  do t <- tExpr [] RValue e
+     sz <- alignofType md e t
+     intExpr ni sz
+constEval md _ (CAlignofType d ni) =
+  do t <- analyseTypeDecl d
+     sz <- alignofType md d t
+     intExpr ni sz
+constEval _ env e@(CVar i _) | Map.member i env =
+  return $ fromMaybe e $ Map.lookup i env
+constEval md env e@(CVar i _) =
+  do t <- tExpr [] RValue e
+     case derefTypeDef t of
+       DirectType (TyEnum etr) _ _ ->
+         do dt <- getDefTable
+            case lookupTag (sueRef etr) dt of
+              Just (Right (EnumDef (EnumType _ es _ _))) ->
+                do env' <- foldM enumConst env es
+                   return $ fromMaybe e $ Map.lookup i env'
+              _ -> return e
+       _ -> return e
+  where enumConst env' (Enumerator n e' _ _) =
+          do c <- constEval md env' e'
+             return $ Map.insert n c env'
+constEval _ _ e = return e
diff --git a/src/Language/C/Analysis/Debug.hs b/src/Language/C/Analysis/Debug.hs
--- a/src/Language/C/Analysis/Debug.hs
+++ b/src/Language/C/Analysis/Debug.hs
@@ -20,11 +20,13 @@
 where
 import Language.C.Analysis.SemRep
 import Language.C.Analysis.Export
+import Language.C.Analysis.DefTable
+import Language.C.Analysis.NameSpaceMap
 
 import Language.C.Data
 import Language.C.Pretty
-import Language.C.Syntax
 
+import Prelude hiding ((<>))
 import Text.PrettyPrint.HughesPJ
 import Data.Map (Map) ; import qualified Data.Map as Map
 
@@ -32,10 +34,20 @@
 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)
+    text label $$ nest 8 (vcat $ map prettyEntry theMap)
     where
     prettyEntry (k,v) = prettyKey k <+> text " ~> " <+> prettyVal v
 
+instance Pretty DefTable where
+    pretty dt = text "DefTable" $$ nest 4 (vcat defMaps)
+        where
+        defMaps = [ prettyNSMap "idents" identDecls
+                  , prettyNSMap "tags" tagDecls
+                  , prettyNSMap "labels" labelDefs
+                  , prettyNSMap "members" memberDecls
+                  ]
+        prettyNSMap label f = prettyAssocs label . nsMapToList $ f dt
+
 instance Pretty GlobalDecls where
     pretty gd = text "Global Declarations" $$ (nest 4 $ vcat declMaps)
         where
@@ -60,17 +72,25 @@
     (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
-
+    filterFile = maybe True file_filter . fileOfNode . nodeInfo
 
-instance Pretty (Either VarDecl ObjDef) where
-    pretty = either pretty pretty
-instance Pretty (Either VarDecl FunDef) where
+instance (Pretty a, Pretty b) => Pretty (Either a b) where
     pretty = either pretty pretty
+instance Pretty TagFwdDecl where
+    pretty (CompDecl ct) = pretty ct
+    pretty (EnumDecl et) = pretty et
+instance Pretty CompTyKind where
+    pretty StructTag = text "struct"
+    pretty UnionTag = text "union"
+instance Pretty CompTypeRef where
+    pretty (CompTypeRef sue kind _) = pretty kind <+> pretty sue
+instance Pretty EnumTypeRef where
+    pretty (EnumTypeRef sue _ ) = text "enum" <+> pretty sue
 instance Pretty Ident where
     pretty = text . identToString
 instance Pretty SUERef where
-    pretty ref = text (show ref)
+    pretty (AnonymousRef name) = text $ "$" ++ show (nameId name)
+    pretty (NamedRef ident) = pretty ident
 instance Pretty TagDef where
     pretty (CompDef compty) = pretty compty
     pretty (EnumDef enumty) = pretty enumty
@@ -101,10 +121,13 @@
 instance Pretty ParamDecl where
     pretty (ParamDecl (VarDecl name declattrs ty) _) =
         pretty declattrs <+> pretty name <+> text "::" <+> pretty ty
+    pretty (AbstractParamDecl (VarDecl name declattrs ty) _) =
+        text "abstract" <+> 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])
+    pretty (DeclAttrs fun_attrs storage attrs) =
+        hsep [ pretty fun_attrs, pretty storage, pretty attrs]
+
 instance Pretty Type where
   pretty ty = pretty (exportTypeDecl ty)
 instance Pretty TypeQuals where
@@ -113,10 +136,11 @@
                                     | otherwise      = empty
 
 instance Pretty CompType where
-    pretty (CompType sue_ref tag members attrs node) =
+    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 <+>
@@ -128,12 +152,17 @@
     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
+      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 FunctionAttrs where
+    pretty fattrs = hsep [pIf isInline "inline", pIf isNoreturn "_Noreturn"]
+      where
+        pIf isMatch txt = if isMatch fattrs then text txt else empty
+
 instance Pretty Storage where
     pretty NoStorage = empty
     pretty (Auto reg) = text$ if reg then "auto/register" else "auto"
@@ -144,6 +173,7 @@
 instance Pretty Linkage where
     pretty InternalLinkage = text "internal"
     pretty ExternalLinkage = text "external"
+    pretty NoLinkage       = text "local"
 instance Pretty VarName where
     pretty NoName = text "<anonymous>"
     pretty (VarName ident asmname_opt) = pretty ident <+> (maybe empty pAsmName asmname_opt)
diff --git a/src/Language/C/Analysis/DeclAnalysis.hs b/src/Language/C/Analysis/DeclAnalysis.hs
--- a/src/Language/C/Analysis/DeclAnalysis.hs
+++ b/src/Language/C/Analysis/DeclAnalysis.hs
@@ -1,4 +1,5 @@
-{-# LANGUAGE PatternGuards #-}
+{-# LANGUAGE PatternGuards, FlexibleContexts #-}
+{-# OPTIONS_GHC -Wwarn=incomplete-patterns #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Language.C.Analysis.DeclAnalysis
@@ -18,10 +19,10 @@
   mergeOldStyle,
   -- * Dissecting type specs
   canonicalTypeSpec, NumBaseType(..),SignSpec(..),SizeMod(..),NumTypeSpec(..),TypeSpecAnalysis(..),
-  canonicalStorageSpec, StorageSpec(..),hasThreadLocalSpec,
+  canonicalStorageSpec, StorageSpec(..), hasThreadLocalSpec, hasClKernelSpec, isTypeDef,
   -- * Helpers
   VarDeclInfo(..),
-  tAttr,mkVarName,getOnlyDeclr,nameOfDecl,
+  tAttr,mkVarName,getOnlyDeclr,nameOfDecl,analyseVarDecl,analyseVarDecl'
 )
 where
 import Language.C.Data.Error
@@ -29,16 +30,15 @@
 import Language.C.Data.Ident
 import Language.C.Pretty
 import Language.C.Syntax
-import Language.C.Analysis.DefTable (TagFwdDecl(..))
+import {-# SOURCE #-} Language.C.Analysis.AstAnalysis (tExpr, ExprSide(..))
+import Language.C.Analysis.DefTable (TagFwdDecl(..), insertType)
 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 Control.Monad (liftM,when,ap,unless,zipWithM)
+import Data.List (intercalate, mapAccumL)
 import qualified Data.Map as Map
 import Text.PrettyPrint.HughesPJ
 
@@ -48,16 +48,19 @@
 -- | analyse and translate a parameter declaration
 -- Should be called in either prototype or block scope
 tParamDecl :: (MonadTrav m) => CDecl -> m ParamDecl
+tParamDecl (CStaticAssert _ _ node) =
+  astError node "expected parameter, not static assertion"
 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")
+     (VarDeclInfo name fun_spec  storage_spec attrs ty declr_node) <- analyseVarDecl' True declspecs declr [] Nothing
+     when (isInline fun_spec || isNoreturn fun_spec) $
+       throwTravError (badSpecifierError node "parameter declaration with function 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
+     -- XXX: we shouldn't modify the deftable here, just analyse and build representation
+     return paramDecl
   where
   getParamDeclr =
       case declrs of
@@ -65,74 +68,117 @@
           [(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
+    let vd = VarDecl name (DeclAttrs noFunctionAttrs 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 _ ClGlobalSpec  = Right (Static NoLinkage False)
+computeParamStorage _ ClLocalSpec   = Right (Static NoLinkage 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)
+-- Anonymous struct or union members
+-- TODO storage specs, align specs and attributes are ignored
+tMemberDecls (CStaticAssert _ _ node) =
+  astError node "expected struct or union member, found static assertion"
+tMemberDecls (CDecl declspecs [] node) =
+  do let (_storage_specs, _attrs, typequals, typespecs, funspecs, _alignspecs) =
+           partitionDeclSpecs declspecs
+     unless (null funspecs) $ astError node "member declaration with function specifier"
+     canonTySpecs <- canonicalTypeSpec typespecs
+     ty <- tType True node typequals canonTySpecs [] []
+     case ty of
+       DirectType (TyComp _) _ _ ->
+         return $ [MemberDecl
+                   -- XXX: are these DeclAttrs correct?
+                   (VarDecl NoName (DeclAttrs noFunctionAttrs NoStorage []) ty)
+                   Nothing node]
+       _ -> astError node "anonymous member has a non-composite type"
+-- Named members
+tMemberDecls (CDecl declspecs declrs node) = zipWithM tMemberDecl (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
+        -- TODO: use analyseVarDecl here, not analyseVarDecl'
+        do var_decl <- analyseVarDecl' handle_sue_def declspecs member_declr [] Nothing
+           let (VarDeclInfo name fun_spec storage_spec attrs ty _node_info) = var_decl
            --
-           checkValidMemberSpec is_inline storage_spec
-           return $ MemberDecl (VarDecl name (DeclAttrs False NoStorage attrs) ty) bit_field_size_opt node
+           checkValidMemberSpec fun_spec storage_spec
+           return $ MemberDecl (VarDecl name (DeclAttrs noFunctionAttrs 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 [] []
+        do let (storage_specs, _attrs, typequals, typespecs, _funspecs, _alignspecs) = partitionDeclSpecs declspecs
+           -- TODO: funspecs/alignspecs not yet processed
+           _storage_spec  <- canonicalStorageSpec storage_specs
+           -- TODO: storage_spec not used
+           canonTySpecs  <- canonicalTypeSpec typespecs
+           typ           <- tType handle_sue_def node typequals canonTySpecs [] []
            --
            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"
+    checkValidMemberSpec fun_spec storage_spec =
+        do  when (fun_spec /= noFunctionAttrs)   $ 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
+                 | ClKernelSpec | ClGlobalSpec | ClLocalSpec
                     deriving (Eq,Ord,Show,Read)
 
 hasThreadLocalSpec :: StorageSpec -> Bool
 hasThreadLocalSpec ThreadSpec = True
+hasThreadLocalSpec ClLocalSpec = True
 hasThreadLocalSpec (StaticSpec b) = b
 hasThreadLocalSpec (ExternSpec b) = b
 hasThreadLocalSpec _  = False
 
-data VarDeclInfo = VarDeclInfo VarName Bool {- is-inline? -} StorageSpec Attributes Type NodeInfo
+hasClKernelSpec :: StorageSpec -> Bool
+hasClKernelSpec ClKernelSpec = True
 
+data VarDeclInfo = VarDeclInfo VarName FunctionAttrs StorageSpec Attributes Type NodeInfo
+
+analyseVarDecl' :: (MonadTrav m) =>
+                  Bool -> [CDeclSpec] ->
+                  CDeclr -> [CDecl] -> Maybe CInit -> m VarDeclInfo
+analyseVarDecl' handle_sue_def declspecs declr oldstyle init_opt =
+  do let (storage_specs, attrs, type_quals, type_specs, funspecs, _alignspecs) =
+           partitionDeclSpecs declspecs
+     canonTySpecs <- canonicalTypeSpec type_specs
+     -- TODO: alignspecs not yet processed
+     analyseVarDecl handle_sue_def storage_specs attrs type_quals canonTySpecs funspecs
+                    declr oldstyle init_opt
+
 -- | analyse declarators
-analyseVarDecl :: (MonadTrav m) => Bool -> [CDeclSpec] -> CDeclr -> [CDecl] -> (Maybe CInit) -> m VarDeclInfo
-analyseVarDecl handle_sue_def declspecs
+analyseVarDecl :: (MonadTrav m) =>
+                  Bool -> [CStorageSpec] -> [CAttr] -> [CTypeQual] ->
+                  TypeSpecAnalysis -> [CFunSpec] ->
+                  CDeclr -> [CDecl] -> Maybe CInit -> m VarDeclInfo
+analyseVarDecl handle_sue_def storage_specs decl_attrs typequals canonTySpecs fun_specs
                (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
+               oldstyle_params _init_opt
+    = do -- 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
+         typ          <- tType handle_sue_def node typequals canonTySpecs 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
+         return $ VarDeclInfo name function_spec storage_spec attrs' typ node
     where
-        isInlineSpec (CInlineQual _) = True
-        isInlineSpec _ = False
-
+        updateFunSpec (CInlineQual _) f = f { isInline = True }
+        updateFunSpec (CNoreturnQual _) f = f { isNoreturn = True }
+        function_spec = foldr updateFunSpec noFunctionAttrs fun_specs
 
 -- 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/
@@ -149,32 +195,44 @@
 --
 -- We move attributes to the type, as they have no meaning for the abstract declarator
 analyseTypeDecl :: (MonadTrav m) => CDecl -> m Type
+analyseTypeDecl (CStaticAssert _ _ node) =
+  astError node "Expected type declaration, found static assert"
 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 []
+        | (not (null storagespec) || not (null funspecs) || not (null alignspecs)) =
+            astError node "storage, function or alignment specifier for type declaration"
+        | otherwise                          =
+          do canonTySpecs <- canonicalTypeSpec typespecs
+             t <- tType True node (map CAttrQual (attrs++attrs_decl) ++ typequals)
+                   canonTySpecs derived_declrs []
+             case nameOfNode node of
+               Just n -> withDefTable (\dt -> (t, insertType dt n t))
+               Nothing -> return t
         where
-        (storagespec, attrs_decl, typequals, typespecs, inline) = partitionDeclSpecs declspecs
+        (storagespec, attrs_decl, typequals, typespecs, funspecs, alignspecs) = 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
+tType :: (MonadTrav m) => Bool -> NodeInfo -> [CTypeQual] -> TypeSpecAnalysis -> [CDerivedDeclr] -> [CDecl] -> m Type
+tType handle_sue_def top_node typequals canonTySpecs derived_declrs oldstyle_params
     = mergeOldStyle top_node oldstyle_params derived_declrs >>= buildType
     where
-    buildType [] = tDirectType handle_sue_def top_node typequals typespecs
+    buildType [] =
+        tDirectType handle_sue_def top_node typequals canonTySpecs
     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)
+    buildType (CFunDeclr (Right (params, isVariadic)) attrs node : dds)
+        = buildType dds >>= (liftM  (uncurry FunctionType) . buildFunctionType params isVariadic attrs node)
+    buildType (CFunDeclr (Left _) _ _ : _)
+        -- /FIXME/: this is really an internal error, not an AST error.
+        = astError top_node "old-style parameters remaining after mergeOldStyle"
     buildPointerType ptrquals _node inner_ty
         = liftM (\(quals,attrs) -> PtrType inner_ty quals attrs) (tTypeQuals ptrquals)
     buildArrayType arr_quals size _node inner_ty
@@ -187,19 +245,20 @@
         = 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'
+             attrs'  <- mapM tAttr attrs
+             return $ (\t -> (t,attrs')) $
+                case (map declType params',is_variadic) of
+                    ([],False) -> FunTypeIncomplete return_ty  -- may be improved later on
+                    ([DirectType TyVoid _ _],False) -> FunType return_ty [] False
+                    _ -> FunType return_ty params' is_variadic
 
 -- | 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
+tDirectType :: (MonadTrav m) =>
+               Bool -> NodeInfo -> [CTypeQual] -> TypeSpecAnalysis -> m Type
+tDirectType handle_sue_def node ty_quals canonTySpec = do
     (quals,attrs) <- tTypeQuals ty_quals
-    canonTySpec <- canonicalTypeSpec ty_specs
-    let baseType ty_name = DirectType ty_name quals
+    let baseType ty_name = DirectType ty_name quals attrs
     case canonTySpec of
         TSNone -> return$ baseType (TyIntegral TyInt)
         TSVoid -> return$ baseType TyVoid
@@ -211,13 +270,11 @@
                     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
+        TSTypeDef tdr -> return$ TypeDefType tdr quals attrs
+        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"
+        TSType t                             ->  mergeTypeAttributes node quals attrs t
+        TSNonBasic t -> astError node ("Unexpected typespec: " ++ show t)
 
 -- | Merge type attributes
 --
@@ -225,22 +282,22 @@
 --
 -- > /* tyqual attr typeof(type) */
 -- > const typeof(char volatile) x;
-mergeTypeAttributes :: (MonadTrav m) => NodeInfo -> TypeQuals -> [Attr] -> Type -> m Type
+mergeTypeAttributes :: (MonadCError 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
+        DirectType ty_name quals' attrs' -> merge quals' attrs' $ DirectType 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))
+        FunctionType fty attrs'
+             | quals /= noTypeQuals -> astError node_info "type qualifiers for function type"
+             | otherwise            -> return$ FunctionType fty (attrs' ++ attrs)
+        TypeDefType tdr quals' attrs'
+            -> merge quals' attrs' $ TypeDefType tdr
     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)
+typeDefRef :: (MonadCError m, MonadSymtab m) => NodeInfo -> Ident -> m TypeDefRef
+typeDefRef t_node name = lookupTypeDef name >>= \ty -> return (TypeDefRef name ty t_node)
 
 -- extract a struct\/union
 -- we emit @declStructUnion@ and @defStructUnion@ actions
@@ -256,9 +313,9 @@
     let decl = CompTypeRef sue_ref tag' node_info
     handleTagDecl (CompDecl decl)
     -- when handle_def is true, enter the definition
-    when (handle_def) $ do
+    when handle_def $
         maybeM member_decls_opt $ \decls ->
-                tCompType sue_ref tag' decls (attrs') node_info
+                tCompType sue_ref tag' decls attrs' node_info
             >>= (handleTagDef.CompDef)
     return decl
 
@@ -286,14 +343,15 @@
         = do sue_ref <- createSUERef node_info ident_opt
              attrs' <- mapM tAttr attrs
              let decl = EnumTypeRef sue_ref node_info
-             when handle_def $ do
+             when handle_def $
                  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 :: (MonadCError m, MonadSymtab m) =>
+             SUERef -> [(Ident, Maybe CExpr)] -> Attributes -> NodeInfo -> m EnumType
 tEnumType sue_ref enumerators attrs node = do
     mapM_ handleEnumeratorDef enumerators'
     return ty
@@ -303,24 +361,28 @@
     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 :: 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
+    intExpr i = CConst (CIntConst (cInteger i) undefNode)
+    offsExpr e offs = CBinary CAddOp e (intExpr offs) undefNode
 
 -- | 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 :: (MonadCError 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
+                                    | Unsigned <- sgn -> intType TyUChar
+                                    | otherwise       -> intType TyChar
         (intbase, _, NoSizeMod)  | optBase BaseInt intbase ->
             intType$ case sgn of
                             Unsigned -> TyUInt
                             _        -> TyInt
+        (intbase, _, NoSizeMod)  | optBase BaseInt128 intbase ->
+            intType$ case sgn of
+                            Unsigned -> TyUInt128
+                            _        -> TyInt128
         (intbase, signed, sizemod)    | optBase BaseInt intbase, optSign Signed signed ->
             intType$ case sizemod of ShortMod    -> TyShort
                                      LongMod     -> TyLong
@@ -334,6 +396,8 @@
         (BaseFloat, NoSignSpec, NoSizeMod)  -> floatType TyFloat
         (BaseDouble, NoSignSpec, NoSizeMod) -> floatType TyDouble
         (BaseDouble, NoSignSpec, LongMod)   -> floatType TyLDouble
+        (BaseBFloat16, NoSignSpec, NoSizeMod)   -> floatType TyBFloat16
+        (BaseFloatN n x, NoSignSpec, NoSizeMod) -> floatType (TyFloatN n x)
         -- TODO: error analysis
         (_,_,_)   -> error "Bad AST analysis"
     where
@@ -352,27 +416,33 @@
 
 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 (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 (CAtomicQual _) (tq,attrs) = return (tq { atomic = True },attrs)
     go (CAttrQual attr) (tq,attrs) = liftM (\attr' -> (tq,attr':attrs)) (tAttr attr)
-    go (CInlineQual node) (_tq,_attrs) = astError node "unexpected inline qualifier"
-
+    go (CNullableQual _) (tq,attrs) = return (tq { nullable = True }, attrs)
+    go (CNonnullQual _) (tq,attrs) = return (tq { nonnull = True }, attrs)
+    go (CClRdOnlyQual _) (tq,attrs) = return (tq { clrdonly = True },attrs)
+    go (CClWrOnlyQual _) (tq,attrs) = return (tq { clwronly = True },attrs)
 
 -- * analysis
 
 
 {-
 To canoicalize type specifiers, we define a canonical form:
-void | bool | (char|int|float|double) (signed|unsigned)? (long long?)? complex? | othertype
+void | bool | (char|int|int128|float|double|floatNx)? (signed|unsigned)? (long long?)? complex? | othertype
 -}
-data NumBaseType = NoBaseType | BaseChar | BaseInt | BaseFloat | BaseDouble deriving (Eq,Ord)
+data NumBaseType = NoBaseType | BaseChar | BaseInt | BaseInt128 | BaseFloat | BaseBFloat16 |
+                   BaseFloatN Int Bool | 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
+data TypeSpecAnalysis =
+  TSNone | TSVoid | TSBool | TSNum NumTypeSpec |
+  TSTypeDef TypeDefRef | TSType Type | TSNonBasic CTypeSpec
 
 canonicalTypeSpec :: (MonadTrav m) => [CTypeSpec] -> m TypeSpecAnalysis
 canonicalTypeSpec = foldrM go TSNone where
@@ -382,14 +452,21 @@
     updLongMod NoSizeMod = Just LongMod
     updLongMod LongMod   = Just LongLongMod
     updLongMod _         = Nothing
-    go (CVoidType _)    TSNone = return$  TSVoid
-    go (CBoolType _)    TSNone = return$  TSBool
+    go :: (MonadTrav m) => CTypeSpec -> TypeSpecAnalysis -> m TypeSpecAnalysis
+    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 (CInt128Type _)  tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa
+                            = return$  TSNum$ nts { base = BaseInt128 }
     go (CFloatType _)   tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa
                             = return$  TSNum$ nts { base = BaseFloat }
+    go (CBFloat16Type _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa
+                            = return$  TSNum$ nts { base = BaseBFloat16 }
+    go (CFloatNType n x _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa
+                            = return$  TSNum$ nts { base = BaseFloatN n x }
     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
@@ -403,15 +480,23 @@
                             = return$  TSNum$ nts { signSpec = Unsigned }
     go (CComplexType _) tsa | (Just nts@(NumTypeSpec { isComplex = False })) <- getNTS tsa
                             = return$  TSNum$ nts { isComplex = True }
+    go (CTypeDef i ni) TSNone = liftM TSTypeDef $ typeDefRef ni i
+    go (CTypeOfType d _ni) TSNone = liftM TSType $ analyseTypeDecl d
+    go (CTypeOfExpr e _) TSNone = liftM TSType $ tExpr [] RValue e
+    -- todo: atomic qualifier discarded
+    go (CAtomicType d _ni) TSNone = liftM TSType $ analyseTypeDecl d
     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 :: (MonadCError 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 (CAuto _) NoStorageSpec     = return AutoSpec
+        updStorage (CRegister _) NoStorageSpec = return RegSpec
+        updStorage (CThread _) NoStorageSpec   = return ThreadSpec
+        updStorage (CClKernel _) NoStorageSpec = return ClKernelSpec
+        updStorage (CClGlobal _) NoStorageSpec = return ClGlobalSpec
+        updStorage (CClLocal  _) NoStorageSpec = return ClLocalSpec
         updStorage (CThread _) (StaticSpec _)  = return$ StaticSpec True
         updStorage (CThread _) (ExternSpec _)  = return$ ExternSpec True
         updStorage (CStatic _) NoStorageSpec   = return$ StaticSpec False
@@ -437,7 +522,7 @@
 -- > 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 :: (MonadCError m) => NodeInfo -> [CDecl] -> [CDerivedDeclr] -> m [CDerivedDeclr]
 mergeOldStyle _node [] declrs = return declrs
 mergeOldStyle node oldstyle_params (CFunDeclr params attrs fdnode : dds) =
     case params of
@@ -447,9 +532,9 @@
             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)
+            unless (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)
@@ -458,59 +543,64 @@
                 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
+            let nInfo = nodeInfo param_name in
+            CDecl [CTypeSpec (CIntType nInfo)] [(Just (CDeclr (Just param_name) [] Nothing [] nInfo),Nothing,Nothing)] nInfo
+        showParamMap = intercalate ", " . 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,
+--   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 |] ]
+-- > [ [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 :: (MonadCError m) => CDecl -> m [CDecl]
+splitCDecl decl@(CStaticAssert _ _ _) = return [decl]
 splitCDecl decl@(CDecl declspecs declrs node) =
     case declrs of
         []      -> internalErr "splitCDecl applied to empty declaration"
-        [declr] -> return [decl]
+        -- single declarator, not need to split
+        [_declr] -> return [decl]
+        -- more than one declarator
         (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)
+            (CEnumType (CEnum name _def _attrs enum_node) node_info) ->
+                CTypeSpec (CEnumType (CEnum name Nothing [] enum_node) node_info)
+            (CSUType (CStruct tag name _def _attrs su_node) node_info) ->
+                CTypeSpec (CSUType (CStruct tag name Nothing [] su_node) node_info)
             _ -> declspec
     elideSUEDef declspec = declspec
 
 
 -- | translate @__attribute__@ annotations
 -- TODO: This is a unwrap and wrap stub
-tAttr :: (MonadTrav m) => CAttr -> m Attr
+tAttr :: (MonadCError m, MonadSymtab 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
+mkVarName :: (MonadCError m, MonadSymtab m) =>
+             NodeInfo -> Maybe Ident -> Maybe AsmName -> m VarName
+mkVarName  _node Nothing _ = return NoName
+mkVarName  _node (Just n) asm = return $ VarName n asm
 
 -- helpers
-nameOfDecl :: (MonadTrav m) => CDecl -> m Ident
+nameOfDecl :: (MonadCError m) => CDecl -> m Ident
 nameOfDecl d = getOnlyDeclr d >>= \declr ->
     case declr of
-        (CDeclr (Just name) _ _ _ _) -> return name
-        (CDeclr Nothing _ _ _ node) -> internalErr "nameOfDecl: abstract declarator"
+        (CDeclr (Just name) _ _ _ _node) -> 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 :: (MonadCError m) => CDecl -> m CDeclr
 getOnlyDeclr (CDecl _ [(Just declr,_,_)] _) = return declr
-getOnlyDeclr (CDecl _ _ node) = internalErr "getOnlyDeclr: declaration doesn't have a unique declarator"
+getOnlyDeclr (CDecl _ _ _node) = internalErr "getOnlyDeclr: declaration doesn't have a unique declarator"
+getOnlyDeclr (CStaticAssert _ _ _) = internalErr "getOnlyDeclr: static assertion doesn't have a unique declarator"
diff --git a/src/Language/C/Analysis/DefTable.hs b/src/Language/C/Analysis/DefTable.hs
--- a/src/Language/C/Analysis/DefTable.hs
+++ b/src/Language/C/Analysis/DefTable.hs
@@ -22,24 +22,25 @@
     DefTable(..),
     emptyDefTable,
     globalDefs,
+    inFileScope,
     enterFunctionScope,leaveFunctionScope,enterBlockScope,leaveBlockScope,
     enterMemberDecl,leaveMemberDecl,
     DeclarationStatus(..),declStatusDescr,
     defineTypeDef, defineGlobalIdent, defineScopedIdent, defineScopedIdentWhen,
     declareTag,defineTag,defineLabel,lookupIdent,
     lookupTag,lookupLabel,lookupIdentInner,lookupTagInner,
+    insertType, lookupType,
+    mergeDefTable
 )
 where
 import Language.C.Data
 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.IntMap (IntMap)
+import Data.IntMap (IntMap, union)
 import qualified Data.IntMap as IntMap
-import Data.Generics
+import Data.Data (Data)
 
 {- Name spaces, scopes and contexts [Scopes]
 
@@ -91,26 +92,30 @@
 -- | Table holding current definitions
 data DefTable = DefTable
     {
-        identDecls   :: NameSpaceMap Ident IdentEntry,    -- ^ declared `ordinary identifiers'
-        tagDecls   :: NameSpaceMap SUERef TagEntry,       -- ^ declared struct/union/enum  tags
+        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   :: IntMap Name                          -- ^ link names with definitions
+        refTable   :: IntMap Name,                         -- ^ link names with definitions
+        typeTable  :: IntMap Type
     }
 
 -- | empty definition table, with all name space maps in global scope
 emptyDefTable :: DefTable
-emptyDefTable = DefTable nameSpaceMap nameSpaceMap nameSpaceMap nameSpaceMap IntMap.empty
+emptyDefTable = DefTable nameSpaceMap nameSpaceMap nameSpaceMap nameSpaceMap IntMap.empty IntMap.empty
 
 -- | get the globally defined entries of a definition table
 globalDefs :: DefTable -> GlobalDecls
-globalDefs deftbl = Map.foldWithKey insertDecl (GlobalDecls e gtags e) (globalNames $ identDecls deftbl)
+globalDefs deftbl = Map.foldrWithKey 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) }
 
+inFileScope :: DefTable -> Bool
+inFileScope dt = not (hasLocalNames (identDecls dt) || hasLocalNames (labelDefs dt))
+
 leaveScope_ :: (Ord k) => NameSpaceMap k a -> NameSpaceMap k a
 leaveScope_ = fst . leaveScope
 
@@ -125,10 +130,9 @@
                         tagDecls = leaveScope_ (tagDecls deftbl)
                        }
 
--- | Enter function scope (and the corresponding block scope)
+-- | Enter function scope (AND the corresponding block scope)
 enterFunctionScope :: DefTable -> DefTable
-enterFunctionScope deftbl = enterLocalScope  $
-                          deftbl { labelDefs = enterNewScope (labelDefs deftbl) }
+enterFunctionScope deftbl = enterLocalScope  $ deftbl { labelDefs = enterNewScope (labelDefs deftbl) }
 
 -- | Leave function scope, and return the associated DefTable.
 --   Error if not in function scope.
@@ -137,11 +141,11 @@
 
 -- | Enter new block scope
 enterBlockScope :: DefTable -> DefTable
-enterBlockScope = enterLocalScope
+enterBlockScope deftbl = enterLocalScope $ deftbl { labelDefs = enterNewScope (labelDefs deftbl) }
 
 -- | Leave innermost block scope
 leaveBlockScope :: DefTable -> DefTable
-leaveBlockScope = leaveLocalScope
+leaveBlockScope deftbl = leaveLocalScope $ deftbl { labelDefs = leaveScope_ (labelDefs deftbl) }
 
 -- | Enter new member declaration scope
 enterMemberDecl :: DefTable -> DefTable
@@ -163,7 +167,7 @@
     | KeepDef t       -- ^ new def was discarded
     | Shadowed t      -- ^ new def shadows one in outer scope
     | KindMismatch t  -- ^ kind mismatch
-    deriving (Data,Typeable)
+    deriving (Data)
 declStatusDescr :: DeclarationStatus t -> String
 declStatusDescr NewDecl = "new"
 declStatusDescr (Redeclared _) = "redeclared"
@@ -202,6 +206,7 @@
         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 =
@@ -215,7 +220,7 @@
 defineTypeDef ident tydef deftbl =
   (defRedeclStatus compatIdentEntry (Left tydef) oldDecl, deftbl { identDecls = decls' })
   where
-  (decls', oldDecl) = defGlobal (identDecls deftbl) ident (Left tydef)
+  (decls', oldDecl) = defLocal (identDecls deftbl) ident (Left tydef)
 
 -- | declare\/define a global object\/function\/typeDef
 --
@@ -237,7 +242,7 @@
 --   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.
+--  @DifferentKindRedecl 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
@@ -254,7 +259,7 @@
                               = (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)
+    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)
@@ -273,8 +278,8 @@
     (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
+        Just fwd_decl@(Left _) | 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
@@ -303,4 +308,24 @@
 -- | lookup an identifier in the innermost scope
 lookupTagInner :: SUERef -> DefTable -> Maybe TagEntry
 lookupTagInner sue_ref deftbl = lookupInnermostScope (tagDecls deftbl) sue_ref
+
+-- | Record the type of a node.
+insertType :: DefTable -> Name -> Type -> DefTable
+insertType dt n t = dt { typeTable = IntMap.insert (nameId n) t (typeTable dt) }
+
+-- | Lookup the type of a node.
+lookupType :: DefTable -> Name -> Maybe Type
+lookupType dt n = IntMap.lookup (nameId n) (typeTable dt)
+
+-- | Merge two DefTables. If both tables contain an entry for a given
+--   key, they must agree on its value.
+mergeDefTable :: DefTable -> DefTable -> DefTable
+mergeDefTable (DefTable i1 t1 l1 m1 r1 tt1) (DefTable i2 t2 l2 m2 r2 tt2) =
+  DefTable
+  (mergeNameSpace i1 i2)
+  (mergeNameSpace t1 t2)
+  (mergeNameSpace l1 l2)
+  (mergeNameSpace m1 m2)
+  (union r1 r2)
+  (union tt1 tt2)
 
diff --git a/src/Language/C/Analysis/Export.hs b/src/Language/C/Analysis/Export.hs
--- a/src/Language/C/Analysis/Export.hs
+++ b/src/Language/C/Analysis/Export.hs
@@ -12,18 +12,74 @@
 -- Export 'SemRep' entities to 'AST' nodes.
 -----------------------------------------------------------------------------
 module Language.C.Analysis.Export (
+exportDeclr,
 exportType, exportTypeDecl, exportTypeSpec,
 exportTypeDef,
 exportCompType, exportCompTypeDecl, exportCompTypeRef,
 exportEnumType, exportEnumTypeDecl, exportEnumTypeRef,
+export,
 )
 where
-import Language.C.Data.Ident
-import Language.C.Data.Node
-import Language.C.Syntax.AST
-import Language.C.Analysis.SemRep
-import Data.Maybe
+import           Data.List
+import qualified Data.Map                   as Map
+import           Data.Maybe
+import           Language.C.Analysis.SemRep
+import           Language.C.Data.Ident
+import           Language.C.Data.Name       (nameId)
+import           Language.C.Data.Node
+import           Language.C.Syntax.AST
 
+
+-- | Export global declarations
+-- TODO: This does not export tags and type defs yet
+export :: GlobalDecls -> CTranslUnit
+export (GlobalDecls objs _tags _typedefs) = CTranslUnit (declarations ++ []) undefNode
+  where declarations = fmap exportIdentDecl (filterBuiltins $ Map.toList objs)
+        filterBuiltins = Prelude.filter noBuiltIns
+        noBuiltIns (idn, _) = let n = identToString idn
+                              in not ("__builtin" `isPrefixOf` n) &&
+                                  (n /= "__FUNCTION__") &&
+                                  (n /= "__PRETTY_FUNCTION__") &&
+                                  (n /= "__func__" )
+
+
+exportIdentDecl :: (Ident, IdentDecl) -> CExternalDeclaration NodeInfo
+exportIdentDecl (_, Declaration decl)   = CDeclExt $ exportDeclaration decl
+exportIdentDecl (_, FunctionDef fundef) = CFDefExt $ exportFunDef fundef
+exportIdentDecl (_, ObjectDef objdef)   = CDeclExt $ exportObject objdef
+exportIdentDecl (_, EnumeratorDef _)    = error "not implemented: enumerator definition"
+
+exportObject :: ObjDef -> CDeclaration NodeInfo
+exportObject d@(ObjDef _ mInit nInf) = CDecl specs' [(Just decl, mInit, Nothing)] nInf
+  where
+    (DeclAttrs _ _ attrs) = declAttrs d
+    specs                 = exportDeclarationSpecifiers (declAttrs d)
+    (specs', decl)        = exportDeclr specs (declType d) attrs (declName d)
+
+
+exportDeclaration :: Decl -> CDeclaration NodeInfo
+exportDeclaration d = CDecl specs' [(Just decl, Nothing, Nothing)] undefNode
+  where
+    (DeclAttrs _ _ attrs) = declAttrs d
+    specs                 = exportDeclarationSpecifiers (declAttrs d)
+    (specs', decl)        = exportDeclr specs (declType d) attrs (declName d)
+
+
+exportFunDef :: FunDef  -> CFunctionDef NodeInfo
+exportFunDef d@(FunDef _ stmt _) = CFunDef cDeclSpecs cDecl oldStyleParams stmt undefNode
+  where
+    (cDeclSpecs, cDecl) = exportDeclr specs (declType d) ([] :: Attributes) (declName d)
+    oldStyleParams= [] :: [CDeclaration NodeInfo] -- TODO:?
+    specs = exportDeclarationSpecifiers (declAttrs d):: [CDeclarationSpecifier NodeInfo]
+
+exportDeclarationSpecifiers :: DeclAttrs -> [CDeclarationSpecifier NodeInfo]
+exportDeclarationSpecifiers (DeclAttrs funcAttrs storage _attrs) = specifiers
+  where specifiers = (CFunSpec <$> exportFunAttrs funcAttrs) ++ (CStorageSpec <$> exportStorage storage)
+
+
+-- |Export Declarator
+--
+--  Synopsis: @exportDeclr other_specs type attributes variable-name@
 exportDeclr :: [CDeclSpec] -> Type -> Attributes -> VarName -> ([CDeclSpec],CDeclr)
 exportDeclr other_specs ty attrs name =
     (other_specs ++ specs, CDeclr ident derived asmname (exportAttrs attrs) ni)
@@ -47,21 +103,30 @@
   (declspecs,derived) = exportType ty
   declr = (Just $ CDeclr (Just ident) derived Nothing (exportAttrs attrs) ni, Nothing, Nothing)
 
+-- |Export a type to syntax
 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"
+  where
+    exportTy dd (PtrType ity tyquals attrs) =
+        let ptr_declr = CPtrDeclr (exportTypeQualsAttrs tyquals attrs) ni
+        in  exportTy (ptr_declr : dd) ity
+    exportTy dd (ArrayType ity array_sz tyquals attrs) =
+        let arr_declr = CArrDeclr (exportTypeQualsAttrs tyquals attrs) (exportArraySize array_sz) ni
+        in  exportTy (arr_declr : dd) ity
+    exportTy dd (FunctionType (FunType ity params variadic) attrs) =
+        let fun_declr = CFunDeclr (Right (map exportParamDecl params,variadic)) (exportAttrs attrs) ni
+        in  exportTy (fun_declr : dd) ity
+    exportTy dd (FunctionType (FunTypeIncomplete ity) attrs) =
+        let fun_declr = CFunDeclr (Right ([],False)) (exportAttrs attrs) ni
+        in  exportTy (fun_declr : dd) ity
+    exportTy dd (TypeDefType (TypeDefRef ty_ident _ node) quals attrs) =
+        let declspecs =   CTypeSpec (CTypeDef ty_ident node)
+                        : map CTypeQual (exportTypeQualsAttrs quals attrs)
+        in (declspecs, reverse dd)
+    exportTy dd (DirectType ity quals attrs) =
+        let declspecs =    map CTypeQual (exportTypeQualsAttrs quals attrs)
+                        ++ map CTypeSpec (exportTypeSpec ity)
+        in (declspecs, reverse dd)
 
 exportTypeQuals :: TypeQuals -> [CTypeQual]
 exportTypeQuals quals = mapMaybe select [(constant,CConstQual ni),(volatile,CVolatQual ni),(restrict,CRestrQual ni)]
@@ -73,19 +138,20 @@
 exportTypeQualsAttrs tyqs attrs = (exportTypeQuals tyqs ++ map CAttrQual (exportAttrs attrs))
 
 exportArraySize :: ArraySize -> CArrSize
-exportArraySize (ArraySize static e) = CArrSize static e
+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
+        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]
+        TyBuiltin TyAny    -> [CTypeDef (internalIdent "__ty_any") ni]
 
 exportIntType :: IntType -> [CTypeSpec]
 exportIntType ty =
@@ -98,6 +164,8 @@
       TyUShort  -> [CUnsigType ni, CShortType ni]
       TyInt     -> [CIntType ni]
       TyUInt    -> [CUnsigType ni, CIntType ni]
+      TyInt128  -> [CInt128Type ni]
+      TyUInt128 -> [CUnsigType ni, CInt128Type ni]
       TyLong    -> [CLongType ni]
       TyULong   -> [CUnsigType ni,CLongType ni]
       TyLLong   -> [CLongType ni, CLongType ni]
@@ -106,9 +174,11 @@
 exportFloatType :: FloatType -> [CTypeSpec]
 exportFloatType ty =
     case ty of
-      TyFloat   -> [CFloatType ni]
-      TyDouble  -> [CDoubleType ni]
-      TyLDouble -> [CLongType ni, CDoubleType ni]
+      TyFloat    -> [CFloatType ni]
+      TyDouble   -> [CDoubleType ni]
+      TyLDouble  -> [CLongType ni, CDoubleType ni]
+      TyBFloat16 -> [CBFloat16Type ni]
+      TyFloatN n x -> [CFloatNType n x ni]
 
 exportComplexType :: FloatType -> [CTypeSpec]
 exportComplexType ty = (CComplexType ni) : exportFloatType ty
@@ -149,8 +219,10 @@
 exportEnumTypeRef :: EnumType -> [CTypeSpec]
 exportEnumTypeRef (EnumType sue_ref _ _ node_info) = exportEnumTypeDecl (EnumTypeRef sue_ref node_info)
 
+-- XXX: relies on a the source program not having any $'s in it
 exportSUERef :: SUERef -> Maybe Ident
-exportSUERef = Just . internalIdent . show -- relies on a the source program not having any $'s in it
+exportSUERef (AnonymousRef name) = Just (internalIdent $ "$" ++ show (nameId name))
+exportSUERef (NamedRef ident) = Just ident
 
 exportMemberDecl :: MemberDecl -> CDecl
 exportMemberDecl (AnonBitField ty expr node_info) =
@@ -168,11 +240,18 @@
     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)
+exportDeclAttrs (DeclAttrs fun_attrs storage attrs) =
+       map CFunSpec (exportFunAttrs fun_attrs)
+    ++ map CStorageSpec (exportStorage storage)
     ++ map (CTypeQual . CAttrQual) (exportAttrs attrs)
 
+-- | export function attributes to C function specifiers
+exportFunAttrs :: FunctionAttrs -> [CFunSpec]
+exportFunAttrs fattrs = catMaybes [inlQual, noretQual]
+  where
+    inlQual = if isInline fattrs then Just (CInlineQual ni) else Nothing
+    noretQual = if isNoreturn fattrs then Just (CNoreturnQual ni) else Nothing
+
 -- | express storage in terms of storage specifiers.
 --
 -- This isn't always possible and depends on the context the identifier is declared.
@@ -184,21 +263,23 @@
 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 (Static NoLinkage _) = error "impossible storage: static without linkage"
 exportStorage (FunLinkage InternalLinkage) = [CStatic ni]
+exportStorage (FunLinkage ExternalLinkage) = []
+exportStorage (FunLinkage NoLinkage) = error "impossible storage: function without linkage"
 
 threadLocal :: Bool -> [CStorageSpec] -> [CStorageSpec]
 threadLocal False = id
-threadLocal True = ((CThread ni) :)
+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"
+fromDirectType (DirectType ty _ _)                   = ty
+fromDirectType (TypeDefType (TypeDefRef _ ty _) _ _) = fromDirectType ty
+fromDirectType _                                     = error "fromDirectType"
 
 ni :: NodeInfo
-ni = internalNode
+ni = undefNode
diff --git a/src/Language/C/Analysis/MachineDescs.hs b/src/Language/C/Analysis/MachineDescs.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Analysis/MachineDescs.hs
@@ -0,0 +1,119 @@
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE RecordWildCards #-}
+module Language.C.Analysis.MachineDescs
+  where
+
+import Language.C.Analysis.ConstEval
+import Language.C.Analysis.SemRep
+
+x86_64 :: MachineDesc
+x86_64 =
+  let iSize = \case
+        TyBool    -> 1
+        TyChar    -> 1
+        TySChar   -> 1
+        TyUChar   -> 1
+        TyShort   -> 2
+        TyUShort  -> 2
+        TyInt     -> 4
+        TyUInt    -> 4
+        TyLong    -> 8
+        TyULong   -> 8
+        TyLLong   -> 8
+        TyULLong  -> 8
+        TyInt128  -> 16
+        TyUInt128 -> 16
+      fSize = \case
+        TyFloat    -> 4
+        TyDouble   -> 8
+        TyLDouble  -> 16
+        TyBFloat16 -> error "TyBFloat16"
+        TyFloatN{} -> error "TyFloatN"
+      builtinSize = \case
+        TyVaList -> 24
+        TyAny    -> error "TyAny"
+      ptrSize  = 8
+      voidSize = 1
+      iAlign   = \case
+        TyBool    -> 1
+        TyChar    -> 1
+        TySChar   -> 1
+        TyUChar   -> 1
+        TyShort   -> 2
+        TyUShort  -> 2
+        TyInt     -> 4
+        TyUInt    -> 4
+        TyLong    -> 8
+        TyULong   -> 8
+        TyLLong   -> 8
+        TyULLong  -> 8
+        TyInt128  -> 16
+        TyUInt128 -> 16
+      fAlign = \case
+        TyFloat    -> 4
+        TyDouble   -> 8
+        TyLDouble  -> 16
+        TyBFloat16{} -> error "TyBFloat16"
+        TyFloatN{} -> error "TyFloatN"
+      builtinAlign = \case
+        TyVaList -> 8
+        TyAny    -> error "TyAny"
+      ptrAlign  = 8
+      voidAlign = 1
+  in  MachineDesc { .. }
+
+armv7l :: MachineDesc
+armv7l =
+  let iSize = \case
+        TyBool    -> 1
+        TyChar    -> 1
+        TySChar   -> 1
+        TyUChar   -> 1
+        TyShort   -> 2
+        TyUShort  -> 2
+        TyInt     -> 4
+        TyUInt    -> 4
+        TyLong    -> 4
+        TyULong   -> 4
+        TyLLong   -> 8
+        TyULLong  -> 8
+        TyInt128  -> error "TyInt128 on armv7l"
+        TyUInt128 -> error "TyUInt128 on armv7l"
+      fSize = \case
+        TyFloat    -> 4
+        TyDouble   -> 8
+        TyLDouble  -> 8
+        TyBFloat16 -> 2
+        TyFloatN{} -> error "TyFloatN"
+      builtinSize = \case
+        TyVaList -> 4
+        TyAny    -> error "TyAny"
+      ptrSize  = 4
+      voidSize = 1
+      iAlign   = \case
+        TyBool    -> 1
+        TyChar    -> 1
+        TySChar   -> 1
+        TyUChar   -> 1
+        TyShort   -> 2
+        TyUShort  -> 2
+        TyInt     -> 4
+        TyUInt    -> 4
+        TyLong    -> 4
+        TyULong   -> 4
+        TyLLong   -> 8
+        TyULLong  -> 8
+        TyInt128  -> error "TyInt128 on armv7l"
+        TyUInt128 -> error "TyUInt128 on armv7l"
+      fAlign = \case
+        TyFloat    -> 4
+        TyDouble   -> 8
+        TyLDouble  -> 8
+        TyBFloat16 -> 2
+        TyFloatN{} -> error "TyFloatN"
+      builtinAlign = \case
+        TyVaList -> 4
+        TyAny    -> error "TyAny"
+      ptrAlign  = 4
+      voidAlign = 1
+  in  MachineDesc { .. }
diff --git a/src/Language/C/Analysis/NameSpaceMap.hs b/src/Language/C/Analysis/NameSpaceMap.hs
--- a/src/Language/C/Analysis/NameSpaceMap.hs
+++ b/src/Language/C/Analysis/NameSpaceMap.hs
@@ -26,13 +26,14 @@
     enterNewScope, leaveScope,
     defLocal,
     lookupName,lookupGlobal,lookupInnermostScope,
+    mergeNameSpace
     )
 where
 import Prelude hiding (lookup)
 import qualified Prelude
-import qualified Data.Map as Map (empty, insert, lookup, toList)
+import qualified Data.Map as Map (empty, insert, lookup, toList, union)
+import qualified Data.List as List (unionBy)
 import Data.Map   (Map)
-import Language.C.Data.Ident     (Ident)
 
 {-
 C Namespaces and scopes:
@@ -119,14 +120,15 @@
 -- if there is one.
 lookupName :: (Ord k) => NameSpaceMap k a -> k -> Maybe a
 lookupName ns@(NsMap _ localDefs) ident
-    = case (lookupLocal localDefs) of
+    = 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
+    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
@@ -142,3 +144,16 @@
 --  @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
+
+-- | Merge two namespaces. If they disagree on the types of any
+--   variables, all bets are off.
+mergeNameSpace :: (Ord k) =>
+                  NameSpaceMap k a
+               -> NameSpaceMap k a
+               -> NameSpaceMap k a
+mergeNameSpace (NsMap global1 local1) (NsMap global2 local2) =
+  NsMap (Map.union global1 global2) (localUnion local1 local2)
+  where localUnion (l1:ls1) (l2:ls2) =
+          List.unionBy (\p1 p2 -> fst p1 == fst p2) l1 l2 : localUnion ls1 ls2
+        localUnion [] ls2 = ls2
+        localUnion ls1 [] = ls1
diff --git a/src/Language/C/Analysis/SemError.hs b/src/Language/C/Analysis/SemError.hs
--- a/src/Language/C/Analysis/SemError.hs
+++ b/src/Language/C/Analysis/SemError.hs
@@ -17,7 +17,6 @@
 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
@@ -28,17 +27,26 @@
 -- here are the errors available
 
 -- | InvalidASTError is caused by the violation of an invariant in the AST
-newtype InvalidASTError = InvalidAST ErrorInfo deriving (Typeable,Error)
+newtype InvalidASTError = InvalidAST ErrorInfo
 
+instance Error InvalidASTError where
+    errorInfo (InvalidAST ei) = ei
+    changeErrorLevel (InvalidAST ei) lvl' = InvalidAST (changeErrorLevel ei lvl')
+
 -- | BadSpecifierError is caused by an invalid combination of specifiers
-newtype BadSpecifierError = BadSpecifierError ErrorInfo deriving (Typeable,Error)
+newtype BadSpecifierError = BadSpecifierError ErrorInfo
 
+instance Error BadSpecifierError where
+    errorInfo (BadSpecifierError ei) = ei
+    changeErrorLevel (BadSpecifierError ei) lvl' = BadSpecifierError (changeErrorLevel ei lvl')
+
 -- | RedefError is caused by an invalid redefinition of the same identifier or type
-data RedefError = RedefError ErrorLevel RedefInfo deriving Typeable
+data RedefError = RedefError ErrorLevel RedefInfo
 
 data RedefInfo = RedefInfo String RedefKind NodeInfo NodeInfo
-data RedefKind = DuplicateDef | DiffKindRedecl | ShadowedDef
-data TypeMismatch = TypeMismatch String (NodeInfo,Type) (NodeInfo,Type) deriving Typeable
+data RedefKind = DuplicateDef | DiffKindRedecl | ShadowedDef | DisagreeLinkage |
+                 NoLinkageOld
+data TypeMismatch = TypeMismatch String (NodeInfo,Type) (NodeInfo,Type)
 
 -- Invalid AST
 -- ~~~~~~~~~~~
@@ -89,6 +97,8 @@
 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"
+redefErrReason (RedefInfo ident DisagreeLinkage _ _) = ident ++ " previously declared with different linkage"
+redefErrReason (RedefInfo ident NoLinkageOld _ _) = ident ++ " previously declared without linkage"
 
 prevDeclMsg :: NodeInfo -> [String]
 prevDeclMsg old_node = ["The previous declaration was here: ", show (posOfNode old_node)]
diff --git a/src/Language/C/Analysis/SemRep.hs b/src/Language/C/Analysis/SemRep.hs
--- a/src/Language/C/Analysis/SemRep.hs
+++ b/src/Language/C/Analysis/SemRep.hs
@@ -30,12 +30,12 @@
 VarDecl(..),
 -- * Declaration attributes
 DeclAttrs(..),isExtDecl,
+FunctionAttrs(..), functionAttrs, noFunctionAttrs,
 Storage(..),declStorage,ThreadLocal,Register,
-Linkage(..),
+Linkage(..),hasLinkage,declLinkage,
 -- * Types
 Type(..),
-FunType(..),isFunctionType,
-derefTypeDef,referencedType,hasTypeOfExpr,
+FunType(..),
 ArraySize(..),
 TypeDefRef(..),
 TypeName(..),BuiltinType(..),
@@ -46,21 +46,19 @@
 Enumerator(..),
 TypeQuals(..),noTypeQuals,mergeTypeQuals,
 -- * Variable names
-VarName(..),identOfVarName,AsmName,
+VarName(..),identOfVarName,isNoName,AsmName,
 -- * Attributes (STUB, not yet analyzed)
-Attr(..),Attributes,
+Attr(..),Attributes,noAttributes,mergeAttributes,
 -- * 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
+import Data.Maybe
+import Data.Data (Data)
 
 -- | accessor class : struct\/union\/enum names
 class HasSUERef a where
@@ -71,9 +69,9 @@
     compTag :: a -> CompTyKind
 
 -- | Composite type definitions (tags)
-data TagDef =  CompDef CompType	  --definition
-     	       | EnumDef EnumType      -- enum definition
-               deriving (Typeable, Data {-! CNode !-})
+data TagDef =  CompDef CompType  --composite definition
+             | EnumDef EnumType  --enum definition
+               deriving (Data {-! ,CNode !-}, Show)
 
 instance HasSUERef TagDef where
     sueRef (CompDef ct) = sueRef ct
@@ -112,10 +110,10 @@
 
 -- | 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 !-})
+                     | ObjectDef ObjDef           -- ^ object definition
+                     | FunctionDef FunDef         -- ^ function definition
+                     | EnumeratorDef Enumerator   -- ^ definition of an enumerator
+               deriving (Data {-! ,CNode !-}, Show)
 
 instance Declaration IdentDecl where
   getVarDecl (Declaration decl) = getVarDecl decl
@@ -138,7 +136,7 @@
                                                 ( 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))
+splitIdentDecls include_all = Map.foldrWithKey (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)
@@ -190,6 +188,10 @@
        -- ^ file-scope struct\/union\/enum event
      | DeclEvent IdentDecl
        -- ^ file-scope declaration or definition
+     | ParamEvent ParamDecl
+       -- ^ parameter declaration
+     | LocalEvent IdentDecl
+       -- ^ local variable declaration or definition
      | TypeDefEvent TypeDef
        -- ^ a type definition
      | AsmEvent AsmBlock
@@ -200,7 +202,7 @@
 
 -- | Declarations, which aren't definitions
 data Decl = Decl VarDecl NodeInfo
-            deriving (Typeable, Data {-! CNode !-})
+            deriving (Data {-! ,CNode !-}, Show)
 
 instance Declaration Decl where
     getVarDecl   (Decl vd _) =  vd
@@ -212,20 +214,20 @@
 -- 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 !-})
+             deriving (Data {-! ,CNode !-}, Show)
 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
+isTentative (ObjDef decl init_opt _) | isExtDecl decl = isNothing 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 !-})
+             deriving (Data {-! ,CNode !-}, Show)
 instance Declaration FunDef where
     getVarDecl (FunDef vd _ _) = vd
 
@@ -233,7 +235,7 @@
 -- | Parameter declaration
 data ParamDecl = ParamDecl VarDecl NodeInfo
                | AbstractParamDecl VarDecl NodeInfo
-    deriving (Typeable, Data {-! CNode !-} )
+    deriving (Data {-! ,CNode !-}, Show)
 
 instance Declaration ParamDecl where
   getVarDecl (ParamDecl vd _) = vd
@@ -244,17 +246,17 @@
                   -- ^ @MemberDecl vardecl bitfieldsize node@
                 | AnonBitField Type Expr NodeInfo
                   -- ^ @AnonBitField typ size@
-    deriving (Typeable, Data {-! CNode !-} )
+    deriving (Data {-! ,CNode !-}, Show)
 
 instance Declaration MemberDecl where
   getVarDecl (MemberDecl vd _ _) = vd
-  getVarDecl (AnonBitField ty _ _) = VarDecl NoName (DeclAttrs False NoStorage []) ty
+  getVarDecl (AnonBitField ty _ _) = VarDecl NoName (DeclAttrs noFunctionAttrs 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 !-} )
+               deriving (Data {-! ,CNode !-}, Show)
 
 -- | return the idenitifier of a @typedef@
 identOfTypeDef :: TypeDef -> Ident
@@ -262,7 +264,7 @@
 
 -- | Generic variable declarations
 data VarDecl = VarDecl VarName DeclAttrs Type
-              deriving (Typeable, Data)
+              deriving (Data, Show)
 
 instance Declaration VarDecl where
   getVarDecl = id
@@ -274,14 +276,26 @@
 -- | 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)
+data DeclAttrs = DeclAttrs FunctionAttrs Storage Attributes
+                 -- ^ @DeclAttrs fspecs storage attrs@
+               deriving (Data, Show)
 
 -- | get the 'Storage' of a declaration
 declStorage :: (Declaration d) => d -> Storage
 declStorage d = case declAttrs d of (DeclAttrs _ st _) -> st
 
+-- | get the `function attributes' of a declaration
+functionAttrs :: (Declaration d) => d -> FunctionAttrs
+functionAttrs d = case declAttrs d of (DeclAttrs fa _ _) -> fa
+
+-- Function attributes (inline, noreturn)
+data FunctionAttrs = FunctionAttrs { isInline :: Bool, isNoreturn :: Bool }
+  deriving (Eq, Ord, Data, Show)
+
+noFunctionAttrs :: FunctionAttrs
+noFunctionAttrs = FunctionAttrs { isInline = False, isNoreturn = False }
+
+
 -- In C we have
 --  Identifiers can either have internal, external or no linkage
 --  (same object everywhere, same object within the translation unit, unique).
@@ -297,75 +311,55 @@
 -- | 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)
+               | Static Linkage ThreadLocal -- ^ static storage, linkage spec and thread local specifier (gnu c)
                | FunLinkage Linkage         -- ^ function, either internal or external linkage
-               deriving (Typeable, Data, Show, Eq, Ord)
+               deriving (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)
+-- | Linkage: Either no linkage, internal to the translation unit or external
+data Linkage = NoLinkage | InternalLinkage | ExternalLinkage
+               deriving (Data, Show, Eq, Ord)
 
 -- | return @True@ if the object has linkage
 hasLinkage :: Storage -> Bool
-hasLinkage (Static _ _) = True
-hasLinkage _ = False
+hasLinkage (Auto _) = False
+hasLinkage (Static NoLinkage _) = False
+hasLinkage _ = True
 
+-- | Get the linkage of a definition
+declLinkage :: (Declaration d) => d -> Linkage
+declLinkage decl =
+    case declStorage decl of
+        NoStorage -> undefined
+        Auto _ -> NoLinkage
+        Static linkage _ -> linkage
+        FunLinkage linkage -> linkage
+
+
 -- * types
 
 -- | types of C objects
 data Type =
-       DirectType TypeName TypeQuals
+       DirectType TypeName TypeQuals Attributes
      -- ^ a non-derived type
      | PtrType Type TypeQuals Attributes
      -- ^ pointer type
      | ArrayType Type ArraySize TypeQuals Attributes
      -- ^ array type
-     | FunctionType FunType
+     | FunctionType FunType Attributes
      -- ^ function type
-     | TypeDefType TypeDefRef
+     | TypeDefType TypeDefRef TypeQuals Attributes
      -- ^ a defined type
-     | TypeOfExpr Expr
-     -- ^ (GNU) typeof (/broken/ and should be removed, but we do not yet have expression type analysis)
-     deriving (Typeable, Data)
+     deriving (Data, Show)
 
--- | Function types are of the form @FunType return-type params isVariadic attrs@.
+-- | Function types are of the form @FunType return-type params isVariadic@.
 --
 -- 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
+data FunType = FunType Type [ParamDecl] Bool
+            |  FunTypeIncomplete Type
+               deriving (Data, Show)
 
 -- | 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/.
@@ -374,7 +368,7 @@
                 -- ^ @UnknownArraySize is-starred@
                 | ArraySize Bool Expr
                 -- ^ @FixedSizeArray is-static size-expr@
-               deriving (Typeable, Data)
+               deriving (Data, Show)
 
 -- | normalized type representation
 data TypeName =
@@ -385,16 +379,17 @@
     | TyComp CompTypeRef
     | TyEnum EnumTypeRef
     | TyBuiltin BuiltinType
-    deriving (Typeable, Data)
+    deriving (Data, Show)
 
--- | Builtin type (va_list)
+-- | Builtin type (va_list, anything)
 data BuiltinType = TyVaList
-                   deriving (Typeable, Data)
+                 | TyAny
+                   deriving (Data, Show)
 
 -- | typdef references
 -- If the actual type is known, it is attached for convenience
-data TypeDefRef = TypeDefRef Ident (Maybe Type) NodeInfo
-               deriving (Typeable, Data {-! CNode !-})
+data TypeDefRef = TypeDefRef Ident Type NodeInfo
+               deriving (Data {-! ,CNode !-}, Show)
 
 -- | integral types (C99 6.7.2.2)
 data IntType =
@@ -406,11 +401,13 @@
     | TyUShort
     | TyInt
     | TyUInt
+    | TyInt128
+    | TyUInt128
     | TyLong
     | TyULong
     | TyLLong
     | TyULLong
-    deriving (Typeable, Data, Eq, Ord)
+    deriving (Data, Eq, Ord)
 
 instance Show IntType where
     show TyBool = "_Bool"
@@ -421,6 +418,8 @@
     show TyUShort = "unsigned short"
     show TyInt = "int"
     show TyUInt = "unsigned int"
+    show TyInt128 = "__int128"
+    show TyUInt128 = "unsigned __int128"
     show TyLong = "long"
     show TyULong = "unsigned long"
     show TyLLong = "long long"
@@ -431,38 +430,42 @@
       TyFloat
     | TyDouble
     | TyLDouble
-    deriving (Typeable, Data, Eq, Ord)
+    | TyBFloat16
+    | TyFloatN Int Bool
+    deriving (Data, Eq, Ord)
 
 instance Show FloatType where
     show TyFloat = "float"
     show TyDouble = "double"
     show TyLDouble = "long double"
+    show TyBFloat16 = "__bf16"
+    show (TyFloatN n x) = "_Float" ++ (show n) ++ (if x then "x" else "")
 
 -- | composite type declarations
 data CompTypeRef = CompTypeRef SUERef CompTyKind NodeInfo
-                    deriving (Typeable, Data {-! CNode !-})
+                    deriving (Data {-! ,CNode !-}, Show)
 
 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 !-})
+    deriving (Data {-! ,CNode !-}, Show)
 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 !-} )
+                 deriving (Data {-! ,CNode !-}, Show)
 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)
+typeOfCompDef (CompType ref tag _ _ _) = TyComp (CompTypeRef ref tag undefNode)
 
 -- | a tag to determine wheter we refer to a @struct@ or @union@, see 'CompType'.
 data CompTyKind =  StructTag
                  | UnionTag
-    deriving (Eq,Ord,Typeable,Data)
+    deriving (Eq,Ord,Data)
 
 instance Show CompTyKind where
     show StructTag = "struct"
@@ -471,35 +474,51 @@
 -- | Representation of C enumeration types
 data EnumType = EnumType SUERef [Enumerator] Attributes NodeInfo
                  -- ^ @EnumType name enumeration-constants attrs node@
-                 deriving (Typeable, Data {-! CNode !-} )
+                 deriving (Data {-! ,CNode !-}, Show)
 
 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)
+typeOfEnumDef (EnumType ref _ _ _) = TyEnum (EnumTypeRef ref undefNode)
 
 -- | 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 !-})
+                  deriving (Data {-! ,CNode !-}, Show)
 instance Declaration Enumerator where
   getVarDecl (Enumerator ide _ enumty _) =
     VarDecl
       (VarName ide Nothing)
-      (DeclAttrs False NoStorage [])
-      (DirectType (typeOfEnumDef enumty) noTypeQuals)
+      (DeclAttrs noFunctionAttrs NoStorage [])
+      (DirectType (typeOfEnumDef enumty) noTypeQuals noAttributes)
 
 -- | Type qualifiers: constant, volatile and restrict
-data TypeQuals = TypeQuals { constant :: Bool, volatile :: Bool, restrict :: Bool }
-    deriving (Typeable, Data)
+data TypeQuals = TypeQuals { constant :: Bool, volatile :: Bool,
+                             restrict :: Bool, atomic :: Bool,
+                             nullable :: Bool, nonnull  :: Bool,
+                             clrdonly :: Bool, clwronly :: Bool }
+    deriving (Data, Show)
 
+instance Eq TypeQuals where
+ (==) (TypeQuals c1 v1 r1 a1 n1 nn1 rd1 wr1) (TypeQuals c2 v2 r2 a2 n2 nn2 rd2 wr2) =
+    c1 == c2 && v1 == v2 && r1 == r2 && a1 == a2 && n1 == n2 && nn1 == nn2
+    && rd1 == rd2 && wr1 == wr2
+
+instance Ord TypeQuals where
+  (<=) (TypeQuals c1 v1 r1 a1 n1 nn1 rd1 wr1) (TypeQuals c2 v2 r2 a2 n2 nn2 rd2 wr2) =
+    c1 <= c2 && v1 <= v2 && r1 <= r2 && a1 <= a2 && n1 <= n2 && nn1 <= nn2
+    && rd1 <= rd2 && wr1 <= wr2
+
+
 -- | no type qualifiers
 noTypeQuals :: TypeQuals
-noTypeQuals = TypeQuals False False False
+noTypeQuals = TypeQuals False False False False False 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)
+mergeTypeQuals (TypeQuals c1 v1 r1 a1 n1 nn1 rd1 wr1) (TypeQuals c2 v2 r2 a2 n2 nn2 rd2 wr2) =
+  TypeQuals (c1 && c2) (v1 && v2) (r1 && r2) (a1 && a2) (n1 && n2) (nn1 && nn2)
+            (rd1 && rd2) (wr1 && wr2)
 
 -- * initializers
 
@@ -521,11 +540,15 @@
 -- | @VarName name assembler-name@ is a name of an declared object
 data VarName =  VarName Ident (Maybe AsmName)
               | NoName
-               deriving (Typeable, Data)
+               deriving (Data, Show)
 identOfVarName :: VarName -> Ident
 identOfVarName NoName            = error "identOfVarName: NoName"
 identOfVarName (VarName ident _) = ident
 
+isNoName :: VarName -> Bool
+isNoName NoName = True
+isNoName _ = False
+
 -- | Top level assembler block (alias for @CStrLit@)
 type AsmBlock = CStrLit
 
@@ -551,109 +574,115 @@
 --
 -- /TODO/: ultimatively, we want to parse attributes and represent them in a typed way
 data Attr = Attr Ident [Expr] NodeInfo
-            deriving (Typeable, Data {-! CNode !-})
+            deriving (Data {-! ,CNode !-}, Show)
 
 type Attributes = [Attr]
 
+-- |Empty attribute list
+noAttributes :: Attributes
+noAttributes = []
+
+-- |Merge attribute lists
+-- /TODO/: currently does not remove duplicates
+mergeAttributes :: Attributes -> Attributes -> Attributes
+mergeAttributes = (++)
+
 -- * 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
+-- GENERATED START
 
-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 TagDef where
+        nodeInfo (CompDef d) = nodeInfo d
+        nodeInfo (EnumDef d) = nodeInfo d
+instance Pos TagDef where
+        posOf x = posOf (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 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 = posOf (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 DeclEvent where
+        nodeInfo (TagEvent d) = nodeInfo d
+        nodeInfo (DeclEvent d) = nodeInfo d
+        nodeInfo (ParamEvent d) = nodeInfo d
+        nodeInfo (LocalEvent d) = nodeInfo d
+        nodeInfo (TypeDefEvent d) = nodeInfo d
+        nodeInfo (AsmEvent d) = nodeInfo d
+instance Pos DeclEvent where
+        posOf x = posOf (nodeInfo x)
 
-instance CNode Decl
-    where nodeInfo (Decl _ nodeinfo) = nodeinfo
-instance Pos Decl
-    where posOf x = posOfNode (nodeInfo x)
+instance CNode Decl where
+        nodeInfo (Decl _ n) = n
+instance Pos Decl where
+        posOf x = posOf (nodeInfo x)
 
-instance CNode ObjDef
-    where nodeInfo (ObjDef _ _ nodeinfo) = nodeinfo
-instance Pos ObjDef
-    where posOf x = posOfNode (nodeInfo x)
+instance CNode ObjDef where
+        nodeInfo (ObjDef _ _ n) = n
+instance Pos ObjDef where
+        posOf x = posOf (nodeInfo x)
 
-instance CNode FunDef
-    where nodeInfo (FunDef _ _ nodeinfo) = nodeinfo
-instance Pos FunDef
-    where posOf x = posOfNode (nodeInfo x)
+instance CNode FunDef where
+        nodeInfo (FunDef _ _ n) = n
+instance Pos FunDef where
+        posOf x = posOf (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 ParamDecl where
+        nodeInfo (ParamDecl _ n) = n
+        nodeInfo (AbstractParamDecl _ n) = n
+instance Pos ParamDecl where
+        posOf x = posOf (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 MemberDecl where
+        nodeInfo (MemberDecl _ _ n) = n
+        nodeInfo (AnonBitField _ _ n) = n
+instance Pos MemberDecl where
+        posOf x = posOf (nodeInfo x)
 
-instance CNode TypeDef
-    where nodeInfo (TypeDef _ _ _ nodeinfo) = nodeinfo
-instance Pos TypeDef
-    where posOf x = posOfNode (nodeInfo x)
+instance CNode TypeDef where
+        nodeInfo (TypeDef _ _ _ n) = n
+instance Pos TypeDef where
+        posOf x = posOf (nodeInfo x)
 
-instance CNode TypeDefRef
-    where nodeInfo (TypeDefRef _ _ nodeinfo) = nodeinfo
-instance Pos TypeDefRef
-    where posOf x = posOfNode (nodeInfo x)
+instance CNode TypeDefRef where
+        nodeInfo (TypeDefRef _ _ n) = n
+instance Pos TypeDefRef where
+        posOf x = posOf (nodeInfo x)
 
-instance CNode CompTypeRef
-    where nodeInfo (CompTypeRef _ _ nodeinfo) = nodeinfo
-instance Pos CompTypeRef
-    where posOf x = posOfNode (nodeInfo x)
+instance CNode CompTypeRef where
+        nodeInfo (CompTypeRef _ _ n) = n
+instance Pos CompTypeRef where
+        posOf x = posOf (nodeInfo x)
 
-instance CNode EnumTypeRef
-    where nodeInfo (EnumTypeRef _ nodeinfo) = nodeinfo
-instance Pos EnumTypeRef
-    where posOf x = posOfNode (nodeInfo x)
+instance CNode EnumTypeRef where
+        nodeInfo (EnumTypeRef _ n) = n
+instance Pos EnumTypeRef where
+        posOf x = posOf (nodeInfo x)
 
-instance CNode CompType
-    where nodeInfo (CompType _ _ _ _ nodeinfo) = nodeinfo
-instance Pos CompType
-    where posOf x = posOfNode (nodeInfo x)
+instance CNode CompType where
+        nodeInfo (CompType _ _ _ _ n) = n
+instance Pos CompType where
+        posOf x = posOf (nodeInfo x)
 
-instance CNode EnumType
-    where nodeInfo (EnumType _ _ _ nodeinfo) = nodeinfo
-instance Pos EnumType
-    where posOf x = posOfNode (nodeInfo x)
+instance CNode EnumType where
+        nodeInfo (EnumType _ _ _ n) = n
+instance Pos EnumType where
+        posOf x = posOf (nodeInfo x)
 
-instance CNode Enumerator
-    where nodeInfo (Enumerator _ _ _ nodeinfo) = nodeinfo
-instance Pos Enumerator
-    where posOf x = posOfNode (nodeInfo x)
+instance CNode Enumerator where
+        nodeInfo (Enumerator _ _ _ n) = n
+instance Pos Enumerator where
+        posOf x = posOf (nodeInfo x)
 
-instance CNode Attr
-    where nodeInfo (Attr _ _ nodeinfo) = nodeinfo
-instance Pos Attr
-    where posOf x = posOfNode (nodeInfo x)
+instance CNode Attr where
+        nodeInfo (Attr _ _ n) = n
+instance Pos Attr where
+        posOf x = posOf (nodeInfo x)
+-- GENERATED STOP
diff --git a/src/Language/C/Analysis/TravMonad.hs b/src/Language/C/Analysis/TravMonad.hs
--- a/src/Language/C/Analysis/TravMonad.hs
+++ b/src/Language/C/Analysis/TravMonad.hs
@@ -1,5 +1,6 @@
-{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances, FlexibleContexts,FlexibleInstances,
-             PatternSignatures, PatternGuards, RankNTypes, ScopedTypeVariables #-}
+{-# LANGUAGE MultiParamTypeClasses, FlexibleContexts,FlexibleInstances,
+             PatternGuards, RankNTypes, ScopedTypeVariables, LambdaCase #-}
+{-# OPTIONS_GHC -Wwarn=incomplete-uni-patterns #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Language.C.Analysis.TravMonad
@@ -16,6 +17,12 @@
 -- Furthermore, the user may provide callbacks to handle declarations and definitions.
 -----------------------------------------------------------------------------
 module Language.C.Analysis.TravMonad (
+    -- * Name generation monad
+    MonadName(..),
+    -- * Symbol table monad
+    MonadSymtab(..),
+    -- * Specialized C error-handling monad
+    MonadCError(..),
     -- * AST traversal monad
     MonadTrav(..),
     -- * Handling declarations
@@ -34,57 +41,71 @@
     hadHardErrors,handleTravError,throwOnLeft,
     astError, warn,
     -- * Trav - default MonadTrav implementation
-    Trav,
-    runTrav,runTrav_,
+    Trav, TravT,
+    runTravT, runTravTWithTravState, runTrav, runTrav_,
     TravState,initTravState,withExtDeclHandler,modifyUserState,userState,
+    getUserState,
+    TravOptions(..),modifyOptions,
     travErrors,
+    -- * Language options
+    CLanguage(..),
     -- * 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.Builtins
 import Language.C.Analysis.SemError
 import Language.C.Analysis.SemRep
+import Language.C.Analysis.TypeUtils (sameType)
 import Language.C.Analysis.DefTable hiding (enterBlockScope,leaveBlockScope,
                                             enterFunctionScope,leaveFunctionScope)
 import qualified Language.C.Analysis.DefTable as ST
 
+import Data.IntMap (insert)
 import Data.Maybe
-import Control.Monad(liftM)
+import Control.Applicative (Applicative(..))
+import Control.Monad (liftM, ap)
+import Control.Monad.Identity (Identity, runIdentity)
+import Control.Monad.State.Class (MonadState, get, put, modify, gets)
+import Control.Monad.Trans (MonadTrans, lift)
+import Control.Monad.IO.Class (MonadIO, liftIO)
+import Prelude hiding (Applicative(..), lookup)
 
--- | Traversal monad
-class (Monad m) => MonadTrav m where
+class (Monad m) => MonadName m where
+    -- | unique name generation
+    genName :: m Name
+
+class (Monad m) => MonadSymtab m where
+    -- symbol table handling
+    -- | return the definition table
+    getDefTable :: m DefTable
+    -- | perform an action modifying the definition table
+    withDefTable :: (DefTable -> (a, DefTable)) -> m a
+
+class (Monad m) => MonadCError 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)
+    -- | remember that an 'Error' occurred (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
-
+-- | Traversal monad
+class (MonadName m, MonadSymtab m, MonadCError m) => MonadTrav m where
     -- | 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 :: (MonadCError m, CNode t, CNode t1) => String -> t -> (DeclarationStatus t1) -> m ()
 checkRedef subject new_decl redecl_status =
     case redecl_status of
         NewDecl -> return ()
@@ -97,12 +118,12 @@
             -- 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
+-- | forward declaration of a tag. Only necessary for name analysis, but otherwise no semantic
 -- consequences.
-handleTagDecl :: (MonadTrav m) => TagFwdDecl -> m ()
+handleTagDecl :: (MonadCError m, MonadSymtab m) => TagFwdDecl -> m ()
 handleTagDecl decl = do
     redecl <- withDefTable $ declareTag (sueRef decl) decl
-    checkRedef (show $ sueRef decl) decl redecl
+    checkRedef (sueRefToString $ sueRef decl) decl redecl
 
 -- | define the given composite type or enumeration
 -- If there is a declaration visible, overwrite it with the definition.
@@ -111,82 +132,108 @@
 handleTagDef :: (MonadTrav m) => TagDef -> m ()
 handleTagDef def = do
     redecl <- withDefTable $ defineTag (sueRef def) def
-    checkRedef (show $ sueRef def) def redecl
+    checkRedef (sueRefToString $ sueRef def) def redecl
     handleDecl (TagEvent def)
 
-handleEnumeratorDef :: (MonadTrav m) => Enumerator ->  m ()
+handleEnumeratorDef :: (MonadCError m, MonadSymtab m) => Enumerator ->  m ()
 handleEnumeratorDef enumerator = do
     let ident = declIdent enumerator
     redecl <- withDefTable $ defineScopedIdent ident (EnumeratorDef enumerator)
-    checkRedef (show ident) ident redecl
+    checkRedef (identToString ident) ident redecl
     return ()
 
 handleTypeDef :: (MonadTrav m) => TypeDef -> m ()
-handleTypeDef typeDef@(TypeDef ident _ _ _) = do
+handleTypeDef typeDef@(TypeDef ident t1 _ _) = do
     redecl <- withDefTable $ defineTypeDef ident typeDef
-    checkRedef (show ident) typeDef redecl
+    -- C11 6.7/3 If an identifier has no linkage, there shall be no more than
+    -- one declaration of the identifier (in a declarator or type specifier)
+    -- with the same scope and in the same name space, except that: a typedef
+    -- name may be redefined to denote the same type as it currently does,
+    -- provided that type is not a variably modified type;
+    case redecl of
+      Redeclared (Left (TypeDef _ t2 _ _)) | sameType t1 t2 -> return ()
+      _ -> checkRedef (identToString 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 :: (MonadCError 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)
+  throwTravError $ redefinition lvl (identToString 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) =
+_checkIdentTyRedef :: (MonadCError 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) =
+_checkIdentTyRedef (Left tydef) (Redeclared old_def) =
   redefErr (identOfTypeDef tydef) LevelError tydef old_def DuplicateDef
-checkIdentTyRedef (Left _tydef) _ = return ()
+_checkIdentTyRedef (Left _tydef) _ = return ()
 
-checkVarRedef :: (MonadTrav m) => IdentDecl -> (DeclarationStatus IdentEntry) -> m ()
+-- Check whether it is ok to declare a variable already in scope
+checkVarRedef :: (MonadCError 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
+        -- Declaration referencing definition:
+        --   * new entry has to be a declaration
+        --   * old entry and new entry have to have linkage and agree on linkage
+        --   * types have to match
+        KeepDef (Right old_def) | not (agreeOnLinkage def old_def) -> linkageErr def old_def
+                                | otherwise -> throwOnLeft $ checkCompatibleTypes new_ty (declType old_def)
+        -- redefinition:
+        --   * old entry has to be a declaration or tentative definition
+        --   * old entry and new entry have to have linkage and agree on linkage
+        --   * types have to match
+        Redeclared (Right old_def) | not (agreeOnLinkage def old_def) -> linkageErr def old_def
+                                   | not(canBeOverwritten old_def) -> redefVarErr old_def DuplicateDef
+                                   | otherwise -> throwOnLeft $ checkCompatibleTypes new_ty (declType old_def)
         -- NewDecl/Shadowed is ok
         _ -> return ()
     where
     redefVarErr old_def kind = redefErr (declIdent def) LevelError def old_def kind
+    linkageErr new_def old_def =
+        case (declLinkage new_def, declLinkage old_def) of
+            (NoLinkage, _) -> redefErr (declIdent new_def) LevelError new_def old_def NoLinkageOld
+            _              -> redefErr (declIdent new_def) LevelError new_def old_def DisagreeLinkage
+
     new_ty = declType def
-    isTentativeG (Declaration _) = True
-    isTentativeG (ObjectDef od)  = isTentative od
-    isTentativeG _               = False
+    canBeOverwritten (Declaration _) = True
+    canBeOverwritten (ObjectDef od)  = isTentative od
+    canBeOverwritten _               = False
+    agreeOnLinkage new_def old_def
+        | declStorage old_def == FunLinkage InternalLinkage = True
+        | not (hasLinkage $ declStorage new_def) || not (hasLinkage $ declStorage old_def) = False
+        | (declLinkage new_def) /= (declLinkage old_def) = False
+        | otherwise = True
 
 -- | 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
+handleVarDecl :: (MonadTrav m) => Bool -> Decl -> m ()
+handleVarDecl is_local decl = do
     def <- enterDecl decl (const False)
-    handleDecl (DeclEvent def)
+    handleDecl ((if is_local then LocalEvent else 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. 
+-- 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
+handleParamDecl pd@(AbstractParamDecl _ _) = handleDecl (ParamEvent pd)
+handleParamDecl pd@(ParamDecl vardecl node) = do
     let def = ObjectDef (ObjDef vardecl Nothing node)
     redecl <- withDefTable $ defineScopedIdent (declIdent def) def
     checkVarRedef def redecl
-    return ()
+    handleDecl (ParamEvent pd)
 
 -- shared impl
-enterDecl :: (MonadTrav m) => Decl -> (IdentDecl -> Bool) -> m IdentDecl
+enterDecl :: (MonadCError m, MonadSymtab m) => Decl -> (IdentDecl -> Bool) -> m IdentDecl
 enterDecl decl cond = do
     let def = Declaration decl
     redecl <- withDefTable $
@@ -211,20 +258,20 @@
 checkCompatibleTypes _ _ = Right ()
 
 -- | handle object defintions (maybe tentative)
-handleObjectDef :: (MonadTrav m) => Ident -> ObjDef -> m ()
-handleObjectDef ident obj_def = do
+handleObjectDef :: (MonadTrav m) => Bool -> Ident -> ObjDef -> m ()
+handleObjectDef local ident obj_def = do
     let def = ObjectDef obj_def
     redecl <- withDefTable $
-              defineScopedIdentWhen (\o -> shouldOverride def o) ident def
+              defineScopedIdentWhen (shouldOverride def) ident def
     checkVarRedef def redecl
-    handleDecl (DeclEvent def)
+    handleDecl ((if local then LocalEvent else 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
+    shouldOverride def old | isDeclaration old = True
+                           | not (isTentativeDef def) = True
+                           | isTentativeDef old = True
+                           | otherwise = False
 
 -- * scope manipulation
 --
@@ -235,25 +282,25 @@
 --  * function scope: labels are visible within the entire function, and declared implicitely
 --
 --  * block scope
-updDefTable :: (MonadTrav m) => (DefTable -> DefTable) -> m ()
+updDefTable :: (MonadSymtab m) => (DefTable -> DefTable) -> m ()
 updDefTable f = withDefTable (\st -> ((),f st))
 
-enterPrototypeScope :: (MonadTrav m) => m ()
+enterPrototypeScope :: (MonadSymtab m) => m ()
 enterPrototypeScope = updDefTable (ST.enterBlockScope)
 
-leavePrototypeScope :: (MonadTrav m) => m ()
+leavePrototypeScope :: (MonadSymtab m) => m ()
 leavePrototypeScope = updDefTable (ST.leaveBlockScope)
 
-enterFunctionScope :: (MonadTrav m) => m ()
+enterFunctionScope :: (MonadSymtab m) => m ()
 enterFunctionScope = updDefTable (ST.enterFunctionScope)
 
-leaveFunctionScope :: (MonadTrav m) => m ()
+leaveFunctionScope :: (MonadSymtab m) => m ()
 leaveFunctionScope = updDefTable (ST.leaveFunctionScope)
 
-enterBlockScope :: (MonadTrav m) => m ()
+enterBlockScope :: (MonadSymtab m) => m ()
 enterBlockScope = updDefTable (ST.enterBlockScope)
 
-leaveBlockScope :: (MonadTrav m) => m ()
+leaveBlockScope :: (MonadSymtab m) => m ()
 leaveBlockScope = updDefTable (ST.leaveBlockScope)
 
 -- * Lookup
@@ -262,27 +309,42 @@
 -- 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 :: (MonadCError m, MonadSymtab 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
+        Nothing                             ->
+          astError (nodeInfo ident) $ "unbound typeDef: " ++ identToString ident
+        Just (Left (TypeDef def_ident ty _ _)) -> addRef ident def_ident >> return ty
         Just (Right d)                      -> astError (nodeInfo ident) (wrongKindErrMsg d)
     where
-    wrongKindErrMsg d = "wrong kind of object: excepcted typeDef but found: "++(objKindDescr d)
+    wrongKindErrMsg d = "wrong kind of object: expected typedef but found "++ (objKindDescr d)
+                        ++ " (for identifier `" ++ identToString ident ++ "')"
 
 
 -- | lookup an object, function or enumerator
-lookupObject :: (MonadTrav m) => Ident -> m (Maybe IdentDecl)
+lookupObject :: (MonadCError m, MonadSymtab 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
+        Right objdef -> addRef ident objdef >> return objdef
         Left _tydef  -> astError (nodeInfo ident) (mismatchErr "lookupObject" "an object" "a typeDef")
 
+-- | add link between use and definition (private)
+addRef :: (MonadCError m, MonadSymtab m, CNode u, CNode d) => u -> d -> m ()
+addRef use def =
+  case (nodeInfo use, nodeInfo def) of
+    (NodeInfo _ _ useName, NodeInfo _ _ defName) ->
+      withDefTable
+      (\dt ->
+         ((),
+          dt { refTable = insert (nameId useName) defName (refTable dt) }
+         )
+      )
+    (_, _) -> return () -- Don't have Names for both, so can't record.
 
+
 mismatchErr :: String -> String -> String -> String
 mismatchErr ctx expect found = ctx ++ ": Expected " ++ expect ++ ", but found: " ++ found
 
@@ -293,84 +355,91 @@
 -- 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 :: (MonadCError m, MonadSymtab 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 :: (MonadCError m) => m a -> m (Maybe a)
 handleTravError a = liftM Just a `catchTravError` (\e -> recordError e >> return Nothing)
 
--- | check wheter non-recoverable errors occured
+-- | check wheter non-recoverable errors occurred
 hadHardErrors :: [CError] -> Bool
-hadHardErrors = (not . null . filter isHardError)
+hadHardErrors = any isHardError
 
 -- | raise an error caused by a malformed AST
-astError :: (MonadTrav m) => NodeInfo -> String -> m a
+astError :: (MonadCError 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 :: (MonadCError 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 :: (Error e, MonadCError 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))
+newtype TravT s m a = TravT { unTravT :: TravState m s -> m (Either CError (a, TravState m s)) }
 
-runTrav :: forall s a. s -> Trav s a -> Either [CError] (a, TravState s)
-runTrav state traversal =
-    case unTrav action (initTravState state) of
+instance Monad m => MonadState (TravState m s) (TravT s m) where
+    get      = TravT (\s -> return (Right (s,s)))
+    put s    = TravT (\_ -> return (Right ((),s)))
+
+runTravT :: forall m s a. Monad m => s -> TravT s m a -> m (Either [CError] (a, TravState m s))
+runTravT state traversal =
+    runTravTWithTravState (initTravState state) $ do
+      withDefTable (const ((), builtins))
+      traversal
+
+runTravTWithTravState :: forall s m a. Monad m => TravState m s -> TravT s m a -> m (Either [CError] (a, TravState m s))
+runTravTWithTravState state traversal =
+    unTravT traversal state >>= pure . \case
         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 :: forall s a. s -> Trav s a -> Either [CError] (a, TravState Identity s)
+runTrav state traversal = runIdentity (runTravT state (unTrav traversal))
+
 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 :: Monad m => TravT s m a -> (DeclEvent -> TravT s m ()) -> TravT s m 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 Monad f => Functor (TravT s f) where
+    fmap = liftM
 
-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)
+instance Monad f => Applicative (TravT s f) where
+    pure x  = TravT (\s -> return (Right (x,s)))
+    (<*>) = ap
+
+instance Monad m => Monad (TravT s m) where
+    m >>= k   = TravT (\s -> unTravT m s >>= \y -> case y of
+                              Right (x,s1) -> unTravT (k x) s1
+                              Left e       -> return (Left e))
+
+instance MonadTrans (TravT s) where
+    lift m = TravT (\s -> (\x -> Right (x, s)) <$> m)
+
+instance MonadIO m => MonadIO (TravT s m) where
+    liftIO = lift . liftIO
+
+instance Monad m => MonadName (TravT s m) where
+    -- unique name generation
+    genName = generateName
+
+instance Monad m => MonadSymtab (TravT s m) where
     -- symbol table handling
     getDefTable = gets symbolTable
     withDefTable f = do
@@ -378,38 +447,68 @@
         let (r,symt') = f (symbolTable ts)
         put $ ts { symbolTable = symt' }
         return r
-    -- unique name generation
-    genName = generateName
+
+instance Monad m => MonadCError (TravT s m) where
+    -- error handling facilities
+    throwTravError e = TravT (\_ -> return (Left (toError e)))
+    catchTravError a handler = TravT (\s -> unTravT a s >>= \x -> case x of
+                                             Left e  -> unTravT (handler e) s
+                                             Right r -> return (Right r))
+    recordError e = modify $ \st -> st { rerrors = (rerrors st) `snoc` toError e }
+    getErrors = gets (RList.reverse . rerrors)
+
+instance Monad m => MonadTrav (TravT s m) where
     -- handling declarations and definitions
     handleDecl d = ($ d) =<< gets doHandleExtDecl
 
-data TravState s =
+type Trav s a = TravT s Identity a
+
+unTrav :: Trav s a -> TravT s Identity a
+unTrav = id
+
+-- | The variety of the C language to accept. Note: this is not yet enforced.
+data CLanguage = C89 | C99 | GNU89 | GNU99
+
+data TravOptions =
+    TravOptions {
+        language :: CLanguage
+    }
+
+data TravState m s =
     TravState {
         symbolTable :: DefTable,
         rerrors :: RList CError,
         nameGenerator :: [Name],
-        doHandleExtDecl :: (DeclEvent -> Trav s ()),
-        userState :: s
+        doHandleExtDecl :: (DeclEvent -> TravT s m ()),
+        userState :: s,
+        options :: TravOptions
       }
 
-travErrors :: TravState s -> [CError]
+travErrors :: TravState m s -> [CError]
 travErrors = RList.reverse . rerrors
 
-initTravState :: s -> TravState s
+initTravState :: Monad m => s -> TravState m s
 initTravState userst =
     TravState {
         symbolTable = emptyDefTable,
         rerrors = RList.empty,
         nameGenerator = newNameSupply,
         doHandleExtDecl = const (return ()),
-        userState = userst
+        userState = userst,
+        options = TravOptions { language = C99 }
       }
 
 -- * Trav specific operations
 modifyUserState :: (s -> s) -> Trav s ()
 modifyUserState f = modify $ \ts -> ts { userState = f (userState ts) }
 
-generateName :: Trav s Name
+getUserState :: Trav s s
+getUserState = userState `liftM` get
+
+modifyOptions :: (TravOptions -> TravOptions) -> Trav s ()
+modifyOptions f = modify $ \ts -> ts { options = f (options ts) }
+
+generateName :: Monad m => TravT s m Name
 generateName =
     get >>= \ts ->
     do let (new_name : gen') = nameGenerator ts
diff --git a/src/Language/C/Analysis/TypeCheck.hs b/src/Language/C/Analysis/TypeCheck.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Analysis/TypeCheck.hs
@@ -0,0 +1,443 @@
+{-# LANGUAGE FlexibleInstances, CPP #-}
+module Language.C.Analysis.TypeCheck where
+
+import Control.Monad
+import Data.Maybe
+import Language.C.Data.Ident
+import Language.C.Data.Node
+import Language.C.Data.Position
+import Language.C.Pretty
+import Language.C.Syntax.AST
+import Language.C.Syntax.Constants
+import Language.C.Syntax.Ops
+import Language.C.Analysis.DefTable
+import Language.C.Analysis.SemRep
+import Language.C.Analysis.TravMonad
+import Language.C.Analysis.TypeConversions
+import Language.C.Analysis.TypeUtils
+import Language.C.Analysis.Debug ()
+import Text.PrettyPrint.HughesPJ
+
+-- We used to re-implement and export the standard Either instance for
+-- Monad, which is bad, because as of GHC 7 it is in Control.Monad.Instances
+-- in base >4.2. For backwards compatibility with ghc-6.X, we use CPP here.
+#if __GLASGOW_HASKELL__ < 700
+instance Monad (Either String) where
+    return        = Right
+    Left  l >>= _ = Left l
+    Right r >>= k = k r
+    fail msg      = Left msg
+#endif
+
+pType :: Type -> String
+pType = render . pretty
+
+typeErrorOnLeft :: (MonadCError m) => NodeInfo -> Either String a -> m a
+typeErrorOnLeft ni (Left err) = typeError ni err
+typeErrorOnLeft _  (Right v)  = return v
+
+-- XXX: this should use a custom error type, but typeMismatch isn't always right
+typeError :: MonadCError m => NodeInfo -> String -> m a
+typeError = astError
+
+notFound :: Ident -> Either String a
+notFound i = Left $ "not found: " ++ identToString i
+
+checkScalar' :: MonadCError m => NodeInfo -> Type -> m ()
+checkScalar' ni = typeErrorOnLeft ni . checkScalar
+
+checkIntegral' :: MonadCError m => NodeInfo -> Type -> m ()
+checkIntegral' ni = typeErrorOnLeft ni . checkIntegral
+
+assignCompatible' :: MonadCError m =>
+                     NodeInfo -> CAssignOp -> Type -> Type -> m ()
+assignCompatible' ni op t1 t2 = typeErrorOnLeft ni (assignCompatible op t1 t2)
+
+binopType' :: MonadCError m =>
+              NodeInfo -> CBinaryOp -> Type -> Type -> m Type
+binopType' ni op t1 t2 = typeErrorOnLeft ni (binopType op t1 t2)
+
+conditionalType' :: MonadCError m => NodeInfo -> Type -> Type -> m Type
+conditionalType' ni t1 t2 = typeErrorOnLeft ni $ conditionalType t1 t2
+
+checkScalar :: Type -> Either String ()
+checkScalar t =
+  case canonicalType t of
+    DirectType _ _ _  -> Right ()
+    PtrType _ _ _     -> Right ()
+    ArrayType _ _ _ _ -> Right () -- because it's just a pointer
+    t' -> Left $
+          "expected scalar type, got: "
+          ++ pType t ++ " (" ++ pType t' ++ ")"
+
+checkIntegral :: Type -> Either String ()
+checkIntegral t | isIntegralType (canonicalType t) = Right ()
+                | otherwise = Left $
+                              "expected integral type, got: " ++
+                              pType t ++ " (" ++
+                              pType (canonicalType t) ++ ")"
+
+-- | Determine the type of a constant.
+constType :: (MonadCError m, MonadName m) => CConst -> m Type
+constType (CIntConst (CInteger _ _ flags) _) =
+  return $ DirectType (TyIntegral (getIntType flags)) noTypeQuals noAttributes
+constType (CCharConst (CChar _ True) _) =
+  return $ DirectType (TyIntegral TyInt) noTypeQuals noAttributes
+constType (CCharConst (CChar _ False) _) =
+  return $ DirectType (TyIntegral TyChar) noTypeQuals noAttributes
+constType (CCharConst (CChars _ _) _)  =
+  return $ DirectType (TyIntegral TyInt) noTypeQuals noAttributes -- XXX
+constType (CFloatConst (CFloat fs) _) =
+  return $ DirectType (TyFloating (getFloatType fs)) noTypeQuals noAttributes
+-- XXX: should strings have any type qualifiers or attributes?
+constType (CStrConst (CString chars wide) ni) =
+  do n <- genName
+     let charType | wide      = TyInt -- XXX: this isn't universal
+                  | otherwise = TyChar
+         ni' = mkNodeInfo (posOf ni) n
+         arraySize = ArraySize
+                     True -- XXX: is it static?
+                     (CConst
+                      (CIntConst
+                       (cInteger (toInteger (length chars))) ni'))
+     return $ ArrayType (DirectType (TyIntegral charType) noTypeQuals noAttributes)
+                        arraySize noTypeQuals []
+
+-- | Determine whether two types are compatible.
+compatible :: Type -> Type -> Either String ()
+compatible t1 t2 = void$ compositeType t1 t2
+
+-- | Determine the composite type of two compatible types.
+compositeType :: Type -> Type -> Either String Type
+compositeType t1 (DirectType (TyBuiltin TyAny) _ _) = Right t1
+compositeType (DirectType (TyBuiltin TyAny) _ _) t2 = Right t2
+compositeType t1@(DirectType tn1 q1 a1) t2@(DirectType tn2 q2 a2) =
+  do tn <- case (tn1, tn2) of
+             (TyVoid, TyVoid) -> Right TyVoid
+             (TyIntegral _, TyEnum _) -> Right tn1
+             (TyEnum _, TyIntegral _) -> Right tn2
+             (TyIntegral i1, TyIntegral i2) ->
+               Right $ TyIntegral (intConversion i1 i2)
+             (TyFloating f1, TyFloating f2) ->
+               Right $ TyFloating (floatConversion f1 f2)
+             (TyComplex f1, TyComplex f2) ->
+               Right $ TyComplex (floatConversion f1 f2)
+             (TyComp c1, TyComp c2) ->
+               do when (sueRef c1 /= sueRef c2) $
+                       Left $ "incompatible composite types: "
+                              ++ pType t1 ++ ", " ++ pType t2
+                  Right tn1
+             (TyEnum e1, TyEnum e2) ->
+               do when (sueRef e1 /= sueRef e2) $
+                       Left $ "incompatible enumeration types: "
+                              ++ pType t1 ++ ", " ++ pType t2
+                  Right $ TyEnum e1
+             (TyBuiltin TyVaList, TyBuiltin TyVaList) ->
+               Right $ TyBuiltin TyVaList
+             (_, _) -> Left $ "incompatible direct types: "
+                       ++ pType t1 ++ ", " ++ pType t2
+     Right $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2)
+compositeType (PtrType t1 q1 a1) (PtrType (DirectType TyVoid _ _) q2 _) =
+  Right $ PtrType t1 (mergeTypeQuals q1 q2) a1
+compositeType (PtrType (DirectType TyVoid _ _) q1 _) (PtrType t2 q2 a2) =
+  Right $ PtrType t2 (mergeTypeQuals q1 q2) a2
+compositeType (PtrType t1 q1 a1) t2 | isIntegralType t2 =
+  Right $ PtrType t1 (mergeTypeQuals q1 (typeQuals t2)) a1
+compositeType t1 (PtrType t2 q2 a2) | isIntegralType t1 =
+  Right $ PtrType t2 (mergeTypeQuals (typeQuals t1) q2) a2
+compositeType (ArrayType t1 _sz1 q1 a1) t2 | isIntegralType t2 =
+  Right $ PtrType t1 q1 a1
+compositeType t1 (ArrayType t2 _sz2 q2 a2) | isIntegralType t1 =
+  Right $ PtrType t2 q2 a2
+compositeType (ArrayType t1 s1 q1 a1) (ArrayType t2 s2 q2 a2) =
+  do t <- compositeType t1 t2
+     s <- compositeSize s1 s2
+     let quals = mergeTypeQuals q1 q2
+         attrs = mergeAttrs a1 a2
+     Right (ArrayType t s quals attrs)
+compositeType t1 t2 | isPointerType t1 && isPointerType t2 =
+  do t <- compositeType (baseType t1) (baseType t2)
+     let quals = mergeTypeQuals (typeQuals t1) (typeQuals t2)
+         attrs = mergeAttrs (typeAttrs t1) (typeAttrs t2)
+     Right (PtrType t quals attrs)
+compositeType (TypeDefType tdr1 _q1 _a1) (TypeDefType tdr2 _q2 _a2) =
+  case (tdr1, tdr2) of
+    (TypeDefRef _ t1 _, TypeDefRef _ t2 _) ->
+      compositeType t1 t2
+compositeType (FunctionType ft1 attrs1) (FunctionType ft2 attrs2) =
+  case (ft1, ft2) of
+    (FunType rt1 args1 varargs1, FunType rt2 args2 varargs2) ->
+      do {- when (length args1 /= length args2) $
+              Left "different numbers of arguments in function types" -}
+         args <- zipWithM compositeParamDecl args1 args2
+         when (varargs1 /= varargs2) $
+              Left "incompatible varargs declarations"
+         doFunType rt1 rt2 args varargs1
+    (FunType rt1 args1 varargs1, FunTypeIncomplete rt2) ->
+      doFunType rt1 rt2 args1 varargs1
+    (FunTypeIncomplete rt1, FunType rt2 args2 varargs2) ->
+      doFunType rt1 rt2 args2 varargs2
+    (FunTypeIncomplete rt1, FunTypeIncomplete rt2) ->
+      do rt <- compositeType rt1 rt2
+         Right (FunctionType (FunTypeIncomplete rt) (mergeAttrs attrs1 attrs2))
+  where doFunType rt1 rt2 args varargs =
+          do rt <- compositeType rt1 rt2
+             Right (FunctionType
+                     (FunType rt args varargs)
+                     (mergeAttrs attrs1 attrs2))
+compositeType t1 t2 = Left $ "incompatible types: "
+                         ++ pType t1 ++ ", " ++ pType t2
+
+-- XXX: this may not be correct
+compositeSize :: ArraySize -> ArraySize -> Either String ArraySize
+compositeSize (UnknownArraySize _) s2 = Right s2
+compositeSize s1 (UnknownArraySize _) = Right s1
+compositeSize (ArraySize s1 e1) (ArraySize s2 e2)
+  | s1 == s2 && sizeEqual e1 e2 = Right $ ArraySize s1 e1
+  | otherwise = Right $ ArraySize s1 e1
+{-
+    fail $ "incompatible array sizes: "
+           ++ (render . pretty) e1 ++ ", " ++ (render . pretty) e2
+-}
+
+sizeEqual :: CExpr -> CExpr -> Bool
+sizeEqual (CConst (CIntConst i1 _)) (CConst (CIntConst i2 _)) = i1 == i2
+sizeEqual e1 e2 = nodeInfo e1 == nodeInfo e2
+
+mergeAttrs :: Attributes -> Attributes -> Attributes
+mergeAttrs = (++) -- XXX: ultimately this should be smarter
+
+compositeParamDecl :: ParamDecl -> ParamDecl -> Either String ParamDecl
+compositeParamDecl (ParamDecl vd1 ni1) (ParamDecl vd2 _) =
+  compositeParamDecl' ParamDecl vd1 vd2 ni1
+compositeParamDecl (AbstractParamDecl vd1 _) (ParamDecl vd2 ni2) =
+  compositeParamDecl' ParamDecl vd1 vd2 ni2
+compositeParamDecl (ParamDecl vd1 ni1) (AbstractParamDecl vd2 _) =
+  compositeParamDecl' ParamDecl vd1 vd2 ni1
+compositeParamDecl (AbstractParamDecl vd1 ni1) (AbstractParamDecl vd2 _) =
+  compositeParamDecl' AbstractParamDecl vd1 vd2 ni1
+
+compositeParamDecl' :: (VarDecl -> NodeInfo -> ParamDecl)
+                    -> VarDecl
+                    -> VarDecl
+                    -> NodeInfo
+                    -> Either String ParamDecl
+compositeParamDecl' f (VarDecl n1 attrs1 t1) (VarDecl n2 attrs2 t2) dni =
+  do vd <- compositeVarDecl (VarDecl n1 attrs1 t1') (VarDecl n2 attrs2 t2')
+     Right $ f vd dni
+  where t1' = canonicalType t1
+        t2' = canonicalType t2
+
+compositeVarDecl :: VarDecl -> VarDecl -> Either String VarDecl
+compositeVarDecl (VarDecl n1 attrs1 t1) (VarDecl _ attrs2 t2) =
+  do t <- compositeType t1 t2
+     Right (VarDecl n1 (compositeDeclAttrs attrs1 attrs2) t)
+
+-- XXX: bad treatement of inline and storage
+compositeDeclAttrs :: DeclAttrs -> DeclAttrs -> DeclAttrs
+compositeDeclAttrs (DeclAttrs inl stor attrs1) (DeclAttrs _ _ attrs2) =
+  DeclAttrs inl stor (mergeAttrs attrs1 attrs2)
+
+castCompatible :: Type -> Type -> Either String ()
+castCompatible t1 t2 =
+  case (canonicalType t1, canonicalType t2) of
+    (DirectType TyVoid _ _, _) -> Right ()
+    (_, _) -> checkScalar t1 >> checkScalar t2
+
+-- | Determine whether two types are compatible in an assignment expression.
+assignCompatible :: CAssignOp -> Type -> Type -> Either String ()
+assignCompatible CAssignOp t1 t2 =
+  case (canonicalType t1, canonicalType t2) of
+    (DirectType (TyBuiltin TyAny) _ _, _) -> Right ()
+    (_, DirectType (TyBuiltin TyAny) _ _) -> Right ()
+    -- XXX: check qualifiers
+    (PtrType (DirectType TyVoid _ _) _ _, t2') | isPointerType t2' -> Right ()
+    -- XXX: check qualifiers
+    (t1', PtrType (DirectType TyVoid _ _) _ _) | isPointerType t1' -> Right ()
+    (PtrType _ _ _, t2') | isIntegralType t2' -> Right ()
+    (t1', t2') | isPointerType t1' && isPointerType t2' ->
+                 compatible (baseType t1') (baseType t2')
+                --unless (typeQuals t2 <= typeQuals t1) $
+                --       Left $
+                --       "incompatible qualifiers in pointer assignment: "
+                --       ++ pType t1 ++ ", " ++ pType t2
+    (DirectType (TyComp c1) _ _, DirectType (TyComp c2) _ _)
+      | sueRef c1 == sueRef c2 -> Right ()
+      | otherwise -> Left $
+                     "incompatible compound types in assignment: "
+                     ++ pType t1 ++ ", " ++ pType t2
+    (DirectType (TyBuiltin TyVaList) _ _, DirectType (TyBuiltin TyVaList) _ _) ->
+      Right ()
+    (DirectType tn1 _ _, DirectType tn2 _ _)
+      | isJust (arithmeticConversion tn1 tn2) -> Right ()
+      | otherwise -> Left $ "incompatible direct types in assignment: "
+                     ++ pType t1 ++ ", " ++ pType t2
+    (t1', t2') -> compatible t1' t2'
+assignCompatible op t1 t2 = void$ binopType (assignBinop op) t1 t2
+
+-- | Determine the type of a binary operation.
+binopType :: CBinaryOp -> Type -> Type -> Either String Type
+binopType op t1 t2 =
+  case (op, canonicalType t1, canonicalType t2) of
+    (_, t1', t2')
+      | isLogicOp op ->
+        checkScalar t1' >> checkScalar t2' >> Right boolType
+      | isCmpOp op ->
+        case (t1', t2') of
+          (DirectType tn1 _ _, DirectType tn2 _ _) ->
+                case arithmeticConversion tn1 tn2 of
+                  Just _ -> Right boolType
+                  Nothing -> Left $ render $
+                             text "incompatible arithmetic types in comparison: "
+                             <+> pretty t1 <+> text "and" <+> pretty t2
+          (PtrType (DirectType TyVoid _ _) _ _, _)
+            | isPointerType t2' -> Right boolType
+          (_, PtrType (DirectType TyVoid _ _) _ _)
+            | isPointerType t1' -> Right boolType
+          (_, _)
+            | isPointerType t1' && isIntegralType t2' -> Right boolType
+            | isIntegralType t1' && isPointerType t2' -> Right boolType
+            | isPointerType t1' && isPointerType t2' ->
+              compatible t1' t2' >> Right boolType
+          (_, _) -> Left "incompatible types in comparison"
+    (CSubOp, ArrayType t1' _ _ _, ArrayType t2' _ _ _) ->
+      compatible t1' t2' >> Right ptrDiffType
+    (CSubOp, ArrayType t1' _ _ _, PtrType t2' _ _) ->
+      compatible t1' t2' >> Right ptrDiffType
+    (CSubOp, PtrType t1' _ _, ArrayType t2' _ _ _) ->
+      compatible t1' t2' >> Right ptrDiffType
+    (CSubOp, PtrType t1' _ _, PtrType t2' _ _) ->
+      compatible t1' t2' >> Right ptrDiffType
+    (_, PtrType _ _ _, t2')
+      | isPtrOp op && isIntegralType t2' -> Right t1
+      | otherwise -> Left $ "invalid pointer operation: " ++ render (pretty op)
+    (CAddOp, t1', PtrType _ _ _) | isIntegralType t1' -> Right t2
+    (_, ArrayType _ _ _ _, t2')
+      | isPtrOp op && isIntegralType t2' -> Right t1
+      | otherwise -> Left $ "invalid pointer operation: " ++ render (pretty op)
+    (CAddOp, t1', ArrayType _ _ _ _) | isIntegralType t1' -> Right t2
+    (_, DirectType tn1 q1 a1, DirectType tn2 q2 a2) ->
+        do when (isBitOp op) (checkIntegral t1 >> checkIntegral t2)
+           case arithmeticConversion tn1 tn2 of
+             Just tn -> Right $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2)
+             Nothing -> Left $ render $
+                        text "invalid binary operation:" <+> pretty t1 <+> pretty op <+> pretty t2
+    (_, _, _) -> Left $ render $
+                 text "unhandled binary operation:" <+> pretty t1 <+> pretty op <+> pretty t2
+
+-- | Determine the type of a conditional expression.
+conditionalType :: Type -> Type -> Either String Type
+conditionalType t1 t2 =
+  case (canonicalType t1, canonicalType t2) of
+    (PtrType (DirectType TyVoid _ _) _ _, t2') | isPointerType t2' -> Right t2
+    (t1', PtrType (DirectType TyVoid _ _) _ _) | isPointerType t1' -> Right t1
+    (ArrayType t1' _ q1 a1, ArrayType t2' _ q2 a2) ->
+      do t <- compositeType t1' t2'
+         Right $ ArrayType t (UnknownArraySize False)
+                  (mergeTypeQuals q1 q2) (mergeAttrs a1 a2)
+    (t1'@(DirectType tn1 q1 a1), t2'@(DirectType tn2 q2 a2)) ->
+      case arithmeticConversion tn1 tn2 of
+        Just tn -> Right $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2)
+        Nothing -> compositeType t1' t2'
+    (t1', t2') -> compositeType t1' t2'
+
+derefType :: Type -> Either String Type
+derefType (PtrType t _ _) = Right t
+derefType (ArrayType t _ _ _) = Right t
+derefType t =
+  -- XXX: is it good to use canonicalType here?
+  case canonicalType t of
+    PtrType t' _ _ -> Right t'
+    ArrayType t' _ _ _ -> Right t'
+    _ -> Left $ "dereferencing non-pointer: " ++ pType t
+
+varAddrType :: IdentDecl -> Either String Type
+varAddrType d =
+  do case declStorage d of
+       Auto True -> Left "address of register variable"
+       _         -> Right ()
+     case t of
+       ArrayType _ _ q a -> Right $ PtrType t q a
+       _                 -> Right $ simplePtr t
+  where t = declType d
+
+-- | Get the type of field @m@ of type @t@
+fieldType :: (MonadCError m, MonadSymtab m) => NodeInfo -> Ident -> Type -> m Type
+fieldType ni m t =
+  case canonicalType t of
+    DirectType (TyComp ctr) _ _ ->
+      do td <- lookupSUE ni (sueRef ctr)
+         ms <- tagMembers ni td
+         case lookup m ms of
+           Just ft -> return ft
+           Nothing -> typeError ni $ "field not found: " ++ identToString m
+    _t' -> astError ni $
+          "field of non-composite type: " ++ identToString m
+          ++ ", " ++ pType t
+
+-- | Get all members of a struct, union, or enum, with their
+--   types. Collapse fields of anonymous members.
+tagMembers :: (MonadCError m, MonadSymtab m) =>
+              NodeInfo -> TagDef -> m [(Ident, Type)]
+tagMembers ni td =
+  case td of
+    CompDef (CompType _ _ ms _ _) -> getMembers ms
+    EnumDef (EnumType _ es _ _) -> getMembers es
+  where getMembers ds =
+          do let ts = map declType ds
+                 ns = map declName ds
+             concat `liftM` mapM (expandAnonymous ni) (zip ns ts)
+
+-- | Expand an anonymous composite type into a list of member names
+--   and their associated types.
+expandAnonymous :: (MonadCError m, MonadSymtab m) =>
+                   NodeInfo -> (VarName, Type)
+                -> m [(Ident, Type)]
+expandAnonymous ni (NoName, DirectType (TyComp ctr) _ _) =
+  lookupSUE ni (sueRef ctr) >>= tagMembers ni
+expandAnonymous _ (NoName, _) = return []
+expandAnonymous _ (VarName n _, t) = return [(n, t)]
+
+lookupSUE :: (MonadCError m, MonadSymtab m) =>
+             NodeInfo -> SUERef -> m TagDef
+lookupSUE ni sue =
+  do dt <- getDefTable
+     case lookupTag sue dt of
+       Just (Right td) -> return td
+       _               ->
+         typeError ni $ "unknown composite type: " ++ (render . pretty) sue
+
+deepTypeAttrs :: (MonadCError m, MonadSymtab m) =>
+                 Type -> m Attributes
+deepTypeAttrs (DirectType (TyComp (CompTypeRef sue _ ni)) _ attrs) =
+  (attrs ++) `liftM` sueAttrs ni sue
+deepTypeAttrs (DirectType (TyEnum (EnumTypeRef sue ni)) _ attrs) =
+  (attrs ++) `liftM` sueAttrs ni sue
+deepTypeAttrs (DirectType _ _ attrs) = return attrs
+deepTypeAttrs (PtrType t _ attrs) = (attrs ++) `liftM` deepTypeAttrs t
+deepTypeAttrs (ArrayType t _ _ attrs) = (attrs ++) `liftM` deepTypeAttrs t
+deepTypeAttrs (FunctionType (FunType t _ _) attrs) =
+  (attrs ++) `liftM` deepTypeAttrs t
+deepTypeAttrs (FunctionType (FunTypeIncomplete t)  attrs) =
+  (attrs ++) `liftM` deepTypeAttrs t
+deepTypeAttrs (TypeDefType (TypeDefRef i _ ni) _ attrs) =
+  (attrs ++) `liftM` typeDefAttrs ni i
+
+typeDefAttrs :: (MonadCError m, MonadSymtab m) =>
+                NodeInfo -> Ident -> m Attributes
+typeDefAttrs ni i =
+  do dt <- getDefTable
+     case lookupIdent i dt of
+       Nothing -> astError ni $ "can't find typedef name: " ++ identToString i
+       Just (Left (TypeDef _ t attrs _)) -> (attrs ++) `liftM` deepTypeAttrs t
+       Just (Right _) -> astError ni $ "not a typedef name: " ++ identToString i
+
+sueAttrs :: (MonadCError m, MonadSymtab m) =>
+            NodeInfo -> SUERef -> m Attributes
+sueAttrs ni sue =
+  do dt <- getDefTable
+     case lookupTag sue dt of
+       Nothing -> astError ni $ "SUE not found: " ++ render (pretty sue)
+       Just (Left _) -> return []
+       Just (Right (CompDef (CompType _ _ _ attrs _))) -> return attrs
+       Just (Right (EnumDef (EnumType _ _ attrs _))) -> return attrs
diff --git a/src/Language/C/Analysis/TypeConversions.hs b/src/Language/C/Analysis/TypeConversions.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Analysis/TypeConversions.hs
@@ -0,0 +1,39 @@
+module Language.C.Analysis.TypeConversions (
+    arithmeticConversion,
+    floatConversion,
+    intConversion
+) where
+
+import Language.C.Analysis.SemRep
+
+-- | For an arithmetic operator, if the arguments are of the given
+--   types, return the type of the full expression.
+arithmeticConversion :: TypeName -> TypeName -> Maybe TypeName
+-- XXX: I'm assuming that double `op` complex float = complex
+-- double. The standard seems somewhat unclear on whether this is
+-- really the case.
+arithmeticConversion (TyComplex t1) (TyComplex t2) =
+  Just $ TyComplex $ floatConversion t1 t2
+arithmeticConversion (TyComplex t1) (TyFloating t2) =
+  Just $ TyComplex $ floatConversion t1 t2
+arithmeticConversion (TyFloating t1) (TyComplex t2) =
+  Just $ TyComplex $ floatConversion t1 t2
+arithmeticConversion t1@(TyComplex _) (TyIntegral _) = Just t1
+arithmeticConversion (TyIntegral _) t2@(TyComplex _) = Just t2
+arithmeticConversion (TyFloating t1) (TyFloating t2) =
+  Just $ TyFloating $ floatConversion t1 t2
+arithmeticConversion t1@(TyFloating _) (TyIntegral _) = Just t1
+arithmeticConversion (TyIntegral _) t2@(TyFloating _) = Just t2
+arithmeticConversion (TyIntegral t1) (TyIntegral t2) =
+  Just $ TyIntegral $ intConversion t1 t2
+arithmeticConversion (TyEnum _) (TyEnum _) = Just $ TyIntegral TyInt
+arithmeticConversion (TyEnum _) t2 = Just t2
+arithmeticConversion t1 (TyEnum _) = Just t1
+arithmeticConversion _ _ = Nothing
+
+floatConversion :: FloatType -> FloatType -> FloatType
+floatConversion = max
+
+intConversion :: IntType -> IntType -> IntType
+intConversion t1 t2 = max TyInt (max t1 t2)
+
diff --git a/src/Language/C/Analysis/TypeUtils.hs b/src/Language/C/Analysis/TypeUtils.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Analysis/TypeUtils.hs
@@ -0,0 +1,343 @@
+module Language.C.Analysis.TypeUtils (
+    -- * Constructors
+    integral,
+    floating,
+    simplePtr,
+    uint16_tType,
+    uint32_tType,
+    uint64_tType,
+    size_tType,
+    ptrDiffType,
+    boolType,
+    voidType,
+    voidPtr,
+    constVoidPtr,
+    charPtr,
+    constCharPtr,
+    stringType,
+    valistType,
+    -- * Classifiers
+    isIntegralType,
+    isFloatingType,
+    isPointerType,
+    isScalarType,
+    isFunctionType,
+    -- Extractors
+    typeQuals,
+    typeQualsUpd,
+    typeAttrs,
+    typeAttrsUpd,
+    baseType,
+    derefTypeDef,
+    deepDerefTypeDef,
+    canonicalType,
+    -- * Type comparisons
+    sameType,
+    -- * Other utilities
+    getIntType,
+    getFloatType
+) where
+
+import Language.C.Analysis.SemRep
+import Language.C.Data.Node (CNode(..))
+import Language.C.Syntax.AST (CExpression (..), CConstant (..))
+import Language.C.Syntax.Constants
+
+-- | Constructor for a simple integral type.
+integral :: IntType -> Type
+integral ty = DirectType (TyIntegral ty) noTypeQuals noAttributes
+
+-- | Constructor for a simple floating-point type.
+floating :: FloatType -> Type
+floating ty = DirectType (TyFloating ty) noTypeQuals noAttributes
+
+-- | A simple pointer with no qualifiers
+simplePtr :: Type -> Type
+simplePtr t = PtrType t noTypeQuals []
+
+-- | A pointer with the @const@ qualifier.
+constPtr :: Type -> Type
+constPtr t = PtrType t (noTypeQuals { constant = True }) []
+
+-- | The underlying type for @uint16_t@. For now, this is just @unsigned short@.
+uint16_tType :: Type
+uint16_tType = integral TyUShort
+
+-- | The underlying type for @uint32_t@. For now, this is just @unsigned int@.
+uint32_tType :: Type
+uint32_tType = integral TyUInt
+
+-- | The underlying type for @uint64_t@. For now, this is just @unsigned long long@.
+uint64_tType :: Type
+uint64_tType = integral TyULLong
+
+-- | The type returned by sizeof (size_t). For now, this is just @int@.
+size_tType :: Type
+size_tType = integral TyInt
+
+-- | The type of pointer differences (ptrdiff_t). For now, this is just @int@.
+ptrDiffType :: Type
+ptrDiffType = integral TyInt
+
+-- | The type of comparisons\/guards. This is always just @int@.
+boolType :: Type
+boolType = integral TyInt
+
+-- | Simple @void@ type.
+voidType :: Type
+voidType = DirectType TyVoid noTypeQuals noAttributes
+
+-- | An unqualified @void@ pointer.
+voidPtr :: Type
+voidPtr = simplePtr voidType
+
+-- | A @const@-qualified @void@ pointer.
+constVoidPtr :: Type
+constVoidPtr = constPtr voidType
+
+-- | An unqualified @char@ pointer.
+charPtr :: Type
+charPtr = simplePtr (integral TyChar)
+
+-- | A @const@-qualified @char@ pointer.
+constCharPtr :: Type
+constCharPtr = constPtr (integral TyChar)
+
+-- | The type of a constant string.
+stringType :: Type
+stringType  = ArrayType
+              (DirectType (TyIntegral TyChar)
+                          (noTypeQuals { constant = True })
+                          noAttributes)
+              (UnknownArraySize False)
+              noTypeQuals
+              []
+
+-- | The builtin type of variable-length argument lists.
+valistType :: Type
+valistType  = DirectType (TyBuiltin TyVaList) noTypeQuals noAttributes
+
+-- | Check whether a type is an integral type. This includes @enum@
+--   types. This function does not attempt to resolve @typedef@ types.
+isIntegralType :: Type -> Bool
+isIntegralType (DirectType (TyIntegral _) _ _) = True
+isIntegralType (DirectType (TyEnum _) _ _)     = True
+isIntegralType _                               = False
+
+-- | Check whether a type is a floating-point numeric type. This
+--   function does not attempt to resolve @typedef@ types.
+isFloatingType :: Type -> Bool
+isFloatingType (DirectType (TyFloating _) _ _) = True
+isFloatingType _                               = False
+
+-- | Check whether a type is an pointer type. This includes array
+--   types. This function does not attempt to resolve @typedef@ types.
+isPointerType :: Type -> Bool
+isPointerType (PtrType _ _ _)     = True
+isPointerType (ArrayType _ _ _ _) = True
+isPointerType _                   = False
+
+-- | Check whether a type is a scalar type. Scalar types include
+--   arithmetic types and pointer types.
+isScalarType :: Type -> Bool
+isScalarType t = isIntegralType t || isPointerType t || isFloatingType t
+
+-- | return @True@ if the given type is a function type
+--
+--   Result is undefined in the presence of undefined typeDefs
+isFunctionType :: Type -> Bool
+isFunctionType ty =
+    case ty of  TypeDefType (TypeDefRef _ actual_ty _) _ _ -> isFunctionType actual_ty
+                FunctionType _ _ -> True
+                _ -> False
+
+-- | Return the qualifiers of a type.
+typeQuals :: Type -> TypeQuals
+typeQuals (DirectType _ q _) = q
+typeQuals (PtrType _ q _) = q
+typeQuals (ArrayType _ _ q _) = q
+typeQuals (FunctionType _ _) = noTypeQuals
+typeQuals (TypeDefType (TypeDefRef _ t _) q _) = mergeTypeQuals q (typeQuals t)
+
+--  |Update type qualifiers
+--   For function types, it is an error to change any type qualifiers
+--   For typedef types, the result is stored in the typedef attribute field
+typeQualsUpd :: (TypeQuals -> TypeQuals) -> Type -> Type
+typeQualsUpd f ty =
+    case ty of DirectType ty_name ty_quals ty_attrs -> DirectType ty_name (f ty_quals) ty_attrs
+               PtrType ty_inner ty_quals ty_attrs         -> PtrType ty_inner (f ty_quals) ty_attrs
+               ArrayType ty_inner sz ty_quals ty_attrs    -> ArrayType ty_inner sz (f ty_quals) ty_attrs
+               FunctionType ty_inner ty_attrs             -> FunctionType ty_inner ty_attrs
+               TypeDefType ty_ref ty_quals ty_attrs -> TypeDefType ty_ref (f ty_quals) ty_attrs
+
+-- | Return the attributes of a type.
+typeAttrs :: Type -> Attributes
+typeAttrs (DirectType _ _ a) = a
+typeAttrs (PtrType _ _ a) = a
+typeAttrs (ArrayType _ _ _ a) = a
+typeAttrs (FunctionType _ a) = a
+typeAttrs (TypeDefType (TypeDefRef _ t _) _ a) = mergeAttributes a (typeAttrs t)
+
+--  |Update type attributes
+typeAttrsUpd :: (Attributes -> Attributes) -> Type -> Type
+typeAttrsUpd f ty =
+    case ty of DirectType ty_name ty_quals ty_attrs -> DirectType ty_name ty_quals (f ty_attrs)
+               PtrType ty_inner ty_quals ty_attrs         -> PtrType ty_inner ty_quals (f ty_attrs)
+               ArrayType ty_inner sz ty_quals ty_attrs    -> ArrayType ty_inner sz ty_quals (f ty_attrs)
+               FunctionType ty_inner ty_attrs             -> FunctionType ty_inner (f ty_attrs)
+               TypeDefType ty_ref ty_quals ty_attrs -> TypeDefType ty_ref ty_quals (f ty_attrs)
+
+-- | Return the base type of a pointer or array type. It is an error
+--   to call this function with a type that is not in one of those two
+--   categories.
+baseType :: Type -> Type
+baseType (PtrType t _ _)     = t
+baseType (ArrayType t _ _ _) = t
+baseType _                   = error "base of non-pointer type"
+
+-- | resolve typedefs, if possible
+derefTypeDef :: Type -> Type
+derefTypeDef (TypeDefType (TypeDefRef _ t _) q a) =
+  (typeAttrsUpd (mergeAttributes a) . typeQualsUpd (mergeTypeQuals q))
+  (derefTypeDef t)
+derefTypeDef ty = ty
+
+-- | Attempt to remove all references to @typedef@ types from a given type.
+--   Note that this does not dereference the types of structure or union
+--   fields, so there are still cases where further dereferencing is
+--   needed.
+deepDerefTypeDef :: Type -> Type
+deepDerefTypeDef (PtrType t quals attrs) =
+  PtrType (deepDerefTypeDef t) quals attrs
+deepDerefTypeDef (ArrayType t size quals attrs) =
+  ArrayType (deepDerefTypeDef t) size quals attrs
+deepDerefTypeDef (FunctionType (FunType rt params varargs) attrs) =
+  FunctionType (FunType (deepDerefTypeDef rt) params varargs) attrs
+deepDerefTypeDef (FunctionType (FunTypeIncomplete rt) attrs) =
+  FunctionType (FunTypeIncomplete (deepDerefTypeDef rt)) attrs
+deepDerefTypeDef (TypeDefType (TypeDefRef _ t _) q a) =
+  (typeAttrsUpd (mergeAttributes a) . typeQualsUpd (mergeTypeQuals q))
+  (deepDerefTypeDef t)
+deepDerefTypeDef t = t
+
+-- | True iff Type is a variable length array or a derived type thereof.
+-- Variably modified types have function or block scope, so only some
+-- constructions are possible.
+isVariablyModifiedType :: Type -> Bool
+isVariablyModifiedType t =
+  case derefTypeDef t of
+    TypeDefType {} -> error "impossible: derefTypeDef t returned a TypeDefType"
+    DirectType {} -> False
+    PtrType ptr_ty _ _ -> isVariablyModifiedType ptr_ty
+    ArrayType _ sz _ _ -> isVariableArraySize sz
+    FunctionType {} -> False
+  where
+    isVariableArraySize :: ArraySize -> Bool
+    isVariableArraySize (UnknownArraySize isStarred) = isStarred
+    isVariableArraySize (ArraySize isStatic e) = isStatic || isConstantSize e
+
+    isConstantSize :: Expr -> Bool
+    isConstantSize (CConst (CIntConst {})) = True
+    isConstantSize _ = False
+
+-- | Two types denote the same type if they are identical, ignoring type
+-- definitions, and neither is a variably modified type.
+sameType :: Type -> Type -> Bool
+sameType t1 t2 =
+  not (isVariablyModifiedType t1 || isVariablyModifiedType t2) && sameType'
+  where
+    sameType' =
+      case (derefTypeDef t1, derefTypeDef t2) of
+        (TypeDefType {}, _) -> error "impossible: derefTypeDef t1 returned a TypeDefType"
+        (_, TypeDefType {}) -> error "impossible: derefTypeDef t2 returned a TypeDefType"
+        (DirectType tn1 q1 _a1, DirectType tn2 q2 _a2) ->
+          sameTypeName tn1 tn2 && sameQuals q1 q2 {- FIXME: same attributes? -}
+        (PtrType pt1 q1 _a1, PtrType pt2 q2 _a2) ->
+          sameType pt1 pt2 && sameQuals q1 q2
+        (ArrayType at1 sz1 q1 _a1, ArrayType at2 sz2 q2 _a2) ->
+          sameType at1 at2 && sameArraySize sz1 sz2 && sameQuals q1 q2
+        (FunctionType ft1 _a1, FunctionType ft2 _a2) ->
+          sameFunType ft1 ft2
+        _ -> False
+
+sameTypeName :: TypeName -> TypeName -> Bool
+sameTypeName t1 t2 =
+  case (t1, t2) of
+    (TyVoid, TyVoid) -> True
+    (TyIntegral i1, TyIntegral i2) -> i1 == i2
+    (TyFloating f1, TyFloating f2) -> f1 == f2
+    (TyComplex f1, TyComplex f2) -> f1 == f2
+    (TyComp ctr1, TyComp ctr2) -> sameCompTypeRef ctr1 ctr2
+    (TyEnum etr1, TyEnum etr2) -> sameEnumTypeRef etr1 etr2
+    (TyBuiltin b1, TyBuiltin b2) -> sameBuiltinType b1 b2
+    _ -> False
+
+sameBuiltinType :: BuiltinType -> BuiltinType -> Bool
+sameBuiltinType TyVaList TyVaList = True
+sameBuiltinType TyAny TyAny = False {- what does TyAny mean? -}
+sameBuiltinType _ _ = False
+
+sameCompTypeRef :: CompTypeRef -> CompTypeRef -> Bool
+sameCompTypeRef (CompTypeRef sue1 kind1 _) (CompTypeRef sue2 kind2 _) =
+  sue1 == sue2 && kind1 == kind2
+
+sameEnumTypeRef :: EnumTypeRef -> EnumTypeRef -> Bool
+sameEnumTypeRef (EnumTypeRef sue1 _) (EnumTypeRef sue2 _) = sue1 == sue2
+
+sameFunType :: FunType -> FunType -> Bool
+sameFunType (FunType rt1 params1 isVar1) (FunType rt2 params2 isVar2) =
+  sameType rt1 rt2 && sameParamDecls params1 params2 && isVar1 == isVar2
+  where
+    sameParamDecls :: [ParamDecl] -> [ParamDecl] -> Bool
+    sameParamDecls param_list1 param_list2 =
+      length param_list1 == length param_list2
+      && and (zipWith sameParamDecl param_list1 param_list2)
+    -- ignores param identifiers, just compares types
+    sameParamDecl :: ParamDecl -> ParamDecl -> Bool
+    sameParamDecl p1 p2 = sameType (declType p1) (declType p2)
+sameFunType (FunTypeIncomplete rt1) (FunTypeIncomplete rt2) =
+  sameType rt1 rt2
+sameFunType _ _ = False
+
+-- | Returns 'True' iff both array sizes denote the same size.  Assumes that
+-- neither array type was a variably modified type.
+sameArraySize :: ArraySize -> ArraySize -> Bool
+sameArraySize (UnknownArraySize isStar1) (UnknownArraySize isStar2) = isStar1 == isStar2
+sameArraySize (ArraySize s1 e1) (ArraySize s2 e2) = s1 == s2 && sizeEqual e1 e2
+  where
+    -- FIXME: Do something better, and combine with sizeEqual in Language.C.Analysis.TypeCheck
+    sizeEqual :: Expr -> Expr -> Bool
+    sizeEqual (CConst (CIntConst i1 _)) (CConst (CIntConst i2 _)) = i1 == i2
+    sizeEqual oe1 oe2 = nodeInfo oe1 == nodeInfo oe2
+sameArraySize _ _ = False
+
+sameQuals :: TypeQuals -> TypeQuals -> Bool
+sameQuals (TypeQuals {constant = c1, volatile = v1, restrict = r1})
+          (TypeQuals {constant = c2, volatile = v2, restrict = r2}) =
+  c1 == c2 && v1 == v2 && r1 == r2
+
+canonicalType :: Type -> Type
+canonicalType t =
+  case deepDerefTypeDef t of
+    FunctionType ft attrs -> simplePtr (FunctionType ft attrs)
+    t'                    -> t'
+
+-- XXX: move to be with other flag functions
+testFlags :: Enum f => [f] -> Flags f -> Bool
+testFlags flags fi = all (`testFlag` fi) flags
+
+-- XXX: deal with FlagImag. No representation for it in Complex.
+-- XXX: deal with invalid combinations of flags?
+getIntType :: Flags CIntFlag -> IntType
+getIntType flags | testFlags [FlagLongLong, FlagUnsigned] flags = TyULLong
+                 | testFlag  FlagLongLong flags                 = TyLLong
+                 | testFlags [FlagLong, FlagUnsigned] flags     = TyULong
+                 | testFlag  FlagLong flags                     = TyLong
+                 | testFlag  FlagUnsigned flags                 = TyUInt
+                 | otherwise                                    = TyInt
+
+getFloatType :: String -> FloatType
+getFloatType fs | last fs `elem` ['f', 'F'] = TyFloat
+                | last fs `elem` ['l', 'L'] = TyLDouble
+                | otherwise                 = TyDouble
+
diff --git a/src/Language/C/Data.hs b/src/Language/C/Data.hs
--- a/src/Language/C/Data.hs
+++ b/src/Language/C/Data.hs
@@ -14,19 +14,20 @@
      -- * Input stream
      module Language.C.Data.InputStream,
      -- * Identifiers
-     SUERef(..), isAnonymousRef,
+     SUERef(..), isAnonymousRef, sueRefToString,
      Ident,mkIdent, identToString, internalIdent, isInternalIdent, builtinIdent,
      -- * Unqiue names
      Name(..),newNameSupply,
      -- * Source code positions
-     Position(..),Pos(..),initPos,
-     posFile,posRow,posColumn,
-     nopos,builtinPos,internalPos,
+     Position(..),posFile,posParent,
+     Pos(..),
+     initPos, nopos,builtinPos,internalPos,
      isSourcePos,isBuiltinPos,isInternalPos,
      -- * Syntax tree nodes
      NodeInfo(..),CNode(..),
      fileOfNode,posOfNode,nameOfNode,
-     internalNode,mkNodeInfoOnlyPos,mkNodeInfo,
+     undefNode,mkNodeInfoOnlyPos,mkNodeInfo,
+     internalNode, -- DEPRECATED
      -- * Extensible errors
      module Language.C.Data.Error
 )
diff --git a/src/Language/C/Data/Error.hs b/src/Language/C/Data/Error.hs
--- a/src/Language/C/Data/Error.hs
+++ b/src/Language/C/Data/Error.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE ExistentialQuantification, DeriveDataTypeable #-}
+{-# LANGUAGE ExistentialQuantification #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Language.C.Data.Error
@@ -8,7 +8,7 @@
 -- Stability   :  experimental
 -- Portability :  ghc
 --
--- Base type for errors occuring in parsing, analysing and pretty-printing.
+-- Base type for errors occurring in parsing, analysing and pretty-printing.
 -- With ideas from Simon Marlow's
 -- "An extensible dynamically-typed hierarchy of execeptions [2006]"
 -----------------------------------------------------------------------------
@@ -28,8 +28,8 @@
     internalErr,
 )
 where
-import Data.Typeable
-import Data.Generics
+
+import Data.Typeable (Typeable, cast)
 import Language.C.Data.Node
 import Language.C.Data.Position
 
@@ -50,9 +50,9 @@
 isHardError = ( > LevelWarn) . errorLevel
 
 -- | information attached to every error in Language.C
-data ErrorInfo = ErrorInfo ErrorLevel Position [String] deriving Typeable
+data ErrorInfo = ErrorInfo ErrorLevel Position [String]
 
--- to faciliate newtype deriving
+-- to facilitate newtype deriving
 instance Show ErrorInfo where show = showErrorInfo "error"
 instance Error ErrorInfo where
     errorInfo = id
@@ -64,8 +64,8 @@
 -- | `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
@@ -73,7 +73,7 @@
     -- | wrap error in 'CError'
     toError          :: e -> CError
     -- | try to cast a generic 'CError' to the specific error type
-    fromError     :: CError -> (Maybe e)
+    fromError     :: CError -> Maybe e
     -- | modify the error level
     changeErrorLevel :: e -> ErrorLevel -> e
 
@@ -106,7 +106,7 @@
 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
+data UnsupportedFeature = UnsupportedFeature String Position
 instance Error UnsupportedFeature where
     errorInfo (UnsupportedFeature msg pos) = ErrorInfo LevelError pos (lines msg)
 instance Show UnsupportedFeature where show = showError "Unsupported Feature"
@@ -119,7 +119,7 @@
 
 -- | 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
+newtype UserError     = UserError ErrorInfo
 instance Error UserError where
     errorInfo (UserError info) = info
 instance Show UserError where show = showError "User Error"
@@ -147,9 +147,10 @@
 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 ++ "]"
+    header = showPos pos ++ "[" ++ show level ++ "]"
+    showPos p | isSourcePos p = posFile p ++ ":" ++ show (posRow pos) ++ ": " ++
+                                "(column " ++ show (posColumn pos) ++ ") "
+              | otherwise = show p ++ ":: "
     showMsgLines []     = internalErr "No short message or error message provided."
     showMsgLines (x:xs) = indent ++ ">>> " ++ x ++ "\n" ++ unlines (map (indent++) xs)
 
diff --git a/src/Language/C/Data/Ident.hs b/src/Language/C/Data/Ident.hs
--- a/src/Language/C/Data/Ident.hs
+++ b/src/Language/C/Data/Ident.hs
@@ -10,35 +10,37 @@
 -- 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 
+-- 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)
+    mkIdent, builtinIdent, internalIdent, internalIdentAt, isInternalIdent,
+    identToString, sueRefToString, 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
+import Language.C.Data.Name (Name)
+import Data.Data (Data)
+import GHC.Generics (Generic)
+import Control.DeepSeq (NFData)
 
 -- | 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
+    deriving (Data, Ord, Eq, Show, Generic) --, Read
 
+instance NFData SUERef
+
 -- | Return true if the struct\/union\/enum reference is anonymous.
 isAnonymousRef :: SUERef -> Bool
 isAnonymousRef (AnonymousRef _) = True
@@ -46,10 +48,12 @@
 
 -- | C identifiers
 data Ident = Ident String       -- lexeme
-                   {-# UNPACK #-}   !Int         -- hash to speed up equality check
-                   NodeInfo        -- attributes of this ident. incl. position
-             deriving (Data,Typeable)
+                   {-# UNPACK #-}   !Int     -- hash to speed up equality check
+                   NodeInfo                   -- attributes of this ident. incl. position
+             deriving (Data,Show, Generic) -- Read
 
+instance NFData Ident
+
 -- 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
@@ -62,10 +66,6 @@
 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
@@ -108,7 +108,7 @@
 --
 -- * 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)
+mkIdent pos s name  = Ident s (quad s) (mkNodeInfo' pos (pos,length s) name)
 
 -- | returns an /internal/ identifier (has internal position and no unique name)
 internalIdent   :: String -> Ident
@@ -116,7 +116,7 @@
 
 -- | return an /internal/ identifier with position info
 internalIdentAt :: Position -> String -> Ident
-internalIdentAt pos s = Ident s (quad s) (mkNodeInfoOnlyPos pos)
+internalIdentAt pos s = Ident s (quad s) (mkNodeInfoPosLen pos (pos, length s))
 
 -- | returns a /builtin/ identifier (has builtin position and no unique name)
 builtinIdent   :: String -> Ident
@@ -129,6 +129,11 @@
 -- | string of an identifier
 identToString               :: Ident -> String
 identToString (Ident s _ _)  = s
+
+-- | string of a SUE ref (empty if anonymous)
+sueRefToString                 :: SUERef -> String
+sueRefToString (AnonymousRef _) = ""
+sueRefToString (NamedRef ident) = identToString ident
 
 -- | dump the identifier string and its positions for debugging purposes
 dumpIdent     :: Ident -> String
diff --git a/src/Language/C/Data/InputStream.hs b/src/Language/C/Data/InputStream.hs
--- a/src/Language/C/Data/InputStream.hs
+++ b/src/Language/C/Data/InputStream.hs
@@ -3,24 +3,31 @@
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Language.C.Data.InputStream
--- Copyright   :  (c) 2008 Benedikt Huber
+-- Copyright   :  (c) 2008,2011 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.
+-- Compile time input abstraction for the parser, relying on ByteString.
+-- The String interface only supports Latin-1 since alex-3, as alex now requires
+-- byte based access to the input stream.
 -------------------------------------------------------------------------------
 module Language.C.Data.InputStream (
     InputStream, readInputStream,inputStreamToString,inputStreamFromString,
-    takeChar,inputStreamEmpty,takeChars,
+    takeByte, takeChar, inputStreamEmpty, takeChars,
     countLines,
 )
 where
+
+import Data.Word
+
 #ifndef NO_BYTESTRING
-import Data.ByteString.Char8 (ByteString)
-import qualified Data.ByteString.Char8 as BS
+import Data.ByteString (ByteString)
+import qualified Data.ByteString as BSW
+import qualified Data.ByteString.Char8 as BSC
+#else
+import qualified Data.Char as Char
 #endif
 
 -- Generic InputStream stuff
@@ -35,6 +42,11 @@
 -- | convert a 'String' to an 'InputStream'
 inputStreamFromString :: String -> InputStream
 
+-- | @(b,is') = takeByte is@ reads and removes
+-- the first byte @b@ from the 'InputStream' @is@
+takeByte :: InputStream -> (Word8, InputStream)
+{-# INLINE takeByte #-}
+
 -- | @(c,is') = takeChar is@ reads and removes
 -- the first character @c@ from the 'InputStream' @is@
 takeChar :: InputStream -> (Char, InputStream)
@@ -54,18 +66,25 @@
 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
+takeByte bs = BSW.head  bs `seq`  (BSW.head bs, BSW.tail bs)
+takeChar bs = BSC.head bs `seq`  (BSC.head bs, BSC.tail bs)
+inputStreamEmpty = BSW.null
+takeChars !n bstr = BSC.unpack $ BSC.take n bstr
+readInputStream       = BSW.readFile
+
+inputStreamToString   = BSC.unpack
+inputStreamFromString = BSC.pack
+countLines             = length . BSC.lines
+
 #else
+
 type InputStream = String
+takeByte bs
+  | Char.isLatin1 c = let b = fromIntegral (Char.ord c) in b `seq` (b, tail bs)
+  | otherwise       = error "takeByte: not a latin-1 character"
+  where c = head bs
 takeChar bs = (head bs, tail bs)
 inputStreamEmpty = null
 takeChars n str = take n str
diff --git a/src/Language/C/Data/Name.hs b/src/Language/C/Data/Name.hs
--- a/src/Language/C/Data/Name.hs
+++ b/src/Language/C/Data/Name.hs
@@ -12,13 +12,16 @@
 module Language.C.Data.Name (
 Name(..),newNameSupply, namesStartingFrom
 ) where
+import Data.Data (Data)
 import Data.Ix
-import Data.IntMap (IntMap)
-import qualified Data.IntMap as IntMap
-import Data.Generics
+import GHC.Generics (Generic)
+import Control.DeepSeq (NFData)
 
 -- | Name is a unique identifier
-newtype Name = Name { nameId :: Int } deriving (Show, Read, Eq, Ord, Ix, Data, Typeable)
+newtype Name = Name { nameId :: Int }
+  deriving (Show, Read, Eq, Ord, Ix, Data, Generic)
+
+instance NFData Name
 
 instance Enum Name where
     toEnum = Name
diff --git a/src/Language/C/Data/Node.hs b/src/Language/C/Data/Node.hs
--- a/src/Language/C/Data/Node.hs
+++ b/src/Language/C/Data/Node.hs
@@ -12,36 +12,62 @@
 -- source position and unqiue name
 -----------------------------------------------------------------------------
 module Language.C.Data.Node (
-   NodeInfo(..), internalNode,mkNodeInfoOnlyPos,mkNodeInfo,
+   NodeInfo(..), undefNode, isUndefNode,
+   mkNodeInfoOnlyPos,mkNodeInfoPosLen, mkNodeInfo,mkNodeInfo',
+   internalNode, -- deprecated, use undefNode
    CNode(nodeInfo), fileOfNode,
-   posOfNode, nameOfNode,
+   posOfNode, nameOfNode, getLastTokenPos, lengthOfNode,
    eqByName,
 ) where
 import Language.C.Data.Position
 import Language.C.Data.Name     (Name)
-import Data.Generics
+import Data.Data (Data)
+import GHC.Generics (Generic)
+import Control.DeepSeq (NFData)
 
 -- | 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)
+data NodeInfo = OnlyPos  Position {-# UNPACK #-} !PosLength        -- only pos and last token (for internal stuff only)
+              | NodeInfo Position {-# UNPACK #-} !PosLength !Name  -- pos, last token and unique name
+           deriving (Data,Eq,Ord, Generic)
 
+instance NFData NodeInfo
+
+instance Show NodeInfo where
+    showsPrec d (OnlyPos p l) =
+      (showString "(OnlyPos ") . (showsPrec d p) . (showString " ") . (showsPrec d l) . (showString ")")
+    showsPrec d (NodeInfo p l n) =
+      (showString "(NodeInfo ") . (showsPrec d p) . (showString " ") . (showsPrec d l) . (showString " ") . (showsPrec d n) . (showString ")")
+
 -- 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!"
+--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 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
+  posOf (OnlyPos pos _) = pos
+  posOf (NodeInfo pos _ _) = pos
 
+-- | get the number of characters an AST node spans
+lengthOfNode :: NodeInfo -> Maybe Int
+lengthOfNode ni = len
+    where
+    len = case ni of NodeInfo firstPos lastTok _ -> computeLength firstPos lastTok
+                     OnlyPos firstPos lastTok -> computeLength firstPos lastTok
+    computeLength pos (lastPos,lastTokLen) | lastTokLen < 0   = Nothing
+                                           | otherwise = Just (posOffset lastPos + lastTokLen - posOffset pos)
+
+-- | get the position and length of the last token
+getLastTokenPos :: NodeInfo -> PosLength
+getLastTokenPos (NodeInfo _ lastTok _) = lastTok
+getLastTokenPos (OnlyPos _ lastTok) = lastTok
+
 -- | a class for convenient access to the attributes of an attributed object
 class CNode a where
   nodeInfo :: a -> NodeInfo
@@ -51,12 +77,14 @@
   nodeInfo = either nodeInfo nodeInfo
 
 nameOfNode :: NodeInfo -> Maybe Name
-nameOfNode (OnlyPos _) = Nothing
-nameOfNode (NodeInfo _ name) = Just 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
+posOfNode ni = case ni of (OnlyPos pos _) -> pos; (NodeInfo pos _ _) -> pos
+fileOfNode :: (CNode a) => a -> Maybe FilePath
+fileOfNode = fmap posFile . justIf isSourcePos . posOfNode . nodeInfo where
+    justIf predicate x | predicate x = Just x
+                       | otherwise   = Nothing
 
 -- | equality by name
 eqByName           :: CNode a => a -> a -> Bool
@@ -65,16 +93,36 @@
 
 -- attribute identifier creation
 -- -----------------------------
-
+{-# DEPRECATED internalNode "use undefNode instead" #-}
 internalNode :: NodeInfo
-internalNode = OnlyPos nopos
+internalNode = undefNode
 
--- | Given only a source position, create a new attribute identifier
+-- | create a node with neither name nor positional information
+undefNode :: NodeInfo
+undefNode = OnlyPos nopos (nopos,-1)
+
+-- | return True if the node carries neither name nor positional information
+isUndefNode :: NodeInfo -> Bool
+isUndefNode (OnlyPos p _) | isNoPos p = True
+                          | otherwise = False
+isUndefNode _ = False
+
+-- |
+-- | Given only a source position, create a new node attribute
 mkNodeInfoOnlyPos :: Position -> NodeInfo
-mkNodeInfoOnlyPos pos  = OnlyPos pos
+mkNodeInfoOnlyPos pos  = OnlyPos pos (nopos,-1)
 
+-- | Given a source position and the position and length of the last token, create a new node attribute
+mkNodeInfoPosLen :: Position -> PosLength -> NodeInfo
+mkNodeInfoPosLen = OnlyPos
+
 -- | Given a source position and a unique name, create a new attribute
 -- identifier
 mkNodeInfo :: Position -> Name -> NodeInfo
-mkNodeInfo pos name  = NodeInfo pos name
+mkNodeInfo pos name  = NodeInfo pos (nopos,-1) name
+
+-- | Given a source position, the position and length of the last token and a unique name, create a new attribute
+-- identifier. Strict in
+mkNodeInfo' :: Position -> PosLength -> Name -> NodeInfo
+mkNodeInfo' pos lasttok name = NodeInfo pos lasttok name
 
diff --git a/src/Language/C/Data/Position.hs b/src/Language/C/Data/Position.hs
--- a/src/Language/C/Data/Position.hs
+++ b/src/Language/C/Data/Position.hs
@@ -1,8 +1,9 @@
-{-# LANGUAGE DeriveDataTypeable, PatternGuards #-}
+{-# LANGUAGE DeriveDataTypeable #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Language.C.Data.Position
 -- Copyright   :  (c) [1995..2000] Manuel M. T. Chakravarty
+--                    [2008..2009] Benedikt Huber
 -- License     :  BSD-style
 -- Maintainer  :  benedikt.huber@gmail.com
 -- Stability   :  experimental
@@ -14,112 +15,121 @@
   --
   -- source text positions
   --
-  Position(Position),initPos,
-  posFile,posRow,posColumn,isSourcePos,
+  Position(),
+  position,
+  PosLength,
+  posFile,posRow,posColumn,posOffset,posParent,
+  initPos, isSourcePos,
   nopos, isNoPos,
   builtinPos, isBuiltinPos,
   internalPos, isInternalPos,
-  incPos, tabPos, retPos, adjustPos,
+  incPos, retPos,
+  incOffset,
   Pos(..),
 ) where
-import Data.Generics
+import Data.Data (Data)
+import GHC.Generics (Generic)
+import Control.DeepSeq (NFData)
 
--- | 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)
+-- | file position information
+data FilePosition = FilePosition { posSrcFile    :: String,            -- ^ source file
+                                   posParentFile :: (Maybe Position)   -- ^ including file, if any
+                                 }
+                    deriving (Eq, Ord, Data, Generic)
 
-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
+instance NFData FilePosition
 
--- | get the source file of the specified position. Fails unless @isSourcePos pos@.
+-- | uniform representation of source file positions
+data Position = Position { posOffset :: {-# UNPACK #-} !Int  -- ^ absolute offset in the preprocessed file
+                         , posRow :: {-# UNPACK #-} !Int     -- ^ row (line)  in the original file. Affected by #LINE pragmas.
+                         , posColumn :: {-# UNPACK #-} !Int  -- ^ column in the preprocessed file. Inaccurate w.r.t. to the original
+                                                             --   file in the presence of preprocessor macros.
+                         , posFileInfo :: FilePosition       -- ^ position in source file, including files
+                         }
+              | NoPosition
+              | BuiltinPosition
+              | InternalPosition
+                deriving (Eq, Ord, Data, Generic)
+
+instance NFData Position
+
 posFile :: Position -> String
-posFile (Position fname _ _) = fname
+posFile = posSrcFile . posFileInfo
 
--- | get the line number of the specified position. Fails unless @isSourcePos pos@
-posRow  :: Position -> Int
-posRow (Position _ row _) = row
+posParent :: Position -> (Maybe Position)
+posParent = posParentFile . posFileInfo
 
--- | get the column of the specified position. Fails unless @isSourcePos pos@
-posColumn :: Position -> Int
-posColumn (Position _ _ col) = col
+-- | Position and length of a token
+type PosLength = (Position,Int)
 
+instance Show Position where
+  showsPrec _ (Position _ row _ (FilePosition fname mparent)) =
+    showString "(" . showsPrec 0 fname . showString ": line " . showsPrec 0 row .
+    maybe id (\p -> showString ", in file included from " . showsPrec 0 p) mparent .
+    showString ")"
+  showsPrec _  NoPosition                     = showString "<no file>"
+  showsPrec _  BuiltinPosition                = showString "<builtin>"
+  showsPrec _ InternalPosition                = showString "<internal>"
+
+-- | @position absoluteOffset fileName lineNumber columnNumber@ initializes a @Position@ using the given arguments
+position :: Int -> String -> Int -> Int -> Maybe Position -> Position
+position offset fname row col mparent = Position offset row col (FilePosition fname mparent)
+
 -- | class of type which aggregate a source code location
 class Pos a where
     posOf :: a -> Position
 
 -- | initialize a Position to the start of the translation unit starting in the given file
 initPos :: FilePath -> Position
-initPos file = Position file 1 1
+initPos file = Position 0 1 1 (FilePosition file Nothing)
 
 -- | returns @True@ if the given position refers to an actual source file
 isSourcePos :: Position -> Bool
-isSourcePos (Position _ row col) = row >= 0 && col >= 0
+isSourcePos (Position _ _ _ _) = True
+isSourcePos _                  = False
 
 -- | no position (for unknown position information)
 nopos :: Position
-nopos  = Position "<no file>" (-1) 0
+nopos  = NoPosition
 
+-- | returns @True@ if the there is no position information available
 isNoPos :: Position -> Bool
-isNoPos (Position _ (-1) 0) = True
-isNoPos _                   = False
+isNoPos NoPosition = True
+isNoPos _          = False
 
 -- | position attached to built-in objects
 --
 builtinPos :: Position
-builtinPos  = Position "<built into the parser>" (-1) 1
+builtinPos  = BuiltinPosition
 
 -- | returns @True@ if the given position refers to a builtin definition
 isBuiltinPos :: Position -> Bool
-isBuiltinPos (Position _ (-1) 1) = True
-isBuiltinPos _                   = False
+isBuiltinPos BuiltinPosition = True
+isBuiltinPos _               = False
 
 -- | position used for internal errors
 internalPos :: Position
-internalPos = Position "<internal error>" (-1) 2
+internalPos = InternalPosition
 
 -- | returns @True@ if the given position is internal
 isInternalPos :: Position -> Bool
-isInternalPos (Position _ (-1) 2) = True
-isInternalPos _                      = False
+isInternalPos InternalPosition = True
+isInternalPos _                = False
 
 {-# INLINE incPos #-}
 -- | advance column
 incPos :: Position -> Int -> Position
-incPos (Position fname row col) n = Position fname row (col + n)
-
-{-# DEPRECATED tabPos "Use 'incPos column-adjustment' instead" #-}
--- | 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)
+incPos (Position offs row col fpos) n = Position (offs + n) row (col + n) fpos
+incPos p _                             = p
 
 {-# INLINE retPos #-}
 -- | advance to next line
 retPos :: Position -> Position
-retPos (Position fname row _col) = Position fname (row + 1) 1
+retPos (Position offs row _ fpos) = Position (offs+1) (row + 1) 1 fpos
+retPos p                           = p
 
-{-# INLINE adjustPos #-}
--- | adjust position: change file and line number, reseting column to 1. This is usually 
---   used for #LINE pragmas.
-adjustPos :: FilePath -> Int -> Position -> Position
-adjustPos fname row (Position _ _ _) = Position fname row 1
+{-# INLINE incOffset #-}
+-- | advance just the offset
+incOffset :: Position -> Int -> Position
+incOffset (Position o r c f) n = Position (o + n) r c f
+incOffset pos _             = pos
diff --git a/src/Language/C/Data/RList.hs b/src/Language/C/Data/RList.hs
--- a/src/Language/C/Data/RList.hs
+++ b/src/Language/C/Data/RList.hs
@@ -30,7 +30,7 @@
 
 snoc :: Reversed [a] -> a -> Reversed [a]
 snoc (Reversed xs) x = Reversed (x : xs)
-infixr 5 `snoc`
+infixl 5 `snoc`
 
 rappend :: Reversed [a] -> [a] -> Reversed [a]
 rappend (Reversed xs) ys = Reversed (List.reverse ys ++ xs)
diff --git a/src/Language/C/Parser/Builtin.hs b/src/Language/C/Parser/Builtin.hs
--- a/src/Language/C/Parser/Builtin.hs
+++ b/src/Language/C/Parser/Builtin.hs
@@ -18,4 +18,6 @@
 -- predefined type names
 --
 builtinTypeNames :: [Ident]
-builtinTypeNames  = [builtinIdent "__builtin_va_list"]
+builtinTypeNames  = [
+     builtinIdent "__builtin_va_list"
+  ]
diff --git a/src/Language/C/Parser/Lexer.x b/src/Language/C/Parser/Lexer.x
--- a/src/Language/C/Parser/Lexer.x
+++ b/src/Language/C/Parser/Lexer.x
@@ -50,11 +50,19 @@
 
 module Language.C.Parser.Lexer (lexC, parseError) where
 
-import Data.Char (isDigit)
-import Control.Monad (liftM)
+import Data.Char (chr, isDigit)
+import Data.List (uncons)
+import Data.Word (Word8)
+import Control.Monad (liftM, when)
 
 import Language.C.Data.InputStream
-import Language.C.Data.Position  (Position(..),posOf)
+  (InputStream, inputStreamEmpty, takeByte, takeChar, takeChars)
+
+-- (    InputStream, readInputStream,inputStreamToString,inputStreamFromString,
+--     takeByte, takeChar, inputStreamEmpty, takeChars,
+--     countLines,
+-- )
+import Language.C.Data.Position
 import Language.C.Data.Ident    (mkIdent)
 
 import Language.C.Syntax.Constants
@@ -73,10 +81,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
+$inchar   = . # [ \\ \' \n \r ]       -- valid character in char constant
+$instr    = . # [ \\ \" \n \r ]       -- valid character in a string literal
+$infname  = . # [ \\ \" ]             -- valid character in a filename
 
 @sp  = $space*
 
@@ -113,10 +120,13 @@
 @hexmant   = @hexdigits?\.@hexdigits|@hexdigits\.
 @binexp    = [pP][\+\-]?@digits
 
-@floatsuffix    = [fFlL]
+-- Suffixes `qQwW` are GNU floating type extensions: <https://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html>
+@iec60559suffix = (16|32|64|128)[x]?
+@floatsuffix    = [fFlLqQwW]@iec60559suffix?
 @floatgnusuffix = @floatsuffix@gnusuffix?|@gnusuffix@floatsuffix?
 
-
+-- clang version literals with a major.minor.rev
+@clangversion = @intpart\.@intpart\.@intpart
 
 tokens :-
 
@@ -129,27 +139,31 @@
 --
 $white+         ;
 
--- #line directive (K&R A12.6)
+-- #line directive (C11 6.10.4, GCC Line Control)
 --
--- * 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
+-- * standard form: int => change line number
+-- * standard form: int string => change source file and line number
+-- * preprocessor (gcc/clang): int string int => change source file and line number,
+--       push or pop item from stack
 --
-\#$space*@int$space*(\"($infname|@charesc)*\"$space*)?(@int$space*)*\r?$eol
-  { \pos len str -> setPos (linePragmaAdjust (takeChars len str) pos) >> lexToken }
+-- * see https://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html
+--
+\#$space*@digits$space*(\"($infname|@charesc)*\"$space*)?(@int$space*)*\r?$eol
+  { \pos len str -> setPos (adjustLineDirective len (takeChars len str) pos) >> lexToken' False }
 
 -- #pragma directive (K&R A12.8)
 --
 -- * we simply ignore any #pragma (but take care to update the position
 --   information)
 --
-\#$space*pragma$anyButNL*$eol   ;
+\#$space*pragma.*$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    ;
+\#$space*ident.*$eol    ;
 
 -- identifiers and keywords (follows K&R A2.3 and A2.4)
 --
@@ -172,11 +186,14 @@
 -- 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) }
+\'($inchar|@charesc)\'  { token CTokCLit (cChar . fst . unescapeChar . drop 1) }
+L\'($inchar|@charesc)\' { token CTokCLit (cChar_w . fst . unescapeChar . drop 2) }
+\'($inchar|@charesc){2,}\' { token CTokCLit (flip cChars False . unescapeMultiChars . drop 1) }
+L\'($inchar|@charesc){2,}\' { token CTokCLit (flip cChars True . unescapeMultiChars . drop 2) }
 
+-- Clang version literals
+@clangversion           { token (\pos -> CTokClangC pos . ClangCVersionTok) readClangCVersion }
+
 -- float constants (follows K&R A2.5.3. C99 6.4.4.2)
 --
 -- * NOTE: Hexadecimal floating constants without binary exponents are forbidden.
@@ -187,8 +204,8 @@
 
 -- 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) }
+\"($instr|@charesc)*\"      { token CTokSLit (cString . unescapeString . init . drop 1) }
+L\"($instr|@charesc)*\"     { token CTokSLit (cString_w . unescapeString . init . drop 2) }
 
 L?\'@ucn\'                        { token_fail "Universal character names are unsupported" }
 L?\'\\[^0-7'\"\?\\abfnrtvuUx]\'     { token_fail "Invalid escape sequence" }
@@ -196,52 +213,52 @@
 
 -- 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 }
+"("   { token_ 1 CTokLParen }
+")"   { token_ 1 CTokRParen  }
+"["   { token_ 1 CTokLBracket }
+"]"   { token_ 1 CTokRBracket }
+"->"  { token_ 2 CTokArrow }
+"."   { token_ 1 CTokDot }
+"!"   { token_ 1 CTokExclam }
+"~"   { token_ 1 CTokTilde }
+"++"  { token_ 2 CTokInc }
+"--"  { token_ 2 CTokDec }
+"+"   { token_ 1 CTokPlus }
+"-"   { token_ 1 CTokMinus }
+"*"   { token_ 1 CTokStar }
+"/"   { token_ 1 CTokSlash }
+"%"   { token_ 1 CTokPercent }
+"&"   { token_ 1 CTokAmper }
+"<<"  { token_ 2 CTokShiftL }
+">>"  { token_ 2 CTokShiftR }
+"<"   { token_ 1 CTokLess }
+"<="  { token_ 2 CTokLessEq }
+">"   { token_ 1 CTokHigh }
+">="  { token_ 2 CTokHighEq }
+"=="  { token_ 2 CTokEqual }
+"!="  { token_ 2 CTokUnequal }
+"^"   { token_ 1 CTokHat }
+"|"   { token_ 1 CTokBar }
+"&&"  { token_ 2 CTokAnd }
+"||"  { token_ 2 CTokOr }
+"?"   { token_ 1 CTokQuest }
+":"   { token_ 1 CTokColon }
+"="   { token_ 1 CTokAssign }
+"+="  { token_ 2 CTokPlusAss }
+"-="  { token_ 2 CTokMinusAss }
+"*="  { token_ 2 CTokStarAss }
+"/="  { token_ 2 CTokSlashAss }
+"%="  { token_ 2 CTokPercAss }
+"&="  { token_ 2 CTokAmpAss }
+"^="  { token_ 2 CTokHatAss }
+"|="  { token_ 2 CTokBarAss }
+"<<=" { token_ 3 CTokSLAss }
+">>=" { token_ 3 CTokSRAss }
+","   { token_ 1 CTokComma }
+\;    { token_ 1 CTokSemic }
+"{"   { token_ 1 CTokLBrace }
+"}"   { token_ 1 CTokRBrace }
+"..." { token_ 3 CTokEllipsis }
 
 
 {
@@ -251,118 +268,235 @@
     case r of
         (c:_) | isDigit c -> readCInteger OctalRepr r
         _                 -> readCInteger DecRepr s
+readCOctal _ = error "ReadOctal: string does not start with `0'"
 
+
 -- 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.
+-- This change makes a significant performance difference [chak]
 --
-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)
+-- To make this a little more maintainable, we autogenerate it from this list,
+-- using the script GenerateKeywords.hs (in /scripts)
+{-
+alignas _Alignas,
+alignof _Alignof __alignof alignof __alignof__,
+asm @__,
+atomic _Atomic,
+auto, break, bool _Bool bool,
+case, char, const @__, continue,
+complex _Complex __complex__
+default, do, double,
+else, enum, extern,
+float, for,
+generic _Generic,
+goto,
+if, inline @__, int,
+int128 __int128 __int128_t,
+long,
+noreturn _Noreturn,
+nullable _Nullable __nullable,
+nonnull _Nonnull __nonnull,
+register, restrict @__, return
+short, signed @__, sizeof, static,
+staticAssert _Static_assert,
+struct, switch,
+typedef, typeof @__,
+thread __thread _Thread_local
+(CTokUInt128) __uint128 __uint128_t,
+union,
+unsigned,
+void,
+volatile @__,
+while,
+label __label__
+BFloat16 __bf16
+(CTokFloatN 16 False) __fp16
+(CTokFloatN 16 False) _Float16
+(CTokFloatN 16 True) _Float16x
+(CTokFloatN 32 False) _Float32
+(CTokFloatN 32 True) _Float32x
+(CTokFloatN 64 False) _Float64
+(CTokFloatN 64 True) _Float64x
+(CTokFloatN 128 False) _Float128 __float128
+(CTokFloatN 128 True) _Float128x
+(CTokGnuC GnuCAttrTok) __attribute __attribute__
+(CTokGnuC GnuCExtTok) __extension__
+(CTokGnuC GnuCComplexReal) __real __real__
+(CTokGnuC GnuCComplexImag) __imag __imag__
+(CTokGnuC GnuCVaArg) __builtin_va_arg
+(CTokGnuC GnuCOffsetof) __builtin_offsetof
+(CTokGnuC GnuCTyCompat) __builtin_types_compatible_p
+(CTokGnuC GnuBitCast) __builtin_bit_cast
+(flip CTokClangC ClangBuiltinConvertVector) __builtin_convertvector
+-}
 
+-- Tokens: _Alignas _Alignof __alignof alignof __alignof__ __asm asm __asm__ _Atomic auto break _Bool bool case char __const const __const__ continue _Complex __complex__ default do double else enum extern float for _Generic goto if __inline inline __inline__ int __int128 __int128_t long _Noreturn _Nullable __nullable _Nonnull __nonnull register __restrict restrict __restrict__ return short __signed signed __signed__ sizeof static _Static_assert struct switch typedef __typeof typeof __typeof__ __thread _Thread_local __uint128 __uint128_t union unsigned void __volatile volatile __volatile__ while __label__ __bf16 __fp16 _Float16 _Float16x _Float32 _Float32x _Float64 _Float64x _Float128 __float128 _Float128x __attribute __attribute__ __extension__ __real __real__ __imag __imag__ __builtin_va_arg __builtin_offsetof __builtin_types_compatible_p __builtin_bit_cast __builtin_convertvector
+idkwtok ('_' : 'A' : 'l' : 'i' : 'g' : 'n' : 'a' : 's' : []) = tok 8 CTokAlignas
+idkwtok ('_' : 'A' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 8 CTokAlignof
+idkwtok ('_' : 'A' : 't' : 'o' : 'm' : 'i' : 'c' : []) = tok 7 CTokAtomic
+idkwtok ('_' : 'B' : 'o' : 'o' : 'l' : []) = tok 5 CTokBool
+idkwtok ('_' : 'C' : 'o' : 'm' : 'p' : 'l' : 'e' : 'x' : []) = tok 8 CTokComplex
+#ifdef IEC_60559_TYPES_EXT
+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : []) = tok 9 (CTokFloatN 128 False)
+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : 'x' : []) = tok 10 (CTokFloatN 128 True)
+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '1' : '6' : []) = tok 8 (CTokFloatN 16 False)
+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '1' : '6' : 'x' : []) = tok 9 (CTokFloatN 16 True)
+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '3' : '2' : []) = tok 8 (CTokFloatN 32 False)
+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '3' : '2' : 'x' : []) = tok 9 (CTokFloatN 32 True)
+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '6' : '4' : []) = tok 8 (CTokFloatN 64 False)
+idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '6' : '4' : 'x' : []) = tok 9 (CTokFloatN 64 True)
+#endif
+idkwtok ('_' : 'G' : 'e' : 'n' : 'e' : 'r' : 'i' : 'c' : []) = tok 8 CTokGeneric
+idkwtok ('_' : 'N' : 'o' : 'n' : 'n' : 'u' : 'l' : 'l' : []) = tok 8 CTokNonnull
+idkwtok ('_' : 'N' : 'o' : 'r' : 'e' : 't' : 'u' : 'r' : 'n' : []) = tok 9 CTokNoreturn
+idkwtok ('_' : 'N' : 'u' : 'l' : 'l' : 'a' : 'b' : 'l' : 'e' : []) = tok 9 CTokNullable
+idkwtok ('_' : 'S' : 't' : 'a' : 't' : 'i' : 'c' : '_' : 'a' : 's' : 's' : 'e' : 'r' : 't' : []) = tok 14 CTokStaticAssert
+idkwtok ('_' : 'T' : 'h' : 'r' : 'e' : 'a' : 'd' : '_' : 'l' : 'o' : 'c' : 'a' : 'l' : []) = tok 13 CTokThread
+idkwtok ('_' : '_' : 'a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 9 CTokAlignof
+idkwtok ('a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 7 CTokAlignof
+idkwtok ('_' : '_' : 'a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : '_' : '_' : []) = tok 11 CTokAlignof
+idkwtok ('_' : '_' : 'a' : 's' : 'm' : []) = tok 5 CTokAsm
+idkwtok ('a' : 's' : 'm' : []) = tok 3 CTokAsm
+idkwtok ('_' : '_' : 'a' : 's' : 'm' : '_' : '_' : []) = tok 7 CTokAsm
+idkwtok ('_' : '_' : 'a' : 't' : 't' : 'r' : 'i' : 'b' : 'u' : 't' : 'e' : []) = tok 11 (CTokGnuC GnuCAttrTok)
+idkwtok ('_' : '_' : 'a' : 't' : 't' : 'r' : 'i' : 'b' : 'u' : 't' : 'e' : '_' : '_' : []) = tok 13 (CTokGnuC GnuCAttrTok)
+idkwtok ('a' : 'u' : 't' : 'o' : []) = tok 4 CTokAuto
+idkwtok ('_' : '_' : 'b' : 'f' : '1' : '6' : []) = tok 6 CTokBFloat16
+idkwtok ('b' : 'o' : 'o' : 'l' : []) = tok 4 CTokBool
+idkwtok ('b' : 'r' : 'e' : 'a' : 'k' : []) = tok 5 CTokBreak
+idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'b' : 'i' : 't' : '_' : 'c' : 'a' : 's' : 't' : []) = tok 18 (flip CTokClangC ClangCBitCast)
+idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'c' : 'o' : 'n' : 'v' : 'e' : 'r' : 't' : 'v' : 'e' : 'c' : 't' : 'o' : 'r' : []) = tok 23 (flip CTokClangC ClangBuiltinConvertVector)
+idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'o' : 'f' : 'f' : 's' : 'e' : 't' : 'o' : 'f' : []) = tok 18 (CTokGnuC GnuCOffsetof)
+idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 't' : 'y' : 'p' : 'e' : 's' : '_' : 'c' : 'o' : 'm' : 'p' : 'a' : 't' : 'i' : 'b' : 'l' : 'e' : '_' : 'p' : []) = tok 28 (CTokGnuC GnuCTyCompat)
+idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'v' : 'a' : '_' : 'a' : 'r' : 'g' : []) = tok 16 (CTokGnuC GnuCVaArg)
+idkwtok ('c' : 'a' : 's' : 'e' : []) = tok 4 CTokCase
+idkwtok ('c' : 'h' : 'a' : 'r' : []) = tok 4 CTokChar
+idkwtok ('_' : '_' : 'c' : 'o' : 'm' : 'p' : 'l' : 'e' : 'x' : '_' : '_' : []) = tok 11 CTokComplex
+idkwtok ('_' : '_' : 'c' : 'o' : 'n' : 's' : 't' : []) = tok 7 CTokConst
+idkwtok ('c' : 'o' : 'n' : 's' : 't' : []) = tok 5 CTokConst
+idkwtok ('_' : '_' : 'c' : 'o' : 'n' : 's' : 't' : '_' : '_' : []) = tok 9 CTokConst
+idkwtok ('c' : 'o' : 'n' : 't' : 'i' : 'n' : 'u' : 'e' : []) = tok 8 CTokContinue
+idkwtok ('d' : 'e' : 'f' : 'a' : 'u' : 'l' : 't' : []) = tok 7 CTokDefault
+idkwtok ('d' : 'o' : []) = tok 2 CTokDo
+idkwtok ('d' : 'o' : 'u' : 'b' : 'l' : 'e' : []) = tok 6 CTokDouble
+idkwtok ('e' : 'l' : 's' : 'e' : []) = tok 4 CTokElse
+idkwtok ('e' : 'n' : 'u' : 'm' : []) = tok 4 CTokEnum
+idkwtok ('_' : '_' : 'e' : 'x' : 't' : 'e' : 'n' : 's' : 'i' : 'o' : 'n' : '_' : '_' : []) = tok 13 (CTokGnuC GnuCExtTok)
+idkwtok ('e' : 'x' : 't' : 'e' : 'r' : 'n' : []) = tok 6 CTokExtern
+idkwtok ('f' : 'l' : 'o' : 'a' : 't' : []) = tok 5 CTokFloat
+idkwtok ('_' : '_' : 'f' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : []) = tok 10 (CTokFloatN 128 False)
+idkwtok ('f' : 'o' : 'r' : []) = tok 3 CTokFor
+idkwtok ('_' : '_' : 'f' : 'p' : '1' : '6' : []) = tok 6 (CTokFloatN 16 False)
+idkwtok ('g' : 'o' : 't' : 'o' : []) = tok 4 CTokGoto
+idkwtok ('i' : 'f' : []) = tok 2 CTokIf
+idkwtok ('_' : '_' : 'i' : 'm' : 'a' : 'g' : []) = tok 6 (CTokGnuC GnuCComplexImag)
+idkwtok ('_' : '_' : 'i' : 'm' : 'a' : 'g' : '_' : '_' : []) = tok 8 (CTokGnuC GnuCComplexImag)
+idkwtok ('_' : '_' : 'i' : 'n' : 'l' : 'i' : 'n' : 'e' : []) = tok 8 CTokInline
+idkwtok ('i' : 'n' : 'l' : 'i' : 'n' : 'e' : []) = tok 6 CTokInline
+idkwtok ('_' : '_' : 'i' : 'n' : 'l' : 'i' : 'n' : 'e' : '_' : '_' : []) = tok 10 CTokInline
+idkwtok ('i' : 'n' : 't' : []) = tok 3 CTokInt
+idkwtok ('_' : '_' : 'i' : 'n' : 't' : '1' : '2' : '8' : []) = tok 8 CTokInt128
+idkwtok ('_' : '_' : 'i' : 'n' : 't' : '1' : '2' : '8' : '_' : 't' : []) = tok 10 CTokInt128
+idkwtok ('_' : '_' : 'l' : 'a' : 'b' : 'e' : 'l' : '_' : '_' : []) = tok 9 CTokLabel
+idkwtok ('l' : 'o' : 'n' : 'g' : []) = tok 4 CTokLong
+idkwtok ('_' : '_' : 'n' : 'o' : 'n' : 'n' : 'u' : 'l' : 'l' : []) = tok 9 CTokNonnull
+idkwtok ('_' : '_' : 'n' : 'u' : 'l' : 'l' : 'a' : 'b' : 'l' : 'e' : []) = tok 10 CTokNullable
+idkwtok ('_' : '_' : 'r' : 'e' : 'a' : 'l' : []) = tok 6 (CTokGnuC GnuCComplexReal)
+idkwtok ('_' : '_' : 'r' : 'e' : 'a' : 'l' : '_' : '_' : []) = tok 8 (CTokGnuC GnuCComplexReal)
+idkwtok ('r' : 'e' : 'g' : 'i' : 's' : 't' : 'e' : 'r' : []) = tok 8 CTokRegister
+idkwtok ('_' : '_' : 'r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : []) = tok 10 CTokRestrict
+idkwtok ('r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : []) = tok 8 CTokRestrict
+idkwtok ('_' : '_' : 'r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : '_' : '_' : []) = tok 12 CTokRestrict
+idkwtok ('r' : 'e' : 't' : 'u' : 'r' : 'n' : []) = tok 6 CTokReturn
+idkwtok ('s' : 'h' : 'o' : 'r' : 't' : []) = tok 5 CTokShort
+idkwtok ('_' : '_' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 8 CTokSigned
+idkwtok ('s' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 6 CTokSigned
+idkwtok ('_' : '_' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : '_' : '_' : []) = tok 10 CTokSigned
+idkwtok ('s' : 'i' : 'z' : 'e' : 'o' : 'f' : []) = tok 6 CTokSizeof
+idkwtok ('s' : 't' : 'a' : 't' : 'i' : 'c' : []) = tok 6 CTokStatic
+idkwtok ('s' : 't' : 'r' : 'u' : 'c' : 't' : []) = tok 6 CTokStruct
+idkwtok ('s' : 'w' : 'i' : 't' : 'c' : 'h' : []) = tok 6 CTokSwitch
+idkwtok ('_' : '_' : 't' : 'h' : 'r' : 'e' : 'a' : 'd' : []) = tok 8 CTokThread
+idkwtok ('t' : 'y' : 'p' : 'e' : 'd' : 'e' : 'f' : []) = tok 7 CTokTypedef
+idkwtok ('_' : '_' : 't' : 'y' : 'p' : 'e' : 'o' : 'f' : []) = tok 8 CTokTypeof
+idkwtok ('t' : 'y' : 'p' : 'e' : 'o' : 'f' : []) = tok 6 CTokTypeof
+idkwtok ('_' : '_' : 't' : 'y' : 'p' : 'e' : 'o' : 'f' : '_' : '_' : []) = tok 10 CTokTypeof
+idkwtok ('_' : '_' : 'u' : 'i' : 'n' : 't' : '1' : '2' : '8' : []) = tok 9 (CTokUInt128)
+idkwtok ('_' : '_' : 'u' : 'i' : 'n' : 't' : '1' : '2' : '8' : '_' : 't' : []) = tok 11 (CTokUInt128)
+idkwtok ('u' : 'n' : 'i' : 'o' : 'n' : []) = tok 5 CTokUnion
+idkwtok ('u' : 'n' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 8 CTokUnsigned
+idkwtok ('v' : 'o' : 'i' : 'd' : []) = tok 4 CTokVoid
+idkwtok ('_' : '_' : 'v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : []) = tok 10 CTokVolatile
+idkwtok ('v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : []) = tok 8 CTokVolatile
+idkwtok ('_' : '_' : 'v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : '_' : '_' : []) = tok 12 CTokVolatile
+idkwtok ('w' : 'h' : 'i' : 'l' : 'e' : []) = tok 5 CTokWhile
+
+-- For OpenCL tokens
+idkwtok ('_' : '_' : 'k' : 'e' : 'r' : 'n' : 'e' : 'l' : []) = tok 8 CTokClKernel
+idkwtok ('_' : '_' : 'r' : 'e' : 'a' : 'd' : '_' : 'o' : 'n' : 'l' : 'y' : []) = tok 11 CTokClRdOnly
+idkwtok ('_' : '_' : 'w' : 'r' : 'i' : 't' : 'e' : '_' : 'o' : 'n' : 'l' : 'y' : []) = tok 12 CTokClWrOnly
+idkwtok ('_' : '_' : 'g' : 'l' : 'o' : 'b' : 'a' : 'l' : []) = tok 8 CTokClGlobal
+idkwtok ('_' : '_' : 'l' : 'o' : 'c' : 'a' : 'l' : []) = tok 7 CTokClLocal
+
 idkwtok cs = \pos -> do
   name <- getNewName
+  let len = case length cs of l -> l
   let ident = mkIdent pos cs name
   tyident <- isTypeIdent ident
   if tyident
-    then return (CTokTyIdent pos ident)
-    else return (CTokIdent   pos ident)
+    then return (CTokTyIdent (pos,len) ident)
+    else return (CTokIdent   (pos,len) ident)
 
 ignoreAttribute :: P ()
 ignoreAttribute = skipTokens (0::Int)
   where skipTokens :: Int -> P ()
         skipTokens n = do
-          tok <- lexToken
-          case tok of
+          ntok <- lexToken' False
+          case ntok 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)
+tok :: Int -> (PosLength -> CToken) -> Position -> P CToken
+tok len tc pos = return (tc (pos,len))
 
-linePragmaAdjust :: String -> Position -> Position
-linePragmaAdjust str p@(Position fname row _) = Position fname' row' 1
+adjustLineDirective :: Int -> String -> Position -> Position
+adjustLineDirective pragmaLen str pos =
+    offs' `seq` fname' `seq` row' `seq` parent' `seq` (position offs' fname' row' 1 parent')
     where
+    -- offset changes by length of #line pragma
+    offs'           = (posOffset pos) + pragmaLen
     str'            = dropWhite . drop 1 $ str
     (rowStr, str'') = span isDigit str'
+    -- row changes to the first number in the line pragma
     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
+    (fnameStr,str'''') = span (/= '"') . drop 1 $ str'''
+    fname = posFile pos
+    no_fn = null str''' || (fmap fst (uncons str''') /= Just '"') || (fmap fst (uncons str'''') /= Just '"')
+    -- filename changes to new filename, if specified
+    fname' | no_fn = fname
+           -- try and get more sharing of file name strings
+           | fnameStr == fname     = fname
+           | otherwise             = fnameStr
+    -- analye flags
+    min_flag = find_min_flag (5 :: Int) (drop 1 str'''')
+    find_min_flag cur_min = select_min . span isDigit . dropWhile (not . isDigit)
+      where
+        select_min (numStr, fstr') | null numStr = cur_min
+                                   | otherwise = find_min_flag (read numStr `min` cur_min) fstr'
+    parent = posParent pos
+    parent' = case min_flag of
+                1 -> Just pos -- push
+                2 -> case parent >>= posParent of
+                         Nothing -> Nothing          -- pop/underflow
+                         Just gp -> gp `seq` Just gp -- pop
+                3 -> parent   -- unchanged stack, system header info
+                4 -> parent   -- unchanged stack, extern C info
+                _ -> Nothing
     --
     dropWhite = dropWhile (\c -> c == ' ' || c == '\t')
 
@@ -374,8 +508,8 @@
 
 {-# INLINE token_ #-}
 -- token that ignores the string
-token_ :: (Position -> CToken) -> Position -> Int -> InputStream -> P CToken
-token_ tok pos _ _ = return (tok pos)
+token_ :: Int -> (PosLength -> CToken) -> Position -> Int -> InputStream -> P CToken
+token_ len mkTok pos _ _ = return (mkTok (pos,len))
 
 {-# INLINE token_fail #-}
 -- error token
@@ -386,17 +520,17 @@
 
 {-# INLINE token #-}
 -- token that uses the string
-token :: (Position -> a -> CToken) -> (String -> a)
+token :: (PosLength -> a -> CToken) -> (String -> a)
       -> Position -> Int -> InputStream -> P CToken
-token tok read pos len str = return (tok pos (read $ takeChars len str))
+token mkTok fromStr pos len str = return (mkTok (pos,len) (fromStr $ takeChars len str))
 
 {-# INLINE token_plus #-}
 -- token that may fail
-token_plus :: (Position -> a -> CToken) -> (String -> Either String a)
+token_plus :: (PosLength -> 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
+token_plus mkTok fromStr pos len str =
+  case fromStr (takeChars len str) of Left err -> failP pos [ "Lexical error ! ", err ]
+                                      Right ok -> return $! mkTok (pos,len) ok
 
 -- -----------------------------------------------------------------------------
 -- The input type
@@ -407,6 +541,14 @@
 alexInputPrevChar :: AlexInput -> Char
 alexInputPrevChar _ = error "alexInputPrevChar not used"
 
+-- for alex-3.0
+alexGetByte :: AlexInput -> Maybe (Word8, AlexInput)
+alexGetByte (p,is) | inputStreamEmpty is = Nothing
+                   | otherwise  = let (b,s) = takeByte is in
+                                  -- this is safe for latin-1, but ugly
+                                  let p' = alexMove p (chr (fromIntegral b)) in p' `seq`
+                                  Just (b, (p', s))
+
 alexGetChar :: AlexInput -> Maybe (Char,AlexInput)
 alexGetChar (p,is) | inputStreamEmpty is = Nothing
                    | otherwise  = let (c,s) = takeChar is in
@@ -414,47 +556,63 @@
                                   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)
+alexMove pos ' '  = incPos pos 1
+alexMove pos '\n' = retPos pos
+alexMove pos '\r' = incOffset pos 1
+alexMove pos _    = incPos pos 1
 
 lexicalError :: P a
 lexicalError = do
   pos <- getPos
-  (c,cs) <- liftM takeChar getInput
+  (c,_) <- 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)
+  lastTok <- getLastToken
+  failP (posOf lastTok)
         ["Syntax error !",
-         "The symbol `" ++ show tok ++ "' does not fit here."]
+         "The symbol `" ++ show lastTok ++ "' does not fit here."]
 
+-- there is a problem with ignored tokens here (that aren't skipped)
+-- consider
+-- 1 > int x;
+-- 2 > LINE "ex.c" 4
+-- 4 > int y;
+-- when we get to LINE, we have [int (1,1),x (1,4)] in the token cache.
+-- Now we run
+-- > action  (pos 2,0) 14 "LINE \"ex.c\" 3\n"
+-- which in turn adjusts the position and then calls lexToken again
+-- we get `int (pos 4,0)', and have [x (1,4), int (4,1) ] in the token cache (fine)
+-- but then, we again call setLastToken when returning and get [int (4,1),int (4,1)] in the token cache (bad)
+-- to resolve this, recursive calls invoke lexToken' False.
 lexToken :: P CToken
-lexToken = do
+lexToken = lexToken' True
+
+lexToken' :: Bool -> P CToken
+lexToken' modifyCache = do
   pos <- getPos
   inp <- getInput
   case alexScan (pos, inp) 0 of
-    AlexEOF -> return CTokEof
-    AlexError inp' -> lexicalError
-    AlexSkip  (pos', inp') len -> do
+    AlexEOF -> do
+        handleEofToken
+        return CTokEof
+    AlexError _inp -> lexicalError
+    AlexSkip  (pos', inp') _len -> do
         setPos pos'
         setInput inp'
-        lexToken
+        lexToken' modifyCache
     AlexToken (pos', inp') len action -> do
         setPos pos'
         setInput inp'
-        tok <- action pos len inp
-        setLastToken tok
-        return tok
+        nextTok <- action pos len inp
+        when modifyCache $ setLastToken nextTok
+        return nextTok
 
 lexC :: (CToken -> P a) -> P a
 lexC cont = do
-  tok <- lexToken
-  cont tok
+  nextTok <- lexToken
+  cont nextTok
 }
diff --git a/src/Language/C/Parser/Parser.y b/src/Language/C/Parser/Parser.y
--- a/src/Language/C/Parser/Parser.y
+++ b/src/Language/C/Parser/Parser.y
@@ -29,6 +29,8 @@
 --    <http://www.sivity.net/projects/language.c/wiki/Cee>
 ------------------------------------------------------------------
 {
+{-# LANGUAGE LambdaCase #-}
+
 module Language.C.Parser.Parser (
   -- * Parse a C translation unit
   parseC,
@@ -94,6 +96,7 @@
 --
 --- TODO ----------------------------------------------------------------------
 --
+--  !* We ignore C11 _Atomic type annotations
 --  !* 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)
@@ -102,16 +105,18 @@
 --  !* see `We're being far to liberal here' (... struct definition within structs)
 --  * Documentation isn't complete and consistent yet.
 
-import Prelude    hiding (reverse)
+import Prelude
 import qualified Data.List as List
-
+import Control.Monad (mplus)
+import Data.Maybe (listToMaybe, mapMaybe)
 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.Parser.Tokens    (CToken(..), GnuCTok(..), ClangCTok (..), posLenOfTok)
+import Language.C.Parser.ParserMonad (P, failP, execParser, getNewName, addTypedef, shadowTypedef, getCurrentPosition,
+                                      enterScope, leaveScope, getLastToken, getSavedToken, ParseError(..))
 
-import Language.C.Data.RList
+import Language.C.Data.RList (Reversed(..))
+import qualified Language.C.Data.RList as RList
 import Language.C.Data.InputStream
 import Language.C.Data.Ident
 import Language.C.Data.Name
@@ -182,6 +187,8 @@
 '}'		{ CTokRBrace	_ }
 "..."		{ CTokEllipsis	_ }
 alignof		{ CTokAlignof	_ }
+alignas         { CTokAlignas   _ }
+"_Atomic"       { CTokAtomic    _ }
 asm		{ CTokAsm	_ }
 auto		{ CTokAuto	_ }
 break		{ CTokBreak	_ }
@@ -198,13 +205,30 @@
 enum		{ CTokEnum	_ }
 extern		{ CTokExtern	_ }
 float		{ CTokFloat	_ }
+"__bf16"	{ CTokBFloat16	_ }
+"__fp16"	{ CTokFloatN  16 False _ }
+"_Float16"	{ CTokFloatN  16 False _ }
+"_Float16x"	{ CTokFloatN  16 True _ }
+"_Float32"	{ CTokFloatN  32 False _ }
+"_Float32x"	{ CTokFloatN  32 True _ }
+"_Float64"	{ CTokFloatN  64 False _ }
+"_Float64x"	{ CTokFloatN  64 True _ }
+"_Float128"	{ CTokFloatN 128 False _ }
+"_Float128x"	{ CTokFloatN 128 True _ }
+"__float128"	{ CTokFloatN 128 False _ }
 for		{ CTokFor	_ }
+"_Generic"      { CTokGeneric   _ }
 goto		{ CTokGoto	_ }
 if		{ CTokIf	_ }
 inline		{ CTokInline	_ }
 int		{ CTokInt	_ }
+"__int128"      { CTokInt128    _ }
+"__int128_t"    { CTokInt128    _ }
 long		{ CTokLong	_ }
 "__label__"	{ CTokLabel	_ }
+"_Noreturn"     { CTokNoreturn  _ }
+"_Nullable"     { CTokNullable  _ }
+"_Nonnull"      { CTokNonnull   _ }
 register	{ CTokRegister	_ }
 restrict	{ CTokRestrict	_ }
 return		{ CTokReturn	_ }
@@ -212,12 +236,15 @@
 signed		{ CTokSigned	_ }
 sizeof		{ CTokSizeof	_ }
 static		{ CTokStatic	_ }
+"_Static_assert"{ CTokStaticAssert _ }
 struct		{ CTokStruct	_ }
 switch		{ CTokSwitch	_ }
 typedef		{ CTokTypedef	_ }
 typeof		{ CTokTypeof	_ }
 "__thread"	{ CTokThread	_ }
 union		{ CTokUnion	_ }
+"__uint128"     { CTokUInt128   _ }
+"__uint128_t"   { CTokUInt128   _ }
 unsigned	{ CTokUnsigned	_ }
 void		{ CTokVoid	_ }
 volatile	{ CTokVolatile	_ }
@@ -236,15 +263,26 @@
 "__builtin_va_arg"		{ CTokGnuC GnuCVaArg    _ }
 "__builtin_offsetof"		{ CTokGnuC GnuCOffsetof _ }
 "__builtin_types_compatible_p"	{ CTokGnuC GnuCTyCompat _ }
+"__builtin_convertvector"	{ CTokClangC _ ClangBuiltinConvertVector }
+clangcversion   { CTokClangC _ (ClangCVersionTok $$) } -- Clang version literal
+"__builtin_bit_cast" { CTokClangC _ ClangCBitCast }
+"__kernel"	{ CTokClKernel	_ }             -- OpenCL kernel function
+"__read_only"	{ CTokClRdOnly	_ }             -- OpenCL read only qualifier
+"__write_only"	{ CTokClWrOnly	_ }             -- OpenCL write only qualifier
+"__global"	{ CTokClGlobal	_ }             -- OpenCL global variable
+"__local"	{ CTokClLocal	_ }             -- OpenCL local variable
 
 %%
 
 
 -- parse a complete C translation unit
---
+-- we have to take special care of empty translation units
 translation_unit :: { CTranslUnit }
 translation_unit
-  : ext_decl_list	{% withNodeInfo $1 $ CTranslUnit (reverse $1) }
+  : ext_decl_list	{% let decls = RList.reverse $1 in
+                       case decls of
+                           []     -> do{ n <- getNewName; p <- getCurrentPosition; return $ CTranslUnit decls (mkNodeInfo' p (p,0) n) }
+                           (d:ds) -> withNodeInfo d $ CTranslUnit decls }
 
 
 -- parse a list of external declarations, making up a C translation unit (C99 6.9)
@@ -252,25 +290,24 @@
 -- * GNU extensions:
 --     allow empty translation_unit
 --     allow redundant ';'
---
 ext_decl_list :: { Reversed [CExtDecl] }
 ext_decl_list
-  : {- empty -}					{ empty }
-  | ext_decl_list ';'			{ $1 }
-  | ext_decl_list external_declaration	{ $1 `snoc` $2 }
+  : {- empty -}					        { RList.empty }
+  | ext_decl_list ';'			        { $1 }
+  | ext_decl_list external_declaration	{ $1 `RList.snoc` $2 }
 
 
 -- parse external C declaration (C99 6.9)
 --
 -- * GNU extensions:
---     allow extension keyword before external declaration
+--     allow extension keyword before external declaration (TODO: discarded)
 --     asm definitions
 external_declaration :: { CExtDecl }
 external_declaration
-  : function_definition		              { CFDefExt $1 }
+  : function_definition		                  { CFDefExt $1 }
   | declaration			                  { CDeclExt $1 }
-  | "__extension__" external_declaration  { $2 }
-  | asm '(' string_literal ')' ';'		  { CAsmExt $3 }
+  | "__extension__" external_declaration          { $2 }
+  | asm '(' string_literal ')' ';'		  {% withNodeInfo $1 $ CAsmExt $3 }
 
 
 -- parse C function definition (C99 6.9.1)
@@ -292,10 +329,10 @@
 function_definition :: { CFunDef }
 function_definition
   :                            function_declarator compound_statement
-  	{% leaveScope >> (withNodeInfo $1 $ CFunDef [] $1 [] $2) }
+	  {% leaveScope >> (withNodeInfo $1 $ CFunDef [] $1 [] $2) }
 
-  |                      attrs function_declarator compound_statement
-    {% leaveScope >> (withNodeInfo $2 $ CFunDef (liftCAttrs $1) $2 [] $3) }
+  | attrs                      function_declarator compound_statement
+	  {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftCAttrs $1) $2 [] $3) }
 
   | declaration_specifier      function_declarator compound_statement
 	  {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }
@@ -304,36 +341,36 @@
 	  {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }
 
   | declaration_qualifier_list function_declarator compound_statement
-	  {% leaveScope >> (withNodeInfo $1 $ CFunDef (reverse $1) $2 [] $3) }
+	  {% leaveScope >> (withNodeInfo $1 $ CFunDef (RList.reverse $1) $2 [] $3) }
 
-  | type_qualifier_list   function_declarator compound_statement
+  | type_qualifier_list        function_declarator compound_statement
 	  {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 [] $3) }
 
-  | type_qualifier_list   attrs function_declarator compound_statement
+  | 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 }
+  	{% withNodeInfo $1 $ CFunDef [] $1 (RList.reverse $2) $3 }
 
   |                      attrs function_declarator_old declaration_list compound_statement
-  	{% withNodeInfo $2 $ CFunDef (liftCAttrs $1) $2 (reverse $3) $4 }
+  	{% withNodeInfo $2 $ CFunDef (liftCAttrs $1) $2 (RList.reverse $3) $4 }
 
   | declaration_specifier      function_declarator_old declaration_list compound_statement
-  	{% withNodeInfo $1 $ CFunDef $1 $2 (reverse $3) $4 }
+  	{% withNodeInfo $1 $ CFunDef $1 $2 (RList.reverse $3) $4 }
 
   | type_specifier             function_declarator_old declaration_list compound_statement
-  	{% withNodeInfo $1 $ CFunDef $1 $2 (reverse $3) $4 }
+  	{% withNodeInfo $1 $ CFunDef $1 $2 (RList.reverse $3) $4 }
 
   | declaration_qualifier_list function_declarator_old declaration_list compound_statement
-  	{% withNodeInfo $1 $ CFunDef (reverse $1) $2 (reverse $3) $4 }
+  	{% withNodeInfo $1 $ CFunDef (RList.reverse $1) $2 (RList.reverse $3) $4 }
 
   | type_qualifier_list   function_declarator_old declaration_list compound_statement
-  	{% withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 (reverse $3) $4 }
+  	{% withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 (RList.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 }
+  	{% withNodeInfo $1 $ CFunDef (liftTypeQuals $1  ++ liftCAttrs $2) $3 (RList.reverse $4) $5 }
 
 -- Read declarator and put function
 function_declarator :: { CDeclr }
@@ -364,7 +401,7 @@
 --
 labeled_statement :: { CStat }
 labeled_statement
-  : identifier ':' attrs_opt statement		{% withNodeInfo $2 $ CLabel $1 $4 $3 }
+  : identifier ':' attrs_opt statement		{% withNodeInfo $1 $ 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
@@ -378,10 +415,10 @@
 compound_statement :: { CStat }
 compound_statement
   : '{' enter_scope block_item_list leave_scope '}'
-  	{% withNodeInfo $1 $ CCompound [] (reverse $3) }
+  	{% withNodeInfo $1 $ CCompound [] (RList.reverse $3) }
 
   | '{' enter_scope label_declarations block_item_list leave_scope '}'
-  	{% withNodeInfo $1 $ CCompound (reverse $3) (reverse $4) }
+  	{% withNodeInfo $1 $ CCompound (RList.reverse $3) (RList.reverse $4) }
 
 
 -- No syntax for these, just side effecting semantic actions.
@@ -394,8 +431,8 @@
 
 block_item_list :: { Reversed [CBlockItem] }
 block_item_list
-  : {- empty -}			{ empty }
-  | block_item_list block_item	{ $1 `snoc` $2 }
+  : {- empty -}			{ RList.empty }
+  | block_item_list block_item	{ $1 `RList.snoc` $2 }
 
 block_item :: { CBlockItem }
 block_item
@@ -417,7 +454,7 @@
 	{% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }
 
   | declaration_qualifier_list function_declarator compound_statement
-	{% leaveScope >> (withNodeInfo $1 $ CFunDef (reverse $1) $2 [] $3) }
+	{% leaveScope >> (withNodeInfo $1 $ CFunDef (RList.reverse $1) $2 [] $3) }
 
   | type_qualifier_list   function_declarator compound_statement
 	{% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 [] $3) }
@@ -428,8 +465,8 @@
 
 label_declarations :: { Reversed [Ident] }
 label_declarations
-  : "__label__" identifier_list ';'			{ $2 }
-  | label_declarations "__label__" identifier_list ';'	{ $1 `rappendr` $3 }
+  : "__label__" identifier_list ';'			{ $2  }
+  | label_declarations "__label__" identifier_list ';'	{ $1 `RList.rappendr` $3 }
 
 
 -- parse C expression statement (C99 6.8.3)
@@ -450,7 +487,7 @@
   | if '(' expression ')' statement else statement
 	{% withNodeInfo $1 $ CIf $3 $5 (Just $7) }
 
-  | switch '(' expression ')' statement	
+  | switch '(' expression ')' statement
 	{% withNodeInfo $1 $ CSwitch $3 $5 }
 
 
@@ -479,9 +516,9 @@
 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 }
+  | 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)
@@ -502,36 +539,40 @@
   	{% 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) }
+  	{% withNodeInfo $1 $ CAsmStmt $2 $4 $6 $8 $10 }
 
 
 maybe_type_qualifier :: { Maybe CTypeQual }
 maybe_type_qualifier
   : {- empty -}		  { Nothing }
-  | type_qualifier	{ Just $1 }
+  | type_qualifier	  { Just $1 }
 
 asm_operands :: { [CAsmOperand] }
 asm_operands
   : {- empty -}				{ [] }
-  | nonnull_asm_operands		{ reverse $1 }
+  | nonnull_asm_operands    { RList.reverse $1 }
 
 nonnull_asm_operands :: { Reversed [CAsmOperand] }
 nonnull_asm_operands
-  : asm_operand					{ singleton $1 }
-  | nonnull_asm_operands ',' asm_operand	{ $1 `snoc` $3 }
+  : asm_operand					          { RList.singleton $1 }
+  | nonnull_asm_operands ',' asm_operand  { $1 `RList.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 }
-
+  : string_literal '(' expression ')'			      {% withNodeInfo $1 $ CAsmOperand Nothing $1 $3 }
+  | '[' ident ']' string_literal '(' expression ')'   {% withNodeInfo $1 $ CAsmOperand (Just $2) $4 $6 }
+  | '[' tyident ']' string_literal '(' expression ')' {% withNodeInfo $1 $ CAsmOperand (Just $2) $4 $6 }
 
-asm_clobbers :: { Reversed [CStrLit] }
+asm_clobbers :: { [CStrLit] }
 asm_clobbers
-  : string_literal			            { singleton $1 }
-  | asm_clobbers ',' string_literal	{ $1 `snoc` $3 }
+  : {- empty -}             { [] }
+  | nonnull_asm_clobbers    { RList.reverse $1 }
 
+nonnull_asm_clobbers :: { Reversed [CStrLit] }
+nonnull_asm_clobbers
+  : string_literal                          { RList.singleton $1 }
+  | nonnull_asm_clobbers ',' string_literal { $1 `RList.snoc` $3 }
+
 {-
 ---------------------------------------------------------------------------------------------------------------
 ---------------------------------------------------------------------------------------------------------------
@@ -540,18 +581,20 @@
 ---------------------------------------------------------------------------------------------------------------
 
 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.
+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
+storage_class              :-   typedef | extern | static | auto | register | _Thread_local | __kernel | __global | __local
+function_specifier         :-   inline | _Noreturn
+alignment_specifier        :-   _Alignas (type_name) | _Alignas (constant_expr)
+
+type_qualifier             :-   const | volatile | restrict | _Atomic | _Nullable | _Nonnull | __read_only | __write_only
 type_qualifier_list        :-   type_qualifier+
 
-declaration_qualifier      :-   storage_class | type_qualifier
+declaration_qualifier      :-   storage_class | type_qualifier | function_specifier | alginment_specifier
 declaration_qualifier_list :-   <permute> type_qualifier* storage_class+
 
 qualifiers                 :-   declaration_qualifier_list | type_qualifier_list
@@ -590,7 +633,7 @@
 
 -- Declaration
 ---------------------------------------------------------------------------------------------------------------
-declaration = sue_declaration | declaration_list
+declaration = sue_declaration | declaration_list | _Static_assert(..)
 
 ---------------------------------------------------------------------------------------------------------------
 ---------------------------------------------------------------------------------------------------------------
@@ -637,37 +680,32 @@
 
 
 
--- parse C declaration (C99 6.7)
+-- parse C declaration (C11 6.7)
+--
+-- * new form in C11
+--     _Static_assert(expr,string_literal)
 declaration :: { CDecl }
 declaration
   : sue_declaration_specifier ';'
-  	{% withNodeInfo $1 $ CDecl (reverse $1) [] }
+  	{% withNodeInfo $1 $ CDecl (RList.reverse $1) [] }
 
   | sue_type_specifier ';'
-  	{% withNodeInfo $1 $ CDecl (reverse $1) [] }
+  	{% withNodeInfo $1 $ CDecl (RList.reverse $1) [] }
 
   | declaring_list ';'
-  	{ case $1 of
-            CDecl declspecs dies at ->
-              CDecl declspecs (List.reverse dies) at }
+  	{% case $1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)) }
 
   | default_declaring_list ';'
-  	{ case $1 of
-            CDecl declspecs dies at ->
-              CDecl declspecs (List.reverse dies) at }
-
+  	{% case $1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)) }
+  | "_Static_assert" '(' constant_expression ',' string_literal ')' ';'
+        {% withNodeInfo $1 $ CStaticAssert $3 $5 }
 
 declaration_list :: { Reversed [CDecl] }
 declaration_list
-  : {- empty -}					{ empty }
-  | declaration_list declaration		{ $1 `snoc` $2 }
+  : {- empty -}					 { RList.empty }
+  | declaration_list declaration { $1 `RList.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? }
 --
@@ -679,10 +717,11 @@
 default_declaring_list :: { CDecl }
 default_declaring_list
   : declaration_qualifier_list identifier_declarator asm_attrs_opt {-{}-} initializer_opt
-  	{% let declspecs = reverse $1 in
+  	{% let declspecs = RList.reverse $1 in
   	   do{ declr <- withAsmNameAttrs $3 $2
            ; doDeclIdent declspecs declr
-           ; withNodeInfo $1 $ CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }}
+           ; withNodeInfo $1 $
+                CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }}
 
   | type_qualifier_list identifier_declarator asm_attrs_opt {-{}-} initializer_opt
   	{% let declspecs = liftTypeQuals $1 in
@@ -708,7 +747,7 @@
              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) }
+               withLength at $ CDecl declspecs ((Just (reverseDeclr declr), $6, Nothing) : dies)  }
 
 -- assembler, followed by attribute annotation
 asm_attrs_opt :: { (Maybe CStrLit, [CAttr]) }
@@ -754,48 +793,59 @@
 --
 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
+  : basic_declaration_specifier		{ RList.reverse $1 }	-- Arithmetic or void
+  | sue_declaration_specifier		{ RList.reverse $1 }	-- Struct/Union/Enum
+  | typedef_declaration_specifier	{ RList.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.
+-- A mixture of type qualifiers (const, volatile, restrict, _Atomic, _Nonnull, _Nullable, __read_only, __write_only),
+-- function specifiers (inline, _Noreturn),
+-- alignment specifiers (_Alignas) and
+-- storage class specifiers (extern, static, auto, register, _Thread_local, __kernel, __global, __local),
+-- in any order, but containing at least one storage class specifier.
 --
--- declaration_qualifier_list :- <permute> type_qualifier* storage_class+
+-- declaration_qualifier_list :- <permute> type_qualifier* alignment_specifier* function_specifier* storage_class+
 --
 -- GNU extensions
 --   * arbitrary interleaved __attribute__ annotations
 --
 declaration_qualifier_list :: { Reversed [CDeclSpec] }
 declaration_qualifier_list
-  : storage_class
-  	{ singleton (CStorageSpec $1) }
+  : declaration_qualifier_without_types
+        { RList.singleton $1 }
 
-  | attrs storage_class
-  	{ reverseList (liftCAttrs $1) `snoc` (CStorageSpec $2) }
+  | attrs declaration_qualifier_without_types
+  	{ reverseList (liftCAttrs $1) `RList.snoc` $2 }
 
-  | type_qualifier_list storage_class
-  	{ rmap CTypeQual $1 `snoc` CStorageSpec $2 }
+  | type_qualifier_list declaration_qualifier_without_types
+  	{ RList.rmap CTypeQual $1 `RList.snoc` $2 }
 
-  | type_qualifier_list attrs storage_class
-  	{ (rmap CTypeQual $1 `rappend` liftCAttrs $2) `snoc` CStorageSpec $3 }
+  | type_qualifier_list attrs declaration_qualifier_without_types
+  	{ (RList.rmap CTypeQual $1 `RList.rappend` liftCAttrs $2) `RList.snoc` $3 }
 
   | declaration_qualifier_list declaration_qualifier
-  	{ $1 `snoc` $2 }
+  	{ $1 `RList.snoc` $2 }
 
   | declaration_qualifier_list attr
   	{ addTrailingAttrs $1 $2 }
 
 --
--- declaration_qualifier :- storage_class | type_qualifier
+-- declaration_qualifier :- storage_class | type_qualifier | function_specifier | alignment_specifier
 --
 declaration_qualifier :: { CDeclSpec }
 declaration_qualifier
-  : storage_class		{ CStorageSpec $1 }
-  | type_qualifier		{ CTypeQual $1 }     -- const or volatile
+  : storage_class		     { CStorageSpec $1 }
+  | type_qualifier		     { CTypeQual $1 }
+  | function_specifier               { CFunSpec $1 }
+  | alignment_specifier              { CAlignSpec $1 }
 
 
+declaration_qualifier_without_types :: { CDeclSpec }
+  : storage_class		     { CStorageSpec $1 }
+  | function_specifier               { CFunSpec $1 }
+  | alignment_specifier              { CAlignSpec $1 }
+
+
 -- parse C storage class specifier (C99 6.7.1)
 --
 -- * GNU extensions: '__thread' thread local storage
@@ -808,20 +858,37 @@
   | auto			{% withNodeInfo $1 $ CAuto }
   | register			{% withNodeInfo $1 $ CRegister }
   | "__thread"			{% withNodeInfo $1 $ CThread }
+  | "__kernel"			{% withNodeInfo $1 $ CClKernel }
+  | "__global"			{% withNodeInfo $1 $ CClGlobal }
+  | "__local"			{% withNodeInfo $1 $ CClLocal }
 
+-- parse C function specifier (C11 6.7.4)
+function_specifier :: { CFunSpec }
+function_specifier
+  : inline		{% withNodeInfo $1 $ CInlineQual }
+  | "_Noreturn"         {% withNodeInfo $1 $ CNoreturnQual }
 
+-- parse C alignment specifier (C11 6.7.5)
+alignment_specifier :: { CAlignSpec }
+alignment_specifier
+  : alignas '(' type_name ')'           {% withNodeInfo $1 $ CAlignAsType $3 }
+  | alignas '(' constant_expression ')' {% withNodeInfo $1 $ CAlignAsExpr $3 }
+
 -- 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 :- <permute> type_qualifier* (basic_type_name+ | elaborated_type_name | g)
 --
+-- Type specifier _Atomic(type) is not yet supported because of conflicts with type qualifier _Atomic
 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_specifier		{ RList.reverse $1 }	-- Arithmetic or void
+  | sue_type_specifier			{ RList.reverse $1 }	-- Struct/Union/Enum
+  | typedef_type_specifier		{ RList.reverse $1 }	-- Typedef
+--  | "_Atomic" '(' type_name ')'                         -- _Atomic(type)
+--        {% withNodeInfo $1 $ \at -> [CTypeSpec (CAtomicType $3 at)] }
 
 basic_type_name :: { CTypeSpec }
 basic_type_name
@@ -836,8 +903,24 @@
   | unsigned			{% withNodeInfo $1 $ CUnsigType }
   | "_Bool"			{% withNodeInfo $1 $ CBoolType }
   | "_Complex"			{% withNodeInfo $1 $ CComplexType }
+  | "__int128"                  {% withNodeInfo $1 $ CInt128Type }
+  | "__int128_t"                {% withNodeInfo $1 $ CInt128Type }
+  | "__uint128"                 {% withNodeInfo $1 $ CUInt128Type }
+  | "__uint128_t"               {% withNodeInfo $1 $ CUInt128Type }
+  | "__bf16"                    {% withNodeInfo $1 $ CBFloat16Type }
+  | "__fp16"                    {% withNodeInfo $1 $ (CFloatNType 16 False) }
+  | "_Float16"                  {% withNodeInfo $1 $ (CFloatNType 16 False) }
+  | "_Float16x"                 {% withNodeInfo $1 $ (CFloatNType 16 True) }
+  | "_Float32"                  {% withNodeInfo $1 $ (CFloatNType 32 False) }
+  | "_Float32x"                 {% withNodeInfo $1 $ (CFloatNType 32 True) }
+  | "_Float64"                  {% withNodeInfo $1 $ (CFloatNType 64 False) }
+  | "_Float64x"                 {% withNodeInfo $1 $ (CFloatNType 64 True) }
+  | "_Float128"                 {% withNodeInfo $1 $ (CFloatNType 128 False) }
+  | "_Float128x"                {% withNodeInfo $1 $ (CFloatNType 128 True) }
+  | "__float128"                {% withNodeInfo $1 $ (CFloatNType 128 False) }
 
 
+
 -- 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.
@@ -850,16 +933,16 @@
 basic_declaration_specifier :: { Reversed [CDeclSpec] }
 basic_declaration_specifier
   : declaration_qualifier_list basic_type_name
-  	{ $1 `snoc` CTypeSpec $2 }
+  	{ $1 `RList.snoc` CTypeSpec $2 }
 
   | basic_type_specifier storage_class
-  	{ $1 `snoc` CStorageSpec $2 }
+  	{ $1 `RList.snoc` CStorageSpec $2 }
 
   | basic_declaration_specifier declaration_qualifier
-  	{ $1 `snoc` $2 }
+  	{ $1 `RList.snoc` $2 }
 
   | basic_declaration_specifier basic_type_name
-  	{ $1 `snoc` CTypeSpec $2 }
+  	{ $1 `RList.snoc` CTypeSpec $2 }
 
   | basic_declaration_specifier attr
   	{ addTrailingAttrs $1 $2 }
@@ -877,22 +960,22 @@
 basic_type_specifier
   -- Arithmetic or void
   : basic_type_name
-  	{ singleton (CTypeSpec $1) }
+  	{ RList.singleton (CTypeSpec $1) }
 
   | attrs basic_type_name
-  	{ (reverseList $ liftCAttrs $1) `snoc` (CTypeSpec $2) }
+  	{ (reverseList $ liftCAttrs $1) `RList.snoc` (CTypeSpec $2) }
 
   | type_qualifier_list basic_type_name
-  	{ rmap CTypeQual $1 `snoc` CTypeSpec $2 }
+  	{ RList.rmap CTypeQual $1 `RList.snoc` CTypeSpec $2 }
 
   | type_qualifier_list attrs basic_type_name
-  	{ rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec $3 }
+  	{ RList.rmap CTypeQual $1 `RList.rappend` (liftCAttrs $2) `RList.snoc` CTypeSpec $3 }
 
   | basic_type_specifier type_qualifier
-  	{ $1 `snoc` CTypeQual $2 }
+  	{ $1 `RList.snoc` CTypeQual $2 }
 
   | basic_type_specifier basic_type_name
-  	{ $1 `snoc` CTypeSpec $2 }
+  	{ $1 `RList.snoc` CTypeSpec $2 }
 
   | basic_type_specifier attr
      { addTrailingAttrs $1 $2 }
@@ -907,14 +990,14 @@
 sue_declaration_specifier :: { Reversed [CDeclSpec] }
 sue_declaration_specifier
   : declaration_qualifier_list elaborated_type_name
-  	{ $1 `snoc` CTypeSpec $2 }
+  	{ $1 `RList.snoc` CTypeSpec $2 }
 
   | sue_type_specifier storage_class
-  	{ $1 `snoc` CStorageSpec $2 }
+  	{ $1 `RList.snoc` CStorageSpec $2 }
 
   | sue_declaration_specifier declaration_qualifier
-  	{ $1 `snoc` $2 }
-  	
+  	{ $1 `RList.snoc` $2 }
+
   | sue_declaration_specifier attr
   	{ addTrailingAttrs $1 $2 }
 
@@ -931,20 +1014,20 @@
 sue_type_specifier
   -- struct/union/enum
   : elaborated_type_name
-  	{ singleton (CTypeSpec $1) }
+  	{ RList.singleton (CTypeSpec $1) }
 
   | attrs elaborated_type_name
-  	{ (reverseList $ liftCAttrs $1) `snoc` (CTypeSpec $2) }
+  	{ (reverseList $ liftCAttrs $1) `RList.snoc` (CTypeSpec $2) }
 
   | type_qualifier_list elaborated_type_name
-  	{ rmap CTypeQual $1 `snoc` CTypeSpec $2 }
+  	{ RList.rmap CTypeQual $1 `RList.snoc` CTypeSpec $2 }
 
   | type_qualifier_list attrs elaborated_type_name
-  	{ rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec $3 }
+  	{ RList.rmap CTypeQual  $1 `RList.rappend` (liftCAttrs $2) `RList.snoc` CTypeSpec $3 }
 
   | sue_type_specifier type_qualifier
-  	{ $1 `snoc` CTypeQual $2 }
-  	
+  	{ $1 `RList.snoc` CTypeQual $2 }
+
   | sue_type_specifier attr
     { addTrailingAttrs $1 $2 }
 
@@ -960,19 +1043,19 @@
 typedef_declaration_specifier :: { Reversed [CDeclSpec] }
 typedef_declaration_specifier
   : typedef_type_specifier storage_class
-  	{ $1 `snoc` CStorageSpec $2 }
-  	
+  	{ $1 `RList.snoc` CStorageSpec $2 }
+
   | declaration_qualifier_list tyident
-  	{% withNodeInfo $1 $ \at -> $1 `snoc` CTypeSpec (CTypeDef $2 at) }
+  	{% withNodeInfo $2 $ \at -> $1 `RList.snoc` CTypeSpec (CTypeDef $2 at) }
 
   | declaration_qualifier_list typeof '(' expression ')'
-  	{% withNodeInfo $1 $ \at -> $1 `snoc` CTypeSpec (CTypeOfExpr $4 at) }
+  	{% withNodeInfo $2 $ \at -> $1 `RList.snoc` CTypeSpec (CTypeOfExpr $4 at) }
 
   | declaration_qualifier_list typeof '(' type_name ')'
-  	{% withNodeInfo $1 $ \at -> $1 `snoc` CTypeSpec (CTypeOfType $4 at) }
+  	{% withNodeInfo $2 $ \at -> $1 `RList.snoc` CTypeSpec (CTypeOfType $4 at) }
 
   | typedef_declaration_specifier declaration_qualifier
-  	{ $1 `snoc` $2 }
+  	{ $1 `RList.snoc` $2 }
 
   | typedef_declaration_specifier attr
   	{ addTrailingAttrs $1 $2 }
@@ -986,44 +1069,44 @@
 typedef_type_specifier :: { Reversed [CDeclSpec] }
 typedef_type_specifier
   : tyident
-  	{% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeDef $1 at)) }
+  	{% withNodeInfo $1 $ \at -> RList.singleton (CTypeSpec (CTypeDef $1 at)) }
 
   | typeof '(' expression ')'
-  	{% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeOfExpr $3 at)) }
+  	{% withNodeInfo $1 $ \at -> RList.singleton (CTypeSpec (CTypeOfExpr $3 at)) }
 
   | typeof '(' type_name ')'
-  	{% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeOfType $3 at)) }
+  	{% withNodeInfo $1 $ \at -> RList.singleton (CTypeSpec (CTypeOfType $3 at)) }
 
   | type_qualifier_list tyident
-  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `snoc` CTypeSpec (CTypeDef $2 at) }
+  	{% withNodeInfo $2 $ \at -> RList.rmap CTypeQual  $1 `RList.snoc` CTypeSpec (CTypeDef $2 at) }
 
   | type_qualifier_list typeof '(' expression ')'
-  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `snoc` CTypeSpec (CTypeOfExpr $4 at) }
+  	{% withNodeInfo $2 $ \at -> RList.rmap CTypeQual  $1 `RList.snoc` CTypeSpec (CTypeOfExpr $4 at) }
 
   | type_qualifier_list typeof '(' type_name ')'
-  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `snoc` CTypeSpec (CTypeOfType $4 at) }
+  	{% withNodeInfo $2 $ \at -> RList.rmap CTypeQual  $1 `RList.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)) }
+  	{% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `RList.snoc` (CTypeSpec (CTypeDef $2 at)) }
 
   | attrs typeof '(' expression ')'
-  	{% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc`  (CTypeSpec (CTypeOfExpr $4 at)) }
+  	{% withNodeInfo $1 $ \at -> reverseList (liftCAttrs $1) `RList.snoc`  (CTypeSpec (CTypeOfExpr $4 at)) }
 
   | attrs typeof '(' type_name ')'
-  	{% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc`  (CTypeSpec (CTypeOfType $4 at)) }
+  	{% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `RList.snoc`  (CTypeSpec (CTypeOfType $4 at)) }
 
   | type_qualifier_list attrs tyident
-  	{% withNodeInfo $2 $ \at -> rmap CTypeQual  $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeDef $3 at) }
+  	{% withNodeInfo $3 $ \at -> RList.rmap CTypeQual  $1 `RList.rappend` (liftCAttrs $2) `RList.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) }
+  	{% withNodeInfo $3 $ \at -> RList.rmap CTypeQual  $1 `RList.rappend` (liftCAttrs $2) `RList.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) }
+  	{% withNodeInfo $3 $ \at -> RList.rmap CTypeQual  $1 `RList.rappend` (liftCAttrs $2) `RList.snoc` CTypeSpec (CTypeOfType $5 at) }
 
   | typedef_type_specifier type_qualifier
-  	{ $1 `snoc` CTypeQual $2 }
+  	{ $1 `RList.snoc` CTypeQual $2 }
 
   | typedef_type_specifier attr
   	{ addTrailingAttrs $1 $2 }
@@ -1048,11 +1131,9 @@
 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 }
-
+  	{% withNodeInfo $1 $ CStruct (unL $1) (Just $3) (Just$ RList.reverse $5) $2 }
   | struct_or_union attrs_opt '{' struct_declaration_list  '}'
-  	{% withNodeInfo $1 $ CStruct (unL $1) Nothing   (Just$ reverse $4) $2 }
-
+  	{% withNodeInfo $1 $ CStruct (unL $1) Nothing   (Just$ RList.reverse $4) $2 }
   | struct_or_union attrs_opt identifier
   	{% withNodeInfo $1 $ CStruct (unL $1) (Just $3) Nothing $2 }
 
@@ -1065,9 +1146,10 @@
 
 struct_declaration_list :: { Reversed [CDecl] }
 struct_declaration_list
-  : {- empty -}						{ empty }
+  : {- empty -}						{ RList.empty }
   | struct_declaration_list ';'				{ $1 }
-  | struct_declaration_list struct_declaration		{ $1 `snoc` $2 }
+  | struct_declaration_list struct_declaration		{ $1 `RList.snoc` maybe $2 (addAlign $2) (containsAlign $1) }
+  | struct_declaration_list alignment_specifier struct_declaration		{ $1 `RList.snoc` ( addAlign $3 $2 )}
 
 
 -- parse C structure declaration (C99 6.7.2.1)
@@ -1159,48 +1241,56 @@
 enum_specifier :: { CEnum }
 enum_specifier
   : enum attrs_opt '{' enumerator_list '}'
-  	{% withNodeInfo $1 $ CEnum Nothing   (Just$ reverse $4) $2 }
+  	{% withNodeInfo $1 $ CEnum Nothing   (Just$ RList.reverse $4) $2 }
 
   | enum attrs_opt '{' enumerator_list ',' '}'
-  	{% withNodeInfo $1 $ CEnum Nothing   (Just$ reverse $4) $2 }
+  	{% withNodeInfo $1 $ CEnum Nothing   (Just$ RList.reverse $4) $2 }
 
   | enum attrs_opt identifier '{' enumerator_list '}'
-  	{% withNodeInfo $1 $ CEnum (Just $3) (Just$ reverse $5) $2 }
+  	{% withNodeInfo $1 $ CEnum (Just $3) (Just$ RList.reverse $5) $2 }
 
   | enum attrs_opt identifier '{' enumerator_list ',' '}'
-  	{% withNodeInfo $1 $ CEnum (Just $3) (Just$ reverse $5) $2 }
+  	{% withNodeInfo $1 $ CEnum (Just $3) (Just$ RList.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					{ RList.singleton $1 }
+  | enumerator_list ',' enumerator		{ $1 `RList.snoc` $3 }
 
 
 enumerator :: { (Ident, Maybe CExpr) }
 enumerator
-  : identifier					{ ($1, Nothing) }
-  | identifier '=' constant_expression		{ ($1, Just $3) }
+  : identifier                               { ($1, Nothing) }
+  | identifier attrs                         { ($1, Nothing) }
+  | identifier attrs '=' constant_expression { ($1, Just $4) }
+  | identifier '=' constant_expression       { ($1, Just $3) }
 
 
--- parse C type qualifier (C99 6.7.3)
+-- parse C type qualifier (C11 6.7.3)
 --
+-- concerning atomic, note:  If the _Atomic keyword is immediately followed by a left
+-- parenthesis, it should be interpreted as a type specifier (with a type name), not as a type qualifier
 type_qualifier :: { CTypeQual }
 type_qualifier
   : const		{% withNodeInfo $1 $ CConstQual }
   | volatile		{% withNodeInfo $1 $ CVolatQual }
   | restrict		{% withNodeInfo $1 $ CRestrQual }
-  | inline		{% withNodeInfo $1 $ CInlineQual }
+  | "_Nullable"         {% withNodeInfo $1 $ CNullableQual }
+  | "_Nonnull"          {% withNodeInfo $1 $ CNonnullQual }
+  | "_Atomic"           {% withNodeInfo $1 $ CAtomicQual }
+  | "__read_only"       {% withNodeInfo $1 $ CClRdOnlyQual }
+  | "__write_only"      {% withNodeInfo $1 $ CClWrOnlyQual }
 
--- a list containing at least one type_qualifier (const, volatile, restrict, inline)
+-- a list containing at least one type_qualifier (const, volatile, restrict, inline, _Noreturn, __read_only, __write_only)
 --    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}	
+  : attrs_opt type_qualifier	             { reverseList (map CAttrQual $1) `RList.snoc` $2 }
+  | type_qualifier_list type_qualifier	     { $1 `RList.snoc` $2 }
+  | type_qualifier_list attrs type_qualifier { ($1 `RList.rappend` map CAttrQual $2) `RList.snoc` $3}
 
 -- parse C declarator (C99 6.7.5)
 --
@@ -1264,10 +1354,10 @@
   	{% withAttribute $1 $2 $ ptrDeclr $3 [] }
 
   | '*' type_qualifier_list  parameter_typedef_declarator
-  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }
+  	{% withNodeInfo $1 $ ptrDeclr $3 (RList.reverse $2) }
 
   | '*' type_qualifier_list attrs parameter_typedef_declarator
-  	{% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2)  }
+  	{% withAttribute $1 $3 $ ptrDeclr $4 (RList.reverse $2)  }
 
 -- clean_postfix_typedef_declarator :- ( attrs? clean_typedef_declarator ) declarator_postfix?
 --
@@ -1292,17 +1382,17 @@
   	{% withNodeInfo $1 $ ptrDeclr $3 [] }
 
   | '*' type_qualifier_list '(' simple_paren_typedef_declarator ')'
-  	{% withNodeInfo $1 $ ptrDeclr $4 (reverse $2) }
+  	{% withNodeInfo $1 $ ptrDeclr $4 (RList.reverse $2) }
   | '*' type_qualifier_list attrs '(' simple_paren_typedef_declarator ')'
-  	{% withAttribute $1 $3 $ ptrDeclr $5 (reverse $2)  }
+  	{% withAttribute $1 $3 $ ptrDeclr $5 (RList.reverse $2)  }
 
   | '*' paren_typedef_declarator
   	{% withNodeInfo $1 $ ptrDeclr $2 [] }
 
   | '*' type_qualifier_list paren_typedef_declarator
-  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }
+  	{% withNodeInfo $1 $ ptrDeclr $3 (RList.reverse $2) }
   | '*' type_qualifier_list attrs paren_typedef_declarator
-  	{% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) }
+  	{% withAttribute $1 $3 $ ptrDeclr $4 (RList.reverse $2) }
 
 -- redundant paren to left of tname
 paren_postfix_typedef_declarator :: { CDeclrR }
@@ -1352,10 +1442,10 @@
   	{% withAttribute $1 $2 $ ptrDeclr $3 [] }
 
   | '*' type_qualifier_list identifier_declarator
-  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }
+  	{% withNodeInfo $1 $ ptrDeclr $3 (RList.reverse $2) }
 
   | '*' type_qualifier_list attrs identifier_declarator
-  	{% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) }
+  	{% withAttribute $1 $3 $ ptrDeclr $4 (RList.reverse $2) }
 
 postfix_identifier_declarator :: { CDeclrR }
 postfix_identifier_declarator
@@ -1401,12 +1491,12 @@
   	{% withNodeInfo $1 $ ptrDeclr $2 [] } -- FIXME: no attr possible here ???
 
   | '*' type_qualifier_list old_function_declarator
-  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }
+  	{% withNodeInfo $1 $ ptrDeclr $3 (RList.reverse $2) }
 
 postfix_old_function_declarator :: { CDeclrR }
 postfix_old_function_declarator
   : paren_identifier_declarator '(' identifier_list ')'
-  	{% withNodeInfo $2 $ funDeclr $1 (Left $ reverse $3) [] }
+  	{% withNodeInfo $1 $ funDeclr $1 (Left $ RList.reverse $3) [] }
 
   | '(' old_function_declarator ')'
   	{ $2 }
@@ -1420,13 +1510,13 @@
 parameter_type_list :: { ([CDecl], Bool) }
 parameter_type_list
   : {- empty -}				{ ([], False)}
-  | parameter_list			{ (reverse $1, False) }
-  | parameter_list ',' "..."		{ (reverse $1, True) }
+  | parameter_list			{ (RList.reverse $1, False) }
+  | parameter_list ',' "..."		{ (RList.reverse $1, True) }
 
 parameter_list :: { Reversed [CDecl] }
 parameter_list
-  : parameter_declaration				{ singleton $1 }
-  | parameter_list ',' parameter_declaration	{ $1 `snoc` $3 }
+  : parameter_declaration				{ RList.singleton $1 }
+  | parameter_list ',' parameter_declaration	{ $1 `RList.snoc` $3 }
 
 parameter_declaration :: { CDecl }
 parameter_declaration
@@ -1443,13 +1533,13 @@
   	{% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }
 
   | declaration_qualifier_list
-  	{% withNodeInfo $1 $ CDecl (reverse $1) [] }
+  	{% withNodeInfo $1 $ CDecl (RList.reverse $1) [] }
 
   | declaration_qualifier_list abstract_declarator
-  	{% withNodeInfo $1 $ CDecl (reverse $1) [(Just (reverseDeclr $2), Nothing, Nothing)] }
+  	{% withNodeInfo $1 $ CDecl (RList.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)] }
+  	{% withNodeInfo $1 $ CDecl (RList.reverse $1) [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }
 
   | type_specifier
   	{% withNodeInfo $1 $ CDecl $1 [] }
@@ -1477,8 +1567,8 @@
 
 identifier_list :: { Reversed [Ident] }
 identifier_list
-  : ident				{ singleton $1 }
-  | identifier_list ',' ident		{ $1 `snoc` $3 }
+  : ident				{ RList.singleton $1 }
+  | identifier_list ',' ident		{ $1 `RList.snoc` $3 }
 
 
 -- parse C type name (C99 6.7.6)
@@ -1547,19 +1637,19 @@
   	{% 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 }
+  	{% withNodeInfo $1 $ \at declr -> arrDeclr declr (RList.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 }
+  	{% withAttributePF $1 $3 $ \at declr -> arrDeclr declr (RList.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 }
+  	{% withAttributePF $1 $4 $ \at declr -> arrDeclr declr (RList.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 }
+  	{% withAttributePF $1 ($3 ++ $5) $ \at declr -> arrDeclr declr (RList.reverse $2) False True  (Just $6) at }
 
   | '[' '*' attrs_opt ']'
   	{% withAttributePF $1 $3 $ \at declr -> arrDeclr declr [] True False Nothing at }
@@ -1567,9 +1657,9 @@
   	{% 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 }
+  	{% withAttributePF $1 $4 $ \at declr -> arrDeclr declr (RList.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 }
+  	{% withAttributePF $1 ($3 ++ $5) $ \at declr -> arrDeclr declr (RList.reverse $2) True False Nothing at }
 
 unary_abstract_declarator :: { CDeclrR }
 unary_abstract_declarator
@@ -1577,13 +1667,13 @@
   	{% withNodeInfo $1 $ ptrDeclr emptyDeclr [] }
 
   | '*' type_qualifier_list attrs_opt
-  	{% withAttribute $1 $3 $ ptrDeclr emptyDeclr (reverse $2)  }
+  	{% withAttribute $1 $3 $ ptrDeclr emptyDeclr (RList.reverse $2)  }
 
   | '*' abstract_declarator
   	{% withNodeInfo $1 $ ptrDeclr $2 [] }
 
   | '*' type_qualifier_list abstract_declarator
-  	{% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }
+  	{% withNodeInfo $1 $ ptrDeclr $3 (RList.reverse $2) }
 
   | '*' attrs
   	{% withAttribute $1 $2 $ ptrDeclr emptyDeclr [] }
@@ -1611,8 +1701,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_list '}'		{% withNodeInfo $1 $ CInitList (RList.reverse $2) }
+  | '{' initializer_list ',' '}'	{% withNodeInfo $1 $ CInitList (RList.reverse $2) }
 
 
 initializer_opt :: { Maybe CInit }
@@ -1623,11 +1713,11 @@
 
 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) }
+  : {- empty -}						{ RList.empty }
+  | initializer						{ RList.singleton ([],$1) }
+  | designation initializer				{ RList.singleton ($1,$2) }
+  | initializer_list ',' initializer			{ $1 `RList.snoc` ([],$3) }
+  | initializer_list ',' designation initializer	{ $1 `RList.snoc` ($3,$4) }
 
 
 -- designation
@@ -1638,15 +1728,15 @@
 --
 designation :: { [CDesignator] }
 designation
-  : designator_list '='		{ reverse $1 }
+  : designator_list '='		{ RList.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				{ RList.singleton $1 }
+ | designator_list designator		{ $1 `RList.snoc` $2 }
 
 
 designator :: { CDesignator }
@@ -1662,10 +1752,11 @@
   	{% withNodeInfo $1 $ CRangeDesig $2 $4 }
 
 
--- parse C primary expression (C99 6.5.1)
+-- parse C primary expression (C11 6.5.1)
 --
 -- We cannot use a typedef name as a variable
 --
+-- * C11: generic selection
 -- * GNU extensions:
 --     allow a compound statement as an expression
 --     __builtin_va_arg
@@ -1673,11 +1764,12 @@
 --     __builtin_types_compatible_p
 primary_expression :: { CExpr }
 primary_expression
-  : ident		       {% withNodeInfo $1 $ CVar $1 }
+  : ident		 {% withNodeInfo $1 $ CVar $1 }
   | constant	  	 { CConst $1 }
-  | string_literal { CConst (liftStrLit $1) }
-  | '(' expression ')'	{ $2 }
-
+  | string_literal       { CConst (liftStrLit $1) }
+  | '(' expression ')'	 { $2 }
+  | "_Generic" '(' assignment_expression ',' generic_assoc_list ')'
+        {% withNodeInfo $1 $ CGenericSelection $3 (RList.reverse $5) }
   -- GNU extensions
   | '(' compound_statement ')'
   	{% withNodeInfo $1 $ CStatExpr $2 }
@@ -1686,17 +1778,33 @@
   	{% withNodeInfo $1 $ CBuiltinExpr . CBuiltinVaArg $3 $5 }
 
   | "__builtin_offsetof" '(' type_name ',' offsetof_member_designator ')'
-  	{% withNodeInfo $1 $ CBuiltinExpr . CBuiltinOffsetOf $3 (reverse $5) }
+  	{% withNodeInfo $1 $ CBuiltinExpr . CBuiltinOffsetOf $3 (RList.reverse $5) }
 
   | "__builtin_types_compatible_p" '(' type_name ',' type_name ')'
   	{% withNodeInfo $1 $ CBuiltinExpr . CBuiltinTypesCompatible $3 $5 }
 
+  | "__builtin_convertvector" '(' assignment_expression ',' type_name ')'
+    {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinConvertVector $3 $5 }
 
+  | "__builtin_bit_cast" '(' type_name ',' assignment_expression ')'
+    {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinBitCast $3 $5 }
+
+-- Generic Selection association list (C11 6.5.1.1)
+--
+-- TODO: introduce AST type for generic association
+generic_assoc_list :: { Reversed [(Maybe CDecl, CExpr)] }
+  : generic_assoc_list ',' generic_assoc { $1 `RList.snoc` $3 }
+  | generic_assoc                        { RList.singleton $1 }
+generic_assoc :: { (Maybe CDecl, CExpr) }
+generic_assoc
+  : type_name ':' assignment_expression { (Just $1, $3) }
+  | default   ':' assignment_expression { (Nothing, $3) }
+
 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 }
+  : identifier						                        {% withNodeInfo $1 $ RList.singleton . CMemberDesig $1 }
+  | offsetof_member_designator '.' identifier		  {% withNodeInfo $3 $ ($1 `RList.snoc`) . CMemberDesig $3 }
+  | offsetof_member_designator '[' expression ']'	{% withNodeInfo $3 $ ($1 `RList.snoc`) . CArrDesig $3 }
 
 
 -- parse C postfix expression (C99 6.5.2)
@@ -1707,37 +1815,37 @@
   	{ $1 }
 
   | postfix_expression '[' expression ']'
-  	{% withNodeInfo $2 $ CIndex $1 $3 }
+  	{% withNodeInfo $1 $ CIndex $1 $3 }
 
   | postfix_expression '(' ')'
-  	{% withNodeInfo $2 $ CCall $1 [] }
+  	{% withNodeInfo $1 $ CCall $1 [] }
 
   | postfix_expression '(' argument_expression_list ')'
-  	{% withNodeInfo $2 $ CCall $1 (reverse $3) }
+  	{% withNodeInfo $1 $ CCall $1 (RList.reverse $3) }
 
   | postfix_expression '.' identifier
-  	{% withNodeInfo $2 $ CMember $1 $3 False }
+  	{% withNodeInfo $1 $ CMember $1 $3 False }
 
   | postfix_expression "->" identifier
-  	{% withNodeInfo $2 $ CMember $1 $3 True }
+  	{% withNodeInfo $1 $ CMember $1 $3 True }
 
   | postfix_expression "++"
-  	{% withNodeInfo $2 $ CUnary CPostIncOp $1 }
+  	{% withNodeInfo $1 $ CUnary CPostIncOp $1 }
 
   | postfix_expression "--"
-  	{% withNodeInfo $2 $ CUnary CPostDecOp $1 }
+  	{% withNodeInfo $1 $ CUnary CPostDecOp $1 }
 
   | '(' type_name ')' '{' initializer_list '}'
-  	{% withNodeInfo $4 $ CCompoundLit $2 (reverse $5) }
+  	{% withNodeInfo $1 $ CCompoundLit $2 (RList.reverse $5) }
 
   | '(' type_name ')' '{' initializer_list ',' '}'
-  	{% withNodeInfo $4 $ CCompoundLit $2 (reverse $5) }
+  	{% withNodeInfo $1 $ CCompoundLit $2 (RList.reverse $5) }
 
 
 argument_expression_list :: { Reversed [CExpr] }
 argument_expression_list
-  : assignment_expression				{ singleton $1 }
-  | argument_expression_list ',' assignment_expression	{ $1 `snoc` $3 }
+  : assignment_expression				{ RList.singleton $1 }
+  | argument_expression_list ',' assignment_expression	{ $1 `RList.snoc` $3 }
 
 
 -- parse C unary expression (C99 6.5.3)
@@ -1791,13 +1899,13 @@
   	{ $1 }
 
   | multiplicative_expression '*' cast_expression
-  	{% withNodeInfo $2 $ CBinary CMulOp $1 $3 }
+  	{% withNodeInfo $1 $ CBinary CMulOp $1 $3 }
 
   | multiplicative_expression '/' cast_expression
-  	{% withNodeInfo $2 $ CBinary CDivOp $1 $3 }
+  	{% withNodeInfo $1 $ CBinary CDivOp $1 $3 }
 
   | multiplicative_expression '%' cast_expression
-  	{% withNodeInfo $2 $ CBinary CRmdOp $1 $3 }
+  	{% withNodeInfo $1 $ CBinary CRmdOp $1 $3 }
 
 
 -- parse C additive expression (C99 6.5.6)
@@ -1808,10 +1916,10 @@
   	{ $1 }
 
   | additive_expression '+' multiplicative_expression
-  	{% withNodeInfo $2 $ CBinary CAddOp $1 $3 }
+  	{% withNodeInfo $1 $ CBinary CAddOp $1 $3 }
 
   | additive_expression '-' multiplicative_expression
-  	{% withNodeInfo $2 $ CBinary CSubOp $1 $3 }
+  	{% withNodeInfo $1 $ CBinary CSubOp $1 $3 }
 
 
 -- parse C shift expression (C99 6.5.7)
@@ -1822,10 +1930,10 @@
   	{ $1 }
 
   | shift_expression "<<" additive_expression
-  	{% withNodeInfo $2 $ CBinary CShlOp $1 $3 }
+  	{% withNodeInfo $1 $ CBinary CShlOp $1 $3 }
 
   | shift_expression ">>" additive_expression
-  	{% withNodeInfo $2 $ CBinary CShrOp $1 $3 }
+  	{% withNodeInfo $1 $ CBinary CShrOp $1 $3 }
 
 
 -- parse C relational expression (C99 6.5.8)
@@ -1836,16 +1944,16 @@
   	{ $1 }
 
   | relational_expression '<' shift_expression
-  	{% withNodeInfo $2 $ CBinary CLeOp $1 $3 }
+  	{% withNodeInfo $1 $ CBinary CLeOp $1 $3 }
 
   | relational_expression '>' shift_expression
-  	{% withNodeInfo $2 $ CBinary CGrOp $1 $3 }
+  	{% withNodeInfo $1 $ CBinary CGrOp $1 $3 }
 
   | relational_expression "<=" shift_expression
-  	{% withNodeInfo $2 $ CBinary CLeqOp $1 $3 }
+  	{% withNodeInfo $1 $ CBinary CLeqOp $1 $3 }
 
   | relational_expression ">=" shift_expression
-  	{% withNodeInfo $2 $ CBinary CGeqOp $1 $3 }
+  	{% withNodeInfo $1 $ CBinary CGeqOp $1 $3 }
 
 
 -- parse C equality expression (C99 6.5.9)
@@ -1856,10 +1964,10 @@
   	{ $1 }
 
   | equality_expression "==" relational_expression
-  	{% withNodeInfo $2 $ CBinary CEqOp  $1 $3 }
+  	{% withNodeInfo $1 $ CBinary CEqOp  $1 $3 }
 
   | equality_expression "!=" relational_expression
-  	{% withNodeInfo $2 $ CBinary CNeqOp $1 $3 }
+  	{% withNodeInfo $1 $ CBinary CNeqOp $1 $3 }
 
 
 -- parse C bitwise and expression (C99 6.5.10)
@@ -1870,7 +1978,7 @@
   	{ $1 }
 
   | and_expression '&' equality_expression
-  	{% withNodeInfo $2 $ CBinary CAndOp $1 $3 }
+  	{% withNodeInfo $1 $ CBinary CAndOp $1 $3 }
 
 
 -- parse C bitwise exclusive or expression (C99 6.5.11)
@@ -1881,7 +1989,7 @@
   	{ $1 }
 
   | exclusive_or_expression '^' and_expression
-  	{% withNodeInfo $2 $ CBinary CXorOp $1 $3 }
+  	{% withNodeInfo $1 $ CBinary CXorOp $1 $3 }
 
 
 -- parse C bitwise or expression (C99 6.5.12)
@@ -1892,7 +2000,7 @@
   	{ $1 }
 
   | inclusive_or_expression '|' exclusive_or_expression
-  	{% withNodeInfo $2 $ CBinary COrOp $1 $3 }
+  	{% withNodeInfo $1 $ CBinary COrOp $1 $3 }
 
 
 -- parse C logical and expression (C99 6.5.13)
@@ -1903,7 +2011,7 @@
   	{ $1 }
 
   | logical_and_expression "&&" inclusive_or_expression
-  	{% withNodeInfo $2 $ CBinary CLndOp $1 $3 }
+  	{% withNodeInfo $1 $ CBinary CLndOp $1 $3 }
 
 
 -- parse C logical or expression (C99 6.5.14)
@@ -1914,7 +2022,7 @@
   	{ $1 }
 
   | logical_or_expression "||" logical_and_expression
-  	{% withNodeInfo $2 $ CBinary CLorOp $1 $3 }
+  	{% withNodeInfo $1 $ CBinary CLorOp $1 $3 }
 
 
 -- parse C conditional expression (C99 6.5.15)
@@ -1927,10 +2035,10 @@
   	{ $1 }
 
   | logical_or_expression '?' expression ':' conditional_expression
-  	{% withNodeInfo $2 $ CCond $1 (Just $3) $5 }
+  	{% withNodeInfo $1 $ CCond $1 (Just $3) $5 }
 
   | logical_or_expression '?' ':' conditional_expression
-  	{% withNodeInfo $2 $ CCond $1 Nothing $4 }
+  	{% withNodeInfo $1 $ CCond $1 Nothing $4 }
 
 
 -- parse C assignment expression (C99 6.5.16)
@@ -1944,7 +2052,7 @@
   	{ $1 }
 
   | unary_expression assignment_operator assignment_expression
-  	{% withNodeInfo $2 $ CAssign (unL $2) $1 $3 }
+  	{% withNodeInfo $1 $ CAssign (unL $2) $1 $3 }
 
 
 assignment_operator :: { Located CAssignOp }
@@ -1970,12 +2078,12 @@
   	{ $1 }
 
   | assignment_expression ',' comma_expression
-  	{% let es = reverse $3 in withNodeInfo es $ CComma ($1:es) }
+  	{% let es = RList.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 }
+  : assignment_expression			{ RList.singleton $1 }
+  | comma_expression ',' assignment_expression	{ $1 `RList.snoc` $3 }
 
 
 -- The following was used for clarity
@@ -2005,7 +2113,7 @@
 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 }
+  | cfloat        {% withNodeInfo $1 $ case $1 of CTokFLit _ f -> CFloatConst f }
 
 
 string_literal :: { CStrLit }
@@ -2014,14 +2122,16 @@
   	{% 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)) }
+  	{% withNodeInfo $1 $ case $1 of CTokSLit _ s -> CStrLit (concatCStrings (s : RList.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 }
+  : cstr			{ case $1 of CTokSLit _ s -> RList.singleton s }
+  | string_literal_list cstr	{ case $2 of CTokSLit _ s -> $1 `RList.snoc` s }
 
+clang_version_literal :: { ClangCVersion }
+  : clangcversion       { $1 }
 
 identifier :: { Ident }
 identifier
@@ -2043,11 +2153,11 @@
 
 attr :: { [CAttr] }
 attr
-  : "__attribute__" '(' '(' attribute_list ')' ')'	{ reverse $4 }
+  : "__attribute__" '(' '(' attribute_list ')' ')'	{ RList.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						          { case $1 of Nothing -> RList.empty; Just attr -> RList.singleton attr }
+  | attribute_list ',' attribute	{ (maybe id (flip RList.snoc) $3) $1 }
 
 
 attribute :: { Maybe CAttr }
@@ -2055,17 +2165,40 @@
   : {- 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 '(' attribute_params ')' {% withNodeInfo $1 $ Just . CAttr $1 (RList.reverse $3) }
   | ident '(' ')'					         {% withNodeInfo $1 $ Just . CAttr $1 [] }
 
+-- OS X 10.9 (Mavericks) makes use of more liberal attribute syntax
+-- that includes assignment-like expressions referencing version
+-- numbers.
+
 attribute_params :: { Reversed [CExpr] }
 attribute_params
-  : constant_expression					              { singleton $1 }
-  | attribute_params ',' constant_expression	{ $1 `snoc` $3 }
-
+  : constant_expression					              { RList.singleton $1 }
+  | unary_expression assignment_operator clang_version_literal { Reversed [] }
+  | unary_expression assignment_operator unary_expression { Reversed [] }
+  | attribute_params ',' constant_expression	{ $1 `RList.snoc` $3 }
+  | attribute_params ',' unary_expression assignment_operator unary_expression { $1 }
+  | attribute_params ',' unary_expression assignment_operator clang_version_literal { $1 }
 
 {
 
+containsAlign :: Reversed [CDecl] -> Maybe CAlignSpec
+containsAlign (Reversed input) = listToMaybe $ mapMaybe checkDecl input
+  where
+    checkDecl :: CDecl -> Maybe CAlignSpec
+    checkDecl = \case
+      CDecl list _ _ -> listToMaybe $ mapMaybe isAlignSpec list
+      _ -> Nothing
+
+    isAlignSpec :: CDeclSpec -> Maybe CAlignSpec
+    isAlignSpec = \case
+      CAlignSpec x -> Just x
+      _ -> Nothing
+
+addAlign :: CDecl -> CAlignmentSpecifier NodeInfo -> CDecl
+addAlign (CDecl list list2 a) align = CDecl (CAlignSpec align : list) list2 a
+
 --  sometimes it is neccessary to reverse an unreversed list
 reverseList :: [a] -> Reversed [a]
 reverseList = Reversed . List.reverse
@@ -2081,17 +2214,34 @@
 instance Pos (Located a) where
   posOf (L _ pos) = pos
 
+-- FIXME: the next 3 inlines here increase the object file size by  70%
+-- Check whether the speed win is worth it
 {-# INLINE withNodeInfo #-}
 withNodeInfo :: Pos node => node -> (NodeInfo -> a) -> P a
-withNodeInfo node mkAttributedNode = do
+withNodeInfo node mkAttrNode = do
   name <- getNewName
-  let attrs = mkNodeInfo (posOf node) name
-  attrs `seq` return (mkAttributedNode attrs)
+  lastTok <- getSavedToken
+  let firstPos = posOf node
+  let attrs = mkNodeInfo' firstPos (posLenOfTok $! lastTok) name
+  attrs `seq` return (mkAttrNode attrs)
 
+{-# INLINE withLength #-}
+withLength :: NodeInfo -> (NodeInfo -> a) -> P a
+withLength nodeinfo mkAttrNode = do
+  lastTok <- getSavedToken
+  let firstPos = posOfNode nodeinfo
+  let attrs = mkNodeInfo' firstPos (posLenOfTok $! lastTok)
+              (maybe (error "nameOfNode") id (nameOfNode nodeinfo))
+  attrs `seq` return (mkAttrNode 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
+    = CDeclr ide (RList.reverse reversedDDs) asmname cattrs at
+instance CNode (CDeclrR) where
+    nodeInfo (CDeclrR _ _ _ _ n) = n
+instance Pos (CDeclrR) where
+    posOf (CDeclrR _ _ _ _ n) = posOf n
 
 {-# INLINE withAttribute #-}
 withAttribute :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR) -> P CDeclrR
@@ -2150,7 +2300,7 @@
 
 appendDeclrAttrs :: [CAttr] -> CDeclrR -> CDeclrR
 appendDeclrAttrs newAttrs (CDeclrR ident (Reversed []) asmname cattrs at)
-    = CDeclrR ident empty asmname (cattrs ++ newAttrs) at
+    = CDeclrR ident RList.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
@@ -2159,22 +2309,20 @@
 
 ptrDeclr :: CDeclrR -> [CTypeQual] -> NodeInfo -> CDeclrR
 ptrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals at
-    = CDeclrR ident (derivedDeclrs `snoc` CPtrDeclr tyquals at) asmname cattrs dat
+    = CDeclrR ident (derivedDeclrs `RList.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
+    = CDeclrR ident (derivedDeclrs `RList.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 )
+    = arr_sz `seq` ( CDeclrR ident (derivedDeclrs `RList.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
+liftTypeQuals = map CTypeQual . RList.reverse
 
 -- lift CAttrs to DeclSpecs
 --
@@ -2185,12 +2333,12 @@
 -- 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
+    case RList.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 `RList.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)
+            -> (specs_init `RList.snoc` CTypeSpec (CEnumType (CEnum name (Just def) (def_attrs ++ new_attrs) e_node) node))
+        _ -> declspecs `RList.rappend` (liftCAttrs new_attrs)
 
 -- convenient instance, the position of a list of things is the position of
 -- the first thing in the list
@@ -2201,8 +2349,10 @@
 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 []
+emptyDeclr :: CDeclrR
+emptyDeclr       = CDeclrR Nothing RList.empty Nothing [] undefNode
+mkVarDeclr :: Ident -> NodeInfo -> CDeclrR
+mkVarDeclr ident = CDeclrR (Just ident) RList.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,
@@ -2213,7 +2363,7 @@
   case mIdent of
     Nothing -> return ()
     Just ident | any iypedef declspecs -> addTypedef ident
-               | otherwise               -> shadowTypedef ident
+               | otherwise             -> shadowTypedef ident
 
   where iypedef (CStorageSpec (CTypedef _)) = True
         iypedef _                           = False
diff --git a/src/Language/C/Parser/ParserMonad.hs b/src/Language/C/Parser/ParserMonad.hs
--- a/src/Language/C/Parser/ParserMonad.hs
+++ b/src/Language/C/Parser/ParserMonad.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE CPP #-}
+{-# OPTIONS_GHC -Wwarn=incomplete-uni-patterns #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Language.C.Syntax.ParserMonad
@@ -33,7 +35,10 @@
   getInput,          -- :: P String
   setInput,          -- :: String -> P ()
   getLastToken,      -- :: P CToken
+  getSavedToken,     -- :: P CToken
   setLastToken,      -- :: CToken -> P ()
+  handleEofToken,    -- :: P ()
+  getCurrentPosition,-- :: P Position
   ParseError(..),
   ) where
 import Language.C.Data.Error (internalErr, showErrorInfo,ErrorInfo(..),ErrorLevel(..))
@@ -41,8 +46,12 @@
 import Language.C.Data.InputStream
 import Language.C.Data.Name    (Name)
 import Language.C.Data.Ident    (Ident)
-import Language.C.Parser.Tokens (CToken)
+import Language.C.Parser.Tokens (CToken(CTokEof))
 
+import Prelude hiding (Applicative(..), MonadFail(..))
+import Control.Applicative (Applicative(..))
+import Control.Monad (liftM, ap)
+import Control.Monad.Fail (MonadFail (..))
 import Data.Set  (Set)
 import qualified Data.Set as Set (fromList, insert, member, delete)
 
@@ -59,6 +68,7 @@
         curPos     :: !Position,        -- position at current input location
         curInput   :: !InputStream,      -- the current input
         prevToken  ::  CToken,          -- the previous token
+        savedToken ::  CToken,          -- and the token before that
         namesupply :: ![Name],          -- the name unique supply
         tyidents   :: !(Set Ident),     -- the set of typedef'ed identifiers
         scopes     :: ![Set Ident]      -- the tyident sets for outer scopes
@@ -66,11 +76,23 @@
 
 newtype P a = P { unP :: PState -> ParseResult a }
 
+instance Functor P where
+  fmap = liftM
+
+instance Applicative P where
+  pure = returnP
+  (<*>) = ap
+
 instance Monad P where
-  return = returnP
   (>>=) = thenP
+#if !MIN_VERSION_base(4,13,0)
   fail m = getPos >>= \pos -> failP pos [m]
+#endif
 
+#if MIN_VERSION_base(4,9,0)
+instance MonadFail P where
+  fail m = getPos >>= \pos -> failP pos [m]
+#endif
 
 -- | execute the given parser on the supplied input stream.
 --   returns 'ParseError' if the parser failed, and a pair of
@@ -87,6 +109,7 @@
           curPos = pos,
           curInput = input,
           prevToken = internalErr "CLexer.execParser: Touched undefined token!",
+          savedToken = internalErr "CLexer.execParser: Touched undefined token (safed token)!",
           namesupply = names,
           tyidents = Set.fromList builtins,
           scopes   = []
@@ -107,7 +130,7 @@
 failP pos msg = P $ \_ -> PFailed msg pos
 
 getNewName :: P Name
-getNewName = P $ \s@PState{namesupply=(n:ns)} -> POk s{namesupply=ns} n
+getNewName = P $ \s@PState{namesupply=(n:ns)} -> n `seq` POk s{namesupply=ns} n
 
 setPos :: Position -> P ()
 setPos pos = P $ \s -> POk s{curPos=pos} ()
@@ -151,5 +174,17 @@
 getLastToken :: P CToken
 getLastToken = P $ \s@PState{prevToken=tok} -> POk s tok
 
+getSavedToken :: P CToken
+getSavedToken = P $ \s@PState{savedToken=tok} -> POk s tok
+
+-- | @setLastToken modifyCache tok@
 setLastToken :: CToken -> P ()
-setLastToken tok = P $ \s -> POk s{prevToken=tok} ()
+setLastToken CTokEof = P $ \s -> POk s{savedToken=(prevToken s)} ()
+setLastToken tok      = P $ \s -> POk s{prevToken=tok,savedToken=(prevToken s)} ()
+
+-- | handle an End-Of-File token (changes savedToken)
+handleEofToken :: P ()
+handleEofToken = P $ \s -> POk s{savedToken=(prevToken s)} ()
+
+getCurrentPosition :: P Position
+getCurrentPosition = P $ \s@PState{curPos=pos} -> POk s pos
diff --git a/src/Language/C/Parser/Tokens.hs b/src/Language/C/Parser/Tokens.hs
--- a/src/Language/C/Parser/Tokens.hs
+++ b/src/Language/C/Parser/Tokens.hs
@@ -11,126 +11,147 @@
 --  C Tokens for the C lexer.
 --
 -----------------------------------------------------------------------------
-module Language.C.Parser.Tokens (CToken(..), GnuCTok(..)) where
+module Language.C.Parser.Tokens (CToken(..), posLenOfTok, GnuCTok(..), ClangCTok(..)) where
 
-import Language.C.Data.Position  (Position, Pos(..))
-import Language.C.Data.Ident    (Ident, identToString)
-import Language.C.Syntax.Constants     (CChar, CInteger, CFloat, CString)
+import Language.C.Data.Position    (Position, Pos(..), PosLength)
+import Language.C.Data.Ident       (Ident, identToString)
+import Language.C.Syntax.Constants (CChar, CInteger, CFloat, CString, ClangCVersion)
 
 -- 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'
+data CToken = CTokLParen   !PosLength            -- `('
+            | CTokRParen   !PosLength            -- `)'
+            | CTokLBracket !PosLength            -- `['
+            | CTokRBracket !PosLength            -- `]'
+            | CTokArrow    !PosLength            -- `->'
+            | CTokDot      !PosLength            -- `.'
+            | CTokExclam   !PosLength            -- `!'
+            | CTokTilde    !PosLength            -- `~'
+            | CTokInc      !PosLength            -- `++'
+            | CTokDec      !PosLength            -- `--'
+            | CTokPlus     !PosLength            -- `+'
+            | CTokMinus    !PosLength            -- `-'
+            | CTokStar     !PosLength            -- `*'
+            | CTokSlash    !PosLength            -- `/'
+            | CTokPercent  !PosLength            -- `%'
+            | CTokAmper    !PosLength            -- `&'
+            | CTokShiftL   !PosLength            -- `<<'
+            | CTokShiftR   !PosLength            -- `>>'
+            | CTokLess     !PosLength            -- `<'
+            | CTokLessEq   !PosLength            -- `<='
+            | CTokHigh     !PosLength            -- `>'
+            | CTokHighEq   !PosLength            -- `>='
+            | CTokEqual    !PosLength            -- `=='
+            | CTokUnequal  !PosLength            -- `!='
+            | CTokHat      !PosLength            -- `^'
+            | CTokBar      !PosLength            -- `|'
+            | CTokAnd      !PosLength            -- `&&'
+            | CTokOr       !PosLength            -- `||'
+            | CTokQuest    !PosLength            -- `?'
+            | CTokColon    !PosLength            -- `:'
+            | CTokAssign   !PosLength            -- `='
+            | CTokPlusAss  !PosLength            -- `+='
+            | CTokMinusAss !PosLength            -- `-='
+            | CTokStarAss  !PosLength            -- `*='
+            | CTokSlashAss !PosLength            -- `/='
+            | CTokPercAss  !PosLength            -- `%='
+            | CTokAmpAss   !PosLength            -- `&='
+            | CTokHatAss   !PosLength            -- `^='
+            | CTokBarAss   !PosLength            -- `|='
+            | CTokSLAss    !PosLength            -- `<<='
+            | CTokSRAss    !PosLength            -- `>>='
+            | CTokComma    !PosLength            -- `,'
+            | CTokSemic    !PosLength            -- `;'
+            | CTokLBrace   !PosLength            -- `{'
+            | CTokRBrace   !PosLength            -- `}'
+            | CTokEllipsis !PosLength            -- `...'
+            | CTokAlignof  !PosLength            -- `alignof'
                                                 -- (or `__alignof',
                                                 -- `__alignof__')
-            | CTokAsm      !Position            -- `asm'
+            | CTokAlignas  !PosLength            -- `_Alignas'
+            | CTokAsm      !PosLength            -- `asm'
                                                 -- (or `__asm',
                                                 -- `__asm__')
-            | CTokAuto     !Position            -- `auto'
-            | CTokBreak    !Position            -- `break'
-            | CTokBool     !Position            -- `_Bool'
-            | CTokCase     !Position            -- `case'
-            | CTokChar     !Position            -- `char'
-            | CTokConst    !Position            -- `const'
+            | CTokAtomic   !PosLength            -- `_Atomic'
+            | CTokAuto     !PosLength            -- `auto'
+            | CTokBreak    !PosLength            -- `break'
+            | CTokBool     !PosLength            -- `_Bool'
+            | CTokCase     !PosLength            -- `case'
+            | CTokChar     !PosLength            -- `char'
+            | CTokConst    !PosLength            -- `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'
+            | CTokContinue !PosLength            -- `continue'
+            | CTokComplex  !PosLength            -- `_Complex'
+            | CTokDefault  !PosLength            -- `default'
+            | CTokDo       !PosLength            -- `do'
+            | CTokDouble   !PosLength            -- `double'
+            | CTokElse     !PosLength            -- `else'
+            | CTokEnum     !PosLength            -- `enum'
+            | CTokExtern   !PosLength            -- `extern'
+            | CTokFloat    !PosLength            -- `float'
+            | CTokBFloat16 !PosLength            -- `__bf16'
+            | CTokFloatN !Int !Bool !PosLength   -- (or `__float128',
+                                                 -- `__fp16',
+                                                 -- `_Float{16,32,64,128}{,x}`)
+            | CTokFor      !PosLength            -- `for'
+            | CTokGeneric  !PosLength            -- `_Generic'
+            | CTokGoto     !PosLength            -- `goto'
+            | CTokIf       !PosLength            -- `if'
+            | CTokInline   !PosLength            -- `inline'
                                                 -- (or `__inline',
                                                 -- `__inline__')
-            | CTokInt      !Position            -- `int'
-            | CTokLong     !Position            -- `long'
-            | CTokLabel    !Position            -- `__label__'
-            | CTokRegister !Position            -- `register'
-            | CTokRestrict !Position            -- `restrict'
+            | CTokInt      !PosLength            -- `int'
+            | CTokInt128   !PosLength            -- `__int128`
+                                                 -- (or `__int128_t`)
+            | CTokLong     !PosLength            -- `long'
+            | CTokLabel    !PosLength            -- `__label__
+            | CTokNoreturn !PosLength            -- `_Noreturn'
+            | CTokNullable !PosLength            -- `_Nullable'
+            | CTokNonnull  !PosLength            -- `_Nonnull'
+            | CTokRegister !PosLength            -- `register'
+            | CTokRestrict !PosLength            -- `restrict'
                                                 -- (or `__restrict',
                                                 -- `__restrict__')
-            | CTokReturn   !Position            -- `return'
-            | CTokShort    !Position            -- `short'
-            | CTokSigned   !Position            -- `signed'
+            | CTokReturn   !PosLength            -- `return'
+            | CTokShort    !PosLength            -- `short'
+            | CTokSigned   !PosLength            -- `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'
+            | CTokSizeof   !PosLength            -- `sizeof'
+            | CTokStatic   !PosLength            -- `static'
+            | CTokStaticAssert !PosLength        -- `_Static_assert'
+            | CTokStruct   !PosLength            -- `struct'
+            | CTokSwitch   !PosLength            -- `switch'
+            | CTokTypedef  !PosLength            -- `typedef'
+            | CTokTypeof   !PosLength            -- `typeof'
+            | CTokThread   !PosLength            -- `__thread'
+            | CTokUInt128  !PosLength            -- `__uint128`
+                                                 -- (or `__uint128_t`)
+            | CTokUnion    !PosLength            -- `union'
+            | CTokUnsigned !PosLength            -- `unsigned'
+            | CTokVoid     !PosLength            -- `void'
+            | CTokVolatile !PosLength            -- `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
+            | CTokWhile    !PosLength            -- `while'
+            | CTokCLit     !PosLength !CChar     -- character constant
+            | CTokILit     !PosLength !CInteger  -- integer constant
+            | CTokFLit     !PosLength CFloat     -- float constant
+            | CTokSLit     !PosLength CString    -- string constant
+            | CTokIdent    !PosLength !Ident     -- identifier
 
               -- not generated here, but in `CParser.parseCHeader'
-            | CTokTyIdent  !Position !Ident     -- `typedef-name' identifier
-            | CTokGnuC !GnuCTok !Position       -- special GNU C tokens
+            | CTokTyIdent  !PosLength !Ident     -- `typedef-name' identifier
+            | CTokGnuC !GnuCTok !PosLength       -- special GNU C tokens
+            | CTokClangC !PosLength !ClangCTok   -- special Clang C tokens
+            | CTokClKernel !PosLength            -- OpenCL `__kernel'
+            | CTokClRdOnly !PosLength            -- OpenCL `__read_only'
+            | CTokClWrOnly !PosLength            -- OpenCL `__write_only'
+            | CTokClGlobal !PosLength            -- OpenCL `__Global'
+            | CTokClLocal  !PosLength            -- OpenCL `__Local'
             | CTokEof                           -- end of file
 
 -- special tokens used in GNU C extensions to ANSI C
@@ -143,102 +164,128 @@
              | GnuCComplexReal          -- `__real__'
              | GnuCComplexImag          -- `__imag__'
 
+data ClangCTok = ClangCVersionTok !ClangCVersion -- version constant from 'availability' attribute
+               | ClangBuiltinConvertVector
+               | ClangCBitCast                   -- `__builtin_bit_cast`
+
 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"
+  posOf = fst . posLenOfTok
+
+-- token position and length
+posLenOfTok :: CToken -> (Position,Int)
+posLenOfTok (CTokLParen   pos  ) = pos
+posLenOfTok (CTokRParen   pos  ) = pos
+posLenOfTok (CTokLBracket pos  ) = pos
+posLenOfTok (CTokRBracket pos  ) = pos
+posLenOfTok (CTokArrow    pos  ) = pos
+posLenOfTok (CTokDot      pos  ) = pos
+posLenOfTok (CTokExclam   pos  ) = pos
+posLenOfTok (CTokTilde    pos  ) = pos
+posLenOfTok (CTokInc      pos  ) = pos
+posLenOfTok (CTokDec      pos  ) = pos
+posLenOfTok (CTokPlus     pos  ) = pos
+posLenOfTok (CTokMinus    pos  ) = pos
+posLenOfTok (CTokStar     pos  ) = pos
+posLenOfTok (CTokSlash    pos  ) = pos
+posLenOfTok (CTokPercent  pos  ) = pos
+posLenOfTok (CTokAmper    pos  ) = pos
+posLenOfTok (CTokShiftL   pos  ) = pos
+posLenOfTok (CTokShiftR   pos  ) = pos
+posLenOfTok (CTokLess     pos  ) = pos
+posLenOfTok (CTokLessEq   pos  ) = pos
+posLenOfTok (CTokHigh     pos  ) = pos
+posLenOfTok (CTokHighEq   pos  ) = pos
+posLenOfTok (CTokEqual    pos  ) = pos
+posLenOfTok (CTokUnequal  pos  ) = pos
+posLenOfTok (CTokHat      pos  ) = pos
+posLenOfTok (CTokBar      pos  ) = pos
+posLenOfTok (CTokAnd      pos  ) = pos
+posLenOfTok (CTokOr       pos  ) = pos
+posLenOfTok (CTokQuest    pos  ) = pos
+posLenOfTok (CTokColon    pos  ) = pos
+posLenOfTok (CTokAssign   pos  ) = pos
+posLenOfTok (CTokPlusAss  pos  ) = pos
+posLenOfTok (CTokMinusAss pos  ) = pos
+posLenOfTok (CTokStarAss  pos  ) = pos
+posLenOfTok (CTokSlashAss pos  ) = pos
+posLenOfTok (CTokPercAss  pos  ) = pos
+posLenOfTok (CTokAmpAss   pos  ) = pos
+posLenOfTok (CTokHatAss   pos  ) = pos
+posLenOfTok (CTokBarAss   pos  ) = pos
+posLenOfTok (CTokSLAss    pos  ) = pos
+posLenOfTok (CTokSRAss    pos  ) = pos
+posLenOfTok (CTokComma    pos  ) = pos
+posLenOfTok (CTokSemic    pos  ) = pos
+posLenOfTok (CTokLBrace   pos  ) = pos
+posLenOfTok (CTokRBrace   pos  ) = pos
+posLenOfTok (CTokEllipsis pos  ) = pos
+posLenOfTok (CTokAlignof  pos  ) = pos
+posLenOfTok (CTokAlignas  pos  ) = pos
+posLenOfTok (CTokAsm      pos  ) = pos
+posLenOfTok (CTokAtomic   pos  ) = pos
+posLenOfTok (CTokAuto     pos  ) = pos
+posLenOfTok (CTokBreak    pos  ) = pos
+posLenOfTok (CTokBool     pos  ) = pos
+posLenOfTok (CTokCase     pos  ) = pos
+posLenOfTok (CTokChar     pos  ) = pos
+posLenOfTok (CTokConst    pos  ) = pos
+posLenOfTok (CTokContinue pos  ) = pos
+posLenOfTok (CTokComplex  pos  ) = pos
+posLenOfTok (CTokDefault  pos  ) = pos
+posLenOfTok (CTokDo       pos  ) = pos
+posLenOfTok (CTokDouble   pos  ) = pos
+posLenOfTok (CTokElse     pos  ) = pos
+posLenOfTok (CTokEnum     pos  ) = pos
+posLenOfTok (CTokExtern   pos  ) = pos
+posLenOfTok (CTokFloat    pos  ) = pos
+posLenOfTok (CTokBFloat16 pos  ) = pos
+posLenOfTok (CTokFloatN _ _ pos) = pos
+posLenOfTok (CTokFor      pos  ) = pos
+posLenOfTok (CTokGeneric  pos  ) = pos
+posLenOfTok (CTokGoto     pos  ) = pos
+posLenOfTok (CTokInt      pos  ) = pos
+posLenOfTok (CTokInt128   pos  ) = pos
+posLenOfTok (CTokInline   pos  ) = pos
+posLenOfTok (CTokIf       pos  ) = pos
+posLenOfTok (CTokLong     pos  ) = pos
+posLenOfTok (CTokLabel    pos  ) = pos
+posLenOfTok (CTokNoreturn pos  ) = pos
+posLenOfTok (CTokNullable pos  ) = pos
+posLenOfTok (CTokNonnull  pos  ) = pos
+posLenOfTok (CTokRegister pos  ) = pos
+posLenOfTok (CTokRestrict pos  ) = pos
+posLenOfTok (CTokReturn   pos  ) = pos
+posLenOfTok (CTokShort    pos  ) = pos
+posLenOfTok (CTokSigned   pos  ) = pos
+posLenOfTok (CTokSizeof   pos  ) = pos
+posLenOfTok (CTokStatic   pos  ) = pos
+posLenOfTok (CTokStaticAssert pos) = pos
+posLenOfTok (CTokStruct   pos  ) = pos
+posLenOfTok (CTokSwitch   pos  ) = pos
+posLenOfTok (CTokTypedef  pos  ) = pos
+posLenOfTok (CTokTypeof   pos  ) = pos
+posLenOfTok (CTokThread   pos  ) = pos
+posLenOfTok (CTokUInt128  pos  ) = pos
+posLenOfTok (CTokUnion    pos  ) = pos
+posLenOfTok (CTokUnsigned pos  ) = pos
+posLenOfTok (CTokVoid     pos  ) = pos
+posLenOfTok (CTokVolatile pos  ) = pos
+posLenOfTok (CTokWhile    pos  ) = pos
+posLenOfTok (CTokCLit     pos _) = pos
+posLenOfTok (CTokILit     pos _) = pos
+posLenOfTok (CTokFLit     pos _) = pos
+posLenOfTok (CTokSLit     pos _) = pos
+posLenOfTok (CTokIdent    pos _) = pos
+posLenOfTok (CTokTyIdent  pos _) = pos
+posLenOfTok (CTokGnuC   _ pos  ) = pos
+posLenOfTok (CTokClangC   pos _) = pos
+posLenOfTok (CTokClKernel pos  ) = pos
+posLenOfTok (CTokClRdOnly pos  ) = pos
+posLenOfTok (CTokClWrOnly pos  ) = pos
+posLenOfTok (CTokClGlobal pos  ) = pos
+posLenOfTok (CTokClLocal  pos  ) = pos
+posLenOfTok CTokEof = error "tokenPos: Eof"
+
 instance Show CToken where
   showsPrec _ (CTokLParen   _  ) = showString "("
   showsPrec _ (CTokRParen   _  ) = showString ")"
@@ -287,7 +334,9 @@
   showsPrec _ (CTokRBrace   _  ) = showString "}"
   showsPrec _ (CTokEllipsis _  ) = showString "..."
   showsPrec _ (CTokAlignof  _  ) = showString "alignof"
+  showsPrec _ (CTokAlignas  _  ) = showString "_Alignas"
   showsPrec _ (CTokAsm      _  ) = showString "asm"
+  showsPrec _ (CTokAtomic      _  ) = showString "_Atomic"
   showsPrec _ (CTokAuto     _  ) = showString "auto"
   showsPrec _ (CTokBool _)       = showString "_Bool"
   showsPrec _ (CTokBreak    _  ) = showString "break"
@@ -303,13 +352,21 @@
   showsPrec _ (CTokEnum     _  ) = showString "enum"
   showsPrec _ (CTokExtern   _  ) = showString "extern"
   showsPrec _ (CTokFloat    _  ) = showString "float"
+  showsPrec _ (CTokBFloat16 _  ) = showString "__bf16"
+  showsPrec _ (CTokFloatN n x _) = showString "_Float" . shows n .
+                                   showString (if x then "x" else "")
   showsPrec _ (CTokFor      _  ) = showString "for"
+  showsPrec _ (CTokGeneric  _  ) = showString "_Generic"
   showsPrec _ (CTokGoto     _  ) = showString "goto"
   showsPrec _ (CTokIf       _  ) = showString "if"
   showsPrec _ (CTokInline   _  ) = showString "inline"
   showsPrec _ (CTokInt      _  ) = showString "int"
+  showsPrec _ (CTokInt128   _  ) = showString "__int128"
   showsPrec _ (CTokLong     _  ) = showString "long"
   showsPrec _ (CTokLabel    _  ) = showString "__label__"
+  showsPrec _ (CTokNoreturn    _  ) = showString "_Noreturn"
+  showsPrec _ (CTokNullable    _  ) = showString "_Nullable"
+  showsPrec _ (CTokNonnull     _  ) = showString "_Nonnull"
   showsPrec _ (CTokRegister _  ) = showString "register"
   showsPrec _ (CTokRestrict _  ) = showString "restrict"
   showsPrec _ (CTokReturn   _  ) = showString "return"
@@ -317,11 +374,13 @@
   showsPrec _ (CTokSigned   _  ) = showString "signed"
   showsPrec _ (CTokSizeof   _  ) = showString "sizeof"
   showsPrec _ (CTokStatic   _  ) = showString "static"
+  showsPrec _ (CTokStaticAssert   _  ) = showString "_Static_assert"
   showsPrec _ (CTokStruct   _  ) = showString "struct"
   showsPrec _ (CTokSwitch   _  ) = showString "switch"
   showsPrec _ (CTokTypedef  _  ) = showString "typedef"
   showsPrec _ (CTokTypeof   _  ) = showString "typeof"
-  showsPrec _ (CTokThread   _  ) = showString "__thread"
+  showsPrec _ (CTokThread   _  ) = showString "_Thread_local"
+  showsPrec _ (CTokUInt128  _  ) = showString "__uint128"
   showsPrec _ (CTokUnion    _  ) = showString "union"
   showsPrec _ (CTokUnsigned _  ) = showString "unsigned"
   showsPrec _ (CTokVoid     _  ) = showString "void"
@@ -340,5 +399,12 @@
   showsPrec _ (CTokGnuC GnuCVaArg    _) = showString "__builtin_va_arg"
   showsPrec _ (CTokGnuC GnuCOffsetof _) = showString "__builtin_offsetof"
   showsPrec _ (CTokGnuC GnuCTyCompat _) = showString "__builtin_types_compatible_p"
+  showsPrec _ (CTokClangC _ (ClangCVersionTok v)) = shows v
+  showsPrec _ (CTokClangC _ ClangBuiltinConvertVector) = showString "__builtin_convertvector"
+  showsPrec _ (CTokClangC _ ClangCBitCast) = showString "__builtin_bit_cast"
+  showsPrec _ (CTokClKernel _  ) = showString "__kernel"
+  showsPrec _ (CTokClRdOnly _  ) = showString "__read_only"
+  showsPrec _ (CTokClWrOnly _  ) = showString "__write_only"
+  showsPrec _ (CTokClGlobal _  ) = showString "__global"
+  showsPrec _ (CTokClLocal  _  ) = showString "__Local"
   showsPrec _ CTokEof = error "show CToken : CTokEof"
-
diff --git a/src/Language/C/Pretty.hs b/src/Language/C/Pretty.hs
--- a/src/Language/C/Pretty.hs
+++ b/src/Language/C/Pretty.hs
@@ -1,4 +1,4 @@
-{-# OPTIONS  #-}
+{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, FlexibleContexts #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Language.C.Pretty
@@ -18,10 +18,11 @@
     -- * Testing
     prettyUsingInclude
 ) where
-import Data.List (partition,nub,isSuffixOf)
+import Data.List (isSuffixOf)
 import qualified Data.Set as Set
 import Text.PrettyPrint.HughesPJ
 import Debug.Trace {- for warnings -}
+import Prelude hiding ((<>))
 
 import Language.C.Data
 import Language.C.Syntax
@@ -73,16 +74,16 @@
 
 -- | 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
+-- The resulting file may not compile (because of missing @#define@ directives and similar things), but is very useful
 -- 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)
+  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)
+    (headerFiles,mappedDecls) = foldr (addDecl . tagIncludedDecls) (Set.empty,[]) edecls
+    tagIncludedDecls edecl | maybe False isHeaderFile (fileOfNode edecl) = Left ((posFile . posOf) edecl)
                            | otherwise = Right edecl
     addDecl decl@(Left headerRef) (headerSet, ds)
       | Set.member headerRef headerSet = (headerSet, ds)
@@ -91,20 +92,20 @@
     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. */"
+                      | otherwise = text "/* Warning: The #include directives in this file aren't necessarily 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
+    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;
+        $+$ (ii . vcat . map ((<> semi) . pretty)) decls     --     register long b;
         $$ prettyPrec (-1) stat                              -- {  ...
                                                              -- }
 
@@ -119,18 +120,19 @@
     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 ")"
-                $+$ prettyThen stat
+        ii $  text "if" <+> parens (pretty expr)
+                $+$ prettyBody stat
                 $$  maybeP prettyElse estat
       where
-        prettyThen stat@(CIf _ _ _ _) = text "{" $+$ prettyPrec (-1) stat $$ text "}"
-        prettyThen stat = prettyPrec (-1) stat
+        prettyBody c@(CCompound _ _ _) = prettyPrec (-1) c
+        prettyBody nonCompound         = prettyPrec (-1) (CCompound [] [CBlockStmt nonCompound] undefined)
         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
+          text "else if" <+> parens (pretty else_if_expr)
+            $+$ prettyBody else_if_stat
+            $$  maybeP prettyElse else_stat
         prettyElse else_stmt =
-          text "else" $+$ prettyPrec (-1) else_stmt
+          text "else"
+            $+$ prettyBody else_stmt
 
     pretty (CSwitch expr stat _) =
         ii $ text "switch" <+> text "(" <> pretty expr <> text ")"
@@ -202,29 +204,42 @@
                 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
+                if any isAttrAfterSUE  (zip specs (drop 1 specs))
+                    then trace
+                           ("Warning: AST Invariant violated: __attribute__ specifier following struct/union/enum:" ++
+                            show (map pretty specs))
+                           specs
+                    else specs
             isAttrAfterSUE (CTypeSpec ty,CTypeQual (CAttrQual _)) = isSUEDef ty
             isAttrAfterSUE _ = False
             getAttrs Nothing = []
             getAttrs (Just (CDeclr _ _ _ cattrs _)) = cattrs
+    pretty (CStaticAssert expr str _) =
+      text "_Static_assert" <> parens (hsep (punctuate comma [pretty expr, pretty str]))
 
 instance Pretty CDeclSpec where
     pretty (CStorageSpec sp) = pretty sp
     pretty (CTypeSpec sp) = pretty sp
     pretty (CTypeQual qu) = pretty qu
+    pretty (CFunSpec fs) = pretty fs
+    pretty (CAlignSpec sa) = pretty sa
 
+instance Pretty CAlignSpec where
+    pretty (CAlignAsType decl _) =
+        text "_Alignas" <> parens (pretty decl)
+    pretty (CAlignAsExpr expr _) =
+        text "_Alignas" <> parens (pretty expr)
+
 instance Pretty CStorageSpec where
     pretty (CAuto _) = text "auto"
     pretty (CRegister _) = text "register"
     pretty (CStatic _) = text "static"
     pretty (CExtern _) = text "extern"
     pretty (CTypedef _) = text "typedef"
-    pretty (CThread _) = text "__thread"
+    pretty (CThread _) = text "_Thread_local"
+    pretty (CClKernel _) = text "__kernel"
+    pretty (CClGlobal _) = text "__global"
+    pretty (CClLocal _)  = text "__local"
 
 instance Pretty CTypeSpec where
     pretty (CVoidType _)        = text "void"
@@ -233,33 +248,48 @@
     pretty (CIntType _)         = text "int"
     pretty (CLongType _)        = text "long"
     pretty (CFloatType _)       = text "float"
+    pretty (CBFloat16Type _)    = text "__bf16"
+    pretty (CFloatNType n x _)  = text "_Float" <> text (show n) <>
+                                  (if x then text "x" else empty)
     pretty (CDoubleType _)      = text "double"
     pretty (CSignedType _)      = text "signed"
     pretty (CUnsigType _)       = text "unsigned"
     pretty (CBoolType _)        = text "_Bool"
     pretty (CComplexType _)     = text "_Complex"
+    pretty (CInt128Type _)      = text "__int128"
+    pretty (CUInt128Type _)     = text "__uint128"
     pretty (CSUType union _)    = pretty union
     pretty (CEnumType enum _)   = pretty enum
     pretty (CTypeDef ident _)   = identP ident
     pretty (CTypeOfExpr expr _) =
-        text "typeof" <> text "(" <> pretty expr <> text ")"
+        text "typeof" <> parens (pretty expr)
     pretty (CTypeOfType decl _) =
-        text "typeof" <> text "(" <> pretty decl <> text ")"
+        text "typeof" <> parens (pretty decl)
+    pretty (CAtomicType decl _) =
+        text "_Atomic" <> parens (pretty decl)
 
 instance Pretty CTypeQual where
     pretty (CConstQual _) = text "const"
     pretty (CVolatQual _) = text "volatile"
     pretty (CRestrQual _) = text "__restrict"
-    pretty (CInlineQual _) = text "inline"
+    pretty (CAtomicQual _) = text "_Atomic"
     pretty (CAttrQual a)  = attrlistP [a]
+    pretty (CNullableQual _) = text "_Nullable"
+    pretty (CNonnullQual _) = text "_Nonnull"
+    pretty (CClRdOnlyQual _) = text "__read_only"
+    pretty (CClWrOnlyQual _) = text "__write_only"
 
+instance Pretty CFunSpec where
+    pretty (CInlineQual _) = text "inline"
+    pretty (CNoreturnQual _) = text "_Noreturn"
+
 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)),
+        ii $ sep (map ((<> semi) . pretty) decls),
         text "}"]
 
 instance Pretty CStructTag where
@@ -384,7 +414,7 @@
     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
+        --                             parens aren't necessary, 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
@@ -414,38 +444,87 @@
     prettyPrec _p (CCompoundLit decl initl _) =
         parens (pretty decl) <+> (braces . hsep . punctuate comma) (map p initl) where
         p ([], initializer)           = pretty initializer
-        p (mems, initializer) = hcat (punctuate (text ".") (map pretty mems)) <+> text "=" <+> pretty initializer
+        p (mems, initializer) = hcat (map pretty mems) <+> 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 (CGenericSelection expr assoc_list _) =
+      text "_Generic" <> (parens.hsep.punctuate comma) (pretty expr : map pAssoc assoc_list)
+      where
+        pAssoc (mty, expr1) = maybe (text "default") pretty mty <> text ":" <+> pretty expr1
     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)
+        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) )
+        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)
+        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)
+        parens (pretty ty1 <> comma <+> pretty ty2)
+    pretty (CBuiltinConvertVector expr ty _)  =
+        text "__builtin_convertvector" <+>
+        parens (pretty expr <> comma <+> pretty ty)
+    pretty (CBuiltinBitCast ty expr _)  =
+        text "__builtin_bit_cast" <+>
+        parens (pretty ty <> comma <+> pretty expr)
 
 instance Pretty CAssignOp where
-    pretty = text . show
+  pretty op = text $ case op of
+    CAssignOp -> "="
+    CMulAssOp -> "*="
+    CDivAssOp -> "/="
+    CRmdAssOp -> "%="
+    CAddAssOp -> "+="
+    CSubAssOp -> "-="
+    CShlAssOp -> "<<="
+    CShrAssOp -> ">>="
+    CAndAssOp -> "&="
+    CXorAssOp -> "^="
+    COrAssOp  -> "|="
 
 instance Pretty CBinaryOp where
-    pretty = text . show
+  pretty op = text $ case op of
+    CMulOp -> "*"
+    CDivOp -> "/"
+    CRmdOp -> "%"
+    CAddOp -> "+"
+    CSubOp -> "-"
+    CShlOp -> "<<"
+    CShrOp -> ">>"
+    CLeOp  -> "<"
+    CGrOp  -> ">"
+    CLeqOp -> "<="
+    CGeqOp -> ">="
+    CEqOp  -> "=="
+    CNeqOp -> "!="
+    CAndOp -> "&"
+    CXorOp -> "^"
+    COrOp  -> "|"
+    CLndOp -> "&&"
+    CLorOp -> "||"
 
 instance Pretty CUnaryOp where
-    pretty = text . show
+  pretty op = text $ case op of
+    CPreIncOp  -> "++"
+    CPreDecOp  -> "--"
+    CPostIncOp -> "++"
+    CPostDecOp -> "--"
+    CAdrOp     -> "&"
+    CIndOp     -> "*"
+    CPlusOp    -> "+"
+    CMinOp     -> "-"
+    CCompOp    -> "~"
+    CNegOp     -> "!"
 
 instance Pretty CConst where
     pretty (CIntConst   int_const _) = text (show int_const)
diff --git a/src/Language/C/Syntax/AST.hs b/src/Language/C/Syntax/AST.hs
--- a/src/Language/C/Syntax/AST.hs
+++ b/src/Language/C/Syntax/AST.hs
@@ -1,738 +1,1476 @@
 {-# 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 !-})
-
--- Compatibility instance (will be removed) so we do not violate the PvP for 0.3.2
-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)@.
--- The @designator-list@ specifies one member of the compound type which is initialized.
--- It 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):
---
--- > -- int x[3][4] = { [0][3] = 4, [2] = 5, 8 };
--- > --   corresponds to the assignments
--- > -- x[0][3] = 4; x[2][0] = 5; x[2][1] = 8;
--- > let init1 = ([CArrDesig 0, CArrDesig 3], CInitExpr 4)
--- >     init2 = ([CArrDesig 2]             , CInitExpr 5)
--- >     init3 = ([]                        , CInitExpr 8)
--- > in  CInitList [init1, init2, init3]
---
--- > -- struct { struct { int a[2]; int b[2]; int c[2]; } s; } x = { .s = { {2,3} , .c[0] = 1 } };
--- > --   corresponds to the assignments
--- > -- x.s.a[0] = 2; x.s.a[1] = 3; x.s.c[0] = 1;
--- > let init_s_0 = CInitList [ ([], CInitExpr 2), ([], CInitExpr 3)]
--- >     init_s   = CInitList [
--- >                            ([], init_s_0),
--- >                            ([CMemberDesig "c", CArrDesig 0], CInitExpr 1)
--- >                          ]
--- > in  CInitList [(CMemberDesig "s", 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)
+{-# LANGUAGE TypeSynonymInstances #-}
+-----------------------------------------------------------------------------
+-- |
+-- 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,
+  CTranslationUnit(..),  CExternalDeclaration(..),
+  -- * Declarations
+  CFunDef,  CDecl, CStructUnion, CEnum,
+  CFunctionDef(..),  CDeclaration(..),
+  CStructTag(..), CStructureUnion(..),  CEnumeration(..),
+  -- * Declaration attributes
+  CDeclSpec, partitionDeclSpecs,
+  CStorageSpec, CTypeSpec, isSUEDef, CTypeQual, CFunSpec, CAlignSpec,  CAttr,
+  CFunctionSpecifier(..), CDeclarationSpecifier(..), CStorageSpecifier(..), CTypeSpecifier(..),
+  CAlignmentSpecifier(..),
+  CTypeQualifier(..), CAttribute(..),
+  -- * Declarators
+  CDeclr,CDerivedDeclr,CArrSize,
+  CDeclarator(..), CDerivedDeclarator(..), CArraySize(..),
+  -- * Initialization
+  CInit, CInitList, CDesignator,
+  CInitializer(..), CInitializerList, CPartDesignator(..),
+  -- * Statements
+  CStat, CBlockItem, CAsmStmt, CAsmOperand,
+  CStatement(..), CCompoundBlockItem(..),
+  CAssemblyStatement(..), CAssemblyOperand(..),
+  -- * Expressions
+  CExpr, CExpression(..),
+  CAssignOp(..), CBinaryOp(..), CUnaryOp(..),
+  CBuiltin, CBuiltinThing(..),
+  -- * Constants
+  CConst, CStrLit, cstringOfLit, liftStrLit,
+  CConstant(..), CStringLiteral(..),
+  -- * Annoated type class
+  Annotated(..)
+) where
+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.Data (Data)
+import GHC.Generics (Generic, Generic1)
+import Control.DeepSeq (NFData)
+
+-- | 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.
+type CTranslUnit = CTranslationUnit NodeInfo
+data CTranslationUnit a
+  = CTranslUnit [CExternalDeclaration a] a
+    deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor, Annotated !-})
+
+instance NFData a => NFData (CTranslationUnit a)
+
+-- | External C declaration (C99 6.9, K&R A10)
+--
+-- Either a toplevel declaration, function definition or external assembler.
+type CExtDecl = CExternalDeclaration NodeInfo
+data CExternalDeclaration a
+  = CDeclExt (CDeclaration a)
+  | CFDefExt (CFunctionDef a)
+  | CAsmExt  (CStringLiteral a) a
+    deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor, Annotated !-})
+
+instance NFData a => NFData (CExternalDeclaration a)
+
+-- | 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.
+type CFunDef = CFunctionDef NodeInfo
+data CFunctionDef a
+  = CFunDef
+    [CDeclarationSpecifier a] -- type specifier and qualifier
+    (CDeclarator a)           -- declarator
+    [CDeclaration a]          -- optional declaration list
+    (CStatement a)            -- compound statement
+    a
+    deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})
+
+instance NFData a => NFData (CFunctionDef a)
+
+-- | 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)
+--
+type CDecl = CDeclaration NodeInfo
+data CDeclaration a
+  = CDecl
+    [CDeclarationSpecifier a] -- type specifier and qualifier, __attribute__
+    [(Maybe (CDeclarator a),  -- declarator (may be omitted)
+      Maybe (CInitializer a), -- optional initialize
+      Maybe (CExpression a))] -- optional size (const expr)
+    a                         -- annotation
+    | CStaticAssert
+      (CExpression a)         -- assert expression
+      (CStringLiteral a)      -- assert text
+      a                       -- annotation
+    deriving (Show, Data, Generic {-! ,CNode ,Annotated !-})
+
+instance NFData a => NFData (CDeclaration a)
+
+-- Derive instance is a little bit ugly
+instance Functor CDeclaration where
+  fmap f (CDecl specs declarators annot) =
+    CDecl (map (fmap f) specs) (map fmap3m declarators) (f annot)
+      where fmap3m (a,b,c) = (fmap (fmap f) a, fmap (fmap f) b, fmap (fmap f) c)
+  fmap f (CStaticAssert expression strlit annot) =
+    CStaticAssert (fmap f expression) (fmap f strlit) (f annot)
+
+-- | 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 []]
+type CDeclr = CDeclarator NodeInfo
+data CDeclarator a
+  = CDeclr (Maybe Ident) [CDerivedDeclarator a] (Maybe (CStringLiteral a)) [CAttribute a] a
+    deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})
+
+instance NFData a => NFData (CDeclarator a)
+
+
+-- | 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)@
+type CDerivedDeclr = CDerivedDeclarator NodeInfo
+data CDerivedDeclarator a
+  = CPtrDeclr [CTypeQualifier a] a
+  -- ^ Pointer declarator @CPtrDeclr tyquals declr@
+  | CArrDeclr [CTypeQualifier a] (CArraySize a) a
+  -- ^ Array declarator @CArrDeclr declr tyquals size-expr?@
+  | CFunDeclr (Either [Ident] ([CDeclaration a],Bool)) [CAttribute a] a
+    -- ^ Function declarator @CFunDeclr declr (old-style-params | new-style-params) c-attrs@
+    deriving (Show, Data, Generic {-! ,CNode , Annotated !-})
+
+instance NFData a => NFData (CDerivedDeclarator a)
+
+-- Derived instance relies on fmap2
+instance Functor CDerivedDeclarator where
+        fmap _f (CPtrDeclr a1 a2) = CPtrDeclr (fmap (fmap _f) a1) (_f a2)
+        fmap _f (CArrDeclr a1 a2 a3)
+          = CArrDeclr (fmap (fmap _f) a1) (fmap _f a2) (_f a3)
+        fmap _f (CFunDeclr a1 a2 a3)
+          = CFunDeclr (fmap (fmapFirst (fmap (fmap _f))) a1) (fmap (fmap _f) a2)
+              (_f a3)
+          where fmapFirst f (a,b) = (f a, b)
+
+-- | Size of an array
+type CArrSize = CArraySize NodeInfo
+data CArraySize a
+  = CNoArrSize Bool               -- ^ @CUnknownSize isCompleteType@
+  | CArrSize Bool (CExpression a) -- ^ @CArrSize isStatic expr@
+    deriving (Show, Data, Generic, Generic1 {-! , Functor !-})
+
+instance NFData a => NFData (CArraySize a)
+
+-- | C statement (K&R A9, C99 6.8)
+--
+type CStat = CStatement NodeInfo
+data CStatement a
+  -- | An (attributed) label followed by a statement
+  = CLabel  Ident (CStatement a) [CAttribute a] a
+  -- | A statement of the form @case expr : stmt@
+  | CCase (CExpression a) (CStatement a) a
+  -- | A case range of the form @case lower ... upper : stmt@
+  | CCases (CExpression a) (CExpression a) (CStatement a) a
+  -- | The default case @default : stmt@
+  | CDefault (CStatement a) a
+  -- | A simple statement, that is in C: evaluating an expression with
+  --   side-effects and discarding the result.
+  | CExpr (Maybe (CExpression a)) a
+  -- | compound statement @CCompound localLabels blockItems at@
+  | CCompound [Ident] [CCompoundBlockItem a] a
+  -- | conditional statement @CIf ifExpr thenStmt maybeElseStmt at@
+  | CIf (CExpression a) (CStatement a) (Maybe (CStatement a)) a
+  -- | switch statement @CSwitch selectorExpr switchStmt@, where
+  -- @switchStmt@ usually includes /case/, /break/ and /default/
+  -- statements
+  | CSwitch (CExpression a) (CStatement a) a
+  -- | while or do-while statement @CWhile guard stmt isDoWhile at@
+  | CWhile (CExpression a) (CStatement a) Bool a
+  -- | for statement @CFor init expr-2 expr-3 stmt@, where @init@ is
+  -- either a declaration or initializing expression
+  | CFor (Either (Maybe (CExpression a)) (CDeclaration a))
+    (Maybe (CExpression a))
+    (Maybe (CExpression a))
+    (CStatement a)
+    a
+  -- | goto statement @CGoto label@
+  | CGoto Ident a
+  -- | computed goto @CGotoPtr labelExpr@
+  | CGotoPtr (CExpression a) a
+  -- | continue statement
+  | CCont a
+  -- | break statement
+  | CBreak a
+  -- | return statement @CReturn returnExpr@
+  | CReturn (Maybe (CExpression a)) a
+  -- | assembly statement
+  | CAsm (CAssemblyStatement a) a
+    deriving (Show, Data, Generic {-! , CNode , Annotated !-})
+
+instance NFData a => NFData (CStatement a)
+
+-- Derived instance relies on fmap2 :(
+instance Functor CStatement where
+        fmap _f (CLabel a1 a2 a3 a4)
+          = CLabel a1 (fmap _f a2) (fmap (fmap _f) a3) (_f a4)
+        fmap _f (CCase a1 a2 a3) = CCase (fmap _f a1) (fmap _f a2) (_f a3)
+        fmap _f (CCases a1 a2 a3 a4)
+          = CCases (fmap _f a1) (fmap _f a2) (fmap _f a3) (_f a4)
+        fmap _f (CDefault a1 a2) = CDefault (fmap _f a1) (_f a2)
+        fmap _f (CExpr a1 a2) = CExpr (fmap (fmap _f) a1) (_f a2)
+        fmap _f (CCompound a1 a2 a3)
+          = CCompound a1 (fmap (fmap _f) a2) (_f a3)
+        fmap _f (CIf a1 a2 a3 a4)
+          = CIf (fmap _f a1) (fmap _f a2) (fmap (fmap _f) a3) (_f a4)
+        fmap _f (CSwitch a1 a2 a3)
+          = CSwitch (fmap _f a1) (fmap _f a2) (_f a3)
+        fmap _f (CWhile a1 a2 a3 a4)
+          = CWhile (fmap _f a1) (fmap _f a2) a3 (_f a4)
+        fmap _f (CFor a1 a2 a3 a4 a5)
+          = CFor (mapEither (fmap (fmap _f)) (fmap _f) a1)
+                 (fmap (fmap _f) a2) (fmap (fmap _f) a3) (fmap _f a4)
+                 (_f a5)
+          where mapEither f1 f2 = either (Left . f1) (Right . f2)
+        fmap _f (CGoto a1 a2) = CGoto a1 (_f a2)
+        fmap _f (CGotoPtr a1 a2) = CGotoPtr (fmap _f a1) (_f a2)
+        fmap _f (CCont a1) = CCont (_f a1)
+        fmap _f (CBreak a1) = CBreak (_f a1)
+        fmap _f (CReturn a1 a2) = CReturn (fmap (fmap _f) a1) (_f a2)
+        fmap _f (CAsm a1 a2) = CAsm (fmap _f a1) (_f a2)
+
+-- | GNU Assembler statement
+--
+-- > CAssemblyStatement 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
+type CAsmStmt = CAssemblyStatement NodeInfo
+data CAssemblyStatement a
+  = CAsmStmt
+    (Maybe (CTypeQualifier a)) -- maybe volatile
+    (CStringLiteral a)         -- assembler expression (String)
+    [CAssemblyOperand a]       -- output operands
+    [CAssemblyOperand a]       -- input operands
+    [CStringLiteral a]         -- Clobbers
+    a
+    deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})
+
+instance NFData a => NFData (CAssemblyStatement a)
+
+-- | Assembler operand
+--
+-- @CAsmOperand argName? constraintExpr arg@ specifies an operand for an assembler
+-- statement.
+type CAsmOperand = CAssemblyOperand NodeInfo
+data CAssemblyOperand a
+  = CAsmOperand
+    (Maybe Ident)       -- argument name
+    (CStringLiteral a)  -- constraint expr
+    (CExpression a)     -- argument
+    a
+    deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})
+
+instance NFData a => NFData (CAssemblyOperand a)
+
+-- | C99 Block items
+--
+--  Things that may appear in compound statements: either statements, declarations
+--   or nested function definitions.
+type CBlockItem = CCompoundBlockItem NodeInfo
+data CCompoundBlockItem a
+  = CBlockStmt    (CStatement a)    -- ^ A statement
+  | CBlockDecl    (CDeclaration a)  -- ^ A local declaration
+  | CNestedFunDef (CFunctionDef a)  -- ^ A nested function (GNU C)
+    deriving (Show, Data, Generic, Generic1 {-! , CNode , Functor, Annotated !-})
+
+instance NFData a => NFData (CCompoundBlockItem a)
+
+-- | 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).
+type CDeclSpec = CDeclarationSpecifier NodeInfo
+data CDeclarationSpecifier a
+  = CStorageSpec (CStorageSpecifier a) -- ^ storage-class specifier or typedef
+  | CTypeSpec    (CTypeSpecifier a)    -- ^ type name
+  | CTypeQual    (CTypeQualifier a)    -- ^ type qualifier
+  | CFunSpec     (CFunctionSpecifier a) -- ^ function specifier
+  | CAlignSpec   (CAlignmentSpecifier a) -- ^ alignment specifier
+    deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor, Annotated !-})
+
+instance NFData a => NFData (CDeclarationSpecifier a)
+
+-- | Separate the declaration specifiers
+--
+-- @__attribute__@ of a declaration qualify declarations or declarators (but not types),
+-- and are therefore separated as well.
+partitionDeclSpecs :: [CDeclarationSpecifier a]
+                   -> ( [CStorageSpecifier a], [CAttribute a]
+                      , [CTypeQualifier a], [CTypeSpecifier a]
+                      , [CFunctionSpecifier a], [CAlignmentSpecifier a])
+partitionDeclSpecs = foldr deals ([],[],[],[],[],[]) where
+    deals (CStorageSpec sp) (sts,ats,tqs,tss,fss,ass)  = (sp:sts,ats,tqs,tss,fss,ass)
+    deals (CTypeQual (CAttrQual attr)) (sts,ats,tqs,tss,fss,ass)  = (sts,attr:ats,tqs,tss,fss,ass)
+    deals (CTypeQual tq) (sts,ats,tqs,tss,fss,ass)     = (sts,ats,tq:tqs,tss,fss,ass)
+    deals (CTypeSpec ts) (sts,ats,tqs,tss,fss,ass)     = (sts,ats,tqs,ts:tss,fss,ass)
+    deals (CFunSpec fs) (sts,ats,tqs,tss,fss,ass)      = (sts,ats,tqs,tss,fs:fss,ass)
+    deals (CAlignSpec as) (sts,ats,tqs,tss,fss,ass)    = (sts,ats,tqs,tss,fss,as:ass)
+
+-- | C storage class specifier (and typedefs) (K&R A8.1, C99 6.7.1)
+type CStorageSpec = CStorageSpecifier NodeInfo
+data CStorageSpecifier a
+  = CAuto     a     -- ^ auto
+  | CRegister a     -- ^ register
+  | CStatic   a     -- ^ static
+  | CExtern   a     -- ^ extern
+  | CTypedef  a     -- ^ typedef
+  | CThread   a     -- ^ C11/GNUC thread local storage
+  | CClKernel a     -- ^ OpenCL kernel function
+  | CClGlobal a     -- ^ OpenCL __global variable
+  | CClLocal  a     -- ^ OpenCL __local variable
+    deriving (Show, Eq,Ord,Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})
+
+instance NFData a => NFData (CStorageSpecifier a)
+
+-- | 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.
+type CTypeSpec = CTypeSpecifier NodeInfo
+data CTypeSpecifier a
+  = CVoidType    a
+  | CCharType    a
+  | CShortType   a
+  | CIntType     a
+  | CLongType    a
+  | CFloatType   a
+  | CDoubleType  a
+  | CSignedType  a
+  | CUnsigType   a
+  | CBoolType    a
+  | CComplexType a
+  | CInt128Type  a
+  | CUInt128Type a
+  | CBFloat16Type a
+  | CFloatNType Int Bool a           -- ^ IEC 60227: width (32,64,128), extended flag
+  | CSUType      (CStructureUnion a) a      -- ^ Struct or Union specifier
+  | CEnumType    (CEnumeration a)    a      -- ^ Enumeration specifier
+  | CTypeDef     Ident        a      -- ^ Typedef name
+  | CTypeOfExpr  (CExpression a)  a  -- ^ @typeof(expr)@
+  | CTypeOfType  (CDeclaration a) a  -- ^ @typeof(type)@
+  | CAtomicType  (CDeclaration a) a  -- ^ @_Atomic(type)@
+    deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})
+
+instance NFData a => NFData (CTypeSpecifier a)
+
+-- | returns @True@ if the given typespec is a struct, union or enum /definition/
+isSUEDef :: CTypeSpecifier a -> Bool
+isSUEDef (CSUType (CStruct _ _ (Just _) _ _) _) = True
+isSUEDef (CEnumType (CEnum _ (Just _) _ _) _) = True
+isSUEDef _ = False
+
+-- | C type qualifiers (K&R A8.2, C99 6.7.3) and attributes.
+--
+-- @const@, @volatile@ and @restrict@ type qualifiers
+-- Additionally, @__attribute__@ annotations for declarations and declarators, and
+-- function specifiers
+type CTypeQual = CTypeQualifier NodeInfo
+data CTypeQualifier a
+  = CConstQual a
+  | CVolatQual a
+  | CRestrQual a
+  | CAtomicQual a
+  | CAttrQual  (CAttribute a)
+  | CNullableQual a
+  | CNonnullQual a
+  | CClRdOnlyQual a
+  | CClWrOnlyQual a
+    deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})
+
+instance NFData a => NFData (CTypeQualifier a)
+
+-- | C function specifiers (C99 6.7.4)
+--
+-- function specifiers @inline@ and @_Noreturn@
+type CFunSpec = CFunctionSpecifier NodeInfo
+data CFunctionSpecifier a
+  = CInlineQual a
+  | CNoreturnQual a
+    deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})
+
+instance NFData a => NFData (CFunctionSpecifier a)
+
+-- | C alignment specifiers (C99 6.7.5)
+--
+type CAlignSpec = CAlignmentSpecifier NodeInfo
+data CAlignmentSpecifier a
+  = CAlignAsType (CDeclaration a) a  -- ^ @_Alignas(type)@
+  | CAlignAsExpr (CExpression a) a   -- ^ @_Alignas(expr)@
+    deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})
+
+instance NFData a => NFData (CAlignmentSpecifier a)
+
+-- | 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
+type CStructUnion = CStructureUnion NodeInfo
+data CStructureUnion a
+  = CStruct
+    CStructTag
+    (Maybe Ident)
+    (Maybe [CDeclaration a])  -- member declarations
+    [CAttribute a]            -- __attribute__s
+    a
+    deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})
+
+instance NFData a => NFData (CStructureUnion a)
+
+-- | A tag to determine wheter we refer to a @struct@ or @union@, see 'CStructUnion'.
+data CStructTag = CStructTag
+                | CUnionTag
+                deriving (Show, Eq,Data, Generic)
+
+instance NFData CStructTag
+
+-- | 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
+type CEnum = CEnumeration NodeInfo
+data CEnumeration a
+  = CEnum
+    (Maybe Ident)
+    (Maybe [(Ident,                   -- variant name
+             Maybe (CExpression a))]) -- explicit variant value
+    [CAttribute a]                    -- __attribute__s
+    a
+    deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})
+
+instance NFData a => NFData (CEnumeration a)
+
+-- | 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.
+type CInit = CInitializer NodeInfo
+data CInitializer a
+  -- | assignment expression
+  = CInitExpr (CExpression a) a
+  -- | initialization list (see 'CInitList')
+  | CInitList (CInitializerList a) a
+    deriving (Show, Data, Generic {-! ,CNode , Annotated !-})
+
+instance NFData a => NFData (CInitializer a)
+
+-- deriving Functor does not work (type synonym)
+instance Functor CInitializer where
+        fmap _f (CInitExpr a1 a2) = CInitExpr (fmap _f a1) (_f a2)
+        fmap _f (CInitList a1 a2) = CInitList (fmapInitList _f a1) (_f a2)
+fmapInitList :: (a->b) -> (CInitializerList a) -> (CInitializerList b)
+fmapInitList _f = map (\(desigs, initializer) -> (fmap (fmap _f) desigs, fmap _f initializer))
+
+-- | Initializer List
+--
+-- The members of an initializer list are of the form @(designator-list,initializer)@.
+-- The @designator-list@ specifies one member of the compound type which is initialized.
+-- It 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):
+--
+-- > -- int x[3][4] = { [0][3] = 4, [2] = 5, 8 };
+-- > --   corresponds to the assignments
+-- > -- x[0][3] = 4; x[2][0] = 5; x[2][1] = 8;
+-- > let init1 = ([CArrDesig 0, CArrDesig 3], CInitExpr 4)
+-- >     init2 = ([CArrDesig 2]             , CInitExpr 5)
+-- >     init3 = ([]                        , CInitExpr 8)
+-- > in  CInitList [init1, init2, init3]
+--
+-- > -- struct { struct { int a[2]; int b[2]; int c[2]; } s; } x = { .s = { {2,3} , .c[0] = 1 } };
+-- > --   corresponds to the assignments
+-- > -- x.s.a[0] = 2; x.s.a[1] = 3; x.s.c[0] = 1;
+-- > let init_s_0 = CInitList [ ([], CInitExpr 2), ([], CInitExpr 3)]
+-- >     init_s   = CInitList [
+-- >                            ([], init_s_0),
+-- >                            ([CMemberDesig "c", CArrDesig 0], CInitExpr 1)
+-- >                          ]
+-- > in  CInitList [(CMemberDesig "s", init_s)]
+type CInitList = CInitializerList NodeInfo
+type CInitializerList a = [([CPartDesignator a], CInitializer a)]
+
+-- | 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.
+type CDesignator = CPartDesignator NodeInfo
+data CPartDesignator a
+  -- | array position designator
+  = CArrDesig     (CExpression a) a
+  -- | member designator
+  | CMemberDesig  Ident a
+  -- | array range designator @CRangeDesig from to _@ (GNU C)
+  | CRangeDesig (CExpression a) (CExpression a) a
+    deriving (Show, Data, Generic {-! ,CNode ,Functor ,Annotated !-})
+
+instance NFData a => NFData (CPartDesignator a)
+
+-- | @__attribute__@ annotations
+--
+-- Those are of the form @CAttr attribute-name attribute-parameters@,
+-- and serve as generic properties of some syntax tree elements.
+type CAttr = CAttribute NodeInfo
+data CAttribute a = CAttr Ident [CExpression a] a
+                    deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})
+
+instance NFData a => NFData (CAttribute a)
+
+-- | 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
+--
+type CExpr = CExpression NodeInfo
+data CExpression a
+  = CComma       [CExpression a]         -- comma expression list, n >= 2
+                 a
+  | CAssign      CAssignOp               -- assignment operator
+                 (CExpression a)         -- l-value
+                 (CExpression a)         -- r-value
+                 a
+  | CCond        (CExpression a)         -- conditional
+                 (Maybe (CExpression a)) -- true-expression (GNU allows omitting)
+                 (CExpression a)         -- false-expression
+                 a
+  | CBinary      CBinaryOp               -- binary operator
+                 (CExpression a)         -- lhs
+                 (CExpression a)         -- rhs
+                 a
+  | CCast        (CDeclaration a)        -- type name
+                 (CExpression a)
+                 a
+  | CUnary       CUnaryOp                -- unary operator
+                 (CExpression a)
+                 a
+  | CSizeofExpr  (CExpression a)
+                 a
+  | CSizeofType  (CDeclaration a)        -- type name
+                 a
+  | CAlignofExpr (CExpression a)
+                 a
+  | CAlignofType (CDeclaration a)        -- type name
+                 a
+  | CComplexReal (CExpression a)         -- real part of complex number
+                 a
+  | CComplexImag (CExpression a)         -- imaginary part of complex number
+                 a
+  | CIndex       (CExpression a)         -- array
+                 (CExpression a)         -- index
+                 a
+  | CCall        (CExpression a)         -- function
+                 [CExpression a]         -- arguments
+                 a
+  | CMember      (CExpression a)         -- structure
+                 Ident                   -- member name
+                 Bool                    -- deref structure? (True for `->')
+                 a
+  | CVar         Ident                   -- identifier (incl. enumeration const)
+                 a
+  | CConst       (CConstant a)           -- ^ integer, character, floating point and string constants
+  | CCompoundLit (CDeclaration a)
+                 (CInitializerList a)    -- type name & initialiser list
+                 a                       -- ^ C99 compound literal
+  | CGenericSelection (CExpression a) [(Maybe (CDeclaration a), CExpression a)] a -- ^ C11 generic selection
+  | CStatExpr    (CStatement a) a        -- ^ GNU C compound statement as expr
+  | CLabAddrExpr Ident a                 -- ^ GNU C address of label
+  | CBuiltinExpr (CBuiltinThing a)       -- ^ builtin expressions, see 'CBuiltin'
+    deriving (Data,Show, Generic {-! ,CNode , Annotated !-})
+
+instance NFData a => NFData (CExpression a)
+
+-- deriving Functor does not work (type synonyms)
+instance Functor CExpression where
+        fmap _f (CComma a1 a2) = CComma (fmap (fmap _f) a1) (_f a2)
+        fmap _f (CAssign a1 a2 a3 a4)
+          = CAssign a1 (fmap _f a2) (fmap _f a3) (_f a4)
+        fmap _f (CCond a1 a2 a3 a4)
+          = CCond (fmap _f a1) (fmap (fmap _f) a2) (fmap _f a3) (_f a4)
+        fmap _f (CBinary a1 a2 a3 a4)
+          = CBinary a1 (fmap _f a2) (fmap _f a3) (_f a4)
+        fmap _f (CCast a1 a2 a3) = CCast (fmap _f a1) (fmap _f a2) (_f a3)
+        fmap _f (CUnary a1 a2 a3) = CUnary a1 (fmap _f a2) (_f a3)
+        fmap _f (CSizeofExpr a1 a2) = CSizeofExpr (fmap _f a1) (_f a2)
+        fmap _f (CSizeofType a1 a2) = CSizeofType (fmap _f a1) (_f a2)
+        fmap _f (CAlignofExpr a1 a2) = CAlignofExpr (fmap _f a1) (_f a2)
+        fmap _f (CAlignofType a1 a2) = CAlignofType (fmap _f a1) (_f a2)
+        fmap _f (CComplexReal a1 a2) = CComplexReal (fmap _f a1) (_f a2)
+        fmap _f (CComplexImag a1 a2) = CComplexImag (fmap _f a1) (_f a2)
+        fmap _f (CIndex a1 a2 a3)
+          = CIndex (fmap _f a1) (fmap _f a2) (_f a3)
+        fmap _f (CCall a1 a2 a3)
+          = CCall (fmap _f a1) (fmap (fmap _f) a2) (_f a3)
+        fmap _f (CMember a1 a2 a3 a4) = CMember (fmap _f a1) a2 a3 (_f a4)
+        fmap _f (CVar a1 a2) = CVar a1 (_f a2)
+        fmap _f (CConst a1) = CConst (fmap _f a1)
+        fmap _f (CCompoundLit a1 a2 a3)
+          = CCompoundLit (fmap _f a1) (fmapInitList _f a2) (_f a3)
+        fmap _f (CStatExpr a1 a2) = CStatExpr (fmap _f a1) (_f a2)
+        fmap _f (CLabAddrExpr a1 a2) = CLabAddrExpr a1 (_f a2)
+        fmap _f (CBuiltinExpr a1) = CBuiltinExpr (fmap _f a1)
+        fmap _f (CGenericSelection expr list annot) =
+          CGenericSelection (fmap _f expr) (map fmap_helper list) (_f annot)
+          where
+            fmap_helper (ma1, a2) = (fmap (fmap _f) ma1, fmap _f a2)
+
+-- | GNU Builtins, which cannot be typed in C99
+type CBuiltin = CBuiltinThing NodeInfo
+data CBuiltinThing a
+  = CBuiltinVaArg (CExpression a) (CDeclaration a) a            -- ^ @(expr, type)@
+  | CBuiltinOffsetOf (CDeclaration a) [CPartDesignator a] a -- ^ @(type, designator-list)@
+  | CBuiltinTypesCompatible (CDeclaration a) (CDeclaration a) a  -- ^ @(type,type)@
+  | CBuiltinConvertVector (CExpression a) (CDeclaration a) a -- ^ @(expr, type)@
+  | CBuiltinBitCast (CDeclaration a) (CExpression a) a -- ^ @(type, expr)@
+    deriving (Show, Data, Generic {-! ,CNode ,Functor ,Annotated !-})
+
+instance NFData a => NFData (CBuiltinThing a)
+
+-- | C constant (K&R A2.5 & A7.2)
+type CConst = CConstant NodeInfo
+data CConstant a
+  = CIntConst   CInteger a
+  | CCharConst  CChar a
+  | CFloatConst CFloat a
+  | CStrConst   CString a
+    deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})
+
+instance NFData a => NFData (CConstant a)
+
+-- | Attributed string literals
+type CStrLit = CStringLiteral NodeInfo
+data CStringLiteral a = CStrLit CString a
+            deriving (Show, Data, Generic, Generic1 {-! ,CNode ,Functor ,Annotated !-})
+
+instance NFData a => NFData (CStringLiteral a)
+
+cstringOfLit :: CStringLiteral a -> CString
+cstringOfLit (CStrLit cstr _) = cstr
+
+-- | Lift a string literal to a C constant
+liftStrLit :: CStringLiteral a -> CConstant a
+liftStrLit (CStrLit str at) = CStrConst str at
+
+-- | All AST nodes are annotated. Inspired by the Annotated
+-- class of Niklas Broberg's haskell-src-exts package.
+-- In principle, we could have Copointed superclass instead
+-- of @ann@, for the price of another dependency.
+class (Functor ast) => Annotated ast where
+  -- | get the annotation of an AST node
+  annotation :: ast a -> a
+  -- | change the annotation (non-recursively)
+  --   of an AST node. Use fmap for recursively
+  --   modifying the annotation.
+  amap  :: (a->a) -> ast a -> ast a
+
+-- fmap2 :: (a->a') -> (a,b) -> (a',b)
+-- fmap2 f (a,b) = (f a, b)
+
+-- Instances generated using derive-2.*
+-- GENERATED START
+
+instance CNode t1 => CNode (CTranslationUnit t1) where
+        nodeInfo (CTranslUnit _ n) = nodeInfo n
+instance CNode t1 => Pos (CTranslationUnit t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CTranslationUnit where
+        fmap _f (CTranslUnit a1 a2)
+          = CTranslUnit (fmap (fmap _f) a1) (_f a2)
+
+instance Annotated CTranslationUnit where
+        annotation (CTranslUnit _ n) = n
+        amap f (CTranslUnit a_1 a_2) = CTranslUnit a_1 (f a_2)
+
+instance CNode t1 => CNode (CExternalDeclaration t1) where
+        nodeInfo (CDeclExt d) = nodeInfo d
+        nodeInfo (CFDefExt d) = nodeInfo d
+        nodeInfo (CAsmExt _ n) = nodeInfo n
+instance CNode t1 => Pos (CExternalDeclaration t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CExternalDeclaration where
+        fmap _f (CDeclExt a1) = CDeclExt (fmap _f a1)
+        fmap _f (CFDefExt a1) = CFDefExt (fmap _f a1)
+        fmap _f (CAsmExt a1 a2) = CAsmExt (fmap _f a1) (_f a2)
+
+instance Annotated CExternalDeclaration where
+        annotation (CDeclExt n) = annotation n
+        annotation (CFDefExt n) = annotation n
+        annotation (CAsmExt _ n) = n
+        amap f (CDeclExt n) = CDeclExt (amap f n)
+        amap f (CFDefExt n) = CFDefExt (amap f n)
+        amap f (CAsmExt a_1 a_2) = CAsmExt a_1 (f a_2)
+
+instance CNode t1 => CNode (CFunctionDef t1) where
+        nodeInfo (CFunDef _ _ _ _ n) = nodeInfo n
+instance CNode t1 => Pos (CFunctionDef t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CFunctionDef where
+        fmap _f (CFunDef a1 a2 a3 a4 a5)
+          = CFunDef (fmap (fmap _f) a1) (fmap _f a2) (fmap (fmap _f) a3)
+              (fmap _f a4)
+              (_f a5)
+
+instance Annotated CFunctionDef where
+        annotation (CFunDef _ _ _ _ n) = n
+        amap f (CFunDef a_1 a_2 a_3 a_4 a_5)
+          = CFunDef a_1 a_2 a_3 a_4 (f a_5)
+
+instance CNode t1 => CNode (CDeclaration t1) where
+        nodeInfo (CDecl _ _ n) = nodeInfo n
+        nodeInfo (CStaticAssert _ _ n) = nodeInfo n
+instance CNode t1 => Pos (CDeclaration t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Annotated CDeclaration where
+        annotation (CDecl _ _ n) = n
+        annotation (CStaticAssert _ _ n) = n
+        amap f (CDecl a_1 a_2 a_3) = CDecl a_1 a_2 (f a_3)
+        amap f (CStaticAssert a_1 a_2 a_3) = CStaticAssert a_1 a_2 (f a_3)
+
+instance CNode t1 => CNode (CDeclarator t1) where
+        nodeInfo (CDeclr _ _ _ _ n) = nodeInfo n
+instance CNode t1 => Pos (CDeclarator t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CDeclarator where
+        fmap _f (CDeclr a1 a2 a3 a4 a5)
+          = CDeclr a1 (fmap (fmap _f) a2) (fmap (fmap _f) a3)
+              (fmap (fmap _f) a4)
+              (_f a5)
+
+instance Annotated CDeclarator where
+        annotation (CDeclr _ _ _ _ n) = n
+        amap f (CDeclr a_1 a_2 a_3 a_4 a_5)
+          = CDeclr a_1 a_2 a_3 a_4 (f a_5)
+
+instance CNode t1 => CNode (CDerivedDeclarator t1) where
+        nodeInfo (CPtrDeclr _ n) = nodeInfo n
+        nodeInfo (CArrDeclr _ _ n) = nodeInfo n
+        nodeInfo (CFunDeclr _ _ n) = nodeInfo n
+instance CNode t1 => Pos (CDerivedDeclarator t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Annotated CDerivedDeclarator where
+        annotation (CPtrDeclr _ n) = n
+        annotation (CArrDeclr _ _ n) = n
+        annotation (CFunDeclr _ _ n) = n
+        amap f (CPtrDeclr a_1 a_2) = CPtrDeclr a_1 (f a_2)
+        amap f (CArrDeclr a_1 a_2 a_3) = CArrDeclr a_1 a_2 (f a_3)
+        amap f (CFunDeclr a_1 a_2 a_3) = CFunDeclr a_1 a_2 (f a_3)
+
+instance Functor CArraySize where
+        fmap _ (CNoArrSize a1) = CNoArrSize a1
+        fmap _f (CArrSize a1 a2) = CArrSize a1 (fmap _f a2)
+
+instance CNode t1 => CNode (CStatement t1) where
+        nodeInfo (CLabel _ _ _ n) = nodeInfo n
+        nodeInfo (CCase _ _ n) = nodeInfo n
+        nodeInfo (CCases _ _ _ n) = nodeInfo n
+        nodeInfo (CDefault _ n) = nodeInfo n
+        nodeInfo (CExpr _ n) = nodeInfo n
+        nodeInfo (CCompound _ _ n) = nodeInfo n
+        nodeInfo (CIf _ _ _ n) = nodeInfo n
+        nodeInfo (CSwitch _ _ n) = nodeInfo n
+        nodeInfo (CWhile _ _ _ n) = nodeInfo n
+        nodeInfo (CFor _ _ _ _ n) = nodeInfo n
+        nodeInfo (CGoto _ n) = nodeInfo n
+        nodeInfo (CGotoPtr _ n) = nodeInfo n
+        nodeInfo (CCont d) = nodeInfo d
+        nodeInfo (CBreak d) = nodeInfo d
+        nodeInfo (CReturn _ n) = nodeInfo n
+        nodeInfo (CAsm _ n) = nodeInfo n
+instance CNode t1 => Pos (CStatement t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Annotated CStatement where
+        annotation (CLabel _ _ _ n) = n
+        annotation (CCase _ _ n) = n
+        annotation (CCases _ _ _ n) = n
+        annotation (CDefault _ n) = n
+        annotation (CExpr _ n) = n
+        annotation (CCompound _ _ n) = n
+        annotation (CIf _ _ _ n) = n
+        annotation (CSwitch _ _ n) = n
+        annotation (CWhile _ _ _ n) = n
+        annotation (CFor _ _ _ _ n) = n
+        annotation (CGoto _ n) = n
+        annotation (CGotoPtr _ n) = n
+        annotation (CCont n) = n
+        annotation (CBreak n) = n
+        annotation (CReturn _ n) = n
+        annotation (CAsm _ n) = n
+        amap f (CLabel a_1 a_2 a_3 a_4) = CLabel a_1 a_2 a_3 (f a_4)
+        amap f (CCase a_1 a_2 a_3) = CCase a_1 a_2 (f a_3)
+        amap f (CCases a_1 a_2 a_3 a_4) = CCases a_1 a_2 a_3 (f a_4)
+        amap f (CDefault a_1 a_2) = CDefault a_1 (f a_2)
+        amap f (CExpr a_1 a_2) = CExpr a_1 (f a_2)
+        amap f (CCompound a_1 a_2 a_3) = CCompound a_1 a_2 (f a_3)
+        amap f (CIf a_1 a_2 a_3 a_4) = CIf a_1 a_2 a_3 (f a_4)
+        amap f (CSwitch a_1 a_2 a_3) = CSwitch a_1 a_2 (f a_3)
+        amap f (CWhile a_1 a_2 a_3 a_4) = CWhile a_1 a_2 a_3 (f a_4)
+        amap f (CFor a_1 a_2 a_3 a_4 a_5) = CFor a_1 a_2 a_3 a_4 (f a_5)
+        amap f (CGoto a_1 a_2) = CGoto a_1 (f a_2)
+        amap f (CGotoPtr a_1 a_2) = CGotoPtr a_1 (f a_2)
+        amap f (CCont a_1) = CCont (f a_1)
+        amap f (CBreak a_1) = CBreak (f a_1)
+        amap f (CReturn a_1 a_2) = CReturn a_1 (f a_2)
+        amap f (CAsm a_1 a_2) = CAsm a_1 (f a_2)
+
+instance CNode t1 => CNode (CAssemblyStatement t1) where
+        nodeInfo (CAsmStmt _ _ _ _ _ n) = nodeInfo n
+instance CNode t1 => Pos (CAssemblyStatement t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CAssemblyStatement where
+        fmap _f (CAsmStmt a1 a2 a3 a4 a5 a6)
+          = CAsmStmt (fmap (fmap _f) a1) (fmap _f a2) (fmap (fmap _f) a3)
+              (fmap (fmap _f) a4)
+              (fmap (fmap _f) a5)
+              (_f a6)
+
+instance Annotated CAssemblyStatement where
+        annotation (CAsmStmt _ _ _ _ _ n) = n
+        amap f (CAsmStmt a_1 a_2 a_3 a_4 a_5 a_6)
+          = CAsmStmt a_1 a_2 a_3 a_4 a_5 (f a_6)
+
+instance CNode t1 => CNode (CAssemblyOperand t1) where
+        nodeInfo (CAsmOperand _ _ _ n) = nodeInfo n
+instance CNode t1 => Pos (CAssemblyOperand t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CAssemblyOperand where
+        fmap _f (CAsmOperand a1 a2 a3 a4)
+          = CAsmOperand a1 (fmap _f a2) (fmap _f a3) (_f a4)
+
+instance Annotated CAssemblyOperand where
+        annotation (CAsmOperand _ _ _ n) = n
+        amap f (CAsmOperand a_1 a_2 a_3 a_4)
+          = CAsmOperand a_1 a_2 a_3 (f a_4)
+
+instance CNode t1 => CNode (CCompoundBlockItem t1) where
+        nodeInfo (CBlockStmt d) = nodeInfo d
+        nodeInfo (CBlockDecl d) = nodeInfo d
+        nodeInfo (CNestedFunDef d) = nodeInfo d
+instance CNode t1 => Pos (CCompoundBlockItem t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CCompoundBlockItem where
+        fmap _f (CBlockStmt a1) = CBlockStmt (fmap _f a1)
+        fmap _f (CBlockDecl a1) = CBlockDecl (fmap _f a1)
+        fmap _f (CNestedFunDef a1) = CNestedFunDef (fmap _f a1)
+
+instance Annotated CCompoundBlockItem where
+        annotation (CBlockStmt n) = annotation n
+        annotation (CBlockDecl n) = annotation n
+        annotation (CNestedFunDef n) = annotation n
+        amap f (CBlockStmt n) = CBlockStmt (amap f n)
+        amap f (CBlockDecl n) = CBlockDecl (amap f n)
+        amap f (CNestedFunDef n) = CNestedFunDef (amap f n)
+
+instance CNode t1 => CNode (CDeclarationSpecifier t1) where
+        nodeInfo (CStorageSpec d) = nodeInfo d
+        nodeInfo (CTypeSpec d) = nodeInfo d
+        nodeInfo (CTypeQual d) = nodeInfo d
+        nodeInfo (CFunSpec d) = nodeInfo d
+        nodeInfo (CAlignSpec d) = nodeInfo d
+instance CNode t1 => Pos (CDeclarationSpecifier t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CDeclarationSpecifier where
+        fmap _f (CStorageSpec a1) = CStorageSpec (fmap _f a1)
+        fmap _f (CTypeSpec a1) = CTypeSpec (fmap _f a1)
+        fmap _f (CTypeQual a1) = CTypeQual (fmap _f a1)
+        fmap _f (CFunSpec a1) = CFunSpec (fmap _f a1)
+        fmap _f (CAlignSpec a1) = CAlignSpec (fmap _f a1)
+
+instance Annotated CDeclarationSpecifier where
+        annotation (CStorageSpec n) = annotation n
+        annotation (CTypeSpec n) = annotation n
+        annotation (CTypeQual n) = annotation n
+        annotation (CFunSpec n) = annotation n
+        annotation (CAlignSpec n) = annotation n
+        amap f (CStorageSpec n) = CStorageSpec (amap f n)
+        amap f (CTypeSpec n) = CTypeSpec (amap f n)
+        amap f (CTypeQual n) = CTypeQual (amap f n)
+        amap f (CFunSpec n) = CFunSpec (amap f n)
+        amap f (CAlignSpec n) = CAlignSpec (amap f n)
+
+instance CNode t1 => CNode (CStorageSpecifier t1) where
+        nodeInfo (CAuto d) = nodeInfo d
+        nodeInfo (CRegister d) = nodeInfo d
+        nodeInfo (CStatic d) = nodeInfo d
+        nodeInfo (CExtern d) = nodeInfo d
+        nodeInfo (CTypedef d) = nodeInfo d
+        nodeInfo (CThread d) = nodeInfo d
+        nodeInfo (CClKernel d) = nodeInfo d
+        nodeInfo (CClGlobal d) = nodeInfo d
+        nodeInfo (CClLocal d) = nodeInfo d
+instance CNode t1 => Pos (CStorageSpecifier t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CStorageSpecifier where
+        fmap _f (CAuto a1) = CAuto (_f a1)
+        fmap _f (CRegister a1) = CRegister (_f a1)
+        fmap _f (CStatic a1) = CStatic (_f a1)
+        fmap _f (CExtern a1) = CExtern (_f a1)
+        fmap _f (CTypedef a1) = CTypedef (_f a1)
+        fmap _f (CThread a1) = CThread (_f a1)
+        fmap _f (CClKernel a1) = CClKernel (_f a1)
+        fmap _f (CClGlobal a1) = CClGlobal (_f a1)
+        fmap _f (CClLocal a1) = CClLocal (_f a1)
+
+instance Annotated CStorageSpecifier where
+        annotation (CAuto n) = n
+        annotation (CRegister n) = n
+        annotation (CStatic n) = n
+        annotation (CExtern n) = n
+        annotation (CTypedef n) = n
+        annotation (CThread n) = n
+        annotation (CClKernel n) = n
+        annotation (CClGlobal n) = n
+        annotation (CClLocal n) = n
+        amap f (CAuto a_1) = CAuto (f a_1)
+        amap f (CRegister a_1) = CRegister (f a_1)
+        amap f (CStatic a_1) = CStatic (f a_1)
+        amap f (CExtern a_1) = CExtern (f a_1)
+        amap f (CTypedef a_1) = CTypedef (f a_1)
+        amap f (CThread a_1) = CThread (f a_1)
+        amap f (CClKernel a_1) = CClKernel (f a_1)
+        amap f (CClGlobal a_1) = CClGlobal (f a_1)
+        amap f (CClLocal a_1) = CClLocal (f a_1)
+
+instance CNode t1 => CNode (CTypeSpecifier t1) where
+        nodeInfo (CVoidType d) = nodeInfo d
+        nodeInfo (CCharType d) = nodeInfo d
+        nodeInfo (CShortType d) = nodeInfo d
+        nodeInfo (CIntType d) = nodeInfo d
+        nodeInfo (CLongType d) = nodeInfo d
+        nodeInfo (CBFloat16Type d) = nodeInfo d
+        nodeInfo (CFloatType d) = nodeInfo d
+        nodeInfo (CFloatNType _ _ d) = nodeInfo d
+        nodeInfo (CDoubleType d) = nodeInfo d
+        nodeInfo (CSignedType d) = nodeInfo d
+        nodeInfo (CUnsigType d) = nodeInfo d
+        nodeInfo (CBoolType d) = nodeInfo d
+        nodeInfo (CComplexType d) = nodeInfo d
+        nodeInfo (CInt128Type d) = nodeInfo d
+        nodeInfo (CUInt128Type d) = nodeInfo d
+        nodeInfo (CSUType _ n) = nodeInfo n
+        nodeInfo (CEnumType _ n) = nodeInfo n
+        nodeInfo (CTypeDef _ n) = nodeInfo n
+        nodeInfo (CTypeOfExpr _ n) = nodeInfo n
+        nodeInfo (CTypeOfType _ n) = nodeInfo n
+        nodeInfo (CAtomicType _ n) = nodeInfo n
+instance CNode t1 => Pos (CTypeSpecifier t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CTypeSpecifier where
+        fmap _f (CVoidType a1) = CVoidType (_f a1)
+        fmap _f (CCharType a1) = CCharType (_f a1)
+        fmap _f (CShortType a1) = CShortType (_f a1)
+        fmap _f (CIntType a1) = CIntType (_f a1)
+        fmap _f (CLongType a1) = CLongType (_f a1)
+        fmap _f (CFloatType a1) = CFloatType (_f a1)
+        fmap _f (CBFloat16Type a1) = CBFloat16Type (_f a1)
+        fmap _f (CFloatNType n x a1) = CFloatNType n x (_f a1)
+        fmap _f (CDoubleType a1) = CDoubleType (_f a1)
+        fmap _f (CSignedType a1) = CSignedType (_f a1)
+        fmap _f (CUnsigType a1) = CUnsigType (_f a1)
+        fmap _f (CBoolType a1) = CBoolType (_f a1)
+        fmap _f (CComplexType a1) = CComplexType (_f a1)
+        fmap _f (CInt128Type a1) = CInt128Type (_f a1)
+        fmap _f (CUInt128Type a1) = CUInt128Type (_f a1)
+        fmap _f (CSUType a1 a2) = CSUType (fmap _f a1) (_f a2)
+        fmap _f (CEnumType a1 a2) = CEnumType (fmap _f a1) (_f a2)
+        fmap _f (CTypeDef a1 a2) = CTypeDef a1 (_f a2)
+        fmap _f (CTypeOfExpr a1 a2) = CTypeOfExpr (fmap _f a1) (_f a2)
+        fmap _f (CTypeOfType a1 a2) = CTypeOfType (fmap _f a1) (_f a2)
+        fmap _f (CAtomicType a1 a2) = CAtomicType (fmap _f a1) (_f a2)
+
+instance Annotated CTypeSpecifier where
+        annotation (CVoidType n) = n
+        annotation (CCharType n) = n
+        annotation (CShortType n) = n
+        annotation (CIntType n) = n
+        annotation (CLongType n) = n
+        annotation (CFloatType n) = n
+        annotation (CBFloat16Type n) = n
+        annotation (CFloatNType _ _ n) = n
+        annotation (CDoubleType n) = n
+        annotation (CSignedType n) = n
+        annotation (CUnsigType n) = n
+        annotation (CBoolType n) = n
+        annotation (CComplexType n) = n
+        annotation (CInt128Type n) = n
+        annotation (CUInt128Type n) = n
+        annotation (CSUType _ n) = n
+        annotation (CEnumType _ n) = n
+        annotation (CTypeDef _ n) = n
+        annotation (CTypeOfExpr _ n) = n
+        annotation (CTypeOfType _ n) = n
+        annotation (CAtomicType _ n) = n
+        amap f (CVoidType a_1) = CVoidType (f a_1)
+        amap f (CCharType a_1) = CCharType (f a_1)
+        amap f (CShortType a_1) = CShortType (f a_1)
+        amap f (CIntType a_1) = CIntType (f a_1)
+        amap f (CLongType a_1) = CLongType (f a_1)
+        amap f (CFloatType a_1) = CFloatType (f a_1)
+        amap f (CBFloat16Type a_1) = CBFloat16Type (f a_1)
+        amap f (CFloatNType n x a_1) = CFloatNType n x (f a_1)
+        amap f (CDoubleType a_1) = CDoubleType (f a_1)
+        amap f (CSignedType a_1) = CSignedType (f a_1)
+        amap f (CUnsigType a_1) = CUnsigType (f a_1)
+        amap f (CBoolType a_1) = CBoolType (f a_1)
+        amap f (CComplexType a_1) = CComplexType (f a_1)
+        amap f (CInt128Type a_1) = CInt128Type (f a_1)
+        amap f (CUInt128Type a_1) = CUInt128Type (f a_1)
+        amap f (CSUType a_1 a_2) = CSUType a_1 (f a_2)
+        amap f (CEnumType a_1 a_2) = CEnumType a_1 (f a_2)
+        amap f (CTypeDef a_1 a_2) = CTypeDef a_1 (f a_2)
+        amap f (CTypeOfExpr a_1 a_2) = CTypeOfExpr a_1 (f a_2)
+        amap f (CTypeOfType a_1 a_2) = CTypeOfType a_1 (f a_2)
+        amap f (CAtomicType a_1 a_2) = CAtomicType a_1 (f a_2)
+
+instance CNode t1 => CNode (CTypeQualifier t1) where
+        nodeInfo (CConstQual d) = nodeInfo d
+        nodeInfo (CVolatQual d) = nodeInfo d
+        nodeInfo (CRestrQual d) = nodeInfo d
+        nodeInfo (CAtomicQual d) = nodeInfo d
+        nodeInfo (CAttrQual d) = nodeInfo d
+        nodeInfo (CNullableQual d) = nodeInfo d
+        nodeInfo (CNonnullQual d) = nodeInfo d
+        nodeInfo (CClRdOnlyQual d) = nodeInfo d
+        nodeInfo (CClWrOnlyQual d) = nodeInfo d
+
+instance CNode t1 => Pos (CTypeQualifier t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CTypeQualifier where
+        fmap _f (CConstQual a1) = CConstQual (_f a1)
+        fmap _f (CVolatQual a1) = CVolatQual (_f a1)
+        fmap _f (CRestrQual a1) = CRestrQual (_f a1)
+        fmap _f (CAtomicQual a1) = CAtomicQual (_f a1)
+        fmap _f (CAttrQual a1) = CAttrQual (fmap _f a1)
+        fmap _f (CNullableQual a1) = CNullableQual (_f a1)
+        fmap _f (CNonnullQual a1) = CNonnullQual (_f a1)
+        fmap _f (CClRdOnlyQual a1) = CClRdOnlyQual (_f a1)
+        fmap _f (CClWrOnlyQual a1) = CClWrOnlyQual (_f a1)
+
+instance Annotated CTypeQualifier where
+        annotation (CConstQual n) = n
+        annotation (CVolatQual n) = n
+        annotation (CRestrQual n) = n
+        annotation (CAtomicQual n) = n
+        annotation (CAttrQual n) = annotation n
+        annotation (CNullableQual n) = n
+        annotation (CNonnullQual n) = n
+        annotation (CClRdOnlyQual n) = n
+        annotation (CClWrOnlyQual n) = n
+        amap f (CConstQual a_1) = CConstQual (f a_1)
+        amap f (CVolatQual a_1) = CVolatQual (f a_1)
+        amap f (CRestrQual a_1) = CRestrQual (f a_1)
+        amap f (CAtomicQual a_1) = CAtomicQual (f a_1)
+        amap f (CAttrQual n) = CAttrQual (amap f n)
+        amap f (CNullableQual a_1) = CNullableQual (f a_1)
+        amap f (CNonnullQual a_1) = CNonnullQual (f a_1)
+        amap f (CClRdOnlyQual a_1) = CClRdOnlyQual (f a_1)
+        amap f (CClWrOnlyQual a_1) = CClWrOnlyQual (f a_1)
+
+instance CNode t1 => CNode (CFunctionSpecifier t1) where
+        nodeInfo (CInlineQual d) = nodeInfo d
+        nodeInfo (CNoreturnQual d) = nodeInfo d
+instance CNode t1 => Pos (CFunctionSpecifier t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CFunctionSpecifier where
+        fmap _f (CInlineQual a1) = CInlineQual (_f a1)
+        fmap _f (CNoreturnQual a1) = CNoreturnQual (_f a1)
+
+instance Annotated CFunctionSpecifier where
+        annotation (CInlineQual n) = n
+        annotation (CNoreturnQual n) = n
+        amap f (CInlineQual a_1) = CInlineQual (f a_1)
+        amap f (CNoreturnQual a_1) = CNoreturnQual (f a_1)
+
+instance CNode t1 => CNode (CAlignmentSpecifier t1) where
+        nodeInfo (CAlignAsType _ n) = nodeInfo n
+        nodeInfo (CAlignAsExpr _ n) = nodeInfo n
+instance CNode t1 => Pos (CAlignmentSpecifier t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CAlignmentSpecifier where
+        fmap _f (CAlignAsType a1 a2) = CAlignAsType (fmap _f a1) (_f a2)
+        fmap _f (CAlignAsExpr a1 a2) = CAlignAsExpr (fmap _f a1) (_f a2)
+
+instance Annotated CAlignmentSpecifier where
+        annotation (CAlignAsType _ n) = n
+        annotation (CAlignAsExpr _ n) = n
+        amap f (CAlignAsType a_1 a_2) = CAlignAsType a_1 (f a_2)
+        amap f (CAlignAsExpr a_1 a_2) = CAlignAsExpr a_1 (f a_2)
+
+instance CNode t1 => CNode (CStructureUnion t1) where
+        nodeInfo (CStruct _ _ _ _ n) = nodeInfo n
+instance CNode t1 => Pos (CStructureUnion t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CStructureUnion where
+        fmap _f (CStruct a1 a2 a3 a4 a5)
+          = CStruct a1 a2 (fmap (fmap (fmap _f)) a3) (fmap (fmap _f) a4)
+              (_f a5)
+
+instance Annotated CStructureUnion where
+        annotation (CStruct _ _ _ _ n) = n
+        amap f (CStruct a_1 a_2 a_3 a_4 a_5)
+          = CStruct a_1 a_2 a_3 a_4 (f a_5)
+
+instance CNode t1 => CNode (CEnumeration t1) where
+        nodeInfo (CEnum _ _ _ n) = nodeInfo n
+instance CNode t1 => Pos (CEnumeration t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CEnumeration where
+        fmap _f (CEnum a1 a2 a3 a4)
+          = CEnum a1 (fmap (fmap (fmap (fmap (fmap _f)))) a2)
+              (fmap (fmap _f) a3)
+              (_f a4)
+
+instance Annotated CEnumeration where
+        annotation (CEnum _ _ _ n) = n
+        amap f (CEnum a_1 a_2 a_3 a_4) = CEnum a_1 a_2 a_3 (f a_4)
+
+instance CNode t1 => CNode (CInitializer t1) where
+        nodeInfo (CInitExpr _ n) = nodeInfo n
+        nodeInfo (CInitList _ n) = nodeInfo n
+instance CNode t1 => Pos (CInitializer t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Annotated CInitializer where
+        annotation (CInitExpr _ n) = n
+        annotation (CInitList _ n) = n
+        amap f (CInitExpr a_1 a_2) = CInitExpr a_1 (f a_2)
+        amap f (CInitList a_1 a_2) = CInitList a_1 (f a_2)
+
+instance CNode t1 => CNode (CPartDesignator t1) where
+        nodeInfo (CArrDesig _ n) = nodeInfo n
+        nodeInfo (CMemberDesig _ n) = nodeInfo n
+        nodeInfo (CRangeDesig _ _ n) = nodeInfo n
+instance CNode t1 => Pos (CPartDesignator t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CPartDesignator where
+        fmap _f (CArrDesig a1 a2) = CArrDesig (fmap _f a1) (_f a2)
+        fmap _f (CMemberDesig a1 a2) = CMemberDesig a1 (_f a2)
+        fmap _f (CRangeDesig a1 a2 a3)
+          = CRangeDesig (fmap _f a1) (fmap _f a2) (_f a3)
+
+instance Annotated CPartDesignator where
+        annotation (CArrDesig _ n) = n
+        annotation (CMemberDesig _ n) = n
+        annotation (CRangeDesig _ _ n) = n
+        amap f (CArrDesig a_1 a_2) = CArrDesig a_1 (f a_2)
+        amap f (CMemberDesig a_1 a_2) = CMemberDesig a_1 (f a_2)
+        amap f (CRangeDesig a_1 a_2 a_3) = CRangeDesig a_1 a_2 (f a_3)
+
+instance CNode t1 => CNode (CAttribute t1) where
+        nodeInfo (CAttr _ _ n) = nodeInfo n
+instance CNode t1 => Pos (CAttribute t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CAttribute where
+        fmap _f (CAttr a1 a2 a3) = CAttr a1 (fmap (fmap _f) a2) (_f a3)
+
+instance Annotated CAttribute where
+        annotation (CAttr _ _ n) = n
+        amap f (CAttr a_1 a_2 a_3) = CAttr a_1 a_2 (f a_3)
+
+instance CNode t1 => CNode (CExpression t1) where
+        nodeInfo (CComma _ n) = nodeInfo n
+        nodeInfo (CAssign _ _ _ n) = nodeInfo n
+        nodeInfo (CCond _ _ _ n) = nodeInfo n
+        nodeInfo (CBinary _ _ _ n) = nodeInfo n
+        nodeInfo (CCast _ _ n) = nodeInfo n
+        nodeInfo (CUnary _ _ n) = nodeInfo n
+        nodeInfo (CSizeofExpr _ n) = nodeInfo n
+        nodeInfo (CSizeofType _ n) = nodeInfo n
+        nodeInfo (CAlignofExpr _ n) = nodeInfo n
+        nodeInfo (CAlignofType _ n) = nodeInfo n
+        nodeInfo (CComplexReal _ n) = nodeInfo n
+        nodeInfo (CComplexImag _ n) = nodeInfo n
+        nodeInfo (CIndex _ _ n) = nodeInfo n
+        nodeInfo (CCall _ _ n) = nodeInfo n
+        nodeInfo (CMember _ _ _ n) = nodeInfo n
+        nodeInfo (CVar _ n) = nodeInfo n
+        nodeInfo (CConst d) = nodeInfo d
+        nodeInfo (CCompoundLit _ _ n) = nodeInfo n
+        nodeInfo (CGenericSelection _ _ n) = nodeInfo n
+        nodeInfo (CStatExpr _ n) = nodeInfo n
+        nodeInfo (CLabAddrExpr _ n) = nodeInfo n
+        nodeInfo (CBuiltinExpr d) = nodeInfo d
+instance CNode t1 => Pos (CExpression t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Annotated CExpression where
+        annotation (CComma _ n) = n
+        annotation (CAssign _ _ _ n) = n
+        annotation (CCond _ _ _ n) = n
+        annotation (CBinary _ _ _ n) = n
+        annotation (CCast _ _ n) = n
+        annotation (CUnary _ _ n) = n
+        annotation (CSizeofExpr _ n) = n
+        annotation (CSizeofType _ n) = n
+        annotation (CAlignofExpr _ n) = n
+        annotation (CAlignofType _ n) = n
+        annotation (CComplexReal _ n) = n
+        annotation (CComplexImag _ n) = n
+        annotation (CIndex _ _ n) = n
+        annotation (CCall _ _ n) = n
+        annotation (CMember _ _ _ n) = n
+        annotation (CVar _ n) = n
+        annotation (CConst n) = annotation n
+        annotation (CCompoundLit _ _ n) = n
+        annotation (CGenericSelection _ _ n) = n
+        annotation (CStatExpr _ n) = n
+        annotation (CLabAddrExpr _ n) = n
+        annotation (CBuiltinExpr n) = annotation n
+        amap f (CComma a_1 a_2) = CComma a_1 (f a_2)
+        amap f (CAssign a_1 a_2 a_3 a_4) = CAssign a_1 a_2 a_3 (f a_4)
+        amap f (CCond a_1 a_2 a_3 a_4) = CCond a_1 a_2 a_3 (f a_4)
+        amap f (CBinary a_1 a_2 a_3 a_4) = CBinary a_1 a_2 a_3 (f a_4)
+        amap f (CCast a_1 a_2 a_3) = CCast a_1 a_2 (f a_3)
+        amap f (CUnary a_1 a_2 a_3) = CUnary a_1 a_2 (f a_3)
+        amap f (CSizeofExpr a_1 a_2) = CSizeofExpr a_1 (f a_2)
+        amap f (CSizeofType a_1 a_2) = CSizeofType a_1 (f a_2)
+        amap f (CAlignofExpr a_1 a_2) = CAlignofExpr a_1 (f a_2)
+        amap f (CAlignofType a_1 a_2) = CAlignofType a_1 (f a_2)
+        amap f (CComplexReal a_1 a_2) = CComplexReal a_1 (f a_2)
+        amap f (CComplexImag a_1 a_2) = CComplexImag a_1 (f a_2)
+        amap f (CIndex a_1 a_2 a_3) = CIndex a_1 a_2 (f a_3)
+        amap f (CCall a_1 a_2 a_3) = CCall a_1 a_2 (f a_3)
+        amap f (CMember a_1 a_2 a_3 a_4) = CMember a_1 a_2 a_3 (f a_4)
+        amap f (CVar a_1 a_2) = CVar a_1 (f a_2)
+        amap f (CConst n) = CConst (amap f n)
+        amap f (CCompoundLit a_1 a_2 a_3) = CCompoundLit a_1 a_2 (f a_3)
+        amap f (CGenericSelection a_1 a_2 a_3)
+          = CGenericSelection a_1 a_2 (f a_3)
+        amap f (CStatExpr a_1 a_2) = CStatExpr a_1 (f a_2)
+        amap f (CLabAddrExpr a_1 a_2) = CLabAddrExpr a_1 (f a_2)
+        amap f (CBuiltinExpr n) = CBuiltinExpr (amap f n)
+
+instance CNode t1 => CNode (CBuiltinThing t1) where
+        nodeInfo (CBuiltinVaArg _ _ n) = nodeInfo n
+        nodeInfo (CBuiltinOffsetOf _ _ n) = nodeInfo n
+        nodeInfo (CBuiltinTypesCompatible _ _ n) = nodeInfo n
+        nodeInfo (CBuiltinConvertVector _ _ n) = nodeInfo n
+        nodeInfo (CBuiltinBitCast _ _ n) = nodeInfo n
+instance CNode t1 => Pos (CBuiltinThing t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CBuiltinThing where
+        fmap _f (CBuiltinVaArg a1 a2 a3)
+          = CBuiltinVaArg (fmap _f a1) (fmap _f a2) (_f a3)
+        fmap _f (CBuiltinOffsetOf a1 a2 a3)
+          = CBuiltinOffsetOf (fmap _f a1) (fmap (fmap _f) a2) (_f a3)
+        fmap _f (CBuiltinTypesCompatible a1 a2 a3)
+          = CBuiltinTypesCompatible (fmap _f a1) (fmap _f a2) (_f a3)
+        fmap _f (CBuiltinConvertVector a1 a2 a3)
+          = CBuiltinConvertVector (fmap _f a1) (fmap _f a2) (_f a3)
+        fmap _f (CBuiltinBitCast a1 a2 a3)
+          = CBuiltinBitCast (fmap _f a1) (fmap _f a2) (_f a3)
+
+instance Annotated CBuiltinThing where
+        annotation (CBuiltinVaArg _ _ n) = n
+        annotation (CBuiltinOffsetOf _ _ n) = n
+        annotation (CBuiltinTypesCompatible _ _ n) = n
+        annotation (CBuiltinConvertVector _ _ n) = n
+        annotation (CBuiltinBitCast _ _ n) = n
+        amap f (CBuiltinVaArg a_1 a_2 a_3) = CBuiltinVaArg a_1 a_2 (f a_3)
+        amap f (CBuiltinOffsetOf a_1 a_2 a_3)
+          = CBuiltinOffsetOf a_1 a_2 (f a_3)
+        amap f (CBuiltinTypesCompatible a_1 a_2 a_3)
+          = CBuiltinTypesCompatible a_1 a_2 (f a_3)
+        amap f (CBuiltinConvertVector a_1 a_2 a_3) =
+          CBuiltinConvertVector a_1 a_2 (f a_3)
+        amap f (CBuiltinBitCast a_1 a_2 a_3) =
+          CBuiltinBitCast a_1 a_2 (f a_3)
+
+instance CNode t1 => CNode (CConstant t1) where
+        nodeInfo (CIntConst _ n) = nodeInfo n
+        nodeInfo (CCharConst _ n) = nodeInfo n
+        nodeInfo (CFloatConst _ n) = nodeInfo n
+        nodeInfo (CStrConst _ n) = nodeInfo n
+instance CNode t1 => Pos (CConstant t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CConstant where
+        fmap _f (CIntConst a1 a2) = CIntConst a1 (_f a2)
+        fmap _f (CCharConst a1 a2) = CCharConst a1 (_f a2)
+        fmap _f (CFloatConst a1 a2) = CFloatConst a1 (_f a2)
+        fmap _f (CStrConst a1 a2) = CStrConst a1 (_f a2)
+
+instance Annotated CConstant where
+        annotation (CIntConst _ n) = n
+        annotation (CCharConst _ n) = n
+        annotation (CFloatConst _ n) = n
+        annotation (CStrConst _ n) = n
+        amap f (CIntConst a_1 a_2) = CIntConst a_1 (f a_2)
+        amap f (CCharConst a_1 a_2) = CCharConst a_1 (f a_2)
+        amap f (CFloatConst a_1 a_2) = CFloatConst a_1 (f a_2)
+        amap f (CStrConst a_1 a_2) = CStrConst a_1 (f a_2)
+
+instance CNode t1 => CNode (CStringLiteral t1) where
+        nodeInfo (CStrLit _ n) = nodeInfo n
+instance CNode t1 => Pos (CStringLiteral t1) where
+        posOf x = posOf (nodeInfo x)
+
+instance Functor CStringLiteral where
+        fmap _f (CStrLit a1 a2) = CStrLit a1 (_f a2)
+
+instance Annotated CStringLiteral where
+        annotation (CStrLit _ n) = n
+        amap f (CStrLit a_1 a_2) = CStrLit a_1 (f a_2)
+-- GENERATED STOP
diff --git a/src/Language/C/Syntax/Constants.hs b/src/Language/C/Syntax/Constants.hs
--- a/src/Language/C/Syntax/Constants.hs
+++ b/src/Language/C/Syntax/Constants.hs
@@ -23,14 +23,16 @@
   cFloat,  CFloat(..), readCFloat,
   -- * C string literals
   cString, cString_w, CString(..), getCString, showStringLit, concatCStrings,
+  -- * Clang C version literals
+  ClangCVersion(..), readClangCVersion,
 )
 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
+import Data.Data (Data)
+import GHC.Generics (Generic, Generic1)
+import Control.DeepSeq (NFData)
 
 -- | C char constants (abstract)
 data CChar = CChar
@@ -39,14 +41,16 @@
            | CChars
               [Char] -- multi-character character constant
               !Bool   -- wide flag
-           deriving (Eq,Ord,Data,Typeable)
+           deriving (Eq,Ord,Data,Generic)
 
 instance Show CChar where
     showsPrec _ (CChar c wideflag)   = _showWideFlag wideflag . showCharConst c
-    showsPrec _ (CChars cs wideflag) = _showWideFlag wideflag . (sQuote $ concatMap escapeCChar cs)
+    showsPrec _ (CChars cs wideflag) = _showWideFlag wideflag . sQuote (concatMap escapeCChar cs)
 
+instance NFData CChar
+
 -- | @showCharConst c@ prepends _a_ String representing the C char constant corresponding to @c@.
--- If neccessary uses octal or hexadecimal escape sequences.
+-- If necessary uses octal or hexadecimal escape sequences.
 showCharConst :: Char -> ShowS
 showCharConst c = sQuote $ escapeCChar c
 
@@ -54,7 +58,7 @@
 _showWideFlag flag = if flag then showString "L" else id
 
 -- | get the haskell representation of a char constant
-getCChar :: CChar -> [Char]
+getCChar :: CChar -> String
 getCChar (CChar  c _)   = [c]
 getCChar (CChars  cs _) = cs
 
@@ -79,19 +83,24 @@
 cChar_w c = CChar c True
 
 -- | create a multi-character character constant
-cChars :: [Char] -> Bool -> CChar
+cChars :: String -> Bool -> CChar
 cChars = CChars
 
 -- | datatype for memorizing the representation of an integer
-data CIntRepr = DecRepr | HexRepr | OctalRepr deriving (Eq,Ord,Enum,Bounded,Data,Typeable)
+data CIntRepr = DecRepr | HexRepr | OctalRepr
+  deriving (Eq,Ord,Enum,Bounded,Data,Generic)
 
+instance NFData CIntRepr
+
 -- | datatype representing type flags for integers
-data CIntFlag = FlagUnsigned | FlagLong | FlagLongLong | FlagImag deriving (Eq,Ord,Enum,Bounded,Data,Typeable)
+data CIntFlag = FlagUnsigned | FlagLong | FlagLongLong | FlagImag
+  deriving (Eq,Ord,Enum,Bounded,Data,Generic)
 instance Show CIntFlag where
     show FlagUnsigned = "u"
     show FlagLong = "L"
     show FlagLongLong = "LL"
     show FlagImag = "i"
+instance NFData CIntFlag
 
 {-# SPECIALIZE setFlag :: CIntFlag -> Flags CIntFlag -> Flags CIntFlag #-}
 {-# SPECIALIZE clearFlag :: CIntFlag -> Flags CIntFlag -> Flags CIntFlag #-}
@@ -101,13 +110,14 @@
                  !Integer
                  !CIntRepr
                  !(Flags CIntFlag)  -- integer flags
-                 deriving (Eq,Ord,Data,Typeable)
+                 deriving (Eq,Ord,Data,Generic)
 instance Show CInteger where
-    showsPrec _ (CInteger i repr flags) = showInt i . showString (concatMap showIFlag [FlagUnsigned .. ]) where
+    showsPrec _ (CInteger ig repr flags) = showInt ig . 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
+        showInt num = case repr of DecRepr -> shows num
+                                   OctalRepr -> showString "0" . showOct num
+                                   HexRepr -> showString "0x" . showHex num
+instance NFData CInteger
 
 -- To be used in the lexer
 -- Note that the flag lexer won't scale
@@ -142,9 +152,10 @@
 -- | Floats (represented as strings)
 data CFloat = CFloat
                !String
-               deriving (Eq,Ord,Data,Typeable)
+               deriving (Eq,Ord,Data,Generic)
 instance Show CFloat where
   showsPrec _ (CFloat internal) = showString internal
+instance NFData CFloat
 
 cFloat :: Float -> CFloat
 cFloat = CFloat . show
@@ -153,13 +164,25 @@
 readCFloat :: String -> CFloat
 readCFloat = CFloat
 
+-- | Clang dotted version literal
+-- <https://clang.llvm.org/docs/AttributeReference.html#availability>
+data ClangCVersion = ClangCVersion
+                     !String
+                     deriving (Eq,Ord,Data)
+instance Show ClangCVersion where
+  showsPrec _ (ClangCVersion internal) = showString internal
+
+readClangCVersion :: String -> ClangCVersion
+readClangCVersion = ClangCVersion
+
 -- | C String literals
 data CString = CString
-                [Char]    -- characters
+                String    -- characters
                 Bool      -- wide flag
-                deriving (Eq,Ord,Data,Typeable)
+                deriving (Eq,Ord,Data, Generic)
 instance Show CString where
     showsPrec _ (CString str wideflag) = _showWideFlag wideflag . showStringLit str
+instance NFData CString
 
 -- construction
 cString :: String -> CString
@@ -178,7 +201,7 @@
 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.
+-- If necessary it uses octal or hexadecimal escape sequences.
 showStringLit :: String -> ShowS
 showStringLit = dQuote . concatMap showStringChar
   where
@@ -215,17 +238,20 @@
 isSChar '\n' = False
 isSChar c = isAsciiSourceChar c
 
+showOct' :: Int -> String
+showOct' i = replicate (3 - length s) '0' ++ s
+  where s = showOct i ""
+
 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) ""
+escapeChar c  | (ord c) < 512   = '\\' : showOct' (ord c)
               | otherwise       = '\\' : 'x'  : showHex (ord c) ""
 
 unescapeChar :: String -> (Char, String)
@@ -245,11 +271,16 @@
        '"'  -> ('"', cs)
        'x'  -> case head' "bad escape sequence" (readHex cs) of
                  (i, cs') -> (toEnum i, cs')
-       _    -> case head' "bad escape sequence" (readOct (c:cs)) of
+       _    -> 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"
 
+readOct' :: ReadS Int
+readOct' s = map (\(i, cs) -> (i, cs ++ rest)) (readOct octStr)
+  where octStr = takeWhile isOctDigit $ take 3 s
+        rest = drop (length octStr) s
+
 unescapeString :: String -> String
 unescapeString [] = []
 unescapeString cs = case unescapeChar cs of
@@ -264,8 +295,9 @@
 head' err []  = error err
 head' _ (x:_) = x
 
--- TODO: Move to seperate file ?
-newtype Flags f = Flags Integer deriving (Eq,Ord,Data,Typeable)
+-- TODO: Move to separate file ?
+newtype Flags f = Flags Integer deriving (Eq,Ord,Data,Generic,Generic1)
+instance NFData (Flags f)
 noFlags :: Flags f
 noFlags = Flags 0
 setFlag :: (Enum f) => f -> Flags f -> Flags f
@@ -274,6 +306,3 @@
 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
--- a/src/Language/C/Syntax/Ops.hs
+++ b/src/Language/C/Syntax/Ops.hs
@@ -13,13 +13,21 @@
 module Language.C.Syntax.Ops (
 -- * Assignment operators
 CAssignOp(..),
--- * Unary operators
-CUnaryOp(..),
+assignBinop,
 -- * Binary operators
 CBinaryOp(..),
+isCmpOp,
+isPtrOp,
+isBitOp,
+isLogicOp,
+-- * Unary operators
+CUnaryOp(..),
+isEffectfulOp
 )
 where
-import Data.Generics
+import Data.Data (Data)
+import GHC.Generics (Generic)
+import Control.DeepSeq (NFData)
 -- | C assignment operators (K&R A7.17)
 data CAssignOp = CAssignOp
                | CMulAssOp
@@ -32,20 +40,23 @@
                | 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  = "|="
+               deriving (Eq,Ord,Show,Data,Generic)
 
+instance NFData CAssignOp
+
+assignBinop :: CAssignOp -> CBinaryOp
+assignBinop CAssignOp = error "direct assignment has no binary operator"
+assignBinop CMulAssOp = CMulOp
+assignBinop CDivAssOp = CDivOp
+assignBinop CRmdAssOp = CRmdOp
+assignBinop CAddAssOp = CAddOp
+assignBinop CSubAssOp = CSubOp
+assignBinop CShlAssOp = CShlOp
+assignBinop CShrAssOp = CShrOp
+assignBinop CAndAssOp = CAndOp
+assignBinop CXorAssOp = CXorOp
+assignBinop COrAssOp  = COrOp
+
 -- | C binary operators (K&R A7.6-15)
 --
 data CBinaryOp = CMulOp
@@ -66,27 +77,22 @@
                | 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 = "||"
+               deriving (Eq,Ord,Show,Data,Generic)
 
+instance NFData CBinaryOp
+
+isCmpOp :: CBinaryOp -> Bool
+isCmpOp op = op `elem` [ CLeqOp, CGeqOp, CLeOp, CGrOp, CEqOp, CNeqOp ]
+
+isPtrOp :: CBinaryOp -> Bool
+isPtrOp op = op `elem` [ CAddOp, CSubOp ]
+
+isBitOp :: CBinaryOp -> Bool
+isBitOp op = op `elem` [ CShlOp, CShrOp, CAndOp, COrOp, CXorOp ]
+
+isLogicOp :: CBinaryOp -> Bool
+isLogicOp op = op `elem` [ CLndOp, CLorOp ]
+
 -- | C unary operator (K&R A7.3-4)
 --
 data CUnaryOp = CPreIncOp               -- ^ prefix increment operator
@@ -99,15 +105,9 @@
               | 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     = "!"
+              deriving (Eq,Ord,Show,Data,Generic)
+
+instance NFData CUnaryOp
+
+isEffectfulOp :: CUnaryOp -> Bool
+isEffectfulOp op = op `elem` [ CPreIncOp, CPreDecOp, CPostIncOp, CPostDecOp ]
diff --git a/src/Language/C/Syntax/Utils.hs b/src/Language/C/Syntax/Utils.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/C/Syntax/Utils.hs
@@ -0,0 +1,76 @@
+module Language.C.Syntax.Utils (
+  -- * Generic operations
+  getSubStmts,
+  mapSubStmts,
+  mapBlockItemStmts,
+  -- * Concrete operations
+  getLabels
+) where
+
+import Data.List
+import Language.C.Data.Ident
+import Language.C.Syntax.AST
+
+-- XXX: This is should be generalized !!!
+--      Data.Generics sounds attractive, but we really need to control the evaluation order
+-- XXX: Expression statements (which are somewhat problematic anyway), aren't handled yet
+getSubStmts :: CStat -> [CStat]
+getSubStmts (CLabel _ s _ _)      = [s]
+getSubStmts (CCase _ s _)         = [s]
+getSubStmts (CCases _ _ s _)      = [s]
+getSubStmts (CDefault s _)        = [s]
+getSubStmts (CExpr _ _)           = []
+getSubStmts (CCompound _ body _)  = concatMap compoundSubStmts body
+getSubStmts (CIf _ sthen selse _) = maybe [sthen] (\s -> [sthen,s]) selse
+getSubStmts (CSwitch _ s _)       = [s]
+getSubStmts (CWhile _ s _ _)      = [s]
+getSubStmts (CFor _ _ _ s _)      = [s]
+getSubStmts (CGoto _ _)           = []
+getSubStmts (CGotoPtr _ _)        = []
+getSubStmts (CCont _)             = []
+getSubStmts (CBreak _)            = []
+getSubStmts (CReturn _ _)         = []
+getSubStmts (CAsm _ _)            = []
+
+mapSubStmts :: (CStat -> Bool) -> (CStat -> CStat) -> CStat -> CStat
+mapSubStmts stop _ s | stop s = s
+mapSubStmts stop f (CLabel i s attrs ni) =
+  f (CLabel i (mapSubStmts stop f s) attrs ni)
+mapSubStmts stop f (CCase e s ni) =
+  f (CCase e (mapSubStmts stop f s) ni)
+mapSubStmts stop f (CCases e1 e2 s ni) =
+  f (CCases e1 e2 (mapSubStmts stop f s) ni)
+mapSubStmts stop f (CDefault s ni) =
+  f (CDefault (mapSubStmts stop f s) ni)
+mapSubStmts stop f (CCompound ls body ni) =
+  f (CCompound ls (map (mapBlockItemStmts stop f) body) ni)
+mapSubStmts stop f (CIf e sthen selse ni) =
+  f (CIf e
+     (mapSubStmts stop f sthen)
+     (fmap (mapSubStmts stop f) selse)
+     ni)
+mapSubStmts stop f (CSwitch e s ni) =
+  f (CSwitch e (mapSubStmts stop f s) ni)
+mapSubStmts stop f (CWhile e s isdo ni) =
+  f (CWhile e (mapSubStmts stop f s) isdo ni)
+mapSubStmts stop f (CFor i t a s ni) =
+  f (CFor i t a (mapSubStmts stop f s) ni)
+mapSubStmts _ f s  = f s
+
+mapBlockItemStmts :: (CStat -> Bool)
+                  -> (CStat -> CStat)
+                  -> CBlockItem
+                  -> CBlockItem
+mapBlockItemStmts stop f (CBlockStmt s) = CBlockStmt (mapSubStmts stop f s)
+mapBlockItemStmts _ _ bi                = bi
+
+compoundSubStmts :: CBlockItem -> [CStat]
+compoundSubStmts (CBlockStmt s)    = [s]
+compoundSubStmts (CBlockDecl _)    = []
+compoundSubStmts (CNestedFunDef _) = []
+
+getLabels :: CStat -> [Ident]
+getLabels (CLabel l s _ _)      = l : getLabels s
+getLabels (CCompound ls body _) =
+  concatMap (concatMap getLabels . compoundSubStmts) body \\ ls
+getLabels stmt                  = concatMap getLabels (getSubStmts stmt)
diff --git a/src/Language/C/System/GCC.hs b/src/Language/C/System/GCC.hs
--- a/src/Language/C/System/GCC.hs
+++ b/src/Language/C/System/GCC.hs
@@ -17,7 +17,7 @@
 import Language.C.Data.RList as RList
 import Language.C.System.Preprocess
 import Data.Maybe
-import System.Cmd
+import System.Process
 import System.Directory
 import Data.List
 
@@ -64,6 +64,11 @@
         case unparsed_args of
             ("-E":rest) -> mungeArgs parsed rest
 
+            (flag:flagArg:rest) | flag == "-MF"
+                                || flag == "-MT"
+                                || flag == "-MQ"
+                                -> mungeArgs (cpp_args,(extra,other `snoc` flag `snoc` flagArg)) rest
+
             (flag:rest) |  flag == "-c"
                         || flag == "-S"
                         || "-M" `isPrefixOf` flag
@@ -75,7 +80,7 @@
             (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")
+            (cfile:rest)       | any (`isSuffixOf` cfile) (words ".c .hc .h")
                                -> if isJust inp
                                    then Left "two input files given"
                                    else mungeArgs ((Just cfile,out,cpp_opts),unparsed) rest
@@ -89,13 +94,13 @@
                            | "-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)
+    getDefine opt = let (key,val) = break (== '=') opt in Define key (drop 1 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
+buildCppArgs (CppArgs options extra_args _tmpdir input_file output_file_opt) =
        (concatMap tOption options)
     ++ outputFileOpt
     ++ ["-E", input_file]
diff --git a/src/Language/C/System/Preprocess.hs b/src/Language/C/System/Preprocess.hs
--- a/src/Language/C/System/Preprocess.hs
+++ b/src/Language/C/System/Preprocess.hs
@@ -12,7 +12,7 @@
 module Language.C.System.Preprocess (
     Preprocessor(..),
     CppOption(..),
-    CppArgs(..),rawCppArgs,addCppOption,addExtraOption,
+    CppArgs(..),rawCppArgs,addCppOption,addExtraOption,cppFile,
     runPreprocessor,
     isPreprocessed,
 )
@@ -21,7 +21,6 @@
 import System.Exit
 import System.Directory
 import System.FilePath
-import System.Environment
 import System.IO
 import Control.Exception
 import Control.Monad
@@ -58,6 +57,7 @@
 cppFile :: FilePath -> CppArgs
 cppFile input_file = CppArgs { cppOptions = [], extraOptions = [], cppTmpDir = Nothing, inputFile = input_file, outputFile = Nothing }
 
+
 -- | use the given preprocessor arguments without analyzing them
 rawCppArgs :: [String] -> FilePath -> CppArgs
 rawCppArgs opts input_file =
@@ -66,16 +66,16 @@
 -- | add a typed option to the given preprocessor arguments
 addCppOption :: CppArgs -> CppOption -> CppArgs
 addCppOption cpp_args opt =
-    cpp_args { cppOptions = opt : (cppOptions cpp_args) }
+    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) }
+    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
+runPreprocessor cpp cpp_args =
     bracket
         getActualOutFile
         -- remove outfile if it was temporary
diff --git a/test/harness/run-harness.hs b/test/harness/run-harness.hs
new file mode 100644
--- /dev/null
+++ b/test/harness/run-harness.hs
@@ -0,0 +1,70 @@
+module Main where
+
+import Data.List (intercalate)
+import System.Exit (ExitCode(..), exitFailure, exitSuccess, exitWith)
+import System.Directory (doesDirectoryExist, doesFileExist, getCurrentDirectory, setCurrentDirectory,
+                         getDirectoryContents)
+import System.FilePath ((</>))
+import System.Process (readProcessWithExitCode, callProcess)
+import System.IO (hPutStrLn, hPrint, stderr)
+import Control.Monad (filterM, liftM, when)
+
+testDirs :: [String]
+testDirs = ["test/harness","harness","."]
+
+getActualTestDirectory :: [String] -> IO FilePath
+getActualTestDirectory test_dirs = do
+  validDirs <- filterM (doesFileExist . (</> "run-harness.hs")) test_dirs
+  case validDirs of
+    []    -> ioError (userError ("run-harness.hs not found in " ++ intercalate " or " test_dirs))
+    (d:_) -> return d
+
+subdirectoriesOf :: FilePath -> IO [FilePath]
+subdirectoriesOf fp = do
+  entries <- getDirectoryContents fp
+  filterM (doesDirectoryExist . (fp </>)) (filter (not . isSpecialDir) entries)
+  where
+    isSpecialDir "." = True
+    isSpecialDir ".." = True
+    isSpecialDir _ = False
+
+-- from Control.Monad.Extra
+findM :: Monad m => (a -> m Bool) -> [a] -> m (Maybe a)
+findM _ [] = return Nothing
+findM p (x:xs) = do guard <- p x ; if guard then (return $ Just x) else (findM p xs)
+
+main :: IO ExitCode
+main = do
+  actual_test_dir <- getActualTestDirectory testDirs
+  has_makefile <- doesFileExist (actual_test_dir </> "Makefile")
+  when (not has_makefile) $ do
+    hPutStrLn stderr "No Makefile found (out of source tree)"
+    hPutStrLn stderr "Skipping harness test"
+    exitWith ExitSuccess
+  tests <- subdirectoriesOf actual_test_dir
+  cdir <- getCurrentDirectory
+  hPutStrLn stderr ("Changing to test directory " ++ actual_test_dir ++ " and compiling")
+  -- build test executables
+  setCurrentDirectory (cdir</>actual_test_dir)
+  callProcess "make" ["prepare"]
+  -- run harness tests
+  hasFailure <- findM (liftM (/= ExitSuccess) . runTest . (cdir</>) . (actual_test_dir</>)) tests
+  setCurrentDirectory cdir
+  case hasFailure of
+    Nothing -> exitSuccess
+    Just _failed -> exitFailure
+  where
+    runTest :: FilePath -> IO ExitCode
+    runTest dir = do
+      setCurrentDirectory dir
+      (exitCode, _outp, _errp) <- readProcessWithExitCode "make" [] ""
+      hPutStrLn stderr ("cd " ++ dir ++ " && make: " ++ show exitCode)
+      when (exitCode /= ExitSuccess) $ do
+        hPutStrLn stderr "=== Standard Output ==="
+        hPutStrLn stderr _outp
+        hPutStrLn stderr "=== Error Output ==="
+        hPutStrLn stderr _errp
+        hPutStrLn stderr "=== End of Output ==="
+      return exitCode
+
+
