tip-lib 0.1.2 → 0.2
raw patch · 43 files changed
+3757/−1653 lines, 43 filesdep +filepathdep +genifunctorsdep +structural-inductiondep −pretty-show
Dependencies added: filepath, genifunctors, structural-induction
Dependencies removed: pretty-show
Files
- changelog +14/−0
- dist/build/Tip/Parser/LexTIP.hs +12/−7
- dist/build/Tip/Parser/ParTIP.hs +1359/−1201
- executable/Main.hs +66/−32
- src/Tip/Core.hs +72/−15
- src/Tip/Fresh.hs +7/−1
- src/Tip/Haskell/Repr.hs +3/−0
- src/Tip/Haskell/Translate.hs +251/−50
- src/Tip/Lint.hs +39/−24
- src/Tip/Parser.hs +10/−1
- src/Tip/Parser/AbsTIP.hs +28/−13
- src/Tip/Parser/Convert.hs +77/−38
- src/Tip/Parser/LexTIP.x +3/−3
- src/Tip/Parser/ParTIP.y +61/−35
- src/Tip/Pass/AxiomatizeDatadecls.hs +81/−0
- src/Tip/Pass/AxiomatizeFuncdefs.hs +57/−44
- src/Tip/Pass/Booleans.hs +91/−11
- src/Tip/Pass/CommuteMatch.hs +39/−23
- src/Tip/Pass/Concretise.hs +105/−0
- src/Tip/Pass/Conjecture.hs +98/−0
- src/Tip/Pass/DropSuffix.hs +26/−0
- src/Tip/Pass/EqualFunctions.hs +8/−8
- src/Tip/Pass/Induction.hs +81/−0
- src/Tip/Pass/Lift.hs +3/−2
- src/Tip/Pass/Monomorphise.hs +234/−0
- src/Tip/Pass/NegateConjecture.hs +0/−30
- src/Tip/Pass/Pipeline.hs +16/−8
- src/Tip/Pass/SelectConjecture.hs +50/−0
- src/Tip/Passes.hs +144/−23
- src/Tip/Pretty.hs +29/−0
- src/Tip/Pretty/Haskell.hs +18/−6
- src/Tip/Pretty/Isabelle.hs +2/−2
- src/Tip/Pretty/SMT.hs +65/−18
- src/Tip/Pretty/TFF.hs +141/−0
- src/Tip/Pretty/Why3.hs +3/−3
- src/Tip/Scope.hs +3/−3
- src/Tip/Simplify.hs +85/−23
- src/Tip/Types.hs +71/−5
- src/Tip/Utils.hs +62/−9
- src/Tip/Utils/Rename.hs +10/−2
- src/Tip/Utils/Specialiser.hs +209/−0
- src/Tip/WorkerWrapper.hs +1/−1
- tip-lib.cabal +23/−12
changelog view
@@ -1,3 +1,17 @@+tip-lib 0.2 (released 2015-10-28):+* New output modes:+ * Haskell with support for Feat, QuickCheck, LazySmallCheck, and smten.+ * TFF+ * SMTLIB with axiomatised function definitions+* New passes to manipulate assertions,+ apply structural induction, monomorphise, transform+ booleans and integers, axiomatize function declarations.+* Parser changes:+ * Support declare-const, define-fun, define-fun-rec.+ * Correctly handle let-expressions+* Pretty print chained let expressions in groups+* New helper exports in Tip.Core and Tip.Utils+ tip-lib 0.1.2 (released 2015-06-11): * Make haddock documentation build (reported by Peter Simons.)
dist/build/Tip/Parser/LexTIP.hs view
@@ -29,18 +29,18 @@ import GlaExts #endif alex_base :: AlexAddr-alex_base = AlexA# "\xf8\xff\xff\xff\xb8\xff\xff\xff\x00\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\xad\x00\x00\x00\x2d\x01\x00\x00\xad\x01\x00\x00\xed\x01\x00\x00\x2d\x02\x00\x00\xed\x02\x00\x00\xad\x02\x00\x00\x00\x00\x00\x00\xa3\x03\x00\x00\xff\xff\xff\xff\x82\x04\x00\x00\xe5\x04\x00\x00\x00\x00\x00\x00\x48\x05\x00\x00\xab\x05\x00\x00\x0e\x06\x00\x00\x71\x06\x00\x00\xd4\x06\x00\x00\x37\x07\x00\x00\x9a\x07\x00\x00\xfd\x07\x00\x00\x60\x08\x00\x00\xc3\x08\x00\x00\x26\x09\x00\x00\x89\x09\x00\x00\xec\x09\x00\x00\x4f\x0a\x00\x00\xb2\x0a\x00\x00\x15\x0b\x00\x00\x78\x0b\x00\x00\xdb\x0b\x00\x00\x3e\x0c\x00\x00\xa1\x0c\x00\x00\x04\x0d\x00\x00\x67\x0d\x00\x00\xca\x0d\x00\x00\x2d\x0e\x00\x00\x90\x0e\x00\x00\xf3\x0e\x00\x00\x56\x0f\x00\x00\xb9\x0f\x00\x00\x1c\x10\x00\x00\x7f\x10\x00\x00\xe2\x10\x00\x00\x45\x11\x00\x00\xa8\x11\x00\x00\x0b\x12\x00\x00\x6e\x12\x00\x00\xd1\x12\x00\x00\x34\x13\x00\x00\x97\x13\x00\x00\xfa\x13\x00\x00\x5d\x14\x00\x00\xc0\x14\x00\x00\x23\x15\x00\x00\x86\x15\x00\x00\xe9\x15\x00\x00\x4c\x16\x00\x00\xaf\x16\x00\x00\x12\x17\x00\x00\x75\x17\x00\x00\xd8\x17\x00\x00\x3b\x18\x00\x00\x9e\x18\x00\x00\x01\x19\x00\x00\xdd\xff\xff\xff"#+alex_base = AlexA# "\xf8\xff\xff\xff\xb8\xff\xff\xff\x00\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\xad\x00\x00\x00\x2d\x01\x00\x00\xad\x01\x00\x00\xed\x01\x00\x00\x2d\x02\x00\x00\xed\x02\x00\x00\xad\x02\x00\x00\x00\x00\x00\x00\xa3\x03\x00\x00\xff\xff\xff\xff\x82\x04\x00\x00\xe5\x04\x00\x00\x48\x05\x00\x00\x00\x00\x00\x00\xab\x05\x00\x00\x0e\x06\x00\x00\x71\x06\x00\x00\xd4\x06\x00\x00\x37\x07\x00\x00\x9a\x07\x00\x00\xfd\x07\x00\x00\x60\x08\x00\x00\xc3\x08\x00\x00\x26\x09\x00\x00\x89\x09\x00\x00\xec\x09\x00\x00\x4f\x0a\x00\x00\xb2\x0a\x00\x00\x15\x0b\x00\x00\x78\x0b\x00\x00\xdb\x0b\x00\x00\x3e\x0c\x00\x00\xa1\x0c\x00\x00\x04\x0d\x00\x00\x67\x0d\x00\x00\xca\x0d\x00\x00\x2d\x0e\x00\x00\x90\x0e\x00\x00\xf3\x0e\x00\x00\x56\x0f\x00\x00\xb9\x0f\x00\x00\x1c\x10\x00\x00\x7f\x10\x00\x00\xe2\x10\x00\x00\x45\x11\x00\x00\xa8\x11\x00\x00\x0b\x12\x00\x00\x6e\x12\x00\x00\xd1\x12\x00\x00\x34\x13\x00\x00\x97\x13\x00\x00\xfa\x13\x00\x00\x5d\x14\x00\x00\xc0\x14\x00\x00\x23\x15\x00\x00\x86\x15\x00\x00\xe9\x15\x00\x00\x4c\x16\x00\x00\xaf\x16\x00\x00\x12\x17\x00\x00\x75\x17\x00\x00\xd8\x17\x00\x00\x3b\x18\x00\x00\x9e\x18\x00\x00\x01\x19\x00\x00\x64\x19\x00\x00\xc7\x19\x00\x00\x2a\x1a\x00\x00\xdd\xff\xff\xff"# alex_table :: AlexAddr-alex_table = AlexA# "\x00\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x00\x00\x00\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x46\x00\x46\x00\x46\x00\x46\x00\x46\x00\x46\x00\x46\x00\x46\x00\x46\x00\x46\x00\x00\x00\x0e\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x0e\x00\x11\x00\x11\x00\x10\x00\x10\x00\x00\x00\x10\x00\x33\x00\x33\x00\x46\x00\x46\x00\x46\x00\x46\x00\x46\x00\x46\x00\x46\x00\x46\x00\x46\x00\x46\x00\x00\x00\x0d\x00\x0f\x00\x12\x00\x0f\x00\x33\x00\x10\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x2e\x00\x32\x00\x35\x00\x30\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x0b\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\x00\x00\x00\x00\x00\x00\x08\x00\x01\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\x06\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x0a\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x00\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x00\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0b\x00\x06\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x01\x00\x05\x00\x04\x00\x04\x00\x04\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x10\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x10\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x09\x00\x33\x00\x33\x00\x10\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x10\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x33\x00\x13\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x44\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x33\x00\x14\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x09\x00\x43\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x43\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x18\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x42\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x41\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x45\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x40\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x32\x00\x09\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x08\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x3f\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x45\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x1a\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x32\x00\x09\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x45\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x3e\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x32\x00\x08\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x08\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x1c\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x45\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x32\x00\x09\x00\x32\x00\x32\x00\x32\x00\x32\x00\x1d\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x45\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x32\x00\x08\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x1f\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x08\x00\x3d\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x45\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x32\x00\x09\x00\x32\x00\x32\x00\x23\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x08\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x3b\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x45\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x32\x00\x09\x00\x3a\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x45\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x32\x00\x08\x00\x32\x00\x32\x00\x32\x00\x32\x00\x25\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x45\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x32\x00\x08\x00\x32\x00\x32\x00\x32\x00\x32\x00\x39\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x08\x00\x38\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x45\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x32\x00\x09\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x29\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x45\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x37\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x32\x00\x08\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x45\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x32\x00\x08\x00\x32\x00\x32\x00\x36\x00\x32\x00\x32\x00\x31\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x45\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x32\x00\x08\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x2b\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x45\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x32\x00\x08\x00\x32\x00\x32\x00\x32\x00\x32\x00\x2c\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x45\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x32\x00\x08\x00\x32\x00\x32\x00\x32\x00\x32\x00\x2d\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x45\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x32\x00\x08\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x34\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x45\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x32\x00\x08\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x08\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x45\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x32\x00\x09\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x2f\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x45\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x32\x00\x08\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x28\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x45\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x32\x00\x08\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x27\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x08\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x26\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x24\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x45\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x32\x00\x09\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x3c\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x45\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x32\x00\x08\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x22\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x08\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x21\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x45\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x32\x00\x09\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x20\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x08\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x1e\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x19\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x17\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x2a\x00\x33\x00\x16\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x1b\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x15\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x43\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x10\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x10\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x00\x09\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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_table = AlexA# "\x00\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x00\x00\x00\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x00\x00\x0e\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x0e\x00\x12\x00\x12\x00\x11\x00\x11\x00\x00\x00\x12\x00\x34\x00\x34\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x49\x00\x00\x00\x0d\x00\x0f\x00\x13\x00\x0f\x00\x34\x00\x11\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x32\x00\x33\x00\x35\x00\x31\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x0b\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\x00\x00\x00\x00\x00\x00\x08\x00\x01\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\x06\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x0a\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x00\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x00\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0b\x00\x06\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x01\x00\x05\x00\x04\x00\x04\x00\x04\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x11\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x43\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x1f\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x11\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x11\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x11\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x34\x00\x34\x00\x14\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x46\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x47\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x34\x00\x34\x00\x15\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x45\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x45\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x45\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x1a\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x44\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x43\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x48\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x42\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x48\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x41\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x33\x00\x08\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x08\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x40\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x48\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x1d\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x48\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x3f\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x33\x00\x08\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x08\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x3e\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x48\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x33\x00\x21\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x48\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x33\x00\x08\x00\x33\x00\x33\x00\x33\x00\x33\x00\x20\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x48\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x33\x00\x08\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x23\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x08\x00\x3d\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x48\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x33\x00\x09\x00\x33\x00\x33\x00\x28\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x48\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x33\x00\x08\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x3b\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x48\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x33\x00\x08\x00\x3a\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x48\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x33\x00\x08\x00\x33\x00\x33\x00\x33\x00\x33\x00\x2a\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x48\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x33\x00\x08\x00\x33\x00\x33\x00\x33\x00\x33\x00\x39\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x08\x00\x38\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x48\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x2e\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x48\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x33\x00\x08\x00\x33\x00\x33\x00\x33\x00\x33\x00\x37\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x48\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x33\x00\x08\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x30\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x48\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x33\x00\x08\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x08\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x48\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x2d\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x48\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x33\x00\x08\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x2c\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x48\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x33\x00\x08\x00\x33\x00\x33\x00\x36\x00\x33\x00\x33\x00\x2b\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x08\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x29\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x48\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x33\x00\x09\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x3c\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x48\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x33\x00\x08\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x26\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x48\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x33\x00\x08\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x27\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x48\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x33\x00\x08\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x24\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x33\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x08\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x22\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x1c\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x1b\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x19\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x25\x00\x2f\x00\x34\x00\x17\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x1e\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x18\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x16\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x45\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x11\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x11\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x34\x00\x09\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x10\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x34\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x00\x09\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"# alex_check :: AlexAddr-alex_check = AlexA# "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x20\x00\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x20\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\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\xff\xff\xff\xff\xff\xff\x7e\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xff\xff\xc3\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\xff\xff\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xff\xff\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\xff\xff\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xff\xff\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\xff\xff\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xff\xff\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\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\xff\xff\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xc3\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc3\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"#+alex_check = AlexA# "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x20\x00\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x20\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\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\xff\xff\xff\xff\xff\xff\x7e\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xff\xff\xc3\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\xff\xff\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xff\xff\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\xff\xff\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xff\xff\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\xff\xff\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xff\xff\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\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\xff\xff\xff\xff\xff\xff\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\xff\xff\xff\xff\xff\xff\x2a\x00\x2b\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\xc3\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\x7e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\xc3\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc3\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"# alex_deflt :: AlexAddr-alex_deflt = AlexA# "\xff\xff\x0c\x00\x0c\x00\x02\x00\x02\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0d\x00\x0d\x00\x0d\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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 = AlexA# "\xff\xff\x0c\x00\x0c\x00\x02\x00\x02\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0d\x00\x0d\x00\x0d\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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,70) [AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccSkip,AlexAccSkip,AlexAcc (alex_action_2),AlexAcc (alex_action_2),AlexAcc (alex_action_2),AlexAcc (alex_action_2),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_4),AlexAcc (alex_action_5)]+alex_accept = listArray (0::Int,73) [AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccSkip,AlexAccSkip,AlexAcc (alex_action_2),AlexAcc (alex_action_2),AlexAcc (alex_action_2),AlexAcc (alex_action_2),AlexAcc (alex_action_2),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_4),AlexAcc (alex_action_5)] {-# LINE 38 "src/Tip/Parser/LexTIP.x" #-} @@ -106,7 +106,7 @@ | s == a = t resWords :: BTree-resWords = b "check-sat" 20 (b ">" 10 (b "-" 5 (b "*" 3 (b ")" 2 (b "(" 1 N N) N) (b "+" 4 N N)) (b "=" 8 (b "<=" 7 (b "<" 6 N N) N) (b "=>" 9 N N))) (b "and" 15 (b "Bool" 13 (b "@" 12 (b ">=" 11 N N) N) (b "Int" 14 N N)) (b "assert-not" 18 (b "assert" 17 (b "as" 16 N N) N) (b "case" 19 N N)))) (b "forall" 30 (b "define-funs-rec" 25 (b "declare-sort" 23 (b "declare-fun" 22 (b "declare-datatypes" 21 N N) N) (b "default" 24 N N)) (b "exists" 28 (b "div" 27 (b "distinct" 26 N N) N) (b "false" 29 N N))) (b "mod" 35 (b "let" 33 (b "lambda" 32 (b "ite" 31 N N) N) (b "match" 34 N N)) (b "par" 38 (b "or" 37 (b "not" 36 N N) N) (b "true" 39 N N))))+resWords = b "declare-datatypes" 22 (b ">=" 11 (b "<" 6 (b "*" 3 (b ")" 2 (b "(" 1 N N) N) (b "-" 5 (b "+" 4 N N) N)) (b "=>" 9 (b "=" 8 (b "<=" 7 N N) N) (b ">" 10 N N))) (b "assert" 17 (b "Int" 14 (b "Bool" 13 (b "@" 12 N N) N) (b "as" 16 (b "and" 15 N N) N)) (b "check-sat" 20 (b "case" 19 (b "assert-not" 18 N N) N) (b "declare-const" 21 N N)))) (b "forall" 33 (b "define-funs-rec" 28 (b "default" 25 (b "declare-sort" 24 (b "declare-fun" 23 N N) N) (b "define-fun-rec" 27 (b "define-fun" 26 N N) N)) (b "exists" 31 (b "div" 30 (b "distinct" 29 N N) N) (b "false" 32 N N))) (b "mod" 38 (b "let" 36 (b "lambda" 35 (b "ite" 34 N N) N) (b "match" 37 N N)) (b "par" 41 (b "or" 40 (b "not" 39 N N) N) (b "true" 42 N N)))) where b s n = let bs = id s in B bs (TS bs n) @@ -242,8 +242,13 @@ +++++ {-# LINE 10 "<command-line>" #-}-{-# LINE 1 "/usr/lib/ghc-7.10.1/include/ghcversion.h" #-}+{-# LINE 1 "/usr/lib/ghc-7.10.2/include/ghcversion.h" #-}
dist/build/Tip/Parser/ParTIP.hs view
@@ -18,1207 +18,1365 @@ #else type HappyAny = forall a . a #endif-happyIn31 :: (Integer) -> (HappyAbsSyn )-happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn31 #-}-happyOut31 :: (HappyAbsSyn ) -> (Integer)-happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut31 #-}-happyIn32 :: (Symbol) -> (HappyAbsSyn )-happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn32 #-}-happyOut32 :: (HappyAbsSyn ) -> (Symbol)-happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut32 #-}-happyIn33 :: (Start) -> (HappyAbsSyn )-happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn33 #-}-happyOut33 :: (HappyAbsSyn ) -> (Start)-happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut33 #-}-happyIn34 :: ([Decl]) -> (HappyAbsSyn )-happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn34 #-}-happyOut34 :: (HappyAbsSyn ) -> ([Decl])-happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut34 #-}-happyIn35 :: (Decl) -> (HappyAbsSyn )-happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn35 #-}-happyOut35 :: (HappyAbsSyn ) -> (Decl)-happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut35 #-}-happyIn36 :: (Assertion) -> (HappyAbsSyn )-happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn36 #-}-happyOut36 :: (HappyAbsSyn ) -> (Assertion)-happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut36 #-}-happyIn37 :: (FunDef) -> (HappyAbsSyn )-happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn37 #-}-happyOut37 :: (HappyAbsSyn ) -> (FunDef)-happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut37 #-}-happyIn38 :: (InnerFunDef) -> (HappyAbsSyn )-happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn38 #-}-happyOut38 :: (HappyAbsSyn ) -> (InnerFunDef)-happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut38 #-}-happyIn39 :: (FunDecl) -> (HappyAbsSyn )-happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn39 #-}-happyOut39 :: (HappyAbsSyn ) -> (FunDecl)-happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut39 #-}-happyIn40 :: (InnerFunDecl) -> (HappyAbsSyn )-happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn40 #-}-happyOut40 :: (HappyAbsSyn ) -> (InnerFunDecl)-happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut40 #-}-happyIn41 :: (Datatype) -> (HappyAbsSyn )-happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn41 #-}-happyOut41 :: (HappyAbsSyn ) -> (Datatype)-happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut41 #-}-happyIn42 :: (Constructor) -> (HappyAbsSyn )-happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn42 #-}-happyOut42 :: (HappyAbsSyn ) -> (Constructor)-happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut42 #-}-happyIn43 :: (Binding) -> (HappyAbsSyn )-happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn43 #-}-happyOut43 :: (HappyAbsSyn ) -> (Binding)-happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut43 #-}-happyIn44 :: (LetDecl) -> (HappyAbsSyn )-happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn44 #-}-happyOut44 :: (HappyAbsSyn ) -> (LetDecl)-happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut44 #-}-happyIn45 :: (Type) -> (HappyAbsSyn )-happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn45 #-}-happyOut45 :: (HappyAbsSyn ) -> (Type)-happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut45 #-}-happyIn46 :: (Expr) -> (HappyAbsSyn )-happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn46 #-}-happyOut46 :: (HappyAbsSyn ) -> (Expr)-happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut46 #-}-happyIn47 :: (Binder) -> (HappyAbsSyn )-happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn47 #-}-happyOut47 :: (HappyAbsSyn ) -> (Binder)-happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut47 #-}-happyIn48 :: (Case) -> (HappyAbsSyn )-happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn48 #-}-happyOut48 :: (HappyAbsSyn ) -> (Case)-happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut48 #-}-happyIn49 :: (Pattern) -> (HappyAbsSyn )-happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn49 #-}-happyOut49 :: (HappyAbsSyn ) -> (Pattern)-happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut49 #-}-happyIn50 :: (Head) -> (HappyAbsSyn )-happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn50 #-}-happyOut50 :: (HappyAbsSyn ) -> (Head)-happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut50 #-}-happyIn51 :: ([LetDecl]) -> (HappyAbsSyn )-happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn51 #-}-happyOut51 :: (HappyAbsSyn ) -> ([LetDecl])-happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut51 #-}-happyIn52 :: ([Case]) -> (HappyAbsSyn )-happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn52 #-}-happyOut52 :: (HappyAbsSyn ) -> ([Case])-happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut52 #-}-happyIn53 :: ([Expr]) -> (HappyAbsSyn )-happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn53 #-}-happyOut53 :: (HappyAbsSyn ) -> ([Expr])-happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut53 #-}-happyIn54 :: ([Datatype]) -> (HappyAbsSyn )-happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn54 #-}-happyOut54 :: (HappyAbsSyn ) -> ([Datatype])-happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut54 #-}-happyIn55 :: ([Constructor]) -> (HappyAbsSyn )-happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn55 #-}-happyOut55 :: (HappyAbsSyn ) -> ([Constructor])-happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut55 #-}-happyIn56 :: ([Binding]) -> (HappyAbsSyn )-happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn56 #-}-happyOut56 :: (HappyAbsSyn ) -> ([Binding])-happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut56 #-}-happyIn57 :: ([Symbol]) -> (HappyAbsSyn )-happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn57 #-}-happyOut57 :: (HappyAbsSyn ) -> ([Symbol])-happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut57 #-}-happyIn58 :: ([Type]) -> (HappyAbsSyn )-happyIn58 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn58 #-}-happyOut58 :: (HappyAbsSyn ) -> ([Type])-happyOut58 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut58 #-}-happyIn59 :: ([FunDecl]) -> (HappyAbsSyn )-happyIn59 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn59 #-}-happyOut59 :: (HappyAbsSyn ) -> ([FunDecl])-happyOut59 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut59 #-}-happyIn60 :: ([FunDef]) -> (HappyAbsSyn )-happyIn60 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn60 #-}-happyOut60 :: (HappyAbsSyn ) -> ([FunDef])-happyOut60 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut60 #-}-happyInTok :: (Token) -> (HappyAbsSyn )-happyInTok x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyInTok #-}-happyOutTok :: (HappyAbsSyn ) -> (Token)-happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOutTok #-}---happyActOffsets :: HappyAddr-happyActOffsets = HappyA# "\x8f\x01\x8f\x01\x76\x00\x1d\x01\x8e\x01\x8c\x01\x4f\x00\x84\x01\x8b\x01\x8a\x01\x89\x01\x88\x01\x4e\x00\x4d\x00\xff\x00\x87\x01\x24\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x01\x00\x00\x0b\x00\x05\x00\x03\x00\x03\x01\x0a\x00\x09\x00\x08\x00\x01\x00\x07\x00\x06\x00\x00\x00\x82\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x01\x81\x01\x00\x00\x7f\x01\x7e\x01\x7a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x01\xa1\x00\x00\x00\x00\x00\x00\x00\x7a\x01\xf8\xff\x00\x00\x00\x00\x7a\x01\x80\x01\x79\x01\x77\x01\x70\x01\x69\x01\x64\x01\x5e\x01\x7d\x01\x5c\x01\x5c\x01\x00\x00\x51\x01\x5b\x01\x5a\x01\x58\x01\x00\x00\x68\x00\x58\x01\x00\x00\x00\x00\x58\x01\x3c\x00\x7c\x01\x4f\x00\x57\x01\x7b\x01\x55\x01\xfd\x00\x55\x01\x00\x00\x78\x01\x76\x01\x00\x00\x53\x01\x00\x00\x00\x00\x00\x00\x7a\x00\x75\x01\x74\x01\x73\x01\x00\x00\x00\x00\x00\x00\x4e\x00\x39\x00\x00\x00\x00\x00\x72\x01\x00\x00\x39\x00\x71\x01\x39\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x53\x00\x39\x00\x00\x00\x00\x00\x4e\x00\x1e\x00\x00\x00\x4a\x00\x36\x00\x6f\x01\x6e\x01\x29\x01\x27\x01\x16\x00\x00\x00\x00\x00\x00\x00\x6d\x01\x52\x00\x00\x00\x25\x01\x00\x00\x6c\x01\x00\x00\x6b\x01\x6a\x01\x00\x00\x23\x01\x51\x00\x50\x00\x4e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x01\x00\x00\x68\x01\x1f\x01\x18\x01\x67\x01\x00\x00\x00\x00\x00\x00\x21\x00\x00\x00\x21\x00\x00\x00\x66\x01\x65\x01\x4e\x00\x10\x00\x00\x00\x00\x00\x19\x00\xdc\x00\x21\x00\x63\x01\x62\x01\x50\x01\x61\x01\x60\x01\x00\x00\x00\x00\x5f\x01\x00\x00\x00\x00\x52\x01\x00\x00\x00\x00\x00\x00\x4f\x01\x00\x00\x00\x00"#--happyGotoOffsets :: HappyAddr-happyGotoOffsets = HappyA# "\x00\x01\x4d\x01\xaf\x00\x4e\x01\xc2\x00\x4b\x01\x0f\x01\xb1\x00\x56\x01\x54\x01\x49\x01\x4c\x01\xfe\x00\xf7\x00\x46\x01\x47\x01\x5c\x00\x02\x00\x4a\x01\x48\x01\x44\x01\x45\x01\x43\x01\x3e\x01\x33\x01\x31\x01\x2f\x01\x2b\x01\x00\x00\x00\x00\x6b\x00\xad\x00\xfc\x00\x42\x01\x3a\x01\x3f\x01\x3d\x01\xf5\x00\x38\x01\x37\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x01\x00\x00\x00\x00\x00\x00\x32\x01\x00\x00\x3c\x01\x00\x00\x3b\x01\x00\x00\x39\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x01\x00\x00\x00\x00\x36\x01\x00\x00\x00\x00\x00\x00\x00\x00\xf2\x00\x00\x00\x67\x00\x35\x01\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x01\x34\x01\x00\x00\x26\x01\x00\x00\x59\x00\x00\x00\x00\x00\x00\x00\x24\x01\x20\x01\x22\x01\xfb\x00\xef\x00\x1e\x01\x1a\x01\x00\x00\x1c\x01\xe5\x00\x00\x00\xdf\x00\x04\x00\x19\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x01\xdb\x00\x1b\x01\x08\x01\xfa\x00\xd9\x00\x05\x01\xf9\x00\xf9\x00\x00\x00\x00\x00\x09\x01\x02\x01\xf9\x00\xf1\x00\xeb\x00\xe7\x00\x00\x00\xf8\x00\x00\x00\x60\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x00\x00\xc7\x00\xcc\x00\xbd\x00\xbd\x00\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\x00\x00\x00\x00\x00\x8a\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd5\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x66\x00\x18\x00\x26\x00\x3a\x00\xf9\xff\x92\x00\x13\x00\x0d\x00\x00\x00\x00\x00\xae\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyDefActions :: HappyAddr-happyDefActions = HappyA# "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xa3\xff\xa1\xff\x9f\xff\x9d\xff\x9b\xff\x99\xff\x97\xff\x95\xff\x93\xff\x00\x00\xe3\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\xff\x00\x00\xac\xff\xae\xff\xad\xff\xa7\xff\xa6\xff\xb0\xff\xb1\xff\xa9\xff\xa8\xff\xb6\xff\xb4\xff\xaf\xff\xab\xff\xb5\xff\xaa\xff\xb2\xff\xb3\xff\xe2\xff\xb8\xff\x00\x00\x00\x00\xba\xff\x00\x00\x00\x00\x00\x00\xbc\xff\xbd\xff\xbe\xff\xc1\xff\xc7\xff\x00\x00\x00\x00\xbf\xff\xc0\xff\xcc\xff\x00\x00\x00\x00\xc8\xff\xc9\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xff\x00\x00\x00\x00\x00\x00\x00\x00\xd5\xff\x00\x00\x00\x00\xd8\xff\xd7\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\xff\x00\x00\x00\x00\x93\xff\x00\x00\xdc\xff\x99\xff\xda\xff\x00\x00\x00\x00\x00\x00\x00\x00\x97\xff\x9d\xff\x9b\xff\x00\x00\x00\x00\x97\xff\x97\xff\x00\x00\xa1\xff\x00\x00\x00\x00\x00\x00\x00\x00\x99\xff\xa4\xff\xa2\xff\xa0\xff\x9e\xff\x9c\xff\x9a\xff\x98\xff\x96\xff\x94\xff\x92\xff\x00\x00\x00\x00\xa3\xff\xa5\xff\x00\x00\x00\x00\x9b\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\xff\x99\xff\x9b\xff\x00\x00\x00\x00\xdd\xff\x00\x00\xe0\xff\x00\x00\xdf\xff\x00\x00\x00\x00\x99\xff\x00\x00\x00\x00\x00\x00\x00\x00\xd0\xff\xcf\xff\xce\xff\xcd\xff\xcb\xff\xca\xff\x00\x00\xc5\xff\x00\x00\x00\x00\x00\x00\x00\x00\xb9\xff\xbb\xff\xc4\xff\x00\x00\xc6\xff\x00\x00\xd1\xff\x00\x00\x00\x00\x00\x00\x00\x00\x9f\xff\xa1\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3\xff\xc2\xff\x00\x00\xd6\xff\xd4\xff\x00\x00\xde\xff\xdb\xff\xd9\xff\x00\x00\xd3\xff"#--happyCheck :: HappyAddr-happyCheck = HappyA# "\xff\xff\x09\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x00\x00\x01\x00\x16\x00\x0d\x00\x0e\x00\x02\x00\x04\x00\x05\x00\x13\x00\x12\x00\x01\x00\x02\x00\x01\x00\x01\x00\x02\x00\x0f\x00\x0a\x00\x1d\x00\x01\x00\x02\x00\x29\x00\x01\x00\x0d\x00\x0e\x00\x01\x00\x0e\x00\x01\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x29\x00\x2a\x00\x29\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x1d\x00\x01\x00\x02\x00\x29\x00\x01\x00\x1d\x00\x18\x00\x01\x00\x1d\x00\x29\x00\x27\x00\x28\x00\x29\x00\x0d\x00\x0e\x00\x27\x00\x28\x00\x29\x00\x27\x00\x28\x00\x29\x00\x01\x00\x02\x00\x29\x00\x01\x00\x01\x00\x01\x00\x17\x00\x02\x00\x02\x00\x02\x00\x02\x00\x1d\x00\x0d\x00\x0e\x00\x1d\x00\x01\x00\x0d\x00\x0e\x00\x01\x00\x01\x00\x29\x00\x27\x00\x28\x00\x29\x00\x27\x00\x28\x00\x29\x00\x06\x00\x07\x00\x01\x00\x10\x00\x1d\x00\x0e\x00\x13\x00\x07\x00\x12\x00\x08\x00\x09\x00\x06\x00\x07\x00\x29\x00\x27\x00\x28\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x11\x00\x12\x00\x0f\x00\x10\x00\x15\x00\x16\x00\x17\x00\x26\x00\x19\x00\x11\x00\x29\x00\x00\x00\x01\x00\x1a\x00\x1b\x00\x1c\x00\x0d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x0f\x00\x0c\x00\x29\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x01\x00\x01\x00\x0f\x00\x10\x00\x01\x00\x04\x00\x05\x00\x08\x00\x09\x00\x09\x00\x00\x00\x01\x00\x09\x00\x1a\x00\x1b\x00\x1c\x00\x01\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x0f\x00\x06\x00\x07\x00\x29\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x00\x00\x01\x00\x0f\x00\x0c\x00\x00\x00\x01\x00\x00\x00\x01\x00\x01\x00\x02\x00\x00\x00\x01\x00\x1a\x00\x1a\x00\x1b\x00\x0f\x00\x00\x00\x01\x00\x1f\x00\x0f\x00\x03\x00\x0f\x00\x23\x00\x24\x00\x25\x00\x0f\x00\x00\x00\x01\x00\x29\x00\x00\x00\x01\x00\x0f\x00\x00\x00\x01\x00\x00\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x0f\x00\x01\x00\x19\x00\x0f\x00\x02\x00\x03\x00\x0f\x00\x1a\x00\x0f\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x1a\x00\x0e\x00\x0b\x00\x11\x00\x12\x00\x01\x00\x14\x00\x15\x00\x16\x00\x17\x00\x0c\x00\x19\x00\x08\x00\x09\x00\x01\x00\x02\x00\x1c\x00\x14\x00\x1e\x00\x19\x00\x20\x00\x01\x00\x02\x00\x01\x00\x02\x00\x01\x00\x02\x00\x01\x00\x02\x00\x01\x00\x02\x00\x01\x00\x02\x00\x29\x00\x2a\x00\x11\x00\x12\x00\x15\x00\x01\x00\x16\x00\x1a\x00\x00\x00\x1b\x00\x01\x00\x01\x00\x18\x00\x1b\x00\x01\x00\x19\x00\x01\x00\x01\x00\x0c\x00\x1b\x00\x1a\x00\x01\x00\x01\x00\x01\x00\x0d\x00\x1d\x00\x0c\x00\x0a\x00\x1d\x00\x11\x00\x0b\x00\x1c\x00\x1b\x00\x1a\x00\xff\xff\xff\xff\x03\x00\x02\x00\x07\x00\x05\x00\x02\x00\x0c\x00\x10\x00\x19\x00\x11\x00\x0d\x00\x16\x00\x18\x00\x17\x00\x15\x00\x14\x00\x0b\x00\x0a\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x01\x00\x01\x00\xff\xff\x02\x00\x02\x00\x01\x00\x01\x00\x01\x00\x01\x00\xff\xff\x02\x00\x02\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x26\x00\x02\x00\x29\x00\x02\x00\x28\x00\x01\x00\x01\x00\x01\x00\x2a\x00\x29\x00\x01\x00\x2a\x00\x29\x00\xff\xff\x2a\x00\x2a\x00\x29\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x2a\x00\x01\x00\x01\x00\x13\x00\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\xff\xff\xff\xff\x2a\x00\x2a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2a\x00\x29\x00\x28\x00\x2a\x00\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#--happyTable :: HappyAddr-happyTable = HappyA# "\x00\x00\x82\x00\x4a\x00\x28\x00\x4f\x00\x3c\x00\x5e\x00\x53\x00\x42\x00\x59\x00\x57\x00\x55\x00\x63\x00\x46\x00\x47\x00\xcb\x00\x50\x00\x51\x00\xce\x00\x70\x00\x67\x00\x29\x00\x94\x00\x4f\x00\xb2\x00\x4c\x00\x4a\x00\xdb\x00\xd8\x00\x8c\x00\x4b\x00\x4a\x00\xba\x00\x3c\x00\x4a\x00\x50\x00\x51\x00\x3f\x00\xce\x00\x8f\x00\x4c\x00\x1e\x00\x3c\x00\xff\xff\x3c\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4b\x00\x4f\x00\xb7\x00\x3c\x00\x4a\x00\x4b\x00\x40\x00\x78\x00\x4b\x00\x3c\x00\x4c\x00\x1e\x00\x3c\x00\x50\x00\x51\x00\x4c\x00\x1e\x00\x3c\x00\x4c\x00\x1e\x00\x3c\x00\x4f\x00\xb8\x00\x3c\x00\x4a\x00\x4f\x00\x5e\x00\xcc\x00\xc6\x00\xc7\x00\xad\x00\xbf\x00\x4b\x00\x50\x00\x51\x00\x4b\x00\x28\x00\x50\x00\x51\x00\x3c\x00\x4c\x00\x3c\x00\x4c\x00\x1e\x00\x3c\x00\x4c\x00\x1e\x00\x3c\x00\x92\x00\x61\x00\x59\x00\x82\x00\x4b\x00\xc4\x00\x83\x00\xcf\x00\x3d\x00\x74\x00\x5c\x00\x92\x00\x61\x00\x3c\x00\x4c\x00\x1e\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x65\x00\x66\x00\x35\x00\x85\x00\x69\x00\x6a\x00\x6b\x00\x7a\x00\x6c\x00\x8a\x00\x3c\x00\x46\x00\x47\x00\x36\x00\x37\x00\x44\x00\x89\x00\x45\x00\x38\x00\x46\x00\x86\x00\x87\x00\x39\x00\x3a\x00\x3b\x00\xa5\x00\x8b\x00\x8e\x00\x3c\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x59\x00\x59\x00\x35\x00\x85\x00\x59\x00\x66\x00\x67\x00\x91\x00\x5c\x00\xd5\x00\x46\x00\x47\x00\x5a\x00\x36\x00\x37\x00\x44\x00\x8f\x00\x45\x00\x38\x00\x46\x00\x86\x00\x87\x00\x39\x00\x3a\x00\x3b\x00\xd1\x00\x60\x00\x61\x00\x3c\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x46\x00\x47\x00\x35\x00\x8e\x00\x46\x00\x47\x00\x46\x00\x47\x00\x59\x00\xda\x00\x46\x00\x47\x00\xc8\x00\x36\x00\x37\x00\xd2\x00\x46\x00\x47\x00\x38\x00\x8b\x00\xaa\x00\xbd\x00\x39\x00\x3a\x00\x3b\x00\x95\x00\x46\x00\x47\x00\x3c\x00\x46\x00\x47\x00\x97\x00\x46\x00\x47\x00\x46\x00\x47\x00\x8f\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x9c\x00\x4c\x00\xae\x00\x76\x00\x6e\x00\x6f\x00\x8b\x00\xaf\x00\x48\x00\x90\x00\xba\x00\x9d\x00\x90\x00\xb0\x00\x4d\x00\x8d\x00\x65\x00\x66\x00\x59\x00\x72\x00\x69\x00\x6a\x00\x6b\x00\x8e\x00\x6c\x00\x5b\x00\x5c\x00\x42\x00\xc1\x00\x44\x00\xbb\x00\x45\x00\xb8\x00\x46\x00\x53\x00\xc2\x00\x55\x00\xc4\x00\x55\x00\xc8\x00\x63\x00\xac\x00\x57\x00\xb3\x00\x55\x00\xb4\x00\x3c\x00\xff\xff\x65\x00\x66\x00\xbc\x00\x8f\x00\x98\x00\x93\x00\xa6\x00\x9a\x00\x73\x00\x78\x00\x9f\x00\x9b\x00\x7c\x00\x9e\x00\x7d\x00\x7e\x00\x7f\x00\xa0\x00\xa5\x00\x80\x00\x88\x00\x8f\x00\x89\x00\xa7\x00\x8e\x00\x8c\x00\x1e\x00\x8a\x00\x8d\x00\x1f\x00\x20\x00\x21\x00\x00\x00\x00\x00\x6c\x00\xde\x00\x5e\x00\x63\x00\xdc\x00\x53\x00\x42\x00\x22\x00\x40\x00\x51\x00\x25\x00\x23\x00\x24\x00\x26\x00\x27\x00\x55\x00\x57\x00\xdd\x00\xd4\x00\xd5\x00\xd7\x00\xd8\x00\x60\x00\xd1\x00\x00\x00\xc0\x00\xc3\x00\xca\x00\xcb\x00\x6e\x00\xae\x00\x00\x00\xb5\x00\xb6\x00\x97\x00\x9a\x00\xa2\x00\xa3\x00\xa4\x00\x7b\x00\xa9\x00\x3c\x00\xaa\x00\x1e\x00\x73\x00\x76\x00\x7c\x00\xff\xff\x3c\x00\x55\x00\xff\xff\x3c\x00\x00\x00\xff\xff\xff\xff\x3c\x00\x42\x00\x53\x00\x55\x00\x57\x00\x59\x00\x60\x00\xff\xff\x63\x00\x6e\x00\x88\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x3c\x00\x1e\x00\xff\xff\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyReduceArr = Happy_Data_Array.array (28, 109) [- (28 , happyReduce_28),- (29 , happyReduce_29),- (30 , happyReduce_30),- (31 , happyReduce_31),- (32 , happyReduce_32),- (33 , happyReduce_33),- (34 , happyReduce_34),- (35 , happyReduce_35),- (36 , happyReduce_36),- (37 , happyReduce_37),- (38 , happyReduce_38),- (39 , happyReduce_39),- (40 , happyReduce_40),- (41 , happyReduce_41),- (42 , happyReduce_42),- (43 , happyReduce_43),- (44 , happyReduce_44),- (45 , happyReduce_45),- (46 , happyReduce_46),- (47 , happyReduce_47),- (48 , happyReduce_48),- (49 , happyReduce_49),- (50 , happyReduce_50),- (51 , happyReduce_51),- (52 , happyReduce_52),- (53 , happyReduce_53),- (54 , happyReduce_54),- (55 , happyReduce_55),- (56 , happyReduce_56),- (57 , happyReduce_57),- (58 , happyReduce_58),- (59 , happyReduce_59),- (60 , happyReduce_60),- (61 , happyReduce_61),- (62 , happyReduce_62),- (63 , happyReduce_63),- (64 , happyReduce_64),- (65 , happyReduce_65),- (66 , happyReduce_66),- (67 , happyReduce_67),- (68 , happyReduce_68),- (69 , happyReduce_69),- (70 , happyReduce_70),- (71 , happyReduce_71),- (72 , happyReduce_72),- (73 , happyReduce_73),- (74 , happyReduce_74),- (75 , happyReduce_75),- (76 , happyReduce_76),- (77 , happyReduce_77),- (78 , happyReduce_78),- (79 , happyReduce_79),- (80 , happyReduce_80),- (81 , happyReduce_81),- (82 , happyReduce_82),- (83 , happyReduce_83),- (84 , happyReduce_84),- (85 , happyReduce_85),- (86 , happyReduce_86),- (87 , happyReduce_87),- (88 , happyReduce_88),- (89 , happyReduce_89),- (90 , happyReduce_90),- (91 , happyReduce_91),- (92 , happyReduce_92),- (93 , happyReduce_93),- (94 , happyReduce_94),- (95 , happyReduce_95),- (96 , happyReduce_96),- (97 , happyReduce_97),- (98 , happyReduce_98),- (99 , happyReduce_99),- (100 , happyReduce_100),- (101 , happyReduce_101),- (102 , happyReduce_102),- (103 , happyReduce_103),- (104 , happyReduce_104),- (105 , happyReduce_105),- (106 , happyReduce_106),- (107 , happyReduce_107),- (108 , happyReduce_108),- (109 , happyReduce_109)- ]--happy_n_terms = 43 :: Int-happy_n_nonterms = 30 :: Int--happyReduce_28 = happySpecReduce_1 0# happyReduction_28-happyReduction_28 happy_x_1- = case happyOutTok happy_x_1 of { (PT _ (TI happy_var_1)) -> - happyIn31- ((read ( happy_var_1)) :: Integer- )}--happyReduce_29 = happySpecReduce_1 1# happyReduction_29-happyReduction_29 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn32- (Symbol (mkPosToken happy_var_1)- )}--happyReduce_30 = happySpecReduce_1 2# happyReduction_30-happyReduction_30 happy_x_1- = case happyOut34 happy_x_1 of { happy_var_1 -> - happyIn33- (Start happy_var_1- )}--happyReduce_31 = happySpecReduce_3 3# happyReduction_31-happyReduction_31 happy_x_3- happy_x_2- happy_x_1- = happyIn34- ([]- )--happyReduce_32 = happyReduce 4# 3# happyReduction_32-happyReduction_32 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut35 happy_x_2 of { happy_var_2 -> - case happyOut34 happy_x_4 of { happy_var_4 -> - happyIn34- ((:) happy_var_2 happy_var_4- ) `HappyStk` happyRest}}--happyReduce_33 = happyReduce 7# 4# happyReduction_33-happyReduction_33 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut57 happy_x_3 of { happy_var_3 -> - case happyOut54 happy_x_6 of { happy_var_6 -> - happyIn35- (DeclareDatatypes (reverse happy_var_3) (reverse happy_var_6)- ) `HappyStk` happyRest}}--happyReduce_34 = happySpecReduce_3 4# happyReduction_34-happyReduction_34 happy_x_3- happy_x_2- happy_x_1- = case happyOut32 happy_x_2 of { happy_var_2 -> - case happyOut31 happy_x_3 of { happy_var_3 -> - happyIn35- (DeclareSort happy_var_2 happy_var_3- )}}--happyReduce_35 = happySpecReduce_2 4# happyReduction_35-happyReduction_35 happy_x_2- happy_x_1- = case happyOut39 happy_x_2 of { happy_var_2 -> - happyIn35- (DeclareFun happy_var_2- )}--happyReduce_36 = happyReduce 7# 4# happyReduction_36-happyReduction_36 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut60 happy_x_3 of { happy_var_3 -> - case happyOut53 happy_x_6 of { happy_var_6 -> - happyIn35- (DefineFunsRec (reverse happy_var_3) (reverse happy_var_6)- ) `HappyStk` happyRest}}--happyReduce_37 = happySpecReduce_2 4# happyReduction_37-happyReduction_37 happy_x_2- happy_x_1- = case happyOut36 happy_x_1 of { happy_var_1 -> - case happyOut46 happy_x_2 of { happy_var_2 -> - happyIn35- (MonoAssert happy_var_1 happy_var_2- )}}--happyReduce_38 = happyReduce 8# 4# happyReduction_38-happyReduction_38 (happy_x_8 `HappyStk`- happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut36 happy_x_1 of { happy_var_1 -> - case happyOut57 happy_x_5 of { happy_var_5 -> - case happyOut46 happy_x_7 of { happy_var_7 -> - happyIn35- (ParAssert happy_var_1 (reverse happy_var_5) happy_var_7- ) `HappyStk` happyRest}}}--happyReduce_39 = happySpecReduce_1 5# happyReduction_39-happyReduction_39 happy_x_1- = happyIn36- (AssertIt- )--happyReduce_40 = happySpecReduce_1 5# happyReduction_40-happyReduction_40 happy_x_1- = happyIn36- (AssertNot- )--happyReduce_41 = happyReduce 7# 6# happyReduction_41-happyReduction_41 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut57 happy_x_4 of { happy_var_4 -> - case happyOut38 happy_x_6 of { happy_var_6 -> - happyIn37- (ParFunDef (reverse happy_var_4) happy_var_6- ) `HappyStk` happyRest}}--happyReduce_42 = happySpecReduce_1 6# happyReduction_42-happyReduction_42 happy_x_1- = case happyOut38 happy_x_1 of { happy_var_1 -> - happyIn37- (MonoFunDef happy_var_1- )}--happyReduce_43 = happyReduce 7# 7# happyReduction_43-happyReduction_43 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut32 happy_x_2 of { happy_var_2 -> - case happyOut56 happy_x_4 of { happy_var_4 -> - case happyOut45 happy_x_6 of { happy_var_6 -> - happyIn38- (InnerFunDef happy_var_2 (reverse happy_var_4) happy_var_6- ) `HappyStk` happyRest}}}--happyReduce_44 = happyReduce 9# 8# happyReduction_44-happyReduction_44 (happy_x_9 `HappyStk`- happy_x_8 `HappyStk`- happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut57 happy_x_4 of { happy_var_4 -> - case happyOut40 happy_x_7 of { happy_var_7 -> - happyIn39- (ParFunDecl (reverse happy_var_4) happy_var_7- ) `HappyStk` happyRest}}--happyReduce_45 = happySpecReduce_1 8# happyReduction_45-happyReduction_45 happy_x_1- = case happyOut40 happy_x_1 of { happy_var_1 -> - happyIn39- (MonoFunDecl happy_var_1- )}--happyReduce_46 = happyReduce 5# 9# happyReduction_46-happyReduction_46 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut32 happy_x_1 of { happy_var_1 -> - case happyOut58 happy_x_3 of { happy_var_3 -> - case happyOut45 happy_x_5 of { happy_var_5 -> - happyIn40- (InnerFunDecl happy_var_1 (reverse happy_var_3) happy_var_5- ) `HappyStk` happyRest}}}--happyReduce_47 = happyReduce 4# 10# happyReduction_47-happyReduction_47 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut32 happy_x_2 of { happy_var_2 -> - case happyOut55 happy_x_3 of { happy_var_3 -> - happyIn41- (Datatype happy_var_2 (reverse happy_var_3)- ) `HappyStk` happyRest}}--happyReduce_48 = happyReduce 4# 11# happyReduction_48-happyReduction_48 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut32 happy_x_2 of { happy_var_2 -> - case happyOut56 happy_x_3 of { happy_var_3 -> - happyIn42- (Constructor happy_var_2 (reverse happy_var_3)- ) `HappyStk` happyRest}}--happyReduce_49 = happyReduce 4# 12# happyReduction_49-happyReduction_49 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut32 happy_x_2 of { happy_var_2 -> - case happyOut45 happy_x_3 of { happy_var_3 -> - happyIn43- (Binding happy_var_2 happy_var_3- ) `HappyStk` happyRest}}--happyReduce_50 = happyReduce 4# 13# happyReduction_50-happyReduction_50 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut43 happy_x_2 of { happy_var_2 -> - case happyOut46 happy_x_3 of { happy_var_3 -> - happyIn44- (LetDecl happy_var_2 happy_var_3- ) `HappyStk` happyRest}}--happyReduce_51 = happySpecReduce_1 14# happyReduction_51-happyReduction_51 happy_x_1- = case happyOut32 happy_x_1 of { happy_var_1 -> - happyIn45- (TyVar happy_var_1- )}--happyReduce_52 = happyReduce 4# 14# happyReduction_52-happyReduction_52 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut32 happy_x_2 of { happy_var_2 -> - case happyOut58 happy_x_3 of { happy_var_3 -> - happyIn45- (TyApp happy_var_2 (reverse happy_var_3)- ) `HappyStk` happyRest}}--happyReduce_53 = happyReduce 4# 14# happyReduction_53-happyReduction_53 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut58 happy_x_3 of { happy_var_3 -> - happyIn45- (ArrowTy (reverse happy_var_3)- ) `HappyStk` happyRest}--happyReduce_54 = happySpecReduce_1 14# happyReduction_54-happyReduction_54 happy_x_1- = happyIn45- (IntTy- )--happyReduce_55 = happySpecReduce_1 14# happyReduction_55-happyReduction_55 happy_x_1- = happyIn45- (BoolTy- )--happyReduce_56 = happySpecReduce_1 15# happyReduction_56-happyReduction_56 happy_x_1- = case happyOut32 happy_x_1 of { happy_var_1 -> - happyIn46- (Var happy_var_1- )}--happyReduce_57 = happyReduce 5# 15# happyReduction_57-happyReduction_57 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut46 happy_x_3 of { happy_var_3 -> - case happyOut45 happy_x_4 of { happy_var_4 -> - happyIn46- (As happy_var_3 happy_var_4- ) `HappyStk` happyRest}}--happyReduce_58 = happyReduce 4# 15# happyReduction_58-happyReduction_58 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut50 happy_x_2 of { happy_var_2 -> - case happyOut53 happy_x_3 of { happy_var_3 -> - happyIn46- (App happy_var_2 (reverse happy_var_3)- ) `HappyStk` happyRest}}--happyReduce_59 = happyReduce 5# 15# happyReduction_59-happyReduction_59 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut46 happy_x_3 of { happy_var_3 -> - case happyOut52 happy_x_4 of { happy_var_4 -> - happyIn46- (Match happy_var_3 (reverse happy_var_4)- ) `HappyStk` happyRest}}--happyReduce_60 = happyReduce 7# 15# happyReduction_60-happyReduction_60 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut51 happy_x_4 of { happy_var_4 -> - case happyOut46 happy_x_6 of { happy_var_6 -> - happyIn46- (Let (reverse happy_var_4) happy_var_6- ) `HappyStk` happyRest}}--happyReduce_61 = happyReduce 7# 15# happyReduction_61-happyReduction_61 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut47 happy_x_2 of { happy_var_2 -> - case happyOut56 happy_x_4 of { happy_var_4 -> - case happyOut46 happy_x_6 of { happy_var_6 -> - happyIn46- (Binder happy_var_2 (reverse happy_var_4) happy_var_6- ) `HappyStk` happyRest}}}--happyReduce_62 = happySpecReduce_1 15# happyReduction_62-happyReduction_62 happy_x_1- = case happyOut31 happy_x_1 of { happy_var_1 -> - happyIn46- (LitInt happy_var_1- )}--happyReduce_63 = happySpecReduce_1 15# happyReduction_63-happyReduction_63 happy_x_1- = happyIn46- (LitTrue- )--happyReduce_64 = happySpecReduce_1 15# happyReduction_64-happyReduction_64 happy_x_1- = happyIn46- (LitFalse- )--happyReduce_65 = happySpecReduce_1 16# happyReduction_65-happyReduction_65 happy_x_1- = happyIn47- (Lambda- )--happyReduce_66 = happySpecReduce_1 16# happyReduction_66-happyReduction_66 happy_x_1- = happyIn47- (Forall- )--happyReduce_67 = happySpecReduce_1 16# happyReduction_67-happyReduction_67 happy_x_1- = happyIn47- (Exists- )--happyReduce_68 = happyReduce 5# 17# happyReduction_68-happyReduction_68 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut49 happy_x_3 of { happy_var_3 -> - case happyOut46 happy_x_4 of { happy_var_4 -> - happyIn48- (Case happy_var_3 happy_var_4- ) `HappyStk` happyRest}}--happyReduce_69 = happySpecReduce_1 18# happyReduction_69-happyReduction_69 happy_x_1- = happyIn49- (Default- )--happyReduce_70 = happyReduce 4# 18# happyReduction_70-happyReduction_70 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut32 happy_x_2 of { happy_var_2 -> - case happyOut57 happy_x_3 of { happy_var_3 -> - happyIn49- (ConPat happy_var_2 (reverse happy_var_3)- ) `HappyStk` happyRest}}--happyReduce_71 = happySpecReduce_1 18# happyReduction_71-happyReduction_71 happy_x_1- = case happyOut32 happy_x_1 of { happy_var_1 -> - happyIn49- (SimplePat happy_var_1- )}--happyReduce_72 = happySpecReduce_1 19# happyReduction_72-happyReduction_72 happy_x_1- = case happyOut32 happy_x_1 of { happy_var_1 -> - happyIn50- (Const happy_var_1- )}--happyReduce_73 = happySpecReduce_1 19# happyReduction_73-happyReduction_73 happy_x_1- = happyIn50- (At- )--happyReduce_74 = happySpecReduce_1 19# happyReduction_74-happyReduction_74 happy_x_1- = happyIn50- (IfThenElse- )--happyReduce_75 = happySpecReduce_1 19# happyReduction_75-happyReduction_75 happy_x_1- = happyIn50- (And- )--happyReduce_76 = happySpecReduce_1 19# happyReduction_76-happyReduction_76 happy_x_1- = happyIn50- (Or- )--happyReduce_77 = happySpecReduce_1 19# happyReduction_77-happyReduction_77 happy_x_1- = happyIn50- (Not- )--happyReduce_78 = happySpecReduce_1 19# happyReduction_78-happyReduction_78 happy_x_1- = happyIn50- (Implies- )--happyReduce_79 = happySpecReduce_1 19# happyReduction_79-happyReduction_79 happy_x_1- = happyIn50- (Equal- )--happyReduce_80 = happySpecReduce_1 19# happyReduction_80-happyReduction_80 happy_x_1- = happyIn50- (Distinct- )--happyReduce_81 = happySpecReduce_1 19# happyReduction_81-happyReduction_81 happy_x_1- = happyIn50- (IntAdd- )--happyReduce_82 = happySpecReduce_1 19# happyReduction_82-happyReduction_82 happy_x_1- = happyIn50- (IntSub- )--happyReduce_83 = happySpecReduce_1 19# happyReduction_83-happyReduction_83 happy_x_1- = happyIn50- (IntMul- )--happyReduce_84 = happySpecReduce_1 19# happyReduction_84-happyReduction_84 happy_x_1- = happyIn50- (IntDiv- )--happyReduce_85 = happySpecReduce_1 19# happyReduction_85-happyReduction_85 happy_x_1- = happyIn50- (IntMod- )--happyReduce_86 = happySpecReduce_1 19# happyReduction_86-happyReduction_86 happy_x_1- = happyIn50- (IntGt- )--happyReduce_87 = happySpecReduce_1 19# happyReduction_87-happyReduction_87 happy_x_1- = happyIn50- (IntGe- )--happyReduce_88 = happySpecReduce_1 19# happyReduction_88-happyReduction_88 happy_x_1- = happyIn50- (IntLt- )--happyReduce_89 = happySpecReduce_1 19# happyReduction_89-happyReduction_89 happy_x_1- = happyIn50- (IntLe- )--happyReduce_90 = happySpecReduce_0 20# happyReduction_90-happyReduction_90 = happyIn51- ([]- )--happyReduce_91 = happySpecReduce_2 20# happyReduction_91-happyReduction_91 happy_x_2- happy_x_1- = case happyOut51 happy_x_1 of { happy_var_1 -> - case happyOut44 happy_x_2 of { happy_var_2 -> - happyIn51- (flip (:) happy_var_1 happy_var_2- )}}--happyReduce_92 = happySpecReduce_0 21# happyReduction_92-happyReduction_92 = happyIn52- ([]- )--happyReduce_93 = happySpecReduce_2 21# happyReduction_93-happyReduction_93 happy_x_2- happy_x_1- = case happyOut52 happy_x_1 of { happy_var_1 -> - case happyOut48 happy_x_2 of { happy_var_2 -> - happyIn52- (flip (:) happy_var_1 happy_var_2- )}}--happyReduce_94 = happySpecReduce_0 22# happyReduction_94-happyReduction_94 = happyIn53- ([]- )--happyReduce_95 = happySpecReduce_2 22# happyReduction_95-happyReduction_95 happy_x_2- happy_x_1- = case happyOut53 happy_x_1 of { happy_var_1 -> - case happyOut46 happy_x_2 of { happy_var_2 -> - happyIn53- (flip (:) happy_var_1 happy_var_2- )}}--happyReduce_96 = happySpecReduce_0 23# happyReduction_96-happyReduction_96 = happyIn54- ([]- )--happyReduce_97 = happySpecReduce_2 23# happyReduction_97-happyReduction_97 happy_x_2- happy_x_1- = case happyOut54 happy_x_1 of { happy_var_1 -> - case happyOut41 happy_x_2 of { happy_var_2 -> - happyIn54- (flip (:) happy_var_1 happy_var_2- )}}--happyReduce_98 = happySpecReduce_0 24# happyReduction_98-happyReduction_98 = happyIn55- ([]- )--happyReduce_99 = happySpecReduce_2 24# happyReduction_99-happyReduction_99 happy_x_2- happy_x_1- = case happyOut55 happy_x_1 of { happy_var_1 -> - case happyOut42 happy_x_2 of { happy_var_2 -> - happyIn55- (flip (:) happy_var_1 happy_var_2- )}}--happyReduce_100 = happySpecReduce_0 25# happyReduction_100-happyReduction_100 = happyIn56- ([]- )--happyReduce_101 = happySpecReduce_2 25# happyReduction_101-happyReduction_101 happy_x_2- happy_x_1- = case happyOut56 happy_x_1 of { happy_var_1 -> - case happyOut43 happy_x_2 of { happy_var_2 -> - happyIn56- (flip (:) happy_var_1 happy_var_2- )}}--happyReduce_102 = happySpecReduce_0 26# happyReduction_102-happyReduction_102 = happyIn57- ([]- )--happyReduce_103 = happySpecReduce_2 26# happyReduction_103-happyReduction_103 happy_x_2- happy_x_1- = case happyOut57 happy_x_1 of { happy_var_1 -> - case happyOut32 happy_x_2 of { happy_var_2 -> - happyIn57- (flip (:) happy_var_1 happy_var_2- )}}--happyReduce_104 = happySpecReduce_0 27# happyReduction_104-happyReduction_104 = happyIn58- ([]- )--happyReduce_105 = happySpecReduce_2 27# happyReduction_105-happyReduction_105 happy_x_2- happy_x_1- = case happyOut58 happy_x_1 of { happy_var_1 -> - case happyOut45 happy_x_2 of { happy_var_2 -> - happyIn58- (flip (:) happy_var_1 happy_var_2- )}}--happyReduce_106 = happySpecReduce_0 28# happyReduction_106-happyReduction_106 = happyIn59- ([]- )--happyReduce_107 = happySpecReduce_2 28# happyReduction_107-happyReduction_107 happy_x_2- happy_x_1- = case happyOut59 happy_x_1 of { happy_var_1 -> - case happyOut39 happy_x_2 of { happy_var_2 -> - happyIn59- (flip (:) happy_var_1 happy_var_2- )}}--happyReduce_108 = happySpecReduce_0 29# happyReduction_108-happyReduction_108 = happyIn60- ([]- )--happyReduce_109 = happySpecReduce_2 29# happyReduction_109-happyReduction_109 happy_x_2- happy_x_1- = case happyOut60 happy_x_1 of { happy_var_1 -> - case happyOut37 happy_x_2 of { happy_var_2 -> - happyIn60- (flip (:) happy_var_1 happy_var_2- )}}--happyNewToken action sts stk [] =- happyDoAction 42# notHappyAtAll action sts stk []--happyNewToken action sts stk (tk:tks) =- let cont i = happyDoAction i tk action sts stk tks in- case tk of {- PT _ (TS _ 1) -> cont 1#;- PT _ (TS _ 2) -> cont 2#;- PT _ (TS _ 3) -> cont 3#;- PT _ (TS _ 4) -> cont 4#;- PT _ (TS _ 5) -> cont 5#;- PT _ (TS _ 6) -> cont 6#;- PT _ (TS _ 7) -> cont 7#;- PT _ (TS _ 8) -> cont 8#;- PT _ (TS _ 9) -> cont 9#;- PT _ (TS _ 10) -> cont 10#;- PT _ (TS _ 11) -> cont 11#;- PT _ (TS _ 12) -> cont 12#;- PT _ (TS _ 13) -> cont 13#;- PT _ (TS _ 14) -> cont 14#;- PT _ (TS _ 15) -> cont 15#;- PT _ (TS _ 16) -> cont 16#;- PT _ (TS _ 17) -> cont 17#;- PT _ (TS _ 18) -> cont 18#;- PT _ (TS _ 19) -> cont 19#;- PT _ (TS _ 20) -> cont 20#;- PT _ (TS _ 21) -> cont 21#;- PT _ (TS _ 22) -> cont 22#;- PT _ (TS _ 23) -> cont 23#;- PT _ (TS _ 24) -> cont 24#;- PT _ (TS _ 25) -> cont 25#;- PT _ (TS _ 26) -> cont 26#;- PT _ (TS _ 27) -> cont 27#;- PT _ (TS _ 28) -> cont 28#;- PT _ (TS _ 29) -> cont 29#;- PT _ (TS _ 30) -> cont 30#;- PT _ (TS _ 31) -> cont 31#;- PT _ (TS _ 32) -> cont 32#;- PT _ (TS _ 33) -> cont 33#;- PT _ (TS _ 34) -> cont 34#;- PT _ (TS _ 35) -> cont 35#;- PT _ (TS _ 36) -> cont 36#;- PT _ (TS _ 37) -> cont 37#;- PT _ (TS _ 38) -> cont 38#;- PT _ (TS _ 39) -> cont 39#;- PT _ (TI happy_dollar_dollar) -> cont 40#;- PT _ (T_Symbol _) -> cont 41#;- _ -> happyError' (tk:tks)- }--happyError_ 42# tk tks = happyError' tks-happyError_ _ tk tks = happyError' (tk:tks)--happyThen :: () => Err a -> (a -> Err b) -> Err b-happyThen = (thenM)-happyReturn :: () => a -> Err a-happyReturn = (returnM)-happyThen1 m k tks = (thenM) m (\a -> k a tks)-happyReturn1 :: () => a -> b -> Err a-happyReturn1 = \a tks -> (returnM) a-happyError' :: () => [(Token)] -> Err a-happyError' = happyError--pStart tks = happySomeParser where- happySomeParser = happyThen (happyParse 0# tks) (\x -> happyReturn (happyOut33 x))--pListDecl tks = happySomeParser where- happySomeParser = happyThen (happyParse 1# tks) (\x -> happyReturn (happyOut34 x))--pDecl tks = happySomeParser where- happySomeParser = happyThen (happyParse 2# tks) (\x -> happyReturn (happyOut35 x))--pAssertion tks = happySomeParser where- happySomeParser = happyThen (happyParse 3# tks) (\x -> happyReturn (happyOut36 x))--pFunDef tks = happySomeParser where- happySomeParser = happyThen (happyParse 4# tks) (\x -> happyReturn (happyOut37 x))--pInnerFunDef tks = happySomeParser where- happySomeParser = happyThen (happyParse 5# tks) (\x -> happyReturn (happyOut38 x))--pFunDecl tks = happySomeParser where- happySomeParser = happyThen (happyParse 6# tks) (\x -> happyReturn (happyOut39 x))--pInnerFunDecl tks = happySomeParser where- happySomeParser = happyThen (happyParse 7# tks) (\x -> happyReturn (happyOut40 x))--pDatatype tks = happySomeParser where- happySomeParser = happyThen (happyParse 8# tks) (\x -> happyReturn (happyOut41 x))--pConstructor tks = happySomeParser where- happySomeParser = happyThen (happyParse 9# tks) (\x -> happyReturn (happyOut42 x))--pBinding tks = happySomeParser where- happySomeParser = happyThen (happyParse 10# tks) (\x -> happyReturn (happyOut43 x))--pLetDecl tks = happySomeParser where- happySomeParser = happyThen (happyParse 11# tks) (\x -> happyReturn (happyOut44 x))--pType tks = happySomeParser where- happySomeParser = happyThen (happyParse 12# tks) (\x -> happyReturn (happyOut45 x))--pExpr tks = happySomeParser where- happySomeParser = happyThen (happyParse 13# tks) (\x -> happyReturn (happyOut46 x))--pBinder tks = happySomeParser where- happySomeParser = happyThen (happyParse 14# tks) (\x -> happyReturn (happyOut47 x))--pCase tks = happySomeParser where- happySomeParser = happyThen (happyParse 15# tks) (\x -> happyReturn (happyOut48 x))--pPattern tks = happySomeParser where- happySomeParser = happyThen (happyParse 16# tks) (\x -> happyReturn (happyOut49 x))--pHead tks = happySomeParser where- happySomeParser = happyThen (happyParse 17# tks) (\x -> happyReturn (happyOut50 x))--pListLetDecl tks = happySomeParser where- happySomeParser = happyThen (happyParse 18# tks) (\x -> happyReturn (happyOut51 x))--pListCase tks = happySomeParser where- happySomeParser = happyThen (happyParse 19# tks) (\x -> happyReturn (happyOut52 x))--pListExpr tks = happySomeParser where- happySomeParser = happyThen (happyParse 20# tks) (\x -> happyReturn (happyOut53 x))--pListDatatype tks = happySomeParser where- happySomeParser = happyThen (happyParse 21# tks) (\x -> happyReturn (happyOut54 x))--pListConstructor tks = happySomeParser where- happySomeParser = happyThen (happyParse 22# tks) (\x -> happyReturn (happyOut55 x))--pListBinding tks = happySomeParser where- happySomeParser = happyThen (happyParse 23# tks) (\x -> happyReturn (happyOut56 x))--pListSymbol tks = happySomeParser where- happySomeParser = happyThen (happyParse 24# tks) (\x -> happyReturn (happyOut57 x))--pListType tks = happySomeParser where- happySomeParser = happyThen (happyParse 25# tks) (\x -> happyReturn (happyOut58 x))--pListFunDecl tks = happySomeParser where- happySomeParser = happyThen (happyParse 26# tks) (\x -> happyReturn (happyOut59 x))--pListFunDef tks = happySomeParser where- happySomeParser = happyThen (happyParse 27# tks) (\x -> happyReturn (happyOut60 x))--happySeq = happyDontSeq---returnM :: a -> Err a-returnM = return--thenM :: Err a -> (a -> Err b) -> Err b-thenM = (>>=)--happyError :: [Token] -> Err a-happyError ts =- Bad $ "syntax error at " ++ tokenPos ts ++ - case ts of- [] -> []- [Err _] -> " due to lexer error"- _ -> " before " ++ unwords (map (id . prToken) (take 4 ts))--myLexer = tokens-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "<built-in>" #-}-{-# LINE 1 "<command-line>" #-}-{-# LINE 11 "<command-line>" #-}-# 1 "/usr/include/stdc-predef.h" 1 3 4--# 17 "/usr/include/stdc-predef.h" 3 4-------------------------------------------{-# LINE 11 "<command-line>" #-}-{-# LINE 1 "/usr/lib/ghc-7.10.1/include/ghcversion.h" #-}+happyIn34 :: (Integer) -> (HappyAbsSyn )+happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn34 #-}+happyOut34 :: (HappyAbsSyn ) -> (Integer)+happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut34 #-}+happyIn35 :: (Symbol) -> (HappyAbsSyn )+happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn35 #-}+happyOut35 :: (HappyAbsSyn ) -> (Symbol)+happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut35 #-}+happyIn36 :: (Start) -> (HappyAbsSyn )+happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn36 #-}+happyOut36 :: (HappyAbsSyn ) -> (Start)+happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut36 #-}+happyIn37 :: ([Decl]) -> (HappyAbsSyn )+happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn37 #-}+happyOut37 :: (HappyAbsSyn ) -> ([Decl])+happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut37 #-}+happyIn38 :: (Decl) -> (HappyAbsSyn )+happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn38 #-}+happyOut38 :: (HappyAbsSyn ) -> (Decl)+happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut38 #-}+happyIn39 :: (Assertion) -> (HappyAbsSyn )+happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn39 #-}+happyOut39 :: (HappyAbsSyn ) -> (Assertion)+happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut39 #-}+happyIn40 :: (Par) -> (HappyAbsSyn )+happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn40 #-}+happyOut40 :: (HappyAbsSyn ) -> (Par)+happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut40 #-}+happyIn41 :: (ConstDecl) -> (HappyAbsSyn )+happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn41 #-}+happyOut41 :: (HappyAbsSyn ) -> (ConstDecl)+happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut41 #-}+happyIn42 :: (FunDecl) -> (HappyAbsSyn )+happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn42 #-}+happyOut42 :: (HappyAbsSyn ) -> (FunDecl)+happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut42 #-}+happyIn43 :: (FunDef) -> (HappyAbsSyn )+happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn43 #-}+happyOut43 :: (HappyAbsSyn ) -> (FunDef)+happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut43 #-}+happyIn44 :: (FunDec) -> (HappyAbsSyn )+happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn44 #-}+happyOut44 :: (HappyAbsSyn ) -> (FunDec)+happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut44 #-}+happyIn45 :: (InnerFunDec) -> (HappyAbsSyn )+happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn45 #-}+happyOut45 :: (HappyAbsSyn ) -> (InnerFunDec)+happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut45 #-}+happyIn46 :: (Datatype) -> (HappyAbsSyn )+happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn46 #-}+happyOut46 :: (HappyAbsSyn ) -> (Datatype)+happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut46 #-}+happyIn47 :: (Constructor) -> (HappyAbsSyn )+happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn47 #-}+happyOut47 :: (HappyAbsSyn ) -> (Constructor)+happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut47 #-}+happyIn48 :: (Binding) -> (HappyAbsSyn )+happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn48 #-}+happyOut48 :: (HappyAbsSyn ) -> (Binding)+happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut48 #-}+happyIn49 :: (LetDecl) -> (HappyAbsSyn )+happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn49 #-}+happyOut49 :: (HappyAbsSyn ) -> (LetDecl)+happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut49 #-}+happyIn50 :: (Type) -> (HappyAbsSyn )+happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn50 #-}+happyOut50 :: (HappyAbsSyn ) -> (Type)+happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut50 #-}+happyIn51 :: (Expr) -> (HappyAbsSyn )+happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn51 #-}+happyOut51 :: (HappyAbsSyn ) -> (Expr)+happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut51 #-}+happyIn52 :: (Binder) -> (HappyAbsSyn )+happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn52 #-}+happyOut52 :: (HappyAbsSyn ) -> (Binder)+happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut52 #-}+happyIn53 :: (Case) -> (HappyAbsSyn )+happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn53 #-}+happyOut53 :: (HappyAbsSyn ) -> (Case)+happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut53 #-}+happyIn54 :: (Pattern) -> (HappyAbsSyn )+happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn54 #-}+happyOut54 :: (HappyAbsSyn ) -> (Pattern)+happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut54 #-}+happyIn55 :: (Head) -> (HappyAbsSyn )+happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn55 #-}+happyOut55 :: (HappyAbsSyn ) -> (Head)+happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut55 #-}+happyIn56 :: ([LetDecl]) -> (HappyAbsSyn )+happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn56 #-}+happyOut56 :: (HappyAbsSyn ) -> ([LetDecl])+happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut56 #-}+happyIn57 :: ([Case]) -> (HappyAbsSyn )+happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn57 #-}+happyOut57 :: (HappyAbsSyn ) -> ([Case])+happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut57 #-}+happyIn58 :: ([Expr]) -> (HappyAbsSyn )+happyIn58 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn58 #-}+happyOut58 :: (HappyAbsSyn ) -> ([Expr])+happyOut58 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut58 #-}+happyIn59 :: ([Datatype]) -> (HappyAbsSyn )+happyIn59 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn59 #-}+happyOut59 :: (HappyAbsSyn ) -> ([Datatype])+happyOut59 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut59 #-}+happyIn60 :: ([Constructor]) -> (HappyAbsSyn )+happyIn60 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn60 #-}+happyOut60 :: (HappyAbsSyn ) -> ([Constructor])+happyOut60 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut60 #-}+happyIn61 :: ([Binding]) -> (HappyAbsSyn )+happyIn61 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn61 #-}+happyOut61 :: (HappyAbsSyn ) -> ([Binding])+happyOut61 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut61 #-}+happyIn62 :: ([Symbol]) -> (HappyAbsSyn )+happyIn62 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn62 #-}+happyOut62 :: (HappyAbsSyn ) -> ([Symbol])+happyOut62 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut62 #-}+happyIn63 :: ([Type]) -> (HappyAbsSyn )+happyIn63 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn63 #-}+happyOut63 :: (HappyAbsSyn ) -> ([Type])+happyOut63 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut63 #-}+happyIn64 :: ([FunDecl]) -> (HappyAbsSyn )+happyIn64 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn64 #-}+happyOut64 :: (HappyAbsSyn ) -> ([FunDecl])+happyOut64 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut64 #-}+happyIn65 :: ([FunDef]) -> (HappyAbsSyn )+happyIn65 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn65 #-}+happyOut65 :: (HappyAbsSyn ) -> ([FunDef])+happyOut65 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut65 #-}+happyIn66 :: ([FunDec]) -> (HappyAbsSyn )+happyIn66 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn66 #-}+happyOut66 :: (HappyAbsSyn ) -> ([FunDec])+happyOut66 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut66 #-}+happyInTok :: (Token) -> (HappyAbsSyn )+happyInTok x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyInTok #-}+happyOutTok :: (HappyAbsSyn ) -> (Token)+happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOutTok #-}+++happyActOffsets :: HappyAddr+happyActOffsets = HappyA# "\xc1\x01\xc1\x01\x16\x01\x40\x01\xc0\x01\xbe\x01\xbe\x01\xbe\x01\xbf\x01\xbd\x01\xbc\x01\xbb\x01\xba\x01\xb9\x01\x54\x00\x49\x00\x14\x01\xb8\x01\x0e\x00\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x01\x00\x00\x0a\x00\x23\x01\x23\x01\x03\x00\x23\x01\x09\x00\x08\x00\x07\x00\x01\x00\x06\x00\x04\x00\x00\x00\xb7\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb7\x01\xb6\x01\x00\x00\xb4\x01\xb3\x01\xb2\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x01\xaa\x00\xaf\x01\x00\x00\x00\x00\x00\x00\xb1\x01\xf8\xff\x00\x00\x00\x00\xb1\x01\xb0\x01\xae\x01\xad\x01\xa8\x01\xac\x01\xa7\x01\xa4\x01\x9d\x01\x93\x01\x86\x01\x00\x00\x6b\x00\xab\x01\x85\x01\xaa\x01\x84\x01\x54\x00\x84\x01\x84\x01\xa9\x01\x83\x01\x00\x00\x00\x00\x83\x01\x21\x00\x3e\x00\xa6\x01\x1d\x00\x82\x01\x14\x00\x0d\x00\xa5\x01\x80\x01\x0a\x01\x80\x01\x00\x00\xa3\x01\xa2\x01\x00\x00\x00\x00\x7f\x01\x00\x00\x7f\x01\x7e\x01\x00\x00\x7a\x01\x00\x00\x00\x00\x7a\x01\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\x01\xa0\x01\x00\x00\x00\x00\x54\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x9f\x01\x00\x00\x1b\x00\x9e\x01\x1b\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x00\x1b\x00\x00\x00\x00\x00\x54\x00\x18\x00\x00\x00\x52\x00\x50\x00\x9c\x01\x9b\x01\x4b\x01\x49\x01\x9a\x01\x00\x00\x47\x01\x4e\x00\x55\x00\x1b\x00\x99\x01\x46\x00\x98\x01\x00\x00\x97\x01\x96\x01\x45\x01\x00\x00\x95\x01\x00\x00\x94\x01\x48\x01\x48\x01\x48\x01\x7c\x01\x46\x01\x92\x01\x00\x00\x54\x00\x54\x00\x43\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x01\x00\x00\x91\x01\x3f\x01\x3d\x01\x90\x01\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x1b\x00\x54\x00\x1b\x00\x00\x00\x00\x00\x8f\x01\x00\x00\x8e\x01\x8d\x01\x8c\x01\x00\x00\x12\x00\x8b\x01\x8a\x01\x89\x01\xe9\x00\x88\x01\x00\x00\x87\x01\x79\x01\x76\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++happyGotoOffsets :: HappyAddr+happyGotoOffsets = HappyA# "\x3a\x01\x74\x01\x36\x01\x75\x01\x73\x01\x13\x01\x22\x01\xb7\x00\x2e\x01\x7d\x01\x7b\x01\x71\x01\x72\x01\x6d\x01\x09\x01\x07\x01\x6f\x01\x6c\x01\x11\x00\x15\x00\x70\x01\x6e\x01\x6a\x01\x6b\x01\x55\x01\x68\x01\x5a\x01\x54\x01\x52\x01\x4c\x01\x4e\x01\x00\x00\x00\x00\xb3\x00\x92\x00\x0d\x01\xfd\x00\x69\x01\x65\x01\x5c\x01\x61\x01\x05\x01\x59\x01\x58\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x00\x66\x01\x00\x00\x00\x00\x00\x00\x00\x00\x64\x01\x00\x00\x00\x00\x00\x00\x63\x01\x00\x00\x62\x01\x00\x00\x60\x01\x00\x00\x5f\x01\x00\x00\x5e\x01\x00\x00\x00\x00\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x10\x01\x00\x00\x0b\x01\x5d\x01\x8d\x00\x70\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x01\x00\x00\x57\x01\x00\x00\x56\x01\x5b\x01\x00\x00\x53\x01\x3e\x01\x00\x00\x51\x01\x00\x00\x66\x00\x3c\x01\x00\x00\x37\x01\x3b\x01\x00\x00\x4a\x01\x39\x01\x33\x01\xba\x00\xf3\x00\x19\x01\x12\x01\x00\x00\x00\x00\x11\x01\xee\x00\x00\x00\xec\x00\x0b\x00\x18\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x01\xe8\x00\xf8\x00\xed\x00\xb6\x00\xe6\x00\xf0\x00\x90\x00\x90\x00\x00\x00\x00\x00\xea\x00\xd5\x00\x00\x00\xb9\x00\x9d\x00\x90\x00\xbe\x00\xe4\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x7a\x00\x00\x00\x00\x00\x6e\x00\x1a\x00\x08\x01\x00\x00\x91\x00\x00\x00\x00\x00\x8c\x00\x6f\x00\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x5e\x00\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x00\x00\x00\xc2\x00\x58\x00\x99\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xf5\xff\x65\x00\x00\x00\x00\x00\x00\x00\xf7\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"#++happyDefActions :: HappyAddr+happyDefActions = HappyA# "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\xff\x97\xff\x95\xff\x93\xff\x91\xff\x8f\xff\x8d\xff\x8b\xff\x89\xff\x87\xff\x85\xff\x00\x00\xe0\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\xff\x00\x00\xa0\xff\xa2\xff\xa1\xff\x9b\xff\x9a\xff\xa4\xff\xa5\xff\x9d\xff\x9c\xff\xaa\xff\xa8\xff\xa3\xff\x9f\xff\xa9\xff\x9e\xff\xa6\xff\xa7\xff\xdf\xff\xac\xff\x00\x00\x00\x00\xae\xff\x00\x00\x00\x00\x00\x00\xb0\xff\xb1\xff\xb2\xff\xb6\xff\xbc\xff\x00\x00\x00\x00\x00\x00\xb3\xff\xb4\xff\xc1\xff\x00\x00\x00\x00\xbd\xff\xbe\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\xff\xcd\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\xde\xff\x00\x00\x00\x00\x85\xff\xd3\xff\x00\x00\xd5\xff\x00\x00\x00\x00\xd7\xff\x00\x00\x8d\xff\xd9\xff\x00\x00\xd0\xff\x00\x00\x8d\xff\xcb\xff\x8b\xff\x8f\xff\x00\x00\x00\x00\x91\xff\x8f\xff\x00\x00\x00\x00\x8b\xff\x8b\xff\xb5\xff\x00\x00\x95\xff\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xff\x98\xff\x96\xff\x94\xff\x92\xff\x90\xff\x8e\xff\x8c\xff\x8a\xff\x88\xff\x86\xff\x84\xff\x00\x00\x00\x00\x97\xff\x99\xff\x00\x00\x00\x00\x8f\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xda\xff\x00\x00\x00\x00\x00\x00\xdd\xff\x00\x00\xdc\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xff\x00\x00\x00\x00\x00\x00\xc8\xff\xc5\xff\xc4\xff\xc3\xff\xc2\xff\xc0\xff\xbf\xff\x00\x00\xba\xff\x00\x00\x00\x00\x00\x00\x00\x00\xad\xff\xaf\xff\xb9\xff\x00\x00\xbb\xff\x00\x00\x00\x00\x00\x00\xca\xff\xcf\xff\x00\x00\x93\xff\x00\x00\x00\x00\x00\x00\x95\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\xff\x00\x00\x00\x00\x00\x00\xb8\xff\xb7\xff\xc6\xff\xd8\xff\xdb\xff\xd6\xff\xd4\xff\xd2\xff\xd1\xff"#++happyCheck :: HappyAddr+happyCheck = HappyA# "\xff\xff\x09\x00\x01\x00\x0c\x00\x01\x00\x01\x00\x05\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x18\x00\x01\x00\x01\x00\x0d\x00\x0e\x00\x01\x00\x01\x00\x02\x00\x01\x00\x01\x00\x05\x00\x19\x00\x01\x00\x02\x00\x01\x00\x01\x00\x05\x00\x01\x00\x14\x00\x05\x00\x20\x00\x01\x00\x09\x00\x2c\x00\x14\x00\x05\x00\x19\x00\x0a\x00\x0b\x00\x15\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2c\x00\x2d\x00\x2d\x00\x20\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x20\x00\x2c\x00\x2c\x00\x20\x00\x2a\x00\x2b\x00\x2c\x00\x01\x00\x2c\x00\x20\x00\x2a\x00\x2b\x00\x2c\x00\x2a\x00\x2b\x00\x2c\x00\x02\x00\x2c\x00\x01\x00\x2a\x00\x2b\x00\x2c\x00\x05\x00\x01\x00\x02\x00\x01\x00\x02\x00\x01\x00\x02\x00\x01\x00\x13\x00\x02\x00\x02\x00\x01\x00\x01\x00\x0d\x00\x0e\x00\x0d\x00\x0e\x00\x0d\x00\x0e\x00\x0d\x00\x0e\x00\x04\x00\x05\x00\x00\x00\x01\x00\x01\x00\x10\x00\x20\x00\x2c\x00\x12\x00\x06\x00\x0f\x00\x15\x00\x01\x00\x01\x00\x01\x00\x2c\x00\x2a\x00\x2b\x00\x2c\x00\x11\x00\x09\x00\x12\x00\x09\x00\x2c\x00\x15\x00\x2c\x00\x03\x00\x2c\x00\x10\x00\x2c\x00\x2c\x00\x2c\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x01\x00\x01\x00\x0f\x00\x10\x00\x01\x00\x01\x00\x01\x00\x29\x00\x0e\x00\x09\x00\x2c\x00\x07\x00\x00\x00\x01\x00\x09\x00\x10\x00\x1d\x00\x1e\x00\x1f\x00\x10\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x11\x00\x0e\x00\x2c\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x01\x00\x01\x00\x0f\x00\x10\x00\x01\x00\x01\x00\x0a\x00\x0b\x00\x01\x00\x09\x00\x06\x00\x00\x00\x01\x00\x00\x00\x01\x00\x10\x00\x1d\x00\x1e\x00\x1f\x00\x10\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x11\x00\x1b\x00\x11\x00\x2c\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x01\x00\x0d\x00\x0f\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x01\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\x00\x10\x00\x1d\x00\x1e\x00\x00\x00\x01\x00\x11\x00\x22\x00\x11\x00\x0e\x00\x11\x00\x26\x00\x27\x00\x28\x00\x11\x00\x01\x00\x11\x00\x2c\x00\x00\x00\x01\x00\x16\x00\x11\x00\x00\x00\x01\x00\x00\x00\x01\x00\x01\x00\x01\x00\x1b\x00\x01\x00\x10\x00\x01\x00\x17\x00\x08\x00\x01\x00\x11\x00\x08\x00\x01\x00\x08\x00\x11\x00\x07\x00\x11\x00\x10\x00\x07\x00\x11\x00\x12\x00\x01\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x01\x00\x1a\x00\x1b\x00\x1c\x00\x11\x00\x12\x00\x18\x00\x08\x00\x15\x00\x16\x00\x17\x00\x18\x00\x1d\x00\x1a\x00\x1b\x00\x1c\x00\x1f\x00\x1c\x00\x21\x00\x1d\x00\x23\x00\x0a\x00\x0b\x00\x04\x00\x05\x00\x02\x00\x03\x00\x01\x00\x02\x00\x01\x00\x02\x00\x01\x00\x02\x00\x01\x00\x02\x00\x01\x00\x02\x00\x01\x00\x02\x00\x01\x00\x02\x00\x01\x00\x02\x00\x1b\x00\x2c\x00\x2d\x00\x11\x00\x12\x00\x1a\x00\x1d\x00\x0b\x00\x1b\x00\x06\x00\x1c\x00\x06\x00\x1c\x00\x00\x00\x06\x00\x06\x00\x01\x00\x01\x00\x01\x00\x01\x00\x20\x00\x01\x00\x01\x00\x01\x00\x00\x00\x0f\x00\x01\x00\x0d\x00\x01\x00\x1f\x00\x13\x00\x0c\x00\x20\x00\x1a\x00\x1e\x00\x1d\x00\x2c\x00\x0e\x00\x2c\x00\xff\xff\x1c\x00\x03\x00\x02\x00\x06\x00\x05\x00\x02\x00\x0f\x00\x01\x00\x0d\x00\x13\x00\x0e\x00\x12\x00\x18\x00\x1b\x00\x19\x00\x17\x00\x16\x00\x0c\x00\x0b\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\xff\xff\x02\x00\x02\x00\x02\x00\x01\x00\x01\x00\x01\x00\x01\x00\x29\x00\x02\x00\x02\x00\x01\x00\x01\x00\x29\x00\x2b\x00\x01\x00\x01\x00\x01\x00\x2d\x00\x2c\x00\xff\xff\x2d\x00\x2d\x00\x2d\x00\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x2c\x00\x01\x00\xff\xff\x01\x00\xff\xff\xff\xff\xff\xff\x13\x00\xff\xff\xff\xff\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2c\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2d\x00\xff\xff\xff\xff\x2c\x00\x2c\x00\x2b\x00\x2d\x00\x2c\x00\xff\xff\x2d\x00\x2d\x00\x2b\x00\x2d\x00\x2c\x00\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x2c\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"#++happyTable :: HappyAddr+happyTable = HappyA# "\x00\x00\x96\x00\x4e\x00\xa1\x00\x54\x00\x58\x00\x4f\x00\x46\x00\x5e\x00\x5c\x00\x5a\x00\x63\x00\x40\x00\xee\x00\x80\x00\x43\x00\x55\x00\x56\x00\x40\x00\x4e\x00\x01\x01\x82\x00\x2c\x00\x4f\x00\xf2\x00\x4e\x00\xda\x00\x63\x00\x4e\x00\x4f\x00\x85\x00\xaa\x00\x4f\x00\x50\x00\x8a\x00\xeb\x00\x40\x00\x41\x00\x4f\x00\x44\x00\xa8\x00\x61\x00\x2d\x00\x51\x00\x21\x00\x40\x00\xff\xff\x40\x00\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\x40\x00\x40\x00\x50\x00\x51\x00\x21\x00\x40\x00\x88\x00\x40\x00\x50\x00\x51\x00\x21\x00\x40\x00\x51\x00\x21\x00\x40\x00\xcb\x00\x40\x00\x4e\x00\x51\x00\x21\x00\x40\x00\x4f\x00\x54\x00\xcf\x00\x54\x00\xd7\x00\x54\x00\xd8\x00\x54\x00\x9f\x00\xce\x00\xdf\x00\x51\x00\x2c\x00\x55\x00\x56\x00\x55\x00\x56\x00\x55\x00\x56\x00\x55\x00\x56\x00\x7b\x00\x6f\x00\x4a\x00\x4b\x00\x2c\x00\xf5\x00\x50\x00\x40\x00\x97\x00\xbb\x00\x9e\x00\x98\x00\x63\x00\x51\x00\x63\x00\x40\x00\x51\x00\x21\x00\x40\x00\xa0\x00\xec\x00\x97\x00\x7e\x00\x40\x00\x98\x00\x40\x00\xc5\x00\x40\x00\xe5\x00\x40\x00\x40\x00\x40\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x51\x00\x63\x00\x39\x00\x9a\x00\x51\x00\x67\x00\x63\x00\x6b\x00\xa3\x00\x80\x00\x40\x00\xe8\x00\x4a\x00\x4b\x00\xa7\x00\xe6\x00\x3a\x00\x3b\x00\x48\x00\xa5\x00\x49\x00\x3c\x00\x4a\x00\x9b\x00\x9c\x00\x3d\x00\x3e\x00\x3f\x00\x6b\x00\xf4\x00\xa3\x00\x40\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x51\x00\x63\x00\x39\x00\x9a\x00\x51\x00\x8e\x00\xa8\x00\x61\x00\xa4\x00\x64\x00\x8f\x00\x4a\x00\x4b\x00\x4a\x00\x4b\x00\xda\x00\x3a\x00\x3b\x00\x48\x00\xb3\x00\x49\x00\x3c\x00\x4a\x00\x9b\x00\x9c\x00\x3d\x00\x3e\x00\x3f\x00\xf6\x00\xd0\x00\xf7\x00\x40\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x51\x00\xa2\x00\x39\x00\x4a\x00\x4b\x00\x4a\x00\x4b\x00\x4a\x00\x4b\x00\x5e\x00\xfd\x00\x4a\x00\x4b\x00\x4a\x00\x4b\x00\x8b\x00\x3a\x00\x3b\x00\x4a\x00\x4b\x00\xcc\x00\x3c\x00\xa0\x00\xa3\x00\xdd\x00\x3d\x00\x3e\x00\x3f\x00\xab\x00\x51\x00\xad\x00\x40\x00\x4a\x00\x4b\x00\xdb\x00\xb2\x00\x4a\x00\x4b\x00\x4a\x00\x4b\x00\x65\x00\x51\x00\xd8\x00\x65\x00\xa5\x00\x65\x00\xdc\x00\xea\x00\x67\x00\x88\x00\x83\x00\x67\x00\xa6\x00\xa0\x00\x86\x00\x4c\x00\x52\x00\x68\x00\x6d\x00\x6e\x00\xa4\x00\x7d\x00\x71\x00\x72\x00\x73\x00\x74\x00\x65\x00\x75\x00\x76\x00\x77\x00\x6d\x00\x6e\x00\xae\x00\x66\x00\x71\x00\x72\x00\x73\x00\x74\x00\xb0\x00\x75\x00\x76\x00\x77\x00\x48\x00\xa9\x00\x49\x00\xb1\x00\x4a\x00\x60\x00\x61\x00\x6e\x00\x6f\x00\x79\x00\x7a\x00\x46\x00\xe1\x00\x58\x00\xe2\x00\x5a\x00\xe4\x00\x5a\x00\xe5\x00\x63\x00\xc7\x00\x5a\x00\xd0\x00\x5c\x00\xd3\x00\x5a\x00\xd4\x00\xb4\x00\x40\x00\xff\xff\x6d\x00\x6e\x00\xb5\x00\xb9\x00\xb6\x00\xb8\x00\xbc\x00\xba\x00\xbe\x00\xbd\x00\xbf\x00\xc0\x00\xc1\x00\x82\x00\x8e\x00\x90\x00\x91\x00\xc2\x00\x92\x00\x93\x00\x94\x00\x96\x00\x9e\x00\x9d\x00\xa2\x00\xa4\x00\x22\x00\x9f\x00\xa1\x00\x21\x00\x27\x00\x23\x00\x24\x00\x40\x00\xa3\x00\x40\x00\x00\x00\x25\x00\x77\x00\xf9\x00\x69\x00\x6b\x00\xfa\x00\x56\x00\xea\x00\x5a\x00\x44\x00\x58\x00\x46\x00\x29\x00\x26\x00\x28\x00\x2a\x00\x2b\x00\x5c\x00\x5e\x00\xfb\x00\xfc\x00\xfe\x00\xff\x00\x00\x01\xf0\x00\xf1\x00\xf2\x00\xf4\x00\xe0\x00\xe3\x00\xe8\x00\xee\x00\x79\x00\xc8\x00\xc9\x00\xca\x00\xcc\x00\x00\x00\xd2\x00\xd5\x00\xd6\x00\xad\x00\xb0\x00\x60\x00\xb8\x00\x6b\x00\xc4\x00\xc5\x00\x7e\x00\x86\x00\x6b\x00\x21\x00\x8b\x00\x8d\x00\x8e\x00\xff\xff\x40\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x00\x58\x00\x5a\x00\x5c\x00\x5e\x00\x60\x00\x40\x00\x63\x00\x00\x00\x79\x00\x00\x00\x00\x00\x00\x00\x9d\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x40\x00\x40\x00\x21\x00\xff\xff\x40\x00\x00\x00\xff\xff\xff\xff\x21\x00\xff\xff\x40\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++happyReduceArr = Happy_Data_Array.array (31, 123) [+ (31 , happyReduce_31),+ (32 , happyReduce_32),+ (33 , happyReduce_33),+ (34 , happyReduce_34),+ (35 , happyReduce_35),+ (36 , happyReduce_36),+ (37 , happyReduce_37),+ (38 , happyReduce_38),+ (39 , happyReduce_39),+ (40 , happyReduce_40),+ (41 , happyReduce_41),+ (42 , happyReduce_42),+ (43 , happyReduce_43),+ (44 , happyReduce_44),+ (45 , happyReduce_45),+ (46 , happyReduce_46),+ (47 , happyReduce_47),+ (48 , happyReduce_48),+ (49 , happyReduce_49),+ (50 , happyReduce_50),+ (51 , happyReduce_51),+ (52 , happyReduce_52),+ (53 , happyReduce_53),+ (54 , happyReduce_54),+ (55 , happyReduce_55),+ (56 , happyReduce_56),+ (57 , happyReduce_57),+ (58 , happyReduce_58),+ (59 , happyReduce_59),+ (60 , happyReduce_60),+ (61 , happyReduce_61),+ (62 , happyReduce_62),+ (63 , happyReduce_63),+ (64 , happyReduce_64),+ (65 , happyReduce_65),+ (66 , happyReduce_66),+ (67 , happyReduce_67),+ (68 , happyReduce_68),+ (69 , happyReduce_69),+ (70 , happyReduce_70),+ (71 , happyReduce_71),+ (72 , happyReduce_72),+ (73 , happyReduce_73),+ (74 , happyReduce_74),+ (75 , happyReduce_75),+ (76 , happyReduce_76),+ (77 , happyReduce_77),+ (78 , happyReduce_78),+ (79 , happyReduce_79),+ (80 , happyReduce_80),+ (81 , happyReduce_81),+ (82 , happyReduce_82),+ (83 , happyReduce_83),+ (84 , happyReduce_84),+ (85 , happyReduce_85),+ (86 , happyReduce_86),+ (87 , happyReduce_87),+ (88 , happyReduce_88),+ (89 , happyReduce_89),+ (90 , happyReduce_90),+ (91 , happyReduce_91),+ (92 , happyReduce_92),+ (93 , happyReduce_93),+ (94 , happyReduce_94),+ (95 , happyReduce_95),+ (96 , happyReduce_96),+ (97 , happyReduce_97),+ (98 , happyReduce_98),+ (99 , happyReduce_99),+ (100 , happyReduce_100),+ (101 , happyReduce_101),+ (102 , happyReduce_102),+ (103 , happyReduce_103),+ (104 , happyReduce_104),+ (105 , happyReduce_105),+ (106 , happyReduce_106),+ (107 , happyReduce_107),+ (108 , happyReduce_108),+ (109 , happyReduce_109),+ (110 , happyReduce_110),+ (111 , happyReduce_111),+ (112 , happyReduce_112),+ (113 , happyReduce_113),+ (114 , happyReduce_114),+ (115 , happyReduce_115),+ (116 , happyReduce_116),+ (117 , happyReduce_117),+ (118 , happyReduce_118),+ (119 , happyReduce_119),+ (120 , happyReduce_120),+ (121 , happyReduce_121),+ (122 , happyReduce_122),+ (123 , happyReduce_123)+ ]++happy_n_terms = 46 :: Int+happy_n_nonterms = 33 :: Int++happyReduce_31 = happySpecReduce_1 0# happyReduction_31+happyReduction_31 happy_x_1+ = case happyOutTok happy_x_1 of { (PT _ (TI happy_var_1)) -> + happyIn34+ ((read ( happy_var_1)) :: Integer+ )}++happyReduce_32 = happySpecReduce_1 1# happyReduction_32+happyReduction_32 happy_x_1+ = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn35+ (Symbol (mkPosToken happy_var_1)+ )}++happyReduce_33 = happySpecReduce_1 2# happyReduction_33+happyReduction_33 happy_x_1+ = case happyOut37 happy_x_1 of { happy_var_1 -> + happyIn36+ (Start happy_var_1+ )}++happyReduce_34 = happySpecReduce_3 3# happyReduction_34+happyReduction_34 happy_x_3+ happy_x_2+ happy_x_1+ = happyIn37+ ([]+ )++happyReduce_35 = happyReduce 4# 3# happyReduction_35+happyReduction_35 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut38 happy_x_2 of { happy_var_2 -> + case happyOut37 happy_x_4 of { happy_var_4 -> + happyIn37+ ((:) happy_var_2 happy_var_4+ ) `HappyStk` happyRest}}++happyReduce_36 = happyReduce 7# 4# happyReduction_36+happyReduction_36 (happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut62 happy_x_3 of { happy_var_3 -> + case happyOut59 happy_x_6 of { happy_var_6 -> + happyIn38+ (DeclareDatatypes (reverse happy_var_3) (reverse happy_var_6)+ ) `HappyStk` happyRest}}++happyReduce_37 = happySpecReduce_3 4# happyReduction_37+happyReduction_37 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut35 happy_x_2 of { happy_var_2 -> + case happyOut34 happy_x_3 of { happy_var_3 -> + happyIn38+ (DeclareSort happy_var_2 happy_var_3+ )}}++happyReduce_38 = happySpecReduce_2 4# happyReduction_38+happyReduction_38 happy_x_2+ happy_x_1+ = case happyOut41 happy_x_2 of { happy_var_2 -> + happyIn38+ (DeclareConst happy_var_2+ )}++happyReduce_39 = happyReduce 7# 4# happyReduction_39+happyReduction_39 (happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut40 happy_x_3 of { happy_var_3 -> + case happyOut41 happy_x_5 of { happy_var_5 -> + happyIn38+ (DeclareConstPar happy_var_3 happy_var_5+ ) `HappyStk` happyRest}}++happyReduce_40 = happySpecReduce_2 4# happyReduction_40+happyReduction_40 happy_x_2+ happy_x_1+ = case happyOut42 happy_x_2 of { happy_var_2 -> + happyIn38+ (DeclareFun happy_var_2+ )}++happyReduce_41 = happyReduce 7# 4# happyReduction_41+happyReduction_41 (happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut40 happy_x_3 of { happy_var_3 -> + case happyOut42 happy_x_5 of { happy_var_5 -> + happyIn38+ (DeclareFunPar happy_var_3 happy_var_5+ ) `HappyStk` happyRest}}++happyReduce_42 = happySpecReduce_2 4# happyReduction_42+happyReduction_42 happy_x_2+ happy_x_1+ = case happyOut43 happy_x_2 of { happy_var_2 -> + happyIn38+ (DefineFun happy_var_2+ )}++happyReduce_43 = happyReduce 7# 4# happyReduction_43+happyReduction_43 (happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut40 happy_x_3 of { happy_var_3 -> + case happyOut43 happy_x_5 of { happy_var_5 -> + happyIn38+ (DefineFunPar happy_var_3 happy_var_5+ ) `HappyStk` happyRest}}++happyReduce_44 = happySpecReduce_2 4# happyReduction_44+happyReduction_44 happy_x_2+ happy_x_1+ = case happyOut43 happy_x_2 of { happy_var_2 -> + happyIn38+ (DefineFunRec happy_var_2+ )}++happyReduce_45 = happyReduce 7# 4# happyReduction_45+happyReduction_45 (happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut40 happy_x_3 of { happy_var_3 -> + case happyOut43 happy_x_5 of { happy_var_5 -> + happyIn38+ (DefineFunRecPar happy_var_3 happy_var_5+ ) `HappyStk` happyRest}}++happyReduce_46 = happyReduce 7# 4# happyReduction_46+happyReduction_46 (happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut66 happy_x_3 of { happy_var_3 -> + case happyOut58 happy_x_6 of { happy_var_6 -> + happyIn38+ (DefineFunsRec (reverse happy_var_3) (reverse happy_var_6)+ ) `HappyStk` happyRest}}++happyReduce_47 = happySpecReduce_2 4# happyReduction_47+happyReduction_47 happy_x_2+ happy_x_1+ = case happyOut39 happy_x_1 of { happy_var_1 -> + case happyOut51 happy_x_2 of { happy_var_2 -> + happyIn38+ (Assert happy_var_1 happy_var_2+ )}}++happyReduce_48 = happyReduce 5# 4# happyReduction_48+happyReduction_48 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut39 happy_x_1 of { happy_var_1 -> + case happyOut40 happy_x_3 of { happy_var_3 -> + case happyOut51 happy_x_4 of { happy_var_4 -> + happyIn38+ (AssertPar happy_var_1 happy_var_3 happy_var_4+ ) `HappyStk` happyRest}}}++happyReduce_49 = happySpecReduce_1 5# happyReduction_49+happyReduction_49 happy_x_1+ = happyIn39+ (AssertIt+ )++happyReduce_50 = happySpecReduce_1 5# happyReduction_50+happyReduction_50 happy_x_1+ = happyIn39+ (AssertNot+ )++happyReduce_51 = happyReduce 4# 6# happyReduction_51+happyReduction_51 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut62 happy_x_3 of { happy_var_3 -> + happyIn40+ (Par (reverse happy_var_3)+ ) `HappyStk` happyRest}++happyReduce_52 = happySpecReduce_2 7# happyReduction_52+happyReduction_52 happy_x_2+ happy_x_1+ = case happyOut35 happy_x_1 of { happy_var_1 -> + case happyOut50 happy_x_2 of { happy_var_2 -> + happyIn41+ (ConstDecl happy_var_1 happy_var_2+ )}}++happyReduce_53 = happyReduce 5# 8# happyReduction_53+happyReduction_53 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut35 happy_x_1 of { happy_var_1 -> + case happyOut63 happy_x_3 of { happy_var_3 -> + case happyOut50 happy_x_5 of { happy_var_5 -> + happyIn42+ (FunDecl happy_var_1 (reverse happy_var_3) happy_var_5+ ) `HappyStk` happyRest}}}++happyReduce_54 = happyReduce 6# 9# happyReduction_54+happyReduction_54 (happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut35 happy_x_1 of { happy_var_1 -> + case happyOut61 happy_x_3 of { happy_var_3 -> + case happyOut50 happy_x_5 of { happy_var_5 -> + case happyOut51 happy_x_6 of { happy_var_6 -> + happyIn43+ (FunDef happy_var_1 (reverse happy_var_3) happy_var_5 happy_var_6+ ) `HappyStk` happyRest}}}}++happyReduce_55 = happyReduce 4# 10# happyReduction_55+happyReduction_55 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut40 happy_x_2 of { happy_var_2 -> + case happyOut45 happy_x_3 of { happy_var_3 -> + happyIn44+ (ParFunDec happy_var_2 happy_var_3+ ) `HappyStk` happyRest}}++happyReduce_56 = happySpecReduce_1 10# happyReduction_56+happyReduction_56 happy_x_1+ = case happyOut45 happy_x_1 of { happy_var_1 -> + happyIn44+ (MonoFunDec happy_var_1+ )}++happyReduce_57 = happyReduce 7# 11# happyReduction_57+happyReduction_57 (happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut35 happy_x_2 of { happy_var_2 -> + case happyOut61 happy_x_4 of { happy_var_4 -> + case happyOut50 happy_x_6 of { happy_var_6 -> + happyIn45+ (InnerFunDec happy_var_2 (reverse happy_var_4) happy_var_6+ ) `HappyStk` happyRest}}}++happyReduce_58 = happyReduce 4# 12# happyReduction_58+happyReduction_58 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut35 happy_x_2 of { happy_var_2 -> + case happyOut60 happy_x_3 of { happy_var_3 -> + happyIn46+ (Datatype happy_var_2 (reverse happy_var_3)+ ) `HappyStk` happyRest}}++happyReduce_59 = happyReduce 4# 13# happyReduction_59+happyReduction_59 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut35 happy_x_2 of { happy_var_2 -> + case happyOut61 happy_x_3 of { happy_var_3 -> + happyIn47+ (Constructor happy_var_2 (reverse happy_var_3)+ ) `HappyStk` happyRest}}++happyReduce_60 = happyReduce 4# 14# happyReduction_60+happyReduction_60 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut35 happy_x_2 of { happy_var_2 -> + case happyOut50 happy_x_3 of { happy_var_3 -> + happyIn48+ (Binding happy_var_2 happy_var_3+ ) `HappyStk` happyRest}}++happyReduce_61 = happyReduce 4# 15# happyReduction_61+happyReduction_61 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut35 happy_x_2 of { happy_var_2 -> + case happyOut51 happy_x_3 of { happy_var_3 -> + happyIn49+ (LetDecl happy_var_2 happy_var_3+ ) `HappyStk` happyRest}}++happyReduce_62 = happySpecReduce_1 16# happyReduction_62+happyReduction_62 happy_x_1+ = case happyOut35 happy_x_1 of { happy_var_1 -> + happyIn50+ (TyVar happy_var_1+ )}++happyReduce_63 = happyReduce 4# 16# happyReduction_63+happyReduction_63 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut35 happy_x_2 of { happy_var_2 -> + case happyOut63 happy_x_3 of { happy_var_3 -> + happyIn50+ (TyApp happy_var_2 (reverse happy_var_3)+ ) `HappyStk` happyRest}}++happyReduce_64 = happyReduce 4# 16# happyReduction_64+happyReduction_64 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut63 happy_x_3 of { happy_var_3 -> + happyIn50+ (ArrowTy (reverse happy_var_3)+ ) `HappyStk` happyRest}++happyReduce_65 = happySpecReduce_1 16# happyReduction_65+happyReduction_65 happy_x_1+ = happyIn50+ (IntTy+ )++happyReduce_66 = happySpecReduce_1 16# happyReduction_66+happyReduction_66 happy_x_1+ = happyIn50+ (BoolTy+ )++happyReduce_67 = happySpecReduce_1 17# happyReduction_67+happyReduction_67 happy_x_1+ = case happyOut35 happy_x_1 of { happy_var_1 -> + happyIn51+ (Var happy_var_1+ )}++happyReduce_68 = happyReduce 5# 17# happyReduction_68+happyReduction_68 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut51 happy_x_3 of { happy_var_3 -> + case happyOut50 happy_x_4 of { happy_var_4 -> + happyIn51+ (As happy_var_3 happy_var_4+ ) `HappyStk` happyRest}}++happyReduce_69 = happyReduce 4# 17# happyReduction_69+happyReduction_69 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut55 happy_x_2 of { happy_var_2 -> + case happyOut58 happy_x_3 of { happy_var_3 -> + happyIn51+ (App happy_var_2 (reverse happy_var_3)+ ) `HappyStk` happyRest}}++happyReduce_70 = happyReduce 5# 17# happyReduction_70+happyReduction_70 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut51 happy_x_3 of { happy_var_3 -> + case happyOut57 happy_x_4 of { happy_var_4 -> + happyIn51+ (Match happy_var_3 (reverse happy_var_4)+ ) `HappyStk` happyRest}}++happyReduce_71 = happyReduce 7# 17# happyReduction_71+happyReduction_71 (happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut56 happy_x_4 of { happy_var_4 -> + case happyOut51 happy_x_6 of { happy_var_6 -> + happyIn51+ (Let (reverse happy_var_4) happy_var_6+ ) `HappyStk` happyRest}}++happyReduce_72 = happyReduce 7# 17# happyReduction_72+happyReduction_72 (happy_x_7 `HappyStk`+ happy_x_6 `HappyStk`+ happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut52 happy_x_2 of { happy_var_2 -> + case happyOut61 happy_x_4 of { happy_var_4 -> + case happyOut51 happy_x_6 of { happy_var_6 -> + happyIn51+ (Binder happy_var_2 (reverse happy_var_4) happy_var_6+ ) `HappyStk` happyRest}}}++happyReduce_73 = happySpecReduce_1 17# happyReduction_73+happyReduction_73 happy_x_1+ = case happyOut34 happy_x_1 of { happy_var_1 -> + happyIn51+ (LitInt happy_var_1+ )}++happyReduce_74 = happySpecReduce_2 17# happyReduction_74+happyReduction_74 happy_x_2+ happy_x_1+ = case happyOut34 happy_x_2 of { happy_var_2 -> + happyIn51+ (LitNegInt happy_var_2+ )}++happyReduce_75 = happySpecReduce_1 17# happyReduction_75+happyReduction_75 happy_x_1+ = happyIn51+ (LitTrue+ )++happyReduce_76 = happySpecReduce_1 17# happyReduction_76+happyReduction_76 happy_x_1+ = happyIn51+ (LitFalse+ )++happyReduce_77 = happySpecReduce_1 18# happyReduction_77+happyReduction_77 happy_x_1+ = happyIn52+ (Lambda+ )++happyReduce_78 = happySpecReduce_1 18# happyReduction_78+happyReduction_78 happy_x_1+ = happyIn52+ (Forall+ )++happyReduce_79 = happySpecReduce_1 18# happyReduction_79+happyReduction_79 happy_x_1+ = happyIn52+ (Exists+ )++happyReduce_80 = happyReduce 5# 19# happyReduction_80+happyReduction_80 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut54 happy_x_3 of { happy_var_3 -> + case happyOut51 happy_x_4 of { happy_var_4 -> + happyIn53+ (Case happy_var_3 happy_var_4+ ) `HappyStk` happyRest}}++happyReduce_81 = happySpecReduce_1 20# happyReduction_81+happyReduction_81 happy_x_1+ = happyIn54+ (Default+ )++happyReduce_82 = happyReduce 4# 20# happyReduction_82+happyReduction_82 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut35 happy_x_2 of { happy_var_2 -> + case happyOut62 happy_x_3 of { happy_var_3 -> + happyIn54+ (ConPat happy_var_2 (reverse happy_var_3)+ ) `HappyStk` happyRest}}++happyReduce_83 = happySpecReduce_1 20# happyReduction_83+happyReduction_83 happy_x_1+ = case happyOut35 happy_x_1 of { happy_var_1 -> + happyIn54+ (SimplePat happy_var_1+ )}++happyReduce_84 = happySpecReduce_1 21# happyReduction_84+happyReduction_84 happy_x_1+ = case happyOut35 happy_x_1 of { happy_var_1 -> + happyIn55+ (Const happy_var_1+ )}++happyReduce_85 = happySpecReduce_1 21# happyReduction_85+happyReduction_85 happy_x_1+ = happyIn55+ (At+ )++happyReduce_86 = happySpecReduce_1 21# happyReduction_86+happyReduction_86 happy_x_1+ = happyIn55+ (IfThenElse+ )++happyReduce_87 = happySpecReduce_1 21# happyReduction_87+happyReduction_87 happy_x_1+ = happyIn55+ (And+ )++happyReduce_88 = happySpecReduce_1 21# happyReduction_88+happyReduction_88 happy_x_1+ = happyIn55+ (Or+ )++happyReduce_89 = happySpecReduce_1 21# happyReduction_89+happyReduction_89 happy_x_1+ = happyIn55+ (Not+ )++happyReduce_90 = happySpecReduce_1 21# happyReduction_90+happyReduction_90 happy_x_1+ = happyIn55+ (Implies+ )++happyReduce_91 = happySpecReduce_1 21# happyReduction_91+happyReduction_91 happy_x_1+ = happyIn55+ (Equal+ )++happyReduce_92 = happySpecReduce_1 21# happyReduction_92+happyReduction_92 happy_x_1+ = happyIn55+ (Distinct+ )++happyReduce_93 = happySpecReduce_1 21# happyReduction_93+happyReduction_93 happy_x_1+ = happyIn55+ (IntAdd+ )++happyReduce_94 = happySpecReduce_1 21# happyReduction_94+happyReduction_94 happy_x_1+ = happyIn55+ (IntSub+ )++happyReduce_95 = happySpecReduce_1 21# happyReduction_95+happyReduction_95 happy_x_1+ = happyIn55+ (IntMul+ )++happyReduce_96 = happySpecReduce_1 21# happyReduction_96+happyReduction_96 happy_x_1+ = happyIn55+ (IntDiv+ )++happyReduce_97 = happySpecReduce_1 21# happyReduction_97+happyReduction_97 happy_x_1+ = happyIn55+ (IntMod+ )++happyReduce_98 = happySpecReduce_1 21# happyReduction_98+happyReduction_98 happy_x_1+ = happyIn55+ (IntGt+ )++happyReduce_99 = happySpecReduce_1 21# happyReduction_99+happyReduction_99 happy_x_1+ = happyIn55+ (IntGe+ )++happyReduce_100 = happySpecReduce_1 21# happyReduction_100+happyReduction_100 happy_x_1+ = happyIn55+ (IntLt+ )++happyReduce_101 = happySpecReduce_1 21# happyReduction_101+happyReduction_101 happy_x_1+ = happyIn55+ (IntLe+ )++happyReduce_102 = happySpecReduce_0 22# happyReduction_102+happyReduction_102 = happyIn56+ ([]+ )++happyReduce_103 = happySpecReduce_2 22# happyReduction_103+happyReduction_103 happy_x_2+ happy_x_1+ = case happyOut56 happy_x_1 of { happy_var_1 -> + case happyOut49 happy_x_2 of { happy_var_2 -> + happyIn56+ (flip (:) happy_var_1 happy_var_2+ )}}++happyReduce_104 = happySpecReduce_0 23# happyReduction_104+happyReduction_104 = happyIn57+ ([]+ )++happyReduce_105 = happySpecReduce_2 23# happyReduction_105+happyReduction_105 happy_x_2+ happy_x_1+ = case happyOut57 happy_x_1 of { happy_var_1 -> + case happyOut53 happy_x_2 of { happy_var_2 -> + happyIn57+ (flip (:) happy_var_1 happy_var_2+ )}}++happyReduce_106 = happySpecReduce_0 24# happyReduction_106+happyReduction_106 = happyIn58+ ([]+ )++happyReduce_107 = happySpecReduce_2 24# happyReduction_107+happyReduction_107 happy_x_2+ happy_x_1+ = case happyOut58 happy_x_1 of { happy_var_1 -> + case happyOut51 happy_x_2 of { happy_var_2 -> + happyIn58+ (flip (:) happy_var_1 happy_var_2+ )}}++happyReduce_108 = happySpecReduce_0 25# happyReduction_108+happyReduction_108 = happyIn59+ ([]+ )++happyReduce_109 = happySpecReduce_2 25# happyReduction_109+happyReduction_109 happy_x_2+ happy_x_1+ = case happyOut59 happy_x_1 of { happy_var_1 -> + case happyOut46 happy_x_2 of { happy_var_2 -> + happyIn59+ (flip (:) happy_var_1 happy_var_2+ )}}++happyReduce_110 = happySpecReduce_0 26# happyReduction_110+happyReduction_110 = happyIn60+ ([]+ )++happyReduce_111 = happySpecReduce_2 26# happyReduction_111+happyReduction_111 happy_x_2+ happy_x_1+ = case happyOut60 happy_x_1 of { happy_var_1 -> + case happyOut47 happy_x_2 of { happy_var_2 -> + happyIn60+ (flip (:) happy_var_1 happy_var_2+ )}}++happyReduce_112 = happySpecReduce_0 27# happyReduction_112+happyReduction_112 = happyIn61+ ([]+ )++happyReduce_113 = happySpecReduce_2 27# happyReduction_113+happyReduction_113 happy_x_2+ happy_x_1+ = case happyOut61 happy_x_1 of { happy_var_1 -> + case happyOut48 happy_x_2 of { happy_var_2 -> + happyIn61+ (flip (:) happy_var_1 happy_var_2+ )}}++happyReduce_114 = happySpecReduce_0 28# happyReduction_114+happyReduction_114 = happyIn62+ ([]+ )++happyReduce_115 = happySpecReduce_2 28# happyReduction_115+happyReduction_115 happy_x_2+ happy_x_1+ = case happyOut62 happy_x_1 of { happy_var_1 -> + case happyOut35 happy_x_2 of { happy_var_2 -> + happyIn62+ (flip (:) happy_var_1 happy_var_2+ )}}++happyReduce_116 = happySpecReduce_0 29# happyReduction_116+happyReduction_116 = happyIn63+ ([]+ )++happyReduce_117 = happySpecReduce_2 29# happyReduction_117+happyReduction_117 happy_x_2+ happy_x_1+ = case happyOut63 happy_x_1 of { happy_var_1 -> + case happyOut50 happy_x_2 of { happy_var_2 -> + happyIn63+ (flip (:) happy_var_1 happy_var_2+ )}}++happyReduce_118 = happySpecReduce_0 30# happyReduction_118+happyReduction_118 = happyIn64+ ([]+ )++happyReduce_119 = happySpecReduce_2 30# happyReduction_119+happyReduction_119 happy_x_2+ happy_x_1+ = case happyOut64 happy_x_1 of { happy_var_1 -> + case happyOut42 happy_x_2 of { happy_var_2 -> + happyIn64+ (flip (:) happy_var_1 happy_var_2+ )}}++happyReduce_120 = happySpecReduce_0 31# happyReduction_120+happyReduction_120 = happyIn65+ ([]+ )++happyReduce_121 = happySpecReduce_2 31# happyReduction_121+happyReduction_121 happy_x_2+ happy_x_1+ = case happyOut65 happy_x_1 of { happy_var_1 -> + case happyOut43 happy_x_2 of { happy_var_2 -> + happyIn65+ (flip (:) happy_var_1 happy_var_2+ )}}++happyReduce_122 = happySpecReduce_0 32# happyReduction_122+happyReduction_122 = happyIn66+ ([]+ )++happyReduce_123 = happySpecReduce_2 32# happyReduction_123+happyReduction_123 happy_x_2+ happy_x_1+ = case happyOut66 happy_x_1 of { happy_var_1 -> + case happyOut44 happy_x_2 of { happy_var_2 -> + happyIn66+ (flip (:) happy_var_1 happy_var_2+ )}}++happyNewToken action sts stk [] =+ happyDoAction 45# notHappyAtAll action sts stk []++happyNewToken action sts stk (tk:tks) =+ let cont i = happyDoAction i tk action sts stk tks in+ case tk of {+ PT _ (TS _ 1) -> cont 1#;+ PT _ (TS _ 2) -> cont 2#;+ PT _ (TS _ 3) -> cont 3#;+ PT _ (TS _ 4) -> cont 4#;+ PT _ (TS _ 5) -> cont 5#;+ PT _ (TS _ 6) -> cont 6#;+ PT _ (TS _ 7) -> cont 7#;+ PT _ (TS _ 8) -> cont 8#;+ PT _ (TS _ 9) -> cont 9#;+ PT _ (TS _ 10) -> cont 10#;+ PT _ (TS _ 11) -> cont 11#;+ PT _ (TS _ 12) -> cont 12#;+ PT _ (TS _ 13) -> cont 13#;+ PT _ (TS _ 14) -> cont 14#;+ PT _ (TS _ 15) -> cont 15#;+ PT _ (TS _ 16) -> cont 16#;+ PT _ (TS _ 17) -> cont 17#;+ PT _ (TS _ 18) -> cont 18#;+ PT _ (TS _ 19) -> cont 19#;+ PT _ (TS _ 20) -> cont 20#;+ PT _ (TS _ 21) -> cont 21#;+ PT _ (TS _ 22) -> cont 22#;+ PT _ (TS _ 23) -> cont 23#;+ PT _ (TS _ 24) -> cont 24#;+ PT _ (TS _ 25) -> cont 25#;+ PT _ (TS _ 26) -> cont 26#;+ PT _ (TS _ 27) -> cont 27#;+ PT _ (TS _ 28) -> cont 28#;+ PT _ (TS _ 29) -> cont 29#;+ PT _ (TS _ 30) -> cont 30#;+ PT _ (TS _ 31) -> cont 31#;+ PT _ (TS _ 32) -> cont 32#;+ PT _ (TS _ 33) -> cont 33#;+ PT _ (TS _ 34) -> cont 34#;+ PT _ (TS _ 35) -> cont 35#;+ PT _ (TS _ 36) -> cont 36#;+ PT _ (TS _ 37) -> cont 37#;+ PT _ (TS _ 38) -> cont 38#;+ PT _ (TS _ 39) -> cont 39#;+ PT _ (TS _ 40) -> cont 40#;+ PT _ (TS _ 41) -> cont 41#;+ PT _ (TS _ 42) -> cont 42#;+ PT _ (TI happy_dollar_dollar) -> cont 43#;+ PT _ (T_Symbol _) -> cont 44#;+ _ -> happyError' (tk:tks)+ }++happyError_ 45# tk tks = happyError' tks+happyError_ _ tk tks = happyError' (tk:tks)++happyThen :: () => Err a -> (a -> Err b) -> Err b+happyThen = (thenM)+happyReturn :: () => a -> Err a+happyReturn = (returnM)+happyThen1 m k tks = (thenM) m (\a -> k a tks)+happyReturn1 :: () => a -> b -> Err a+happyReturn1 = \a tks -> (returnM) a+happyError' :: () => [(Token)] -> Err a+happyError' = happyError++pStart tks = happySomeParser where+ happySomeParser = happyThen (happyParse 0# tks) (\x -> happyReturn (happyOut36 x))++pListDecl tks = happySomeParser where+ happySomeParser = happyThen (happyParse 1# tks) (\x -> happyReturn (happyOut37 x))++pDecl tks = happySomeParser where+ happySomeParser = happyThen (happyParse 2# tks) (\x -> happyReturn (happyOut38 x))++pAssertion tks = happySomeParser where+ happySomeParser = happyThen (happyParse 3# tks) (\x -> happyReturn (happyOut39 x))++pPar tks = happySomeParser where+ happySomeParser = happyThen (happyParse 4# tks) (\x -> happyReturn (happyOut40 x))++pConstDecl tks = happySomeParser where+ happySomeParser = happyThen (happyParse 5# tks) (\x -> happyReturn (happyOut41 x))++pFunDecl tks = happySomeParser where+ happySomeParser = happyThen (happyParse 6# tks) (\x -> happyReturn (happyOut42 x))++pFunDef tks = happySomeParser where+ happySomeParser = happyThen (happyParse 7# tks) (\x -> happyReturn (happyOut43 x))++pFunDec tks = happySomeParser where+ happySomeParser = happyThen (happyParse 8# tks) (\x -> happyReturn (happyOut44 x))++pInnerFunDec tks = happySomeParser where+ happySomeParser = happyThen (happyParse 9# tks) (\x -> happyReturn (happyOut45 x))++pDatatype tks = happySomeParser where+ happySomeParser = happyThen (happyParse 10# tks) (\x -> happyReturn (happyOut46 x))++pConstructor tks = happySomeParser where+ happySomeParser = happyThen (happyParse 11# tks) (\x -> happyReturn (happyOut47 x))++pBinding tks = happySomeParser where+ happySomeParser = happyThen (happyParse 12# tks) (\x -> happyReturn (happyOut48 x))++pLetDecl tks = happySomeParser where+ happySomeParser = happyThen (happyParse 13# tks) (\x -> happyReturn (happyOut49 x))++pType tks = happySomeParser where+ happySomeParser = happyThen (happyParse 14# tks) (\x -> happyReturn (happyOut50 x))++pExpr tks = happySomeParser where+ happySomeParser = happyThen (happyParse 15# tks) (\x -> happyReturn (happyOut51 x))++pBinder tks = happySomeParser where+ happySomeParser = happyThen (happyParse 16# tks) (\x -> happyReturn (happyOut52 x))++pCase tks = happySomeParser where+ happySomeParser = happyThen (happyParse 17# tks) (\x -> happyReturn (happyOut53 x))++pPattern tks = happySomeParser where+ happySomeParser = happyThen (happyParse 18# tks) (\x -> happyReturn (happyOut54 x))++pHead tks = happySomeParser where+ happySomeParser = happyThen (happyParse 19# tks) (\x -> happyReturn (happyOut55 x))++pListLetDecl tks = happySomeParser where+ happySomeParser = happyThen (happyParse 20# tks) (\x -> happyReturn (happyOut56 x))++pListCase tks = happySomeParser where+ happySomeParser = happyThen (happyParse 21# tks) (\x -> happyReturn (happyOut57 x))++pListExpr tks = happySomeParser where+ happySomeParser = happyThen (happyParse 22# tks) (\x -> happyReturn (happyOut58 x))++pListDatatype tks = happySomeParser where+ happySomeParser = happyThen (happyParse 23# tks) (\x -> happyReturn (happyOut59 x))++pListConstructor tks = happySomeParser where+ happySomeParser = happyThen (happyParse 24# tks) (\x -> happyReturn (happyOut60 x))++pListBinding tks = happySomeParser where+ happySomeParser = happyThen (happyParse 25# tks) (\x -> happyReturn (happyOut61 x))++pListSymbol tks = happySomeParser where+ happySomeParser = happyThen (happyParse 26# tks) (\x -> happyReturn (happyOut62 x))++pListType tks = happySomeParser where+ happySomeParser = happyThen (happyParse 27# tks) (\x -> happyReturn (happyOut63 x))++pListFunDecl tks = happySomeParser where+ happySomeParser = happyThen (happyParse 28# tks) (\x -> happyReturn (happyOut64 x))++pListFunDef tks = happySomeParser where+ happySomeParser = happyThen (happyParse 29# tks) (\x -> happyReturn (happyOut65 x))++pListFunDec tks = happySomeParser where+ happySomeParser = happyThen (happyParse 30# tks) (\x -> happyReturn (happyOut66 x))++happySeq = happyDontSeq+++returnM :: a -> Err a+returnM = return++thenM :: Err a -> (a -> Err b) -> Err b+thenM = (>>=)++happyError :: [Token] -> Err a+happyError ts =+ Bad $ "syntax error at " ++ tokenPos ts ++ + case ts of+ [] -> []+ [Err _] -> " due to lexer error"+ _ -> " before " ++ unwords (map (id . prToken) (take 4 ts))++myLexer = tokens+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "<built-in>" #-}+{-# LINE 1 "<command-line>" #-}+{-# LINE 11 "<command-line>" #-}+# 1 "/usr/include/stdc-predef.h" 1 3 4++# 17 "/usr/include/stdc-predef.h" 3 4++++++++++++++++++++++++++++++++++++++++++++++++{-# LINE 11 "<command-line>" #-}+{-# LINE 1 "/usr/lib/ghc-7.10.2/include/ghcversion.h" #-}
executable/Main.hs view
@@ -4,6 +4,7 @@ import Tip.Parser import Tip.Pretty.SMT as SMT+import Tip.Pretty.TFF as TFF import Tip.Pretty.Why3 as Why3 import Tip.Pretty.Isabelle as Isabelle import Tip.Pretty.Haskell as HS@@ -14,65 +15,98 @@ import Tip.Lint import Tip.Fresh import Tip.Core-import Options.Applicative +import System.FilePath+import Options.Applicative import Control.Monad -data OutputMode = Haskell | Why3 | CVC4 | Isabelle | TIP+data OutputMode = Haskell HS.Mode | Why3 | SMTLIB Bool | Isabelle | TIP | TFF parseOutputMode :: Parser OutputMode parseOutputMode =- flag' Haskell (long "haskell" <> help "Haskell output")+ flag' (Haskell HS.Plain) (long "haskell" <> help "Haskell output")+ <|> flag' (Haskell HS.Feat) (long "haskell-feat" <> help "Haskell output with Feat tests")+ <|> flag' (Haskell HS.QuickCheck) (long "haskell-qc" <> help "Haskell output with QuickCheck tests (Feat generators)")+ <|> flag' (Haskell (HS.LazySmallCheck False)) (long "haskell-lazysc" <> help "Haskell output with LazySmallCheck tests")+ <|> flag' (Haskell (HS.LazySmallCheck True)) (long "haskell-lazysc-depth" <> help "Haskell output with LazySmallCheck tests up to some depth (given on command line)")+ <|> flag' (Haskell HS.Smten) (long "haskell-smten" <> help "Haskell output with Smten (depth given on command line)")+ <|> flag' (Haskell HS.QuickSpec) (long "haskell-spec" <> help "Haskell output with QuickSpec signature (Feat generators)") <|> flag' Why3 (long "why" <> help "WhyML output")- <|> flag' CVC4 (long "smtlib" <> help "SMTLIB output (CVC4-compatible)")+ <|> flag' (SMTLIB False) (long "smtlib" <> help "SMTLIB output")+ <|> flag' (SMTLIB True) (long "smtlib-ax-fun" <> help "SMTLIB output (axiomatise function declarations)") <|> flag' Isabelle (long "isabelle" <> help "Isabelle output")+ <|> flag' TFF (long "tff" <> help "TPTP TFF output") <|> flag TIP TIP (long "tip" <> help "TIP output (default)") -optionParser :: Parser ([StandardPass], Maybe String, OutputMode)+optionParser :: Parser ([StandardPass], Maybe String, OutputMode, Maybe FilePath) optionParser =- (,,) <$> parsePasses <*> parseFile <*> parseOutputMode+ (,,,) <$> parsePasses <*> parseFile <*> parseOutputMode <*> parseMultiPath where parseFile = fmap Just (strArgument (metavar "FILENAME")) <|> pure Nothing + parseMultiPath =+ fmap Just (strArgument (metavar "DIRECTORY")) <|> pure Nothing+ main :: IO () main = do- (passes, files, mode) <-+ (passes, files, mode, multipath) <- execParser $ info (helper <*> optionParser) (fullDesc <> progDesc "Transform a TIP problem" <> header "tip - a tool for processing TIP problems") case files of- Nothing ->- handle passes mode =<< getContents- Just f ->- handle passes mode =<< readFile f+ Nothing -> handle passes mode multipath =<< getContents+ Just "-" -> handle passes mode multipath =<< getContents+ Just f -> handle passes mode multipath =<< readFile f -handle :: [StandardPass] -> OutputMode -> String -> IO ()-handle passes mode s =+handle :: [StandardPass] -> OutputMode -> Maybe FilePath -> String -> IO ()+handle passes mode multipath s = case parse s of Left err -> error $ "Parse failed: " ++ err Right thy -> do- let fmap_pp f = fmap (show . f)+ let fmap_pp f = fmap (show . map f) let show_passes c = fmap (\ s -> c ++ show passes ++ "\n" ++ s)- let pipeline =+ let (pretty,pipeline,ext) = case mode of- CVC4 ->- fmap_pp SMT.ppTheory . runPasses- (passes ++- [ LambdaLift, AxiomatizeLambdas- , CollapseEqual, RemoveAliases+ SMTLIB ax_func_decls ->+ ( SMT.ppTheory+ , passes +++ [ TypeSkolemConjecture, Monomorphise False+ , LambdaLift, AxiomatizeLambdas+ , SimplifyGently, CollapseEqual, RemoveAliases , SimplifyGently, RemoveMatch- , SimplifyGently, NegateConjecture- , SimplifyGently- ])- Haskell ->- fmap_pp HS.ppTheory . runPasses passes- Why3 ->- fmap_pp Why3.ppTheory . runPasses (passes ++ [CSEMatchWhy3])- Isabelle ->- fmap_pp Isabelle.ppTheory . runPasses passes- TIP ->- show_passes "; " . fmap_pp SMT.ppTheory . runPasses passes- putStrLn (freshPass pipeline (lint "parse" thy))+ , SimplifyGently, Monomorphise False ]+ ++ [ AxiomatizeFuncdefs | ax_func_decls ]+ ++ [ SimplifyGently, NegateConjecture ]+ , "smt2")+ TFF ->+ ( TFF.ppTheory+ , passes +++ [ TypeSkolemConjecture, Monomorphise False+ , LambdaLift, AxiomatizeLambdas+ , SimplifyGently, CollapseEqual, RemoveAliases+ , SimplifyGently, Monomorphise False, IfToBoolOp, CommuteMatch+ , SimplifyGently, LetLift, SimplifyGently, AxiomatizeFuncdefs2+ , SimplifyGently, AxiomatizeDatadecls+ ]+ , "p")+ Haskell m -> (HS.ppTheory m, passes, "hs")+ Why3 -> (Why3.ppTheory, passes ++ [CSEMatchWhy3], "mlw")+ Isabelle -> (Isabelle.ppTheory, passes, "thy")+ TIP -> (SMT.ppTheory, passes, "smt2")+ let thys = freshPass (runPasses pipeline) (lint "parse" thy)+ case multipath of+ Nothing ->+ case thys of+ [thy] -> print (pretty thy)+ [] -> error "No theory remaining"+ _ -> error "Multiple theories, specify an output path"+ Just d ->+ sequence_+ [ do putStrLn $ d </> show n <.> ext+ writeFile (d </> show n <.> ext) (show (pretty thy) ++ "\n")+ | (n, thy) <- [(0 :: Int)..] `zip` thys+ ]+
src/Tip/Core.hs view
@@ -17,7 +17,7 @@ import Data.Foldable (Foldable) import qualified Data.Foldable as F import Data.Generics.Geniplate-import Data.List ((\\))+import Data.List ((\\),partition) import Data.Ord import Control.Monad import qualified Data.Map as Map@@ -37,7 +37,19 @@ (=/=) :: Expr a -> Expr a -> Expr a e1 =/= e2 = Builtin Distinct :@: [e1,e2] +oppositeQuant :: Quant -> Quant+oppositeQuant Forall = Exists+oppositeQuant Exists = Forall++gentleNeg :: Expr a -> Expr a+gentleNeg (Builtin Not :@: [e]) = e+gentleNeg e = Builtin Not :@: [e]+ neg :: Expr a -> Expr a+neg (Quant qi q lcs e) = Quant qi (oppositeQuant q) lcs (neg e)+neg (Builtin And :@: es) = Builtin Or :@: map neg es+neg (Builtin Or :@: es) = Builtin And :@: map neg es+neg (Builtin Not :@: [e]) = e neg (Builtin op :@: [e1,e2]) | Equal <- op = e1 =/= e2 | Distinct <- op = e1 === e2@@ -58,10 +70,24 @@ | otherwise = Builtin Or :@: [e1,e2] ands :: [Expr a] -> Expr a-ands xs = foldl (/\) trueExpr xs+ands xs =+ case flatAnd (foldl (/\) trueExpr xs) of+ [] -> trueExpr+ [x] -> x+ xs -> Builtin And :@: xs+ where+ flatAnd (Builtin And :@: xs) = concatMap flatAnd xs+ flatAnd x = [x] ors :: [Expr a] -> Expr a-ors xs = foldl (\/) falseExpr xs+ors xs =+ case flatOr (foldl (\/) falseExpr xs) of+ [] -> falseExpr+ [x] -> x+ xs -> Builtin Or :@: xs+ where+ flatOr (Builtin Or :@: xs) = concatMap flatOr xs+ flatOr x = [x] (==>) :: Expr a -> Expr a -> Expr a e1 ==> e2@@ -114,25 +140,41 @@ apply e es@(_:_) = Builtin At :@: (e:es) apply _ [] = ERROR("tried to construct nullary lambda function") -applyType :: Ord a => [a] -> [Type a] -> Type a -> Type a-applyType tvs tys ty- | length tvs == length tys =- flip transformType ty $ \ty' ->- case ty' of- TyVar x ->- Map.findWithDefault ty' x m- _ -> ty'- | otherwise = ERROR("wrong number of type arguments")+applyTypeIn :: Ord a => ((Type a -> Type a) -> f a -> f a) -> [a] -> [Type a] -> f a -> f a+applyTypeIn transformer tvs tys+ | length tvs /= length tys = ERROR("wrong number of type arguments")+ | otherwise = transformer $ \ty -> case ty of TyVar x -> Map.findWithDefault ty x m+ _ -> ty where m = Map.fromList (zip tvs tys) +applyType :: Ord a => [a] -> [Type a] -> Type a -> Type a+applyType = applyTypeIn transformType++applyTypeInExpr :: Ord a => [a] -> [Type a] -> Expr a -> Expr a+applyTypeInExpr = applyTypeIn transformTypeInExpr++applyTypeInDecl :: Ord a => [a] -> [Type a] -> Decl a -> Decl a+applyTypeInDecl = applyTypeIn transformTypeInDecl+ applyPolyType :: Ord a => PolyType a -> [Type a] -> ([Type a], Type a) applyPolyType PolyType{..} tys = (map (applyType polytype_tvs tys) polytype_args, applyType polytype_tvs tys polytype_res) +gblType :: Ord a => Global a -> ([Type a], Type a)+gblType Global{..} = applyPolyType gbl_type gbl_args++makeLets :: [(Local a,Expr a)] -> Expr a -> Expr a+makeLets [] e = e+makeLets ((x,ex):xes) e = Let x ex (makeLets xes e)+ -- * Predicates and examinations on expressions +collectLets :: Expr a -> ([(Local a,Expr a)],Expr a)+collectLets (Let y rhs e) = let (bs,e') = collectLets e in ((y,rhs):bs,e')+collectLets e = ([],e)+ litView :: Expr a -> Maybe Lit litView (Builtin (Lit l) :@: []) = Just l litView _ = Nothing@@ -141,6 +183,11 @@ boolView e = case litView e of Just (Bool b) -> Just b _ -> Nothing +forallView :: Expr a -> ([Local a],Expr a)+forallView (Quant _ Forall vs1 e) = let (vs2,e') = forallView e+ in (vs1++vs2,e')+forallView e = ([],e)+ -- | A representation of Nested patterns, used in 'patternMatchingView' data DeepPattern a = DeepConPat (Global a) [DeepPattern a]@@ -281,6 +328,8 @@ builtinType At ((_ :=>: res):_) = res builtinType At _ = ERROR("ill-typed lambda application") +theoryTypes :: (UniverseBi (t a) (Type a),Ord a) => t a -> [Type a]+theoryTypes = usort . universeBi -- * Substition and refreshing @@ -288,7 +337,7 @@ freshLocal ty = liftM2 Local fresh (return ty) freshArgs :: Name a => Global a -> Fresh [Local a]-freshArgs gbl = mapM freshLocal (polytype_args (gbl_type gbl))+freshArgs gbl = mapM freshLocal (fst (gblType gbl)) refreshLocal :: Name a => Local a -> Fresh (Local a) refreshLocal (Local name ty) = liftM2 Local (refresh name) (return ty)@@ -329,7 +378,7 @@ -- expression contains no binders (i.e. no lambdas, no lets, no quantifiers), -- since the binders are not refreshed at every insertion point. unsafeSubst :: Ord a => Expr a -> Local a -> Expr a -> Expr a-e `unsafeSubst` _ | not (null (bound e)) = error "Tip.unsafeSubst: contains binders"+e `unsafeSubst` _ | not (null (bound e)) = ERROR("unsafeSubst: contains binders") e `unsafeSubst` x = transformExpr $ \ e0 -> case e0 of Lcl y | x == y -> e _ -> e0@@ -398,13 +447,21 @@ projector dt Constructor{..} i tys = Global proj_name (destructorType dt proj_ty) tys where- (proj_name, proj_ty) = con_args !! i+ (proj_name, proj_ty) = case drop i con_args of ca:_ -> ca; [] -> __ discriminator :: Datatype a -> Constructor a -> [Type a] -> Global a discriminator dt Constructor{..} tys = Global con_discrim (destructorType dt (BuiltinType Boolean)) tys -- * Operations on theories++-- | Goals in first component, assertions in second+theoryGoals :: Theory a -> ([Formula a],[Formula a])+theoryGoals = partitionGoals . thy_asserts++-- | Goals in first component, assertions in second+partitionGoals :: [Formula a] -> ([Formula a],[Formula a])+partitionGoals = partition ((Prove ==) . fm_role) mapDecls :: forall a b . (forall t . Traversable t => t a -> t b) -> Theory a -> Theory b mapDecls k (Theory a b c d e) = Theory (map k a) (map k b) (map k c) (map k d) (map k e)
src/Tip/Fresh.hs view
@@ -6,7 +6,7 @@ import Tip.Utils import Tip.Pretty import Control.Applicative hiding (empty)-import Control.Monad.State+import Control.Monad.State.Strict import Control.Arrow ((&&&)) import Data.Foldable (Foldable)@@ -56,4 +56,10 @@ instance Name Int where fresh = Fresh (state (id &&& succ)) getUnique = id++instance Name a => Name (PPVar a) where+ fresh = fmap PPVar fresh+ refresh = fmap PPVar . refresh . unPPVar+ freshNamed = fmap PPVar . freshNamed+ refreshNamed s n = fmap PPVar (refreshNamed s (unPPVar n))
src/Tip/Haskell/Repr.hs view
@@ -20,6 +20,9 @@ | InstDecl [Type a] {- context -} (Type a) {- head -} [Decl a] {- declarations (associated types and fun decls) -}+ | ClassDecl [Type a] {- context -}+ (Type a) {- head -}+ [Decl a] {- declarations (type signatures) -} | TypeDef (Type a) (Type a) | Decl a `Where` [Decl a] | TH (Expr a)
src/Tip/Haskell/Translate.hs view
@@ -4,17 +4,20 @@ {-# LANGUAGE GADTs #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE CPP #-}+{-# LANGUAGE PatternGuards #-} module Tip.Haskell.Translate where #include "errors.h" import Tip.Haskell.Repr as H-import Tip.Core as T hiding (Formula(..),globals,Type(..))+import Tip.Core as T hiding (Formula(..),globals,Type(..),Decl(..)) import Tip.Core (Type((:=>:),BuiltinType)) import qualified Tip.Core as T import Tip.Pretty import Tip.Utils import Tip.Scope +import Data.Maybe (isNothing)+ import Tip.CallGraph import Control.Monad@@ -47,9 +50,29 @@ quickSpec :: String -> HsId a quickSpec = Qualified "QuickSpec" (Just "QS") +sysEnv :: String -> HsId a+sysEnv = Qualified "System.Environment" (Just "Env")++smtenSym :: String -> HsId a+smtenSym = Qualified "Smten.Symbolic" (Just "S")++smtenEnv :: String -> HsId a+smtenEnv = Qualified "Smten.System.Environment" (Just "Env")++smtenMinisat :: String -> HsId a+smtenMinisat = Qualified "Smten.Symbolic.Solver.MiniSat" (Just "S")++smtenMonad :: String -> HsId a+smtenMonad = Qualified "Smten.Control.Monad" (Just "S")++-- smten also needs Prelude to be replaced with Smten.Prelude+ feat :: String -> HsId a feat = Qualified "Test.Feat" (Just "F") +lsc :: String -> HsId a+lsc = Qualified "Test.LazySmallCheck" (Just "L")+ typeable :: String -> HsId a typeable = Qualified "Data.Typeable" (Just "T") @@ -75,17 +98,25 @@ varStr (Other x) = varStr x varStr (Derived o s) = s ++ varStr o -addHeader :: Decls a -> Decls a-addHeader (Decls ds) =- Decls (map LANGUAGE ["TemplateHaskell","DeriveDataTypeable","TypeOperators","ImplicitParams","RankNTypes"] ++ Module "A" : ds)+addHeader :: String -> Decls a -> Decls a+addHeader mod_name (Decls ds) =+ Decls (map LANGUAGE ["TemplateHaskell","DeriveDataTypeable","TypeOperators","ImplicitParams","RankNTypes"] ++ Module mod_name : ds) addImports :: Ord a => Decls (HsId a) -> Decls (HsId a) addImports d@(Decls ds) = Decls (QualImport "Text.Show.Functions" Nothing : imps ++ ds) where imps = usort [ QualImport m short | Qualified m short _ <- F.toList d ] -trTheory :: (Ord a,PrettyVar a) => Theory a -> Decls (HsId a)-trTheory = trTheory' . fmap Other+trTheory :: (Ord a,PrettyVar a) => Mode -> Theory a -> Decls (HsId a)+trTheory mode = fixup_prel . trTheory' mode . fmap Other+ where+ fixup_prel =+ case mode of+ Smten -> fmap fx+ _ -> id+ where+ fx (Qualified "Prelude" u v) = Qualified "Smten.Prelude" (Just "S") v+ fx u = u data Kind = Expr | Formula deriving Eq @@ -97,34 +128,114 @@ where imps = [TyImp (Derived f "imp") (H.TyCon (Derived f "") []) | Signature f _ <- thy_sigs] -trTheory' :: forall a b . (a ~ HsId b,Ord b,PrettyVar b) => Theory a -> Decls a-trTheory' thy@Theory{..} =+data Mode = Feat | QuickCheck | LazySmallCheck Bool | Smten | QuickSpec | Plain+ deriving (Eq,Ord,Show)++isLazySmallCheck LazySmallCheck{} = True+isLazySmallCheck _ = False++isSmten Smten{} = True+isSmten _ = False++trTheory' :: forall a b . (a ~ HsId b,Ord b,PrettyVar b) => Mode -> Theory a -> Decls a+trTheory' mode thy@Theory{..} = Decls $+ concat [space_decl | isSmten mode ] ++ concatMap tr_datatype thy_datatypes ++ map tr_sort thy_sorts ++ concatMap tr_sig thy_sigs ++ concatMap tr_func thy_funcs ++ tr_asserts thy_asserts ++- [makeSig thy]+ [makeSig thy | mode == QuickSpec ] where (translate_UFs,imps) = ufInfo thy + space_decl :: [Decl a]+ space_decl =+ [ ClassDecl [] (TyCon (Exact "Space") [TyVar (Exact "stv")])+ [TySig (Exact "space") []+ (TyArr (TyCon (prelude "Int") [])+ (TyCon (smtenSym "Symbolic") [TyVar (Exact "stv")]))+ ]+ , InstDecl [] (TyCon (Exact "Space") [TyCon (prelude "Bool") []])+ [funDecl+ (Exact "space")+ [d]+ (H.Case (Apply (prelude "<") [var d,H.Int 0])+ [(H.ConPat (prelude "True") [], Apply (smtenMonad "mzero") [])+ ,(H.WildPat,+ Apply (smtenMonad "msum")+ [List+ [ Apply (smtenMonad "return") [Apply (prelude "False") []]+ , Apply (smtenMonad "return") [Apply (prelude "True") []]+ ]])+ ])+ ]+ ]+ where d = Exact "d"+ tr_datatype :: Datatype a -> [Decl a] tr_datatype (Datatype tc tvs cons) = [ DataDecl tc tvs [ (c,map (trType . snd) args) | Constructor c _ args <- cons ]- (map prelude ["Eq","Ord","Show"] ++ [typeable "Typeable"])- , TH (Apply (feat "deriveEnumerable") [QuoteTyCon tc])- , InstDecl [H.TyCon (feat "Enumerable") [H.TyVar a] | a <- tvs]+ (map prelude ["Eq","Ord","Show"]+ ++ [typeable "Typeable" | not (isSmten mode) ])+ ]+ +++ [ TH (Apply (feat "deriveEnumerable") [QuoteTyCon tc])+ | any (== mode) [Feat, QuickCheck, QuickSpec] ]+ +++ [ InstDecl [H.TyCon (feat "Enumerable") [H.TyVar a] | a <- tvs] (H.TyCon (quickCheck "Arbitrary") [H.TyCon tc (map H.TyVar tvs)]) [funDecl (quickCheck "arbitrary") [] (Apply (quickCheck "sized") [Apply (feat "uniform") []])]+ | any (== mode) [QuickCheck, QuickSpec] ]+ +++ [ InstDecl+ [H.TyCon (lsc "Serial") [H.TyVar a] | a <- tvs]+ (H.TyCon (lsc "Serial") [H.TyCon tc (map H.TyVar tvs)])+ [funDecl+ (lsc "series")+ []+ (foldr1+ (\ e1 e2 -> Apply (lsc "\\/") [e1,e2])+ [ foldl+ (\ e _ -> Apply (lsc "><") [e,Apply (lsc "series") []])+ (Apply (lsc "cons") [Apply c []])+ as+ | Constructor c _ as <- cons+ ])]+ | isLazySmallCheck mode ]+ +++ [ InstDecl+ [H.TyCon (Exact "Space") [H.TyVar a] | a <- tvs]+ (H.TyCon (Exact "Space") [H.TyCon tc (map H.TyVar tvs)])+ [funDecl+ (Exact "space")+ [d]+ (H.Case (Apply (prelude "<") [var d,H.Int 0])+ [(H.ConPat (prelude "True") [], Apply (smtenMonad "mzero") [])+ ,(H.WildPat,+ Apply (smtenMonad "msum")+ [List+ [ foldl (\ e1 _ ->+ Apply (smtenMonad "ap")+ [e1,Apply (Exact "space")+ [Apply (prelude "-") [var d,H.Int 1]]])+ (Apply (smtenMonad "return") [Apply c []])+ args+ | Constructor c _ args <- cons+ ]])+ ])+ ]+ | let d = Exact "d"+ , isSmten mode ] tr_sort :: Sort a -> Decl a- tr_sort (Sort _ i) | i /= 0 = error "Higher-kinded abstract sort"- tr_sort (Sort s i) = TypeDef (TyCon s []) (TyCon (prelude "Int") [])+ tr_sort (Sort s i) | null i = TypeDef (TyCon s []) (TyCon (prelude "Int") [])+ tr_sort (Sort _ _) = error "Haskell.Translate: Poly-kinded abstract sort" tr_sig :: Signature a -> [Decl a] tr_sig (Signature f pt) =@@ -181,30 +292,90 @@ [ (map tr_deepPattern dps,tr_expr Expr rhs) | (dps,rhs) <- patternMatchingView func_args func_body ]+ ] +++ [ FunDecl+ (prop_version func_name)+ [ (map tr_deepPattern dps,tr_expr Formula rhs)+ | (dps,rhs) <- patternMatchingView func_args func_body+ ]+ | isLazySmallCheck mode && func_res == boolType ] + prop_version f = Derived f "property"+ tr_asserts :: [T.Formula a] -> [Decl a] tr_asserts fms =- let (names,decls) = unzip (zipWith tr_assert [1..] fms)- in decls {- ++- [ TH (Apply (prelude "return") [List []])- , funDecl (Exact "main") []- (mkDo [ Stmt (THSplice (Apply (quickCheckAll "polyQuickCheck")- [QuoteName name]))- | name <- names ]- Noop)- ] -}+ let (info,decls) = unzip (zipWith tr_assert [1..] fms)+ in concat decls +++ case mode of+ QuickCheck ->+ [ TH (Apply (prelude "return") [List []])+ , funDecl (Exact "main") []+ (mkDo [ Stmt (THSplice (Apply (quickCheckAll "polyQuickCheck")+ [QuoteName name]))+ | (name,_) <- info ]+ Noop)+ ]+ LazySmallCheck md ->+ [ funDecl (Exact "main") []+ ((`mkDo` Noop)+ $ [Bind (Exact "args") (Apply (sysEnv "getArgs") [])]+ ++ [Stmt (fn name) | (name,_) <- info])+ ]+ where+ fn name = case md of+ False -> Apply (lsc "test") [var name]+ True -> Apply (lsc "depthCheck")+ [read_head (var (Exact "args"))+ ,var name]+ Feat ->+ [ funDecl (Exact "main") []+ (mkDo [Stmt (Apply (feat "featCheckStop")+ [ H.Lam [TupPat (map VarPat vs)] (Apply name (map var vs))+ ])+ | (name,vs) <- info ] Noop)+ ]+ Smten | let [(name,vs)] = info ->+ [ funDecl (Exact "main") []+ $ mkDo [Bind (Exact "args") (Apply (smtenEnv "getArgs") [])+ ,Bind (Exact "r")+ (Apply (smtenSym "run_symbolic")+ [Apply (smtenMinisat "minisat") []+ ,mkDo (+ [ Bind v (Apply (Exact "space") [read_head (var (Exact "args"))])+ | v <- vs ]+ +++ [ Stmt $ Apply (smtenMonad "guard") [Apply (prelude "not") [Apply name (map var vs)]] ])+ (Apply (smtenMonad "return") [nestedTup (map var vs)])+ ])+ ]+ (Apply (prelude "print") [var (Exact "r")])+ ]+ _ -> []+ where+ read_head e = Apply (prelude "read") [Apply (prelude "head") [e]] - tr_assert :: Int -> T.Formula a -> (a,Decl a)- tr_assert i (T.Formula r _ b) =- (prop_name,funDecl prop_name args (assume (tr_expr Formula body)))+ tr_assert :: Int -> T.Formula a -> ((a,[a]),[Decl a])+ tr_assert i (T.Formula r _ tvs b) =+ ((prop_name,args),+ [ TySig prop_name []+ (foldr TyArr+ (case mode of LazySmallCheck{} -> H.TyCon (lsc "Property") []+ _ -> H.TyCon (prelude "Bool") [])+ [ trType (applyType tvs (replicate (length tvs) (intType)) t)+ | Local _ t <- typed_args ])+ | mode == Feat || isLazySmallCheck mode || mode == Smten ]+ +++ [ funDecl prop_name args (assume (tr_expr (if mode == Feat || isSmten mode then Expr else Formula) body)) ]+ ) where prop_name | i == 1 = Exact "prop" | otherwise = Exact ("prop" ++ show i)- (args,body) =+ (typed_args,body) = case b of- Quant _ Forall lcls term -> (map lcl_name lcls,term)+ Quant _ Forall lcls term -> (lcls,term) _ -> ([],b)+ args = map lcl_name typed_args assume e = case r of@@ -227,12 +398,17 @@ tr_expr k e0 = case e0 of Builtin (Lit (T.Int i)) :@: [] -> H.Int i- Builtin (Lit (Bool b)) :@: [] -> withBool Apply b- hd :@: es -> let (f,k') = tr_head k hd- in Apply f (map (tr_expr k') es)- Lcl x -> var (lcl_name x)+ Builtin (Lit (Bool b)) :@: [] -> lsc_lift (withBool Apply b)+ Builtin Implies :@: [u,v] | mode == Smten -> tr_expr k (Builtin Or :@: [Builtin Not :@: [u],v])+ hd :@: es -> let ((f,k'),lft) = tr_head (map exprType es) k hd+ in lift_if lft (maybe_ty_sig e0 (Apply f (map (tr_expr k') es)))+ Lcl x -> lsc_lift (var (lcl_name x)) T.Lam xs b -> H.Lam (map (VarPat . lcl_name) xs) (tr_expr Expr b)- Match e alts -> H.Case (tr_expr Expr e) [ (tr_pattern p,tr_expr Expr rhs) | T.Case p rhs <- default_last alts ]+ Match e alts -> H.Case (tr_expr Expr e) [ (tr_pattern p,tr_expr brs_k rhs) | T.Case p rhs <- default_last alts ]+ where+ brs_k+ | isLazySmallCheck mode = k+ | otherwise = Expr T.Let x e b -> H.Let (lcl_name x) (tr_expr Expr e) (tr_expr k b) T.Quant _ q xs b -> foldr@@ -243,33 +419,57 @@ xs where+ maybe_ty_sig e@(hd@(Gbl Global{..}) :@: es) he+ | isNothing (makeGlobal gbl_name gbl_type (map exprType es) Nothing)+ = he ::: trType (exprType e)+ maybe_ty_sig _ he = he++ lift_if b e+ | b && isLazySmallCheck mode = Apply (lsc "lift") [e]+ | otherwise = e+ lsc_lift = lift_if (k == Formula)+ default_last (def@(T.Case Default _):alts) = alts ++ [def] default_last alts = alts - tr_head :: Kind -> T.Head a -> (a,Kind)- tr_head k (Gbl Global{..}) = (gbl_name,Expr)- tr_head k (Builtin b) = tr_builtin k b+ tr_head :: [T.Type a] -> Kind -> T.Head a -> ((a,Kind),Bool)+ tr_head ts k (Builtin b) = tr_builtin ts k b+ tr_head ts k (Gbl Global{..})+ | stay_prop = ((prop_version gbl_name,Expr),False)+ | otherwise = ((gbl_name ,Expr),False)+ where+ stay_prop = k == Formula+ && isLazySmallCheck mode+ && polytype_res gbl_type == boolType - tr_builtin :: Kind -> T.Builtin -> (a,Kind)- tr_builtin k b =+ tr_builtin :: [T.Type a] -> Kind -> T.Builtin -> ((a,Kind),Bool)+ tr_builtin ts k b = case b of- At -> (prelude "id",Expr)+ At -> ((prelude "id",Expr),False) Lit{} -> error "tr_builtin"- And -> case_kind ".&&."- Or -> case_kind ".||."- Not -> case_kind "neg"- Implies -> case_kind "==>"- Equal -> case_kind "==="- Distinct -> case_kind "=/="- _ -> prelude_fn+ And -> case_kind (tipDSL ".&&.") (Just (lsc "*&*"))+ Or -> case_kind (tipDSL ".||.") (Just (lsc "*|*"))+ Not -> case_kind (tipDSL "neg") (Just (lsc "neg"))+ Implies -> case_kind (tipDSL "==>") (Just (lsc "*=>*"))+ Equal -> case_kind (tipDSL "===") $ case ts of+ BuiltinType Boolean:_ -> Just (lsc "*=*")+ _ -> Nothing+ Distinct -> case_kind (tipDSL "=/=") Nothing+ _ -> (prelude_fn,False) where Just prelude_str_ = lookup b hsBuiltins prelude_fn = (prelude prelude_str_,Expr) - case_kind sf =+ case_kind tip_version lsc_version = case k of- Expr -> prelude_fn- Formula -> (tipDSL sf,Formula)+ Expr -> (prelude_fn,False)+ Formula ->+ case mode of+ LazySmallCheck{} ->+ case lsc_version of+ Just v -> ((v,Formula),False)+ Nothing -> (prelude_fn,True)+ _ -> ((tip_version,Formula),False) -- ignores the type variables tr_polyType_inner :: T.PolyType a -> H.Type a@@ -399,6 +599,7 @@ | Signature f _ <- thy_sigs ]) , (quickSpec "maxTermSize", Apply (prelude "Just") [H.Int (if translate_UFs then 15 else 7)])+ , (quickSpec "maxTermDepth", Apply (prelude "Just") [H.Int 4]) , (quickSpec "testTimeout", Apply (prelude "Just") [H.Int 100000]) ] ]@@ -418,7 +619,7 @@ scp = scope thy - cg = map (map defines) (flatCallGraph (CallGraphOpts True False) thy)+ cg = map (map defines) (flatCallGraph (CallGraphOpts False False) thy) poly_type (PolyType _ args res) = args :=>: res
src/Tip/Lint.hs view
@@ -14,7 +14,7 @@ -- * Default case comes first. No duplicate cases. -- -- * Expressions and formulas not mixed.-module Tip.Lint (lint, lintM, lintTheory) where+module Tip.Lint (lint, lintM, lintTheory, lintEither) where #include "errors.h" import Tip.Core@@ -28,20 +28,14 @@ import Text.PrettyPrint import Tip.Pretty.SMT import Data.List---import Debug.Trace+-- import Debug.Trace -- | Crashes if the theory is malformed lint :: (PrettyVar a, Ord a) => String -> Theory a -> Theory a-lint pass thy0@(renameAvoiding [] return -> thy) =- -- trace ("Linting:" ++ pass ++ ":\n" ++ ppRender thy) $- case lintTheory thy0 of- Nothing -> thy0- Just doc ->- case lintTheory thy of- Just doc ->- error ("Lint failed after " ++ pass ++ ":\n" ++ show doc ++ "\n!!!")- Nothing ->- error ("Non-renamed linting pass failed!? " ++ pass ++ ":\n" ++ show doc ++ "\n!!!")+lint pass thy =+ case lintEither pass thy of+ Left doc -> error (show doc)+ Right x -> x -- | Same as 'lint', but returns in a monad, for convenience lintM :: (PrettyVar a, Ord a, Monad m) => String -> Theory a -> m (Theory a)@@ -57,12 +51,26 @@ Nothing -> throwError x Just y -> return y +-- | Returns a Left if the theory is malformed+lintEither :: (PrettyVar a, Ord a) => String -> Theory a -> Either Doc (Theory a)+lintEither pass thy0@(renameAvoiding [] return -> thy) =+-- trace (" ==== Linting: " ++ pass ++ " ====\n" ++ ppRender thy0 ++ "\n ====") $+ case lintTheory thy0 of+ Nothing -> return thy0+ Just doc ->+ case lintTheory thy of+ Just doc ->+ Left (text ("Lint failed after " ++ pass ++ ":") $$ doc $$ "!!!")+ Nothing ->+ Left (text ("Non-renamed linting pass failed!? " ++ pass ++ ":") $$ doc $$ "!!!")+ -- | Returns the error if the theory is malformed lintTheory :: (PrettyVar a, Ord a) => Theory a -> Maybe Doc lintTheory thy@Theory{..} = either Just (const Nothing) . runScope . withTheory thy $ inContext thy $ do mapM_ lintDatatype thy_datatypes+ mapM_ lintSort thy_sorts mapM_ lintSignature thy_sigs mapM_ lintFunction thy_funcs mapM_ lintFormula thy_asserts@@ -75,6 +83,11 @@ forM_ con_args $ \(_, ty) -> lintType ty +lintSort :: (PrettyVar a, Ord a) => Sort a -> ScopeM a ()+lintSort sort@Sort{..} =+ local $ inContext sort $+ mapM_ newTyVar sort_tvs+ lintPolyType :: (PrettyVar a, Ord a) => PolyType a -> ScopeM a () lintPolyType polyty@PolyType{..} = newScope $ inContext polyty $ do@@ -98,7 +111,7 @@ case info of TyVarInfo -> throwError (fsep ["Type variable", nest 2 (ppVar x), "used as type constructor"])- SortInfo n -> checkArity n+ SortInfo Sort{..} -> checkArity (length sort_tvs) DatatypeInfo Datatype{..} -> checkArity (length data_tvs) mapM_ lintType tys lintType (args :=>: res) = do@@ -128,7 +141,7 @@ newLocal lcl lintFormula :: (PrettyVar a, Ord a) => Formula a -> ScopeM a ()-lintFormula form@(Formula _ tvs expr) =+lintFormula form@(Formula _ _ tvs expr) = local $ inContext form $ do mapM_ newTyVar tvs lintExpr FormulaKind expr@@ -183,9 +196,9 @@ "Expression of type", nest 2 (pp (exprType expr)), "bound to variable" <+> pp lcl, "of type", nest 2 (pp lcl_type)])-lintExpr ExprKind (Quant NoInfo _ lcls expr) =+lintExpr ExprKind (Quant _info _ lcls expr) = throwError "Quantifier found in expression"-lintExpr FormulaKind (Quant NoInfo _ lcls expr) =+lintExpr FormulaKind (Quant _info _ lcls expr) = local $ do mapM_ lintBinder lcls lintExpr FormulaKind expr@@ -247,13 +260,15 @@ lintCase :: (PrettyVar a, Ord a) => ExprKind -> Expr a -> Case a -> ScopeM a () lintCase kind _ (Case Default body) = lintExpr kind body lintCase kind _ (Case LitPat{} body) = lintExpr kind body-lintCase kind expr (Case (ConPat gbl@Global{..} args) body) =+lintCase kind expr (Case pat@(ConPat gbl@Global{..} args) body) = local $ do- mapM_ lintBinder args- lintExpr kind (Gbl gbl :@: map Lcl args)+ inContext pat $ do+ mapM_ lintBinder args+ lintExpr kind (Gbl gbl :@: map Lcl args)+ check ("Global" <+> pp gbl <+> "used as constructor")+ (isJust . lookupConstructor gbl_name)+ let (_, res) = applyPolyType gbl_type gbl_args+ unless (res == exprType expr) $+ throwError (fsep ["Constructor", nest 2 (pp (Gbl gbl :@: map Lcl args)), "has type", nest 2 (pp res), "but should be", nest 2 (pp (exprType expr))])+ lintExpr kind body- check ("Global" <+> pp gbl <+> "used as constructor")- (isJust . lookupConstructor gbl_name)- let (_, res) = applyPolyType gbl_type gbl_args- unless (res == exprType expr) $- throwError (fsep ["Constructor", nest 2 (pp (Gbl gbl :@: map Lcl args)), "has type", nest 2 (pp res), "but should be", nest 2 (pp (exprType expr))])
src/Tip/Parser.hs view
@@ -1,5 +1,5 @@ -- | Parses the TIP format-module Tip.Parser(parse,Id,idPos) where+module Tip.Parser(parse,parseFile,Id,idPos) where import Data.Monoid @@ -9,6 +9,15 @@ import Tip.Parser.Convert import Tip.Core++-- | Parse from a file. If the string is empty or "-", then reads from stdin.+parseFile :: String -> IO (Either String (Theory Id))+parseFile file =+ do s <- case file of+ "" -> getContents+ "-" -> getContents+ _ -> readFile file+ return (parse s) -- | Parse, and get either an error or the string's theory parse :: String -> Either String (Theory Id)
src/Tip/Parser/AbsTIP.hs view
@@ -15,10 +15,17 @@ data Decl = DeclareDatatypes [Symbol] [Datatype] | DeclareSort Symbol Integer+ | DeclareConst ConstDecl+ | DeclareConstPar Par ConstDecl | DeclareFun FunDecl- | DefineFunsRec [FunDef] [Expr]- | MonoAssert Assertion Expr- | ParAssert Assertion [Symbol] Expr+ | DeclareFunPar Par FunDecl+ | DefineFun FunDef+ | DefineFunPar Par FunDef+ | DefineFunRec FunDef+ | DefineFunRecPar Par FunDef+ | DefineFunsRec [FunDec] [Expr]+ | Assert Assertion Expr+ | AssertPar Assertion Par Expr deriving (Eq,Ord,Show,Read) data Assertion =@@ -26,24 +33,31 @@ | AssertNot deriving (Eq,Ord,Show,Read) -data FunDef =- ParFunDef [Symbol] InnerFunDef- | MonoFunDef InnerFunDef+data Par =+ Par [Symbol] deriving (Eq,Ord,Show,Read) -data InnerFunDef =- InnerFunDef Symbol [Binding] Type+data ConstDecl =+ ConstDecl Symbol Type deriving (Eq,Ord,Show,Read) data FunDecl =- ParFunDecl [Symbol] InnerFunDecl- | MonoFunDecl InnerFunDecl+ FunDecl Symbol [Type] Type deriving (Eq,Ord,Show,Read) -data InnerFunDecl =- InnerFunDecl Symbol [Type] Type+data FunDef =+ FunDef Symbol [Binding] Type Expr deriving (Eq,Ord,Show,Read) +data FunDec =+ ParFunDec Par InnerFunDec+ | MonoFunDec InnerFunDec+ deriving (Eq,Ord,Show,Read)++data InnerFunDec =+ InnerFunDec Symbol [Binding] Type+ deriving (Eq,Ord,Show,Read)+ data Datatype = Datatype Symbol [Constructor] deriving (Eq,Ord,Show,Read)@@ -57,7 +71,7 @@ deriving (Eq,Ord,Show,Read) data LetDecl =- LetDecl Binding Expr+ LetDecl Symbol Expr deriving (Eq,Ord,Show,Read) data Type =@@ -76,6 +90,7 @@ | Let [LetDecl] Expr | Binder Binder [Binding] Expr | LitInt Integer+ | LitNegInt Integer | LitTrue | LitFalse deriving (Eq,Ord,Show,Read)
src/Tip/Parser/Convert.hs view
@@ -46,7 +46,7 @@ compare = compare `on` idUnique instance PrettyVar Id where- varStr (Id s _ _) = s+ varStr (Id s u _) = s -- ++ "_" ++ show u instance Name Id where freshNamed n@@ -81,7 +81,7 @@ lift $ modify (M.insert s (i,ik)) return i -trDecls :: [Decl] -> CM (Theory Id)+trDecls :: [A.Decl] -> CM (Theory Id) trDecls [] = return emptyTheory trDecls (d:ds) = do thy <- trDecl d@@ -89,7 +89,7 @@ do thy_rest <- trDecls ds return (thy `joinTheories` thy_rest) -trDecl :: Decl -> CM (Theory Id)+trDecl :: A.Decl -> CM (Theory Id) trDecl x = local $ case x of@@ -97,7 +97,8 @@ do -- add their types, abstractly forM_ datatypes $ \dt -> do sym <- addSym GlobalId (dataSym dt)- newSort (Sort sym (length tvs))+ tvi <- mapM (addSym LocalId) tvs+ newSort (Sort sym tvi) newScope $ do tvi <- mapM (addSym LocalId) tvs mapM newTyVar tvi@@ -106,51 +107,67 @@ DeclareSort s n -> do i <- addSym GlobalId s- return emptyTheory{ thy_sorts = [Sort i (fromIntegral n)] }+ tvs <- lift . lift $ mapM refresh (replicate (fromInteger n) i)+ return emptyTheory{ thy_sorts = [Sort i tvs] } - DeclareFun fundecl ->- do d <- trFunDecl fundecl+ DeclareConst const_decl -> trDecl (DeclareConstPar emptyPar const_decl)++ DeclareConstPar par (ConstDecl s t) -> trDecl (DeclareFunPar par (FunDecl s [] t))++ DeclareFun decl -> trDecl (DeclareFunPar emptyPar decl)+ DeclareFunPar par decl ->+ do d <- trFunDecl par decl return emptyTheory{ thy_sigs = [d] } - DefineFunsRec fundefs bodies ->+ DefineFun def -> trDecl (DefineFunPar emptyPar def)+ DefineFunPar par def@(FunDef f _ _ _) ->+ do thy <- trDecl (DefineFunRecPar par def)+ let [fn] = thy_funcs thy+ when (func_name fn `elem` uses fn)+ (throwError $ ppSym f <+> "is recursive, but define-fun-rec was not used!")+ return thy++ DefineFunRec def -> trDecl (DefineFunRecPar emptyPar def)+ DefineFunRecPar par def ->+ do sig <- trFunDecl par (defToDecl def)+ withTheory emptyTheory{ thy_sigs = [sig] } $ do+ fn <- trFunDef par def+ return emptyTheory{ thy_funcs = [fn] }++ DefineFunsRec decs bodies -> do -- add their correct types, abstractly- fds <- mapM (trFunDecl . defToDecl) fundefs+ fds <- mapM (uncurry trFunDecl . decToDecl) decs withTheory emptyTheory{ thy_sigs = fds } $ do- fns <- zipWithM trFunDef fundefs bodies+ fns <- sequence+ [ uncurry trFunDef (decToDef dec body)+ | (dec,body) <- decs `zip` bodies+ ] return emptyTheory{ thy_funcs = fns } - MonoAssert role expr -> trDecl (ParAssert role [] expr)- ParAssert role tvs expr ->+ A.Assert role expr -> trDecl (AssertPar role emptyPar expr)+ AssertPar role (Par tvs) expr -> do tvi <- mapM (addSym LocalId) tvs mapM newTyVar tvi- let toRole AssertIt = Assert+ let toRole AssertIt = T.Assert toRole AssertNot = Prove- fm <- Formula (toRole role) tvi <$> trExpr expr+ fm <- Formula (toRole role) UserAsserted tvi <$> trExpr expr return emptyTheory{ thy_asserts = [fm] } +emptyPar :: Par+emptyPar = Par [] +decToDecl :: FunDec -> (Par,FunDecl)+decToDecl dec = case dec of+ MonoFunDec inner -> decToDecl (ParFunDec emptyPar inner)+ ParFunDec par (InnerFunDec fsym bindings res_type) ->+ (par,FunDecl fsym (map bindingType bindings) res_type) defToDecl :: FunDef -> FunDecl-defToDecl x = case x of- MonoFunDef inner -> defToDecl (ParFunDef [] inner)- ParFunDef tvs (InnerFunDef fsym bindings res_type) ->- ParFunDecl tvs (InnerFunDecl fsym (map bindingType bindings) res_type)--trFunDef :: FunDef -> A.Expr -> CM (T.Function Id)-trFunDef x body = case x of- MonoFunDef inner -> trFunDef (ParFunDef [] inner) body- ParFunDef tvs (InnerFunDef fsym bindings res_type) ->- newScope $- do f <- lkSym fsym- tvi <- mapM (addSym LocalId) tvs- mapM newTyVar tvi- args <- mapM trLocalBinding bindings- Function f tvi args <$> trType res_type <*> trExpr body+defToDecl (FunDef fsym bindings res_type _) =+ FunDecl fsym (map bindingType bindings) res_type -trFunDecl :: FunDecl -> CM (T.Signature Id)-trFunDecl x = case x of- MonoFunDecl inner -> trFunDecl (ParFunDecl [] inner)- ParFunDecl tvs (InnerFunDecl fsym args res) ->+trFunDecl :: Par -> FunDecl -> CM (T.Signature Id)+trFunDecl (Par tvs) (FunDecl fsym args res) = newScope $ do f <- addSym GlobalId fsym tvi <- mapM (addSym LocalId) tvs@@ -158,6 +175,21 @@ pt <- PolyType tvi <$> mapM trType args <*> trType res return (Signature f pt) +decToDef :: FunDec -> A.Expr -> (Par,FunDef)+decToDef dec body = case dec of+ MonoFunDec inner -> decToDef (ParFunDec emptyPar inner) body+ ParFunDec par (InnerFunDec fsym bindings res_type) ->+ (par,FunDef fsym bindings res_type body)++trFunDef :: Par -> FunDef -> CM (T.Function Id)+trFunDef (Par tvs) (FunDef fsym bindings res_type body) =+ newScope $+ do f <- lkSym fsym+ tvi <- mapM (addSym LocalId) tvs+ mapM newTyVar tvi+ args <- mapM trLocalBinding bindings+ Function f tvi args <$> trType res_type <*> trExpr body+ dataSym :: A.Datatype -> Symbol dataSym (A.Datatype sym _) = sym @@ -192,8 +224,14 @@ trLetDecls :: [LetDecl] -> A.Expr -> CM (T.Expr Id) trLetDecls [] e = trExpr e-trLetDecls (LetDecl binding expr:bs) e- = newScope $ T.Let <$> trLocalBinding binding <*> trExpr expr <*> trLetDecls bs e+trLetDecls (LetDecl s expr:bs) e+ = do body <- trExpr expr+ x <- addSym LocalId s+ let l = Local x (exprType body)+ newScope $+ do newLocal l+ rest <- trLetDecls bs e+ return (T.Let l body rest) trExpr :: A.Expr -> CM (T.Expr Id) trExpr e0 = case e0 of@@ -216,9 +254,10 @@ return (T.Match e cases') A.Let letdecls expr -> trLetDecls letdecls expr A.Binder binder bindings expr -> newScope $ trBinder binder <$> mapM trLocalBinding bindings <*> trExpr expr- A.LitInt n -> return $ intLit n- A.LitTrue -> return $ bool True- A.LitFalse -> return $ bool False+ A.LitInt n -> return $ intLit n+ A.LitNegInt n -> return $ intLit (negate n)+ A.LitTrue -> return $ bool True+ A.LitFalse -> return $ bool False trHead :: Maybe (T.Type Id) -> A.Head -> [T.Expr Id] -> CM (T.Expr Id) trHead mgt A.IfThenElse [c,t,f] = return (makeIf c t f)
src/Tip/Parser/LexTIP.x view
@@ -20,14 +20,14 @@ $u = [\0-\255] -- universal: any character @rsyms = -- symbols and non-identifier-like reserved words- \( | "check" \- "sat" | \) | "declare" \- "datatypes" | "declare" \- "sort" | "declare" \- "fun" | "define" \- "funs" \- "rec" | "assert" \- "not" | \= \> | \@ | \= | \+ | \- | \* | \> | \> \= | \< | \< \=+ \( | "check" \- "sat" | \) | "declare" \- "datatypes" | "declare" \- "sort" | "declare" \- "const" | "declare" \- "fun" | "define" \- "fun" | "define" \- "fun" \- "rec" | "define" \- "funs" \- "rec" | "assert" \- "not" | \= \> | \- | \@ | \= | \+ | \* | \> | \> \= | \< | \< \= :- ";" [.]* ; -- Toss single line comments $white+ ; @rsyms { tok (\p s -> PT p (eitherResIdent (TV . share) s)) }-($l | [\~ \! \@ \$ \% \^ \& \* \_ \- \+ \= \< \> \. \? \/]) ($l | $d | [\~ \! \@ \$ \% \^ \& \* \_ \- \+ \= \< \> \. \? \/]) * { tok (\p s -> PT p (eitherResIdent (T_Symbol . share) s)) }+($l | [\~ \! \@ \$ \% \^ \& \* \_ \+ \= \< \> \. \? \/]) ($l | $d | [\~ \! \@ \$ \% \^ \& \* \_ \- \+ \= \< \> \. \? \/]) * { tok (\p s -> PT p (eitherResIdent (T_Symbol . share) s)) } $l $i* { tok (\p s -> PT p (eitherResIdent (TV . share) s)) } @@ -99,7 +99,7 @@ | s == a = t resWords :: BTree-resWords = b "check-sat" 20 (b ">" 10 (b "-" 5 (b "*" 3 (b ")" 2 (b "(" 1 N N) N) (b "+" 4 N N)) (b "=" 8 (b "<=" 7 (b "<" 6 N N) N) (b "=>" 9 N N))) (b "and" 15 (b "Bool" 13 (b "@" 12 (b ">=" 11 N N) N) (b "Int" 14 N N)) (b "assert-not" 18 (b "assert" 17 (b "as" 16 N N) N) (b "case" 19 N N)))) (b "forall" 30 (b "define-funs-rec" 25 (b "declare-sort" 23 (b "declare-fun" 22 (b "declare-datatypes" 21 N N) N) (b "default" 24 N N)) (b "exists" 28 (b "div" 27 (b "distinct" 26 N N) N) (b "false" 29 N N))) (b "mod" 35 (b "let" 33 (b "lambda" 32 (b "ite" 31 N N) N) (b "match" 34 N N)) (b "par" 38 (b "or" 37 (b "not" 36 N N) N) (b "true" 39 N N))))+resWords = b "declare-datatypes" 22 (b ">=" 11 (b "<" 6 (b "*" 3 (b ")" 2 (b "(" 1 N N) N) (b "-" 5 (b "+" 4 N N) N)) (b "=>" 9 (b "=" 8 (b "<=" 7 N N) N) (b ">" 10 N N))) (b "assert" 17 (b "Int" 14 (b "Bool" 13 (b "@" 12 N N) N) (b "as" 16 (b "and" 15 N N) N)) (b "check-sat" 20 (b "case" 19 (b "assert-not" 18 N N) N) (b "declare-const" 21 N N)))) (b "forall" 33 (b "define-funs-rec" 28 (b "default" 25 (b "declare-sort" 24 (b "declare-fun" 23 N N) N) (b "define-fun-rec" 27 (b "define-fun" 26 N N) N)) (b "exists" 31 (b "div" 30 (b "distinct" 29 N N) N) (b "false" 32 N N))) (b "mod" 38 (b "let" 36 (b "lambda" 35 (b "ite" 34 N N) N) (b "match" 37 N N)) (b "par" 41 (b "or" 40 (b "not" 39 N N) N) (b "true" 42 N N)))) where b s n = let bs = id s in B bs (TS bs n)
src/Tip/Parser/ParTIP.y view
@@ -12,10 +12,12 @@ %name pListDecl ListDecl %name pDecl Decl %name pAssertion Assertion-%name pFunDef FunDef-%name pInnerFunDef InnerFunDef+%name pPar Par+%name pConstDecl ConstDecl %name pFunDecl FunDecl-%name pInnerFunDecl InnerFunDecl+%name pFunDef FunDef+%name pFunDec FunDec+%name pInnerFunDec InnerFunDec %name pDatatype Datatype %name pConstructor Constructor %name pBinding Binding@@ -36,6 +38,7 @@ %name pListType ListType %name pListFunDecl ListFunDecl %name pListFunDef ListFunDef+%name pListFunDec ListFunDec -- no lexer declaration %monad { Err } { thenM } { returnM }@@ -62,25 +65,28 @@ 'assert-not' { PT _ (TS _ 18) } 'case' { PT _ (TS _ 19) } 'check-sat' { PT _ (TS _ 20) }- 'declare-datatypes' { PT _ (TS _ 21) }- 'declare-fun' { PT _ (TS _ 22) }- 'declare-sort' { PT _ (TS _ 23) }- 'default' { PT _ (TS _ 24) }- 'define-funs-rec' { PT _ (TS _ 25) }- 'distinct' { PT _ (TS _ 26) }- 'div' { PT _ (TS _ 27) }- 'exists' { PT _ (TS _ 28) }- 'false' { PT _ (TS _ 29) }- 'forall' { PT _ (TS _ 30) }- 'ite' { PT _ (TS _ 31) }- 'lambda' { PT _ (TS _ 32) }- 'let' { PT _ (TS _ 33) }- 'match' { PT _ (TS _ 34) }- 'mod' { PT _ (TS _ 35) }- 'not' { PT _ (TS _ 36) }- 'or' { PT _ (TS _ 37) }- 'par' { PT _ (TS _ 38) }- 'true' { PT _ (TS _ 39) }+ 'declare-const' { PT _ (TS _ 21) }+ 'declare-datatypes' { PT _ (TS _ 22) }+ 'declare-fun' { PT _ (TS _ 23) }+ 'declare-sort' { PT _ (TS _ 24) }+ 'default' { PT _ (TS _ 25) }+ 'define-fun' { PT _ (TS _ 26) }+ 'define-fun-rec' { PT _ (TS _ 27) }+ 'define-funs-rec' { PT _ (TS _ 28) }+ 'distinct' { PT _ (TS _ 29) }+ 'div' { PT _ (TS _ 30) }+ 'exists' { PT _ (TS _ 31) }+ 'false' { PT _ (TS _ 32) }+ 'forall' { PT _ (TS _ 33) }+ 'ite' { PT _ (TS _ 34) }+ 'lambda' { PT _ (TS _ 35) }+ 'let' { PT _ (TS _ 36) }+ 'match' { PT _ (TS _ 37) }+ 'mod' { PT _ (TS _ 38) }+ 'not' { PT _ (TS _ 39) }+ 'or' { PT _ (TS _ 40) }+ 'par' { PT _ (TS _ 41) }+ 'true' { PT _ (TS _ 42) } L_integ { PT _ (TI $$) } L_Symbol { PT _ (T_Symbol _) }@@ -103,10 +109,17 @@ Decl :: { Decl } Decl : 'declare-datatypes' '(' ListSymbol ')' '(' ListDatatype ')' { DeclareDatatypes (reverse $3) (reverse $6) } | 'declare-sort' Symbol Integer { DeclareSort $2 $3 }+ | 'declare-const' ConstDecl { DeclareConst $2 }+ | 'declare-const' '(' Par '(' ConstDecl ')' ')' { DeclareConstPar $3 $5 } | 'declare-fun' FunDecl { DeclareFun $2 }- | 'define-funs-rec' '(' ListFunDef ')' '(' ListExpr ')' { DefineFunsRec (reverse $3) (reverse $6) }- | Assertion Expr { MonoAssert $1 $2 }- | Assertion '(' 'par' '(' ListSymbol ')' Expr ')' { ParAssert $1 (reverse $5) $7 }+ | 'declare-fun' '(' Par '(' FunDecl ')' ')' { DeclareFunPar $3 $5 }+ | 'define-fun' FunDef { DefineFun $2 }+ | 'define-fun' '(' Par '(' FunDef ')' ')' { DefineFunPar $3 $5 }+ | 'define-fun-rec' FunDef { DefineFunRec $2 }+ | 'define-fun-rec' '(' Par '(' FunDef ')' ')' { DefineFunRecPar $3 $5 }+ | 'define-funs-rec' '(' ListFunDec ')' '(' ListExpr ')' { DefineFunsRec (reverse $3) (reverse $6) }+ | Assertion Expr { Assert $1 $2 }+ | Assertion '(' Par Expr ')' { AssertPar $1 $3 $4 } Assertion :: { Assertion }@@ -114,24 +127,31 @@ | 'assert-not' { AssertNot } -FunDef :: { FunDef }-FunDef : '(' 'par' '(' ListSymbol ')' InnerFunDef ')' { ParFunDef (reverse $4) $6 } - | InnerFunDef { MonoFunDef $1 }+Par :: { Par }+Par : 'par' '(' ListSymbol ')' { Par (reverse $3) } -InnerFunDef :: { InnerFunDef }-InnerFunDef : '(' Symbol '(' ListBinding ')' Type ')' { InnerFunDef $2 (reverse $4) $6 } +ConstDecl :: { ConstDecl }+ConstDecl : Symbol Type { ConstDecl $1 $2 } FunDecl :: { FunDecl }-FunDecl : '(' 'par' '(' ListSymbol ')' '(' InnerFunDecl ')' ')' { ParFunDecl (reverse $4) $7 } - | InnerFunDecl { MonoFunDecl $1 }+FunDecl : Symbol '(' ListType ')' Type { FunDecl $1 (reverse $3) $5 } -InnerFunDecl :: { InnerFunDecl }-InnerFunDecl : Symbol '(' ListType ')' Type { InnerFunDecl $1 (reverse $3) $5 } +FunDef :: { FunDef }+FunDef : Symbol '(' ListBinding ')' Type Expr { FunDef $1 (reverse $3) $5 $6 } +FunDec :: { FunDec }+FunDec : '(' Par InnerFunDec ')' { ParFunDec $2 $3 } + | InnerFunDec { MonoFunDec $1 }+++InnerFunDec :: { InnerFunDec }+InnerFunDec : '(' Symbol '(' ListBinding ')' Type ')' { InnerFunDec $2 (reverse $4) $6 } ++ Datatype :: { Datatype } Datatype : '(' Symbol ListConstructor ')' { Datatype $2 (reverse $3) } @@ -145,7 +165,7 @@ LetDecl :: { LetDecl }-LetDecl : '(' Binding Expr ')' { LetDecl $2 $3 } +LetDecl : '(' Symbol Expr ')' { LetDecl $2 $3 } Type :: { Type }@@ -164,6 +184,7 @@ | '(' 'let' '(' ListLetDecl ')' Expr ')' { Let (reverse $4) $6 } | '(' Binder '(' ListBinding ')' Expr ')' { Binder $2 (reverse $4) $6 } | Integer { LitInt $1 }+ | '-' Integer { LitNegInt $2 } | 'true' { LitTrue } | 'false' { LitFalse } @@ -253,6 +274,11 @@ ListFunDef :: { [FunDef] } ListFunDef : {- empty -} { [] } | ListFunDef FunDef { flip (:) $1 $2 }+++ListFunDec :: { [FunDec] }+ListFunDec : {- empty -} { [] } + | ListFunDec FunDec { flip (:) $1 $2 }
+ src/Tip/Pass/AxiomatizeDatadecls.hs view
@@ -0,0 +1,81 @@+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE CPP #-}+module Tip.Pass.AxiomatizeDatadecls where++#include "errors.h"+import Tip.Core+import Tip.Fresh+import Tip.Scope++import Data.List (tails)+import Data.Monoid++import qualified Data.Map as M++axiomatizeDatadecls :: Name a => Bool -> Theory a -> Fresh (Theory a)+axiomatizeDatadecls ueq thy@Theory{..} =+ do thys <- mapM (trDatatype ueq) thy_datatypes+ return (mconcat (thys ++ [thy { thy_datatypes = [] }]))++trDatatype :: Name a => Bool -> Datatype a -> Fresh (Theory a)+trDatatype ueq dt@Datatype{..} =+ do let ty_args = map TyVar data_tvs++ -- X = nil | X = cons(head(X), tail(X))+ domx <- freshNamed "x"+ let doml = Local domx (TyCon data_name ty_args)+ let domain =+ Formula Assert (DataDomain data_name) data_tvs $+ mkQuant Forall [doml] $+ ors+ [ Lcl doml ===+ Gbl (constructor dt c ty_args)+ :@: [ Gbl (projector dt c i ty_args) :@: [Lcl doml]+ | i <- [0..length args-1]+ ]+ | c@(Constructor _ _ args) <- data_cons+ ]+ -- head(cons(X,Y)) = X+ inj <-+ sequence+ [ do qs <- mapM freshLocal (map snd args)+ return $+ Formula Assert (DataProjection data_name) data_tvs $+ mkQuant Forall qs $+ Gbl (projector dt c i ty_args) :@:+ [Gbl (constructor dt c ty_args) :@: map Lcl qs]+ ===+ Lcl (case drop i qs of q:_ -> q; [] -> __)+ | c@(Constructor _ _ args) <- data_cons+ , i <- [0..length args-1]+ ]++ -- nil /= cons(X,Y)+ distinct <-+ sequence+ [ do qs_k <- mapM freshLocal (map snd args_k)+ qs_j <- mapM freshLocal (map snd args_j)+ let tm_k = Gbl (constructor dt k ty_args) :@: map Lcl qs_k+ let tm_j = Gbl (constructor dt j ty_args) :@: map Lcl qs_j+ return $+ Formula Assert (DataDistinct data_name) data_tvs $+ mkQuant Forall (qs_k ++ qs_j) $+ tm_k =/= tm_j+ | (k@(Constructor _ _ args_k),j@(Constructor _ _ args_j)) <- diag data_cons+ ]++ return $+ declsToTheory $+ [ SortDecl (Sort data_name data_tvs) ]+ ++ [ SigDecl (Signature gbl (globalType gbl_info))+ | let scp = scope emptyTheory { thy_datatypes = [dt] }+ , (gbl,gbl_info) <- M.toList (Tip.Scope.globals scp)+ , case gbl_info of+ DiscriminatorInfo{} -> False+ _ -> True+ ]+ ++ map AssertDecl (if ueq then inj else domain:inj ++ distinct)++diag :: [a] -> [(a,a)]+diag xs = [ (x,y) | x:ys <- tails xs, y <- ys ]+
src/Tip/Pass/AxiomatizeFuncdefs.hs view
@@ -6,18 +6,14 @@ #include "errors.h" import Tip.Core import Tip.Fresh+import Tip.Scope +import Data.List (delete) import Data.Generics.Geniplate import Control.Applicative ---conProjs :: Project a => Global a -> [Global a]-conProjs = undefined-{- (Global k (PolyType tvs arg_tys res_ty) ts _)- = [ Global (project k i) (PolyType tvs [res_ty] arg_ty) ts ProjectNS- | (i,arg_ty) <- zip [0..] arg_tys- ]- -}-+-- | Transforms define-fun to declare-fun in the most straightforward way.+-- All parts of the right hand side is preserved, including match and if-then-else. axiomatizeFuncdefs :: Theory a -> Theory a axiomatizeFuncdefs thy@Theory{..} = thy{@@ -28,52 +24,69 @@ where (abs,fms) = unzip (map axiomatize thy_funcs) --- Passes needed afterwards:------ 1) x = e ==> F[x] ~~> F[e]------ 2)--- all x (D => (all y . E) /\ (all z . F))--- ~~>--- all x ((D => all y . E) /\ (D => all z . F))--- ~~>--- (all x y (D => E)) /\ (all x z (D => F))------ (TODO)- axiomatize :: forall a . Function a -> (Signature a, Formula a) axiomatize fn@Function{..} = ( Signature func_name (funcType fn)- , Formula Assert func_tvs (ax func_body)+ , Formula Assert (Definition func_name) func_tvs+ (mkQuant Forall func_args (lhs === func_body)) ) where lhs = applyFunction fn (map TyVar func_tvs) (map Lcl func_args) - ax :: Expr a -> Expr a- ax e0 = case e0 of- Match s (Case Default def_rhs:alts) -> invert_alts s alts def_rhs /\ ax_alts s alts+-- | Makes function definitions into case by converting case to+-- left hand side pattern matching.+axiomatizeFuncdefs2 :: Name a => Theory a -> Theory a+axiomatizeFuncdefs2 thy@Theory{..} =+ thy{+ thy_funcs = [],+ thy_sigs = thy_sigs ++ abs,+ thy_asserts = concat fms ++ thy_asserts+ }+ where+ scp = scope thy+ (abs,fms) = unzip (map (axiomatize2 scp) thy_funcs)++axiomatize2 :: forall a . Ord a => Scope a -> Function a -> (Signature a, [Formula a])+axiomatize2 scp fn@Function{..} =+ ( Signature func_name (funcType fn)+ , map (Formula Assert (Definition func_name) func_tvs)+ (ax func_args [] (map Lcl func_args) func_body)+ )+ where++ -- ax vars pre args body+ -- ~=+ -- forall vars . pre => f(args) = body+ ax :: [Local a] -> [Expr a] -> [Expr a] -> Expr a -> [Expr a]+ ax vars pre args e0 = case e0 of+ Match s (Case Default def_rhs:alts) -> ax vars (pre ++ map (invert_pat s . case_pat) alts) args def_rhs ++ ax_alts s alts Match s alts -> ax_alts s alts- Let{} -> __ -- could use ==> while Let is neither recursive nor polymorphic+ Let x b e -> ax (vars ++ [x]) (pre ++ [Lcl x === b]) args e Lam{} -> __ Quant{} -> __- _ -> lhs === e0 -- e0 should now only be (:@:) and Lcl- where- invert_alts :: Expr a -> [Case a] -> Expr a -> Expr a- invert_alts _ [] def_rhs = def_rhs- invert_alts s (Case pat _:alts) def_rhs = s === invert_pat s pat \/- invert_alts s alts def_rhs- where- invert_pat :: Expr a -> Pattern a -> Expr a- invert_pat _ Default = __- invert_pat _ (LitPat lit) = literal lit- invert_pat s (ConPat k _) = Gbl k :@: [ Gbl p :@: [s] | p <- conProjs k ]+ _ ->+ -- e0 should now only be (:@:) and Lcl+ [mkQuant Forall vars (pre ===> applyFunction fn (map TyVar func_tvs) args === e0)]+ where+ invert_pat :: Expr a -> Pattern a -> Expr a+ invert_pat _ Default = __+ invert_pat s (LitPat lit) = s =/= literal lit+ invert_pat s (ConPat k _) = s =/= (Gbl k :@: [ Gbl (projector dt c i (gbl_args k)) :@: [s] | i <- [0..length cargs-1] ])+ where+ Just (dt,c@(Constructor _ _ cargs)) = lookupConstructor (gbl_name k) scp - ax_alts :: Expr a -> [Case a] -> Expr a- ax_alts s alts = ands [ ax_pat s pat rhs | Case pat rhs <- alts ]- where- ax_pat :: Expr a -> Pattern a -> Expr a -> Expr a+ ax_alts :: Expr a -> [Case a] -> [Expr a]+ ax_alts s alts = concat [ ax_pat s pat rhs | Case pat rhs <- alts ]+ where+ ax_pat :: Expr a -> Pattern a -> Expr a -> [Expr a] ax_pat _ Default _ = __- ax_pat s (LitPat lit) rhs = s === literal lit ==> ax rhs- ax_pat s (ConPat k bs) rhs = mkQuant Forall bs- (s === Gbl k :@: map Lcl bs ==> ax rhs)+ ax_pat s (LitPat lit) rhs = rec [] rhs s (literal lit)+ ax_pat s (ConPat k bs) rhs = rec bs rhs s (Gbl k :@: map Lcl bs)++ rec :: [Local a] -> Expr a -> Expr a -> Expr a -> [Expr a]+ rec new e (Lcl x) pat_expr =+ let su = unsafeSubst pat_expr x+ in ax (delete x vars ++ new) (map su pre) (map su args) (su e)++ rec new e scrut pat_expr = ax (vars ++ new) (pre ++ [scrut === pat_expr]) args e
src/Tip/Pass/Booleans.hs view
@@ -1,8 +1,11 @@ {-# LANGUAGE FlexibleContexts, ViewPatterns, RecordWildCards #-}+{-# LANGUAGE ScopedTypeVariables #-} module Tip.Pass.Booleans where import Tip.Core +import Tip.Fresh+ import Data.Generics.Geniplate -- | Transforms boolean operators to if, but not in expression contexts.@@ -20,29 +23,42 @@ formulaBoolOpToIf e0 = case e0 of Builtin op :@: args@(a:_)- | op `elem` [And,Or,Not,Implies] ||- op `elem` [Equal,Distinct] && hasBoolType a ->- Builtin op :@: map formulaBoolOpToIf args+ | op `elem` [And,Or,Not,Implies]+ -- || op `elem` [Equal,Distinct] && hasBoolType a ->+ -> Builtin op :@: map formulaBoolOpToIf args Quant qi q as e -> Quant qi q as (formulaBoolOpToIf e) _ -> boolOpToIf e0 hasBoolType :: Ord a => Expr a -> Bool hasBoolType e = exprType e == boolType --- | Transforms @and@, @or@, @=>@, @not@ and @=@ and @distict@ on @Bool@+-- | Transforms @and@, @or@, @=>@, @not@ and @=@ and @distinct@ on @Bool@ -- into @ite@ (i.e. @match@) boolOpToIf :: (Ord a,TransformBi (Expr a) (f a)) => f a -> f a boolOpToIf = transformExprIn $ \ e0 -> case e0 of- Builtin And :@: [a,b] -> makeIf a b falseExpr- Builtin Or :@: [a,b] -> makeIf a trueExpr b- Builtin Not :@: [a] -> makeIf a falseExpr trueExpr- Builtin Implies :@: [a,b] -> makeIf a b trueExpr- Builtin Equal :@: [a,b] | hasBoolType a -> makeIf a b (neg_if b)- Builtin Distinct :@: [a,b] | hasBoolType a -> makeIf a (neg_if b) b+ Builtin And :@: as -> ands as+ Builtin Or :@: as -> ors as+ Builtin Not :@: [a] -> neg_if a+ Builtin Implies :@: [a, b] -> makeIf a b trueExpr+ Builtin Equal :@: as | all hasBoolType as -> equals as+ Builtin Distinct :@: as | all hasBoolType as -> distincts as _ -> e0 where- neg_if a = makeIf a falseExpr trueExpr+ ands [] = trueExpr+ ands [a] = a+ ands (a:as) = makeIf a (ands as) falseExpr+ ors [] = falseExpr+ ors [a] = a+ ors (a:as) = makeIf a trueExpr (ors as)+ neg_if a = makeIf a falseExpr trueExpr+ equals [] = trueExpr+ equals [_] = trueExpr+ equals (a:as) = makeIf a (ands as) (neg_if (ors as))+ distincts [] = trueExpr+ distincts [_] = trueExpr+ distincts [a,b] = makeIf a (neg_if b) b+ distincts _ = falseExpr -- | Transforms @ite@ (@match@) on boolean literals in the branches -- into the corresponding builtin boolean function.@@ -55,4 +71,68 @@ | Just True <- boolView f -> b ==> t -- neg b \/ t | Just False <- boolView f -> b /\ t _ -> e0++-- | Names to replace the builtin boolean type with+data BoolNames a =+ BoolNames+ { boolName :: a+ , trueName :: a+ , falseName :: a+ , isTrueName :: a+ , isFalseName :: a+ }++freshBoolNames :: Name a => Fresh (BoolNames a)+freshBoolNames =+ do boolName <- freshNamed "Bool"+ trueName <- freshNamed "True"+ falseName <- freshNamed "False"+ isTrueName <- freshNamed "is-True"+ isFalseName <- freshNamed "is-False"+ return BoolNames{..}++boolGbl :: BoolNames a -> Bool -> Global a+boolGbl BoolNames{..} b = Global+ (if b then trueName else falseName)+ (PolyType [] [] (TyCon boolName []))+ []++boolExpr :: BoolNames a -> Bool -> Expr a+boolExpr names b = Gbl (boolGbl names b) :@: []++removeBuiltinBoolFrom :: forall f a . (TransformBi (Type a) (f a),TransformBi (Pattern a) (f a),TransformBi (Head a) (f a)) => BoolNames a -> f a -> f a+removeBuiltinBoolFrom names = transformBi h . transformBi f . transformBi g+ where+ f :: Head a -> Head a+ f (Builtin (Lit (Bool b))) = Gbl (boolGbl names b)+ f hd = hd++ g :: Pattern a -> Pattern a+ g (LitPat (Bool b)) = ConPat (boolGbl names b) []+ g pat = pat++ h :: Type a -> Type a+ h (BuiltinType Boolean) = TyCon (boolName names) []+ h ty = ty++removeBuiltinBoolWith :: Ord a => BoolNames a -> Theory a -> Theory a+removeBuiltinBoolWith names@BoolNames{..} Theory{..}+ = fixup_asserts+ $ removeBuiltinBoolFrom names Theory{thy_datatypes=bool_decl:thy_datatypes,..}+ where+ fixup_asserts Theory{..} = Theory{thy_asserts=map fixup_assert thy_asserts,..}+ fixup_assert (Formula r i tvs b) = Formula r i tvs (fixup_expr b)+ fixup_expr (Quant qi q vs e) = Quant qi q vs (fixup_expr e)+ fixup_expr e+ | TyCon tc [] <- exprType e+ , tc == boolName+ = boolExpr names True === e+ fixup_expr e = e++ bool_decl = Datatype boolName [] [Constructor falseName isFalseName []+ ,Constructor trueName isTrueName []]++removeBuiltinBool :: Name a => Theory a -> Fresh (Theory a)+removeBuiltinBool thy = do names <- freshBoolNames+ return (removeBuiltinBoolWith names thy)
src/Tip/Pass/CommuteMatch.hs view
@@ -1,45 +1,61 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE PatternGuards #-} {-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE ScopedTypeVariables #-} module Tip.Pass.CommuteMatch where #include "errors.h" import Tip.Core import Tip.Fresh+import Tip.Simplify+import Tip.Scope import Data.Generics.Geniplate import Control.Applicative+import Data.Maybe -- | Makes an effort to move match statements upwards: moves match above -- function applications, and moves matches inside scrutinees outside. -- -- Does not move past quantifiers, lets, and lambdas.-commuteMatch :: (Name a, TransformBiM Fresh (Expr a) (f a)) => f a -> Fresh (f a)-commuteMatch = transformExprInM $ \ e0 ->- case e0 of- Match (Match e inner_alts) outer_alts ->- commuteMatch =<< do- Match e <$> sequence- [ Case lhs <$> freshen (Match rhs outer_alts)- | Case lhs rhs <- inner_alts- ]+commuteMatchTheory :: Name a => Theory a -> Fresh (Theory a)+commuteMatchTheory thy = commuteMatch (Just thy) thy - hd :@: args- | and [ not (logicalBuiltin b) | Builtin b <- [hd] ]- , let isMatch Match{} = True- isMatch _ = False- , (left, Match e alts:right) <- break isMatch args- -> commuteMatch =<< do- Match e <$> sequence- [ Case lhs <$> freshen (hd :@: (left ++ [rhs] ++ right))- | Case lhs rhs <- alts- ]+-- | Makes an effort to move match statements upwards: moves match above+-- function applications, and moves matches inside scrutinees outside.+--+-- Does not move past quantifiers, lets, and lambdas.+commuteMatch :: forall a f. (Name a, TransformBiM Fresh (Expr a) (f a)) => Maybe (Theory a) -> f a -> Fresh (f a)+commuteMatch mthy = aux+ where+ aux :: forall f. (TransformBiM Fresh (Expr a) (f a)) => f a -> Fresh (f a)+ aux = transformExprInM $ \e0 ->+ case e0 of+ Match (Match e inner_alts) outer_alts ->+ aux =<< do+ Match e <$> sequence+ [ Case lhs <$> freshen (match rhs outer_alts)+ | Case lhs rhs <- inner_alts+ ] - Lam bs e -> Lam bs <$> commuteMatch e+ hd :@: args+ | and [ not (logicalBuiltin b) | Builtin b <- [hd] ]+ , let isMatch Match{} = True+ isMatch _ = False+ , (left, Match e alts:right) <- break isMatch args+ -> aux =<< do+ Match e <$> sequence+ [ Case lhs <$> freshen (hd :@: (left ++ [rhs] ++ right))+ | Case lhs rhs <- alts+ ] - Quant qi q bs e -> Quant qi q bs <$> commuteMatch e+ Lam bs e -> Lam bs <$> aux e - Let x b e -> Let x b <$> commuteMatch e+ Quant qi q bs e -> Quant qi q bs <$> aux e - _ -> return e0+ Let x b e -> Let x b <$> aux e + _ -> return e0++ mscp = fmap scope mthy+ match e cases = fromMaybe (Match e cases) (tryMatch mscp e cases)
+ src/Tip/Pass/Concretise.hs view
@@ -0,0 +1,105 @@+{-# LANGUAGE ScopedTypeVariables #-}+module Tip.Pass.Concretise (intToNat, sortsToNat) where++import Tip.Core+import Tip.Parser+import Tip.Fresh+import Tip.Pretty+import Control.Monad.Writer+import Control.Applicative++import Data.Monoid++import qualified Data.Foldable as F++import qualified Data.Map as M+import Data.Map (Map)++import Data.Generics.Geniplate++import Tip.Utils++nat_theory :: Theory Id+Right nat_theory =+ parse+ $ "(declare-datatypes () ((Nat (Z) (S (p Nat))))) (define-fun-rec lt ((x Nat) (y Nat)) Bool (match y (case Z false) (case (S z) (match x (case Z true) (case (S n) (lt n z)))))) (define-fun-rec le ((x Nat) (y Nat)) Bool (match x (case Z true) (case (S z) (match y (case Z false) (case (S x2) (le z x2)))))) (define-fun-rec gt ((x Nat) (y Nat)) Bool (match x (case Z false) (case (S z) (match y (case Z true) (case (S x2) (gt z x2)))))) (define-fun-rec ge ((x Nat) (y Nat)) Bool (match y (case Z true) (case (S z) (match x (case Z false) (case (S x2) (ge x2 z)))))) (define-fun-rec equal ((x Nat) (y Nat)) Bool (match x (case Z (match y (case Z true) (case (S z) false))) (case (S x2) (match y (case Z false) (case (S y2) (equal x2 y2)))))) (define-fun unequal ((x Nat) (y Nat)) Bool (not (equal x y)))"+ ++ "(check-sat)"++renameWrt :: (Ord a,PrettyVar a,Name b) => Theory a -> f b -> Fresh (Theory b)+renameWrt thy _wrt =+ do rename_map <-+ M.fromList <$>+ sequence+ [ do n' <- freshNamed (varStr n)+ return (n,n')+ | n <- usort (F.toList thy)+ ]+ return (fmap (rename_map M.!) thy)++-- | Replaces abstract sorts with natural numbers+sortsToNat :: forall a . Name a => Theory a -> Fresh (Theory a)+sortsToNat thy+ | null (thy_sorts thy) = return thy+ | otherwise =+ do nat_thy <- nat_theory `renameWrt` thy+ let [nat] = thy_datatypes nat_thy+ let thy' =+ thy { thy_sorts = []+ , thy_datatypes = nat:thy_datatypes thy+ }+ let sorts = map sort_name (thy_sorts thy)+ let replace (TyCon s _) | s `elem` sorts = TyCon (data_name nat) []+ replace t0 = t0+ return (transformBi replace thy')++-- | Replaces the builtin Int to natural numbers,+-- if the only operations performed on are related to int ordering+intToNat :: forall a . Name a => Theory a -> Fresh (Theory a)+intToNat thy+ | any bad bs = return thy+ | otherwise =+ do nat_thy <- nat_theory `renameWrt` thy++ let [nat] = thy_datatypes nat_thy++ let [lt,le,gt,ge,eq,ne] = thy_funcs nat_thy++ let replaceE :: Expr a -> Writer [Function a] (Expr a)+ replaceE e0@(Builtin b :@: (es@(e1:_))) =+ case b of+ IntLt -> ret lt+ IntLe -> ret le+ IntGt -> ret gt+ IntGe -> ret ge+ Equal | exprType e1 == intType -> ret eq+ Distinct | exprType e1 == intType -> ret ne+ _ -> return e0+ where+ ret :: Function a -> Writer [Function a] (Expr a)+ ret op = tell [op] >> return (applyFunction op [] es)+ replaceE e0 = return e0++ let replaceT :: Type a -> Writer Any (Type a)+ replaceT (BuiltinType Integer) = tell (Any True) >> return (TyCon (data_name nat) [])+ replaceT t0 = return t0++ let (thy', fns_used) = runWriter (transformBiM replaceE thy)+ (thy'',Any ty_used) = runWriter (transformBiM replaceT thy')++ let used_nat_thy+ | null fns_used && not ty_used = emptyTheory+ | otherwise = nat_thy { thy_funcs = usort fns_used }++ return (thy'' `joinTheories` used_nat_thy)+ where+ bs :: [Builtin]+ bs = usort (universeBi thy)++ bad (Lit Int{}) = True+ bad IntAdd = True+ bad IntSub = True+ bad IntMul = True+ bad IntDiv = True+ bad IntMod = True+ bad _ = False+
+ src/Tip/Pass/Conjecture.hs view
@@ -0,0 +1,98 @@+{-# LANGUAGE PatternGuards #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE CPP #-}+module Tip.Pass.Conjecture where++#include "errors.h"+import Tip.Core+import Tip.Fresh+import Control.Monad+import Control.Monad.Writer+import Data.Generics.Geniplate++-- | Splits a theory with many goals into many theories each with one goal+splitConjecture :: Theory a -> [Theory a]+splitConjecture thy =+ [ thy { thy_asserts = goal : assums } | goal <- goals ]+ where+ (goals,assums) = theoryGoals thy++-- | Splits, type skolems and skolemises conjectures!+skolemiseConjecture :: Name a => Theory a -> Fresh [Theory a]+skolemiseConjecture = mapM (skolemiseConjecture' <=< typeSkolemConjecture) . splitConjecture++-- | Skolemises a conjecture, assuming that there is just one goal and that it has no type variables.+skolemiseConjecture' :: Name a => Theory a -> Fresh (Theory a)+skolemiseConjecture' thy =+ case goals of+ [Formula Prove i tvs body] ->+ case tvs of+ [] -> do let (body',(sks,pre)) = runWriter (skolemise body)++ sks' <- sequence+ [ do v' <- refresh v+ return (Signature v' (PolyType [] [] t))+ | Local v t <- sks+ ]++ let su = substMany (sks `zip` map (\ sk -> applySignature sk [] []) sks')++ body'' <- su body'++ pre'' <- mapM su pre++ return thy {+ thy_sigs = sks' ++ thy_sigs thy,+ thy_asserts = Formula Prove i [] body'' : map (formula Assert []) pre'' ++ assums+ }+ _ -> ERROR("Cannot skolemise conjecture with type variables")+ _ -> ERROR("Need one conjecture to skolemise conjecture")+ where+ (goals,assums) = theoryGoals thy++ formula r tvs (Quant (QuantIH i) q vs e) = Formula r (IH i) tvs (mkQuant q vs e)+ formula r tvs e = Formula r Unknown tvs e++skolemise :: Expr a -> Writer ([Local a],[Expr a]) (Expr a)+skolemise = go True+ where+ go i e0 =+ case e0 of+ Quant qi Forall lcls e -> tell (lcls,[]) >> go True e+ Builtin Not :@: [e] | i -> go False (neg e)+ Builtin Implies :@: es -> tell ([],init es) >> go True (last es)+ _ -> return e0+++-- | Negates the conjecture: changes assert-not into assert, and+-- introduce skolem types in case the goal is polymorphic.+-- (runs 'typeSkolemConjecture')+negateConjecture :: Name a => Theory a -> Fresh (Theory a)+negateConjecture = fmap (declsPass (map neg1)) . typeSkolemConjecture+ where+ neg1 (AssertDecl (Formula Prove i [] form))+ = AssertDecl (Formula Assert i [] (gentleNeg form))+ neg1 d0 = d0++-- | Introduce skolem types in case the goal is polymorphic.+typeSkolemConjecture :: Name a => Theory a -> Fresh (Theory a)+typeSkolemConjecture thy =+ foldM ty_skolem1+ thy { thy_asserts = filter (not . isProve) (thy_asserts thy) }+ (filter isProve (thy_asserts thy))+ where+ isProve (Formula Prove _ _ form) = True+ isProve _ = False++ ty_skolem1 thy (Formula Prove i tvs form) = do+ tvs' <- mapM (refreshNamed "sk_") tvs+ return thy {+ thy_asserts = Formula Prove i [] (makeTyCons (zip tvs tvs') form):thy_asserts thy,+ thy_sorts = [ Sort tv [] | tv <- tvs' ] ++ thy_sorts thy }++ makeTyCons tvs =+ transformTypeInExpr $ \ty ->+ case ty of+ TyVar tv | Just tv' <- lookup tv tvs -> TyCon tv' []+ _ -> ty
+ src/Tip/Pass/DropSuffix.hs view
@@ -0,0 +1,26 @@+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE PatternGuards #-}+module Tip.Pass.DropSuffix where++import Data.Traversable+import Tip.Pretty+import Tip.Fresh+import Data.Map (Map)+import qualified Data.Map as M+import Control.Monad.State++dropSuffix :: forall f a . (Traversable f,Name a) => String -> f a -> Fresh (f a)+dropSuffix suf thy = evalStateT (traverse f thy) M.empty+ where+ f :: a -> StateT (Map a a) Fresh a+ f x+ | (pre,_:_) <- break (`elem` suf) (varStr x)+ = do m <- get+ case M.lookup x m of+ Just y -> return y+ Nothing -> do y <- lift (freshNamed pre)+ modify (M.insert x y)+ return y+ f x = return x+
src/Tip/Pass/EqualFunctions.hs view
@@ -77,22 +77,22 @@ -- | If we have ----- > g x y = f x y+-- > g [a] x y = f [T1 a,T2 a] x y ----- then we remove @g@ and replace it with @f@ everywhere-removeAliases :: Eq a => Theory a -> Theory a+-- then we remove @g [t]@ and replace it with @f [T1 t,T2 t]@ everywhere+removeAliases :: Ord a => Theory a -> Theory a removeAliases thy@(Theory{thy_funcs=fns0}) | null renamings = thy | otherwise = removeAliases $ renameGlobals renamings thy{ thy_funcs = survivors } where renamings = take 1 [ (g,k)- | Function g ty_vars vars _res_ty (hd :@: args) <- fns0+ | Function g g_tvs vars _ (hd :@: args) <- fns0 , map Lcl vars == args- , let (ok,k) = case hd of- Gbl (Global f pty ty_args) -> (map TyVar ty_vars == ty_args, \ ts -> Gbl (Global f pty ts))- Builtin{} -> (True, \ _ -> hd)- , ok+ , let k = case hd of+ Builtin{} -> \ _ -> hd+ Gbl (Global f pty f_args) ->+ \ g_app -> Gbl (Global f pty (map (applyType g_tvs g_app) f_args)) ] remove = map fst renamings
+ src/Tip/Pass/Induction.hs view
@@ -0,0 +1,81 @@+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE CPP #-}+module Tip.Pass.Induction where++#include "errors.h"+import Tip.Core+import Tip.Fresh+import Induction.Structural++import Control.Applicative++import Data.List (find,partition)++theoryTyEnv :: Ord a => Theory a -> TyEnv (Head a) (Type a)+theoryTyEnv Theory{..} (BuiltinType Boolean) =+ do return [(Builtin (Lit (Bool b)),[]) | b <- [False,True]]++theoryTyEnv Theory{..} t =+ do TyCon tc ts <- return t+ dt@Datatype{..} <- find ((tc ==) . data_name) thy_datatypes+ return+ [ (Gbl (constructor dt c ts)+ ,[ case applyType data_tvs ts t of+ t@(TyCon tc' _) | tc == tc' -> Rec t+ t@(args :=>: _) -> Exp t args+ t -> NonRec t+ | (_proj,t) <- con_args c+ ]+ )+ | c <- data_cons+ ]++trTerm :: Term (Head a) (Local a) -> Expr a+trTerm (Var lcl) = Lcl lcl+trTerm (Con h tms) = h :@: map trTerm tms+trTerm (Fun f tms) = Builtin At :@: (Lcl f:map trTerm tms)++-- | Applies induction at the given coordinates to the first goal+induction :: (Name a,Ord a) => [Int] -> Theory a -> Fresh [Theory a]+induction coords thy@Theory{..} =+ case goal of+ Formula Prove i tvs (Quant qi Forall lcls body)+ | cs@(_:_) <- [ x | x <- coords, x >= length lcls || x < 0 ] -> error $ "Induction coordinates " ++ show cs ++ " out of bounds!"+ | otherwise ->+ do (obligs,_) <-+ unTagMapM+ (\ (v :~ _) -> refresh v)+ (subtermInduction+ (theoryTyEnv thy)+ [(lcl_name,lcl_type) | Local{..} <- lcls]+ coords)++ split_goals <-+ sequence+ [ do let attach_type env v =+ case lookup v (env ++ sks) of+ Just t -> Local v t+ Nothing -> ERROR("Lost type of variable!")+ let replace env ts = substMany (zip lcls (map (trTerm . fmap (attach_type env)) ts)) body+ hyps <- sequence+ [ Quant (QuantIH i) Forall [ Local v t | (v,t) <- prenex ]+ <$> replace prenex inst+ | (i, (prenex, inst)) <- [0..] `zip` hyps+ ]+ concl <- replace [] concl+ let body' = hyps ===> concl+ return+ (Formula Prove i tvs+ (mkQuant Forall [ Local v t | (v,t) <- sks] body'))+ | Obligation sks hyps concl <- obligs+ ]++ return+ [ thy { thy_asserts = goal' : goals ++ assums }+ | goal' <- split_goals+ ]++ _ -> return [thy]+ where+ (goal:goals,assums) = partitionGoals thy_asserts+
src/Tip/Pass/Lift.hs view
@@ -85,7 +85,7 @@ case func_body of Lam lam_args e -> let abs = Signature func_name (PolyType func_tvs (map lcl_type func_args) func_res)- fm = Formula Assert func_tvs+ fm = Formula Assert (Defunction func_name) func_tvs (mkQuant Forall (func_args ++ lam_args)@@ -133,7 +133,8 @@ arities = usort [ length args | args :=>: _ <- universeBi thy :: [Type a] ] makeArrow n = do ty <- freshNamed ("fun" ++ show n)- return (n, Sort ty (n+1))+ tvs <- replicateM (n+1) fresh+ return (n, Sort ty tvs) makeAt arrows n = do name <- freshNamed ("apply" ++ show n) tvs <- mapM (freshNamed . mkTyVarName) [0..(n-1)]
+ src/Tip/Pass/Monomorphise.hs view
@@ -0,0 +1,234 @@+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE ViewPatterns #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE OverloadedStrings #-}+module Tip.Pass.Monomorphise where++import Tip.Utils.Specialiser+import Tip.Utils+import Tip.Fresh+import Tip.Core hiding (Expr)+import qualified Tip.Core as Tip++import qualified Data.Foldable as F++import Tip.Pretty+import Text.PrettyPrint+import Tip.Pretty.SMT++import Control.Monad+import Control.Monad.Writer++import Data.Generics.Geniplate++import Data.List (union)++import Debug.Trace++trListTYPE :: (Type a -> Type a) -> [((a,[Type a]),a)] -> [((a,[Type a]),a)]+trListTYPE = undefined+return []+trList :: (Type a -> Type a) -> [((a,[Type a]),a)] -> [((a,[Type a]),a)]+trList = $(genTransformBi 'trListTYPE)++monomorphise :: forall a . Name a => Bool -> Theory a -> Fresh (Theory a)+monomorphise verbose = fmap (fmap unPPVar) . monomorphise' verbose . fmap PPVar++monomorphicThy :: Theory a -> Bool+monomorphicThy = all monomorphicDecl . theoryDecls++monomorphicDecl :: Decl a -> Bool+monomorphicDecl d =+ case d of+ DataDecl Datatype{..} -> null data_tvs+ SortDecl Sort{..} -> null sort_tvs+ SigDecl Signature{..} -> null (polytype_tvs sig_type)+ FuncDecl Function{..} -> null func_tvs+ AssertDecl Formula{..} -> null fm_tvs++monomorphise' :: forall a . (Name a,Pretty a) => Bool -> Theory a -> Fresh (Theory a)+monomorphise' _verbose thy | monomorphicThy thy = return thy+monomorphise' verbose thy = do+ let ds = theoryDecls thy+ insts :: [(Decl a,Subst a Void (Con a))]+ loops :: [Decl a]+ rules = [ (d,declToRule True d) | d <- ds ]+ (insts,loops) = specialise rules+ when verbose $+ do traceM (show ("rules:" $\ pp rules))+ traceM (show ("loops:" $\ pp loops))+ traceM (show ("insts:" $\ pp insts))+ if null loops+ then do+ (insts',renames) <- runWriterT (mapM (uncurry renameDecl) insts)+ return $ renameWith (renameRenames renames) (declsToTheory insts')+ else return thy++exprGlobalRecords :: forall a . Ord a => Tip.Expr a -> [Expr (Con a) a]+exprGlobalRecords e = usort $+ [ Con (Pred gbl_name) (map trType gbl_args)+ | Global{..} <- universeBi e+ ]++-- why are you going to use exprTypeRecords?+exprTypeRecords :: forall a . Ord a => Tip.Expr a -> [Expr (Con a) a]+exprTypeRecords e = usort $+ [ t+ | Lcl (Local{..}) :: Tip.Expr a <- universeBi e+ , t <- typeRecords lcl_type+ ]+ +++ -- need this for nils lying around+ -- (another fix is to make list(a) or cons(a) imply a+ [ t+ | g@Global{..} :: Tip.Global a <- universeBi e+ -- , let (as,res) = gblType g+ -- , inst_ty <- res:as+ , inst_ty <- gbl_args -- NB: looks at the instantiated global type+ , t <- typeRecords inst_ty+ ]++++-- We're traversing right now to get all the TyArr that's needed+-- Otherwise it's enough to only use the top + add the rules+-- =>(a,b) -> a, b+typeRecords :: forall a . Ord a => Tip.Type a -> [Expr (Con a) a]+typeRecords t = usort $+ [ Con (TCon ty) (map trType args)+ | TyCon ty args :: Type a <- universeBi t+ ] +++ [ Con TyArr (map trType (args ++ [res]))+ | args :=>: res :: Type a <- universeBi t+ ]++exprRecords :: forall a . Ord a => Tip.Expr a -> [Expr (Con a) a]+exprRecords e = usort $ exprGlobalRecords e ++ exprTypeRecords e++renameRenames :: Ord a => [((a,[Type a]),a)] -> [((a,[Type a]),a)]+renameRenames su =+ let su' = trList (tyRename su) su+ su2 = usort (su ++ su')+ in if su == su2 then su else renameRenames su2++tyRename :: Ord a => [((a,[Type a]),a)] -> Type a -> Type a+tyRename su (TyCon tc ts) | Just tc' <- lookup (tc,ts) su = TyCon tc' []+tyRename _ t0 = t0++renameWith :: Ord a => [((a,[Type a]),a)] -> Theory a -> Theory a+renameWith su = transformBi (tyRename su) . transformBi gbl+ where+ gbl (Global f (PolyType tvs args res) ts)+ | Just f' <- lookup (f,ts) su+ = let at = applyType tvs ts+ in Global f' (PolyType [] (map at args) (at res)) []+ gbl g0 = g0++renameDecl :: forall a . Name a => Decl a -> Subst a Void (Con a) -> WriterT [((a,[Type a]),a)] Fresh (Decl a)+renameDecl d su = case d of+ SortDecl (Sort s tvs) -> do+ s' <- rename tvs s+ return (SortDecl (Sort s' []))+ SigDecl (Signature f pt@(PolyType tvs _ _)) -> do+ f' <- rename tvs f+ let (args',res) = applyPolyType pt (ty_args tvs)+ return (SigDecl (Signature f' (PolyType [] args' res)))+ AssertDecl (Formula r i tvs b) ->+ return (ty_inst tvs (AssertDecl (Formula r i [] b)))++ DataDecl (Datatype tc tvs cons) -> do+ tc' <- rename tvs tc+ cons' <- sequence+ [ do k' <- rename tvs k+ d' <- rename tvs d+ args' <- sequence [ do p' <- rename tvs p; return (p',t) | (p,t) <- args ]+ return (Constructor k' d' args')+ | Constructor k d args <- cons+ ]+ return (ty_inst tvs (DataDecl (Datatype tc' [] cons')))++ FuncDecl fn@(Function f tvs args res body) -> do+ f' <- rename tvs f+ let fn' = Function f' [] args res body+ return (ty_inst tvs (FuncDecl fn'))+ where+ ty_args tvs = [ toType (fmap absurd e) | tv <- tvs, let Just e = lookup tv su ]++ ty_inst :: [a] -> Decl a -> Decl a+ ty_inst tvs d = applyTypeInDecl tvs (ty_args tvs) d++ rename :: [a] -> a -> WriterT [((a,[Type a]),a)] Fresh a+ rename [] f = return f+ rename tvs f = do+ f' <- lift (refresh f)+ tell [((f,ty_args tvs),f')]+ return f'++data Con a = Pred a | TCon a | TyArr | TyBun BuiltinType | Dummy+ deriving (Eq,Ord,Show)++instance Pretty a => Pretty (Con a) where+ pp (Pred x) = "Pred" <+> pp x+ pp (TCon x) = "TCon" <+> pp x+ pp TyArr = "=>"+ pp (TyBun bu) = ppBuiltinType bu+ pp Dummy = "dummy"++trType :: Type a -> Expr (Con a) a+trType (TyCon tc ts) = Con (TCon tc) (map trType ts)+trType (ts :=>: tr) = Con TyArr (map trType ts ++ [trType tr])+trType (TyVar x) = Var x+trType (BuiltinType bun) = Con (TyBun bun) []++toType :: Expr (Con a) a -> Type a+toType (Con (TCon tc) ts) = TyCon tc (map toType ts)+toType (Con TyArr ts) = map toType (init ts) :=>: toType (last ts)+toType (Var x) = TyVar x+toType (Con (TyBun bun) []) = BuiltinType bun++close :: Expr (Con a) a -> Closed (Con a)+close = fmap (error "contains variables")++sigRule :: Ord a => a -> [a] -> [Type a] -> Type a -> [Rule (Con a) a]+sigRule f tvs args res = usort $+ [ Rule [Con (Pred f) (map Var tvs)] t+ | t0 <- res : args, t <- typeRecords t0+ ]++declToRule :: Ord a => Bool -> Decl a -> [Rule (Con a) a]+declToRule enthusiastic_function_inst d = usort $ case d of++ SortDecl (Sort d tvs) ->+ [Rule [Con (TCon d) (map Var tvs)] (Con Dummy [])]++ SigDecl (Signature f (PolyType tvs args res)) ->+ sigRule f tvs args res++ AssertDecl (Formula Prove _ tvs b) ->+ map (Rule []) (Con Dummy []:exprRecords b)++ AssertDecl (Formula Assert _ tvs b) ->+ -- careful instantiation+ [ Rule (exprGlobalRecords b) e+ | e <- Con Dummy []:exprTypeRecords b+ ]++ DataDecl (Datatype tc tvs cons) ->+ let tcon x = Con (TCon x) (map Var tvs)+ pred x = Con (Pred x) (map Var tvs)+ in concat [ sigRule k tvs (map snd args) (TyCon tc (map TyVar tvs))+ | Constructor k _ args <- cons+ ]+ ++ [ Rule [tcon tc] (pred f)+ | Constructor k d args <- cons+ , f <- [k,d] ++ map fst args+ ]++ FuncDecl (Function f tvs args res body) ->+ [ Rule (exprGlobalRecords body) (Con (Pred f) (map Var tvs))+ | enthusiastic_function_inst ] +++ sigRule f tvs (map lcl_type args) res +++ map (Rule [Con (Pred f) (map Var tvs)]) (exprGlobalRecords body)+
− src/Tip/Pass/NegateConjecture.hs
@@ -1,30 +0,0 @@-{-# LANGUAGE PatternGuards #-}-module Tip.Pass.NegateConjecture where--import Tip.Core-import Tip.Fresh-import Control.Monad-import Data.Generics.Geniplate---- | Negates the conjecture: changes assert-not into assert, and--- introduce skolem types in case the goal is polymorphic.-negateConjecture :: Name a => Theory a -> Fresh (Theory a)-negateConjecture thy =- foldM negateConjecture1- thy { thy_asserts = filter (not . isProve) (thy_asserts thy) }- (filter isProve (thy_asserts thy))- where- isProve (Formula Prove _ form) = True- isProve _ = False-- negateConjecture1 thy (Formula Prove tvs form) = do- tvs' <- mapM (refreshNamed "sk_") tvs- return thy {- thy_asserts = Formula Assert [] (neg (makeTyCons (zip tvs tvs') form)):thy_asserts thy,- thy_sorts = [ Sort tv 0 | tv <- tvs' ] ++ thy_sorts thy }-- makeTyCons tvs =- transformTypeInExpr $ \ty ->- case ty of- TyVar tv | Just tv' <- lookup tv tvs -> TyCon tv' []- _ -> ty
src/Tip/Pass/Pipeline.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE ScopedTypeVariables #-} module Tip.Pass.Pipeline where import Tip.Lint@@ -14,16 +15,19 @@ import Options.Applicative class Pass p where- runPass :: Name a => p -> Theory a -> Fresh (Theory a)+ runPass :: Name a => p -> Theory a -> Fresh [Theory a] passName :: p -> String parsePass :: Parser p unitPass :: Pass p => p -> Mod FlagFields () -> Parser p unitPass p mod = flag' () (long (flagify (passName p)) <> mod) *> pure p -runPassLinted :: (Pass p, Name a) => p -> Theory a -> Fresh (Theory a)-runPassLinted p = runPass p >=> lintM (passName p)+lintMany :: (Name a,Monad m) => String -> [Theory a] -> m [Theory a]+lintMany s thys = mapM (lintM s) thys +runPassLinted :: (Pass p,Name a) => p -> Theory a -> Fresh [Theory a]+runPassLinted p = runPass p >=> lintMany (passName p)+ -- | A sum type that supports 'Enum' and 'Bounded' data Choice a b = First a | Second b deriving (Eq,Ord,Show)@@ -38,13 +42,17 @@ runPass = choice runPass runPass parsePass = (First <$> parsePass) <|> (Second <$> parsePass) -runPasses :: (Pass p,Name a) => [p] -> Theory a -> Fresh (Theory a)-runPasses = go []+runPasses :: (Pass p,Name a) => [p] -> Theory a -> Fresh [Theory a]+runPasses ps = continuePasses ps . return++continuePasses :: forall p a . (Pass p,Name a) => [p] -> [Theory a] -> Fresh [Theory a]+continuePasses = go [] where- go _ [] = return+ go :: [String] -> [p] -> [Theory a] -> Fresh [Theory a]+ go _ [] = return go past (p:ps) =- runPass p- >=> lintM (passName p ++ "(and " ++ intercalate "," past ++ ")")+ (fmap concat . mapM (runPass p))+ >=> lintMany (passName p ++ (if null past then "" else "(after " ++ intercalate "," past ++ ")")) >=> go (passName p:past) ps parsePasses :: Pass p => Parser [p]
+ src/Tip/Pass/SelectConjecture.hs view
@@ -0,0 +1,50 @@+-- Select a particular conjecture from the problem.+{-# LANGUAGE RecordWildCards #-}+module Tip.Pass.SelectConjecture where++import Tip.Core+import Data.List++makeConjecture :: Int -> Theory a -> Theory a+makeConjecture n thy@Theory{..}+ | n < 0 || n >= length asserts = error "Assertion number out of range"+ | otherwise =+ thy {+ thy_asserts =+ proves +++ [let u = (asserts !! n) { fm_role = Prove }+ in u { fm_body = neg (fm_body u) }+ ] +++ take n asserts ++ drop (n+1) asserts }+ where+ (asserts, proves) = partition ((== Assert) . fm_role) thy_asserts++selectConjecture :: Int -> Theory a -> Theory a+selectConjecture n thy@Theory{..}+ | n < 0 || n >= length proves = error "Conjecture number out of range"+ | otherwise = thy { thy_asserts = asserts ++ [proves !! n] }+ where+ (asserts, proves) = partition ((== Assert) . fm_role) thy_asserts++provedConjecture :: Int -> Theory a -> Theory a+provedConjecture n thy@Theory{..}+ | n < 0 || n >= length proves = error "Conjecture number out of range"+ | otherwise =+ thy {+ thy_asserts =+ asserts +++ [(proves !! n) { fm_role = Assert }] +++ take n proves ++ drop (n+1) proves }+ where+ (asserts, proves) = partition ((== Assert) . fm_role) thy_asserts++deleteConjecture :: Int -> Theory a -> Theory a+deleteConjecture n thy@Theory{..}+ | n < 0 || n >= length proves = error "Conjecture number out of range"+ | otherwise =+ thy {+ thy_asserts =+ asserts +++ take n proves ++ drop (n+1) proves }+ where+ (asserts, proves) = partition ((== Assert) . fm_role) thy_asserts
src/Tip/Passes.hs view
@@ -8,12 +8,22 @@ , simplifyTheory, gently, aggressively, SimplifyOpts(..) , removeNewtype , uncurryTheory- , negateConjecture + -- * Simplifyng conjectures+ , module Tip.Pass.Conjecture+ , module Tip.Pass.Concretise++ -- * Changing status of conjectures+ , makeConjecture+ , selectConjecture+ , provedConjecture+ , deleteConjecture+ -- * Boolean builtins , ifToBoolOp , boolOpToIf , theoryBoolOpToIf+ , removeBuiltinBool -- * Match expressions , addMatch@@ -33,6 +43,22 @@ , letLift , axiomatizeLambdas + -- * Function definitions+ , axiomatizeFuncdefs+ , axiomatizeFuncdefs2++ -- * Data types+ , axiomatizeDatadecls++ -- * Monomorphisation+ , monomorphise++ -- * Induction+ , induction++ -- * Miscellaneous+ , dropSuffix+ -- * Building pass pipelines , StandardPass(..) , module Tip.Pass.Pipeline@@ -46,12 +72,19 @@ import Tip.Pass.CSEMatch import Tip.Pass.Uncurry import Tip.Pass.RemoveNewtype-import Tip.Pass.NegateConjecture+import Tip.Pass.Conjecture+import Tip.Pass.Concretise import Tip.Pass.EqualFunctions import Tip.Pass.Lift+import Tip.Pass.Monomorphise import Tip.Pass.Booleans import Tip.Pass.EliminateDeadCode import Tip.Pass.FillInCases+import Tip.Pass.AxiomatizeFuncdefs+import Tip.Pass.AxiomatizeDatadecls+import Tip.Pass.SelectConjecture+import Tip.Pass.DropSuffix+import Tip.Pass.Induction import Tip.Fresh @@ -66,8 +99,14 @@ | RemoveNewtype | UncurryTheory | NegateConjecture+ | TypeSkolemConjecture+ | IntToNat+ | SortsToNat+ | SplitConjecture+ | SkolemiseConjecture | IfToBoolOp | BoolOpToIf+ | RemoveBuiltinBool | AddMatch | CommuteMatch | RemoveMatch@@ -76,32 +115,61 @@ | LambdaLift | LetLift | AxiomatizeLambdas+ | AxiomatizeFuncdefs+ | AxiomatizeFuncdefs2+ | AxiomatizeDatadecls+ | AxiomatizeDatadeclsUEQ+ | Monomorphise Bool | CSEMatch | CSEMatchWhy3 | EliminateDeadCode- deriving (Eq,Ord,Show,Read,Enum,Bounded)+ | MakeConjecture Int+ | SelectConjecture Int+ | ProvedConjecture Int+ | DeleteConjecture Int+ | DropSuffix String+ | Induction [Int]+ deriving (Eq,Ord,Show,Read) instance Pass StandardPass where passName = show runPass p = case p of- SimplifyGently -> simplifyTheory gently- SimplifyAggressively -> simplifyTheory aggressively- RemoveNewtype -> return . removeNewtype- UncurryTheory -> uncurryTheory- NegateConjecture -> negateConjecture- IfToBoolOp -> return . ifToBoolOp- BoolOpToIf -> return . theoryBoolOpToIf- AddMatch -> addMatch- CommuteMatch -> commuteMatch- RemoveMatch -> removeMatch- CollapseEqual -> return . collapseEqual- RemoveAliases -> return . removeAliases- LambdaLift -> lambdaLift- LetLift -> letLift- AxiomatizeLambdas -> axiomatizeLambdas- CSEMatch -> return . cseMatch cseMatchNormal- CSEMatchWhy3 -> return . cseMatch cseMatchWhy3- EliminateDeadCode -> return . eliminateDeadCode+ SimplifyGently -> single $ simplifyTheory gently+ SimplifyAggressively -> single $ simplifyTheory aggressively+ RemoveNewtype -> single $ return . removeNewtype+ UncurryTheory -> single $ uncurryTheory+ NegateConjecture -> single $ negateConjecture+ TypeSkolemConjecture -> single $ typeSkolemConjecture+ IntToNat -> single $ intToNat+ SortsToNat -> single $ sortsToNat+ SplitConjecture -> return . splitConjecture+ SkolemiseConjecture -> skolemiseConjecture+ IfToBoolOp -> single $ return . ifToBoolOp+ BoolOpToIf -> single $ return . theoryBoolOpToIf+ RemoveBuiltinBool -> single $ removeBuiltinBool+ AddMatch -> single $ addMatch+ CommuteMatch -> single $ commuteMatchTheory+ RemoveMatch -> single $ removeMatch+ CollapseEqual -> single $ return . collapseEqual+ RemoveAliases -> single $ return . removeAliases+ LambdaLift -> single $ lambdaLift+ LetLift -> single $ letLift+ AxiomatizeLambdas -> single $ axiomatizeLambdas+ AxiomatizeFuncdefs -> single $ return . axiomatizeFuncdefs+ AxiomatizeFuncdefs2 -> single $ return . axiomatizeFuncdefs2+ AxiomatizeDatadecls -> single $ axiomatizeDatadecls False+ AxiomatizeDatadeclsUEQ -> single $ axiomatizeDatadecls True+ Monomorphise b -> single $ monomorphise b+ CSEMatch -> single $ return . cseMatch cseMatchNormal+ CSEMatchWhy3 -> single $ return . cseMatch cseMatchWhy3+ EliminateDeadCode -> single $ return . eliminateDeadCode+ MakeConjecture n -> single $ return . makeConjecture n+ SelectConjecture n -> single $ return . selectConjecture n+ ProvedConjecture n -> single $ return . provedConjecture n+ DeleteConjecture n -> single $ return . deleteConjecture n+ DropSuffix cs -> single $ dropSuffix cs+ Induction coords -> induction coords+ where single m thy = do x <- m thy; return [x] parsePass = foldr (<|>) empty [ unitPass SimplifyGently $@@ -114,10 +182,22 @@ help "Eliminate unnecessary use of higher-order functions", unitPass NegateConjecture $ help "Transform the goal into a negated conjecture",+ unitPass TypeSkolemConjecture $+ help "Skolemise the types in the conjecture",+ unitPass IntToNat $+ help "Replace builtin Integer with a a unary nat datatype nat (if only ordering is used)",+ unitPass SortsToNat $+ help "Replace abstract sorts with a unary nat datatype.",+ unitPass SplitConjecture $+ help "Puts goals in separate theories",+ unitPass SkolemiseConjecture $+ help "Skolemise the conjecture", unitPass IfToBoolOp $ help "Replace if-then-else by and/or where appropriate", unitPass BoolOpToIf $ help "Replace and/or by if-then-else",+ unitPass RemoveBuiltinBool $+ help "Replace the builtin bool with a datatype", unitPass AddMatch $ help "Transform SMTLIB-style datatype access into pattern matching", unitPass CommuteMatch $@@ -131,12 +211,53 @@ unitPass LambdaLift $ help "Lift lambdas to the top level", unitPass LetLift $- help "Lift let-expressions to the top level.",+ help "Lift let-expressions to the top level", unitPass AxiomatizeLambdas $ help "Eliminate lambdas by axiomatisation (requires --lambda-lift)",+ unitPass AxiomatizeFuncdefs $+ help "Transform function definitions to axioms in the most straightforward way",+ unitPass AxiomatizeFuncdefs2 $+ help "Transform function definitions to axioms with left hand side pattern matching instead of match",+ unitPass AxiomatizeDatadecls $+ help "Transform data declarations to axioms",+ unitPass AxiomatizeDatadeclsUEQ $+ help "Transform data declarations to unit equality axioms (incomplete)",+ flag' () (long ("monomorphise") <> help "Try to monomorphise the problem") *> pure (Monomorphise False),+ flag' () (long ("monomorphise-verbose") <> help "Try to monomorphise the problem verbosely") *> pure (Monomorphise True), unitPass CSEMatch $ help "Perform CSE on match scrutinees", unitPass CSEMatchWhy3 $ help "Aggressively perform CSE on match scrutinees (helps Why3's termination checker)", unitPass EliminateDeadCode $- help "Dead code elimination (doesn't work on dead recursive functions)"]+ help "Dead code elimination (doesn't work on dead recursive functions)",+ fmap MakeConjecture $+ option auto $+ long "make-conjecture" <>+ metavar "CONJECTURE-NUMBER" <>+ help "Make an assert into an assert-not",+ fmap SelectConjecture $+ option auto $+ long "select-conjecture" <>+ metavar "CONJECTURE-NUMBER" <>+ help "Choose a particular conjecture from the problem",+ fmap ProvedConjecture $+ option auto $+ long "proved-conjecture" <>+ metavar "CONJECTURE-NUMBER" <>+ help "Mark a particular conjecture as proved",+ fmap DeleteConjecture $+ option auto $+ long "delete-conjecture" <>+ metavar "CONJECTURE-NUMBER" <>+ help "Delete a particular conjecture",+ fmap DropSuffix $+ option str $+ long "drop-suffix" <>+ metavar "SUFFIX-CHARS" <>+ help "Drop the suffix delimited by some character set",+ fmap Induction $+ option auto $+ long "induction" <>+ metavar "VAR-COORD" <>+ help "Perform induction on the variable coordinates"+ ]
src/Tip/Pretty.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE RecordWildCards, OverloadedStrings #-} {-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-} module Tip.Pretty where import Text.PrettyPrint@@ -30,6 +31,34 @@ class PrettyVar a where -- | The string in a variable varStr :: a -> String++instance (PrettyVar a,PrettyVar b) => PrettyVar (Either a b) where+ varStr (Left x) = varStr x+ varStr (Right y) = varStr y++instance (Pretty a,Pretty b) => Pretty (a,b) where+ pp (x,y) = parens (pp x <+> "," $\ pp y)++instance (Pretty a,Pretty b,Pretty c) => Pretty (a,b,c) where+ pp (x,y,z) = parens (pp x <+> "," $\ pp y <+> "," $\ pp z)++instance (Pretty a) => Pretty [a] where+ pp xs = brackets (sep (punctuate "," (map pp xs)))++instance Pretty Int where+ pp = int++instance Pretty () where+ pp _ = "()"++newtype PPVar a = PPVar { unPPVar :: a }+ deriving (Eq,Ord,PrettyVar)++instance PrettyVar a => Pretty (PPVar a) where+ pp (PPVar x) = ppVar x++instance PrettyVar a => Show (PPVar a) where+ show (PPVar x) = varStr x -- | Variable to 'Doc' ppVar :: PrettyVar a => a -> Doc
src/Tip/Pretty/Haskell.hs view
@@ -1,5 +1,5 @@ {-# LANGUAGE OverloadedStrings #-}-module Tip.Pretty.Haskell (module Tip.Pretty.Haskell, RenameMap) where+module Tip.Pretty.Haskell (module Tip.Pretty.Haskell, RenameMap, Mode(..)) where import Tip.Haskell.Repr import Tip.Haskell.Translate@@ -7,15 +7,22 @@ import qualified Tip.Core as T import Tip.Pretty import Tip.Fresh-import Text.PrettyPrint+import Text.PrettyPrint hiding (Mode) import Data.Map (Map) -ppTheory :: Name a => T.Theory a -> Doc-ppTheory = fst . ppTheoryWithRenamings+ppTheory :: Name a => Mode -> T.Theory a -> Doc+ppTheory mode = fst . ppTheoryWithRenamings mod_name mode+ where+ mod_name =+ case mode of+ Feat{} -> "Main"+ LazySmallCheck{} -> "Main"+ Smten{} -> "Main"+ _ -> "A" -ppTheoryWithRenamings :: Name a => T.Theory a -> (Doc,RenameMap a)-ppTheoryWithRenamings = fst_pp . renameDecls . addHeader . addImports . trTheory+ppTheoryWithRenamings :: Name a => String -> Mode -> T.Theory a -> (Doc,RenameMap a)+ppTheoryWithRenamings mod_name mode = fst_pp . renameDecls . addHeader mod_name . addImports . trTheory mode where fst_pp (x,y) = (pp x,y) -- * Pretty printing@@ -108,6 +115,7 @@ ConPat k [] -> ppHsVar k ConPat k ps -> parIf (i >= 1) (ppOper k (map (ppPat 1) ps)) TupPat ps -> tuple (map (ppPat 0) ps)+ IntPat i -> integer i WildPat -> "_" instance PrettyHsVar a => Pretty (Decl a) where@@ -133,6 +141,10 @@ else "deriving" $\ tuple (map ppHsVar derivs)) InstDecl ctx head ds -> (("instance" $\+ (pp_ctx ctx $\ pp head)) $\+ "where") $\ vcat (map (go 1) ds)+ ClassDecl ctx head ds ->+ (("class" $\ (pp_ctx ctx $\ pp head)) $\ "where") $\ vcat (map (go 1) ds) TypeDef lhs rhs -> "type" <+> ppType False 0 lhs <+> "=" $\ pp rhs
src/Tip/Pretty/Isabelle.hs view
@@ -76,7 +76,7 @@ ppSort :: (PrettyVar a, Ord a) => Sort a -> Doc --ppSort (Sort sort 0) = "type" $\ ppVar sort ppSort (Sort sort n) =- error $ "Can't translate abstract sort " ++ show (ppVar sort) ++ " of arity " ++ show n ++ " to Isabelle"+ error $ "Can't translate abstract sort " ++ show (ppVar sort) ++ " of arity " ++ show (length n) ++ " to Isabelle" ppDatas :: (PrettyVar a, Ord a) => [Datatype a] -> Doc ppDatas [] = empty@@ -138,7 +138,7 @@ ppFormula :: (PrettyVar a, Ord a) => Formula a -> Int -> Doc-ppFormula (Formula role _tvs term) i =+ppFormula (Formula role _ _tvs term) i = (ppRole role <+> ("x" <> int i) <+> ":") $\ quote (ppExpr 0 term) $$ "oops" -- "by (tactic {* Subgoal.FOCUS_PARAMS (K (Tactic_Data.hard_tac @{context})) @{context} 1 *})" convenience
src/Tip/Pretty/SMT.hs view
@@ -5,7 +5,7 @@ import Tip.Pretty import Tip.Types-import Tip.Core (ifView, topsort, neg, exprType, makeGlobal)+import Tip.Core (ifView, topsort, neg, exprType, makeGlobal, uses, collectLets) import Tip.Rename import Data.Maybe import Data.Char (isAlphaNum)@@ -44,7 +44,7 @@ ["(check-sat)"]) ppSort :: PrettyVar a => Sort a -> Doc-ppSort (Sort sort n) = parExpr "declare-sort" [ppVar sort, int n]+ppSort (Sort sort tvs) = parExpr "declare-sort" [ppVar sort, int (length tvs)] ppDatas :: PrettyVar a => [Datatype a] -> Doc ppDatas datatypes@(Datatype _ tyvars _:_) =@@ -67,28 +67,36 @@ par' [] d = d par' xs d = parExprSep "par" [parens (fsep (map ppVar xs)), d] +par'' :: (PrettyVar a) => [a] -> Doc -> Doc+par'' xs d = par' xs (parens d)+ ppUninterp :: PrettyVar a => Signature a -> Doc ppUninterp (Signature f (PolyType tyvars arg_types result_type)) =- apply "declare-fun"- (par' tyvars- (apply (ppVar f)- (sep [parens (fsep (map ppType arg_types)), ppType result_type])))+ apply (if null arg_types then "declare-const" else "declare-fun")+ (par tyvars+ (ppVar f $\+ (sep [ if null arg_types then empty else parens (fsep (map ppType arg_types))+ , ppType result_type+ ]))) ppFuncs :: (Ord a, PrettyVar a) => [Function a] -> Doc+ppFuncs [f] =+ expr (if func_name f `elem` uses f+ then "define-fun-rec"+ else "define-fun")+ [ppFuncSig par f (ppExpr (func_body f))] ppFuncs fs = expr "define-funs-rec"- [ parens (vcat (map ppFuncSig fs))+ [ parens (vcat [ppFuncSig par'' f empty | f <- fs]) , parens (vcat (map (ppExpr . func_body) fs)) ] -ppFuncSig :: PrettyVar a => Function a -> Doc-ppFuncSig (Function f tyvars args res_ty body) =- (par' tyvars- (parens- (ppVar f $\ fsep [ppLocals args, ppType res_ty])))+ppFuncSig :: PrettyVar a => ([a] -> Doc -> Doc) -> Function a -> Doc -> Doc+ppFuncSig parv (Function f tyvars args res_ty body) content =+ parv tyvars (ppVar f $\ fsep [ppLocals args, ppType res_ty, content]) ppFormula :: (Ord a, PrettyVar a) => Formula a -> Doc-ppFormula (Formula Prove tvs term) = apply "assert-not" (par' tvs (ppExpr term))-ppFormula (Formula Assert tvs term) = apply "assert" (par' tvs (ppExpr term))+ppFormula (Formula Prove _ tvs term) = apply "assert-not" (par' tvs (ppExpr term))+ppFormula (Formula Assert _ tvs term) = apply "assert" (par' tvs (ppExpr term)) ppExpr :: (Ord a, PrettyVar a) => Expr a -> Doc ppExpr e | Just (c,t,f) <- ifView e = parExpr "ite" (map ppExpr [c,t,f])@@ -99,7 +107,12 @@ ppExpr (Lcl l) = ppVar (lcl_name l) ppExpr (Lam ls e) = parExprSep "lambda" [ppLocals ls,ppExpr e] ppExpr (Match e as) = "(match" $\ ppExpr e $\ (vcat (map ppCase as) <> ")")-ppExpr (Let x b e) = parExprSep "let" [parens (parens (ppLocal x $\ ppExpr b)), ppExpr e]+ppExpr lets@Let{} =+ parExprSep "let"+ [ parens (vcat (map parens [ppVar (lcl_name x) $\ ppExpr b | (x,b) <- bs]))+ , ppExpr e+ ]+ where (bs,e) = collectLets lets ppExpr (Quant _ q ls e) = parExprSep (ppQuant q) [ppLocals ls, ppExpr e] ppLocals :: PrettyVar a => [Local a] -> Doc@@ -156,11 +169,21 @@ ppType (TyVar x) = ppVar x ppType (TyCon tc ts) = expr (ppVar tc) (map ppType ts) ppType (ts :=>: r) = parExpr "=>" (map ppType (ts ++ [r]))-ppType (BuiltinType Integer) = "Int"-ppType (BuiltinType Boolean) = "Bool"+ppType (BuiltinType bu) = ppBuiltinType bu +ppBuiltinType :: BuiltinType -> Doc+ppBuiltinType Integer = "Int"+ppBuiltinType Boolean = "Bool"+ -- Temporary use SMTLIB as the pretty printer: +instance (Ord a,PrettyVar a) => Pretty (Decl a) where+ pp (DataDecl d) = ppData d+ pp (SortDecl d) = ppSort d+ pp (SigDecl d) = ppUninterp d+ pp (FuncDecl d) = ppFuncs [d]+ pp (AssertDecl d) = ppFormula d+ instance (Ord a,PrettyVar a) => Pretty (Theory a) where pp = ppTheory @@ -188,6 +211,9 @@ instance PrettyVar a => Pretty (Datatype a) where pp = ppDatas . return +instance PrettyVar a => Pretty (Sort a) where+ pp = ppSort+ instance PrettyVar a => Pretty (Signature a) where pp = ppUninterp @@ -242,11 +268,32 @@ , "abs", "min", "max", "const" , "mod", "div" , "=", "=>", "+", "-", "*", ">", ">=", "<", "<=", "@", "!"+ , "as"+ , "declare-datatypes"+ , "declare-sort"+ , "declare-const"+ , "declare-const"+ , "declare-fun"+ , "declare-fun"+ , "define-fun"+ , "define-fun"+ , "define-fun-rec"+ , "define-fun-rec"+ , "define-funs-rec"+ , "check-sat"+ -- TIP:+ , "par"+ , "case"+ , "match"+ , "assert"+ , "assert-not" -- Z3: , "Bool", "Int", "Array", "List", "insert" , "isZero" , "map"+ , "select"+ , "subset", "union", "intersect" -- CVC4:- , "as", "concat"+ , "concat", "member" ]
+ src/Tip/Pretty/TFF.hs view
@@ -0,0 +1,141 @@+{-# LANGUAGE RecordWildCards, OverloadedStrings, PatternGuards, ViewPatterns #-}+module Tip.Pretty.TFF where++import Text.PrettyPrint++import Tip.Pretty+import Tip.Pretty.Why3(Why3Var(..))+import Tip.Types+import Tip.Core hiding (apply)+import Tip.Rename+import Data.Maybe+import Data.Char (isAlphaNum)++apply :: Doc -> [Doc] -> Doc+apply s [] = s+apply s xs = cat [s <> "(", nest 2 (fsep (punctuate (text ",") xs) <> ")")]++clause :: String -> String -> Doc -> Doc+clause name kind body =+ hang ("tff(" <> text name <> ", " <> text kind <> ",") 2+ (body <> ").")++validTFFChar :: Char -> String+validTFFChar x+ | isAlphaNum x || x == '_' = [x]+ | otherwise = ""++ppTheory :: (Ord a,PrettyVar a) => Theory a -> Doc+ppTheory (renameAvoiding [] validTFFChar . tffvarify -> Theory{..})+ = vcat+ (map ppSort thy_sorts +++ map ppUninterp thy_sigs +++ map ppFormula thy_asserts)++ppSort :: PrettyVar a => Sort a -> Doc+ppSort (Sort sort []) =+ clause "type" "type" $+ ppVar sort <+> ":" <+> "$tType"++ppUninterp :: PrettyVar a => Signature a -> Doc+ppUninterp (Signature f (PolyType [] arg_types result_type)) =+ clause "func" "type" $+ ppVar f <+> ":" <+>+ case arg_types of+ [] -> ppType result_type+ _ -> sep (punctuate " *" (map ppType arg_types)) <+> ">" <+> ppType result_type++ppFormula :: (Ord a, PrettyVar a) => Formula a -> Doc+ppFormula (Formula Prove _ [] term) =+ clause "goal" "conjecture" (ppExpr 0 (tffify term))+ppFormula (Formula Assert _ [] term) =+ clause "axiom" "axiom" (ppExpr 0 (tffify term))++tffify :: Ord a => Expr a -> Expr a+tffify =+ transformExpr $ \e ->+ case e of+ Builtin Equal :@: ts ->+ ands (zipWith (===) ts (tail ts))+ Builtin And :@: es -> ands es+ Builtin Or :@: es -> ors es+ _ -> e++tffvarify :: Ord a => Theory a -> Theory (Why3Var a)+tffvarify = uppercase . fmap (Why3Var False)+ where+ uppercase =+ transformExprIn $ \e ->+ case e of+ Lcl lcl -> Lcl (make_upper lcl)+ Quant i q ls body -> Quant i q (map make_upper ls) body+ _ -> e+ make_upper (Local (Why3Var _ lcl_name) lcl_type) =+ Local (Why3Var True lcl_name) lcl_type++ppExpr :: (Ord a, PrettyVar a) => Int -> Expr a -> Doc+ppExpr _ (Builtin Equal :@: [t, u]) =+ hang (ppExpr 2 t <+> "=") 2 (ppExpr 2 u)+ppExpr p (Builtin Distinct :@: [t, u]) =+ hang (ppExpr 2 t <+> "!=") 2 (ppExpr 2 u)+ppExpr p (Builtin And :@: ts) =+ parIf (p > 0) $+ let u:us = punctuate " &" (map (ppExpr 1) ts) in+ sep (u:map (nest 2) us)+ppExpr p (Builtin Or :@: ts) =+ parIf (p > 0) $+ let u:us = punctuate " |" (map (ppExpr 1) ts) in+ sep (u:map (nest 2) us)+ppExpr p (Builtin Implies :@: [t, u]) =+ parIf (p > 0) $+ hang (ppExpr 1 t <+> "=>") 2 (ppExpr 1 u)+ppExpr p (Builtin Not :@: [t]) =+ parIf (p > 1) $+ "~" <> ppExpr 1 t+ppExpr _ (hd :@: ts) =+ apply (ppHead hd) (map (ppExpr 0) ts)+ppExpr _ (Lcl l) = ppVar (lcl_name l)+ppExpr _ (Quant _ q ls e) =+ hang+ (ppQuant q <> brackets (fsep (punctuate "," (map ppLocal ls))) <> ":")+ 2+ (ppExpr 1 e)++ppLocal :: PrettyVar a => Local a -> Doc+ppLocal Local{..} = ppVar lcl_name <> ":" <> ppType lcl_type++ppQuant :: Quant -> Doc+ppQuant Forall = "!"+ppQuant Exists = "?"++ppHead :: PrettyVar a => Head a -> Doc+ppHead (Builtin b) = ppBuiltin b+ppHead (Gbl Global{..}) = ppVar gbl_name++ppBuiltin :: Builtin -> Doc+ppBuiltin (Lit lit) = ppLit lit+ppBuiltin Distinct = "$distinct"+ppBuiltin IntAdd = "$plus_int"+ppBuiltin IntSub = "$minus_int"+ppBuiltin IntMul = "$times_int"+ppBuiltin IntDiv = "$div_int"+ppBuiltin IntMod = "$mod_int"+ppBuiltin IntGt = "$greater_int"+ppBuiltin IntGe = "$greatereq_int"+ppBuiltin IntLt = "$less_int"+ppBuiltin IntLe = "$lesseq_int"++ppLit :: Lit -> Doc+ppLit (Int i) = integer i+ppLit (Bool True) = "$true"+ppLit (Bool False) = "$false"+ppLit (String s) = text (show s)++ppType :: PrettyVar a => Type a -> Doc+ppType (TyVar x) = ppVar x+ppType (TyCon tc ts) = apply (ppVar tc) (map ppType ts)+ppType (BuiltinType bu) = ppBuiltinType bu++ppBuiltinType :: BuiltinType -> Doc+ppBuiltinType Integer = "$int"+ppBuiltinType Boolean = "$o"
src/Tip/Pretty/Why3.hs view
@@ -72,9 +72,9 @@ zipWith ppFormula thy_asserts [0..]) ppSort :: (PrettyVar a, Ord a) => Sort a -> Doc-ppSort (Sort sort 0) = "type" $\ ppVar sort+ppSort (Sort sort []) = "type" $\ ppVar sort ppSort (Sort sort n) =- error $ "Can't translate abstract sort " ++ show (ppVar sort) ++ " of arity " ++ show n ++ " to Why3"+ error $ "Can't translate abstract sort " ++ show (ppVar sort) ++ " of arity " ++ show (length n) ++ " to Why3" ppDatas :: (PrettyVar a, Ord a) => [Datatype a] -> Doc ppDatas (d:ds) = vcat (ppData "type" d:map (ppData "with") ds)@@ -118,7 +118,7 @@ ppDeepPattern (DeepLitPat lit) = ppLit lit ppFormula :: (PrettyVar a, Ord a) => Formula a -> Int -> Doc-ppFormula (Formula role _tvs term) i =+ppFormula (Formula role _ _tvs term) i = (ppRole role <+> ("x" <> int i) <+> ":") $\ (ppExpr 0 term) ppRole :: Role -> Doc
src/Tip/Scope.hs view
@@ -33,7 +33,7 @@ data TypeInfo a = TyVarInfo | DatatypeInfo (Datatype a)- | SortInfo Int+ | SortInfo (Sort a) deriving (Eq, Show) data GlobalInfo a =@@ -173,10 +173,10 @@ types = M.insert ty TyVarInfo (types s) } newSort :: (Monad m, Ord a, PrettyVar a) => Sort a -> ScopeT a m ()-newSort Sort{..} = do+newSort sort@Sort{..} = do newName sort_name modify $ \s -> s {- types = M.insert sort_name (SortInfo sort_arity) (types s) }+ types = M.insert sort_name (SortInfo sort) (types s) } newDatatype :: (Monad m, Ord a, PrettyVar a) => Datatype a -> ScopeT a m () newDatatype dt@Datatype{..} = do
src/Tip/Simplify.hs view
@@ -18,19 +18,32 @@ SimplifyOpts { touch_lets :: Bool, -- ^ Allow simplifications on lets- should_inline :: Maybe (Scope a) -> Expr a -> Bool,+ remove_variable_scrutinee_in_branches :: Bool,+ -- ^ transform+ -- @(match x (case (K y) (e x y)))@+ -- to+ -- @(match x (case (K y) (e (K y) y))@+ -- This is useful for triggering other known-case simplifications,+ -- and is therefore on by default.+ should_inline :: Occurrences -> Maybe (Scope a) -> Expr a -> Bool, -- ^ Inlining predicate inline_match :: Bool -- ^ Allow function inlining to introduce match } +newtype Occurrences = Occurrences Int++-- | Gentle, but without inlining+gentlyNoInline :: SimplifyOpts a+gentlyNoInline = gently { should_inline = \ _ _ _ -> False }+ -- | Gentle options: if there is risk for code duplication, only inline atomic expressions gently :: SimplifyOpts a-gently = SimplifyOpts True (const atomic) True+gently = SimplifyOpts True True (\ (Occurrences occ) _ e -> occ <= 1 || atomic e) True -- | Aggressive options: inline everything that might plausibly lead to simplification aggressively :: Name a => SimplifyOpts a-aggressively = SimplifyOpts True useful True+aggressively = SimplifyOpts True True (\ (Occurrences occ) mscp e -> occ <= 1 || useful mscp e) True where useful _ Lam{} = True useful mscp (f :@: _) = isConstructor mscp f@@ -70,6 +83,25 @@ (e2, Any simplified) <- lift (runWriterT (aux e1)) if simplified then hooray $ return e2 else return e0 + Match _ [Case Default body] -> hooray $ return body++ Match e (Case Default (Match e' cases'):cases) | e == e' ->+ hooray $ aux $+ Match e (filter (not . dead . case_pat) cases' ++ cases)+ where+ dead (LitPat l) = LitPat l `elem` map case_pat cases+ dead (ConPat{..}) =+ gbl_name pat_con `elem`+ [ gbl_name pat_con | ConPat{..} <- map case_pat cases ]+ dead Default = False++ Match e (Case Default def:cases)+ | TyCon ty args <- exprType e,+ Just (d, c@Constructor{..}) <- missingCase mscp ty cases -> do+ let gbl = constructor d c args+ pat <- lift (fmap (ConPat gbl) (freshArgs gbl))+ aux (Match e (Case pat def:cases))+ Match e [Case _ e1,Case (LitPat (Bool b)) e2] | e1 == bool (not b) && e2 == bool b -> hooray $ return e | e1 == bool b && e2 == bool (not b) -> hooray $ return (neg e)@@ -77,24 +109,10 @@ Match (Let x e body) alts | touch_lets -> aux (Let x e (Match body alts)) - Match _ [Case Default body] -> hooray $ return body-- Match (hd :@: args) alts | isConstructor mscp hd ->- -- We use reverse because the default case comes first and we want it last- case filter (matches hd . case_pat) (reverse alts) of- [] -> return e0- Case (ConPat _ lcls) body:_ ->- hooray $- aux $- foldr (uncurry Let) body (zip lcls args)- Case _ body:_ -> hooray $ return body- where- matches (Gbl gbl) (ConPat gbl' _) = gbl == gbl'- matches (Builtin (Lit lit)) (LitPat lit') = lit == lit'- matches _ Default = True- matches _ _ = False+ Match e alts+ | Just e' <- tryMatch mscp e alts -> hooray $ aux e' - Match (Lcl x) alts ->+ Match (Lcl x) alts | remove_variable_scrutinee_in_branches -> Match (Lcl x) <$> sequence [ Case pat <$> case pat of ConPat g bs -> subst ((Gbl g :@: map Lcl bs) /// x) rhs@@ -117,11 +135,30 @@ Builtin Equal :@: [litView -> Just s,litView -> Just t] -> hooray $ return (bool (s == t)) + -- cons(x,y) == nil ~> false+ -- cons(x,y) /= nil ~> true+ --+ -- cons(x1,y1) == cons(x2,y2) ~> x1==x2 & y1==y2+ -- cons(x1,y1) /= cons(x2,y2) ~> x1/=x2 | y1/=y2+ Builtin eq_op :@: [Gbl k :@: kargs,Gbl j :@: jargs]+ | Just scp <- mscp+ , Just (_,Constructor kk _ _) <- lookupConstructor (gbl_name k) scp+ , Just (_,Constructor jj _ _) <- lookupConstructor (gbl_name j) scp+ , Just res <- case (eq_op, kk == jj) of+ (Equal ,False) -> Just falseExpr+ (Distinct,False) -> Just trueExpr+ (Equal, True) -> Just (ands (zipWith (===) kargs jargs))+ (Distinct,True) -> Just (ors (zipWith (=/=) kargs jargs))+ _ -> Nothing+ -> hooray $ aux res+ Builtin Distinct :@: [litView -> Just s,litView -> Just t] -> hooray $ return (bool (s /= t)) Builtin Not :@: [e] -> share (neg e)- Builtin And :@: [e1, e2] -> share (e1 /\ e2)- Builtin Or :@: [e1, e2] -> share (e1 \/ e2)+ Builtin And :@: [e1, e2] | e1 == e2 -> return e1+ | otherwise -> share (e1 /\ e2)+ Builtin Or :@: [e1, e2] | e1 == e2 -> return e1+ | otherwise -> share (e1 \/ e2) Builtin Implies :@: [e1, e2] -> share (e1 ==> e2) Builtin Equal :@: [e1, e2] ->@@ -152,7 +189,7 @@ _ -> return e0 - inlineable body var val = should_inline mscp val || occurrences var body <= 1+ inlineable body var val = should_inline (Occurrences (occurrences var body)) mscp val mscp = fmap scope mthy isRecursiveGroup [fun] = defines fun `elem` uses fun@@ -182,3 +219,28 @@ scp <- mscp lookupConstructor (gbl_name gbl) scp isConstructor _ _ = False++missingCase :: Name a => Maybe (Scope a) -> a -> [Case a] -> Maybe (Datatype a, Constructor a)+missingCase mscp tc cases = do+ scp <- mscp+ dt@Datatype{..} <- lookupDatatype tc scp+ let matched Constructor{..} =+ con_name `elem` [ gbl_name pat_con | ConPat{..} <- map case_pat cases ]+ case filter (not . matched) data_cons of+ [con] -> return (dt, con)+ _ -> Nothing++tryMatch :: Name a => Maybe (Scope a) -> Expr a -> [Case a] -> Maybe (Expr a)+tryMatch mscp (hd :@: args) alts | isConstructor mscp hd =+ -- We use reverse because the default case comes first and we want it last+ case filter (matches hd . case_pat) (reverse alts) of+ [] -> Nothing+ Case (ConPat _ lcls) body:_ ->+ Just $ foldr (uncurry Let) body (zip lcls args)+ Case _ body:_ -> Just body+ where+ matches (Gbl gbl) (ConPat gbl' _) = gbl == gbl'+ matches (Builtin (Lit lit)) (LitPat lit') = lit == lit'+ matches _ Default = True+ matches _ _ = False+tryMatch _ _ _ = Nothing
src/Tip/Types.hs view
@@ -1,4 +1,5 @@--- | The abstract syntax+-- | the abstract syntax+{-# LANGUAGE RecordWildCards #-} {-# LANGUAGE DeriveFunctor, DeriveFoldable, DeriveTraversable, PatternGuards #-} {-# LANGUAGE ExplicitForAll, FlexibleContexts, FlexibleInstances, TemplateHaskell, MultiParamTypeClasses #-} module Tip.Types where@@ -26,22 +27,25 @@ infix 5 :@: data Expr a- -- maybe move Lit from Builtin under Head to straight here = Head a :@: [Expr a]+ -- ^ Function application: always perfectly saturated.+ -- Lambdas and locals are applied with 'At' as head. | Lcl (Local a) | Lam [Local a] (Expr a) -- Merge with Quant? | Match (Expr a) [Case a] -- ^ The default case comes first if there is one | Let (Local a) (Expr a) (Expr a)- -- Allow a list of bound variables, like in SMT-LIB?+ -- ^ @Let (Local x t) b e@ = @(let ((l x)) b e)@+ -- Unlike SMT-LIB, this does not accept a list of bound+ -- variable-/expression-pairs. Fix? | Quant QuantInfo Quant [Local a] (Expr a) deriving (Eq,Ord,Show,Functor,Foldable,Traversable) data Quant = Forall | Exists deriving (Eq,Ord,Show) -data QuantInfo = NoInfo+data QuantInfo = NoInfo | QuantIH Int deriving (Eq,Ord,Show) data Case a = Case { case_pat :: Pattern a, case_rhs :: Expr a }@@ -133,7 +137,7 @@ -- | Uninterpreted sort data Sort a = Sort { sort_name :: a- , sort_arity :: Int }+ , sort_tvs :: [a] } deriving (Eq,Ord,Show,Functor,Foldable,Traversable) -- | Data definition@@ -146,8 +150,12 @@ data Constructor a = Constructor { con_name :: a+ -- ^ Constructor name (e.g. @Cons@) , con_discrim :: a+ -- ^ Discriminator name (e.g. @is-Cons@) , con_args :: [(a,Type a)]+ -- ^ Argument types names of their projectors+ -- (e.g. [(@head@,a),(@tail@,List a)]) } deriving (Eq,Ord,Show,Functor,Foldable,Traversable) @@ -172,15 +180,64 @@ data Formula a = Formula { fm_role :: Role+ , fm_info :: Info a , fm_tvs :: [a] -- ^ top-level quantified type variables , fm_body :: Expr a } deriving (Eq,Ord,Show,Functor,Foldable,Traversable) +data Info a+ = Definition a+ | IH Int+ | Lemma Int+ | Projection a+ | DataDomain a+ | DataProjection a+ | DataDistinct a+ | Defunction a+ | UserAsserted+ | Unknown+ deriving (Eq,Ord,Show,Functor,Foldable,Traversable)+ data Role = Assert | Prove deriving (Eq,Ord,Show) +-- * Other views of theories++-- | The different kinds of declarations in a 'Theory'.+data Decl a+ = DataDecl (Datatype a)+ | SortDecl (Sort a)+ | SigDecl (Signature a)+ | FuncDecl (Function a)+ | AssertDecl (Formula a) -- rename to FormulaDecl?+ deriving (Eq,Ord,Show,Functor,Foldable,Traversable)++-- | 'Decl'arations in a 'Theory'+theoryDecls :: Theory a -> [Decl a]+theoryDecls (Theory{..}) =+ map DataDecl thy_datatypes +++ map SortDecl thy_sorts +++ map SigDecl thy_sigs +++ map FuncDecl thy_funcs +++ map AssertDecl thy_asserts++-- | Assemble a 'Theory' from some 'Decl'arations+declsToTheory :: [Decl a] -> Theory a+declsToTheory ds = Theory+ { thy_datatypes = [ d | DataDecl d <- ds ]+ , thy_sorts = [ d | SortDecl d <- ds ]+ , thy_sigs = [ d | SigDecl d <- ds ]+ , thy_funcs = [ d | FuncDecl d <- ds ]+ , thy_asserts = [ d | AssertDecl d <- ds ]+ }++declsPass :: ([Decl a] -> [Decl b]) -> Theory a -> Theory b+declsPass k = declsToTheory . k . theoryDecls++-- Instances+ instanceUniverseBi [t| forall a . (Expr a,Expr a) |] instanceUniverseBi [t| forall a . (Function a,Expr a) |] instanceUniverseBi [t| forall a . (Function a,Global a) |]@@ -194,6 +251,7 @@ instanceUniverseBi [t| forall a . (Type a,Type a) |] instanceUniverseBi [t| forall a . (Theory a,Constructor a) |] instanceUniverseBi [t| forall a . (Theory a,Global a) |]+instanceUniverseBi [t| forall a . (Theory a,Local a) |] instanceUniverseBi [t| forall a . (Theory a,Builtin) |] instanceTransformBi [t| forall a . (Expr a,Expr a) |] instanceTransformBi [t| forall a . (a,Expr a) |]@@ -206,6 +264,8 @@ instanceTransformBi [t| forall a . (Pattern a,Expr a) |] instanceTransformBi [t| forall a . (Pattern a,Theory a) |] instanceTransformBi [t| forall a . (Type a,Theory a) |]+instanceTransformBi [t| forall a . (Global a,Theory a) |]+instanceTransformBi [t| forall a . (Type a,Decl a) |] instanceTransformBi [t| forall a . (Type a,Expr a) |] instanceTransformBi [t| forall a . (Type a,Type a) |] instance Monad m => TransformBiM m (Expr a) (Expr a) where@@ -229,6 +289,9 @@ instance Monad m => TransformBiM m (Type a) (Type a) where {-# INLINE transformBiM #-} transformBiM = $(genTransformBiM' [t| forall m a . (Type a -> m (Type a)) -> Type a -> m (Type a) |])+instance Monad m => TransformBiM m (Type a) (Theory a) where+ {-# INLINE transformBiM #-}+ transformBiM = $(genTransformBiM' [t| forall m a . (Type a -> m (Type a)) -> Theory a -> m (Theory a) |]) instance Monad m => TransformBiM m (Function a) (Theory a) where {-# INLINE transformBiM #-} transformBiM = $(genTransformBiM' [t| forall m a . (Function a -> m (Function a)) -> Theory a -> m (Theory a) |])@@ -252,5 +315,8 @@ transformTypeInExpr = $(genTransformBiT' [[t|PolyType|]] [t|forall a. (Type a -> Type a) -> Expr a -> Expr a|]) +transformTypeInDecl :: (Type a -> Type a) -> Decl a -> Decl a+transformTypeInDecl =+ $(genTransformBiT' [[t|PolyType|]] [t|forall a. (Type a -> Type a) -> Decl a -> Decl a|])
src/Tip/Utils.hs view
@@ -1,29 +1,74 @@ {-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE DeriveFunctor #-} -- | Handy utilities module Tip.Utils where import Data.List-import Data.Graph+import Data.Maybe+import Data.Graph hiding (components) import Data.List.Split import Data.Char import Data.Foldable (Foldable) import qualified Data.Foldable as F+import Data.Function (on) import Data.Ord+import Data.Function -- | Sort and remove duplicates usort :: Ord a => [a] -> [a]-usort = map head . group . sort+usort = usortOn id --- | Sort things in topologically in strongly connected components-sortThings :: Ord name => (thing -> name) -> (thing -> [name]) -> [thing] -> [[thing]]-sortThings name refers things =- map flattenSCC $ stronglyConnComp+-- | Sort and remove duplicates wrt some custom ordering+usortOn :: Ord b => (a -> b) -> [a] -> [a]+usortOn f = map head . groupBy ((==) `on` f) . sortBy (comparing f)++-- | Union on a predicate+unionOn :: Ord b => (a -> b) -> [a] -> [a] -> [a]+unionOn k = unionBy ((==) `on` k)++-- | Returns the duplicates in a list+duplicates :: Ord a => [a] -> [a]+duplicates xs = usort [ x | x <- xs, count x > 1 ]+ where count x = length (filter (== x) xs)++data Component a = Rec [a] | NonRec a+ deriving (Eq,Ord,Show,Functor)++flattenComponent :: Component a -> [a]+flattenComponent (Rec xs) = xs+flattenComponent (NonRec x) = [x]++-- | Strongly connected components+components :: Ord name => (thing -> name) -> (thing -> [name]) -> [thing] -> [Component thing]+components name refers things =+ [ case comp of+ [(thing,n,refs)]+ | n `notElem` refs -> NonRec thing+ _ -> Rec [ thing | (thing,_,_) <- comp ]+ | comp <- map flattenSCC $ stronglyConnCompR [ (thing,name thing,filter (`elem` names) (refers thing)) | thing <- things ]+ ] where- names = map name things+ names = map name things +lookupComponent :: Eq thing => thing -> [Component thing] -> Maybe (Component thing)+lookupComponent x = listToMaybe . mapMaybe h+ where+ h c = case c of NonRec y | x == y -> Just c+ Rec ys | x `elem` ys -> Just c+ _ -> Nothing++-- | Sort things in topologically in strongly connected components+sortThings :: Ord name => (thing -> name) -> (thing -> [name]) -> [thing] -> [[thing]]+sortThings name refers things = map flattenComponent (components name refers things)++-- | Recursive+recursive :: Ord name => (thing -> name) -> (thing -> [name]) -> [thing] -> [name]+recursive name refers things =+ [ name x | Rec xs <- components name refers things, x <- xs ]+ -- | Makes a nice flag from a constructor string -- -- > > flagify "PrintPolyFOL"@@ -38,8 +83,16 @@ flagifyShow = flagify . show -- | Calculates the maximum value of a foldable value.------ Useful to find the highest unique in a structure maximumOn :: forall f a b . (F.Foldable f,Ord b) => (a -> b) -> f a -> b maximumOn f = f . F.maximumBy (comparing f)++-- | Pair up a list with its previous elements+--+-- > withPrevious "abc" = [('a',""),('b',"a"),('c',"ab")]+withPrevious :: [a] -> [(a,[a])]+withPrevious xs = zip xs (inits xs)++-- | Cursored traversal with previous and next elements of a list+cursor :: [a] -> [([a],a,[a])]+cursor xs = [ let (l,x:r) = splitAt i xs in (l,x,r) | i <- [0..length xs-1] ]
src/Tip/Utils/Rename.hs view
@@ -29,12 +29,20 @@ extra x = fromMaybe [] (find (x `elem`) families) families =+ [ [ m ++ suff | m <- grp ]+ | grp <- base+ , suff <- ["","s","ss"]+ ]++ base = [ ["a","b","c"] , ["f","g","h"]- , ["p","q"]+ , ["i","j","k"] , ["n","m","o"]+ , ["p","q","r"]+ , ["s","t"]+ , ["u","v","w"] , ["x","y","z"]- , ["xs","ys","zs"] ] disambig2 :: (a -> String) -> (b -> String) -> Suggestor (Either a b) String
+ src/Tip/Utils/Specialiser.hs view
@@ -0,0 +1,209 @@+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE ViewPatterns #-}+{-# LANGUAGE DeriveFunctor, DeriveFoldable, DeriveTraversable #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE CPP #-}+module Tip.Utils.Specialiser+ (specialise, Rule(..), Expr(..),+ Void, absurd,+ Closed, subtermRules, subterms, Subst, Inst) where++#include "errors.h"+import Tip.Fresh+import Tip.Utils+import Tip.Pretty++import Control.Applicative+import Control.Monad+import Data.Maybe+import Data.Foldable (Foldable)+import Data.Traversable (Traversable)++import Data.Set (Set)+import qualified Data.Set as S++import Data.Generics.Genifunctors++import Text.PrettyPrint++data Expr c a = Var a | Con c [Expr c a]+ deriving (Eq,Ord,Show,Functor,Foldable,Traversable)++data Rule c a = Rule+ { rule_pre :: [Expr c a]+ -- ^ The trigger(s).+ , rule_post :: Expr c a+ -- ^ The action. The variables here must be a subset of those in pre.+ }+ deriving (Eq,Ord,Show,Functor,Foldable,Traversable)++return []++bimapRule :: (c -> c') -> (a -> a') -> Rule c a -> Rule c' a'+bimapRule = $(genFmap ''Rule)++mapRuleOrd :: (c -> c') -> Rule c a -> Rule c' a+mapRuleOrd c = bimapRule c id++instance (Pretty c,Pretty a) => Pretty (Expr c a) where+ pp (Var x) = pp x+ pp (Con k es) = pp k <+> parens (fsep (punctuate "," (map pp es)))++instance (Pretty c,Pretty a) => Pretty (Rule c a) where+ pp (Rule ps q) = parens (fsep (punctuate "," (map pp ps))) <+> "=>" $\ pp q++subtermRules :: Rule c a -> [Rule c a]+subtermRules (Rule p q) = map (Rule p) (subterms q)++subterms :: Expr c a -> [Expr c a]+subterms e = e : case e of Var a -> []+ Con _ es -> concatMap subterms es++ruleVars :: Ord a => Rule c a -> [a]+ruleVars (Rule ps q) = usort $ concatMap go (q:ps)+ where+ go (Var x) = [x]+ go (Con c es) = concatMap go es++type Closed c = Expr c Void++data Sk c = Old c | Sk Int+ deriving (Eq,Ord,Show,Functor,Foldable,Traversable)++instance Pretty c => Pretty (Sk c) where+ pp (Old c) = pp c+ pp (Sk i) = int i++instance Ord c => Name (Sk c) where+ fresh = Sk <$> fresh++instance PrettyVar (Sk c) where+ varStr _ = show ""++unSkolem :: Closed (Sk c) -> Expr c Int+unSkolem (Con (Old k) es) = Con k (map unSkolem es)+unSkolem (Con (Sk i) []) = Var i++varOf :: Eq a => a -> Expr c a -> Bool+x `varOf` Var y = x == y+x `varOf` Con _ es = any (x `varOf`) es++specialise :: forall d c a . (Ord d,Ord c,Ord a) =>+ [(d,[Rule c a])] -> ([(d,Subst a Void c)],[d])+specialise decl_rules = (which (usort (go [close [] s | (_,Rule [] s) <- named_rules])), scary)+ where+ free0,free,scary :: [d]+ (usort -> free0,usort -> scary) = separate [ (d,r) | (d,rs) <- decl_rules, r <- rs ]+ free = free0 \\ scary++ named_rules :: [(d,Rule c a)]+ named_rules = [ (d,r) | (d,rules) <- decl_rules, d `elem` free, r <- rules ]++ go :: [Closed c] -> [Closed c]+ go insts+ | null (new_insts \\ insts) = []+ | otherwise = new_insts `union` go (new_insts `union` insts)+ where+ new_insts = usort $ map (snd . snd) new+ new = step named_rules insts++ which :: [Closed c] -> [(d,Subst a Void c)]+ which cls = usort [ (d,i) | (d,(i,_)) <- step named_rules cls ]++-- Return the safe rules, and the scary rules+separate :: (Ord a,Ord c) => [(name,Rule c a)] -> ([name],[name])+separate = go []+ where+ go rs ((n,r):xs)+ | terminating (r:rs) = let (a,b) = go (r:rs) xs in (n:a,b )+ | otherwise = let (a,b) = go rs xs in ( a,n:b)+ go _ _ = ([],[])++terminating :: forall a c . (Ord a,Ord c) => [Rule c a] -> Bool+terminating (map (mapRuleOrd Old) -> rs) = go 10 S.empty (usort (inst rs))+ where+ go :: Int -> Set (Closed (Sk c)) -> [Closed (Sk c)] -> Bool+ {-+ go i visited new+ | traceShow ("go" $\ sep ["i:" $\ pp i+ ,"visited:" $\ pp (S.toList visited)+ ,"new:" $\ pp new+ ])+ False = undefined+ -}+ go 0 _ _ = False+ go _ _ [] = True+ go i visited new =+ let both = visited `S.union` S.fromList new+ in go (i-1) both (unnamedStep rs new \\ S.toList both)++union :: Ord a => [a] -> [a] -> [a]+union (S.fromList -> s1) (S.fromList -> s2) = S.toList (s1 `S.union` s2)++(\\) :: Ord a => [a] -> [a] -> [a]+(\\) (S.fromList -> s1) (S.fromList -> s2) = S.toList (s1 S.\\ s2)++inst :: (Ord a,Ord c) => [Rule (Sk c) a] -> [Closed (Sk c)]+inst rules = runFresh $+ do i <- fresh+ return (concatMap (instPre i) rules)++instPre :: (Ord a,Ord c) => Sk c -> Rule (Sk c) a -> [Closed (Sk c)]+instPre c r =+ let su = [ (v,Con c []) | v <- ruleVars r ]+ in map (close su) (rule_pre r)++close :: Eq a => [(a,Closed c)] -> Expr c a -> Closed c+close su (Var v) = fromMaybe (ERROR("Unbound variable, did you run --type-skolem-conjecture?")) (lookup v su)+close su (Con c es) = Con c (map (close su) es)++unnamedStep :: (Ord c,Ord a) => [Rule c a] -> [Closed c] -> [Closed c]+unnamedStep rs = usort . map (snd . snd) . step (map ((,) ()) rs)++step :: (Ord name,Ord c,Ord a) => [(name,Rule c a)] -> [Closed c] -> [(name,Inst a c)]+step rs es = usort [ (name,i) | (name,r) <- rs, i <- activateOne r es ]++type Inst a c = (Subst a Void c,Closed c)++activateOne :: (Ord c,Ord a) => Rule c a -> [Closed c] -> [Inst a c]+activateOne (Rule ps q) es = [ (su,close su q) | su <- go ps ]+ where+ go [] = [[]] -- success, return the empty substitution+ go (p:ps) = [ su+ | e <- es+ , Just sua <- [match p e]+ , sub <- go ps+ , Just su <- [merge sua sub]+ ]+++type Subst a b c = [(a,Expr c b)]++merge :: (Ord a,Ord b,Ord c) => Subst a b c -> Subst a b c -> Maybe (Subst a b c)+merge xs ys =+ do guard (and [ maybe True (e ==) (lookup v ys) | (v,e) <- xs ])+ Just (unionOn fst xs ys)++merges :: (Ord a,Ord b,Ord c) => [Subst a b c] -> Maybe (Subst a b c)+merges = foldM merge []++match :: (Ord a,Ord b,Ord c) => Expr c a -> Expr c b -> Maybe (Subst a b c)+match (Var x) e = Just [(x,e)]+match (Con c xs) (Con d ys)+ | c == d+ , length xs == length ys+ = merges =<< zipWithM match xs ys+match _ _ = Nothing++data Void = Void !Void+ deriving (Eq,Ord,Show)++absurd :: Void -> a+absurd (Void v) = absurd v++instance Pretty Void where+ pp = absurd+
src/Tip/WorkerWrapper.hs view
@@ -29,7 +29,7 @@ workerWrapper :: Name a => [WorkerWrapper a] -> Theory a -> Fresh (Theory a) workerWrapper wws thy@Theory{..} =- transformExprInM updateUse thy' >>= simplifyTheory gently+ transformExprInM updateUse thy' >>= simplifyTheory gentlyNoInline where thy' = thy { thy_funcs = map updateDef thy_funcs } m = Map.fromList [(func_name (ww_func ww), ww) | ww <- wws]
tip-lib.cabal view
@@ -1,5 +1,5 @@ name: tip-lib-version: 0.1.2+version: 0.2 synopsis: tons of inductive problems - support library and tools description: This package provides a tool for processing inductive theorem proving problems in TIP format (see the homepage for details). homepage: http://tip-org.github.io@@ -34,6 +34,7 @@ Tip.Pretty.Why3 Tip.Pretty.Isabelle Tip.Pretty.Haskell+ Tip.Pretty.TFF Tip.Parser @@ -46,21 +47,29 @@ Tip.Haskell.Translate Tip.Haskell.Rename Tip.CallGraph+ Tip.Utils.Specialiser++ Tip.Pass.Booleans other-modules:+ Tip.Pass.AddMatch Tip.Pass.AxiomatizeFuncdefs- Tip.Pass.Lift- Tip.Pass.Booleans+ Tip.Pass.AxiomatizeDatadecls Tip.Pass.CommuteMatch- Tip.Pass.AddMatch+ Tip.Pass.Conjecture Tip.Pass.CSEMatch- Tip.Pass.RemoveNewtype- Tip.Pass.RemoveMatch- Tip.Pass.NegateConjecture- Tip.Pass.EqualFunctions- Tip.Pass.Uncurry- Tip.Pass.Pipeline+ Tip.Pass.DropSuffix Tip.Pass.EliminateDeadCode+ Tip.Pass.EqualFunctions Tip.Pass.FillInCases+ Tip.Pass.Induction+ Tip.Pass.Lift+ Tip.Pass.Monomorphise+ Tip.Pass.Pipeline+ Tip.Pass.RemoveMatch+ Tip.Pass.RemoveNewtype+ Tip.Pass.SelectConjecture+ Tip.Pass.Uncurry+ Tip.Pass.Concretise Tip.Parser.ErrM Tip.Parser.AbsTIP@@ -74,12 +83,14 @@ default-language: Haskell2010 build-depends: base >=4 && <5, geniplate-mirror >=0.7.1,+ genifunctors >= 0.3, split, containers, mtl, pretty, array,- optparse-applicative+ optparse-applicative,+ structural-induction >= 0.3 && < 0.4 build-tools: alex, happy executable tip@@ -87,6 +98,6 @@ default-language: Haskell2010 build-depends: base, tip-lib,- pretty-show, pretty,+ filepath, optparse-applicative