diff --git a/README b/README
new file mode 100644
--- /dev/null
+++ b/README
@@ -0,0 +1,66 @@
+Ruler-core
+
+Ruler-core is an attribute grammar preprocessor, with a number of extensions to deal with (inference)-rule based systems.
+
+How to get it to run:
+
+1) checkout the repository or obtain the sources in another way
+2) run cabal-install of ruler-core. This will install the dependencies, but will fail to build ruler-core itself.
+3) run the cabal-files manually. The following is a trace:
+
+$ runghc Setup.hs configure --user
+Configuring ruler-core-0.9...
+
+
+$ runghc Setup.hs build
+Preprocessing executables for ruler-core-0.9...
+"processing: src/Ast.ag"
+"processing: src/Transform.ag"
+"processing: src/Errs.ag"
+Building ruler-core-0.9...
+[ 1 of 11] Compiling Env              ( src/Env.hs, dist/build/ruler-core/ruler-core-tmp/Env.o )
+[ 2 of 11] Compiling Pretty           ( src/Pretty.hs, dist/build/ruler-core/ruler-core-tmp/Pretty.o )
+[ 3 of 11] Compiling Common           ( src/Common.hs, dist/build/ruler-core/ruler-core-tmp/Common.o )
+[ 4 of 11] Compiling Ast              ( dist/build/ruler-core/ruler-core-tmp/Ast.hs, dist/build/ruler-core/ruler-core-tmp/Ast.o )
+[ 5 of 11] Compiling DepAnalysis      ( src/DepAnalysis.hs, dist/build/ruler-core/ruler-core-tmp/DepAnalysis.o )
+[ 6 of 11] Compiling Opts             ( src/Opts.hs, dist/build/ruler-core/ruler-core-tmp/Opts.o )
+[ 7 of 11] Compiling Errs             ( dist/build/ruler-core/ruler-core-tmp/Errs.hs, dist/build/ruler-core/ruler-core-tmp/Errs.o )
+[ 8 of 11] Compiling Transform        ( dist/build/ruler-core/ruler-core-tmp/Transform.hs, dist/build/ruler-core/ruler-core-tmp/Transform.o )
+[ 9 of 11] Compiling Parser           ( src/Parser.hs, dist/build/ruler-core/ruler-core-tmp/Parser.o )
+[10 of 11] Compiling Scanner          ( dist/build/ruler-core/ruler-core-tmp/Scanner.hs, dist/build/ruler-core/ruler-core-tmp/Scanner.o )
+[11 of 11] Compiling Main             ( src/Main.hs, dist/build/ruler-core/ruler-core-tmp/Main.o )
+Linking dist/build/ruler-core/ruler-core ...
+
+
+To see a list of command-line options:
+$ ./dist/build/ruler-core/ruler-core 
+No AG source file specified.
+Usage: imp-visits <OPTION ...> <ag-file> ...
+  -o path  --output=path  output .hs file
+  -v       --verbose      verbose output
+           --pretty       pp AST to STDOUT
+           --tokens       print tokens to STDOUT
+           --haskell      generate Haskell code (default)
+           --js           generate Javascript code
+  -f       --force        force code generation
+           --nodata       do not generate data types
+           --graph=path   output .dot file
+           --noline       do not generate LINE pragmas
+
+
+Try an example:
+$ ./dist/build/ruler-core/ruler-core examples/CycRepmin.rul -o test.hs
+$ ghci test.hs
+GHCi, version 6.12.1: http://www.haskell.org/ghc/  :? for help
+Loading package ghc-prim ... linking ... done.
+Loading package integer-gmp ... linking ... done.
+Loading package base ... linking ... done.
+Loading package ffi-1.0 ... linking ... done.
+[1 of 1] Compiling CycRepmin        ( test.hs, interpreted )
+Ok, modules loaded: CycRepmin.
+*CycRepmin> main
+Loading package syb-0.1.0.2 ... linking ... done.
+Loading package base-3.0.3.2 ... linking ... done.
+Loading package mtl-1.1.0.2 ... linking ... done.
+Tree_Bin {l_Tree_Bin = Tree_Leaf {x_Tree_Leaf = 1}, r_Tree_Bin = Tree_Bin {l_Tree_Bin = Tree_Leaf {x_Tree_Leaf = 1}, r_Tree_Bin = Tree_Leaf {x_Tree_Leaf = 1}}}
+*CycRepmin>
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,7 @@
+module Main where
+
+import Distribution.Simple
+import Distribution.Simple.UUAGC
+
+main = defaultMainWithHooks uuagcUserHook
+
diff --git a/dist/build/ruler-core/ruler-core-tmp/Ast.hs b/dist/build/ruler-core/ruler-core-tmp/Ast.hs
new file mode 100644
--- /dev/null
+++ b/dist/build/ruler-core/ruler-core-tmp/Ast.hs
@@ -0,0 +1,156 @@
+
+
+-- UUAGC 0.9.32 (src/Ast.ag)
+module Ast where
+
+{-# LINE 8 "src/Ast.ag" #-}
+
+import Common
+{-# LINE 10 "dist/src/sdist.34564/ruler-core-1.0/dist/build/ruler-core/ruler-core-tmp/Ast.hs" #-}
+-- AliasType ---------------------------------------------------
+data AliasType  = AliasType_List !(Ident) 
+                | AliasType_Maybe !(Ident) 
+                | AliasType_Prod !(([Ident])) 
+-- Attr --------------------------------------------------------
+data Attr  = Attr_Inh !(Ident) !(String) 
+           | Attr_Syn !(Ident) !(String) 
+-- AttrTypeCode ------------------------------------------------
+data AttrTypeCode  = AttrTypeCode_Child 
+                   | AttrTypeCode_Lhs 
+                   | AttrTypeCode_ProdLocal 
+                   | AttrTypeCode_VisLocal 
+                   | AttrTypeCode_Visit 
+-- AttrTypePat -------------------------------------------------
+data AttrTypePat  = AttrTypePat_Child 
+                  | AttrTypePat_Lhs 
+                  | AttrTypePat_ProdLocal 
+                  | AttrTypePat_VisLocal 
+                  | AttrTypePat_Visit 
+-- Attrs -------------------------------------------------------
+type Attrs  = [Attr ]
+-- Bind --------------------------------------------------------
+data Bind  = Bind_Fun 
+           | Bind_Monadic 
+-- Block -------------------------------------------------------
+data Block  = Block_Data !(Data ) 
+            | Block_DataSem !(DataSem ) 
+            | Block_Item !(Ident) !(Item ) 
+            | Block_Itf !(Itf ) 
+            | Block_Section !(Code ) 
+            | Block_Type !(Type ) 
+-- Blocks ------------------------------------------------------
+type Blocks  = [Block ]
+-- BlocksTop ---------------------------------------------------
+data BlocksTop  = BlocksTop_None 
+                | BlocksTop_Top !(Blocks ) 
+-- BoundCode ---------------------------------------------------
+data BoundCode  = BoundCode_Code !(Bind ) !(Pos) !(Code ) 
+-- Clause ------------------------------------------------------
+data Clause  = Clause_Clause !(Pos) !(Ident) !(Stmts ) !(SemVisit ) 
+-- Clauses -----------------------------------------------------
+type Clauses  = [Clause ]
+-- ClausesTop --------------------------------------------------
+data ClausesTop  = ClausesTop_Impl !(Clauses) 
+                 | ClausesTop_Top !(Clauses ) 
+-- Code --------------------------------------------------------
+data Code  = Code_Code !(Items ) 
+-- Con ---------------------------------------------------------
+data Con  = Con_Con !(Pos) !(Ident) !(Vars ) !(Fields ) 
+-- Cons --------------------------------------------------------
+type Cons  = [Con ]
+-- Data --------------------------------------------------------
+data Data  = Data_Data !(Pos) !(Ident) !(Vars ) !(Cons ) !(Exts ) 
+-- DataSem -----------------------------------------------------
+data DataSem  = DataSem_Sem !(Pos) !(Ident) !(Vars ) !((Maybe String)) !(Bool) !(Stmts) !(ClausesTop ) 
+-- ExprField ---------------------------------------------------
+data ExprField  = ExprField_Field !(Ident) !(Code ) 
+-- ExprFields --------------------------------------------------
+type ExprFields  = [ExprField ]
+-- Ext ---------------------------------------------------------
+data Ext  = Ext_Ext !(Ident) 
+-- Exts --------------------------------------------------------
+type Exts  = [Ext ]
+-- Field -------------------------------------------------------
+data Field  = Field_Field !(Ident) !(FieldType ) 
+-- FieldType ---------------------------------------------------
+data FieldType  = FieldType_Nonterm !(Ident) 
+                | FieldType_Term !(String) 
+-- Fields ------------------------------------------------------
+type Fields  = [Field ]
+-- ImplStmt ----------------------------------------------------
+data ImplStmt  = ImplStmt_DefaultChild !(Pos) !(Bool) !(Ident) !(Ident) !((Maybe Int)) 
+               | ImplStmt_DefaultSyn !(Pos) !(Bool) !(Ident) !((Maybe Int)) 
+               | ImplStmt_DefaultVisLocal !(Pos) !(Ident) 
+               | ImplStmt_Invoke !(Pos) !(Ident) !(Ident) !(Ident) 
+-- ImplStmts ---------------------------------------------------
+type ImplStmts  = [ImplStmt ]
+-- Item --------------------------------------------------------
+data Item  = Item_Attr !(Pos) !(Ident) !(Ident) 
+           | Item_Brackets !(Pos) !(Items ) !(Pos) 
+           | Item_CoSem !(Pos) !(Ident) !(Ident) !(Ident) !(Vars ) !((Maybe String)) !(SemVisit ) 
+           | Item_Construct !(Pos) !(Ident) !(Ident) !(ExprFields ) 
+           | Item_DataSem !(DataSem ) 
+           | Item_Detach !(Pos) !(Ident) !(Ident) 
+           | Item_Plain !(Pos) !(String) 
+           | Item_Sem !(Pos) !(Ident) !(Ident) !(Vars ) !((Maybe String)) !(SemVisit ) 
+-- Items -------------------------------------------------------
+type Items  = [Item ]
+-- Itf ---------------------------------------------------------
+data Itf  = Itf_Itf !(Pos) !(Ident) !(Vars ) !(ItfVisits ) 
+-- ItfVisit ----------------------------------------------------
+data ItfVisit  = ItfVisit_Visit !(Pos) !(Ident) !(Bool) !(Vars ) !(Attrs ) 
+-- ItfVisits ---------------------------------------------------
+type ItfVisits  = [ItfVisit ]
+-- MaybeBoundCode ----------------------------------------------
+type MaybeBoundCode  = Maybe BoundCode 
+-- Mode --------------------------------------------------------
+data Mode  = Mode_Assert 
+           | Mode_Match 
+-- Pat ---------------------------------------------------------
+data Pat  = Pat_Attr !(Ident) !(Ident) 
+          | Pat_AttrCon !(Ident) !(Ident) !(Ident) 
+          | Pat_Con !(Ident) !(Pats ) 
+          | Pat_Cons !(Pat ) !(Pat ) 
+          | Pat_List !(Pats ) 
+          | Pat_Tup !(Pats ) 
+          | Pat_Underscore !(Pos) 
+-- Pats --------------------------------------------------------
+type Pats  = [Pat ]
+-- Program -----------------------------------------------------
+data Program  = Program_Program !(BlocksTop ) 
+-- Rename ------------------------------------------------------
+data Rename  = Rename_Rename !(Ident) !(Ident) 
+-- Renames -----------------------------------------------------
+type Renames  = [Rename ]
+-- SemCon ------------------------------------------------------
+data SemCon  = SemCon_Con !(Pos) !(Ident) !(SemFields ) 
+-- SemCons -----------------------------------------------------
+type SemCons  = [SemCon ]
+-- SemField ----------------------------------------------------
+data SemField  = SemField_Field !(Pos) !(Ident) !((Either Ident String)) 
+-- SemFields ---------------------------------------------------
+type SemFields  = [SemField ]
+-- SemVisit ----------------------------------------------------
+data SemVisit  = SemVisit_End 
+               | SemVisit_Impl 
+               | SemVisit_Internal !(Pos) !(Ident) !(Bool) !(Stmts ) !(ClausesTop ) 
+               | SemVisit_Prependable !(Pos) !(Ident) !(SemVisit) 
+               | SemVisit_Visit !(Pos) !(Ident) !(Bool) !(VisitAttrs ) !(Stmts ) !(ClausesTop ) 
+-- Stmt --------------------------------------------------------
+data Stmt  = Stmt_Attach !(Pos) !((Maybe Ident)) !(Ident) !(Ident) !(MaybeBoundCode ) 
+           | Stmt_Default !(Bool) !(Pos) !(Ident) !(MaybeBoundCode ) 
+           | Stmt_Eval !(Mode ) !(Pat ) !(BoundCode ) 
+           | Stmt_Invoke !(Pos) !(Ident) !(Ident) !(MaybeBoundCode ) 
+           | Stmt_Rename !(Pos) !(Ident) !(Renames ) 
+-- Stmts -------------------------------------------------------
+type Stmts  = [Stmt ]
+-- Type --------------------------------------------------------
+data Type  = Type_Alias !(Pos) !(Ident) !(AliasType ) !(Vars ) 
+-- Var ---------------------------------------------------------
+data Var  = Var_Var !(Ident) 
+-- Vars --------------------------------------------------------
+type Vars  = [Var ]
+-- VisitAttr ---------------------------------------------------
+data VisitAttr  = VisitAttr_Chn !(Ident) !(String) 
+-- VisitAttrs --------------------------------------------------
+type VisitAttrs  = [VisitAttr ]
diff --git a/dist/build/ruler-core/ruler-core-tmp/Errs.hs b/dist/build/ruler-core/ruler-core-tmp/Errs.hs
new file mode 100644
--- /dev/null
+++ b/dist/build/ruler-core/ruler-core-tmp/Errs.hs
@@ -0,0 +1,484 @@
+
+
+-- UUAGC 0.9.32 (src/Errs.ag)
+module Errs(errsToStr, prettyErrs, Errs, Err(..), debugMsg, nullErrs) where
+
+{-# LINE 6 "src/Errs.ag" #-}
+
+import Common
+import Pretty
+import UU.Scanner.Position
+import Data.Sequence(Seq)
+import qualified Data.Sequence as Seq
+import Data.Map(Map)
+import qualified Data.Map as Map
+import Data.Foldable
+import Opts
+{-# LINE 18 "dist/src/sdist.34564/ruler-core-1.0/dist/build/ruler-core/ruler-core-tmp/Errs.hs" #-}
+
+{-# LINE 20 "src/Errs.ag" #-}
+
+type Errs = Seq Err
+
+prettyErr :: Opts -> Err -> PP_Doc
+prettyErr opts e
+  = pp_Syn_Err syn
+  where
+    inh = Inh_Err { opts_Inh_Err = opts }
+    syn = wrap_Err sem inh
+    sem = sem_Err e
+
+prettyErrs :: Opts -> Errs -> PP_Doc
+prettyErrs opts = vlist . map (prettyErr opts) . toList
+
+errsToStr :: Opts -> Errs -> String
+errsToStr opts es = disp (prettyErrs opts es) 999999 ""
+
+debugMsg :: String -> Errs
+debugMsg = Seq.singleton . Err_General noPos
+
+nullErrs :: Errs -> Bool
+nullErrs = Seq.null
+{-# LINE 43 "dist/src/sdist.34564/ruler-core-1.0/dist/build/ruler-core/ruler-core-tmp/Errs.hs" #-}
+
+{-# LINE 203 "src/Errs.ag" #-}
+
+locLine :: PP a => Pos -> a -> PP_Doc
+locLine (Pos l c f) d
+  = pp f >|< ":" >|< pp l >|< "," >|< pp c >|< ":error:" >#< pp d
+{-# LINE 50 "dist/src/sdist.34564/ruler-core-1.0/dist/build/ruler-core/ruler-core-tmp/Errs.hs" #-}
+-- Err ---------------------------------------------------------
+data Err  = Err_AmbAttach !(Ident) !(Ident) 
+          | Err_AmbDefault !(Pos) !(Ident) 
+          | Err_ChildSynUnav !(Pos) !(Ident) !(Ident) !(Ident) !(Ident) 
+          | Err_ClausesCyclic !(Pos) !(Ident) !(Int) 
+          | Err_Cyclic !(Pos) !((Map DepItem Pos)) !(([DepItem])) 
+          | Err_Dup !(([Ident])) 
+          | Err_DupAttr !(Bool) !(Ident) !(Ident) 
+          | Err_EffCyclic !(Pos) 
+          | Err_ExpVisit !(Pos) !(Ident) !(Ident) 
+          | Err_General !(Pos) !(String) 
+          | Err_InternalInCyclic !(Pos) !(Ident) 
+          | Err_IterCyclic !(Pos) 
+          | Err_MatchCyclic !(Pos) 
+          | Err_Missing !(([Ident])) 
+          | Err_MissingAttr !(Bool) !(Ident) !(Ident) 
+          | Err_MissingClause !(Ident) !(Ident) 
+          | Err_MissingVisit !(Pos) !(Ident) !(Ident) 
+          | Err_NameClash !(Ident) 
+          | Err_TypeConflict !(Ident) !(Ident) 
+          | Err_UndeclAttr !(Ident) !(Ident) 
+          | Err_UndeclVisit !(Pos) !(Ident) !(Ident) 
+          | Err_UndefVisit !(Ident) !(Ident) !(([Ident])) 
+          | Err_UndetachVisit !(Ident) !(Ident) !(Ident) 
+          | Err_VisExpCyclic !(Ident) !(Ident) 
+          | Err_VisitsNotImpl !(([Ident])) !(([Ident])) 
+-- cata
+sem_Err :: Err  ->
+           T_Err 
+sem_Err (Err_AmbAttach _name _visit )  =
+    (sem_Err_AmbAttach _name _visit )
+sem_Err (Err_AmbDefault _pos _name )  =
+    (sem_Err_AmbDefault _pos _name )
+sem_Err (Err_ChildSynUnav _pos _child _itf _vis _name )  =
+    (sem_Err_ChildSynUnav _pos _child _itf _vis _name )
+sem_Err (Err_ClausesCyclic _pos _name _n )  =
+    (sem_Err_ClausesCyclic _pos _name _n )
+sem_Err (Err_Cyclic _pos _posMap _comps )  =
+    (sem_Err_Cyclic _pos _posMap _comps )
+sem_Err (Err_Dup _ks )  =
+    (sem_Err_Dup _ks )
+sem_Err (Err_DupAttr _inherited _child _name )  =
+    (sem_Err_DupAttr _inherited _child _name )
+sem_Err (Err_EffCyclic _pos )  =
+    (sem_Err_EffCyclic _pos )
+sem_Err (Err_ExpVisit _pos _found _expect )  =
+    (sem_Err_ExpVisit _pos _found _expect )
+sem_Err (Err_General _pos _str )  =
+    (sem_Err_General _pos _str )
+sem_Err (Err_InternalInCyclic _pos _name )  =
+    (sem_Err_InternalInCyclic _pos _name )
+sem_Err (Err_IterCyclic _pos )  =
+    (sem_Err_IterCyclic _pos )
+sem_Err (Err_MatchCyclic _pos )  =
+    (sem_Err_MatchCyclic _pos )
+sem_Err (Err_Missing _ks )  =
+    (sem_Err_Missing _ks )
+sem_Err (Err_MissingAttr _inherited _child _name )  =
+    (sem_Err_MissingAttr _inherited _child _name )
+sem_Err (Err_MissingClause _itf _name )  =
+    (sem_Err_MissingClause _itf _name )
+sem_Err (Err_MissingVisit _pos _child _visit )  =
+    (sem_Err_MissingVisit _pos _child _visit )
+sem_Err (Err_NameClash _name )  =
+    (sem_Err_NameClash _name )
+sem_Err (Err_TypeConflict _found _expect )  =
+    (sem_Err_TypeConflict _found _expect )
+sem_Err (Err_UndeclAttr _child _name )  =
+    (sem_Err_UndeclAttr _child _name )
+sem_Err (Err_UndeclVisit _pos _name _itf )  =
+    (sem_Err_UndeclVisit _pos _name _itf )
+sem_Err (Err_UndefVisit _child _visit _visits )  =
+    (sem_Err_UndefVisit _child _visit _visits )
+sem_Err (Err_UndetachVisit _child _visit _expect )  =
+    (sem_Err_UndetachVisit _child _visit _expect )
+sem_Err (Err_VisExpCyclic _name _child )  =
+    (sem_Err_VisExpCyclic _name _child )
+sem_Err (Err_VisitsNotImpl _nonterm _vs )  =
+    (sem_Err_VisitsNotImpl _nonterm _vs )
+-- semantic domain
+type T_Err  = Opts ->
+              ( PP_Doc)
+data Inh_Err  = Inh_Err {opts_Inh_Err :: !(Opts)}
+data Syn_Err  = Syn_Err {pp_Syn_Err :: !(PP_Doc)}
+wrap_Err :: T_Err  ->
+            Inh_Err  ->
+            Syn_Err 
+wrap_Err sem (Inh_Err _lhsIopts )  =
+    (let ( _lhsOpp) = sem _lhsIopts 
+     in  (Syn_Err _lhsOpp ))
+sem_Err_AmbAttach :: Ident ->
+                     Ident ->
+                     T_Err 
+sem_Err_AmbAttach name_ visit_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 182 "src/Errs.ag" #-}
+                 identPos name_
+                 {-# LINE 148 "src/Errs.hs" #-})) of
+          { _pos ->
+          (case (({-# LINE 144 "src/Errs.ag" #-}
+                  locLine _pos     ("ambiguous attach of child" >#< show name_ >#< "and visit" >#< show visit_)
+                  {-# LINE 152 "src/Errs.hs" #-})) of
+           { _lhsOpp ->
+           ( _lhsOpp) }) }))
+sem_Err_AmbDefault :: Pos ->
+                      Ident ->
+                      T_Err 
+sem_Err_AmbDefault pos_ name_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 145 "src/Errs.ag" #-}
+                 locLine pos_     ("ambiguous default statement for" >#< show name_)
+                 {-# LINE 162 "src/Errs.hs" #-})) of
+          { _lhsOpp ->
+          ( _lhsOpp) }))
+sem_Err_ChildSynUnav :: Pos ->
+                        Ident ->
+                        Ident ->
+                        Ident ->
+                        Ident ->
+                        T_Err 
+sem_Err_ChildSynUnav pos_ child_ itf_ vis_ name_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 147 "src/Errs.ag" #-}
+                 locLine pos_     ("default for" >#< show name_ >#< "requires unavailable attribute" >#< show name_ >#< "of" >#< show child_ >|< "'s visit" >#< show vis_)
+                 {-# LINE 175 "src/Errs.hs" #-})) of
+          { _lhsOpp ->
+          ( _lhsOpp) }))
+sem_Err_ClausesCyclic :: Pos ->
+                         Ident ->
+                         Int ->
+                         T_Err 
+sem_Err_ClausesCyclic pos_ name_ n_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 150 "src/Errs.ag" #-}
+                 locLine pos_     ("cyclic visit" >#< show name_ >#< "must have one clause, but has" >#< show n_)
+                 {-# LINE 186 "src/Errs.hs" #-})) of
+          { _lhsOpp ->
+          ( _lhsOpp) }))
+sem_Err_Cyclic :: Pos ->
+                  (Map DepItem Pos) ->
+                  ([DepItem]) ->
+                  T_Err 
+sem_Err_Cyclic pos_ posMap_ comps_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 188 "src/Errs.ag" #-}
+                 \d -> let pos = Map.findWithDefault noPos d posMap_
+                       in case d of
+                            DepMatch _               -> "@" >|< show (line pos)
+                            DepAssert _              -> "@" >|< show (line pos)
+                            DepDefault o             -> "d" >|< show o
+                            DepAttach n              -> "@" >|< show (line pos)
+                            DepInvoke (visit:name:_) -> show name >|< "." >|< show visit >|< "@" >|< show (line $ identPos name)
+                            DepInvoke _              -> text "i???"
+                            DepVisStart (visit:_)    -> ">" >|< show visit >|< "@" >|< show (line $ identPos visit)
+                            DepVisStart _            -> text ">v???"
+                            DepVisEnd  (visit:_)     -> show visit >|< "@" >|< show (line $ identPos visit) >|< "<"
+                            DepVisEnd _              -> text "<v???"
+                            DepClause (clause:_)     -> "|" >|< show clause >|< "@" >|< show (line $ identPos clause)
+                            DepClause _              -> text "|???"
+                 {-# LINE 210 "src/Errs.hs" #-})) of
+          { _ppDep ->
+          (case (({-# LINE 148 "src/Errs.ag" #-}
+                  locLine pos_     ("cycle:" >#< hlist_sp (map _ppDep     comps_) )
+                  {-# LINE 214 "src/Errs.hs" #-})) of
+           { _lhsOpp ->
+           ( _lhsOpp) }) }))
+sem_Err_Dup :: ([Ident]) ->
+               T_Err 
+sem_Err_Dup ks_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 158 "src/Errs.ag" #-}
+                 if null ks_ then ident "<unspecified>" else head ks_
+                 {-# LINE 223 "src/Errs.hs" #-})) of
+          { _main ->
+          (case (({-# LINE 160 "src/Errs.ag" #-}
+                  identPos _main
+                  {-# LINE 227 "src/Errs.hs" #-})) of
+           { _pos ->
+           (case (({-# LINE 132 "src/Errs.ag" #-}
+                   locLine _pos     ("duplicate identifier" >#< show _main    )
+                   {-# LINE 231 "src/Errs.hs" #-})) of
+            { _lhsOpp ->
+            ( _lhsOpp) }) }) }))
+sem_Err_DupAttr :: Bool ->
+                   Ident ->
+                   Ident ->
+                   T_Err 
+sem_Err_DupAttr inherited_ child_ name_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 178 "src/Errs.ag" #-}
+                 if inherited_ then text "inh" else text "syn"
+                 {-# LINE 242 "src/Errs.hs" #-})) of
+          { _type ->
+          (case (({-# LINE 177 "src/Errs.ag" #-}
+                  identPos name_
+                  {-# LINE 246 "src/Errs.hs" #-})) of
+           { _pos ->
+           (case (({-# LINE 142 "src/Errs.ag" #-}
+                   locLine _pos     ("duplicate" >#< _type     >#< "attr" >#< show child_ >|< "." >|< show name_)
+                   {-# LINE 250 "src/Errs.hs" #-})) of
+            { _lhsOpp ->
+            ( _lhsOpp) }) }) }))
+sem_Err_EffCyclic :: Pos ->
+                     T_Err 
+sem_Err_EffCyclic pos_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 151 "src/Errs.ag" #-}
+                 locLine pos_     ("effectful code not allowed for cyclic stmt")
+                 {-# LINE 259 "src/Errs.hs" #-})) of
+          { _lhsOpp ->
+          ( _lhsOpp) }))
+sem_Err_ExpVisit :: Pos ->
+                    Ident ->
+                    Ident ->
+                    T_Err 
+sem_Err_ExpVisit pos_ found_ expect_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 133 "src/Errs.ag" #-}
+                 locLine pos_     ("expecting visit" >#< show expect_ >#< "found" >#< show found_)
+                 {-# LINE 270 "src/Errs.hs" #-})) of
+          { _lhsOpp ->
+          ( _lhsOpp) }))
+sem_Err_General :: Pos ->
+                   String ->
+                   T_Err 
+sem_Err_General pos_ str_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 130 "src/Errs.ag" #-}
+                 locLine pos_ str_
+                 {-# LINE 280 "src/Errs.hs" #-})) of
+          { _lhsOpp ->
+          ( _lhsOpp) }))
+sem_Err_InternalInCyclic :: Pos ->
+                            Ident ->
+                            T_Err 
+sem_Err_InternalInCyclic pos_ name_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 154 "src/Errs.ag" #-}
+                 locLine pos_  ("internal visit" >#< show name_ >#< "may not occur in a fully cyclic visit")
+                 {-# LINE 290 "src/Errs.hs" #-})) of
+          { _lhsOpp ->
+          ( _lhsOpp) }))
+sem_Err_IterCyclic :: Pos ->
+                      T_Err 
+sem_Err_IterCyclic pos_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 153 "src/Errs.ag" #-}
+                 locLine pos_     ("visit may not be iterated by cyclic stmt")
+                 {-# LINE 299 "src/Errs.hs" #-})) of
+          { _lhsOpp ->
+          ( _lhsOpp) }))
+sem_Err_MatchCyclic :: Pos ->
+                       T_Err 
+sem_Err_MatchCyclic pos_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 149 "src/Errs.ag" #-}
+                 locLine pos_     ("match statement not allowed in cyclic visit")
+                 {-# LINE 308 "src/Errs.hs" #-})) of
+          { _lhsOpp ->
+          ( _lhsOpp) }))
+sem_Err_Missing :: ([Ident]) ->
+                   T_Err 
+sem_Err_Missing ks_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 158 "src/Errs.ag" #-}
+                 if null ks_ then ident "<unspecified>" else head ks_
+                 {-# LINE 317 "src/Errs.hs" #-})) of
+          { _main ->
+          (case (({-# LINE 160 "src/Errs.ag" #-}
+                  identPos _main
+                  {-# LINE 321 "src/Errs.hs" #-})) of
+           { _pos ->
+           (case (({-# LINE 131 "src/Errs.ag" #-}
+                   locLine _pos     ("undefined identifier" >#< show _main    )
+                   {-# LINE 325 "src/Errs.hs" #-})) of
+            { _lhsOpp ->
+            ( _lhsOpp) }) }) }))
+sem_Err_MissingAttr :: Bool ->
+                       Ident ->
+                       Ident ->
+                       T_Err 
+sem_Err_MissingAttr inherited_ child_ name_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 175 "src/Errs.ag" #-}
+                 if inherited_ then text "inh" else text "syn"
+                 {-# LINE 336 "src/Errs.hs" #-})) of
+          { _type ->
+          (case (({-# LINE 174 "src/Errs.ag" #-}
+                  identPos name_
+                  {-# LINE 340 "src/Errs.hs" #-})) of
+           { _pos ->
+           (case (({-# LINE 141 "src/Errs.ag" #-}
+                   locLine _pos     ("undefined" >#< _type     >#< "attr" >#< show child_ >|< "." >|< show name_)
+                   {-# LINE 344 "src/Errs.hs" #-})) of
+            { _lhsOpp ->
+            ( _lhsOpp) }) }) }))
+sem_Err_MissingClause :: Ident ->
+                         Ident ->
+                         T_Err 
+sem_Err_MissingClause itf_ name_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 180 "src/Errs.ag" #-}
+                 identPos name_
+                 {-# LINE 354 "src/Errs.hs" #-})) of
+          { _pos ->
+          (case (({-# LINE 143 "src/Errs.ag" #-}
+                  locLine _pos     ("missing clause " >#< show name_ >#< "of" >#< show itf_)
+                  {-# LINE 358 "src/Errs.hs" #-})) of
+           { _lhsOpp ->
+           ( _lhsOpp) }) }))
+sem_Err_MissingVisit :: Pos ->
+                        Ident ->
+                        Ident ->
+                        T_Err 
+sem_Err_MissingVisit pos_ child_ visit_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 134 "src/Errs.ag" #-}
+                 locLine pos_     ("missing invoke of visit" >#< show visit_ >#< "of child" >#< show child_)
+                 {-# LINE 369 "src/Errs.hs" #-})) of
+          { _lhsOpp ->
+          ( _lhsOpp) }))
+sem_Err_NameClash :: Ident ->
+                     T_Err 
+sem_Err_NameClash name_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 172 "src/Errs.ag" #-}
+                 identPos name_
+                 {-# LINE 378 "src/Errs.hs" #-})) of
+          { _pos ->
+          (case (({-# LINE 140 "src/Errs.ag" #-}
+                  locLine _pos     ("name clash" >#< show name_)
+                  {-# LINE 382 "src/Errs.hs" #-})) of
+           { _lhsOpp ->
+           ( _lhsOpp) }) }))
+sem_Err_TypeConflict :: Ident ->
+                        Ident ->
+                        T_Err 
+sem_Err_TypeConflict found_ expect_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 184 "src/Errs.ag" #-}
+                 identPos found_
+                 {-# LINE 392 "src/Errs.hs" #-})) of
+          { _pos ->
+          (case (({-# LINE 146 "src/Errs.ag" #-}
+                  locLine _pos     ("type" >#< show found_ >#< "does not match expected type" >#< show expect_)
+                  {-# LINE 396 "src/Errs.hs" #-})) of
+           { _lhsOpp ->
+           ( _lhsOpp) }) }))
+sem_Err_UndeclAttr :: Ident ->
+                      Ident ->
+                      T_Err 
+sem_Err_UndeclAttr child_ name_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 170 "src/Errs.ag" #-}
+                 identPos name_
+                 {-# LINE 406 "src/Errs.hs" #-})) of
+          { _pos ->
+          (case (({-# LINE 139 "src/Errs.ag" #-}
+                  locLine _pos     ("undeclared attr" >#< show child_ >|< "." >|< show name_)
+                  {-# LINE 410 "src/Errs.hs" #-})) of
+           { _lhsOpp ->
+           ( _lhsOpp) }) }))
+sem_Err_UndeclVisit :: Pos ->
+                       Ident ->
+                       Ident ->
+                       T_Err 
+sem_Err_UndeclVisit pos_ name_ itf_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 137 "src/Errs.ag" #-}
+                 locLine pos_     ("undeclared visit" >#< show name_ >#< "of interface" >#< show itf_)
+                 {-# LINE 421 "src/Errs.hs" #-})) of
+          { _lhsOpp ->
+          ( _lhsOpp) }))
+sem_Err_UndefVisit :: Ident ->
+                      Ident ->
+                      ([Ident]) ->
+                      T_Err 
+sem_Err_UndefVisit child_ visit_ visits_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 166 "src/Errs.ag" #-}
+                 identPos visit_
+                 {-# LINE 432 "src/Errs.hs" #-})) of
+          { _pos ->
+          (case (({-# LINE 136 "src/Errs.ag" #-}
+                  locLine _pos     ("undefined visit" >#< show visit_ >#< "of child" >#< show child_)
+                  {-# LINE 436 "src/Errs.hs" #-})) of
+           { _lhsOpp ->
+           ( _lhsOpp) }) }))
+sem_Err_UndetachVisit :: Ident ->
+                         Ident ->
+                         Ident ->
+                         T_Err 
+sem_Err_UndetachVisit child_ visit_ expect_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 168 "src/Errs.ag" #-}
+                 identPos visit_
+                 {-# LINE 447 "src/Errs.hs" #-})) of
+          { _pos ->
+          (case (({-# LINE 138 "src/Errs.ag" #-}
+                  locLine _pos     ("undetachable visit" >#< show visit_ >#< "of child" >#< show child_ >|< ": expecting visit" >#< show expect_)
+                  {-# LINE 451 "src/Errs.hs" #-})) of
+           { _lhsOpp ->
+           ( _lhsOpp) }) }))
+sem_Err_VisExpCyclic :: Ident ->
+                        Ident ->
+                        T_Err 
+sem_Err_VisExpCyclic name_ child_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 186 "src/Errs.ag" #-}
+                 identPos name_
+                 {-# LINE 461 "src/Errs.hs" #-})) of
+          { _pos ->
+          (case (({-# LINE 152 "src/Errs.ag" #-}
+                  locLine _pos     ("visit" >#< show name_ >#< "of" >#< show child_ >#< "is on a cycle")
+                  {-# LINE 465 "src/Errs.hs" #-})) of
+           { _lhsOpp ->
+           ( _lhsOpp) }) }))
+sem_Err_VisitsNotImpl :: ([Ident]) ->
+                         ([Ident]) ->
+                         T_Err 
+sem_Err_VisitsNotImpl nonterm_ vs_  =
+    (\ _lhsIopts ->
+         (case (({-# LINE 164 "src/Errs.ag" #-}
+                 identPos (head nonterm_)
+                 {-# LINE 475 "src/Errs.hs" #-})) of
+          { _pos ->
+          (case (({-# LINE 162 "src/Errs.ag" #-}
+                  if null vs_ then ident "<unspecified>" else head vs_
+                  {-# LINE 479 "src/Errs.hs" #-})) of
+           { _main ->
+           (case (({-# LINE 135 "src/Errs.ag" #-}
+                   locLine _pos     ("missing visit" >#< show _main     >#< "for" >#< show (head nonterm_))
+                   {-# LINE 483 "src/Errs.hs" #-})) of
+            { _lhsOpp ->
+            ( _lhsOpp) }) }) }))
diff --git a/dist/build/ruler-core/ruler-core-tmp/Scanner.hs b/dist/build/ruler-core/ruler-core-tmp/Scanner.hs
new file mode 100644
--- /dev/null
+++ b/dist/build/ruler-core/ruler-core-tmp/Scanner.hs
@@ -0,0 +1,353 @@
+{-# OPTIONS -fglasgow-exts -cpp #-}
+{-# LINE 1 "src/Scanner.x" #-}
+
+module Scanner(tokenize, ppTokens) where
+
+import UU.Scanner
+import UU.Scanner.GenToken
+import Data.Char
+import UU.Pretty
+import Opts
+
+#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# "\xf7\xff\xff\xff\x69\x00\x00\x00\xc3\x00\x00\x00\xe0\x00\x00\x00\xf8\xff\xff\xff\xf9\xff\xff\xff\xfd\xff\xff\xff\xfe\xff\xff\xff\xff\xff\xff\xff\x02\x00\x00\x00\xe3\xff\xff\xff\x00\x00\x00\x00\xe4\xff\xff\xff\xe5\xff\xff\xff\xe6\xff\xff\xff\xe7\xff\xff\xff\x0b\x00\x00\x00\x00\x00\x00\x00\xe9\xff\xff\xff\xed\xff\xff\xff\xee\xff\xff\xff\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x01\x00\x00\x89\x01\x00\x00\xdd\x01\x00\x00\x31\x02\x00\x00\x85\x02\x00\x00\xd9\x02\x00\x00\x2d\x03\x00\x00\x81\x03\x00\x00\xd5\x03\x00\x00\x29\x04\x00\x00\x7d\x04\x00\x00\xd1\x04\x00\x00\x25\x05\x00\x00\x79\x05\x00\x00\xcd\x05\x00\x00\x21\x06\x00\x00\x75\x06\x00\x00\xc9\x06\x00\x00\x1d\x07\x00\x00\x71\x07\x00\x00\xc5\x07\x00\x00\x19\x08\x00\x00\x6d\x08\x00\x00\xc1\x08\x00\x00\x15\x09\x00\x00\x69\x09\x00\x00\xbd\x09\x00\x00\x11\x0a\x00\x00\x65\x0a\x00\x00\xb9\x0a\x00\x00\x0d\x0b\x00\x00\x61\x0b\x00\x00\xb5\x0b\x00\x00\x09\x0c\x00\x00\x5d\x0c\x00\x00\xb1\x0c\x00\x00\x05\x0d\x00\x00\x59\x0d\x00\x00\xad\x0d\x00\x00\x01\x0e\x00\x00\x55\x0e\x00\x00\xa9\x0e\x00\x00\xfd\x0e\x00\x00\x51\x0f\x00\x00\xa5\x0f\x00\x00\xf9\x0f\x00\x00\x4d\x10\x00\x00\xa1\x10\x00\x00\xf5\x10\x00\x00\x49\x11\x00\x00\x9d\x11\x00\x00\xf1\x11\x00\x00\x45\x12\x00\x00\x99\x12\x00\x00\xed\x12\x00\x00\x41\x13\x00\x00\x95\x13\x00\x00\xe9\x13\x00\x00\x3d\x14\x00\x00\x91\x14\x00\x00\xe5\x14\x00\x00\x39\x15\x00\x00\x8d\x15\x00\x00\xe1\x15\x00\x00\x35\x16\x00\x00\x89\x16\x00\x00\xdd\x16\x00\x00\x31\x17\x00\x00\x85\x17\x00\x00\xd9\x17\x00\x00\x2d\x18\x00\x00\x81\x18\x00\x00\xd5\x18\x00\x00\x29\x19\x00\x00\x7d\x19\x00\x00\xd1\x19\x00\x00\x25\x1a\x00\x00\x79\x1a\x00\x00\xcd\x1a\x00\x00\x21\x1b\x00\x00\x75\x1b\x00\x00\xc9\x1b\x00\x00\x1d\x1c\x00\x00\x71\x1c\x00\x00\xc5\x1c\x00\x00\x00\x00\x00\x00\x19\x1d\x00\x00\x6d\x1d\x00\x00\xc1\x1d\x00\x00\x15\x1e\x00\x00\x69\x1e\x00\x00\xeb\xff\xff\xff\x00\x00\x00\x00\xbd\x1e\x00\x00\x11\x1f\x00\x00\x65\x1f\x00\x00\xb9\x1f\x00\x00\x0d\x20\x00\x00\x61\x20\x00\x00\xb5\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x21\x00\x00\x5d\x21\x00\x00\xb1\x21\x00\x00\x05\x22\x00\x00\x59\x22\x00\x00\xad\x22\x00\x00\x01\x23\x00\x00\x55\x23\x00\x00\xa9\x23\x00\x00\xfd\x23\x00\x00\x51\x24\x00\x00\xa5\x24\x00\x00\xf9\x24\x00\x00\x4d\x25\x00\x00\xa1\x25\x00\x00\xf5\x25\x00\x00\x49\x26\x00\x00\x9d\x26\x00\x00\xf1\x26\x00\x00\x45\x27\x00\x00\x99\x27\x00\x00\xed\x27\x00\x00\x41\x28\x00\x00\x95\x28\x00\x00\xe9\x28\x00\x00\x3d\x29\x00\x00\x91\x29\x00\x00\xe5\x29\x00\x00\x39\x2a\x00\x00\x8d\x2a\x00\x00\x00\x00\x00\x00\x6b\x00\x00\x00\xfe\x2a\x00\x00\xff\x2a\x00\x00\x00\x2b\x00\x00\x1c\x2b\x00\x00\x70\x2b\x00\x00\xc2\x2a\x00\x00\xc4\x2b\x00\x00\x18\x2c\x00\x00\x6c\x2c\x00\x00\xc0\x2c\x00\x00\xda\x2c\x00\x00\x2e\x2d\x00\x00\x82\x2d\x00\x00\xd6\x2d\x00\x00\x2a\x2e\x00\x00\x44\x2e\x00\x00\x98\x2e\x00\x00\xec\x2e\x00\x00"#
+
+alex_table :: AlexAddr
+alex_table = AlexA# "\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\xff\xff\xff\xff\x05\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x09\x00\x10\x00\x10\x00\x0c\x00\x0c\x00\xff\xff\x15\x00\x06\x00\x06\x00\x06\x00\x15\x00\x12\x00\xff\xff\x06\x00\x82\x00\x7c\x00\x7d\x00\x00\x00\x07\x00\x80\x00\x0a\x00\x74\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x34\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x7e\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\xa1\x00\xa1\x00\x23\x00\x2c\x00\x36\x00\xa1\x00\xa1\x00\xa1\x00\x1a\x00\xa1\x00\xa1\x00\xa1\x00\x76\x00\xa1\x00\xa1\x00\xa1\x00\xa1\x00\xa1\x00\x26\x00\x30\x00\xa1\x00\x1e\x00\xa1\x00\xa1\x00\xa1\x00\xa1\x00\x0f\x00\x05\x00\x00\x00\xff\xff\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x06\x00\x00\x00\x00\x00\x00\x00\xa5\x00\x00\x00\x11\x00\x00\x00\x7c\x00\x7d\x00\x00\x00\x00\x00\x80\x00\x0a\x00\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x00\x00\x83\x00\x81\x00\x00\x00\x00\x00\x85\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\xa3\x00\x7e\x00\x00\x00\x7f\x00\xa9\x00\x86\x00\x00\x00\x5f\x00\xa1\x00\x3f\x00\x64\x00\xa1\x00\xa1\x00\xa1\x00\xa1\x00\x4f\x00\xa1\x00\xa1\x00\xa1\x00\x54\x00\xa1\x00\x58\x00\xa1\x00\xa1\x00\x6b\x00\xa1\x00\x59\x00\xa1\x00\x43\x00\xa1\x00\xa1\x00\xa1\x00\xa1\x00\x0e\x00\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x00\x00\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\xad\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x00\xb2\x00\x8f\x00\x9f\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\x93\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\xb2\x00\x14\x00\x00\x00\x17\x00\xb7\x00\xb7\x00\x90\x00\xa0\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\x94\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\xb7\x00\x16\x00\xa2\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x18\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x24\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x19\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x18\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x1b\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x1c\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x7b\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x1d\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\x18\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x1f\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x20\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\x21\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x2d\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x22\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x18\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x18\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x25\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x39\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x27\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x2a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x2b\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x28\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x28\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x2e\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x2f\x00\xa2\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x29\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\xa4\x00\x31\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x32\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x33\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x28\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x35\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x37\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x38\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x3a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x3b\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x3c\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x3d\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x48\x00\xa2\x00\xa2\x00\xa2\x00\x3e\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x47\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x3a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x40\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x41\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x7b\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x42\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\x3a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x44\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x45\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\x46\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x66\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x3a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x3a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x49\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x4a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x4b\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x4c\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x4d\x00\xa2\x00\x57\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x4e\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x50\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\x51\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x52\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x53\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x77\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x50\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x55\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x56\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x50\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x50\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x5a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\x5b\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x5c\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x5d\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x5e\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x5a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\x60\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x61\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x72\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x62\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x63\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\x5a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x65\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x5a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x67\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x68\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x69\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x6a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x6e\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x6c\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x6f\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x70\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x71\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x77\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x78\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\x79\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\x75\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x7a\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\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\xb8\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\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\xb8\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\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x87\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\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\xb8\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\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\x88\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\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x89\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\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\xb8\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x8a\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x8b\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\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\xb8\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x8c\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x8d\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\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\xb8\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\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\xb8\x00\xb8\x00\x8e\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x87\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\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\xb8\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\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\x88\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\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x91\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\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\xb8\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x92\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x87\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\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\xb8\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\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\x88\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\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x95\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\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\xb8\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x96\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x97\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\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\xb8\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x98\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\x99\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\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\xb8\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\x9a\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\xb8\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\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x9b\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\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\xb8\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x9c\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\x9d\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb8\x00\x00\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\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\xb8\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\x9e\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\xb8\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\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x00\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa2\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa5\x00\xa5\x00\xa6\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\x00\xaa\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\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x00\xa9\x00\xa9\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\x00\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\x00\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xab\x00\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\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\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\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\xae\x00\x00\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\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\xac\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\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\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\xae\x00\x00\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xae\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xb0\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\x00\x00\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb3\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\x00\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\x00\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb4\x00\xb8\x00\x00\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\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\xb8\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\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\xb8\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\xb8\x00\xb8\x00\x00\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb6\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\xb8\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\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\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\xb8\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\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x0a\x00\x0a\x00\x0a\x00\x0d\x00\x0d\x00\x0d\x00\x0a\x00\x0a\x00\x0a\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x0a\x00\x2d\x00\x20\x00\x20\x00\x20\x00\x2d\x00\x2d\x00\x0a\x00\x20\x00\x2d\x00\x28\x00\x29\x00\xff\xff\x20\x00\x2c\x00\x2d\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3a\x00\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\x5b\x00\xff\xff\x5d\x00\xff\xff\xff\xff\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\x7b\x00\x0a\x00\xff\xff\x0a\x00\x0d\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\x7d\x00\x20\x00\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x7d\x00\xff\xff\x28\x00\x29\x00\xff\xff\xff\xff\x2c\x00\x2d\x00\x2e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\x3c\x00\x3d\x00\xff\xff\xff\xff\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\xff\xff\x5d\x00\x5c\x00\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\x7b\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\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\x22\x00\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\xff\xff\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\x7b\x00\xff\xff\x7d\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\x27\x00\x7d\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\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\x3f\x00\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\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\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\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\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\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\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\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\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\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\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\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\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\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\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\x3a\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\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\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\x3a\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\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\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\x3a\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\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\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\x3a\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\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\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\x3a\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\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\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\x3a\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\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\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\x3a\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\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\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\x3a\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\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\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\x3a\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\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\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\x3a\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\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\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\x3a\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\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\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\x3a\x00\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\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\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\x3a\x00\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\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\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\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\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\x0a\x00\x0a\x00\x0a\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\x22\x00\x22\x00\x22\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\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\x5c\x00\x5c\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\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\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\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\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\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\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\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\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\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\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\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\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\x3a\x00\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\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\x3a\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x08\x00\x08\x00\xff\xff\xff\xff\xff\xff\x0d\x00\x0d\x00\xff\xff\xff\xff\x0d\x00\xff\xff\x13\x00\x13\x00\xff\xff\x13\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\xa8\x00\xa8\x00\xa8\x00\xa8\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"#
+
+alex_accept = listArray (0::Int,184) [[],[],[],[],[],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAccSkip)],[(AlexAccSkip)],[],[],[(AlexAccSkip)],[],[],[],[(AlexAcc (alex_action_4))],[],[(AlexAcc (alex_action_3))],[],[],[(AlexAcc (alex_action_4))],[],[(AlexAcc (alex_action_4))],[(AlexAcc (alex_action_5))],[(AlexAcc (alex_action_6))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_7))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_8))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_9))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_10))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_11))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_12))],[(AlexAcc (alex_action_12))],[(AlexAcc (alex_action_12))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_13))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_14))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_15))],[(AlexAcc (alex_action_15))],[(AlexAcc (alex_action_15))],[(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_17))],[(AlexAcc (alex_action_18))],[(AlexAcc (alex_action_18))],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_19))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_20))],[(AlexAcc (alex_action_21))],[(AlexAcc (alex_action_21))],[],[],[],[(AlexAcc (alex_action_22))],[(AlexAcc (alex_action_22))],[],[],[],[(AlexAcc (alex_action_23))],[(AlexAcc (alex_action_23))],[],[],[],[(AlexAcc (alex_action_24))],[(AlexAcc (alex_action_24))],[],[],[]]
+{-# LINE 52 "src/Scanner.x" #-}
+
+tokenize :: Opts -> FilePath -> String -> [Token]
+tokenize opts path str
+  = merge $ scanTks opts [(Pos 1 0 path, 0)] (Pos 1 1 path, str)
+
+merge []            = []
+merge r@[_]         = r
+merge (ValToken TkTextln s1 p : ValToken TkTextln s2 _ : r)
+  = merge (ValToken TkTextln (s1 ++ s2) p : r)
+merge (t : r)       = t : merge r
+
+type AlexInput = (Pos, String)  -- current position, current string
+
+alexGetChar :: AlexInput -> Maybe (Char,AlexInput)
+alexGetChar (_, [])     = Nothing
+alexGetChar (p, c : cs) = Just (c, (adv p c, cs))
+
+alexInputPrevChar :: AlexInput -> Char
+alexInputPrevChar = error "alexInputPrevChar: should not be used."
+
+type Ctx = (Pos, Int)  -- context start position, start code
+type CtxStack = [Ctx]
+
+scanTks :: Opts -> CtxStack -> AlexInput -> [Token]
+scanTks opts st inp@(pos,str)
+  = let (sc,st',tks) = unwind pos str st []
+    in tks ++
+       case alexScan inp sc of
+         AlexEOF                -> unwindAll st' pos
+         AlexError _            -> let (Just (c, inp')) = alexGetChar inp
+                                       tk | sc == h || sc == j = valueToken TkTextln [c] pos
+                                          | otherwise          = errToken [c] pos
+                                   in tk : scanTks opts st' inp'
+         AlexSkip inp' _        -> scanTks opts st' inp'
+         AlexToken inp' len act -> let tk = act (take len str) pos
+                                   in tk : scanTks opts (push opts sc tk st') inp'
+
+push :: Opts -> Int -> Token -> CtxStack -> CtxStack
+push opts sc (Reserved k pos)
+  | sc == 0 && k == "{"          = ((noPos, n) :)
+  | sc == h && k == "{"          = ((noPos, n) :)
+  | sc == h && k == "}"          = tail
+  | sc == j && k == "{"          = ((noPos, j) :)
+  | sc == j && k == "}"          = tail
+  | sc == 0 && k == "itf"        = ((pos, 0) :)
+  | sc == 0 && k == "data"       = ((pos, 0) :)
+  | sc /= a && k == "sem"        = ((pos, a) :)
+  | sc /= a && k == "datasem"    = ((pos, a) :)
+  | sc /= a && k == "cosem"      = ((pos, a) :)
+  | sc /= a && k == "detach"     = ((pos, a) :)
+  | sc == a && k == "="          = ((pos, n) :)
+  | sc == a && k == "<-"         = ((pos, n) :)
+  | sc == 0 && k == "::"         = ((pos, n) :)
+  | sc == a && k == "::"         = ((pos, n) :)
+  | sc == a && k == "monad"      = ((pos, n) :)
+  | sc == a && k == "visit"      = ((pos, a) :)
+  | sc == a && k == "internal"   = ((pos, a) :)
+  | sc == a && k == "clause"     = ((pos, a) :)
+  where
+    n | genHaskell opts = h
+      | genJs opts      = j
+      | otherwise       = error "target language unspecified"
+push _ _ _ = id
+
+unwind :: Pos -> String -> CtxStack -> [Token] -> (Int, CtxStack, [Token])
+unwind p str st@((p',c) : st') acc
+  |    (cp == cp' &&
+         (null str || (not $ isSpace $ head str)) )
+    || (cp < cp' &&
+         ( any (not . isSpace) $
+             take (cp' - cp) str) ) = unwind p str st' (reserved "end" p : acc)
+  | otherwise                       = (c, st, acc)
+  where cp  = column p
+        cp' = column p'
+
+unwindAll :: CtxStack -> Pos -> [Token]
+unwindAll st pos
+  = map (const (reserved "end" pos)) (init st)
+
+ppTokens :: [Token] -> PP_Doc
+ppTokens = vlist . map ppToken
+
+ppToken :: Token -> PP_Doc
+ppToken (Reserved str pos)    = "keyword " >|< show str >|< " at " >|< ppPos pos
+ppToken (ValToken tp val pos) = show tp >|< " " >|< val >|< " at " >|< ppPos pos
+
+ppPos :: Pos -> PP_Doc
+ppPos (Pos l c _) = show l >|< "," >|< show c
+
+
+a,h,j :: Int
+a = 1
+h = 2
+j = 3
+alex_action_3 =  valueToken TkTextln 
+alex_action_4 =  reserved 
+alex_action_5 =  reserved 
+alex_action_6 =  reserved 
+alex_action_7 =  reserved 
+alex_action_8 =  reserved 
+alex_action_9 =  reserved 
+alex_action_10 =  reserved 
+alex_action_11 =  reserved 
+alex_action_12 =  reserved 
+alex_action_13 =  reserved 
+alex_action_14 =  reserved 
+alex_action_15 =  reserved 
+alex_action_16 =  reserved 
+alex_action_17 =  reserved 
+alex_action_18 =  reserved 
+alex_action_19 =  valueToken TkVarid  
+alex_action_20 =  valueToken TkConid  
+alex_action_21 =  valueToken TkTextln 
+alex_action_22 =  valueToken TkTextln 
+alex_action_23 =  valueToken TkVarid  
+alex_action_24 =  valueToken TkVarid  
+{-# 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 37 "templates/GenericTemplate.hs" #-}
+
+{-# LINE 47 "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/ruler-core/ruler-core-tmp/Transform.hs b/dist/build/ruler-core/ruler-core-tmp/Transform.hs
new file mode 100644
# file too large to diff: dist/build/ruler-core/ruler-core-tmp/Transform.hs
diff --git a/examples/Alias.rul b/examples/Alias.rul
new file mode 100644
--- /dev/null
+++ b/examples/Alias.rul
@@ -0,0 +1,47 @@
+{
+{-# LANGUAGE BangPatterns #-}
+module Alias where
+
+import Control.Monad.Error
+}
+
+type ListX : [X]
+
+data X
+  con C
+
+itf X
+  visit v
+    inh ast :: X
+    syn x :: Int
+
+datasem X
+  clause C
+    lhs.x = 1
+
+itf ListX
+  visit v
+    inh ast :: ListX
+    syn x :: Int
+
+datasem ListX
+  clause Cons
+    invoke v of hd
+    invoke v of tl
+    lhs.x = hd.x + tl.x
+  clause Nil
+    lhs.x = 0
+
+{
+test :: ListX -> IO Int
+test xs = do
+  let inh = Inh_ListX_v { ast_Inh_ListX = xs }
+  syn <- invoke_ListX_v dnt_ListX inh
+  let x = x_Syn_ListX syn
+  return x
+
+main :: IO ()
+main = do let list = [X_C,X_C,X_C]
+          x <- test list
+          putStrLn $ show x
+}
diff --git a/examples/ConMatch.rul b/examples/ConMatch.rul
new file mode 100644
--- /dev/null
+++ b/examples/ConMatch.rul
@@ -0,0 +1,22 @@
+{
+{-# LANGUAGE BangPatterns #-}
+module Eval where
+
+import Control.Monad.Error
+}
+
+itf I
+  visit v
+    syn x :: Int
+    
+data D
+  con C
+    y :: Int
+
+{
+t = sem t : I monad IO
+      visit v
+        clause c
+          match D.C@m = D_C 3
+          lhs.x = m.y
+}
diff --git a/examples/CycRepmin.rul b/examples/CycRepmin.rul
new file mode 100644
--- /dev/null
+++ b/examples/CycRepmin.rul
@@ -0,0 +1,63 @@
+{
+{-# LANGUAGE BangPatterns #-}
+module CycRepmin where
+
+import Control.Monad.Error
+}
+
+data Tree
+  con Leaf
+    x :: Int
+  con Bin
+    l : Tree
+    r : Tree
+  ext Show
+
+data Root
+  con Root
+    t : Tree
+
+itf Root
+  visit dispatch
+    inh ast :: Root
+    syn t :: Tree
+
+itf Tree
+  visit dispatch
+    inh ast :: Tree
+  visit compdist cyclic
+    inh g :: Int
+    syn m :: Int
+  visit result
+    syn t :: Tree
+
+datasem Root monad IO
+  cyclic  -- reminder: turn on cycle checking
+  clause Root
+    t.g   = t.m
+    lhs.t = t.t
+
+datasem Tree monad IO
+  clause Leaf
+    lhs.t = Tree_Leaf lhs.g
+    lhs.m = loc.x
+
+  clause Bin
+    default g = last
+    visit compdist
+      lhs.m = l.m `min` r.m
+      lhs.t = Tree_Bin l.t r.t
+
+{
+test :: Tree -> IO Tree
+test t = do
+  let inh = Inh_Root_dispatch { ast_Inh_Root = Root_Root t }
+  syn <- invoke_Root_dispatch dnt_Root inh
+  let t = t_Syn_Root syn
+  return t
+
+main :: IO ()
+main = do let exp = Tree_Bin (Tree_Leaf 1) (Tree_Bin (Tree_Leaf 2) (Tree_Leaf 3))
+          x <- test exp
+          putStrLn $ show x
+}
diff --git a/examples/Eval.rul b/examples/Eval.rul
new file mode 100644
--- /dev/null
+++ b/examples/Eval.rul
@@ -0,0 +1,56 @@
+{
+{-# LANGUAGE BangPatterns #-}
+module Eval where
+
+import Control.Monad.Error
+}
+
+data Expr
+  con Int
+    x :: Int
+  con Plus
+    l :: Expr
+    r :: Expr
+
+itf Eval
+  visit eval
+    inh e :: Expr
+    syn val :: Int
+
+{
+eval = sem eval : Eval monad IO
+         visit eval
+           clause int
+             match Expr.Int@loc = lhs.e
+             lhs.val = loc.x
+
+           clause plus
+             attach m : Decon_Expr_Plus = mkDecon_Expr_Plus
+             m.data = lhs.e
+             invoke deconstruct of m
+
+             child l : Eval = eval
+             child r : Eval = eval
+
+             l.e = m.l
+             r.e = m.r
+
+             invoke eval of l
+             invoke eval of r
+
+             lhs.val = l.val + r.val
+}
+
+{
+test :: Expr -> IO Int
+test exp = do
+  let inh = Inh_Eval_eval { e_Inh_Eval = exp }
+  syn <- invoke_Eval_eval eval inh
+  let x = val_Syn_Eval syn
+  return x
+
+main :: IO ()
+main = do let exp = Expr_Plus (Expr_Int 1) (Expr_Plus (Expr_Int 2) (Expr_Int 3))
+          x <- test exp
+          putStrLn $ show x
+}
diff --git a/examples/EvalAsAg.rul b/examples/EvalAsAg.rul
new file mode 100644
--- /dev/null
+++ b/examples/EvalAsAg.rul
@@ -0,0 +1,42 @@
+{
+{-# LANGUAGE BangPatterns #-}
+module Eval where
+
+import Control.Monad.Error
+}
+
+data Expr
+  con Int
+    x :: Int
+  con Plus
+    l : Expr
+    r : Expr
+
+itf Expr
+  visit eval
+    inh ast :: Expr
+    syn val :: Int
+
+datasem Expr monad IO
+  clause Int
+    loc.z = 3
+    lhs.val = loc.x
+  clause Plus
+    invoke eval of l
+    invoke eval of r
+    lhs.val = l.val + r.val
+
+
+{
+test :: Expr -> IO Int
+test exp = do
+  let inh = Inh_Expr_eval { ast_Inh_Expr = exp }
+  syn <- invoke_Expr_eval dnt_Expr inh
+  let x = val_Syn_Expr syn
+  return x
+
+main :: IO ()
+main = do let exp = Expr_Plus (Expr_Int 1) (Expr_Plus (Expr_Int 2) (Expr_Int 3))
+          x <- test exp
+          putStrLn $ show x
+}
diff --git a/examples/HelloWorld.rul b/examples/HelloWorld.rul
new file mode 100644
--- /dev/null
+++ b/examples/HelloWorld.rul
@@ -0,0 +1,23 @@
+{
+{-# LANGUAGE BangPatterns #-}
+module HelloWorld where
+
+import Control.Monad.Error
+}
+
+itf H
+  visit v1
+    syn xs :: String
+
+{
+hello = sem hello : H monad Either String
+          visit v1
+            clause c1
+              match True = False
+              lhs.xs = "Hello World"
+
+hello2 = sem hello2 : H monad Either String
+           visit v1
+             clause c3
+               lhs.xs = "Booh!"
+}
diff --git a/examples/Internal.rul b/examples/Internal.rul
new file mode 100644
--- /dev/null
+++ b/examples/Internal.rul
@@ -0,0 +1,46 @@
+{
+{-# LANGUAGE BangPatterns #-}
+module Internal where
+
+import Control.Monad.Error
+}
+
+data D
+  con C
+
+itf D
+  visit dispatch
+    inh ast :: D
+    syn x :: Int
+    syn z :: Int
+
+{
+foo =
+ sem foo : D monad IO
+  visit dispatch
+   clause C
+    internal bla   -- internal clause: conditionally compute attributes
+      loc.p = 9
+      lhs.z = loc.p
+      clause other1
+        match False = True  -- this clause will fail
+        loc.q = True
+        lhs.x = loc.p + const 3 lhs.ast
+      clause other2
+        lhs.x = 42          -- the result of this internal clause is returned
+}
+
+{
+test :: D -> IO (Int, Int)
+test d = do
+  let inh = Inh_D_dispatch { ast_Inh_D = d }
+  syn <- invoke_D_dispatch foo inh
+  let x = x_Syn_D syn
+  let z = z_Syn_D syn
+  return (x,z)
+
+main :: IO ()
+main = do let d = D_C
+          t <- test d
+          putStrLn $ show t
+}
diff --git a/examples/JsMenu.rul b/examples/JsMenu.rul
new file mode 100644
--- /dev/null
+++ b/examples/JsMenu.rul
@@ -0,0 +1,131 @@
+{
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html>
+<head>
+<title>Visitor example</title>
+
+<script type="text/javascript">
+var eEval  = new Object();
+var eAbort = new Object();
+
+}
+
+data Root
+  con Root
+    root : Menu
+
+data Menu
+  con Menu
+    name :: 
+    cs : Menus
+
+type Menus : [Menu]
+
+itf Root
+  visit perform
+    inh ast ::
+
+itf Menu
+  visit gather
+    inh ast     ::
+    inh depth   ::
+    syn gathMax ::
+  visit layout
+    inh finMax  ::
+    inh count   ::
+    syn count   ::
+
+itf Menus
+  visit gather
+    inh ast     ::
+    inh depth   ::
+    syn gathMax ::
+  visit layout
+    inh finMax  ::
+    inh count   ::
+    syn count   ::
+
+{
+var  root = new Root_Root(
+  new Menu_Menu("a", [
+    new Menu_Menu("b", [
+          new Menu_Menu("c", [])
+       ,  new Menu_Menu("d", []) ]) ]));
+
+function align(root, anchor) {
+  datasem Root
+    clause Root
+      root:depth   = 0
+      root:count   = 0
+      root:finMax  = root:gathMax
+      invoke layout of root
+
+  datasem Menu
+    clause Menu
+      cs:finMax    = lhs:finMax
+      cs:depth     = 1 + lhs:depth
+      cs:count     = 1 + lhs:count
+      lhs:count    = cs:count
+
+      match loc:elem  = document.getElementById(loc:name)
+      loc:offset      = lhs:depth * 20
+      loc:width       = loc:offset + loc:elem.clientWidth
+      lhs:gathMax     = Math.max(cs:gathMax, loc:width)
+
+      visit layout
+        match _     =  (function () {
+                          loc:elem.style.left    = (anchor.offsetLeft + loc:offset) + "px";
+                          loc:elem.style.top     = (anchor.offsetTop + lhs:count * 30) + "px";
+                          loc:elem.style.width   = (lhs:finMax - loc:offset) + "px";
+                          loc:elem.style.height  = 30 + "px";
+                       }) ()
+
+  datasem Menus
+    default depth    = function(depths)  { return depths[depths.length-1]; }
+    default finMax   = function(maxs)    { return maxs[maxs.length-1]; }
+    default gathMax  = function(maxs)    { return Math.max.apply(Math, maxs); }
+    default count    = function(counts)  { return counts[0]; }
+    clause Cons
+    clause Nil
+  
+  var inps = new Inh_Root_perform();
+  inps.ast = root;
+  dnt_Root()(inps);
+}
+
+</script>
+
+<style type="text/css">
+  #a { background-color: red; position: absolute; display: block; width: auto; }
+  #b { background-color: green; position: absolute; display: block; width: auto; }
+  #c { background-color: blue; position: absolute; display: block; width: auto; }
+  #d { background-color: yellow; position: absolute; display: block; width: auto; }
+</style>
+
+</head>
+<body onLoad="align(root, document.getElementById('anchor'));">
+  
+<div id="a">
+  item a
+</div>
+
+<div id="b">
+  very big item b
+</div>
+
+<div id="c">
+  not so big c
+</div>
+
+<div id="d">
+  tiny
+</div>
+
+<div id="anchor" style="position: absolute; display: block; left: 200px; right: 50px;">
+</div>
+
+</body>
+</html>
+}
diff --git a/examples/JsMenu2.rul b/examples/JsMenu2.rul
new file mode 100644
--- /dev/null
+++ b/examples/JsMenu2.rul
@@ -0,0 +1,101 @@
+data Menu
+  con Menu
+    name :: 
+    cs : Menus
+
+type Menus : [Menu]
+
+itf Root
+  visit perform
+    inh ast ::
+
+itf Menu
+  visit gather
+    inh ast     ::
+    syn gathMax ::
+  visit layout
+    inh count   ::
+    syn count   ::
+
+itf Menus
+  visit gather
+    inh ast     ::
+    syn gathMax ::
+  visit layout
+    inh finMax  ::
+    inh count   ::
+    syn count   ::
+
+{
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html>
+<head>
+<title>Visitor example</title>
+
+<script type="text/javascript">
+
+var  root = new Root_Root(
+  new Menu_Menu("a", [
+    new Menu_Menu("b", [
+          new Menu_Menu("c", [])
+       ,  new Menu_Menu("d", []) ]) ]));
+
+function align(root, anchor) {
+  datasem Menu
+    clause Menu
+      cs:count     = lhs:count+1
+      lhs:count    = cs:count
+      lhs:gathMax  = cs:gathMax
+      cs:finMax    = 1
+
+  datasem Menus
+    default gathMax  = function(maxs)    { return Math.max.apply(Math, maxs); }
+    default finMax   = function(maxs)    { return maxs[maxs.length-1]; }
+    default count    = function(counts)  { return counts[0]; }
+    clause Cons
+      hd:count = lhs:count
+      -- tl:count = hd:count
+      lhs:count = tl:count
+    clause Nil
+
+  var inhs  = new Inh_Root_perform();
+  inhs.ast  = root
+  eval_Root_perform(s_Root, inhs);
+}
+
+</script>
+
+<style type="text/css">
+  #a { background-color: red; position: absolute; display: block; width: auto; }
+  #b { background-color: green; position: absolute; display: block; width: auto; }
+  #c { background-color: blue; position: absolute; display: block; width: auto; }
+  #d { background-color: yellow; position: absolute; display: block; width: auto; }
+</style>
+
+</head>
+<body onLoad="align(root, document.getElementById('anchor'));">
+  
+<div id="a">
+  item a
+</div>
+
+<div id="b">
+  very big item b
+</div>
+
+<div id="c">
+  not so big c
+</div>
+
+<div id="d">
+  tiny
+</div>
+
+<div id="anchor" style="position: absolute; display: block; left: 200px; right: 50px;">
+</div>
+
+</body>
+</html>
+}
diff --git a/examples/RenameAttr.rul b/examples/RenameAttr.rul
new file mode 100644
--- /dev/null
+++ b/examples/RenameAttr.rul
@@ -0,0 +1,40 @@
+{
+{-# LANGUAGE BangPatterns #-}
+module RenameAttr where
+
+import Control.Monad.Error
+}
+
+data X
+  con X
+    chld : Y
+  con X2
+    c1 : Y
+    c2 : Y
+
+data Y
+  con Y
+
+itf X
+  visit v
+    inh ast :: X
+    syn x :: Int
+
+itf Y
+  visit v
+    inh ast :: Y
+    syn z :: Int
+
+datasem X
+  clause X
+    rename chld z to x
+    invoke v of chld
+    lhs.x = chld.x
+  clause X2
+    rename c1 z to x
+    rename c2 z to x
+    default x = sum
+
+datasem Y
+  clause Y
+    lhs.z = 3
diff --git a/examples/Repmin.rul b/examples/Repmin.rul
new file mode 100644
--- /dev/null
+++ b/examples/Repmin.rul
@@ -0,0 +1,62 @@
+{
+{-# LANGUAGE BangPatterns #-}
+module Repmin where
+
+import Control.Monad.Error
+}
+
+data Tree
+  con Leaf
+    x :: Int
+  con Bin
+    l : Tree
+    r : Tree
+  ext Show
+
+data Root
+  con Root
+    t : Tree
+
+itf Root
+  visit dispatch
+    inh ast :: Root
+    syn t :: Tree
+
+itf Tree
+  visit dispatch
+    inh ast :: Tree
+  visit compute
+    syn m :: Int
+  visit distribute
+    inh g :: Int
+  visit result
+    syn t :: Tree
+
+datasem Root monad IO
+  clause Root
+    t.g   = t.m
+    lhs.t = t.t
+
+datasem Tree monad IO
+  clause Leaf
+    lhs.t = Tree_Leaf lhs.g
+    lhs.m = loc.x
+
+  clause Bin
+    default g = last
+    lhs.t = Tree_Bin l.t r.t
+    lhs.m = l.m `min` r.m
+
+{
+test :: Tree -> IO Tree
+test t = do
+  let inh = Inh_Root_dispatch { ast_Inh_Root = Root_Root t }
+  syn <- invoke_Root_dispatch dnt_Root inh
+  let t = t_Syn_Root syn
+  return t
+
+main :: IO ()
+main = do let exp = Tree_Bin (Tree_Leaf 1) (Tree_Bin (Tree_Leaf 2) (Tree_Leaf 3))
+          x <- test exp
+          putStrLn $ show x
+}
diff --git a/examples/Sum.rul b/examples/Sum.rul
new file mode 100644
--- /dev/null
+++ b/examples/Sum.rul
@@ -0,0 +1,40 @@
+{
+{-# LANGUAGE BangPatterns #-}
+module Sum where
+
+import Control.Monad.Error
+}
+
+itf S
+  visit v1
+    inh l :: [Int]
+  visit v2
+    syn s :: Int
+
+{
+sum' = sem sum : S monad Either String
+         visit v1
+           clause sumNil
+             lhs.s = 0
+             match [] = lhs.l
+
+           clause sumCons
+             tl.l = loc.xs
+             lhs.s = loc.x + tl.s
+             match (loc.x : loc.xs) = lhs.l
+             attach v1 of tl : S = sum'
+}
+
+{
+test :: [Int] -> Either String Int
+test xs = do
+  let inh1 = Inh_S_v1 { l_Inh_S = xs }
+  syn1 <- invoke_S_v1 sum' inh1
+  let inh2 = Inh_S_v2 { }
+  syn2 <- invoke_S_v2 (next_S_v1 syn1) inh2
+  let s = s_Syn_S syn2
+  return s
+
+main :: IO ()
+main = putStrLn (show (test [1..100000]))
+}
diff --git a/examples/TypedEval.rul b/examples/TypedEval.rul
new file mode 100644
--- /dev/null
+++ b/examples/TypedEval.rul
@@ -0,0 +1,27 @@
+{
+{-# LANGUAGE BangPatterns #-}
+module Eval where
+
+import Control.Monad.Error
+}
+
+data Expr
+  var a
+  con Int
+    constr a ~ Int
+    x :: Int
+
+itf Eval
+  var a
+  visit eval
+    inh e :: Expr a
+    syn val :: a
+
+{
+eval = sem eval : Eval
+         inst m :: IO
+         visit eval
+           clause int
+             match Expr.Int@loc = lhs.e
+             lhs.val = loc.x
+}
diff --git a/examples/Unknown.rul b/examples/Unknown.rul
new file mode 100644
--- /dev/null
+++ b/examples/Unknown.rul
@@ -0,0 +1,360 @@
+data TyQu
+  con TyForall
+    
+data TyExpr
+  con Con
+    nm        :: HsName
+  con App
+    func      :: TyExpr
+    arg       :: TyExpr
+  con AppTop
+    tyExpr    :: TyExpr
+  con Parens
+    tyExpr    :: TyExpr
+  con Ann
+    ann       :: TyExprAnn
+    tyExpr    :: TyExpr
+  con Wild
+  con Mono
+  con Var
+    nm        :: HsName
+  con VarWild
+    mm        :: HsName
+  con Quant
+    qu        :: TyQu
+    tyVar     :: HsName
+    tyExpr    :: TyExpr
+  con Forall
+    qu        :: TyQu
+    tyVar     :: [HsName]
+    tyExpr    :: TyExpr    
+  con Row
+    rowTyExpr :: RowTyExpr
+    
+data TyVar
+  con Var
+    nm      :: HsName
+    
+type TyVars : [TyVar]
+    
+-- Type Index (a1 >= TyQuantifiedScheme)
+data TyIndex
+  con Group
+    varnm   :: HsName
+    bounds  :: TyQuantifiedScheme
+    
+-- -- Quantified type scheme
+-- data TyQuantifiedScheme
+  -- con Quant
+    -- tyIndex  :: TyIndex
+    -- tyScheme :: TyScheme
+  -- con Bottom
+   
+-- Type Schemes
+data TyScheme
+  con Quant
+    subst    :: Scheme
+    tyExpr   :: TyScheme
+  con SystemF
+    tyExpr   :: TyExpr
+  con Bottom
+  -- These next two are just used internally
+  con Sugar
+     prefix  :: Prefix
+     tyExpr  :: TyScheme
+  con Forall
+     tyQuant :: [HsName]
+     tyExpr  :: TyScheme
+
+-- A simple tybound e.f. (a >= phi)
+data Scheme
+  con Simple
+    varnm  :: HsName
+    bounds :: TyScheme
+  
+-- Mono type
+data TyMono 
+  con Var 
+    nm      :: HsName
+  con App
+    func    :: TyMono
+    arg     :: TyMono
+  con Con
+    nm      :: HsName
+  con AppTop
+    tyMono  :: TyMono
+    
+-- Unqualified typed
+data TyPoly
+  con Var 
+    nm      :: HsName
+  con App
+    func    :: TyPoly
+    arg     :: TyPoly
+  con Con
+    nm      :: HsName
+  con SystemF
+    tyExpr  :: TyExpr
+    
+data DataFieldExpr
+  con Upd
+    dataFieldExpr  :  DataFieldExpr
+    nm             :: HsName
+    expr           :  Expr
+  con Con
+    nm             :: HsName
+  con Expr
+    expr           :  Expr
+   
+data DataFieldPatExpr
+  con Ext
+    dataFieldPatExpr  :: DataFieldPatExpr
+    nm                :: HsName
+    patExpr           :: PatExpr
+  con Con
+    nm                :: HsName
+    
+data RecExpr
+  con Empty
+  con Ext
+    recExpr     :  RecExpr
+    mbNm        :: (Maybe HsName)
+    expr        :  Expr
+  con Upd
+    recExpr     :  RecExpr
+    mbNm        :: HsName
+    expr        :  Expr
+  con Expr
+    expr        :  Expr
+    
+data RecPatExpr
+  con Empty
+  con Ext
+    recPatExpr  :  RecPatExpr
+    mbNm        :: (Maybe HsName)
+    patExpr     :: PatExpr
+  con Expr
+    patExpr     :: PatExpr
+    
+data RowTyExpr
+  con Empty
+  con Ext
+    rowTyExpr       :: RowTyExpr
+    mbNm            :: (Maybe HsName)
+    tyExpr          :: TyExpr
+    
+data KiExpr
+  con Con
+    nm       :: HsName
+  con Var
+    nm       :: HsName
+  con App
+    func     :: KiExpr
+    arg      :: KiExpr
+  con AppTop
+    kiExpr   :: KiExpr
+  con Parens
+    kiExpr   :: KiExpr
+  con Ann
+    ann      :: KiExprAnn
+    kiExpr   :: KiExpr
+    
+data Expr
+  con IConst
+    int           :: Int
+  con CConst
+    char          :: Char
+  con Con
+    nm            :: HsName
+  con Var
+    nm            :: HsName
+  con App
+    func          :  Expr
+    arg           :  Expr
+  con Let
+    isStrict      :: Bool
+    decls         :  Decls
+    body          :  Expr
+  con Lam
+    arg           :: PatExpr
+    body          :  Expr
+  con AppTop
+    expr          :  Expr
+  con Parens
+    expr          :  Expr
+  con TypeAs
+    tyExpr        :: TyExpr
+    expr          :  Expr
+  con Ann
+    ann           :: ExprAnn
+    expr          :  Expr
+  con AppImpred
+    func          :  Expr
+    arg           :  Expr
+  con SConst 
+    str           :: String
+  con Case
+    expr          :  Expr
+    alts          :: CaseAlts
+    mbCaseIds     :: (Maybe UIDS)
+    caseFailS     :: UIDS
+    isTupOfArg    :: Bool
+  con DataFields
+    dataFieldExpr :: DataFieldExpr
+  con Rec
+    recExpr       :: RecExpr
+  con Sel
+    expr          :  Expr
+    lbl           :: HsName
+  con Undefined
+  con CaseAltFail 
+    caseId        :: UID
+    
+data PatExpr
+  con IConst
+    int              :: Int
+  con CConst
+    char             :: Char
+  con Con
+    nm               :: HsName
+  con Var
+    nm               :: HsName
+  con VarAs
+    nm               :: HsName
+    patExpr          :: PatExpr
+  con App
+    func             :: PatExpr
+    arg              :: PatExpr
+  con AppTop
+    patExpr          :: PatExpr
+  con Parens
+    patExpr          :: PatExpr
+  con Ann
+    ann              :: PatExprAnn
+    patExpr          :: PatExpr
+  con TypeAs
+    tyExpr           :: TyExpr
+    patExpr          :: PatExpr
+  con SConst
+    str              :: String
+  con Rec
+    recPatExpr       :: RecPatExpr
+  con DataFields
+    dataFieldPatExpr :: DataFieldPatExpr
+  con Irrefutable
+    patExpr          :: PatExpr
+    
+data CaseAlt
+  con Pat
+    patExpr   :: PatExpr
+    expr      :  Expr
+
+type CaseAlts : [CaseAlt]
+    
+data DataConstr
+  con Constr
+    conNm      :: HsName
+    fields     :  DataFields
+    
+type DataConstrs : [DataConstr]
+
+data DataField
+  con Field
+    mbLabels     :: (Maybe [HsName])
+    tyExpr       :: TyExpr
+    
+type DataFields : [DataField]
+   
+data ExprAnn
+  con Empty
+  
+data TyExprAnn
+  con Empty
+
+data PatExprAnn
+  con Empty
+  
+data KiExprAnn
+  con Empty
+  
+data Decl
+  con TySig
+    nm         :: HsName
+    tyExpr     :: TyExpr
+  con Val
+    patExpr    :: PatExpr
+    expr       :  Expr
+  con Data
+    isNewType  :: Bool
+    tyNm       :: HsName
+    tyVars     :: TyVars
+    constrs    :: DataConstrs
+  con KiSig
+    nm         :: HsName
+    kiExpr     :: KiExpr
+  con FFI
+    callconv   :: FFIWay
+    safety     :: String
+    impEnt     :: String
+    nm         :: HsName
+    tyExpr     :: TyExpr
+  
+type TyExprs : [TyExpr]
+type Decls   : [Decl]
+  
+itf Unify
+  visit unify
+    inh pre  :: Prefix
+    inh exp1 :: TyExpr
+    inh exp2 :: TyExpr
+    inh frs  :: Int
+    syn pre  :: Prefix
+    syn sub  :: Env
+    syn frs  :: Int
+
+itf Subsume
+  visit subsume
+    inh pre  :: Prefix
+    inh exp  :: TyScheme
+    inh ty   :: TyScheme
+    inh frs  :: Int
+    syn pre  :: Prefix
+    syn sub  :: Env
+    syn frs  :: Int
+
+itf UnifyScheme
+  visit unifyScheme
+    inh pre  :: Prefix
+    inh ty1  :: TyScheme
+    inh ty2  :: TyScheme
+    inh frs  :: Int
+    syn pre  :: Prefix
+    syn sub  :: Env
+    syn ty   :: TyScheme
+    syn frs  :: Int
+
+{
+unifyScheme = sem unifyScheme : UnifyScheme monad IO
+                visit unifyScheme
+                  default? pre = last
+                  default? frs = last
+                  default? sub = const empty
+                  clause Main_unifyScheme
+                    loc.nfTy = isNf lhs.ty1
+                    loc.nfTs = isNf lhs.ty2
+                    loc.nf   = True -- loc.nfTy && loc.nfTs
+                    internal nf_check
+                        loc.b1 = isBottom lhs.ty1
+                        loc.b2 = isBottom lhs.ty2
+                        clause s_subsume
+                          match True       = loc.nf
+                          internal bot_check
+                            clause first_bottom
+                                match True = loc.b1
+                                (loc.q, loc.tyx) = splitQuant lhs.ty2
+                                lhs.ty     = nf lhs.ty2 -- loc.tyx
+                                lhs.pre    = lhs.pre -- munion loc.q lhs.pre
+                        clause f_subsume
+                          match False                 = loc.nf
+                          lhs.ty = error "unifyScheme failure, ty1 or ty2 is not in normal form"
+}
diff --git a/ruler-core.cabal b/ruler-core.cabal
new file mode 100644
--- /dev/null
+++ b/ruler-core.cabal
@@ -0,0 +1,20 @@
+cabal-version: >=1.6
+build-type: Custom
+name: ruler-core
+version: 1.0
+license: LGPL
+maintainer: Arie Middelkoop <ariem@cs.uu.nl>
+homepage: http://www.cs.uu.nl/wiki/HUT/WebHome
+description: Ruler-core Attribute Grammar
+category: Development
+stability: Experimental
+copyright: Arie Middelkoop
+extra-source-files: README, uuagc_options, src/AstAG.ag, src/Ast.ag, src/TargetHaskell.ag, src/TargetGraph.ag, src/TargetJs.ag, examples/*.rul
+
+executable ruler-core
+  build-depends: base >= 4, base < 5, uulib, uuagc>=0.9.26, filepath, directory, containers, array, mtl, fgl
+  build-depends: haskell98
+  main-is: Main.hs
+  hs-source-dirs: src
+  other-modules:
+    Scanner, Parser, Opts, Ast, Transform, Errs, Env, DepAnalysis, Pretty, Common
diff --git a/src/Ast.ag b/src/Ast.ag
new file mode 100644
--- /dev/null
+++ b/src/Ast.ag
@@ -0,0 +1,10 @@
+MODULE {Ast} {} {}
+
+PRAGMA genlinepragmas
+
+INCLUDE "AstAG.ag"
+
+imports
+{
+import Common
+}
diff --git a/src/AstAG.ag b/src/AstAG.ag
new file mode 100644
--- /dev/null
+++ b/src/AstAG.ag
@@ -0,0 +1,334 @@
+DATA Program
+  | Program
+      blocks : BlocksTop
+
+DATA BlocksTop
+  | Top
+      blocks : Blocks
+  | None
+
+TYPE Blocks = [Block]
+
+DATA Block
+  | Itf
+      itf : Itf
+  | Data
+      data : Data
+  | Type
+      type : Type
+  | Section
+      code : Code
+  | Item
+      name : Ident
+      item : Item
+  | DataSem
+      sem  : DataSem
+
+DATA Itf
+  | Itf
+      pos    : Pos
+      name   : Ident
+      vars   : Vars
+      visits : ItfVisits
+
+TYPE ItfVisits = [ItfVisit]
+
+DATA ItfVisit
+  | Visit
+      pos    : Pos
+      name   : Ident
+      cyclic : Bool
+      vars   : Vars
+      attrs  : Attrs
+
+TYPE Attrs = [Attr]
+
+DATA Attr
+  | Inh
+      name : Ident
+      type : String
+  | Syn
+      name : Ident
+      type : String
+
+DATA Data
+  | Data
+      pos    : Pos
+      name   : Ident
+      vars   : Vars
+      cons   : Cons
+      exts   : Exts
+
+TYPE Vars = [Var]
+
+DATA Var
+  | Var
+      name   : Ident
+
+TYPE Exts = [Ext]
+
+DATA Ext
+  | Ext
+      name   : Ident
+
+TYPE Cons = [Con]
+
+DATA Con
+  | Con
+      pos    : Pos
+      name   : Ident
+      vars   : Vars
+      fields : Fields
+
+TYPE Fields = [Field]
+
+DATA Field
+  | Field
+      name       : Ident
+      type       : FieldType
+
+DATA FieldType
+  | Term     type : String
+  | Nonterm  name : Ident
+
+DATA Type
+  | Alias
+      pos    : Pos
+      name   : Ident
+      type   : AliasType
+      vars   : Vars
+
+DATA AliasType
+  | Prod   fields : {[Ident]}
+  | List   type   : Ident
+  | Maybe  type   : Ident
+
+DATA DataSem
+  | Sem
+      pos     : Pos
+      tp      : Ident
+      vars    : Vars
+      mbMonad : {Maybe String}
+      cyclic  : Bool
+      stmts   : {Stmts}
+      clauses : ClausesTop
+
+TYPE SemCons = [SemCon]
+
+DATA SemCon
+  | Con
+      pos     : Pos
+      name    : Ident
+      fields  : SemFields
+
+TYPE SemFields = [SemField]
+
+DATA SemField
+  | Field
+      pos     : Pos
+      name    : Ident
+      type    : {Either Ident String}
+
+DATA Code
+  | Code
+      items : Items
+
+TYPE MaybeBoundCode = MAYBE BoundCode
+
+DATA BoundCode
+  | Code
+      bind : Bind
+      pos  : Pos
+      code : Code
+
+TYPE Items = [Item]
+
+DATA Item
+  | Plain
+      pos      : Pos
+      txt      : String
+  | Attr
+      pos      : Pos
+      child    : Ident
+      name     : Ident
+  | Sem
+      pos      : Pos
+      name     : Ident
+      tp       : Ident
+      vars     : Vars
+      mbMonad  : {Maybe String}
+      first    : SemVisit
+  | CoSem
+      pos      : Pos
+      name     : Ident
+      tp       : Ident
+      visit    : Ident
+      vars     : Vars
+      mbMonad  : {Maybe String}
+      first    : SemVisit
+  | DataSem
+      sem      : DataSem
+  | Detach  -- requires visits up to but not including this visit to be invoked
+      pos      : Pos
+      visit    : Ident
+      name     : Ident
+  | Construct
+      pos      : Pos
+      data     : Ident
+      con      : Ident
+      fields   : ExprFields
+  | Brackets
+      pos      : Pos
+      items    : Items
+      posEnd   : Pos
+
+TYPE ExprFields = [ExprField]
+
+DATA ExprField
+  | Field
+      name  : Ident
+      code  : Code
+
+DATA SemVisit
+  | Visit
+      pos      : Pos
+      name     : Ident
+      cyclic   : Bool
+      attrs    : VisitAttrs
+      stmts    : Stmts
+      clauses  : ClausesTop
+  | Internal
+      pos      : Pos
+      name     : Ident
+      cyclic   : Bool
+      stmts    : Stmts
+      clauses  : ClausesTop
+  | Impl
+  | Prependable  -- maybe prepended by other visits
+      pos      : Pos
+      name     : Ident
+      actual   : {SemVisit}
+  | End
+
+TYPE VisitAttrs = [VisitAttr]
+
+DATA VisitAttr
+  | Chn
+      name  : Ident
+      type  : String
+
+DATA ClausesTop
+  | Top
+      clauses : Clauses
+  | Impl
+      clauses : {Clauses}
+
+TYPE Clauses = [Clause]
+
+DATA Clause
+  | Clause
+      pos     : Pos
+      name    : Ident
+      stmts   : Stmts
+      next    : SemVisit
+
+TYPE Stmts = [Stmt]
+
+DATA Stmt
+  | Eval
+      mode    : Mode
+      pat     : Pat
+      code    : BoundCode
+  | Attach
+      pos     : Pos
+      mbVisit : {Maybe Ident}
+      name    : Ident
+      type    : Ident
+      code    : MaybeBoundCode
+  | Invoke
+      pos     : Pos
+      visit   : Ident
+      name    : Ident
+      code    : MaybeBoundCode
+  | Default
+      allowEmpty : Bool
+      pos        : Pos
+      name       : Ident
+      mbCode     : MaybeBoundCode
+  | Rename
+      pos        : Pos
+      child      : Ident
+      subst      : Renames
+
+TYPE Renames = [Rename]
+DATA Rename | Rename
+  source : Ident
+  dest   : Ident
+
+DATA Mode
+  | Match
+  | Assert
+
+DATA Bind
+  | Fun
+  | Monadic
+
+TYPE Pats = [Pat]
+
+DATA Pat
+  | Con
+      name   : Ident
+      pats   : Pats
+  | AttrCon
+      con    : Ident
+      name   : Ident
+      dt     : Ident
+  | Attr
+      child  : Ident
+      name   : Ident
+  | Tup
+      pats   : Pats
+  | List
+      pats   : Pats
+  | Cons
+      hd     : Pat
+      tl     : Pat
+  | Underscore
+      pos    : Pos
+
+DATA AttrTypePat
+  | VisLocal
+  | ProdLocal
+  | Lhs
+  | Child
+  | Visit
+
+DATA AttrTypeCode
+  | VisLocal
+  | ProdLocal
+  | Lhs
+  | Child
+  | Visit
+
+TYPE ImplStmts = [ImplStmt]
+
+DATA ImplStmt
+  | Invoke
+      pos        : Pos
+      child      : Ident
+      visit      : Ident
+      itf        : Ident
+  | DefaultChild
+      pos        : Pos
+      allowEmpty : Bool
+      child      : Ident
+      name       : Ident
+      mbCodeRef  : {Maybe Int}
+  | DefaultSyn
+      pos        : Pos
+      allowEmpty : Bool
+      name       : Ident
+      mbCodeRef  : {Maybe Int}
+  | DefaultVisLocal
+      pos        : Pos
+      name       : Ident
diff --git a/src/Common.hs b/src/Common.hs
new file mode 100644
--- /dev/null
+++ b/src/Common.hs
@@ -0,0 +1,134 @@
+module Common
+  ( Ident(..), identName, identPos, ident, explainIdent, explainPos, QIdent
+  , module UU.Scanner.Position
+  , DepItem(..), Reason(..)
+  )
+  where
+
+import UU.Scanner.Position
+import Data.Map(Map)
+import qualified Data.Map as Map
+
+
+--
+-- Identifiers
+--
+
+data Ident
+  = Ident String Pos
+
+identName :: Ident -> String
+identName (Ident nm _) = nm
+
+identPos :: Ident -> Pos
+identPos (Ident _ pos) = pos
+
+ident :: String -> Ident
+ident nm = Ident nm noPos
+
+instance Show Ident where
+  show (Ident nm _) = nm
+
+instance Eq Ident where
+  (Ident nmA _) == (Ident nmB _) = nmA == nmB
+
+instance Ord Ident where
+  compare (Ident nmA _) (Ident nmB _) = compare nmA nmB
+
+explainIdent :: Ident -> String
+explainIdent ident = show ident ++ " {" ++ explainPos (identPos ident) ++ "}"
+
+explainPos :: Pos -> String
+explainPos (Pos l c file) = file ++ ":" ++ show l ++ "," ++ show c
+
+--
+-- Qualified Identifiers
+--
+
+type QIdent = [Ident]
+
+
+--
+-- DepItems
+--
+
+data DepItem
+  = DepMatch      !Int     -- occ id
+  | DepAssert     !Int     -- occ id
+  | DepDefault    !Int     -- code id
+  | DepAttach     !Int     -- occ id
+  | DepInvoke     !QIdent  -- name : qual childname
+  | DepVisStart   !QIdent  -- name : basename
+  | DepVisEnd     !QIdent  -- name : basename
+  | DepClause     !QIdent  -- name : basename (or: loc.basename)
+  deriving (Eq, Show)
+
+instance Ord DepItem where
+  compare a b =
+   let
+    c (DepMatch n)    (DepMatch m)     = compare m n
+    -- c (DepMatch n)    (DepAssert m)    = compare m n
+    c (DepMatch _)    _                = GT
+    -- c (DepAssert n)   (DepMatch m)     = compare m n
+    c (DepAssert n)   (DepMatch m)     = LT
+    c (DepAssert n)   (DepAssert m)    = compare m n
+    c (DepAssert _)   _                = GT
+    c (DepDefault _)  (DepMatch _)     = LT
+    c (DepDefault _)  (DepAssert _)    = LT
+    c (DepDefault n)  (DepDefault m)   = compare m n
+    c (DepDefault _)  _                = GT
+    c (DepAttach _)   (DepMatch _)     = LT
+    c (DepAttach _)   (DepAssert _)    = LT
+    c (DepAttach _)   (DepDefault _)   = LT
+    c (DepAttach n)   (DepAttach m)    = compare m n
+    c (DepAttach _)   _                = GT
+    c (DepInvoke _)   (DepMatch _)     = LT
+    c (DepInvoke _)   (DepAssert _)    = LT
+    c (DepInvoke _)   (DepDefault _)   = LT
+    c (DepInvoke _)   (DepAttach _)    = LT
+    c (DepInvoke n)   (DepInvoke m)    = compareNames (reverse n) (reverse m)
+    c (DepInvoke _)   _                = GT
+    c (DepVisStart _) (DepMatch _)     = LT
+    c (DepVisStart _) (DepAssert _)    = LT
+    c (DepVisStart _) (DepDefault _)   = LT
+    c (DepVisStart _) (DepAttach _)    = LT
+    c (DepVisStart _) (DepInvoke _)    = LT
+    c (DepVisStart n) (DepVisStart m)  = compareNames (reverse n) (reverse m)
+    c (DepVisStart _) _                = GT
+    c (DepVisEnd n)   (DepVisEnd m)    = compareNames (reverse n) (reverse m)
+    c (DepVisEnd _)   _                = LT
+    c (DepClause _)   (DepMatch _)     = LT
+    c (DepClause _)   (DepAssert _)    = LT
+    c (DepClause _)   (DepDefault _)   = LT
+    c (DepClause _)   (DepAttach _)    = LT
+    c (DepClause _)   (DepInvoke _)    = LT
+    c (DepClause _)   (DepVisStart _)  = LT
+    c (DepClause _)   (DepVisEnd _)    = GT
+    c (DepClause n)   (DepClause m)    = compareNames (reverse n) (reverse m)
+   in c b a
+
+compareNames :: QIdent -> QIdent -> Ordering
+compareNames [] [] = EQ
+compareNames [] _  = GT
+compareNames _  [] = LT
+compareNames (x:xs) (y:ys)
+  = case compare x y of
+      LT -> GT
+      GT -> LT
+      EQ -> compareNames xs ys
+
+-- Dependency reasons
+data Reason = ReasonScopeVisit !Ident
+            | ReasonScopeClause !Ident
+            | ReasonScopeEnd !Ident
+            | ReasonAttrReq !Ident !Ident
+            | ReasonInvokeReq !Ident
+            | ReasonChildReq !Ident
+            | ReasonAttach !Ident !Ident
+            | ReasonDefault !Ident
+            | ReasonDetach !Ident !Ident
+            | ReasonSink
+            | ReasonAlloc
+            | ReasonError
+            | ReasonOrder
+  deriving (Eq,Ord,Show)
diff --git a/src/DepAnalysis.hs b/src/DepAnalysis.hs
new file mode 100644
--- /dev/null
+++ b/src/DepAnalysis.hs
@@ -0,0 +1,207 @@
+module DepAnalysis (analyze) where
+
+import Common
+import Data.Graph
+import Data.Tree
+import Data.Maybe
+import Control.Monad.State.Strict
+import qualified Data.Map as Map
+import Data.Map(Map)
+import qualified Data.IntMap as IntMap
+import Data.IntMap(IntMap)
+import qualified Data.Set as Set
+import Data.Set(Set)
+import qualified Data.IntSet as IntSet
+import Data.IntSet(IntSet)
+import Data.List(partition, nub,sortBy,groupBy)
+import Data.Array
+import Data.Tree
+import qualified Data.Graph.Inductive as G
+
+
+-- computes additional dependencies related to "late-as-possible" scheduling and avoidance of
+-- cyclic visits
+analyze :: [DepItem] -> [DepItem] -> [DepItem] -> Set DepItem -> [(Reason, DepItem, [DepItem])] -> [SCC DepItem]
+analyze oSemStarts oStartVisits oEndVisits avoidVisits deps = map compToItem comps
+  where
+    comps = stronglyConnCompR $ total $ deps'
+
+    compToItem (AcyclicSCC d) = AcyclicSCC (toItem d)
+    compToItem (CyclicSCC ds) = CyclicSCC (map toItem ds)
+    toItem (_,d,_) = d
+
+    (gIn, vertexToKey, keyToVertex) = graphFromEdges (merge deps)
+    gInRev = transposeG gIn
+    deps' =  merge (map (\(d,(b,_)) -> (ReasonAlloc, d, [b])) extraConstrs ++ deps)
+    
+    merge ds = map (\(d,(r,ds)) -> (r,d,ds)) $ Map.assocs $
+                 Map.fromListWith (\(_,as) (r,bs) -> (r,nub (as ++ bs))) $ map (\(r,d,ds) -> (d, (r,ds))) ds
+
+    sequenceMap = let pairs = zip oStartVisits oEndVisits
+                      seqs []             = []
+                      seqs l@((x,_) : zs) = (x, l) : seqs zs
+                   in Map.fromList (seqs pairs)  -- given an beginVisit: gives the end visits starting at this visit
+    visitAllocMap = Map.mapWithKey allocStmt $ Map.filterWithKey (\k _ -> isStmt k) pairRanges
+    extraConstrs  = [ (k,p) | (k,Just p) <- Map.assocs visitAllocMap ]
+
+    allocStmt :: DepItem -> (DepItem, DepItem) -> Maybe (DepItem, DepItem)
+    allocStmt dep (begin,end)
+      | begin == end = Nothing
+      | otherwise = if null ok
+                    then if null bad
+                         then Nothing
+                         else Just (last bad)
+                    else Just (last ok)
+                  where
+                    s = Map.findWithDefault [] begin sequenceMap
+                    s' = untilVisit end s
+                    (bad, ok) = partition (\(b,e) -> e `Set.member` avoidVisits) s'
+
+    untilVisit x [] = []
+    untilVisit x (p@(_,e):ys)
+      | x == e    = [p]
+      | otherwise = p : untilVisit x ys
+
+    isStmt (DepMatch   _) = True
+    isStmt (DepAssert  _) = True
+    isStmt (DepDefault _) = True
+    isStmt (DepAttach  _) = True
+    isStmt (DepInvoke  _) = True
+    isStmt _              = False
+
+    endRanges   = markNodes gIn oEndVisits                  -- lastest visits
+    beginRanges = markNodes gInRev (reverse oStartVisits)   -- earliest visits
+    pairRanges  = Map.mapWithKey (\k v -> (Map.findWithDefault k k beginRanges, v)) endRanges
+    rootItem    = DepVisStart [ident "_root"]
+
+    markNodes :: Graph -> [DepItem] -> Map DepItem DepItem
+    markNodes g sources = snd $ execState (travForest forest) (Nothing, Map.empty)
+      where
+        sources' = Set.fromList sources
+        forest = dfs g (catMaybes $ map keyToVertex sources)
+        travForest trees = mapM_ travTree trees
+        travTree (Node v sub)
+          = do let (_, d, _) = vertexToKey v
+               encounter d
+               travForest sub
+        
+        encounter d
+          = do (mbD, mp) <- get
+               if d `Set.member` sources'
+                then put (Just d, mp)
+                else case mbD of
+                       Nothing -> return ()
+                       Just d' -> put (mbD, Map.insertWith (flip const) d d' mp)
+
+-- Creates a total order
+total :: [(Reason, DepItem, [DepItem])] -> [(Reason, DepItem, [DepItem])]
+total deps = result
+  where
+    result = map (\(a,(r,bs)) -> (r,a,bs)) $ Map.assocs merged
+    merged = Map.unionWith merge
+               (Map.fromListWith merge [ (a, (ReasonOrder, [b])) | (b,a) <- pairs ])
+               (Map.fromList [ (a,(r,bs)) | (r,a,bs) <- deps ])
+    
+    merge (_,as) (r,bs) = (r,nub (as ++ bs))
+    toVal x = case G.lab g0 x of
+                Nothing -> error ("has disapeared from graph: " ++ show x)
+                Just v  -> v
+    pairs = zip nodes3 (tail nodes3)
+    nodes3 = map toVal nodes2
+    
+    items = nub ([ s | (_,s,_) <- deps ] ++ [ d | (_,_,ds) <- deps, d <- ds ])
+    (nodes, mp) = G.mkNodes G.new items
+    (Just edges) = G.mkEdges mp [ (s,d,r) | (r, s, ds) <- deps, d <- ds ]
+    
+    g0 :: G.Gr DepItem Reason
+    g0 = G.mkGraph nodes edges     -- orig graph
+    g1 = G.trc $ removeCycles g0   -- search graph
+    
+    nodes1 = sortBy compare' (G.nodes g0)  -- totally ordered
+    compare' a b
+      = let (Just av) = G.lab g0 a
+            (Just bv) = G.lab g0 b
+        in compare av bv
+    
+    dmap = list2DMap nodes1
+    nodes2 = toListDMap $ fixSolve (assocsDMap dmap) dmap
+    
+    fixSolve todo dmap
+      = case Map.maxViewWithKey todo of
+          Nothing -> dmap
+          Just ((a,v), todo1) ->
+            let preds = G.pre g1 v  -- a must be before the preds
+                troubles = filter (\b -> b < a) $ map (\v -> lookupDMapVal v dmap) preds
+            in if null troubles
+               then fixSolve todo1 dmap
+               else let b = minimum troubles
+                        succs = G.suc g1 v
+                    in case insertDMap b v (removeDMap a dmap) of
+                         Left dmap' ->  -- reindexed, rebuild todo
+                           let a' = lookupDMapVal v dmap'
+                               todo2 = Map.fromList [ (lookupDMapVal v dmap', v) | v <- Map.elems todo1 ]
+                               todo3 = Map.fromList [ (k,v) | v <- succs, let k = lookupDMapVal v dmap', k > a'] `Map.union` todo2
+                           in fixSolve todo3 dmap'
+                         Right dmap' ->
+                           let todo2 = Map.fromList [ (b,v) | v <- succs, let k = lookupDMapVal v dmap', b > a] `Map.union` todo1
+                           in fixSolve todo2 dmap'
+
+-- eliminates those edges E from the graph that make it cyclic.
+-- for an edge e `elem` E, it holds that not removing it from
+-- the graph:
+-- (a) makes it cylic, or
+-- (b) does not increase the connected-ness of nodes
+-- the idea:
+-- (1) compute strongly connected components
+-- (2) arbitrarily totally-order the nodes in such component
+-- (3) filter out those edges between nodes in such component
+--     that are going in a different direction than imposed
+--     by the order.
+removeCycles :: G.Gr DepItem Reason -> G.Gr DepItem Reason
+removeCycles g
+  = G.efilter keep g
+  where
+    cmps = G.scc g
+    mp = IntMap.unions (map createMp cmps)
+    createMp comp =
+      let items = IntSet.fromList comp
+      in IntMap.fromList [ (i, items) | i <- comp ]
+    
+    keep (a, b, _)
+      = case IntMap.lookup a mp of
+          Nothing -> error "removeCycles: missing node"
+          Just comp -> not (IntSet.member b comp) || b > a
+
+-- A sparse array with elements indexed by doubles instead of integers,
+-- offering fast insertion.
+
+newtype DMap = DMap (Map Double Int, IntMap Double)
+
+emptyDMap = DMap (Map.empty, IntMap.empty)
+
+lookupDMapKey k (DMap (m,_)) = Map.findWithDefault undefined k m
+lookupDMapVal v (DMap (_,m)) = IntMap.findWithDefault undefined v m
+
+assocsDMap (DMap (m,_)) = Map.deleteMin $ Map.deleteMax m  -- remove sentinels
+
+list2DMap xs = DMap (m, r)
+  where
+    pairs = zip [1.0, 2.0..] xs
+    m = Map.fromAscList ([(0.0,0)] ++ pairs ++ [(fromIntegral (length xs + 1),maxBound)])
+    r = IntMap.fromList [ (k,d) | (d,k) <- pairs ]
+
+-- insert just before b (potentially reassigns the elements in the map)
+insertDMap b v (DMap (m,r))
+  | c == a    = let mp1' = Map.deleteMin mp1
+                    mp2' = Map.deleteMax mp2
+                in Left $ list2DMap (Map.elems mp1' ++ [v, v'] ++ Map.elems mp2')
+  | otherwise = Right $ DMap (Map.insert c v m, IntMap.insert v c r)
+  where
+    (mp1,Just v',mp2) = Map.splitLookup b m
+    (a,_) = Map.findMax mp1
+    c = (a + b) / 2.0
+
+removeDMap a (DMap (m,r))
+  = DMap (Map.delete a m, r)
+
+toListDMap (DMap (m,_)) = tail $ init $ Map.elems m
diff --git a/src/Env.hs b/src/Env.hs
new file mode 100644
--- /dev/null
+++ b/src/Env.hs
@@ -0,0 +1,130 @@
+module Env( emptyEnv, enterWith, splitWith, enter, leave, dups, missing
+          , extend, extendTail, find, Env, split, merge, defined, findAll
+          , intersection, strip, push, assocs) where
+
+import Data.Map(Map)
+import qualified Data.Map as Map
+import Data.List(nub)
+
+newtype Env k v = Env [Map k (Entries k v)]
+
+data Entries k v
+  = E [k] [(k,v)]
+
+instance (Show k, Show v) => Show (Env k v) where
+  show (Env mps) = show (map Map.assocs mps)
+
+instance (Show k, Show v) => Show (Entries k v) where
+  show (E ms ks) = "<E: " ++ show ms ++ " * " ++ show ks ++ ">"
+
+emptyEnv :: Env k v
+emptyEnv = Env [Map.empty]
+
+enter :: Env k v -> Env k v
+enter (Env mps) = Env (Map.empty : mps)
+
+enterWith :: Env k v -> Env k v -> Env k v
+enterWith (Env (mp : _)) (Env mps) = Env (mp : mps)
+
+leave :: Env k v -> (Env k v, Env k v)
+leave (Env (mp : mps)) = (Env mps, Env [mp])
+
+split :: Env k v -> (Env k v, Env k v)
+split x = (enter x, x)
+
+splitWith :: Env k v -> Env k v -> (Env k v, Env k v)
+splitWith l x = (enterWith l x, x)
+
+-- result: merged env, left only env
+merge :: Ord k => Env k v -> Env k v -> (Env k v, Env k v)
+merge (Env (ha:t)) (Env t1)
+  | length t /= length t1 = error "input environments from different scopes"
+  | otherwise             = (Env t2, Env [l])
+  where
+    tstar  = Map.unions t1
+    (l,t2) = apply ha tstar t1
+
+apply :: Ord k => Map k (Entries k v) -> Map k (Entries k v) -> [Map k (Entries k v)] -> (Map k (Entries k v), [Map k (Entries k v)])   
+apply mp mpstar mps
+  = (new `Map.union` mpDefs, mps')
+  where
+    (mpElse, mpDefs) = Map.partition (\(E _ ds) -> null ds) mp
+    (old,new) = Map.partitionWithKey (\k _ -> Map.member k mpstar) mpElse
+    mps' = Map.foldWithKey mergeEnt mps old
+
+mergeEnt :: Ord k => k -> Entries k v -> [Map k (Entries k v)] -> [Map k (Entries k v)]
+mergeEnt k e (mp:mps)
+  | k `Map.member` mp = Map.insertWith mergeE k e mp : mps
+  | otherwise         = mp : mergeEnt k e mps
+
+mergeE :: Entries k v -> Entries k v -> Entries k v
+mergeE (E ms1 ds1) (E ms2 ds2) = E (ms1 ++ ms2) (ds1 ++ ds2)
+
+dups :: Ord k => Env k v -> [[(k,v)]]
+dups (Env mps) = foldl (Map.fold dups') [] mps
+  where dups' (E _ defs) | length defs > 1 = (defs :)
+                         | otherwise       = id
+
+missing :: Ord k => Env k v -> [[k]]
+missing (Env mps) = foldl (Map.fold miss') [] mps
+  where miss' (E ks _) | null ks   = id
+                       | otherwise = (ks :)
+
+extend :: Ord k => k -> v -> Env k v -> Env k v
+extend k v (Env (mp:mps))
+  = case Map.lookup k mp of
+      Nothing        -> Env (Map.insert k (E [] [(k,v)]) mp : mps)
+      Just (E ms ps) -> Env (Map.insert k (E ms ((k,v) : ps)) mp : mps)
+
+extendTail :: Ord k => k -> v -> Env k v -> Env k v
+extendTail k v (Env (mp:mps))
+  = case Map.lookup k mp of
+      Nothing        -> Env (Map.insert k (E [] [(k,v)]) mp : mps)
+      Just (E ms ps) -> Env (Map.insert k (E ms (ps ++ [(k,v)])) mp : mps)
+
+find :: Ord k => k -> v -> Env k v -> (v, Env k v)
+find k defl e@(Env mps)
+  = case find' mps of
+      Just (v, mps') -> (v, Env mps')
+      Nothing        -> (defl, Env (Map.insertWith mergeE k (E [k] []) (head mps) : tail mps ))
+  where
+    find' [] = Nothing
+    find' ms@(mp : mps)
+      = case Map.lookup k mp of
+          Just (E _ ((_,v):_)) -> return (v, ms)
+          _ -> do (v,mps') <- find' mps
+                  return (v, mp : mps')
+
+findAll :: Ord k => k -> Env k v -> [v]
+findAll k (Env mps) = concatMap find' mps
+  where
+    find' mp = case Map.lookup k mp of
+                 Just (E _ defs) -> map snd defs
+                 _               -> []
+
+defined :: Ord k => k -> Env k v -> Bool
+defined k (Env mps) = foldr def' False mps
+  where def' mp r = Map.member k mp || r
+
+intersection :: Ord k => [Env k v] -> Env k v
+intersection []    = emptyEnv
+intersection [env] = env
+intersection (x:xs) = inter x (intersection xs)
+  where
+    inter (Env (a:l)) (Env (b:r)) = Env (inter' a b : zipWith inter' l r)
+    inter' = Map.intersectionWith mergeE
+
+strip :: Env k v -> Env k v
+strip (Env t) = Env (map (Map.map strip') t)
+  where strip' (E _ ds) = E [] (trim ds)
+        trim [] = []
+        trim (x:_) = [x]
+
+push :: Ord k => Env k v -> Env k v -> Env k v
+push (Env (m : _)) (Env (m' : t))
+  = Env (Map.unionWith mergeE m m' : t)
+
+assocs :: Ord k => Env k v -> [(k,v)]
+assocs (Env ms)
+  = [ head ds | (k, E _ ds) <- acs, not (null ds) ]
+  where acs = Map.assocs $ Map.unions ms
diff --git a/src/Errs.ag b/src/Errs.ag
new file mode 100644
--- /dev/null
+++ b/src/Errs.ag
@@ -0,0 +1,207 @@
+MODULE {Errs} {errsToStr, prettyErrs, Errs, Err(..), debugMsg, nullErrs} {}
+
+PRAGMA genlinepragmas
+
+imports
+{
+import Common
+import Pretty
+import UU.Scanner.Position
+import Data.Sequence(Seq)
+import qualified Data.Sequence as Seq
+import Data.Map(Map)
+import qualified Data.Map as Map
+import Data.Foldable
+import Opts
+}
+
+WRAPPER Err
+
+{
+type Errs = Seq Err
+
+prettyErr :: Opts -> Err -> PP_Doc
+prettyErr opts e
+  = pp_Syn_Err syn
+  where
+    inh = Inh_Err { opts_Inh_Err = opts }
+    syn = wrap_Err sem inh
+    sem = sem_Err e
+
+prettyErrs :: Opts -> Errs -> PP_Doc
+prettyErrs opts = vlist . map (prettyErr opts) . toList
+
+errsToStr :: Opts -> Errs -> String
+errsToStr opts es = disp (prettyErrs opts es) 999999 ""
+
+debugMsg :: String -> Errs
+debugMsg = Seq.singleton . Err_General noPos
+
+nullErrs :: Errs -> Bool
+nullErrs = Seq.null
+}
+
+DATA Err
+  | General
+      pos     : Pos
+      str     : String
+  | Missing
+      ks      : {[Ident]}
+  | Dup
+      ks      : {[Ident]}
+  | ExpVisit
+      pos     : Pos
+      found   : Ident
+      expect  : Ident
+  | MissingVisit
+      pos     : Pos
+      child   : Ident
+      visit   : Ident
+  | VisitsNotImpl
+      nonterm : {[Ident]}
+      vs      : {[Ident]}
+  | UndefVisit
+      child   : Ident
+      visit   : Ident
+      visits  : {[Ident]}
+  | UndeclVisit
+      pos     : Pos
+      name    : Ident
+      itf     : Ident
+  | UndetachVisit
+      child   : Ident
+      visit   : Ident
+      expect  : Ident
+  | UndeclAttr
+      child   : Ident
+      name    : Ident
+  | NameClash
+      name    : Ident
+  | MissingAttr
+      inherited : Bool
+      child     : Ident
+      name      : Ident
+  | DupAttr
+      inherited : Bool
+      child     : Ident
+      name      : Ident
+  | MissingClause
+      itf       : Ident
+      name      : Ident
+  | AmbAttach
+      name      : Ident
+      visit     : Ident
+  | AmbDefault
+      pos       : Pos
+      name      : Ident
+  | TypeConflict
+      found     : Ident
+      expect    : Ident
+  | ChildSynUnav
+      pos       : Pos
+      child     : Ident
+      itf       : Ident
+      vis       : Ident
+      name      : Ident
+  | Cyclic
+      pos       : Pos
+      posMap    : {Map DepItem Pos}
+      comps     : {[DepItem]}
+  | MatchCyclic
+      pos       : Pos
+  | ClausesCyclic
+      pos       : Pos
+      name      : Ident
+      n         : Int
+  | EffCyclic
+      pos       : Pos
+  | VisExpCyclic
+      name      : Ident
+      child     : Ident
+  | IterCyclic
+      pos       : Pos
+  | InternalInCyclic
+      pos       : Pos
+      name      : Ident
+
+ATTR Err [ opts : Opts | | pp : {PP_Doc} ]
+
+SEM Err
+  | General        lhs.pp = locLine @pos @str
+  | Missing        lhs.pp = locLine @loc.pos ("undefined identifier" >#< show @loc.main)
+  | Dup            lhs.pp = locLine @loc.pos ("duplicate identifier" >#< show @loc.main)
+  | ExpVisit       lhs.pp = locLine @pos     ("expecting visit" >#< show @expect >#< "found" >#< show @found)
+  | MissingVisit   lhs.pp = locLine @pos     ("missing invoke of visit" >#< show @visit >#< "of child" >#< show @child)
+  | VisitsNotImpl  lhs.pp = locLine @loc.pos ("missing visit" >#< show @loc.main >#< "for" >#< show (head @nonterm))
+  | UndefVisit     lhs.pp = locLine @loc.pos ("undefined visit" >#< show @visit >#< "of child" >#< show @child)
+  | UndeclVisit    lhs.pp = locLine @pos     ("undeclared visit" >#< show @name >#< "of interface" >#< show @itf)
+  | UndetachVisit  lhs.pp = locLine @loc.pos ("undetachable visit" >#< show @visit >#< "of child" >#< show @child >|< ": expecting visit" >#< show @expect)
+  | UndeclAttr     lhs.pp = locLine @loc.pos ("undeclared attr" >#< show @child >|< "." >|< show @name)
+  | NameClash      lhs.pp = locLine @loc.pos ("name clash" >#< show @name)
+  | MissingAttr    lhs.pp = locLine @loc.pos ("undefined" >#< @loc.type >#< "attr" >#< show @child >|< "." >|< show @name)
+  | DupAttr        lhs.pp = locLine @loc.pos ("duplicate" >#< @loc.type >#< "attr" >#< show @child >|< "." >|< show @name)
+  | MissingClause  lhs.pp = locLine @loc.pos ("missing clause " >#< show @name >#< "of" >#< show @itf)
+  | AmbAttach      lhs.pp = locLine @loc.pos ("ambiguous attach of child" >#< show @name >#< "and visit" >#< show @visit)
+  | AmbDefault     lhs.pp = locLine @pos     ("ambiguous default statement for" >#< show @name)
+  | TypeConflict   lhs.pp = locLine @loc.pos ("type" >#< show @found >#< "does not match expected type" >#< show @expect)
+  | ChildSynUnav   lhs.pp = locLine @pos     ("default for" >#< show @name >#< "requires unavailable attribute" >#< show @name >#< "of" >#< show @child >|< "'s visit" >#< show @vis)
+  | Cyclic         lhs.pp = locLine @pos     ("cycle:" >#< hlist_sp (map @loc.ppDep @comps) )
+  | MatchCyclic    lhs.pp = locLine @pos     ("match statement not allowed in cyclic visit")
+  | ClausesCyclic  lhs.pp = locLine @pos     ("cyclic visit" >#< show @name >#< "must have one clause, but has" >#< show @n)
+  | EffCyclic      lhs.pp = locLine @pos     ("effectful code not allowed for cyclic stmt")
+  | VisExpCyclic   lhs.pp = locLine @loc.pos ("visit" >#< show @name >#< "of" >#< show @child >#< "is on a cycle")
+  | IterCyclic     lhs.pp = locLine @pos     ("visit may not be iterated by cyclic stmt")
+  | InternalInCyclic  lhs.pp = locLine @pos  ("internal visit" >#< show @name >#< "may not occur in a fully cyclic visit")
+
+SEM Err
+  | Missing Dup
+      loc.main   = if null @ks then ident "<unspecified>" else head @ks
+      loc.others = tail @ks
+      loc.pos    = identPos @loc.main
+  | VisitsNotImpl
+      loc.main   = if null @vs then ident "<unspecified>" else head @vs
+      loc.others = tail @vs
+      loc.pos    = identPos (head @nonterm)
+  | UndefVisit
+      loc.pos    = identPos @visit
+  | UndetachVisit
+      loc.pos    = identPos @visit
+  | UndeclAttr
+      loc.pos    = identPos @name
+  | NameClash
+      loc.pos    = identPos @name
+  | MissingAttr
+      loc.pos    = identPos @name
+      loc.type   = if @inherited then text "inh" else text "syn"
+  | DupAttr
+      loc.pos    = identPos @name
+      loc.type   = if @inherited then text "inh" else text "syn"
+  | MissingClause
+      loc.pos    = identPos @name
+  | AmbAttach
+      loc.pos    = identPos @name
+  | TypeConflict
+      loc.pos    = identPos @found
+  | VisExpCyclic
+      loc.pos    = identPos @name
+  | Cyclic
+      loc.ppDep  = \d -> let pos = Map.findWithDefault noPos d @posMap
+                         in case d of
+                              DepMatch _               -> "@" >|< show (line pos)
+                              DepAssert _              -> "@" >|< show (line pos)
+                              DepDefault o             -> "d" >|< show o
+                              DepAttach n              -> "@" >|< show (line pos)
+                              DepInvoke (visit:name:_) -> show name >|< "." >|< show visit >|< "@" >|< show (line $ identPos name)
+                              DepInvoke _              -> text "i???"
+                              DepVisStart (visit:_)    -> ">" >|< show visit >|< "@" >|< show (line $ identPos visit)
+                              DepVisStart _            -> text ">v???"
+                              DepVisEnd  (visit:_)     -> show visit >|< "@" >|< show (line $ identPos visit) >|< "<"
+                              DepVisEnd _              -> text "<v???"
+                              DepClause (clause:_)     -> "|" >|< show clause >|< "@" >|< show (line $ identPos clause)
+                              DepClause _              -> text "|???"
+
+{
+locLine :: PP a => Pos -> a -> PP_Doc
+locLine (Pos l c f) d
+  = pp f >|< ":" >|< pp l >|< "," >|< pp c >|< ":error:" >#< pp d
+}
diff --git a/src/Main.hs b/src/Main.hs
new file mode 100644
--- /dev/null
+++ b/src/Main.hs
@@ -0,0 +1,48 @@
+module Main where
+
+import Scanner
+import Parser
+import Opts
+import Common
+import Transform
+import Errs
+import Control.Monad
+import System
+import System.IO
+
+main :: IO ()
+main = do opts  <- commandlineArgs
+          let path = sourceFile opts
+              pos  = Pos 1 1 path
+          when (path /= "") $
+            do str <- readFile path
+               let tks  = tokenize opts path str
+                   pres = parseProgram opts pos tks
+               when (tokens opts) (putStrLn (show $ ppTokens tks))
+               case pres of
+                 Left err  -> do hPutStrLn stderr err
+                                 hFlush stderr
+                                 exitFailure
+                 Right ast -> let (errs, txtId, txtTarget, txtGraph) = transform pos opts ast
+                              in do when (pretty opts) (putStrLn txtId)
+                                    when (not $ nullErrs errs) $ do
+                                      hPutStrLn stderr (errsToStr opts errs)
+                                      hFlush stderr
+                                    case outputGraph opts of
+                                      Just name -> myWriteFile name txtGraph
+                                      Nothing   -> return ()
+                                    if nullErrs errs || forceGen opts
+                                      then case outputFile opts of
+                                             Just name -> myWriteFile name txtTarget
+                                             Nothing   -> return ()
+                                      else exitFailure
+
+myWriteFile :: FilePath -> String -> IO ()
+myWriteFile path txt
+  = seq (seqChars txt) $ withFile path WriteMode writeHandle
+  where
+    seqChars []     = ()
+    seqChars (c:cs) = seq c (seqChars cs)
+
+    writeHandle h = do hPutStrLn h txt
+                       hFlush h
diff --git a/src/Opts.hs b/src/Opts.hs
new file mode 100644
--- /dev/null
+++ b/src/Opts.hs
@@ -0,0 +1,95 @@
+module Opts where
+
+import System.Console.GetOpt
+import System.Environment
+import System.FilePath
+import System.IO
+import System.Directory
+
+data Opts
+  = Opts { sourceFile  :: !FilePath
+         , outputFile  :: !(Maybe FilePath)
+         , verbose     :: !Bool
+         , tokens      :: !Bool
+         , pretty      :: !Bool
+         , genHaskell  :: !Bool
+         , genJs       :: !Bool
+         , forceGen    :: !Bool
+         , noDataGen   :: !Bool
+         , outputGraph :: !(Maybe FilePath)
+         , hNoLinePragmas :: !Bool
+         , genConNonterms :: !Bool
+         , genCoSems      :: !Bool
+         }
+
+opts :: [OptDescr (Opts -> IO Opts)]
+opts = [ Option "o" ["output"]  (ReqArg oOutput "path") "output .hs file"
+       , Option "v" ["verbose"] (NoArg oVerbose) "verbose output"
+       , Option ""  ["pretty"]  (NoArg oPretty) "pp AST to STDOUT"
+       , Option ""  ["tokens"]  (NoArg oTokens) "print tokens to STDOUT"
+       , Option ""  ["haskell"] (NoArg oHaskell) "generate Haskell code (default)"
+       , Option ""  ["js"]      (NoArg oJs)      "generate Javascript code"
+       , Option "f" ["force"]   (NoArg oForce) "force code generation"
+       , Option ""  ["nodata"]  (NoArg oNoData) "do not generate data types"
+       , Option ""  ["graph"]   (ReqArg oGraph "path") "output .dot file"
+       , Option ""  ["noline"]  (NoArg oNoLinePragmas) "do not generate LINE pragmas"
+       , Option ""  ["genconnon"] (NoArg oGenConNon) "generate constructor nonterminals"
+       , Option ""  ["gencosems"] (NoArg oGenCoSems) "generate cosems"
+       ]
+
+oOutput :: FilePath -> Opts -> IO Opts
+oOutput s o = return (o { outputFile = Just s })
+
+oGraph :: FilePath -> Opts -> IO Opts
+oGraph s o = return (o { outputGraph = Just s })
+
+oVerbose :: Opts -> IO Opts
+oVerbose o = return (o { verbose = True })
+
+oPretty :: Opts -> IO Opts
+oPretty o = return (o { pretty = True })
+
+oTokens :: Opts -> IO Opts
+oTokens o = return (o { tokens = True })
+
+oHaskell :: Opts -> IO Opts
+oHaskell o = return (o { genHaskell = True, genJs = False })
+
+oJs :: Opts -> IO Opts
+oJs o = return (o { genJs = True, genHaskell = False })
+
+oForce :: Opts -> IO Opts
+oForce o = return (o { forceGen = True })
+
+oNoData :: Opts -> IO Opts
+oNoData o = return (o { noDataGen = True })
+
+oNoLinePragmas :: Opts -> IO Opts
+oNoLinePragmas o = return (o { hNoLinePragmas = True })
+
+oGenConNon :: Opts -> IO Opts
+oGenConNon o = return (o { genConNonterms = True })
+
+oGenCoSems :: Opts -> IO Opts
+oGenCoSems o = return (o { genCoSems = True })
+
+defaultOpts :: Opts
+defaultOpts = Opts { sourceFile = "", outputFile = Nothing, verbose = False, pretty = False, tokens = False
+                   , genHaskell = True, genJs = False
+                   , forceGen = False, noDataGen = False, outputGraph = Nothing, hNoLinePragmas = False
+                   , genConNonterms = False, genCoSems = False }
+
+commandlineArgs :: IO Opts
+commandlineArgs
+  = do args <- getArgs
+       let usage = usageInfo "Usage: imp-visits <OPTION ...> <ag-file> ..." opts
+       case getOpt Permute opts args of
+         (actions, args', []) | null args' -> do hPutStrLn stderr ("No AG source file specified.\n" ++ usage)
+                                                 foldl (>>=) (return defaultOpts) actions
+                              | otherwise  -> foldl (>>=) (return $ patch $ defaultOpts { sourceFile = head args' }) actions
+         (_, _, errs)                      -> do hPutStrLn stderr (unlines errs ++ "\n" ++ usage)
+                                                 return defaultOpts
+  where
+    patch o = if sourceFile o /= ""
+              then o { outputFile = Just $ replaceExtension (sourceFile o) ".hs" }
+              else o
diff --git a/src/Parser.hs b/src/Parser.hs
new file mode 100644
--- /dev/null
+++ b/src/Parser.hs
@@ -0,0 +1,258 @@
+module Parser(AgParser, parseProgram) where
+
+
+import UU.Scanner
+import UU.Scanner.GenToken
+import UU.Parsing
+import Opts
+import Ast
+import Common
+import qualified Data.Sequence as Seq
+import qualified Data.Map as Map
+import Data.Map(Map)
+
+
+type AgParser a = Parser Token a
+
+pEnd :: AgParser Pos
+pEnd = pKeyPos "end" <?> "end of layout"
+
+pVarIdent :: AgParser Ident
+pVarIdent = uncurry Ident <$> pVaridPos
+
+pConIdent :: AgParser Ident
+pConIdent = uncurry Ident <$> pConidPos
+
+pIdentItf, pIdentAttr, pIdentChild, pIdentVisit, pIdentCon :: AgParser Ident
+pIdentItf    = pConIdent <?> "itf ident"
+pIdentAttr   = pVarIdent <?> "attr ident"
+pIdentSem    = pVarIdent <?> "sem ident"
+pIdentChild  = pVarIdent <?> "child ident"
+pIdentVisit  = pVarIdent <?> "visit ident"
+pIdentClause = pVarIdent <?> "clause ident"
+pIdentCon    = pConIdent <?> "con ident"
+pDataIdent   = pConIdent <?> "data ident"
+pConstrIdent = pConIdent <?> "con ident"
+pFieldIdent  = pVarIdent <?> "field ident"
+pExtIdent    = pConIdent <?> "ext ident"
+pTyVarIdent  = pVarIdent <?> "var ident"
+
+pProgram :: AgParser Program
+pProgram = (Program_Program . BlocksTop_Top) <$> pList_gr pBlock
+
+pBlock :: AgParser Block
+pBlock  =  Block_Itf <$> pItf
+       <|> Block_Section <$> pCurly pCode
+       <|> Block_Data <$> pData
+       <|> Block_Type <$> pType
+       <|> Block_DataSem <$> pDataSem
+
+pCode :: AgParser Code
+pCode = Code_Code <$> pList_gr pItem
+
+pItf :: AgParser Itf
+pItf = Itf_Itf
+        <$> pKeyPos "itf"
+        <*> pIdentItf
+        <*> pList_gr pVar
+        <*> pItfVisits
+        <*  pEnd
+        <?> "itf"
+
+pItfVisits :: AgParser ItfVisits
+pItfVisits
+  = pList1_gr pItfVisit <?> "visits"
+
+pItfVisit :: AgParser ItfVisit
+pItfVisit
+   = (ItfVisit_Visit
+       <$> pKeyPos "visit"
+       <*> pIdentVisit
+       <*> opt (True <$ pKey "cyclic") False
+       <*> pList_gr pVar
+       <*> pList_gr pAttrInhSyn
+       <?> "visit")
+
+pAttrInhSyn :: AgParser Attr
+pAttrInhSyn = (pAttrInh <|> pAttrSyn) <?> "attr"
+
+pAttrInh :: AgParser Attr
+pAttrInh = Attr_Inh <$ pKey "inh" <*> pVarIdent <* pKey "::" <*> (pTextln <?> "type") <* pEnd
+
+pAttrSyn :: AgParser Attr
+pAttrSyn = Attr_Syn <$ pKey "syn" <*> pVarIdent <* pKey "::" <*> (pTextln <?> "type") <* pEnd
+
+pData :: AgParser Data
+pData = Data_Data <$> pKeyPos "data" <*> pDataIdent <*> pList_gr pVar <*> pList_gr pCon <*> pList_gr pExt <* pEnd <?> "data"
+
+pVar :: AgParser Var
+pVar = Var_Var <$ pKeyPos "var" <*> pTyVarIdent <?> "var"
+
+pExt :: AgParser Ext
+pExt = Ext_Ext <$ pKeyPos "ext" <*> pExtIdent <?> "ext"
+
+pCon :: AgParser Con
+pCon = Con_Con <$> pKeyPos "con" <*> pConstrIdent <*> pList_gr pVar <*> pList_gr pField <?> "con"
+
+pField :: AgParser Field
+pField = pFieldIdent <**> (    (\nt fld -> Field_Field fld (FieldType_Nonterm nt)) <$ pKey ":"  <*> pDataIdent
+                          <|>  (\tp fld  -> Field_Field fld (FieldType_Term tp))   <$ pKey "::" <*> (pTextln <?> "type") <* pEnd
+                          ) <?> "field" 
+
+pType :: AgParser Type
+pType = Type_Alias <$> pKeyPos "type" <*> pDataIdent <* pKey ":" <*> pAliasType <*> pList_gr pVar <?> "type"
+
+pAliasType :: AgParser AliasType
+pAliasType
+  =   (AliasType_Prod  <$> pParens_pCommas pDataIdent <?> "product type")
+  <|> (AliasType_List  <$> pBracks pDataIdent <?> "list type")
+  <|> (AliasType_Maybe <$  pKey "Maybe" <*> pDataIdent <?> "Maybe type")
+
+pDataSem :: AgParser DataSem
+pDataSem
+  = DataSem_Sem <$> pKeyPos "datasem"
+                <*> pIdentItf
+                <*> pList_gr pVar
+                <*> opt (pKey "monad" *> (Just <$> pTextln <* pEnd <?> "monad type")) Nothing
+                <*> opt (True <$ pKey "cyclic") False
+                <*> pList_gr pStmt
+                <*> (ClausesTop_Impl <$> pList_gr pClause)
+                <*  pEnd <?> "data sem"
+
+pItem :: AgParser Item
+pItem
+  =   uncurry (flip Item_Plain) <$> (pTextlnPos <?> "code")
+  <|> uncurry mkAttr <$> (pVaridPos <?> "attribute occurrence")
+  <|> (Item_Sem <$> pKeyPos "sem"
+                <*> pIdentSem
+                <* pKey ":"
+                <*> pIdentItf
+                <*> pList_gr pVar
+                <*> opt (pKey "monad" *> (Just <$> pTextln <* pEnd <?> "monad type")) Nothing
+                <*> pSemVisit
+                <* pEnd <?> "sem")
+  <|> (Item_CoSem <$> pKeyPos "cosem"
+                  <*> pIdentSem
+                  <* pKey ":"
+                  <*> pIdentItf
+                  <*> pIdentVisit
+                  <*> pList_gr pVar
+                  <*> opt (pKey "monad" *> (Just <$> pTextln <* pEnd <?> "monad type")) Nothing
+                  <*> pSemVisit
+                  <* pEnd <?> "cosem")
+  <|> Item_DataSem <$> pDataSem
+  <|> (Item_Detach <$> pKeyPos "detach" <*> pIdentVisit <* pKey "of" <*> pIdentChild <* pEnd <?> "detach item")
+  <|> (Item_Brackets <$> pKeyPos "{" <*> pList_gr pItem <*> pKeyPos"}" <?> "brackets")
+  <?> "code item"
+  where
+    mkAttr s p = let (i,t) = break (\c -> c == '.' || c == ':') s
+                 in Item_Attr p (Ident i p) (Ident (tail t) p)
+
+pSemVisit :: AgParser SemVisit
+pSemVisit
+  = opt ( ((\pos nm cyclic chns stmts clauses ->
+              SemVisit_Prependable pos nm (SemVisit_Visit pos nm cyclic chns stmts clauses))
+                         <$> pKeyPos "visit" <*> pIdentVisit <*> opt (True <$ pKey "cyclic") False
+                         <*> pList_gr pChn <*> pList_gr pStmt
+                         <*> (ClausesTop_Impl <$> pList_gr pClause)
+                         <* pEnd
+                         <?> "visit")
+          <|> ((\pos nm cyclic stmts clauses ->
+               SemVisit_Internal pos nm cyclic stmts clauses)
+                          <$> pKeyPos "internal" <*> pIdentVisit <*> opt (True <$ pKey "cyclic") False
+                          <*> pList_gr pStmt
+                          <*> (ClausesTop_Impl <$> pList_gr pClause)
+                          <* pEnd
+                          <?> "internal visit")
+        ) SemVisit_Impl
+
+pChn :: AgParser VisitAttr
+pChn = VisitAttr_Chn <$ pKey "chn" <*> pVarIdent <* pKey "::" <*> (pTextln <?> "type") <* pEnd <?> "visit-local attr"
+
+pClause :: AgParser Clause
+pClause = Clause_Clause <$> pKeyPos "clause" <*> pClauseIdent <*> pList_gr pStmt <*> pSemVisit <* pEnd <?> "clause"
+
+pClauseIdent :: AgParser Ident
+pClauseIdent
+  = pVarIdent <|> pConIdent <?> "clause name"
+
+pStmt :: AgParser Stmt
+pStmt
+  =   ( Stmt_Eval   <$> opt (Mode_Match <$ pKey "match") Mode_Assert <*> pPat <*> pBoundCode <?> "eval stmt" )
+  <|> ( Stmt_Invoke <$> pKeyPos "invoke" <*> pIdentVisit <* pKey "of" <*> pIdentChild <*> pMaybeBoundCode <?> "invoke stmt" )
+  <|> ( (\p v mb -> Stmt_Attach p (maybe Nothing (const $ Just v) mb) (maybe v id mb) )
+                    <$> pKeyPos "attach" <*> pIdentChild <*> pMbChild
+                    <* pKey ":" <*> pIdentItf <*> pMaybeBoundCode <?> "attach stmt" )
+  <|> ((\p -> Stmt_Attach p Nothing) <$> pKeyPos "child" <*> pIdentChild
+                                     <* pKey ":" <*> pIdentItf <*> pMaybeBoundCode <?> "child stmt")
+  <|> ( Stmt_Default True  <$> pKeyPos "default?" <*> pVarIdent <*> pMaybeBoundCode <?> "default stmt" )
+  <|> ( Stmt_Default False <$> (pKeyPos "default" <|> pKeyPos "default1") <*> pVarIdent <*> pMaybeBoundCode <?> "default1 stmt")
+  <|> ( Stmt_Rename <$> pKeyPos "rename" <*> pIdentChild <*> pList_gr pRename <?> "rename stmt")
+  <?> "statement"
+
+pRename :: AgParser Rename
+pRename = Rename_Rename <$> pIdentAttr <* pKey "to" <*> pIdentAttr
+
+pMbChild :: AgParser (Maybe Ident)
+pMbChild = opt (Just <$ pKey "of" <*> pIdentChild) Nothing
+
+pMaybeBoundCode :: AgParser MaybeBoundCode
+pMaybeBoundCode
+  = opt (Just <$> pBoundCode) Nothing
+
+pBoundCode :: AgParser BoundCode
+pBoundCode
+  =   BoundCode_Code Bind_Fun      <$> pKeyPos "="  <*> pCode <* pEnd
+  <|> BoundCode_Code Bind_Monadic  <$> pKeyPos "<-" <*> pCode <* pEnd
+
+pPat :: AgParser Pat
+pPat = pChainr_gr (Pat_Cons <$ pKey ":") pPatCon
+
+pPatCon :: AgParser Pat
+pPatCon = pIdentCon <**> (   (Pat_Con <$$> pList_gr pPatBase <?> "con pattern")
+                         <|> ((pKey "." *> pIdentCon <* pKey "@" <**> Pat_AttrCon <$$> pIdentChild) <?> "attr con")
+                         )
+        <|> pPatBase
+
+pPatBase :: AgParser Pat
+pPatBase
+  =   Pat_Underscore <$> pKeyPos "_"
+  <|> Pat_Attr <$> pIdentChild <* pKey "." <*> pIdentAttr
+  <|> Pat_Attr <$> pIdentChild <* pKey ":" <*> pIdentAttr  -- should actually check to only parse these in case of javascript
+  <|> Pat_Tup <$> pParens_pCommas pPat
+  <|> Pat_List <$> pBracks_pCommas pPat
+  <?> "simple pattern"
+
+
+--
+-- Run parser
+--
+
+parseProgram :: Opts -> Pos -> [Token] -> Either String Program
+parseProgram opts pos tks
+  = parseTokens opts pos pProgram tks
+
+parseTokens :: Opts -> Pos -> AgParser a -> [Token] -> Either String a
+parseTokens opts pos p tks
+  = if null msgs
+    then final `seq` Right v
+    else Left $ toError opts pos $ head msgs
+  where
+    steps = UU.Parsing.parse p tks
+    msgs  = getMsgs steps
+    (Pair v final) = evalSteps steps
+
+toError :: Opts -> Pos -> Message Token (Maybe Token) -> String
+toError opts pos (Msg exp mtok _)
+  = show p ++ ": " ++ m ++ ". Expecting " ++ show exp
+  where
+    p = case mtok of
+          Nothing -> pos
+          Just t  -> position t
+    m = case mtok of
+          Nothing -> "end of file"
+          Just tok -> case tok of
+                        Reserved str _         -> "symbol " ++ show str
+                        ValToken TkError val _ -> "unrecognized token " ++ show val
+                        ValToken tp val _      -> let descr = if verbose opts then show tp ++ " " else ""
+                                                  in descr ++ show val
diff --git a/src/Pretty.hs b/src/Pretty.hs
new file mode 100644
--- /dev/null
+++ b/src/Pretty.hs
@@ -0,0 +1,187 @@
+-------------------------------------------------------------------------
+-- Subset of UU.Pretty, based on very simple pretty printing
+-- Extended with line-nr tracking
+-------------------------------------------------------------------------
+
+module Pretty
+  ( PP_Doc, PP(..)
+  , disp
+
+  , (>|<), (>-<)
+  , (>#<)
+  , ppWithLineNr
+  , hlist, vlist, hv, hlist_sp
+  , fill
+  , indent
+
+  , pp_block
+  , vlist_sep
+  , pp_parens
+  , pp_braces
+  , pp_brackets
+  , pp_doubleQuotes
+  , hv_sp
+
+  , empty, text
+  )
+  where
+
+import Data.List(intersperse)
+  
+-------------------------------------------------------------------------
+-- Doc structure
+-------------------------------------------------------------------------
+
+data Doc
+  = Emp
+  | Str			!String					-- basic string
+  | Hor			Doc  !Doc				-- horizontal positioning
+  | Ver			Doc  !Doc				-- vertical positioning
+  | Ind			!Int Doc				-- indent
+  | Line        (Int -> Doc)            -- line nr
+
+type PP_Doc = Doc
+
+-------------------------------------------------------------------------
+-- Basic combinators
+-------------------------------------------------------------------------
+
+infixr 3 >|<, >#<
+infixr 2 >-< 
+
+(>|<) :: (PP a, PP b) => a -> b -> PP_Doc
+l >|< r = pp l `Hor` pp r
+
+(>-<) :: (PP a, PP b) => a -> b -> PP_Doc
+l >-< r = pp l `Ver` pp r
+
+(>#<) :: (PP a, PP b) => a -> b -> PP_Doc
+l >#< r  =  l >|< " " >|< r
+
+indent :: PP a => Int -> a -> PP_Doc
+indent i d = Ind i $ pp d
+
+text :: String -> PP_Doc
+text s
+  = let ls = lines s
+        ls' | null ls   = [""]
+            | otherwise = ls
+    in vlist (map Str ls')
+
+empty :: PP_Doc
+empty = Emp
+
+ppWithLineNr :: PP a => (Int -> a) -> PP_Doc
+ppWithLineNr f = Line (pp . f)
+
+-------------------------------------------------------------------------
+-- Derived combinators
+-------------------------------------------------------------------------
+
+hlist, vlist :: PP a => [a] -> PP_Doc
+vlist [] = empty
+vlist as = foldr  (>-<) empty as
+hlist [] = empty
+hlist as = foldr  (>|<) empty as
+
+hv :: PP a => [a] -> PP_Doc
+hv = vlist
+
+hv_sp :: PP a => [a] -> PP_Doc
+hv_sp = foldr (>#<) empty
+
+fill :: PP a => [a] -> PP_Doc
+fill = hlist
+
+pp_block:: (PP a, PP b, PP c) => a -> b -> c -> [PP_Doc] -> PP_Doc
+pp_block o c s as = pp o >|< hlist (intersperse (pp s) as) >|< pp c
+
+pp_parens :: PP a => a -> PP_Doc
+pp_parens p = '(' >|< p >|< ')'
+
+pp_braces :: PP a => a -> PP_Doc
+pp_braces p = '{' >-< p >-< '}'
+
+pp_brackets :: PP a => a -> PP_Doc
+pp_brackets p = '[' >|< pp p >|< ']'
+
+pp_doubleQuotes :: PP a => a -> PP_Doc
+pp_doubleQuotes p = '"' >|< pp p >|< '"'
+
+vlist_sep :: (PP a, PP b) => a -> [b] -> PP_Doc
+vlist_sep sep lst
+  = vlist (intersperse (pp sep) (map pp lst))
+
+hlist_sp :: PP a => [a] -> PP_Doc
+hlist_sp ps = hlist (intersperse (pp " ") (map pp ps))
+
+-------------------------------------------------------------------------
+-- PP class
+-------------------------------------------------------------------------
+
+class Show a => PP a where
+  pp     :: a   -> PP_Doc
+  pp       = text . show
+
+  ppList :: [a] -> PP_Doc
+  ppList as = hlist as
+
+instance PP Doc where
+  pp     = id
+
+instance PP Char where
+  pp c   = text [c]
+  ppList = text
+
+instance PP a => PP [a] where
+  pp = ppList
+
+instance Show Doc where
+  show p = disp p 200 ""
+
+instance PP Int where
+  pp = text . show
+
+instance PP Float where
+  pp = text . show
+
+-------------------------------------------------------------------------
+-- Observation
+-------------------------------------------------------------------------
+
+isEmpty :: PP_Doc -> Bool
+isEmpty Emp         = True
+isEmpty (Ver d1 d2) = isEmpty d1 && isEmpty d2
+isEmpty (Hor d1 d2) = isEmpty d1 && isEmpty d2
+isEmpty (Ind _  d ) = isEmpty d
+isEmpty _           = False
+
+-------------------------------------------------------------------------
+-- Rendering
+-------------------------------------------------------------------------
+
+disp  ::  PP_Doc -> Int -> ShowS
+disp d _ s
+  = r
+  where (r,_,_) = put 0 1 d s
+        put p l d s
+          = case d of
+              Emp              -> (s,p,l)
+              Str s'           -> (s' ++ s,p + length s',l)
+              Ind i  d         -> (ind ++ r,p', l')
+                               where (r,p',l') = put (p+i) l d s
+                                     ind = replicate i ' '
+              Hor d1 d2        -> (r1,p2,l2)
+                               where (r1,p1,l1) = put p  l  d1 r2
+                                     (r2,p2,l2) = put p1 l1 d2 s
+              Ver d1 d2 | isEmpty d1
+                               -> put p l d2 s
+              Ver d1 d2 | isEmpty d2
+                               -> put p l d1 s
+              Ver d1 d2        -> (r1,p2,l2)
+                               where (r1,p1,l1) = put p l d1 $ "\n" ++ ind ++ r2
+                                     (r2,p2,l2) = put p (l1+1) d2 s
+                                     ind = replicate p ' '
+              Line f           -> (r,p',l')
+                               where (r,p',l') = put p l (f l) s
+
diff --git a/src/Scanner.x b/src/Scanner.x
new file mode 100644
--- /dev/null
+++ b/src/Scanner.x
@@ -0,0 +1,140 @@
+{
+module Scanner(tokenize, ppTokens) where
+
+import UU.Scanner
+import UU.Scanner.GenToken
+import Data.Char
+import UU.Pretty
+import Opts
+}
+
+$litChar     = [^[\" \\]]
+$identChar   = [a-zA-Z0-9\'_]
+
+@ucIdent     = [A-Z] $identChar*
+@lcIdent     = [a-z] $identChar*
+
+tokens :-
+  <0,a>     (" " | \n | \r)+                             ;                        -- ignore spaces
+  <0,a,h>   "--" $white .*                               ;                        -- to-end-of-line comment
+  <0,a>     "{-" ([^\-] | $white | "-" [^\}])* "-}"      ;                        -- multi-line comment (not nested)
+  <h>       "{-" ([^\-] | $white | "-" [^\}])* "-}"      { valueToken TkTextln }  -- haskell comment token
+
+  <0,h,j>  "{"                                        { reserved }
+  <h,j>    "}"                                        { reserved }
+
+  <0>    itf | visit | cyclic | inh | syn             { reserved }
+  <0>    data | con | type | Maybe | ext              { reserved }
+  <0>    datasem                                      { reserved }
+
+  <a>    clause | visit | cyclic | chn | internal     { reserved }
+  <a>    match | invoke | of | to                     { reserved }
+  <a>    attach | detach | child | rename             { reserved }
+  <a>    default | default1 | "default?"              { reserved }
+
+  <0,a>  "::" | ":" | "monad"                         { reserved }
+  <0,a>  var                                          { reserved }
+
+  <0,a>  "(" | ")" | "[" | "]" | ","                  { reserved }
+  <a>    "=" | "<-"                                   { reserved }
+  <a>    "." | "@" | "_"                              { reserved }
+  <h,j>  cosem | sem | datasem                        { reserved }
+
+  <0,a>  @lcIdent                                     { valueToken TkVarid  }
+  <0,a>  @ucIdent                                     { valueToken TkConid  }
+
+  <h,j>  \" ([^\"]|\\\")* \"                          { valueToken TkTextln } -- scan string
+  <h>    @ucIdent "." @lcIdent                        { valueToken TkTextln } -- treat qualified names as opaque strings
+  <h>    @lcIdent "." @lcIdent                        { valueToken TkVarid  } -- scan attr occ
+  <j>    @lcIdent ":" @lcIdent                        { valueToken TkVarid  } -- scan attr occ
+
+
+{
+tokenize :: Opts -> FilePath -> String -> [Token]
+tokenize opts path str
+  = merge $ scanTks opts [(Pos 1 0 path, 0)] (Pos 1 1 path, str)
+
+merge []            = []
+merge r@[_]         = r
+merge (ValToken TkTextln s1 p : ValToken TkTextln s2 _ : r)
+  = merge (ValToken TkTextln (s1 ++ s2) p : r)
+merge (t : r)       = t : merge r
+
+type AlexInput = (Pos, String)  -- current position, current string
+
+alexGetChar :: AlexInput -> Maybe (Char,AlexInput)
+alexGetChar (_, [])     = Nothing
+alexGetChar (p, c : cs) = Just (c, (adv p c, cs))
+
+alexInputPrevChar :: AlexInput -> Char
+alexInputPrevChar = error "alexInputPrevChar: should not be used."
+
+type Ctx = (Pos, Int)  -- context start position, start code
+type CtxStack = [Ctx]
+
+scanTks :: Opts -> CtxStack -> AlexInput -> [Token]
+scanTks opts st inp@(pos,str)
+  = let (sc,st',tks) = unwind pos str st []
+    in tks ++
+       case alexScan inp sc of
+         AlexEOF                -> unwindAll st' pos
+         AlexError _            -> let (Just (c, inp')) = alexGetChar inp
+                                       tk | sc == h || sc == j = valueToken TkTextln [c] pos
+                                          | otherwise          = errToken [c] pos
+                                   in tk : scanTks opts st' inp'
+         AlexSkip inp' _        -> scanTks opts st' inp'
+         AlexToken inp' len act -> let tk = act (take len str) pos
+                                   in tk : scanTks opts (push opts sc tk st') inp'
+
+push :: Opts -> Int -> Token -> CtxStack -> CtxStack
+push opts sc (Reserved k pos)
+  | sc == 0 && k == "{"          = ((noPos, n) :)
+  | sc == h && k == "{"          = ((noPos, n) :)
+  | sc == h && k == "}"          = tail
+  | sc == j && k == "{"          = ((noPos, j) :)
+  | sc == j && k == "}"          = tail
+  | sc == 0 && k == "itf"        = ((pos, 0) :)
+  | sc == 0 && k == "data"       = ((pos, 0) :)
+  | sc /= a && k == "sem"        = ((pos, a) :)
+  | sc /= a && k == "datasem"    = ((pos, a) :)
+  | sc /= a && k == "cosem"      = ((pos, a) :)
+  | sc /= a && k == "detach"     = ((pos, a) :)
+  | sc == a && k == "="          = ((pos, n) :)
+  | sc == a && k == "<-"         = ((pos, n) :)
+  | sc == 0 && k == "::"         = ((pos, n) :)
+  | sc == a && k == "::"         = ((pos, n) :)
+  | sc == a && k == "monad"      = ((pos, n) :)
+  | sc == a && k == "visit"      = ((pos, a) :)
+  | sc == a && k == "internal"   = ((pos, a) :)
+  | sc == a && k == "clause"     = ((pos, a) :)
+  where
+    n | genHaskell opts = h
+      | genJs opts      = j
+      | otherwise       = error "target language unspecified"
+push _ _ _ = id
+
+unwind :: Pos -> String -> CtxStack -> [Token] -> (Int, CtxStack, [Token])
+unwind p str st@((p',c) : st') acc
+  |    (cp == cp' &&
+         (null str || (not $ isSpace $ head str)) )
+    || (cp < cp' &&
+         ( any (not . isSpace) $
+             take (cp' - cp) str) ) = unwind p str st' (reserved "end" p : acc)
+  | otherwise                       = (c, st, acc)
+  where cp  = column p
+        cp' = column p'
+
+unwindAll :: CtxStack -> Pos -> [Token]
+unwindAll st pos
+  = map (const (reserved "end" pos)) (init st)
+
+ppTokens :: [Token] -> PP_Doc
+ppTokens = vlist . map ppToken
+
+ppToken :: Token -> PP_Doc
+ppToken (Reserved str pos)    = "keyword " >|< show str >|< " at " >|< ppPos pos
+ppToken (ValToken tp val pos) = show tp >|< " " >|< val >|< " at " >|< ppPos pos
+
+ppPos :: Pos -> PP_Doc
+ppPos (Pos l c _) = show l >|< "," >|< show c
+}
diff --git a/src/TargetGraph.ag b/src/TargetGraph.ag
new file mode 100644
--- /dev/null
+++ b/src/TargetGraph.ag
@@ -0,0 +1,104 @@
+-- This file is included by Transform.ag
+-- Generates code for a dependency graph
+
+SEM Program | Program
+  loc.ppGraph   = "digraph Deps {"
+                  >-< indent 2 ( vlist
+                       [ ppgNode (Map.findWithDefault noPos d @blocks.gathStmtPosMap) d @loc.distRanks
+                       | d <- @loc.unqItems
+                       ])
+                  >-< indent 2 ( vlist
+                        [ label' from >#< "->" >#< ppgDeps (map label' [to])
+                            >#< pp_block "[" "]" "," ( ppgColor (isOnCycle from @loc.distRanks && isOnCycle to @loc.distRanks)
+                                                     : maybe [] (\d -> [ppgProp "label" d]) (ppgReason reason))
+                            
+                            >|< ";"
+                        | (from, (reason, tos)) <- Map.assocs @loc.unqDeps
+                        , length tos >= 1
+                        , let label' = \item -> ppgKey (Map.findWithDefault noPos item @blocks.gathStmtPosMap) item
+                        , to <- tos ]
+                      )
+                  >-< "}"
+
+{
+isOnCycle :: DepItem -> Map DepItem (Bool,Int) -> Bool
+isOnCycle d mp
+  = case Map.lookup d mp of
+      Nothing    -> False
+      Just (b,_) -> b
+
+ppgProp :: PP a => String -> a -> PP_Doc
+ppgProp s d = s >|< "=" >|< pp_doubleQuotes (pp d)
+
+ppgNms :: QIdent -> PP_Doc
+ppgNms = hlist . map show
+
+ppgDeps :: PP a => [a] -> PP_Doc
+ppgDeps [x] = pp x
+ppgDeps xs  = pp_block "{" "}" ";" (map pp xs)
+
+ppgNode :: Pos -> DepItem -> Map DepItem (Bool,Int) -> PP_Doc
+ppgNode pos item rankMap
+  = case item of
+      DepMatch n      -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "label" l, c] >|< ";"
+      DepAssert n     -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "label" l, c] >|< ";"
+      DepDefault n    -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "label" l, c] >|< ";"
+      DepAttach n     -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "shape" "box",ppgProp "label" l, c] >|< ";"
+      DepInvoke nms   -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "shape" "box",ppgProp "skew" ".3",ppgProp "label" l,c] >|< ";"
+      DepVisStart nms -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "shape" "box",ppgProp "skew" ".3",ppgProp "label" l,c] >|< ";"
+      DepVisEnd nms   -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "shape" "box",ppgProp "skew" ".3",ppgProp "label" l,c] >|< ";"
+      DepClause nms   -> ppgKey pos item >#< pp_block "[" "]" "," [ppgProp "shape" "box",ppgProp "skew" ".3",ppgProp "label" l,c] >|< ";"
+  where mbInfo = Map.lookup item rankMap
+        l = ppgLabel pos item (maybe Nothing (Just . snd) mbInfo)
+        c = ppgColor (maybe False fst mbInfo)
+
+ppgColor :: Bool -> PP_Doc
+ppgColor True  = ppgProp "color" "red4"
+ppgColor False = ppgProp "color" "black"
+
+ppgLabel :: Pos -> DepItem -> Maybe Int -> PP_Doc
+ppgLabel pos item mbRank
+  = case item of
+      DepMatch m   -> r >#< show m >|< "?@" >|< show (line pos)
+      DepAssert n  -> r >#< show n >|< "@" >|< show (line pos)
+      DepDefault o -> r >#< "d" >|< show o
+      DepAttach n  -> r >#< "@" >|< show (line pos)
+      DepInvoke (visit:name:_) -> r >#< name >|< "." >|< visit >|< "@" >|< show (line $ identPos name)
+      DepInvoke _              -> r >#< text "i???"
+      DepVisStart (visit:_)    -> r >#< ">" >|< show visit >|< "@" >|< show (line $ identPos visit)
+      DepVisStart _            -> r >#< text ">v???"
+      DepVisEnd (visit:_)      -> r >#< show visit >|< "@" >|< show (line $ identPos visit) >|< "<"
+      DepVisEnd _              -> r >#< text "<v???"
+      DepClause (clause:_)     -> r >#< "|" >|< show clause >|< "@" >|< show (line $ identPos clause)
+      DepClause _              -> r >#< text "|???"
+  where
+    r = case mbRank of
+          Nothing -> empty
+          Just k  -> show k >|< ":"
+
+ppgKey :: Pos -> DepItem -> PP_Doc
+ppgKey pos item
+  = case item of
+      DepMatch n      -> "s"  >|< show n
+      DepAssert n     -> "s"  >|< show n
+      DepDefault n    -> "d"  >|< show n
+      DepAttach n     -> "a"  >|< show n
+      DepInvoke nms   -> "iv" >|< ppgNms nms
+      DepVisStart nms -> "vb" >|< ppgNms nms
+      DepVisEnd nms   -> "ve" >|< ppgNms nms
+      DepClause nms   -> "cl" >|< ppgNms nms
+
+ppgReason :: Reason -> Maybe PP_Doc
+ppgReason reason
+  = case reason of
+      ReasonScopeVisit i      -> Nothing -- Just ("sc-vis-pre" >#< show i)
+      ReasonScopeClause i     -> Nothing -- Just ("sc-cl" >#< show i)
+      ReasonScopeEnd i        -> Nothing -- Just ("sc-vis-end" >#< show i)
+      ReasonAttrReq chld attr -> Just (show chld >|< "." >|< show attr)
+      ReasonInvokeReq i       -> Just ("inv" >#< show i)
+      ReasonChildReq i        -> Nothing -- Just ("chld" >#< show i)
+      ReasonAttach i v        -> Just ("att" >#< show i >|< "." >|< show v)
+      ReasonDefault attr      -> Nothing -- Just ("def." >|< show attr)
+      ReasonDetach _ _        -> Nothing -- Just $ text "detach"
+      ReasonError             -> Just $ text "error"
+}
diff --git a/src/TargetHaskell.ag b/src/TargetHaskell.ag
new file mode 100644
--- /dev/null
+++ b/src/TargetHaskell.ag
@@ -0,0 +1,644 @@
+-- This file is included by Transform.ag
+-- Based on the AST of AstAG.ag
+-- Generates code for Haskell
+
+SEM Program | Program
+  +pp = if genHaskell @lhs.opts
+        then (@loc.hpp >-<)
+        else id
+
+
+{
+hItfNm nm = "I_" ++ show nm
+hCoItfNm nm vis = hItfNm (mkCoIdent nm vis)
+hItfVsNm nm vis = "I_" ++ show nm ++ "_" ++ show vis
+hCoItfVsNm nm vis = hItfVsNm (mkCoIdent nm vis) vis
+hNt x = "_nt_" ++ show x
+hVis x = "_vis_" ++ show x
+hSemNm k v = "_sem_" ++ show k ++ "_" ++ show v
+
+hInp child name
+  | show child == "loc" = show child ++ "L" ++ show name
+  | show child == "lhs" = show child ++ "I" ++ show name
+  | show child == "vis" = show child ++ "I" ++ show name
+  | otherwise           = show child ++ "S" ++ show name
+
+hOutp child name
+  | show child == "loc" = show child ++ "L" ++ show name
+  | show child == "lhs" = show child ++ "S" ++ show name
+  | show child == "vis" = show child ++ "S" ++ show name
+  | otherwise           = show child ++ "I" ++ show name
+
+hOutpLoc child name = show child ++ "L" ++ show name
+hInpLoc child name = show child ++ "L" ++ show name
+
+hInhFldNm nm itf vis = show nm ++ "_Inh_" ++ show itf
+hSynFldNm nm itf vis = show nm ++ "_Syn_" ++ show itf
+hInhFldNmFull nm itf vis = hInhFldNm nm itf vis ++ "_" ++ show vis
+hSynFldNmFull nm itf vis = hSynFldNm nm itf vis ++ "_" ++ show vis
+hCoInhFldNm nm itf vis = hInhFldNm nm (mkCoIdent itf vis) vis
+hCoSynFldNm nm itf vis = hSynFldNm nm (mkCoIdent itf vis) vis
+hCoInhFldNmFull nm itf vis = hCoInhFldNm nm itf vis ++ "_" ++ show vis
+hCoSynFldNmFull nm itf vis = hCoSynFldNm nm itf vis ++ "_" ++ show vis
+
+hInhDt itf vis = "Inh_" ++ show itf ++ "_" ++ show vis
+hSynDt itf vis = "Syn_" ++ show itf ++ "_" ++ show vis
+hCoInhDt itf vis = hInhDt (mkCoIdent itf vis) vis
+hCoSynDt itf vis = hSynDt (mkCoIdent itf vis) vis
+
+hInvNm itf nm = "invoke_" ++ show itf ++ "_" ++ show nm
+hCoInvNm itf nm = "coinvoke_" ++ show itf ++ "_" ++ show nm
+hNextNm itf nm = "next_" ++ show itf ++ "_" ++ show nm
+hCurrentNm itf nm = "current_" ++ show itf ++ "_" ++ show nm
+
+hDtNm nm = show nm
+hConNm dt nm = show dt ++ "_" ++ show nm
+hFldNm dt con nm = show nm ++ "_" ++ show dt ++ "_" ++ show con
+hDtSemNm nm = "dnt_" ++ show nm
+
+hDfltNm nm nr = "dflt_" ++ show nm ++ "_" ++ show nr
+
+hCatch :: (PP a, PP b) => a -> b -> PP_Doc
+hCatch l r = "catchError"
+             >-< indent 2 (pp_parens (pp l))
+             >-< indent 2 (pp_parens (pp r))
+
+hThrow msg = "throwError" >#< pp_parens ("strMsg" >#< show msg)
+}
+
+
+SEM Program | Program
+  loc.hpp = vlist @blocks.hpps
+
+ATTR Block Itf ItfVisit Data Con Field Type AliasType DataSem MaybeBoundCode BoundCode Code
+     Item SemVisit ClausesTop Clauses Clause Stmt Pat ImplStmt Var AttrTypePat AttrTypeCode
+  [ | | hpp : {PP_Doc} ]
+
+ATTR ExprField [ | | hopp : {(Int,PP_Doc)} ]
+
+SEM Block
+  | Section  lhs.hpp = @code.hpp
+  | Itf      lhs.hpp = @itf.hpp
+  | Data     lhs.hpp = if noDataGen @lhs.opts then empty else @data.hpp
+  | Type     lhs.hpp = if noDataGen @lhs.opts then empty else @type.hpp
+  | Item     lhs.hpp = "mk" >|< show @name >#< "::" >#< @item.hppType
+                       >-< "mk" >|< show @name >#< "="
+                       >-< indent 2 @item.hpp
+  | DataSem  lhs.hpp = @sem.hpp
+
+SEM Itf
+  | Itf      lhs.hpp = empty
+  
+             +hpp = ("type" >#< hItfNm @name >#< "m" >#< "=" >#< hItfVsNm @name @visits.firstVisit >#< "m") >-<
+             +hpp = vlist @visits.hpps >-<
+
+SEM ItfVisit
+  | Visit    lhs.hpp      = empty
+             loc.hCtx     = "(Monad m) => "
+             loc.hMonad   = if @cyclic then empty else text "m"
+             loc.hConNm   = text $ hItfVsNm @loc.itfNm @name
+             loc.hCoConNm = text $ hCoItfVsNm @loc.itfNm @name
+             loc.hRepFld  = [ hSynFldNmFull repIdent @loc.itfNm @name >#< "::" >#< "!" >|< pp_parens (@loc.hConNm >#< "m") ]
+             loc.hNextFld = maybe [] (\nm -> [ hSynFldNmFull nextIdent @loc.itfNm @name 
+                                               >#< "::" >#< "!" >|< pp_parens (hItfVsNm @loc.itfNm nm >#< "m")]) @lhs.mbNextVisit
+             loc.hArrTp   = hInhDt @loc.itfNm @name >#< "m" >#< "->" >#< @loc.hMonad >#< pp_parens (hSynDt @loc.itfNm @name >#< "m")
+             loc.hCoArrTp = hCoInhDt @loc.itfNm @name >#< "m" >#< "->" >#< @loc.hMonad >#< pp_parens (hCoSynDt @loc.itfNm @name >#< "m")
+             +hpp = ("newtype" >#< @loc.hCtx >#< @loc.hConNm >#< "m" >#< "=" >#< @loc.hConNm >#< pp_parens @loc.hArrTp) >-<
+             +hpp = ("newtype" >#< @loc.hCtx >#< @loc.hCoConNm >#< "m" >#< "=" >#< @loc.hCoConNm >#< pp_parens @loc.hCoArrTp) >-<
+             +hpp = ("data" >#< @loc.hCtx
+                            >#< hInhDt @loc.itfNm @name >#< "m" >#< "=" >#< hInhDt @loc.itfNm @name
+                            >#< pp_block "{" "}" "," @attrs.hInhDeclPPs) >-<
+             +hpp = ("data" >#< @loc.hCtx
+                            >#< hSynDt @loc.itfNm @name >#< "m" >#< "=" >#< hSynDt @loc.itfNm @name
+                            >#< pp_block "{" "}" "," (@loc.hRepFld ++ @loc.hNextFld ++ @attrs.hSynDeclPPs)
+                            ) >-<
+             +hpp = ("data" >#< @loc.hCtx
+                            >#< hCoInhDt @loc.itfNm @name >#< "m" >#< "=" >#< hCoInhDt @loc.itfNm @name
+                            >#< pp_block "{" "}" "," @attrs.hCoInhDeclPPs) >-<
+             +hpp = ("data" >#< @loc.hCtx
+                            >#< hCoSynDt @loc.itfNm @name >#< "m" >#< "=" >#< hCoSynDt @loc.itfNm @name
+                            >#< pp_block "{" "}" "," (
+                                  (hCoSynFldNmFull repIdent @loc.itfNm @name >#< "::" >#< "!" >|< pp_parens (@loc.hCoConNm >#< "m"))
+                                  : @attrs.hCoSynDeclPPs)
+                             ) >-<
+             +hpp = ("type" >#< hCoItfNm @loc.itfNm @name >#< "m" >#< "=" >#< hCoItfVsNm @loc.itfNm @name >#< "m") >-<
+             
+             +hpp = (hInvNm @loc.itfNm @name >#< "!" >|< pp_parens (@loc.hConNm >#< "!" >|< "__f") >#< "=" >#< "__f") >-<
+             +hpp = (hCoInvNm @loc.itfNm @name >#< "!" >|< pp_parens (@loc.hCoConNm >#< "!" >|< "__f") >#< "=" >#< "__f") >-<
+             +hpp = case @lhs.mbNextVisit of
+                       Nothing -> id
+                       Just v  -> ((hNextNm @loc.itfNm @name >#< "!" >|< pp_parens (
+                                    hSynDt @loc.itfNm @name >#< pp_braces (
+                                      hSynFldNmFull nextIdent @loc.itfNm @name >#< "=" >#< "__f")
+                                  ) >#< "=" >#< "__f" >#< "--" >#< v) >-<)
+             +hpp = ((hCurrentNm @loc.itfNm @name >#< "!" >|< pp_parens (
+                      hSynDt @loc.itfNm @name >#< pp_braces (hSynFldNmFull repIdent @loc.itfNm @name >#< "=" >#< "__f")
+                    ) >#< "=" >#< "__f") >-<)
+
+{
+nextIdent :: Ident
+nextIdent = ident "next_"
+
+repIdent :: Ident
+repIdent = ident "rep_"
+}
+
+ATTR Attrs Attr [ | | hInhDeclPPs,hSynDeclPPs,hCoInhDeclPPs,hCoSynDeclPPs USE {++} {[]} : {[PP_Doc]}]
+
+SEM Attr
+  | Inh Syn  loc.hTpPP         = stripSpacing @type
+             loc.pos           = identPos @name
+             loc.hBoxed        = if @lhs.visCyclic then empty else text "!"
+  | Inh      loc.hFldNm        = hInhFldNm @name @loc.itfNm @loc.visNm
+             lhs.hInhDeclPPs   = [hWrapLinePragma @lhs.opts (identPos @name) (@loc.hFldNm >#< "::" >#< @loc.hBoxed >|< @loc.hTpPP)]
+  | Syn      loc.hFldNm        = hSynFldNm @name @loc.itfNm @loc.visNm
+             lhs.hSynDeclPPs   = [hWrapLinePragma @lhs.opts (identPos @name) (@loc.hFldNm >#< "::" >#< @loc.hBoxed >|< @loc.hTpPP)]
+
+  | Inh      loc.hCoFldNm      = hCoSynFldNm @name @loc.itfNm @loc.visNm
+             lhs.hCoSynDeclPPs = [hWrapLinePragma @lhs.opts (identPos @name) (@loc.hCoFldNm >#< "::" >#< @loc.hBoxed >|< @loc.hTpPP)]
+  | Syn      loc.hCoFldNm      = hCoInhFldNm @name @loc.itfNm @loc.visNm
+             lhs.hCoInhDeclPPs = [hWrapLinePragma @lhs.opts (identPos @name) (@loc.hCoFldNm >#< "::" >#< @loc.hBoxed >|< @loc.hTpPP)]
+
+{
+stripSpacing :: String -> PP_Doc
+stripSpacing = pp_block "(" ")" " " . map text . lines
+}
+
+SEM Data | Data
+  lhs.hpp   = "data" >#< hDtNm @name >#< hlist_sp @vars.hpps >-< indent 2 (vlist @cons.hpps) >-< indent 2 @loc.hExts
+  loc.hExts = if Set.null @exts.gathExts
+              then empty
+              else "deriving" >#< pp_block "(" ")" "," [ text (show i) | i <- Set.toList @exts.gathExts ]
+
+SEM Con | Con
+  loc.prefix  = if @lhs.isFirst then "=" else "|"
+  lhs.hpp     = @loc.prefix >#< @loc.hVarsPP >#< hConNm @lhs.data @name >#< pp_block "{" "}" "," @fields.hpps
+  loc.hVarsPP = if null @vars.vars
+                then empty
+                else "forall" >#< hlist_sp (map (text .show) @vars.vars) >#< "."
+
+SEM Field | Field
+  loc.txtTp = either show id @type.fldType
+  lhs.hpp   = hFldNm @lhs.data @lhs.con @name >#< "::" >#< "!" >|< hParensWithPos @lhs.opts (identPos @name) (stripSpacing @loc.txtTp)
+
+ATTR Cons Con [ isFirst : Bool | | ]
+SEM Data | Data  cons.isFirst = True
+SEM Cons | Cons  tl.isFirst = False
+
+SEM Type | Alias
+  lhs.hpp = "type" >#< @name >#< hlist_sp @vars.hpps >#< "=" >#< @type.hpp
+
+SEM AliasType
+  | Prod   lhs.hpp = pp_block "(" ")" "," (map (text . show) @fields)
+  | List   lhs.hpp = pp_brackets $ text $ show @type
+  | Maybe  lhs.hpp = "Maybe" >#< pp_parens (text $ show @type)
+
+SEM DataSem | Sem
+  lhs.hpp = hDtSemNm @tp >#< "::" >#< @loc.hppType
+            >-< hDtSemNm @tp >#< "="
+            >-< indent 4 @clauses.hpp
+  loc.hppType = case @mbMonad of
+                  Nothing -> "(Monad m, MonadError e m, Error e) => " >#< hItfNm @tp >#< "m"
+                  Just t  -> hItfNm @tp >#< pp_parens (stripSpacing t)
+
+SEM BoundCode
+  | Code         lhs.hpp = @code.hpp  -- deal with binder etc in parent
+
+SEM MaybeBoundCode
+  | Nothing      lhs.hpp = empty
+
+SEM Code
+  | Code         lhs.hpp = vlist @items.hpps
+
+SEM Item
+  | Plain        lhs.hpp = if all isSpace @txt
+                           then empty
+                           else vlist $ modifySpacing @loc.diff @lhs.indent @txt
+  | Attr         lhs.hpp = addSpaces @loc.diff $ @tp.hpp
+  | Sem CoSem    lhs.hpp = addSpaces @loc.diff ( pp_parens (
+                             "let" >#< (hNt @name >#< "::" >#< @loc.hppType)
+                             >-< indent 4 (hNt @name >#< "=")
+                             >-< indent 6 @first.hpp
+                             >-< "in" >#< hNt @name ))
+  | DataSem      lhs.hpp = @sem.hpp
+  | Detach       lhs.hpp = addSpaces @loc.diff (text $ hSemNm @name @visit)
+  | Brackets     lhs.hpp = addSpaces @loc.diff (text "{")
+                           >-< vlist @items.hpps
+                           >-< addSpaces @loc.diff2 (text "}")
+  | Construct    lhs.hpp      = addSpaces @loc.diff (pp_parens @loc.hpp)
+                 loc.hFldsPPs = sortPairs @fields.hopps
+                 loc.hpp = case @mbAlias of
+                             Nothing    -> hConNm @data @con >#< hlist_sp @loc.hFldsPPs
+                             Just alias -> case alias of
+                                             AliasType_Prod _  -> pp_block "(" ")" "," @loc.hFldsPPs
+                                             AliasType_List _  -> if @con == ident "Cons"
+                                                                  then "(:)" >#< hlist_sp @loc.hFldsPPs
+                                                                  else text "[]"
+                                             AliasType_Maybe _ -> if @con == ident "Nothing"
+                                                                  then "Just" >#< hlist_sp @loc.hFldsPPs
+                                                                  else text "Nothing"
+
+{
+hWrapLinePragma :: PP a => Opts -> Pos -> a -> PP_Doc
+hWrapLinePragma opts pos doc
+  | isJust (outputFile opts) && not (hNoLinePragmas opts)
+      = let nrIn  = line pos
+            nmIn  = file pos
+            nmOut = fromJust (outputFile opts)
+        in ""
+           >-< "{-# LINE" >#< show nrIn >#< show nmIn >#< "#-}"
+           >-< doc
+           >-< "{-# LINE" >#< ppWithLineNr (\n -> pp $ show $ n + 1) >#< show nmOut >#< "#-}"
+           >-< ""
+  | otherwise = pp doc
+}
+
+ATTR Item [ | | hppType : PP_Doc ]
+SEM Item
+  | Plain Attr Detach Brackets Construct
+           loc.hppType = text "{- cannot be used toplevel -}"
+  | Sem    loc.hppType = case @mbMonad of
+                           Nothing -> "(Monad m, MonadError e m, Error e) => " >#< hItfNm @tp >#< "m"
+                           Just t  -> hItfNm @tp >#< pp_parens (stripSpacing t)
+  | CoSem  loc.hppType = case @mbMonad of
+                           Nothing -> "(Monad m, MonadError e m, Error e) => " >#< hCoItfNm @tp @visit >#< "m"
+                           Just t  -> hCoItfNm @tp @visit >#< pp_parens (stripSpacing t)
+  | DataSem
+           loc.hppType = text "{- no type signature for nested datatype semantics -}"
+
+SEM SemVisit
+  | Visit        loc.hChildren = hlist_sp [ hSemNm k v | (k, Just v) <- Map.assocs @loc.myNextVisits ]
+                 loc.hChns     = [ hParensWithPos @lhs.opts @pos $ hInp visIdent nm | (nm,_) <- Map.assocs @attrs.gathVisitLocalAttrs ]
+                 loc.hChnsOut  = [ hParensWithPos @lhs.opts @pos $ hOutp @name nm | (nm,_) <- Map.assocs @attrs.gathVisitLocalAttrs ]
+                 loc.hInhPPs   = [ hInhFldNm nm @loc.itfNm @name >#< "=" >#< hParensWithPos @lhs.opts @pos (hInp lhsIdent nm)
+                                 | (nm,_) <- Map.assocs @loc.inhAttrMap ]
+                 loc.hMatch    = pp_parens (hInhDt @loc.itfNm @name >#< pp_block "{" "}" "," @loc.hInhPPs)
+                 loc.hVisType  = if @lhs.withinCoSem
+                                 then text (hCoItfVsNm @lhs.coItf @name)
+                                 else text (hItfVsNm @loc.itfNm @name)
+                 lhs.hpp = pp_parens (
+                             "let -- __vis ::" >#< @loc.hVisType 
+                             >-< "    __vis =" >#< (
+                               "let" >#< ( hVis @name >#< @loc.hChildren >#< @loc.hChns >#< @loc.hMatch
+                                         >-< indent 2 (
+                                           "=" >#< ( if @loc.fullCyclic
+                                                     then "let" >#< vlist (concat @loc.hGroupedStmts)
+                                                          >-< "in" >#< @clauses.hpp
+                                                     else "do" >#< (
+                                                            hppStmtBlock @loc.hGroupedStmts
+                                                            >-< @clauses.hpp
+                                                          )
+                                                   )
+                                           )
+                                         )
+                               >-< "in" >#< hItfVsNm @loc.itfNm @name >#<
+                                     pp_parens (hVis @name >#< @loc.hChildren >#< @loc.hChnsOut)
+                             ) >-< "in __vis"
+                           )
+  | Internal     lhs.hpp = hppStmtBlock @loc.hGroupedStmts
+                           >-< @clauses.hpp
+  | End          lhs.hpp = if @lhs.fullCyclic
+                           then vlist @loc.hGroupedStmts  -- assume these end up in a let-block or do-block
+                           else hppStmtBlock @loc.hGroupedStmts
+
+{
+hppStmtBlock :: PP a => [[a]] -> PP_Doc
+hppStmtBlock = vlist . map ppComp
+  where ppComp []  = empty
+        ppComp [x] = pp x
+        ppComp xs  = "let" >#< vlist (map pp xs)
+}
+
+SEM Clauses
+  | Cons         lhs.hpp = if @lhs.fullCyclic
+                           then @hd.hpp  -- only one clause
+                           else pp_parens (hCatch @hd.hpp ("\\_ -> " >#< @tl.hpp))
+  | Nil          lhs.hpp = if @lhs.fullCyclic
+                           then text "undefined" -- never generated when there is only one clause
+                           else pp_parens (hThrow ("no applicable clause for " ++ show (head @lhs.itf) ++ "." ++ show @lhs.visit))
+
+SEM Clause
+  | Clause       loc.hChildren = hlist_sp [ hSemNm k v | (k, Just v) <- Map.assocs @lhs.myNextVisits ]
+                 loc.hChns     = hlist_sp [ hParensWithPos @lhs.opts @pos $ hInp visIdent nm
+                                          | (nm,_) <- Map.assocs @lhs.directVisitLocalAttrs ]
+                 loc.hNext     = maybe [] (\nm -> [ hSynFldNmFull nextIdent @loc.itfNm @lhs.visit >#< "= _visNext" ]) @next.mbNextVisit
+                 loc.hVisLocs  =  [ hInp visIdent @lhs.visit >#< "=" >#< hParensWithPos @lhs.opts @pos (hOutp visIdent nm)
+                                  | (nm,_) <- Map.assocs @lhs.directVisitLocalAttrs ]
+                 loc.hRestart  = "_visRestart =" >#< hItfVsNm @loc.itfNm @lhs.visit
+                                 >#< pp_parens (hVis @lhs.visit >#< @loc.hChildren >#< @loc.hChns)
+                 loc.hResVal   = pp_parens ( hSynDt @loc.itfNm @lhs.visit
+                                   >#< pp_block "{" "}" "," ( [hSynFldNmFull repIdent @loc.itfNm @lhs.visit >#< "= _visRestart" ] ++
+                                                               @loc.hNext ++
+                                                               [ hSynFldNm nm @loc.itfNm @lhs.visit >#< "=" >#<
+                                                                 hParensWithPos @lhs.opts @pos (hOutp lhsIdent nm)
+                                                                 | (nm,_) <- Map.assocs @loc.synAttrMap ] ))
+                 lhs.hpp = if @lhs.fullCyclic
+                           then "let" >#< (
+                                  vlist (concat @loc.hGroupedStmts)
+                                  >-< vlist @loc.hVisLocs
+                                  >-< @loc.hRestart
+                                  >-< case @next.mbNextVisit of
+                                        Nothing -> @next.hpp  -- remaining stmts
+                                        Just _  -> "_visNext" >#< "=" >#< @next.hpp
+                                )
+                                >-< "in" >#< @loc.hResVal
+                           else "do" >#< (
+                                 hppStmtBlock @loc.hGroupedStmts
+                                 >-< if @loc.isDeepest
+                                     then vlist (map ("let" >#<) @loc.hVisLocs)
+                                           >-< "let" >#< ( "!" >|< @loc.hRestart
+                                                 >-< case @next.mbNextVisit of
+                                                       Nothing -> empty
+                                                       Just _  -> "!" >|< "_visNext" >#< "=" >#< @next.hpp
+                                               )
+                                           >-< case @next.mbNextVisit of
+                                                 Nothing -> @next.hpp
+                                                 Just _  -> empty
+                                           >-< "return" >#< @loc.hResVal
+                                     else @next.hpp  -- continue with the deeper clauses
+                               )
+
+{
+hParensWithPos :: PP a => Opts -> Pos -> a -> PP_Doc
+hParensWithPos opts pos doc
+  = ""
+    >-< "("
+    >-< indent 2 (hWrapLinePragma opts pos doc)
+    >-< " )"
+    >-< ""
+}
+
+SEM Stmt
+  | Eval         loc.infoComment = "-- eval stmt:" >#< show (line @loc.pos) >#< ", rank:" >#< @loc.rank
+                                     >#< ", dest: " >#< show @loc.destVisit
+                 lhs.hpp = hWrapLinePragma @lhs.opts @loc.pos $
+                           if @loc.isCyclic
+                           then ppBindPos @lhs.opts @loc.pos @loc.isCyclic @pat.hpp @code.hpp >#< "-- rank:" >#< show @loc.rank
+                           else if @mode.isMatch
+                                then ppBindPos @lhs.opts @loc.pos False @pat.hpp (hppWrapRet @code.isFun @code.hpp)
+                                            >#< @loc.infoComment
+                                else ppBindPos @lhs.opts @loc.pos False ("!" >|< "__fresh") (hppWrapRet @code.isFun @code.hpp)
+                                     >-< "let" >#< pp_parens @pat.hpp >#< "= __fresh" >#< @loc.infoComment
+  | Attach       loc.infoComment = "-- attach stmt:" >#< show (line @pos) >#< ", rank:" >#< @loc.rank
+                 lhs.hpp = ppBind @loc.isCyclic (hSemNm @name @loc.visit) @loc.hRhsCode >#< @loc.infoComment
+                 loc.hRhsCode = if @code.isJust
+                                then hppWrapRet @code.isFun @code.hpp
+                                else "return" >#< pp_parens (text $ hDtSemNm @type)
+  | Invoke       loc.infoComment = "-- invoke stmt:" >#< show (line @pos) >#< ", rank:" >#< @loc.rank
+                 loc.hBang = if @loc.behaveCyclic then empty else text "!"
+                 lhs.hpp   = (if @loc.isCyclic
+                              then vlist (concat @loc.hGroupedStmts)
+                              else hppStmtBlock @loc.hGroupedStmts)
+                             >-< if @code.isJust
+                                 then ppBind @loc.isCyclic @loc.hPat ("let" >#< @loc.hIter >-< "in" >#< @loc.hRhs) >#< @loc.infoComment
+                                 else ppBind @loc.isCyclic (@loc.hBang >|< @loc.hPat)
+                                           ((\p -> if not @loc.isCyclic && @loc.behaveCyclic then "return" >#< pp_parens p else p) (
+                                             ("let" >#< @loc.hBang >|< pp_parens (hItfVsNm @loc.unqualChildItf @visit
+                                                                                    >#< "!" >|< "__f")
+                                                    >#< "=" >#< hSemNm @name @visit
+                                              >-< "in" >#< "__f" >#< @loc.hfInps)))
+                                        >#< @loc.infoComment
+                 loc.hRhsCode = if @code.isJust
+                                then @code.hpp
+                                else "return" >#< pp_parens ("mk" >|< noIterNm @loc.unqualChildItf @visit)
+                 loc.hIter = "__iter" >#< "!" >|< pp_parens (hItfVsNm @loc.unqualChildItf @visit >#< "!" >|< "__f")
+                                      >#< @loc.hfInps
+                             >-< indent 2 ( "=" >#< "do" >#< (
+                                   "!" >|< ppBind False (hCoItfVsNm @loc.unqualChildItf @visit >#< "!" >|< "__g") @loc.hRhsCode
+                                   >-< ppBind @loc.behaveCyclic (@loc.hBang >|< "__res@" >|< @loc.hfOuts) ("__f" >#< @loc.hfInps)
+                                   >-< hCatch ("do" >#< (
+                                                         @loc.hBang >|< ppBind False @loc.hgOuts ("__g" >#< @loc.hgInps)
+                                                         >-< "__iter" >#< "__f" >#< @loc.hfInps
+                                                       ))
+                                              (text "const (return __res)")
+                                 ))
+                 loc.hfInps = pp_parens (hInhDt @loc.unqualChildItf @visit >#< pp_block "{" "}" ","
+                                [ hInhFldNm nm @loc.unqualChildItf @visit >#< "=" >#<
+                                    hParensWithPos @lhs.opts @pos (hOutp @name nm)
+                                | (nm,_) <- Map.assocs @loc.inhAttrMap ] )
+                 loc.hfOuts = pp_parens (hSynDt @loc.unqualChildItf @visit >#< pp_block "{" "}" ","
+                                ( (hSynFldNmFull repIdent @loc.unqualChildItf @visit >#< "=" >#< "__f") :
+                                [ hSynFldNm nm @loc.unqualChildItf @visit >#< "=" >#<
+                                    hParensWithPos @lhs.opts @pos (hInp @name nm)
+                                | (nm,_) <- Map.assocs @loc.synAttrMap ] ))
+                 loc.hgInps = pp_parens (hCoInhDt @loc.unqualChildItf @visit >#< pp_block "{" "}" ","
+                                [ hCoInhFldNm nm @loc.unqualChildItf @visit >#< "=" >#<
+                                    hParensWithPos @lhs.opts @pos (hInp @name nm)
+                                | (nm,_) <- Map.assocs @loc.synAttrMap ] )
+                 loc.hgOuts = pp_parens (hCoSynDt @loc.unqualChildItf @visit >#< pp_block "{" "}" ","
+                                [ hCoSynFldNm nm @loc.unqualChildItf @visit >#< "=" >#<
+                                    hParensWithPos @lhs.opts @pos (hOutp @name nm)
+                                | (nm,_) <- Map.assocs @loc.inhAttrMap ] )
+                 loc.hRhs  = "__iter" >#< hSemNm @name @visit >#< @loc.hfInps
+                 loc.hPat  = pp_parens (
+                               hSynDt @loc.unqualChildItf @visit >#< pp_block "{" "}" "," (
+                                 ( maybe [] (\nm -> [ hSynFldNmFull nextIdent @loc.unqualChildItf @visit >#< "=" >#< hSemNm @name nm ])
+                                   @loc.mbNextVisit) ++
+                                 [ hSynFldNm nm @loc.unqualChildItf @visit >#< "=" >#< hInp @name nm
+                                 | (nm,_) <- Map.assocs @loc.synAttrMap ]
+                             ))
+  | Default      loc.infoComment = "-- default stmt:" >#< show (line @pos) >#< ", rank:" >#< @loc.rank
+                 lhs.hpp = if @loc.isCyclic
+                           then ppBind True (text $ hDfltNm @name @loc.codeId) @mbCode.hpp >#< @loc.infoComment
+                           else if @mbCode.isJust
+                                then ppBindPos @lhs.opts @pos False ("!" >|< "__fresh") (hppWrapRet @mbCode.isFun @mbCode.hpp)
+                                       >-< "let" >#< pp_parens (text $ hDfltNm @name @loc.codeId) >#< "= __fresh" >#< @loc.infoComment
+                                else empty
+  | Rename       lhs.hpp = empty
+
+SEM ImplStmt
+  | Invoke
+       loc.hBang = if @loc.behaveCyclic then empty else text "!"
+       lhs.hpp =   (if @loc.isCyclic
+                     then vlist (concat @loc.hGroupedStmts)
+                     else hppStmtBlock @loc.hGroupedStmts)
+                   >-< ppBind @loc.isCyclic
+                              (@loc.hBang >|< @loc.hPat)
+                              ((\p -> if not @loc.isCyclic && @loc.behaveCyclic then "return" >#< pp_parens p else p) (
+                              "let" >#< @loc.hBang >|< pp_parens (hItfVsNm @itf @visit >#< "!" >|< "__f")
+                                     >#< "=" >#< hSemNm @child @visit
+                               >-< "in" >#< "__f" >#< @loc.hfInps))
+                         >#< "-- implicit invoke: " >#< show @child >|< "." >|< show @visit
+       loc.hfInps = pp_parens (hInhDt @itf @visit >#< pp_block "{" "}" ","
+                      [ hInhFldNm nm @itf @visit >#< "=" >#<
+                          hParensWithPos @lhs.opts @pos (hOutp @child nm)
+                      | (nm,_) <- Map.assocs @loc.inhAttrMap ] )
+       loc.hPat  = pp_parens (
+                     hSynDt @itf @visit >#< pp_block "{" "}" "," (
+                       ( maybe [] (\nm -> [ hSynFldNmFull nextIdent @itf @visit >#< "=" >#< hSemNm @child nm ])
+                         @loc.mbNextVisit) ++
+                       [ hSynFldNm nm @itf @visit >#< "=" >#< hParensWithPos @lhs.opts @pos (hInp @child nm)
+                       | (nm,_) <- Map.assocs @loc.synAttrMap ]
+                   ))
+  
+  | DefaultChild
+      lhs.hpp = @loc.hPrefix >|< hParensWithPos @lhs.opts @pos (hOutp @child @name)
+                >#< "=" >#< pp_parens @loc.hApp >#< "-- default rule for inh: " >#< show @child >|< "." >|< show @name
+  | DefaultSyn
+      lhs.hpp = @loc.hPrefix >|< hParensWithPos @lhs.opts @pos (hOutp lhsIdent @name)
+                >#< "=" >#< pp_parens @loc.hApp >#< "-- default rule for syn: " >#< show lhsIdent >|< "." >|< show @name
+
+  | DefaultChild DefaultSyn
+      loc.hApp  = @loc.hFun >#< pp_block "[" "]" "," (reverse @loc.hInps)
+      loc.hInps = (if @loc.lhsHasAttr then [text $ hInp lhsIdent @name] else []) ++ map (\(c,a) -> text $ hInp c a) @loc.childAttrs
+      loc.hFun  = case @mbCodeRef of
+                    Nothing  -> text "head"
+                    Just ref -> hParensWithPos @lhs.opts @pos $ hDfltNm @name ref
+  | DefaultVisLocal
+      lhs.hpp = @loc.hPrefix >|< hParensWithPos @lhs.opts @pos (hOutp visIdent @name) >#< "="
+                >#< hParensWithPos @lhs.opts @pos (hInp visIdent @name)
+                >#< "-- default rule for vis-local: " >#< show @name
+  
+  | DefaultChild DefaultSyn DefaultVisLocal
+      loc.hPrefix = if @loc.isCyclic then empty else text "let "
+
+{
+ppBind :: (PP a, PP b) => Bool -> a -> b -> PP_Doc
+ppBind True  pat expr = pp_parens (pp pat) >#< "="  >-< indent 2 (pp_parens (pp expr))
+ppBind False pat expr = pp_parens (pp pat) >#< "<-" >-< indent 2 (pp_parens (pp expr))
+
+ppBindPos :: (PP a, PP b) => Opts -> Pos -> Bool -> a -> b -> PP_Doc
+-- ppBindPos _ _ = ppBind
+ppBindPos opts pos True pat expr  = hWrapLinePragma opts pos (pp pat) >#< "="  >-< indent 2 (hWrapLinePragma opts pos (pp expr))
+ppBindPos opts pos False pat expr = hWrapLinePragma opts pos (pp pat) >#< "<-" >-< indent 2 (hWrapLinePragma opts pos (pp expr))
+
+hppWrapRet :: PP a => Bool -> a -> PP_Doc
+hppWrapRet True d  = "return" >#< pp_parens (pp d)
+hppWrapRet False d = pp d
+}
+
+SEM Pat
+  | Con          lhs.hpp = @loc.hBang >|< hParensWithPos @lhs.opts (identPos @name) (@name >#< hlist_sp @pats.hpps)
+  | AttrCon      lhs.hpp          = @loc.hBang >|< (pp_parens @loc.hpp)
+                 loc.hFldsPPs     = [ hParensWithPos @lhs.opts (identPos @name) (hOutpLoc @name nm) | (nm,_) <- @loc.fields ]
+                 loc.hBangFldsPPs = map (@loc.hBang >|<) @loc.hFldsPPs
+                 loc.hpp = case @mbAlias of
+                             Nothing    -> hConNm @dt @con >#< hlist_sp @loc.hFldsPPs
+                             Just alias -> case alias of
+                                             AliasType_Prod _  -> pp_block "(" ")" "," @loc.hBangFldsPPs
+                                             AliasType_List _  -> if @con == ident "Cons"
+                                                                  then "(:)" >#< hlist_sp @loc.hBangFldsPPs
+                                                                  else text "[]"
+                                             AliasType_Maybe _ -> if @con == ident "Nothing"
+                                                                  then text "Nothing"
+                                                                  else "Just" >#< hlist_sp @loc.hBangFldsPPs
+  | Attr         lhs.hpp = @loc.hBang >|< hParensWithPos @lhs.opts (identPos @child) @tp.hpp
+  | Tup          lhs.hpp = @loc.hBang >|< pp_block "(" ")" "," @pats.hpps
+  | List         lhs.hpp = @loc.hBang >|< pp_block "[" "]" "," @pats.hpps
+  | Cons         lhs.hpp = @loc.hBang >|< pp_parens (@hd.hpp >#< ":" >#< pp_parens @tl.hpp)
+  | Underscore   lhs.hpp = @loc.hBang >|< text "_"
+  | *            loc.hBang = if @lhs.isCyclic then empty else text "!"
+
+SEM ExprField | Field
+  lhs.hopp = (@loc.fieldIndex, pp_parens @code.hpp)
+
+SEM Var | Var
+  lhs.hpp = text (show @name)
+
+
+SEM AttrTypePat
+  | ProdLocal  lhs.hpp = text $ hOutpLoc @lhs.child @lhs.name
+  | VisLocal Lhs Child Visit
+               lhs.hpp = text $ hOutp @lhs.child @lhs.name
+
+SEM AttrTypeCode
+  | ProdLocal  lhs.hpp = text $ hInpLoc @lhs.child @lhs.name
+  | VisLocal Lhs Child Visit
+               lhs.hpp = text $ hInp @lhs.child @lhs.name
+
+
+ATTR BlocksTop Blocks ItfVisits Items Pats Cons Fields Vars
+  [ | | hpps : {[PP_Doc]} ]
+
+SEM BlocksTop
+  | Top   lhs.hpps = @blocks.hpps ++ (if noDataGen @lhs.opts then [] else @extra.hpps)
+  | None  lhs.hpps = []
+
+SEM Blocks
+  | Cons  lhs.hpps = @hd.hpp : @tl.hpps
+  | Nil   lhs.hpps = []
+
+SEM ItfVisits
+  | Cons  lhs.hpps = @hd.hpp : @tl.hpps
+  | Nil   lhs.hpps = []
+
+SEM Cons
+  | Cons  lhs.hpps = @hd.hpp : @tl.hpps
+  | Nil   lhs.hpps = []
+
+SEM Fields
+  | Cons  lhs.hpps = @hd.hpp : @tl.hpps
+  | Nil   lhs.hpps = []
+
+SEM Items
+  | Cons  lhs.hpps = @hd.hpp : @tl.hpps
+  | Nil   lhs.hpps = []
+
+SEM Pats
+  | Cons  lhs.hpps = @hd.hpp : @tl.hpps
+  | Nil   lhs.hpps = []
+
+SEM Vars
+  | Cons  lhs.hpps = @hd.hpp : @tl.hpps
+  | Nil   lhs.hpps = []
+
+
+--
+-- Compute spread of stmts
+--
+
+ATTR AllFinal [ hSpilledStmts : {[(Int,PP_Doc)]} | | ]
+SEM Program | Program  blocks.hSpilledStmts = []
+
+SEM SemVisit | Visit Internal
+  (loc.hoStmts, clauses.hSpilledStmts) = partition (rankIsLower @clauses.minRank)
+                                           (@lhs.hSpilledStmts ++ @impls.hopps ++ @stmts.hopps)
+  loc.hGroupedStmts = groupPairs @loc.hoStmts
+
+SEM SemVisit | End
+  loc.hGroupedStmts = groupPairs @lhs.hSpilledStmts
+
+SEM Clause | Clause
+  (loc.hoStmts, next.hSpilledStmts) = partition (rankIsLower @next.minRank)
+                                        (@lhs.hSpilledStmts ++ @deflts.hopps ++ @impls.hopps ++ @stmts.hopps)
+
+  loc.hGroupedStmts = groupPairs @loc.hoStmts
+
+SEM Stmt | Invoke      loc.hGroupedStmts = groupPairs @deflts.hopps
+SEM ImplStmt | Invoke  loc.hGroupedStmts = groupPairs @deflts.hopps
+
+
+{
+rankIsLower :: Int -> (Int, PP_Doc) -> Bool
+rankIsLower m (n,_) = n < m
+}
+
+--
+-- Certain fields need to be ordered
+--
+
+ATTR Stmts ImplStmts
+  [ | | hopps : {[(Int, PP_Doc)]} ]
+
+SEM ImplStmts
+  | Cons  lhs.hopps = (@hd.rank, @hd.hpp) : @tl.hopps
+  | Nil   lhs.hopps = []
+
+SEM Stmts
+  | Cons  lhs.hopps = (@hd.rank, @hd.hpp) : @tl.hopps
+  | Nil   lhs.hopps = []
+
+ATTR ExprFields
+  [ | | hopps : {[(Int,PP_Doc)]} ]
+
+SEM ExprFields
+  | Cons  lhs.hopps = @hd.hopp : @tl.hopps
+  | Nil   lhs.hopps = []
+
+{
+sortPairs :: [(Int,a)] -> [a]
+sortPairs = map snd . sortBy (\(x,_) (y,_) -> x `compare` y)
+
+groupPairs :: [(Int,a)] -> [[a]]
+groupPairs = map (map snd) . groupBy (\(x,_) (y,_) -> x == y) . sortBy (\(x,_) (y,_) -> x `compare` y)
+}
diff --git a/src/TargetJs.ag b/src/TargetJs.ag
new file mode 100644
--- /dev/null
+++ b/src/TargetJs.ag
@@ -0,0 +1,425 @@
+-- This file is included by Transform.ag
+-- Based on the AST of AstAG.ag
+-- Generates code for Javascript
+
+SEM Program | Program
+  +pp = if genJs @lhs.opts
+        then (@loc.jspp >-<)
+        else id
+
+{
+jsInp child name
+  | show child == "loc" = show child ++ "L" ++ show name
+  | show child == "lhs" = show child ++ "I" ++ show name
+  | show child == "vis" = show child ++ "I" ++ show name
+  | otherwise           = show child ++ "S" ++ show name
+
+jsOutp child name
+  | show child == "loc" = show child ++ "L" ++ show name
+  | show child == "lhs" = show child ++ "S" ++ show name
+  | show child == "vis" = show child ++ "S" ++ show name
+  | otherwise           = show child ++ "I" ++ show name
+
+jsDtSemNm nm = "dnt_" ++ show nm
+
+jsVis nm vis = "vis_" ++ show nm ++ "_" ++ show vis
+
+jsConNm dt nm = show dt ++ "_" ++ show nm
+}
+
+SEM Program | Program
+  loc.jspp = vlist @blocks.jspps
+
+ATTR Block Itf ItfVisit Data Con Field Type AliasType DataSem MaybeBoundCode BoundCode Code
+     Item SemVisit ClausesTop Clauses Clause Stmt Pat ImplStmt Var AttrTypePat AttrTypeCode
+  [ | | jspp : {PP_Doc} ]
+
+ATTR ExprField [ | | jsopp : {(Int,PP_Doc)} ]
+
+SEM Block
+  | Section  lhs.jspp = @code.jspp
+  | Itf      lhs.jspp = @itf.jspp
+  | Data     lhs.jspp = @data.jspp
+  | Type     lhs.jspp = empty
+  | Item     lhs.jspp = "var mk" >|< show @name >#< "=" >-< indent 2 @item.jspp
+  | DataSem  lhs.jspp = @sem.jspp
+
+SEM Itf
+  | Itf      lhs.jspp = vlist @visits.jspps
+
+SEM ItfVisit
+  | Visit    lhs.jspp = empty
+             loc.jsInhNm = "Inh_" >|< jsConNm @loc.itfNm @name
+             loc.jsSynNm = "Syn_" >|< jsConNm @loc.itfNm @name
+             +jspp = ("function" >#< @loc.jsInhNm >#< "() {}"
+                     >-< @loc.jsInhNm >|< ".prototype.check = function()"
+                     >-< indent 2 (pp_braces (
+                           vlist [ jsTpCheck nm tp | (nm,tp) <- Map.assocs @attrs.gathVisitInhAttrs ]
+                         ))
+                     >-< "function" >#< @loc.jsSynNm >#< "() {}"
+                      >-< @loc.jsSynNm >|< ".prototype.check = function()"
+                      >-< indent 2 (pp_braces (
+                            vlist [ jsTpCheck nm tp | (nm,tp) <- Map.assocs @attrs.gathVisitSynAttrs ]
+                          ))
+                     ) >-<
+
+{
+jsTpCheck nm tp
+  = "var _val = this." >|< show nm >|< ";"
+    >-< "if (_val === undefined) { throw \"Undefined attribute: " >|< show nm >|< "\"; }"
+    >-< if all isSpace tp
+        then empty
+        else "var _assert =" >#< tp >#< ";"
+             >-< "if (!_assert) { throw \"Assert function undefined\"; }"
+             >-< "var _outcome = _assert(_val);"
+             >-< "if (!_outcome) { throw \"Attribute fails predicate: " >|< show nm >|< "\"; }"
+}
+
+SEM Data | Data
+  lhs.jspp = "function" >#< show @name >#< "() {}"
+             >-< vlist @cons.jspps
+
+SEM Con | Con
+  lhs.jspp = "function" >#<  jsConNm @lhs.data @name
+                 >#< pp_block "(" ")" "," @fields.jspps
+             >-< pp_braces (
+                   vlist [ "this." >|< nmPP >#< "=" >#< nmPP >|< ";" | nmPP <- @fields.jspps ]
+                   >-< vlist @fields.jsChecksPPs
+                 )
+             >-< jsConNm @lhs.data @name >|< ".prototype = new " >#< show @lhs.data >|< "();"
+             >-< jsConNm @lhs.data @name >|< ".prototype.constructor =" >#< jsConNm @lhs.data @name >|< ";"
+
+ATTR Fields Field [ | | jsChecksPPs USE {++} {[]} : {[PP_Doc]} ]
+ATTR FieldType [ | | jsCheckPP : {Maybe PP_Doc} ]
+
+SEM Field | Field
+  lhs.jspp = text $ show @name
+  lhs.jsChecksPPs = [ "var _val = " >#< show @name >|< ";"
+                      >-< "if (_val === undefined) { throw \"Field undefined: " >|< show @name >|< "\";}"
+                      >-< case @type.jsCheckPP of
+                            Nothing -> text "_outcome = true;"
+                            Just p  -> p
+                      >-< "if" >#< pp_parens ("!_outcome")
+                      >#< pp_braces ("throw \"Field fails predicate: " >|< show @name >|< "\";") ]
+
+SEM FieldType
+  | Term     lhs.jsCheckPP = if all isSpace @type
+                             then Nothing
+                             else Just ("var _assert =" >#< @type >|< ";"
+                                  >-< "if (!_assert) { throw \"assert function undefined\"; }"
+                                  >-< "var _outcome = _assert(_val);")
+  | Nonterm  lhs.jsCheckPP = case @loc.mbAlias of
+                               Nothing -> Just ("var _outcome = _val instanceof" >#< show @name >|< ";")
+                               Just alias -> case alias of
+                                                AliasType_Prod _  -> Just $ text ("var _outcome = _val instanceof Tuple;")
+                                                AliasType_List _  -> Just $ text ("var _outcome = _val instanceof Array;")
+                                                AliasType_Maybe _ -> Just $ text ("var _outcome = _val instanceof Maybe;")
+
+SEM Type | Alias
+  lhs.jspp = empty
+
+SEM AliasType
+  | Prod   lhs.jspp = empty
+  | List   lhs.jspp = empty
+  | Maybe  lhs.jspp = empty
+
+SEM DataSem | Sem
+  lhs.jspp = "var dnt_" >|< show @tp >#< "="
+             >#< pp_parens ( "function ()"
+                         >-< pp_braces (
+                               "var" >#< "nt" >|< show @tp >#< "=" >#< @clauses.jspp >|< ";"
+                                >-< "return" >#< "nt" >|< show @tp >|< ";"
+                         )) >|< ";"
+
+SEM BoundCode
+  | Code         lhs.jspp = @code.jspp  -- deal with binder etc in parent
+
+SEM MaybeBoundCode
+  | Nothing      lhs.jspp = empty
+
+SEM Code
+  | Code         lhs.jspp = vlist @items.jspps
+
+SEM Item
+  | Plain        lhs.jspp = if all isSpace @txt
+                            then empty
+                            else vlist $ modifySpacing @loc.diff @lhs.indent @txt
+  | Attr         lhs.jspp = addSpaces @loc.diff @tp.jspp
+  | Sem CoSem    lhs.jspp = addSpaces @loc.diff (pp_parens (
+                              "function ()"
+                              >-< pp_braces (
+                                    "var" >#< "nt" >|< show @name >#< "=" >#< @first.jspp >|< ";"
+                                    >-< "return" >#< "nt" >|< show @name >|< ";"
+                                  )
+                            ))
+  | DataSem      lhs.jspp = @sem.jspp
+  | Detach       lhs.jspp = addSpaces @loc.diff empty
+  | Brackets     lhs.jspp = addSpaces @loc.diff (text "{")
+                            >-< vlist @items.jspps
+                            >-< addSpaces @loc.diff2 (text "}")
+  | Construct    lhs.jspp      = addSpaces @loc.diff (pp_parens @loc.jspp)
+                 loc.jspp      = case @mbAlias of
+                                   Nothing    -> empty
+                                   Just alias -> case alias of
+                                                   AliasType_Prod _  -> empty
+                                                   AliasType_List _  -> empty
+                                                   AliasType_Maybe _ -> empty
+
+SEM SemVisit
+  | Visit        lhs.jspp = "function (_inps)" 
+                            >-< pp_braces (
+                                  "_inps.check();"
+                                  >-< vlist [ "var" >#< jsInp lhsIdent nm >#< "=" >#< "_inps." >|< show nm >|< ";"
+                                            | (nm,_) <- Map.assocs @loc.inhAttrMap ]
+                                  >-< jsppStmtBlock @loc.jsGroupedStmts
+                                  >-< @clauses.jspp
+                                )
+  | Internal     lhs.jspp = jsppStmtBlock @loc.jsGroupedStmts
+                            >-< @clauses.jspp
+  | End          lhs.jspp = if @lhs.fullCyclic
+                            then vlist @loc.jsGroupedStmts
+                            else jsppStmtBlock @loc.jsGroupedStmts
+
+{
+jsppStmtBlock :: PP a => [[a]] -> PP_Doc
+jsppStmtBlock = vlist . map ppComp
+  where ppComp []  = empty
+        ppComp [x] = pp x
+        ppComp xs  = vlist (map pp xs)
+}
+
+SEM Clauses
+  | Cons         lhs.jspp = if @lhs.fullCyclic
+                            then @hd.jspp  -- only one clause
+                            else "try" >#< pp_braces (
+                                    @hd.jspp
+                                 ) >-< "catch (err)" >#< pp_braces (
+                                   "if (err == eEval)"
+                                   >-< pp_braces (
+                                     @tl.jspp
+                                   ) >-< "else" >#< pp_braces (
+                                     text "throw err;"
+                                   )
+                                 )
+  | Nil          lhs.jspp = text "throw eEval;"
+
+SEM Clause
+  | Clause       lhs.jspp = jsppStmtBlock @loc.jsGroupedStmts
+                            >-< if @loc.isDeepest
+                                then "var _outs = new Syn_" >|< jsConNm (head @lhs.itf) @lhs.visit >|< "();"
+                                     >-< case @next.mbNextVisit of
+                                           Just _  -> "_outs._next = " >#< @next.jspp >|< ";"
+                                           Nothing -> @next.jspp
+                                     >-< vlist [ "_outs." >|< show nm >#< "=" >#< jsOutp lhsIdent nm >|< ";"
+                                               | (nm,_) <- Map.assocs @loc.synAttrMap ]
+                                     >-< "return _outs;"
+                                else @next.jspp
+
+SEM Stmt
+  | Eval         lhs.jspp = ( if not @mode.isMatch
+                              then "var _res; try" >#< pp_braces ("_res =" >#< @code.jspp >|< ";")
+                                    >-< "catch(err) { if (err == eEval) { throw eAbort; } else { throw err; } }"
+                              else "var _res = " >#< @code.jspp
+                            ) >|< ";" >-< @pat.jspp
+                 pat.isMatch = @mode.isMatch
+  | Attach       lhs.jspp = "var _semantics =" >#< @loc.jsRhsCode >|< ";"
+                            >-< "if (!_semantics) { throw \"Undefined semantics: " >|< show @name >|< "\"; }"
+                            >-< "var" >#< jsVis @name @visit >#< "= _semantics();"
+                            >-< "if (!" >|< jsVis @name @visit >|< ") { throw \"Undefined attached semantics: " >|< show @name >|< "\"; }"
+                 loc.jsRhsCode = if @code.isJust
+                                 then @code.hpp
+                                 else text $ jsDtSemNm @type
+  | Invoke       lhs.jspp = jsppStmtBlock @loc.jsGroupedStmts
+                            >-< "var _args = new Inh_" >|< jsConNm @loc.unqualChildItf @visit >|< "();"
+                            >-< vlist [ "_args." >|< show nm >#< "=" >#< jsOutp @name nm >|< ";"
+                                      | (nm,_) <- Map.assocs @loc.inhAttrMap ]
+                            >-< "if (!" >|< jsVis @name @visit >|< ") { throw \"uninitialized semantics: ">|< jsVis @name @visit >#< "(expl)\"; }"
+                            >-< "var _res =" >#< jsVis @name @visit >#< pp_parens (text "_args") >|< ";"
+                            >-< "_res.check();"
+                            >-< vlist [ "var" >#< (jsInp @name nm) >#< "=" >#< "_res." >|< show nm >|< ";"
+                                      | (nm,_) <- Map.assocs @loc.synAttrMap ]
+                            >-< case @loc.mbNextVisit of
+                                  Nothing   -> empty
+                                  Just next -> "var" >#< jsVis @name next >#< "= _res._next;"
+  
+  | Default      lhs.jspp = if @mbCode.isJust
+                            then "var _def" >|< show @loc.codeId >#< "=" >#< @mbCode.jspp >|< ";"
+                            else empty
+  | Rename       lhs.jspp = empty
+
+SEM ImplStmt
+  | Invoke
+       lhs.jspp = jsppStmtBlock @loc.jsGroupedStmts
+                  >-< "var _args = new Inh_" >|< jsConNm @itf @visit >|< "();"
+                  >-< vlist [ "_args." >|< show nm >#< "=" >#< jsOutp @child nm >|< ";"
+                            | (nm,_) <- Map.assocs @loc.inhAttrMap ]
+                  >-< "if (!" >|< jsVis @child @visit >|< ") { throw \"uninitialized semantics: ">|< jsVis @child @visit >#< " (impl)\"; }"
+                  >-< "var _res =" >#< jsVis @child @visit >#< pp_parens (text "_args") >|< ";"
+                  >-< "_res.check();"
+                  >-< vlist [ "var" >#< (jsInp @child nm) >#< "=" >#< "_res." >|< show nm >|< ";"
+                            | (nm,_) <- Map.assocs @loc.synAttrMap ]
+                  >-< case @loc.mbNextVisit of
+                        Nothing   -> empty
+                        Just next -> "var" >#< jsVis @child next >#< "= _res._next;"
+                  
+                  
+  
+  | DefaultChild
+      lhs.jspp = "var" >#< hOutp @child @name >#< "=" >#< @loc.jsApp >|< ";"
+  | DefaultSyn
+      lhs.jspp = "var" >#< hOutp lhsIdent @name >#< "=" >#< @loc.jsApp >|< ";"
+  
+  | DefaultChild DefaultSyn
+      loc.jsApp = case @mbCodeRef of
+                    Nothing  -> @loc.jsArr >|< "[0]"
+                    Just ref -> "_def" >|< show ref >#< pp_parens @loc.jsArr
+      loc.jsArr = pp_block "[" "]" "," (reverse @loc.jsInps)
+      loc.jsInps = (if @loc.lhsHasAttr then [text $ jsInp lhsIdent @name] else []) ++ map (\(c,a) -> text $ jsInp c a) @loc.childAttrs
+
+  | DefaultVisLocal
+      lhs.jspp = empty
+
+ATTR Pat Pats [ isMatch : Bool | | ]
+
+SEM Pat
+  | Con          lhs.jspp = "if (!(_res instanceof" >#< show @name >|< "))" >#< @loc.jsThrow
+                            >-< "var _con = _res;"
+                            >-< vlist [ "var _res = _con[" >|< show i >|< "];"
+                                        >-< jspp
+                                      | (i, jspp) <- zip [0..] @pats.jspps ]
+  | AttrCon      lhs.jspp = case @mbAlias of
+                              Nothing    -> "if (!(_res instanceof" >#< jsConNm @dt @con >|< "))" >#< @loc.jsThrow
+                                            >-< "var _val = _res;"
+                                            >-< vlist @loc.jsFieldPPs
+                              Just alias -> case alias of
+                                              AliasType_Prod _  -> "if (!(_res instanceof Tuple))" >#< @loc.jsThrow
+                                                                   >-< "if (_res.length != " >|< (show $ length @loc.fields) >|< ")" >#< @loc.jsThrow
+                                                                   >-< "var _val = _res;"
+                                                                   >-< vlist @loc.jsFieldPPs
+                                              AliasType_List _  -> if @con == ident "Cons"
+                                                                   then "if (!(_res instanceof Array))" >#< @loc.jsThrow
+                                                                        >-< "if (_res.length < 1)" >#< @loc.jsThrow
+                                                                        >-< "var" >#< hOutp @name (ident "hd") >#< "= _res[0];"
+                                                                        >-< "var" >#< hOutp @name (ident "tl") >#< "= _res.slice(1);"
+                                                                   else "if (!(_res instanceof Array))" >#< @loc.jsThrow
+                                                                        >-< "if (_res.length != 0)" >#< @loc.jsThrow
+                                              AliasType_Maybe _ -> if @con == ident "Nothing"
+                                                                   then "if (!(_res instanceof Maybe_Nothing))" >#< @loc.jsThrow
+                                                                   else "if (!(_res instanceof Maybe_Just))" >#< @loc.jsThrow
+                                                                        >-< "var _val = _res;"
+                                                                        >-< vlist @loc.jsFieldPPs
+                 loc.jsFieldPPs = [ "var" >#< hOutp @name nm >#< "= _val." >|< show nm >|< ";" | (nm,_) <- @loc.fields ]
+  | Attr         lhs.jspp = "var" >#< @tp.jspp >#< "=" >#< "_res;"
+  | Tup          lhs.jspp = "var _tuple = _res;"
+                            >-< "if (_tuple.length !=" >#< length (@pats.jspps) >|< ")" >#< @loc.jsThrow
+                            >-< vlist [ "var _res = _tuple[" >|< show i >|< "];"
+                                        >-< jspp
+                                      | (i, jspp) <- zip [0..] @pats.jspps ]
+  | List         lhs.jspp = "var _arr = _res;"
+                            >-< "if (_tuple.length !=" >#< length (@pats.jspps) >|< ")" >#< @loc.jsThrow
+                            >-< vlist [ "var _res = _arr[" >|< show i >|< "];"
+                                        >-< jspp
+                                      | (i, jspp) <- zip [0..] @pats.jspps ]
+  | Cons         lhs.jspp = "var _arr = _res;"
+                            >-< "if (_arr.length < 1)" >#< @loc.jsThrow
+                            >-< "var _res = _arr[0];"
+                            >-< @hd.jspp
+                            >-< "var _res = _arr.slice(1);"
+                            >-< @tl.jspp
+  | Underscore   lhs.jspp = empty
+  
+  | Tup List Cons Con AttrCon
+      loc.jsThrow = if @lhs.isMatch
+                    then "throw eEval;"
+                    else "throw eAbort;"
+
+SEM ExprField | Field
+  lhs.jsopp = (@loc.fieldIndex, pp_parens @code.jspp)
+
+SEM Var | Var
+  lhs.jspp = text (show @name)
+
+SEM AttrTypePat  | *   lhs.jspp = text $ jsOutp @lhs.child @lhs.name
+SEM AttrTypeCode | *   lhs.jspp = text $ jsInp  @lhs.child @lhs.name
+
+ATTR BlocksTop Blocks ItfVisits Items Pats Cons Fields Vars
+  [ | | jspps : {[PP_Doc]} ]
+
+SEM BlocksTop
+  | Top   lhs.jspps = @blocks.jspps
+  | None  lhs.jspps = []
+
+SEM Blocks
+  | Cons  lhs.jspps = @hd.jspp : @tl.jspps
+  | Nil   lhs.jspps = []
+
+SEM ItfVisits
+  | Cons  lhs.jspps = @hd.jspp : @tl.jspps
+  | Nil   lhs.jspps = []
+
+SEM Cons
+  | Cons  lhs.jspps = @hd.jspp : @tl.jspps
+  | Nil   lhs.jspps = []
+
+SEM Fields
+  | Cons  lhs.jspps = @hd.jspp : @tl.jspps
+  | Nil   lhs.jspps = []
+
+SEM Items
+  | Cons  lhs.jspps = @hd.jspp : @tl.jspps
+  | Nil   lhs.jspps = []
+
+SEM Pats
+  | Cons  lhs.jspps = @hd.jspp : @tl.jspps
+  | Nil   lhs.jspps = []
+
+SEM Vars
+  | Cons  lhs.jspps = @hd.jspp : @tl.jspps
+  | Nil   lhs.jspps = []
+
+
+--
+-- Compute spread of stmts
+--
+
+ATTR AllFinal [ jsSpilledStmts : {[(Int,PP_Doc)]} | | ]
+SEM Program | Program  blocks.jsSpilledStmts = []
+
+SEM SemVisit | Visit Internal
+  (loc.jsoStmts, clauses.jsSpilledStmts) = partition (rankIsLower @clauses.minRank)
+                                             (@lhs.jsSpilledStmts ++ @impls.jsopps ++ @stmts.jsopps)
+  loc.jsGroupedStmts = groupPairs @loc.jsoStmts
+
+SEM SemVisit | End
+  loc.jsGroupedStmts = groupPairs @lhs.jsSpilledStmts
+
+SEM Clause | Clause
+  (loc.jsoStmts, next.jsSpilledStmts) = partition (rankIsLower @next.minRank)
+                                          (@lhs.jsSpilledStmts ++ @deflts.jsopps ++ @impls.jsopps ++ @stmts.jsopps)
+
+  loc.jsGroupedStmts = groupPairs @loc.jsoStmts
+
+SEM Stmt | Invoke      loc.jsGroupedStmts = groupPairs @deflts.jsopps
+SEM ImplStmt | Invoke  loc.jsGroupedStmts = groupPairs @deflts.jsopps
+
+--
+-- Certain fields need to be ordered
+--
+
+ATTR Stmts ImplStmts
+  [ | | jsopps : {[(Int, PP_Doc)]} ]
+
+SEM ImplStmts
+  | Cons  lhs.jsopps = (@hd.rank, @hd.jspp) : @tl.jsopps
+  | Nil   lhs.jsopps = []
+
+SEM Stmts
+  | Cons  lhs.jsopps = (@hd.rank, @hd.jspp) : @tl.jsopps
+  | Nil   lhs.jsopps = []
+
+ATTR ExprFields
+  [ | | jsopps : {[(Int,PP_Doc)]} ]
+
+SEM ExprFields
+  | Cons  lhs.jsopps = @hd.jsopp : @tl.jsopps
+  | Nil   lhs.jsopps = []
diff --git a/src/Transform.ag b/src/Transform.ag
new file mode 100644
--- /dev/null
+++ b/src/Transform.ag
@@ -0,0 +1,2670 @@
+MODULE {Transform} {transform} {}
+
+PRAGMA genlinepragmas
+
+INCLUDE "AstAG.ag"
+
+imports
+{
+import Common
+import Ast
+import Errs
+import Data.Sequence(Seq)
+import qualified Data.Sequence as Seq
+import Data.Map(Map)
+import qualified Data.Map as Map
+import Data.IntMap(IntMap)
+import qualified Data.IntMap as IntMap
+import Data.Set(Set)
+import qualified Data.Set as Set
+import Env
+import Data.Monoid
+import Data.List(nub, isPrefixOf, intersect, sortBy, partition, groupBy, sort)
+import Pretty
+import UU.Scanner.Position
+import Opts
+import Data.Maybe
+import Data.Char
+import Data.Graph
+import Data.Foldable(toList)
+import DepAnalysis
+import Debug.Trace(trace)
+}
+
+
+WRAPPER Program
+
+{
+transform :: Pos -> Opts -> Program -> (Errs, String, String, String)
+transform pos opts prog
+  = (errs, txtPretty, txtTarget, txtGraph)
+  where
+    inh  = Inh_Program { opts_Inh_Program = opts, pos_Inh_Program = pos }
+    syn  = wrap_Program sem inh
+    sem  = sem_Program prog
+    errs = firstErrs [ errs0_Syn_Program syn
+                     , errs1_Syn_Program syn
+                     , errs2_Syn_Program syn
+                     , errs3_Syn_Program syn
+                     , errs4_Syn_Program syn
+                     , errs5_Syn_Program syn ]
+    
+    resPretty = pretty_Syn_Program syn
+    txtPretty = disp resPretty 999999 ""
+    resTarget = pp_Syn_Program syn
+    txtTarget = disp resTarget 999999 ""
+    resGraph  = graph_Syn_Program syn
+    txtGraph  = disp resGraph 999999 ""
+
+firstErrs :: [Errs] -> Errs
+firstErrs [] = Seq.empty
+firstErrs (x:xs) = if Seq.null x then firstErrs xs else x
+}
+
+
+--
+-- Transformations for various backends
+--
+
+ATTR Program [ | | pp, pretty, graph : {PP_Doc} ]
+SEM Program | Program
+  lhs.pp     = empty   -- add output for additional backends
+  lhs.pretty = @loc.ppId
+  lhs.graph  = @loc.ppGraph
+
+INCLUDE "TargetHaskell.ag"
+INCLUDE "TargetJs.ag"
+INCLUDE "TargetGraph.ag"
+
+
+ATTR Program AllFinal AllDataFields Itf ItfVisits ItfVisit Attrs Attr Type  [ opts : Opts | | ]
+ATTR Program [ pos : Pos | | ]
+
+
+--
+-- Collect errors
+--
+
+-- errs0: data-type/itf based checks
+-- errs1: rudamentary checks
+-- errs2: child checks
+-- errs3: attribute checks
+-- errs4: cycle checks
+
+SET AllDataFields = Data Cons Con Fields Field FieldType
+SET AllCode = AllCodeWithoutAttrs AttrTypePat AttrTypeCode
+SET AllCodeWithoutAttrs = Code Items Item DataSem AllVisitClauses Stmts Stmt
+                          MaybeBoundCode BoundCode Pats Pat  ExprFields ExprField
+                          SemCons SemCon SemFields SemField
+SET AllCodeBlocksWithoutAttrs = BlocksTop Blocks Block AllCodeWithoutAttrs
+SET AllCodeBlocks = BlocksTop Blocks Block AllCode
+SET AllVisitClauses = SemVisit ClausesTop Clauses Clause
+SET AllFinal = AllCodeBlocks ImplStmts ImplStmt
+SET AllVisFinal = AllVisitClauses ImplStmts ImplStmt Stmts Stmt Pats Pat AttrTypePat AttrTypeCode
+
+ATTR Program AllCodeBlocks Data Type Cons Con Itf ItfVisits ItfVisit
+  [ | | errs0,errs1,errs2,errs3,errs4,errs5 USE {Seq.><} {Seq.empty} : Errs ]
+ATTR ImplStmts ImplStmt [ | | errs2,errs3,errs4,errs5 USE {Seq.><} {Seq.empty} : Errs ]
+
+SEM Program
+  | Program  +errs0 = addDefErrs @blocks.gathItfs
+             +errs0 = addDefErrs @blocks.gathVisits
+             +errs0 = addDefErrs @blocks.gathInhs
+             +errs0 = addDefErrs @blocks.gathSyns
+             +errs1 = addDefErrs @blocks.gathNonterms
+             +errs1 = addDefErrs @blocks.gathClauses
+             +errs1 = addUseErrs @blocks.distItfs
+             +errs1 = addUseErrs @blocks.distVisits
+             +errs1 = addUseErrs @blocks.distChildDefs
+             +errs0 = addDefErrs @blocks.gathDataCons
+             +errs0 = addUseErrs @blocks.distDataCons
+             +errs0 = addDefErrs' @blocks.gathDatas
+             +errs0 = addUseErrs' @blocks.distDatas
+             -- +errs0 = addDefErrs' @blocks.gathDataSems  -- duplicate datasems allowed
+             +errs1 = addUseErrs' @blocks.distDataSems
+             +errs3 = addDefErrs'' @blocks.gathDefs
+             +errs3 = addUseErrs'' @blocks.distDefs
+
+{
+addDefErrs :: Env QIdent v -> Errs -> Errs
+addDefErrs env es
+  = Seq.fromList (map (Err_Dup . map head) ds) Seq.>< es
+  where ds = map (map fst) (dups env)
+
+addUseErrs :: Env QIdent v -> Errs -> Errs
+addUseErrs env es
+  = Seq.fromList (map (Err_Missing . map head) ms) Seq.>< es
+  where ms = missing env
+
+addDefErrs' :: Env Ident v -> Errs -> Errs
+addDefErrs' env es
+  = Seq.fromList (map Err_Dup ds) Seq.>< es
+  where ds = map (map fst) (dups env)
+
+addUseErrs' :: Env Ident v -> Errs -> Errs
+addUseErrs' env es
+  = Seq.fromList (map Err_Missing ms) Seq.>< es
+  where ms = missing env
+
+addDefUseErrs' :: Env Ident v -> Errs -> Errs
+addDefUseErrs' env = addDefErrs' env . addUseErrs' env
+
+addDefErrs'' :: Env (Ident,Ident,Bool) v -> Errs -> Errs
+addDefErrs'' env es
+  = Seq.fromList (map mkDupErr ds) Seq.>< es
+  where ds = map (map fst) (dups env)
+        mkDupErr ((c,n,b):_) = Err_DupAttr b c n
+
+addUseErrs'' :: Env (Ident,Ident,Bool) v -> Errs -> Errs
+addUseErrs'' env es
+  = Seq.fromList (map mkMissErr ms) Seq.>< es
+  where ms = missing env
+        mkMissErr ((c,n,b):_) = Err_MissingAttr b c n
+
+addDefUseErrs'' :: Env (Ident,Ident,Bool) v -> Errs -> Errs
+addDefUseErrs'' env = addDefErrs'' env . addUseErrs'' env
+}
+
+--
+-- Standard duplication checks
+--
+
+
+{
+type ItfEnv = Env QIdent ()
+}
+
+ATTR BlocksTop Blocks Block Itf ItfVisits ItfVisit [ | gathItfs : ItfEnv | ]
+
+SEM Program | Program  blocks.gathItfs = emptyEnv
+
+SEM Itf | Itf         +gathItfs = extend [@name] ()
+SEM ItfVisit | Visit  +gathItfs = extend @loc.coItf ()
+
+ATTR ItfVisits ItfVisit Attrs Attr [ itf : {QIdent} | | ]
+SEM Itf | Itf  visits.itf = [@name]
+
+{
+type VisitEnv = Env QIdent ()
+}
+
+ATTR BlocksTop Blocks Block Itf ItfVisits ItfVisit [ | gathVisits : VisitEnv | ]
+
+SEM Program | Program  blocks.gathVisits = emptyEnv
+
+SEM ItfVisit | Visit
+  +gathVisits = extend (@name : @lhs.itf) ()
+  +gathVisits = extend (@name : @loc.coItf) ()
+
+
+ATTR Attrs Attr [ visit : {QIdent} coItf : {QIdent} | | ]
+SEM ItfVisit | Visit
+  attrs.visit = @name : @lhs.itf
+  loc.coItf = [mkCoIdent (head @lhs.itf) @name]
+
+{
+mkCoIdent :: Ident -> Ident -> Ident
+mkCoIdent itf vis = Ident ("Co_" ++ show itf ++ "_" ++ show vis) (identPos itf)
+}
+
+{
+type AttrEnv = Env QIdent String
+}
+
+ATTR BlocksTop Blocks Block Itf ItfVisits ItfVisit Attrs Attr [ | gathInhs, gathSyns : AttrEnv | ]
+
+SEM Program
+  | Program  blocks.gathInhs = emptyEnv
+             blocks.gathSyns = emptyEnv
+
+SEM Attr
+  | Inh  +gathInhs = extend (@name : @lhs.itf) @type
+         +gathSyns = extend (@name : @lhs.coItf) @type
+  | Syn  +gathSyns = extend (@name : @lhs.itf) @type
+         +gathInhs = extend (@name : @lhs.coItf) @type
+
+ATTR VisitAttrs VisitAttr [ | gathChns : AttrEnv | ]
+
+SEM SemVisit
+  | Visit  attrs.gathChns = emptyEnv
+           +errs0 = addDefErrs @attrs.gathChns
+
+SEM VisitAttr | Chn  +gathChns = extend [@name] @type
+
+{
+type NontermEnv = Env QIdent ()
+type ClausesEnv = Env QIdent ()
+type DataSemEnv = Env Ident ()
+}
+
+ATTR AllCodeBlocks [ | gathNonterms : NontermEnv gathClauses : ClausesEnv | ]
+ATTR AllCode ImplStmts ImplStmt [ nonterm : {QIdent} | | ]
+ATTR ImplStmts ImplStmt [ gathNonterms : NontermEnv gathClauses : ClausesEnv | | ]
+
+SEM Block | Section  code.nonterm  = [ident "<root>"]
+          | Item     item.nonterm  = [ident "<root>"]
+          | DataSem  sem.nonterm   = [ident "<root>"]
+
+SEM DataSem | Sem    clauses.nonterm   = [@tp]
+
+SEM Item | Sem CoSem
+  first.nonterm = [@name]
+
+SEM Program
+  | Program  blocks.gathNonterms = emptyEnv
+             blocks.gathClauses  = emptyEnv
+
+SEM Item
+  | Sem CoSem  +gathNonterms = extend [@name] ()
+
+SEM Clause
+  | Clause  +gathClauses = extend (@name : @lhs.nonterm) ()
+
+ATTR ClausesTop Clauses Clause [ | | gathClauseNames USE {`Set.union`} {Set.empty} : {Set Ident} ]
+SEM Clause | Clause  lhs.gathClauseNames = Set.singleton @name
+
+ATTR AllCodeBlocks [ | gathDataSems : DataSemEnv | ]
+ATTR AllCodeBlocks [ | distDataSems : DataSemEnv | ]
+ATTR ImplStmts ImplStmt [ distDataSems : DataEnv | | ]
+
+SEM Program | Program
+  blocks.gathDataSems = emptyEnv
+  blocks.distDataSems = @blocks.gathDataSems
+
+SEM DataSem | Sem
+  +gathDataSems = extend @tp ()
+
+ATTR AllCodeBlocks ImplStmts ImplStmt [ allVisits : {Set Ident} | | ]
+
+SEM Program | Program
+  blocks.allVisits = Set.empty
+
+SEM Item | Sem CoSem
+  first.allVisits = Set.union (Set.fromList @loc.nextVisits) @lhs.allVisits
+
+SEM DataSem | Sem
+  clauses.allVisits = Set.union (Set.fromList @loc.nextVisits) @lhs.allVisits
+
+SEM Stmt | Attach  -- check that visits and children have distinct names
+  +errs1 = ( if @name `Set.member` @lhs.allVisits
+             then Seq.singleton $ Err_NameClash @name
+             else Seq.empty
+           ) Seq.><
+
+ATTR Cons Con Fields Field ExprFields ExprField [ data : Ident | | ]
+ATTR Fields Field ExprFields ExprField [ con : Ident | | ]
+SEM Data | Data  cons.data  = @name
+SEM Con | Con    fields.con = @name
+SEM Item | Construct fields.data = @data
+SEM Item | Construct fields.con  = @con
+
+{
+type DataEnv  = Env Ident ()
+type ConEnv   = Env QIdent FieldEnv
+type FieldEnv = Env Ident (Int,Either Ident String)
+}
+
+ATTR BlocksTop Blocks Block Data Cons Con Type [ | gathDataCons : ConEnv | ]
+ATTR AllCodeBlocks [ | distDataCons : ConEnv | ]
+ATTR ImplStmts ImplStmt [ distDataCons : ConEnv | | ]
+
+SEM Program | Program
+  blocks.gathDataCons = emptyEnv
+  blocks.distDataCons = @blocks.gathDataCons
+
+SEM Con | Con
+  +gathDataCons = extend [@name, @lhs.data] @fields.gathFields
+
+ATTR BlocksTop Blocks Block Data Type [ | gathDatas : DataEnv | ]
+SEM Program | Program  blocks.gathDatas = emptyEnv
+SEM Data | Data        +gathDatas = extend @name ()
+
+ATTR Fields Field [ | gathFields : FieldEnv | ]
+SEM Con | Con
+  fields.gathFields = emptyEnv
+  +errs0 = addDefErrs' @fields.gathFields
+
+SEM Field | Field
+  +gathFields = extend @name (@lhs.nr, @type.fldType)
+
+ATTR Cons Con Fields Field [ | nr : Int | ]
+SEM Data | Data    cons.nr   = 0
+SEM Con | Con      fields.nr = 1 + @lhs.nr
+SEM Field | Field  lhs.nr    = 1 + @lhs.nr
+
+ATTR FieldType [ | | fldType : {Either Ident String} ]
+SEM FieldType
+  | Term     lhs.fldType = Right @type
+  | Nonterm  lhs.fldType = Left @name
+
+ATTR ExprFields ExprField [ fieldOrder : {Map Ident Int} | gathFields : FieldEnv | ]
+SEM Item | Construct
+  fields.gathFields = emptyEnv
+  loc.gathFieldEnv = foldr (\(nm,_) -> snd . find nm (0,Right "")) @fields.gathFields @loc.fields
+  +errs0 = addDefErrs' @loc.gathFieldEnv
+  +errs0 = addUseErrs' @loc.gathFieldEnv
+  fields.fieldOrder = Map.fromList (zip (map fst @loc.fields) [1..])
+
+SEM ExprField | Field
+  +gathFields    = extend @name (0,Right "")
+  loc.fieldIndex = Map.findWithDefault 0 @name @lhs.fieldOrder
+
+{
+type VarsEnv = Env Ident ()
+}
+
+ATTR Vars Var Cons Con ItfVisits ItfVisit [ | gathVarsEnv : VarsEnv | ]
+SEM Var | Var
+  +gathVarsEnv = extend @name ()
+
+SEM Type | Alias
+  vars.gathVarsEnv = emptyEnv
+  +errs1 = addDefErrs' @vars.gathVarsEnv
+
+SEM Data | Data
+  vars.gathVarsEnv = emptyEnv
+  +errs1 = addDefErrs' @cons.gathVarsEnv
+
+SEM Cons | Cons
+  (hd.gathVarsEnv, tl.gathVarsEnv) = split @lhs.gathVarsEnv
+  (lhs.gathVarsEnv, loc.locGathVarsEnv) = merge @hd.gathVarsEnv @tl.gathVarsEnv
+  +errs1 = addDefErrs' @loc.locGathVarsEnv
+
+SEM Itf | Itf
+  vars.gathVarsEnv = emptyEnv
+  +errs1 = addDefErrs' @visits.gathVarsEnv
+
+SEM ItfVisits | Cons
+  (hd.gathVarsEnv, tl.gathVarsEnv) = split @lhs.gathVarsEnv
+  (lhs.gathVarsEnv, loc.locGathVarsEnv) = merge @hd.gathVarsEnv @tl.gathVarsEnv
+  +errs1 = addDefErrs' @loc.locGathVarsEnv
+
+SEM Item | Sem CoSem
+  vars.gathVarsEnv = emptyEnv
+  +errs1 = addDefErrs' @vars.gathVarsEnv
+
+SEM DataSem | Sem
+  vars.gathVarsEnv = emptyEnv
+  +errs1 = addDefErrs' @vars.gathVarsEnv
+
+--
+-- Standard usage checks
+--
+
+ATTR AllCodeBlocks [ | distItfs : ItfEnv | ]
+ATTR ImplStmts ImplStmt [ distItfs : ItfEnv | | ]
+
+SEM Program
+  | Program  blocks.distItfs = @blocks.gathItfs
+
+SEM Item | Sem CoSem
+  +distItfs = snd . find [@tp] ()
+
+SEM Stmt | Attach
+  +distItfs = snd . find [@type] ()
+
+SEM DataSem | Sem
+  +distItfs = snd . find [@tp] ()
+
+ATTR AllCode Pats Pat AttrTypePat AttrTypeCode ImplStmts ImplStmt [ itf : QIdent coItf : Ident | | ]
+SEM Block | Section Item DataSem
+  loc.itf   = [ident "<root>"]
+  loc.coItf = ident "<root>"
+
+SEM DataSem | Sem
+  clauses.itf  = [@tp]
+
+SEM Item
+  | Sem      first.itf = [@tp]
+  | CoSem    first.itf = [@loc.coItf]
+             loc.coItf = mkCoIdent @tp @visit
+             first.coItf = @tp
+
+ATTR AllCodeBlocks [ | distVisits : VisitEnv | ]
+ATTR ImplStmts ImplStmt [ distVisits : VisitEnv | | ]
+
+SEM Program
+  | Program  blocks.distVisits = @blocks.gathVisits
+
+SEM SemVisit | Visit
+  +distVisits = snd . find (@name : @lhs.itf) ()
+
+SEM Stmt
+  | Invoke  loc.unqualChildItf = head @loc.childItf
+            loc.childVisits = Map.findWithDefault [] @loc.unqualChildItf @lhs.distVisitOrder
+            +errs1 = ( if null @loc.childVisits || @visit `elem` @loc.childVisits
+                       then Seq.empty else Seq.singleton (Err_UndefVisit @name @visit @loc.childVisits)) Seq.><
+  | Attach  loc.childVisits = Map.findWithDefault [] @type @lhs.distVisitOrder
+            loc.visit = case @mbVisit of
+                          Nothing -> if null @loc.childVisits then Ident "<unknown>" @pos else head @loc.childVisits
+                          Just v  -> v
+            +errs1 = ( if null @loc.childVisits || @loc.visit `elem` @loc.childVisits
+                       then Seq.empty else Seq.singleton (Err_UndefVisit @name @loc.visit @loc.childVisits)) Seq.><
+
+SEM ImplStmt
+  | Invoke  loc.childVisits = Map.findWithDefault [] @itf @lhs.distVisitOrder
+
+SEM Pat | AttrCon
+  (loc.fieldEnv, lhs.distDataCons) = find [@con, @dt] emptyEnv @lhs.distDataCons
+  loc.fields = sortAssocs $ assocs @loc.fieldEnv
+
+{
+sortAssocs :: [(Ident, (Int, a))] -> [(Ident, a)]
+sortAssocs = map (\(nm,(_,tp)) -> (nm,tp)) . sortBy (\(_,(n1,_)) (_,(n2,_)) -> compare n1 n2)
+}
+
+SEM Item | Construct
+  (loc.fieldEnv, lhs.distDataCons) = find [@con, @data] emptyEnv @lhs.distDataCons
+  loc.fields = sortAssocs $ assocs @loc.fieldEnv
+
+SEM Stmt | Attach
+  +distDataSems = if @code.isJust
+                  then id
+                  else snd . find @type ()
+
+ATTR AllCodeBlocks Type AliasType AllDataFields [ | distDatas : DataEnv | ]
+ATTR ImplStmts ImplStmt [ distDatas : DataEnv | | ]  -- should perhaps turn into a changed attr
+
+SEM Program | Program
+  blocks.distDatas = @blocks.gathDatas
+
+SEM DataSem | Sem
+  +distDatas = snd . find @tp ()
+  
+  +errs2 = if Map.member astIdent $ Map.findWithDefault Map.empty @loc.firstVisit
+                                  $ Map.findWithDefault Map.empty @tp @lhs.distVisitInhAttrs
+           then id
+           else (Seq.singleton (Err_Missing [replPos @pos astIdent]) Seq.><)
+
+SEM AliasType
+  | Prod   +distDatas = \env -> foldr (\tp -> snd . find tp ()) env @fields
+  | List   +distDatas = snd . find @type ()
+  | Maybe  +distDatas = snd . find @type ()
+
+SEM FieldType | Nonterm  +distDatas = snd . find @name ()
+SEM Item | Construct     +distDatas = snd . find @data ()
+SEM Pat | AttrCon        +distDatas = snd . find @dt ()
+
+{
+astIdent :: Ident
+astIdent = Ident "ast" noPos
+}
+
+--
+-- Children defined
+--
+
+ATTR AllCodeBlocksWithoutAttrs [ | gathChildDefs : {Env QIdent (QIdent, QIdent)} | ]
+ATTR AllCodeBlocks [ | distChildDefs : {Env QIdent (QIdent,QIdent)} | ]
+ATTR ImplStmts ImplStmt [ gathChildDefs, distChildDefs : {Env QIdent (QIdent,QIdent)} | | ]  -- inherit only
+
+SEM Program | Program  blocks.gathChildDefs = emptyEnv
+                       blocks.distChildDefs = @blocks.gathChildDefs
+
+SEM Item
+  | Sem CoSem
+         loc.firstVisit = if null @loc.nextVisits then unknIdent else head @loc.nextVisits
+         first.gathChildDefs = extend locQIdent (locQIdent, locQIdent)
+                               $ extend visQIdent (visQIdent, visQIdent)
+                               $ extend lhsQIdent ([@tp], [@loc.firstVisit, @tp])
+                               $ enter @lhs.gathChildDefs
+         (lhs.gathChildDefs, loc.localChildDefs) = leave @first.gathChildDefs
+         -- don't addDefErrs on @loc.localChildDefs
+
+         first.distChildDefs = enterWith @loc.localChildDefs @lhs.distChildDefs
+         (lhs.distChildDefs, loc.localChildDefs') = leave @first.distChildDefs
+         
+         +errs1 = addUseErrs @loc.localChildDefs'
+  | Attr    ((loc.childItf, loc.startVisit), lhs.distChildDefs) = find [@child] (unknQIdent,unknQIdent) @lhs.distChildDefs
+  | Detach  ((loc.childItf, loc.startVisit), lhs.distChildDefs) = find [@name] (unknQIdent,unknQIdent) @lhs.distChildDefs
+
+SEM DataSem | Sem
+  clauses.gathChildDefs = extend locQIdent (locQIdent, locQIdent)
+                          $ extend visQIdent (visQIdent, visQIdent)
+                          $ extend lhsQIdent ([@tp], [@loc.firstVisit, @tp])
+                          $ enter @lhs.gathChildDefs
+  (lhs.gathChildDefs, loc.localChildDefs) = leave @clauses.gathChildDefs
+  -- don't addDefErrs on @loc.localChildDefs
+
+  clauses.distChildDefs = enterWith @loc.localChildDefs @lhs.distChildDefs
+  (lhs.distChildDefs, loc.localChildDefs') = leave @clauses.distChildDefs
+   
+  +errs1 = addUseErrs @loc.localChildDefs'
+
+SEM Clauses
+  | Cons  (hd.gathChildDefs, tl.gathChildDefs)    = split @lhs.gathChildDefs
+          (lhs.gathChildDefs, loc.gathLChildDefs) = merge @hd.gathChildDefs @tl.gathChildDefs
+          
+          (hd.distChildDefs, tl.distChildDefs)    = splitWith @loc.gathLChildDefs @lhs.distChildDefs
+          (lhs.distChildDefs, loc.distLChildDefs) = merge @hd.distChildDefs @tl.distChildDefs
+
+          +errs1 = addUseErrs @loc.distLChildDefs
+
+SEM Stmt
+  | Attach  +gathChildDefs = extend [@name] ([@type],[@loc.visit,@type])
+            loc.allAttaches = findAll [@name] @lhs.distChildDefs
+            loc.initType = head $ last ([@type] : map fst @loc.allAttaches)
+            +errs1 = if @type /= @loc.initType
+                     then (Err_TypeConflict @type @loc.initType Seq.<|)
+                     else id
+  | Invoke  ((loc.childItf, loc.startVisit), code.distChildDefs) = find [@name] (unknQIdent,unknQIdent) @lhs.distChildDefs
+
+SEM Pat
+  | Attr    ((loc.childItf, loc.startVisit), lhs.distChildDefs) = find [@child] (unknQIdent,unknQIdent) @lhs.distChildDefs
+  | AttrCon +gathChildDefs = extendTail [@name] (locQIdent,locQIdent)
+            ((loc.childItf, loc.startVisit), lhs.distChildDefs) = find [@name] (unknQIdent,unknQIdent) @lhs.distChildDefs
+
+{
+unknIdent :: Ident
+unknIdent = ident "<undefined>"
+
+unknQIdent :: QIdent
+unknQIdent = [unknIdent]
+
+locQIdent :: QIdent
+locQIdent = [locIdent]
+
+lhsQIdent :: QIdent
+lhsQIdent = [lhsIdent]
+
+visQIdent :: QIdent
+visQIdent = [visIdent]
+}
+
+
+--
+-- Compute renames for each clause/visit
+--
+-- unchecked: source name must be in interface of child
+-- unchecked: duplicate renames
+-- unchecked: new name not in interface of child
+--
+
+{
+type RenameMap = Map Ident (Map Ident Ident)
+}
+
+ATTR Stmts Stmt [ | | gathRenames USE {`unionWithUnion`} {mempty} : RenameMap ]
+SEM Stmt | Rename
+  lhs.gathRenames = Map.singleton @child @subst.gathRenames
+
+ATTR Renames Rename [ | | gathRenames USE {`mappend`} {mempty} : {Map Ident Ident} ]
+SEM Rename | Rename
+  lhs.gathRenames = Map.fromList [ (@source, @dest), (@dest, @source) ]
+
+ATTR AllFinal [ distRenames : RenameMap | | ]
+
+SEM Program | Program  blocks.distRenames  = Map.empty
+SEM DataSem | Sem      clauses.distRenames = Map.empty
+SEM Item | Sem CoSem   first.distRenames   = Map.empty
+
+SEM Clause | Clause      loc.distRenames = @stmts.gathRenames `unionWithUnion` @lhs.distRenames
+SEM SemVisit | Visit     loc.distRenames = @stmts.gathRenames `unionWithUnion` @lhs.distRenames
+SEM SemVisit | Internal  loc.distRenames = @stmts.gathRenames `unionWithUnion` @lhs.distRenames
+
+{
+renameAttr :: RenameMap -> Ident -> Ident -> Ident
+renameAttr mp child nm = Map.findWithDefault nm nm $ Map.findWithDefault Map.empty child mp
+renameAttrFwd = renameAttr
+renameAttrBwd = renameAttr
+}
+
+SEM Item | Attr  loc.origName = renameAttrBwd @lhs.distRenames @child @name
+SEM Pat | Attr   loc.origName = renameAttrBwd @lhs.distRenames @child @name
+
+
+--
+-- Add and check additional instructions (children, etc.) for clauses
+--
+
+ATTR SemVisit ClausesTop Clauses Clause [ clauseExtras : {Map Ident Stmts} | | ]
+
+SEM Clause | Clause   next.clauseExtras  = Map.empty
+SEM Item | Sem CoSem  first.clauseExtras = Map.empty
+
+SEM DataSem | Sem
+  clauses.clauseExtras = @cons.clauseExtras
+
+  loc.consMap = Map.findWithDefault Map.empty @tp @lhs.distDataMap
+
+  inst.cons : SemCons
+  inst.cons = [ SemCon_Con @pos (replPos @pos c)
+                  [ SemField_Field @pos (replPos @pos nm) tp | (nm,tp) <- sortAssocs $ Map.assocs fs ]
+              | (c,fs) <- sortAssocs $ Map.assocs @loc.consMap ]
+
+  cons.itf = [@tp]
+
+{
+trim :: String -> String
+trim = reverse . dropWhile isSpace . reverse . dropWhile isSpace
+} -- (Ident (trim (either show id tp)) @pos
+
+ATTR SemCons SemCon [ | | clauseExtras USE {`Map.union`} {Map.empty} : {Map Ident Stmts} ]
+ATTR SemFields SemField [ | | clauseExtras USE {++} {[]} : Stmts ]
+
+SEM SemCon | Con
+  lhs.clauseExtras = Map.singleton @name
+                       ( Stmt_Eval Mode_Match (Pat_AttrCon @name (replPos @pos locIdent) (head @lhs.itf))
+                           (BoundCode_Code Bind_Fun @pos $ Code_Code
+                              [Item_Attr @pos (replPos @pos lhsIdent) (replPos @pos astIdent) ])
+                       : @fields.clauseExtras )
+
+SEM SemField | Field
+  loc.isNonterm = case @type of
+                    Left nt -> Map.member nt @lhs.distDataMap
+                    Right _ -> False
+  +distDataSems = case @type of
+                    Left nt | @loc.isNonterm -> snd . find nt ()
+                    _ -> id
+  lhs.clauseExtras = case @type of
+                       Left nt | @loc.isNonterm ->
+                             [ Stmt_Attach @pos Nothing @name nt Nothing
+                             , Stmt_Eval Mode_Assert (Pat_Attr @name (replPos @pos astIdent))
+                                                     (BoundCode_Code Bind_Fun @pos (Code_Code [
+                                                       Item_Attr @pos (replPos @pos locIdent) @name ]))
+                             ]
+                       _ -> []
+
+--
+-- Check clauses defined when having this extraMap
+--
+
+SEM ClausesTop | Top
+  +errs0 = if Map.null @lhs.clauseExtras
+           then id
+           else let reqKeys = Map.keysSet @lhs.clauseExtras
+                    impKeys = @clauses.gathClauseNames
+                    diffSet = (impKeys `Set.difference` reqKeys) `Set.union` (reqKeys `Set.difference` impKeys)
+                    diff = Set.elems diffSet
+                    errs = map (\nm -> Err_MissingClause (head @lhs.itf) nm) diff
+                in (Seq.fromList errs Seq.><)
+
+-- NOTE: This *must* be before inst.impls, otherwise the copy rule for available attributes goes wrong
+SEM Clause | Clause
+  inst.stmts : T_Stmts
+  inst.stmts = \stmts -> foldr (\s r -> sem_Stmts_Cons (sem_Stmt s) r) stmts @loc.extraStmts 
+
+  loc.extraStmts = Map.findWithDefault [] @name @lhs.clauseExtras
+
+--
+-- Count visits
+--
+
+ATTR AllVisitClauses [ visitNr : Int | | ]
+SEM Item | Sem CoSem           first.visitNr   = 1
+SEM DataSem | Sem              clauses.visitNr = 1
+
+SEM SemVisit | Visit           loc.visitNr     = @lhs.visitNr + 1
+
+--
+-- Visit order
+--
+
+ATTR BlocksTop Blocks Block Itf ItfVisits ItfVisit [ | | gathVisitOrder USE {`mappend`} {mempty} : {Map Ident [Ident]} ]
+ATTR ItfVisits ItfVisit [ | | gathVisitsOrder USE {++} {[]} : {[Ident]} ]
+
+SEM Itf | Itf         +gathVisitOrder = Map.insert @name @visits.gathVisitsOrder
+SEM ItfVisit | Visit  lhs.gathVisitsOrder = [@name]
+                      lhs.gathVisitOrder = Map.singleton (head @loc.coItf) [@name]
+
+ATTR AllCodeBlocks ImplStmts ImplStmt [ distVisitOrder : {Map Ident [Ident]} doneVisits : {[Ident]} | | ]
+ATTR SemVisit ClausesTop Clauses Clause [ nextVisits : {[Ident]} | | ]
+
+SEM Program | Program  blocks.distVisitOrder = @blocks.gathVisitOrder
+SEM Item | Sem         loc.nextVisits        = Map.findWithDefault [] @tp @lhs.distVisitOrder
+         | CoSem       loc.nextVisits        = Map.findWithDefault [] @loc.coItf @lhs.distVisitOrder
+         | Detach      loc.visitOrder        = Map.findWithDefault [] @loc.unqualChildItf @lhs.distVisitOrder
+
+SEM AttrTypePat | Child   loc.visitOrder     = Map.findWithDefault [] @lhs.childItf @lhs.distVisitOrder
+SEM AttrTypeCode | Child  loc.visitOrder     = Map.findWithDefault [] @lhs.childItf @lhs.distVisitOrder
+
+SEM DataSem | Sem      loc.visits            = Map.findWithDefault [] @tp @lhs.distVisitOrder
+                       loc.nextVisits        = @loc.visits
+                       loc.firstVisit        = case @loc.visits of
+                                                 []    -> Ident "unknown" @pos
+                                                 (x:_) -> x
+
+SEM Program | Program  blocks.doneVisits = []
+SEM Item | Sem         loc.doneVisits    = []
+         | CoSem       loc.doneVisits    = []
+SEM DataSem | Sem      loc.doneVisits    = []
+
+SEM SemVisit | Visit  loc.doneVisits = @name : @lhs.doneVisits  -- visits of the interface done
+
+-- Insert empty visits to match the visits actually in the AST
+SEM SemVisit
+  | Visit  loc.unqualItf = head @lhs.itf
+           loc.itfVisits = Map.findWithDefault [] @loc.unqualItf @lhs.distVisitOrder
+           (loc.sequenceErrs, clauses.nextVisits) = checkVisitSequence @pos @name @lhs.nextVisits
+           +errs0 = if not (@name `elem` @loc.itfVisits)
+                    then (Err_UndeclVisit @pos @name @loc.unqualItf Seq.<|)
+                    else (@loc.sequenceErrs Seq.><)
+  | Internal  -- don't eat any of the expected visits
+           loc.name      = Ident (show @name ++ "_int" ++ show @loc.lexOrder) (identPos @name)
+           loc.unqualItf = head @lhs.itf
+  | Impl   inst.actual : SemVisit
+           inst.actual = prependEmptyVisits @lhs.basename @lhs.masterPos SemVisit_End @lhs.nextVisits
+  | Prependable
+           loc.missingVisits   = if elem @name @lhs.nextVisits
+                                 then takeWhile (/= @name) @lhs.nextVisits
+                                 else []
+           loc.remainingVisits = drop (length @loc.missingVisits) @lhs.nextVisits
+           inst.visits : SemVisit
+           inst.visits = if null @loc.remainingVisits || @name `elem` @lhs.doneVisits
+                         then SemVisit_End
+                         else prependEmptyVisits @lhs.basename @pos @actual @loc.missingVisits
+           +errs0 = if null @loc.remainingVisits && not (null @lhs.nextVisits)
+                    then (Err_ExpVisit @pos @name (head @lhs.nextVisits) Seq.<|)
+                    else if @name `elem` @lhs.doneVisits
+                         then (Err_Dup [@name] Seq.<|)
+                         else id
+  | End    +errs0 = (if null @lhs.nextVisits then Seq.empty else Seq.singleton (Err_VisitsNotImpl @lhs.nonterm @lhs.nextVisits)) Seq.><
+
+ATTR AllVisitClauses [ masterPos : Pos | | ]
+SEM Item | Sem CoSem           first.masterPos   = @pos
+SEM DataSem | Sem              clauses.masterPos = @pos
+SEM SemVisit | Visit Internal  loc.masterPos     = @pos
+SEM Clause | Clause            loc.masterPos     = @pos
+
+{
+prependEmptyVisits _ _ t [] = t
+prependEmptyVisits basename pos t (v:vs)
+  = SemVisit_Visit pos v False [] [] (ClausesTop_Top [Clause_Clause pos (mkClauseName pos v basename) []
+      (prependEmptyVisits basename pos t vs) ])
+
+mkClauseName :: Pos -> Ident -> QIdent -> Ident
+mkClauseName pos v vs
+  = Ident (show v ++ concatMap (\v' -> "_" ++ show v') vs) pos
+
+checkVisitSequence :: Pos -> Ident -> [Ident] -> (Errs, [Ident])
+checkVisitSequence _ _ [] = (Seq.empty, [])  -- dont report more errors if already erroneous
+checkVisitSequence pos nm (nm' : nms)
+  | nm == nm' = (Seq.empty, nms)
+  | otherwise = (Seq.singleton $ Err_ExpVisit pos nm nm', [])  -- mismatch
+}
+
+-- insert dummy clause if no clauses were given
+SEM ClausesTop
+  | Impl
+      loc.pos  = @lhs.masterPos
+      loc.name = mkClauseName @loc.pos (Ident "impl" @loc.pos) @lhs.basename
+  
+      inst.actual : ClausesTop
+      inst.actual = if null @clauses
+                    then ClausesTop_Top [Clause_Clause @loc.pos @loc.name [] SemVisit_Impl ]
+                    else ClausesTop_Top @clauses
+
+
+{
+unionWithPlusplus :: Ord k => Map k [v] -> Map k [v] -> Map k [v]
+unionWithParallel, unionWithSequential :: (Ord k, Ord v) => Map k [[v]] -> Map k [[v]] -> Map k [[v]]
+
+unionWithPlusplus   = Map.unionWith (++)
+unionWithParallel mp1 mp2 = Map.unionWith (++) mp1' mp2'
+  where addleft  = Map.map (const [[]]) (mp2 `Map.difference` mp1)
+        addright = Map.map (const [[]]) (mp1 `Map.difference` mp2)
+        mp1' = addleft `Map.union` mp1
+        mp2' = addright `Map.union` mp2
+unionWithSequential = Map.unionWith (\[h] t -> map (h++) t)
+
+unionWithUnion :: (Ord k, Monoid v) => Map k v -> Map k v -> Map k v
+unionWithUnion = Map.unionWith mappend
+}
+
+SEM Item
+  | Detach  loc.unqualChildItf = head @loc.childItf
+            loc.childVisits = Map.findWithDefault [] @loc.unqualChildItf @lhs.distVisitOrder
+
+{
+nextAfterInvoked :: [Ident] -> [Ident] -> Ident
+nextAfterInvoked (a:as) (b:bs)
+  | a == b    = nextAfterInvoked as bs
+  | otherwise = b
+}
+
+
+--
+-- Check if all visits are uniquely named
+--
+
+ATTR AllVisitClauses [ | gathVisitNames : {Env Ident ()} | ]
+SEM SemVisit | Visit Internal
+  +gathVisitNames = extend @name ()
+
+SEM Item | Sem CoSem  first.gathVisitNames = emptyEnv
+                      +errs0 = addDefErrs' @first.gathVisitNames
+SEM DataSem | Sem     clauses.gathVisitNames = emptyEnv
+                      +errs0 = addDefErrs' @clauses.gathVisitNames
+
+SEM Clauses | Cons
+      (hd.gathVisitNames, tl.gathVisitNames)    = split @lhs.gathVisitNames
+      (lhs.gathVisitNames, loc.gathLVisitNames) = merge @hd.gathVisitNames @tl.gathVisitNames
+      +errs1 = addDefErrs' @loc.gathLVisitNames
+
+ATTR SemVisit [ | | isInternal : Bool ]
+SEM SemVisit
+  | Visit     lhs.isInternal = False
+  | Internal  lhs.isInternal = True
+  | End       lhs.isInternal = False
+
+SEM Clause | Clause
+  loc.isDeepest = not @next.isInternal
+
+--
+-- Attribute information: all syn/inh attrs per nonterm and per visit
+--
+
+{
+type AttrMap = Map Ident (Map Ident String)
+type VisitAttrMap = Map Ident AttrMap
+}
+
+ATTR BlocksTop Blocks Block Itf ItfVisits ItfVisit [ | | gathInhAttrs, gathSynAttrs USE {`mappend`} {mempty} : AttrMap ]
+ATTR BlocksTop Blocks Block Itf ItfVisits ItfVisit [ | | gathVisitInhAttrs, gathVisitSynAttrs USE {`mappend`} {mempty} : VisitAttrMap ]
+ATTR ItfVisits ItfVisit [ | | gathVisitsInhAttrs, gathVisitsSynAttrs USE {`mappend`} {mempty} : AttrMap ]
+ATTR Attrs Attr [ | | gathVisitInhAttrs, gathVisitSynAttrs USE {`mappend`} {mempty} : {Map Ident String} ]
+
+SEM Attr
+  | Inh  lhs.gathVisitInhAttrs = Map.singleton @name @type
+  | Syn  lhs.gathVisitSynAttrs = Map.singleton @name @type
+
+SEM ItfVisit
+  | Visit  lhs.gathVisitsInhAttrs = Map.singleton @name @attrs.gathVisitInhAttrs
+           lhs.gathVisitsSynAttrs = Map.singleton @name @attrs.gathVisitSynAttrs
+           lhs.gathVisitInhAttrs  = Map.singleton (head @loc.coItf) (Map.singleton @name @attrs.gathVisitSynAttrs)
+           lhs.gathVisitSynAttrs  = Map.singleton (head @loc.coItf) (Map.singleton @name @attrs.gathVisitInhAttrs)
+           lhs.gathInhAttrs       = Map.singleton (head @loc.coItf) @attrs.gathVisitSynAttrs
+           lhs.gathSynAttrs       = Map.singleton (head @loc.coItf) @attrs.gathVisitInhAttrs
+
+SEM Itf
+  | Itf    +gathVisitInhAttrs = Map.insert @name @visits.gathVisitsInhAttrs
+           +gathVisitSynAttrs = Map.insert @name @visits.gathVisitsSynAttrs
+
+           +gathInhAttrs = Map.insert @name $ Map.unions $ Map.elems @visits.gathVisitsInhAttrs
+           +gathSynAttrs = Map.insert @name $ Map.unions $ Map.elems @visits.gathVisitsSynAttrs
+
+ATTR AllCodeBlocks ImplStmts ImplStmt [ distInhAttrs, distSynAttrs : AttrMap distVisitInhAttrs, distVisitSynAttrs : VisitAttrMap | | ]
+
+SEM Program | Program
+  blocks.distInhAttrs      = @blocks.gathInhAttrs
+  blocks.distSynAttrs      = @blocks.gathSynAttrs
+  blocks.distVisitInhAttrs = @blocks.gathVisitInhAttrs
+  blocks.distVisitSynAttrs = @blocks.gathVisitSynAttrs
+
+ATTR VisitAttrs VisitAttr [ | | gathVisitLocalAttrs USE {`mappend`} {mempty} : {Map Ident String} ]
+ATTR Clauses Clause ClausesTop SemVisit [ | | gathVisitAttrs USE {`mappend`} {mempty} : {Map Ident (Map Ident String)} ]
+ATTR AllCodeBlocks ImplStmts ImplStmt [ directVisitAttrs : {Map Ident (Map Ident String)} | | ]
+
+SEM SemVisit | Visit   +gathVisitAttrs = Map.insert @name @attrs.gathVisitLocalAttrs
+SEM VisitAttr | Chn    lhs.gathVisitLocalAttrs = Map.singleton @name @type
+SEM Program | Program  blocks.directVisitAttrs = Map.empty
+SEM Item | Sem CoSem   first.directVisitAttrs  = @first.gathVisitAttrs
+
+ATTR AllCodeBlocks ImplStmts ImplStmt [ directVisitLocalAttrs : {Map Ident String} | | ]
+SEM Program | Program  blocks.directVisitLocalAttrs  = Map.empty
+SEM SemVisit | Visit   stmts.directVisitLocalAttrs   = @attrs.gathVisitLocalAttrs
+                       clauses.directVisitLocalAttrs = @attrs.gathVisitLocalAttrs
+
+--
+-- Dispatch to AttrType
+--
+
+ATTR AttrTypePat AttrTypeCode [ child, name, childItf : Ident | | ]
+
+SEM Pat | Attr
+      inst.tp : AttrTypePat
+      inst.tp = case identName @child of
+                  s | s == "loc"                         -> AttrTypePat_ProdLocal
+                    | s == "lhs"                         -> AttrTypePat_Lhs
+                    | s == "vis"                         -> AttrTypePat_VisLocal
+                    | @child `Set.member` @lhs.allVisits -> AttrTypePat_Visit
+                    | @loc.childItf == locQIdent         -> AttrTypePat_ProdLocal
+                    | otherwise                          -> AttrTypePat_Child
+      tp.child    = @child
+      tp.name     = @loc.origName
+      tp.childItf = head @loc.childItf
+
+SEM Item | Attr
+      inst.tp : AttrTypeCode
+      inst.tp = case identName @child of
+                  s | s == "loc"                         -> AttrTypeCode_ProdLocal
+                    | s == "lhs"                         -> AttrTypeCode_Lhs
+                    | s == "vis"                         -> AttrTypeCode_VisLocal
+                    | @child `Set.member` @lhs.allVisits -> AttrTypeCode_Visit
+                    | @loc.childItf == locQIdent         -> AttrTypeCode_ProdLocal
+                    | otherwise                          -> AttrTypeCode_Child
+      tp.child    = @child
+      tp.name     = @loc.origName
+      tp.childItf = head @loc.childItf
+
+-- computation of defineable attributes
+--   * all syn attrs of lhs
+--   * inh attrs of visits of children
+--      N.B. we may wish to check that we only define inherited attrs of
+--      actually invoked children. However, this is too restrictive for
+--      the programmer.
+--      We now allow inh attrs to be defined on all visits not invoked yet
+--   * any local attribute is defineable
+
+SEM AttrTypePat
+  | Lhs  -- check if @lhs.name is a syn attr of @lhs.childItf
+      loc.allowedDefs = Map.findWithDefault Map.empty (head @lhs.itf) @lhs.distSynAttrs
+  | Child
+      loc.visits      = Set.toList $ Map.findWithDefault Set.empty @lhs.child @lhs.distChildEffRanges
+      loc.inhMap      = Map.findWithDefault Map.empty @lhs.childItf @lhs.distVisitInhAttrs
+      loc.allowedDefs = Map.unions (map (\v -> Map.findWithDefault Map.empty v @loc.inhMap) @loc.visits)
+  | Visit
+      loc.allowedDefs = Map.findWithDefault Map.empty @lhs.child @lhs.directVisitAttrs
+  | VisLocal
+      loc.allowedDefs = @lhs.directVisitLocalAttrs
+  | Lhs Child Visit VisLocal
+      +errs2 = ( if Map.member @lhs.name @loc.allowedDefs
+                 then Seq.empty
+                 else Seq.singleton (Err_UndeclAttr @lhs.child @lhs.name) ) Seq.><
+
+{
+common :: [[Ident]] -> [Ident]
+common []     = []
+common [x]    = x
+common (x:xs) = x `intersect` common xs
+}
+
+
+--
+-- computation of available attributes
+--
+-- detect duplication + detect missing
+-- we can use a single environment to keep track of the various
+-- forms of attributes, because the "child"-name prevents overlap.
+-- However, since scoping of visit-local attrs is different, we
+-- put these in a separate environment
+--
+
+{
+type At = (Ident,Ident,Bool)  -- True: inherited attr, False: syn attr
+type DefsEnv = Env At (Maybe String)
+
+locIdent, lhsIdent, visIdent :: Ident
+locIdent = ident "loc"
+lhsIdent = ident "lhs"
+visIdent = ident "vis"
+}
+
+ATTR AllCodeBlocks ImplStmts ImplStmt [ | gathDefs, gathVisLocalDefs, distDefs, distVisLocalDefs : DefsEnv | ]
+
+SEM Program | Program  blocks.gathDefs         = emptyEnv
+                       blocks.gathVisLocalDefs = emptyEnv
+                       blocks.distDefs         = @blocks.gathDefs
+                       blocks.distVisLocalDefs = @blocks.gathVisLocalDefs
+
+-- scoping
+SEM Item | Sem CoSem
+      loc.gathDefsIn         = enter @lhs.gathDefs
+      first.gathDefs = @loc.gathDefsInh
+      first.gathVisLocalDefs = enter @lhs.gathVisLocalDefs
+      first.distDefs         = enterWith @loc.localDefs @lhs.distDefs
+      first.distVisLocalDefs = enterWith @loc.localVisLocalDefs @lhs.distVisLocalDefs
+      
+      loc.gathDefsInh = Map.fold (flip (Map.foldWithKey (\n t -> extend (replPos @pos lhsIdent,replPos @pos n,True) (Just t)))) @loc.gathDefsIn @loc.inhAttrMap  -- add all inherited attrs of all visits
+      
+      (lhs.gathDefs, loc.localDefs)                  = leave @first.gathDefs
+      (lhs.gathVisLocalDefs, loc.localVisLocalDefs)  = leave @first.gathVisLocalDefs
+      (lhs.distDefs, loc.localDefs')                 = leave @first.distDefs
+      (lhs.distVisLocalDefs, loc.localVisLocalDefs') = leave @first.distVisLocalDefs
+      
+      +errs3 = addDefErrs'' @loc.localDefs
+      +errs3 = addDefErrs'' @loc.localVisLocalDefs
+      +errs3 = addUseErrs'' @loc.localDefs'
+      +errs3 = addUseErrs'' @loc.localVisLocalDefs'
+
+SEM DataSem | Sem
+      loc.gathDefsIn           = enter @lhs.gathDefs
+      clauses.gathDefs         = @loc.gathDefsInh
+      clauses.gathVisLocalDefs = enter @lhs.gathVisLocalDefs
+      clauses.distDefs         = enterWith @loc.localDefs @lhs.distDefs
+      clauses.distVisLocalDefs = enterWith @loc.localVisLocalDefs @lhs.distVisLocalDefs
+      
+      loc.gathDefsInh = Map.fold (flip (Map.foldWithKey (\n t -> extend (replPos @pos lhsIdent,replPos @pos n,True) (Just t)))) @loc.gathDefsIn @loc.inhAttrMap  -- add all inherited attrs of all visits
+
+      (lhs.gathDefs, loc.localDefs)                  = leave @clauses.gathDefs
+      (lhs.gathVisLocalDefs, loc.localVisLocalDefs)  = leave @clauses.gathVisLocalDefs
+      (lhs.distDefs, loc.localDefs')                 = leave @clauses.distDefs
+      (lhs.distVisLocalDefs, loc.localVisLocalDefs') = leave @clauses.distVisLocalDefs
+
+      +errs3 = addDefErrs'' @loc.localDefs
+      +errs3 = addDefErrs'' @loc.localVisLocalDefs
+      +errs3 = addUseErrs'' @loc.localDefs'
+      +errs3 = addUseErrs'' @loc.localVisLocalDefs'
+
+SEM Clauses | Cons
+      (hd.gathDefs, tl.gathDefs)                       = split @lhs.gathDefs
+      (hd.gathVisLocalDefs, tl.gathVisLocalDefs)       = split @lhs.gathVisLocalDefs
+      (lhs.gathDefs, loc.gathLDefs)                    = merge @hd.gathDefs @tl.gathDefs
+      (lhs.gathVisLocalDefs, loc.gathVisLocalLDefs)    = merge @hd.gathVisLocalDefs @tl.gathVisLocalDefs
+      hd.distDefs                                      = enterWith @loc.gathLDefs @lhs.distDefs
+      hd.distVisLocalDefs                              = enterWith @loc.gathVisLocalLDefs @lhs.distVisLocalDefs
+      (tl.distDefs, loc.localDistDefs)                 = leave @hd.distDefs
+      (tl.distVisLocalDefs, loc.localDistVisLocalDefs) = leave @hd.distVisLocalDefs
+
+      +errs3 = addDefErrs'' @loc.gathLDefs
+      +errs3 = addDefErrs'' @loc.gathVisLocalLDefs
+      +errs3 = addUseErrs'' @loc.localDistDefs
+      +errs3 = addUseErrs'' @loc.localDistVisLocalDefs
+
+SEM SemVisit | Visit
+      loc.ldefs1 = enter @lhs.gathVisLocalDefs
+      stmts.gathVisLocalDefs                          = @loc.ldefs2
+      (lhs.gathVisLocalDefs, loc.localVisLocalDefs)   = leave @impls.gathVisLocalDefs
+      stmts.distVisLocalDefs = enterWith @loc.localVisLocalDefs @lhs.distVisLocalDefs
+      (lhs.distVisLocalDefs, loc.localVisLocalDefs')  = leave @impls.distVisLocalDefs
+
+      +errs3 = addDefErrs'' @loc.localVisLocalDefs
+      +errs3 = addUseErrs'' @loc.localVisLocalDefs'
+-- a SemVisit | Internal is just invisible in this case (treated as a nested tree of clauses)
+
+-- collect the local additions to compute the intersection of them
+ATTR Clauses [ | | gathDefsAdds, gathVisLocalDefsAdds : {[DefsEnv]} ]
+
+SEM Clauses
+  | Cons  lhs.gathDefsAdds         = @loc.gathLDefs         : @tl.gathDefsAdds
+          lhs.gathVisLocalDefsAdds = @loc.gathVisLocalLDefs : @tl.gathVisLocalDefsAdds
+  | Nil   lhs.gathDefsAdds         = []
+          lhs.gathVisLocalDefsAdds = []
+
+SEM ClausesTop
+  | Top  +gathDefs         = push (strip $ intersection @clauses.gathDefsAdds)
+         +gathVisLocalDefs = push (strip $ intersection @clauses.gathVisLocalDefsAdds)
+
+SEM Clause | Clause
+  loc.enterF     = if @loc.isDeepest then enter else id
+  loc.leaveF     = if @loc.isDeepest then leave else (\x -> (x, emptyEnv))
+  loc.enterWithF = if @loc.isDeepest then enterWith else (\_ x -> x)  
+
+  next.gathDefs = @loc.enterF @stmts.gathDefs
+  (impls.gathDefs, loc.nextVisitLocDefs)  = @loc.leaveF @next.gathDefs
+  next.distDefs = @loc.enterWithF @loc.nextVisitLocDefs @stmts.distDefs
+  (impls.distDefs, loc.nextVisitLocDefs') = @loc.leaveF @next.distDefs
+  
+  +errs3 = addDefErrs'' @loc.nextVisitLocDefs
+  +errs3 = addUseErrs'' @loc.nextVisitLocDefs'
+
+  lhs.gathDefs         = @impls.gathDefs
+  lhs.gathVisLocalDefs = @next.gathVisLocalDefs  -- impls can't have gathVisLocalDefs
+
+-- Add chn attrs of visit and check that they are defined when we enter the next visit
+SEM SemVisit | Visit
+      loc.ldefs2 = Map.foldWithKey (\n t -> extend (replPos @pos visIdent,replPos @pos n,True) (Just t)) @loc.ldefs1 @attrs.gathVisitLocalAttrs
+
+ATTR ClausesTop Clauses Clause SemVisit [ localAttrs : {Map Ident String} | | ]
+SEM Item | Sem CoSem  first.localAttrs   = Map.empty
+SEM DataSem | Sem     clauses.localAttrs = Map.empty
+
+SEM SemVisit | Visit  clauses.localAttrs = @attrs.gathVisitLocalAttrs  -- lhs.localAttrs thus refers to the local attrs of the parent
+
+SEM Clause | Clause  -- only when the clause is deepest.
+  loc.missingLocalAttrMap = if @loc.isDeepest
+                            then Map.filterWithKey (\n _ -> not $
+                                   defined (replPos @pos visIdent,replPos @pos n,False) @next.distVisLocalDefs) @lhs.localAttrs
+                            else Map.empty  -- no default rules, maybe in deeper clause
+  loc.deflLocalAttrMap = @loc.missingLocalAttrMap
+  loc.deflLocalAttrs   = Map.keys @loc.deflLocalAttrMap  -- always use default rules for local attributes
+
+SEM SemVisit | Visit
+  loc.inhAttrMap = Map.findWithDefault Map.empty @name (Map.findWithDefault Map.empty (head @lhs.itf) @lhs.distVisitInhAttrs)
+
+ATTR SemVisit ClausesTop Clauses Clause [ visit : Ident | | ]
+SEM Item | Sem CoSem  first.visit   = @name  -- some dummy value
+SEM DataSem | Sem     clauses.visit = @tp    -- some dummy value
+SEM SemVisit | Visit  clauses.visit = @name  -- internal visits are not passed as name
+
+SEM Clause | Clause  -- only when clause is deepest.
+  loc.synAttrMap = Map.findWithDefault Map.empty @lhs.visit (Map.findWithDefault Map.empty (head @lhs.itf) @lhs.distVisitSynAttrs)
+  loc.missingAttrMap = if @loc.isDeepest
+                       then Map.filterWithKey (\n _ -> not $ defined (replPos @pos lhsIdent,n,False) @lhs.distDefs) @loc.synAttrMap
+                       else Map.empty
+  (loc.deflAttrMap, loc.undefAttrMap) = Map.partitionWithKey (\n _ -> Map.member n @loc.distDeflStmts) @loc.missingAttrMap
+  lhs.distDefs = Map.foldWithKey (\n _ -> snd . find (replPos @pos lhsIdent,replPos @pos n,False) Nothing) @impls.distDefs @loc.undefAttrMap  -- bypass inst.dflts
+  loc.deflAttrs = [ (a, Map.findWithDefault (False,Nothing) a @loc.distDeflStmts) | a <- Map.keys @loc.deflAttrMap ]
+  -- +errs1 = (debugMsg ("pos: " ++ show @pos ++ "\nall: " ++ show @lhs.distDefs ++ "\nundef: " ++ show @loc.undefAttrMap ++ "\ndefl: " ++ show @loc.deflAttrMap ++ "\ndefs: " ++ show @loc.distDeflStmts) Seq.><)
+
+SEM AttrTypePat
+  | VisLocal   +gathVisLocalDefs = extend (@lhs.child, @lhs.name, False) Nothing
+  | ProdLocal  +gathDefs = extend (@lhs.child, @lhs.name, False) Nothing
+  | Lhs        +gathDefs = extend (@lhs.child, @lhs.name, False) Nothing
+  | Child      +gathDefs = extend (@lhs.child, @lhs.name, True)  Nothing
+  | Visit      +gathDefs = extend (@lhs.child, @lhs.name, False) Nothing
+
+SEM Pat | AttrCon
+  +gathDefs = \env -> foldr (\(nm,tp) -> extend (@name, nm, not @loc.isLoc) (Just (either show id tp))) env @loc.fields
+
+SEM AttrTypeCode
+  | VisLocal   +distVisLocalDefs = snd . find (@lhs.child, @lhs.name,True) Nothing
+  | ProdLocal  +distDefs = snd . find (@lhs.child, @lhs.name, False) Nothing
+  | Lhs        +distDefs = snd . find (@lhs.child, @lhs.name, True)  Nothing
+  | Child      +distDefs = snd . find (@lhs.child, @lhs.name, False) Nothing
+  | Visit      +distDefs = snd . find (@lhs.child, @lhs.name, True)  Nothing
+
+{
+replPos :: Pos -> Ident -> Ident
+replPos p i = Ident (identName i) p
+}
+
+-- Invoke: bring attrs in scope (but not in the scope of rhs)
+--         + compute attrs to "default"
+SEM Stmt | Invoke
+  loc.inhAttrMap = Map.findWithDefault Map.empty @visit (Map.findWithDefault Map.empty @loc.unqualChildItf @lhs.distVisitInhAttrs)
+  loc.synAttrMap = Map.findWithDefault Map.empty @visit (Map.findWithDefault Map.empty @loc.unqualChildItf @lhs.distVisitSynAttrs)
+  
+  loc.missingAttrMap = Map.filterWithKey (\n _ -> not $ defined (@name,n,True) @lhs.distDefs) @loc.inhAttrMap
+  (loc.deflAttrMap, loc.undefAttrMap) = Map.partitionWithKey (\n _ -> Map.member n @lhs.distDeflStmts) @loc.missingAttrMap
+  loc.deflAttrs = [ (a, Map.findWithDefault (False,Nothing) a @lhs.distDeflStmts) | a <- Map.keys @loc.deflAttrMap ]
+  
+  -- watch out: copy rule would take deflts.distDefs too, resulting in a loop.
+  lhs.distDefs = Map.foldWithKey (\n _ -> snd . find (@name,replPos @pos n,True) Nothing) @code.distDefs @loc.undefAttrMap
+  lhs.gathDefs = Map.foldWithKey (\n t -> extend (@name,replPos @pos n,False) (Just t)) @code.gathDefs @loc.synAttrMap
+
+-- Also in case of implicit invoke
+SEM ImplStmt | Invoke
+  loc.inhAttrMap = Map.findWithDefault Map.empty @visit (Map.findWithDefault Map.empty @itf @lhs.distVisitInhAttrs)
+  loc.synAttrMap = Map.findWithDefault Map.empty @visit (Map.findWithDefault Map.empty @itf @lhs.distVisitSynAttrs)
+  
+  loc.missingAttrMap = Map.filterWithKey (\n _ -> not $ defined (@child,n,True) @lhs.distDefs) @loc.inhAttrMap
+  (loc.deflAttrMap, loc.undefAttrMap) = Map.partitionWithKey (\n _ -> Map.member n @lhs.distDeflStmts) @loc.missingAttrMap
+  loc.deflAttrs = [ (a, Map.findWithDefault (False,Nothing) a @lhs.distDeflStmts) | a <- Map.keys @loc.deflAttrMap ]
+  
+  -- watch out: copy rule would take deflts.distDefs too, resulting in a loop.
+  lhs.distDefs = Map.foldWithKey (\n _ -> snd . find (@child,replPos @pos n,True) Nothing) @lhs.distDefs @loc.undefAttrMap
+  lhs.gathDefs = Map.foldWithKey (\n t -> extend (@child,replPos @pos n,False) (Just t)) @lhs.gathDefs @loc.synAttrMap
+--  +errs2 = debugMsg ("impl invoke: " ++ show @child ++ "." ++ show @visit ++ " base " ++ show @lhs.basename ++": " ++ show @loc.synAttrMap) Seq.><
+
+--
+-- Add implicit invokes. Watch out with assigning attributes to implicit statements.
+--  Must be before the inst.deflts!
+--
+
+SEM Clause | Clause
+  inst.impls : ImplStmts
+  inst.impls = 
+               [ ImplStmt_Invoke @pos nm s (findChild nm @lhs.distChildDefs)
+               | (nm,vs) <- Map.assocs @loc.implicitInvokes, s <- Set.toList vs ]
+
+SEM SemVisit | Visit Internal
+  inst.impls : ImplStmts
+  inst.impls = [ ImplStmt_Invoke @pos nm s (findChild nm @lhs.distChildDefs)
+               | (nm,vs) <- Map.assocs @loc.implicitInvokes, s <- Set.toList vs ]
+
+{
+findChild nm env = itf
+  where (([itf], _), _) = find [nm] (unknQIdent,unknQIdent) env
+}
+
+--
+-- Deal with default rules
+--
+
+SEM Clause | Clause
+  inst.deflts : ImplStmts
+  inst.deflts = map (\(nm,(_,mbCode)) -> ImplStmt_DefaultSyn @pos True nm mbCode) @loc.deflAttrs
+                ++ map (ImplStmt_DefaultVisLocal @pos) @loc.deflLocalAttrs
+
+SEM Stmt | Invoke
+  inst.deflts : ImplStmts
+  inst.deflts = map (\(nm,(empty,mbCode)) -> ImplStmt_DefaultChild @pos empty @name nm mbCode) @loc.deflAttrs
+
+SEM ImplStmt | Invoke
+  inst.deflts : ImplStmts
+  inst.deflts = map (\(nm,(empty,mbCode)) -> ImplStmt_DefaultChild @pos empty @child nm mbCode) @loc.deflAttrs
+
+--
+-- Determine children + input attributes for default rule
+--
+
+SEM ImplStmt | DefaultChild DefaultSyn
+  loc.childrenOrdered  = map fst $ sortBy (\(_,a) (_,b) -> a `compare` b) (Map.assocs @lhs.distChildOcc)
+  loc.availChildren    = [ (c,itf, findVisitOfAttr nm itf @lhs.distAttrVisMap)
+                         | c <- @loc.childrenOrdered
+                         , let ([itf], _) = fst $ find [c] (unknQIdent,unknQIdent) @lhs.distChildDefs
+                               nm = renameAttrFwd @lhs.distRenames c @name
+                         , hasSynAttr nm itf @lhs.distSynAttrs
+                         ]
+
+SEM ImplStmt | DefaultChild  loc.candidateChildren = takeWhile (\(nm,_,_) -> nm /= @child) @loc.availChildren
+SEM ImplStmt | DefaultSyn    loc.candidateChildren = @loc.availChildren
+
+SEM ImplStmt | DefaultChild
+--  +errs2 = debugMsg ("child: " ++ show @child ++ ", attr: " ++ show @name ++ ", children: " ++ show @loc.children) Seq.><
+
+SEM ImplStmt | DefaultChild DefaultSyn
+  (loc.children, loc.errChildren) = partition (\(c,itf,vis) -> visAvailable c itf vis @lhs.availInvokes @lhs.distVisitOrder)
+                                      @loc.candidateChildren
+  loc.childAttrs = map (\(c,_,_) -> (c, renameAttrFwd @lhs.distRenames c @name)) @loc.children
+  +errs2 = \es -> foldr (\(c,itf,vis) -> (Err_ChildSynUnav @pos c itf vis @name Seq.<|)) es @loc.errChildren
+
+SEM ImplStmt | DefaultChild
+  +errs3 = if not @allowEmpty && null @loc.children && not @loc.lhsHasAttr
+           then (Err_MissingAttr True @child (replPos @pos @name) Seq.<|)
+           else id
+
+SEM ImplStmt | DefaultSyn
+  +errs3 = if not @allowEmpty && null @loc.children && not @loc.lhsHasAttr
+           then (Err_MissingAttr False (replPos @pos lhsIdent) @name Seq.<|)
+           else id
+
+-- is there an lhs.name inh attribute?
+-- if the lhs inh attr is in a later visit, this results in a cycle
+SEM ImplStmt | DefaultChild DefaultSyn
+  loc.unqualChildItf = head @lhs.itf
+  loc.lhsHasAttr = isJust $ Map.lookup (True,@name) $
+                     Map.findWithDefault Map.empty @loc.unqualChildItf @lhs.distAttrVisMap
+
+{
+visAvailable child itf vis invokeMap orderMap
+  = any (\start -> vis `elem` dropWhile (/= start) order) invokes
+  where
+    invokes = Set.toList $ Map.findWithDefault Set.empty child invokeMap
+    order   = Map.findWithDefault [] itf orderMap
+
+hasSynAttr nm itf mp = Map.member nm $ Map.findWithDefault Map.empty itf mp
+findVisitOfAttr nm itf mp = Map.findWithDefault (ident "<unknownvisit>") (False,nm) (Map.findWithDefault Map.empty itf mp)
+}
+
+
+--
+-- Lexical occurrence of statements
+--
+
+ATTR AllFinal [ | lexCounter : Int | ]
+
+SEM Program | Program
+  blocks.lexCounter = 1
+
+SEM Stmt | *
+  loc.lexOrder : UNIQUEREF lexCounter
+
+SEM ImplStmt | *
+  loc.lexOrder : UNIQUEREF lexCounter
+
+SEM Clause | Clause            loc.lexOrder : UNIQUEREF lexCounter
+SEM SemVisit | Visit Internal  loc.lexOrder : UNIQUEREF lexCounter
+
+{
+nextUnique :: Int -> (Int, Int)
+nextUnique x = (x+1, x)
+}
+
+--
+-- Lexical occurrence of children
+-- (direct children of a clause)
+
+ATTR Stmts Stmt [ | | gathChildOcc USE {`unionWithMin`} {Map.empty} : {Map Ident Int} ]
+ATTR AllCodeBlocks ImplStmts ImplStmt [ distChildOcc : {Map Ident Int} | | ]
+
+{
+unionWithMin :: Map Ident Int -> Map Ident Int -> Map Ident Int
+unionWithMin = Map.unionWith min
+}
+
+SEM Stmt | Attach  lhs.gathChildOcc = Map.singleton @name @loc.lexOrder
+
+SEM Program | Program  blocks.distChildOcc  = Map.empty
+SEM Item | Sem CoSem   first.distChildOcc   = Map.empty
+SEM DataSem | Sem      clauses.distChildOcc = Map.empty
+
+SEM SemVisit | Visit Internal  loc.distChildOcc = @stmts.gathChildOcc `unionWithMin` @lhs.distChildOcc
+SEM Clause | Clause            loc.distChildOcc = @stmts.gathChildOcc `unionWithMin` @lhs.distChildOcc
+
+--
+-- Define clauses of DataSem in terms of a visit
+--
+
+SEM DataSem | Sem
+  inst.clauses : T_SemVisit
+  inst.clauses = sem_SemVisit_Visit @pos @loc.firstVisit @cyclic (sem_VisitAttrs_Nil) (sem_Stmts @stmts)
+
+--
+-- Some useful properties
+--
+
+ATTR ItfVisits ItfVisit [ | | firstVisit : Ident ]
+SEM ItfVisit | Visit  lhs.firstVisit = @name
+SEM ItfVisits
+  | Cons  lhs.firstVisit = @hd.firstVisit
+  | Nil   lhs.firstVisit = ident "nofirstvisit"
+
+SEM ItfVisit
+  | Visit  loc.itfNm = head @lhs.itf
+
+SEM Attr
+  | Inh Syn  loc.itfNm = head @lhs.itf
+             loc.visNm = head @lhs.visit
+
+ATTR ItfVisit [ mbNextVisit : {Maybe Ident} | | ]
+ATTR ItfVisits [ | | mbNextVisit : {Maybe Ident} ]
+
+SEM ItfVisits
+  | Cons  hd.mbNextVisit  = @tl.mbNextVisit
+          lhs.mbNextVisit = Just @hd.firstVisit
+  | Nil   lhs.mbNextVisit = Nothing
+
+SEM SemVisit | Visit Internal  loc.itfNm = head @lhs.itf
+SEM Clause | Clause            loc.itfNm = head @lhs.itf
+
+ATTR SemVisit [ | | mbNextVisit : {Maybe Ident} ]
+SEM SemVisit
+  | Visit Internal  lhs.mbNextVisit = Just @name
+  | End             lhs.mbNextVisit = Nothing
+
+ATTR MaybeBoundCode [ | | isJust : Bool ]
+SEM MaybeBoundCode
+  | Just     lhs.isJust = True
+  | Nothing  lhs.isJust = False
+
+ATTR Exts Ext [ | | gathExts USE {`Set.union`} {Set.empty} : {Set Ident} ]
+SEM Ext | Ext  lhs.gathExts = Set.singleton @name  
+
+{
+type AttrVisMap = Map Ident (Map (Bool,Ident) Ident)
+}
+
+ATTR BlocksTop Blocks Block Itf [ | | gathAttrVisMap USE {`Map.union`} {Map.empty} : AttrVisMap ]
+ATTR ItfVisits ItfVisit Attrs Attr [ | | gathAttrVisMap USE {`Map.union`} {Map.empty} : {Map (Bool,Ident) Ident} ]
+SEM Itf | Itf  lhs.gathAttrVisMap = Map.singleton @name @visits.gathAttrVisMap
+SEM Attr | Inh Syn  lhs.gathAttrVisMap = Map.singleton (@loc.isInh, @name) (head @lhs.visit)
+SEM Attr | Inh  loc.isInh = True
+         | Syn  loc.isInh = False
+
+ATTR AllCodeBlocks ImplStmts ImplStmt [ distAttrVisMap : AttrVisMap | | ]
+SEM Program | Program  blocks.distAttrVisMap = @blocks.gathAttrVisMap
+
+{
+type DataMap  = Map Ident ConMap
+type ConMap   = Map Ident (Int, FieldMap)
+type FieldMap = Map Ident (Int, Either Ident String)
+}
+
+ATTR BlocksTop Blocks Block Data Type [ | | gathDataMap USE {`Map.union`} {Map.empty} : DataMap ]
+ATTR Cons Con [ | | gathConMap USE {`Map.union`} {Map.empty} : ConMap ]
+ATTR Fields Field [ | | gathFieldMap USE {`Map.union`} {Map.empty} : FieldMap ]
+
+SEM Data  | Data   lhs.gathDataMap  = Map.singleton @name @cons.gathConMap
+SEM Con   | Con    lhs.gathConMap   = Map.singleton @name (@lhs.nr, @fields.gathFieldMap)
+SEM Field | Field  lhs.gathFieldMap = Map.singleton @name (@lhs.nr, @type.fldType)
+
+ATTR AllCodeBlocks ImplStmts ImplStmt [ distDataMap : DataMap | | ]
+SEM Program | Program  blocks.distDataMap = @blocks.gathDataMap
+
+-- Basename: a unique name for the current clause. VisitNames are shared.
+ATTR AllFinal [ basename : QIdent | | ]
+ATTR AllVisitClauses [ semBasename : QIdent | | ]
+
+SEM Program | Program  blocks.basename = [ident "<root>"]
+
+SEM Item | Sem CoSem  loc.basename    = [@name]
+                      loc.semBasename = [@name]
+SEM DataSem | Sem     loc.basename    = [@tp]
+                      loc.semBasename = [@tp]
+SEM Clause | Clause   loc.basename    = @name : @lhs.basename
+
+-- within the context of a cosem or not
+ATTR AllVisitClauses [ withinCoSem : Bool | | ]
+
+SEM Item | Sem     first.withinCoSem   = False
+SEM Item | CoSem   first.withinCoSem   = True
+SEM DataSem | Sem  clauses.withinCoSem = False
+
+-- mode of a Mode
+ATTR Mode [ | | isMatch : Bool ]
+SEM Mode | Match   lhs.isMatch = True
+         | Assert  lhs.isMatch = False
+
+-- position of a DataSem
+
+ATTR DataSem [ | | pos : Pos ]
+SEM DataSem | Sem  lhs.pos = @pos
+SEM Item | DataSem  loc.pos = @sem.pos
+
+
+--
+-- Convert type aliases to their structural representation
+--
+
+ATTR AliasType [ | | alias : SELF ]
+ATTR BlocksTop Blocks Block Type [ | | gathAliasses USE {`Map.union`} {Map.empty} : {Map Ident AliasType} ]
+ATTR AllCodeBlocks ImplStmts ImplStmt Data Cons Con Fields Field FieldType Type [ distAliasses : {Map Ident AliasType} | | ]
+
+SEM Type | Alias       lhs.gathAliasses = Map.singleton @name @type.alias
+SEM Program | Program  blocks.distAliasses = @blocks.gathAliasses
+
+SEM Pat  | AttrCon       loc.mbAlias = Map.lookup @dt @lhs.distAliasses
+SEM Item | Construct     loc.mbAlias = Map.lookup @data @lhs.distAliasses
+SEM FieldType | Nonterm  loc.mbAlias = Map.lookup @name @lhs.distAliasses
+
+SEM Type | Alias
+inst.data : Data
+inst.data = @type.data
+
+ATTR AliasType [ pos : Pos name : Ident vars : Vars | | data : {Data} ]
+SEM Type | Alias  type.pos  = @pos
+                  type.name = @name
+                  type.vars = @vars.self
+
+SEM AliasType
+  | Prod   lhs.data = let mkFld i nm = Field_Field (Ident ("x" ++ show i) @lhs.pos) (FieldType_Nonterm nm)
+                      in Data_Data @lhs.pos @lhs.name @lhs.vars
+                           [Con_Con @lhs.pos (Ident "Prod" @lhs.pos) [] (zipWith mkFld [1..] @fields) ] []
+  | List   lhs.data = Data_Data @lhs.pos @lhs.name @lhs.vars
+                        [ Con_Con @lhs.pos (Ident "Cons" @lhs.pos) []
+                            [ Field_Field (Ident "hd" @lhs.pos) (FieldType_Nonterm @type)
+                            , Field_Field (Ident "tl" @lhs.pos) (FieldType_Nonterm @lhs.name)
+                            ]
+                        , Con_Con @lhs.pos (Ident "Nil" @lhs.pos) [] []
+                        ] []
+  | Maybe  lhs.data = Data_Data @lhs.pos @lhs.name @lhs.vars
+                        [ Con_Con @lhs.pos (Ident "Just" @lhs.pos) []
+                            [ Field_Field (Ident "just" @lhs.pos) (FieldType_Nonterm @type)
+                            ]
+                        , Con_Con @lhs.pos (Ident "Nothing" @lhs.pos) [] []
+                        ] []
+
+ATTR Vars Var [ | | self : SELF vars USE {++} {[]} : {[Ident]} ]
+SEM Var | Var  lhs.vars = [@name]
+
+--
+-- Deal with type variables
+--
+
+-- todo
+ATTR ItfVisits ItfVisit Cons Con [ vars : {[Ident]} | | ]
+
+--
+-- Extra Interfaces and semantics
+--
+
+ATTR Blocks Block Data Cons Con Itf ItfVisits ItfVisit [ | | extraBlocks USE {++} {[]} : {Blocks} ]
+
+SEM BlocksTop | Top
+  inst.extra : BlocksTop
+  inst.extra = if null @blocks.extraBlocks
+               then BlocksTop_None
+               else BlocksTop_Top @blocks.extraBlocks
+
+SEM Con | Con
+  lhs.extraBlocks = if genConNonterms @lhs.opts
+                    then [@loc.constr, @loc.deconstr, @loc.constrSem, @loc.deconstrSem]
+                    else []
+  loc.conItfNm    = conItf @lhs.data @name
+  loc.deconItfNm  = deconItf @lhs.data @name
+  loc.allVarNms   = sort (@lhs.vars ++ @vars.vars)
+  loc.allVars     = map Var_Var @loc.allVarNms
+  loc.constr   = Block_Itf $
+                 Itf_Itf @pos @loc.conItfNm @loc.allVars [ItfVisit_Visit @pos (Ident "construct" @pos) False []
+                   ( Attr_Syn (Ident "data" @pos) (show @lhs.data)
+                   : [ Attr_Inh k (either show id t) | (k,t) <- sortAssocs $ assocs @fields.gathFields ] )]
+  loc.deconstr = Block_Itf $
+                 Itf_Itf @pos @loc.deconItfNm @loc.allVars [ItfVisit_Visit @pos (Ident "deconstruct" @pos) False []
+                   ( Attr_Inh (Ident "data" @pos) (show @lhs.data)
+                   : [ Attr_Syn k (either show id t) | (k,t) <- sortAssocs $ assocs @fields.gathFields ] )]
+  loc.constrSem   = Block_Item @loc.conItfNm $
+                      Item_Sem @pos @loc.conItfNm @loc.conItfNm [] Nothing $
+                        SemVisit_Visit @pos (Ident "construct" @pos) False [] [] $ ClausesTop_Top [
+                          Clause_Clause @pos (Ident "dispatch" @pos) [
+                            Stmt_Eval Mode_Assert
+                              (Pat_Attr (Ident "lhs" @pos) (Ident "data" @pos))
+                              (BoundCode_Code Bind_Fun @pos $ Code_Code [
+                                Item_Construct @pos @lhs.data @name
+                                  [ ExprField_Field k $ Code_Code [
+                                        Item_Attr @pos (Ident "lhs" @pos) k
+                                      ]
+                                  | (k,_) <- assocs @fields.gathFields ]
+                              ] ) ] SemVisit_End ]
+  loc.deconstrSem = Block_Item @loc.deconItfNm $
+                      Item_Sem @pos @loc.deconItfNm @loc.deconItfNm [] Nothing $
+                        SemVisit_Visit @pos (Ident "deconstruct" @pos) False [] [] $ ClausesTop_Top [
+                          Clause_Clause @pos (Ident "dispatch" @pos) [
+                            Stmt_Eval Mode_Match
+                              (Pat_AttrCon @name (Ident "lhs" @pos) @lhs.data)
+                              (BoundCode_Code Bind_Fun @pos $ Code_Code [
+                                 Item_Attr @pos (Ident "lhs" @pos) (Ident "data" @pos)])
+                            ] SemVisit_End ]
+
+{
+conItf   dt con = Ident ("Con_" ++ show dt ++ "_" ++ show con) (identPos con)
+deconItf dt con = Ident ("Decon_" ++ show dt ++ "_" ++ show con) (identPos con)
+noIterNm dt con = Ident ("NoIter_" ++ show dt ++ "_" ++ show con) (identPos con)
+}
+
+SEM ItfVisit | Visit
+  lhs.extraBlocks = if genCoSems @lhs.opts
+                     then [@loc.noIterSem]
+                     else []
+  loc.unqualItf = head @lhs.itf
+  loc.noIterNm  = noIterNm @loc.unqualItf @name
+  loc.noIterSem = Block_Item @loc.noIterNm $
+                    Item_CoSem @pos @loc.noIterNm @loc.unqualItf @name [] Nothing $
+                      SemVisit_Visit @pos @name False [] [] $ ClausesTop_Top []
+
+--
+-- Compute the next visit of the (needed) children in scope
+--
+
+ATTR Stmts Stmt ImplStmts ImplStmt [ | gathNextVisits : {Map Ident (Maybe Ident)} | ]
+ATTR SemVisit ClausesTop Clauses Clause [ distNextVisits : {Map Ident (Maybe Ident)} | | ]
+
+SEM Item | Sem CoSem  first.distNextVisits   = Map.empty
+SEM DataSem | Sem     clauses.distNextVisits = Map.empty
+
+SEM Stmt | Invoke      loc.mbNextVisit = visitAfter @visit @loc.childVisits
+SEM ImplStmt | Invoke  loc.mbNextVisit = visitAfter @visit @loc.childVisits
+
+SEM SemVisit | Visit Internal
+  stmts.gathNextVisits = Map.empty
+  clauses.distNextVisits = @impls.gathNextVisits `Map.union` @lhs.distNextVisits
+SEM Clause | Clause
+  stmts.gathNextVisits = Map.empty
+  next.distNextVisits = let ks = Map.keysSet @next.allReqInvokes
+                        in Map.filter (maybe False (`Set.member` ks))
+                                      (@impls.gathNextVisits `Map.union` @lhs.distNextVisits)
+
+SEM Stmt | Invoke      +gathNextVisits = Map.insertWith (laterVisit @loc.childVisits) @name @loc.mbNextVisit
+SEM ImplStmt | Invoke  +gathNextVisits = Map.insertWith (laterVisit @loc.childVisits) @child @loc.mbNextVisit
+
+{
+visitAfter :: Ident -> [Ident] -> Maybe Ident
+visitAfter nm (a : b : nms)
+  | nm == a    = Just b
+  | otherwise  = visitAfter nm (b : nms)
+visitAfter _ _ = Nothing
+
+laterVisit :: [Ident] -> Maybe Ident -> Maybe Ident -> Maybe Ident
+laterVisit _ Nothing  Nothing  = Nothing
+laterVisit _ Nothing  (Just x) = Just x
+laterVisit _ (Just x) Nothing  = Just x
+laterVisit xs (Just l) (Just r) = Just $ laterVisit' xs l r
+
+laterVisit' [] _ r = r
+laterVisit' (x:xs) l r
+  | x == l    = l
+  | x == r    = r
+  | otherwise = laterVisit' xs l r
+}
+
+ATTR SemVisit ClausesTop Clauses Clause [ myNextVisits : {Map Ident (Maybe Ident)} | | ]
+SEM Item | Sem CoSem  loc.myNextVisits = Map.empty
+SEM DataSem | Sem     loc.myNextVisits = Map.empty
+
+SEM SemVisit | Visit
+  loc.myNextVisits = Map.filter isJust @lhs.distNextVisits
+
+
+--
+-- Computation of child ranges
+-- (note: allDistChildMinRanges is passed to nested sems)
+-- can be used to determine available children
+--
+
+ATTR AllCodeBlocks ImplStmts ImplStmt [ distAllChildMinRanges, distChildMinRanges : {Map Ident [Ident]} | | ]
+ATTR AllCodeBlocks ImplStmts ImplStmt [ distChildEffRanges : {Map Ident (Set Ident)} | | ]
+ATTR Stmts Stmt [ | | gathChildMinRanges USE {`unionWithPlusplus`} {Map.empty} : {Map Ident [Ident]} ]
+ATTR Stmts Stmt [ | | gathChildEffRanges USE {`unionWithUnion`} {Map.empty} : {Map Ident (Set Ident)} ]
+
+SEM Program | Program  blocks.distChildMinRanges    = Map.empty
+                       blocks.distAllChildMinRanges = Map.empty
+                       blocks.distChildEffRanges    = Map.empty
+SEM DataSem | Sem      clauses.distChildMinRanges   = Map.empty
+                       clauses.distChildEffRanges   = Map.empty
+SEM Item | Sem CoSem   first.distChildMinRanges     = Map.empty
+                       first.distChildEffRanges     = Map.empty
+
+SEM Clause | Clause
+  loc.distChildMinRanges    = @stmts.gathChildMinRanges `unionWithPlusplus` @lhs.distChildMinRanges
+  loc.distAllChildMinRanges = @stmts.gathChildMinRanges `Map.union` @lhs.distAllChildMinRanges -- shadows
+  loc.distChildEffRanges    = @stmts.gathChildEffRanges `unionWithUnion` @lhs.distChildEffRanges
+  next.distChildEffRanges   = @loc.distChildEffRanges `diffInside` @loc.availInvokes
+  loc.introChildren         = Map.keysSet (Map.difference @stmts.gathChildMinRanges @lhs.distChildMinRanges)
+
+SEM SemVisit | Visit Internal
+  loc.distChildMinRanges    = @stmts.gathChildMinRanges `unionWithPlusplus` @lhs.distChildMinRanges
+  loc.distAllChildMinRanges = @stmts.gathChildMinRanges `Map.union` @lhs.distChildMinRanges  -- shadows
+  loc.distChildEffRanges    = @stmts.gathChildEffRanges `unionWithUnion` @lhs.distChildEffRanges
+  loc.introChildren         = Map.keysSet (Map.difference @stmts.gathChildMinRanges @lhs.distAllChildMinRanges)
+
+SEM Stmt | Attach
+  lhs.gathChildMinRanges = Map.singleton @name [@visit]
+  lhs.gathChildEffRanges = Map.singleton @name (Set.fromList $ dropWhile (/= @loc.visit) @loc.childVisits)
+
+-- detect ambiguous child attachments
+-- there may not be two attach-stmts in a scope simultaneously with the same start visit
+SEM Stmt | Attach
+  +errs2 = if (length $ filter (== @visit) $ Map.findWithDefault [] @name @lhs.distChildMinRanges) > 1
+           then (Err_AmbAttach @name @visit Seq.<|)
+           else id
+
+--
+-- Computation of implicit invokes
+--
+
+-- banned invokes: an invoke explicitly declared in some clause. May not be implicitly invoked higher-up
+ATTR AllVisitClauses Stmts Stmt [ | | bannedInvokes USE {`unionWithUnion`} {Map.empty} : {Map Ident (Set Ident)} ]
+ATTR Clauses Clause Stmts Stmt [ | | explInvokes USE {`unionWithUnion`} {Map.empty} : {Map Ident (Set Ident)} ]
+
+SEM Stmt | Invoke              lhs.explInvokes = Map.singleton @name (Set.singleton @visit)
+SEM ClausesTop | Top           +bannedInvokes  = @clauses.explInvokes `unionWithUnion`
+SEM SemVisit | Visit Internal  +bannedInvokes  = @stmts.explInvokes `unionWithUnion`
+
+-- invokes needed on children
+ATTR AllCodeBlocks [ | | minReqInvokes, allReqInvokes USE {`unionWithUnion`} {Map.empty} : {Map Ident (Set Ident)} ]
+ATTR Clauses [ | | commonInvokes : {[Map Ident (Set Ident)]} ]
+
+SEM Clauses
+  | Cons  lhs.commonInvokes = @hd.allReqInvokes : @tl.commonInvokes
+  | Nil   lhs.commonInvokes = []
+
+SEM ClausesTop | Top
+  lhs.minReqInvokes = intersectionsInvoke (@clauses.minReqInvokes : @clauses.commonInvokes)  
+
+{
+intersectionsInvoke []     = Map.empty
+intersectionsInvoke [x]    = x
+intersectionsInvoke (x:xs) = Map.intersectionWith Set.intersection x (intersectionsInvoke xs)
+}
+
+SEM Clause | Clause
+  loc.minReqInvokes1 = @stmts.minReqInvokes `unionWithUnion` @next.minReqInvokes  -- all needed
+  loc.allReqInvokes1 = @stmts.allReqInvokes `unionWithUnion` @next.allReqInvokes
+  loc.minReqInvokes  = Map.filterWithKey (\k _ -> not (Set.member k @loc.introChildren)) @loc.minReqInvokes1
+  loc.allReqInvokes  = Map.filterWithKey (\k _ -> not (Set.member k @loc.introChildren)) @loc.allReqInvokes1
+
+SEM SemVisit | Visit Internal
+  loc.minReqInvokes1 = @stmts.minReqInvokes `unionWithUnion` @clauses.minReqInvokes
+  loc.allReqInvokes1 = @stmts.allReqInvokes `unionWithUnion` @clauses.allReqInvokes
+  loc.minReqInvokes  = Map.filterWithKey (\k _ -> not (Set.member k @loc.introChildren)) @loc.minReqInvokes1
+  loc.allReqInvokes  = Map.filterWithKey (\k _ -> not (Set.member k @loc.introChildren)) @loc.allReqInvokes1
+
+-- register all needs for visits
+SEM Item | Detach
+  loc.minRanges     = Set.fromList $ Map.findWithDefault [] @name @lhs.distAllChildMinRanges
+  loc.potentialReqs = drop 1 $ dropWhile (/= @visit) $ reverse @loc.visitOrder
+  loc.actualReqs    = take (1 + length (takeWhile (\x -> not $ Set.member x @loc.minRanges) @loc.potentialReqs)) @loc.potentialReqs
+
+  loc.invokeReqs    = Map.singleton @name $ Set.fromList @loc.actualReqs
+  lhs.minReqInvokes = @loc.invokeReqs
+  lhs.allReqInvokes = @loc.invokeReqs
+
+-- Introduces the need for all visits having the attribute
+-- specified by the default of all children in scope
+-- (iff not banned: checked higher up)
+SEM Stmt | Default
+  -- enumerate direct children and their itfs
+  -- enumerate visits with attr name (use attrVisMap)
+  -- add to minReqInvokes and allReqInvokes
+  loc.visitReqs = [ Map.singleton child $ Set.fromList $ rangeUpTo (fromJust mbVis) range
+                    | child <- Map.keys @lhs.distChildMinRanges
+                    , let itf         = findChild child @lhs.distChildDefs
+                          attrVisits  = Map.findWithDefault Map.empty itf @lhs.distAttrVisMap
+                          childVisits = Map.findWithDefault [] itf @lhs.distVisitOrder
+                          minRanges   = Set.fromList $ Map.findWithDefault [] child @lhs.distChildMinRanges
+                          range       = dropWhile (\v -> not (v `Set.member` minRanges)) childVisits
+                          mbVis       = Map.lookup (False,nm) attrVisits
+                          nm          = renameAttrFwd @lhs.distRenames child @name
+                    , isJust mbVis
+                    ]
+  loc.invokeReqs    = Map.unionsWith Set.union @loc.visitReqs
+  lhs.minReqInvokes = @loc.invokeReqs
+  lhs.allReqInvokes = @loc.invokeReqs
+
+SEM Stmt | Attach
+  -- enumerate all defaults in scope
+  -- lookup if syn attr exists for this child
+  -- if yes, add a need on the visit
+  loc.attrVisits    = Map.findWithDefault Map.empty @type @lhs.distAttrVisMap
+  loc.visitReqs     = [ rangeUpTo (fromJust mbVis) $ dropWhile (/= @loc.visit) @loc.childVisits 
+                      | attr <- Map.keys @lhs.distDeflStmts
+                      , let mbVis = Map.lookup (False,attr) @loc.attrVisits
+                      , isJust mbVis ]
+  loc.invokeReqs    = Map.singleton @name $ Set.fromList (concat @loc.visitReqs)
+  lhs.minReqInvokes = @loc.invokeReqs
+  lhs.allReqInvokes = @loc.invokeReqs
+
+{
+rangeUpTo :: Ident -> [Ident] -> [Ident]
+rangeUpTo _ [] = []
+rangeUpTo vis (x:xs)
+  | x == vis  = [x]
+  | otherwise = x : rangeUpTo vis xs
+}
+
+SEM AttrTypeCode | Child
+  loc.visitOfAttr   = Map.findWithDefault unknIdent (False,@lhs.name)
+                        (Map.findWithDefault Map.empty @lhs.childItf @lhs.distAttrVisMap)
+  loc.minRanges     = Set.fromList $ Map.findWithDefault [] @lhs.child @lhs.distAllChildMinRanges
+  loc.potentialReqs = dropWhile (/= @loc.visitOfAttr) $ reverse @loc.visitOrder
+  loc.actualReqs    = take (1 + length (takeWhile (\x -> not $ Set.member x @loc.minRanges) @loc.potentialReqs)) @loc.potentialReqs
+  
+  loc.invokeReqs    = Map.singleton @lhs.child $ Set.fromList @loc.actualReqs
+  lhs.minReqInvokes = @loc.invokeReqs
+  lhs.allReqInvokes = @loc.invokeReqs
+
+-- available invokes (two flavours: nested and not nested)
+ATTR AllCodeBlocks ImplStmts ImplStmt [ availInvokes, allAvailInvokes : {Map Ident (Set Ident)} | | ]
+
+SEM Program | Program  blocks.availInvokes    = Map.empty
+                       blocks.allAvailInvokes = Map.empty
+
+SEM DataSem | Sem     clauses.availInvokes    = Map.empty
+SEM Item | Sem CoSem  first.availInvokes      = Map.empty
+
+SEM SemVisit | Visit Internal
+  loc.implicitInvokes   = @loc.minReqInvokes1 `diffInside` @lhs.availInvokes
+                                              `diffInside` @stmts.explInvokes
+                                              `diffInside` @clauses.bannedInvokes
+  loc.additionalInvokes = @loc.minReqInvokes1 `diffInside` @clauses.bannedInvokes `unionWithUnion` @stmts.explInvokes
+  loc.availInvokes      = @loc.additionalInvokes `unionWithUnion` @lhs.availInvokes
+  loc.allAvailInvokes   = @loc.additionalInvokes `unionWithUnion` (
+                            Map.filterWithKey (notIn @loc.introChildren) @lhs.allAvailInvokes )
+--  +errs1 = debugMsg ("visit: " ++ show @name ++ "\n impl: " ++ show @loc.implicitInvokes ++"\n banned: " ++ show @clauses.bannedInvokes) Seq.><
+
+SEM Clause | Clause
+  loc.implicitInvokes   = @loc.minReqInvokes1 `diffInside` @lhs.availInvokes
+                                              `diffInside` @stmts.explInvokes
+                                              `diffInside` @next.bannedInvokes
+  loc.additionalInvokes = @loc.minReqInvokes1 `diffInside` @next.bannedInvokes `unionWithUnion` @stmts.explInvokes
+  loc.availInvokes      = @loc.additionalInvokes `unionWithUnion` @lhs.availInvokes
+  loc.allAvailInvokes   = @loc.additionalInvokes `unionWithUnion` (
+                            Map.filterWithKey (notIn @loc.introChildren) @lhs.allAvailInvokes )
+  
+--  +errs1 = debugMsg ("clause: " ++ show @name ++ "\n impl: " ++ show @loc.implicitInvokes ++"\n banned: " ++ show @next.bannedInvokes) Seq.><
+
+{
+notIn :: Ord a => Set a -> a -> b -> Bool
+notIn s k _ = not (k `Set.member` s)
+
+diffInside :: Map Ident (Set Ident) -> Map Ident (Set Ident) -> Map Ident (Set Ident)
+diffInside = Map.differenceWith f where
+  f a b = let r = Set.difference a b
+          in if Set.null r then Nothing else Just r
+}
+
+-- Report errors for missing invokes
+ATTR Code Items Item  AllVisitClauses Stmts Stmt
+     MaybeBoundCode BoundCode AttrTypeCode
+     [ | | gathMissingInvokes USE {`Set.union`} {Set.empty} : {Set (Ident,Ident)}]
+  
+SEM Item | Detach
+  lhs.gathMissingInvokes = Set.fromList [ (k, v) | (k,vs) <- Map.assocs (@loc.invokeReqs `diffInside` @lhs.allAvailInvokes)
+                                        , v <- Set.toList vs ]
+
+SEM AttrTypeCode | Child
+  lhs.gathMissingInvokes = Set.fromList [ (k, v) | (k,vs) <- Map.assocs (@loc.invokeReqs `diffInside` @lhs.allAvailInvokes)
+                                        , v <- Set.toList vs ]
+
+SEM SemVisit | Visit Internal
+  loc.missingInvokes = Set.toList (@stmts.gathMissingInvokes `Set.difference` @clauses.gathMissingInvokes)
+  +errs2 = Seq.fromList (map (\(nm,vs) -> Err_MissingVisit @pos nm vs) @loc.missingInvokes) Seq.><
+
+SEM Clause | Clause
+  loc.missingInvokes = Set.toList (@stmts.gathMissingInvokes `Set.difference` @next.gathMissingInvokes)
+  +errs2 = Seq.fromList (map (\(nm,vs) -> Err_MissingVisit @pos nm vs) @loc.missingInvokes) Seq.><
+
+--
+-- Propagate default-stmts in scope
+--
+
+ATTR AllCodeBlocks ImplStmts ImplStmt [ distDeflStmts : {Map Ident (Bool,Maybe Int)} | | ]
+ATTR Stmts Stmt [ | | gathDeflStmts USE {`Map.union`} {Map.empty} : {Map Ident (Bool,Maybe Int)} ]
+
+SEM Program | Program  blocks.distDeflStmts  = Map.empty
+SEM Item | Sem CoSem   first.distDeflStmts   = Map.empty
+SEM DataSem | Sem      clauses.distDeflStmts = Map.empty
+
+SEM Stmt | Default             loc.codeId : UNIQUEREF codeIdCounter
+                               loc.mbCodeId = if @mbCode.isJust then Just @loc.codeId else Nothing
+                               lhs.gathDeflStmts = Map.singleton @name (@allowEmpty,@mbCodeId)
+SEM SemVisit | Visit Internal  loc.distDeflStmts = @stmts.gathDeflStmts `Map.union` @lhs.distDeflStmts
+SEM Clause | Clause            loc.distDeflStmts = @stmts.gathDeflStmts `Map.union` @lhs.distDeflStmts
+
+ATTR AllCodeBlocks [ | codeIdCounter : Int | ]
+SEM Program | Program  blocks.codeIdCounter = 1
+
+SEM Stmt | Default
+  +errs1 = if Map.findWithDefault (@allowEmpty,@mbCodeId) @name @lhs.distDeflStmts /= (@allowEmpty,@mbCodeId)
+           then (Err_AmbDefault @pos @name Seq.<|)
+           else id
+
+--
+-- Gather visit starts and ends in lexical order
+--
+
+ATTR AllCodeBlocks [ | | gathVisitStarts, gathVisitEnds USE {Seq.><} {Seq.empty} : {Seq DepItem} ]
+SEM SemVisit | Visit Internal
+  +gathVisitStarts = @loc.scopeDep   Seq.<|
+  +gathVisitEnds   = @loc.visitEndDep Seq.<|
+
+--
+-- Gather semantics starts and ends (in lexical order)
+--
+
+ATTR AllCodeBlocks [ | | gathSemStarts USE {Seq.><} {Seq.empty} : {Seq DepItem} ]
+SEM SemVisit | Visit
+  +gathSemStarts = if @lhs.visitNr == 1
+                   then (@loc.scopeDep Seq.<|)
+                   else id
+
+
+--
+-- Determine visit start rank
+--
+
+ATTR AllVisitClauses [ | | gathVisRankMap USE {`mappend`} {mempty} : {IntMap Ident} ]
+ATTR AllVisitClauses Stmts Stmt ImplStmts ImplStmt [ distVisRankMap : {IntMap Ident} | | ]
+
+SEM SemVisit | Visit Internal
+  +gathVisRankMap = IntMap.insert @loc.rank @name
+
+SEM Item | Sem CoSem  first.distVisRankMap   = @first.gathVisRankMap
+SEM DataSem | Sem     clauses.distVisRankMap = @clauses.gathVisRankMap
+
+SEM Stmt | *      loc.destVisit = getDestVisit @loc.rank @lhs.distVisRankMap
+SEM ImplStmt | *  loc.destVisit = getDestVisit @loc.rank @lhs.distVisRankMap
+
+{
+getDestVisit :: Int -> IntMap Ident -> Ident
+getDestVisit  rank ranks
+  = maybe (ident "unknownDestVisit") fst mbMax
+  where (smaller, _) = IntMap.split rank ranks
+        mbMax        = IntMap.maxView smaller
+}
+
+--
+-- Cyclic visit information
+--
+
+{
+type CycVisMap = Map Ident (Set Ident)
+}
+
+ATTR BlocksTop Blocks Block Itf [ | | gathCycVisMap USE {`Map.union`} {Map.empty} : CycVisMap ]
+ATTR ItfVisits ItfVisit [ | | gathCycVisits USE {`Set.union`} {Set.empty} : {Set Ident}]
+ATTR Attrs Attr [ visCyclic : Bool | | ]
+ATTR AllFinal [ distCycVisMap : CycVisMap | | ]
+
+SEM ItfVisit | Visit   lhs.gathCycVisits = if @cyclic then Set.singleton @name else Set.empty
+                       loc.visCyclic     = @cyclic
+SEM Itf | Itf          lhs.gathCycVisMap = Map.singleton @name @visits.gathCycVisits
+SEM Program | Program  blocks.distCycVisMap = @blocks.gathCycVisMap
+
+ATTR SemVisit ClausesTop Clauses Clause Stmts Stmt ImplStmts ImplStmt [ fullCyclicVisits : {Set Ident} | | ]
+ATTR SemVisit ClausesTop Clauses Clause [ fullCyclic : Bool | | ]
+
+SEM Item | Sem CoSem  first.fullCyclicVisits   = Map.findWithDefault Set.empty @tp @lhs.distCycVisMap
+                      first.fullCyclic         = False
+SEM DataSem | Sem     clauses.fullCyclicVisits = Map.findWithDefault Set.empty @tp @lhs.distCycVisMap
+                      clauses.fullCyclic       = False
+
+SEM SemVisit | Visit
+  loc.fullCyclic  = Set.member @name @lhs.fullCyclicVisits
+  loc.allowCycles = @cyclic || @lhs.fullCyclic
+
+SEM SemVisit | Internal  -- may not occur in a full cyclic visit
+  loc.fullCyclic  = False
+  loc.allowCycles = @cyclic
+  +errs3 = if @lhs.fullCyclic
+           then (Err_InternalInCyclic @pos @name Seq.<|)
+           else id
+
+ATTR SemVisit ClausesTop Clauses Clause [ | | gathAllowCycVisits USE {`mappend`} {mempty} : {Set Ident} ]
+ATTR SemVisit ClausesTop Clauses Clause Stmts Stmt ImplStmts ImplStmt [ allowCycVisits : {Set Ident} | | ]
+
+SEM Item | Sem CoSem    first.allowCycVisits   = @first.gathAllowCycVisits
+SEM DataSem | Sem       clauses.allowCycVisits = @clauses.gathAllowCycVisits
+SEM SemVisit | Visit    +gathAllowCycVisits    = if @loc.allowCycles then Set.insert @name else id
+             | Internal +gathAllowCycVisits    = if @loc.allowCycles then Set.insert @loc.name else id
+
+SEM Stmt | *      loc.fullCyclic  = Set.member @loc.destVisit @lhs.fullCyclicVisits  
+                  loc.allowCycles = Set.member @loc.destVisit @lhs.allowCycVisits
+SEM ImplStmt | *  loc.fullCyclic  = Set.member @loc.destVisit @lhs.fullCyclicVisits
+                  loc.allowCycles = Set.member @loc.destVisit @lhs.allowCycVisits
+
+SEM Stmt | Invoke
+  loc.visitCyclic  = Set.member @visit (Map.findWithDefault Set.empty @loc.unqualChildItf @lhs.distCycVisMap)
+  loc.behaveCyclic = @loc.fullCyclic || @loc.visitCyclic
+
+SEM ImplStmt | Invoke
+  loc.visitCyclic  = Set.member @visit (Map.findWithDefault Set.empty @itf @lhs.distCycVisMap)
+  loc.behaveCyclic = @loc.fullCyclic || @loc.visitCyclic
+
+-- sanity check
+SEM Stmt
+  | Eval      +errs5 = if @loc.isCyclic && @mode.isMatch
+                       then (Err_MatchCyclic @loc.pos Seq.<|)
+                       else id
+              +errs5 = if @loc.isCyclic && not @code.isFun
+                       then (Err_EffCyclic @loc.pos Seq.<|)
+                       else id
+  | Attach    +errs5 = if @loc.isCyclic && @code.isJust && not @code.isFun
+                       then (Err_EffCyclic @pos Seq.<|)
+                       else id
+  | Invoke    +errs5 = if @loc.isCyclic && @code.isJust && not @code.isFun
+                       then (Err_EffCyclic @pos Seq.<|)
+                       else id
+  | Default   +errs5 = if @loc.isCyclic && @mbCode.isJust && not @mbCode.isFun
+                       then (Err_EffCyclic @pos Seq.<|)
+                       else id
+
+SEM Stmt | Invoke
+  +errs5 = if @loc.isCyclic && not @loc.visitCyclic
+           then (Err_VisExpCyclic @visit @name Seq.<|)
+           else id
+  +errs5 = if @code.isJust && @loc.isCyclic
+           then (Err_IterCyclic @pos Seq.<|)
+           else id
+
+SEM ImplStmt | Invoke
+  +errs5 = if @loc.isCyclic && not @loc.visitCyclic
+           then (Err_VisExpCyclic @visit @child Seq.<|)
+           else id
+
+SEM SemVisit | Visit Internal
+  loc.nClauses = Set.size @clauses.gathClauseNames
+  +errs1 = if @loc.fullCyclic && @loc.nClauses /= 1 && not @lhs.withinCoSem
+           then (Err_ClausesCyclic @pos @name @loc.nClauses Seq.<|)
+           else id
+
+ATTR ClausesTop Clauses [ | | nClauses : Int ]
+SEM Clauses
+  | Cons  +nClauses    = (+1)
+  | Nil   lhs.nClauses = 0
+
+ATTR MaybeBoundCode BoundCode Bind [ | | isFun : Bool ]
+SEM Bind
+  | Fun       lhs.isFun = True
+  | Monadic   lhs.isFun = False
+
+SEM MaybeBoundCode | Nothing  lhs.isFun = False
+
+-- Visits to avoid
+ATTR AllCodeBlocks [ | | gathAvoidVisits USE {`Set.union`} {Set.empty} : {Set DepItem} ]
+SEM SemVisit | Visit
+  +gathAvoidVisits = if @loc.fullCyclic
+                     then Set.insert @loc.visitEndDep
+                     else id
+
+-- What item belongs to what visit
+ATTR AllFinal [ | | gathItemVisits USE {`Map.union`} {Map.empty} : {Map DepItem DepItem} ]
+SEM SemVisit | Visit Internal  +gathItemVisits = Map.insert @loc.scopeDep @loc.scopeDep
+SEM Clause | Clause            +gathItemVisits = Map.insert @loc.scopeDep @lhs.visitBeginDep
+SEM Stmt | *                   +gathItemVisits = Map.insert @loc.stmtSource @lhs.visitBeginDep
+SEM ImplStmt | *               +gathItemVisits = Map.insert @loc.stmtSource @lhs.visitBeginDep
+
+ATTR AllFinal [ | | gathLegalCycStmts USE {`Set.union`} {Set.empty} : {Set DepItem} ]
+SEM Stmt | *      +gathLegalCycStmts = if @loc.allowCycles then Set.insert @loc.stmtSource else id
+SEM ImplStmt | *  +gathLegalCycStmts = if @loc.allowCycles then Set.insert @loc.stmtSource else id
+
+
+--
+-- Dependency analysis
+--
+
+-- Dependable items and their ordening
+{
+unknDepItem :: DepItem
+unknDepItem = DepVisStart [ident "errorunknown"]
+}
+
+-- Pass down the source of a statement
+ATTR AllFinal [ stmtSource : DepItem | | ]
+
+SEM Program | Program  blocks.stmtSource = DepMatch (-999)
+SEM Stmt
+  | Eval     loc.stmtSource = if @mode.isMatch then DepMatch @loc.lexOrder else DepAssert @loc.lexOrder
+  | Default  loc.stmtSource = DepDefault @loc.codeId
+  | Attach   loc.stmtSource = DepAttach @loc.lexOrder
+  | Invoke   loc.stmtSource = DepInvoke (@visit : @name : @lhs.basename)
+  | Rename   loc.stmtSource = DepAssert @loc.lexOrder
+
+SEM ImplStmt
+  | Invoke   loc.stmtSource = DepInvoke (@visit : @child : @lhs.basename)
+  | DefaultChild DefaultSyn DefaultVisLocal
+             loc.stmtSource = DepAssert @loc.lexOrder
+
+ATTR AllFinal [ | | gathStmtPosMap USE {`Map.union`} {Map.empty} : {Map DepItem Pos} ]
+SEM Stmt | Eval   loc.pos = @code.pos
+SEM Stmt | *      +gathStmtPosMap = Map.insert @loc.stmtSource @pos
+SEM ImplStmt | *  +gathStmtPosMap = Map.insert @loc.stmtSource @pos
+
+ATTR Pats Pat BoundCode [ | | pos : Pos ]
+SEM Pat | Con         lhs.pos = identPos @name
+        | AttrCon     lhs.pos = identPos @dt
+        | Attr        lhs.pos = identPos @child
+        | Tup         lhs.pos = @pats.pos
+        | List        lhs.pos = @pats.pos
+        | Cons        lhs.pos = @hd.pos
+        | Underscore  lhs.pos = @pos
+SEM Pats | Cons       lhs.pos = @hd.pos
+         | Nil        lhs.pos = noPos
+SEM BoundCode | Code  lhs.pos = @pos
+
+-- Determines: "Where is each attribute defined? What is its source?"
+{
+type AttrSourceMap = Map (Bool,Ident,Ident) DepItem  -- Bool: True = inherited attr
+}
+
+ATTR AllFinal [ distAttrSource : AttrSourceMap | | ]
+ATTR AllVisFinal [ | | gathAttrSource USE {`Map.union`} {Map.empty} : AttrSourceMap ]
+ATTR AllVisitClauses [ | | gathSemAttrSource USE {`Map.union`} {Map.empty} : AttrSourceMap ]  -- global to entire SEM
+
+SEM Program | Program   blocks.distAttrSource = Map.empty
+SEM SemVisit | Visit    loc.distAttrSource = Map.unions [ @loc.gathChnAttrSource
+                                                        , @stmts.gathAttrSource
+                                                        , @loc.gathVisAttrSource
+                                                        , @impls.gathAttrSource
+                                                        , @lhs.distAttrSource ]
+SEM SemVisit | Internal loc.distAttrSource = Map.unions [ @stmts.gathAttrSource
+                                                        , @impls.gathAttrSource
+                                                        , @lhs.distAttrSource ]
+SEM Clause | Clause     loc.distAttrSource = Map.unions [ @stmts.gathAttrSource
+                                                        , @deflts.gathAttrSource
+                                                        , @impls.gathAttrSource
+                                                        , @lhs.distAttrSource ]
+
+SEM SemVisit | Visit
+  loc.gathChnAttrSource = Map.fromList [ ((True,visIdent,attr),  @loc.scopeDep)    | attr <- Map.keys @attrs.gathVisitLocalAttrs ]
+  loc.gathVisAttrSource = Map.fromList [ ((False,@name,attr),    @loc.visitEndDep) | attr <- Map.keys @attrs.gathVisitLocalAttrs ]
+
+-- soures of lhs-inherited attributes
+SEM Item | Sem CoSem
+  loc.inhAttrMap = Map.findWithDefault Map.empty @tp @lhs.distVisitInhAttrs
+  loc.inhAttrSource = Map.fromList [ ((True,lhsIdent,attr), DepVisStart (visit : @loc.semBasename))
+                                   | (visit,mp) <- Map.assocs @loc.inhAttrMap, attr <- Map.keys mp ]
+  first.distAttrSource = Map.union @loc.inhAttrSource @lhs.distAttrSource
+
+SEM DataSem | Sem
+  loc.inhAttrMap = Map.findWithDefault Map.empty @tp @lhs.distVisitInhAttrs
+  loc.inhAttrSource = Map.fromList [ ((True,lhsIdent,attr), DepVisStart (visit : @loc.semBasename))
+                                   | (visit,mp) <- Map.assocs @loc.inhAttrMap, attr <- Map.keys mp ]
+  clauses.distAttrSource = Map.union @loc.inhAttrSource @lhs.distAttrSource
+
+SEM Stmt | Invoke  -- child visit
+  +gathAttrSource = Map.union $ Map.fromList [ ((False,@name,attr), @loc.stmtSource) | attr <- Map.keys @loc.synAttrMap ]
+
+SEM ImplStmt | Invoke  -- child visit
+  +gathAttrSource = Map.union $ Map.fromList [ ((False,@child,attr), @loc.stmtSource) | attr <- Map.keys @loc.synAttrMap ]
+
+SEM AttrTypePat | VisLocal ProdLocal Lhs
+  +gathAttrSource = Map.insert (False,@lhs.child,@lhs.name) @lhs.stmtSource
+SEM AttrTypePat | Child Visit
+  +gathAttrSource = Map.insert (True,@lhs.child,@lhs.name) @lhs.stmtSource
+
+SEM ImplStmt
+  | DefaultSyn       +gathAttrSource = Map.insert (False,lhsIdent,@name) @loc.stmtSource
+  | DefaultChild     +gathAttrSource = Map.insert (True,@child,@name)    @loc.stmtSource
+  | DefaultVisLocal  +gathAttrSource = Map.insert (False,visIdent,@name) @loc.stmtSource
+
+SEM Pat | AttrCon
+  loc.isLoc = @name == locIdent || @loc.childItf == locQIdent
+  +gathAttrSource = Map.union (Map.fromList [ ((not @loc.isLoc, @name, nm), @lhs.stmtSource) | (nm,_) <- @loc.fields ])
+
+-- Determines: "Where is each child defined. What is its start visit?"
+{
+type ChildSourceMap = Map Ident (Map Ident DepItem)
+}
+
+ATTR AllFinal [ distChildSource : ChildSourceMap | | ]
+ATTR AllVisFinal [ | | gathChildSource USE {`unionWithUnion`} {Map.empty} : ChildSourceMap ]
+
+SEM Program | Program   blocks.distChildSource = Map.empty
+SEM SemVisit  | Visit Internal
+  loc.distChildSource = Map.unionsWith mappend [ @stmts.gathChildSource
+                                               , Map.filterWithKey (notIn @loc.introChildren) @lhs.distChildSource ]
+SEM Clause | Clause
+  loc.distChildSource = Map.unionsWith mappend [ @stmts.gathChildSource
+                                               , Map.filterWithKey (notIn @loc.introChildren) @lhs.distChildSource ]
+
+SEM Stmt | Attach
+  +gathChildSource = Map.insertWith mappend @name (Map.singleton @loc.visit @loc.stmtSource)
+
+-- Determines: "Where is each invoke defined?"
+{
+type VisitSourceMap = Map Ident (Map Ident DepItem)
+}
+
+ATTR AllFinal [ distVisitSource : VisitSourceMap | | ]
+ATTR AllVisFinal [ | | gathVisitSource USE {`unionWithUnion`} {Map.empty} : VisitSourceMap ]
+
+SEM Program | Program   blocks.distVisitSource = Map.empty
+SEM SemVisit  | Visit Internal
+  loc.distVisitSource = Map.unionsWith mappend [ @stmts.gathVisitSource
+                                               , Map.filterWithKey (notIn @loc.introChildren) @lhs.distVisitSource ]
+
+SEM Clause | Clause
+  loc.distVisitSource = Map.unionsWith mappend [ @stmts.gathVisitSource
+                                               , @impls.gathVisitSource
+                                               , Map.filterWithKey (notIn @loc.introChildren) @lhs.distVisitSource ]
+
+SEM Stmt | Invoke
+  +gathVisitSource = Map.insertWith mappend @name (Map.singleton @visit @loc.stmtSource)
+
+SEM ImplStmt | Invoke
+  +gathVisitSource = Map.insertWith mappend @child (Map.singleton @visit @loc.stmtSource)
+
+-- Context: in what clause or visit are we in scope?
+ATTR AllFinal [ scopeReason, visitEndReason : Reason   scopeDep, visitBeginDep, visitEndDep : DepItem | | ]
+SEM Program | Program
+  blocks.scopeReason    = ReasonScopeVisit (ident "<root>")
+  blocks.scopeDep       = DepVisStart [ident "<root>"]
+  blocks.visitBeginDep  = DepVisStart [ident "<root>"]
+  blocks.visitEndDep    = DepVisEnd [ident "<root>"]
+  blocks.visitEndReason = ReasonScopeEnd (ident "<root>")
+
+SEM SemVisit | Visit
+  loc.scopeReason       = ReasonScopeVisit @name
+  loc.scopeDep          = DepVisStart (@name : @lhs.semBasename)
+  loc.visitBeginDep     = DepVisStart (@name : @lhs.semBasename)
+  loc.visitEndDep       = DepVisEnd   (@name : @lhs.semBasename)
+  loc.visitEndReason    = ReasonScopeEnd @name
+
+SEM SemVisit | Internal
+  loc.scopeReason       = ReasonScopeVisit @name
+  loc.scopeDep          = DepVisStart (@loc.name : @lhs.semBasename)
+  loc.visitBeginDep     = DepVisStart (@loc.name : @lhs.semBasename)
+  loc.visitEndDep       = DepVisEnd   (@loc.name : @lhs.semBasename)
+  loc.visitEndReason    = ReasonScopeEnd @name
+
+SEM Clause | Clause
+  loc.scopeReason       = ReasonScopeClause @name
+  loc.scopeDep          = DepClause @loc.basename
+
+-- Gather dependencies
+{
+data Dep = Dep !DepItem !Reason !([DepItem])
+  deriving (Eq,Ord,Show)
+
+type Deps = Seq Dep
+
+addDep :: DepItem -> Reason -> [DepItem] -> Deps -> Deps
+addDep item reason deps = (Seq.<|) (Dep item reason deps)
+
+unknDep :: Dep
+unknDep = Dep unknDepItem ReasonError [unknDepItem]
+}
+
+ATTR AllFinal [ | | gathDeps USE {Seq.><} {Seq.empty} : Deps ]
+
+-- dependency on source of attr
+SEM AttrTypeCode | VisLocal ProdLocal Lhs Child Visit
+  +gathDeps = addDep @lhs.stmtSource (ReasonAttrReq @lhs.child @lhs.name) [@loc.attrDep]
+  loc.attrDep = Map.findWithDefault (mkUnknownDep @loc.depKey) @loc.depKey @lhs.distAttrSource
+
+SEM AttrTypeCode | VisLocal Lhs
+  loc.depKey = (True,@lhs.child,@lhs.name)
+
+SEM AttrTypeCode | Child Visit ProdLocal
+  loc.depKey = (False,@lhs.child,@lhs.name)
+
+{
+mkUnknownDep :: Show a => a -> DepItem
+mkUnknownDep s = DepVisStart [ident ("unknown" ++ show s)]
+}
+
+-- dependency on syn and vis attrs of visit. Must be defined before visit end.
+SEM Clause | Clause  -- lhs.scopeDep is identifier of visit
+  +gathDeps = if @loc.isDeepest
+              then (Seq.fromList [ Dep @lhs.visitEndDep (ReasonAttrReq lhsIdent attr) 
+                                  [Map.findWithDefault (trace ("Clause.Clause.unknown.syn: " ++ show (attr, @loc.distAttrSource) ) unknDepItem) (False,lhsIdent,attr) @loc.distAttrSource]
+                               | attr <- Map.keys @loc.synAttrMap ] Seq.><)
+              else id
+  +gathDeps = if @loc.isDeepest
+              then (Seq.fromList [ Dep @lhs.visitEndDep (ReasonAttrReq visIdent attr) 
+                                  [Map.findWithDefault (trace "Clause.Clause.unknown.loc" unknDepItem) (False,visIdent,attr) @loc.distAttrSource]
+                                | attr <- Map.keys @lhs.localAttrs ] Seq.><)
+              else id
+
+SEM Stmt | *  -- dependency on start of visit or clause
+  +gathDeps = addDep @loc.stmtSource @lhs.scopeReason [@lhs.scopeDep]
+
+SEM ImplStmt | *  -- dependency on start of visit or clause
+  +gathDeps = addDep @loc.stmtSource @lhs.scopeReason [@lhs.scopeDep]
+
+SEM ImplStmt | DefaultChild DefaultSyn  -- dependency on default stmt if reference to code
+  +gathDeps = case @mbCodeRef of
+                Nothing  -> id
+                Just ref -> addDep @loc.stmtSource (ReasonDefault @name) [DepDefault ref]
+
+SEM Stmt | Eval  -- dependency: must be before end of visit for match statements
+  +gathDeps = if @mode.isMatch
+              then addDep @lhs.visitEndDep @lhs.visitEndReason [@loc.stmtSource]
+              else id
+
+SEM Stmt | Invoke -- depends on: * previous invokes, nearest child, and defs for inh attrs
+  loc.mbVisitSource = nearestVisitEntry False @visit @loc.childVisits $ Map.findWithDefault Map.empty @name @lhs.distVisitSource
+  loc.mbChildSource = nearestVisitEntry True  @visit @loc.childVisits $ Map.findWithDefault Map.empty @name @lhs.distChildSource
+  +gathDeps = case @loc.mbVisitSource of
+                Nothing    -> id
+                Just (_,d) -> addDep @loc.stmtSource (ReasonInvokeReq @visit) [d]
+  +gathDeps = case @loc.mbChildSource of
+                Nothing    -> id
+                Just (_,d) -> addDep @loc.stmtSource (ReasonChildReq @name) [d]
+  +gathDeps = Seq.fromList [ Dep @loc.stmtSource (ReasonAttrReq @name attr)
+                               [Map.findWithDefault (trace "Stmt.Invoke.unknown.inh" unknDepItem) (True,@name,attr) @lhs.distAttrSource]
+                           | attr <- Map.keys @loc.inhAttrMap ] Seq.><
+  +gathDeps = addDep @lhs.visitEndDep @lhs.visitEndReason [@loc.stmtSource]
+
+SEM ImplStmt | Invoke -- depends on: * previous invokes, nearest child, and defs for inh attrs
+  loc.mbVisitSource = nearestVisitEntry False @visit @loc.childVisits $ Map.findWithDefault Map.empty @child @lhs.distVisitSource
+  loc.mbChildSource = nearestVisitEntry True  @visit @loc.childVisits $ Map.findWithDefault Map.empty @child @lhs.distChildSource
+  +gathDeps = case @loc.mbVisitSource of
+                Nothing    -> id
+                Just (_,d) -> addDep @loc.stmtSource (ReasonInvokeReq @visit) [d]
+  +gathDeps = case @loc.mbChildSource of
+                Nothing    -> id
+                Just (_,d) -> addDep @loc.stmtSource (ReasonChildReq @child) [d]
+  +gathDeps = Seq.fromList [ Dep @loc.stmtSource (ReasonAttrReq @child attr)
+                               [Map.findWithDefault (trace "ImplStmt.Invoke.unknown.inh" unknDepItem) (True,@child,attr) @lhs.distAttrSource]
+                           | attr <- Map.keys @loc.inhAttrMap ] Seq.><
+  -- +errs2 = debugMsg ("Impl invoke: " ++ show @child ++ ", visit: " ++ show @visit ++ ", inh attrs: " ++ show @loc.inhAttrMap ++ "\nsource: " ++ show @lhs.distAttrSource) Seq.><
+
+{
+nearestVisitEntry :: Bool -> Ident -> [Ident] -> Map Ident DepItem -> Maybe (Ident,DepItem)
+nearestVisitEntry inclusive vis order mp
+  = case [ (b, Map.findWithDefault (trace "nearestVisitEntry.unknown" unknDepItem) b mp) | b <- befores, Map.member b mp ] of
+      []    -> Nothing
+      (e:_) -> Just e
+  where
+    entries = Map.assocs mp
+    befores = reverse $ (takeWhile (/= vis) order ++ (if inclusive then [vis] else []))
+}
+
+-- deal with previous attach
+SEM Stmt | Attach
+  loc.childSources = Map.findWithDefault Map.empty @name @lhs.distChildSource
+  loc.mbPrevEntry  = nearestVisitEntry False @loc.visit @loc.childVisits @loc.childSources
+  +gathDeps = case @loc.mbPrevEntry of
+                Nothing    -> id
+                Just (_,d) -> addDep @loc.stmtSource (ReasonAttach @name @loc.visit) [d]
+
+-- deal with detach
+SEM Item | Detach  -- depends on: prev visits and children
+  loc.mbVisitSource = nearestVisitEntry False @visit @loc.childVisits $ Map.findWithDefault Map.empty @name @lhs.distVisitSource
+  loc.mbChildSource = nearestVisitEntry False @visit @loc.childVisits $ Map.findWithDefault Map.empty @name @lhs.distChildSource
+  +gathDeps = case @loc.mbVisitSource of
+                Nothing    -> id
+                Just (_,d) -> addDep @lhs.stmtSource (ReasonDetach @name @visit) [d]
+  +gathDeps = case @loc.mbChildSource of
+                Nothing    -> id
+                Just (_,d) -> addDep @lhs.stmtSource (ReasonDetach @name @visit) [d]
+
+SEM SemVisit | Visit  -- depends on end of prev visit, end depends on begin
+  +gathDeps = if null @lhs.doneVisits
+              then id
+              else addDep @loc.scopeDep @lhs.visitEndReason [@lhs.visitEndDep]
+
+  +gathDeps = addDep @loc.visitEndDep (ReasonScopeVisit @name) [@loc.scopeDep]
+
+SEM SemVisit | Internal  -- depends on end of prev visit, end depends on begin
+  +gathDeps = addDep @loc.scopeDep @lhs.visitEndReason [@lhs.visitEndDep]
+  +gathDeps = addDep @loc.visitEndDep (ReasonScopeVisit @name) [@loc.scopeDep]
+
+SEM Clause | Clause  -- should be in between visit start and end
+  +gathDeps = addDep @loc.scopeDep @lhs.scopeReason [@lhs.scopeDep]
+  +gathDeps = addDep @lhs.visitEndDep @lhs.visitEndReason [@loc.scopeDep]
+
+SEM ImplStmt | DefaultChild DefaultSyn  -- depend on generated stmt
+  +gathDeps = case @mbCodeRef of
+                Nothing  -> id
+                Just ref -> addDep @loc.stmtSource (ReasonDefault @name) [DepDefault ref]
+
+SEM ImplStmt | DefaultVisLocal  -- may not escape visit
+  +gathDeps = addDep @lhs.visitEndDep @lhs.visitEndReason [@loc.stmtSource]
+
+SEM ImplStmt -- depend on children + inh attrs
+  | DefaultChild DefaultSyn
+      +gathDeps = if @loc.lhsHasAttr
+                  then addDep @loc.stmtSource (ReasonAttrReq lhsIdent @name)
+                         [Map.findWithDefault (trace "ImplStmt.Default.lhsinh" unknDepItem) (True,lhsIdent,@name) @lhs.distAttrSource]
+                  else id
+      +gathDeps = Seq.fromList [ Dep @loc.stmtSource (ReasonAttrReq c a)
+                                   [Map.findWithDefault (trace "ImplStmt.Default.childsyn" unknDepItem) (False,c,a) @lhs.distAttrSource]
+                               | (c,a) <- @loc.childAttrs ] Seq.><
+      -- +errs2 = debugMsg ("dependencies: " ++ show @loc.stmtSource ++ ", attr: " ++ show @name ++ ", children: " ++ show @loc.children) Seq.><
+
+ATTR AllFinal [ distRanks : {Map DepItem (Bool,Int)} | | ]
+
+SEM Program | Program
+  loc.unqDeps    = Map.fromListWith (\(r1,as) (r2,bs) -> (mostDescriptiveReason r1 r2,nub (as ++ bs)))
+                     [ (from, (reason,tos)) | (Dep from reason tos) <- toList @blocks.gathDeps ]
+                   `Map.union`
+                     (Map.fromList [ (i, (ReasonSink,[])) | i <- @loc.unqItems ])
+  loc.unqItems   = Set.toList $ Set.fromList $ concatMap (\(Dep from _ tos) -> from : tos) $ toList @blocks.gathDeps
+  loc.components = analyze (toList @blocks.gathSemStarts) (toList @blocks.gathVisitStarts) (toList @blocks.gathVisitEnds) @blocks.gathAvoidVisits $
+                     map (\(from,(reason,tos)) -> (reason,from,tos)) $ Map.assocs @unqDeps
+  loc.distRanks  = let merge rank (AcyclicSCC d) = [(d,(False,rank))]
+                       merge rank (CyclicSCC ps) = zip ps (repeat (True,rank))
+                       mp = Map.fromList $ concat $ zipWith merge [1..] @loc.components
+                   in  mp
+  
+  loc.cyclicComps = let isCyclicSCC (CyclicSCC _)    = True
+                        isCyclicSCC _                = False
+                        fromCyclicSCC (CyclicSCC xs) = xs
+                    in [ fromCyclicSCC c | c <- @loc.components, isCyclicSCC c ]
+  loc.cyclicItems = Set.fromList $ concat @loc.cyclicComps
+  loc.cyclicErrComps = let isLegalComp items
+                             = length vis <= 1 && all isLegal items && any isInvoke items
+                             where vis   = nub [ Map.findWithDefault item item @blocks.gathItemVisits | item <- items ]
+                           
+                           isLegal (DepClause _)   = True
+                           isLegal (DepVisStart _) = True
+                           isLegal (DepVisEnd _)   = True
+                           isLegal item            = Set.member item @blocks.gathLegalCycStmts
+                           
+                           isInvoke (DepInvoke _)  = True
+                           isInvoke _              = False
+                       in filter (not . isLegalComp) @loc.cyclicComps
+
+  +errs4 = Seq.fromList (map (Err_Cyclic @lhs.pos @blocks.gathStmtPosMap) @loc.cyclicErrComps) Seq.><
+
+{
+mostDescriptiveReason r1 r2
+  = case r2 of
+      ReasonAttrReq _ _  -> r2
+      _                  -> r1
+
+instance Show a => Show (SCC a) where
+  show (CyclicSCC xs) = unwords (map show xs)
+  show (AcyclicSCC x) = show x
+}
+
+ATTR Stmt ImplStmt [ | | rank : Int ]
+ATTR Pats Pat [ isCyclic : Bool | | ]
+
+SEM Stmt | *
+  (loc.isOnCycle, loc.rank) = Map.findWithDefault (False,@loc.lexOrder) @loc.stmtSource @lhs.distRanks
+  loc.isCyclic              = @loc.fullCyclic || @loc.isOnCycle
+
+SEM ImplStmt | *
+  (loc.isOnCycle, loc.rank) = Map.findWithDefault (False,@loc.lexOrder) @loc.stmtSource @lhs.distRanks
+  loc.isCyclic              = @loc.fullCyclic || @loc.isOnCycle
+
+SEM SemVisit | Visit Internal
+  (loc.isOnCycle, loc.rank) = Map.findWithDefault (False,@loc.lexOrder) @loc.scopeDep @lhs.distRanks
+  loc.isCyclic              = @loc.fullCyclic || @loc.isOnCycle
+
+SEM Clause | Clause
+  (loc.isOnCycle, loc.rank) = Map.findWithDefault (False,@loc.lexOrder) @loc.scopeDep @lhs.distRanks
+  loc.isCyclic              = @lhs.fullCyclic || @loc.isOnCycle
+
+-- Max rank of clauses
+ATTR AllVisitClauses [ | | minRank USE {`min`} {maxBound} : Int ]
+
+SEM Clause | Clause            lhs.minRank = @loc.rank
+SEM SemVisit | Visit Internal  lhs.minRank = @loc.rank
+
+--
+-- Pretty-print of the AST
+--
+
+{
+instance PP Ident where
+  pp = text . identName
+}
+
+ATTR Block Itf ItfVisit Attr Data Type AliasType Con Field FieldType DataSem MaybeBoundCode BoundCode Code Item
+     SemVisit VisitAttr Clause Stmt ImplStmt Mode Bind Pat ExprField
+  [ | | pp : {PP_Doc} ]
+
+SEM Program
+  | Program      loc.ppId = vlist @blocks.pps
+
+SEM Block
+  | Section      lhs.pp = "{" >-< @code.pp >-< "}"
+  | Itf          lhs.pp = @itf.pp
+  | Data         lhs.pp = @data.pp
+  | Type         lhs.pp = @type.pp
+  | Item         lhs.pp = @name >#< "=" >-< indent 2 @item.pp
+  | DataSem      lhs.pp = @sem.pp
+
+SEM Itf
+  | Itf          lhs.pp = "itf" >#< @name
+                          >-< indent 2 (vlist @visits.pps)
+
+SEM ItfVisit
+  | Visit        lhs.pp = "visit" >#< @name >#< (if @cyclic then text "cyclic" else empty)
+                          >-< indent 2 (vlist @attrs.pps)   
+
+SEM Attr
+  | Inh          lhs.pp = "inh" >#< @name >#< "::" >#< @type
+  | Syn          lhs.pp = "syn" >#< @name >#< "::" >#< @type
+
+SEM Data | Data
+  lhs.pp = "data" >#< @name >-< indent 2 ( vlist @cons.pps )
+
+SEM Con | Con
+  lhs.pp = "con" >#< @name >-< indent 2 (vlist @fields.pps)
+
+SEM Field | Field
+  lhs.pp = @name >#< @type.pp
+
+SEM FieldType
+  | Term     lhs.pp = "::" >#< @type
+  | Nonterm  lhs.pp = ":" >#< show @name
+
+SEM Type | Alias
+  lhs.pp = "type" >#< show @name >#< ":" >#< @type.pp
+
+SEM AliasType
+  | Prod   lhs.pp = pp_block "(" ")" "," (map (text . show) @fields)
+  | List   lhs.pp = pp_brackets (text $ show @type)
+  | Maybe  lhs.pp = "Maybe" >#< show @type
+
+SEM DataSem | Sem
+  lhs.pp = "datasem" >#< show @tp >-< indent 2 @clauses.pp
+
+SEM BoundCode
+  | Code         lhs.pp = @bind.pp >#< @code.pp
+
+SEM MaybeBoundCode
+  | Nothing      lhs.pp = empty
+
+SEM Code
+  | Code         lhs.pp = vlist @items.pps
+
+SEM Item
+  | Plain        loc.pp = vlist (modifySpacing @loc.diff @lhs.indent @txt)
+  | Attr         lhs.pp = addSpaces @loc.diff (@child >|< "." >|< @name)
+  | Sem          lhs.pp = addSpaces @loc.diff ("sem" >#< @name >#< ":" >#< @tp
+                                              >-< indent 2 @first.pp)
+  | CoSem        lhs.pp = addSpaces @loc.diff ("cosem" >#< @name >#< ":" >#< @tp >#< @visit
+                                              >-< indent 2 @first.pp)
+  | Detach       lhs.pp = addSpaces @loc.diff ("detach" >#< @name >#< "of" >#< @visit)
+  | Brackets     lhs.pp = addSpaces @loc.diff (text "{")
+                          >-< vlist @items.pps
+                          >-< addSpaces @loc.diff2 (text "}")
+  | Construct    lhs.pp = addSpaces @loc.diff (show @data >|< "." >|< show @con >#< pp_block "{" "}" "," @fields.pps)
+
+ATTR Code Items Item ExprFields ExprField DataSem SemVisit Stmts ClausesTop Clauses Clause Stmt
+  [ indent : Int | | ]
+
+SEM Block | Section   code.indent    = 1
+          | Item      item.indent    = 1
+          | DataSem   sem.indent     = 1
+SEM BoundCode | Code  code.indent = column @pos + @bind.width
+
+SEM Item
+  | *            loc.diff  = column @pos - @lhs.indent
+  | Brackets     loc.diff2 = column @posEnd - @lhs.indent
+
+{
+modifySpacing :: Int -> Int -> String -> [String]
+modifySpacing n m s
+  = take (length ls) (r : rs)
+  where
+    ls = lines s
+    (f : fs) = ls ++ [""]
+    r  = shift n f
+    rs = map (drop (m-1)) fs
+    
+shift :: Int -> String -> String
+shift n
+  | n <= 0 = drop n
+  | n > 0  = (replicate n ' ' ++)
+
+addSpaces :: Int -> PP_Doc -> PP_Doc
+addSpaces n d = text (replicate n ' ') >|< d
+}
+
+SEM SemVisit
+  | Visit        lhs.pp = "visit" >#< @name
+                          >-< indent 2 (   vlist @attrs.pps
+                                       >-< vlist @stmts.pps
+                                       >-< vlist @impls.pps
+                                       >-< vlist @clauses.pps
+                                       )
+  | Internal     lhs.pp = "internal" >#< @name
+                          >-< indent 2 (   vlist @stmts.pps
+                                       >-< vlist @clauses.pps
+                                       )
+  | End          lhs.pp = empty
+
+SEM VisitAttr
+  | Chn          lhs.pp = "chn" >#< @name >#< "::" >#< @type
+
+SEM Clause
+  | Clause       lhs.pp = "clause" >#< @name
+                          >-< indent 2 (   vlist @stmts.pps
+                                       >-< vlist @impls.pps
+                                       >-< vlist @deflts.pps
+                                       >-< @next.pp
+                                       )
+
+SEM Stmt
+  | Eval         lhs.pp = @mode.pp >|< @pat.pp >#< @code.pp
+  | Attach       lhs.pp = "attach" >#< @loc.visit >#< "of" >#< @name >#< ":" >#< @type >#< @code.pp
+  | Invoke       lhs.pp = vlist @deflts.pps
+                          >-< "invoke" >#< @visit >#< "of" >#< @name >#< @code.pp
+  | Default      lhs.pp = "default" >#< @name >#< "..."
+  | Rename       lhs.pp = empty
+
+SEM ImplStmt
+  | Invoke       lhs.pp = vlist @deflts.pps
+                          >-< "invoke" >#< show @visit >#< "of" >#< show @child >#< "-- implicit"
+  | DefaultChild lhs.pp = "default" >#< show @child >|< "." >|< show @name >#< pp_block "(" ")" "," (reverse @loc.ppInps)
+  | DefaultSyn   lhs.pp = "default lhs." >|< show @name >#< pp_block "(" ")" "," (reverse @loc.ppInps)
+  | DefaultVisLocal
+                 lhs.pp = "default local." >|< show @name
+  
+  | DefaultChild DefaultSyn
+      loc.ppInps = (if @loc.lhsHasAttr then [text "lhs"] else []) ++ map (\(c,_,_) -> text $ show c) @loc.children
+
+SEM Mode
+  | Match        lhs.pp = text "match "
+  | Assert       lhs.pp = empty
+
+SEM Bind
+  | Fun          lhs.pp = text "="
+  | Monadic      lhs.pp = text "<-"
+
+ATTR Bind [ | | width : Int ]
+SEM Bind
+  | Fun          lhs.width = 1
+  | Monadic      lhs.width = 2
+
+SEM Pat
+  | Con          loc.needPar = needParens PrioCon @lhs.prio @lhs.isRight
+  | Cons         loc.needPar = needParens PrioCons @lhs.prio @lhs.isRight
+
+SEM Pat
+  | Con          lhs.pp = addParens @loc.needPar (@name >#< hlist_sp @pats.pps)
+  | AttrCon      lhs.pp = show @dt >|< "." >|< show @con >|< "@" >|< @name
+  | Attr         lhs.pp = @child >|< "." >|< @name
+  | Tup          lhs.pp = pp_block "(" ")" "," @pats.pps
+  | List         lhs.pp = pp_block "[" "]" "," @pats.pps
+  | Cons         lhs.pp = addParens @loc.needPar (@hd.pp >#< ":" >#< @tl.pp)
+  | Underscore   lhs.pp = text "_"
+
+ATTR Pat Pats [ prio : Prio | | ]
+ATTR Pat [ isRight : Bool | | ]
+
+SEM Stmt | Eval    pat.prio    = PrioTop
+                   pat.isRight = False
+
+SEM Pat
+  | Con   pats.prio = PrioCon
+  | Tup   pats.prio = PrioTop
+  | List  pats.prio = PrioTop
+  | Cons  hd.prio   = PrioCons
+          tl.prio   = PrioCons
+
+SEM Pats | Cons  hd.isRight = False
+
+SEM Pat
+  | Cons  hd.isRight = False
+          tl.isRight = True
+
+{
+data Prio
+  = PrioTop | PrioCons | PrioCon
+  deriving (Eq, Ord)
+
+needParens :: Prio -> Prio -> Bool -> Bool
+needParens myPrio lhsPrio isRight = myPrio <= lhsPrio && (myPrio /= lhsPrio || isRight)
+
+addParens :: Bool -> PP_Doc -> PP_Doc
+addParens True  = pp_parens
+addParens False = id
+}
+
+SEM ExprField | Field
+  lhs.pp = @name >-< indent 2 ("=" >#< pp_parens @code.pp)
+
+ATTR BlocksTop Blocks ItfVisits Attrs Items VisitAttrs ClausesTop Clauses Stmts ImplStmts Pats Cons Fields ExprFields
+  [ | | pps : {[PP_Doc]} ]
+
+SEM BlocksTop
+  | Top   lhs.pps = @blocks.pps ++ @extra.pps
+  | None  lhs.pps = []
+
+SEM Blocks
+  | Cons  lhs.pps = @hd.pp : @tl.pps
+  | Nil   lhs.pps = []
+
+SEM ItfVisits
+  | Cons  lhs.pps = @hd.pp : @tl.pps
+  | Nil   lhs.pps = []
+
+SEM Attrs
+  | Cons  lhs.pps = @hd.pp : @tl.pps
+  | Nil   lhs.pps = []
+
+SEM Cons
+  | Cons  lhs.pps = @hd.pp : @tl.pps
+  | Nil   lhs.pps = []
+
+SEM Fields
+  | Cons  lhs.pps = @hd.pp : @tl.pps
+  | Nil   lhs.pps = []
+
+SEM Items
+  | Cons  lhs.pps = @hd.pp : @tl.pps
+  | Nil   lhs.pps = []
+
+SEM VisitAttrs
+  | Cons  lhs.pps = @hd.pp : @tl.pps
+  | Nil   lhs.pps = []
+
+SEM Clauses
+  | Cons  lhs.pps = @hd.pp : @tl.pps
+  | Nil   lhs.pps = []
+
+SEM Stmts
+  | Cons  lhs.pps = @hd.pp : @tl.pps
+  | Nil   lhs.pps = []
+
+SEM ImplStmts
+  | Cons  lhs.pps = @hd.pp : @tl.pps
+  | Nil   lhs.pps = []
+
+SEM Pats
+  | Cons  lhs.pps = @hd.pp : @tl.pps
+  | Nil   lhs.pps = []
+
+SEM ExprFields
+  | Cons  lhs.pps = @hd.pp : @tl.pps
+  | Nil   lhs.pps = []
diff --git a/uuagc_options b/uuagc_options
new file mode 100644
--- /dev/null
+++ b/uuagc_options
@@ -0,0 +1,8 @@
+file: "src/Ast.ag"
+options: data, rename, strictdata
+
+file: "src/Transform.ag"
+options: catas, rename, semfuns, signatures, pretty, strictwrap
+
+file: "src/Errs.ag"
+options: data, rename, catas, semfuns, signatures, optimize, strictdata, strictwrap
